Commit 2dc3fddf by yuanfeng

Merge remote-tracking branch 'origin/20210819' into yuanfeng

parents 17f9f1c9 1e1d8a7e
<template>
<div class="bar-chart">
<chart-el :chartOpt="barChartConf" />
</div>
</template>
<script>
import * as echarts from 'echarts'
import mixinChart from '@/public/mixins/mixinChart'
export default {
name: 'lineBar',
mixins: [mixinChart],
data () {
return {
barChartConf: {}
}
},
props: {
// 图表布局配置, width, height
layout: {
type: Object,
default () {
return {}
}
},
// 图表配置
option: {
type: Object,
default () {
return {
base: {},
seriesData: []
}
}
}
},
mounted () {
this.initComponents()
},
methods: {
initComponents () {
const { width = '', height = '', id = '', className = 'line-bar-chart-class' } = this.mergeChartConf() || {}
// 基础配置, 不含series
const option = this.getChartOption(this.option.base) || {}
const seriesData = this.getSeriesData(this.option.seriesData || []) || []
// if (!seriesData.length) {
// throw Error('该组件图表数据只能接受length为2的数组')
// }
option.series = seriesData
this.barChartConf = {
className,
id,
width,
height,
option
}
},
/**
* @method mergeChartConf 合并图表配置项
*/
mergeChartConf () {
const defaultChartConf = {
width: '100%',
height: '100%',
// 不同的id(防止id重复,同一个页面,无法展示多个同组件图表)
id: 'line-bar-chart-id' + this.utils.randomStr()
}
return this.deepMerge({}, defaultChartConf, this.layout)
},
/**
* @method getChartOption 图表配置
*/
getChartOption (customOption = {}) {
const defaultOption = {
title: {
show: false
},
grid: {
left: 0,
right: 10,
bottom: 0,
top: 0,
containLabel: true
},
xAxis: {
type: 'value',
axisTick: {
show: false
},
axisLine: {
show: false
},
splitLine: {
show: false
},
axisLabel: {
show: false
}
},
yAxis: [
{
type: 'category',
axisTick: {
show: false
},
axisLine: {
show: false
},
axisLabel: {
show: true,
inside: false,
formatter: function (val) {
return `{color1|${val}}`
},
rich: {
color1: {
fontSize: 14,
color: '#FFFFFF'
}
}
},
data: []
}, {
type: 'category',
axisLine: {
show: false
},
axisTick: {
show: false
},
axisLabel: {
show: true,
inside: false,
formatter: function (val) {
return `{color|${val}}`
},
rich: {
color: {
fontFamily: 'CenturyGothic',
fontSize: 15,
color: '#FFFFFF'
}
}
},
splitArea: {
show: false
},
splitLine: {
show: false
},
data: []
}
]
}
return this.deepMerge({}, defaultOption, customOption)
},
/**
* @method getSeriesData 图表数据
*/
getSeriesData () {
if (this.option.seriesData.length !== 2) return []
const defSeriesData = [
{
name: 'back',
type: 'bar',
barWidth: '4px',
itemStyle: {
borderRadius: [0, 0, 0, 0],
normal: {
color: '#233549'
}
},
barGap: '-100%',
data: [1, 2, 3]
},
{
name: 'show',
type: 'bar',
barWidth: '4px',
itemStyle: {
borderRadius: [0, 0, 0, 0],
normal: {
color: new echarts.graphic.LinearGradient(0, 0, 1, 0, [{
offset: 0,
color: 'rgba(59, 150, 235, 0.1)'
}, {
offset: 1,
color: '#3b96eb'
}], false)
}
},
markPoint: {
symbol: 'image://data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA8AAAAPCAYAAAA71pVKAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyVpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMTQ4IDc5LjE2NDAzNiwgMjAxOS8wOC8xMy0wMTowNjo1NyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIDIxLjAgKE1hY2ludG9zaCkiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6ODdEN0ZCRTVBMUJBMTFFQkE2NTJGMjkxNkVGRjdGMjkiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6ODdEN0ZCRTZBMUJBMTFFQkE2NTJGMjkxNkVGRjdGMjkiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo4N0Q3RkJFM0ExQkExMUVCQTY1MkYyOTE2RUZGN0YyOSIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDo4N0Q3RkJFNEExQkExMUVCQTY1MkYyOTE2RUZGN0YyOSIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PvpJkncAAAI7SURBVHjafFNLaxNRFD73zjOZpE2ampa2agwtiCAuBBdxJQpq0bUrl+JjIYqb4i9w4aa7gksRXboTBC2KQl24kEILvghinybmMU1m7mTu3J6TTmAo1tnMvfd83znf+e657MILBQd8LLH+J0jfT7hV2iwZWjTHgF1G9hiythSoVz3JHy1Ux6vJRDxJvFPemLU09UmC/veXSF971zp0nP60p3OKJxWxWDa7UdosO7r6WAtTt790cmumBgXOwI4U+IGE+imnOTmqewudkFWeVMd/koKBbGZzeBiA8XzVz7XzNlTSOsxoHLIyArcbwjc8Xz6TCZ/ZPJxD/M0kmXMNLlYD565jwMkRG85hghNYfUhIcJs+TKFW9rvnfCibrfm43YjIbCIDGkos1nuWHLJghojFNEzjGtoCitQkJlmr+faPaas1Rvj1HZD9ylKRCaw2YoaTiptZqkjEYWtPVlNAVmOQLWAccX/28LHbGFChYm8P2/5Z6hENamNFaIl+ZcC9iwR3yvYqiFsk/OCeFUnY8M3Hpax4kzOCpw3fXIkr9nvGJCvDehBmuJitdszzhE8aFi3Wcl+vGo37R9LufIellrYDa0lIziwtUhOWGHWUd32rq98jHOGTE6bqHgSvt/MvT+d3vh91vAfHTHEJryqHbTS7vej9ase68rmRWSbcYMpYYrbJBK2QAjNtQArDFpI1JEuMiG4PvJgoB2R93/BLBPgEousIQmBkzrrbJ0QxRh30MAbBKDblv69qV4ABAOvFCo1MtxZ0AAAAAElFTkSuQmCC',
symbolSize: [10, 10],
data: []
},
data: [],
z: 3
}
]
const seriesData = [{}, {}]
seriesData[0] = this.deepMerge({}, defSeriesData[0], this.option.seriesData[0])
seriesData[1] = this.deepMerge({}, defSeriesData[1], this.option.seriesData[1])
return seriesData
}
}
}
</script>
<template>
<div class="managePlatform-right"></div>
<div class="managePlatform-right">
<title-line :con="'师资/课程/活动'"></title-line>
<div class="faculty">
<div class="teachernum">
<div class="teacherTitle">师资力量</div>
<pie-chart :option="eduConfig.option" />
</div>
<div class="staff">
<bar-chart :option="staffConfig.option" />
</div>
</div>
<div class="course">
<div class="coursetitle">
<div class="left">教学课程</div>
<div class="seemore">查看更多</div>
</div>
<p class="percent">
<span>课程数</span>
<span>学习总时长</span>
<span>出勤率</span>
</p>
<div class="line">
<bar-chart :option="lineConfig.option" />
</div>
</div>
<!-- 活动开展 -->
<div class='activ'>
<active />
</div>
<div class="right-bottom">
<title-line :con="'交流会/专题'"></title-line>
<div class="topic">
<div class="left">
<p class="sub-title">****交流会</p>
<div class="swiper-content">
<swiper :options="swiperOption" class="swipers">
<swiper-slide
v-for="(item, index) in topicList"
:key="index"
class="swiper-item"
>
<img :src="item.img" alt="" />
</swiper-slide>
</swiper>
<div class="pagination-items">
<div
class="swiper-pagination change"
slot="pagination"
></div>
</div>
</div>
</div>
<div class="right">
<div class="num">
<span><count-to :endVal="110" /></span>
<span><count-to :endVal="120" /></span>
<span><count-to :endVal="270" /></span>
<span><count-to :endVal="4000" /></span>
</div>
<div class="text">
<span class="item"
>对接交流活动 <count-to :endVal="110" />余场</span
>
<span class="item"
>发布大企业创新需求<count-to
:endVal="120"
/>余个</span
>
<span class="item"
>促成项目合作<count-to :endVal="270" />余个</span
>
<span class="item"
>服务创新创业企业<count-to
:endVal="4000"
/>余家次</span
>
</div>
</div>
</div>
<div class="topic-show">
<p class="sub-title">专题展示</p>
<div class="topic-item">
<div class="item">
<img
src="../../../static/images/index/topic-bg4.png"
alt=""
/>
<p>连续两届成功“创客中国”上海赛区总决赛</p>
</div>
<div class="item">
<img
src="../../../static/images/index/topic-bg4.png"
alt=""
/>
<p>连续两届成功“创客中国”上海赛区总决赛</p>
</div>
</div>
</div>
</div>
</div>
</template>
<script>
import TitleLine from '@/components/TitleLine'
import { swiper, swiperSlide } from 'vue-awesome-swiper'
import 'swiper/dist/css/swiper.css'
import BarChart from '@/components/echarts/BarChart.vue'
import PieChart from '@/components/echarts/PieChart.vue'
import active from './active'
export default {
name: 'Right',
components: {
TitleLine,
BarChart,
PieChart,
swiper,
swiperSlide,
active
},
data () {
return {}
return {
eduConfig: {},
edu: [
{ value: 168, name: '教师数' }
],
staffConfig: {},
// 师资数据
staff: [
{
name: '****教授',
value: 41
}, {
name: '****名师',
value: 53
}, {
name: '*****专家',
value: 61
}, {
name: '*******',
value: 12
}
],
lineConfig: {},
line: [
{
name: '线下',
value: 32
}, {
name: '线上',
value: 68
}
],
genderPercent: {
male: '32%',
female: '68%'
},
swiperOption: {
mousewheel: true,
centeredSlides: true,
centeredSlidesBounds: true,
autoplay: {
delay: 3000,
disableOnInteraction: false // 手动切换之后继续自动轮播
},
loop: true,
pagination: {
el: '.swiper-pagination',
clickable: true,
type: 'bullets'
}
},
topicList: [
{
img: '../../../static/images/index/topic-bg1.png'
},
{
img: '../../../static/images/index/topic-bg1.png'
},
{
img: '../../../static/images/index/topic-bg1.png'
}
mounted () {},
methods: {}
]
}
},
mounted () {
this.getstaff()
this.getEdu()
this.getline()
},
methods: {
getline () {
this.lineConfig = {
option: {
seriesData: [
{
name: 'A',
type: 'bar',
stack: 'Tik Tok',
barWidth: 25,
itemStyle: {
shadowOffsetY: 0,
shadowOffsetX: 0,
barBorderRadius: [2, 0, 0, 2]
},
label: {
normal: {
show: true,
position: 'insideRight',
offset: [-20, 0],
formatter: '{c}%',
textStyle: {
align: 'center',
baseline: 'middle',
fontSize: 14,
fontWeight: '400',
color: '#fff',
textShadowColor: '#000',
textShadowBlur: '0',
textShadowOffsetX: 1,
textShadowOffsetY: 1
}
}
},
data: [32]
},
{
name: 'B',
type: 'bar',
stack: 'Tik Tok',
barWidth: 25,
itemStyle: {
shadowOffsetY: 0,
shadowOffsetX: 0
},
label: {
normal: {
show: true,
position: 'insideRight',
offset: [-20, 0],
formatter: '{c}%',
textStyle: {
align: 'center',
baseline: 'middle',
fontSize: 14,
fontWeight: '400',
color: '#fff',
textShadowColor: '#000',
textShadowBlur: '0',
textShadowOffsetX: 1,
textShadowOffsetY: 1
}
}
},
data: [68]
}
]
}
}
},
getEdu () {
this.eduConfig = {
option: {
base: {
legend: {
show: false
}
},
seriesData: [
{
type: 'pie',
name: '师资力量',
itemStyle: {
normal: {
label: {
show: false
},
labelLine: {
show: false
},
shadowBlur: 0,
shadowColor: '#3EB8F7'
}
},
clockWise: false,
hoverAnimation: false,
center: ['38%', '50%'],
radius: ['65%', '78%'],
data: [
{
value: this.edu[0].value,
label: {
normal: {
rich: {
a: {
color: '#fff',
align: 'center',
fontSize: 30,
fontWeight: '400'
},
b: {
color: '#fff',
align: 'center',
fontWeight: '400',
fontSize: 18
}
},
formatter: function (params) {
return '{a|' + params.value + '}\n\n{b|教师数}'
},
position: 'center',
show: true
}
},
itemStyle: {
normal: {
color: '#3EB8F7',
shadowColor: '#2c6cc4',
shadowBlur: 0
}
}
}, {
value: this.edu[0].value / 2 + 20,
name: 'invisible',
itemStyle: {
normal: {
color: 'rgba(0, 12, 27)'
},
emphasis: {
color: '#fff'
}
}
}
]
}
]
}
}
},
getstaff () {
this.staffConfig = {
option: {
seriesData: [
{
data: this.staff.map(item => item.value).reverse()
}
],
base: {
yAxis: [{
data: this.staff.map(item => item.name).reverse()
}]
}
}
}
}
}
}
</script>
<style lang="less" scoped>
.managePlatform-right {
<style lang="less">
.managePlatform-right {
height: 500px;
.faculty {
margin-top: 7px;
height: 156px;
display: flex;
.teachernum {
width: 134px;
height: 100%;
.teacherTitle {
font-size: 18px;
font-family: Microsoft YaHei;
font-weight: 400;
color: #ffffff;
}
}
.staff {
margin-top: 47px;
width: 340px;
}
}
.course {
height: 110px;
.coursetitle {
display: flex;
justify-content: space-between;
.left {
font-size: 18px;
font-family: Microsoft YaHei;
font-weight: 400;
color: #ffffff;
}
.seemore {
width: 94px;
cursor: pointer;
font-size: 16px;
font-family: Microsoft YaHei;
font-weight: 400;
color: #18d1c6;
background: url('./../../../static/images/index/查看更多.png')
no-repeat right;
}
}
.percent {
margin-top: 10px;
display: flex;
justify-content: space-between;
span {
font-size: 16px;
font-family: Microsoft YaHei;
font-weight: 400;
color: #6dcdff;
}
}
.line {
margin-top: 12px;
display: flex;
margin-top: 5px;
margin-bottom: 4px;
span {
width: 0%;
height: 31px;
transition: width linear 300ms;
&.male {
border-top-left-radius: 4px;
border-bottom-left-radius: 4px;
background-color: #00beff;
opacity: 0.5;
}
&.female {
border-top-right-radius: 4px;
border-bottom-right-radius: 4px;
background-color: #00de7d;
opacity: 0.5;
}
}
}
}
// 活动开展
.activ{
width: 100%;
height: 150px;
}
.right-bottom {
.topic {
margin-top: 19px;
width: 482px;
height: 158px;
display: flex;
background: url('../../../static/images/index/comm-bg.png')
no-repeat center;
.left {
margin-left: 11px;
margin-right: 21px;
.sub-title {
font-size: 18px;
font-family: Microsoft YaHei;
font-weight: 400;
color: #ffffff;
line-height: 28px;
}
.swiper-content {
width: 190px;
height: 107px;
.swipers {
width: 100%;
height: 100%;
.swiper-item {
width: 100%;
height: 100%;
img {
width: 190px;
height: 107px;
}
}
}
.pagination-items {
width: 60px;
margin: 0 auto;
.change.swiper-pagination.swiper-pagination-clickable {
width: 60px;
height: 6px;
border-radius: 50%;
margin-top: 5px;
display: flex;
justify-content: space-between;
// .swiper-pagination-bullet {
// width: 6px;
// height: 6px;
// background: rgba(62, 157, 247, 0.4);
// }
// .swiper-pagination-bullet-active {
// background: #3e9df7;
// }
}
.swiper-pagination-bullet {
background: rgba(62, 157, 247, 0.4);
}
.swiper-pagination-bullet-active {
background: #3e9df7;
}
}
}
}
.right {
display: flex;
.num {
position: relative;
margin-top: 14px;
width: 54px;
height: 138px;
background: url('../../../static/images/index/topic-bg2.png')
no-repeat center 0;
span {
position: absolute;
font-size: 16px;
font-family: Century Gothic;
font-weight: 400;
color: #ffffff;
left: 3px;
top: 5px;
}
span:nth-child(2) {
left: 20px;
top: 40px;
}
span:nth-child(3) {
left: 3px;
top: 70px;
}
span:nth-child(4) {
left: 16px;
top: 108px;
}
}
.text {
position: relative;
margin-top: 14px;
width: 197px;
display: flex;
align-items: center;
height: 138px;
.item {
position: absolute;
height: auto;
font-size: 14px;
font-family: Microsoft YaHei;
font-weight: 400;
color: #ffffff;
left: 0;
top: 7px;
}
.item:nth-child(2) {
left: 10px;
top: 45px;
}
.item:nth-child(3) {
left: 0;
top: 80px;
}
.item:nth-child(4) {
left: 10px;
top: 108px;
}
}
}
}
.topic-show {
.sub-title {
font-size: 18px;
font-family: Microsoft YaHei;
font-weight: 400;
color: #ffffff;
line-height: 28px;
margin: 15px 0;
}
.topic-item {
display: flex;
justify-content: space-between;
.item {
width: 230px;
height: 105px;
background: url('../../../static/images/index/topic-bg3.png')
no-repeat;
img {
display: block;
width: 153px;
height: 56px;
margin: 0 auto;
margin-top: 17px;
margin-bottom: 8px;
}
p {
font-size: 12px;
font-family: Microsoft YaHei;
font-weight: 400;
color: #6dcdff;
}
}
}
}
}
}
</style>
\ No newline at end of file
<template>
<!-- 活动开展 -->
<div class="activity">
<div class="activity-one">
<div class="act">活动开展</div>
<div class="mor"><span>查看更多</span><span></span></div>
</div>
<div class="activity-two">
<div class="left">
<count-roll :count="4166" />
<p class="act-num">活动开展次数</p>
</div>
<div class="line"></div>
<div class="right">
<line-bar
:layout="activeConfig.layout"
:option="activeConfig.option"
/>
</div>
</div>
</div>
</template>
<script>
import LineBar from '@/components/echarts/LineBar'
export default {
components: {
LineBar
},
data () {
return {
// 活动开展
activeConfig: {},
activeList: [
{name: '*****活动', value: 381},
{name: '组织活动', value: 1103},
{name: '*****活动', value: 192}
]
}
},
mounted () {
this.getActive(this.activeList)
},
methods: {
getActive (data) {
let yData = data.map(v => v.name).reverse()
let y2Data = data.map(v => v.value).reverse()
let max = 4166
let maxData = new Array(data.length).fill(max)
console.log(maxData)
let pointData = data.reverse().map((v, i) => {
return {
xAxis: v.value,
yAxis: i
}
})
this.activeConfig = {
layout: {
width: '100%',
height: '100%'
},
option: {
base: {
xAxis: {
max: max
},
yAxis: [
{
axisLabel: {
color: '#fff',
align: 'left',
padding: [0, 0, 0, -60]
},
data: yData
}, {
data: y2Data.map(v => v)
}
]
},
seriesData: [
{
name: 'back',
barWidth: '5px',
data: maxData
},
{
name: 'show',
barWidth: '5px',
itemStyle: {
borderRadius: [0, 0, 0, 0],
color: 'rgba(64, 169, 248, .05)'
},
markPoint: {
symbolOffset: [0, 0.5],
data: pointData
},
data: y2Data
}
]
}
}
}
}
}
</script>
<style lang="less" scoped>
/* 活动开展 */
.activity{
width: 100%;
height: 140px;
.activity-one{
display: flex;
justify-content: space-between;
.act{
width: 72px;
height: 19px;
font-size: 18px;
font-family: Microsoft YaHei;
font-weight: 400;
color: #FFFFFF;
line-height: 28px;
}
.mor{
width: 100px;
height: 17px;
display: flex;
span:nth-child(1){
width: 65px;
height: 17px;
margin-top: 2px;
font-size: 16px;
font-family: Microsoft YaHei;
font-weight: 400;
color: #18D1C6;
line-height: 24px;
}
span:nth-child(2){
display: inline-block;
width: 28px;
height: 24px;
// margin-top: 5px!important;
background:url('../../../static/images/index/查看更多.png') no-repeat;
}
}
}
.activity-two{
margin-top: 12px;
display: flex;
.left{
margin-top:10px;
.act-num{
width: 108px;
height: 18px;
margin-top: 20px;
font-size: 18px;
font-family: Microsoft YaHei;
font-weight: 400;
color: #6DCDFF;
line-height: 17px;
}
}
.line{
width: 3px;
height: 76px;
margin: 10px 10px 0 10px;
background:url('../../../static/images/index/3.png');
}
.right{
width: 300px;
height: 100%;
}
}
}
</style>
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment