提交 01a8b2b3 authored 作者: 张伊明's avatar 张伊明

合并分支 'zym-dev' 到 'pre'

Zym dev 查看合并请求 !212
流水线 #13 已失败 于阶段
in 58 秒
......@@ -5,7 +5,7 @@
<img src="./assets/rightbtn.png" alt="" class="right-btn" @click="handleNext" />
<div class="left-top">
<img src="./assets/icon01.png" alt="" />
<div class="left-top-title">合作限制动</div>
<div class="left-top-title">?/div>
<div class="more" @click="handleClickToDetail">祕 ></div>
</div>
......@@ -16,23 +16,23 @@
<div class="left-center">
<img :src="item.IMAGEURL || defaultImg" alt="" />
<div class="left-center-main">
<div class="left-center-main-title">{{ item.LIMITNAME || "暂无动态" }}</div>
<div class="left-center-main-title">{{ item.LIMITNAME || "? }}</div>
<div class="left-center-main-ul">
<ul>
<li>
<span class="ul-title">数据来源</span>
<span class="ul-title">皞?/span>
<span class="ul-content">{{ item.ORGNAME || "" }}</span>
</li>
<li>
<span class="ul-title">合作限制类型</span>
<span class="ul-title">蝐餃?/span>
<span class="ul-content">{{ item.LIMITTYPE || "" }}</span>
</li>
<li>
<span class="ul-title">发布日期</span>
<span class="ul-title">?/span>
<span class="ul-content">{{ item.LIMITDATE || "" }}</span>
</li>
<li>
<span class="ul-title">涉及领域</span>
<span class="ul-title">瘨?/span>
<div class="ul-tags" v-if="item.AREA">
<span v-for="(field, fIndex) in typeof item.AREA === 'string'
? item.AREA.split(',')
......@@ -49,7 +49,7 @@
</div>
<div class="left-bottom">
<ul>
<li class="left-bottom-li">内容摘要</li>
<li class="left-bottom-li">捆?/li>
</ul>
<div class="left-bottom-content">
{{ item.INTRODUCTION || "捆" }}
......@@ -58,18 +58,18 @@
</div>
</el-carousel-item>
<!-- 无数据时的占位展-->
<!-- ?-->
<el-carousel-item v-if="coopRestrictionTrends.length === 0">
<div class="carousel-item-content">
<div class="left-center">
<img :src="defaultImg" alt="" />
<div class="left-center-main">
<div class="left-center-main-title">暂无合作限制动</div>
<div class="left-center-main-title">?/div>
<div class="left-center-main-ul">
<ul>
<li><span class="ul-title">数据来源</span><span class="ul-content">未知</span></li>
<li><span class="ul-title">合作限制类型</span><span class="ul-content">未知</span></li>
<li><span class="ul-title">发布日期</span><span class="ul-content">未知</span></li>
<li><span class="ul-title">皞?/span><span class="ul-content"></span></li>
<li><span class="ul-title">蝐餃?/span><span class="ul-content"></span></li>
<li><span class="ul-title">?/span><span class="ul-content"></span></li>
<li><span class="ul-title"></span><span class="ul-content"></span></li>
</ul>
</div>
......@@ -90,7 +90,7 @@
<div style="margin: 6px 34px 0 23px">
<div v-for="item in riskSignals" :key="item.id" class="right-main" @click="handleToRiskDetail(item)">
<div class="main-left"
:class="{ cl4: item.title === '特别重大', cl5: item.title === '重大风险', cl6: item.title === '一般风险' }">
:class="{ cl4: item.title === '之', cl5: item.title === '之憌', cl6: item.title === '銝憌? }">
{{ item.title }}
</div>
<div class="item-right">
......@@ -114,7 +114,7 @@
</template>
<script setup>
import RiskSignal from "@/components/base/RiskSignal/index.vue";
import RiskSignal from "@/components/base/riskSignal/index.vue";
import { ref, onMounted, computed } from "vue";
import router from "@/router";
import { getCoopRestrictionTrends, getCoopRestrictionSignals } from "@/api/coopRestriction/coopRestriction.js";
......@@ -144,7 +144,7 @@ const coopRestrictionTrends = ref([]);
const carouselRef = ref(null);
const activeIndex = ref(0);
// 获取合作限制-最新动态数
// -?
const getCoopRestrictionTrendsData = async () => {
try {
const res = await getCoopRestrictionTrends();
......@@ -152,11 +152,11 @@ const getCoopRestrictionTrendsData = async () => {
coopRestrictionTrends.value = res.data || [];
}
} catch (error) {
console.error("获取合作限制最新动态数据失败:", error);
console.error("憭梯?", error);
}
};
// 轮播图手动切
// 頧格?
const handlePrev = () => {
if (carouselRef.value) {
carouselRef.value.prev();
......@@ -173,7 +173,7 @@ const handleCarouselChange = index => {
activeIndex.value = index;
};
// 左侧展示的主动
// 撌虫儒撅內蜓?
const mainTrend = computed(() => {
if (coopRestrictionTrends.value.length === 0) return null;
return coopRestrictionTrends.value[activeIndex.value] || coopRestrictionTrends.value[0];
......@@ -212,7 +212,7 @@ const handleToMoreRiskSignal = () => {
};
onMounted(() => {
// 合作限制-最新动态数据-获取数据
// -?
getCoopRestrictionTrendsData();
// -憌靽∪-
getCoopRestrictionSignalsData();
......
......@@ -13,7 +13,7 @@
</div>
<div class="home-main-header-btn-box">
<div class="btn" @click="handleToPosi('position1')">
<div class="btn-text">{{ "最新动态" }}</div>
<div class="btn-text">{{ "最新动? }}</div>
<div class="btn-icon">
<img src="@/assets/icons/arrow-right-icon.png" alt="" />
</div>
......@@ -31,7 +31,7 @@
</div>
</div>
<div class="btn" @click="handleToPosi('position4')">
<div class="btn-text">{{ "资源库" }}</div>
<div class="btn-text">{{ "资源? }}</div>
<div class="btn-icon">
<img src="@/assets/icons/arrow-right-icon.png" alt="" />
</div>
......@@ -65,7 +65,7 @@
:subtitle="item.nameAbbr"
:description="item.description"
:quantity="item.postCount"
unit="次"
unit="?
:color="infoListColor[index]"
@click="handleToEntityListNoId(item)"
/>
......@@ -73,9 +73,9 @@
</div>
<el-row :gutter="15" style="width: 1600px; margin: 0 auto; height: 528px; margin-top: 64px">
<CustomTitle id="position1" title="最新动态" />
<CustomTitle id="position1" title="最新动? />
<el-col :span="16">
<custom-container titleType="primary" title="最新出口管制政策" :titleIcon="houseIcon" height="450px">
<custom-container titleType="primary" title="最新出口管制政? :titleIcon="houseIcon" height="450px">
<template #header-right>
<el-button type="primary" @click="handleToEntityList()" link>
{{ "查看详情 >" }}
......@@ -107,19 +107,19 @@
<div>
<div class="box1-top">
<div class="box1-top-title">
{{ item.postDate }}——BIS《实体清单增列与修订条目
{{ item.postDate }}——BIS《实体清单增列与修订条目?
</div>
<div class="box1-top-content">
<div class="box1-top-content-item">
<span class="box1-top-content-item-title">· 发布机构</span>
<span class="box1-top-content-item-title">· 发布机构?/span>
<span class="box1-top-content-item-content">{{ item.postOrgName }}</span>
</div>
<div class="box1-top-content-item">
<span class="box1-top-content-item-title">· 生效日期</span>
<span class="box1-top-content-item-title">· 生效日期?/span>
<span class="box1-top-content-item-content">{{ item.postDate }}</span>
</div>
<div class="box1-top-content-item">
<span class="box1-top-content-item-title">· 涉及领域</span>
<span class="box1-top-content-item-title">· 涉及领域?/span>
<div
class="box1-top-content-item-tags"
v-for="(domainItem, index) in item.domains"
......@@ -131,7 +131,7 @@
</div>
</div>
<div class="box1-bottom">
<div class="box1-bottom-title">· 涉及主要实体</div>
<div class="box1-bottom-title">· 涉及主要实体?/div>
<div class="box1-bottom-content">
<div
class="box1-bottom-content-item"
......@@ -165,7 +165,7 @@
</el-icon>
<span>新增中国实体</span>
</div>
<div class="box1-absolute-num">{{ item.cnEntityCount }}</div>
<div class="box1-absolute-num">{{ item.cnEntityCount }}?/div>
</div>
</div>
</el-carousel-item>
......@@ -193,7 +193,7 @@
<div
class="item-left"
:class="{
itemLeftStatus1: item.status === '一般风险',
itemLeftStatus1: item.status === '一般风?,
itemLeftStatus2: item.status === '重大风险'
}"
>
......@@ -284,7 +284,7 @@
<el-table-column label="发布次数" width="300">
<template #default="scope">
<div style="display: flex; align-items: center">
<span style="margin-right: 10px; width: 40px">{{ scope.row.num }}</span>
<span style="margin-right: 10px; width: 40px">{{ scope.row.num }}?/span>
<el-progress
:percentage="scope.row.percent * 100"
:show-text="false"
......@@ -313,7 +313,7 @@
<el-table-column label="发布次数" width="300">
<template #default="scope">
<div style="display: flex; align-items: center">
<span style="margin-right: 10px; width: 40px">{{ scope.row.num }}</span>
<span style="margin-right: 10px; width: 40px">{{ scope.row.num }}?/span>
<el-progress
:percentage="scope.row.percent * 100"
:show-text="false"
......@@ -336,13 +336,13 @@
</el-table>
</div>
<div class="box3-content" style="display: none">
<div class="box3-content-title">关键与新兴技术清单(CETs)</div>
<div class="box3-content-title">关键与新兴技术清?CETs)</div>
<el-table :data="tableData1" stripe style="width: 100%">
<el-table-column prop="year" label="年份" width="100" />
<el-table-column label="发布次数" width="180">
<template #default="scope">
<div style="display: flex; align-items: center">
<span style="margin-right: 10px; width: 40px">{{ scope.row.num }}</span>
<span style="margin-right: 10px; width: 40px">{{ scope.row.num }}?/span>
<el-progress
:percentage="scope.row.percent * 100"
:show-text="false"
......@@ -397,7 +397,7 @@
</el-row>
<el-row :gutter="20" style="width: 1600px; margin: 0 auto; margin-top: 39px">
<CustomTitle id="position4" title="资源库" style="margin-top: 0px" />
<CustomTitle id="position4" title="资源? style="margin-top: 0px" />
<div class="resource-tabs">
<div
v-for="tab in resourceTabs"
......@@ -462,7 +462,7 @@
<el-col :span="16">
<custom-container title="制裁实体清单" :titleIcon="entityIcon" height="845px">
<template #header-right>
<div class="box5-header-right">{{ total }}家实</div>
<div class="box5-header-right">{{ total }}家实?/div>
</template>
<template #default>
<div class="box5">
......@@ -530,30 +530,30 @@
<!-- <el-table-column prop="revenue" label="营收(亿元)" width="140" align="right">
<template #default="scope">
<span
:class="['revenue-cell', scope.row.revenue === '无营收数据' ? 'no-revenue' : '']"
:class="['revenue-cell', scope.row.revenue === '无营收数? ? 'no-revenue' : '']"
>
{{ scope.row.revenue }}
</span>
</template>
</el-table-column> -->
<el-table-column prop="revenue" label="50%规则子企业" width="280" align="right">
<el-table-column prop="revenue" label="50%规则子企? width="280" align="right">
<template #default="scope">
<div class="num-item" v-if="scope.row.ruleOrgCount > 0">
<div
class="name-item"
:class="[
'revenue-cell',
scope.row.revenue === '无营收数据' ? 'no-revenue' : ''
scope.row.revenue === '无营收数? ? 'no-revenue' : ''
]"
>
{{ scope.row.ruleOrgList[0].orgName }}...
{{ scope.row.ruleOrgList[0].orgName }}...?
</div>
<div
style="width: 50px; color: #409eff; cursor: pointer"
@click="handleOrgClick(scope.row)"
>
{{ scope.row.ruleOrgCount }}家>
{{ scope.row.ruleOrgCount }}?
</div>
</div>
</template>
......@@ -562,7 +562,7 @@
<div class="table-footer">
<!-- <div class="pagination-info">
第{{ currentPage }}页,共{{ totalPages }}
第{{ currentPage }}页,共{{ totalPages }}?
</div> -->
<el-pagination
v-model:current-page="currentPage"
......@@ -637,7 +637,7 @@
</div>
</div>
<div class="right-footer">
<div class="total-count">{{ totalAll }}</div>
<div class="total-count">?{{ totalAll }} ?/div>
<el-pagination
v-model:current-page="currentPageAll"
:page-size="pageSizeAll"
......@@ -655,7 +655,7 @@
</div>
<!-- <el-dialog v-model="dialogVisible" width="800" :before-close="handleClose">
<template #title>
<div class="dialog-title">50%规则子企业</div>
<div class="dialog-title">50%规则子企?/div>
</template>
<div class="dialog-ett-wrpper">
<div
......@@ -701,9 +701,9 @@
</template>
<script setup>
//这是一个备
//这是一个备?
import NewsList from "@/components/base/newsList/index.vue";
import RiskSignal from "@/components/base/RiskSignal/index.vue";
import RiskSignal from "@/components/base/riskSignal/index.vue";
import { onMounted, ref, computed, reactive, shallowRef, watch, nextTick } from "vue";
import { useContainerScroll } from "@/hooks/useScrollShow";
const homeMainRef = ref(null);
......@@ -773,7 +773,7 @@ const handleToPosi = id => {
isShow.value = true;
}
// 2. 使用 nextTick 等待 DOM 布局(如高度切换)完成后再进行坐标计
// 2. 使用 nextTick 等待 DOM 布局(如高度切换)完成后再进行坐标计?
nextTick(() => {
const containerRect = homeMainRef.value.getBoundingClientRect();
const elementRect = element.getBoundingClientRect();
......@@ -788,7 +788,7 @@ const handleToPosi = id => {
}
};
// 跳转到单项制裁页
// 跳转到单项制裁页?
const handleToRiskSignalDetail = item => {
window.sessionStorage.setItem("curTabName", item.title);
const routeData = router.resolve({
......@@ -797,7 +797,7 @@ const handleToRiskSignalDetail = item => {
id: item.sanId
}
});
// 打开新页
// 打开新页?
window.open(routeData.href, "_blank");
};
......@@ -807,53 +807,53 @@ const techOptions = [
{ label: "全部领域", value: 0 },
{ label: "人工智能", value: 1 },
{ label: "生物科技", value: 2 },
{ label: "新一代信息技术", value: 3 },
{ label: "新一代信息技?, value: 3 },
{ label: "量子科技", value: 4 },
{ label: "新能源", value: 5 },
{ label: "新能?, value: 5 },
{ label: "集成电路", value: 6 },
{ label: "海洋", value: 7 },
{ label: "先进制造", value: 8 },
{ label: "新材料", value: 9 },
{ label: "先进制?, value: 8 },
{ label: "新材?, value: 9 },
{ label: "航空航天", value: 10 },
{ label: "深海", value: 11 },
{ label: "极地", value: 12 },
{ label: "太空", value: 13 },
{ label: "核", value: 14 }
{ label: "?, value: 14 }
];
const timeOptions = [
"全部时间",
"2025年",
"2024年",
"2023年",
"2022年",
"2021年",
"2020年",
"2019年",
"2018年",
"2017年",
"2016年",
"2015年",
"2014年",
"2013年",
"2012年",
"2011年",
"2010年",
"2009年",
"2008年",
"2007年",
"2006年",
"2005年",
"2004年",
"2003年",
"2002年",
"2001年"
"2025?,
"2024?,
"2023?,
"2022?,
"2021?,
"2020?,
"2019?,
"2018?,
"2017?,
"2016?,
"2015?,
"2014?,
"2013?,
"2012?,
"2011?,
"2010?,
"2009?,
"2008?,
"2007?,
"2006?,
"2005?,
"2004?,
"2003?,
"2002?,
"2001?
];
const checkedTech = ref([0]);
const checkedTime = ref(["全部时间"]);
// 跳转到单条制裁页面,单独打开一个新页面
const handleTitleClick = item => {
window.sessionStorage.setItem("curTabName", `${item.year}-${item.dateStr}${item.title}》`);
window.sessionStorage.setItem("curTabName", `${item.year}-${item.dateStr}?{item.title}》`);
const route = router.resolve({
path: "/exportControl/singleSanction",
query: {
......@@ -888,16 +888,16 @@ const getTagType = tag => {
人工智能: "danger",
集成电路: "warning",
量子科技: "success",
生物技: "info",
新一代信息技: "primary",
新能: "success",
生物技? "info",
新一代信息技? "primary",
新能? "success",
航空航天: "primary",
先进制: "warning",
先进制? "warning",
海洋: "info",
新材: "danger",
新材? "danger",
深海: "primary",
极地: "info",
: "danger",
? "danger",
其他: "info"
};
if (tagColorMap[strTag]) {
......@@ -909,7 +909,7 @@ const getTagType = tag => {
//数据定义
const entitiesDataInfoList = shallowRef([]);
// 趋势
// 趋势?
const trendOption = ref({});
const trendChecked = ref(false);
const selectedEntityId = ref(1);
......@@ -938,7 +938,7 @@ onMounted(async () => {
getIndustryCountByYear(1),
getIndustryCountByYear(13)
]);
// 交换第二个和第三个元
// 交换第二个和第三个元?
[dataCount[1], dataCount[2]] = [dataCount[2], dataCount[1]];
infoList.value = dataCount.slice(0, 2);
allSanTypeIds.value = infoList.value.map(item => item.id);
......@@ -946,10 +946,10 @@ onMounted(async () => {
label: item.nameZh,
value: tabMap[item.id],
id: [item.id],
disabled: item.id == "13" // 商业管制清单不展
disabled: item.id == "13" // 商业管制清单不展?
}));
resourceTabs.value.unshift({ label: "全部制裁", value: "all", id: "", disabled: false });
console.log("返回的数据结构 infoList =》", infoList.value);
console.log("返回的数据结?infoList =?, infoList.value);
const entityList = _.map(entitiesDataInfo?.sanEntities ?? [], ({ entityNameZh, entityName }) => {
return { name: entityNameZh, enName: entityName };
});
......@@ -982,7 +982,7 @@ onMounted(async () => {
};
});
// 获取趋势图数
// 获取趋势图数?
await fetchTrendData();
await fetchRiskSignals("0103");
......@@ -992,7 +992,7 @@ onMounted(async () => {
await fetchNewsInfo();
await fetchEntitiesList(currentPage.value, pageSize.value);
await fetchSanctionProcess(sanctionPage.value, 10);
// 获取雷达图数
// 获取雷达图数?
await fetchRadarData(domainChecked.value);
// 获取出口管制制裁措施
await fetchSanctionList();
......@@ -1010,7 +1010,7 @@ const handleToSocialDetail = item => {
});
window.open(route.href, "_blank");
};
// 获取趋势图数
// 获取趋势图数?
const fetchTrendData = async () => {
try {
const res = await getCountDomainByYear({
......@@ -1023,7 +1023,7 @@ const fetchTrendData = async () => {
trendOption.value = processYearDomainCountData(res[0].yearDomainCount);
}
} catch (error) {
console.error("获取趋势图数据失败:", error);
console.error("获取趋势图数据失?", error);
}
};
......@@ -1034,22 +1034,22 @@ watch(
}
);
// 新增函数:处理 yearDomainCount 数据并使用 getMultipleBarChart_m 方法生成图表配置
// 新增函数:处?yearDomainCount 数据并使?getMultipleBarChart_m 方法生成图表配置
const processYearDomainCountData = yearDomainCountData => {
// 提取所有年份并排序
const years = [...new Set(yearDomainCountData.map(item => item.year))].sort();
// 提取所有领域名
// 提取所有领域名?
const allDomains = [...new Set(yearDomainCountData.flatMap(item => item.domainCountInfo.map(domain => domain.name)))];
// 构造 getMultipleBarChart_m 所需的数据结构
// 构?getMultipleBarChart_m 所需的数据结?
const chartData = {
domains: allDomains,
data: years.map(year => {
const yearData = yearDomainCountData.find(item => item.year === year);
const domainCounts = {};
// 初始化所有领域的计数为0
// 初始化所有领域的计数?
allDomains.forEach(domain => {
domainCounts[domain] = 0;
});
......@@ -1092,9 +1092,9 @@ const carouselRef = ref(null);
// activeIndex = carouselRef.value.activeIndex;
// }
// console.log("当前 Carousel 激活索引:", activeIndex);
// console.log("当前 Carousel 激活索?", activeIndex);
// // 使用当前激活项的数
// // 使用当前激活项的数?
// const currentItem = entitiesDataInfoList.value[activeIndex];
// if (currentItem) {
// const route = router.resolve({
......@@ -1120,7 +1120,7 @@ const handleToEntityList = item => {
}
window.sessionStorage.setItem(
"curTabName",
entitiesDataInfoList.value[currentCarouselIndex.value].postDate + " 《实体清单新增条目》"
entitiesDataInfoList.value[currentCarouselIndex.value].postDate + " 《实体清单新增条目?
);
const routeData = router.resolve({
path: "/exportControl/singleSanction",
......@@ -1134,7 +1134,7 @@ const handleToEntityList = item => {
// 跳转到V2.0实体清单无ID
const handleToEntityListNoId = item => {
console.log("这是什么数=>", item);
console.log("这是什么数?=>", item);
if (item.nameZh == "实体清单") {
const routeData = router.resolve({
path: "/exportControl/entityList",
......@@ -1166,7 +1166,7 @@ const infoListColor = ref(["rgba(206, 79, 81, 1)", "rgba(114, 46, 209, 1)", "rgb
const infoList = ref([]);
const allSanTypeIds = ref(["1", "13"]);
// 雷达
// 雷达?
const domainChecked = ref(false);
const radarOption = ref({
title: {
......@@ -1219,7 +1219,7 @@ const radarOption = ref({
]
});
// 获取雷达图数
// 获取雷达图数?
const fetchRadarData = async checked => {
try {
const data = await getSanDomainCount(checked, "export");
......@@ -1236,7 +1236,7 @@ const fetchRadarData = async checked => {
const domainNames = Array.from(allDomains);
// 为每个制裁类型准备数
// 为每个制裁类型准备数?
const radarColors = [
"rgba(45, 123, 248, 1)",
"rgba(206, 79, 81, 1)",
......@@ -1255,7 +1255,7 @@ const fetchRadarData = async checked => {
});
}
// 按照统一的领域顺序创建值数
// 按照统一的领域顺序创建值数?
const values = domainNames.map(name => domainMap[name] || 0);
// 确定颜色
......@@ -1270,17 +1270,17 @@ const fetchRadarData = async checked => {
};
});
// 更新雷达图指
// 更新雷达图指?
let maxValue = Math.max(...seriesData.flatMap(item => item.value)) * 1.2;
// 向上取整到最近的100的倍数,避免小数导致 ticks 不可读警告
// 向上取整到最近的100的倍数,避免小数导?ticks 不可读警?
maxValue = Math.ceil(maxValue / 100) * 100;
const indicators = domainNames.map(name => ({
name: name,
max: maxValue || 100 // 防止max为0的情况
max: maxValue || 100 // 防止max?的情?
}));
// 更新雷达图配
// 更新雷达图配?
radarOption.value.radar.indicator = indicators;
radarOption.value.series[0].data = seriesData;
radarOption.value.legend.data = seriesData.map(item => {
......@@ -1293,7 +1293,7 @@ const fetchRadarData = async checked => {
});
}
} catch (error) {
console.error("获取雷达图数据失败:", error);
console.error("获取雷达图数据失?", error);
}
};
......@@ -1302,7 +1302,7 @@ watch(
() => fetchRadarData(domainChecked.value)
);
// 进度条状
// 进度条状?
const getStatus = _percent => {
const percent = _percent * 100;
if (percent >= 90) {
......@@ -1314,7 +1314,7 @@ const getStatus = _percent => {
}
};
// 制裁实体
const currentPage = ref(1); // 默认显示第5页
const currentPage = ref(1); // 默认显示??
const pageSize = ref(10);
const total = ref(0);
......@@ -1362,8 +1362,8 @@ const fetchSanctionList = async () => {
let year = "";
let dateStr = fullTime;
if (typeof fullTime === "string") {
if (fullTime.includes("年")) {
const parts = fullTime.split("年");
if (fullTime.includes("?)) {
const parts = fullTime.split("?);
year = parts[0];
dateStr = parts[1].replace(/\s+/g, "");
} else if (fullTime.includes("-")) {
......@@ -1465,7 +1465,7 @@ const fetchEntitiesList = async (page = 1, size = 10) => {
sanctionDate: item.startTime
}));
total.value = res.totalElements;
currentPage.value = res.number + 1; // API返回的页码从0开始,前端从1开始
currentPage.value = res.number + 1; // API返回的页码从0开始,前端?开?
}
} catch (err) {
console.error(err);
......@@ -1485,7 +1485,7 @@ const handleGetMore = async () => {
desc: `${item.cnEntityCount} 家中国实体`,
content:
item.summary ||
"2025年3月25日,美国商务部工业与安全局以从事有悖于美国国家安全和外交政策利益的活动为由,宣布将来自中国的54家实体新增至“实体清单”。"
"2025??5日,美国商务部工业与安全局以从事有悖于美国国家安全和外交政策利益的活动为由,宣布将来自中国?4家实体新增至“实体清单”?
}));
// 合并新数据到现有列表
......@@ -1514,7 +1514,7 @@ const fetchSanctionProcess = async (page = 1, size = 10) => {
desc: `${item.cnEntityCount} 家中国实体`,
content:
item.summary ||
"2025年3月25日,美国商务部工业与安全局以从事有悖于美国国家安全和外交政策利益的活动为由,宣布将来自中国的54家实体新增至“实体清单”。"
"2025??5日,美国商务部工业与安全局以从事有悖于美国国家安全和外交政策利益的活动为由,宣布将来自中国?4家实体新增至“实体清单”?
}));
}
} catch (err) {
......@@ -1530,17 +1530,17 @@ const handlePageChange = page => {
const searchKeyword = ref("");
// 资源Tab 数据
// 资源?Tab 数据
const resourceTabs = ref([
// { label: "全部制裁", value: "all", disabled: false },
// { label: "实体清单", value: "entity", disabled: false },
// { label: "商业管制清单", value: "commerce", disabled: true }
// { label: "关键与新兴技术清单", value: "tech", disabled: true },
// { label: "军事最终用户清单", value: "military", disabled: true }
// { label: "关键与新兴技术清?, value: "tech", disabled: true },
// { label: "军事最终用户清?, value: "military", disabled: true }
]);
const activeResourceTab = ref("all");
const activeResourceTabItem = ref({});
// 数据对应,便宜行
// 数据对应,便宜行?
const tabMap = {
1: "entity",
13: "commerce"
......@@ -1558,10 +1558,10 @@ const handleResourceTabClick = tab => {
};
const strengthLabels = {
strong: "强",
medium: "中",
weak: "弱",
none: "无"
strong: "?,
medium: "?,
weak: "?,
none: "?
};
// 获取风险信号数据
......@@ -1584,7 +1584,7 @@ const fetchRiskSignals = async () => {
}
};
// 添加获取社交媒体信息的方
// 添加获取社交媒体信息的方?
const fetchSocialMediaInfo = async () => {
try {
const data = await getSocialMediaInfo();
......@@ -1604,7 +1604,7 @@ const fetchSocialMediaInfo = async () => {
}
};
// 添加获取新闻资讯的方
// 添加获取新闻资讯的方?
const fetchNewsInfo = async () => {
try {
const data = await getNewsInfo();
......@@ -1623,7 +1623,7 @@ const fetchNewsInfo = async () => {
};
const handlePerClick = item => {
// console.log("点击了社交媒体消息:", item);
// console.log("点击了社交媒体消?", item);
window.sessionStorage.setItem("curTabName", item.name);
const route = router.resolve({
path: "/characterPage",
......@@ -1634,7 +1634,7 @@ const handlePerClick = item => {
});
window.open(route.href, "_blank");
};
// 处理点击社交媒体消息的方
// 处理点击社交媒体消息的方?
// const handleInfoClick = item => {
// console.log("点击了社交媒体消息的更多信息:", item);
// // 这里可以添加打开详情页的逻辑
......@@ -1653,7 +1653,7 @@ const handlePerClick = item => {
const formatTime = timeStr => {
// 空值兜底,避免报错
if (!timeStr) return "暂无时间";
// 核心:替换T为空
// 核心:替换T为空?
return timeStr.replace("T", " ");
};
......@@ -1661,7 +1661,7 @@ const warningList = ref([]);
const curBillList = ref([]);
const releaseTime = ref("近一年发布");
const releaseTime = ref("近一年发?);
const categoryList = ref([]);
......@@ -1713,7 +1713,7 @@ const chart1Data = ref({
const handleSanc = item => {
console.log(item);
window.sessionStorage.setItem("curTabName", `${item.postDate}${item.title}》`);
window.sessionStorage.setItem("curTabName", `${item.postDate}?{item.title}》`);
const route = router.resolve({
path: "/exportControl/singleSanction",
query: {
......@@ -1964,7 +1964,7 @@ const handleMediaClick = item => {
align-items: center;
justify-content: flex-start;
width: 48%;
/* 留出2%的间*/
/* 留出2%的间?*/
// margin-bottom: 6px;
box-sizing: border-box;
gap: 10px;
......@@ -3113,7 +3113,7 @@ const handleMediaClick = item => {
// align-items: center;
justify-content: flex-start;
width: 48%;
/* 留出2%的间*/
/* 留出2%的间?*/
// margin-bottom: 6px;
box-sizing: border-box;
gap: 10px;
......
......@@ -5,14 +5,14 @@
<HeaderMenu></HeaderMenu>
</div>
<div class="header-right">
<headerInfo curTitleName="投融资限制"></headerInfo>
<headerInfo curTitleName="投融资限?></headerInfo>
</div>
</div> -->
<div class="home-main" ref="containerRef">
<div class="home-top-bg"></div>
<div class="home-main-header">
<div class="home-main-header-center">
<SearchContainer style="margin-bottom: 0; height: fit-content" v-if="containerRef" placeholder="搜索投融资限制政策"
<SearchContainer style="margin-bottom: 0; height: fit-content" v-if="containerRef" placeholder="搜索投融资限制政?
:containerRef="containerRef" areaName="" />
<!-- <el-input
v-model="searchKey"
......@@ -40,12 +40,12 @@
</div>
<div class="home-main-header-footer-item">
<div class="item-top">326</div>
<div class="item-footer">关键和新型技术清</div>
<div class="item-footer">关键和新型技术清?/div>
</div>
</div> -->
<!-- <div class="home-main-header-btn-box">
<div class="btn" @click="scrollToTop('position1')">
<div class="btn-text">{{ "最新动态" }}</div>
<div class="btn-text">{{ "最新动? }}</div>
<div class="btn-icon">
<img src="@/assets/icons/arrow-right-icon.png" alt="" />
</div>
......@@ -63,30 +63,30 @@
</div>
</div>
<div class="btn" @click="scrollToTop('position4')">
<div class="btn-text">{{ "资源库" }}</div>
<div class="btn-text">{{ "资源? }}</div>
<div class="btn-icon">
<img src="@/assets/icons/arrow-right-icon.png" alt="" />
</div>
</div>
</div> -->
<!-- <div class="home-main-header-footer-link">
<ClickableCard text="最新动态" @click="scrollToTop('position1')" target="_blank" />
<ClickableCard text="最新动? @click="scrollToTop('position1')" target="_blank" />
<ClickableCard text="资讯要闻" @click="scrollToTop('position2')" target="_blank" />
<ClickableCard text="数据总览" @click="scrollToTop('position3')" target="_blank" />
<ClickableCard text="资源库" @click="scrollToTop('position4')" target="_blank" />
<ClickableCard text="资源? @click="scrollToTop('position4')" target="_blank" />
</div> -->
<div class="home-main-header-footer-info">
<div class="card" v-for="(item, index) in infoList" :key="index">
<div class="icon" :style="{ background: item.color }"></div>
<div class="title">{{ item.title }}</div>
<div class="content">{{ item.des }}</div>
<div class="num" :style="{ color: item.color }">{{ item.num + "项" }}</div>
<div class="num" :style="{ color: item.color }">{{ item.num + "? }}</div>
</div>
</div>
</div>
<el-row :gutter="20" style="width: 1600px; margin: 0 auto">
<CustomTitle id="position1" title="最新动态" style="margin-top: 24px" />
<CustomTitle id="position1" title="最新动? style="margin-top: 24px" />
<el-col :span="16">
<custom-container titleType="primary" title="最新投融资限制政策" :titleIcon="houseIcon" height="450px">
<template #header-right>
......@@ -98,18 +98,18 @@
<template #default>
<div class="box1">
<div class="box1-top">
<div class="box1-top-title">2025年9月12日——BIS《实体清单增列与修订条目》</div>
<div class="box1-top-title">2025??2日——BIS《实体清单增列与修订条目?/div>
<div class="box1-top-content">
<div class="box1-top-content-item">
<span class="box1-top-content-item-title">· 发布机构</span>
<span class="box1-top-content-item-title">· 发布机构?/span>
<span class="box1-top-content-item-content">美国商务部工业与安全局</span>
</div>
<div class="box1-top-content-item">
<span class="box1-top-content-item-title">· 生效日期</span>
<span class="box1-top-content-item-content">2025年9月12日</span>
<span class="box1-top-content-item-title">· 生效日期?/span>
<span class="box1-top-content-item-content">2025??2?/span>
</div>
<div class="box1-top-content-item">
<span class="box1-top-content-item-title">· 涉及领域</span>
<span class="box1-top-content-item-title">· 涉及领域?/span>
<div class="box1-top-content-item-tags" v-for="item in ['航空航天', '人工智能', '集成电路']" :key="item">
<el-tag :type="item === '航空航天' ? 'primary' : item === '人工智能' ? 'danger' : 'info'
">{{ item }}</el-tag>
......@@ -118,7 +118,7 @@
</div>
</div>
<div class="box1-bottom">
<div class="box1-bottom-title">· 涉及主要实体</div>
<div class="box1-bottom-title">· 涉及主要实体?/div>
<div class="box1-bottom-content">
<div class="box1-bottom-content-item" v-for="(item, index) in entityList" :key="index">
<el-image class="box1-bottom-content-item-img" :src="item.img" alt=""></el-image>
......@@ -133,7 +133,7 @@
</el-icon>
<span>新增中国实体</span>
</div>
<div class="box1-absolute-num">23</div>
<div class="box1-absolute-num">23?/div>
</div>
</div>
</template>
......@@ -147,7 +147,7 @@
<div
class="item-left"
:class="{
itemLeftStatus1: item.status === '一般风险',
itemLeftStatus1: item.status === '一般风?,
itemLeftStatus2: item.status === '重大风险'
}"
>
......@@ -211,14 +211,14 @@
:source="customMessage.source"
:content="customMessage.content"
/> --
<MessageBubble :avatar="trumpAvatar" name="唐纳德·特朗普" time="16:02" source="发布于真实社交"
content="埃隆·马斯克在强力支持我竞选总统之前,早就知道我强烈反对‘电动汽车强制令’。这太荒谬了,这一直是我竞选活动的主要部分。电动汽车没问题,但不应该强迫每个人都拥有一辆。埃隆获得的补贴可能远远超过历史上任何一个人。如果没有补贴,埃隆可能不得不关门大吉,回到南非老家。" />
<MessageBubble :avatar="trumpAvatar" name="唐纳德·特朗普" time="16:02" source="发布于真实社?
content="埃隆·马斯克在强力支持我竞选总统之前,早就知道我强烈反对‘电动汽车强制令’。这太荒谬了,这一直是我竞选活动的主要部分。电动汽车没问题,但不应该强迫每个人都拥有一辆。埃隆获得的补贴可能远远超过历史上任何一个人。如果没有补贴,埃隆可能不得不关门大吉,回到南非老家? />
<MessageBubble :avatar="elongAvatar" name="埃隆·马斯克" time="16:02" source="发布于真实社交"
content="如果这个疯狂的支出法案获得通过,‘美国党’将在第二天成立。" />
<MessageBubble :avatar="elongAvatar" name="埃隆·马斯? time="16:02" source="发布于真实社?
content="如果这个疯狂的支出法案获得通过,‘美国党’将在第二天成立? />
<MessageBubble :avatar="elongAvatar" name="埃隆·马斯克" time="16:02" source="发布于真实社交"
content="提出特朗普政府的AI政策强调技术开放与快速应用,但可能以牺牲安全防范为代价,开启了“潘多拉魔盒”。" />
<MessageBubble :avatar="elongAvatar" name="埃隆·马斯? time="16:02" source="发布于真实社?
content="提出特朗普政府的AI政策强调技术开放与快速应用,但可能以牺牲安全防范为代价,开启了“潘多拉魔盒”? />
</div>
</template>
</custom-container>
......@@ -238,7 +238,7 @@
<el-table-column label="发布次数" width="180">
<template #default="scope">
<div style="display: flex; align-items: center">
<span style="margin-right: 10px; width: 40px">{{ scope.row.num }}</span>
<span style="margin-right: 10px; width: 40px">{{ scope.row.num }}?/span>
<el-progress :percentage="scope.row.percent * 100" :show-text="false"
:status="getStatus(scope.row.percent)" />
</div>
......@@ -263,7 +263,7 @@
<el-table-column label="发布次数" width="180">
<template #default="scope">
<div style="display: flex; align-items: center">
<span style="margin-right: 10px; width: 40px">{{ scope.row.num }}</span>
<span style="margin-right: 10px; width: 40px">{{ scope.row.num }}?/span>
<el-progress :percentage="scope.row.percent * 100" :show-text="false"
:status="getStatus(scope.row.percent)" />
</div>
......@@ -282,13 +282,13 @@
</el-table>
</div>
<div class="box3-content">
<div class="box3-content-title">关键与新兴技术清单(CETs)</div>
<div class="box3-content-title">关键与新兴技术清?CETs)</div>
<el-table :data="tableData1" stripe style="width: 100%">
<el-table-column prop="year" label="年份" width="100" />
<el-table-column label="发布次数" width="180">
<template #default="scope">
<div style="display: flex; align-items: center">
<span style="margin-right: 10px; width: 40px">{{ scope.row.num }}</span>
<span style="margin-right: 10px; width: 40px">{{ scope.row.num }}?/span>
<el-progress :percentage="scope.row.percent * 100" :show-text="false"
:status="getStatus(scope.row.percent)" />
</div>
......@@ -336,7 +336,7 @@
</el-row>
<el-row :gutter="20" style="width: 1600px; margin: 0 auto">
<CustomTitle id="position4" title="资源库" style="margin-top: 54px" />
<CustomTitle id="position4" title="资源? style="margin-top: 54px" />
<el-col :span="8">
<custom-container title="制裁历程" :titleIcon="listIcon" height="845px">
<template #default>
......@@ -370,7 +370,7 @@
<el-col :span="16">
<custom-container title="制裁实体清单" :titleIcon="entityIcon" height="845px">
<template #header-right>
<div class="box5-header-right">共1329家实体</div>
<div class="box5-header-right">?329家实?/div>
</template>
<template #default>
<div class="box5">
......@@ -426,16 +426,16 @@
<!-- <el-table-column prop="revenue" label="营收(亿元)" width="140" align="right">
<template #default="scope">
<span
:class="['revenue-cell', scope.row.revenue === '无营收数据' ? 'no-revenue' : '']"
:class="['revenue-cell', scope.row.revenue === '无营收数? ? 'no-revenue' : '']"
>
{{ scope.row.revenue }}
</span>
</template>
</el-table-column> -->
<el-table-column prop="revenue" label="50%规则子企业" width="140" align="right">
<el-table-column prop="revenue" label="50%规则子企? width="140" align="right">
<template #default="scope">
<span :class="['revenue-cell', scope.row.revenue === '无营收数据' ? 'no-revenue' : '']">
<span :class="['revenue-cell', scope.row.revenue === '无营收数? ? 'no-revenue' : '']">
{{ scope.row.revenue }}
</span>
</template>
......@@ -444,7 +444,7 @@
<div class="table-footer">
<!-- <div class="pagination-info">
第{{ currentPage }}页,共{{ totalPages }}
第{{ currentPage }}页,共{{ totalPages }}?
</div> -->
<el-pagination v-model:current-page="currentPage" :page-size="pageSize" :total="total"
:pager-count="5" layout="prev, pager, next" background />
......@@ -459,7 +459,7 @@
</template>
<script setup>
import RiskSignal from "@/components/base/RiskSignal/index.vue";
import RiskSignal from "@/components/base/riskSignal/index.vue";
import { onMounted, ref, computed } from "vue";
import scrollToTop from "@/utils/scrollToTop";
import setChart from "@/utils/setChart";
......@@ -523,7 +523,7 @@ import shenggongIcon from "./assets/images/shenggong.png";
import shoushiIcon from "./assets/images/shoushi.png";
import tianyiIcon from "./assets/images/tianyi.png";
import aircasIcon from "./assets/images/aircas.png";
// 父组件中定义 messageList 数据(avatar 对应子组件 imageUrl 字段,需用 import 的图片才能正确显示)
// 父组件中定义 messageList 数据(avatar 对应子组?imageUrl 字段,需?import 的图片才能正确显示)
const messageList = ref([
{
avatar: trumpAvatar,
......@@ -531,21 +531,21 @@ const messageList = ref([
time: "2025-05-12 16:02:37",
source: "真实社交",
content:
"埃隆·马斯克在强力支持我竞选总统之前,早就知道我强烈反对‘电动汽车强制令’。这太荒谬了,这一直是我竞选活动的主要部分。电动汽车没问题,但不应该强迫每个人都拥有一辆。埃隆获得的补贴可能远远超过历史上任何一个人。如果没有补贴,埃隆可能不得不关门大吉,回到南非老家。"
"埃隆·马斯克在强力支持我竞选总统之前,早就知道我强烈反对‘电动汽车强制令’。这太荒谬了,这一直是我竞选活动的主要部分。电动汽车没问题,但不应该强迫每个人都拥有一辆。埃隆获得的补贴可能远远超过历史上任何一个人。如果没有补贴,埃隆可能不得不关门大吉,回到南非老家?
},
{
avatar: elongAvatar,
name: "埃隆·马斯克",
name: "埃隆·马斯?,
time: "2025-05-12 16:02:37",
source: "真实社交",
content: "如果这个疯狂的支出法案获得通过,‘美国党’将在第二天成立。"
content: "如果这个疯狂的支出法案获得通过,‘美国党’将在第二天成立?
},
{
avatar: elongAvatar,
name: "埃隆·马斯克",
name: "埃隆·马斯?,
time: "2025-05-12 16:02:37",
source: "真实社交",
content: "提出特朗普政府的AI政策强调技术开放与快速应用,但可能以牺牲安全防范为代价,开启了“潘多拉魔盒”。"
content: "提出特朗普政府的AI政策强调技术开放与快速应用,但可能以牺牲安全防范为代价,开启了“潘多拉魔盒”?
}
]);
// 查看更多风险信号
......@@ -568,13 +568,13 @@ const searchKey = ref("");
const infoList = ref([
{
title: "SDN清单",
des: "由美国财政部海外资产控制办公室(OFAC)管理,通过切断目标实体或个人与美国金融体系的联系,以实现美国的外交政策和国家安全目标。",
des: "由美国财政部海外资产控制办公室(OFAC)管理,通过切断目标实体或个人与美国金融体系的联系,以实现美国的外交政策和国家安全目标?,
num: 87,
color: "rgba(5, 95, 194, 1)"
},
{
title: "CMIC清单",
des: "由美国财政部海外资产控制办公室(OFAC)管理,通过切断目标实体或个人与美国金融体系的联系,以实现美国的外交政策和国家安全目标。",
des: "由美国财政部海外资产控制办公室(OFAC)管理,通过切断目标实体或个人与美国金融体系的联系,以实现美国的外交政策和国家安全目标?,
num: 3,
color: "rgba(114, 46, 209, 1)"
}
......@@ -582,15 +582,15 @@ const infoList = ref([
const entityList = ref([
{
name: "北京复旦微电子技术有限公司",
name: "北京复旦微电子技术有限公?,
img: fudanIcon
},
{
name: "北京福康微电子技术有限公司",
name: "北京福康微电子技术有限公?,
img: fukongIcon
},
{
name: "北京华岭微电子技术有限公司",
name: "北京华岭微电子技术有限公?,
img: hualingIcon
},
{
......@@ -598,15 +598,15 @@ const entityList = ref([
img: jimuxiIcon
},
{
name: "北京盛工微电子技术有限公司",
name: "北京盛工微电子技术有限公?,
img: shenggongIcon
},
{
name: "北京首时微电子技术有限公司",
name: "北京首时微电子技术有限公?,
img: shoushiIcon
},
{
name: "北京天易微电子技术有限公司",
name: "北京天易微电子技术有限公?,
img: tianyiIcon
},
{
......@@ -618,42 +618,42 @@ const entityList = ref([
const customNewsData = ref([
{
newsImage: newsImg,
title: "美国智库激辩人工智能监管路径",
title: "美国智库激辩人工智能监管路?,
time: "11-4",
source: "华盛顿邮报",
from: "11-4 · 华盛顿邮报",
source: "华盛顿邮?,
from: "11-4 · 华盛顿邮?,
description: "各方就AI监管模式展开讨论。有观点认为碎片化州级监管比全面联邦法规更灵活,也有分析..."
},
{
newsImage: newsImg,
title: "美国智库激辩人工智能监管路径",
title: "美国智库激辩人工智能监管路?,
time: "11-4",
source: "华盛顿邮报",
from: "11-4 · 华盛顿邮报",
source: "华盛顿邮?,
from: "11-4 · 华盛顿邮?,
description: "各方就AI监管模式展开讨论。有观点认为碎片化州级监管比全面联邦法规更灵活,也有分析..."
},
{
newsImage: newsImg,
title: "美国智库激辩人工智能监管路径",
title: "美国智库激辩人工智能监管路?,
time: "11-4",
source: "华盛顿邮报",
from: "11-4 · 华盛顿邮报",
source: "华盛顿邮?,
from: "11-4 · 华盛顿邮?,
description: "各方就AI监管模式展开讨论。有观点认为碎片化州级监管比全面联邦法规更灵活,也有分析..."
},
{
newsImage: newsImg,
title: "美国智库激辩人工智能监管路径",
title: "美国智库激辩人工智能监管路?,
time: "11-4",
source: "华盛顿邮报",
from: "11-4 · 华盛顿邮报",
source: "华盛顿邮?,
from: "11-4 · 华盛顿邮?,
description: "各方就AI监管模式展开讨论。有观点认为碎片化州级监管比全面联邦法规更灵活,也有分析..."
},
{
newsImage: newsImg,
title: "美国智库激辩人工智能监管路径",
title: "美国智库激辩人工智能监管路?,
time: "11-4",
source: "华盛顿邮报",
from: "11-4 · 华盛顿邮报",
source: "华盛顿邮?,
from: "11-4 · 华盛顿邮?,
description: "各方就AI监管模式展开讨论。有观点认为碎片化州级监管比全面联邦法规更灵活,也有分析..."
}
]);
......@@ -692,7 +692,7 @@ const tableData1 = ref([
}
]);
// 雷达
// 雷达?
const radarOption = ref({
title: {
text: ""
......@@ -703,7 +703,7 @@ const radarOption = ref({
legend: {
top: 0,
icon: "circle",
data: ["实体清单", "商业管制清单", "关键和新型技术清单"]
data: ["实体清单", "商业管制清单", "关键和新型技术清?]
},
radar: {
// shape: 'circle',
......@@ -743,7 +743,7 @@ const radarOption = ref({
},
{
value: [4000, 14000, 18000, 21000, 32000, 10000],
name: "关键和新型技术清单",
name: "关键和新型技术清?,
areaStyle: {
color: "rgba(250, 140, 22, 0.2)"
}
......@@ -753,7 +753,7 @@ const radarOption = ref({
]
});
// 趋势
// 趋势?
const trendOption = ref({
tooltip: {
trigger: "axis",
......@@ -873,36 +873,36 @@ const trendOption = ref({
// 历次制裁过程
const sanctionProcessList = ref([
{
title: "2025年3月—SDN清单",
desc: "54家中国实体",
title: "2025?月—SDN清单",
desc: "54家中国实?,
content:
"2025年3月25日,美国商务部工业与安全局以从事有悖于美国国家安全和外交政策利益的活动为由,宣布将来自中国的54家实体新增至“实体清单”。"
"2025??5日,美国商务部工业与安全局以从事有悖于美国国家安全和外交政策利益的活动为由,宣布将来自中国?4家实体新增至“实体清单”?
},
{
title: "2025年1月—SDN清单",
desc: "25家中国实体",
title: "2025?月—SDN清单",
desc: "25家中国实?,
content:
"2025年1月15日,美国商务部工业和安全局宣布更新《出口管理条例》(EAR),并发布两项最终规则,将25家中国企业及其相关实体列入实体清单。"
"2025??5日,美国商务部工业和安全局宣布更新《出口管理条例》(EAR),并发布两项最终规则,?5家中国企业及其相关实体列入实体清单?
},
{
title: "2025年12月—SDN清单",
desc: "12家中国实体",
title: "2025?2月—SDN清单",
desc: "12家中国实?,
content:
"2024年12月20日,美国商务部工业与安全局以从事有悖于美国国家安全和外交政策利益的活动为由,宣布将来自中国的12家实体新增至“商业管制清单”。"
"2024?2?0日,美国商务部工业与安全局以从事有悖于美国国家安全和外交政策利益的活动为由,宣布将来自中国?2家实体新增至“商业管制清单”?
},
{
title: "2024年10月—CMIC清单",
desc: "6家中国实体",
content: "2024年10月21日,美国商务部将6个中国实体加入其“实体清单”,同时将 1 个中国实体移出该清单。"
title: "2024?0月—CMIC清单",
desc: "6家中国实?,
content: "2024?0?1日,美国商务部将6个中国实体加入其“实体清单”,同时?1 个中国实体移出该清单?
},
{
title: "2024年8月—SDN清单",
desc: "39家中国实体",
content: "2024年8月23日,美国商务部工业安全局发布公告,将多个外国实体加入其“实体清单”,其中包括39个中国实体。"
title: "2024?月—SDN清单",
desc: "39家中国实?,
content: "2024??3日,美国商务部工业安全局发布公告,将多个外国实体加入其“实体清单”,其中包括39个中国实体?
}
]);
// 进度条状
// 进度条状?
const getStatus = _percent => {
const percent = _percent * 100;
if (percent >= 90) {
......@@ -914,29 +914,29 @@ const getStatus = _percent => {
}
};
// 制裁实体
const currentPage = ref(1); // 默认显示第5页
const currentPage = ref(1); // 默认显示??
const pageSize = ref(10);
const searchKeyword = ref("");
const strengthLabels = {
strong: "强",
medium: "中",
weak: "弱",
none: "无"
strong: "?,
medium: "?,
weak: "?,
none: "?
};
// 模拟数据
const mockData = [
{
name: "科大讯飞股份有限公司",
domains: ["人工智能"],
sanctionDate: "2025年9月",
sanctionDate: "2025??,
strength: "strong",
revenue: "325",
listingLocation: "深圳"
},
{
name: "华为技术有限公司",
name: "华为技术有限公?,
domains: ["通信网络", "集成电路"],
sanctionDate: "2025年9月",
sanctionDate: "2025??,
strength: "medium",
revenue: "290",
listingLocation: ""
......@@ -944,15 +944,15 @@ const mockData = [
{
name: "中国航空工业集团",
domains: ["航空航天"],
sanctionDate: "2025年9月",
sanctionDate: "2025??,
strength: "medium",
revenue: "288",
listingLocation: ""
},
{
name: "杭州海康威视数字技术股份有限公司",
name: "杭州海康威视数字技术股份有限公?,
domains: ["人工智能"],
sanctionDate: "2025年9月",
sanctionDate: "2025??,
strength: "weak",
revenue: "203",
listingLocation: "深圳"
......@@ -960,39 +960,39 @@ const mockData = [
{
name: "浪潮集团有限公司",
domains: ["人工智能"],
sanctionDate: "2025年9月",
sanctionDate: "2025??,
strength: "medium",
revenue: "195",
listingLocation: "香港"
},
{
name: "中芯国际集成电路制造有限公司",
name: "中芯国际集成电路制造有限公?,
domains: ["集成电路"],
sanctionDate: "2025年9月",
sanctionDate: "2025??,
strength: "medium",
revenue: "190",
listingLocation: ""
},
{
name: "北京复旦微电子技术有限公司",
name: "北京复旦微电子技术有限公?,
domains: ["集成电路"],
sanctionDate: "2025年9月",
sanctionDate: "2025??,
strength: "medium",
revenue: "184",
listingLocation: ""
},
{
name: "哈尔滨工业大学",
name: "哈尔滨工业大?,
domains: ["人工智能", "集成电路"],
sanctionDate: "2025年9月",
sanctionDate: "2025??,
strength: "medium",
revenue: "无营收数据",
revenue: "无营收数?,
listingLocation: ""
},
{
name: "中兴通讯股份有限公司",
domains: ["通信网络", "集成电路"],
sanctionDate: "2025年9月",
sanctionDate: "2025??,
strength: "medium",
revenue: "117",
listingLocation: "上海"
......@@ -1000,17 +1000,17 @@ const mockData = [
{
name: "大疆创新科技有限公司",
domains: ["航空航天"],
sanctionDate: "2025年9月",
sanctionDate: "2025??,
strength: "medium",
revenue: "1",
listingLocation: "纽约"
}
];
// 生成更多数据以模拟1329家实体
// 生成更多数据以模?329家实?
const generateMoreData = () => {
const moreData = [];
const companySuffixes = ["有限公司", "集团", "股份有限公司", "技术有限公司", "研究所"];
const companySuffixes = ["有限公司", "集团", "股份有限公司", "技术有限公?, "研究所"];
const domainsList = [
["人工智能"],
["通信网络"],
......@@ -1032,7 +1032,7 @@ const generateMoreData = () => {
moreData.push({
name: companyName,
domains: domains,
sanctionDate: "2025年9月",
sanctionDate: "2025??,
strength: strength,
revenue: revenue.toString()
});
......@@ -1043,7 +1043,7 @@ const generateMoreData = () => {
const allData = [...mockData, ...generateMoreData()];
// 计算属
// 计算属?
const total = computed(() => allData.length);
const totalPages = computed(() => Math.ceil(total.value / pageSize.value));
......@@ -1085,7 +1085,7 @@ const warningList = ref([
status: "特别重大"
},
{
title: "首次提出“限制外国敏感实体获取补贴",
title: "首次提出“限制外国敏感实体获取补?,
time: "一天前",
status: "重大风险"
},
......@@ -1095,97 +1095,97 @@ const warningList = ref([
status: "重大风险"
},
{
title: "H.R.8333《生物安全法案》将华大基因等...",
title: "H.R.8333《生物安全法案》将华大基因?..",
time: "一天前",
status: "一般风险"
status: "一般风?
}
]);
const curBillList = ref([
{
billName: "大而美法案",
introductionDate: "2025年7月4日",
introductionDate: "2025???,
img: bill1
},
{
billName: "GENIUS稳定币法案",
introductionDate: "2025年7月5日",
billName: "GENIUS稳定币法?,
introductionDate: "2025???,
img: bill2
},
{
billName: "美越贸易协议",
introductionDate: "2025年7月6日",
introductionDate: "2025???,
img: bill3
},
{
billName: "美越贸易协议",
introductionDate: "2025年7月7日",
introductionDate: "2025???,
img: bill4
},
{
billName: "汽车零部件25%关税实施规则",
introductionDate: "2025年7月10日",
billName: "汽车零部?5%关税实施规则",
introductionDate: "2025??0?,
img: bill5
},
{
billName: "汽车零部件25%关税实施规则",
introductionDate: "2025年7月12日",
billName: "汽车零部?5%关税实施规则",
introductionDate: "2025??2?,
img: bill6
},
{
billName: "小额豁免包裹政策调整",
introductionDate: "2025年7月14日",
introductionDate: "2025??4?,
img: bill7
},
{
billName: "NIH预算否决案",
introductionDate: "2025年7月15日",
billName: "NIH预算否决?,
introductionDate: "2025??5?,
img: bill8
},
{
billName: "得州国会选区重划法案",
introductionDate: "2025年7月17日",
introductionDate: "2025??7?,
img: bill9
},
{
billName: "美越贸易协议",
introductionDate: "2025年7月24日",
introductionDate: "2025??4?,
img: bill10
},
{
billName: "美越贸易协议",
introductionDate: "2025年8月4日",
introductionDate: "2025???,
img: bill11
},
{
billName: "美越贸易协议",
introductionDate: "2025年8月8日",
introductionDate: "2025???,
img: bill12
}
]);
const releaseTime = ref("近一年发布");
const releaseTime = ref("近一年发?);
const releaseTimeList = ref([
{
label: "近半年发布",
value: "近半年发布"
label: "近半年发?,
value: "近半年发?
},
{
label: "近一年发布",
value: "近一年发布"
label: "近一年发?,
value: "近一年发?
},
{
label: "近两年发布",
value: "近两年发布"
label: "近两年发?,
value: "近两年发?
},
{
label: "近三年发布",
value: "近三年发布"
label: "近三年发?,
value: "近三年发?
},
{
label: "近五年发布",
value: "近五年发布"
label: "近五年发?,
value: "近五年发?
}
]);
......@@ -1195,11 +1195,11 @@ const categoryList = ref([
// "集成电路",
// "通信网络",
// "量子科技",
// "新能源",
// "新一代信息技术",
// "新能?,
// "新一代信息技?,
// "海洋",
// "先进制造",
// "新材料",
// "先进制?,
// "新材?,
// "航空航天",
]);
......@@ -1392,7 +1392,7 @@ onMounted(async () => {
align-items: center;
justify-content: flex-start;
width: 48%;
/* 留出2%的间*/
/* 留出2%的间?*/
// margin-bottom: 6px;
box-sizing: border-box;
gap: 10px;
......@@ -2558,7 +2558,7 @@ onMounted(async () => {
.center-center-news {
flex-shrink: 0;
/* 保证内部 NewsList 的滚动条与外box3 右侧对齐 */
/* 保证内部 NewsList 的滚动条与外?box3 右侧对齐 */
:deep(.box3-main) {
width: 100%;
box-sizing: border-box;
......
......@@ -50,7 +50,7 @@
</div>
</div>
<div class="home-main-center">
<DivideHeader id="position1" class="divide-header" :titleText="'最新动态'"></DivideHeader>
<DivideHeader id="position1" class="divide-header" :titleText="'最新动?"></DivideHeader>
<div class="center-top">
<div class="box1">
<overviewMainBox title="调查进展" @toDetail="handleClickToDetail()">
......@@ -91,33 +91,33 @@
<div class="list-box">
<div class="list-item">
<div class="icon"></div>
<div class="list-left">{{ "调查案号:" }}</div>
<div class="list-left">{{ "调查案号? }}</div>
<div class="list-right">{{ item.searchnum }}</div>
</div>
<div class="list-item">
<div class="icon"></div>
<div class="list-left">{{ "涉及产品:" }}</div>
<div class="list-left">{{ "涉及产品? }}</div>
<div class="list-right">
{{ item.product }}
</div>
</div>
<div class="list-item">
<div class="icon"></div>
<div class="list-left">{{ "原告:" }}</div>
<div class="list-left">{{ "原告? }}</div>
<div class="list-right">
{{ item.plaintiff }}
</div>
</div>
<div class="list-item">
<div class="icon"></div>
<div class="list-left">{{ "被告:" }}</div>
<div class="list-left">{{ "被告? }}</div>
<div class="list-right">
{{ item.defendant }}
</div>
</div>
<div class="list-item">
<div class="icon"></div>
<div class="list-left">{{ "涉案专利:" }}</div>
<div class="list-left">{{ "涉案专利? }}</div>
<div class="list-right">
{{ item.patent }}
</div>
......@@ -189,7 +189,7 @@
</div>
<div class="center-footer1">
<div class="box7">
<OverviewNormalBox title="受调查国家分布" width="1064px">
<OverviewNormalBox title="受调查国家分? width="1064px">
<template #header-icon>
<img style="width: 100%; height: 100%;" src="./assets/icons/icon4.svg" alt="" />
</template>
......@@ -242,7 +242,7 @@
</div>
</div>
<div class="home-main-footer">
<DivideHeader id="position4" class="divide-header" :titleText="'资源库'"></DivideHeader>
<DivideHeader id="position4" class="divide-header" :titleText="'资源?"></DivideHeader>
<div class="home-main-footer-header">
<SourceTabList :sourceTabList="categoryList" :activeSouceTabId="activeCateId" @clickTab="handleClickCate">
</SourceTabList>
......@@ -306,7 +306,7 @@
<div class="left-box2">
<div class="left-box2-header">
<div class="icon"></div>
<div class="title">{{ "受调查国家/地区" }}</div>
<div class="title">{{ "受调查国?地区" }}</div>
</div>
<div class="left-box2-main">
<el-checkbox-group class="checkbox-group" v-model="checkedCountryList"
......@@ -328,7 +328,7 @@
</div>
<div class="right-main">
<el-empty v-if="surveyInfoList.length === 0" description="当前条件下暂无数据" :image-size="200" />
<el-empty v-if="surveyInfoList.length === 0" description="当前条件下暂无数? :image-size="200" />
<div v-else class="right-main-item" v-for="(item, index) in surveyInfoList" :key="index"
@click="handleClickToSurveyDetail(item.sortcode)">
<div class="item-left">
......@@ -375,7 +375,7 @@
</div>
<div class="right-footer">
<div class="footer-left">
{{ `${totalDiscussNum} 项` }}
{{ `?${totalDiscussNum} 项` }}
</div>
<div class="footer-right">
<el-pagination @current-change="handleCurrentChange" :pageSize="pageSize" :current-page="currentPage"
......@@ -394,7 +394,7 @@ import { onMounted, ref, nextTick } from "vue";
import LeftBtn from "@/components/base/PageBtn/LeftBtn.vue";
import RightBtn from "@/components/base/PageBtn/RightBtn.vue";
import RiskSignal from "@/components/base/RiskSignal/index.vue";
import RiskSignal from "@/components/base/riskSignal/index.vue";
import TipTab from "@/components/base/TipTab/index.vue"
import MessageBubble from "@/components/base/MessageBubble/index.vue"
import NewsList from "@/components/base/NewsList/index.vue";
......@@ -434,7 +434,7 @@ const handleToPosi = id => {
// isShow.value = true;
// }
// 2. 使用 nextTick 等待 DOM 布局(如高度切换)完成后再进行坐标计
// 2. 使用 nextTick 等待 DOM 布局(如高度切换)完成后再进行坐标计?
nextTick(() => {
const containerRect = containerRef.value.getBoundingClientRect();
const elementRect = element.getBoundingClientRect();
......@@ -459,9 +459,9 @@ const formatDate = (dateStr, dateType) => {
if (dateType === 'year') {
return year
} else {
return `${month.toString().padStart(2, "0")}月${day.toString().padStart(2, "0")}日`
return `${month.toString().padStart(2, "0")}?{day.toString().padStart(2, "0")}日`
}
// return `${year}${month.toString().padStart(2, "0")}月${day.toString().padStart(2, "0")}日`;
// return `${year}?{month.toString().padStart(2, "0")}?{day.toString().padStart(2, "0")}日`;
}
let containerRef = ref(null);
......@@ -495,7 +495,7 @@ const handleClickToDetail = () => {
activeIndex = carouselRef.value.activeIndex;
}
console.log("当前 Carousel 激活索引:", activeIndex);
console.log("当前 Carousel 激活索?", activeIndex);
const id = box1DataList.value[activeIndex].SEARCHSORT;
window.sessionStorage.setItem("curTabName", id + "调查概览");
......@@ -567,7 +567,7 @@ const handleGetBox3Data = async () => {
}
} catch (error) { }
};
// 点击新闻条目,跳转到新闻分析
// 点击新闻条目,跳转到新闻分析?
const handleToNewsAnalysis = news => {
const route = router.resolve({
path: "/newsAnalysis",
......@@ -644,7 +644,7 @@ const handleClickPerson = async item => {
const route = router.resolve({
path: "/characterPage",
query: {
type: type, // type=1为科技企业领袖,2为国会议员,3为智库研究人员
type: type, // type=1为科技企业领袖?为国会议员,3为智库研究人?
personId: item.personId
}
});
......@@ -664,11 +664,11 @@ const handleClickPerson = async item => {
// 调查数量
const box5BtnList = ref([
{
name: "按月度",
name: "按月?,
value: 1
},
{
name: "按年度",
name: "按年?,
value: 12
}
]);
......@@ -688,14 +688,14 @@ function transformAllData(originalData) {
// 2. 获取所有调查类型并去重
const allCategories = [...new Set(originalData.map(item => item.sortName))];
// 3. 为每个类别创建值数
// 3. 为每个类别创建值数?
const categoryData = allCategories.map(category => {
// 对于每个年份,查找对应的数据
const values = allYears.map(year => {
// 查找匹配当前类别和年份的数据
const matchingItem = originalData.find(item => item.sortName === category && String(item.searchYorM) === year);
// 如果找到则返回searchCount,否则返回0
// 如果找到则返回searchCount,否则返?
return matchingItem ? matchingItem.searchCount : 0;
});
......@@ -705,7 +705,7 @@ function transformAllData(originalData) {
};
});
// 4. 构建最终结
// 4. 构建最终结?
return {
title: allYears,
data: categoryData
......@@ -726,7 +726,7 @@ function transformAllData1(originalData) {
const [year, month] = dateStr.split("-").map(Number);
return { year, month: month || 0 };
} else {
// 处理纯年份格
// 处理纯年份格?
return { year: Number(dateStr), month: 0 };
}
};
......@@ -734,7 +734,7 @@ function transformAllData1(originalData) {
const dateA = parseDate(a);
const dateB = parseDate(b);
// 先比较年份,再比较月
// 先比较年份,再比较月?
if (dateA.year !== dateB.year) {
return dateA.year - dateB.year;
}
......@@ -744,14 +744,14 @@ function transformAllData1(originalData) {
// 2. 获取所有调查类型并去重
const allCategories = [...new Set(originalData.map(item => item.sortName))];
// 3. 为每个类别创建值数
// 3. 为每个类别创建值数?
const categoryData = allCategories.map(category => {
// 对于每个日期,查找对应的数据
const values = allDates.map(date => {
// 查找匹配当前类别和日期的数据
const matchingItem = originalData.find(item => item.sortName === category && String(item.searchYorM) === date);
// 如果找到则返回searchCount,否则返回0
// 如果找到则返回searchCount,否则返?
return matchingItem ? matchingItem.searchCount : 0;
});
......@@ -761,7 +761,7 @@ function transformAllData1(originalData) {
};
});
// 4. 构建最终结
// 4. 构建最终结?
return {
title: allDates,
data: categoryData
......@@ -787,7 +787,7 @@ const box5ChartData = ref({
});
const hadleGetStatNum = async () => {
const params = {
byYorM: box5BtnActive.value // 月度:1 年度:12
byYorM: box5BtnActive.value // 月度? 年度?2
};
try {
const res = await getStatNum(params);
......@@ -930,7 +930,7 @@ const handleBox6 = async () => {
setChart(chart2, "chart2");
};
// 受调查国家分
// 受调查国家分?
const box7SurveyList = ref([
{
label: "337调查",
......@@ -994,7 +994,7 @@ const handleGetBox7Data = async () => {
};
try {
const res = await getSearchCountry(params);
console.log("受调查国家分布", res);
console.log("受调查国家分?, res);
if (res.code === 200 && res.data) {
box7Data.value.title = res.data.map(item => {
return {
......@@ -1070,7 +1070,7 @@ const handleChangeBox8Survey = () => {
handleBox8();
};
// 资源
// 资源?
const pageSize = ref(10);
const currentPage = ref(1);
const totalDiscussNum = ref(0);
......@@ -1114,7 +1114,7 @@ const releaseTimeList = ref([
value: true
},
{
label: "按发布时间升序",
label: "按发布时间升?,
value: false
}
]);
......@@ -1130,23 +1130,23 @@ const handlePxChange = val => {
const surveyYearList = ref([
{
name: "2025年",
name: "2025?,
id: "2025"
},
{
name: "2024年",
name: "2024?,
id: "2024"
},
{
name: "2023年",
name: "2023?,
id: "2023"
},
{
name: "2022年",
name: "2022?,
id: "2022"
},
{
name: "2021年",
name: "2021?,
id: "2021"
}
]);
......@@ -1201,15 +1201,15 @@ const handleChangeCheckedAreas = (val) => {
// 发布机构
const insList = ref([
{
name: "商务部",
name: "商务?,
id: "54"
},
{
name: "国际贸易委员会",
name: "国际贸易委员?,
id: "262"
},
{
name: "贸易代表办公室",
name: "贸易代表办公?,
id: "491"
}
]);
......@@ -1251,7 +1251,7 @@ const handleChangeCheckedIns = (val) => {
handleGetSurveyList();
};
// 受调查国家/地区
// 受调查国?地区
const countryList = ref([
]);
const checkedCountryList = ref(['全部']);
......@@ -1259,7 +1259,7 @@ const handleGetAllSearchCountry = async () => {
try {
const res = await getSearchAllCountry()
console.log('受调查国家/地区', res);
console.log('受调查国?地区', res);
if (res.code && res.data) {
countryList.value = res.data.map(item => {
return {
......
......@@ -5,7 +5,7 @@
<img src="./assets/rightbtn.png" alt class="right-btn" @click="changeIndex(1)" />
<div class="left-top">
<img src="./assets/icon01.png" alt />
<div class="left-top-title">限制动态</div>
<div class="left-top-title">?/div>
<div class="more" @click="handleClickToDetail">祕 ></div>
</div>
<div class="left-center">
......@@ -15,22 +15,22 @@
<div class="left-center-main-ul">
<ul>
<li>
<span class="ul-title">布机构:</span>
<span class="ul-title">?/span>
<span class="ul-content">{{ latestUpdateList[latestUpdateIndex].PUBLISHORGNAME }}</span>
</li>
<li>
<span class="ul-title">布日期:</span>
<span class="ul-title">?/span>
<span class="ul-content">{{ latestUpdateList[latestUpdateIndex].PUBLISHDATE }}</span>
</li>
<li>
<span class="ul-title">领域:</span>
<span class="ul-title">?/span>
<span class="ul-pie cl1" v-for="item in latestUpdateList[latestUpdateIndex].ruleAreas">{{ item }}</span>
<!-- <span class="ul-pie cl2"></span>
<span class="ul-pie cl3">材料</span>
<span class="ul-pie cl3">?/span>
<span class="ul-pie cl4"></span>-->
</li>
<li>
<span class="ul-title">实体:</span>
<span class="ul-title">?/span>
<span class="ul-content" v-for="item in latestUpdateList[latestUpdateIndex].ruleEntities">{{
item.ORGNAME }} &nbsp;</span>
</li>
......@@ -41,7 +41,7 @@
</div>
<div class="left-bottom">
<ul>
<li class="left-bottom-li">摘要:</li>
<li class="left-bottom-li">?/li>
</ul>
<div class="left-bottom-content">{{ latestUpdateList[latestUpdateIndex].RULEINTRODUCTION }}</div>
</div>
......@@ -58,7 +58,7 @@
<div v-for="(item, index) in list" :key="index" class="right-main">
<div
class="main-left"
:class="{ cl4: item.signalLevel === '特别重大', cl5: item.signalLevel === '重大风险', cl6: item.signalLevel === '一般风险'}"
:class="{ cl4: item.signalLevel === '之', cl5: item.signalLevel === '之憌', cl6: item.signalLevel === '銝憌?}"
>{{ item.signalLevel }}</div>
<div class="main-center">{{ item.signalTitle }}</div>
<div class="main-right">{{ item.signalTime }}</div>
......@@ -75,7 +75,7 @@
</template>
<script setup>
import RiskSignal from "@/components/base/RiskSignal/index.vue";
import RiskSignal from "@/components/base/riskSignal/index.vue";
import { ref, onBeforeMount, computed } from "vue";
import router from "@/router";
import { getLatestUpdates, getRiskSignal } from '@/api/ruleRestriction/index.js'
......@@ -84,7 +84,7 @@ const list = ref([
{
id: 1,
title: "之",
content: "保护美国资金与业知识免受敌对研究利用法案",
content: "靽蝢韏霂笆弦瘜?,
time: "銝憭拙"
},
{
......@@ -96,7 +96,7 @@ const list = ref([
{
id: 3,
title: "之憌",
content: "众议院“美中略竞争特别委员会”向国会提...",
content: "隡悅葉蝡憪隡?..",
time: "銝憭拙"
},
{
......@@ -107,7 +107,7 @@ const list = ref([
}
]);
// 新动态列表
// ?
const latestUpdateList = ref([{}])
// 敶蝷箸
const latestUpdateIndex = ref(0)
......@@ -115,14 +115,14 @@ const latestUpdateIndex = ref(0)
//
const changeIndex = (num) => {
if (num === -1) {
// 判断当前是否是第一个,是的话则将序号设置为最后一个
// 敶蝚砌銝迎霈曄蔭銝箸銝?
if (latestUpdateIndex.value === 0) {
latestUpdateIndex.value = latestUpdateList.value.length - 1
} else {
latestUpdateIndex.value--
}
} else {
// 判断当前是否是最后一个,是的话则将序号设置为第一个
// 敶銝迎霈曄蔭銝箇洵銝銝?
if (latestUpdateIndex.value === latestUpdateList.value.length - 1) {
latestUpdateIndex.value = 0
} else {
......@@ -141,7 +141,7 @@ const getLatestUpdateInfo = async () => {
latestUpdateList.value = res.data
}
} catch (error) {
console.error("获取最新动态接口失败:", error);
console.error("憭梯?", error);
}
}
......@@ -165,7 +165,7 @@ const handleClickToDetail = () => {
window.open(`/ruleRestrictions/detail?id=${latestUpdateList.value[latestUpdateIndex.value].RULEID}`, "_blank");
};
// 左侧展示的主动态
// 撌虫儒撅內蜓?
const mainTrend = computed(() => {
if (riskSignalList.value.length === 0) return null;
return riskSignalList.value[activeIndex.value] || riskSignalList.value[0];
......@@ -194,7 +194,7 @@ const handleToRiskDetail = (item) => {
// window.open(curRoute.href, "_blank");
// };
// 查看更多动态
// 憭?
const handleToMoreRiskSignal = () => {
const route = router.resolve("/viewRiskSignal");
window.open(route.href, "_blank");
......
......@@ -5,7 +5,7 @@
<img src="./assets/rightbtn.png" alt="" class="right-btn" @click="handleSwithCurDecree('right')" />
<div class="left-top">
<img src="./assets/icon01.png" alt="" />
<div class="left-top-title">最新资助项</div>
<div class="left-top-title">韏憿寧?/div>
<span>祕 ></span>
</div>
<el-carousel ref="carouselRef" height="395px" :autoplay="true" :interval="3000" arrow="never"
......@@ -21,24 +21,24 @@
<div class="left-center-main-ul">
<ul>
<li>
<span class="ul-title">投资主体</span>
<span class="ul-content">美国国家科学基金</span>
<span class="ul-title">蜓雿?/span>
<span class="ul-content">蝢摰嗥郎?/span>
</li>
<li>
<span class="ul-title">发布日期</span>
<span class="ul-title">?/span>
<span class="ul-content">{{ itemData.publicationDate }}</span>
</li>
<li>
<span class="ul-title">资助经费</span>
<span class="ul-title">韏蝏晶嚗?/span>
<span class="ul-content">{{ itemData.amount }}</span>
</li>
<li>
<span class="ul-title">涉及领域</span>
<span class="ul-title">瘨?/span>
<span class="ul-pie cl1" v-for="value in itemData.toOrgNameList">{{ value }}</span>
</li>
<li>
<span class="ul-title">资助对象</span>
<span class="ul-title">韏撖寡情?/span>
<span class="ul-content">{{ itemData.fromOrgNameList.join(',') }}</span>
</li>
</ul>
......@@ -48,7 +48,7 @@
</div>
<div class="left-bottom">
<ul>
<li class="left-bottom-li">内容摘要</li>
<li class="left-bottom-li">捆?/li>
</ul>
<div class="left-bottom-content">{{ itemData.abstractContent }}
</div>
......@@ -70,7 +70,7 @@
<div class="main-left" :class="{
cl4: item.signalLevel === '之',
cl5: item.signalLevel === '之憌',
cl6: item.signalLevel === '一般风险'
cl6: item.signalLevel === '銝憌?
}">
{{ item.signalLevel }}
</div>
......@@ -89,7 +89,7 @@
</template>
<script setup>
import RiskSignal from "@/components/base/RiskSignal/index.vue";
import RiskSignal from "@/components/base/riskSignal/index.vue";
import { ref, onMounted } from "vue";
import {
getNewProject, getRiskSignal
......@@ -105,14 +105,14 @@ const list = ref([
},
{
id: 2,
title: "一般风险",
content: "美国NASA公布NIAC计划2025年度第一轮资助",
title: "銝憌?,
content: "NASAIAC霈∪2025撟游漲蝚砌頧株?,
time: "銝憭拙"
},
{
id: 3,
title: "之",
content: "美国NASA公布“早期创新计划”2026年资助...",
content: "蝢NASA撣霈∪?026撟渲?..",
time: "銝憭拙"
},
{
......@@ -130,7 +130,7 @@ const list = ref([
{
id: 6,
title: "之",
content: "美国DARPA资助可调控生物功能微系统技术开发",
content: "蝢DARPA韏靚敺桃頂蝏撘?,
time: "銝憭拙"
}
]);
......@@ -164,11 +164,11 @@ const handleSwithCurDecree = name => {
carouselRef.value.next();
}
};
//// 最新资助项
//// 韏憿寧?
const handleGetNewProject = async () => {
try {
const res = await getNewProject();
console.log("最新资助项目", res);
console.log("韏憿寧?, res);
if (res.code === 200 && res.data) {
box1Data.value = res.data
}
......@@ -505,7 +505,7 @@ onMounted(async () => {
overflow: hidden;
/* */
text-overflow: ellipsis;
/* 超出部分显示省略*/
/* 頞蝷箇?*/
width: 200px;
/* 霈曄蔭銝銝芸摰捐摨 */
height: 30px;
......
......@@ -21,8 +21,8 @@
</div> -->
<div class="home-main-header-center">
<SearchContainer style="margin-bottom: 0;margin-top: 48px; " v-if="containerRef"
placeholder="搜索科技人物及观点" :containerRef="containerRef" areaName="人物" />
<!-- <el-input v-model="input" style="width: 838px; height: 100%" placeholder="搜索科技人物及观点" />
placeholder="搜索科技人物及观? :containerRef="containerRef" areaName="人物" />
<!-- <el-input v-model="input" style="width: 838px; height: 100%" placeholder="搜索科技人物及观? />
<div class="search">
<div class="search-icon">
<img src="./assets/images/search-icon.png" alt="" />
......@@ -41,7 +41,7 @@
</div>
<div class="home-main-header-footer-item">
<div class="item-top">633</div>
<div class="item-footer">顶级科学</div>
<div class="item-footer">顶级科学?/div>
</div>
<div class="home-main-header-footer-item">
<div class="item-top">312</div>
......@@ -50,13 +50,13 @@
</div> -->
<!-- <div class="home-main-header-btn-box">
<div class="btn" @click="handleToPosi('position1')">
<div class="btn-text">{{ "最新动态" }}</div>
<div class="btn-text">{{ "最新动? }}</div>
<div class="btn-icon">
<img src="@/assets/icons/arrow-right-icon.png" alt="" />
</div>
</div>
<div class="btn" @click="handleToPosi('position2')">
<div class="btn-text">{{ "言论动态" }}</div>
<div class="btn-text">{{ "言论动? }}</div>
<div class="btn-icon">
<img src="@/assets/icons/arrow-right-icon.png" alt="" />
</div>
......@@ -68,7 +68,7 @@
</div>
</div>
<div class="btn" @click="handleToPosi('position4')">
<div class="btn-text">{{ "资源库" }}</div>
<div class="btn-text">{{ "资源? }}</div>
<div class="btn-icon">
<img src="@/assets/icons/arrow-right-icon.png" alt="" />
</div>
......@@ -76,16 +76,16 @@
</div> -->
</div>
<div class="home-main-center">
<DivideHeader id="position1" class="divide-header" :titleText="'最新动态'"></DivideHeader>
<DivideHeader id="position1" class="divide-header" :titleText="'最新动?"></DivideHeader>
<div class="center-top">
<OverviewMainBox title="人物新闻动态" width="1064px" height="460px"
<OverviewMainBox title="人物新闻动? width="1064px" height="460px"
@to-detail="handleClcikToCharacter(curnews.personId, curnews.name)">
<!-- 自定义左上角图标插槽 -->
<template #headerIcon>
<img src="./assets/images/personNewIcon.svg " alt="" />
</template>
<!-- 主内容区-->
<!-- 主内容区?-->
<div class="box1-wrapper">
<div class="box1-left" @click="handleSwithCurBill('left')">
<img src="./assets/images/box1-left.png" alt="" />
......@@ -99,7 +99,7 @@
arrow="never" indicator-position="none" @change="handleCarouselChange">
<el-carousel-item v-for="person in newsDynamics" :key="person.personId">
<div class="carousel-content">
<!-- 左侧:头-->
<!-- 左侧:头?-->
<div class="avatar">
<img :src="person.imageUrl" alt="人物头像" />
</div>
......@@ -155,7 +155,7 @@
<RiskSignal :list="warningList" @more-click="handleToMoreRiskSignal" postDate="signalTime"
name="signalTitle" riskLevel="signalLevel" />
</div>
<DivideHeader id="position2" class="divide-header" :titleText="'言论动态'"></DivideHeader>
<DivideHeader id="position2" class="divide-header" :titleText="'言论动?"></DivideHeader>
<div class="center-center">
<div class="box3">
<div class="box3-header">
......@@ -298,7 +298,7 @@
</div>
<div class="home-main-footer">
<DivideHeader id="position4" class="divide-header" :titleText="'资源库'"></DivideHeader>
<DivideHeader id="position4" class="divide-header" :titleText="'资源?"></DivideHeader>
<div class="home-main-footer-header">
<div class="btn-box">
<div class="btn" :class="{ btnActive: activeCate === cate.typeName }"
......@@ -317,7 +317,7 @@
</template>
<script setup>
import RiskSignal from "@/components/base/RiskSignal/index.vue";
import RiskSignal from "@/components/base/riskSignal/index.vue";
import { onMounted, ref } from "vue";
import { useRouter } from "vue-router";
import scrollToTop from "@/utils/scrollToTop";
......@@ -353,7 +353,7 @@ const router = useRouter();
const containerRef = ref(null);
const { isShow } = useContainerScroll(containerRef);
// 当前人物新闻动
// 当前人物新闻动?
const curnews = ref({
imageUrl: "",
name: "",
......@@ -374,12 +374,12 @@ const handleCarouselChange = index => {
// 获取人物新闻动
// 获取人物新闻动?
const newsDynamics = ref([]);
const handlgetnewsDynamicsFn = async () => {
try {
const res = await getnewsDynamics();
console.log("人物新闻动态", res);
console.log("人物新闻动?, res);
newsDynamics.value = res.data;
} catch (error) {
console.error(error);
......@@ -501,7 +501,7 @@ const handlegetOptionAreaChangeFn = async () => {
//提取年份作为 title
const years = sortedData.map(item => item.year);
//收集所有行业名
//收集所有行业名?
const allIndustries = new Set();
sortedData.forEach(yearData => {
yearData.industryList.forEach(industry => {
......@@ -514,7 +514,7 @@ const handlegetOptionAreaChangeFn = async () => {
Array.from(allIndustries).forEach(industryName => {
industryMap.set(industryName, new Array(years.length).fill(0));
});
// 填充每个行业每年的数
// 填充每个行业每年的数?
sortedData.forEach((yearData, yearIndex) => {
yearData.industryList.forEach(industry => {
const industryValues = industryMap.get(industry.industryName);
......@@ -537,7 +537,7 @@ const handlegetOptionAreaChangeFn = async () => {
// 科技人物类型
const chart7Data = ref({
name: ["国会议员", "行政主官", "科技领袖", "顶尖科学家", "其他"],
name: ["国会议员", "行政主官", "科技领袖", "顶尖科学?, "其他"],
value: [482, 41, 83, 201, 25]
});
const handlegetPersonTypeCountFn = async () => {
......@@ -565,7 +565,7 @@ const handleBackHome = () => {
const carouselRef = ref(null);
// 切换人物新闻动
// 切换人物新闻动?
const handleSwithCurBill = name => {
if (name === "left") {
......@@ -667,7 +667,7 @@ const handleClcikToCharacter = async (id, name) => {
const route = router.resolve({
path: "/characterPage",
query: {
type: type, // type=1为科技企业领袖,2为国会议员,3为智库研究人员
type: type, // type=1为科技企业领袖?为国会议员,3为智库研究人?
personId: id
}
});
......@@ -687,15 +687,15 @@ const handleClcikToCharacter = async (id, name) => {
// 风险信号
const warningList = ref([
{ title: "关于对中华人民共和国合成阿片类药物供应链...", time: "一天前", status: "特别重大" },
{ title: "关于调整汽车及汽车零部件进口的公告", time: "一天前", status: "特别重大" },
{ title: "关于调整钢铁进口的公告", time: "一天前", status: "重大风险" },
{ title: "关于调整汽车及汽车零部件进口的公?, time: "一天前", status: "特别重大" },
{ title: "关于调整钢铁进口的公?, time: "一天前", status: "重大风险" },
{ title: "关于使用互惠关税规范进口以纠正导致大规模...", time: "一天前", status: "重大风险" },
{ title: "关于修订对中华人民共和国低价值进口商品适...", time: "一天前", status: "一般风险" }
{ title: "关于修订对中华人民共和国低价值进口商品?..", time: "一天前", status: "一般风? }
]);
//人物动向
const peoDate = ref("本周");
const peoDateList = ["今天", "昨天", "近三天", "本周", "本月"];
const peoDateList = ["今天", "昨天", "近三?, "本周", "本月"];
//重要人物言论及立场选择按钮
const fieldSelected = ref("全部领域");
......@@ -713,7 +713,7 @@ const fieldSelectList = ref([
value: "2"
},
{
label: "新一代信息技术",
label: "新一代信息技?,
value: "3"
},
{
......@@ -721,7 +721,7 @@ const fieldSelectList = ref([
value: "4"
},
{
label: "新能源",
label: "新能?,
value: "5"
},
{
......@@ -733,11 +733,11 @@ const fieldSelectList = ref([
value: "7"
},
{
label: "先进制造",
label: "先进制?,
value: "8"
},
{
label: "新材料",
label: "新材?,
value: "9"
},
{
......@@ -757,7 +757,7 @@ const fieldSelectList = ref([
value: "13"
},
{
label: "核",
label: "?,
value: "14"
}
]);
......@@ -771,29 +771,29 @@ const fields = [
"通信网络",
"航空航天",
"海洋",
"新材料",
"先进制造"
"新材?,
"先进制?
];
const yearList = ref([
{
label: "2025年",
label: "2025?,
value: "2025"
},
{
label: "2024年",
label: "2024?,
value: "2024"
},
{
label: "2023年",
label: "2023?,
value: "2023"
},
{
label: "2022年",
label: "2022?,
value: "2022"
}
]);
// 资源库分
const categoryList = ref(["全部人物", "国会议员", "行政主官", "科技领袖", "顶尖科学家"]);
// 资源库分?
const categoryList = ref(["全部人物", "国会议员", "行政主官", "科技领袖", "顶尖科学?]);
const activeCate = ref("全部人物");
const typeId = ref("000");
......@@ -814,44 +814,44 @@ const handleToMoreRiskSignal = () => {
// 词云数据
const wordCloudData = ref([
{ name: "人工智能 (AI)", value: 100 },
{ name: "进行可再生能源税收减免", value: 85 },
{ name: "进行可再生能源税收减?, value: 85 },
{ name: "减少燃料对外依赖", value: 80 },
{ name: "评估中美现代化技术", value: 75 },
{ name: "应对中国制造2025战略", value: 70 },
{ name: "加强供应链风险管理", value: 68 },
{ name: "补贴和税收抵免", value: 65 },
{ name: "评估中美能源技术", value: 60 },
{ name: "评估中美现代化技?, value: 75 },
{ name: "应对中国制?025战略", value: 70 },
{ name: "加强供应链风险管?, value: 68 },
{ name: "补贴和税收抵?, value: 65 },
{ name: "评估中美能源技?, value: 60 },
{ name: "实施能源税收延期", value: 58 },
{ name: "投资基础设施", value: 55 },
{ name: "禁止资助中国能源项目", value: 53 },
{ name: "限制采购中国产电池", value: 50 },
{ name: "限制采购中国产电?, value: 50 },
{ name: "加强美国在核能领域得到领导力", value: 48 },
{ name: "技术出口限制", value: 45 },
{ name: "出口管制与投资审查", value: 42 },
{ name: "供应链调整", value: 40 },
{ name: "技术出口限?, value: 45 },
{ name: "出口管制与投资审?, value: 42 },
{ name: "供应链调?, value: 40 },
{ name: "左岸外包", value: 38 },
{ name: "空域主权与安全", value: 36 },
{ name: "空域主权与安?, value: 36 },
{ name: "抵制外国人才争夺", value: 34 },
{ name: "无人机先进空中交通", value: 32 },
{ name: "无人机先进空中交?, value: 32 },
{ name: "能源与基础设施", value: 30 }
]);
const wordCloudfield = ref("0");
const wordCloudvalue = ref("2025");
const yearSelect = ref("2025");
const areaSelect = ref("近十年");
const areaSelect = ref("近十?);
const options = [
{
value: "近十年",
label: "近十年"
value: "近十?,
label: "近十?
},
{
value: "近五年",
label: "近五年"
value: "近五?,
label: "近五?
}
];
const viewOption = ref(["行政主管", "国会议员", "科技领袖", "顶尖科学家"]);
const viewOption = ref(["行政主管", "国会议员", "科技领袖", "顶尖科学?]);
const viewSelect = ref("国会议员");
......@@ -1975,7 +1975,7 @@ onMounted(async () => {
}
.source-tag {
/* 数据展示/Tag标签/亮色/*/
/* 数据展示/Tag标签/亮色/?*/
width: 100px;
height: 24px;
/* 自动布局 */
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论