Compare commits
9 Commits
9c05724535
...
efd1f34181
| Author | SHA1 | Date |
|---|---|---|
|
|
efd1f34181 | |
|
|
2cf23aaeb3 | |
|
|
bc0a2bf0a0 | |
|
|
025aecdfb1 | |
|
|
d8896d965c | |
|
|
a0f61b52f9 | |
|
|
481f95337f | |
|
|
0e757e0c9d | |
|
|
52521ef457 |
|
|
@ -0,0 +1 @@
|
||||||
|
node_modules
|
||||||
|
|
@ -0,0 +1,3 @@
|
||||||
|
{
|
||||||
|
"git.ignoreLimitWarning": true
|
||||||
|
}
|
||||||
Binary file not shown.
|
|
@ -11,7 +11,8 @@
|
||||||
"@jiaminghi/data-view": "^2.7.3",
|
"@jiaminghi/data-view": "^2.7.3",
|
||||||
"@types/echarts": "^4.4.3",
|
"@types/echarts": "^4.4.3",
|
||||||
"core-js": "^3.6.4",
|
"core-js": "^3.6.4",
|
||||||
"echarts": "^4.6.0",
|
"echarts": "^4.9.0",
|
||||||
|
"v-charts": "^1.19.0",
|
||||||
"vue": "^2.6.11",
|
"vue": "^2.6.11",
|
||||||
"vue-awesome": "^4.0.2",
|
"vue-awesome": "^4.0.2",
|
||||||
"vue-router": "^3.1.5",
|
"vue-router": "^3.1.5",
|
||||||
|
|
@ -6714,12 +6715,31 @@
|
||||||
},
|
},
|
||||||
"node_modules/echarts": {
|
"node_modules/echarts": {
|
||||||
"version": "4.9.0",
|
"version": "4.9.0",
|
||||||
"resolved": "https://registry.npmjs.org/echarts/-/echarts-4.9.0.tgz",
|
"resolved": "https://registry.npmmirror.com/echarts/-/echarts-4.9.0.tgz",
|
||||||
"integrity": "sha512-+ugizgtJ+KmsJyyDPxaw2Br5FqzuBnyOWwcxPKO6y0gc5caYcfnEUIlNStx02necw8jmKmTafmpHhGo4XDtEIA==",
|
"integrity": "sha512-+ugizgtJ+KmsJyyDPxaw2Br5FqzuBnyOWwcxPKO6y0gc5caYcfnEUIlNStx02necw8jmKmTafmpHhGo4XDtEIA==",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"zrender": "4.3.2"
|
"zrender": "4.3.2"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/echarts-amap": {
|
||||||
|
"version": "1.0.0-rc.6",
|
||||||
|
"resolved": "https://registry.npmmirror.com/echarts-amap/-/echarts-amap-1.0.0-rc.6.tgz",
|
||||||
|
"integrity": "sha512-cYJCKoQdnkZXrGweYrveU1HruZd1c0KmsF1U8o3FtsvgR2jVL5ZUpGFjMmFtpolHOUFqxizk+s+QBLkYuOWL6Q=="
|
||||||
|
},
|
||||||
|
"node_modules/echarts-liquidfill": {
|
||||||
|
"version": "2.0.6",
|
||||||
|
"resolved": "https://registry.npmmirror.com/echarts-liquidfill/-/echarts-liquidfill-2.0.6.tgz",
|
||||||
|
"integrity": "sha512-p+AH0O9/BtwXMQQyhjJbMZo+GwRAgWG/DCyK5r27PQzpS0UWrgXu57MyEFc0A8Ub3sRuqEu08BuxwHICBkSWSQ==",
|
||||||
|
"peerDependencies": {
|
||||||
|
"echarts": "^4.8.0",
|
||||||
|
"zrender": "^4.3.1"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/echarts-wordcloud": {
|
||||||
|
"version": "1.1.3",
|
||||||
|
"resolved": "https://registry.npmmirror.com/echarts-wordcloud/-/echarts-wordcloud-1.1.3.tgz",
|
||||||
|
"integrity": "sha512-Et8D5xEAoYkidmHun+hEH+2lF9dhCt6D0JJ390vlr2r/1zwhhZAbcL01CEvG93QcMcJpSvSPK8vRiGkTbMHRxg=="
|
||||||
|
},
|
||||||
"node_modules/ee-first": {
|
"node_modules/ee-first": {
|
||||||
"version": "1.1.1",
|
"version": "1.1.1",
|
||||||
"resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
|
"resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
|
||||||
|
|
@ -10543,6 +10563,11 @@
|
||||||
"url": "https://github.com/fb55/nth-check?sponsor=1"
|
"url": "https://github.com/fb55/nth-check?sponsor=1"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/numerify": {
|
||||||
|
"version": "1.2.9",
|
||||||
|
"resolved": "https://registry.npmmirror.com/numerify/-/numerify-1.2.9.tgz",
|
||||||
|
"integrity": "sha512-X4QzQiytV5ZN3TVLhzbtFzjTarUNnaa1pgNDFqt7u7Nqhxe7FvY2eYrGt4WYHlYXDqgtfC/n/a5nJ2y0LijV8w=="
|
||||||
|
},
|
||||||
"node_modules/oauth-sign": {
|
"node_modules/oauth-sign": {
|
||||||
"version": "0.9.0",
|
"version": "0.9.0",
|
||||||
"resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz",
|
"resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz",
|
||||||
|
|
@ -14556,6 +14581,11 @@
|
||||||
"integrity": "sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA==",
|
"integrity": "sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA==",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
|
"node_modules/utils-lite": {
|
||||||
|
"version": "0.1.10",
|
||||||
|
"resolved": "https://registry.npmmirror.com/utils-lite/-/utils-lite-0.1.10.tgz",
|
||||||
|
"integrity": "sha512-jlHvdtI8MyWURF/3u+ufIjf1Cs5WjN6WZl9qO8dEkZsVjaI7X5YMUhaCFzkvB69ljt6fo4Dd7V/Oj2NJOFDFOQ=="
|
||||||
|
},
|
||||||
"node_modules/utils-merge": {
|
"node_modules/utils-merge": {
|
||||||
"version": "1.0.1",
|
"version": "1.0.1",
|
||||||
"resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz",
|
"resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz",
|
||||||
|
|
@ -14575,6 +14605,22 @@
|
||||||
"uuid": "bin/uuid"
|
"uuid": "bin/uuid"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/v-charts": {
|
||||||
|
"version": "1.19.0",
|
||||||
|
"resolved": "https://registry.npmmirror.com/v-charts/-/v-charts-1.19.0.tgz",
|
||||||
|
"integrity": "sha512-vm2HBUmxAsXK0ivwce9LytcpqrItDA5JSPLYVxZXtiuoyhcn80XX1/3dPJd/1GqG1OYv3jfBo1s9ra4q8GowqA==",
|
||||||
|
"dependencies": {
|
||||||
|
"echarts-amap": "1.0.0-rc.6",
|
||||||
|
"echarts-liquidfill": "^2.0.2",
|
||||||
|
"echarts-wordcloud": "^1.1.3",
|
||||||
|
"numerify": "1.2.9",
|
||||||
|
"utils-lite": "0.1.10"
|
||||||
|
},
|
||||||
|
"peerDependencies": {
|
||||||
|
"echarts": ">3.0.0",
|
||||||
|
"vue": ">2.0.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/v8-compile-cache": {
|
"node_modules/v8-compile-cache": {
|
||||||
"version": "2.4.0",
|
"version": "2.4.0",
|
||||||
"resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.4.0.tgz",
|
"resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.4.0.tgz",
|
||||||
|
|
|
||||||
|
|
@ -11,7 +11,10 @@
|
||||||
"@jiaminghi/data-view": "^2.7.3",
|
"@jiaminghi/data-view": "^2.7.3",
|
||||||
"@types/echarts": "^4.4.3",
|
"@types/echarts": "^4.4.3",
|
||||||
"core-js": "^3.6.4",
|
"core-js": "^3.6.4",
|
||||||
"echarts": "^4.6.0",
|
"echarts": "^4.9.0",
|
||||||
|
"element-ui": "^2.15.0",
|
||||||
|
"lodash": "^4.17.21",
|
||||||
|
"v-charts": "^1.19.0",
|
||||||
"vue": "^2.6.11",
|
"vue": "^2.6.11",
|
||||||
"vue-awesome": "^4.0.2",
|
"vue-awesome": "^4.0.2",
|
||||||
"vue-router": "^3.1.5",
|
"vue-router": "^3.1.5",
|
||||||
|
|
@ -46,4 +49,4 @@
|
||||||
"> 1%",
|
"> 1%",
|
||||||
"last 2 versions"
|
"last 2 versions"
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Binary file not shown.
|
After Width: | Height: | Size: 229 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 293 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 657 KiB |
Binary file not shown.
|
Before Width: | Height: | Size: 6.7 KiB After Width: | Height: | Size: 30 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 93 KiB |
|
|
@ -96,3 +96,76 @@ $spacing-sizes: (
|
||||||
4: 2,
|
4: 2,
|
||||||
5: 2.5,
|
5: 2.5,
|
||||||
);
|
);
|
||||||
|
|
||||||
|
// 颜色系统
|
||||||
|
$primary-color: #409EFF;
|
||||||
|
$success-color: #67C23A;
|
||||||
|
$warning-color: #E6A23C;
|
||||||
|
$danger-color: #F56C6C;
|
||||||
|
$info-color: #909399;
|
||||||
|
|
||||||
|
$text-color: #303133;
|
||||||
|
$text-color-secondary: #606266;
|
||||||
|
$text-color-placeholder: #C0C4CC;
|
||||||
|
|
||||||
|
$border-color: #DCDFE6;
|
||||||
|
$border-color-light: #E4E7ED;
|
||||||
|
$border-color-lighter: #EBEEF5;
|
||||||
|
|
||||||
|
$body-bg: #ffffff;
|
||||||
|
$component-bg: #f5f7fa;
|
||||||
|
|
||||||
|
// 字体
|
||||||
|
$font-family-base: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;
|
||||||
|
$font-size-base: 14px;
|
||||||
|
$font-size-lg: 16px;
|
||||||
|
$font-size-sm: 13px;
|
||||||
|
$line-height-base: 1.5;
|
||||||
|
|
||||||
|
// 间距
|
||||||
|
$spacing-base: 16px;
|
||||||
|
$spacing-lg: 24px;
|
||||||
|
$spacing-sm: 8px;
|
||||||
|
|
||||||
|
// 边框
|
||||||
|
$border-radius: 4px;
|
||||||
|
$border-radius-lg: 6px;
|
||||||
|
$border-radius-sm: 2px;
|
||||||
|
|
||||||
|
// 断点
|
||||||
|
$breakpoint-xs: 480px;
|
||||||
|
$breakpoint-sm: 576px;
|
||||||
|
$breakpoint-md: 768px;
|
||||||
|
$breakpoint-lg: 992px;
|
||||||
|
$breakpoint-xl: 1200px;
|
||||||
|
|
||||||
|
// 容器
|
||||||
|
$container-max-width: 1200px;
|
||||||
|
|
||||||
|
// z-index管理
|
||||||
|
$zindex-dropdown: 1000;
|
||||||
|
$zindex-sticky: 1020;
|
||||||
|
$zindex-fixed: 1030;
|
||||||
|
$zindex-modal-backdrop: 1040;
|
||||||
|
$zindex-modal: 1050;
|
||||||
|
$zindex-popover: 1060;
|
||||||
|
$zindex-tooltip: 1070;
|
||||||
|
|
||||||
|
// 阴影
|
||||||
|
$box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.1);
|
||||||
|
$box-shadow-light: 0 2px 4px rgba(0, 0, 0, .12), 0 0 6px rgba(0, 0, 0, .04);
|
||||||
|
$box-shadow-dark: 0 2px 4px rgba(0, 0, 0, .12), 0 0 6px rgba(0, 0, 0, .12);
|
||||||
|
|
||||||
|
// 过渡
|
||||||
|
$transition-base: all .3s cubic-bezier(.645,.045,.355,1);
|
||||||
|
$transition-fade: opacity .3s ease;
|
||||||
|
$transition-transform: transform .3s ease;
|
||||||
|
|
||||||
|
// 表格相关
|
||||||
|
$table-cell-padding: 12px;
|
||||||
|
$table-border-color: $border-color-lighter;
|
||||||
|
$table-hover-bg: $component-bg;
|
||||||
|
$table-header-bg: $component-bg;
|
||||||
|
|
||||||
|
// 响应式表格
|
||||||
|
$table-breakpoint-scroll: $breakpoint-md;
|
||||||
|
|
|
||||||
|
|
@ -13,12 +13,14 @@
|
||||||
width: 100%;
|
width: 100%;
|
||||||
height: 100%;
|
height: 100%;
|
||||||
padding: 16px 16px 0 16px;
|
padding: 16px 16px 0 16px;
|
||||||
background-image: url("../assets/pageBg.png");
|
background-image: url("../assets/bg.jpg");
|
||||||
background-size: cover;
|
background-size: cover;
|
||||||
background-position: center center;
|
background-position: center center;
|
||||||
}
|
}
|
||||||
|
|
||||||
.host-body {
|
.host-body {
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
.dv-dec-10,
|
.dv-dec-10,
|
||||||
.dv-dec-10-s {
|
.dv-dec-10-s {
|
||||||
width: 33.3%;
|
width: 33.3%;
|
||||||
|
|
@ -37,108 +39,92 @@
|
||||||
text-align: center;
|
text-align: center;
|
||||||
background-size: cover;
|
background-size: cover;
|
||||||
background-repeat: no-repeat;
|
background-repeat: no-repeat;
|
||||||
|
img{
|
||||||
|
width: 25%;
|
||||||
|
position: absolute;
|
||||||
|
bottom: 10px;
|
||||||
|
left: 22%;
|
||||||
|
transform: translate(-22%);
|
||||||
|
}
|
||||||
.title-text {
|
.title-text {
|
||||||
font-size: 24px;
|
font-size: 40px;
|
||||||
position: absolute;
|
position: absolute;
|
||||||
bottom: 0;
|
bottom: 0;
|
||||||
left: 50%;
|
left: 65%;
|
||||||
transform: translate(-50%);
|
transform: translate(-65%);
|
||||||
|
font-weight: bold;
|
||||||
}
|
}
|
||||||
|
|
||||||
.dv-dec-6 {
|
.dv-dec-6 {
|
||||||
position: absolute;
|
position: absolute;
|
||||||
bottom: -30px;
|
bottom: -10px;
|
||||||
left: 50%;
|
left: 50%;
|
||||||
width: 250px;
|
width: 250px;
|
||||||
height: 8px;
|
height: 8px;
|
||||||
transform: translate(-50%);
|
transform: translate(-50%);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// 第二行
|
// 添加响应式样式
|
||||||
.aside-width {
|
.data-table-wrapper {
|
||||||
width: 40%;
|
width: 100%;
|
||||||
}
|
overflow-x: auto;
|
||||||
.react-r-s,
|
|
||||||
.react-l-s {
|
.data-table {
|
||||||
background-color: #0f1325;
|
width: 100%;
|
||||||
}
|
border-collapse: collapse;
|
||||||
|
|
||||||
// 平行四边形
|
th, td {
|
||||||
.react-right {
|
padding: 12px;
|
||||||
&.react-l-s {
|
text-align: left;
|
||||||
text-align: right;
|
border: 1px solid #ddd;
|
||||||
width: 500px;
|
|
||||||
|
@media screen and (max-width: 768px) {
|
||||||
|
padding: 8px;
|
||||||
|
font-size: 14px;
|
||||||
}
|
}
|
||||||
font-size: 18px;
|
|
||||||
width: 300px;
|
@media screen and (max-width: 480px) {
|
||||||
line-height: 50px;
|
padding: 6px;
|
||||||
text-align: center;
|
font-size: 12px;
|
||||||
transform: skewX(-45deg);
|
|
||||||
|
|
||||||
.react-after {
|
|
||||||
position: absolute;
|
|
||||||
right: -25px;
|
|
||||||
top: 0;
|
|
||||||
height: 50px;
|
|
||||||
width: 50px;
|
|
||||||
background-color: #0f1325;
|
|
||||||
transform: skewX(45deg);
|
|
||||||
}
|
|
||||||
|
|
||||||
.text {
|
|
||||||
display: inline-block;
|
|
||||||
transform: skewX(45deg);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.react-left {
|
input {
|
||||||
&.react-l-s {
|
width: 100%;
|
||||||
width: 500px;
|
padding: 4px;
|
||||||
text-align: left;
|
border: 1px solid #ddd;
|
||||||
|
border-radius: 4px;
|
||||||
|
|
||||||
|
&:focus {
|
||||||
|
outline: none;
|
||||||
|
border-color: #409EFF;
|
||||||
}
|
}
|
||||||
font-size: 18px;
|
|
||||||
width: 300px;
|
@media screen and (max-width: 768px) {
|
||||||
height: 50px;
|
padding: 2px;
|
||||||
line-height: 50px;
|
|
||||||
text-align: center;
|
|
||||||
transform: skewX(45deg);
|
|
||||||
background-color: #0f1325;
|
|
||||||
|
|
||||||
.react-left {
|
|
||||||
position: absolute;
|
|
||||||
left: -25px;
|
|
||||||
top: 0;
|
|
||||||
height: 50px;
|
|
||||||
width: 50px;
|
|
||||||
background-color: #0f1325;
|
|
||||||
transform: skewX(-45deg);
|
|
||||||
}
|
|
||||||
|
|
||||||
.text {
|
|
||||||
display: inline-block;
|
|
||||||
transform: skewX(-45deg);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.body-box {
|
|
||||||
margin-top: 16px;
|
|
||||||
display: flex;
|
|
||||||
flex-direction: column;
|
|
||||||
|
|
||||||
//下方区域的布局
|
|
||||||
.content-box {
|
|
||||||
display: grid;
|
|
||||||
grid-template-columns: 2fr 3fr 5fr 3fr 2fr;
|
|
||||||
}
|
|
||||||
|
|
||||||
// 底部数据
|
|
||||||
.bottom-box {
|
|
||||||
margin-top: 10px;
|
|
||||||
display: grid;
|
|
||||||
grid-template-columns: repeat(2, 50%);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 响应式布局基础样式
|
||||||
|
@media screen and (max-width: 1200px) {
|
||||||
|
.container {
|
||||||
|
width: 95%;
|
||||||
|
margin: 0 auto;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@media screen and (max-width: 768px) {
|
||||||
|
.row {
|
||||||
|
flex-direction: column;
|
||||||
|
}
|
||||||
|
|
||||||
|
.col {
|
||||||
|
width: 100%;
|
||||||
|
margin-bottom: 15px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -9,15 +9,16 @@
|
||||||
box-sizing: border-box;
|
box-sizing: border-box;
|
||||||
}
|
}
|
||||||
|
|
||||||
html {
|
html, body {
|
||||||
margin: 0;
|
height: 100%;
|
||||||
padding: 0;
|
font-family: $font-family-base;
|
||||||
|
font-size: $font-size-base;
|
||||||
|
line-height: $line-height-base;
|
||||||
|
color: $text-color;
|
||||||
|
background-color: $body-bg;
|
||||||
}
|
}
|
||||||
|
|
||||||
body {
|
body {
|
||||||
font-family: Arial, Helvetica, sans-serif;
|
|
||||||
line-height: 1.2em;
|
|
||||||
background-color: #f1f1f1;
|
|
||||||
margin: 0;
|
margin: 0;
|
||||||
padding: 0;
|
padding: 0;
|
||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
|
|
@ -184,3 +185,73 @@ a {
|
||||||
#{$type}: 0;
|
#{$type}: 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 布局系统
|
||||||
|
.container {
|
||||||
|
width: 100%;
|
||||||
|
max-width: $container-max-width;
|
||||||
|
margin: 0 auto;
|
||||||
|
padding: 0 $spacing-base;
|
||||||
|
|
||||||
|
@media screen and (max-width: $breakpoint-lg) {
|
||||||
|
max-width: 100%;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.row {
|
||||||
|
display: flex;
|
||||||
|
flex-wrap: wrap;
|
||||||
|
margin: 0 (-$spacing-base);
|
||||||
|
|
||||||
|
@media screen and (max-width: $breakpoint-md) {
|
||||||
|
flex-direction: column;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 栅格系统
|
||||||
|
@for $i from 1 through 12 {
|
||||||
|
.col-#{$i} {
|
||||||
|
flex: 0 0 percentage($i / 12);
|
||||||
|
max-width: percentage($i / 12);
|
||||||
|
padding: 0 $spacing-base;
|
||||||
|
|
||||||
|
@media screen and (max-width: $breakpoint-md) {
|
||||||
|
flex: 0 0 100%;
|
||||||
|
max-width: 100%;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 通用工具类
|
||||||
|
.text-center { text-align: center; }
|
||||||
|
.text-left { text-align: left; }
|
||||||
|
.text-right { text-align: right; }
|
||||||
|
|
||||||
|
.mt-1 { margin-top: $spacing-base; }
|
||||||
|
.mb-1 { margin-bottom: $spacing-base; }
|
||||||
|
.ml-1 { margin-left: $spacing-base; }
|
||||||
|
.mr-1 { margin-right: $spacing-base; }
|
||||||
|
|
||||||
|
// 响应式工具类
|
||||||
|
@media screen and (max-width: $breakpoint-md) {
|
||||||
|
.hidden-mobile {
|
||||||
|
display: none !important;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@media screen and (min-width: $breakpoint-md) {
|
||||||
|
.hidden-desktop {
|
||||||
|
display: none !important;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 动画
|
||||||
|
.fade-enter-active,
|
||||||
|
.fade-leave-active {
|
||||||
|
transition: opacity 0.3s ease;
|
||||||
|
}
|
||||||
|
|
||||||
|
.fade-enter-from,
|
||||||
|
.fade-leave-to {
|
||||||
|
opacity: 0;
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,66 +0,0 @@
|
||||||
<template>
|
|
||||||
<div :id="id" :class="className" :style="{ height: height, width: width }" />
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<script>
|
|
||||||
import tdTheme from './theme.json' // 引入默认主题
|
|
||||||
import '../map/fujian.js'
|
|
||||||
|
|
||||||
export default {
|
|
||||||
name: 'echart',
|
|
||||||
props: {
|
|
||||||
className: {
|
|
||||||
type: String,
|
|
||||||
default: 'chart'
|
|
||||||
},
|
|
||||||
id: {
|
|
||||||
type: String,
|
|
||||||
default: 'chart'
|
|
||||||
},
|
|
||||||
width: {
|
|
||||||
type: String,
|
|
||||||
default: '100%'
|
|
||||||
},
|
|
||||||
height: {
|
|
||||||
type: String,
|
|
||||||
default: '2.5rem'
|
|
||||||
},
|
|
||||||
options: {
|
|
||||||
type: Object,
|
|
||||||
default: ()=>({})
|
|
||||||
}
|
|
||||||
},
|
|
||||||
data () {
|
|
||||||
return {
|
|
||||||
chart: null
|
|
||||||
}
|
|
||||||
},
|
|
||||||
watch: {
|
|
||||||
options: {
|
|
||||||
handler (options) {
|
|
||||||
// 设置true清空echart缓存
|
|
||||||
this.chart.setOption(options, true)
|
|
||||||
},
|
|
||||||
deep: true
|
|
||||||
}
|
|
||||||
},
|
|
||||||
mounted () {
|
|
||||||
this.$echarts.registerTheme('tdTheme', tdTheme); // 覆盖默认主题
|
|
||||||
this.initChart();
|
|
||||||
},
|
|
||||||
beforeDestroy () {
|
|
||||||
this.chart.dispose()
|
|
||||||
this.chart = null
|
|
||||||
},
|
|
||||||
methods: {
|
|
||||||
initChart () {
|
|
||||||
// 初始化echart
|
|
||||||
this.chart = this.$echarts.init(this.$el, 'tdTheme')
|
|
||||||
this.chart.setOption(this.options, true)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<style>
|
|
||||||
</style>
|
|
||||||
|
|
@ -1,490 +0,0 @@
|
||||||
{
|
|
||||||
"color": [
|
|
||||||
"#2d8cf0",
|
|
||||||
"#19be6b",
|
|
||||||
"#ff9900",
|
|
||||||
"#E46CBB",
|
|
||||||
"#9A66E4",
|
|
||||||
"#ed3f14"
|
|
||||||
],
|
|
||||||
"backgroundColor": "rgba(0,0,0,0)",
|
|
||||||
"textStyle": {},
|
|
||||||
"title": {
|
|
||||||
"textStyle": {
|
|
||||||
"color": "#516b91"
|
|
||||||
},
|
|
||||||
"subtextStyle": {
|
|
||||||
"color": "#93b7e3"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"line": {
|
|
||||||
"itemStyle": {
|
|
||||||
"normal": {
|
|
||||||
"borderWidth": "2"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"lineStyle": {
|
|
||||||
"normal": {
|
|
||||||
"width": "2"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"symbolSize": "6",
|
|
||||||
"symbol": "emptyCircle",
|
|
||||||
"smooth": true
|
|
||||||
},
|
|
||||||
"radar": {
|
|
||||||
"itemStyle": {
|
|
||||||
"normal": {
|
|
||||||
"borderWidth": "2"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"lineStyle": {
|
|
||||||
"normal": {
|
|
||||||
"width": "2"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"symbolSize": "6",
|
|
||||||
"symbol": "emptyCircle",
|
|
||||||
"smooth": true
|
|
||||||
},
|
|
||||||
"bar": {
|
|
||||||
"itemStyle": {
|
|
||||||
"normal": {
|
|
||||||
"barBorderWidth": 0,
|
|
||||||
"barBorderColor": "#ccc"
|
|
||||||
},
|
|
||||||
"emphasis": {
|
|
||||||
"barBorderWidth": 0,
|
|
||||||
"barBorderColor": "#ccc"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"pie": {
|
|
||||||
"itemStyle": {
|
|
||||||
"normal": {
|
|
||||||
"borderWidth": 0,
|
|
||||||
"borderColor": "#ccc"
|
|
||||||
},
|
|
||||||
"emphasis": {
|
|
||||||
"borderWidth": 0,
|
|
||||||
"borderColor": "#ccc"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"scatter": {
|
|
||||||
"itemStyle": {
|
|
||||||
"normal": {
|
|
||||||
"borderWidth": 0,
|
|
||||||
"borderColor": "#ccc"
|
|
||||||
},
|
|
||||||
"emphasis": {
|
|
||||||
"borderWidth": 0,
|
|
||||||
"borderColor": "#ccc"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"boxplot": {
|
|
||||||
"itemStyle": {
|
|
||||||
"normal": {
|
|
||||||
"borderWidth": 0,
|
|
||||||
"borderColor": "#ccc"
|
|
||||||
},
|
|
||||||
"emphasis": {
|
|
||||||
"borderWidth": 0,
|
|
||||||
"borderColor": "#ccc"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"parallel": {
|
|
||||||
"itemStyle": {
|
|
||||||
"normal": {
|
|
||||||
"borderWidth": 0,
|
|
||||||
"borderColor": "#ccc"
|
|
||||||
},
|
|
||||||
"emphasis": {
|
|
||||||
"borderWidth": 0,
|
|
||||||
"borderColor": "#ccc"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"sankey": {
|
|
||||||
"itemStyle": {
|
|
||||||
"normal": {
|
|
||||||
"borderWidth": 0,
|
|
||||||
"borderColor": "#ccc"
|
|
||||||
},
|
|
||||||
"emphasis": {
|
|
||||||
"borderWidth": 0,
|
|
||||||
"borderColor": "#ccc"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"funnel": {
|
|
||||||
"itemStyle": {
|
|
||||||
"normal": {
|
|
||||||
"borderWidth": 0,
|
|
||||||
"borderColor": "#ccc"
|
|
||||||
},
|
|
||||||
"emphasis": {
|
|
||||||
"borderWidth": 0,
|
|
||||||
"borderColor": "#ccc"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"gauge": {
|
|
||||||
"itemStyle": {
|
|
||||||
"normal": {
|
|
||||||
"borderWidth": 0,
|
|
||||||
"borderColor": "#ccc"
|
|
||||||
},
|
|
||||||
"emphasis": {
|
|
||||||
"borderWidth": 0,
|
|
||||||
"borderColor": "#ccc"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"candlestick": {
|
|
||||||
"itemStyle": {
|
|
||||||
"normal": {
|
|
||||||
"color": "#edafda",
|
|
||||||
"color0": "transparent",
|
|
||||||
"borderColor": "#d680bc",
|
|
||||||
"borderColor0": "#8fd3e8",
|
|
||||||
"borderWidth": "2"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"graph": {
|
|
||||||
"itemStyle": {
|
|
||||||
"normal": {
|
|
||||||
"borderWidth": 0,
|
|
||||||
"borderColor": "#ccc"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"lineStyle": {
|
|
||||||
"normal": {
|
|
||||||
"width": 1,
|
|
||||||
"color": "#aaa"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"symbolSize": "6",
|
|
||||||
"symbol": "emptyCircle",
|
|
||||||
"smooth": true,
|
|
||||||
"color": [
|
|
||||||
"#2d8cf0",
|
|
||||||
"#19be6b",
|
|
||||||
"#f5ae4a",
|
|
||||||
"#9189d5",
|
|
||||||
"#56cae2",
|
|
||||||
"#cbb0e3"
|
|
||||||
],
|
|
||||||
"label": {
|
|
||||||
"normal": {
|
|
||||||
"textStyle": {
|
|
||||||
"color": "#eee"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"map": {
|
|
||||||
"itemStyle": {
|
|
||||||
"normal": {
|
|
||||||
"areaColor": "#f3f3f3",
|
|
||||||
"borderColor": "#516b91",
|
|
||||||
"borderWidth": 0.5
|
|
||||||
},
|
|
||||||
"emphasis": {
|
|
||||||
"areaColor": "rgba(165,231,240,1)",
|
|
||||||
"borderColor": "#516b91",
|
|
||||||
"borderWidth": 1
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"label": {
|
|
||||||
"normal": {
|
|
||||||
"textStyle": {
|
|
||||||
"color": "#000"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"emphasis": {
|
|
||||||
"textStyle": {
|
|
||||||
"color": "rgb(81,107,145)"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"geo": {
|
|
||||||
"itemStyle": {
|
|
||||||
"normal": {
|
|
||||||
"areaColor": "#f3f3f3",
|
|
||||||
"borderColor": "#516b91",
|
|
||||||
"borderWidth": 0.5
|
|
||||||
},
|
|
||||||
"emphasis": {
|
|
||||||
"areaColor": "rgba(165,231,240,1)",
|
|
||||||
"borderColor": "#516b91",
|
|
||||||
"borderWidth": 1
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"label": {
|
|
||||||
"normal": {
|
|
||||||
"textStyle": {
|
|
||||||
"color": "#000"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"emphasis": {
|
|
||||||
"textStyle": {
|
|
||||||
"color": "rgb(81,107,145)"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"categoryAxis": {
|
|
||||||
"axisLine": {
|
|
||||||
"show": true,
|
|
||||||
"lineStyle": {
|
|
||||||
"color": "#cccccc"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"axisTick": {
|
|
||||||
"show": false,
|
|
||||||
"lineStyle": {
|
|
||||||
"color": "#333"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"axisLabel": {
|
|
||||||
"show": true,
|
|
||||||
"textStyle": {
|
|
||||||
"color": "#fff"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"splitLine": {
|
|
||||||
"show": false,
|
|
||||||
"lineStyle": {
|
|
||||||
"color": [
|
|
||||||
"#eeeeee"
|
|
||||||
]
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"splitArea": {
|
|
||||||
"show": false,
|
|
||||||
"areaStyle": {
|
|
||||||
"color": [
|
|
||||||
"rgba(250,250,250,0.05)",
|
|
||||||
"rgba(200,200,200,0.02)"
|
|
||||||
]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"valueAxis": {
|
|
||||||
"axisLine": {
|
|
||||||
"show": true,
|
|
||||||
"lineStyle": {
|
|
||||||
"color": "#cccccc"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"axisTick": {
|
|
||||||
"show": false,
|
|
||||||
"lineStyle": {
|
|
||||||
"color": "#333"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"axisLabel": {
|
|
||||||
"show": true,
|
|
||||||
"textStyle": {
|
|
||||||
"color": "#fff"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"splitLine": {
|
|
||||||
"show": false,
|
|
||||||
"lineStyle": {
|
|
||||||
"color": [
|
|
||||||
"#eeeeee"
|
|
||||||
]
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"splitArea": {
|
|
||||||
"show": false,
|
|
||||||
"areaStyle": {
|
|
||||||
"color": [
|
|
||||||
"rgba(250,250,250,0.05)",
|
|
||||||
"rgba(200,200,200,0.02)"
|
|
||||||
]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"logAxis": {
|
|
||||||
"axisLine": {
|
|
||||||
"show": true,
|
|
||||||
"lineStyle": {
|
|
||||||
"color": "#cccccc"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"axisTick": {
|
|
||||||
"show": false,
|
|
||||||
"lineStyle": {
|
|
||||||
"color": "#333"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"axisLabel": {
|
|
||||||
"show": true,
|
|
||||||
"textStyle": {
|
|
||||||
"color": "#999999"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"splitLine": {
|
|
||||||
"show": true,
|
|
||||||
"lineStyle": {
|
|
||||||
"color": [
|
|
||||||
"#eeeeee"
|
|
||||||
]
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"splitArea": {
|
|
||||||
"show": false,
|
|
||||||
"areaStyle": {
|
|
||||||
"color": [
|
|
||||||
"rgba(250,250,250,0.05)",
|
|
||||||
"rgba(200,200,200,0.02)"
|
|
||||||
]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"timeAxis": {
|
|
||||||
"axisLine": {
|
|
||||||
"show": true,
|
|
||||||
"lineStyle": {
|
|
||||||
"color": "#cccccc"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"axisTick": {
|
|
||||||
"show": false,
|
|
||||||
"lineStyle": {
|
|
||||||
"color": "#333"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"axisLabel": {
|
|
||||||
"show": true,
|
|
||||||
"textStyle": {
|
|
||||||
"color": "#999999"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"splitLine": {
|
|
||||||
"show": true,
|
|
||||||
"lineStyle": {
|
|
||||||
"color": [
|
|
||||||
"#eeeeee"
|
|
||||||
]
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"splitArea": {
|
|
||||||
"show": false,
|
|
||||||
"areaStyle": {
|
|
||||||
"color": [
|
|
||||||
"rgba(250,250,250,0.05)",
|
|
||||||
"rgba(200,200,200,0.02)"
|
|
||||||
]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"toolbox": {
|
|
||||||
"iconStyle": {
|
|
||||||
"normal": {
|
|
||||||
"borderColor": "#999"
|
|
||||||
},
|
|
||||||
"emphasis": {
|
|
||||||
"borderColor": "#666"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"legend": {
|
|
||||||
"textStyle": {
|
|
||||||
"color": "#fff"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"tooltip": {
|
|
||||||
"axisPointer": {
|
|
||||||
"lineStyle": {
|
|
||||||
"color": "#ccc",
|
|
||||||
"width": 1
|
|
||||||
},
|
|
||||||
"crossStyle": {
|
|
||||||
"color": "#ccc",
|
|
||||||
"width": 1
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"timeline": {
|
|
||||||
"lineStyle": {
|
|
||||||
"color": "#8fd3e8",
|
|
||||||
"width": 1
|
|
||||||
},
|
|
||||||
"itemStyle": {
|
|
||||||
"normal": {
|
|
||||||
"color": "#8fd3e8",
|
|
||||||
"borderWidth": 1
|
|
||||||
},
|
|
||||||
"emphasis": {
|
|
||||||
"color": "#8fd3e8"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"controlStyle": {
|
|
||||||
"normal": {
|
|
||||||
"color": "#8fd3e8",
|
|
||||||
"borderColor": "#8fd3e8",
|
|
||||||
"borderWidth": 0.5
|
|
||||||
},
|
|
||||||
"emphasis": {
|
|
||||||
"color": "#8fd3e8",
|
|
||||||
"borderColor": "#8fd3e8",
|
|
||||||
"borderWidth": 0.5
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"checkpointStyle": {
|
|
||||||
"color": "#8fd3e8",
|
|
||||||
"borderColor": "rgba(138,124,168,0.37)"
|
|
||||||
},
|
|
||||||
"label": {
|
|
||||||
"normal": {
|
|
||||||
"textStyle": {
|
|
||||||
"color": "#8fd3e8"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"emphasis": {
|
|
||||||
"textStyle": {
|
|
||||||
"color": "#8fd3e8"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"visualMap": {
|
|
||||||
"color": [
|
|
||||||
"#516b91",
|
|
||||||
"#59c4e6",
|
|
||||||
"#a5e7f0"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"dataZoom": {
|
|
||||||
"backgroundColor": "rgba(0,0,0,0)",
|
|
||||||
"dataBackgroundColor": "rgba(255,255,255,0.3)",
|
|
||||||
"fillerColor": "rgba(167,183,204,0.4)",
|
|
||||||
"handleColor": "#a7b7cc",
|
|
||||||
"handleSize": "100%",
|
|
||||||
"textStyle": {
|
|
||||||
"color": "#333"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"markPoint": {
|
|
||||||
"label": {
|
|
||||||
"normal": {
|
|
||||||
"textStyle": {
|
|
||||||
"color": "#eee"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"emphasis": {
|
|
||||||
"textStyle": {
|
|
||||||
"color": "#eee"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
File diff suppressed because one or more lines are too long
|
|
@ -0,0 +1,271 @@
|
||||||
|
<template>
|
||||||
|
<div class="asset-overview">
|
||||||
|
<div class="content">
|
||||||
|
<div class="asset-summary">
|
||||||
|
<div class="total-assets">
|
||||||
|
<div class="value">{{ formatCurrency(assetData.totalAssets) }}</div>
|
||||||
|
<div class="label">总资产(万元)</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="asset-categories">
|
||||||
|
<div
|
||||||
|
class="category-item"
|
||||||
|
v-for="(item, index) in assetData.assetCategories"
|
||||||
|
:key="index"
|
||||||
|
>
|
||||||
|
<span class="label">{{ item.name }}</span>
|
||||||
|
<span class="value">{{ formatNumber(item.value) }}万</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="table-container">
|
||||||
|
<el-table
|
||||||
|
:data="displayData"
|
||||||
|
style="width: 100%"
|
||||||
|
class="animated-table custom-table"
|
||||||
|
:row-class-name="tableRowClassName"
|
||||||
|
:header-cell-style="{
|
||||||
|
background: 'transparent',
|
||||||
|
color: '#4a90e2',
|
||||||
|
height: '40px',
|
||||||
|
fontWeight: 'bold',
|
||||||
|
fontSize: '14px',
|
||||||
|
}"
|
||||||
|
:row-style="{ height: '35px' }"
|
||||||
|
:cell-style="{ padding: '0' }"
|
||||||
|
>
|
||||||
|
<el-table-column
|
||||||
|
prop="月份"
|
||||||
|
label="月份"
|
||||||
|
width="180"
|
||||||
|
align="center"
|
||||||
|
/>
|
||||||
|
<el-table-column
|
||||||
|
prop="资产总值"
|
||||||
|
label="资产总值(万元)"
|
||||||
|
align="center"
|
||||||
|
>
|
||||||
|
<template #default="scope">
|
||||||
|
{{ formatNumber(scope.row.资产总值) }}
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
</el-table>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
import { assetData } from "../data/dashboardData";
|
||||||
|
import { formatNumber, formatCurrency } from "../utils/format";
|
||||||
|
|
||||||
|
export default {
|
||||||
|
name: "AssetOverview",
|
||||||
|
components: {},
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
assetData,
|
||||||
|
};
|
||||||
|
},
|
||||||
|
computed: {
|
||||||
|
displayData() {
|
||||||
|
return [
|
||||||
|
...this.assetData.assetTrendData.rows,
|
||||||
|
...this.assetData.assetTrendData.rows,
|
||||||
|
];
|
||||||
|
},
|
||||||
|
},
|
||||||
|
methods: {
|
||||||
|
formatNumber,
|
||||||
|
formatCurrency,
|
||||||
|
tableRowClassName({ rowIndex }) {
|
||||||
|
return `row-${rowIndex}`;
|
||||||
|
},
|
||||||
|
},
|
||||||
|
};
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style lang="scss" scoped>
|
||||||
|
.asset-overview {
|
||||||
|
height: 100%;
|
||||||
|
color: #fff;
|
||||||
|
|
||||||
|
.content {
|
||||||
|
height: calc(100% - 80px);
|
||||||
|
margin-top: 15px;
|
||||||
|
.asset-summary {
|
||||||
|
display: flex;
|
||||||
|
justify-content: space-between;
|
||||||
|
align-items: center;
|
||||||
|
margin-bottom: 20px;
|
||||||
|
|
||||||
|
.total-assets {
|
||||||
|
text-align: center;
|
||||||
|
&:hover {
|
||||||
|
transform: translateY(-2px);
|
||||||
|
.label {
|
||||||
|
color: rgba(255, 255, 255, 0.9);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.value {
|
||||||
|
font-size: 24px;
|
||||||
|
font-weight: bold;
|
||||||
|
background: linear-gradient(135deg, #4a90e2, #36d1dc);
|
||||||
|
-webkit-background-clip: text;
|
||||||
|
-webkit-text-fill-color: transparent;
|
||||||
|
}
|
||||||
|
|
||||||
|
.label {
|
||||||
|
font-size: 14px;
|
||||||
|
color: rgba(255, 255, 255, 0.7);
|
||||||
|
margin-top: 5px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.asset-categories {
|
||||||
|
display: flex;
|
||||||
|
gap: 20px;
|
||||||
|
|
||||||
|
.category-item {
|
||||||
|
text-align: center;
|
||||||
|
|
||||||
|
.label {
|
||||||
|
display: block;
|
||||||
|
font-size: 12px;
|
||||||
|
color: rgba(255, 255, 255, 0.7);
|
||||||
|
}
|
||||||
|
|
||||||
|
.value {
|
||||||
|
display: block;
|
||||||
|
font-size: 16px;
|
||||||
|
background: linear-gradient(135deg, #4a90e2, #36d1dc);
|
||||||
|
-webkit-background-clip: text;
|
||||||
|
-webkit-text-fill-color: transparent;
|
||||||
|
margin-top: 5px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.table-container {
|
||||||
|
height: 160px;
|
||||||
|
position: relative;
|
||||||
|
overflow: hidden;
|
||||||
|
border-radius: 8px;
|
||||||
|
background: rgba(74, 144, 226, 0.05);
|
||||||
|
backdrop-filter: blur(5px);
|
||||||
|
|
||||||
|
.custom-table {
|
||||||
|
::v-deep {
|
||||||
|
.el-table__cell {
|
||||||
|
border: none !important;
|
||||||
|
transition: all 0.3s ease;
|
||||||
|
}
|
||||||
|
|
||||||
|
.el-table__header-wrapper {
|
||||||
|
th {
|
||||||
|
background: transparent;
|
||||||
|
border: none;
|
||||||
|
position: relative;
|
||||||
|
|
||||||
|
&::after {
|
||||||
|
content: "";
|
||||||
|
position: absolute;
|
||||||
|
bottom: 0;
|
||||||
|
left: 10%;
|
||||||
|
width: 80%;
|
||||||
|
height: 2px;
|
||||||
|
background: linear-gradient(
|
||||||
|
90deg,
|
||||||
|
transparent 0%,
|
||||||
|
rgba(74, 144, 226, 0.5) 50%,
|
||||||
|
transparent 100%
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
.cell {
|
||||||
|
font-weight: bold;
|
||||||
|
background: linear-gradient(to top, #4a90e2, #ffffff);
|
||||||
|
-webkit-background-clip: text;
|
||||||
|
-webkit-text-fill-color: transparent;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.el-table__body-wrapper {
|
||||||
|
background: transparent;
|
||||||
|
overflow: hidden;
|
||||||
|
|
||||||
|
td {
|
||||||
|
background: transparent;
|
||||||
|
border: none;
|
||||||
|
position: relative;
|
||||||
|
|
||||||
|
&::after {
|
||||||
|
content: "";
|
||||||
|
position: absolute;
|
||||||
|
bottom: 0;
|
||||||
|
left: 5%;
|
||||||
|
width: 90%;
|
||||||
|
height: 1px;
|
||||||
|
background: linear-gradient(
|
||||||
|
90deg,
|
||||||
|
transparent 0%,
|
||||||
|
rgba(74, 144, 226, 0.1) 50%,
|
||||||
|
transparent 100%
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.el-table__row {
|
||||||
|
transition: all 0.3s ease;
|
||||||
|
|
||||||
|
&:hover {
|
||||||
|
background: rgba(74, 144, 226, 0.1);
|
||||||
|
transform: scale(1.01);
|
||||||
|
td {
|
||||||
|
color: #4a90e2;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.el-table__body {
|
||||||
|
animation: scroll 20s linear infinite;
|
||||||
|
&:hover {
|
||||||
|
animation-play-state: paused;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@keyframes scroll {
|
||||||
|
0% {
|
||||||
|
transform: translateY(0);
|
||||||
|
}
|
||||||
|
100% {
|
||||||
|
transform: translateY(-50%);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.el-table__inner-wrapper::after,
|
||||||
|
.el-table--border::after {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.el-table {
|
||||||
|
background-color: transparent;
|
||||||
|
}
|
||||||
|
|
||||||
|
::v-deep .el-table th,
|
||||||
|
::v-deep .el-table tr,
|
||||||
|
::v-deep .el-table td {
|
||||||
|
background-color: transparent;
|
||||||
|
border: none;
|
||||||
|
color: rgba(255, 255, 255, 0.8);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
|
@ -0,0 +1,302 @@
|
||||||
|
<template>
|
||||||
|
<div class="card-overview">
|
||||||
|
<div class="content">
|
||||||
|
<div class="statistics">
|
||||||
|
<div class="stat-item">
|
||||||
|
<div class="icon-wrapper">
|
||||||
|
<i class="el-icon-bank-card"></i>
|
||||||
|
</div>
|
||||||
|
<div class="stat-content">
|
||||||
|
<div class="value">{{ formatNumber(cardData.totalCards) }}</div>
|
||||||
|
<div class="label">发卡总量</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="stat-item">
|
||||||
|
<div class="icon-wrapper">
|
||||||
|
<i class="el-icon-data-line"></i>
|
||||||
|
</div>
|
||||||
|
<div class="stat-content">
|
||||||
|
<div class="value">{{ formatNumber(cardData.dailyUsage) }}</div>
|
||||||
|
<div class="label">日均使用量</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="usage-scenes">
|
||||||
|
<div class="scene-header">
|
||||||
|
<i class="el-icon-place"></i>
|
||||||
|
<h4>使用场景分布</h4>
|
||||||
|
</div>
|
||||||
|
<div class="scene-list">
|
||||||
|
<div
|
||||||
|
class="scene-item"
|
||||||
|
v-for="(item, index) in cardData.usageScenes"
|
||||||
|
:key="index"
|
||||||
|
>
|
||||||
|
<div class="scene-info">
|
||||||
|
<div class="icon-box" :style="getSceneStyle(index)">
|
||||||
|
<i :class="getSceneIcon(item.name)"></i>
|
||||||
|
</div>
|
||||||
|
<div class="scene-details">
|
||||||
|
<span class="name">{{ item.name }}</span>
|
||||||
|
<el-progress
|
||||||
|
:percentage="getPercentage(item.count)"
|
||||||
|
:color="getSceneColor(index)"
|
||||||
|
:show-text="false"
|
||||||
|
:stroke-width="4"
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<span class="value">{{ formatNumber(item.count) }}次</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
import { cardData } from "../data/dashboardData";
|
||||||
|
import { formatNumber } from "../utils/format";
|
||||||
|
|
||||||
|
export default {
|
||||||
|
name: "CardOverview",
|
||||||
|
components: {},
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
cardData,
|
||||||
|
};
|
||||||
|
},
|
||||||
|
methods: {
|
||||||
|
formatNumber,
|
||||||
|
getSceneIcon(name) {
|
||||||
|
const iconMap = {
|
||||||
|
食堂: "el-icon-food",
|
||||||
|
图书馆: "el-icon-reading",
|
||||||
|
宿舍: "el-icon-house",
|
||||||
|
教学楼: "el-icon-school",
|
||||||
|
超市: "el-icon-shopping-cart-full",
|
||||||
|
其他: "el-icon-more",
|
||||||
|
};
|
||||||
|
return iconMap[name] || "el-icon-place";
|
||||||
|
},
|
||||||
|
getSceneColor(index) {
|
||||||
|
const colors = [
|
||||||
|
"#4a90e2", // 亮蓝
|
||||||
|
"#00CED1", // 天青
|
||||||
|
"#9561e2", // 紫色
|
||||||
|
"#64B5F6", // 天蓝
|
||||||
|
"#ff9f43", // 亮橙
|
||||||
|
"#4CAF50", // 绿色
|
||||||
|
];
|
||||||
|
return colors[index % colors.length];
|
||||||
|
},
|
||||||
|
getSceneStyle(index) {
|
||||||
|
const color = this.getSceneColor(index);
|
||||||
|
return {
|
||||||
|
background: `linear-gradient(135deg, ${color}22, ${color}44)`,
|
||||||
|
borderColor: `${color}66`,
|
||||||
|
};
|
||||||
|
},
|
||||||
|
getPercentage(count) {
|
||||||
|
const max = Math.max(
|
||||||
|
...this.cardData.usageScenes.map((scene) => scene.count)
|
||||||
|
);
|
||||||
|
return (count / max) * 100;
|
||||||
|
},
|
||||||
|
},
|
||||||
|
};
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style lang="scss" scoped>
|
||||||
|
.card-overview {
|
||||||
|
height: 100%;
|
||||||
|
color: #fff;
|
||||||
|
|
||||||
|
.content {
|
||||||
|
height: 100%;
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
gap: 20px;
|
||||||
|
padding: 5px;
|
||||||
|
|
||||||
|
.statistics {
|
||||||
|
display: flex;
|
||||||
|
justify-content: space-around;
|
||||||
|
gap: 20px;
|
||||||
|
|
||||||
|
.stat-item {
|
||||||
|
flex: 1;
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
gap: 15px;
|
||||||
|
// padding: 15px;
|
||||||
|
// background: rgba(74, 144, 226, 0.05);
|
||||||
|
// border-radius: 10px;
|
||||||
|
// border: 1px solid rgba(74, 144, 226, 0.1);
|
||||||
|
backdrop-filter: blur(5px);
|
||||||
|
transition: all 0.3s ease;
|
||||||
|
|
||||||
|
&:hover {
|
||||||
|
transform: translateY(-2px);
|
||||||
|
border-color: rgba(74, 144, 226, 0.2);
|
||||||
|
box-shadow: 0 4px 12px rgba(74, 144, 226, 0.1);
|
||||||
|
|
||||||
|
.icon-wrapper {
|
||||||
|
i {
|
||||||
|
transform: scale(1.1);
|
||||||
|
background: linear-gradient(135deg, #4a90e2, #36d1dc);
|
||||||
|
-webkit-background-clip: text;
|
||||||
|
-webkit-text-fill-color: transparent;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-wrapper {
|
||||||
|
width: 48px;
|
||||||
|
height: 48px;
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
// border-radius: 12px;
|
||||||
|
// background: rgba(74, 144, 226, 0.1);
|
||||||
|
|
||||||
|
i {
|
||||||
|
font-size: 24px;
|
||||||
|
color: #4a90e2;
|
||||||
|
transition: all 0.3s ease;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.stat-content {
|
||||||
|
flex: 1;
|
||||||
|
|
||||||
|
.value {
|
||||||
|
font-size: 22px;
|
||||||
|
font-weight: bold;
|
||||||
|
background: linear-gradient(135deg, #4a90e2, #36d1dc);
|
||||||
|
-webkit-background-clip: text;
|
||||||
|
-webkit-text-fill-color: transparent;
|
||||||
|
transition: all 0.3s ease;
|
||||||
|
}
|
||||||
|
|
||||||
|
.label {
|
||||||
|
font-size: 13px;
|
||||||
|
color: rgba(255, 255, 255, 0.7);
|
||||||
|
margin-top: 4px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.usage-scenes {
|
||||||
|
flex: 1;
|
||||||
|
background: rgba(74, 144, 226, 0.05);
|
||||||
|
border-radius: 10px;
|
||||||
|
border: 1px solid rgba(74, 144, 226, 0.1);
|
||||||
|
backdrop-filter: blur(5px);
|
||||||
|
padding: 15px;
|
||||||
|
|
||||||
|
.scene-header {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
gap: 8px;
|
||||||
|
margin-bottom: 20px;
|
||||||
|
padding-bottom: 10px;
|
||||||
|
border-bottom: 1px solid rgba(255, 255, 255, 0.1);
|
||||||
|
|
||||||
|
i {
|
||||||
|
font-size: 18px;
|
||||||
|
background: linear-gradient(135deg, #4a90e2, #36d1dc);
|
||||||
|
-webkit-background-clip: text;
|
||||||
|
-webkit-text-fill-color: transparent;
|
||||||
|
}
|
||||||
|
|
||||||
|
h4 {
|
||||||
|
font-size: 14px;
|
||||||
|
font-weight: 500;
|
||||||
|
color: rgba(255, 255, 255, 0.9);
|
||||||
|
margin: 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.scene-list {
|
||||||
|
display: grid;
|
||||||
|
grid-template-columns: repeat(2, 1fr);
|
||||||
|
gap: 15px;
|
||||||
|
|
||||||
|
.scene-item {
|
||||||
|
display: flex;
|
||||||
|
justify-content: space-between;
|
||||||
|
align-items: center;
|
||||||
|
padding: 12px;
|
||||||
|
// background: rgba(255, 255, 255, 0.03);
|
||||||
|
// border-radius: 8px;
|
||||||
|
transition: all 0.3s ease;
|
||||||
|
|
||||||
|
&:hover {
|
||||||
|
background: rgba(255, 255, 255, 0.05);
|
||||||
|
transform: translateX(2px);
|
||||||
|
|
||||||
|
.icon-box {
|
||||||
|
transform: scale(1.05);
|
||||||
|
}
|
||||||
|
|
||||||
|
.value {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.scene-info {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
gap: 12px;
|
||||||
|
flex: 1;
|
||||||
|
|
||||||
|
.icon-box {
|
||||||
|
width: 36px;
|
||||||
|
height: 36px;
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
border-radius: 8px;
|
||||||
|
border: 1px solid;
|
||||||
|
transition: all 0.3s ease;
|
||||||
|
|
||||||
|
i {
|
||||||
|
font-size: 16px;
|
||||||
|
color: rgba(255, 255, 255, 0.9);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.scene-details {
|
||||||
|
flex: 1;
|
||||||
|
min-width: 0;
|
||||||
|
|
||||||
|
.name {
|
||||||
|
display: block;
|
||||||
|
font-size: 13px;
|
||||||
|
color: rgba(255, 255, 255, 0.9);
|
||||||
|
margin-bottom: 6px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.el-progress {
|
||||||
|
margin-top: 4px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.value {
|
||||||
|
font-size: 13px;
|
||||||
|
background: linear-gradient(135deg, #4a90e2, #36d1dc);
|
||||||
|
-webkit-background-clip: text;
|
||||||
|
-webkit-text-fill-color: transparent;
|
||||||
|
transition: all 0.3s ease;
|
||||||
|
margin-left: 8px;
|
||||||
|
white-space: nowrap;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
|
@ -0,0 +1,86 @@
|
||||||
|
<template>
|
||||||
|
<div class="common-header">
|
||||||
|
<div class="title-wrapper">
|
||||||
|
<div class="title-decoration"></div>
|
||||||
|
<h3 class="gradient-text" @click="$emit('click-more')">{{ title }}</h3>
|
||||||
|
</div>
|
||||||
|
<!-- <el-button type="text" @click="$emit('click-more')">更多</el-button> -->
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
export default {
|
||||||
|
name: "CommonHeader",
|
||||||
|
props: {
|
||||||
|
title: {
|
||||||
|
type: String,
|
||||||
|
required: true,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
};
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style lang="scss" scoped>
|
||||||
|
.common-header {
|
||||||
|
display: flex;
|
||||||
|
justify-content: space-between;
|
||||||
|
align-items: center;
|
||||||
|
margin-bottom: 5px;
|
||||||
|
// padding: 10px;
|
||||||
|
|
||||||
|
.title-wrapper {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
gap: 8px;
|
||||||
|
position: relative;
|
||||||
|
|
||||||
|
.title-decoration {
|
||||||
|
width: 3px;
|
||||||
|
height: 16px;
|
||||||
|
background: linear-gradient(to bottom, #4a90e2, #36d1dc);
|
||||||
|
border-radius: 2px;
|
||||||
|
position: relative;
|
||||||
|
|
||||||
|
&::after {
|
||||||
|
content: "";
|
||||||
|
position: absolute;
|
||||||
|
top: -2px;
|
||||||
|
left: -2px;
|
||||||
|
right: -2px;
|
||||||
|
bottom: -2px;
|
||||||
|
background: linear-gradient(to bottom, #4a90e2, #36d1dc);
|
||||||
|
filter: blur(4px);
|
||||||
|
opacity: 0.5;
|
||||||
|
border-radius: 2px;
|
||||||
|
z-index: -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
h3 {
|
||||||
|
margin: 0;
|
||||||
|
font-size: 22px;
|
||||||
|
background: linear-gradient(to bottom, #ffffff, #4a90e2);
|
||||||
|
-webkit-background-clip: text;
|
||||||
|
-webkit-text-fill-color: transparent;
|
||||||
|
text-shadow: 0 0 10px rgba(74, 144, 226, 0.2);
|
||||||
|
font-weight: 500;
|
||||||
|
cursor: pointer;
|
||||||
|
transition: all 0.3s ease;
|
||||||
|
|
||||||
|
&:hover {
|
||||||
|
transform: translateX(2px);
|
||||||
|
background: linear-gradient(to bottom, #ffffff, #36d1dc);
|
||||||
|
-webkit-background-clip: text;
|
||||||
|
-webkit-text-fill-color: transparent;
|
||||||
|
text-shadow: 0 0 15px rgba(54, 209, 220, 0.3);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.el-button {
|
||||||
|
color: #4a90e2;
|
||||||
|
font-size: 12px;
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
|
@ -0,0 +1,86 @@
|
||||||
|
<template>
|
||||||
|
<div class="education-overview">
|
||||||
|
<div class="charts">
|
||||||
|
<ve-line
|
||||||
|
:data="educationData.evaluationData"
|
||||||
|
:settings="educationData.chartSettings"
|
||||||
|
:extend="chartStyles.education.extend"
|
||||||
|
height="200px"
|
||||||
|
/>
|
||||||
|
<div class="info-cards">
|
||||||
|
<div class="info-card">
|
||||||
|
<div class="label">课程通过率</div>
|
||||||
|
<div class="value pass-rate">
|
||||||
|
{{ educationData.statistics.passRate }}%
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="info-card">
|
||||||
|
<div class="label">毕业率</div>
|
||||||
|
<div class="value graduation-rate">
|
||||||
|
{{ educationData.statistics.graduationRate }}%
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
import { educationData, chartStyles } from "../data/dashboardData";
|
||||||
|
|
||||||
|
export default {
|
||||||
|
name: "EducationOverview",
|
||||||
|
components: {},
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
educationData,
|
||||||
|
chartStyles,
|
||||||
|
};
|
||||||
|
},
|
||||||
|
methods: {},
|
||||||
|
};
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style lang="scss" scoped>
|
||||||
|
.education-overview {
|
||||||
|
height: 100%;
|
||||||
|
color: #fff;
|
||||||
|
padding: 10px;
|
||||||
|
|
||||||
|
.charts {
|
||||||
|
height: calc(100% - 80px);
|
||||||
|
margin-top: 10px;
|
||||||
|
.info-cards {
|
||||||
|
display: flex;
|
||||||
|
justify-content: space-around;
|
||||||
|
margin-top: -40px;
|
||||||
|
|
||||||
|
.info-card {
|
||||||
|
text-align: center;
|
||||||
|
padding: 15px 25px;
|
||||||
|
&:hover {
|
||||||
|
transform: translateY(-2px);
|
||||||
|
.label {
|
||||||
|
color: rgba(255, 255, 255, 0.9);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.label {
|
||||||
|
font-size: 13px;
|
||||||
|
color: rgba(255, 255, 255, 0.7);
|
||||||
|
margin-bottom: 8px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.value {
|
||||||
|
font-size: 24px;
|
||||||
|
font-weight: bold;
|
||||||
|
background: linear-gradient(135deg, #4a90e2, #36d1dc);
|
||||||
|
-webkit-background-clip: text;
|
||||||
|
-webkit-text-fill-color: transparent;
|
||||||
|
transition: all 0.3s ease;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
|
@ -0,0 +1,265 @@
|
||||||
|
<template>
|
||||||
|
<div class="literature-overview">
|
||||||
|
<div class="content">
|
||||||
|
<div class="total-info">
|
||||||
|
<div class="total-number">
|
||||||
|
{{ formatNumber(literatureData.totalLiterature) }}
|
||||||
|
</div>
|
||||||
|
<div class="label">馆藏总量</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<el-carousel
|
||||||
|
ref="carousel"
|
||||||
|
:interval="6000"
|
||||||
|
indicator-position="none"
|
||||||
|
height="180px"
|
||||||
|
@mouseenter="pauseCarousel"
|
||||||
|
@mouseleave="startCarousel"
|
||||||
|
>
|
||||||
|
<el-carousel-item>
|
||||||
|
<ve-histogram
|
||||||
|
ref="histogram"
|
||||||
|
:data="literatureData.chartData"
|
||||||
|
:settings="literatureData.chartSettings"
|
||||||
|
:extend="extendChartOptions"
|
||||||
|
height="200px"
|
||||||
|
:after-config="handleAfterConfig"
|
||||||
|
/>
|
||||||
|
</el-carousel-item>
|
||||||
|
<el-carousel-item>
|
||||||
|
<div class="subject-distribution">
|
||||||
|
<h4>学科分布 TOP5</h4>
|
||||||
|
<div class="distribution-list">
|
||||||
|
<div
|
||||||
|
class="distribution-item"
|
||||||
|
v-for="(item, index) in literatureData.subjectDistribution"
|
||||||
|
:key="index"
|
||||||
|
>
|
||||||
|
<span class="name">{{ item.name }}</span>
|
||||||
|
<el-progress
|
||||||
|
:percentage="item.percentage"
|
||||||
|
:color="getProgressColor(index)"
|
||||||
|
:show-text="false"
|
||||||
|
/>
|
||||||
|
<span class="value">{{ formatNumber(item.count) }}</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</el-carousel-item>
|
||||||
|
</el-carousel>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
import { literatureData, chartStyles } from "../data/dashboardData";
|
||||||
|
import { formatNumber } from "../utils/format";
|
||||||
|
|
||||||
|
export default {
|
||||||
|
name: "LiteratureOverview",
|
||||||
|
components: {},
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
literatureData,
|
||||||
|
chartStyles,
|
||||||
|
carousel: null,
|
||||||
|
};
|
||||||
|
},
|
||||||
|
computed: {
|
||||||
|
extendChartOptions() {
|
||||||
|
return {
|
||||||
|
...this.chartStyles.research.extend,
|
||||||
|
grid: {
|
||||||
|
top: "10%",
|
||||||
|
left: "3%",
|
||||||
|
right: "4%",
|
||||||
|
bottom: "8%",
|
||||||
|
containLabel: true,
|
||||||
|
},
|
||||||
|
animation: {
|
||||||
|
duration: 2000,
|
||||||
|
easing: "cubicInOut",
|
||||||
|
},
|
||||||
|
};
|
||||||
|
},
|
||||||
|
},
|
||||||
|
methods: {
|
||||||
|
formatNumber,
|
||||||
|
pauseCarousel() {
|
||||||
|
if (this.carousel) {
|
||||||
|
this.carousel.pause();
|
||||||
|
}
|
||||||
|
},
|
||||||
|
startCarousel() {
|
||||||
|
if (this.carousel) {
|
||||||
|
this.carousel.start();
|
||||||
|
}
|
||||||
|
},
|
||||||
|
handleAfterConfig(options) {
|
||||||
|
// 强制更新图表
|
||||||
|
this.$nextTick(() => {
|
||||||
|
if (this.$refs.histogram) {
|
||||||
|
this.$refs.histogram.echarts.resize();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
return options;
|
||||||
|
},
|
||||||
|
getProgressColor(index) {
|
||||||
|
// 定义5种不同的颜色
|
||||||
|
const colors = [
|
||||||
|
'#4a90e2', // 亮蓝色
|
||||||
|
'#00CED1', // 天青色
|
||||||
|
'#9561e2', // 紫色
|
||||||
|
'#64B5F6', // 天蓝色
|
||||||
|
'#ff9f43' // 亮橙色
|
||||||
|
];
|
||||||
|
return colors[index % colors.length];
|
||||||
|
},
|
||||||
|
},
|
||||||
|
mounted() {
|
||||||
|
this.carousel = this.$refs.carousel;
|
||||||
|
// 确保图表在挂载后立即渲染
|
||||||
|
this.$nextTick(() => {
|
||||||
|
if (this.$refs.histogram) {
|
||||||
|
this.$refs.histogram.echarts.resize();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
},
|
||||||
|
activated() {
|
||||||
|
// keep-alive 组件激活时也重新渲染图表
|
||||||
|
if (this.$refs.histogram) {
|
||||||
|
this.$refs.histogram.echarts.resize();
|
||||||
|
}
|
||||||
|
},
|
||||||
|
};
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style lang="scss" scoped>
|
||||||
|
.literature-overview {
|
||||||
|
height: 100%;
|
||||||
|
color: #fff;
|
||||||
|
|
||||||
|
.content {
|
||||||
|
height: calc(100% - 80px);
|
||||||
|
margin-top: 20px;
|
||||||
|
.total-info {
|
||||||
|
text-align: center;
|
||||||
|
margin-bottom: 15px;
|
||||||
|
margin-top: -15px;
|
||||||
|
.total-number {
|
||||||
|
font-size: 24px;
|
||||||
|
font-weight: bold;
|
||||||
|
background: linear-gradient(135deg, #4a90e2, #36d1dc);
|
||||||
|
-webkit-background-clip: text;
|
||||||
|
-webkit-text-fill-color: transparent;
|
||||||
|
}
|
||||||
|
|
||||||
|
.label {
|
||||||
|
font-size: 14px;
|
||||||
|
color: rgba(255, 255, 255, 0.7);
|
||||||
|
margin-top: 5px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.subject-distribution {
|
||||||
|
padding: 0 10px;
|
||||||
|
|
||||||
|
h4 {
|
||||||
|
font-size: 14px;
|
||||||
|
margin-bottom: 15px;
|
||||||
|
color: rgba(255, 255, 255, 0.9);
|
||||||
|
font-weight: 500;
|
||||||
|
}
|
||||||
|
|
||||||
|
.distribution-list {
|
||||||
|
.distribution-item {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
margin-bottom: 12px;
|
||||||
|
transition: all 0.3s ease;
|
||||||
|
|
||||||
|
&:hover {
|
||||||
|
transform: translateX(5px);
|
||||||
|
|
||||||
|
.name {
|
||||||
|
color: rgba(255, 255, 255, 0.9);
|
||||||
|
}
|
||||||
|
|
||||||
|
.value {
|
||||||
|
background: linear-gradient(135deg, #4a90e2, #36d1dc);
|
||||||
|
-webkit-background-clip: text;
|
||||||
|
-webkit-text-fill-color: transparent;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.name {
|
||||||
|
width: 70px;
|
||||||
|
font-size: 13px;
|
||||||
|
color: rgba(255, 255, 255, 0.7);
|
||||||
|
transition: color 0.3s ease;
|
||||||
|
}
|
||||||
|
|
||||||
|
.el-progress {
|
||||||
|
flex: 1;
|
||||||
|
margin: 0 12px;
|
||||||
|
|
||||||
|
::v-deep .el-progress-bar__outer {
|
||||||
|
background-color: rgba(255, 255, 255, 0.1);
|
||||||
|
border-radius: 4px;
|
||||||
|
height: 12px !important;
|
||||||
|
background-image: repeating-linear-gradient(
|
||||||
|
to right,
|
||||||
|
transparent,
|
||||||
|
transparent 4px,
|
||||||
|
rgba(255, 255, 255, 0.1) 4px,
|
||||||
|
rgba(255, 255, 255, 0.1) 6px
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
::v-deep .el-progress-bar__inner {
|
||||||
|
border-radius: 4px;
|
||||||
|
transition: all 0.3s ease;
|
||||||
|
position: relative;
|
||||||
|
background-image: repeating-linear-gradient(
|
||||||
|
to right,
|
||||||
|
transparent,
|
||||||
|
transparent 4px,
|
||||||
|
rgba(255, 255, 255, 0.2) 4px,
|
||||||
|
rgba(255, 255, 255, 0.2) 6px
|
||||||
|
);
|
||||||
|
|
||||||
|
&::after {
|
||||||
|
content: '';
|
||||||
|
position: absolute;
|
||||||
|
top: 0;
|
||||||
|
left: 0;
|
||||||
|
right: 0;
|
||||||
|
bottom: 0;
|
||||||
|
background: inherit;
|
||||||
|
filter: brightness(1.2);
|
||||||
|
border-radius: 4px;
|
||||||
|
opacity: 0;
|
||||||
|
transition: opacity 0.3s ease;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
&:hover {
|
||||||
|
::v-deep .el-progress-bar__inner::after {
|
||||||
|
opacity: 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.value {
|
||||||
|
width: 60px;
|
||||||
|
font-size: 13px;
|
||||||
|
color: #4a90e2;
|
||||||
|
text-align: right;
|
||||||
|
transition: all 0.3s ease;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
|
@ -0,0 +1,89 @@
|
||||||
|
<template>
|
||||||
|
<div class="research-overview">
|
||||||
|
<div class="content">
|
||||||
|
<ve-histogram
|
||||||
|
:data="chartData"
|
||||||
|
:settings="researchData.chartSettings"
|
||||||
|
:extend="chartStyles.research.extend"
|
||||||
|
height="260px"
|
||||||
|
/>
|
||||||
|
|
||||||
|
<div class="statistics">
|
||||||
|
<div
|
||||||
|
class="stat-item"
|
||||||
|
v-for="(item, index) in researchData.statistics"
|
||||||
|
:key="index"
|
||||||
|
>
|
||||||
|
<div class="number">{{ item.value }}</div>
|
||||||
|
<div class="label">{{ item.label }}</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
import { researchData, chartStyles } from "../data/dashboardData";
|
||||||
|
|
||||||
|
export default {
|
||||||
|
name: "ResearchOverview",
|
||||||
|
components: {},
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
researchData,
|
||||||
|
chartStyles,
|
||||||
|
chartData: researchData.chartData,
|
||||||
|
};
|
||||||
|
},
|
||||||
|
methods: {},
|
||||||
|
};
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style lang="scss" scoped>
|
||||||
|
.research-overview {
|
||||||
|
height: 100%;
|
||||||
|
color: #fff;
|
||||||
|
|
||||||
|
.content {
|
||||||
|
height: calc(100% - 80px);
|
||||||
|
margin-top: 20px;
|
||||||
|
padding: 0 10px;
|
||||||
|
|
||||||
|
.statistics {
|
||||||
|
display: flex;
|
||||||
|
justify-content: space-between;
|
||||||
|
margin-top: -30px;
|
||||||
|
padding: 0 20px;
|
||||||
|
|
||||||
|
.stat-item {
|
||||||
|
text-align: center;
|
||||||
|
min-width: 120px;
|
||||||
|
transition: all 0.3s ease;
|
||||||
|
|
||||||
|
&:hover {
|
||||||
|
transform: translateY(-2px);
|
||||||
|
.label {
|
||||||
|
color: rgba(255, 255, 255, 0.9);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.number {
|
||||||
|
font-size: 24px;
|
||||||
|
font-weight: bold;
|
||||||
|
background: linear-gradient(135deg, #4a90e2, #36d1dc);
|
||||||
|
-webkit-background-clip: text;
|
||||||
|
-webkit-text-fill-color: transparent;
|
||||||
|
transition: all 0.3s ease;
|
||||||
|
}
|
||||||
|
|
||||||
|
.label {
|
||||||
|
font-size: 13px;
|
||||||
|
color: rgba(255, 255, 255, 0.7);
|
||||||
|
margin-top: 8px;
|
||||||
|
transition: all 0.3s ease;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
|
@ -0,0 +1,148 @@
|
||||||
|
<template>
|
||||||
|
<div class="staff-overview">
|
||||||
|
<div class="content">
|
||||||
|
<div class="total-info">
|
||||||
|
<span class="number">{{ formatNumber(staffData.totalStaff) }}</span>
|
||||||
|
<span class="label">教职工总数</span>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="chart-and-structure">
|
||||||
|
<div class="charts">
|
||||||
|
<ve-ring
|
||||||
|
:data="titleChartData"
|
||||||
|
:settings="staffData.chartSettings"
|
||||||
|
:extend="staffData.chartSettings"
|
||||||
|
height="240px"
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="education-structure">
|
||||||
|
<h4>学历结构</h4>
|
||||||
|
<div class="structure-items">
|
||||||
|
<div
|
||||||
|
class="structure-item"
|
||||||
|
v-for="(item, index) in staffData.educationStructure"
|
||||||
|
:key="index"
|
||||||
|
>
|
||||||
|
<span class="label">{{ item.label }}</span>
|
||||||
|
<span class="value">{{ item.value }}%</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
import { staffData } from "../data/dashboardData";
|
||||||
|
import { formatNumber } from "../utils/format";
|
||||||
|
export default {
|
||||||
|
name: "StaffOverview",
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
staffData,
|
||||||
|
};
|
||||||
|
},
|
||||||
|
methods: {
|
||||||
|
formatNumber,
|
||||||
|
},
|
||||||
|
computed: {
|
||||||
|
titleChartData() {
|
||||||
|
return {
|
||||||
|
columns: ["职称", "人数"],
|
||||||
|
rows: this.staffData.titleData.rows,
|
||||||
|
};
|
||||||
|
},
|
||||||
|
},
|
||||||
|
};
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style lang="scss" scoped>
|
||||||
|
.staff-overview {
|
||||||
|
height: 100%;
|
||||||
|
color: #fff;
|
||||||
|
|
||||||
|
.content {
|
||||||
|
height: calc(100% - 80px);
|
||||||
|
margin-top: 20px;
|
||||||
|
.total-info {
|
||||||
|
text-align: center;
|
||||||
|
margin-bottom: 15px;
|
||||||
|
margin-top: -15px;
|
||||||
|
&:hover {
|
||||||
|
transform: translateY(-2px);
|
||||||
|
.label {
|
||||||
|
color: rgba(255, 255, 255, 0.9);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.number {
|
||||||
|
font-size: 24px;
|
||||||
|
font-weight: bold;
|
||||||
|
background: linear-gradient(135deg, #4a90e2, #36d1dc);
|
||||||
|
-webkit-background-clip: text;
|
||||||
|
-webkit-text-fill-color: transparent;
|
||||||
|
}
|
||||||
|
|
||||||
|
.label {
|
||||||
|
font-size: 14px;
|
||||||
|
margin-left: 10px;
|
||||||
|
color: rgba(255, 255, 255, 0.7);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.chart-and-structure {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
|
||||||
|
.charts {
|
||||||
|
width: 75%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.education-structure {
|
||||||
|
width: 20%;
|
||||||
|
margin-left: 5%;
|
||||||
|
|
||||||
|
h4 {
|
||||||
|
font-size: 14px;
|
||||||
|
margin-bottom: 15px;
|
||||||
|
text-align: center;
|
||||||
|
color: rgba(255, 255, 255, 0.9);
|
||||||
|
}
|
||||||
|
|
||||||
|
.structure-items {
|
||||||
|
display: flex;
|
||||||
|
flex-wrap: wrap;
|
||||||
|
|
||||||
|
.structure-item {
|
||||||
|
width: 100%;
|
||||||
|
margin-bottom: 12px;
|
||||||
|
display: flex;
|
||||||
|
justify-content: space-between;
|
||||||
|
padding: 8px 12px;
|
||||||
|
transition: all 0.3s ease;
|
||||||
|
|
||||||
|
&:hover {
|
||||||
|
transform: translateX(4px);
|
||||||
|
}
|
||||||
|
|
||||||
|
.label {
|
||||||
|
color: rgba(255, 255, 255, 0.7);
|
||||||
|
font-size: 13px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.value {
|
||||||
|
background: linear-gradient(135deg, #4a90e2, #36d1dc);
|
||||||
|
-webkit-background-clip: text;
|
||||||
|
-webkit-text-fill-color: transparent;
|
||||||
|
font-size: 13px;
|
||||||
|
font-weight: 500;
|
||||||
|
transition: all 0.3s ease;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
|
@ -0,0 +1,254 @@
|
||||||
|
<template>
|
||||||
|
<div class="student-overview">
|
||||||
|
<common-header
|
||||||
|
:title="'学生概况'"
|
||||||
|
:total="localStudentData.totalStudents"
|
||||||
|
:unit="'人'"
|
||||||
|
@more-click="handleMoreClick"
|
||||||
|
/>
|
||||||
|
<div class="content">
|
||||||
|
<div class="map-container">
|
||||||
|
<three-map
|
||||||
|
:marker-position="localStudentData.location"
|
||||||
|
:marker-label="localStudentData.location.name"
|
||||||
|
/>
|
||||||
|
<div class="info-overlay">
|
||||||
|
<div class="info-panel total-panel">
|
||||||
|
<div class="total-students">
|
||||||
|
<i class="el-icon-user-solid"></i>
|
||||||
|
<div class="total-details">
|
||||||
|
<div class="total-label">在校学生总数</div>
|
||||||
|
<div class="total-value">
|
||||||
|
{{ localStudentData.totalStudents }}人
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="info-panel grade-panel">
|
||||||
|
<h3>
|
||||||
|
<i class="el-icon-reading"></i>
|
||||||
|
年级分布
|
||||||
|
</h3>
|
||||||
|
<div class="info-grid">
|
||||||
|
<div
|
||||||
|
v-for="item in localStudentData.gradeData"
|
||||||
|
:key="item.name"
|
||||||
|
class="info-item"
|
||||||
|
>
|
||||||
|
<div class="info-details">
|
||||||
|
<div class="info-label">{{ item.name }}</div>
|
||||||
|
<div class="info-value">{{ item.value }}人</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="info-panel gender-panel">
|
||||||
|
<h3>
|
||||||
|
<i class="el-icon-user"></i>
|
||||||
|
性别比例
|
||||||
|
</h3>
|
||||||
|
<div class="info-grid">
|
||||||
|
<div
|
||||||
|
v-for="item in localStudentData.genderData"
|
||||||
|
:key="item.name"
|
||||||
|
class="info-item"
|
||||||
|
>
|
||||||
|
<div class="info-details">
|
||||||
|
<div class="info-label">
|
||||||
|
<i
|
||||||
|
:class="
|
||||||
|
item.name === '男' ? 'el-icon-male' : 'el-icon-female'
|
||||||
|
"
|
||||||
|
></i>
|
||||||
|
{{ item.name }}生
|
||||||
|
</div>
|
||||||
|
<div class="info-value">{{ item.value }}人</div>
|
||||||
|
<div class="info-percentage">
|
||||||
|
{{
|
||||||
|
Math.round(
|
||||||
|
(item.value / localStudentData.totalStudents) * 100
|
||||||
|
)
|
||||||
|
}}%
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
import CommonHeader from "./CommonHeader.vue";
|
||||||
|
// import ThreeMap from "./ThreeMap.vue";
|
||||||
|
import { studentData } from "../data/dashboardData";
|
||||||
|
|
||||||
|
export default {
|
||||||
|
name: "StudentOverview",
|
||||||
|
components: {
|
||||||
|
CommonHeader,
|
||||||
|
// ThreeMap,
|
||||||
|
},
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
localStudentData: JSON.parse(JSON.stringify(studentData)),
|
||||||
|
};
|
||||||
|
},
|
||||||
|
computed: {
|
||||||
|
totalStudents() {
|
||||||
|
return this.localStudentData.totalStudents;
|
||||||
|
},
|
||||||
|
},
|
||||||
|
methods: {
|
||||||
|
handleMoreClick() {
|
||||||
|
this.$router.push("/student/detail");
|
||||||
|
},
|
||||||
|
handleDataChange(newData) {
|
||||||
|
this.localStudentData = JSON.parse(JSON.stringify(newData));
|
||||||
|
},
|
||||||
|
},
|
||||||
|
};
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style scoped>
|
||||||
|
.student-overview {
|
||||||
|
height: 100%;
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
background: rgba(0, 20, 40, 0.7);
|
||||||
|
border-radius: 4px;
|
||||||
|
padding: 16px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.content {
|
||||||
|
flex: 1;
|
||||||
|
margin-top: 16px;
|
||||||
|
min-height: 400px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.map-container {
|
||||||
|
position: relative;
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
min-height: 400px;
|
||||||
|
background: rgba(0, 30, 60, 0.5);
|
||||||
|
border-radius: 4px;
|
||||||
|
overflow: hidden;
|
||||||
|
}
|
||||||
|
|
||||||
|
.info-overlay {
|
||||||
|
position: absolute;
|
||||||
|
top: 20px;
|
||||||
|
right: 20px;
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
gap: 16px;
|
||||||
|
max-width: 300px;
|
||||||
|
pointer-events: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.info-panel {
|
||||||
|
background: rgba(0, 0, 0, 0.7);
|
||||||
|
border-radius: 8px;
|
||||||
|
padding: 16px;
|
||||||
|
backdrop-filter: blur(10px);
|
||||||
|
}
|
||||||
|
|
||||||
|
.info-panel h3 {
|
||||||
|
color: #fff;
|
||||||
|
font-size: 16px;
|
||||||
|
margin: 0 0 16px;
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
gap: 8px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.info-panel h3 i {
|
||||||
|
font-size: 18px;
|
||||||
|
color: #409eff;
|
||||||
|
}
|
||||||
|
|
||||||
|
.info-grid {
|
||||||
|
display: grid;
|
||||||
|
grid-template-columns: repeat(2, 1fr);
|
||||||
|
gap: 12px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.info-item {
|
||||||
|
background: rgba(255, 255, 255, 0.1);
|
||||||
|
border-radius: 6px;
|
||||||
|
padding: 10px;
|
||||||
|
transition: all 0.3s ease;
|
||||||
|
}
|
||||||
|
|
||||||
|
.info-details {
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
.info-label {
|
||||||
|
color: rgba(255, 255, 255, 0.7);
|
||||||
|
font-size: 14px;
|
||||||
|
margin-bottom: 4px;
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
gap: 4px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.info-label i {
|
||||||
|
font-size: 16px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.el-icon-male {
|
||||||
|
color: #409eff;
|
||||||
|
}
|
||||||
|
|
||||||
|
.el-icon-female {
|
||||||
|
color: #f56c6c;
|
||||||
|
}
|
||||||
|
|
||||||
|
.info-value {
|
||||||
|
color: #fff;
|
||||||
|
font-size: 18px;
|
||||||
|
font-weight: bold;
|
||||||
|
margin-bottom: 2px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.info-percentage {
|
||||||
|
color: rgba(255, 255, 255, 0.5);
|
||||||
|
font-size: 12px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.total-panel {
|
||||||
|
background: rgba(0, 0, 0, 0.8);
|
||||||
|
}
|
||||||
|
|
||||||
|
.total-students {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
gap: 16px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.total-students i {
|
||||||
|
font-size: 32px;
|
||||||
|
color: #409eff;
|
||||||
|
}
|
||||||
|
|
||||||
|
.total-details {
|
||||||
|
flex: 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
.total-label {
|
||||||
|
color: rgba(255, 255, 255, 0.7);
|
||||||
|
font-size: 14px;
|
||||||
|
margin-bottom: 4px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.total-value {
|
||||||
|
color: #fff;
|
||||||
|
font-size: 24px;
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
|
@ -1,150 +0,0 @@
|
||||||
<template>
|
|
||||||
<div>
|
|
||||||
<!-- 年度开工率 -->
|
|
||||||
<Echart
|
|
||||||
:options="options"
|
|
||||||
id="bottomLeftChart"
|
|
||||||
height="480px"
|
|
||||||
width="100%"
|
|
||||||
></Echart>
|
|
||||||
</div>
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<script>
|
|
||||||
import Echart from '@/common/echart'
|
|
||||||
export default {
|
|
||||||
data () {
|
|
||||||
return {
|
|
||||||
options: {},
|
|
||||||
};
|
|
||||||
},
|
|
||||||
components: {
|
|
||||||
Echart,
|
|
||||||
},
|
|
||||||
props: {
|
|
||||||
cdata: {
|
|
||||||
type: Object,
|
|
||||||
default: () => ({})
|
|
||||||
},
|
|
||||||
},
|
|
||||||
watch: {
|
|
||||||
cdata: {
|
|
||||||
handler (newData) {
|
|
||||||
this.options = {
|
|
||||||
tooltip: {
|
|
||||||
trigger: "axis",
|
|
||||||
backgroundColor: "rgba(255,255,255,0.1)",
|
|
||||||
axisPointer: {
|
|
||||||
type: "shadow",
|
|
||||||
label: {
|
|
||||||
show: true,
|
|
||||||
backgroundColor: "#7B7DDC"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
legend: {
|
|
||||||
data: ["论文", "获奖", "专利",],
|
|
||||||
textStyle: {
|
|
||||||
color: "#B4B4B4"
|
|
||||||
},
|
|
||||||
top: "0%"
|
|
||||||
},
|
|
||||||
grid: {
|
|
||||||
x: "8%",
|
|
||||||
width: "88%",
|
|
||||||
y: "4%"
|
|
||||||
},
|
|
||||||
xAxis: {
|
|
||||||
data: newData.category,
|
|
||||||
axisLine: {
|
|
||||||
lineStyle: {
|
|
||||||
color: "#B4B4B4"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
axisTick: {
|
|
||||||
show: false
|
|
||||||
}
|
|
||||||
},
|
|
||||||
yAxis: [
|
|
||||||
{
|
|
||||||
splitLine: { show: false },
|
|
||||||
axisLine: {
|
|
||||||
lineStyle: {
|
|
||||||
color: "#B4B4B4"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
axisLabel: {
|
|
||||||
formatter: "{value} "
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
splitLine: { show: false },
|
|
||||||
axisLine: {
|
|
||||||
lineStyle: {
|
|
||||||
color: "#B4B4B4"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
axisLabel: {
|
|
||||||
formatter: "{value} "
|
|
||||||
}
|
|
||||||
}
|
|
||||||
],
|
|
||||||
series: [
|
|
||||||
{
|
|
||||||
name: "论文",
|
|
||||||
type: "line",
|
|
||||||
smooth: true,
|
|
||||||
showAllSymbol: true,
|
|
||||||
symbol: "emptyCircle",
|
|
||||||
symbolSize: 8,
|
|
||||||
yAxisIndex: 1,
|
|
||||||
itemStyle: {
|
|
||||||
normal: {
|
|
||||||
color: "#F02FC2"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
data: newData.rateData
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: "获奖",
|
|
||||||
type: "bar",
|
|
||||||
barWidth: 10,
|
|
||||||
itemStyle: {
|
|
||||||
normal: {
|
|
||||||
barBorderRadius: 5,
|
|
||||||
color: new this.$echarts.graphic.LinearGradient(0, 0, 0, 1, [
|
|
||||||
{ offset: 0, color: "#956FD4" },
|
|
||||||
{ offset: 1, color: "#3EACE5" }
|
|
||||||
])
|
|
||||||
}
|
|
||||||
},
|
|
||||||
data: newData.barData
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: "专利",
|
|
||||||
type: "bar",
|
|
||||||
barGap: "-100%",
|
|
||||||
barWidth: 10,
|
|
||||||
itemStyle: {
|
|
||||||
normal: {
|
|
||||||
barBorderRadius: 5,
|
|
||||||
color: new this.$echarts.graphic.LinearGradient(0, 0, 0, 1, [
|
|
||||||
{ offset: 0, color: "rgba(156,107,211,0.8)" },
|
|
||||||
{ offset: 0.2, color: "rgba(156,107,211,0.5)" },
|
|
||||||
{ offset: 1, color: "rgba(156,107,211,0.2)" }
|
|
||||||
])
|
|
||||||
}
|
|
||||||
},
|
|
||||||
z: -12,
|
|
||||||
data: newData.lineData
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
},
|
|
||||||
immediate: true,
|
|
||||||
deep: true
|
|
||||||
},
|
|
||||||
},
|
|
||||||
}
|
|
||||||
</script>
|
|
||||||
|
|
@ -1,84 +0,0 @@
|
||||||
<template>
|
|
||||||
<div>
|
|
||||||
<Chart :cdata="cdata" />
|
|
||||||
</div>
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<script>
|
|
||||||
import Chart from './chart.vue'
|
|
||||||
export default {
|
|
||||||
data () {
|
|
||||||
return {
|
|
||||||
cdata: {
|
|
||||||
category: [
|
|
||||||
"2012",
|
|
||||||
"2013",
|
|
||||||
"2014",
|
|
||||||
"2015",
|
|
||||||
"2016",
|
|
||||||
"2017",
|
|
||||||
"2018",
|
|
||||||
"2019",
|
|
||||||
"2020",
|
|
||||||
"2021",
|
|
||||||
"2022",
|
|
||||||
"2023",
|
|
||||||
"2024",
|
|
||||||
"2025",
|
|
||||||
],
|
|
||||||
lineData: [
|
|
||||||
18092,
|
|
||||||
20728,
|
|
||||||
24045,
|
|
||||||
28348,
|
|
||||||
32808,
|
|
||||||
36097,
|
|
||||||
39867,
|
|
||||||
44715,
|
|
||||||
48444,
|
|
||||||
50415,
|
|
||||||
56061,
|
|
||||||
62677,
|
|
||||||
59521,
|
|
||||||
67560,
|
|
||||||
],
|
|
||||||
barData: [
|
|
||||||
4600,
|
|
||||||
5000,
|
|
||||||
5500,
|
|
||||||
6500,
|
|
||||||
7500,
|
|
||||||
8500,
|
|
||||||
9900,
|
|
||||||
12500,
|
|
||||||
14000,
|
|
||||||
21500,
|
|
||||||
23200,
|
|
||||||
24450,
|
|
||||||
25250,
|
|
||||||
33300,
|
|
||||||
],
|
|
||||||
rateData: []
|
|
||||||
}
|
|
||||||
};
|
|
||||||
},
|
|
||||||
components: {
|
|
||||||
Chart,
|
|
||||||
},
|
|
||||||
mounted () {
|
|
||||||
this.setData();
|
|
||||||
},
|
|
||||||
methods: {
|
|
||||||
// 根据自己的业务情况修改
|
|
||||||
setData () {
|
|
||||||
for (let i = 0; i < this.cdata.barData.length -1; i++) {
|
|
||||||
let rate = this.cdata.barData[i] / this.cdata.lineData[i];
|
|
||||||
this.cdata.rateData.push(rate.toFixed(2));
|
|
||||||
}
|
|
||||||
},
|
|
||||||
}
|
|
||||||
};
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<style lang="scss" scoped>
|
|
||||||
</style>
|
|
||||||
|
|
@ -1,358 +0,0 @@
|
||||||
<template>
|
|
||||||
<div>
|
|
||||||
<Echart
|
|
||||||
:options="options"
|
|
||||||
id="centreLeft1Chart"
|
|
||||||
height="480px"
|
|
||||||
width="100%"
|
|
||||||
></Echart>
|
|
||||||
</div>
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<script>
|
|
||||||
import Echart from '@/common/echart'
|
|
||||||
export default {
|
|
||||||
data() {
|
|
||||||
return {
|
|
||||||
options: {},
|
|
||||||
// 定义颜色
|
|
||||||
colorList: {
|
|
||||||
linearYtoG: {
|
|
||||||
type: 'linear',
|
|
||||||
x: 0,
|
|
||||||
y: 0,
|
|
||||||
x2: 1,
|
|
||||||
y2: 1,
|
|
||||||
colorStops: [
|
|
||||||
{
|
|
||||||
offset: 0,
|
|
||||||
color: '#f5b44d'
|
|
||||||
},
|
|
||||||
{
|
|
||||||
offset: 1,
|
|
||||||
color: '#28f8de'
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
linearGtoB: {
|
|
||||||
type: 'linear',
|
|
||||||
x: 0,
|
|
||||||
y: 0,
|
|
||||||
x2: 1,
|
|
||||||
y2: 0,
|
|
||||||
colorStops: [
|
|
||||||
{
|
|
||||||
offset: 0,
|
|
||||||
color: '#43dfa2'
|
|
||||||
},
|
|
||||||
{
|
|
||||||
offset: 1,
|
|
||||||
color: '#28f8de'
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
linearBtoG: {
|
|
||||||
type: 'linear',
|
|
||||||
x: 0,
|
|
||||||
y: 0,
|
|
||||||
x2: 1,
|
|
||||||
y2: 0,
|
|
||||||
colorStops: [
|
|
||||||
{
|
|
||||||
offset: 0,
|
|
||||||
color: '#1c98e8'
|
|
||||||
},
|
|
||||||
{
|
|
||||||
offset: 1,
|
|
||||||
color: '#28f8de'
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
areaBtoG: {
|
|
||||||
type: 'linear',
|
|
||||||
x: 0,
|
|
||||||
y: 0,
|
|
||||||
x2: 0,
|
|
||||||
y2: 1,
|
|
||||||
colorStops: [
|
|
||||||
{
|
|
||||||
offset: 0,
|
|
||||||
color: 'rgba(35,184,210,.2)'
|
|
||||||
},
|
|
||||||
{
|
|
||||||
offset: 1,
|
|
||||||
color: 'rgba(35,184,210,0)'
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
components: {
|
|
||||||
Echart
|
|
||||||
},
|
|
||||||
props: {
|
|
||||||
cdata: {
|
|
||||||
type: Object,
|
|
||||||
default: () => ({})
|
|
||||||
}
|
|
||||||
},
|
|
||||||
watch: {
|
|
||||||
cdata: {
|
|
||||||
handler(newData) {
|
|
||||||
this.options = {
|
|
||||||
title: {
|
|
||||||
text: '',
|
|
||||||
textStyle: {
|
|
||||||
color: '#D3D6DD',
|
|
||||||
fontSize: 24,
|
|
||||||
fontWeight: 'normal'
|
|
||||||
},
|
|
||||||
subtext: newData.year + '/' + newData.weekCategory[6],
|
|
||||||
subtextStyle: {
|
|
||||||
color: '#fff',
|
|
||||||
fontSize: 16
|
|
||||||
},
|
|
||||||
top: 50,
|
|
||||||
left: 80
|
|
||||||
},
|
|
||||||
legend: {
|
|
||||||
top: 120,
|
|
||||||
left: 80,
|
|
||||||
orient: 'vertical',
|
|
||||||
itemGap: 15,
|
|
||||||
itemWidth: 12,
|
|
||||||
itemHeight: 12,
|
|
||||||
data: ['平均指标', '我的指标'],
|
|
||||||
textStyle: {
|
|
||||||
color: '#fff',
|
|
||||||
fontSize: 14
|
|
||||||
}
|
|
||||||
},
|
|
||||||
tooltip: {
|
|
||||||
trigger: 'item'
|
|
||||||
},
|
|
||||||
radar: {
|
|
||||||
center: ['68%', '27%'],
|
|
||||||
radius: '40%',
|
|
||||||
name: {
|
|
||||||
color: '#fff'
|
|
||||||
},
|
|
||||||
splitNumber: 8,
|
|
||||||
axisLine: {
|
|
||||||
lineStyle: {
|
|
||||||
color: this.colorList.linearYtoG,
|
|
||||||
opacity: 0.6
|
|
||||||
}
|
|
||||||
},
|
|
||||||
splitLine: {
|
|
||||||
lineStyle: {
|
|
||||||
color: this.colorList.linearYtoG,
|
|
||||||
opacity: 0.6
|
|
||||||
}
|
|
||||||
},
|
|
||||||
splitArea: {
|
|
||||||
areaStyle: {
|
|
||||||
color: '#fff',
|
|
||||||
opacity: 0.1,
|
|
||||||
shadowBlur: 25,
|
|
||||||
shadowColor: '#000',
|
|
||||||
shadowOffsetX: 0,
|
|
||||||
shadowOffsetY: 5
|
|
||||||
}
|
|
||||||
},
|
|
||||||
indicator: [
|
|
||||||
{
|
|
||||||
name: '服务态度',
|
|
||||||
max: newData.maxData
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: '产品质量',
|
|
||||||
max: 10
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: '任务效率',
|
|
||||||
max: 12
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: '售后保障',
|
|
||||||
max: 3.5
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
grid: {
|
|
||||||
left: 90,
|
|
||||||
right: 80,
|
|
||||||
bottom: 40,
|
|
||||||
top: '60%'
|
|
||||||
},
|
|
||||||
xAxis: {
|
|
||||||
type: 'category',
|
|
||||||
position: 'bottom',
|
|
||||||
axisLine: true,
|
|
||||||
axisLabel: {
|
|
||||||
color: 'rgba(255,255,255,.8)',
|
|
||||||
fontSize: 12
|
|
||||||
},
|
|
||||||
data: newData.weekCategory
|
|
||||||
},
|
|
||||||
// 下方Y轴
|
|
||||||
yAxis: {
|
|
||||||
name: '工单',
|
|
||||||
nameLocation: 'end',
|
|
||||||
nameGap: 24,
|
|
||||||
nameTextStyle: {
|
|
||||||
color: 'rgba(255,255,255,.5)',
|
|
||||||
fontSize: 14
|
|
||||||
},
|
|
||||||
max: newData.maxData,
|
|
||||||
splitNumber: 4,
|
|
||||||
|
|
||||||
axisLine: {
|
|
||||||
lineStyle: {
|
|
||||||
opacity: 0
|
|
||||||
}
|
|
||||||
},
|
|
||||||
splitLine: {
|
|
||||||
show: true,
|
|
||||||
lineStyle: {
|
|
||||||
color: '#fff',
|
|
||||||
opacity: 0.1
|
|
||||||
}
|
|
||||||
},
|
|
||||||
axisLabel: {
|
|
||||||
color: 'rgba(255,255,255,.8)',
|
|
||||||
fontSize: 12
|
|
||||||
}
|
|
||||||
},
|
|
||||||
series: [
|
|
||||||
{
|
|
||||||
name: '',
|
|
||||||
type: 'radar',
|
|
||||||
symbolSize: 0,
|
|
||||||
data: [
|
|
||||||
{
|
|
||||||
value: newData.radarDataAvg[6],
|
|
||||||
name: '平均指标',
|
|
||||||
itemStyle: {
|
|
||||||
normal: {
|
|
||||||
color: '#f8d351'
|
|
||||||
}
|
|
||||||
},
|
|
||||||
lineStyle: {
|
|
||||||
normal: {
|
|
||||||
opacity: 0
|
|
||||||
}
|
|
||||||
},
|
|
||||||
areaStyle: {
|
|
||||||
normal: {
|
|
||||||
color: '#f8d351',
|
|
||||||
shadowBlur: 25,
|
|
||||||
shadowColor: 'rgba(248,211,81,.3)',
|
|
||||||
shadowOffsetX: 0,
|
|
||||||
shadowOffsetY: -10,
|
|
||||||
opacity: 1
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
value: newData.radarData[6],
|
|
||||||
name: '我的指标',
|
|
||||||
itemStyle: {
|
|
||||||
normal: {
|
|
||||||
color: '#43dfa2'
|
|
||||||
}
|
|
||||||
},
|
|
||||||
lineStyle: {
|
|
||||||
normal: {
|
|
||||||
opacity: 0
|
|
||||||
}
|
|
||||||
},
|
|
||||||
areaStyle: {
|
|
||||||
normal: {
|
|
||||||
color: this.colorList.linearGtoB,
|
|
||||||
shadowBlur: 15,
|
|
||||||
shadowColor: 'rgba(0,0,0,.2)',
|
|
||||||
shadowOffsetX: 0,
|
|
||||||
shadowOffsetY: 5,
|
|
||||||
opacity: 0.8
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: '',
|
|
||||||
type: 'line',
|
|
||||||
smooth: true,
|
|
||||||
symbol: 'emptyCircle',
|
|
||||||
symbolSize: 8,
|
|
||||||
itemStyle: {
|
|
||||||
normal: {
|
|
||||||
color: '#fff'
|
|
||||||
}
|
|
||||||
},
|
|
||||||
lineStyle: {
|
|
||||||
normal: {
|
|
||||||
color: this.colorList.linearBtoG,
|
|
||||||
width: 3
|
|
||||||
}
|
|
||||||
},
|
|
||||||
areaStyle: {
|
|
||||||
normal: {
|
|
||||||
color: this.colorList.areaBtoG
|
|
||||||
}
|
|
||||||
},
|
|
||||||
data: newData.weekLineData,
|
|
||||||
lineSmooth: true,
|
|
||||||
markLine: {
|
|
||||||
silent: true,
|
|
||||||
data: [
|
|
||||||
{
|
|
||||||
type: 'average',
|
|
||||||
name: '平均值'
|
|
||||||
}
|
|
||||||
],
|
|
||||||
precision: 0,
|
|
||||||
label: {
|
|
||||||
normal: {
|
|
||||||
formatter: '平均值: \n {c}'
|
|
||||||
}
|
|
||||||
},
|
|
||||||
lineStyle: {
|
|
||||||
normal: {
|
|
||||||
color: 'rgba(248,211,81,.7)'
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
tooltip: {
|
|
||||||
position: 'top',
|
|
||||||
formatter: '{c} m',
|
|
||||||
backgroundColor: 'rgba(28,152,232,.2)',
|
|
||||||
padding: 6
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: '占位背景',
|
|
||||||
type: 'bar',
|
|
||||||
itemStyle: {
|
|
||||||
normal: {
|
|
||||||
show: true,
|
|
||||||
color: '#000',
|
|
||||||
opacity: 0
|
|
||||||
}
|
|
||||||
},
|
|
||||||
silent: true,
|
|
||||||
barWidth: '50%',
|
|
||||||
data: newData.weekMaxData,
|
|
||||||
animation: false
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
},
|
|
||||||
immediate: true,
|
|
||||||
deep: true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
</script>
|
|
||||||
|
|
@ -1,89 +0,0 @@
|
||||||
<template>
|
|
||||||
<div>
|
|
||||||
<Chart :cdata="cdata" />
|
|
||||||
</div>
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<script>
|
|
||||||
import Chart from './chart.vue'
|
|
||||||
export default {
|
|
||||||
data () {
|
|
||||||
return {
|
|
||||||
drawTiming: null,
|
|
||||||
cdata: {
|
|
||||||
year: null,
|
|
||||||
weekCategory: [],
|
|
||||||
radarData: [],
|
|
||||||
radarDataAvg: [],
|
|
||||||
maxData: 12000,
|
|
||||||
weekMaxData: [],
|
|
||||||
weekLineData: []
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
components: {
|
|
||||||
Chart,
|
|
||||||
},
|
|
||||||
mounted () {
|
|
||||||
this.drawTimingFn();
|
|
||||||
},
|
|
||||||
beforeDestroy () {
|
|
||||||
clearInterval(this.drawTiming);
|
|
||||||
},
|
|
||||||
methods: {
|
|
||||||
drawTimingFn () {
|
|
||||||
this.setData();
|
|
||||||
this.drawTiming = setInterval(() => {
|
|
||||||
this.setData();
|
|
||||||
}, 6000);
|
|
||||||
},
|
|
||||||
setData () {
|
|
||||||
// 清空轮询数据
|
|
||||||
this.cdata.weekCategory = [];
|
|
||||||
this.cdata.weekMaxData = [];
|
|
||||||
this.cdata.weekLineData = [];
|
|
||||||
this.cdata.radarData = [];
|
|
||||||
this.cdata.radarDataAvg = [];
|
|
||||||
|
|
||||||
let dateBase = new Date();
|
|
||||||
this.cdata.year = dateBase.getFullYear();
|
|
||||||
// 周数据
|
|
||||||
for (let i = 0; i < 7; i++) {
|
|
||||||
// 日期
|
|
||||||
let date = new Date();
|
|
||||||
this.cdata.weekCategory.unshift([date.getMonth() + 1, date.getDate()-i].join("/"));
|
|
||||||
|
|
||||||
// 折线图数据
|
|
||||||
this.cdata.weekMaxData.push(this.cdata.maxData);
|
|
||||||
let distance = Math.round(Math.random() * 11000 + 500);
|
|
||||||
this.cdata.weekLineData.push(distance);
|
|
||||||
|
|
||||||
// 雷达图数据
|
|
||||||
// 我的指标
|
|
||||||
let averageSpeed = +(Math.random() * 5 + 3).toFixed(3);
|
|
||||||
let maxSpeed = averageSpeed + +(Math.random() * 3).toFixed(2);
|
|
||||||
let hour = +(distance / 1000 / averageSpeed).toFixed(1);
|
|
||||||
let radarDayData = [distance, averageSpeed, maxSpeed, hour];
|
|
||||||
this.cdata.radarData.unshift(radarDayData);
|
|
||||||
|
|
||||||
// 平均指标
|
|
||||||
let distanceAvg = Math.round(Math.random() * 8000 + 4000);
|
|
||||||
let averageSpeedAvg = +(Math.random() * 4 + 4).toFixed(3);
|
|
||||||
let maxSpeedAvg = averageSpeedAvg + +(Math.random() * 2).toFixed(2);
|
|
||||||
let hourAvg = +(distance / 1000 / averageSpeed).toFixed(1);
|
|
||||||
let radarDayDataAvg = [
|
|
||||||
distanceAvg,
|
|
||||||
averageSpeedAvg,
|
|
||||||
maxSpeedAvg,
|
|
||||||
hourAvg
|
|
||||||
];
|
|
||||||
this.cdata.radarDataAvg.unshift(radarDayDataAvg);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<style lang="scss" scoped>
|
|
||||||
</style>
|
|
||||||
|
|
@ -1,104 +0,0 @@
|
||||||
<template>
|
|
||||||
<div>
|
|
||||||
<!-- 通过率/达标率 -->
|
|
||||||
<Echart
|
|
||||||
:options="options"
|
|
||||||
:id="id"
|
|
||||||
height="100px"
|
|
||||||
width="100px"
|
|
||||||
></Echart>
|
|
||||||
</div>
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<script>
|
|
||||||
import Echart from '@/common/echart'
|
|
||||||
export default {
|
|
||||||
data () {
|
|
||||||
return {
|
|
||||||
options: {},
|
|
||||||
};
|
|
||||||
},
|
|
||||||
components: {
|
|
||||||
Echart,
|
|
||||||
},
|
|
||||||
props: {
|
|
||||||
id: {
|
|
||||||
type: String,
|
|
||||||
required: true,
|
|
||||||
default: "chartRate"
|
|
||||||
},
|
|
||||||
tips: {
|
|
||||||
type: Number,
|
|
||||||
required: true,
|
|
||||||
default: 50
|
|
||||||
},
|
|
||||||
colorObj: {
|
|
||||||
type: Object,
|
|
||||||
default: function () {
|
|
||||||
return {
|
|
||||||
textStyle: "#3fc0fb",
|
|
||||||
series: {
|
|
||||||
color: ["#00bcd44a", "transparent"],
|
|
||||||
dataColor: {
|
|
||||||
normal: "#03a9f4",
|
|
||||||
shadowColor: "#97e2f5"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
watch: {
|
|
||||||
// tips 是会变更的数据,所以进行监听
|
|
||||||
tips: {
|
|
||||||
handler (newData) {
|
|
||||||
this.options = {
|
|
||||||
title:{
|
|
||||||
text: newData * 1 + "%",
|
|
||||||
x: "center",
|
|
||||||
y: "center",
|
|
||||||
textStyle: {
|
|
||||||
color: this.colorObj.textStyle,
|
|
||||||
fontSize: 16
|
|
||||||
}
|
|
||||||
},
|
|
||||||
series: [
|
|
||||||
{
|
|
||||||
type: "pie",
|
|
||||||
radius: ["75%", "80%"],
|
|
||||||
center: ["50%", "50%"],
|
|
||||||
hoverAnimation: false,
|
|
||||||
color: this.colorObj.series.color,
|
|
||||||
label: {
|
|
||||||
normal: {
|
|
||||||
show: false
|
|
||||||
}
|
|
||||||
},
|
|
||||||
data: [
|
|
||||||
{
|
|
||||||
value: newData,
|
|
||||||
itemStyle: {
|
|
||||||
normal: {
|
|
||||||
color: this.colorObj.series.dataColor.normal,
|
|
||||||
shadowBlur: 10,
|
|
||||||
shadowColor: this.colorObj.series.dataColor.shadowColor
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
value: 100 - newData
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
},
|
|
||||||
immediate: true,
|
|
||||||
deep: true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<style lang="scss" scoped>
|
|
||||||
</style>
|
|
||||||
|
|
@ -1,81 +0,0 @@
|
||||||
<template>
|
|
||||||
<div>
|
|
||||||
<Echart
|
|
||||||
:options="options"
|
|
||||||
id="centreLeft1Chart"
|
|
||||||
height="220px"
|
|
||||||
width="260px"
|
|
||||||
></Echart>
|
|
||||||
</div>
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<script>
|
|
||||||
import Echart from '@/common/echart'
|
|
||||||
export default {
|
|
||||||
data () {
|
|
||||||
return {
|
|
||||||
options: {},
|
|
||||||
};
|
|
||||||
},
|
|
||||||
components: {
|
|
||||||
Echart,
|
|
||||||
},
|
|
||||||
props: {
|
|
||||||
cdata: {
|
|
||||||
type: Object,
|
|
||||||
default: () => ({})
|
|
||||||
},
|
|
||||||
},
|
|
||||||
watch: {
|
|
||||||
cdata: {
|
|
||||||
handler (newData) {
|
|
||||||
this.options = {
|
|
||||||
color: [
|
|
||||||
"#37a2da",
|
|
||||||
"#32c5e9",
|
|
||||||
"#9fe6b8",
|
|
||||||
"#ffdb5c",
|
|
||||||
"#ff9f7f",
|
|
||||||
"#fb7293",
|
|
||||||
"#e7bcf3",
|
|
||||||
"#8378ea"
|
|
||||||
],
|
|
||||||
tooltip: {
|
|
||||||
trigger: "item",
|
|
||||||
formatter: "{a} <br/>{b} : {c} ({d}%)"
|
|
||||||
},
|
|
||||||
toolbox: {
|
|
||||||
show: true
|
|
||||||
},
|
|
||||||
calculable: true,
|
|
||||||
legend: {
|
|
||||||
orient: "horizontal",
|
|
||||||
icon: "circle",
|
|
||||||
bottom: 0,
|
|
||||||
x: "center",
|
|
||||||
data: newData.xData,
|
|
||||||
textStyle: {
|
|
||||||
color: "#fff"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
series: [
|
|
||||||
{
|
|
||||||
name: "通过率统计",
|
|
||||||
type: "pie",
|
|
||||||
radius: [10, 50],
|
|
||||||
roseType: "area",
|
|
||||||
center: ["50%", "40%"],
|
|
||||||
data: newData.seriesData
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
},
|
|
||||||
immediate: true,
|
|
||||||
deep: true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<style lang="scss" scoped>
|
|
||||||
</style>
|
|
||||||
|
|
@ -1,36 +0,0 @@
|
||||||
<template>
|
|
||||||
<div>
|
|
||||||
<Chart :cdata="cdata" />
|
|
||||||
</div>
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<script>
|
|
||||||
import Chart from './chart.vue';
|
|
||||||
export default {
|
|
||||||
data () {
|
|
||||||
return {
|
|
||||||
cdata: {
|
|
||||||
xData: ["data1", "data2", "data3", "data4", "data5", "data6"],
|
|
||||||
seriesData: [
|
|
||||||
{ value: 10, name: "data1" },
|
|
||||||
{ value: 5, name: "data2" },
|
|
||||||
{ value: 15, name: "data3" },
|
|
||||||
{ value: 25, name: "data4" },
|
|
||||||
{ value: 20, name: "data5" },
|
|
||||||
{ value: 35, name: "data6" }
|
|
||||||
]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
components: {
|
|
||||||
Chart,
|
|
||||||
},
|
|
||||||
mounted () {
|
|
||||||
},
|
|
||||||
methods: {
|
|
||||||
}
|
|
||||||
}
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<style lang="scss" scoped>
|
|
||||||
</style>
|
|
||||||
|
|
@ -1,290 +0,0 @@
|
||||||
<template>
|
|
||||||
<div>
|
|
||||||
<Echart
|
|
||||||
id="centreLeft2Chart"
|
|
||||||
ref="centreLeft2ChartRef"
|
|
||||||
:options="options"
|
|
||||||
height="360px"
|
|
||||||
width="330px"
|
|
||||||
></Echart>
|
|
||||||
</div>
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<script>
|
|
||||||
import Echart from '@/common/echart';
|
|
||||||
export default {
|
|
||||||
data() {
|
|
||||||
return {
|
|
||||||
options: {},
|
|
||||||
};
|
|
||||||
},
|
|
||||||
components: {
|
|
||||||
Echart,
|
|
||||||
},
|
|
||||||
props: {
|
|
||||||
cdata: {
|
|
||||||
type: Array,
|
|
||||||
default: () => [],
|
|
||||||
},
|
|
||||||
},
|
|
||||||
watch: {
|
|
||||||
cdata: {
|
|
||||||
handler(newData) {
|
|
||||||
// 设置点的位置(经纬度)
|
|
||||||
const geoCoordMap = {
|
|
||||||
厦门市: [118.11022, 24.490474, 20],
|
|
||||||
福州市: [119.206239, 26.275302, 20],
|
|
||||||
泉州市: [118.589421, 24.908853, 20],
|
|
||||||
漳州市: [117.561801, 24.510897, 20],
|
|
||||||
龙岩市: [116.82978, 25.391603, 20],
|
|
||||||
莆田市: [119.007558, 25.591011, 20],
|
|
||||||
三明市: [117.435001, 26.465444, 20],
|
|
||||||
南平市: [118.178459, 27.535627, 20],
|
|
||||||
宁德市: [119.527082, 27.15924, 20],
|
|
||||||
};
|
|
||||||
let seriesData = [
|
|
||||||
{
|
|
||||||
name: '厦门市',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: '福州市',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: '泉州市',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: '漳州市',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: '龙岩市',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: '莆田市',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: '三明市',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: '南平市',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: '宁德市',
|
|
||||||
},
|
|
||||||
];
|
|
||||||
let convertData = function (data) {
|
|
||||||
let scatterData = [];
|
|
||||||
for (var i = 0; i < data.length; i++) {
|
|
||||||
var geoCoord = geoCoordMap[data[i].name];
|
|
||||||
if (geoCoord) {
|
|
||||||
scatterData.push({
|
|
||||||
name: data[i].name,
|
|
||||||
value: geoCoord.concat(data[i].value),
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return scatterData;
|
|
||||||
};
|
|
||||||
this.options = {
|
|
||||||
showLegendSymbol: true,
|
|
||||||
tooltip: {
|
|
||||||
trigger: 'item',
|
|
||||||
textStyle: {
|
|
||||||
fontSize: 14,
|
|
||||||
lineHeight: 22,
|
|
||||||
},
|
|
||||||
position: point => {
|
|
||||||
// 固定在顶部
|
|
||||||
return [point[0] + 50, point[1] - 20];
|
|
||||||
},
|
|
||||||
// 如果需要自定义 tooltip样式,需要使用formatter
|
|
||||||
/*
|
|
||||||
formatter: params => {
|
|
||||||
return `<div style=""> ... </div>`
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
},
|
|
||||||
visualMap: {
|
|
||||||
min: 0,
|
|
||||||
max: 10,
|
|
||||||
show: false,
|
|
||||||
seriesIndex: 0,
|
|
||||||
// 颜色
|
|
||||||
inRange: {
|
|
||||||
color: ['rgba(41,166,206, .5)', 'rgba(69,117,245, .9)'],
|
|
||||||
},
|
|
||||||
},
|
|
||||||
// 底部背景
|
|
||||||
geo: {
|
|
||||||
show: true,
|
|
||||||
aspectScale: 0.85, //长宽比
|
|
||||||
zoom: 1.2,
|
|
||||||
top: '10%',
|
|
||||||
left: '16%',
|
|
||||||
map: '福建',
|
|
||||||
roam: false,
|
|
||||||
itemStyle: {
|
|
||||||
normal: {
|
|
||||||
areaColor: 'rgba(0,0,0,0)',
|
|
||||||
shadowColor: 'rgba(7,114,204, .8)',
|
|
||||||
shadowOffsetX: 5,
|
|
||||||
shadowOffsetY: 5,
|
|
||||||
},
|
|
||||||
emphasis: {
|
|
||||||
areaColor: '#00aeef',
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
series: [
|
|
||||||
{
|
|
||||||
name: '相关指数',
|
|
||||||
type: 'map',
|
|
||||||
aspectScale: 0.85, //长宽比
|
|
||||||
zoom: 1.2,
|
|
||||||
mapType: '福建', // 自定义扩展图表类型
|
|
||||||
top: '10%',
|
|
||||||
left: '16%',
|
|
||||||
itemStyle: {
|
|
||||||
normal: {
|
|
||||||
color: 'red',
|
|
||||||
areaColor: 'rgba(19,54,162, .5)',
|
|
||||||
borderColor: 'rgba(0,242,252,.3)',
|
|
||||||
borderWidth: 1,
|
|
||||||
shadowBlur: 7,
|
|
||||||
shadowColor: '#00f2fc',
|
|
||||||
},
|
|
||||||
emphasis: {
|
|
||||||
areaColor: '#4f7fff',
|
|
||||||
borderColor: 'rgba(0,242,252,.6)',
|
|
||||||
borderWidth: 2,
|
|
||||||
shadowBlur: 10,
|
|
||||||
shadowColor: '#00f2fc',
|
|
||||||
},
|
|
||||||
},
|
|
||||||
label: {
|
|
||||||
formatter: params => `${params.name}`,
|
|
||||||
show: true,
|
|
||||||
position: 'insideRight',
|
|
||||||
textStyle: {
|
|
||||||
fontSize: 14,
|
|
||||||
color: '#efefef',
|
|
||||||
},
|
|
||||||
emphasis: {
|
|
||||||
textStyle: {
|
|
||||||
color: '#fff',
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
data: newData,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
type: 'effectScatter',
|
|
||||||
coordinateSystem: 'geo',
|
|
||||||
symbolSize: 7,
|
|
||||||
effectType: 'ripple',
|
|
||||||
legendHoverLink: false,
|
|
||||||
showEffectOn: 'render',
|
|
||||||
rippleEffect: {
|
|
||||||
period: 4,
|
|
||||||
scale: 2.5,
|
|
||||||
brushType: 'stroke',
|
|
||||||
},
|
|
||||||
zlevel: 1,
|
|
||||||
itemStyle: {
|
|
||||||
normal: {
|
|
||||||
color: '#99FBFE',
|
|
||||||
shadowBlur: 5,
|
|
||||||
shadowColor: '#fff',
|
|
||||||
},
|
|
||||||
},
|
|
||||||
data: convertData(seriesData),
|
|
||||||
},
|
|
||||||
],
|
|
||||||
};
|
|
||||||
// 重新选择区域
|
|
||||||
this.handleMapRandomSelect();
|
|
||||||
},
|
|
||||||
immediate: true,
|
|
||||||
deep: true,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
methods: {
|
|
||||||
// 开启定时器
|
|
||||||
startInterval() {
|
|
||||||
const _self = this;
|
|
||||||
// 应通过接口获取配置时间,暂时写死5s
|
|
||||||
const time = 2000;
|
|
||||||
if (this.intervalId !== null) {
|
|
||||||
clearInterval(this.intervalId);
|
|
||||||
}
|
|
||||||
this.intervalId = setInterval(() => {
|
|
||||||
_self.reSelectMapRandomArea();
|
|
||||||
}, time);
|
|
||||||
},
|
|
||||||
// 重新随机选中地图区域
|
|
||||||
reSelectMapRandomArea() {
|
|
||||||
const length = 9;
|
|
||||||
this.$nextTick(() => {
|
|
||||||
try {
|
|
||||||
const map = this.$refs.centreLeft2ChartRef.chart;
|
|
||||||
let index = Math.floor(Math.random() * length);
|
|
||||||
while (index === this.preSelectMapIndex || index >= length) {
|
|
||||||
index = Math.floor(Math.random() * length);
|
|
||||||
}
|
|
||||||
map.dispatchAction({
|
|
||||||
type: 'mapUnSelect',
|
|
||||||
seriesIndex: 0,
|
|
||||||
dataIndex: this.preSelectMapIndex,
|
|
||||||
});
|
|
||||||
map.dispatchAction({
|
|
||||||
type: 'showTip',
|
|
||||||
seriesIndex: 0,
|
|
||||||
dataIndex: index,
|
|
||||||
});
|
|
||||||
map.dispatchAction({
|
|
||||||
type: 'mapSelect',
|
|
||||||
seriesIndex: 0,
|
|
||||||
dataIndex: index,
|
|
||||||
});
|
|
||||||
this.preSelectMapIndex = index;
|
|
||||||
} catch (error) {
|
|
||||||
console.log(error)
|
|
||||||
}
|
|
||||||
});
|
|
||||||
},
|
|
||||||
handleMapRandomSelect() {
|
|
||||||
this.$nextTick(() => {
|
|
||||||
try {
|
|
||||||
const map = this.$refs.centreLeft2ChartRef.chart;
|
|
||||||
const _self = this;
|
|
||||||
setTimeout(() => {
|
|
||||||
_self.reSelectMapRandomArea();
|
|
||||||
}, 0);
|
|
||||||
// 移入区域,清除定时器、取消之前选中并选中当前
|
|
||||||
map.on('mouseover', function (params) {
|
|
||||||
clearInterval(_self.intervalId);
|
|
||||||
map.dispatchAction({
|
|
||||||
type: 'mapUnSelect',
|
|
||||||
seriesIndex: 0,
|
|
||||||
dataIndex: _self.preSelectMapIndex,
|
|
||||||
});
|
|
||||||
map.dispatchAction({
|
|
||||||
type: 'mapSelect',
|
|
||||||
seriesIndex: 0,
|
|
||||||
dataIndex: params.dataIndex,
|
|
||||||
});
|
|
||||||
_self.preSelectMapIndex = params.dataIndex;
|
|
||||||
});
|
|
||||||
// 移出区域重新随机选中地图区域,并开启定时器
|
|
||||||
map.on('globalout', function () {
|
|
||||||
_self.reSelectMapRandomArea();
|
|
||||||
_self.startInterval();
|
|
||||||
});
|
|
||||||
this.startInterval();
|
|
||||||
} catch (error) {
|
|
||||||
console.log(error)
|
|
||||||
}
|
|
||||||
});
|
|
||||||
},
|
|
||||||
},
|
|
||||||
};
|
|
||||||
</script>
|
|
||||||
|
|
@ -1,67 +0,0 @@
|
||||||
<template>
|
|
||||||
<div>
|
|
||||||
<Chart :cdata="cdata" />
|
|
||||||
</div>
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<script>
|
|
||||||
import Chart from './chart.vue';
|
|
||||||
export default {
|
|
||||||
data () {
|
|
||||||
return {
|
|
||||||
cdata: [
|
|
||||||
{
|
|
||||||
// 名字需要与 “common/map/fujian.js” 地图数据文件里面定义的一一对应,不能是 “福州” 或者 “闽” 之类的缩写
|
|
||||||
name: '福州市',
|
|
||||||
value: 10,
|
|
||||||
elseData:{
|
|
||||||
// 这里放置地图 tooltip 里想显示的数据
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: '厦门市',
|
|
||||||
value: 9,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: '漳州市',
|
|
||||||
value: 8,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: '泉州市',
|
|
||||||
value: 7,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: '三明市',
|
|
||||||
value: 6,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: '莆田市',
|
|
||||||
value: 5,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: '南平市',
|
|
||||||
value: 4,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: '龙岩市',
|
|
||||||
value: 3,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: '宁德市',
|
|
||||||
value: 2,
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
},
|
|
||||||
components: {
|
|
||||||
Chart,
|
|
||||||
},
|
|
||||||
mounted () {
|
|
||||||
},
|
|
||||||
methods: {
|
|
||||||
}
|
|
||||||
}
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<style lang="scss" scoped>
|
|
||||||
</style>
|
|
||||||
|
|
@ -1,132 +0,0 @@
|
||||||
<template>
|
|
||||||
<div>
|
|
||||||
<Echart
|
|
||||||
:options="options"
|
|
||||||
id="centreRight2Chart1"
|
|
||||||
height="200px"
|
|
||||||
width="260px"
|
|
||||||
></Echart>
|
|
||||||
</div>
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<script>
|
|
||||||
import Echart from '@/common/echart'
|
|
||||||
export default {
|
|
||||||
data () {
|
|
||||||
return {
|
|
||||||
options: {},
|
|
||||||
};
|
|
||||||
},
|
|
||||||
components: {
|
|
||||||
Echart,
|
|
||||||
},
|
|
||||||
props: {
|
|
||||||
cdata: {
|
|
||||||
type: Object,
|
|
||||||
default: () => ({})
|
|
||||||
},
|
|
||||||
},
|
|
||||||
watch: {
|
|
||||||
cdata: {
|
|
||||||
handler (newData) {
|
|
||||||
// 固定样式数据
|
|
||||||
let lineStyle = {
|
|
||||||
normal: {
|
|
||||||
width: 1,
|
|
||||||
opacity: 0.5
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
this.options = {
|
|
||||||
radar: {
|
|
||||||
indicator: newData.indicatorData,
|
|
||||||
shape: "circle",
|
|
||||||
splitNumber: 5,
|
|
||||||
radius: ["0%", "65%"],
|
|
||||||
name: {
|
|
||||||
textStyle: {
|
|
||||||
color: "rgb(238, 197, 102)"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
splitLine: {
|
|
||||||
lineStyle: {
|
|
||||||
color: [
|
|
||||||
"rgba(238, 197, 102, 0.1)",
|
|
||||||
"rgba(238, 197, 102, 0.2)",
|
|
||||||
"rgba(238, 197, 102, 0.4)",
|
|
||||||
"rgba(238, 197, 102, 0.6)",
|
|
||||||
"rgba(238, 197, 102, 0.8)",
|
|
||||||
"rgba(238, 197, 102, 1)"
|
|
||||||
].reverse()
|
|
||||||
}
|
|
||||||
},
|
|
||||||
splitArea: {
|
|
||||||
show: false
|
|
||||||
},
|
|
||||||
axisLine: {
|
|
||||||
lineStyle: {
|
|
||||||
color: "rgba(238, 197, 102, 0.5)"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
series: [
|
|
||||||
{
|
|
||||||
name: "北京",
|
|
||||||
type: "radar",
|
|
||||||
lineStyle: lineStyle,
|
|
||||||
data: newData.dataBJ,
|
|
||||||
symbol: "none",
|
|
||||||
itemStyle: {
|
|
||||||
normal: {
|
|
||||||
color: "#F9713C"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
areaStyle: {
|
|
||||||
normal: {
|
|
||||||
opacity: 0.1
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: "上海",
|
|
||||||
type: "radar",
|
|
||||||
lineStyle: lineStyle,
|
|
||||||
data: newData.dataSH,
|
|
||||||
symbol: "none",
|
|
||||||
itemStyle: {
|
|
||||||
normal: {
|
|
||||||
color: "#B3E4A1"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
areaStyle: {
|
|
||||||
normal: {
|
|
||||||
opacity: 0.05
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: "广州",
|
|
||||||
type: "radar",
|
|
||||||
lineStyle: lineStyle,
|
|
||||||
data: newData.dataGZ,
|
|
||||||
symbol: "none",
|
|
||||||
itemStyle: {
|
|
||||||
normal: {
|
|
||||||
color: "rgb(238, 197, 102)"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
areaStyle: {
|
|
||||||
normal: {
|
|
||||||
opacity: 0.05
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} //end
|
|
||||||
]
|
|
||||||
}
|
|
||||||
},
|
|
||||||
immediate: true,
|
|
||||||
deep: true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
</script>
|
|
||||||
|
|
@ -1,55 +0,0 @@
|
||||||
<template>
|
|
||||||
<div>
|
|
||||||
<Chart :cdata="cdata" />
|
|
||||||
</div>
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<script>
|
|
||||||
import Chart from './chart.vue';
|
|
||||||
export default {
|
|
||||||
data () {
|
|
||||||
return {
|
|
||||||
cdata: {
|
|
||||||
indicatorData: [
|
|
||||||
{ name: "data1", max: 300 },
|
|
||||||
{ name: "data2", max: 250 },
|
|
||||||
{ name: "data3", max: 300 },
|
|
||||||
{ name: "data4", max: 5},
|
|
||||||
{ name: "data5", max: 200 },
|
|
||||||
{ name: "data6", max: 100 }
|
|
||||||
],
|
|
||||||
dataBJ: [
|
|
||||||
[94, 69, 114, 2.08, 73, 39, 22],
|
|
||||||
[99, 73, 110, 2.43, 76, 48, 23],
|
|
||||||
[31, 12, 30, 0.5, 32, 16, 24],
|
|
||||||
[42, 27, 43, 1, 53, 22, 25],
|
|
||||||
[154, 117, 157, 3.05, 92, 58, 26],
|
|
||||||
[234, 185, 230, 4.09, 123, 69, 27],
|
|
||||||
[160, 120, 186, 2.77, 91, 50, 28]
|
|
||||||
],
|
|
||||||
dataGZ: [
|
|
||||||
[84, 94, 140, 2.238, 68, 18, 22],
|
|
||||||
[93, 77, 104, 1.165, 53, 7, 23],
|
|
||||||
[99, 130, 227, 3.97, 55, 15, 24],
|
|
||||||
[146, 84, 139, 1.094, 40, 17, 25],
|
|
||||||
[113, 108, 137, 1.481, 48, 15, 26],
|
|
||||||
[81, 48, 62, 1.619, 26, 3, 27],
|
|
||||||
[56, 48, 68, 1.336, 37, 9, 28]
|
|
||||||
],
|
|
||||||
dataSH: [
|
|
||||||
[91, 45, 125, 0.82, 34, 23, 1],
|
|
||||||
[65, 27, 78, 0.86, 45, 29, 2],
|
|
||||||
[83, 60, 84, 1.09, 73, 27, 3],
|
|
||||||
[109, 81, 121, 1.28, 68, 51, 4],
|
|
||||||
[106, 77, 114, 1.07, 55, 51, 5],
|
|
||||||
[109, 81, 121, 1.28, 68, 51, 6],
|
|
||||||
[106, 77, 114, 1.07, 55, 51, 7]
|
|
||||||
]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
components: {
|
|
||||||
Chart,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
</script>
|
|
||||||
|
|
@ -0,0 +1,419 @@
|
||||||
|
// 科研概况数据
|
||||||
|
export const researchData = {
|
||||||
|
chartSettings: {
|
||||||
|
dimension: ["季度"],
|
||||||
|
metrics: ["论文", "专利", "获奖", "著作"],
|
||||||
|
legend: {
|
||||||
|
show: true,
|
||||||
|
textStyle: {
|
||||||
|
color: "#fff",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
grid: {
|
||||||
|
show: true,
|
||||||
|
borderColor: "rgba(255, 255, 255, 0.1)",
|
||||||
|
backgroundColor: "transparent",
|
||||||
|
},
|
||||||
|
backgroundColor: "rgba(0, 0, 0, 0.5)",
|
||||||
|
tooltip: {
|
||||||
|
trigger: "axis",
|
||||||
|
axisPointer: {
|
||||||
|
type: "shadow",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
chartData: {
|
||||||
|
columns: ["季度", "论文", "专利", "获奖", "著作"],
|
||||||
|
rows: [
|
||||||
|
{ 季度: "Q1", 论文: 20, 专利: 15, 获奖: 5, 著作: 3 },
|
||||||
|
{ 季度: "Q2", 论文: 25, 专利: 18, 获奖: 8, 著作: 4 },
|
||||||
|
{ 季度: "Q3", 论文: 30, 专利: 20, 获奖: 10, 著作: 5 },
|
||||||
|
{ 季度: "Q4", 论文: 35, 专利: 25, 获奖: 12, 著作: 6 },
|
||||||
|
],
|
||||||
|
},
|
||||||
|
statistics: [
|
||||||
|
{ label: "论文总数", value: 110 },
|
||||||
|
{ label: "专利数量", value: 78 },
|
||||||
|
{ label: "获奖数量", value: 35 },
|
||||||
|
{ label: "著作数量", value: 18 },
|
||||||
|
],
|
||||||
|
};
|
||||||
|
|
||||||
|
// 教务概况数据
|
||||||
|
export const educationData = {
|
||||||
|
chartSettings: {
|
||||||
|
area: true,
|
||||||
|
axisSite: { right: ["评教得分"] },
|
||||||
|
yAxisName: ["得分"],
|
||||||
|
},
|
||||||
|
evaluationData: {
|
||||||
|
columns: ["月份", "评教得分"],
|
||||||
|
rows: [
|
||||||
|
{ 月份: "1月", 评教得分: 85 },
|
||||||
|
{ 月份: "2月", 评教得分: 93 },
|
||||||
|
{ 月份: "3月", 评教得分: 90 },
|
||||||
|
{ 月份: "4月", 评教得分: 74 },
|
||||||
|
{ 月份: "5月", 评教得分: 95 },
|
||||||
|
{ 月份: "6月", 评教得分: 92 },
|
||||||
|
],
|
||||||
|
},
|
||||||
|
statistics: {
|
||||||
|
passRate: 95.6,
|
||||||
|
graduationRate: 98.2,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
// 图表样式配置
|
||||||
|
export const chartStyles = {
|
||||||
|
research: {
|
||||||
|
colors: [
|
||||||
|
"rgba(64, 158, 255, 0.95)", // 亮蓝色
|
||||||
|
"rgba(0, 206, 209, 0.95)", // 青色
|
||||||
|
"rgba(149, 97, 226, 0.95)", // 紫色
|
||||||
|
"rgba(100, 181, 246, 0.95)", // 天蓝色
|
||||||
|
],
|
||||||
|
extend: {
|
||||||
|
series: (v) => {
|
||||||
|
if (!v) return [];
|
||||||
|
const gradientColors = [
|
||||||
|
["rgba(64, 158, 255, 0.95)", "rgba(64, 158, 255, 0.2)"], // 亮蓝色
|
||||||
|
["rgba(0, 206, 209, 0.95)", "rgba(0, 206, 209, 0.2)"], // 青色
|
||||||
|
["rgba(149, 97, 226, 0.95)", "rgba(149, 97, 226, 0.2)"], // 紫色
|
||||||
|
["rgba(100, 181, 246, 0.95)", "rgba(100, 181, 246, 0.2)"], // 天蓝色
|
||||||
|
];
|
||||||
|
return v.map((series, index) => ({
|
||||||
|
...series,
|
||||||
|
itemStyle: {
|
||||||
|
color: {
|
||||||
|
type: "linear",
|
||||||
|
x: 0,
|
||||||
|
y: 0,
|
||||||
|
x2: 0,
|
||||||
|
y2: 1,
|
||||||
|
colorStops: [
|
||||||
|
{ offset: 0, color: gradientColors[index][0] },
|
||||||
|
{ offset: 1, color: gradientColors[index][1] },
|
||||||
|
],
|
||||||
|
},
|
||||||
|
borderRadius: [10, 10, 0, 0],
|
||||||
|
shadowColor: "rgba(0, 0, 0, 0.5)",
|
||||||
|
shadowBlur: 10,
|
||||||
|
shadowOffsetY: 5,
|
||||||
|
},
|
||||||
|
emphasis: {
|
||||||
|
itemStyle: {
|
||||||
|
color: gradientColors[index][0],
|
||||||
|
shadowBlur: 20,
|
||||||
|
shadowOffsetX: 0,
|
||||||
|
shadowColor: "rgba(0, 0, 0, 0.8)",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
animationDuration: 2000,
|
||||||
|
animationEasing: "elasticOut",
|
||||||
|
}));
|
||||||
|
},
|
||||||
|
yAxis: {
|
||||||
|
axisLabel: {
|
||||||
|
color: "#fff",
|
||||||
|
fontSize: 12,
|
||||||
|
},
|
||||||
|
splitLine: {
|
||||||
|
lineStyle: {
|
||||||
|
color: "rgba(255, 255, 255, 0.1)",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
xAxis: {
|
||||||
|
axisLabel: {
|
||||||
|
color: "#fff",
|
||||||
|
fontSize: 12,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
legend: {
|
||||||
|
textStyle: {
|
||||||
|
color: "#fff",
|
||||||
|
},
|
||||||
|
emphasis: {
|
||||||
|
textStyle: {
|
||||||
|
color: "#4a90e2",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
tooltip: {
|
||||||
|
trigger: "axis",
|
||||||
|
axisPointer: {
|
||||||
|
type: "shadow",
|
||||||
|
shadowStyle: {
|
||||||
|
color: "rgba(74, 144, 226, 0.1)",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
textStyle: {
|
||||||
|
color: "#fff",
|
||||||
|
fontSize: 12,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
education: {
|
||||||
|
extend: {
|
||||||
|
yAxis: {
|
||||||
|
min: 60,
|
||||||
|
max: 100,
|
||||||
|
axisLabel: {
|
||||||
|
color: "#fff",
|
||||||
|
fontSize: 12,
|
||||||
|
},
|
||||||
|
splitLine: {
|
||||||
|
show: false
|
||||||
|
},
|
||||||
|
},
|
||||||
|
xAxis: {
|
||||||
|
axisLabel: {
|
||||||
|
color: "#fff",
|
||||||
|
fontSize: 12,
|
||||||
|
},
|
||||||
|
splitLine: {
|
||||||
|
show: false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
legend: {
|
||||||
|
textStyle: {
|
||||||
|
color: "#fff",
|
||||||
|
}
|
||||||
|
},
|
||||||
|
series: {
|
||||||
|
smooth: true,
|
||||||
|
lineStyle: {
|
||||||
|
width: 2,
|
||||||
|
color: {
|
||||||
|
type: "linear",
|
||||||
|
x: 0,
|
||||||
|
y: 0,
|
||||||
|
x2: 1,
|
||||||
|
y2: 0,
|
||||||
|
colorStops: [
|
||||||
|
{
|
||||||
|
offset: 0,
|
||||||
|
color: "#4a90e2",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
offset: 1,
|
||||||
|
color: "#36d1dc",
|
||||||
|
},
|
||||||
|
],
|
||||||
|
global: false,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
areaStyle: {
|
||||||
|
color: {
|
||||||
|
type: "linear",
|
||||||
|
x: 0,
|
||||||
|
y: 0,
|
||||||
|
x2: 0,
|
||||||
|
y2: 1,
|
||||||
|
colorStops: [
|
||||||
|
{
|
||||||
|
offset: 0,
|
||||||
|
color: "rgba(74, 144, 226, 0.3)",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
offset: 1,
|
||||||
|
color: "rgba(54, 209, 220, 0.05)",
|
||||||
|
},
|
||||||
|
],
|
||||||
|
global: false,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
animationDuration: 200,
|
||||||
|
animationEasing: "cubicOut",
|
||||||
|
},
|
||||||
|
tooltip: {
|
||||||
|
trigger: "axis",
|
||||||
|
axisPointer: {
|
||||||
|
type: "line",
|
||||||
|
lineStyle: {
|
||||||
|
color: "#4a90e2",
|
||||||
|
type: "dashed",
|
||||||
|
shadowColor: "rgba(0, 0, 0, 0.3)",
|
||||||
|
shadowBlur: 5,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
textStyle: {
|
||||||
|
color: "#fff",
|
||||||
|
fontSize: 12,
|
||||||
|
},
|
||||||
|
formatter: function (params) {
|
||||||
|
const param = params[0];
|
||||||
|
return `${param.name}<br/>${param.seriesName}:<span style="color:${param.color}">${param.value}</span>`;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
// 资产概况数据
|
||||||
|
export const assetData = {
|
||||||
|
totalAssets: 580000,
|
||||||
|
assetTrendData: {
|
||||||
|
columns: ["月份", "资产总值"],
|
||||||
|
rows: [
|
||||||
|
{ 月份: "1月", 资产总值: 380000 },
|
||||||
|
{ 月份: "2月", 资产总值: 535000 },
|
||||||
|
{ 月份: "3月", 资产总值: 445000 },
|
||||||
|
{ 月份: "4月", 资产总值: 520000 },
|
||||||
|
{ 月份: "5月", 资产总值: 570000 },
|
||||||
|
{ 月份: "6月", 资产总值: 480000 },
|
||||||
|
],
|
||||||
|
},
|
||||||
|
assetCategories: [
|
||||||
|
{ name: "固定资产", value: 420000 },
|
||||||
|
{ name: "流动资产", value: 120000 },
|
||||||
|
{ name: "无形资产", value: 40000 },
|
||||||
|
],
|
||||||
|
};
|
||||||
|
|
||||||
|
// 一卡通概况数据
|
||||||
|
export const cardData = {
|
||||||
|
totalCards: 28500,
|
||||||
|
dailyUsage: 85600,
|
||||||
|
chartSettings: {
|
||||||
|
area: true,
|
||||||
|
axisSite: { right: ["使用次数"] },
|
||||||
|
yAxisName: ["次数"],
|
||||||
|
},
|
||||||
|
usageData: {
|
||||||
|
columns: ["时间", "使用次数"],
|
||||||
|
rows: [
|
||||||
|
{ 时间: "6:00", 使用次数: 2000 },
|
||||||
|
{ 时间: "9:00", 使用次数: 15000 },
|
||||||
|
{ 时间: "12:00", 使用次数: 25000 },
|
||||||
|
{ 时间: "15:00", 使用次数: 18000 },
|
||||||
|
{ 时间: "18:00", 使用次数: 20000 },
|
||||||
|
{ 时间: "21:00", 使用次数: 5600 },
|
||||||
|
],
|
||||||
|
},
|
||||||
|
usageScenes: [
|
||||||
|
{ name: "食堂消费", count: 35000 },
|
||||||
|
{ name: "门禁通行", count: 28000 },
|
||||||
|
{ name: "图书借阅", count: 12000 },
|
||||||
|
{ name: "水电缴费", count: 8000 },
|
||||||
|
],
|
||||||
|
};
|
||||||
|
|
||||||
|
// 文献概况数据
|
||||||
|
export const literatureData = {
|
||||||
|
totalLiterature: 1250000,
|
||||||
|
chartSettings: {
|
||||||
|
dimension: ["类型"],
|
||||||
|
metrics: ["纸质", "电子"],
|
||||||
|
legend: {
|
||||||
|
show: true,
|
||||||
|
textStyle: { color: "#fff" },
|
||||||
|
},
|
||||||
|
grid: {
|
||||||
|
show: true,
|
||||||
|
borderColor: "rgba(255, 255, 255, 0.1)",
|
||||||
|
backgroundColor: "transparent",
|
||||||
|
},
|
||||||
|
backgroundColor: "rgba(0, 0, 0, 0.5)",
|
||||||
|
tooltip: {
|
||||||
|
trigger: "axis",
|
||||||
|
axisPointer: { type: "shadow" },
|
||||||
|
},
|
||||||
|
},
|
||||||
|
chartData: {
|
||||||
|
columns: ["类型", "纸质", "电子"],
|
||||||
|
rows: [
|
||||||
|
{ 类型: "图书", 纸质: 450000, 电子: 350000 },
|
||||||
|
{ 类型: "期刊", 纸质: 120000, 电子: 180000 },
|
||||||
|
{ 类型: "论文", 纸质: 50000, 电子: 100000 },
|
||||||
|
],
|
||||||
|
},
|
||||||
|
subjectDistribution: [
|
||||||
|
{ name: "工学", count: 320000, percentage: 85, color: "#409EFF" },
|
||||||
|
{ name: "理学", count: 280000, percentage: 75, color: "#67C23A" },
|
||||||
|
{ name: "经管", count: 220000, percentage: 65, color: "#E6A23C" },
|
||||||
|
{ name: "文学", count: 180000, percentage: 55, color: "#F56C6C" },
|
||||||
|
{ name: "艺术", count: 150000, percentage: 45, color: "#909399" },
|
||||||
|
],
|
||||||
|
};
|
||||||
|
|
||||||
|
// 教职工概况数据
|
||||||
|
export const staffData = {
|
||||||
|
totalStaff: 1256,
|
||||||
|
chartSettings: {
|
||||||
|
radius: ["35%", "65%"],
|
||||||
|
offsetY: "60%",
|
||||||
|
color: [
|
||||||
|
"#4a90e2", // 亮蓝色
|
||||||
|
"#00CED1", // 青色
|
||||||
|
"#64B5F6", // 天蓝色
|
||||||
|
"#9561e2", // 紫色
|
||||||
|
],
|
||||||
|
label: {
|
||||||
|
show: true,
|
||||||
|
position: "outside",
|
||||||
|
formatter: "{b}:{c}({d}%)",
|
||||||
|
color: "#fff",
|
||||||
|
fontSize: 12,
|
||||||
|
},
|
||||||
|
legend: {
|
||||||
|
show: true,
|
||||||
|
textStyle: {
|
||||||
|
color: "#fff",
|
||||||
|
fontSize: 12
|
||||||
|
}
|
||||||
|
},
|
||||||
|
itemStyle: {
|
||||||
|
borderRadius: 4,
|
||||||
|
borderColor: "#fff",
|
||||||
|
borderWidth: 2
|
||||||
|
},
|
||||||
|
emphasis: {
|
||||||
|
label: {
|
||||||
|
show: true,
|
||||||
|
fontSize: 14,
|
||||||
|
fontWeight: 'bold'
|
||||||
|
},
|
||||||
|
itemStyle: {
|
||||||
|
shadowBlur: 10,
|
||||||
|
shadowOffsetX: 0,
|
||||||
|
shadowColor: 'rgba(0, 0, 0, 0.5)'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
titleData: {
|
||||||
|
columns: ["职称", "人数"],
|
||||||
|
rows: [
|
||||||
|
{ 职称: "正高", 人数: 180 },
|
||||||
|
{ 职称: "副高", 人数: 320 },
|
||||||
|
{ 职称: "中级", 人数: 450 },
|
||||||
|
{ 职称: "初级", 人数: 306 },
|
||||||
|
],
|
||||||
|
},
|
||||||
|
educationStructure: [
|
||||||
|
{ label: "博士", value: 35 },
|
||||||
|
{ label: "硕士", value: 45 },
|
||||||
|
{ label: "学士", value: 18 },
|
||||||
|
{ label: "其他", value: 2 },
|
||||||
|
],
|
||||||
|
};
|
||||||
|
|
||||||
|
export const studentData = {
|
||||||
|
totalStudents: 12000,
|
||||||
|
location: {
|
||||||
|
name: "唐山师范学院",
|
||||||
|
coordinates: [118.154, 39.630],
|
||||||
|
address: "河北省唐山市路北区建设路156号"
|
||||||
|
},
|
||||||
|
gradeData: [
|
||||||
|
{ name: "大一", value: 3200 },
|
||||||
|
{ name: "大二", value: 3100 },
|
||||||
|
{ name: "大三", value: 2900 },
|
||||||
|
{ name: "大四", value: 2800 }
|
||||||
|
],
|
||||||
|
genderData: [
|
||||||
|
{ name: "男", value: 5500 },
|
||||||
|
{ name: "女", value: 6500 }
|
||||||
|
]
|
||||||
|
};
|
||||||
21
src/main.js
21
src/main.js
|
|
@ -1,7 +1,10 @@
|
||||||
import Vue from 'vue';
|
import Vue from 'vue'
|
||||||
import App from './App.vue';
|
import App from './App.vue'
|
||||||
import router from './router';
|
import router from './router'
|
||||||
import store from './store';
|
import store from './store'
|
||||||
|
import ElementUI from 'element-ui'
|
||||||
|
import 'element-ui/lib/theme-chalk/index.css'
|
||||||
|
import VCharts from 'v-charts'
|
||||||
import dataV from '@jiaminghi/data-view';
|
import dataV from '@jiaminghi/data-view';
|
||||||
// 引入全局css
|
// 引入全局css
|
||||||
import './assets/scss/style.scss';
|
import './assets/scss/style.scss';
|
||||||
|
|
@ -16,8 +19,8 @@ import 'vue-awesome/icons/align-left.js';
|
||||||
//引入echart
|
//引入echart
|
||||||
//4.x 引用方式
|
//4.x 引用方式
|
||||||
import echarts from 'echarts'
|
import echarts from 'echarts'
|
||||||
//5.x 引用方式为按需引用
|
// //5.x 引用方式为按需引用
|
||||||
//希望使用5.x版本的话,需要在package.json中更新版本号,并切换引用方式
|
// //希望使用5.x版本的话,需要在package.json中更新版本号,并切换引用方式
|
||||||
//import * as echarts from 'echarts'
|
//import * as echarts from 'echarts'
|
||||||
Vue.prototype.$echarts = echarts
|
Vue.prototype.$echarts = echarts
|
||||||
Vue.config.productionTip = false;
|
Vue.config.productionTip = false;
|
||||||
|
|
@ -25,9 +28,11 @@ Vue.config.productionTip = false;
|
||||||
// 全局注册
|
// 全局注册
|
||||||
Vue.component('icon', Icon);
|
Vue.component('icon', Icon);
|
||||||
Vue.use(dataV);
|
Vue.use(dataV);
|
||||||
|
Vue.use(ElementUI);
|
||||||
|
Vue.use(VCharts);
|
||||||
|
|
||||||
new Vue({
|
new Vue({
|
||||||
router,
|
router,
|
||||||
store,
|
store,
|
||||||
render: (h) => h(App),
|
render: h => h(App)
|
||||||
}).$mount('#app');
|
}).$mount('#app')
|
||||||
|
|
|
||||||
|
|
@ -3,11 +3,55 @@ import VueRouter from 'vue-router'
|
||||||
|
|
||||||
Vue.use(VueRouter)
|
Vue.use(VueRouter)
|
||||||
|
|
||||||
const routes = [{
|
const routes = [
|
||||||
path: '/',
|
{
|
||||||
name: 'index',
|
path: '/',
|
||||||
component: () => import('../views/index.vue')
|
name: 'index',
|
||||||
}]
|
component: () => import('../views/index.vue')
|
||||||
|
},
|
||||||
|
// 教务详情
|
||||||
|
{
|
||||||
|
path: '/education-detail',
|
||||||
|
name: 'EducationDetail',
|
||||||
|
component: () => import('@/views/detail/EducationDetail.vue')
|
||||||
|
},
|
||||||
|
// 科研详情
|
||||||
|
{
|
||||||
|
path: '/research-detail',
|
||||||
|
name: 'ResearchDetail',
|
||||||
|
component: () => import('@/views/detail/ResearchDetail.vue')
|
||||||
|
},
|
||||||
|
// 学生详情
|
||||||
|
{
|
||||||
|
path: '/student-detail',
|
||||||
|
name: 'StudentDetail',
|
||||||
|
component: () => import('@/views/detail/StudentDetail.vue')
|
||||||
|
},
|
||||||
|
// 教职工详情
|
||||||
|
{
|
||||||
|
path: '/staff-detail',
|
||||||
|
name: 'StaffDetail',
|
||||||
|
component: () => import('@/views/detail/StaffDetail.vue')
|
||||||
|
},
|
||||||
|
// 资产详情
|
||||||
|
{
|
||||||
|
path: '/asset-detail',
|
||||||
|
name: 'AssetDetail',
|
||||||
|
component: () => import('@/views/detail/AssetDetail.vue')
|
||||||
|
},
|
||||||
|
// 文献详情
|
||||||
|
{
|
||||||
|
path: '/literature-detail',
|
||||||
|
name: 'LiteratureDetail',
|
||||||
|
component: () => import('@/views/detail/LiteratureDetail.vue')
|
||||||
|
},
|
||||||
|
// 一卡通详情页面
|
||||||
|
{
|
||||||
|
path: '/card-detail',
|
||||||
|
name: 'CardDetail',
|
||||||
|
component: () => import('@/views/detail/CardDetail.vue')
|
||||||
|
},
|
||||||
|
]
|
||||||
const router = new VueRouter({
|
const router = new VueRouter({
|
||||||
routes
|
routes
|
||||||
})
|
})
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,56 @@
|
||||||
|
export default {
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
// 通用图表配置
|
||||||
|
baseChartExtend: {
|
||||||
|
yAxis: {
|
||||||
|
axisLabel: {
|
||||||
|
color: '#fff',
|
||||||
|
fontSize: 12
|
||||||
|
},
|
||||||
|
splitLine: {
|
||||||
|
lineStyle: {
|
||||||
|
color: 'rgba(255, 255, 255, 0.1)'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
xAxis: {
|
||||||
|
axisLabel: {
|
||||||
|
color: '#fff',
|
||||||
|
fontSize: 12
|
||||||
|
}
|
||||||
|
},
|
||||||
|
legend: {
|
||||||
|
textStyle: {
|
||||||
|
color: '#fff'
|
||||||
|
}
|
||||||
|
},
|
||||||
|
tooltip: {
|
||||||
|
trigger: 'axis',
|
||||||
|
axisPointer: {
|
||||||
|
type: 'line',
|
||||||
|
lineStyle: {
|
||||||
|
color: '#e1e2e2',
|
||||||
|
type: 'dashed',
|
||||||
|
shadowColor: 'rgba(0, 0, 0, 0.3)',
|
||||||
|
shadowBlur: 5
|
||||||
|
}
|
||||||
|
},
|
||||||
|
textStyle: {
|
||||||
|
color: '#fff',
|
||||||
|
fontSize: 12
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
methods: {
|
||||||
|
// 合并图表配置
|
||||||
|
mergeChartExtend(customExtend) {
|
||||||
|
return {
|
||||||
|
...this.baseChartExtend,
|
||||||
|
...customExtend
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,18 @@
|
||||||
|
/**
|
||||||
|
* 格式化数字,添加千位分隔符
|
||||||
|
* @param {number} num - 要格式化的数字
|
||||||
|
* @returns {string} - 格式化后的字符串
|
||||||
|
*/
|
||||||
|
export const formatNumber = (num) => {
|
||||||
|
return num.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ",");
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 格式化金额,添加千位分隔符和货币符号
|
||||||
|
* @param {number} amount - 要格式化的金额
|
||||||
|
* @param {string} symbol - 货币符号,默认为 ¥
|
||||||
|
* @returns {string} - 格式化后的金额字符串
|
||||||
|
*/
|
||||||
|
export const formatCurrency = (amount, symbol = '¥') => {
|
||||||
|
return `${symbol} ${formatNumber(amount)}`;
|
||||||
|
};
|
||||||
|
|
@ -1,52 +0,0 @@
|
||||||
<template>
|
|
||||||
<div id="bottomLeft">
|
|
||||||
<div class="bg-color-black">
|
|
||||||
<div class="d-flex pt-2 pl-2">
|
|
||||||
<span>
|
|
||||||
<icon name="chart-bar" class="text-icon"></icon>
|
|
||||||
</span>
|
|
||||||
<div class="d-flex">
|
|
||||||
<span class="fs-xl text mx-2">科研概况</span>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div>
|
|
||||||
<BottomLeftChart />
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<script>
|
|
||||||
import BottomLeftChart from '@/components/echart/bottom/bottomLeftChart'
|
|
||||||
export default {
|
|
||||||
components: {
|
|
||||||
BottomLeftChart
|
|
||||||
}
|
|
||||||
}
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<style lang="scss" scoped>
|
|
||||||
$box-height: 520px;
|
|
||||||
$box-width: 100%;
|
|
||||||
#bottomLeft {
|
|
||||||
padding: 20px 16px;
|
|
||||||
height: $box-height;
|
|
||||||
width: $box-width;
|
|
||||||
border-radius: 5px;
|
|
||||||
.bg-color-black {
|
|
||||||
height: $box-height - 35px;
|
|
||||||
border-radius: 10px;
|
|
||||||
}
|
|
||||||
.text {
|
|
||||||
color: #c3cbde;
|
|
||||||
}
|
|
||||||
.chart-box {
|
|
||||||
margin-top: 16px;
|
|
||||||
width: 170px;
|
|
||||||
height: 170px;
|
|
||||||
.active-ring-name {
|
|
||||||
padding-top: 10px;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
|
|
@ -1,60 +0,0 @@
|
||||||
<template>
|
|
||||||
<div id="bottomRight">
|
|
||||||
<div class="bg-color-black">
|
|
||||||
<div class="d-flex pt-2 pl-2">
|
|
||||||
<span>
|
|
||||||
<icon name="chart-area" class="text-icon"></icon>
|
|
||||||
</span>
|
|
||||||
<div class="d-flex">
|
|
||||||
<span class="fs-xl text mx-2">工单修复以及满意度统计图</span>
|
|
||||||
<div class="decoration2">
|
|
||||||
<dv-decoration-2 :reverse="true" style="width:5px;height:6rem;" />
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div>
|
|
||||||
<BottomRightChart />
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<script>
|
|
||||||
import BottomRightChart from "@/components/echart/bottom/bottomRightChart";
|
|
||||||
export default {
|
|
||||||
components: {
|
|
||||||
BottomRightChart
|
|
||||||
}
|
|
||||||
};
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<style lang="scss" class>
|
|
||||||
$box-height: 520px;
|
|
||||||
$box-width: 100%;
|
|
||||||
#bottomRight {
|
|
||||||
padding: 14px 16px;
|
|
||||||
height: $box-height;
|
|
||||||
width: $box-width;
|
|
||||||
border-radius: 5px;
|
|
||||||
.bg-color-black {
|
|
||||||
height: $box-height - 30px;
|
|
||||||
border-radius: 10px;
|
|
||||||
}
|
|
||||||
.text {
|
|
||||||
color: #c3cbde;
|
|
||||||
}
|
|
||||||
//下滑线动态
|
|
||||||
.decoration2 {
|
|
||||||
position: absolute;
|
|
||||||
right: 0.125rem;
|
|
||||||
}
|
|
||||||
.chart-box {
|
|
||||||
margin-top: 16px;
|
|
||||||
width: 170px;
|
|
||||||
height: 170px;
|
|
||||||
.active-ring-name {
|
|
||||||
padding-top: 10px;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
|
|
@ -1,283 +0,0 @@
|
||||||
<template>
|
|
||||||
<div id="center">
|
|
||||||
<div class="up">
|
|
||||||
<div
|
|
||||||
class="bg-color-black item"
|
|
||||||
v-for="item in titleItem"
|
|
||||||
:key="item.title"
|
|
||||||
>
|
|
||||||
<p class="ml-3 colorBlue fw-b fs-xl">{{ item.title }}</p>
|
|
||||||
<div>
|
|
||||||
<dv-digital-flop
|
|
||||||
class="dv-dig-flop ml-1 mt-2 pl-3"
|
|
||||||
:config="item.number"
|
|
||||||
/>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="down">
|
|
||||||
<div class="ranking bg-color-black">
|
|
||||||
<span>
|
|
||||||
<icon name="chart-pie" class="text-icon"></icon>
|
|
||||||
</span>
|
|
||||||
<span class="fs-xl text mx-2 mb-1 pl-3">年度负责人组件达标榜</span>
|
|
||||||
<dv-scroll-ranking-board class="dv-scr-rank-board mt-1" :config="ranking" />
|
|
||||||
</div>
|
|
||||||
<div class="percent">
|
|
||||||
<div class="item bg-color-black">
|
|
||||||
<span>今日任务通过率</span>
|
|
||||||
<CenterChart
|
|
||||||
:id="rate[0].id"
|
|
||||||
:tips="rate[0].tips"
|
|
||||||
:colorObj="rate[0].colorData"
|
|
||||||
/>
|
|
||||||
</div>
|
|
||||||
<div class="item bg-color-black">
|
|
||||||
<span>今日任务达标率</span>
|
|
||||||
<CenterChart
|
|
||||||
:id="rate[1].id"
|
|
||||||
:tips="rate[1].tips"
|
|
||||||
:colorObj="rate[1].colorData"
|
|
||||||
/>
|
|
||||||
</div>
|
|
||||||
<div class="water">
|
|
||||||
<dv-water-level-pond class="dv-wa-le-po" :config="water" />
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<script>
|
|
||||||
import CenterChart from '@/components/echart/center/centerChartRate'
|
|
||||||
|
|
||||||
export default {
|
|
||||||
data() {
|
|
||||||
return {
|
|
||||||
titleItem: [
|
|
||||||
{
|
|
||||||
title: '今年累计任务建次数',
|
|
||||||
number: {
|
|
||||||
number: [120],
|
|
||||||
toFixed: 1,
|
|
||||||
textAlign: 'left',
|
|
||||||
content: '{nt}',
|
|
||||||
style: {
|
|
||||||
fontSize: 26
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
title: '本月累计任务次数',
|
|
||||||
number: {
|
|
||||||
number: [18],
|
|
||||||
toFixed: 1,
|
|
||||||
textAlign: 'left',
|
|
||||||
content: '{nt}',
|
|
||||||
style: {
|
|
||||||
fontSize: 26
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
title: '今日累计任务次数',
|
|
||||||
number: {
|
|
||||||
number: [2],
|
|
||||||
toFixed: 1,
|
|
||||||
textAlign: 'left',
|
|
||||||
content: '{nt}',
|
|
||||||
style: {
|
|
||||||
fontSize: 26
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
title: '今年失败任务次数',
|
|
||||||
number: {
|
|
||||||
number: [14],
|
|
||||||
toFixed: 1,
|
|
||||||
textAlign: 'left',
|
|
||||||
content: '{nt}',
|
|
||||||
style: {
|
|
||||||
fontSize: 26
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
title: '今年成功任务次数',
|
|
||||||
number: {
|
|
||||||
number: [106],
|
|
||||||
toFixed: 1,
|
|
||||||
textAlign: 'left',
|
|
||||||
content: '{nt}',
|
|
||||||
style: {
|
|
||||||
fontSize: 26
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
title: '今年达标任务个数',
|
|
||||||
number: {
|
|
||||||
number: [100],
|
|
||||||
toFixed: 1,
|
|
||||||
textAlign: 'left',
|
|
||||||
content: '{nt}',
|
|
||||||
style: {
|
|
||||||
fontSize: 26
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
],
|
|
||||||
ranking: {
|
|
||||||
data: [
|
|
||||||
{
|
|
||||||
name: '周口',
|
|
||||||
value: 55
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: '南阳',
|
|
||||||
value: 120
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: '西峡',
|
|
||||||
value: 78
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: '驻马店',
|
|
||||||
value: 66
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: '新乡',
|
|
||||||
value: 80
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: '新乡2',
|
|
||||||
value: 80
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: '新乡3',
|
|
||||||
value: 80
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: '新乡4',
|
|
||||||
value: 80
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: '新乡5',
|
|
||||||
value: 80
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: '新乡6',
|
|
||||||
value: 80
|
|
||||||
}
|
|
||||||
],
|
|
||||||
carousel: 'single',
|
|
||||||
unit: '人'
|
|
||||||
},
|
|
||||||
water: {
|
|
||||||
data: [24, 45],
|
|
||||||
shape: 'roundRect',
|
|
||||||
formatter: '{value}%',
|
|
||||||
waveNum: 3
|
|
||||||
},
|
|
||||||
// 通过率和达标率的组件复用数据
|
|
||||||
rate: [
|
|
||||||
{
|
|
||||||
id: 'centerRate1',
|
|
||||||
tips: 60,
|
|
||||||
colorData: {
|
|
||||||
textStyle: '#3fc0fb',
|
|
||||||
series: {
|
|
||||||
color: ['#00bcd44a', 'transparent'],
|
|
||||||
dataColor: {
|
|
||||||
normal: '#03a9f4',
|
|
||||||
shadowColor: '#97e2f5'
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
id: 'centerRate2',
|
|
||||||
tips: 40,
|
|
||||||
colorData: {
|
|
||||||
textStyle: '#67e0e3',
|
|
||||||
series: {
|
|
||||||
color: ['#faf3a378', 'transparent'],
|
|
||||||
dataColor: {
|
|
||||||
normal: '#ff9800',
|
|
||||||
shadowColor: '#fcebad'
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
},
|
|
||||||
components: {
|
|
||||||
CenterChart
|
|
||||||
}
|
|
||||||
}
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<style lang="scss" scoped>
|
|
||||||
#center {
|
|
||||||
display: flex;
|
|
||||||
flex-direction: column;
|
|
||||||
.up {
|
|
||||||
width: 100%;
|
|
||||||
display: flex;
|
|
||||||
flex-wrap: wrap;
|
|
||||||
justify-content: space-around;
|
|
||||||
.item {
|
|
||||||
border-radius: 6px;
|
|
||||||
padding-top: 8px;
|
|
||||||
margin-top: 8px;
|
|
||||||
width: 32%;
|
|
||||||
height: 70px;
|
|
||||||
.dv-dig-flop {
|
|
||||||
width: 150px;
|
|
||||||
height: 30px;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
.down {
|
|
||||||
padding: 6px 4px;
|
|
||||||
padding-bottom: 0;
|
|
||||||
width: 100%;
|
|
||||||
display: flex;
|
|
||||||
height: 255px;
|
|
||||||
justify-content: space-between;
|
|
||||||
.bg-color-black {
|
|
||||||
border-radius: 5px;
|
|
||||||
}
|
|
||||||
.ranking {
|
|
||||||
padding: 10px;
|
|
||||||
width: 59%;
|
|
||||||
.dv-scr-rank-board {
|
|
||||||
height: 225px;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
.percent {
|
|
||||||
width: 40%;
|
|
||||||
display: flex;
|
|
||||||
flex-wrap: wrap;
|
|
||||||
.item {
|
|
||||||
width: 50%;
|
|
||||||
height: 120px;
|
|
||||||
span {
|
|
||||||
margin-top: 8px;
|
|
||||||
font-size: 14px;
|
|
||||||
display: flex;
|
|
||||||
justify-content: center;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
.water {
|
|
||||||
width: 100%;
|
|
||||||
.dv-wa-le-po {
|
|
||||||
height: 120px;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
|
|
@ -1,169 +0,0 @@
|
||||||
<template>
|
|
||||||
<div id="centerLeft1">
|
|
||||||
<div class="bg-color-black">
|
|
||||||
<div class="d-flex pt-2 pl-2">
|
|
||||||
<span>
|
|
||||||
<icon name="chart-bar" class="text-icon"></icon>
|
|
||||||
</span>
|
|
||||||
<div class="d-flex">
|
|
||||||
<span class="fs-xl text mx-2">教务概况</span>
|
|
||||||
<!-- <dv-decoration-3 class="dv-dec-3" /> -->
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="d-flex jc-center">
|
|
||||||
<CenterLeft1Chart />
|
|
||||||
</div>
|
|
||||||
<!-- 4个主要的数据 -->
|
|
||||||
<div class="bottom-data">
|
|
||||||
<div
|
|
||||||
class="item-box mt-2"
|
|
||||||
v-for="(item, index) in numberData"
|
|
||||||
:key="index"
|
|
||||||
>
|
|
||||||
<div class="d-flex">
|
|
||||||
<span class="coin"></span>
|
|
||||||
<dv-digital-flop class="dv-digital-flop" :config="item.number" />
|
|
||||||
</div>
|
|
||||||
<p class="text" style="text-align: center;">
|
|
||||||
{{ item.text }}
|
|
||||||
<span class="colorYellow">(件)</span>
|
|
||||||
</p>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<script>
|
|
||||||
import CenterLeft1Chart from '@/components/echart/centerLeft/centerLeft1Chart'
|
|
||||||
export default {
|
|
||||||
data() {
|
|
||||||
return {
|
|
||||||
numberData: [
|
|
||||||
{
|
|
||||||
number: {
|
|
||||||
number: [15],
|
|
||||||
toFixed: 1,
|
|
||||||
textAlign: 'left',
|
|
||||||
content: '{nt}',
|
|
||||||
style: {
|
|
||||||
fontSize: 24
|
|
||||||
}
|
|
||||||
},
|
|
||||||
text: '教务概况'
|
|
||||||
},
|
|
||||||
{
|
|
||||||
number: {
|
|
||||||
number: [1144],
|
|
||||||
toFixed: 1,
|
|
||||||
textAlign: 'left',
|
|
||||||
content: '{nt}',
|
|
||||||
style: {
|
|
||||||
fontSize: 24
|
|
||||||
}
|
|
||||||
},
|
|
||||||
text: '科研概况'
|
|
||||||
},
|
|
||||||
{
|
|
||||||
number: {
|
|
||||||
number: [361],
|
|
||||||
toFixed: 1,
|
|
||||||
textAlign: 'left',
|
|
||||||
content: '{nt}',
|
|
||||||
style: {
|
|
||||||
fontSize: 24
|
|
||||||
}
|
|
||||||
},
|
|
||||||
text: '学生概况'
|
|
||||||
},
|
|
||||||
{
|
|
||||||
number: {
|
|
||||||
number: [157],
|
|
||||||
toFixed: 1,
|
|
||||||
textAlign: 'left',
|
|
||||||
content: '{nt}',
|
|
||||||
style: {
|
|
||||||
fontSize: 24
|
|
||||||
}
|
|
||||||
},
|
|
||||||
text: '教职工概况'
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
},
|
|
||||||
components: {
|
|
||||||
CenterLeft1Chart
|
|
||||||
},
|
|
||||||
mounted() {
|
|
||||||
this.changeTiming()
|
|
||||||
},
|
|
||||||
methods: {
|
|
||||||
changeTiming() {
|
|
||||||
setInterval(() => {
|
|
||||||
this.changeNumber()
|
|
||||||
}, 3000)
|
|
||||||
},
|
|
||||||
changeNumber() {
|
|
||||||
this.numberData.forEach((item, index) => {
|
|
||||||
item.number.number[0] += ++index
|
|
||||||
item.number = { ...item.number }
|
|
||||||
})
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<style lang="scss" scoped>
|
|
||||||
$box-width: 300px;
|
|
||||||
$box-height: 410px;
|
|
||||||
|
|
||||||
#centerLeft1 {
|
|
||||||
padding: 16px;
|
|
||||||
height: $box-height;
|
|
||||||
width: $box-width;
|
|
||||||
border-radius: 10px;
|
|
||||||
.bg-color-black {
|
|
||||||
height: $box-height - 30px;
|
|
||||||
border-radius: 10px;
|
|
||||||
}
|
|
||||||
.text {
|
|
||||||
color: #c3cbde;
|
|
||||||
}
|
|
||||||
.dv-dec-3 {
|
|
||||||
position: relative;
|
|
||||||
width: 100px;
|
|
||||||
height: 20px;
|
|
||||||
top: -3px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.bottom-data {
|
|
||||||
.item-box {
|
|
||||||
& > div {
|
|
||||||
padding-right: 5px;
|
|
||||||
}
|
|
||||||
font-size: 14px;
|
|
||||||
float: right;
|
|
||||||
position: relative;
|
|
||||||
width: 50%;
|
|
||||||
color: #d3d6dd;
|
|
||||||
.dv-digital-flop {
|
|
||||||
width: 120px;
|
|
||||||
height: 30px;
|
|
||||||
}
|
|
||||||
// 金币
|
|
||||||
.coin {
|
|
||||||
position: relative;
|
|
||||||
top: 6px;
|
|
||||||
font-size: 20px;
|
|
||||||
color: #ffc107;
|
|
||||||
}
|
|
||||||
.colorYellow {
|
|
||||||
color: yellowgreen;
|
|
||||||
}
|
|
||||||
p {
|
|
||||||
text-align: center;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
|
|
@ -1,59 +0,0 @@
|
||||||
<template>
|
|
||||||
<div id="centerLeft1">
|
|
||||||
<div class="bg-color-black">
|
|
||||||
<div class="d-flex pt-2 pl-2">
|
|
||||||
<span>
|
|
||||||
<icon name="chart-pie" class="text-icon"></icon>
|
|
||||||
</span>
|
|
||||||
<div class="d-flex">
|
|
||||||
<span class="fs-xl text mx-2">地图数据</span>
|
|
||||||
<dv-decoration-1 class="dv-dec-1" />
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="d-flex jc-center">
|
|
||||||
<CenterLeft2Chart />
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<script>
|
|
||||||
import CenterLeft2Chart from "@/components/echart/centerLeft/centerLeft2Chart";
|
|
||||||
export default {
|
|
||||||
components: {
|
|
||||||
CenterLeft2Chart
|
|
||||||
},
|
|
||||||
};
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<style lang="scss" scoped>
|
|
||||||
#centerLeft1 {
|
|
||||||
$box-width: 300px;
|
|
||||||
$box-height: 410px;
|
|
||||||
padding: 16px;
|
|
||||||
height: $box-height;
|
|
||||||
min-width: $box-width;
|
|
||||||
border-radius: 5px;
|
|
||||||
.bg-color-black {
|
|
||||||
height: $box-height - 30px;
|
|
||||||
border-radius: 10px;
|
|
||||||
}
|
|
||||||
.text {
|
|
||||||
color: #c3cbde;
|
|
||||||
}
|
|
||||||
.dv-dec-1 {
|
|
||||||
position: relative;
|
|
||||||
width: 100px;
|
|
||||||
height: 20px;
|
|
||||||
top: -3px;
|
|
||||||
}
|
|
||||||
.chart-box {
|
|
||||||
margin-top: 16px;
|
|
||||||
width: 170px;
|
|
||||||
height: 170px;
|
|
||||||
.active-ring-name {
|
|
||||||
padding-top: 10px;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
|
|
@ -1,76 +0,0 @@
|
||||||
<template>
|
|
||||||
<div id="centerRight1">
|
|
||||||
<div class="bg-color-black">
|
|
||||||
<div class="d-flex pt-2 pl-2">
|
|
||||||
<span>
|
|
||||||
<icon name="chart-line" class="text-icon"></icon>
|
|
||||||
</span>
|
|
||||||
<div class="d-flex">
|
|
||||||
<span class="fs-xl text mx-2">任务完成排行榜</span>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="d-flex jc-center body-box">
|
|
||||||
<dv-scroll-board class="dv-scr-board" :config="config" />
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<script>
|
|
||||||
export default {
|
|
||||||
data() {
|
|
||||||
return {
|
|
||||||
config: {
|
|
||||||
header: ['组件', '分支', '覆盖率'],
|
|
||||||
data: [
|
|
||||||
['组件1', 'dev-1', "<span class='colorGrass'>↑75%</span>"],
|
|
||||||
['组件2', 'dev-2', "<span class='colorRed'>↓33%</span>"],
|
|
||||||
['组件3', 'dev-3', "<span class='colorGrass'>↑100%</span>"],
|
|
||||||
['组件4', 'rea-1', "<span class='colorGrass'>↑94%</span>"],
|
|
||||||
['组件5', 'rea-2', "<span class='colorGrass'>↑95%</span>"],
|
|
||||||
['组件6', 'fix-2', "<span class='colorGrass'>↑63%</span>"],
|
|
||||||
['组件7', 'fix-4', "<span class='colorGrass'>↑84%</span>"],
|
|
||||||
['组件8', 'fix-7', "<span class='colorRed'>↓46%</span>"],
|
|
||||||
['组件9', 'dev-2', "<span class='colorRed'>↓13%</span>"],
|
|
||||||
['组件10', 'dev-9', "<span class='colorGrass'>↑76%</span>"]
|
|
||||||
],
|
|
||||||
rowNum: 7, //表格行数
|
|
||||||
headerHeight: 35,
|
|
||||||
headerBGC: '#0f1325', //表头
|
|
||||||
oddRowBGC: '#0f1325', //奇数行
|
|
||||||
evenRowBGC: '#171c33', //偶数行
|
|
||||||
index: true,
|
|
||||||
columnWidth: [50],
|
|
||||||
align: ['center']
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<style lang="scss" scoped>
|
|
||||||
$box-height: 410px;
|
|
||||||
$box-width: 300px;
|
|
||||||
#centerRight1 {
|
|
||||||
padding: 16px;
|
|
||||||
padding-top: 20px;
|
|
||||||
height: $box-height;
|
|
||||||
width: $box-width;
|
|
||||||
border-radius: 5px;
|
|
||||||
.bg-color-black {
|
|
||||||
height: $box-height - 30px;
|
|
||||||
border-radius: 10px;
|
|
||||||
}
|
|
||||||
.text {
|
|
||||||
color: #c3cbde;
|
|
||||||
}
|
|
||||||
.body-box {
|
|
||||||
border-radius: 10px;
|
|
||||||
overflow: hidden;
|
|
||||||
.dv-scr-board {
|
|
||||||
width: 270px;
|
|
||||||
height: 340px;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
|
|
@ -1,80 +0,0 @@
|
||||||
<template>
|
|
||||||
<div id="centerRight2">
|
|
||||||
<div class="bg-color-black">
|
|
||||||
<div class="d-flex pt-2 pl-2">
|
|
||||||
<span>
|
|
||||||
<icon name="align-left" class="text-icon"></icon>
|
|
||||||
</span>
|
|
||||||
<span class="fs-xl text mx-2">产品销售渠道分析</span>
|
|
||||||
</div>
|
|
||||||
<div class="d-flex ai-center flex-column body-box">
|
|
||||||
<dv-capsule-chart class="dv-cap-chart" :config="config" />
|
|
||||||
<centerRight2Chart1 />
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<script>
|
|
||||||
import centerRight2Chart1 from '@/components/echart/centerRight/centerRightChart'
|
|
||||||
|
|
||||||
export default {
|
|
||||||
data() {
|
|
||||||
return {
|
|
||||||
config: {
|
|
||||||
data: [
|
|
||||||
{
|
|
||||||
name: '南阳',
|
|
||||||
value: 167
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: '周口',
|
|
||||||
value: 67
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: '漯河',
|
|
||||||
value: 123
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: '郑州',
|
|
||||||
value: 55
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: '西峡',
|
|
||||||
value: 98
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
components: { centerRight2Chart1 }
|
|
||||||
}
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<style lang="scss" scoped>
|
|
||||||
#centerRight2 {
|
|
||||||
$box-height: 410px;
|
|
||||||
$box-width: 340px;
|
|
||||||
padding: 5px;
|
|
||||||
height: $box-height;
|
|
||||||
width: $box-width;
|
|
||||||
border-radius: 5px;
|
|
||||||
.bg-color-black {
|
|
||||||
padding: 5px;
|
|
||||||
height: $box-height;
|
|
||||||
width: $box-width;
|
|
||||||
border-radius: 10px;
|
|
||||||
}
|
|
||||||
.text {
|
|
||||||
color: #c3cbde;
|
|
||||||
}
|
|
||||||
.body-box {
|
|
||||||
border-radius: 10px;
|
|
||||||
overflow: hidden;
|
|
||||||
.dv-cap-chart {
|
|
||||||
width: 100%;
|
|
||||||
height: 160px;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
|
|
@ -0,0 +1,291 @@
|
||||||
|
<template>
|
||||||
|
<div class="asset-detail">
|
||||||
|
<div class="header">
|
||||||
|
<el-page-header @back="goBack" content="资产详情" />
|
||||||
|
<div class="filters">
|
||||||
|
<el-select v-model="selectedYear" placeholder="选择年份">
|
||||||
|
<el-option
|
||||||
|
v-for="year in years"
|
||||||
|
:key="year"
|
||||||
|
:label="year"
|
||||||
|
:value="year"
|
||||||
|
/>
|
||||||
|
</el-select>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<el-row :gutter="20" class="overview-cards">
|
||||||
|
<el-col :span="6" v-for="(item, index) in overviewData" :key="index">
|
||||||
|
<el-card shadow="hover" class="overview-card">
|
||||||
|
<div class="card-content">
|
||||||
|
<div class="value">{{ item.value }}</div>
|
||||||
|
<div class="label">{{ item.label }}</div>
|
||||||
|
<div class="trend" :class="item.trend">
|
||||||
|
{{ item.trendValue }}%
|
||||||
|
<i
|
||||||
|
:class="item.trend === 'up' ? 'el-icon-top' : 'el-icon-bottom'"
|
||||||
|
></i>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</el-card>
|
||||||
|
</el-col>
|
||||||
|
</el-row>
|
||||||
|
|
||||||
|
<el-row :gutter="20" class="charts-row">
|
||||||
|
<el-col :span="12">
|
||||||
|
<el-card class="chart-card">
|
||||||
|
<div slot="header">
|
||||||
|
<span>资产类型分布</span>
|
||||||
|
</div>
|
||||||
|
<ve-pie
|
||||||
|
:data="assetTypeData"
|
||||||
|
:settings="pieSettings"
|
||||||
|
height="300px"
|
||||||
|
/>
|
||||||
|
</el-card>
|
||||||
|
</el-col>
|
||||||
|
<el-col :span="12">
|
||||||
|
<el-card class="chart-card">
|
||||||
|
<div slot="header">
|
||||||
|
<span>资产价值趋势</span>
|
||||||
|
</div>
|
||||||
|
<ve-line
|
||||||
|
:data="assetValueData"
|
||||||
|
:settings="lineSettings"
|
||||||
|
height="300px"
|
||||||
|
/>
|
||||||
|
</el-card>
|
||||||
|
</el-col>
|
||||||
|
</el-row>
|
||||||
|
|
||||||
|
<el-row :gutter="20" class="charts-row">
|
||||||
|
<el-col :span="12">
|
||||||
|
<el-card class="chart-card">
|
||||||
|
<div slot="header">
|
||||||
|
<span>设备使用率</span>
|
||||||
|
</div>
|
||||||
|
<ve-gauge
|
||||||
|
:data="equipmentUsageData"
|
||||||
|
:settings="gaugeSettings"
|
||||||
|
height="300px"
|
||||||
|
/>
|
||||||
|
</el-card>
|
||||||
|
</el-col>
|
||||||
|
<el-col :span="12">
|
||||||
|
<el-card class="chart-card">
|
||||||
|
<div slot="header">
|
||||||
|
<span>预算执行情况</span>
|
||||||
|
</div>
|
||||||
|
<ve-histogram
|
||||||
|
:data="budgetData"
|
||||||
|
:settings="histogramSettings"
|
||||||
|
height="300px"
|
||||||
|
/>
|
||||||
|
</el-card>
|
||||||
|
</el-col>
|
||||||
|
</el-row>
|
||||||
|
|
||||||
|
<el-card class="table-card">
|
||||||
|
<div slot="header">
|
||||||
|
<span>资产采购计划</span>
|
||||||
|
<el-button style="float: right" type="text">查看全部</el-button>
|
||||||
|
</div>
|
||||||
|
<el-table :data="purchaseData" style="width: 100%">
|
||||||
|
<el-table-column prop="name" label="采购项目" />
|
||||||
|
<el-table-column prop="department" label="申请部门" />
|
||||||
|
<el-table-column prop="budget" label="预算金额(万)" />
|
||||||
|
<el-table-column prop="status" label="状态">
|
||||||
|
<template slot-scope="scope">
|
||||||
|
<el-tag :type="getStatusType(scope.row.status)">
|
||||||
|
{{ scope.row.status }}
|
||||||
|
</el-tag>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column prop="progress" label="进度">
|
||||||
|
<template slot-scope="scope">
|
||||||
|
<el-progress :percentage="scope.row.progress" />
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
</el-table>
|
||||||
|
</el-card>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
export default {
|
||||||
|
name: "AssetDetail",
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
selectedYear: "2024",
|
||||||
|
years: ["2024", "2023", "2022", "2021"],
|
||||||
|
overviewData: [
|
||||||
|
{ label: "总资产(万元)", value: "580,000", trend: "up", trendValue: 8 },
|
||||||
|
{ label: "设备数量(台)", value: "12,586", trend: "up", trendValue: 5 },
|
||||||
|
{ label: "设备完好率", value: "96.8%", trend: "up", trendValue: 2 },
|
||||||
|
{ label: "预算执行率", value: "85.2%", trend: "up", trendValue: 10 },
|
||||||
|
],
|
||||||
|
assetTypeData: {
|
||||||
|
columns: ["类型", "金额"],
|
||||||
|
rows: [
|
||||||
|
{ 类型: "房屋建筑", 金额: 280000 },
|
||||||
|
{ 类型: "教学设备", 金额: 150000 },
|
||||||
|
{ 类型: "科研设备", 金额: 100000 },
|
||||||
|
{ 类型: "办公设备", 金额: 30000 },
|
||||||
|
{ 类型: "其他资产", 金额: 20000 },
|
||||||
|
],
|
||||||
|
},
|
||||||
|
pieSettings: {
|
||||||
|
radius: "65%",
|
||||||
|
offsetY: "60%",
|
||||||
|
},
|
||||||
|
assetValueData: {
|
||||||
|
columns: ["月份", "资产总值"],
|
||||||
|
rows: [
|
||||||
|
{ 月份: "1月", 资产总值: 550000 },
|
||||||
|
{ 月份: "2月", 资产总值: 555000 },
|
||||||
|
{ 月份: "3月", 资产总值: 562000 },
|
||||||
|
{ 月份: "4月", 资产总值: 568000 },
|
||||||
|
{ 月份: "5月", 资产总值: 575000 },
|
||||||
|
{ 月份: "6月", 资产总值: 580000 },
|
||||||
|
],
|
||||||
|
},
|
||||||
|
lineSettings: {
|
||||||
|
area: true,
|
||||||
|
},
|
||||||
|
equipmentUsageData: {
|
||||||
|
columns: ["type", "value"],
|
||||||
|
rows: [{ type: "设备使用率", value: 85.6 }],
|
||||||
|
},
|
||||||
|
gaugeSettings: {
|
||||||
|
dataName: {
|
||||||
|
设备使用率: "使用率",
|
||||||
|
},
|
||||||
|
seriesMap: {
|
||||||
|
设备使用率: {
|
||||||
|
min: 0,
|
||||||
|
max: 100,
|
||||||
|
splitNumber: 10,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
budgetData: {
|
||||||
|
columns: ["月份", "预算金额", "实际支出"],
|
||||||
|
rows: [
|
||||||
|
{ 月份: "1月", 预算金额: 1000, 实际支出: 850 },
|
||||||
|
{ 月份: "2月", 预算金额: 1200, 实际支出: 1000 },
|
||||||
|
{ 月份: "3月", 预算金额: 1500, 实际支出: 1300 },
|
||||||
|
{ 月份: "4月", 预算金额: 1800, 实际支出: 1600 },
|
||||||
|
{ 月份: "5月", 预算金额: 2000, 实际支出: 1750 },
|
||||||
|
{ 月份: "6月", 预算金额: 2200, 实际支出: 1900 },
|
||||||
|
],
|
||||||
|
},
|
||||||
|
histogramSettings: {
|
||||||
|
metrics: ["预算金额", "实际支出"],
|
||||||
|
},
|
||||||
|
purchaseData: [
|
||||||
|
{
|
||||||
|
name: "实验室设备更新",
|
||||||
|
department: "物理学院",
|
||||||
|
budget: 500,
|
||||||
|
status: "审批中",
|
||||||
|
progress: 30,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "智慧教室建设",
|
||||||
|
department: "教务处",
|
||||||
|
budget: 800,
|
||||||
|
status: "已立项",
|
||||||
|
progress: 10,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "图书馆设备采购",
|
||||||
|
department: "图书馆",
|
||||||
|
budget: 300,
|
||||||
|
status: "采购中",
|
||||||
|
progress: 60,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "体育场地维护",
|
||||||
|
department: "体育部",
|
||||||
|
budget: 200,
|
||||||
|
status: "已完成",
|
||||||
|
progress: 100,
|
||||||
|
},
|
||||||
|
],
|
||||||
|
};
|
||||||
|
},
|
||||||
|
methods: {
|
||||||
|
goBack() {
|
||||||
|
this.$router.push("/");
|
||||||
|
},
|
||||||
|
getStatusType(status) {
|
||||||
|
const types = {
|
||||||
|
审批中: "warning",
|
||||||
|
已立项: "primary",
|
||||||
|
采购中: "success",
|
||||||
|
已完成: "info",
|
||||||
|
};
|
||||||
|
return types[status] || "info";
|
||||||
|
},
|
||||||
|
},
|
||||||
|
};
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style lang="scss" scoped>
|
||||||
|
.asset-detail {
|
||||||
|
padding: 20px;
|
||||||
|
background: #f0f2f5;
|
||||||
|
min-height: 100vh;
|
||||||
|
|
||||||
|
.header {
|
||||||
|
display: flex;
|
||||||
|
justify-content: space-between;
|
||||||
|
align-items: center;
|
||||||
|
margin-bottom: 20px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.overview-cards {
|
||||||
|
margin-bottom: 20px;
|
||||||
|
|
||||||
|
.overview-card {
|
||||||
|
.card-content {
|
||||||
|
text-align: center;
|
||||||
|
|
||||||
|
.value {
|
||||||
|
font-size: 24px;
|
||||||
|
font-weight: bold;
|
||||||
|
color: #303133;
|
||||||
|
}
|
||||||
|
|
||||||
|
.label {
|
||||||
|
font-size: 14px;
|
||||||
|
color: #909399;
|
||||||
|
margin: 8px 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.trend {
|
||||||
|
font-size: 12px;
|
||||||
|
&.up {
|
||||||
|
color: #67c23a;
|
||||||
|
}
|
||||||
|
&.down {
|
||||||
|
color: #f56c6c;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.charts-row {
|
||||||
|
margin-bottom: 20px;
|
||||||
|
|
||||||
|
.chart-card {
|
||||||
|
height: 400px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.table-card {
|
||||||
|
margin-bottom: 20px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
|
@ -0,0 +1,305 @@
|
||||||
|
<template>
|
||||||
|
<div class="card-detail">
|
||||||
|
<div class="header">
|
||||||
|
<el-page-header @back="goBack" content="一卡通详情" />
|
||||||
|
<div class="filters">
|
||||||
|
<el-select v-model="selectedYear" placeholder="选择年份">
|
||||||
|
<el-option
|
||||||
|
v-for="year in years"
|
||||||
|
:key="year"
|
||||||
|
:label="year"
|
||||||
|
:value="year"
|
||||||
|
/>
|
||||||
|
</el-select>
|
||||||
|
<el-date-picker
|
||||||
|
v-model="selectedDate"
|
||||||
|
type="date"
|
||||||
|
placeholder="选择日期"
|
||||||
|
size="small"
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<el-row :gutter="20" class="overview-cards">
|
||||||
|
<el-col :span="6" v-for="(item, index) in overviewData" :key="index">
|
||||||
|
<el-card shadow="hover" class="overview-card">
|
||||||
|
<div class="card-content">
|
||||||
|
<div class="value">{{ item.value }}</div>
|
||||||
|
<div class="label">{{ item.label }}</div>
|
||||||
|
<div class="trend" :class="item.trend">
|
||||||
|
{{ item.trendValue }}%
|
||||||
|
<i
|
||||||
|
:class="item.trend === 'up' ? 'el-icon-top' : 'el-icon-bottom'"
|
||||||
|
></i>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</el-card>
|
||||||
|
</el-col>
|
||||||
|
</el-row>
|
||||||
|
|
||||||
|
<el-row :gutter="20" class="charts-row">
|
||||||
|
<el-col :span="12">
|
||||||
|
<el-card class="chart-card">
|
||||||
|
<div slot="header">
|
||||||
|
<span>消费趋势分析</span>
|
||||||
|
</div>
|
||||||
|
<ve-line
|
||||||
|
:data="consumptionData"
|
||||||
|
:settings="lineSettings"
|
||||||
|
height="300px"
|
||||||
|
/>
|
||||||
|
</el-card>
|
||||||
|
</el-col>
|
||||||
|
<el-col :span="12">
|
||||||
|
<el-card class="chart-card">
|
||||||
|
<div slot="header">
|
||||||
|
<span>消费场所分布</span>
|
||||||
|
</div>
|
||||||
|
<ve-pie :data="locationData" :settings="pieSettings" height="300px" />
|
||||||
|
</el-card>
|
||||||
|
</el-col>
|
||||||
|
</el-row>
|
||||||
|
|
||||||
|
<el-row :gutter="20" class="charts-row">
|
||||||
|
<el-col :span="12">
|
||||||
|
<el-card class="chart-card">
|
||||||
|
<div slot="header">
|
||||||
|
<span>门禁使用分析</span>
|
||||||
|
</div>
|
||||||
|
<ve-histogram
|
||||||
|
:data="accessData"
|
||||||
|
:settings="histogramSettings"
|
||||||
|
height="300px"
|
||||||
|
/>
|
||||||
|
</el-card>
|
||||||
|
</el-col>
|
||||||
|
<el-col :span="12">
|
||||||
|
<el-card class="chart-card">
|
||||||
|
<div slot="header">
|
||||||
|
<span>卡务办理统计</span>
|
||||||
|
</div>
|
||||||
|
<ve-bar :data="cardServiceData" height="300px" />
|
||||||
|
</el-card>
|
||||||
|
</el-col>
|
||||||
|
</el-row>
|
||||||
|
|
||||||
|
<el-card class="table-card">
|
||||||
|
<div slot="header">
|
||||||
|
<span>异常记录</span>
|
||||||
|
<el-button style="float: right" type="text">查看全部</el-button>
|
||||||
|
</div>
|
||||||
|
<el-table :data="abnormalRecords" style="width: 100%">
|
||||||
|
<el-table-column prop="time" label="时间" width="180" />
|
||||||
|
<el-table-column prop="cardNo" label="卡号" width="120" />
|
||||||
|
<el-table-column prop="location" label="地点" />
|
||||||
|
<el-table-column prop="type" label="类型" width="120">
|
||||||
|
<template slot-scope="scope">
|
||||||
|
<el-tag :type="getAbnormalType(scope.row.type)">
|
||||||
|
{{ scope.row.type }}
|
||||||
|
</el-tag>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column prop="status" label="处理状态" width="120">
|
||||||
|
<template slot-scope="scope">
|
||||||
|
<el-tag :type="getStatusType(scope.row.status)">
|
||||||
|
{{ scope.row.status }}
|
||||||
|
</el-tag>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
</el-table>
|
||||||
|
</el-card>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
export default {
|
||||||
|
name: "CardDetail",
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
selectedYear: "2024",
|
||||||
|
selectedDate: new Date(),
|
||||||
|
years: ["2024", "2023", "2022", "2021"],
|
||||||
|
overviewData: [
|
||||||
|
{ label: "发卡总量", value: "28,586", trend: "up", trendValue: 3 },
|
||||||
|
{
|
||||||
|
label: "日均消费额(元)",
|
||||||
|
value: "256,890",
|
||||||
|
trend: "up",
|
||||||
|
trendValue: 5,
|
||||||
|
},
|
||||||
|
{ label: "日均使用次数", value: "85,630", trend: "up", trendValue: 8 },
|
||||||
|
{ label: "卡片完好率", value: "99.2%", trend: "up", trendValue: 0.5 },
|
||||||
|
],
|
||||||
|
consumptionData: {
|
||||||
|
columns: ["时间", "消费金额", "消费笔数"],
|
||||||
|
rows: [
|
||||||
|
{ 时间: "6:00", 消费金额: 5000, 消费笔数: 500 },
|
||||||
|
{ 时间: "8:00", 消费金额: 25000, 消费笔数: 2500 },
|
||||||
|
{ 时间: "12:00", 消费金额: 85000, 消费笔数: 8500 },
|
||||||
|
{ 时间: "15:00", 消费金额: 45000, 消费笔数: 4500 },
|
||||||
|
{ 时间: "18:00", 消费金额: 65000, 消费笔数: 6500 },
|
||||||
|
{ 时间: "21:00", 消费金额: 35000, 消费笔数: 3500 },
|
||||||
|
],
|
||||||
|
},
|
||||||
|
lineSettings: {
|
||||||
|
axisSite: { right: ["消费笔数"] },
|
||||||
|
yAxisType: ["normal", "normal"],
|
||||||
|
yAxisName: ["金额", "笔数"],
|
||||||
|
},
|
||||||
|
locationData: {
|
||||||
|
columns: ["场所", "消费额"],
|
||||||
|
rows: [
|
||||||
|
{ 场所: "食堂", 消费额: 150000 },
|
||||||
|
{ 场所: "超市", 消费额: 50000 },
|
||||||
|
{ 场所: "图书馆", 消费额: 20000 },
|
||||||
|
{ 场所: "浴室", 消费额: 25000 },
|
||||||
|
{ 场所: "其他", 消费额: 10000 },
|
||||||
|
],
|
||||||
|
},
|
||||||
|
pieSettings: {
|
||||||
|
radius: "65%",
|
||||||
|
offsetY: "60%",
|
||||||
|
},
|
||||||
|
accessData: {
|
||||||
|
columns: ["时间段", "图书馆", "宿舍", "教学楼"],
|
||||||
|
rows: [
|
||||||
|
{ 时间段: "6:00-9:00", 图书馆: 500, 宿舍: 2500, 教学楼: 1500 },
|
||||||
|
{ 时间段: "9:00-12:00", 图书馆: 2500, 宿舍: 1000, 教学楼: 3500 },
|
||||||
|
{ 时间段: "12:00-15:00", 图书馆: 1800, 宿舍: 1800, 教学楼: 2500 },
|
||||||
|
{ 时间段: "15:00-18:00", 图书馆: 2000, 宿舍: 1500, 教学楼: 2000 },
|
||||||
|
{ 时间段: "18:00-22:00", 图书馆: 1500, 宿舍: 3500, 教学楼: 1000 },
|
||||||
|
],
|
||||||
|
},
|
||||||
|
histogramSettings: {
|
||||||
|
stack: { 类型: ["图书馆", "宿舍", "教学楼"] },
|
||||||
|
},
|
||||||
|
cardServiceData: {
|
||||||
|
columns: ["服务类型", "数量"],
|
||||||
|
rows: [
|
||||||
|
{ 服务类型: "新卡办理", 数量: 256 },
|
||||||
|
{ 服务类型: "挂失", 数量: 158 },
|
||||||
|
{ 服务类型: "解挂", 数量: 142 },
|
||||||
|
{ 服务类型: "补办", 数量: 86 },
|
||||||
|
{ 服务类型: "注销", 数量: 35 },
|
||||||
|
],
|
||||||
|
},
|
||||||
|
abnormalRecords: [
|
||||||
|
{
|
||||||
|
time: "2023-06-20 08:25:36",
|
||||||
|
cardNo: "2023001",
|
||||||
|
location: "图书馆",
|
||||||
|
type: "重复刷卡",
|
||||||
|
status: "已处理",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
time: "2023-06-20 12:15:42",
|
||||||
|
cardNo: "2023158",
|
||||||
|
location: "食堂",
|
||||||
|
type: "余额异常",
|
||||||
|
status: "处理中",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
time: "2023-06-20 15:30:18",
|
||||||
|
cardNo: "2023286",
|
||||||
|
location: "宿舍",
|
||||||
|
type: "刷卡失败",
|
||||||
|
status: "未处理",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
time: "2023-06-20 18:45:55",
|
||||||
|
cardNo: "2023425",
|
||||||
|
location: "超市",
|
||||||
|
type: "重复消费",
|
||||||
|
status: "已处理",
|
||||||
|
},
|
||||||
|
],
|
||||||
|
};
|
||||||
|
},
|
||||||
|
methods: {
|
||||||
|
goBack() {
|
||||||
|
this.$router.push("/");
|
||||||
|
},
|
||||||
|
getAbnormalType(type) {
|
||||||
|
const types = {
|
||||||
|
重复刷卡: "warning",
|
||||||
|
余额异常: "danger",
|
||||||
|
刷卡失败: "info",
|
||||||
|
重复消费: "warning",
|
||||||
|
};
|
||||||
|
return types[type] || "info";
|
||||||
|
},
|
||||||
|
getStatusType(status) {
|
||||||
|
const types = {
|
||||||
|
已处理: "success",
|
||||||
|
处理中: "primary",
|
||||||
|
未处理: "danger",
|
||||||
|
};
|
||||||
|
return types[status] || "info";
|
||||||
|
},
|
||||||
|
},
|
||||||
|
};
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style lang="scss" scoped>
|
||||||
|
.card-detail {
|
||||||
|
padding: 20px;
|
||||||
|
background: #f0f2f5;
|
||||||
|
min-height: 100vh;
|
||||||
|
|
||||||
|
.header {
|
||||||
|
display: flex;
|
||||||
|
justify-content: space-between;
|
||||||
|
align-items: center;
|
||||||
|
margin-bottom: 20px;
|
||||||
|
|
||||||
|
.filters {
|
||||||
|
display: flex;
|
||||||
|
gap: 10px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.overview-cards {
|
||||||
|
margin-bottom: 20px;
|
||||||
|
|
||||||
|
.overview-card {
|
||||||
|
.card-content {
|
||||||
|
text-align: center;
|
||||||
|
|
||||||
|
.value {
|
||||||
|
font-size: 24px;
|
||||||
|
font-weight: bold;
|
||||||
|
color: #303133;
|
||||||
|
}
|
||||||
|
|
||||||
|
.label {
|
||||||
|
font-size: 14px;
|
||||||
|
color: #909399;
|
||||||
|
margin: 8px 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.trend {
|
||||||
|
font-size: 12px;
|
||||||
|
&.up {
|
||||||
|
color: #67c23a;
|
||||||
|
}
|
||||||
|
&.down {
|
||||||
|
color: #f56c6c;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.charts-row {
|
||||||
|
margin-bottom: 20px;
|
||||||
|
|
||||||
|
.chart-card {
|
||||||
|
height: 400px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.table-card {
|
||||||
|
margin-bottom: 20px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
|
@ -0,0 +1,235 @@
|
||||||
|
<template>
|
||||||
|
<div class="education-detail">
|
||||||
|
<div class="header">
|
||||||
|
<el-page-header @back="goBack" content="教务详情" />
|
||||||
|
<div class="filter">
|
||||||
|
<el-select v-model="selectedYear" placeholder="选择年份">
|
||||||
|
<el-option
|
||||||
|
v-for="year in years"
|
||||||
|
:key="year"
|
||||||
|
:label="year"
|
||||||
|
:value="year"
|
||||||
|
/>
|
||||||
|
</el-select>
|
||||||
|
<el-select v-model="selectedSemester" placeholder="选择学期">
|
||||||
|
<el-option
|
||||||
|
v-for="item in semesters"
|
||||||
|
:key="item.value"
|
||||||
|
:label="item.label"
|
||||||
|
:value="item.value"
|
||||||
|
/>
|
||||||
|
</el-select>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<el-row :gutter="20" class="data-overview">
|
||||||
|
<el-col :span="8" v-for="(item, index) in overviewData" :key="index">
|
||||||
|
<el-card shadow="hover">
|
||||||
|
<div class="data-item">
|
||||||
|
<div class="icon">
|
||||||
|
<i :class="item.icon"></i>
|
||||||
|
</div>
|
||||||
|
<div class="info">
|
||||||
|
<div class="value">{{ item.value }}</div>
|
||||||
|
<div class="label">{{ item.label }}</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</el-card>
|
||||||
|
</el-col>
|
||||||
|
</el-row>
|
||||||
|
|
||||||
|
<el-row :gutter="20" class="charts-container">
|
||||||
|
<el-col :span="12">
|
||||||
|
<el-card class="chart-card">
|
||||||
|
<div slot="header">
|
||||||
|
<span>课程通过率趋势</span>
|
||||||
|
</div>
|
||||||
|
<ve-line
|
||||||
|
:data="passRateData"
|
||||||
|
:settings="passRateSettings"
|
||||||
|
height="300px"
|
||||||
|
/>
|
||||||
|
</el-card>
|
||||||
|
</el-col>
|
||||||
|
<el-col :span="12">
|
||||||
|
<el-card class="chart-card">
|
||||||
|
<div slot="header">
|
||||||
|
<span>学生评教分布</span>
|
||||||
|
</div>
|
||||||
|
<ve-histogram
|
||||||
|
:data="evaluationData"
|
||||||
|
:settings="evaluationSettings"
|
||||||
|
height="300px"
|
||||||
|
/>
|
||||||
|
</el-card>
|
||||||
|
</el-col>
|
||||||
|
</el-row>
|
||||||
|
|
||||||
|
<el-card class="resource-usage">
|
||||||
|
<div slot="header">
|
||||||
|
<span>教学资源使用情况</span>
|
||||||
|
</div>
|
||||||
|
<el-table :data="resourceData" style="width: 100%">
|
||||||
|
<el-table-column prop="name" label="资源名称" />
|
||||||
|
<el-table-column prop="total" label="总量" />
|
||||||
|
<el-table-column prop="used" label="已使用" />
|
||||||
|
<el-table-column prop="usage" label="使用率">
|
||||||
|
<template slot-scope="scope">
|
||||||
|
<el-progress
|
||||||
|
:percentage="scope.row.usage"
|
||||||
|
:color="getProgressColor(scope.row.usage)"
|
||||||
|
/>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
</el-table>
|
||||||
|
</el-card>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
export default {
|
||||||
|
name: "EducationDetail",
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
selectedYear: "2024",
|
||||||
|
selectedSemester: "1",
|
||||||
|
years: ["2024", "2023", "2022", "2021"],
|
||||||
|
semesters: [
|
||||||
|
{ label: "第一学期", value: "1" },
|
||||||
|
{ label: "第二学期", value: "2" },
|
||||||
|
],
|
||||||
|
overviewData: JSON.parse(JSON.stringify([
|
||||||
|
{ label: "课程总数", value: "1,256", icon: "el-icon-reading" },
|
||||||
|
{ label: "在线课程数", value: "368", icon: "el-icon-monitor" },
|
||||||
|
{ label: "授课教师数", value: "526", icon: "el-icon-user" },
|
||||||
|
])),
|
||||||
|
passRateData: JSON.parse(JSON.stringify({
|
||||||
|
columns: ["月份", "通过率"],
|
||||||
|
rows: [
|
||||||
|
{ 月份: "1月", 通过率: 92 },
|
||||||
|
{ 月份: "2月", 通过率: 93 },
|
||||||
|
{ 月份: "3月", 通过率: 95 },
|
||||||
|
{ 月份: "4月", 通过率: 94 },
|
||||||
|
{ 月份: "5月", 通过率: 96 },
|
||||||
|
{ 月份: "6月", 通过率: 95 },
|
||||||
|
],
|
||||||
|
})),
|
||||||
|
passRateSettings: {
|
||||||
|
area: true,
|
||||||
|
yAxisName: ["通过率(%)"],
|
||||||
|
},
|
||||||
|
evaluationData: {
|
||||||
|
columns: ["分数段", "课程数"],
|
||||||
|
rows: [
|
||||||
|
{ 分数段: "90-100", 课程数: 320 },
|
||||||
|
{ 分数段: "80-89", 课程数: 580 },
|
||||||
|
{ 分数段: "70-79", 课程数: 250 },
|
||||||
|
{ 分数段: "60-69", 课程数: 80 },
|
||||||
|
{ 分数段: "60以下", 课程数: 26 },
|
||||||
|
],
|
||||||
|
},
|
||||||
|
evaluationSettings: {
|
||||||
|
yAxisName: ["课程数量"],
|
||||||
|
},
|
||||||
|
resourceData: JSON.parse(JSON.stringify([
|
||||||
|
{ name: "多媒体教室", total: 120, used: 98, usage: 82 },
|
||||||
|
{ name: "实验室", total: 45, used: 35, usage: 78 },
|
||||||
|
{ name: "在线课程平台", total: 368, used: 320, usage: 87 },
|
||||||
|
{ name: "教学软件", total: 50, used: 42, usage: 84 },
|
||||||
|
])),
|
||||||
|
};
|
||||||
|
},
|
||||||
|
created() {
|
||||||
|
this.initializeData();
|
||||||
|
},
|
||||||
|
methods: {
|
||||||
|
initializeData() {
|
||||||
|
// Add any additional initialization logic here
|
||||||
|
},
|
||||||
|
goBack() {
|
||||||
|
this.$router.push("/");
|
||||||
|
},
|
||||||
|
getProgressColor(percentage) {
|
||||||
|
if (percentage < 60) return "#F56C6C";
|
||||||
|
if (percentage < 80) return "#E6A23C";
|
||||||
|
return "#67C23A";
|
||||||
|
},
|
||||||
|
handleDataChange(newData) {
|
||||||
|
this.resourceData = JSON.parse(JSON.stringify(newData.resourceData));
|
||||||
|
this.passRateData = JSON.parse(JSON.stringify(newData.passRateData));
|
||||||
|
this.overviewData = JSON.parse(JSON.stringify(newData.overviewData));
|
||||||
|
},
|
||||||
|
},
|
||||||
|
watch: {
|
||||||
|
selectedYear() {
|
||||||
|
this.initializeData();
|
||||||
|
},
|
||||||
|
selectedSemester() {
|
||||||
|
this.initializeData();
|
||||||
|
},
|
||||||
|
},
|
||||||
|
};
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style lang="scss" scoped>
|
||||||
|
.education-detail {
|
||||||
|
padding: 20px;
|
||||||
|
background: #f0f2f5;
|
||||||
|
min-height: 100vh;
|
||||||
|
|
||||||
|
.header {
|
||||||
|
display: flex;
|
||||||
|
justify-content: space-between;
|
||||||
|
align-items: center;
|
||||||
|
margin-bottom: 20px;
|
||||||
|
|
||||||
|
.filter {
|
||||||
|
display: flex;
|
||||||
|
gap: 10px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.data-overview {
|
||||||
|
margin-bottom: 20px;
|
||||||
|
|
||||||
|
.data-item {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
|
||||||
|
.icon {
|
||||||
|
font-size: 48px;
|
||||||
|
color: #409eff;
|
||||||
|
margin-right: 20px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.info {
|
||||||
|
.value {
|
||||||
|
font-size: 24px;
|
||||||
|
font-weight: bold;
|
||||||
|
color: #303133;
|
||||||
|
}
|
||||||
|
|
||||||
|
.label {
|
||||||
|
font-size: 14px;
|
||||||
|
color: #909399;
|
||||||
|
margin-top: 5px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.charts-container {
|
||||||
|
margin-bottom: 20px;
|
||||||
|
|
||||||
|
.chart-card {
|
||||||
|
height: 400px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.resource-usage {
|
||||||
|
.el-progress {
|
||||||
|
margin-top: 8px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
|
@ -0,0 +1,272 @@
|
||||||
|
<template>
|
||||||
|
<div class="literature-detail">
|
||||||
|
<div class="header">
|
||||||
|
<el-page-header @back="goBack" content="文献详情" />
|
||||||
|
<div class="filters">
|
||||||
|
<el-select v-model="selectedYear" placeholder="选择年份">
|
||||||
|
<el-option
|
||||||
|
v-for="year in years"
|
||||||
|
:key="year"
|
||||||
|
:label="year"
|
||||||
|
:value="year"
|
||||||
|
/>
|
||||||
|
</el-select>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<el-row :gutter="20" class="overview-cards">
|
||||||
|
<el-col :span="6" v-for="(item, index) in overviewData" :key="index">
|
||||||
|
<el-card shadow="hover" class="overview-card">
|
||||||
|
<div class="card-content">
|
||||||
|
<div class="value">{{ item.value }}</div>
|
||||||
|
<div class="label">{{ item.label }}</div>
|
||||||
|
<div class="trend" :class="item.trend">
|
||||||
|
{{ item.trendValue }}%
|
||||||
|
<i
|
||||||
|
:class="item.trend === 'up' ? 'el-icon-top' : 'el-icon-bottom'"
|
||||||
|
></i>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</el-card>
|
||||||
|
</el-col>
|
||||||
|
</el-row>
|
||||||
|
|
||||||
|
<el-row :gutter="20" class="charts-row">
|
||||||
|
<el-col :span="12">
|
||||||
|
<el-card class="chart-card">
|
||||||
|
<div slot="header">
|
||||||
|
<span>馆藏资源分布</span>
|
||||||
|
</div>
|
||||||
|
<ve-pie :data="resourceData" :settings="pieSettings" height="300px" />
|
||||||
|
</el-card>
|
||||||
|
</el-col>
|
||||||
|
<el-col :span="12">
|
||||||
|
<el-card class="chart-card">
|
||||||
|
<div slot="header">
|
||||||
|
<span>借阅趋势分析</span>
|
||||||
|
</div>
|
||||||
|
<ve-line
|
||||||
|
:data="borrowingData"
|
||||||
|
:settings="lineSettings"
|
||||||
|
height="300px"
|
||||||
|
/>
|
||||||
|
</el-card>
|
||||||
|
</el-col>
|
||||||
|
</el-row>
|
||||||
|
|
||||||
|
<el-row :gutter="20" class="charts-row">
|
||||||
|
<el-col :span="12">
|
||||||
|
<el-card class="chart-card">
|
||||||
|
<div slot="header">
|
||||||
|
<span>学科分布</span>
|
||||||
|
</div>
|
||||||
|
<ve-radar :data="subjectData" height="300px" />
|
||||||
|
</el-card>
|
||||||
|
</el-col>
|
||||||
|
<el-col :span="12">
|
||||||
|
<el-card class="chart-card">
|
||||||
|
<div slot="header">
|
||||||
|
<span>数据库访问量</span>
|
||||||
|
</div>
|
||||||
|
<ve-histogram
|
||||||
|
:data="databaseData"
|
||||||
|
:settings="histogramSettings"
|
||||||
|
height="300px"
|
||||||
|
/>
|
||||||
|
</el-card>
|
||||||
|
</el-col>
|
||||||
|
</el-row>
|
||||||
|
|
||||||
|
<el-card class="table-card">
|
||||||
|
<div slot="header">
|
||||||
|
<span>热门借阅排行</span>
|
||||||
|
<el-button style="float: right" type="text">查看全部</el-button>
|
||||||
|
</div>
|
||||||
|
<el-table :data="popularBooks" style="width: 100%">
|
||||||
|
<el-table-column prop="rank" label="排名" width="80" />
|
||||||
|
<el-table-column prop="name" label="书名" />
|
||||||
|
<el-table-column prop="author" label="作者" width="150" />
|
||||||
|
<el-table-column prop="category" label="分类" width="120" />
|
||||||
|
<el-table-column prop="borrowCount" label="借阅次数" width="120" />
|
||||||
|
<el-table-column prop="status" label="状态" width="100">
|
||||||
|
<template slot-scope="scope">
|
||||||
|
<el-tag :type="getStatusType(scope.row.status)">
|
||||||
|
{{ scope.row.status }}
|
||||||
|
</el-tag>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
</el-table>
|
||||||
|
</el-card>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
export default {
|
||||||
|
name: "LiteratureDetail",
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
selectedYear: "2024",
|
||||||
|
years: ["2024", "2023", "2022", "2021"],
|
||||||
|
overviewData: [
|
||||||
|
{ label: "馆藏总量", value: "1,256,890", trend: "up", trendValue: 5 },
|
||||||
|
{ label: "电子资源量", value: "856,230", trend: "up", trendValue: 12 },
|
||||||
|
{ label: "年度借阅量", value: "286,530", trend: "up", trendValue: 8 },
|
||||||
|
{ label: "数据库数量", value: "168", trend: "up", trendValue: 3 },
|
||||||
|
],
|
||||||
|
resourceData: {
|
||||||
|
columns: ["类型", "数量"],
|
||||||
|
rows: [
|
||||||
|
{ 类型: "纸质图书", 数量: 580000 },
|
||||||
|
{ 类型: "电子图书", 数量: 420000 },
|
||||||
|
{ 类型: "期刊", 数量: 156000 },
|
||||||
|
{ 类型: "学位论文", 数量: 85000 },
|
||||||
|
{ 类型: "其他资源", 数量: 15890 },
|
||||||
|
],
|
||||||
|
},
|
||||||
|
pieSettings: {
|
||||||
|
radius: "65%",
|
||||||
|
offsetY: "60%",
|
||||||
|
},
|
||||||
|
borrowingData: {
|
||||||
|
columns: ["月份", "纸质借阅", "电子访问"],
|
||||||
|
rows: [
|
||||||
|
{ 月份: "1月", 纸质借阅: 15000, 电子访问: 45000 },
|
||||||
|
{ 月份: "2月", 纸质借阅: 18000, 电子访问: 52000 },
|
||||||
|
{ 月份: "3月", 纸质借阅: 22000, 电子访问: 58000 },
|
||||||
|
{ 月份: "4月", 纸质借阅: 25000, 电子访问: 65000 },
|
||||||
|
{ 月份: "5月", 纸质借阅: 28000, 电子访问: 72000 },
|
||||||
|
{ 月份: "6月", 纸质借阅: 30000, 电子访问: 78000 },
|
||||||
|
],
|
||||||
|
},
|
||||||
|
lineSettings: {
|
||||||
|
area: true,
|
||||||
|
},
|
||||||
|
subjectData: {
|
||||||
|
columns: ["学科", "藏书量"],
|
||||||
|
rows: [
|
||||||
|
{ 学科: "理学", 藏书量: 250000 },
|
||||||
|
{ 学科: "工学", 藏书量: 320000 },
|
||||||
|
{ 学科: "文学", 藏书量: 180000 },
|
||||||
|
{ 学科: "经管", 藏书量: 150000 },
|
||||||
|
{ 学科: "医学", 藏书量: 120000 },
|
||||||
|
{ 学科: "其他", 藏书量: 80000 },
|
||||||
|
],
|
||||||
|
},
|
||||||
|
databaseData: {
|
||||||
|
columns: ["数据库", "访问量"],
|
||||||
|
rows: [
|
||||||
|
{ 数据库: "CNKI", 访问量: 85000 },
|
||||||
|
{ 数据库: "Web of Science", 访问量: 52000 },
|
||||||
|
{ 数据库: "ScienceDirect", 访问量: 48000 },
|
||||||
|
{ 数据库: "Springer", 访问量: 35000 },
|
||||||
|
{ 数据库: "IEEE", 访问量: 32000 },
|
||||||
|
],
|
||||||
|
},
|
||||||
|
histogramSettings: {
|
||||||
|
metrics: ["访问量"],
|
||||||
|
},
|
||||||
|
popularBooks: [
|
||||||
|
{
|
||||||
|
rank: 1,
|
||||||
|
name: "人工智能导论",
|
||||||
|
author: "李明",
|
||||||
|
category: "计算机",
|
||||||
|
borrowCount: 256,
|
||||||
|
status: "可借",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
rank: 2,
|
||||||
|
name: "高等数学",
|
||||||
|
author: "张三",
|
||||||
|
category: "数学",
|
||||||
|
borrowCount: 235,
|
||||||
|
status: "已借出",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
rank: 3,
|
||||||
|
name: "经济学原理",
|
||||||
|
author: "王五",
|
||||||
|
category: "经济",
|
||||||
|
borrowCount: 198,
|
||||||
|
status: "可借",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
rank: 4,
|
||||||
|
name: "大学物理",
|
||||||
|
author: "刘六",
|
||||||
|
category: "物理",
|
||||||
|
borrowCount: 186,
|
||||||
|
status: "已借出",
|
||||||
|
},
|
||||||
|
],
|
||||||
|
};
|
||||||
|
},
|
||||||
|
methods: {
|
||||||
|
goBack() {
|
||||||
|
this.$router.push("/");
|
||||||
|
},
|
||||||
|
getStatusType(status) {
|
||||||
|
return status === "可借" ? "success" : "warning";
|
||||||
|
},
|
||||||
|
},
|
||||||
|
};
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style lang="scss" scoped>
|
||||||
|
.literature-detail {
|
||||||
|
padding: 20px;
|
||||||
|
background: #f0f2f5;
|
||||||
|
min-height: 100vh;
|
||||||
|
|
||||||
|
.header {
|
||||||
|
display: flex;
|
||||||
|
justify-content: space-between;
|
||||||
|
align-items: center;
|
||||||
|
margin-bottom: 20px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.overview-cards {
|
||||||
|
margin-bottom: 20px;
|
||||||
|
|
||||||
|
.overview-card {
|
||||||
|
.card-content {
|
||||||
|
text-align: center;
|
||||||
|
|
||||||
|
.value {
|
||||||
|
font-size: 24px;
|
||||||
|
font-weight: bold;
|
||||||
|
color: #303133;
|
||||||
|
}
|
||||||
|
|
||||||
|
.label {
|
||||||
|
font-size: 14px;
|
||||||
|
color: #909399;
|
||||||
|
margin: 8px 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.trend {
|
||||||
|
font-size: 12px;
|
||||||
|
&.up {
|
||||||
|
color: #67c23a;
|
||||||
|
}
|
||||||
|
&.down {
|
||||||
|
color: #f56c6c;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.charts-row {
|
||||||
|
margin-bottom: 20px;
|
||||||
|
|
||||||
|
.chart-card {
|
||||||
|
height: 400px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.table-card {
|
||||||
|
margin-bottom: 20px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
|
@ -0,0 +1,228 @@
|
||||||
|
<template>
|
||||||
|
<div class="research-detail">
|
||||||
|
<div class="header">
|
||||||
|
<el-page-header @back="goBack" content="科研详情" />
|
||||||
|
<el-select v-model="selectedYear" placeholder="选择年份">
|
||||||
|
<el-option
|
||||||
|
v-for="year in years"
|
||||||
|
:key="year"
|
||||||
|
:label="year"
|
||||||
|
:value="year"
|
||||||
|
/>
|
||||||
|
</el-select>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<el-row :gutter="20" class="statistics">
|
||||||
|
<el-col :span="6" v-for="(item, index) in statisticsData" :key="index">
|
||||||
|
<el-card shadow="hover" class="stat-card">
|
||||||
|
<div class="stat-content">
|
||||||
|
<div class="value">{{ item.value }}</div>
|
||||||
|
<div class="label">{{ item.label }}</div>
|
||||||
|
<div class="trend" :class="item.trend">
|
||||||
|
{{ item.trendValue }}%
|
||||||
|
<i
|
||||||
|
:class="item.trend === 'up' ? 'el-icon-top' : 'el-icon-bottom'"
|
||||||
|
></i>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</el-card>
|
||||||
|
</el-col>
|
||||||
|
</el-row>
|
||||||
|
|
||||||
|
<el-row :gutter="20" class="charts">
|
||||||
|
<el-col :span="12">
|
||||||
|
<el-card class="chart-card">
|
||||||
|
<div slot="header">
|
||||||
|
<span>项目经费分布</span>
|
||||||
|
</div>
|
||||||
|
<ve-pie :data="fundingData" :settings="pieSettings" height="300px" />
|
||||||
|
</el-card>
|
||||||
|
</el-col>
|
||||||
|
<el-col :span="12">
|
||||||
|
<el-card class="chart-card">
|
||||||
|
<div slot="header">
|
||||||
|
<span>成果发表趋势</span>
|
||||||
|
</div>
|
||||||
|
<ve-line
|
||||||
|
:data="publicationData"
|
||||||
|
:settings="lineSettings"
|
||||||
|
height="300px"
|
||||||
|
/>
|
||||||
|
</el-card>
|
||||||
|
</el-col>
|
||||||
|
</el-row>
|
||||||
|
|
||||||
|
<el-card class="project-list">
|
||||||
|
<div slot="header">
|
||||||
|
<span>重点项目进展</span>
|
||||||
|
<el-button style="float: right" type="text">查看全部</el-button>
|
||||||
|
</div>
|
||||||
|
<el-table :data="projectData" style="width: 100%">
|
||||||
|
<el-table-column prop="name" label="项目名称" />
|
||||||
|
<el-table-column prop="leader" label="负责人" width="120" />
|
||||||
|
<el-table-column prop="funding" label="经费(万)" width="120" />
|
||||||
|
<el-table-column prop="status" label="状态" width="120">
|
||||||
|
<template slot-scope="scope">
|
||||||
|
<el-tag :type="getStatusType(scope.row.status)">
|
||||||
|
{{ scope.row.status }}
|
||||||
|
</el-tag>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column prop="progress" label="进度" width="180">
|
||||||
|
<template slot-scope="scope">
|
||||||
|
<el-progress :percentage="scope.row.progress" />
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
</el-table>
|
||||||
|
</el-card>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
export default {
|
||||||
|
name: "ResearchDetail",
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
selectedYear: "2024",
|
||||||
|
years: ["2024", "2023", "2022", "2021"],
|
||||||
|
statisticsData: [
|
||||||
|
{ label: "项目总数", value: "186", trend: "up", trendValue: 15 },
|
||||||
|
{ label: "发表论文", value: "253", trend: "up", trendValue: 8 },
|
||||||
|
{ label: "授权专利", value: "68", trend: "up", trendValue: 12 },
|
||||||
|
{ label: "科研经费(万)", value: "2,860", trend: "up", trendValue: 20 },
|
||||||
|
],
|
||||||
|
fundingData: {
|
||||||
|
columns: ["类型", "金额"],
|
||||||
|
rows: [
|
||||||
|
{ 类型: "国家级", 金额: 1200 },
|
||||||
|
{ 类型: "省部级", 金额: 800 },
|
||||||
|
{ 类型: "横向项目", 金额: 600 },
|
||||||
|
{ 类型: "其他", 金额: 260 },
|
||||||
|
],
|
||||||
|
},
|
||||||
|
pieSettings: {
|
||||||
|
radius: "65%",
|
||||||
|
offsetY: "60%",
|
||||||
|
},
|
||||||
|
publicationData: {
|
||||||
|
columns: ["月份", "SCI论文", "EI论文", "核心期刊"],
|
||||||
|
rows: [
|
||||||
|
{ 月份: "1月", SCI论文: 8, EI论文: 12, 核心期刊: 15 },
|
||||||
|
{ 月份: "2月", SCI论文: 10, EI论文: 15, 核心期刊: 18 },
|
||||||
|
{ 月份: "3月", SCI论文: 12, EI论文: 18, 核心期刊: 20 },
|
||||||
|
{ 月份: "4月", SCI论文: 15, EI论文: 20, 核心期刊: 25 },
|
||||||
|
{ 月份: "5月", SCI论文: 18, EI论文: 23, 核心期刊: 28 },
|
||||||
|
{ 月份: "6月", SCI论文: 20, EI论文: 25, 核心期刊: 30 },
|
||||||
|
],
|
||||||
|
},
|
||||||
|
lineSettings: {
|
||||||
|
stack: { 类型: ["SCI论文", "EI论文", "核心期刊"] },
|
||||||
|
},
|
||||||
|
projectData: [
|
||||||
|
{
|
||||||
|
name: "人工智能基础理论研究",
|
||||||
|
leader: "张三",
|
||||||
|
funding: 500,
|
||||||
|
status: "进行中",
|
||||||
|
progress: 65,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "新能源材料开发",
|
||||||
|
leader: "李四",
|
||||||
|
funding: 300,
|
||||||
|
status: "已完成",
|
||||||
|
progress: 100,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "智慧校园建设",
|
||||||
|
leader: "王五",
|
||||||
|
funding: 200,
|
||||||
|
status: "待启动",
|
||||||
|
progress: 0,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "生物医药研发",
|
||||||
|
leader: "赵六",
|
||||||
|
funding: 400,
|
||||||
|
status: "进行中",
|
||||||
|
progress: 45,
|
||||||
|
},
|
||||||
|
],
|
||||||
|
};
|
||||||
|
},
|
||||||
|
methods: {
|
||||||
|
goBack() {
|
||||||
|
this.$router.push("/");
|
||||||
|
},
|
||||||
|
getStatusType(status) {
|
||||||
|
const types = {
|
||||||
|
进行中: "primary",
|
||||||
|
已完成: "success",
|
||||||
|
待启动: "info",
|
||||||
|
};
|
||||||
|
return types[status] || "info";
|
||||||
|
},
|
||||||
|
},
|
||||||
|
};
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style lang="scss" scoped>
|
||||||
|
.research-detail {
|
||||||
|
padding: 20px;
|
||||||
|
background: #f0f2f5;
|
||||||
|
min-height: 100vh;
|
||||||
|
|
||||||
|
.header {
|
||||||
|
display: flex;
|
||||||
|
justify-content: space-between;
|
||||||
|
align-items: center;
|
||||||
|
margin-bottom: 20px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.statistics {
|
||||||
|
margin-bottom: 20px;
|
||||||
|
|
||||||
|
.stat-card {
|
||||||
|
.stat-content {
|
||||||
|
text-align: center;
|
||||||
|
|
||||||
|
.value {
|
||||||
|
font-size: 24px;
|
||||||
|
font-weight: bold;
|
||||||
|
color: #303133;
|
||||||
|
}
|
||||||
|
|
||||||
|
.label {
|
||||||
|
font-size: 14px;
|
||||||
|
color: #909399;
|
||||||
|
margin: 8px 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.trend {
|
||||||
|
font-size: 12px;
|
||||||
|
&.up {
|
||||||
|
color: #67c23a;
|
||||||
|
}
|
||||||
|
&.down {
|
||||||
|
color: #f56c6c;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.charts {
|
||||||
|
margin-bottom: 20px;
|
||||||
|
|
||||||
|
.chart-card {
|
||||||
|
height: 400px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.project-list {
|
||||||
|
.el-table {
|
||||||
|
margin-top: 15px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
|
@ -0,0 +1,274 @@
|
||||||
|
<template>
|
||||||
|
<div class="staff-detail">
|
||||||
|
<div class="header">
|
||||||
|
<el-page-header @back="goBack" content="教职工详情" />
|
||||||
|
<div class="filters">
|
||||||
|
<el-select v-model="selectedYear" placeholder="选择年份">
|
||||||
|
<el-option
|
||||||
|
v-for="year in years"
|
||||||
|
:key="year"
|
||||||
|
:label="year"
|
||||||
|
:value="year"
|
||||||
|
/>
|
||||||
|
</el-select>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<el-row :gutter="20" class="overview-cards">
|
||||||
|
<el-col :span="6" v-for="(item, index) in overviewData" :key="index">
|
||||||
|
<el-card shadow="hover" class="overview-card">
|
||||||
|
<div class="card-content">
|
||||||
|
<div class="value">{{ item.value }}</div>
|
||||||
|
<div class="label">{{ item.label }}</div>
|
||||||
|
<div class="trend" :class="item.trend">
|
||||||
|
{{ item.trendValue }}%
|
||||||
|
<i
|
||||||
|
:class="item.trend === 'up' ? 'el-icon-top' : 'el-icon-bottom'"
|
||||||
|
></i>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</el-card>
|
||||||
|
</el-col>
|
||||||
|
</el-row>
|
||||||
|
|
||||||
|
<el-row :gutter="20" class="charts-row">
|
||||||
|
<el-col :span="12">
|
||||||
|
<el-card class="chart-card">
|
||||||
|
<div slot="header">
|
||||||
|
<span>职称分布</span>
|
||||||
|
</div>
|
||||||
|
<ve-pie :data="titleData" :settings="pieSettings" height="300px" />
|
||||||
|
</el-card>
|
||||||
|
</el-col>
|
||||||
|
<el-col :span="12">
|
||||||
|
<el-card class="chart-card">
|
||||||
|
<div slot="header">
|
||||||
|
<span>学历结构</span>
|
||||||
|
</div>
|
||||||
|
<ve-ring
|
||||||
|
:data="educationData"
|
||||||
|
:settings="ringSettings"
|
||||||
|
height="300px"
|
||||||
|
/>
|
||||||
|
</el-card>
|
||||||
|
</el-col>
|
||||||
|
</el-row>
|
||||||
|
|
||||||
|
<el-row :gutter="20" class="charts-row">
|
||||||
|
<el-col :span="12">
|
||||||
|
<el-card class="chart-card">
|
||||||
|
<div slot="header">
|
||||||
|
<span>人员变动趋势</span>
|
||||||
|
</div>
|
||||||
|
<ve-line
|
||||||
|
:data="staffChangeData"
|
||||||
|
:settings="lineSettings"
|
||||||
|
height="300px"
|
||||||
|
/>
|
||||||
|
</el-card>
|
||||||
|
</el-col>
|
||||||
|
<el-col :span="12">
|
||||||
|
<el-card class="chart-card">
|
||||||
|
<div slot="header">
|
||||||
|
<span>绩效考核分布</span>
|
||||||
|
</div>
|
||||||
|
<ve-histogram :data="performanceData" height="300px" />
|
||||||
|
</el-card>
|
||||||
|
</el-col>
|
||||||
|
</el-row>
|
||||||
|
|
||||||
|
<el-card class="table-card">
|
||||||
|
<div slot="header">
|
||||||
|
<span>招聘进度</span>
|
||||||
|
</div>
|
||||||
|
<el-table :data="recruitmentData" style="width: 100%">
|
||||||
|
<el-table-column prop="position" label="岗位" />
|
||||||
|
<el-table-column prop="department" label="部门" />
|
||||||
|
<el-table-column prop="candidates" label="应聘人数" width="100" />
|
||||||
|
<el-table-column prop="status" label="状态" width="100">
|
||||||
|
<template slot-scope="scope">
|
||||||
|
<el-tag :type="getStatusType(scope.row.status)">
|
||||||
|
{{ scope.row.status }}
|
||||||
|
</el-tag>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column prop="progress" label="进度" width="180">
|
||||||
|
<template slot-scope="scope">
|
||||||
|
<el-progress :percentage="scope.row.progress" />
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
</el-table>
|
||||||
|
</el-card>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
export default {
|
||||||
|
name: "StaffDetail",
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
selectedYear: "2024",
|
||||||
|
years: ["2024", "2023", "2022", "2021"],
|
||||||
|
overviewData: [
|
||||||
|
{ label: "教职工总数", value: "1,256", trend: "up", trendValue: 5 },
|
||||||
|
{ label: "新入职人数", value: "86", trend: "up", trendValue: 15 },
|
||||||
|
{ label: "离职人数", value: "32", trend: "down", trendValue: 8 },
|
||||||
|
{ label: "在招岗位", value: "25", trend: "up", trendValue: 20 },
|
||||||
|
],
|
||||||
|
titleData: {
|
||||||
|
columns: ["职称", "人数"],
|
||||||
|
rows: [
|
||||||
|
{ 职称: "正高级", 人数: 180 },
|
||||||
|
{ 职称: "副高级", 人数: 320 },
|
||||||
|
{ 职称: "中级", 人数: 450 },
|
||||||
|
{ 职称: "初级", 人数: 306 },
|
||||||
|
],
|
||||||
|
},
|
||||||
|
pieSettings: {
|
||||||
|
radius: "65%",
|
||||||
|
offsetY: "60%",
|
||||||
|
},
|
||||||
|
educationData: {
|
||||||
|
columns: ["学历", "人数"],
|
||||||
|
rows: [
|
||||||
|
{ 学历: "博士", 人数: 420 },
|
||||||
|
{ 学历: "硕士", 人数: 580 },
|
||||||
|
{ 学历: "本科", 人数: 236 },
|
||||||
|
{ 学历: "其他", 人数: 20 },
|
||||||
|
],
|
||||||
|
},
|
||||||
|
ringSettings: {
|
||||||
|
radius: ["40%", "65%"],
|
||||||
|
offsetY: "60%",
|
||||||
|
},
|
||||||
|
staffChangeData: {
|
||||||
|
columns: ["月份", "入职人数", "离职人数"],
|
||||||
|
rows: [
|
||||||
|
{ 月份: "1月", 入职人数: 15, 离职人数: 5 },
|
||||||
|
{ 月份: "2月", 入职人数: 12, 离职人数: 4 },
|
||||||
|
{ 月份: "3月", 入职人数: 18, 离职人数: 6 },
|
||||||
|
{ 月份: "4月", 入职人数: 20, 离职人数: 8 },
|
||||||
|
{ 月份: "5月", 入职人数: 16, 离职人数: 5 },
|
||||||
|
{ 月份: "6月", 入职人数: 14, 离职人数: 4 },
|
||||||
|
],
|
||||||
|
},
|
||||||
|
lineSettings: {
|
||||||
|
area: true,
|
||||||
|
},
|
||||||
|
performanceData: {
|
||||||
|
columns: ["等级", "人数"],
|
||||||
|
rows: [
|
||||||
|
{ 等级: "A", 人数: 320 },
|
||||||
|
{ 等级: "B", 人数: 520 },
|
||||||
|
{ 等级: "C", 人数: 280 },
|
||||||
|
{ 等级: "D", 人数: 120 },
|
||||||
|
{ 等级: "E", 人数: 16 },
|
||||||
|
],
|
||||||
|
},
|
||||||
|
recruitmentData: [
|
||||||
|
{
|
||||||
|
position: "教授",
|
||||||
|
department: "计算机学院",
|
||||||
|
candidates: 25,
|
||||||
|
status: "面试中",
|
||||||
|
progress: 60,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
position: "副教授",
|
||||||
|
department: "经管学院",
|
||||||
|
candidates: 18,
|
||||||
|
status: "筛选中",
|
||||||
|
progress: 30,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
position: "讲师",
|
||||||
|
department: "外语学院",
|
||||||
|
candidates: 35,
|
||||||
|
status: "已完成",
|
||||||
|
progress: 100,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
position: "实验员",
|
||||||
|
department: "物理学院",
|
||||||
|
candidates: 12,
|
||||||
|
status: "待面试",
|
||||||
|
progress: 20,
|
||||||
|
},
|
||||||
|
],
|
||||||
|
};
|
||||||
|
},
|
||||||
|
methods: {
|
||||||
|
goBack() {
|
||||||
|
this.$router.push("/");
|
||||||
|
},
|
||||||
|
getStatusType(status) {
|
||||||
|
const types = {
|
||||||
|
面试中: "primary",
|
||||||
|
筛选中: "warning",
|
||||||
|
已完成: "success",
|
||||||
|
待面试: "info",
|
||||||
|
};
|
||||||
|
return types[status] || "info";
|
||||||
|
},
|
||||||
|
},
|
||||||
|
};
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style lang="scss" scoped>
|
||||||
|
.staff-detail {
|
||||||
|
padding: 20px;
|
||||||
|
background: #f0f2f5;
|
||||||
|
min-height: 100vh;
|
||||||
|
|
||||||
|
.header {
|
||||||
|
display: flex;
|
||||||
|
justify-content: space-between;
|
||||||
|
align-items: center;
|
||||||
|
margin-bottom: 20px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.overview-cards {
|
||||||
|
margin-bottom: 20px;
|
||||||
|
|
||||||
|
.overview-card {
|
||||||
|
.card-content {
|
||||||
|
text-align: center;
|
||||||
|
|
||||||
|
.value {
|
||||||
|
font-size: 24px;
|
||||||
|
font-weight: bold;
|
||||||
|
color: #303133;
|
||||||
|
}
|
||||||
|
|
||||||
|
.label {
|
||||||
|
font-size: 14px;
|
||||||
|
color: #909399;
|
||||||
|
margin: 8px 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.trend {
|
||||||
|
font-size: 12px;
|
||||||
|
&.up {
|
||||||
|
color: #67c23a;
|
||||||
|
}
|
||||||
|
&.down {
|
||||||
|
color: #f56c6c;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.charts-row {
|
||||||
|
margin-bottom: 20px;
|
||||||
|
|
||||||
|
.chart-card {
|
||||||
|
height: 400px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.table-card {
|
||||||
|
margin-bottom: 20px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
|
@ -0,0 +1,262 @@
|
||||||
|
<template>
|
||||||
|
<div class="student-detail">
|
||||||
|
<div class="header">
|
||||||
|
<el-page-header @back="goBack" content="学生详情" />
|
||||||
|
<div class="filters">
|
||||||
|
<el-select v-model="selectedYear" placeholder="选择年份">
|
||||||
|
<el-option
|
||||||
|
v-for="year in years"
|
||||||
|
:key="year"
|
||||||
|
:label="year"
|
||||||
|
:value="year"
|
||||||
|
/>
|
||||||
|
</el-select>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<el-row :gutter="20" class="overview-cards">
|
||||||
|
<el-col :span="8" v-for="(item, index) in overviewData" :key="index">
|
||||||
|
<el-card shadow="hover" class="overview-card">
|
||||||
|
<div class="card-content">
|
||||||
|
<i :class="item.icon"></i>
|
||||||
|
<div class="info">
|
||||||
|
<div class="value">{{ item.value }}</div>
|
||||||
|
<div class="label">{{ item.label }}</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</el-card>
|
||||||
|
</el-col>
|
||||||
|
</el-row>
|
||||||
|
|
||||||
|
<el-row :gutter="20" class="charts-row">
|
||||||
|
<el-col :span="12">
|
||||||
|
<el-card class="chart-card">
|
||||||
|
<div slot="header">
|
||||||
|
<span>各年级学生分布</span>
|
||||||
|
</div>
|
||||||
|
<ve-pie :data="gradeData" :settings="pieSettings" height="300px" />
|
||||||
|
</el-card>
|
||||||
|
</el-col>
|
||||||
|
<el-col :span="12">
|
||||||
|
<el-card class="chart-card">
|
||||||
|
<div slot="header">
|
||||||
|
<span>学生活动参与情况</span>
|
||||||
|
</div>
|
||||||
|
<ve-histogram
|
||||||
|
:data="activityData"
|
||||||
|
:settings="histogramSettings"
|
||||||
|
height="300px"
|
||||||
|
/>
|
||||||
|
</el-card>
|
||||||
|
</el-col>
|
||||||
|
</el-row>
|
||||||
|
|
||||||
|
<el-row :gutter="20" class="charts-row">
|
||||||
|
<el-col :span="12">
|
||||||
|
<el-card class="chart-card">
|
||||||
|
<div slot="header">
|
||||||
|
<span>心理咨询预约趋势</span>
|
||||||
|
</div>
|
||||||
|
<ve-line
|
||||||
|
:data="counselingData"
|
||||||
|
:settings="lineSettings"
|
||||||
|
height="300px"
|
||||||
|
/>
|
||||||
|
</el-card>
|
||||||
|
</el-col>
|
||||||
|
<el-col :span="12">
|
||||||
|
<el-card class="chart-card">
|
||||||
|
<div slot="header">
|
||||||
|
<span>社团活动分布</span>
|
||||||
|
</div>
|
||||||
|
<ve-radar :data="clubData" height="300px" />
|
||||||
|
</el-card>
|
||||||
|
</el-col>
|
||||||
|
</el-row>
|
||||||
|
|
||||||
|
<el-card class="table-card">
|
||||||
|
<div slot="header">
|
||||||
|
<span>学生活动记录</span>
|
||||||
|
<el-button style="float: right" type="text">查看全部</el-button>
|
||||||
|
</div>
|
||||||
|
<el-table :data="activityRecords" style="width: 100%">
|
||||||
|
<el-table-column prop="name" label="活动名称" />
|
||||||
|
<el-table-column prop="type" label="类型" width="120" />
|
||||||
|
<el-table-column prop="date" label="日期" width="120" />
|
||||||
|
<el-table-column prop="participants" label="参与人数" width="120" />
|
||||||
|
<el-table-column prop="status" label="状态" width="100">
|
||||||
|
<template slot-scope="scope">
|
||||||
|
<el-tag :type="getStatusType(scope.row.status)">
|
||||||
|
{{ scope.row.status }}
|
||||||
|
</el-tag>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
</el-table>
|
||||||
|
</el-card>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
export default {
|
||||||
|
name: "StudentDetail",
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
selectedYear: "2024",
|
||||||
|
years: ["2024", "2023", "2022", "2021"],
|
||||||
|
overviewData: [
|
||||||
|
{ label: "在校生总数", value: "25,368", icon: "el-icon-user" },
|
||||||
|
{ label: "参与社团人数", value: "15,623", icon: "el-icon-connection" },
|
||||||
|
{ label: "志愿服务时长", value: "125,890h", icon: "el-icon-time" },
|
||||||
|
],
|
||||||
|
gradeData: {
|
||||||
|
columns: ["年级", "人数"],
|
||||||
|
rows: [
|
||||||
|
{ 年级: "大一", 人数: 6500 },
|
||||||
|
{ 年级: "大二", 人数: 6200 },
|
||||||
|
{ 年级: "大三", 人数: 5800 },
|
||||||
|
{ 年级: "大四", 人数: 5400 },
|
||||||
|
{ 年级: "研究生", 人数: 1468 },
|
||||||
|
],
|
||||||
|
},
|
||||||
|
pieSettings: {
|
||||||
|
radius: "65%",
|
||||||
|
offsetY: "60%",
|
||||||
|
},
|
||||||
|
activityData: {
|
||||||
|
columns: ["月份", "文体活动", "学术活动", "志愿服务"],
|
||||||
|
rows: [
|
||||||
|
{ 月份: "1月", 文体活动: 20, 学术活动: 15, 志愿服务: 25 },
|
||||||
|
{ 月份: "2月", 文体活动: 25, 学术活动: 20, 志愿服务: 30 },
|
||||||
|
{ 月份: "3月", 文体活动: 35, 学术活动: 25, 志愿服务: 35 },
|
||||||
|
{ 月份: "4月", 文体活动: 45, 学术活动: 30, 志愿服务: 40 },
|
||||||
|
{ 月份: "5月", 文体活动: 50, 学术活动: 35, 志愿服务: 45 },
|
||||||
|
{ 月份: "6月", 文体活动: 40, 学术活动: 30, 志愿服务: 35 },
|
||||||
|
],
|
||||||
|
},
|
||||||
|
histogramSettings: {
|
||||||
|
stack: { 类型: ["文体活动", "学术活动", "志愿服务"] },
|
||||||
|
},
|
||||||
|
counselingData: {
|
||||||
|
columns: ["月份", "预约人次", "实际咨询"],
|
||||||
|
rows: [
|
||||||
|
{ 月份: "1月", 预约人次: 120, 实际咨询: 100 },
|
||||||
|
{ 月份: "2月", 预约人次: 140, 实际咨询: 115 },
|
||||||
|
{ 月份: "3月", 预约人次: 160, 实际咨询: 130 },
|
||||||
|
{ 月份: "4月", 预约人次: 180, 实际咨询: 150 },
|
||||||
|
{ 月份: "5月", 预约人次: 200, 实际咨询: 170 },
|
||||||
|
{ 月份: "6月", 预约人次: 220, 实际咨询: 190 },
|
||||||
|
],
|
||||||
|
},
|
||||||
|
lineSettings: {
|
||||||
|
area: true,
|
||||||
|
},
|
||||||
|
clubData: {
|
||||||
|
columns: ["类型", "人数"],
|
||||||
|
rows: [
|
||||||
|
{ 类型: "文学社", 人数: 2500 },
|
||||||
|
{ 类型: "体育类", 人数: 3500 },
|
||||||
|
{ 类型: "科技类", 人数: 3000 },
|
||||||
|
{ 类型: "艺术类", 人数: 2800 },
|
||||||
|
{ 类型: "公益类", 人数: 2600 },
|
||||||
|
],
|
||||||
|
},
|
||||||
|
activityRecords: [
|
||||||
|
{
|
||||||
|
name: "校园文化节",
|
||||||
|
type: "文化活动",
|
||||||
|
date: "2023-05-20",
|
||||||
|
participants: 1200,
|
||||||
|
status: "已完成",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "科技创新大赛",
|
||||||
|
type: "学术活动",
|
||||||
|
date: "2023-05-15",
|
||||||
|
participants: 500,
|
||||||
|
status: "进行中",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "志愿者服务日",
|
||||||
|
type: "志愿活动",
|
||||||
|
date: "2023-05-10",
|
||||||
|
participants: 800,
|
||||||
|
status: "已完成",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "心理健康讲座",
|
||||||
|
type: "讲座活动",
|
||||||
|
date: "2023-05-05",
|
||||||
|
participants: 300,
|
||||||
|
status: "已完成",
|
||||||
|
},
|
||||||
|
],
|
||||||
|
};
|
||||||
|
},
|
||||||
|
methods: {
|
||||||
|
goBack() {
|
||||||
|
this.$router.push("/");
|
||||||
|
},
|
||||||
|
getStatusType(status) {
|
||||||
|
return status === "进行中" ? "primary" : "success";
|
||||||
|
},
|
||||||
|
},
|
||||||
|
};
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style lang="scss" scoped>
|
||||||
|
.student-detail {
|
||||||
|
padding: 20px;
|
||||||
|
background: #f0f2f5;
|
||||||
|
min-height: 100vh;
|
||||||
|
|
||||||
|
.header {
|
||||||
|
display: flex;
|
||||||
|
justify-content: space-between;
|
||||||
|
align-items: center;
|
||||||
|
margin-bottom: 20px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.overview-cards {
|
||||||
|
margin-bottom: 20px;
|
||||||
|
|
||||||
|
.overview-card {
|
||||||
|
.card-content {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
|
||||||
|
i {
|
||||||
|
font-size: 48px;
|
||||||
|
color: #409eff;
|
||||||
|
margin-right: 20px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.info {
|
||||||
|
.value {
|
||||||
|
font-size: 24px;
|
||||||
|
font-weight: bold;
|
||||||
|
color: #303133;
|
||||||
|
}
|
||||||
|
|
||||||
|
.label {
|
||||||
|
font-size: 14px;
|
||||||
|
color: #909399;
|
||||||
|
margin-top: 5px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.charts-row {
|
||||||
|
margin-bottom: 20px;
|
||||||
|
|
||||||
|
.chart-card {
|
||||||
|
height: 400px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.table-card {
|
||||||
|
margin-bottom: 20px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
|
@ -3,82 +3,209 @@
|
||||||
<div class="bg">
|
<div class="bg">
|
||||||
<dv-loading v-if="loading">Loading...</dv-loading>
|
<dv-loading v-if="loading">Loading...</dv-loading>
|
||||||
<div v-else class="host-body">
|
<div v-else class="host-body">
|
||||||
|
<!-- 顶部标题部分 -->
|
||||||
<div class="d-flex jc-center">
|
<div class="d-flex jc-center">
|
||||||
<dv-decoration-10 class="dv-dec-10" />
|
<dv-decoration-10 class="dv-dec-10" />
|
||||||
<div class="d-flex jc-center">
|
<div class="d-flex jc-center">
|
||||||
<dv-decoration-8 class="dv-dec-8" :color="decorationColor" />
|
<dv-decoration-8 class="dv-dec-8" :color="decorationColor" />
|
||||||
<div class="title">
|
<div class="title">
|
||||||
<span class="title-text">唐山师范学校数据中台</span>
|
<div class="title-part">
|
||||||
<dv-decoration-6 class="dv-dec-6" :reverse="true" :color="['#50e3c2', '#67a1e5']" />
|
<img src="@/assets/logo.png" alt="icon" class="logo" />
|
||||||
|
<span class="title-text">智慧校园</span>
|
||||||
|
</div>
|
||||||
|
<dv-decoration-6
|
||||||
|
class="dv-dec-6"
|
||||||
|
:reverse="true"
|
||||||
|
:color="['#50e3c2', '#67a1e5']"
|
||||||
|
/>
|
||||||
</div>
|
</div>
|
||||||
<dv-decoration-8 class="dv-dec-8" :reverse="true" :color="decorationColor" />
|
<dv-decoration-8
|
||||||
|
class="dv-dec-8"
|
||||||
|
:reverse="true"
|
||||||
|
:color="decorationColor"
|
||||||
|
/>
|
||||||
</div>
|
</div>
|
||||||
<dv-decoration-10 class="dv-dec-10-s" />
|
<dv-decoration-10 class="dv-dec-10-s" />
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<!-- 第二行 -->
|
<!-- 学校概况信息卡片 -->
|
||||||
<div class="d-flex jc-between px-2">
|
<div class="school-info-cards">
|
||||||
<div class="d-flex aside-width">
|
<div class="info-card">
|
||||||
<div class="react-left ml-4 react-l-s">
|
<i class="el-icon-school"></i>
|
||||||
<span class="react-left"></span>
|
<div class="info-content">
|
||||||
<span class="text">数据分析1</span>
|
<div class="main-info">
|
||||||
</div>
|
<div class="info-label">在校生总数</div>
|
||||||
<div class="react-left ml-3">
|
<div class="info-value">
|
||||||
<span class="text">数据分析2</span>
|
{{ formatNumber(schoolData.totalStudents) }}<b>人</b>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="sub-info-container">
|
||||||
|
<div class="sub-info">
|
||||||
|
本科生 {{ formatNumber(schoolData.undergrads) }}人
|
||||||
|
</div>
|
||||||
|
<div class="sub-info">
|
||||||
|
研究生 {{ formatNumber(schoolData.graduates) }}人
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="d-flex aside-width">
|
<div class="info-card">
|
||||||
<div class="react-right bg-color-blue mr-3">
|
<i class="el-icon-user"></i>
|
||||||
<span class="text">数据分析1</span>
|
<div class="info-content">
|
||||||
|
<div class="main-info">
|
||||||
|
<div class="info-label">教职工总数</div>
|
||||||
|
<div class="info-value">
|
||||||
|
{{ formatNumber(schoolData.totalStaff) }}<b>人</b>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="sub-info-container">
|
||||||
|
<div class="sub-info">
|
||||||
|
专任教师 {{ formatNumber(schoolData.teachers) }}人
|
||||||
|
</div>
|
||||||
|
<div class="sub-info">
|
||||||
|
博士学位 {{ formatNumber(schoolData.doctors) }}人
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="react-right mr-4 react-l-s">
|
</div>
|
||||||
<span class="react-after"></span>
|
<div class="info-card">
|
||||||
<span class="text">{{ dateYear }} {{ dateWeek }} {{ dateDay }}</span>
|
<i class="el-icon-notebook-2"></i>
|
||||||
|
<div class="info-content">
|
||||||
|
<div class="main-info">
|
||||||
|
<div class="info-label">本科专业数</div>
|
||||||
|
<div class="info-value">{{ schoolData.majors }}<b>个</b></div>
|
||||||
|
</div>
|
||||||
|
<div class="sub-info-container">
|
||||||
|
<div class="sub-info">
|
||||||
|
硕士点 {{ schoolData.masterPrograms }}个
|
||||||
|
</div>
|
||||||
|
<div class="sub-info">
|
||||||
|
重点学科 {{ schoolData.keyDisciplines }}个
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="info-card">
|
||||||
|
<i class="el-icon-office-building"></i>
|
||||||
|
<div class="info-content">
|
||||||
|
<div class="main-info">
|
||||||
|
<div class="info-label">校园面积</div>
|
||||||
|
<div class="info-value">
|
||||||
|
{{ formatNumber(schoolData.campusArea) }}<b>亩</b>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="sub-info-container">
|
||||||
|
<div class="sub-info">
|
||||||
|
建筑 {{ schoolData.buildingArea }}万㎡
|
||||||
|
</div>
|
||||||
|
<div class="sub-info">实验室 {{ schoolData.labs }}个</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="info-card">
|
||||||
|
<i class="el-icon-reading"></i>
|
||||||
|
<div class="info-content">
|
||||||
|
<div class="main-info">
|
||||||
|
<div class="info-label">图书馆藏</div>
|
||||||
|
<div class="info-value">{{ schoolData.books }}<b>万册</b></div>
|
||||||
|
</div>
|
||||||
|
<div class="sub-info-container">
|
||||||
|
<div class="sub-info">电子图书 {{ schoolData.ebooks }}万册</div>
|
||||||
|
<div class="sub-info">期刊 {{ schoolData.journals }}种</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="info-card">
|
||||||
|
<i class="el-icon-connection"></i>
|
||||||
|
<div class="info-content">
|
||||||
|
<div class="main-info">
|
||||||
|
<div class="info-label">国际合作</div>
|
||||||
|
<div class="info-value">
|
||||||
|
{{ formatNumber(schoolData.partnerships) }}<b>所</b>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="sub-info-container">
|
||||||
|
<div class="sub-info">
|
||||||
|
留学生 {{ formatNumber(schoolData.internationalStudents) }}人
|
||||||
|
</div>
|
||||||
|
<div class="sub-info">
|
||||||
|
交换生 {{ formatNumber(schoolData.exchangeStudents) }}人/年
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="body-box">
|
<div class="dashboard-container">
|
||||||
<!-- 第三行数据 -->
|
<div class="left-panel">
|
||||||
<div class="content-box">
|
<!-- 科研概况 -->
|
||||||
<div>
|
<common-header
|
||||||
<dv-border-box-12>
|
title="科研概况"
|
||||||
<centerLeft1 />
|
@click-more="(title) => getRouterByTitle('科研概况')"
|
||||||
</dv-border-box-12>
|
/>
|
||||||
|
<div class="panel-item">
|
||||||
|
<research-overview />
|
||||||
</div>
|
</div>
|
||||||
<div>
|
<!-- 教职工概况 -->
|
||||||
<dv-border-box-12>
|
<common-header
|
||||||
<centerLeft1 />
|
title="教职工概况"
|
||||||
</dv-border-box-12>
|
@click-more="(title) => getRouterByTitle('教职工概况')"
|
||||||
</div>
|
/>
|
||||||
<!-- <div>
|
<div class="panel-item">
|
||||||
<dv-border-box-12>
|
<staff-overview />
|
||||||
<centerLeft2 />
|
|
||||||
</dv-border-box-12>
|
|
||||||
</div>-->
|
|
||||||
<!-- 中间 -->
|
|
||||||
<div>
|
|
||||||
<center />
|
|
||||||
</div>
|
|
||||||
<!-- 中间 -->
|
|
||||||
<div>
|
|
||||||
<centerRight2 />
|
|
||||||
</div>
|
|
||||||
<div>
|
|
||||||
<dv-border-box-13>
|
|
||||||
<centerRight1 />
|
|
||||||
</dv-border-box-13>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<!-- 第四行数据 -->
|
<!-- 中间面板 -->
|
||||||
<div class="bottom-box">
|
<div class="center-panel">
|
||||||
<dv-border-box-13>
|
<div class="center-top">
|
||||||
<bottomLeft />
|
<img
|
||||||
</dv-border-box-13>
|
src="../assets/school.png"
|
||||||
<dv-border-box-12>
|
alt="校园图片"
|
||||||
<bottomRight />
|
class="school-image"
|
||||||
</dv-border-box-12>
|
/>
|
||||||
|
</div>
|
||||||
|
<div class="center-bottom">
|
||||||
|
<!-- 教务概况 -->
|
||||||
|
<div class="bottom-item">
|
||||||
|
<common-header
|
||||||
|
title="教务概况"
|
||||||
|
@click-more="(title) => getRouterByTitle('教务概况')"
|
||||||
|
/>
|
||||||
|
<div class="panel-item">
|
||||||
|
<education-overview />
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<!-- 资产概况 -->
|
||||||
|
<div class="bottom-item">
|
||||||
|
<common-header
|
||||||
|
title="资产概况"
|
||||||
|
@click-more="(title) => getRouterByTitle('资产概况')"
|
||||||
|
/>
|
||||||
|
<div class="panel-item">
|
||||||
|
<asset-overview />
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="right-panel">
|
||||||
|
<!-- 一卡通概况 -->
|
||||||
|
<common-header
|
||||||
|
title="一卡通概况"
|
||||||
|
@click-more="(title) => getRouterByTitle('一卡通概况')"
|
||||||
|
/>
|
||||||
|
<div class="panel-item">
|
||||||
|
<card-overview />
|
||||||
|
</div>
|
||||||
|
<!-- 文献概况 -->
|
||||||
|
<common-header
|
||||||
|
title="文献概况"
|
||||||
|
@click-more="(title) => getRouterByTitle('文献概况')"
|
||||||
|
/>
|
||||||
|
<div class="panel-item">
|
||||||
|
<literature-overview />
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
@ -87,62 +214,358 @@
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
|
import { formatNumber } from "@/utils/format";
|
||||||
import drawMixin from "../utils/drawMixin";
|
import drawMixin from "../utils/drawMixin";
|
||||||
import { formatTime } from "../utils/index.js";
|
import CommonHeader from "@/components/CommonHeader";
|
||||||
import centerLeft1 from "./centerLeft1";
|
import EducationOverview from "@/components/EducationOverview";
|
||||||
// import centerLeft2 from "./centerLeft2";
|
import ResearchOverview from "@/components/ResearchOverview";
|
||||||
import centerRight1 from "./centerRight1";
|
import StaffOverview from "@/components/StaffOverview";
|
||||||
import centerRight2 from "./centerRight2";
|
import AssetOverview from "@/components/AssetOverview";
|
||||||
import center from "./center";
|
import LiteratureOverview from "@/components/LiteratureOverview";
|
||||||
import bottomLeft from "./bottomLeft";
|
import CardOverview from "@/components/CardOverview";
|
||||||
import bottomRight from "./bottomRight";
|
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
mixins: [drawMixin],
|
mixins: [drawMixin],
|
||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
timing: null,
|
|
||||||
loading: true,
|
loading: true,
|
||||||
dateDay: null,
|
decorationColor: ["#568aea", "#000000"],
|
||||||
dateYear: null,
|
schoolData: {
|
||||||
dateWeek: null,
|
totalStudents: 18000,
|
||||||
weekday: ["周日", "周一", "周二", "周三", "周四", "周五", "周六"],
|
undergrads: 16000,
|
||||||
decorationColor: ["#568aea", "#000000"]
|
graduates: 500,
|
||||||
|
internationalStudents: 100,
|
||||||
|
exchangeStudents: 100,
|
||||||
|
totalStaff: 1200,
|
||||||
|
teachers: 900,
|
||||||
|
doctors: 300,
|
||||||
|
majors: 60,
|
||||||
|
masterPrograms: 10,
|
||||||
|
keyDisciplines: 4,
|
||||||
|
campusArea: 1000,
|
||||||
|
buildingArea: 50,
|
||||||
|
labs: 100,
|
||||||
|
books: 200,
|
||||||
|
ebooks: 300,
|
||||||
|
journals: 2000,
|
||||||
|
partnerships: 50,
|
||||||
|
},
|
||||||
|
routerMap: {
|
||||||
|
科研概况: "/research-detail",
|
||||||
|
教务概况: "/education-detail",
|
||||||
|
教职工概况: "/staff-detail",
|
||||||
|
资产概况: "/asset-detail",
|
||||||
|
文献概况: "/literature-detail",
|
||||||
|
一卡通概况: "/card-detail",
|
||||||
|
},
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
components: {
|
components: {
|
||||||
centerLeft1,
|
CommonHeader,
|
||||||
// centerLeft2,
|
EducationOverview,
|
||||||
centerRight1,
|
ResearchOverview,
|
||||||
centerRight2,
|
StaffOverview,
|
||||||
center,
|
AssetOverview,
|
||||||
bottomLeft,
|
LiteratureOverview,
|
||||||
bottomRight
|
CardOverview,
|
||||||
},
|
},
|
||||||
mounted() {
|
mounted() {
|
||||||
this.timeFn();
|
|
||||||
this.cancelLoading();
|
this.cancelLoading();
|
||||||
},
|
},
|
||||||
beforeDestroy() {
|
|
||||||
clearInterval(this.timing);
|
|
||||||
},
|
|
||||||
methods: {
|
methods: {
|
||||||
timeFn() {
|
|
||||||
this.timing = setInterval(() => {
|
|
||||||
this.dateDay = formatTime(new Date(), "HH: mm: ss");
|
|
||||||
this.dateYear = formatTime(new Date(), "yyyy-MM-dd");
|
|
||||||
this.dateWeek = this.weekday[new Date().getDay()];
|
|
||||||
}, 1000);
|
|
||||||
},
|
|
||||||
cancelLoading() {
|
cancelLoading() {
|
||||||
setTimeout(() => {
|
setTimeout(() => {
|
||||||
this.loading = false;
|
this.loading = false;
|
||||||
}, 500);
|
}, 500);
|
||||||
}
|
},
|
||||||
}
|
getRouterByTitle(title) {
|
||||||
|
const path = this.routerMap[title];
|
||||||
|
if (path) {
|
||||||
|
this.$router.push(path);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
formatNumber,
|
||||||
|
},
|
||||||
};
|
};
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style lang="scss" scoped>
|
<style lang="scss" scoped>
|
||||||
@import "../assets/scss/index.scss";
|
@import "../assets/scss/index.scss";
|
||||||
</style>
|
|
||||||
|
.title {
|
||||||
|
position: relative;
|
||||||
|
padding: 0 50px;
|
||||||
|
margin-bottom: 10px;
|
||||||
|
|
||||||
|
.title-text {
|
||||||
|
font-size: 36px;
|
||||||
|
font-weight: bold;
|
||||||
|
background: linear-gradient(to top, #4a90e2, #ffffff);
|
||||||
|
background-clip: text;
|
||||||
|
-webkit-background-clip: text;
|
||||||
|
-webkit-text-fill-color: transparent;
|
||||||
|
// text-shadow: 0 0 10px rgba(74, 144, 226, 0.3);
|
||||||
|
font-family: "Microsoft YaHei", sans-serif;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.school-info-cards {
|
||||||
|
display: flex;
|
||||||
|
justify-content: space-between;
|
||||||
|
margin: 10px 20px;
|
||||||
|
background: rgba(74, 144, 226, 0.05);
|
||||||
|
border-radius: 15px;
|
||||||
|
backdrop-filter: blur(5px);
|
||||||
|
position: relative;
|
||||||
|
border: 1px solid rgba(74, 144, 226, 0.1);
|
||||||
|
overflow: hidden;
|
||||||
|
box-shadow: 0 0 20px rgba(74, 144, 226, 0.05);
|
||||||
|
|
||||||
|
&::before {
|
||||||
|
content: "";
|
||||||
|
position: absolute;
|
||||||
|
top: 0;
|
||||||
|
left: 0;
|
||||||
|
right: 0;
|
||||||
|
height: 1px;
|
||||||
|
background: linear-gradient(
|
||||||
|
90deg,
|
||||||
|
transparent 0%,
|
||||||
|
rgba(74, 144, 226, 0.5) 50%,
|
||||||
|
transparent 100%
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
&::after {
|
||||||
|
content: "";
|
||||||
|
position: absolute;
|
||||||
|
bottom: 0;
|
||||||
|
left: 0;
|
||||||
|
right: 0;
|
||||||
|
height: 1px;
|
||||||
|
background: linear-gradient(
|
||||||
|
90deg,
|
||||||
|
transparent 0%,
|
||||||
|
rgba(74, 144, 226, 0.3) 50%,
|
||||||
|
transparent 100%
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
.info-card {
|
||||||
|
flex: 1;
|
||||||
|
display: flex;
|
||||||
|
align-items: flex-start;
|
||||||
|
gap: 15px;
|
||||||
|
padding: 20px 10px;
|
||||||
|
position: relative;
|
||||||
|
transition: all 0.3s ease;
|
||||||
|
min-width: 240px;
|
||||||
|
|
||||||
|
&:not(:last-child)::after {
|
||||||
|
content: "";
|
||||||
|
position: absolute;
|
||||||
|
right: 0;
|
||||||
|
top: 15%;
|
||||||
|
height: 70%;
|
||||||
|
width: 1px;
|
||||||
|
background: linear-gradient(
|
||||||
|
to bottom,
|
||||||
|
transparent 0%,
|
||||||
|
rgba(74, 144, 226, 0.15) 50%,
|
||||||
|
transparent 100%
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
&:hover {
|
||||||
|
transform: translateY(-5px);
|
||||||
|
background: rgba(74, 144, 226, 0.08);
|
||||||
|
border-radius: 12px;
|
||||||
|
box-shadow: 0 5px 15px rgba(74, 144, 226, 0.1);
|
||||||
|
|
||||||
|
i {
|
||||||
|
transform: scale(1.1) translateY(-2px);
|
||||||
|
background: linear-gradient(135deg, #4a90e2, #36d1dc);
|
||||||
|
background-clip: text;
|
||||||
|
-webkit-background-clip: text;
|
||||||
|
-webkit-text-fill-color: transparent;
|
||||||
|
filter: drop-shadow(0 2px 4px rgba(74, 144, 226, 0.2));
|
||||||
|
}
|
||||||
|
|
||||||
|
.info-content {
|
||||||
|
.main-info {
|
||||||
|
.info-value {
|
||||||
|
transform: scale(1.05);
|
||||||
|
filter: drop-shadow(0 2px 4px rgba(74, 144, 226, 0.3));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.sub-info-container {
|
||||||
|
.sub-info {
|
||||||
|
color: rgba(74, 144, 226, 0.9);
|
||||||
|
transform: translateX(-5px);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
i {
|
||||||
|
font-size: 40px;
|
||||||
|
color: #4a90e2;
|
||||||
|
transition: all 0.3s ease;
|
||||||
|
margin-top: 20px;
|
||||||
|
opacity: 0.9;
|
||||||
|
filter: drop-shadow(0 2px 2px rgba(74, 144, 226, 0.1));
|
||||||
|
}
|
||||||
|
|
||||||
|
.info-content {
|
||||||
|
flex: 1;
|
||||||
|
display: flex;
|
||||||
|
justify-content: space-between;
|
||||||
|
gap: 10px;
|
||||||
|
|
||||||
|
.main-info {
|
||||||
|
flex: 1;
|
||||||
|
margin: 0 -5px;
|
||||||
|
.info-label {
|
||||||
|
color: rgba(255, 255, 255, 0.9);
|
||||||
|
font-size: 18px;
|
||||||
|
margin-bottom: 10px;
|
||||||
|
font-weight: 500;
|
||||||
|
}
|
||||||
|
|
||||||
|
.info-value {
|
||||||
|
font-size: 34px;
|
||||||
|
font-weight: bold;
|
||||||
|
transition: all 0.3s ease;
|
||||||
|
background: linear-gradient(135deg, #4a90e2, #36d1dc);
|
||||||
|
background-clip: text;
|
||||||
|
-webkit-background-clip: text;
|
||||||
|
-webkit-text-fill-color: transparent;
|
||||||
|
|
||||||
|
b {
|
||||||
|
font-size: 16px;
|
||||||
|
font-weight: normal;
|
||||||
|
// margin-left: 4px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.sub-info-container {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
justify-content: center;
|
||||||
|
gap: 8px;
|
||||||
|
padding-left: 15px;
|
||||||
|
position: relative;
|
||||||
|
min-width: 100px;
|
||||||
|
|
||||||
|
&::before {
|
||||||
|
content: "";
|
||||||
|
position: absolute;
|
||||||
|
left: 0;
|
||||||
|
top: 10%;
|
||||||
|
height: 80%;
|
||||||
|
width: 1px;
|
||||||
|
background: linear-gradient(
|
||||||
|
to bottom,
|
||||||
|
transparent,
|
||||||
|
rgba(74, 144, 226, 0.1),
|
||||||
|
transparent
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
.sub-info {
|
||||||
|
color: rgba(255, 255, 255, 0.7);
|
||||||
|
font-size: 13px;
|
||||||
|
transition: all 0.3s ease;
|
||||||
|
text-align: left;
|
||||||
|
white-space: nowrap;
|
||||||
|
|
||||||
|
&:hover {
|
||||||
|
color: rgba(74, 144, 226, 0.9);
|
||||||
|
transform: translateX(5px);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.dashboard-container {
|
||||||
|
display: flex;
|
||||||
|
width: 100%;
|
||||||
|
height: calc(95% - 150px);
|
||||||
|
padding: 0 20px 20px;
|
||||||
|
gap: 20px;
|
||||||
|
overflow-y: auto;
|
||||||
|
|
||||||
|
&::-webkit-scrollbar {
|
||||||
|
width: 0;
|
||||||
|
background: transparent;
|
||||||
|
}
|
||||||
|
|
||||||
|
.left-panel,
|
||||||
|
.right-panel {
|
||||||
|
flex: 1;
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
gap: 20px;
|
||||||
|
height: 100%;
|
||||||
|
|
||||||
|
.panel-item {
|
||||||
|
flex: 1;
|
||||||
|
min-height: 0;
|
||||||
|
background: rgba(255, 255, 255, 0.05);
|
||||||
|
padding: 15px;
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
border-radius: 12px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.center-panel {
|
||||||
|
flex: 2;
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
gap: 20px;
|
||||||
|
height: 100%;
|
||||||
|
|
||||||
|
.center-top {
|
||||||
|
flex: 3;
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
|
||||||
|
.school-image {
|
||||||
|
max-width: 100%;
|
||||||
|
max-height: 100%;
|
||||||
|
object-fit: contain;
|
||||||
|
border-radius: 12px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.center-bottom {
|
||||||
|
flex: 2;
|
||||||
|
display: flex;
|
||||||
|
gap: 20px;
|
||||||
|
|
||||||
|
.bottom-item {
|
||||||
|
flex: 1;
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
gap: 20px;
|
||||||
|
|
||||||
|
.panel-item {
|
||||||
|
flex: 1;
|
||||||
|
min-height: 0;
|
||||||
|
background: rgba(255, 255, 255, 0.05);
|
||||||
|
padding: 0 15px;
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
border-radius: 12px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
|
@ -1 +0,0 @@
|
||||||
test
|
|
||||||
Loading…
Reference in New Issue