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

update

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