emis-frontend/src/views/demo/ds1_workspace.vue

692 lines
18 KiB
Vue
Raw Normal View History

2023-11-27 08:29:42 +00:00
<template>
<div class="index">
<div class="index_l whitebg">
<!-- <div class="box titlebox">
<p>{{ parseTime(nowTime) }}</p>
</div> -->
<div class="tables">
<div style="text-align: left">
<el-row type="flex" class="row-bg" justify="space-between">
<el-col :span="24" class="title_name"
>数据总览
<span class="fontgay">最近更新:{{ uptime }}</span>
</el-col>
</el-row>
<el-row
type="flex"
class="row-bg"
justify="space-between"
style="margin-top: 35px; text-align: center"
>
<el-col :span="6" class="col_style">企业成员总数</el-col>
<el-col :span="6" class="col_style">客户总人数</el-col>
<el-col :span="6" class="col_style">客户群总数</el-col>
<el-col :span="6" class="col_style">群成员总数</el-col>
</el-row>
<el-row
type="flex"
class="row-bg"
justify="space-between"
style="
margin-top: 10px;
font-size: 35px;
font-weight: bold;
color: #0079de;
text-align: center;
"
>
<el-col :span="6">
<count-to :start-val="0" :end-val="table.userCount" :duration="durationCount" />
</el-col>
<el-col :span="6">
<count-to :start-val="0" :end-val="table.customerCount" :duration="durationCount" />
</el-col>
<el-col :span="6">
<count-to :start-val="0" :end-val="table.groupCount" :duration="durationCount" />
</el-col>
<el-col :span="6">
<count-to
:start-val="0"
:end-val="table.groupMemberCount"
:duration="durationCount"
/>
</el-col>
</el-row>
</div>
</div>
<div class="dataall" style="margin-top: 10px">
<div style="text-align: left">
<el-row type="flex" class="row-bg" justify="space-between">
<el-col :span="10" class="title_name">数据趋势</el-col>
<el-col :span="10" style="text-align: right">
<el-radio-group v-model="timeType" style="margin-top: 20px" @change="timeTypeCheck">
<el-radio-button label="today">今日</el-radio-button>
<el-radio-button label="week">本周</el-radio-button>
<el-radio-button label="month">本月</el-radio-button>
<el-radio-button label="reset">
<i class="el-icon-refresh"> </i>
</el-radio-button>
</el-radio-group>
</el-col>
</el-row>
<el-row
type="flex"
class="row-bg"
justify="space-between"
style="margin-top: 30px; text-align: center"
>
<el-col :span="6">新增客户数</el-col>
<el-col :span="6">新增客群数</el-col>
<el-col :span="6">群新增人数</el-col>
<el-col :span="6">流失客户数</el-col>
</el-row>
<el-row
type="flex"
class="row-bg"
justify="space-between"
style="
margin-top: 10px;
font-size: 35px;
font-weight: bold;
color: #0079de;
text-align: center;
"
>
<el-col :span="6">{{ erchatsTable.newContactCnt }}</el-col>
<el-col :span="6">{{ erchatsTable.newChatCnt }}</el-col>
<el-col :span="6">{{ erchatsTable.newMemberCnt || 0 }} </el-col>
<el-col :span="6">{{ erchatsTable.negativeFeedbackCnt }}</el-col>
</el-row>
<el-row
type="flex"
class="row-bg"
justify="space-between"
style="margin-top: 10px; text-align: center"
>
<el-col :span="6">
比{{ time }}
<span :class="getClass('newContactCntDiff')">
{{ getArrow('newContactCntDiff') }}
{{ Math.abs(erchatsTable.newContactCntDiff) }}
</span>
</el-col>
<el-col :span="6">
比{{ time }}
<span :class="getClass('newChatCntDiff')">
{{ getArrow('newChatCntDiff') }}
{{ Math.abs(erchatsTable.newChatCntDiff) }}
</span>
</el-col>
<el-col :span="6">
比{{ time }}
<span :class="getClass('newMemberCntDiff')">
{{ getArrow('newMemberCntDiff') }}
{{ Math.abs(erchatsTable.newMemberCntDiff) }}
</span>
</el-col>
<el-col :span="6">
比{{ time }}
<span :class="getClass('negativeFeedbackCntDiff')">
{{ getArrow('negativeFeedbackCntDiff') }}
{{ Math.abs(erchatsTable.negativeFeedbackCntDiff) }}
</span>
</el-col>
</el-row>
</div>
<div id="fatherbox">
<div id="echart" ref="views"></div>
</div>
</div>
<div class="car card">
<el-row type="flex" justify="space-between">
<el-col :span="24" style="font-size: 24px; line-height: 80px">快捷功能 </el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="6" v-for="(item, i) in car" :key="i">
<div class="grid-content" @click="$router.push(item.url)">
<div class="ac"><img :src="item.img" alt="" /></div>
<div class="ac craname">{{ item.name }}</div>
</div>
</el-col>
</el-row>
</div>
</div>
<div class="index_r whitebg">
<div class="qy_R">
<div class="inedx_r_top_t">
<p class="p1">{{ $store.state.user.companyName }},欢迎登陆本系统</p>
<p class="p2">登录时间:{{ parseTime(new Date()) }}</p>
<p class="p1 p3 margint20">1232</p>
<p class="p2 p4">
版本信息:开源
<span class="fr">可用期限:永久</span>
</p>
<el-row
:gutter="20"
type="flex"
class="row-bg"
justify="center"
style="text-align: center"
>
<el-col :span="10" class="flexspan">
<!-- <img src="@/assets/index/bzwd.png" /> -->
<a href="https://www.yuque.com/linkwechat/help"> 帮助手册</a>
</el-col>
<el-col :span="2"></el-col>
<el-col
:span="10"
class="flexspan"
@click.native="msgInfo('《使用手册》正在加急上线中,敬请关注…')"
>
<!-- <img src="@/assets/index/kfsc.png" /> 开发文档 -->
</el-col
>
</el-row>
</div>
<div class="inedx_r_top_bottom">
<span class="inedx_r_top_bottomp1">
<!-- <img src="@/assets/index/gxrz.png" /> -->
更新日志</span>
<span
class="fr"
style="color: #0079de"
@click="msgInfo('《更新日志》正在加急上线中,敬请关注…')"
>更多</span
>
<ul>
<li v-for="(index, i) in 3" :key="i" @click="msgInfo('暂无内容')">
即将上线,敬请期待
<span class="fr">03-26</span>
</li>
</ul>
</div>
<div class="inedx_r_top_bottom">
<span class="inedx_r_top_bottomp1">
<!-- <img src="@/assets/index/qyxy.png" /> -->
私域学院</span>
<span class="fr" style="color: #0079de">更多</span>
<ul>
<li v-for="(index, i) in 3" :key="i" @click="msgInfo('暂无内容')">
即将上线,敬请期待
<span class="fr">03-26</span>
</li>
</ul>
</div>
<div class="inedx_r_top_bottom" style="text-align: center">
<p style="text-align: left">
<span class="inedx_r_top_bottomp1">
<!-- <img src="@/assets/index/kfq.png" /> -->
官方交流</span>
</p>
<img :src="bossImg" class="img" />
</div>
<div class="inedx_r_top_bottom" style="text-align: center">
<p style="text-align: left">
<span class="inedx_r_top_bottomp1">
<!-- <img src="@/assets/index/khq.png" /> -->
联系客服</span>
</p>
<img :src="bossImg" class="img" />
</div>
</div>
</div>
</div>
</template>
<script>
// import * as api from '@/api/index'
import * as echarts from 'echarts'
import CountTo from 'vue-count-to'
export default {
name: 'DSIndex0',
components: { CountTo },
data() {
return {
// bossImg: require('@/assets/index/boss.png'),
bossImg: undefined,
car: [
// {
// name: '企业客户',
// url: '/customerManage/customer',
// img: require('@/assets/index/kehgl.png'),
// },
// {
// name: '员工活码',
// url: '/drainageCode/staff',
// img: require('@/assets/index/neircd.png'),
// },
// {
// name: '新增群发',
// url: '/customerMaintain/groupMessage/add',
// img: require('@/assets/index/renwb.png'),
// },
// {
// name: '任务宝',
// url: '/application/taskGroup',
// img: require('@/assets/index/xiaoxqf.png'),
// },
// {
// name: '新客拉群',
// url: '/communityOperating/newCustomer',
// img: require('@/assets/index/yuanghm.png'),
// },
// {
// name: '素材中心',
// url: '/customerMaintain/material',
// img: require('@/assets/index/zidgl.png'),
// },
// {
// name: '关键词群',
// url: '/communityOperating/keywords',
// img: require('@/assets/index/yuanghm.png'),
// },
// {
// name: '会话存档',
// url: '/riskControl/conversation/content',
// img: require('@/assets/index/zidgl.png'),
// },
],
table: {
userCount: 0,
customerCount: 0,
groupCount: 0,
groupMemberCount: 0,
},
erchatsTable: {},
allData: {},
time: '昨天',
uptime: '',
timeType: 'today',
durationCount: 2600,
}
},
mounted() {
this.erchatInfo()
this.tableInfo()
},
methods: {
timeTypeCheck(type) {
switch (type) {
case 'today':
case 'week':
case 'month':
let json = {
today: '昨天',
week: '上周',
month: '上月',
}
this.time = json[type]
this.erchatsTable = this.allData[type]
this.serErchat()
break
default:
this.time = '昨天'
this.timeType = 'today'
this.refresh()
break
}
},
tableInfo() {
api.indexTable().then((res) => {
this.table = res.data
})
},
erchatInfo() {
api.indexEchart().then((res) => {
this.allData = res.data
this.uptime = res.data.updateTime
this.erchatsTable = this.allData.today
this.serErchat()
})
},
serErchat() {
let data = {
arr0: [],
arr1: [],
arr2: [],
arr3: [],
xData: [],
}
let series = []
this.erchatsTable.dataList.forEach((a) => {
data.xData.push(a.xtime)
data.arr0.push(a.newContactCnt)
data.arr2.push(a.newMemberCnt)
data.arr1.push(a.newChatCnt)
data.arr3.push(a.negativeFeedbackCnt)
})
for (let index = 0; index < 4; index++) {
series.push({
name: ['新增客户数', '新增客群数', '群新增人数', '流失客户数'][index],
type: 'line',
// stack: '总量',
smooth: true,
data: data['arr' + index],
// itemStyle: {
// normal: {
// lineStyle: {
// color: colors[index]
// }
// }
// },
textStyle: {
color: '#fff', // 主标题文字的颜色。
},
})
}
this.drawLine(data.xData, series)
},
drawLine(xData, series) {
let obj = document.getElementById('echart')
let charts = echarts.init(obj)
let timer = 0
window.onresize = function () {
clearTimeout(timer)
timer = setTimeout(() => {
charts.resize()
}, 200)
}
charts.setOption({
color: ['#088AEE', '#E74E59', '#14BF48', '#FA7216'],
tooltip: {
trigger: 'axis',
},
legend: {
data: ['新增客户数', '新增客群数', '群新增人数', '流失客户数'],
},
grid: {
left: '3%',
right: '4%',
bottom: '3%',
containLabel: true,
},
xAxis: {
type: 'category',
boundaryGap: false,
data: xData,
axisLine: {
lineStyle: {
color: '#ccc',
},
},
},
yAxis: {
type: 'value',
axisLine: {
lineStyle: {
color: '#ccc',
},
},
},
series,
})
},
refresh() {
api.refresh().then((res) => {
this.erchatInfo()
})
},
getClass(key) {
let val = Number(this.erchatsTable[key])
if (val > 0) {
return 'ascend'
} else if (val < 0) {
return 'descend'
}
},
getArrow(key) {
let val = Number(this.erchatsTable[key])
if (val > 0) {
return '↑'
} else if (val < 0) {
return '↓'
} else {
return '-'
}
},
},
}
</script>
<style lang="scss" scoped>
.index {
margin: 0;
width: 100%;
background: #f1f1f1;
// overflow: hidden;
.title_name {
font-size: 24px;
font-weight: bold;
color: #000000;
padding-top: 15px;
}
.col_style {
font-size: 18px;
font-weight: 500;
color: #666;
}
.fontgay {
text-indent: 4em;
color: #999;
font-size: 14px;
font-weight: 200;
}
#fatherbox {
padding-top: 30px;
height: 380px;
overflow-y: scroll;
overflow: hidden;
border-radius: 5px;
font-size: 16px;
background: #fff;
}
#echart {
width: 100%;
height: 100%;
}
.fr {
float: right;
}
.descend {
color: #ff0000;
}
.ascend {
color: green;
}
.tables {
width: 100%;
height: 200px;
background: #fff;
border-radius: 5px;
padding: 15px;
font-size: 16px;
}
.whitebg {
min-height: 1000px;
float: left;
border-radius: 5px;
}
.index_l {
width: 76%;
}
.circle {
width: 80px;
height: 80px;
background: #999;
border-radius: 50%;
margin: 0 auto;
img {
border-radius: 50%;
width: 80px;
height: 80px;
}
}
.index_r {
width: 23%;
margin-left: 1%;
.qy_R {
background: #fff;
min-height: 1267px;
border-radius: 5px;
.inedx_r_top_t {
border-radius: 5px;
height: 270px;
background-size: 100% 100%;
// background: url('../../../assets/index/yd.png') no-repeat;
background-size: cover;
padding: 20px 10px 10px 10px;
color: #fff;
.flexspan {
height: 40px;
line-height: 40px;
background: #fff;
color: #0079de;
border-radius: 4px;
margin-top: 30px;
}
.margint20 {
margin-top: 31px;
}
p {
padding-top: 9px;
}
.p1 {
font-size: 16px;
font-weight: 500;
color: #ffffff;
}
.p2 {
font-size: 14px;
font-weight: 400;
color: #d3e8ff;
}
.p3 {
font-size: 18px;
}
.p4 {
color: #ffffff;
padding-top: 10px;
}
}
.img {
margin: 30px;
width: 175px;
height: 175px;
}
.inedx_r_top_bottom {
padding: 10px 30px;
margin-top: 29px;
.inedx_r_top_bottomp1 {
font-size: 16px;
color: #333333;
}
ul {
margin-top: 20px;
}
ul li {
font-size: 14px;
line-height: 35px;
font-weight: 500;
color: #666;
span {
color: #999999;
}
}
}
}
}
.box {
width: 100%;
}
.titlebox {
height: 80px;
padding: 10px 0;
background: #f1f1f1;
p {
line-height: 30px;
margin: 0;
padding: 0;
}
}
.adminname {
font-size: 20px;
font-weight: bold;
}
.dataall {
width: 100%;
background: #fff;
border-radius: 5px;
padding: 20px;
font-size: 16px;
}
.car {
line-height: 70px;
.grid-content {
overflow: hidden;
background: #fff;
border-radius: 5px;
padding: 10px 30px;
.craname {
line-height: 50px;
font-size: 16px;
}
img {
width: 50px;
height: 50px;
border-radius: 50%;
background: #eee;
}
}
}
}
.card {
margin-top: 40px;
background: #fff;
border-radius: 5px;
padding: 20px;
font-size: 16px;
}
</style>