提交 bef8ac89 authored 作者: coderBryanFu's avatar coderBryanFu

update

上级 d7d0a29d
...@@ -12,7 +12,7 @@ ...@@ -12,7 +12,7 @@
--btn-active-border-color: var(--color-main-active); --btn-active-border-color: var(--color-main-active);
--btn-active-bg-color: rgba(231, 243, 255, 1); --btn-active-bg-color: rgba(231, 243, 255, 1);
--btn-active-text-color: var(--color-main-active); --btn-active-text-color: var(--color-main-active);
/* 标签按钮颜色 */ /* 标签按钮颜色 */
--tag-btn1-bg-color: rgba(255, 241, 240, 1); --tag-btn1-bg-color: rgba(255, 241, 240, 1);
...@@ -31,4 +31,23 @@ ...@@ -31,4 +31,23 @@
--tag-btn3-border-color: rgba(217, 247, 190, 1); --tag-btn3-border-color: rgba(217, 247, 190, 1);
--tag-btn3-text-color: rgba(82, 196, 26, 1); --tag-btn3-text-color: rgba(82, 196, 26, 1);
}
.hover-dialog {
max-width: 1200px;
max-height: 600px;
overflow: hidden;
overflow-y: auto;
padding: 8px 16px;
border-radius: 10px;
box-shadow: 0px 0px 20px 0px rgba(25, 69, 130, 0.1);
background: rgba(59, 65, 75, 1);
color: #fff;
font-family: Microsoft YaHei;
font-style: Regular;
font-size: 16px;
font-weight: 400;
line-height: 30px;
letter-spacing: 0px;
text-align: left;
} }
\ No newline at end of file
...@@ -175,17 +175,17 @@ const loadingDotIndex = ref(0); ...@@ -175,17 +175,17 @@ const loadingDotIndex = ref(0);
// 消息数据 // 消息数据
const messages = ref([ const messages = ref([
{ // {
type: "user", // type: "user",
content: "你好" // content: "你好"
}, // },
{ // {
type: "ai", // type: "ai",
source: [ // source: [
`完整检索实体名单: \n\n 中国科学院空天信息创新研究院\n\n北京复旦微电子技术有限公司\n\n北京天宜源生物科技有限公司\n\n北京擎科生物科技有限公司\n长沙南飞电子技术有限公司\n常州南飞微电子有限公司\n成都南飞微电子有限公司\n中国科学院国家授时中心\n吉姆西半导体科技(无锡)有限公司\n香港德铭电子有限公司\n华科物流(香港)有限公司\n华科供应链(香港)有限公司\n积村半导体科技(上海)有限公司\n生工生物工程(上海)股份有限公司\n上海复旦微电子集团股份有限公司\n上海复旦微电子(香港)有限公司\n上海富控华龙微电子系统技术有限公司\n上海富维迅捷数字科技有限公司\n上海索辰信息科技有限公司\n深圳复旦微电子有限公司\n深圳南飞微电子有限公司\n深圳新力康供应链管理有限公司\n盛美半导体设备(上海)股份有限公司\n总数量:23` // `完整检索实体名单: \n\n 中国科学院空天信息创新研究院\n\n北京复旦微电子技术有限公司\n\n北京天宜源生物科技有限公司\n\n北京擎科生物科技有限公司\n长沙南飞电子技术有限公司\n常州南飞微电子有限公司\n成都南飞微电子有限公司\n中国科学院国家授时中心\n吉姆西半导体科技(无锡)有限公司\n香港德铭电子有限公司\n华科物流(香港)有限公司\n华科供应链(香港)有限公司\n积村半导体科技(上海)有限公司\n生工生物工程(上海)股份有限公司\n上海复旦微电子集团股份有限公司\n上海复旦微电子(香港)有限公司\n上海富控华龙微电子系统技术有限公司\n上海富维迅捷数字科技有限公司\n上海索辰信息科技有限公司\n深圳复旦微电子有限公司\n深圳南飞微电子有限公司\n深圳新力康供应链管理有限公司\n盛美半导体设备(上海)股份有限公司\n总数量:23`
], // ],
content: `2025年9月实体清单的主要制裁实体、制裁原因\n\n 时间范围\n-当前查询的时间范围为:2025年9月16日。` // content: `2025年9月实体清单的主要制裁实体、制裁原因\n\n 时间范围\n-当前查询的时间范围为:2025年9月16日。`
} // }
]); ]);
// Markdown 渲染器 // Markdown 渲染器
......
...@@ -2778,7 +2778,8 @@ onMounted(async () => { ...@@ -2778,7 +2778,8 @@ onMounted(async () => {
} }
.home-main-footer { .home-main-footer {
margin-top: 34px; margin-top: 34px;
height: 1860px; max-height: 1860px;
padding-bottom: 160px;
background: rgba(248, 249, 250, 1); background: rgba(248, 249, 250, 1);
overflow: hidden; overflow: hidden;
.divide4 { .divide4 {
...@@ -2924,7 +2925,7 @@ onMounted(async () => { ...@@ -2924,7 +2925,7 @@ onMounted(async () => {
} }
.right { .right {
width: 1284px; width: 1284px;
height: 1489px; max-height: 1489px;
box-shadow: 0px 0px 15px 0px rgba(60, 87, 126, 0.2); box-shadow: 0px 0px 15px 0px rgba(60, 87, 126, 0.2);
background: rgba(255, 255, 255, 1); background: rgba(255, 255, 255, 1);
box-sizing: border-box; box-sizing: border-box;
...@@ -2955,7 +2956,7 @@ onMounted(async () => { ...@@ -2955,7 +2956,7 @@ onMounted(async () => {
} }
} }
.content-box { .content-box {
height: 1367px; max-height: 1367px;
border-bottom: 1px solid rgba(234, 236, 238, 1); border-bottom: 1px solid rgba(234, 236, 238, 1);
overflow: hidden; overflow: hidden;
.main-item { .main-item {
...@@ -3076,9 +3077,8 @@ onMounted(async () => { ...@@ -3076,9 +3077,8 @@ onMounted(async () => {
} }
} }
.footer-box { .footer-box {
margin: 0 30px; margin: 20px 30px;
height: 32px; height: 32px;
margin-top: 20px;
display: flex; display: flex;
justify-content: space-between; justify-content: space-between;
.footer-left { .footer-left {
......
...@@ -163,22 +163,22 @@ const handleScroll = () => { ...@@ -163,22 +163,22 @@ const handleScroll = () => {
}; };
onMounted(async () => { onMounted(async () => {
try { // try {
const chainFishboneData = await getChainFishbone(props.chainId); // const chainFishboneData = await getChainFishbone(props.chainId);
fishboneData.value = chainFishboneData?.causes ?? []; // fishboneData.value = chainFishboneData?.causes ?? [];
// 等待DOM更新后检查是否需要滚动 // // 等待DOM更新后检查是否需要滚动
nextTick(() => { // nextTick(() => {
if (scrollContainerRef.value && fishboneRef.value) { // if (scrollContainerRef.value && fishboneRef.value) {
showScrollIndicator.value = fishboneRef.value.scrollWidth > scrollContainerRef.value.clientWidth; // showScrollIndicator.value = fishboneRef.value.scrollWidth > scrollContainerRef.value.clientWidth;
updateScrollState(); // updateScrollState();
} // }
}); // });
console.log("鱼骨图数据:", fishboneData.value); // console.log("鱼骨图数据:", fishboneData.value);
} catch (error) { // } catch (error) {
console.log(error); // console.log(error);
} // }
}); });
// 监听props中的chainId变化 // 监听props中的chainId变化
......
...@@ -87,7 +87,7 @@ ...@@ -87,7 +87,7 @@
</div> </div>
</div> </div>
<div class="box2-main-main"> <div class="box2-main-main">
<Fishbone :chainId="2" /> <Fishbone :chainId="chainId" />
</div> </div>
<div class="box2-main-footer"> <div class="box2-main-footer">
<div class="box2-main-footer-left"> <div class="box2-main-footer-left">
...@@ -95,7 +95,13 @@ ...@@ -95,7 +95,13 @@
<div class="icon"> <div class="icon">
<img src="@/assets/icons/warning.png" alt="" /> <img src="@/assets/icons/warning.png" alt="" />
</div> </div>
<div class="text">{{ "中国企业45家(51.00%),受制裁5家(7.00%)" }}</div> <div class="text">
{{
`中国企业${chainInfo.upstreamInternalCount}家(${
Number(chainInfo.upstreamInternalRate * 100).toFixed(2)
}%),受制裁${chainInfo.upstreamEntityCount}家(${Number(chainInfo.upstreamEntityRate * 100).toFixed(2)}%)`
}}
</div>
</div> </div>
<div class="bottom">{{ "基础支撑" }}</div> <div class="bottom">{{ "基础支撑" }}</div>
</div> </div>
...@@ -104,7 +110,15 @@ ...@@ -104,7 +110,15 @@
<div class="icon"> <div class="icon">
<img src="@/assets/icons/warning.png" alt="" /> <img src="@/assets/icons/warning.png" alt="" />
</div> </div>
<div class="text">{{ "中国企业45家(51.00%),受制裁8家(7.00%)" }}</div> <div class="text">
{{
`中国企业${chainInfo.midstreamInternalCount}家(${
Number(chainInfo.midstreamInternalRate * 100).toFixed(2)
}%),受制裁${chainInfo.midstreamEntityCount}家(${
Number(chainInfo.midstreamEntityRate * 100).toFixed(2)
}%)`
}}
</div>
</div> </div>
<div class="bottom">{{ "软件算法" }}</div> <div class="bottom">{{ "软件算法" }}</div>
</div> </div>
...@@ -113,7 +127,15 @@ ...@@ -113,7 +127,15 @@
<div class="icon"> <div class="icon">
<img src="@/assets/icons/warning.png" alt="" /> <img src="@/assets/icons/warning.png" alt="" />
</div> </div>
<div class="text">{{ "中国企业45家(51.00%),受制裁8家(7.00%)" }}</div> <div class="text">
{{
`中国企业${chainInfo.downstreamInternalCount}家(${
Number(chainInfo.downstreamInternalRate * 100).toFixed(2)
}%),受制裁${chainInfo.downstreamEntityCount}家(${
Number(chainInfo.downstreamEntityRate * 100).toFixed(2)
}%)`
}}
</div>
</div> </div>
<div class="bottom">{{ "行业应用" }}</div> <div class="bottom">{{ "行业应用" }}</div>
</div> </div>
...@@ -132,6 +154,7 @@ import router from "@/router"; ...@@ -132,6 +154,7 @@ import router from "@/router";
import setChart from "@/utils/setChart"; import setChart from "@/utils/setChart";
import getBarChart from "./utils/barChart"; import getBarChart from "./utils/barChart";
import { getDecreeIndustry, getDecreehylyList, getDecreeCompany, getDecreeAction } from "@/api/decree/influence"; import { getDecreeIndustry, getDecreehylyList, getDecreeCompany, getDecreeAction } from "@/api/decree/influence";
import { getCnEntityOnChain, getChainFishbone, getChainInfoByDomainId, getChainStructure } from "@/api/exportControl";
const route = useRoute(); const route = useRoute();
...@@ -195,6 +218,8 @@ const handleClickBox1Btn = btn => { ...@@ -195,6 +218,8 @@ const handleClickBox1Btn = btn => {
box1BtnActiveName.value = btn.name; box1BtnActiveName.value = btn.name;
curAreaId.value = btn.id; curAreaId.value = btn.id;
handleGetCompanyListByArea(); handleGetCompanyListByArea();
handleGetCompanyListByArea();
handleGetChainId();
}; };
// 获取行业领域列表 // 获取行业领域列表
...@@ -207,6 +232,7 @@ const handleGetHylyList = async () => { ...@@ -207,6 +232,7 @@ const handleGetHylyList = async () => {
box1BtnActiveName.value = box1BtnList.value[0].name; box1BtnActiveName.value = box1BtnList.value[0].name;
curAreaId.value = box1BtnList.value[0].id; curAreaId.value = box1BtnList.value[0].id;
handleGetCompanyListByArea(); handleGetCompanyListByArea();
handleGetChainId();
} }
} catch (error) {} } catch (error) {}
}; };
...@@ -361,10 +387,56 @@ watch( ...@@ -361,10 +387,56 @@ watch(
} }
); );
const chainInfo = ref({
upstreamInternalCount: 0,
upstreamInternalRate: 0,
upstreamEntityCount: 0,
upstreamEntityRate: 0,
midstreamInternalCount: 0,
midstreamInternalRate: 0,
midstreamEntityCount: 0,
midstreamEntityRate: 0,
downstreamInternalCount: 0,
downstreamInternalRate: 0,
downstreamEntityCount: 0,
downstreamEntityRate: 0
});
const chainId = ref(0);
// 根据领域id获取chainId
const handleGetChainId = async () => {
try {
const res = await getChainInfoByDomainId(curAreaId.value);
console.log("获取chainId", res);
if (res && res.length) {
chainId.value = res[0].id;
console.log("chainId", chainId.value);
handleGetChainInfoByChainId();
}
} catch (error) {
console.error("chainId error", error);
}
};
// 根据chainId获取chainInfo
const handleGetChainInfoByChainId = async () => {
try {
const res = await getCnEntityOnChain(chainId.value);
console.log("chainInfo", res);
if (res) {
chainInfo.value = res;
}
} catch (error) {
console.log("chainInfo error", error);
}
};
onMounted(() => { onMounted(() => {
handleGetChart1Data(); handleGetChart1Data();
handleGetHylyList(); handleGetHylyList();
handleGetAction(); // handleGetAction();
handelBox1(); handelBox1();
}); });
</script> </script>
......
...@@ -55,13 +55,20 @@ ...@@ -55,13 +55,20 @@
</div> </div>
</div> </div>
<div class="box2-main"> <div class="box2-main">
<div class="box2-dialog hover-dialog" v-if="isShowBox2Dialog">{{ box2ContentAll }}</div>
<div class="box2-item" v-for="(item, index) in relatedEvents" :key="index"> <div class="box2-item" v-for="(item, index) in relatedEvents" :key="index">
<div class="item-left"> <div class="item-left">
<img :src="item.image" alt="" /> <img :src="item.image" alt="" />
</div> </div>
<div class="item-center"> <div class="item-center">
<div class="title">{{ item.title }}</div> <div class="title">{{ item.title }}</div>
<div class="content">{{ item.content }}</div> <div
class="content"
@mouseenter="handleChangeShowBox2Dialog(true, item.content)"
@mouseleave="handleChangeShowBox2Dialog(false)"
>
{{ item.content }}
</div>
</div> </div>
<div class="item-right">{{ item.time }}</div> <div class="item-right">{{ item.time }}</div>
</div> </div>
...@@ -90,10 +97,10 @@ ...@@ -90,10 +97,10 @@
<div class="box3-item" v-for="(item, index) in laws" :key="index"> <div class="box3-item" v-for="(item, index) in laws" :key="index">
<div class="id">{{ index + 1 }}</div> <div class="id">{{ index + 1 }}</div>
<div class="item-header"> <div class="item-header">
<div class="name">{{ item.name }}</div> <div class="name">{{ item.title }}</div>
<div class="info">{{ item.info }}</div> <div class="info">{{ item.info }}</div>
</div> </div>
<div class="item-content">{{ item.content }}</div> <!-- <div class="item-content">{{ item.content }}</div> -->
</div> </div>
</div> </div>
</div> </div>
...@@ -144,8 +151,8 @@ const handleGetBackground = async () => { ...@@ -144,8 +151,8 @@ const handleGetBackground = async () => {
const res = await getDecreeBackground(params); const res = await getDecreeBackground(params);
console.log("提出背景", res); console.log("提出背景", res);
if (res.code === 200 && res.data) { if (res.code === 200 && res.data) {
backgroundListNum.value = res.data.numberOfElements backgroundListNum.value = res.data.numberOfElements;
backgroundList.value = res.data.content backgroundList.value = res.data.content;
} else { } else {
backgroundListNum.value = 0; backgroundListNum.value = 0;
backgroundList.value = []; backgroundList.value = [];
...@@ -162,75 +169,83 @@ const relatedEvents = ref([ ...@@ -162,75 +169,83 @@ const relatedEvents = ref([
// "斯坦福大学《2025年人工智能指数报告》显示,中美顶尖AI模型在MMLU(大规模多任务语言理解)等主流基准测试中的性能...", // "斯坦福大学《2025年人工智能指数报告》显示,中美顶尖AI模型在MMLU(大规模多任务语言理解)等主流基准测试中的性能...",
// time: "2025-08-30" // time: "2025-08-30"
// } // }
]); ]);
const handleGetRelateEvents = async () => { const handleGetRelateEvents = async () => {
const params = { const params = {
id: decreeId.value id: decreeId.value
} };
try { try {
const res = await getDecreeRelatedEvent(params) const res = await getDecreeRelatedEvent(params);
console.log('相关事件', res); console.log("相关事件", res);
if(res.code === 200 && res.data) { if (res.code === 200 && res.data) {
relatedEvents.value = res.data.map( item => { relatedEvents.value = res.data.map(item => {
return { return {
image: '', image: item.imageUrl,
title: item.sjbt, title: item.sjbt,
content: item.sjnr, content: item.sjnr,
time: item.sjsj time: item.sjsj
} };
}) });
} else { } else {
relatedEvents.value = [] relatedEvents.value = [];
} }
} catch (error) { } catch (error) {}
};
}
}
// 法律依据 // 法律依据
const laws = ref([ const laws = ref([
// { {
// name: "《美国法典》", title: "《美国法典》",
// info: "第3编第301条", info: "第3编第301条",
// content: content:
// "允许总统通过行政命令(Executive Order)​​ 或其它书面形式授权行政部门或机构的负责人​(如国务卿、财政部长等)代行本属于总统的法定职能(由国会立法授予总统的职能)。" "允许总统通过行政命令(Executive Order)​​ 或其它书面形式授权行政部门或机构的负责人​(如国务卿、财政部长等)代行本属于总统的法定职能(由国会立法授予总统的职能)。"
// }, },
// { {
// name: "《出口管制改革法案》", title: "《出口管制改革法案》",
// info: "", info: "",
// content: content:
// "该法案授权政府出于国家安全和外交政策目的对特定技术、商品和软件的出口进行管制。确保AI技术不流向“对手国家”是其题中应有之义。" "该法案授权政府出于国家安全和外交政策目的对特定技术、商品和软件的出口进行管制。确保AI技术不流向“对手国家”是其题中应有之义。"
// } }
]); ]);
const handleGetLaws = async () => { const handleGetLaws = async () => {
const params = { const params = {
id: decreeId.value id: decreeId.value
} };
try { try {
const res = await getDecreeDepend(params) const res = await getDecreeDepend(params);
console.log('法律依据', res); console.log("法律依据", res);
if(res.code === 200 && res.data) { if (res.code === 200 && res.data) {
laws.value = res.data;
} else { } else {
laws.value = [] laws.value = [];
} }
} catch (error) { } catch (error) {}
};
} const isShowBox2Dialog = ref(false);
} const box2ContentAll = ref("");
const handleChangeShowBox2Dialog = (isShow, content) => {
isShowBox2Dialog.value = isShow;
box2ContentAll.value = content;
};
onMounted(() => { onMounted(() => {
handleGetBackground(); handleGetBackground();
handleGetRelateEvents() handleGetRelateEvents();
handleGetLaws() handleGetLaws();
}); });
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
.introduction-wrap { .introduction-wrap {
display: flex; display: flex;
position: relative;
position: relative;
.box2-dialog {
position: absolute;
bottom: 350px;
left: 100px;
z-index: 9999;
}
.box-header { .box-header {
height: 56px; height: 56px;
display: flex; display: flex;
...@@ -307,18 +322,22 @@ onMounted(() => { ...@@ -307,18 +322,22 @@ onMounted(() => {
background: rgba(255, 255, 255, 1); background: rgba(255, 255, 255, 1);
.box1-main { .box1-main {
margin-left: 22px; margin-left: 22px;
width: 1120px;
height: 280px; height: 280px;
overflow: hidden;
overflow-y: auto;
.box1-item { .box1-item {
width: 1101px; width: 1101px;
height: 48px; min-height: 48px;
margin-bottom: 8px; margin-bottom: 8px;
box-sizing: border-box; box-sizing: border-box;
border: 1px solid rgba(234, 236, 238, 1); border: 1px solid rgba(234, 236, 238, 1);
border-radius: 2px; border-radius: 2px;
background: rgba(255, 255, 255, 1); background: rgba(255, 255, 255, 1);
display: flex; display: flex;
align-items: center;
padding: 12px 0;
.id { .id {
margin-top: 12px;
margin-left: 15px; margin-left: 15px;
width: 24px; width: 24px;
height: 24px; height: 24px;
...@@ -330,8 +349,11 @@ onMounted(() => { ...@@ -330,8 +349,11 @@ onMounted(() => {
} }
.title { .title {
width: 1000px; width: 1000px;
line-height: 48px; line-height: 24px;
margin-left: 13px; margin-left: 13px;
// overflow: hidden;
// text-overflow: ellipsis;
// white-space: nowrap;
} }
.open { .open {
width: 16px; width: 16px;
...@@ -408,6 +430,7 @@ onMounted(() => { ...@@ -408,6 +430,7 @@ onMounted(() => {
overflow: hidden; overflow: hidden;
text-overflow: ellipsis; text-overflow: ellipsis;
white-space: nowrap; white-space: nowrap;
cursor: pointer;
} }
} }
.item-right { .item-right {
...@@ -447,15 +470,18 @@ onMounted(() => { ...@@ -447,15 +470,18 @@ onMounted(() => {
margin-top: 9px; margin-top: 9px;
width: 520px; width: 520px;
height: 720px; height: 720px;
// overflow: hidden;
overflow-y: auto; overflow-y: auto;
padding-left: 20px;
.box3-item { .box3-item {
margin-bottom: 24px; margin-bottom: 20px;
position: relative; position: relative;
border-bottom: 1px solid rgba(234, 236, 238, 1);
.id { .id {
width: 24px; width: 24px;
height: 24px; height: 24px;
position: absolute; position: absolute;
left: 28px; left: 18px;
top: 1px; top: 1px;
z-index: 99; z-index: 99;
text-align: center; text-align: center;
...@@ -466,11 +492,14 @@ onMounted(() => { ...@@ -466,11 +492,14 @@ onMounted(() => {
color: #0a57a6; color: #0a57a6;
} }
.item-header { .item-header {
width: 460px; width: 440px;
height: 35px; height: 35px;
display: flex; display: flex;
justify-content: space-between; justify-content: space-between;
margin-left: 60px; margin-left: 60px;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
.name { .name {
max-width: 460px; max-width: 460px;
overflow: hidden; overflow: hidden;
......
...@@ -416,12 +416,19 @@ handleGetOrgnization(); ...@@ -416,12 +416,19 @@ handleGetOrgnization();
} }
.header-btn-box { .header-btn-box {
position: absolute; position: absolute;
width: 360px;
height: 35px;
overflow: hidden;
overflow-x: auto;
top: 14px; top: 14px;
right: 84px; right: 84px;
display: flex; display: flex;
justify-content: flex-end; // justify-content: flex-end;
gap: 8px; gap: 8px;
white-space: nowrap;
.btn { .btn {
min-width: min-content;
height: 28px; height: 28px;
padding: 0 8px; padding: 0 8px;
box-sizing: border-box; box-sizing: border-box;
...@@ -667,6 +674,9 @@ handleGetOrgnization(); ...@@ -667,6 +674,9 @@ handleGetOrgnization();
.box3-top-bottom { .box3-top-bottom {
margin-left: 50px; margin-left: 50px;
.box3-top-right-main { .box3-top-right-main {
height: 150px;
overflow: hidden;
overflow-y: auto;
color: rgba(59, 65, 75, 1); color: rgba(59, 65, 75, 1);
font-family: Microsoft YaHei; font-family: Microsoft YaHei;
font-size: 16px; font-size: 16px;
...@@ -676,7 +686,7 @@ handleGetOrgnization(); ...@@ -676,7 +686,7 @@ handleGetOrgnization();
.main-item { .main-item {
display: flex; display: flex;
margin-top: 12px; margin-top: 12px;
height: 26px; // height: 26px;
line-height: 26px; line-height: 26px;
.item-icon { .item-icon {
width: 4px; width: 4px;
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论