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

update

上级 df08706e
...@@ -7,7 +7,7 @@ import request from "@/api/request.js"; ...@@ -7,7 +7,7 @@ import request from "@/api/request.js";
export function getDecreeBackground(params) { export function getDecreeBackground(params) {
return request({ return request({
method: 'GET', method: 'GET',
url: `/api/administrativeOrderInfo/background/${id}`, url: `/api/administrativeOrderInfo/background/${params.id}`,
params params
}) })
} }
...@@ -19,7 +19,7 @@ export function getDecreeBackground(params) { ...@@ -19,7 +19,7 @@ export function getDecreeBackground(params) {
export function getDecreeRelatedEvent(params) { export function getDecreeRelatedEvent(params) {
return request({ return request({
method: 'GET', method: 'GET',
url: `/api/administrativeOrderInfo/relateEvent/${id}`, url: `/api/administrativeOrderInfo/relateEvent/${params.id}`,
params params
}) })
} }
...@@ -31,7 +31,7 @@ export function getDecreeRelatedEvent(params) { ...@@ -31,7 +31,7 @@ export function getDecreeRelatedEvent(params) {
export function getDecreeDepend(params) { export function getDecreeDepend(params) {
return request({ return request({
method: 'GET', method: 'GET',
url: `/api/administrativeOrderInfo/depend/${id}`, url: `/api/administrativeOrderInfo/depend/${params.id}`,
params params
}) })
} }
\ No newline at end of file
import request from "@/api/request.js";
// 根据政令ID获取领域公司信息
/**
* @param {cRelated, id}
*/
export function getDecreeRelateOrder(params) {
return request({
method: 'GET',
url: `/api/administrativeOrderDeepDive/relateOrder/${params.id}`,
params
})
}
\ No newline at end of file
import request from "@/api/request.js"; import request from "@/api/request.js";
// 最新科技政令
export function getDepartmentList() {
return request({
method: 'GET',
url: `/api/administrativeDict/department`,
})
}
// 最新科技政令 // 最新科技政令
export function getLatestDecree() { export function getLatestDecree() {
return request({ return request({
......
...@@ -7,17 +7,16 @@ import request from "@/api/request.js"; ...@@ -7,17 +7,16 @@ import request from "@/api/request.js";
export function getDecreeIndustry(params) { export function getDecreeIndustry(params) {
return request({ return request({
method: 'GET', method: 'GET',
url: `/api/administrativeOrderImpactAnalysis/industry/${id}`, url: `/api/administrativeOrderImpactAnalysis/industry/${params.id}`,
params params
}) })
} }
// 获取行业领域列表 // 获取行业领域列表
export function getDecreehylyList(params) { export function getDecreehylyList() {
return request({ return request({
method: 'GET', method: 'GET',
url: `/api/billImpactAnalysis/industry/hylyList`, url: `/api/billImpactAnalysis/industry/hylyList`,
params
}) })
} }
...@@ -28,7 +27,7 @@ export function getDecreehylyList(params) { ...@@ -28,7 +27,7 @@ export function getDecreehylyList(params) {
export function getDecreeCompany(params) { export function getDecreeCompany(params) {
return request({ return request({
method: 'GET', method: 'GET',
url: `/api/administrativeOrderImpactAnalysis/industry/company/${id}`, url: `/api/administrativeOrderImpactAnalysis/industry/company/${params.id}`,
params params
}) })
} }
...@@ -40,7 +39,7 @@ export function getDecreeCompany(params) { ...@@ -40,7 +39,7 @@ export function getDecreeCompany(params) {
export function getDecreeAction(params) { export function getDecreeAction(params) {
return request({ return request({
method: 'GET', method: 'GET',
url: `/api/administrativeOrderImpactAnalysis/action/${id}`, url: `/api/administrativeOrderImpactAnalysis/action/${params.id}`,
params params
}) })
} }
...@@ -7,7 +7,7 @@ import request from "@/api/request.js"; ...@@ -7,7 +7,7 @@ import request from "@/api/request.js";
export function getDecreeBasicInfo(params) { export function getDecreeBasicInfo(params) {
return request({ return request({
method: 'GET', method: 'GET',
url: `/api/administrativeOrderInfo/basicInfo/${id}`, url: `/api/administrativeOrderInfo/basicInfo/${params.id}`,
params params
}) })
} }
...@@ -19,7 +19,7 @@ export function getDecreeBasicInfo(params) { ...@@ -19,7 +19,7 @@ export function getDecreeBasicInfo(params) {
export function getDecreeMainContent(params) { export function getDecreeMainContent(params) {
return request({ return request({
method: 'GET', method: 'GET',
url: `/api/administrativeOrderInfo/mainContent/${id}`, url: `/api/administrativeOrderInfo/mainContent/${params.id}`,
params params
}) })
} }
...@@ -31,7 +31,7 @@ export function getDecreeMainContent(params) { ...@@ -31,7 +31,7 @@ export function getDecreeMainContent(params) {
export function getDecreeOrganization(params) { export function getDecreeOrganization(params) {
return request({ return request({
method: 'GET', method: 'GET',
url: `/api/administrativeOrderInfo/organization/${id}`, url: `/api/administrativeOrderInfo/organization/${params.id}`,
params params
}) })
} }
\ No newline at end of file
import request from "@/api/request.js";
// 新闻资讯
/**
* @param {moduleId}
*/
export function getNews(params) {
return request({
method: 'GET',
url: `/api/commonFeature/news/${params.moduleId}`,
params
})
}
// 社交媒体
/**
* @param {moduleId}
*/
export function getSocialMedia(params) {
return request({
method: 'GET',
url: `/api/commonFeature/remarks/${params.moduleId}`,
params
})
}
// 风险信号
/**
* @param {moduleId}
*/
export function getRiskSignal(params) {
return request({
method: 'GET',
url: `/api/commonFeature/riskSignal/${params.moduleId}`,
params
})
}
\ No newline at end of file
...@@ -39,7 +39,7 @@ ...@@ -39,7 +39,7 @@
<div class="item-right-text"> <div class="item-right-text">
{{ decreeInfo.totalTitle }} {{ decreeInfo.totalTitle }}
</div> </div>
<div class="item-right-icon"> <div class="item-right-icon" v-if="decreeInfo.totalTitle">
<img src="./assets/icons/open-icon.png" alt="" /> <img src="./assets/icons/open-icon.png" alt="" />
</div> </div>
</div> </div>
...@@ -57,9 +57,9 @@ ...@@ -57,9 +57,9 @@
</div> </div>
</div> </div>
<div class="info-item"> <div class="info-item">
<div class="item-left">{{ "签署总统:" }}</div> <div class="item-left">{{ "发布机构:" }}</div>
<div class="item-right"> <div class="item-right">
{{ decreeInfo.signPerson }} {{ decreeInfo.signOrg }}
</div> </div>
</div> </div>
</div> </div>
...@@ -72,9 +72,9 @@ ...@@ -72,9 +72,9 @@
<div class="title">{{ "政令主要内容" }}</div> <div class="title">{{ "政令主要内容" }}</div>
</div> </div>
<div class="list-main"> <div class="list-main">
<div class="list-item" v-for="(val, idx) in decreeInfo.list" :key="idx"> <div class="list-item" v-for="(val, idx) in showList" :key="idx">
<div class="id">{{ idx + 1 }}</div> <div class="id">{{ idx + 1 }}</div>
<div class="title">{{ val.title }}</div> <div class="title">{{ val.content }}</div>
<div class="open"> <div class="open">
<img src="./assets/icons/open-icon.png" alt="" /> <img src="./assets/icons/open-icon.png" alt="" />
</div> </div>
...@@ -103,12 +103,30 @@ ...@@ -103,12 +103,30 @@
</template> </template>
<script setup> <script setup>
import { ref, onMounted } from "vue"; import { ref, computed, onMounted } from "vue";
import { useRoute } from "vue-router";
import { getDecreeMainContent } from "@/api/decree/introduction";
import { getDecreeRelateOrder } from "@/api/decree/deepdig";
import box2InfoImg from "./assets/icons/box1-info.png"; import box2InfoImg from "./assets/icons/box1-info.png";
const allData = ref([]);
const relateId = ref(0);
const route = useRoute();
const pageSize = ref(10); const pageSize = ref(10);
const currentPage = ref(1); const currentPage = ref(1);
// 处理页码改变事件
const handleCurrentChange = page => {
currentPage.value = page;
};
const showList = computed(() => {
const startIndex = (currentPage.value - 1) * pageSize.value;
const endIndex = startIndex + pageSize.value;
return decreeInfo.value.list.slice(startIndex, endIndex);
});
const siderList = ref([ const siderList = ref([
{ {
...@@ -133,51 +151,112 @@ const siderList = ref([ ...@@ -133,51 +151,112 @@ const siderList = ref([
} }
]); ]);
const siderActiveIndex = ref(0); const siderActiveIndex = ref(0);
const handleClickSider = index => { const handleClickSider = async index => {
siderActiveIndex.value = index siderActiveIndex.value = index;
} decreeInfo.value.img = allData.value[index].imageUrl;
decreeInfo.value.totalTitle = allData.value[index].name;
decreeInfo.value.eTotalTitle = allData.value[index].ename;
decreeInfo.value.signTime = allData.value[index].postDate;
decreeInfo.value.signOrg = allData.value[index].proposeOrgName;
relateId.value = allData.value[index].id;
const params1 = {
currentPage: 0,
pageSize: 999999,
id: relateId.value
};
try {
const res = await getDecreeMainContent(params1);
console.log("政令主要内容", res);
if (res.code === 200 && res.data) {
decreeInfo.value.list = res.data.content;
} else {
decreeInfo.value.list = [];
}
} catch (error) {}
};
const decreeInfo = ref({ const decreeInfo = ref({
img: box2InfoImg, img: box2InfoImg,
totalTitle: "关于安全、可靠和可信地开发和使用人工智能的行政命令", totalTitle: "关于安全、可靠和可信地开发和使用人工智能的行政命令",
eTotalTitle: "Executive Order on the Safe, Secure, and Trustworthy Development and Use of Artificial Intelligence", eTotalTitle: "Executive Order on the Safe, Secure, and Trustworthy Development and Use of Artificial Intelligence",
signTime: "2025年7月23日", signTime: "2025年7月23日",
signPerson: "乔·拜登(Joe Biden)", signOrg: "乔·拜登(Joe Biden)",
list: [ list: [
{ {
title: "要求强大AI系统开发者与政府分享安全测试结果(“红队测试”);制定生物合成筛查标准防范风险;建立AI生成内容鉴别标准" content:
"要求强大AI系统开发者与政府分享安全测试结果(“红队测试”);制定生物合成筛查标准防范风险;建立AI生成内容鉴别标准"
}, },
{ {
title: "优先支持隐私保护技术(PET)研发;评估各机构如何收集和使用商业信息;制定评估隐私保护技术有效性的指南。" content: "优先支持隐私保护技术(PET)研发;评估各机构如何收集和使用商业信息;制定评估隐私保护技术有效性的指南。"
}, },
{ {
title: "为解决算法歧视提供明确指导;确保刑事司法系统中AI使用的公平性;协调调查和起诉AI相关的民权侵犯行为。" content: "为解决算法歧视提供明确指导;确保刑事司法系统中AI使用的公平性;协调调查和起诉AI相关的民权侵犯行为。"
},
{
title: "推动医疗保健领域负责任地使用AI;创造资源支持教育工作者部署AI教育工具。"
},
{
title: "制定减轻AI对工人潜在危害的原则和最佳实践;编写AI对劳动力市场潜在影响的报告。"
},
{
title: "通过“国家AI研究资源”(NAIRR)试点促进研究;为小型开发者和企业家提供技术援助和资源;简化相关领域高技能人才的签证流程。"
},
{
title: "扩大在AI领域的国际合作;与国际伙伴和标准组织加速制定AI标准。"
},
{
title: "发布政府机构使用AI的指南;加快招聘AI专业人才并为相关领域员工提供培训。"
},
{
title: "发布政府机构使用AI的指南;加快招聘AI专业人才并为相关领域员工提供培训。"
},
{
title: "发布政府机构使用AI的指南;加快招聘AI专业人才并为相关领域员工提供培训。"
} }
] ]
}); });
const handleGetRelateOrder = async () => {
const params = {
id: route.query.id
};
try {
const res = await getDecreeRelateOrder(params);
console.log("相关政令关联分析", res);
if (res.code === 200 && res.data) {
allData.value = res.data;
siderList.value = res.data.map(item => {
return {
time: item.year,
title: item.name
};
});
decreeInfo.value.img = allData.value[0].imageUrl;
decreeInfo.value.totalTitle = allData.value[0].name;
decreeInfo.value.eTotalTitle = allData.value[0].ename;
decreeInfo.value.signTime = allData.value[0].postDate;
decreeInfo.value.signOrg = allData.value[0].proposeOrgName;
relateId.value = allData.value[0].id;
const params1 = {
currentPage: 0,
pageSize: 999999,
id: relateId.value
};
try {
const res = await getDecreeMainContent(params1);
console.log("政令主要内容", res);
if (res.code === 200 && res.data) {
decreeInfo.value.list = res.data.content;
} else {
decreeInfo.value.list = [];
}
} catch (error) {}
} else {
allData.value = [];
siderList.value = [];
decreeInfo.value.img = "";
decreeInfo.value.totalTitle = "";
decreeInfo.value.eTotalTitle = "";
decreeInfo.value.signTime = "";
decreeInfo.value.signOrg = "";
decreeInfo.value.list = [];
}
} catch (error) {
allData.value = [];
siderList.value = [];
decreeInfo.value.img = "";
decreeInfo.value.totalTitle = "";
decreeInfo.value.eTotalTitle = "";
decreeInfo.value.signTime = "";
decreeInfo.value.signOrg = "";
decreeInfo.value.list = [];
}
};
onMounted(() => {
handleGetRelateOrder();
});
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
...@@ -265,14 +344,19 @@ const decreeInfo = ref({ ...@@ -265,14 +344,19 @@ const decreeInfo = ref({
margin-top: 20px; margin-top: 20px;
} }
.title { .title {
width: 200px;
margin-left: 17px; margin-left: 17px;
margin-top: 17px; margin-top: 17px;
height: 30px; height: 30px;
// color: var(--color-main-active);
// font-family: Microsoft YaHei;
// font-size: 16px;
// font-weight: 700;
line-height: 30px; line-height: 30px;
color: rgba(59, 65, 75, 1);
font-family: Microsoft YaHei;
font-size: 16px;
font-weight: 400;
letter-spacing: 0px;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
} }
} }
.leftItemActive { .leftItemActive {
...@@ -285,7 +369,7 @@ const decreeInfo = ref({ ...@@ -285,7 +369,7 @@ const decreeInfo = ref({
width: 5px; width: 5px;
height: 48px; height: 48px;
background: var(--color-main-active); background: var(--color-main-active);
right: -70px; right: -15px;
top: 8px; top: 8px;
} }
} }
......
...@@ -122,7 +122,7 @@ ...@@ -122,7 +122,7 @@
<script setup> <script setup>
import { ref, onMounted, onUnmounted } from "vue"; import { ref, onMounted, onUnmounted } from "vue";
import router from "@/router"; import router from "@/router";
import { useRoute } from "vue-router";
import search from "./assets/images/search.png"; import search from "./assets/images/search.png";
import icon1 from "./assets/icons/icon1.png"; import icon1 from "./assets/icons/icon1.png";
...@@ -132,6 +132,10 @@ import icon2Active from "./assets/icons/icon2_active.png"; ...@@ -132,6 +132,10 @@ import icon2Active from "./assets/icons/icon2_active.png";
import icon3 from "./assets/icons/icon3.png"; import icon3 from "./assets/icons/icon3.png";
import icon3Active from "./assets/icons/icon3_active.png"; import icon3Active from "./assets/icons/icon3_active.png";
const route = useRoute();
const decreeId = ref(route.query.id);
const activeName = ref("分析报告"); const activeName = ref("分析报告");
const handleSwitchActiveName = name => { const handleSwitchActiveName = name => {
...@@ -177,7 +181,12 @@ const activeTitle = ref("政令概况"); ...@@ -177,7 +181,12 @@ const activeTitle = ref("政令概况");
const handleClickMainHeaderBtn = item => { const handleClickMainHeaderBtn = item => {
activeTitle.value = item.name; activeTitle.value = item.name;
window.sessionStorage.setItem("activeTitle", item.name); window.sessionStorage.setItem("activeTitle", item.name);
router.push(item.path); router.push({
path: item.path,
query: {
id: decreeId.value
}
});
}; };
onMounted(() => { onMounted(() => {
......
...@@ -28,16 +28,16 @@ ...@@ -28,16 +28,16 @@
<div class="box1-main"> <div class="box1-main">
<div class="box1-item" v-for="(item, index) in backgroundList" :key="index"> <div class="box1-item" v-for="(item, index) in backgroundList" :key="index">
<div class="id">{{ index + 1 }}</div> <div class="id">{{ index + 1 }}</div>
<div class="title">{{ item.title }}</div> <div class="title">{{ item.content }}</div>
<div class="open"> <div class="open">
<img src="./assets/images/open-icon.png" alt="" /> <img src="./assets/images/open-icon.png" alt="" />
</div> </div>
</div> </div>
</div> </div>
<div class="box1-footer"> <div class="box1-footer">
<div class="box1-footer-left">{{ "共计10条指令" }}</div> <div class="box1-footer-left">{{ `共计${backgroundListNum}条指令` }}</div>
<div class="box1-footer-right"> <div class="box1-footer-right">
<el-pagination :page-size="5" background layout="prev, pager, next" :total="10" /> <el-pagination :page-size="5" background layout="prev, pager, next" :total="backgroundListNum" />
</div> </div>
</div> </div>
</div> </div>
...@@ -103,36 +103,55 @@ ...@@ -103,36 +103,55 @@
<script setup> <script setup>
import { ref, onMounted } from "vue"; import { ref, onMounted } from "vue";
import { useRoute } from "vue-router";
import { getDecreeBackground, getDecreeRelatedEvent, getDecreeDepend } from "@/api/decree/background";
import Img1 from "./assets/images/box2-img1.png"; import Img1 from "./assets/images/box2-img1.png";
import Img2 from "./assets/images/box2-img2.png"; import Img2 from "./assets/images/box2-img2.png";
import Img3 from "./assets/images/box2-img3.png"; import Img3 from "./assets/images/box2-img3.png";
import Img4 from "./assets/images/box2-img4.png"; import Img4 from "./assets/images/box2-img4.png";
import Img5 from "./assets/images/box2-img5.png"; import Img5 from "./assets/images/box2-img5.png";
import { reduce } from "lodash";
const route = useRoute();
const decreeId = ref(route.query.id);
// 提出背景 // 提出背景
const box1BtnList = ref(["涉华背景", "全部背景"]); const box1BtnList = ref(["涉华背景", "全部背景"]);
const box1ActiveBtn = ref("涉华背景"); const box1ActiveBtn = ref("涉华背景");
const handleClickBox1Btn = btn => { const handleClickBox1Btn = btn => {
box1ActiveBtn.value = btn; box1ActiveBtn.value = btn;
handleGetBackground();
}; };
const backgroundListNum = ref(0);
const backgroundList = ref([ const backgroundList = ref([
{ {
title: "认为人工智能(AI)是一项将决定未来几十年经济增长、国家安全和全球竞争力的基础性技术" content: "认为人工智能(AI)是一项将决定未来几十年经济增长、国家安全和全球竞争力的基础性技术"
},
{
title: "要求美国不仅必须在开发通用和前沿AI能力方面领先,还必须确保美国的人工智能技术、标准和治理模式在全球范围内被采用"
}, },
{ {
title: "要求加强与盟友的关系并确保我们持续的技术主导地位" content: "要求美国不仅必须在开发通用和前沿AI能力方面领先,还必须确保美国的人工智能技术、标准和治理模式在全球范围内被采用"
}, },
{
title: "计划通过支持美国原产人工智能技术的全球部署,以维护和扩大美国在人工智能领域的领导地位"
},
{
title: "目的为减少国际社会对由中国开发的人工智能技术的依赖"
}
]); ]);
const handleGetBackground = async () => {
const params = {
cRelated: box1ActiveBtn.value === "涉华背景" ? true : false,
currentPage: 0,
pageSize: 999999,
id: decreeId.value
};
try {
const res = await getDecreeBackground(params);
console.log("提出背景", res);
if (res.code === 200 && res.data) {
backgroundListNum.value = res.data.numberOfElements
backgroundList.value = res.data.content
} else {
backgroundListNum.value = 0;
backgroundList.value = [];
}
} catch (error) {}
};
// 相关事件 // 相关事件
const relatedEvents = ref([ const relatedEvents = ref([
...@@ -170,7 +189,29 @@ const relatedEvents = ref([ ...@@ -170,7 +189,29 @@ const relatedEvents = ref([
time: "2025-05-20" time: "2025-05-20"
} }
]); ]);
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 => {
return {
image: '',
title: item.sjbt,
content: item.sjnr,
time: item.sjsj
}
})
} else {
relatedEvents.value = []
}
} catch (error) {
}
}
// 法律依据 // 法律依据
const laws = ref([ const laws = ref([
...@@ -203,6 +244,28 @@ const laws = ref([ ...@@ -203,6 +244,28 @@ const laws = ref([
content: "要求强大AI系统的开发者与政府共享安全测试结果,并为AI安全、隐私保护、公平权利及创新竞争等方面制定标准。" content: "要求强大AI系统的开发者与政府共享安全测试结果,并为AI安全、隐私保护、公平权利及创新竞争等方面制定标准。"
} }
]); ]);
const handleGetLaws = async () => {
const params = {
id: decreeId.value
}
try {
const res = await getDecreeDepend(params)
console.log('法律依据', res);
if(res.code === 200 && res.data) {
} else {
laws.value = []
}
} catch (error) {
}
}
onMounted(() => {
handleGetBackground();
handleGetRelateEvents()
handleGetLaws()
});
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
......
...@@ -22,6 +22,10 @@ ...@@ -22,6 +22,10 @@
<script setup> <script setup>
import { ref, onMounted, onUnmounted } from "vue"; import { ref, onMounted, onUnmounted } from "vue";
import router from "@/router"; import router from "@/router";
import { useRoute } from "vue-router";
const route = useRoute();
const decreeId = ref(route.query.id);
const siderList = ref([ const siderList = ref([
{ {
...@@ -39,7 +43,12 @@ const siderBtnActive = ref("政令简介"); ...@@ -39,7 +43,12 @@ const siderBtnActive = ref("政令简介");
const handleClickLeftSiderBtn = item => { const handleClickLeftSiderBtn = item => {
window.sessionStorage.setItem("siderBarActiveName", item.name); window.sessionStorage.setItem("siderBarActiveName", item.name);
siderBtnActive.value = item.name; siderBtnActive.value = item.name;
router.push(item.path); router.push({
path: item.path,
query: {
id: decreeId.value
}
});
}; };
onMounted(() => { onMounted(() => {
......
...@@ -17,7 +17,7 @@ ...@@ -17,7 +17,7 @@
</div> </div>
<div class="box1-main"> <div class="box1-main">
<div class="box1-main-left"> <div class="box1-main-left">
<img src="./assets/images/box1-img.png" alt="" /> <img :src="basicInfo.img" alt="" />
</div> </div>
<div class="box1-main-right"> <div class="box1-main-right">
<div class="item"> <div class="item">
...@@ -34,7 +34,7 @@ ...@@ -34,7 +34,7 @@
<div class="item-left">{{ "相关领域:" }}</div> <div class="item-left">{{ "相关领域:" }}</div>
<div class="item-right tag-box"> <div class="item-right tag-box">
<div class="tag" v-for="(area, index) in basicInfo.areaList" :key="index"> <div class="tag" v-for="(area, index) in basicInfo.areaList" :key="index">
{{ area }} {{ area.industryName }}
</div> </div>
</div> </div>
</div> </div>
...@@ -77,18 +77,24 @@ ...@@ -77,18 +77,24 @@
</div> </div>
</div> </div>
<div class="box2-main"> <div class="box2-main">
<div class="box2-item" v-for="(item, index) in majorList" :key="index"> <div class="box2-item" v-for="(item, index) in curmajorList" :key="index">
<div class="id">{{ index + 1 }}</div> <div class="id">{{ index + 1 }}</div>
<div class="title">{{ item.title }}</div> <div class="title">{{ item.content }}</div>
<div class="open"> <div class="open">
<img src="./assets/images/open-icon.png" alt="" /> <img src="./assets/images/open-icon.png" alt="" />
</div> </div>
</div> </div>
</div> </div>
<div class="box2-footer"> <div class="box2-footer">
<div class="box2-footer-left">{{ "共计10条指令" }}</div> <div class="box2-footer-left">{{ `共计${majorListNum}条指令` }}</div>
<div class="box2-footer-right"> <div class="box2-footer-right">
<el-pagination :page-size="5" background layout="prev, pager, next" :total="10" /> <el-pagination
@current-change="handleCurrentChange"
:page-size="5"
background
layout="prev, pager, next"
:total="majorListNum"
/>
</div> </div>
</div> </div>
</div> </div>
...@@ -104,7 +110,7 @@ ...@@ -104,7 +110,7 @@
:class="{ btnActive: box3ActiveBtn === item }" :class="{ btnActive: box3ActiveBtn === item }"
v-for="(item, index) in box3BtnList" v-for="(item, index) in box3BtnList"
:key="index" :key="index"
@click="handleClickBox3Btn(item)" @click="handleClickBox3Btn(item, index)"
> >
{{ item }} {{ item }}
</div> </div>
...@@ -179,7 +185,7 @@ ...@@ -179,7 +185,7 @@
:key="index" :key="index"
> >
<div class="timeline-content"> <div class="timeline-content">
{{ item.content }} {{ item.title }}
</div> </div>
</el-timeline-item> </el-timeline-item>
</el-timeline> </el-timeline>
...@@ -194,12 +200,19 @@ ...@@ -194,12 +200,19 @@
</template> </template>
<script setup> <script setup>
import { ref, onMounted } from "vue"; import { ref, computed, onMounted } from "vue";
import { useRoute } from "vue-router";
import box1Img from "./assets/images/box1-img.png";
import Box3Logo from "./assets/images/box3-img.png"; import Box3Logo from "./assets/images/box3-img.png";
import { getDecreeBasicInfo, getDecreeMainContent, getDecreeOrganization } from "@/api/decree/introduction";
const route = useRoute();
const decreeId = ref(route.query.id);
// 基本信息 // 基本信息
const basicInfo = ref({ const basicInfo = ref({
img: box1Img,
name: "推动美国人工智能技术栈出口", name: "推动美国人工智能技术栈出口",
eName: "Promoting the Export of the American AI Technology Stack", eName: "Promoting the Export of the American AI Technology Stack",
areaList: ["人工智能", "出口管制", "半导体产业", "关税", "光伏产业"], areaList: ["人工智能", "出口管制", "半导体产业", "关税", "光伏产业"],
...@@ -209,38 +222,98 @@ const basicInfo = ref({ ...@@ -209,38 +222,98 @@ const basicInfo = ref({
deadline: "签署后90天内建立机制并开始实施" deadline: "签署后90天内建立机制并开始实施"
}); });
const handleGetBasicInfo = async () => {
const params = {
id: decreeId.value
};
try {
const res = await getDecreeBasicInfo(params);
console.log("基本信息", res);
if (res.code === 200 && res.data) {
basicInfo.value.img = res.data.picture;
basicInfo.value.name = res.data.name;
basicInfo.value.eName = res.data.ename;
basicInfo.value.areaList = res.data.industryList;
basicInfo.value.signTime = res.data.postDate;
basicInfo.value.bh = res.data.order;
basicInfo.value.deadline = res.data.deadline;
}
} catch (error) {
console.error("基本信息error", error);
}
};
handleGetBasicInfo();
// 主要指令 // 主要指令
const majorList = ref([ const majorList = ref([
{ {
title: '要求商务部在90天内建立"全栈式"美国AI出口机制。' id: 1,
}, content: '要求商务部在90天内建立"全栈式"美国AI出口机制。'
{
title: '要求每个纳入出口计划的提案必须涵盖完整的"全栈AI技术包"。'
},
{
title: '指示联邦机构提供贷款、担保、股权投资和技术援助支持入选的"优先AI出口包"。'
},
{
title: "要求输出技术必须符合美国出口管制法规,并由多部门对最终用户进行合规与安全联合审查。"
},
{
title: '明确政策目标为"减少对对手国家开发的AI技术的国际依赖"。'
} }
]); ]);
const currentPage = ref(1);
const pageSize = ref(5);
// 处理页码改变事件
const handleCurrentChange = page => {
currentPage.value = page;
};
const curmajorList = computed(() => {
const startIndex = (currentPage.value - 1) * pageSize.value;
const endIndex = startIndex + pageSize.value;
return majorList.value.slice(startIndex, endIndex);
});
const majorListNum = ref(0);
const handleMajorList = async () => {
const params = {
currentPage: 0,
pageSize: 999999,
id: decreeId.value
};
try {
const res = await getDecreeMainContent(params);
console.log("主要指令", res);
if (res.code === 200 && res.data) {
majorList.value = res.data.content;
majorListNum.value = res.data.numberOfElements;
} else {
majorList.value = [];
majorListNum.value = 0;
}
} catch (error) {}
};
handleMajorList();
// 执行机构 // 执行机构
const box3BtnList = ref(["商务部", "经济外交行动组"]); const box3BtnList = ref(["商务部", "经济外交行动组"]);
const box3ActiveBtn = ref("商务部"); const box3ActiveBtn = ref("商务部");
const handleClickBox3Btn = btn => { const box3BtnActiveIndex = ref(0);
const handleClickBox3Btn = (btn, index) => {
box3ActiveBtn.value = btn; box3ActiveBtn.value = btn;
box3BtnActiveIndex.value = index;
box3TopData.value.logo = box3Data.value[index].url;
box3TopData.value.name = box3Data.value[index].name;
box3TopData.value.eName = box3Data.value[index].ename;
box3TopData.value.clsj = box3Data.value[index].foundingDate;
box3TopData.value.zyzz = "暂无数据";
box3TopData.value.zbdz = box3Data.value[index].address;
box3TopData.value.bz = box3Data.value[index].leaderName;
eventList.value = box3Data.value[index].newsList.map(val => {
return {
time: val.newsDate,
title: newsTitle
};
});
}; };
const box3Data = ref([]);
const box3TopData = ref({ const box3TopData = ref({
logo: Box3Logo, logo: Box3Logo,
name: "美国商务部", name: "美国商务部",
eName: "United States Department of Commerce", eName: "United States Department of Commerce",
clsj: "1903年2月14日", clsj: "1903年2月14日",
zyzz: "国际贸易、进出口管制(R-TX-19)",
zbdz: "华盛顿宪法大道1401号胡佛大楼", zbdz: "华盛顿宪法大道1401号胡佛大楼",
bz: "霍华德·卢特尼克" bz: "霍华德·卢特尼克"
}); });
...@@ -249,24 +322,74 @@ const box3TopData = ref({ ...@@ -249,24 +322,74 @@ const box3TopData = ref({
const eventList = ref([ const eventList = ref([
{ {
time: "2025-07-31", time: "2025-07-31",
content: title: "美商务部发布指南,警告全球企业使用华为昇腾芯片可能违反美国出口管制。意在限制中国AI产业发展,阻碍其获得先进算力。"
"美商务部发布指南,警告全球企业使用华为昇腾芯片可能违反美国出口管制。意在限制中国AI产业发展,阻碍其获得先进算力。"
}, },
{ {
time: "2025-07-25", time: "2025-07-25",
content: title: "美商务部持续对多种中国产品发起“双反”(反倾销、反补贴)调查并作出裁决,涉及产品从工业原料到日常用品,且裁定的税率普遍较高。"
"美商务部持续对多种中国产品发起“双反”(反倾销、反补贴)调查并作出裁决,涉及产品从工业原料到日常用品,且裁定的税率普遍较高。"
}, },
{ {
time: "2025-07-21", time: "2025-07-21",
content: title: "美商务部进一步收紧对华先进半导体出口管制,将更多中国实体列入“实体清单”。限制14纳米及以下先进芯片、DRAM等对华出口"
"美商务部进一步收紧对华先进半导体出口管制,将更多中国实体列入“实体清单”。限制14纳米及以下先进芯片、DRAM等对华出口"
}, },
{ {
time: "2025-07-12", time: "2025-07-12",
content: "美商务部发起第三次反倾销和反补贴日落复审调查。" title: "美商务部发起第三次反倾销和反补贴日落复审调查。"
} }
]); ]);
const handleGetOrgnization = async () => {
const params = {
id: decreeId.value
};
try {
const res = await getDecreeOrganization(params);
console.log("执行机构", res);
if (res.code === 200 && res.data) {
box3BtnList.value = res.data.map(item => {
return item.name;
});
box3Data.value = res.data;
box3TopData.value.logo = res.data[0].url;
box3TopData.value.name = res.data[0].name;
box3TopData.value.eName = res.data[0].ename;
box3TopData.value.clsj = res.data[0].foundingDate;
box3TopData.value.zbdz = res.data[0].address;
box3TopData.value.bz = res.data[0].leaderName;
eventList.value = res.data[0].newsList.map(val => {
return {
time: val.newsDate,
title: newsTitle
};
});
} else {
box3BtnList.value = [];
box3TopData.value = {
logo: "",
name: "",
eName: "",
clsj: "",
zyzz: "",
zbdz: "",
bz: ""
};
eventList.value = [];
}
} catch (error) {
console.error("执行机构error", error);
box3BtnList.value = [];
box3TopData.value = {
logo: "",
name: "",
eName: "",
clsj: "",
zbdz: "",
bz: ""
};
eventList.value = [];
}
};
handleGetOrgnization();
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
......
...@@ -725,7 +725,7 @@ export const getHorizontalBarChart2 = (nameList, valueList, isPer) => { ...@@ -725,7 +725,7 @@ export const getHorizontalBarChart2 = (nameList, valueList, isPer) => {
const option = { const option = {
tooltip: {}, tooltip: {},
grid: { grid: {
top: "6%", top: "3%",
right: "6%", right: "6%",
bottom: "0", bottom: "0",
left: "1%", left: "1%",
...@@ -769,7 +769,7 @@ export const getHorizontalBarChart2 = (nameList, valueList, isPer) => { ...@@ -769,7 +769,7 @@ export const getHorizontalBarChart2 = (nameList, valueList, isPer) => {
}), }),
label: { label: {
show: true, show: true,
position: [340, -2], position: [310, -2],
formatter: function (params) { formatter: function (params) {
return isPer ? params.value + "%" : params.value; return isPer ? params.value + "%" : params.value;
} }
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论