Files
lc_frontend/src/views/Home/Index12.vue

1801 lines
52 KiB
Vue
Raw Normal View History

2025-11-26 14:13:02 +08:00
<template>
<!-- <div v-if="false" class="w-100% flex gap-x-20px">
<div :class="selectByCond(appStore.getMobile, 'w-100%', 'w-80%')">
<div
class="h-260px flex pl-10px pt-10px mb-20px bg-white big-radius .dark:bg-#1A2744"
style="width: calc(100% - 10px)"
>
<div
class="bg-#3370FF w-45% pb-10px mr-10px flex big-radius blue_box_shadow pointer"
style="height: calc(100% - 20px)"
>
<div
:class="selectByCond(isFullscreen, 'w-40% mr-9%', 'w-50%')"
class="pt-10px pb-10px pl-20px pr-20px"
>
<div class="text-white text-32px font-bold mb-5px nowrap">转化率</div>
<div
class="text-white text-14px flex items-center nowrap"
style="font-family: Arial, Helvetica, sans-serif"
>
{{ conversion?.sj }}
<div
class="w-15px h-15px bg-white rounded-md flex items-center justify-center ml-10px"
>
<Icon icon="bytesize:chevron-bottom" :size="12" class="text-black"></Icon>
</div>
</div>
<div class="mt-30px flex nowrap">
<div class="w-50% text-white b-l-0 b-t-0 b-b-0 b-r-1px b-#709BFF b-solid">
<div class="text-12px">成功客户数</div>
<div class="text-16px font-bold mt-5px">{{ conversion?.cgkhs }}</div>
</div>
<div class="w-50% text-white ml-30px">
<div class="text-12px">新增会员数</div>
<div class="text-16px font-bold mt-5px">{{ conversion?.xzhys }}</div>
</div>
</div>
<div
class="mt-30px flex bg-white h-49px pt-5px rounded-md text-blue-600 w-183px pl-20px .dark:bg-#1A2744"
style="align-items: baseline"
>
<span class="text-14px">客单价</span>
<span class="text-32px font-bold ml-10px">{{ conversion?.kdj }}</span>
</div>
</div>
<div :class="selectByCond(isFullscreen, 'w-45% pl-5%', 'w-50%')">
<template v-if="isFullscreen">
<Echart :options="oilGauge_app_option" width="100%" height="250px" />
</template>
<template v-else>
<Echart :options="oilGauge_option" width="100%" height="250px" />
</template>
</div>
</div>
<div class="oilGauge_line .dark:b-#525C73">
<div
:class="selectByCond(appStore.getMobile, 'gap-x-5px', 'gap-x-20px')"
class="grid grid-cols-4 ml-20px"
>
<div
class="truncate flex-shrink-0"
v-for="item in ConversionList"
:key="item.titleCode"
>
<div class="flex" style="align-items: baseline">
<span
:class="selectByCond(isFullscreen, 'text-16px', 'text-28px')"
class="font-bold"
>{{ item.nowNum }}</span
>
<template v-if="item.nowNum >= item.beforeNum">
<div class="arrow-top flex justify-center ml-10px">
<Icon icon="mdi:arrow-top-bold" class="text-white .dark:text-black"></Icon>
</div>
</template>
<template v-else>
<div class="arrow-bottom flex items-center justify-center ml-10px">
<Icon icon="mdi:arrow-bottom-bold" class="text-white .dark:text-black"></Icon>
</div>
</template>
</div>
<div class="text-14px mt-5px">
<span class="text-13px">/</span>
昨日{{ item.beforeNum }}
</div>
<div class="mt-5px pb-5px">
<div
:class="defaultConversion == item.titleCode ? 'active-conversion' : ''"
class="text-14px c-#A2A7C2 cursor-pointer .dark:text-white"
@click="clickSelectConversion(item.titleCode)"
style="width: max-content"
>
{{ item.title }}
</div>
</div>
</div>
</div>
<div class="oilGauge_line_echart">
<Echart :options="oilGauge_line_option" width="100%" height="150px" />
</div>
</div>
</div>
<div class="w-100% flex gap-x-20px">
<div
class="h-390px w-50% p-10px mb-20px bg-white big-radius flex items-center .dark:bg-#1A2744"
>
<div class="w-100%">
<div class="h-150px text-25px flex items-center justify-center mb-20px">
<template v-if="typeof advertising == 'string'">
{{ advertising }}
</template>
<template v-else-if="typeof advertising == 'object'">
<el-carousel height="150px" class="w-100% rounded-xl">
<el-carousel-item
class="text-center"
v-for="(item, index) in advertising"
:key="index"
>
<el-image :src="item.imgUrl" class="h-100% w-100%" fit="cover"></el-image>
</el-carousel-item>
</el-carousel>
</template>
</div>
<div class="pt-10px b-solid b-l-0 b-r-0 b-b-0 b-t-1px b-#5D677D">
<div class="flex">
<div>
<span
class="c-#FF0000 font-bold .dark:text-white"
:class="
refineSelectByCond(
'text-9px',
'text-12px',
''
)
"
>
某赞商家&thinsp;&thinsp;<span class="c-#ED6A0C font-bold .dark:text-white"
>不打烊</span
>
</span>
</div>
<div
class="flex items-center ml-20px pl-20px b-solid b-t-0 b-r-0 b-b-0 b-l-2px b-#EEF1FF"
>
<el-avatar src="/img/avatar1.png" size="small" />
<span class="c-#FF0000 font-bold text-13px ml-10px .dark:text-white">
某赞护航
<span class="ml-15px font-100">为你的生意保驾护航</span>
</span>
</div>
</div>
<div class="h-155px flex mt-20px bg-#EEF1FF small-radius .dark:bg-black">
<div
:class="selectByCond(appStore.getMobile, 'w-50%', 'w-65%')"
class="h-100% flex items-center"
>
<div
class="text-12px h-90% flex justify-center p-l-25px"
style="flex-direction: column"
>
<div
v-for="(item, index) in merchantIntroduction"
:key="item.title + index"
class="flex-auto flex items-center div_to_ul"
>
<span class="mr-10px shrink-0 w-50px">{{ item.title }}</span>
<span
:class="
refineSelectByCond(
'w-75px',
'w-100px',
'w-170px'
)
"
class="truncate b-solid b-t-0 b-r-0 b-b-0 b-l-1px b-#E0E6ED pl-10px"
>
{{ item.content }}
</span>
</div>
</div>
</div>
<div
class="w-35% bg-#3370FF m-10px p-20px small-radius cursor-pointer c-white blue_box_shadow"
>
<div class="text-11px"> 查看全部经验建议 </div>
<div class="text-32px h-60px" style="line-height: 60px"> {{ sjjysl }} </div>
<div class="text-13px flex items-center">
/
<Icon icon="si:arrow-right-fill" :size="24" class="ml-auto"></Icon>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="h-390px w-50% p-10px mb-20px bg-white big-radius .dark:bg-#1A2744">
<div class="p-10px flex" style="height: calc(100% - 20px)">
<div class="w-180px">
<div class="font-bold text-22px"> 智能助手 </div>
<div class="c-#A2A7C2 text-13px mt-5px .dark:text-white">
感受下某赞黑科技的力量
</div>
<div class="w-180px h-180px animation-box mt-30px">
<div
class="znzs-one w-180px h-180px bg-#f8f8fd .dark:bg-#56607A"
:class="znzsType == 'hover' ? 'hover' : ''"
>
</div>
<div
class="znzs-two w-150px h-150px bg-#e8eafb .dark:bg-#9098B4"
:class="znzsType == 'hover' ? 'hover' : ''"
>
</div>
<div class="znzs-three w-130px h-130px" :class="znzsType == 'hover' ? 'hover' : ''">
</div>
<div class="znzs-four w-110px h-110px"> </div>
<div class="znzs-xdcl text-13px text-white">项待处理 </div>
<div class="znzs-ck pointer w-60px h-60px c-white text-52px font-bold text-center">
<div
class="znzs-sz h-300px w-100%"
:class="znzsType == 'nothover' ? 'nothover' : ''"
@mouseover="znzsMouseover"
@mouseout="znzsMouseout"
>
<div
class="h-60px"
style="line-height: 60px"
v-for="item in animationList"
:key="item"
>
{{ item }}
</div>
<div class="h-76px" style="line-height: 60px">
<Icon icon="charm:chevrons-up" :size="36" class=""></Icon>
</div>
</div>
</div>
</div>
<div class="flex justify-center mt-50px">
<div
class="w-140px h-40px text-14px flex items-center justify-center cursor-pointer bg-#3370FF c-white small-radius"
>
去解决掉TA
</div>
</div>
</div>
<div class="h-100% znzs-tabs ml-10px" style="width: calc(100% - 180px)">
<div class="w-80%">
<el-tabs v-model="activeName" class="" @tab-click="handleClick">
<el-tab-pane label="全部" name="1"></el-tab-pane>
<el-tab-pane label="店铺基础" name="2"></el-tab-pane>
<el-tab-pane label="商品体验" name="3"></el-tab-pane>
<el-tab-pane label="物流体验" name="4"></el-tab-pane>
</el-tabs>
</div>
<div class="tabs-position-icon">
<Icon icon="material-symbols:menu" :size="26"></Icon>
</div>
<div>
<Echart
:options="znzs_option"
:width="
refineSelectByCond('150px', '250px', '300px')
"
height="190px"
/>
</div>
<div class="grid grid-rows-3 text-11px gap-y-20px mt-20px">
<div
v-for="(item, index) in znzsIntroduce"
:key="item.xxnra + index"
class="flex items-center"
>
<template v-if="item.jjcd == 1">
<el-image src="/img/hq1.png" fit="contain" class="h-15px"></el-image>
</template>
<template v-else-if="item.jjcd == 0">
<el-image src="/img/lq1.png" fit="contain" class="h-15px"></el-image>
</template>
<div
class="ml-15px flex truncate"
:class="
refineSelectByCond(
'w-80px',
'w-180px',
'w-190px'
)
"
>
<div class="truncate" style="max-width: 100%; flex-shrink: 0">
{{ item.xxnra }}
</div>
<div v-if="item.xxnrb" class="c-#C7CCD0 ml-5px truncate .dark:text-white">
{{ item.xxnrb }}</div
>
</div>
<span class="ml-auto c-#3370FF cursor-pointer .dark:text-white">
{{ item.btname }}
</span>
</div>
</div>
<div class="mt-20px text-11px c-#3370FF cursor-pointer .dark:text-white">
还有 {{ overviewPendingLen }} 条内容查看全部内容
</div>
</div>
</div>
</div>
</div>
<div class="w-100% flex gap-x-30px">
<div
:class="
refineSelectByCond(
'w-90% h-85px gap-x-10px',
'w-93% h-85px gap-x-30px',
'w-95% h-115px gap-x-30px'
)
"
class="mb-20px big-radius flex"
>
<div
class="flex-shrink-0 bg-#1DC9B7 small-radius c-white"
style="box-shadow: 0 3px 20px rgb(29 201 183 / 29.8%)"
>
<div class="h-100% pl-20px pr-20px flex items-center">
<div class="w-75%">
<div
:class="
refineSelectByCond(
'text-12px',
'text-20px',
'text-24px'
)
"
class="font-bold mb-10px"
>微信小程序</div
>
<div
:class="
refineSelectByCond(
'text-6px',
'text-12px',
'text-13px'
)
"
class="truncate"
>抢占微信设计流量红利</div
>
</div>
<div class="w-25%">
<el-image src="/img/wxxcx1.png" fit="contain" class="h-45px" />
</div>
</div>
</div>
<div class="flex-shrink-0 bg-#3370FF blue_box_shadow small-radius c-white">
<div class="h-100% pl-20px pr-20px flex items-center">
<div class="w-75%">
<div
:class="
refineSelectByCond(
'text-12px',
'text-20px',
'text-24px'
)
"
class="font-bold mb-10px"
>百度小程序</div
>
<div
:class="
refineSelectByCond(
'text-6px',
'text-12px',
'text-13px'
)
"
class="truncate"
>打造商家新官网</div
>
</div>
<div class="w-25%">
<el-image src="/img/wxxcx1.png" fit="contain" class="h-45px" />
</div>
</div>
</div>
<div
class="flex-shrink-0 bg-#C227FC small-radius c-white"
style="box-shadow: 0 3px 20px rgb(194 39 252 / 29.8%)"
>
<div class="h-100% pl-20px pr-20px flex items-center">
<div class="w-75%">
<div
:class="
refineSelectByCond(
'text-12px',
'text-20px',
'text-24px'
)
"
class="font-bold mb-10px"
>分销市场</div
>
<div
:class="
refineSelectByCond(
'text-6px',
'text-12px',
'text-13px'
)
"
class="truncate"
>一键上架快速补充货源</div
>
</div>
<div class="w-25%">
<el-image src="/img/fxsc.png" fit="contain" class="h-45px" />
</div>
</div>
</div>
<div
class="flex-shrink-0 bg-#F2637B small-radius c-white"
style="box-shadow: 0 3px 20px rgb(242 99 123 / 29.8%)"
>
<div class="h-100% pl-20px pr-20px flex items-center">
<div class="w-75%">
<div
:class="
refineSelectByCond(
'text-12px',
'text-20px',
'text-24px'
)
"
class="font-bold mb-10px"
>多人拼团</div
>
<div
:class="
refineSelectByCond(
'text-6px',
'text-12px',
'text-13px'
)
"
class="truncate"
>裂变式营销玩法</div
>
</div>
<div class="w-25%">
<el-image src="/img/pin.png" fit="contain" class="h-45px" />
</div>
</div>
</div>
</div>
<div
:class="
refineSelectByCond(
'w-7% h-85px',
'w-6% h-85px',
'w-5% pr-10px pl-10px h-115px'
)
"
class="mb-20px bg-#3370FF blue_box_shadow flex justify-center small-radius text-white text-12px"
>
<div
:class="selectByCond(appStore.getMobile, 'leading-4.5', 'leading-6')"
class="w-50% h-100% mt-10px cursor-pointer text-center"
>
更多最新推荐
<Icon
icon="pepicons-pop:arrow-left"
:size="selectByCond(appStore.getMobile, '18', '24')"
></Icon>
</div>
</div>
</div>
<div class="w-100% flex gap-x-30px">
<div
:class="
refineSelectByCond(
'w-7% h-85px',
'w-6% h-85px',
'w-5% pr-10px pl-10px h-115px'
)
"
class="mb-20px bg-#3370FF blue_box_shadow flex justify-center small-radius text-white text-12px"
>
<div
:class="selectByCond(appStore.getMobile, 'leading-4.5', 'leading-6')"
class="w-50% h-100% mt-10px cursor-pointer text-center"
>
全部经营建议
<Icon
icon="pepicons-pop:arrow-right"
:size="selectByCond(appStore.getMobile, '18', '24')"
></Icon>
</div>
</div>
<div
:class="
refineSelectByCond(
'w-90% h-85px gap-x-10px',
'w-93% h-85px gap-x-30px',
'w-95% h-115px gap-x-30px'
)
"
class="mb-20px big-radius flex"
>
<div
v-for="(item, index) in jyjyList"
:key="item.title + index"
class="w-100% bg-white small-radius .dark:bg-#1A2744"
>
<div class="h-100% pl-20px pr-20px flex items-center">
<div class="w-25%">
<el-image :src="item.imgUrl" fit="contain" />
</div>
<div class="w-75% ml-5px">
<div
:class="
refineSelectByCond(
'text-12px',
'text-20px',
'text-24px'
)
"
class="font-bold mb-10px"
>{{ item.title }}</div
>
<div
:class="
refineSelectByCond(
'text-6px',
'text-10px',
'text-12px'
)
"
class="c-#A2A7C2 truncate .dark:text-white"
>{{ item.introduction }}</div
>
</div>
</div>
</div>
</div>
</div>
<div class="w-100% mb-20px">
<div class="h-240px p-20px pl-40px bg-white small-radius .dark:bg-#1A2744">
<div class="font-bold text-24px"> 学习交流 </div>
<div class="text-14px mt-5px c-#A2A7C2 .dark:text-white">
成长必经之路好好看好好学...
</div>
<div class="w-85% mt-20px flex">
<div class="w-100% grid gap-x-30px gap-y-20px grid-cols-3">
<div
class="pl-10px h-66px flex items-center bg-#EEF1FF small-radius .dark:bg-black"
v-for="(item, index) in learningExchangeList"
:key="index"
>
<div class="w-25%">
<el-image :src="item.imgUrl" fit="contain" />
</div>
<div class="w-75%">
<div class="font-bold mb-5px">{{ item.title }}</div>
<div class="text-12px c-#A2A7C2 truncate .dark:text-white">{{
item.introduce
}}</div>
</div>
</div>
</div>
<div
class="h-150px w-60px pr-10px pl-10px ml-30px bg-#3370FF blue_box_shadow flex justify-center small-radius text-white text-12px"
>
<div class="w-50% h-100% mt-10px leading-8 cursor-pointer">
更多渠道学习
<Icon icon="pepicons-pop:arrow-left" :size="24"></Icon>
</div>
</div>
</div>
</div>
</div>
<div class="w-100%">
<div class="h-240px p-20px pl-40px bg-white small-radius .dark:bg-#1A2744">
<div class="font-bold text-24px"> 更多服务 </div>
<div class="text-14px mt-5px c-#A2A7C2 .dark:text-white"> 想要找找其他的服务 </div>
<div class="flex h-130px mt-30px">
<div class="grid grid-cols-5 grid-rows-1 h-100%">
<div
v-for="(item, index) in moreServicesList"
:key="item.title + index"
class="bg-#EEF1FF small-radius mr-20px h-130px flex items-center justify-center .dark:bg-black"
style="flex-direction: column; min-width: 90px"
>
<div class="">
<el-image :src="item.imgUrl" fit="contain" />
</div>
<div class="font-bold mt-15px"> {{ item.title }} </div>
</div>
</div>
<div
class="w-70px h-100% pr-5px pl-5px bg-#3370FF blue_box_shadow small-radius text-white text-12px"
>
<div class="ml-10px mr-10px h-100% mt-10px leading-8 text-center cursor-pointer">
或者没你想要的联系我
</div>
</div>
</div>
</div>
</div>
</div>
<template v-if="!appStore.getMobile">
<div class="w-20% flex-shrink-0">
<div class="w-100%">
<div
class="h-300px p-20px bg-white mb-20px big-radius flex items-center .dark:bg-#1A2744"
>
<div class="w-100%">
<div class="text-21px font-bold"> 如果你需要帮助 </div>
<div class="text-13px c-#A2A7C2 mt-5px mb-20px .dark:text-white"> 随时呼叫我... </div>
<div class="w-100%">
<div
class="h-60px mb-15px bg-#EEF1FF small-radius flex items-center pl-10px pr-10px .dark:bg-black"
v-for="(item, index) in bzList"
:key="item.title + index"
>
<el-image :src="item.imgUrl" fit="contain" class="h-30px" />
<div class="ml-15px">
<div class="text-14px font-bold">{{ item.title }}</div>
<div class="c-#A2A7C2 text-11px .dark:text-white">{{ item.introduction }}</div>
</div>
<Icon
icon="pepicons-pop:arrow-right"
:size="24"
class="ml-auto cursor-pointer"
></Icon>
</div>
</div>
</div>
</div>
<div
class="h-300px p-20px bg-white mb-20px big-radius flex items-center .dark:bg-#1A2744"
>
<div class="w-100%">
<div class="text-21px font-bold"> 有你的服务通知 </div>
<div class="text-13px c-#A2A7C2 mt-5px mb-20px .dark:text-white">
随时关注动态...
</div>
<div class="w-100% grid gap-y-15px">
<div
class="bg-#EEF1FF small-radius p-10px pt-13px pb-13px .dark:bg-black"
v-for="(item, index) in fwtzList"
:key="index"
>
<div class="font-bold"> {{ item.title }} </div>
<div class="c-#A2A7C2 text-12px mt-5px .dark:text-white">
{{ item.content }}
</div>
<div class="flex justify-center mt-10px">
<div class="flex justify-between text-12px c-#3370FF w-60% .dark:text-white">
<div class="cursor-pointer">查看详情</div>
<div class="cursor-pointer">我知道了</div>
</div>
</div>
</div>
</div>
</div>
</div>
<template v-for="(item, index) in rightList" :key="item.title + index">
<div
:class="item.h == '210' ? 'h-210px' : 'h-240px'"
class="p-20px bg-white mb-20px big-radius flex items-center .dark:bg-#1A2744"
>
<div class="w-100%">
<div class="text-23px font-bold"> {{ item.title }} </div>
<div class="text-14px c-#3370FF mt-5px mb-15px cursor-pointer .dark:text-white">
查看全部
</div>
<div class="w-100%">
<div
class="bg-#EEF1FF small-radius p-10px h-130px .dark:bg-black"
style="width: calc(100% - 20px)"
>
<div class="font-bold mb-15px">{{ item.totalTitle }}</div>
<div class="c-#A2A7C2 w-100% text-11px grid grid-rows-4">
<div
v-for="(cItem, cIndex) in item.content"
:key="cItem.title + cIndex"
class="mb-5px cursor-pointer .dark:text-white"
:class="cItem.type == 'success' ? 'c-#F2637B' : 'flex'"
>
{{ cItem.title }}
<div v-if="cItem.type == 'info'" class="ml-auto">
<Icon icon="mingcute:right-line" />
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</template>
</div>
</div>
</template>
</div> -->
<div class="shouye">
<img src="@/assets/imgs/souye.png" />
</div>
</template>
<script lang="ts" setup>
import Icon from '@/components/Icon/src/Icon.vue'
import 'echarts/lib/component/markLine'
import 'echarts/lib/component/markPoint'
import type { TabsPaneContext } from 'element-plus'
import { CACHE_KEY, useCache } from '@/hooks/web/useCache'
import { useAppStore } from '@/store/modules/app'
import { getTableList, batchGetTableList } from '@/api/design/report'
import { cloneDeep } from 'lodash-es'
defineOptions({ name: 'Home10' })
interface Advertising {
imgUrl: string
}
interface ZnzsIntroduce {
jjcd: number
xxnra: string
xxnrb?: string
btname?: string
}
interface FwtzList {
content: string
title: string
}
interface RightListContent {
type: string
title: string
}
interface RightList {
title: string
h: string
totalTitle?: string
content?: RightListContent[]
}
interface MerchantIntroduction {
title: string
content: string
}
const appStore = useAppStore()
// 是否全屏
const isFullscreen = computed(() =>appStore.getFullscreen);
// type为true返回classOne反之返回classTwo
const selectByCond = (type, classOne, classTwo) => {
if (typeof type === 'boolean' && type) {
return classOne
} else {
return classTwo
}
}
const refineSelectByCond = (isFullscreenClsss, mobileClass, otherClass) => {
if (isFullscreen.value) {
return isFullscreenClsss
} else if (appStore.getMobile) {// 判断是否手机端
return mobileClass
} else {
return otherClass
}
}
const conversion = ref({
cgkhs: 0,
sj: '',
kdj: 0,
xzhys: 0
})
const oilGaugeValue = ref(45)
const oilGaugeCode = ref('%')
const oilGaugeSubtext = ref('访问-支付转化率')
const oilGaugemax = ref(100)
// 访问-支付转化率
const oilGauge_app_option = ref<any>()
const oilGauge_option = ref({
title: [
{
text: `{primary|${oilGaugeValue.value}}\t{point|${oilGaugeCode.value}}`,
left: 'center',
top: 'center',
textStyle: {
rich: {
primary: {
color: 'white',
fontWeight: 'bold',
fontSize: 32,
lineHeight: 67.2
},
point: {
fontSize: 12,
lineHeight: 22,
color: 'white',
padding: [10, -10, 0, -5]
}
}
}
},
{
left: 'center',
top: '70%',
subtext: `${oilGaugeSubtext.value}`,
subtextStyle: {
color: 'white',
fontSize: 12
}
}
],
angleAxis: {
axisLine: {
show: false
},
axisLabel: {
show: false
},
splitLine: {
show: false
},
axisTick: {
show: false
},
min: 0,
max: 6.666,
startAngle: 225
},
radiusAxis: {
type: 'category',
axisLine: {
show: false
},
axisTick: {
show: false
},
axisLabel: {
show: false
},
data: ['a', 'b', 'c'],
z: 10
},
polar: {
radius: '105%'
},
series: [
{
type: 'gauge',
splitNumber: 20,
max: oilGaugemax.value,
radius: '75%',
detail: {
show: false
},
axisLine: {
// 坐标轴线
show: false,
lineStyle: {
color: [
[0, '#ADC6FF'],
[1, '#ADC6FF']
],
width: 0,
opacity: 0
}
},
data: [
{
name: '',
value: oilGaugeValue.value
}
],
splitLine: {
length: 20, //长刻度节点线长度
lineStyle: {
width: 4,
color: '#ADC6FF'
} //刻度节点线
},
axisTick: {
show: false
},
axisLabel: {
show: false,
color: '#333',
fontSize: 18
},
pointer: {
show: true,
icon: 'roundRect',
length: '60%',
offsetCenter: [0, -25],
itemStyle: {
color: {
type: 'linear',
x: 0,
y: 0,
x2: 0,
y2: 1,
colorStops: [
{
offset: 0,
color: 'white'
},
{
offset: 1,
color: 'rgba(255, 255, 255, 0)'
}
]
},
opacity: 0.9
}
}
}
],
tooltip: {
show: false
}
})
// 折线图
const goTo = ref<number[]>([])
const goOut = ref<number[]>([])
const oilGaugeLineXAxis = ref<string[]>([])
const showoilGaugeLineLable = ref('')
const ConversionList = ref([
{ nowNum: 0, beforeNum: 0, title: '支付金额', titleCode: 'zfje' },
{ nowNum: 0, beforeNum: 0, title: '支付订单', titleCode: 'zfdd' },
{ nowNum: 0, beforeNum: 0, title: '浏览量', titleCode: 'lll' },
{ nowNum: 0, beforeNum: 0, title: '访客数', titleCode: 'fks' }
])
const defaultConversion = ref('')
let oilGaugeMarkPoint = computed(() => {
let str = {
goTo: ['1', goTo.value[0] || 0],
goOut: ['1', goOut.value[0] || 0]
}
return str
})
const oilGauge_line_option = ref<any>({
color: ['#F2F4F5', '#3571FE'],
grid: {
top: '15%',
bottom: '0',
left: '0',
right: '0'
},
xAxis: [
{
show: false,
boundaryGap: false,
data: oilGaugeLineXAxis.value
}
],
yAxis: [
{
show: false
}
],
series: [
{
name: '昨天',
type: 'line',
symbolSize: 0,
smooth: true,
lineStyle: {
normal: {
width: 2
}
},
data: goTo.value,
silent: true
},
{
name: '今天',
type: 'line',
symbol: 'circle',
symbolSize: 0,
smooth: true,
lineStyle: {
normal: {
width: 3
}
},
areaStyle: {
color: {
type: 'linear',
x: 0,
y: 0,
x2: 0,
y2: 1,
colorStops: [
{
offset: 0,
color: '#326ffd5f' // 0% 处的颜色
},
{
offset: 1,
color: '#326ffd13' // 100% 处的颜色
}
],
global: false // 缺省为 false
}
},
data: goOut.value,
silent: true
},
{
type: 'line',
data: [],
markLine: {
symbol: 'none',
lineStyle: {
type: 'dashed'
},
data: [
[
{
xAxis: 0,
yAxis: 0
},
{
xAxis: 0,
yAxis: 0,
label: {
formatter: `{aa|${showoilGaugeLineLable.value}}`,
rich: {
aa: {
color: 'rgba(100, 108, 154, 0.6)',
fontSize: 12
}
}
}
}
],
[
{
xAxis: 0,
yAxis: 0
},
{
xAxis: 0,
yAxis: 0,
label: {
formatter: `{aaa|}`,
rich: {
aaa: {
color: 'rgba(100, 108, 154, 0.6)',
fontSize: 12
}
}
}
}
]
]
},
markPoint: {
data: [
{
coord: oilGaugeMarkPoint.value['goTo'],
symbol: 'circle',
symbolSize: 16,
label: {
formatter: '昨日',
color: 'rgba(100, 108, 154, 0.6)',
offset: [20, -10]
},
itemStyle: {
color: 'rgba(255, 255, 255, 0)'
}
},
{
coord: oilGaugeMarkPoint.value['goOut'],
symbol: 'circle',
symbolSize: 16,
label: {
formatter: '今日',
color: '#3571FE',
offset: [20, -10]
},
itemStyle: {
color: 'rgba(255, 255, 255, 0)',
silent: true
}
}
]
},
silent: true
}
]
})
const initConversion = (realtimeData) => {
if (!realtimeData) return
ConversionList.value.forEach((ele) => {
ele.nowNum = realtimeData[ele.titleCode].jr
ele.beforeNum = realtimeData[ele.titleCode].zr
realtimeData[ele.titleCode].flag == 1
? (defaultConversion.value = ele.titleCode)
: (defaultConversion.value = 'zfje')
})
realtimeData.data.forEach((ele) => {
goTo.value.push(ele.zr)
oilGaugeLineXAxis.value.push(ele.sj)
if (ele.jr) goOut.value.push(ele.jr)
})
let goOutLength = goOut.value.length - 1
let nowGoOut = goOut.value[goOutLength]
let nowGoTo = goTo.value[goOutLength]
nowGoOut < nowGoTo
? (showoilGaugeLineLable.value = '加把劲,就上去了...')
: (showoilGaugeLineLable.value = '')
const series2 = oilGauge_line_option.value.series[2]
series2.markLine.data[0][0].xAxis = goOutLength
series2.markLine.data[0][1].xAxis = goOutLength
series2.markLine.data[0][1].yAxis = nowGoOut
series2.markLine.data[0][1].label.formatter = `{aa|${showoilGaugeLineLable.value}}`
series2.markLine.data[1][1].label.formatter = `{aaa|更新时间:${realtimeData.gxsj}}`
series2.markLine.data[1][0].xAxis = goOutLength
series2.markLine.data[1][1].xAxis = goOutLength
series2.markLine.data[1][1].yAxis = nowGoOut + nowGoTo + 20
series2.markPoint.data[0].coord = oilGaugeMarkPoint.value.goTo
series2.markPoint.data[1].coord = oilGaugeMarkPoint.value.goOut
}
const clickSelectConversion = async (val) => {
let res = await getTableList('example_overview_realtime_data', { type: 3 })
goTo.value = []
goOut.value = []
oilGaugeLineXAxis.value = []
initConversion(res.records[0])
defaultConversion.value = val
}
const moreServicesList = ref([
{
imgUrl: '/img/gdfw.png',
title: '零售'
},
{
imgUrl: '/img/gdfw.png',
title: '教育'
},
{
imgUrl: '/img/gdfw.png',
title: '美业'
},
{
imgUrl: '/img/gdfw.png',
title: '某赞精选'
},
{
imgUrl: '/img/gdfw.png',
title: '我要推广'
}
])
const learningExchangeList = ref([
{
title: '商家论坛',
introduce: '百万商家互通互助',
imgUrl: '/img/xxjl.png'
},
{
title: '线下培训',
introduce: '点击查看全国活动',
imgUrl: '/img/xxjl.png'
},
{
title: '服务市场',
introduce: '服务商帮你经营',
imgUrl: '/img/xxjl.png'
},
{
title: '在线课堂',
introduce: '资深专家视频授课',
imgUrl: '/img/xxjl.png'
},
{
title: '本地商盟',
introduce: '加入本地商家联盟',
imgUrl: '/img/xxjl.png'
},
{
title: '定制服务',
introduce: '定制开发专享功能',
imgUrl: '/img/xxjl.png'
}
])
const rightList = ref<RightList[]>([
{
title: '规则中心',
h: '210'
},
{
title: '产品动态',
h: '240'
},
{
title: '学习中心',
h: '240'
}
])
// 广告区域
// const advertising = ref<string | Advertising[]>('广告banner')
const advertising = ref<string | Advertising[]>([{ imgUrl: '/img/sygl1.png' }])
const sjjysl = ref('')
const merchantIntroduction = ref<MerchantIntroduction[]>()
const jyjyList = ref([
{
imgUrl: '',
whiteImgUrl: '/img/whitelltz.png',
blackImgUrl: '/img/blacklltz.png',
title: '流量拓展',
introduction: '小程序分享至朋友圈'
},
{
imgUrl: '',
whiteImgUrl: '/img/whitehyzm.png',
blackImgUrl: '/img/blackhyzm.png',
title: '会员招募',
introduction: 'App端支持办理会员卡'
},
{
imgUrl: '',
whiteImgUrl: '/img/whitefyzd.png',
blackImgUrl: '/img/blackfyzd.png',
title: '费用账单',
introduction: '便捷管理店铺账目收支'
},
{
imgUrl: '',
whiteImgUrl: '/img/whitesptg.png',
blackImgUrl: '/img/blacksptg.png',
title: '商品推广',
introduction: '多平台推广商品类目信息'
}
])
const bzList = ref([
{
imgUrl: '/img/zxkf.png',
title: '在线客服',
introduction: '电话057 - 8888 8888'
},
{
imgUrl: '/img/zmkf.png',
title: '桌面在线客服',
introduction: '即时应答客户在线咨询'
},
{
imgUrl: '/img/sjkf.png',
title: '移动客户端',
introduction: '使用手机、Pad管理店铺'
}
])
const znzsType = ref('hover')
const znzsMouseover = () => {
znzsType.value = 'hover'
}
const znzsMouseout = () => {
znzsType.value = 'nothover'
}
const activeName = ref('1')
const initZnzs = (data) => {
if (!data) return
znzsSeries.value = [data.dfhdd, data.dhfkf, data.yzxsp, data.dtkdd, data.pdzkh]
znzs_option.value.series.data = znzsSeries.value
}
// 点击智能助手tabs事件
const handleClick = async (tab: TabsPaneContext, event: Event) => {
let res = await getTableList('example_overview_intelligent_assistants', {
type: tab.props.name
})
initZnzs(res.records[0])
}
const znzsSeries = ref<number[]>([])
const znzs_option = ref({
grid: {
left: '0',
right: '0',
bottom: '20%',
top: '12%'
},
xAxis: {
type: 'category',
data: ['待发货订单', '待回复客服', '已滞销商品', '待退款订单', '排队中客户'],
axisLine: {
lineStyle: {
color: 'white'
}
},
axisLabel: {
color: '#C7CCD0', // x轴颜色
fontWeight: 'lighter',
fontSize: '9',
width: 30,
lineHeight: 13,
overflow: 'break'
},
axisTick: {
show: false
}
},
yAxis: [
{
show: false,
splitLine: {
show: false
},
axisTick: {
show: false
}
}
],
series: {
name: '系列一',
type: 'bar',
barWidth: '16',
itemStyle: {
color: {
type: 'linear',
x: 0,
y: 0,
x2: 0,
y2: 1,
colorStops: [
{ offset: 0, color: '#7523FD' },
{ offset: 1, color: '#356DFF' }
]
},
borderRadius: 2
},
label: {
show: true,
position: 'top',
color: 'black',
fontSize: 12
},
data: znzsSeries.value
}
})
const animationList = ref<number[]>([])
const overviewPendingLen = ref(0)
const znzsIntroduce = ref<ZnzsIntroduce[]>([])
const numTop = ref('')
const fwtzList = ref<FwtzList[]>([])
const markData = oilGauge_line_option.value.series[2].markLine
const markPoint = oilGauge_line_option.value.series[2].markPoint
const switchMode = () => {
// 判断是否为暗色模式
const { wsCache } = useCache()
if (wsCache.get(CACHE_KEY.IS_DARK)) {
document.documentElement.style.setProperty('--tabs-item-color', 'white')
znzs_option.value.series.label.show = false
znzs_option.value.xAxis.axisLabel.color = 'white'
znzs_option.value.xAxis.axisLine.lineStyle.color = '#1A2744'
jyjyList.value.forEach((ele) => {
ele.imgUrl = ele.blackImgUrl
})
oilGauge_line_option.value.color = ['#848C9B', '#3571FE']
if (markData) {
markData.data[0][1].label.rich.aa.color = 'white'
markData.data[1][1].label.rich.aaa.color = 'white'
}
if (markPoint) {
markPoint.data[0].label.color = 'white'
markPoint.data[1].label.color = 'white'
}
} else {
jyjyList.value.forEach((ele) => {
ele.imgUrl = ele.whiteImgUrl
})
}
}
watch(
() => appStore.isDark,
(val) => {
if (val) {
document.documentElement.style.setProperty('--tabs-item-color', 'white')
znzs_option.value.series.label.show = false
znzs_option.value.xAxis.axisLabel.color = 'white'
znzs_option.value.xAxis.axisLine.lineStyle.color = '#1A2744'
jyjyList.value.forEach((ele) => {
ele.imgUrl = ele.blackImgUrl
})
oilGauge_line_option.value.color = ['#848C9B', '#3571FE']
if (markData) {
markData.data[0][1].label.rich.aa.color = 'white'
markData.data[1][1].label.rich.aaa.color = 'white'
}
if (markPoint) {
markPoint.data[0].label.color = 'white'
markPoint.data[1].label.color = 'white'
}
// 暗色
} else {
document.documentElement.style.setProperty('--tabs-item-color', 'rgb(100 108 154 / 60%)')
znzs_option.value.series.label.show = true
znzs_option.value.xAxis.axisLabel.color = '#C7CCD0'
znzs_option.value.xAxis.axisLine.lineStyle.color = 'white'
jyjyList.value.forEach((ele) => {
ele.imgUrl = ele.whiteImgUrl
})
oilGauge_line_option.value.color = ['#F2F4F5', '#3571FE']
if (markData) {
markData.data[0][1].label.rich.aa.color = 'rgba(100, 108, 154, 0.6)'
markData.data[1][1].label.rich.aaa.color = 'rgba(100, 108, 154, 0.6)'
}
if (markPoint) {
markPoint.data[0].label.color = 'rgba(100, 108, 154, 0.6)'
markPoint.data[1].label.color = 'rgba(100, 108, 154, 0.6)'
}
}
}
)
// 侦听是否为全屏如果是就准备全屏需要echarts的变量
watch(
() => isFullscreen.value,
(val) => {
if (val) {
if (!oilGauge_app_option.value) {
oilGauge_app_option.value = cloneDeep(oilGauge_option.value)
oilGauge_app_option.value.title[0].textStyle.rich.primary.fontSize = 24
oilGauge_app_option.value.title[0].textStyle.rich.point.padding = [5, -2, 0, -3]
oilGauge_app_option.value.series[0].radius = '100%'
oilGauge_app_option.value.series[0].splitLine.length = 15
oilGauge_app_option.value.series[0].splitLine.lineStyle.width = 2
oilGauge_app_option.value.series[0].pointer.length = '52%'
oilGauge_app_option.value.series[0].pointer.offsetCenter = [0, -15]
oilGauge_app_option.value.series[0].pointer.width = 3
}
}
},
{ immediate: true }
)
const init = async () => {
let oneres = await batchGetTableList(
'example_overview_conversion,example_overview_merchant,example_overview_merchant_cou,example_overview_realtime_data,example_overview_intelligent_assistants,example_overview_pending,example_overview_service_notices'
)
conversion.value = oneres.example_overview_conversion.records[0]
oilGaugeValue.value = oneres.example_overview_conversion.records[0]?.fwzfzhl
merchantIntroduction.value = oneres.example_overview_merchant.records
sjjysl.value = oneres.example_overview_merchant_cou.records[0]?.cou
let realtimeData = oneres.example_overview_realtime_data.records[0]
let intelligentAssistants = oneres.example_overview_intelligent_assistants.records[0]
let overviewPending = oneres.example_overview_pending.records
initConversion(realtimeData)
initZnzs(intelligentAssistants)
numTop.value = '-' + overviewPending.length * 60 + 'px'
for (let i = 1; i <= overviewPending.length; i++) {
animationList.value.push(i)
}
animationList.value.reverse()
if (overviewPending.length > 3) {
overviewPendingLen.value = overviewPending.length - 3
}
znzsIntroduce.value = overviewPending.slice(0, 3)
fwtzList.value = oneres.example_overview_service_notices.records
let endres = await batchGetTableList(
'example_overview_rulescenter,example_overview_productnews,example_overview_learningcenter'
)
let rulescenter = endres.example_overview_rulescenter.records
let productnews = endres.example_overview_productnews.records
let learningcenter = endres.example_overview_learningcenter.records
rightList.value[0].content = rulescenter
rightList.value[0].totalTitle = '共计' + rulescenter.length + '条信息'
rightList.value[1].content = productnews
rightList.value[1].totalTitle = '共计' + productnews.length + '条信息'
rightList.value[2].content = learningcenter
rightList.value[2].totalTitle = '共计' + learningcenter.length + '条信息'
}
onMounted(() => {
switchMode()
init()
})
</script>
<style lang="scss" scoped>
.shouye {
display: flex;
justify-content: center; /* 水平居中 */
align-items: center; /* 垂直居中 */
height: 300px; /* 父容器必须有高度(否则无法垂直居中) */
}
.shouye img {
max-width: 100%;
max-height: 100%;
margin-top: 20%;
}
@keyframes slideBorder {
from {
width: 0;
transform: translateX(-100%);
}
to {
width: 15px;
transform: translateX(-50%);
}
}
@keyframes znzsHoverAnimation {
from {
top: 0;
}
to {
top: v-bind('numTop');
}
}
@keyframes znzsNotHoverAnimation {
from {
top: -700px;
}
to {
top: 0;
}
}
@keyframes znzsBgHoverAnimation {
from {
opacity: 0;
}
to {
opacity: 1;
}
}
.pointer {
cursor: pointer;
}
.big-radius {
border-radius: 15px;
}
.small-radius {
border-radius: 7px;
}
.nowrap {
white-space: nowrap;
}
.demonstration {
color: var(--el-text-color-secondary);
}
.el-carousel__item h3 {
margin: 0;
line-height: 150px;
color: #475669;
text-align: center;
opacity: 0.75;
}
.el-carousel__item:nth-child(2n) {
background-color: #99a9bf;
}
.el-carousel__item:nth-child(2n + 1) {
background-color: #d3dce6;
}
.text-white {
color: white;
}
.arrow-top {
width: 14px;
height: 14px;
background-color: #f2637b;
border-radius: 5px;
align-items: self-end;
.el-icon {
transform: scale(0.8);
}
}
.arrow-bottom {
width: 14px;
height: 14px;
background-color: #1dc9b7;
border-radius: 5px;
.el-icon {
transform: scale(0.8);
}
}
.active-conversion {
position: relative;
font-weight: bold;
color: rgb(51 112 255);
&::before {
position: absolute;
bottom: -5px;
left: 50%;
height: 2px;
background-color: #3370ff;
content: '';
animation: slideBorder 0.3s forwards;
}
}
.oilGauge_line {
position: relative;
width: calc(55% - 11px);
border-left: 1px solid #e6ebf2;
.oilGauge_line_echart {
position: absolute;
bottom: 0;
width: 100%;
}
}
.div_to_ul {
position: relative;
span:hover {
color: rgb(88 103 221);
}
&::before {
position: absolute;
top: 50%;
left: -12px;
width: 5px;
height: 5px;
background-color: black;
border-radius: 50%;
content: '';
transform: translate(0, -50%);
}
}
.blue_box_shadow {
box-shadow: 0 3px 20px rgb(51 112 255 / 29.8%);
}
.animation-box {
position: relative;
.znzs-one {
border-radius: 50%;
&.hover {
animation: znzsBgHoverAnimation 3s forwards;
}
}
.znzs-two {
position: absolute;
top: 50%;
left: 50%;
border-radius: 50%;
transform: translate(-50%, -50%);
&.hover {
animation: znzsBgHoverAnimation 2s forwards;
}
}
.znzs-three {
position: absolute;
top: 50%;
left: 50%;
background-image: url('http://oss.yckxt.com/chatgpt/upload/1/2024-10-11/1/u19654.png');
background-size: 100%;
border-radius: 50%;
transform: translate(-50%, -50%);
&.hover {
animation: znzsBgHoverAnimation 1s forwards;
}
}
.znzs-four {
position: absolute;
top: 50%;
left: 50%;
background-image: url('http://oss.yckxt.com/chatgpt/upload/1/2024-10-11/1/u19655_2.png');
background-size: 100%;
border-radius: 50%;
transform: translate(-50%, -50%);
}
.znzs-xdcl {
position: absolute;
top: 70%;
left: 50%;
transform: translate(-50%, -50%);
}
.znzs-ck {
position: absolute;
top: 47%;
left: 50%;
overflow: hidden;
transform: translate(-50%, -50%);
.znzs-sz {
position: absolute;
top: 0;
left: 0;
&:hover {
animation: znzsHoverAnimation 0.5s forwards;
}
}
.znzs-sz.nothover {
animation: znzsNotHoverAnimation 0.5s forwards;
}
}
}
.znzs-tabs {
position: relative;
.tabs-position-icon {
position: absolute;
top: 22px;
right: 0;
transform: translate(-50%, -50%);
}
}
::v-deep(.el-tabs) {
.el-tabs__header {
margin-bottom: 0;
.el-tabs__nav-wrap {
.el-tabs__nav-scroll {
.el-tabs__active-bar {
background-color: #3370ff;
transform: translateX(5px);
}
.el-tabs__item {
$tabsItemColor: var(--tabs-item-color, rgb(100 108 154 / 60%));
padding: 0 5px;
font-size: 13px;
color: $tabsItemColor;
&:hover {
color: rgb(51 112 255);
}
&.is-active {
font-weight: bold;
color: #3370ff;
}
}
}
&::after {
height: 0;
// color:#326ffd13
}
}
}
}
</style>