ylj20011123 b1da1d2bd6 update
2025-06-25 19:36:01 +08:00

343 lines
17 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<script setup lang="ts">
import './noticeListBox.less'
import noticeIcon from '../../../../assets/image/noticeIcon.png'
import { nextTick, onMounted, onUnmounted, reactive, ref, watch } from 'vue'
import { handleGetGDNearServiceList } from '../../service'
// 消息播报列表
let noticeList = reactive<any>([]);
// 当前滚动到的消息索引
let currentIndex = ref<number>(0)
// 滚动的计时器
let scrollInterval = ref<any>(null)
let isScrolling = ref<boolean>(false);
let scrollDuration = ref('10s'); // 动态动画时长
// 当前全部服务区的id
let serverpartId = ref<number[]>([])
// 播报数据
let noticeMessageObj = ref<any>()
onMounted(async () => {
// 获取播报数据
handleGetNoticeList()
})
// 传入的数据
const props = defineProps<{
currentService?: any;
selectPageTab?: number
}>();
// 改变页面显示状态
const emit = defineEmits<{
(e: "handelGetNoticeListAllId", idList: number[], type: string, obj: any): void; // 切换页面分区
}>();
// 监听传入的选中服务区
watch(
() => props.currentService,
(newVal, oldVal) => {
// 获取播报数据
handleGetNoticeList()
},
{ deep: true }
);
// 监听传入的选中服务区
watch(
() => props.selectPageTab,
(newVal, oldVal) => {
// 获取播报数据
handleGetNoticeList()
// 获取播报数据
startScrolling()
},
{ deep: true }
);
// 获取播报数据
const handleGetNoticeList = async () => {
const req = {
SearchParameter: {
PROVINCE_CODE: "530000",
NOTICEINFO_STATE: 1,
SERVERPART_IDS: props.currentService?.SERVERPART_ID || ""
},
PageIndex: 1,
PageSize: 10,
appId: "wxee018fb96955552a"
}
let noticeListBox = sessionStorage.getItem('noticeListBox')
let data: any = []
if (noticeListBox) {
data = JSON.parse(noticeListBox)
console.log('11121');
} else {
data = await handleGetGDNearServiceList(req)
sessionStorage.setItem("noticeListBox", JSON.stringify(data))
}
console.log('11121', data);
// let list: any = data
let list: any = [
{
NOTICEINFO_TITLE: "云南省蒙新高速蒙自服务区(下行)招商信息公告",
SERVERPART_ID: 1187,
NOTICEINFO_CONTENT: `【合作模式】保底收益或提点取高
【运营方式】餐饮、小吃加盟“滇食坊”品牌,商超加盟“彩云驿购”品牌 ,供应链统一供货
【周边资源及优势】地处昆河高速与蒙文砚高速交汇处,是连接昆明、文山、河口的重要交通枢纽,周边拥有碧色寨火车站、西南联大蒙自分校旧址等历史文化资源,以及南湖公园、长桥海国家级湿地公园等自然景观,同时依托蒙自石榴、枇杷等特色农产品,发展潜力巨大
【招商范围】综合楼(普通餐饮、地方特色小吃、便利店)、汽修
【面积】实际面积存在差异,具体以现场测量为准
综合楼285㎡、汽修225㎡`
},
{
NOTICEINFO_TITLE: "云南省景海高速景洪服务区(双侧)招商信息公告",
SERVERPART_ID: 1176,
NOTICEINFO_CONTENT: `【合作模式】保底收益或提点取高
【运营方式】餐饮、小吃加盟“滇食坊”品牌,商超加盟“彩云驿购”品牌 ,供应链统一供货
【周边资源及优势】位于西双版纳州景洪市,靠近中国-东盟自由贸易区的重要节点,是中老、中缅贸易的交通枢纽,进出口货物运输频繁,为服务区带来大量人流、物流和商机。周边有热带雨林、傣族村寨等独特风光,可感受东南亚风情。附近的告庄西双景、曼听公园等特色景点,展示了傣族文化和边境地区的发展成果
【招商范围】综合楼(地方特色餐饮、地方特色小吃、便利店)
【面积】实际面积存在差异,具体以现场测量为准
景洪服务区上行综合楼1410㎡
景洪服务区下行综合楼1410㎡`
},
{
NOTICEINFO_TITLE: "云南省景海高速勐海服务区(双侧)招商信息公告",
SERVERPART_ID: 1177,
NOTICEINFO_CONTENT: `【合作模式】保底收益或提点取高
【运营方式】餐饮、小吃加盟“滇食坊”品牌,商超加盟“彩云驿购”品牌 ,供应链统一供货
【周边资源及优势】位于西双版纳州勐海县,靠近打洛口岸,是中国与缅甸边境贸易的重要通道,进出口货物运输频繁,为服务区带来大量人流、物流和商机。周边有独特的边境风光,可感受中缅边境的异域风情。附近的勐景来景区、独树成林等特色景点,展示了傣族文化和边境地区的发展成果,吸引众多游客前来观光体验。
【招商范围】综合楼(普通餐饮、普通小吃、便利店)
【面积】实际面积存在差异,具体以现场测量为准
勐海服务区上行综合楼50㎡
勐海服务区下行综合楼1391㎡`
},
{
NOTICEINFO_TITLE: "云南省大南高速大仓服务区(双侧)招商信息公告",
SERVERPART_ID: 971,
NOTICEINFO_CONTENT: `【合作模式】保底收益或提点取高
【运营方式】餐饮、小吃加盟“滇食坊”品牌,商超加盟“彩云驿购”品牌 ,供应链统一供货
【周边资源及优势】位于大理州巍山县,地处大理至临沧高速沿线,是大理通往滇西南地区的重要交通节点,车流量大,区位优势明显。周边有巍山古城、巍宝山等历史文化景点,可感受南诏文化和彝族风情。附近的特色农产品和民族手工艺品资源丰富,为服务区带来商机,同时展示了当地民族文化和经济发展成果
【招商范围】综合楼(普通餐饮、普通小吃、便利店)
【面积】实际面积存在差异,具体以现场测量为准
大仓服务区上行综合楼254㎡
大仓服务区下行综合楼254㎡`
},
{
NOTICEINFO_TITLE: "云南省大南高速巍山服务区(双侧)招商信息公告",
SERVERPART_ID: 973,
NOTICEINFO_CONTENT: `【合作模式】保底收益或提点取高
【运营方式】餐饮、小吃加盟“滇食坊”品牌,商超加盟“彩云驿购”品牌 ,供应链统一供货
【周边资源及优势】位于大理州巍山县,地处大理至南涧高速沿线,地理位置优越,毗邻大理、丽江等旅游热点,交通便利,辐射滇西经济圈。周边自然资源丰富,民族文化独特,巍山古城为南诏文化发源地,具备深厚的历史底蕴与旅游吸引力。服务区可依托区域特色及高速路网优势,发展文旅、物流等产业,助力区域经济协同发展
【招商范围】综合楼(普通餐饮、普通小吃、便利店)、汽修
【面积】实际面积存在差异,具体以现场测量为准
巍山服务区上行综合楼979㎡
巍山服务区下行综合楼1183㎡汽修127㎡`
},
{
NOTICEINFO_TITLE: "云南省南景高速拥翠服务区(双侧)招商信息公告",
SERVERPART_ID: 970,
NOTICEINFO_CONTENT: `【合作模式】保底收益或提点取高
【运营方式】餐饮、小吃加盟“滇食坊”品牌,商超加盟“彩云驿购”品牌 ,供应链统一供货
【周边资源及优势】位于大理白族自治州南涧县地处G5611大临高速沿线。周边生态环境优越毗邻无量山国家级自然保护区自然资源丰富适宜发展生态旅游及康养产业。区域民族文化特色鲜明彝族文化底蕴深厚具备文旅融合潜力。服务区可依托高速交通优势结合生态与人文资源推动特色农产品、文化旅游及物流产业发展促进区域经济多元化升级
【招商范围】综合楼(普通餐饮、普通小吃、便利店)、汽修
【面积】实际面积存在差异,具体以现场测量为准
拥翠服务区上行综合楼951㎡汽修198㎡
拥翠服务区下行综合楼951㎡汽修198㎡`
},
{
NOTICEINFO_TITLE: "云南省南景高速三岔河服务区(双侧)招商信息公告",
SERVERPART_ID: 1109,
NOTICEINFO_CONTENT: `【合作模式】保底收益或提点取高
【运营方式】餐饮、小吃加盟“滇食坊”品牌,商超加盟“彩云驿购”品牌 ,供应链统一供货
【周边资源及优势】地处滇西南交通枢纽。周边自然资源丰富,毗邻无量山、哀牢山国家级自然保护区,生态环境优越。景东县为普洱茶核心产区之一,茶文化底蕴深厚,具备特色农业及文旅开发潜力。服务区可依托高速交通优势及区域资源,发展生态旅游、茶产业及物流服务,助力区域经济可持续发展
【招商范围】综合楼(普通餐饮、普通小吃、便利店)、汽修
【面积】实际面积存在差异,具体以现场测量为准。
三岔河服务区上行综合楼828㎡汽修198㎡
三岔河服务区下行综合楼828㎡汽修198㎡`
},
{
NOTICEINFO_TITLE: "云南省南景高速景东北停车区(双侧)招商信息公告",
SERVERPART_ID: 1110,
NOTICEINFO_CONTENT: `【合作模式】保底收益或提点取高
【运营方式】餐饮、小吃加盟“滇食坊”品牌,商超加盟“彩云驿购”品牌 ,供应链统一供货
【周边资源及优势】位于普洱市景东彝族自治县地处G5611大临高速沿线。周边自然资源丰富毗邻无量山、哀牢山国家级自然保护区生态环境优越生物多样性显著。景东县为普洱茶主产区之一茶文化底蕴深厚具备特色农业开发潜力。停车区可依托高速交通优势及生态资源发展生态旅游、茶产业及物流服务助力区域经济可持续发展
【招商范围】综合楼(普通餐饮、普通小吃、便利店)
【面积】实际面积存在差异,具体以现场测量为准
景东北服务区上行综合楼846㎡
景东北服务区下行综合楼846㎡`
},
{
NOTICEINFO_TITLE: "云南省思澜高速龙潭服务区(双侧)招商信息公告",
SERVERPART_ID: 1161,
NOTICEINFO_CONTENT: `【合作模式】保底收益或提点取高
【运营方式】餐饮、小吃加盟“滇食坊”品牌,商超加盟“彩云驿购”品牌 ,供应链统一供货
【周边资源及优势】思澜高速全长约131.5公里设计时速80公里双向四车道。茫茫龙潭大山植被丰富有热带雨林植物花卉。服务区按花园式景区建设有傣族、拉祜族、佤族建筑样式等。能为过往驾乘人员提供舒适的休憩环境。
【招商范围】综合楼(普通餐饮、普通小吃、便利店)、汽修
【面积】实际面积存在差异,具体以现场测量为准
龙潭服务区上行综合楼1499㎡、汽修210㎡
龙潭服务区下行综合楼1597㎡、汽修210㎡`
},
{
NOTICEINFO_TITLE: "云南省思澜高速糯扎渡服务区(双侧)招商信息公告",
SERVERPART_ID: 1163,
NOTICEINFO_CONTENT: `【合作模式】保底收益或提点取高
【运营方式】餐饮、小吃加盟“滇食坊”品牌,商超加盟“彩云驿购”品牌 ,供应链统一供货
【周边资源及优势】思澜高速全长约131.5公里设计时速80公里双向四车道位于昆磨高速等重要交通干道上是连接昆明、普洱、西双版纳等城市的关键节点车流量大客源稳定
【招商范围】综合楼(普通餐饮、普通小吃、便利店)、汽修
【面积】实际面积存在差异,具体以现场测量为准
糯扎渡服务区上行综合楼2735㎡、汽修167㎡
糯扎渡服务区下行综合楼2010㎡、汽修167㎡`
}
]
let allServerpartId: number[] = []
let obj: any = {}
noticeList.length = 0;
list && list.forEach((item: any) => {
noticeList.push(item)
allServerpartId.push(item.SERVERPART_ID)
obj[Number(item.SERVERPART_ID)] = item.NOTICEINFO_CONTENT
});
serverpartId.value = allServerpartId
console.log('noticeList:', noticeList); // 添加这行
noticeMessageObj.value = obj
nextTick(() => {
// 数据加载完成后启动滚动
startScrolling();
})
}
// 开始滚动的方法
const startScrolling = () => {
isScrolling.value = false;
nextTick(() => {
const listEl = document.querySelector(`.noticeList${props.selectPageTab}`) as HTMLElement;
if (listEl) {
const originWidth = listEl.scrollWidth / 2;
const speed = 100; // px/s
const duration = originWidth / speed;
scrollDuration.value = duration + 's';
// 动态插入 keyframes
const styleId = 'dynamic-scroll-keyframes';
let styleEl = document.getElementById(styleId) as HTMLStyleElement;
if (!styleEl) {
styleEl = document.createElement('style');
styleEl.id = styleId;
document.head.appendChild(styleEl);
}
styleEl.innerHTML = `
@keyframes scrollNotice {
0% { transform: translateX(0); }
100% { transform: translateX(-${originWidth}px); }
}`;
isScrolling.value = true;
}
});
// stopScrolling();
// if (noticeList.length <= 1) return;
// const duration = 3000;
// scrollInterval.value = setInterval(() => {
// currentIndex.value++;
// if (currentIndex.value >= noticeList.length) {
// setTimeout(() => {
// const container = document.querySelector('.noticeContainer') as HTMLElement;
// if (container) container.style.transition = 'none';
// currentIndex.value = 0;
// setTimeout(() => {
// if (container) container.style.transition = '';
// }, 50);
// }, 500);
// }
// }, duration);
}
// 停止滚动的方法
const stopScrolling = () => {
isScrolling.value = false;
if (scrollInterval.value) {
clearInterval(scrollInterval.value)
scrollInterval.value = null
}
// if (scrollInterval.value) {
// clearInterval(scrollInterval.value)
// scrollInterval.value = null
// }
}
// 点击了这个
const handleClickBigBox = () => {
console.log('serverpartId.valueserverpartId.valueserverpartId.value', serverpartId.value);
emit('handelGetNoticeListAllId', serverpartId.value, 'notice', noticeMessageObj.value)
}
onUnmounted(() => {
// // 清理定时器等资源
// if (scrollTimer) {
// clearInterval(scrollTimer)
// }
// 停止滚动
stopScrolling();
// 清除动态添加的样式标签
const styleEl = document.getElementById('dynamic-scroll-keyframes');
if (styleEl) {
styleEl.remove();
}
})
</script>
<template>
<!-- 横向滚动 -->
<div class="noticeListBigBox" @click="handleClickBigBox">
<img class="noticeIcon" :src="noticeIcon" />
<div class="noticeListBox">
<div :class="['noticeList', `noticeList${props.selectPageTab}`, { 'scrolling': isScrolling }]"
:style="{ '--scroll-duration': scrollDuration }">
<div class="noticeItem" v-for="(item, index) in noticeList.concat(noticeList)" :key="index">
<div class="icon"></div>
<div class="contentMessage">
{{ item.NOTICEINFO_TITLE || '-' }}
</div>
</div>
</div>
</div>
</div>
<!-- 纵向滚动 -->
<!-- <div class="noticeListBigBox">
<img class="noticeIcon" :src="noticeIcon" />
<div class="noticeListBox">
<div :class="noticeList.length > 1 ? 'noticeList scrolling' : 'noticeList'">
<template v-if="noticeList.length > 1">
<div class="noticeItem" v-for="(item, index) in noticeList.concat(noticeList)" :key="index">
<div class="icon"></div>
<div class="contentMessage">
{{ item.NOTICEINFO_TITLE || '-' }}
</div>
</div>
</template>
<template v-else>
<div class="noticeItem" v-for="(item, index) in noticeList" :key="index">
<div class="icon"></div>
<div class="contentMessage">
{{ item.NOTICEINFO_TITLE || '-' }}
</div>
</div>
</template>
</div>
</div>
</div> -->
</template>