From 7c8091434b6ffa88adceb0df0d8bfb65fe1bd6cf Mon Sep 17 00:00:00 2001 From: TsMask <340112800@qq.com> Date: Thu, 18 Jan 2024 18:05:03 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E4=BB=AA=E8=A1=A8=E7=9B=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/views/dashboard/cdr/index.vue | 478 +---------- .../overview/components/Topology/index.vue | 419 ++++++++++ src/views/dashboard/overview/css/index.css | 625 ++++++++++++++ .../dashboard/overview/images/border.png | Bin 0 -> 2418 bytes src/views/dashboard/overview/images/brand.png | Bin 0 -> 14403 bytes src/views/dashboard/overview/images/line.png | Bin 0 -> 237 bytes src/views/dashboard/overview/images/rect.png | Bin 0 -> 1089 bytes src/views/dashboard/overview/index.vue | 784 +++++++----------- 8 files changed, 1343 insertions(+), 963 deletions(-) create mode 100644 src/views/dashboard/overview/components/Topology/index.vue create mode 100644 src/views/dashboard/overview/css/index.css create mode 100644 src/views/dashboard/overview/images/border.png create mode 100644 src/views/dashboard/overview/images/brand.png create mode 100644 src/views/dashboard/overview/images/line.png create mode 100644 src/views/dashboard/overview/images/rect.png diff --git a/src/views/dashboard/cdr/index.vue b/src/views/dashboard/cdr/index.vue index 710076b4..48592a07 100644 --- a/src/views/dashboard/cdr/index.vue +++ b/src/views/dashboard/cdr/index.vue @@ -15,486 +15,12 @@ import { hasPermissions } from '@/plugins/auth-user'; import { RESULT_CODE_SUCCESS } from '@/constants/result-constants'; import useI18n from '@/hooks/useI18n'; const { t } = useI18n(); -/**请求点击 */ -let isClick = ref(false); -/**缓存内容信息 */ -let cacheKeyInfo = reactive({ - loading: true, - data: { - cacheKey: '', - cacheName: '', - cacheValue: '', - remark: '', - }, -}); - -/** - * 查询缓存内容详细 - * @param cacheKey - */ -function fnCacheKeyInfo(cacheKey: string) { - if (!hasPermissions(['monitor:cache:query'])) return; - if (isClick.value) return; - isClick.value = true; - cacheKeyInfo.loading = true; - getCacheValue(cacheKeyTable.cacheName, cacheKey).then(res => { - isClick.value = false; - if (res.code === RESULT_CODE_SUCCESS) { - cacheKeyInfo.data = Object.assign(cacheKeyInfo.data, res.data); - cacheKeyInfo.loading = false; - } - }); -} - -/**键名列表表格字段列 */ -let cacheKeyTableColumns: ColumnsType = [ - { - title: t('common.rowId'), - dataIndex: 'num', - width: '50px', - align: 'center', - customRender(opt) { - return opt.index + 1; - }, - }, - { - title: t('views.monitor.cache.cacheKey'), - dataIndex: 'cacheKey', - align: 'left', - ellipsis: true, - // 渲染值处理 - customRender(opt) { - return opt.text; - }, - // 自定义过滤控件 - customFilterDropdown: true, - onFilter: (value, record) => { - if (typeof value === 'string') { - const nameLower = record.cacheKey.toLowerCase(); - return nameLower.includes(value.toLowerCase()); - } - }, - }, - { - title: t('common.operate'), - key: 'option', - align: 'center', - width: '50px', - }, -]; - -/**键名列表表格数据 */ -let cacheKeyTable = reactive({ - loading: false, - data: [], - /**当前键名列表的缓存名称 */ - cacheName: '', -}); - -/** - * 清理指定缓存键名 - * @param cacheKey 键名列表中的缓存键名 - */ -function fnCacheKeyClear(cacheKey: string) { - if (isClick.value) return; - isClick.value = true; - const hide = message.loading(t('common.loading'), 0); - clearCacheKey(cacheKeyTable.cacheName, cacheKey).then(res => { - hide(); - isClick.value = false; - if (res.code === RESULT_CODE_SUCCESS) { - message.success({ - content: t('views.monitor.cache.clearCacheKeyOk', { txt: cacheKey }), - duration: 3, - }); - // 缓存内容显示且是删除的缓存键名,需要进行加载显示 - if (!cacheKeyInfo.loading && cacheKeyInfo.data.cacheKey === cacheKey) { - cacheKeyInfo.loading = true; - } - } else { - message.error({ - content: res.msg, - duration: 3, - }); - } - fnCacheKeyList(); - }); -} - -/** 查询缓存键名列表 */ -function fnCacheKeyList(cacheName: string = 'load') { - if (cacheName === 'load') { - cacheName = cacheKeyTable.cacheName; - } - if (!cacheName) { - message.warning(t('views.monitor.cache.cacheKeyListErr'), 3); - return; - } - if (isClick.value) return; - isClick.value = true; - cacheKeyTable.loading = true; - listCacheKey(cacheName).then(res => { - isClick.value = false; - if (res.code === RESULT_CODE_SUCCESS && res.data) { - cacheKeyTable.cacheName = cacheName; - cacheKeyTable.data = res.data; - cacheKeyTable.loading = false; - } - }); -} - -/**缓存列表表格数据 */ -let cacheNameTable = reactive({ - loading: true, - data: [], -}); - -/**缓存列表表格字段列 */ -let cacheNameTableColumns: ColumnsType = [ - { - title: t('common.rowId'), - dataIndex: 'num', - width: '50px', - align: 'center', - customRender(opt) { - return opt.index + 1; - }, - }, - { - title: t('views.monitor.cache.cacheName'), - dataIndex: 'cacheName', - align: 'left', - ellipsis: true, - // 渲染值处理 - customRender(opt) { - return opt.text; - }, - // 自定义过滤控件 - customFilterDropdown: true, - onFilter: (value, record) => { - if (typeof value === 'string') { - const nameLower = record.cacheName.toLowerCase(); - return nameLower.includes(value.toLowerCase()); - } - }, - }, - { - title: t('views.monitor.cache.remark'), - dataIndex: 'remark', - align: 'left', - ellipsis: true, - }, - { - title: t('common.operate'), - key: 'option', - align: 'center', - width: '50px', - }, -]; - -/**安全清理缓存 */ -function fnClearCacheSafe() { - if (isClick.value) return; - isClick.value = true; - const hide = message.loading(t('common.loading'), 0); - clearCacheSafe().then(res => { - hide(); - isClick.value = false; - if (res.code === RESULT_CODE_SUCCESS) { - message.success({ - content: t('views.monitor.cache.clearCacheSafeOk'), - duration: 3, - }); - cacheKeyTable.loading = true; - cacheKeyInfo.loading = true; - } else { - message.error({ - content: res.msg, - duration: 3, - }); - } - }); -} - -/** - * 清理指定缓存名称 - * @param cacheName 缓存名称 - */ -function fnCacheNameClear(cacheName: string) { - if (isClick.value) return; - isClick.value = true; - const hide = message.loading(t('common.loading'), 0); - clearCacheName(cacheName).then(res => { - hide(); - isClick.value = false; - if (res.code === RESULT_CODE_SUCCESS) { - message.success({ - content: t('views.monitor.cache.clearCacheNameOk', { txt: cacheName }), - duration: 3, - }); - // 缓存内容显示且是删除的缓存名称,需要进行加载显示 - if (!cacheKeyInfo.loading && cacheKeyInfo.data.cacheName === cacheName) { - cacheKeyInfo.loading = true; - } - } else { - message.error({ - content: res.msg, - duration: 3, - }); - } - fnCacheKeyList(cacheName); - }); -} - -/**查询缓存名称列表 */ -function fnCacheNameList() { - if (isClick.value) return; - isClick.value = true; - cacheNameTable.loading = true; - listCacheName().then(res => { - isClick.value = false; - if (res.code === RESULT_CODE_SUCCESS && res.data) { - cacheNameTable.data = res.data; - cacheNameTable.loading = false; - } - }); -} - -onMounted(() => { - fnCacheNameList(); -}); +onMounted(() => {}); diff --git a/src/views/dashboard/overview/components/Topology/index.vue b/src/views/dashboard/overview/components/Topology/index.vue new file mode 100644 index 00000000..a74f12bd --- /dev/null +++ b/src/views/dashboard/overview/components/Topology/index.vue @@ -0,0 +1,419 @@ + + + + + diff --git a/src/views/dashboard/overview/css/index.css b/src/views/dashboard/overview/css/index.css new file mode 100644 index 00000000..883d1798 --- /dev/null +++ b/src/views/dashboard/overview/css/index.css @@ -0,0 +1,625 @@ +.viewport { + /* 限定大小 */ + min-width: 1024px; + max-width: 1920px; + min-height: 780px; + margin: 0 auto; + position: relative; + display: flex; + padding: 5rem 0.833rem 0; + line-height: 1.15; + background-color: #101129; +} + +/* 总览标题 */ +.brand { + background-image: url(../images/brand.png); + background-repeat: no-repeat; + background-size: cover; + background-position: center center; + position: absolute; + top: 0.833rem; + left: 0; + right: 0; + width: 100%; + height: 5rem; + display: flex; + flex-direction: column; + align-items: center; +} +.brand .brand-title { + color: #ffffff; + font-size: 1.4rem; + letter-spacing: 10px; + font-weight: 600; + padding-top: 1rem; + padding-bottom: 0.5rem; +} +.brand .brand-desc { + color: #d9d9d9; + font-size: 0.9rem; +} + +/* 拓扑图 */ +.topology { + height: 24.1rem; + margin-bottom: 0.833rem; + display: flex; + flex-direction: column; +} +.topology .topology-title { + line-height: 1; + padding: 0.667rem 0; + margin: 0; + font-size: 0.833rem; + color: #fff; +} +.topology .topology-chart { + flex: 1; + background-color: rgba(255, 255, 255, 0.05); +} + +.column { + flex: 3; + position: relative; +} + +.panel { + /* 边框 */ + box-sizing: border-box; + border: 2px solid red; + border-image: url(../images/border.png) 51 38 21 132; + border-width: 2.125rem 1.583rem 0.875rem 5.5rem; + position: relative; + margin-bottom: 0.833rem; +} +.panel .inner { + /* 装内容 */ + /* height: 60px; */ + position: absolute; + top: -2.125rem; + right: -1.583rem; + bottom: -0.875rem; + left: -5.5rem; + padding: 1rem 1.5rem; +} +.panel h3 { + font-size: 0.833rem; + color: #fff; +} +/* 概览区域 */ +.overview { + height: 4.583rem; +} +.overview .inner { + display: flex; + justify-content: space-between; +} +.overview h4 { + font-size: 1.167rem; + padding-left: 0.2rem; + color: #fff; + margin-bottom: 0.333rem; +} +.overview span { + font-size: 0.667rem; + color: #4c9bfd; +} +/* 监控 */ +.monitor { + height: 20rem; +} +.monitor .inner { + padding: 1rem 0; + display: flex; + flex-direction: column; +} +.monitor .tabs { + padding: 0 1.5rem; + margin-bottom: 0.75rem; +} +.monitor .tabs a { + color: #1950c4; + font-size: 0.75rem; + padding: 0 1.125rem; +} + +.monitor .tabs a:first-child { + border-right: 0.083rem solid #00f2f1; + padding-left: 0; +} + +.monitor .tabs a.active { + color: #fff; +} +.monitor .content { + flex: 1; + display: none; + position: relative; +} +.monitor .head { + background: rgba(255, 255, 255, 0.1); + font-size: 0.583rem; + padding: 0.5rem 1.5rem; + color: #68d8fe; + display: flex; + justify-content: space-between; + line-height: 1.05; +} +.monitor .col:nth-child(1) { + width: 3.2rem; +} +.monitor .col:nth-child(2) { + width: 8.4rem; + /* 不换行 一行省略*/ + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; +} +.monitor .col:nth-child(3) { + width: 3.2rem; +} +.monitor .marquee-view { + position: absolute; + top: 1.6rem; + bottom: 0; + width: 100%; + overflow: hidden; +} + +.monitor .row { + line-height: 1.05; + padding: 0.5rem 1.5rem; + color: #61a8ff; + font-size: 0.5rem; + position: relative; + display: flex; + justify-content: space-between; +} +.monitor .row:hover { + color: #68d8ff; + background: rgba(255, 255, 255, 0.1); +} +.monitor .row:hover .icon-dot { + opacity: 1; +} + +.monitor .icon-dot { + position: absolute; + left: 0.64rem; + opacity: 0; +} +.monitor .marquee-view { + position: absolute; + top: 1.6rem; + bottom: 0; + width: 100%; + overflow: hidden; +} + +.monitor .row { + line-height: 1.05; + padding: 0.5rem 1.5rem; + color: #61a8ff; + font-size: 0.5rem; + position: relative; + display: flex; + justify-content: space-between; +} +.monitor .row:hover { + color: #68d8ff; + background: rgba(255, 255, 255, 0.1); +} +.monitor .row:hover .icon-dot { + opacity: 1; +} + +.monitor .icon-dot { + position: absolute; + left: 0.64rem; + opacity: 0; +} +/* ------------------------------------------------------------动画 */ +@keyframes row { + 0% { + } + 100% { + transform: translateY(-50%); + } +} +/* 调用动画 */ +.monitor .marquee { + /* //infinite永久调用动画 */ + animation: row 10s linear infinite; +} +/*鼠标划入 停止动画 */ +.monitor .marquee:hover { + animation-play-state: paused; +} +/* 点位 */ +.point { + height: 14.167rem; +} +.point .chart { + display: flex; + margin-top: 1rem; + justify-content: space-between; +} +.point .pie { + width: 13rem; + height: 10rem; + margin-left: -0.4rem; +} +.point .data { + display: flex; + flex-direction: column; + justify-content: space-between; + width: 7rem; + padding: 1.5rem 1.25rem; + box-sizing: border-box; + background-image: url(../images/rect.png); + background-size: cover; +} +.point h4 { + margin-bottom: 0.5rem; + font-size: 1.167rem; + color: #fff; +} +.point span { + display: block; + color: #4c9bfd; + font-size: 0.667rem; +} +/* 地图 */ +.map { + height: 24.1rem; + margin-bottom: 0.833rem; + display: flex; + flex-direction: column; +} +.map h3 { + line-height: 1; + padding: 0.667rem 0; + margin: 0; + font-size: 0.833rem; + color: #fff; +} +.map .icon-cube { + color: #68d8fe; +} +.map .chart { + flex: 1; + background-color: rgba(255, 255, 255, 0.05); +} +.map .geo { + width: 100%; + height: 100%; +} +/* 用户模块 */ +.users { + height: 14.167rem; + display: flex; +} +.users .chart { + display: flex; + margin-top: 1rem; +} +.users .bar { + width: 24.5rem; + height: 10rem; +} +.users .data { + display: flex; + flex-direction: column; + justify-content: space-between; + width: 7rem; + padding: 1.5rem 1.25rem; + box-sizing: border-box; + background-image: url(../images/rect.png); + background-size: cover; +} +.users h4 { + margin-bottom: 0.5rem; + font-size: 1.167rem; + color: #fff; +} +.users span { + display: block; + color: #4c9bfd; + font-size: 0.667rem; +} +/* 订单 */ +.order { + height: 6.167rem; +} +.order .filter { + display: flex; +} +.order .filter a { + display: block; + height: 0.75rem; + line-height: 1; + padding: 0 0.75rem; + color: #1950c4; + font-size: 0.75rem; + border-right: 0.083rem solid #00f2f1; +} +.order .filter a:first-child { + padding-left: 0; +} +.order .filter a:last-child { + border-right: none; +} +.order .filter a.active { + color: #fff; + font-size: 0.833rem; +} +.order .data { + display: flex; + margin-top: 0.833rem; +} +.order .item { + width: 50%; +} +.order h4 { + font-size: 1.167rem; + color: #fff; + margin-bottom: 0.417rem; +} +.order span { + display: block; + color: #4c9bfd; + font-size: 0.667rem; +} +/* 销售区域 */ +.sales { + height: 10.333rem; +} +.sales .caption { + display: flex; + line-height: 1; +} +.sales h3 { + height: 0.75rem; + padding-right: 0.75rem; + border-right: 0.083rem solid #00f2f1; +} +.sales a { + padding: 0.167rem; + font-size: 0.667rem; + margin: -0.125rem 0 0 0.875rem; + border-radius: 0.125rem; + color: #0bace6; +} +.sales a.active { + background-color: #4c9bfd; + color: #fff; +} +.sales .inner { + display: flex; + flex-direction: column; +} +.sales .chart { + flex: 1; + padding-top: 0.6rem; + position: relative; +} +.sales .label { + position: absolute; + left: 1.75rem; + top: 0.75rem; + color: #4996f5; + font-size: 0.583rem; +} +.sales .line { + width: 100%; + height: 100%; +} +/* 渠道区块 */ +.wrap { + display: flex; +} +.channel, +.quarter { + flex: 1; + height: 9.667rem; +} +.channel { + margin-right: 0.833rem; +} +.channel .data { + overflow: hidden; +} +.channel .item { + margin-top: 0.85rem; +} +.channel .item:first-child { + float: left; +} +.channel .item:last-child { + float: right; +} +.channel h4 { + color: #fff; + font-size: 1.333rem; + margin-bottom: 0.2rem; +} +.channel small { + font-size: 50%; +} +.channel span { + display: block; + color: #4c9bfd; + font-size: 0.583rem; +} +/* 季度区块 */ +.quarter .inner { + display: flex; + flex-direction: column; + margin: 0 -0.25rem; +} +.quarter .chart { + flex: 1; + padding-top: 0.75rem; +} +.quarter .box { + position: relative; +} +.quarter .label { + transform: translate(-50%, -30%); + color: #fff; + font-size: 1.25rem; + position: absolute; + left: 50%; + top: 50%; +} +.quarter .label small { + font-size: 50%; +} +.quarter .gauge { + height: 3.5rem; +} +.quarter .data { + display: flex; + justify-content: space-between; +} +.quarter .item { + width: 50%; +} +.quarter h4 { + color: #fff; + font-size: 1rem; + margin-bottom: 0.4rem; +} +.quarter span { + display: block; + width: 100%; + white-space: nowrap; + text-overflow: ellipsis; + overflow: hidden; + color: #4c9bfd; + font-size: 0.583rem; +} +/* 排行榜 */ +.top { + height: 11.8rem; +} +.top .inner { + display: flex; +} +.top .all { + display: flex; + flex-direction: column; + width: 7rem; + color: #4c9bfd; + font-size: 0.6rem; + vertical-align: middle; +} +.top .all ul { + padding-left: 0.5rem; + margin-top: 0.5rem; + flex: 1; + display: flex; + flex-direction: column; + justify-content: space-around; +} +.top .all li { + overflow: hidden; +} +.top .all [class^='icon-'] { + font-size: 1.5rem; + vertical-align: middle; + margin-right: 0.5rem; +} +.top .province { + flex: 1; + display: flex; + flex-direction: column; + color: #fff; +} +.top .province i { + padding: 0 0.5rem; + margin-top: 0.208rem; + float: right; + font-style: normal; + font-size: 0.583rem; + color: #0bace6; +} +.top .province s { + display: inline-block; + transform: scale(0.8); + text-decoration: none; +} +.top .province .icon-up { + color: #dc3c33; +} +.top .province .icon-down { + color: #36be90; +} +.top .province .data { + flex: 1; + display: flex; + margin-top: 0.6rem; +} +.top .province ul { + flex: 1; + line-height: 1; + margin-bottom: 0.25rem; +} +.top .province ul li { + display: flex; + justify-content: space-between; +} +.top .province ul span { + display: block; + overflow: hidden; + white-space: nowrap; + text-overflow: ellipsis; +} +.top .province ul.sup { + font-size: 0.583rem; +} +.top .province ul.sup li { + color: #4995f4; + padding: 0.5rem; +} +.top .province ul.sup li.active { + color: #a3c6f2; + background-color: rgba(10, 67, 188, 0.2); +} +.top .province ul.sub { + display: flex; + flex-direction: column; + justify-content: space-around; + font-size: 0.5rem; + background-color: rgba(10, 67, 188, 0.2); +} +.top .province ul.sub li { + color: #52ffff; + padding: 0.417rem 0.6rem; +} +.clock { + position: absolute; + top: -1.5rem; + right: 1.667rem; + font-size: 0.833rem; + color: #0bace6; +} +.clock i { + margin-right: 5px; + font-size: 0.833rem; +} +@media screen and (max-width: 1600px) { + .top span { + transform: scale(0.9); + } + .top .province ul.sup li { + padding: 0.4rem 0.5rem; + } + .top .province ul.sub li { + padding: 0.23rem 0.5rem; + } + .quarter span { + transform: scale(0.9); + } +} diff --git a/src/views/dashboard/overview/images/border.png b/src/views/dashboard/overview/images/border.png new file mode 100644 index 0000000000000000000000000000000000000000..b854cea479a6d114c6b906d85684a7913ea5703e GIT binary patch literal 2418 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 Khid!K%s&AzyC`=6 literal 0 HcmV?d00001 diff --git a/src/views/dashboard/overview/images/brand.png b/src/views/dashboard/overview/images/brand.png new file mode 100644 index 0000000000000000000000000000000000000000..2f6fb6a099fdb49c59bbd5a3dc4b8dc82aaf44ec GIT binary patch literal 14403 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 A8~^|S literal 0 HcmV?d00001 diff --git a/src/views/dashboard/overview/images/line.png b/src/views/dashboard/overview/images/line.png new file mode 100644 index 0000000000000000000000000000000000000000..34e99aca630e1d8d6eb397f04e4b036f897e8fa4 GIT binary patch literal 237 zcmV0H3dQqa!Y1+3ILTu%iT5S+orP8%1n3nC3Gu=Sfbg#HdtC00000NkvXXu0mjf>9=FR literal 0 HcmV?d00001 diff --git a/src/views/dashboard/overview/images/rect.png b/src/views/dashboard/overview/images/rect.png new file mode 100644 index 0000000000000000000000000000000000000000..6c0ebf00e7d7b0887cd6d585eaebbf50d8016365 GIT binary patch literal 1089 zcmeAS@N?(olHy`uVBq!ia0vp^D}eY72OE%l(De2k0|N_(r;B4q#hkadPxeWtN;q89 zzu>~_=%OT~Fp;&R@VxSeTQ(ktY|b}xFgnfhoTjDWa^Yp(^tZb$(jU(~{i!^3-KziJ zm#W{ZdEMLiw$|2o{+hqGc1Z?np3IzCS(v7`_Gc^C6jNJUWBv6vr#eL54mSS$>Ws|V zkNcQX#n+uVlWkmFdHcJV#_l2;ZS3Ir|@xEM7;Ss$SCmUN6@eRJ0{#^1scm zR06X8ZGE-n)I8gWn|ni-E2jsXTE{)bq;Zm3z$F&1Sq`4U8ktP0z6+LcjtY*H05NN< z%W?_HW%`?yc5nVnd*9Ak)%G9l&z!L~{=Azru;{<(i?=g(S{m=4DIm&!Pvvf;(%+jc z8b8+W{xNxGWp!Gei6Y}9?g_EXlyP3Cr=j#6jY5NQm%Tjy)E|`D*jJurkM(*s~h<{~2Pi{}` z4_&)+@xN{hKmdzcAW PG%$F&`njxgN@xNAXiLX# literal 0 HcmV?d00001 diff --git a/src/views/dashboard/overview/index.vue b/src/views/dashboard/overview/index.vue index 710076b4..f28c37d8 100644 --- a/src/views/dashboard/overview/index.vue +++ b/src/views/dashboard/overview/index.vue @@ -1,500 +1,310 @@ - +