提交 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
...@@ -116,7 +116,7 @@ ...@@ -116,7 +116,7 @@
<div class="home-main-center"> <div class="home-main-center">
<div class="center-top"> <div class="center-top">
<div class="box1"> <div class="box1">
<div class="box1-left"> <!-- <div class="box1-left">
<div class="icon"> <div class="icon">
<img src="./assets/images/box1-left.png" alt="" /> <img src="./assets/images/box1-left.png" alt="" />
</div> </div>
...@@ -125,7 +125,7 @@ ...@@ -125,7 +125,7 @@
<div class="icon"> <div class="icon">
<img src="./assets/images/box1-right.png" alt="" /> <img src="./assets/images/box1-right.png" alt="" />
</div> </div>
</div> </div> -->
<div class="box1-header"> <div class="box1-header">
<div class="box1-header-left"> <div class="box1-header-left">
<div class="icon"> <div class="icon">
...@@ -137,15 +137,17 @@ ...@@ -137,15 +137,17 @@
{{ "查看详情 >" }} {{ "查看详情 >" }}
</div> </div>
</div> </div>
<el-carousel ref="carouselRef" trigger="click" height="376px" :autoplay="true">
<el-carousel-item v-for="(item, index) in box1DataList" :key="index">
<div class="box1-main"> <div class="box1-main">
<div class="box1-main-left"> <div class="box1-main-left">
<img :src="curBox1Data.imageUrl" alt="" /> <img :src="item.imageUrl" alt="" />
</div> </div>
<div class="box1-main-right"> <div class="box1-main-right">
<div class="box1-main-right-title"> <div class="box1-main-right-title">
{{ curBox1Data.name }} {{ item.name }}
</div> </div>
<div class="box1-main-right-info" v-if="curBox1Data.industryList"> <div class="box1-main-right-info" v-if="item.industryList">
<div <div
class="tag" class="tag"
:class="{ :class="{
...@@ -154,20 +156,20 @@ ...@@ -154,20 +156,20 @@
tag3: tag.status == 3, tag3: tag.status == 3,
tag4: tag.status == 4 tag4: tag.status == 4
}" }"
v-for="(tag, index) in curBox1Data.industryList" v-for="(tag, index) in item.industryList"
:key="index" :key="index"
> >
{{ tag.name }} {{ tag.name }}
</div> </div>
</div> </div>
<div class="box1-main-right-center"> <div class="box1-main-right-center">
{{ curBox1Data.describe }} {{ item.describe }}
</div> </div>
<div class="box1-main-right-footer"> <div class="box1-main-right-footer">
<div class="footer-left">{{ curBox1Data.postDate }}</div> <div class="footer-left">{{ item.postDate }}</div>
<div class="footer-right"> <div class="footer-right">
<div class="footer-right-item1"> <div class="footer-right-item1">
{{ curBox1Data.officialUrl }} {{ item.officialUrl }}
</div> </div>
<div class="footer-right-item2"> <div class="footer-right-item2">
<img src="./assets/images/open-icon.png" alt="" /> <img src="./assets/images/open-icon.png" alt="" />
...@@ -176,6 +178,8 @@ ...@@ -176,6 +178,8 @@
</div> </div>
</div> </div>
</div> </div>
</el-carousel-item>
</el-carousel>
</div> </div>
<div class="box2"> <div class="box2">
<div class="box2-header"> <div class="box2-header">
...@@ -232,7 +236,7 @@ ...@@ -232,7 +236,7 @@
</div> </div>
</div> </div>
<div class="box3-main"> <div class="box3-main">
<div class="box3-item" v-for="(news, index) in newsList" :key="index"> <div class="box3-item" v-for="(news, index) in newsList" :key="index" @click="handleToNewsAnalysis()">
<div class="left"> <div class="left">
<img :src="news.img" alt="" /> <img :src="news.img" alt="" />
</div> </div>
...@@ -255,7 +259,7 @@ ...@@ -255,7 +259,7 @@
</div> </div>
<div class="box4-main"> <div class="box4-main">
<div class="box4-main-item" v-for="(item, index) in messageList" :key="index"> <div class="box4-main-item" v-for="(item, index) in messageList" :key="index">
<div class="left"> <div class="left" @click="handleClickPerson()">
<img :src="item.img" alt="" /> <img :src="item.img" alt="" />
</div> </div>
<div class="right"> <div class="right">
...@@ -271,43 +275,37 @@ ...@@ -271,43 +275,37 @@
</div> </div>
<DivideHeader id="position3" class="divide3" :titleText="'数据总览'"></DivideHeader> <DivideHeader id="position3" class="divide3" :titleText="'数据总览'"></DivideHeader>
<div class="center-footer"> <div class="center-footer">
<div class="box3"> <div class="box5">
<div class="box3-header"> <div class="box5-header">
<div class="box3-header-left"> <div class="box5-header-left">
<div class="box3-header-icon"> <div class="box5-header-icon">
<img src="./assets/images/box3-header-icon.png" alt="" /> <img src="./assets/images/box3-header-icon.png" alt="" />
</div> </div>
<div class="box3-header-title">{{ "行政令发布频度" }}</div> <div class="box5-header-title">{{ "行政令发布频度" }}</div>
</div>
<div class="box3-header-right">
<img src="./assets/images/header-more.png" alt="" />
</div> </div>
</div> </div>
<div class="box3-main" id="chart1"></div> <div class="box5-main" id="chart1"></div>
</div> </div>
<div class="box4"> <div class="box6">
<div class="box4-header"> <div class="box6-header">
<div class="header-icon"> <div class="header-icon">
<img src="./assets/images/box4-header-icon.png" alt="" /> <img src="./assets/images/box4-header-icon.png" alt="" />
</div> </div>
<div class="header-title">{{ "政令涉及领域" }}</div> <div class="header-title">{{ "政令涉及领域" }}</div>
<div class="header-right">
<img src="./assets/images/header-more.png" alt="" />
</div> </div>
</div> <div class="box6-main" id="chart2"></div>
<div class="box4-main" id="chart2"></div>
</div> </div>
</div> </div>
<div class="center-footer1"> <div class="center-footer1">
<div class="box5"> <div class="box7">
<div class="box5-header"> <div class="box7-header">
<div class="header-icon"> <div class="header-icon">
<img src="./assets/images/box5-header-icon.png" alt="" /> <img src="./assets/images/box5-header-icon.png" alt="" />
</div> </div>
<div class="header-title">{{ "关键行政令" }}</div> <div class="header-title">{{ "关键行政令" }}</div>
</div> </div>
<div class="box5-main"> <div class="box7-main">
<div class="box5-item" v-for="(item, index) in keyDecreeList" :key="index"> <div class="box7-item" v-for="(item, index) in keyDecreeList" :key="index">
<div class="icon"> <div class="icon">
<img src="./assets/images/warning.png" alt="" /> <img src="./assets/images/warning.png" alt="" />
</div> </div>
...@@ -321,14 +319,14 @@ ...@@ -321,14 +319,14 @@
</div> </div>
</div> </div>
</div> </div>
<div class="box6"> <div class="box8">
<div class="box6-header"> <div class="box8-header">
<div class="header-icon"> <div class="header-icon">
<img src="./assets/images/box5-header-icon.png" alt="" /> <img src="./assets/images/box5-header-icon.png" alt="" />
</div> </div>
<div class="header-title">{{ "政令重点条款" }}</div> <div class="header-title">{{ "政令重点条款" }}</div>
</div> </div>
<div class="box6-main" id="wordCloudChart"> <div class="box8-main" id="wordCloudChart">
<!-- <WordCloudMap :data="wordCloudData" :shape="circle" /> --> <!-- <WordCloudMap :data="wordCloudData" :shape="circle" /> -->
</div> </div>
</div> </div>
...@@ -338,25 +336,30 @@ ...@@ -338,25 +336,30 @@
<DivideHeader id="position4" class="divide4" :titleText="'资源库'"></DivideHeader> <DivideHeader id="position4" class="divide4" :titleText="'资源库'"></DivideHeader>
<div class="home-main-footer-header"> <div class="home-main-footer-header">
<div class="btn-box"> <div class="btn-box">
<div class="btn-wrapper">
<div <div
class="btn" class="btn"
:class="{ btnActive: activeCate === cate }" :class="{ btnActive: activeCate === cate.id }"
v-for="(cate, index) in categoryList" v-for="(cate, index) in categoryList"
:key="index" :key="index"
@click="handleClickCate(cate)" @click="handleClickCate(cate)"
> >
{{ cate }} {{ cate.name }}
</div>
</div> </div>
</div> </div>
<div class="select-box"> <div class="select-box">
<el-select v-model="releaseTime" placeholder="选择发布时间" style="width: 120px"> <div class="paixu-btn" @click="handleSwithSort">
<el-option <div class="icon1">
v-for="item in releaseTimeList" <img v-if="isSort" src="@/assets/icons/shengxu1.png" alt="" />
:key="item.value" <img v-else src="@/assets/icons/jiangxu1.png" alt="" />
:label="item.label" </div>
:value="item.value" <div class="text">{{ "发布时间" }}</div>
/> <div class="icon2">
</el-select> <img v-if="isSort" src="@/assets/icons/shengxu2.png" alt="" />
<img v-else src="@/assets/icons/jiangxu2.png" alt="" />
</div>
</div>
</div> </div>
</div> </div>
<div class="home-main-footer-main"> <div class="home-main-footer-main">
...@@ -418,7 +421,7 @@ ...@@ -418,7 +421,7 @@
<div class="left-left">{{ item.time }}</div> <div class="left-left">{{ item.time }}</div>
<div class="left-right"> <div class="left-right">
<div class="icon"></div> <div class="icon"></div>
<div class="line"></div> <div class="line" v-if="index !== 9 && index !== totalDecreesNum - 1"></div>
</div> </div>
</div> </div>
<div class="main-item-center"> <div class="main-item-center">
...@@ -471,6 +474,7 @@ import { onMounted, ref, computed, watch } from "vue"; ...@@ -471,6 +474,7 @@ import { onMounted, ref, computed, watch } from "vue";
import * as echarts from "echarts"; import * as echarts from "echarts";
import router from "@/router"; import router from "@/router";
import { import {
getDepartmentList,
getLatestDecree, getLatestDecree,
getDecreeRiskSignal, getDecreeRiskSignal,
getDecreeYearOrder, getDecreeYearOrder,
...@@ -480,6 +484,7 @@ import { ...@@ -480,6 +484,7 @@ import {
getDecreeOrderList, getDecreeOrderList,
getDecreehylyList getDecreehylyList
} from "@/api/decree/home"; } from "@/api/decree/home";
import { getNews, getSocialMedia } from "@/api/general/index";
import WordCloudMap from "./WordCloudMap.vue"; import WordCloudMap from "./WordCloudMap.vue";
import DivideHeader from "@/components/DivideHeader.vue"; import DivideHeader from "@/components/DivideHeader.vue";
import { useContainerScroll } from "@/hooks/useScrollShow"; import { useContainerScroll } from "@/hooks/useScrollShow";
...@@ -522,7 +527,6 @@ import News5 from "./assets/images/news5.png"; ...@@ -522,7 +527,6 @@ import News5 from "./assets/images/news5.png";
import Message1 from "./assets/images/message-icon1.png"; import Message1 from "./assets/images/message-icon1.png";
import Message2 from "./assets/images/message-icon2.png"; import Message2 from "./assets/images/message-icon2.png";
import Message3 from "./assets/images/message-icon3.png"; import Message3 from "./assets/images/message-icon3.png";
import { reduce } from "lodash";
// 跳转行政机构主页 // 跳转行政机构主页
const handleToInstitution = item => { const handleToInstitution = item => {
...@@ -591,13 +595,24 @@ const govInsList = ref([ ...@@ -591,13 +595,24 @@ const govInsList = ref([
name: "美国国立卫生研究院 (NIH)" name: "美国国立卫生研究院 (NIH)"
} }
]); ]);
const handleGetDepartmentList = async () => {
// 点击查看详情 try {
const handleClickToDetail = () => { const res = await getDepartmentList();
// router.push("/decreeLayout"); console.log("机构列表", res);
const route = router.resolve("/decreeLayout"); if (res.code === 200 && res.data) {
window.open(route.href, "_blank"); govInsList.value = res.data.map(item => {
return {
id: item.orgId,
name: item.orgName,
img: item.orgImage
};
});
}
} catch (error) {
console.error("获取机构列表error", error);
}
}; };
handleGetDepartmentList();
// 查看更多风险信号 // 查看更多风险信号
const handleToMoreRiskSignal = () => { const handleToMoreRiskSignal = () => {
...@@ -624,15 +639,15 @@ const box1DataList = ref([ ...@@ -624,15 +639,15 @@ const box1DataList = ref([
} }
]); ]);
const curBox1Data = ref({ // const curBox1Data = ref({
id: 89, // id: 89,
name: "", // name: "",
postDate: "", // postDate: "",
describe: null, // describe: null,
imageUrl: null, // imageUrl: null,
officialUrl: null, // officialUrl: null,
industryList: null // industryList: null
}); // });
const handleGetLatestDecree = async () => { const handleGetLatestDecree = async () => {
try { try {
...@@ -640,25 +655,34 @@ const handleGetLatestDecree = async () => { ...@@ -640,25 +655,34 @@ const handleGetLatestDecree = async () => {
console.log("最新科技政令", res); console.log("最新科技政令", res);
if (res.code === 200 && res.data) { if (res.code === 200 && res.data) {
box1DataList.value = res.data; box1DataList.value = res.data;
curBox1Data.value = res.data[0];
} }
} catch (error) { } catch (error) {
console.error("最新科技政令error", error); console.error("最新科技政令error", error);
} }
}; };
const boxInterval = ref(null);
const handleBox1 = async () => { const handleBox1 = async () => {
await handleGetLatestDecree(); await handleGetLatestDecree();
let index = 0; };
curBox1Data.value = box1DataList.value[0]; const carouselRef = ref(null);
// boxInterval.value = setInterval(() => { // 点击查看详情
// if (index < box1DataList.value.length - 1) { const handleClickToDetail = () => {
// index++; let activeIndex = 0;
// } else { if (carouselRef.value) {
// index = 0; activeIndex = carouselRef.value.activeIndex;
// } }
// curBox1Data.value = box1DataList.value[index];
// }, 2000); console.log("当前 Carousel 激活索引:", activeIndex);
const id = box1DataList.value[activeIndex].id
const route = router.resolve({
path: "/decreeLayout",
query: {
id: id
}
});
window.open(route.href, "_blank");
}; };
// 风险信号 // 风险信号
...@@ -728,6 +752,33 @@ const newsList = ref([ ...@@ -728,6 +752,33 @@ const newsList = ref([
from: "11-2 · ​福克斯新闻网" from: "11-2 · ​福克斯新闻网"
} }
]); ]);
const handleGetNews = async () => {
const params = {
moduleId: "0100"
};
try {
const res = await getNews(params);
console.log("新闻资讯", res);
if (res.code === 200 && res.data) {
newsList.value = res.data.map(item => {
return {
img: item.newsImage,
title: item.newsTitle,
content: item.newsContent,
from: item.newsDate + " · " + item.newsOrg
};
});
}
} catch (error) {
console.error("新闻资讯error", error);
}
};
handleGetNews();
// 点击新闻条目,跳转到新闻分析页
const handleToNewsAnalysis = () => {
const route = router.resolve("/newsAnalysis");
window.open(route.href, "_blank");
};
// 社交媒体 // 社交媒体
const messageList = ref([ const messageList = ref([
...@@ -750,6 +801,34 @@ const messageList = ref([ ...@@ -750,6 +801,34 @@ const messageList = ref([
content: `提出特朗普政府的AI政策强调技术开放与快速应用,但可能以牺牲安全防范为代价,开启了“潘多拉魔盒”。` content: `提出特朗普政府的AI政策强调技术开放与快速应用,但可能以牺牲安全防范为代价,开启了“潘多拉魔盒”。`
} }
]); ]);
const handleGetMessage = async () => {
const params = {
moduleId: "0100"
};
try {
const res = await getSocialMedia(params);
console.log("社交媒体", res);
messageList.value = res.data.map(item => {
return {
img: item.personImage,
name: item.personName,
time: item.time + " · 发布于" + item.orgName,
content: item.remarks
};
});
} catch (error) {}
};
handleGetMessage();
// 点击人物头像,跳转到人物主页
const handleClickPerson = () => {
const route = router.resolve({
path: "/characterPage",
query: {
type: 1 // 1 2 3
}
});
window.open(route.href, "_blank");
};
// 行政令发布频度 // 行政令发布频度
const chart1Data = ref({ const chart1Data = ref({
...@@ -925,34 +1004,23 @@ const handleBox8 = async () => { ...@@ -925,34 +1004,23 @@ const handleBox8 = async () => {
}; };
// 资源库 // 资源库
const releaseTime = ref("近一年发布"); const isSort = ref(true); // true 升序 false 倒序
const releaseTimeList = ref([ const handleSwithSort = () => {
{ isSort.value = !isSort.value;
label: "近半年发布", };
value: "近半年发布"
}, const categoryList = computed(() => {
{ let obj = {
label: "近一年发布", name: "全部分类",
value: "近一年发布" id: "",
}, img: ""
{ };
label: "近两年发布", return [obj, ...govInsList.value];
value: "近两年发布" });
},
{
label: "近三年发布",
value: "近三年发布"
},
{
label: "近五年发布",
value: "近五年发布"
}
]);
const categoryList = ref(["全部分类", "白宫", "能源部", "商务部", "战争部", "FCC", "FDA", "NASA", "NSF", "NIH"]);
const activeCate = ref("白宫"); const activeCate = ref("白宫");
const handleClickCate = cate => { const handleClickCate = cate => {
activeCate.value = cate; activeCate.value = cate.id;
}; };
const handleToPosi = id => { const handleToPosi = id => {
...@@ -1102,13 +1170,15 @@ const decreeList = ref([ ...@@ -1102,13 +1170,15 @@ const decreeList = ref([
]); ]);
const handleGetDecreeOrderList = async () => { const handleGetDecreeOrderList = async () => {
const p1 = activeAreaList.value.join(",");
const p2 = activePubTime.value.join(",");
const params = { const params = {
currentPage: 0, currentPage: 0,
pageSize: 999999, pageSize: 999999,
proposeName: activeCate.value, proposeName: activeCate.value,
researchTypeIds: '2,3', researchTypeIds: p1,
sortFun: true, sortFun: isSort.value,
years: activePubTime.value years: p2
}; };
try { try {
const res = await getDecreeOrderList(params); const res = await getDecreeOrderList(params);
...@@ -1130,10 +1200,10 @@ const handleGetDecreeOrderList = async () => { ...@@ -1130,10 +1200,10 @@ const handleGetDecreeOrderList = async () => {
} else { } else {
decreeList.value = []; decreeList.value = [];
} }
// const startIndex = 0; } catch (error) {
// const endIndex = pageSize.value; console.error('资源库列表error', error);
// curDecreeList.value = decreeList.value.slice(startIndex, endIndex); decreeList.value = [];
} catch (error) {} }
}; };
const curDecreeList = computed(() => { const curDecreeList = computed(() => {
...@@ -1156,6 +1226,20 @@ watch( ...@@ -1156,6 +1226,20 @@ watch(
} }
); );
watch(
() => activeCate.value,
val => {
handleGetDecreeOrderList();
}
);
watch(
() => isSort.value,
val => {
handleGetDecreeOrderList();
}
);
onMounted(async () => { onMounted(async () => {
handleGetAreaList(); handleGetAreaList();
handleGetDecreeOrderList(); handleGetDecreeOrderList();
...@@ -1577,6 +1661,7 @@ onMounted(async () => { ...@@ -1577,6 +1661,7 @@ onMounted(async () => {
} }
.box1-main { .box1-main {
display: flex; display: flex;
width: 1064px;
height: 354px; height: 354px;
margin-top: 22px; margin-top: 22px;
padding-left: 31px; padding-left: 31px;
...@@ -1896,6 +1981,10 @@ onMounted(async () => { ...@@ -1896,6 +1981,10 @@ onMounted(async () => {
width: 749px; width: 749px;
margin-left: 21px; margin-left: 21px;
border-bottom: 1px solid rgba(240, 242, 244, 1); border-bottom: 1px solid rgba(240, 242, 244, 1);
cursor: pointer;
&:hover {
background: var(--color-bg-hover);
}
.left { .left {
width: 72px; width: 72px;
height: 48px; height: 48px;
...@@ -1914,7 +2003,7 @@ onMounted(async () => { ...@@ -1914,7 +2003,7 @@ onMounted(async () => {
justify-content: space-between; justify-content: space-between;
.title { .title {
margin-top: 13px; margin-top: 13px;
width: 520px; width: 500px;
height: 24px; height: 24px;
color: rgba(59, 65, 75, 1); color: rgba(59, 65, 75, 1);
font-family: Microsoft YaHei; font-family: Microsoft YaHei;
...@@ -1926,7 +2015,7 @@ onMounted(async () => { ...@@ -1926,7 +2015,7 @@ onMounted(async () => {
white-space: nowrap; white-space: nowrap;
} }
.time { .time {
flex: 1; width: 157px;
text-align: right; text-align: right;
height: 22px; height: 22px;
margin-top: 19px; margin-top: 19px;
...@@ -1935,6 +2024,9 @@ onMounted(async () => { ...@@ -1935,6 +2024,9 @@ onMounted(async () => {
font-size: 14px; font-size: 14px;
font-weight: 400; font-weight: 400;
line-height: 22px; line-height: 22px;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
} }
} }
.right-footer { .right-footer {
...@@ -2001,6 +2093,9 @@ onMounted(async () => { ...@@ -2001,6 +2093,9 @@ onMounted(async () => {
margin-top: 5px; margin-top: 5px;
width: 36px; width: 36px;
height: 36px; height: 36px;
border-radius: 18px;
overflow: hidden;
cursor: pointer;
img { img {
width: 100%; width: 100%;
height: 100%; height: 100%;
...@@ -2009,6 +2104,7 @@ onMounted(async () => { ...@@ -2009,6 +2104,7 @@ onMounted(async () => {
.right { .right {
margin-left: 10px; margin-left: 10px;
width: 690px; width: 690px;
border-radius: 4px;
box-sizing: border-box; box-sizing: border-box;
border: 1px solid rgba(231, 243, 255, 1); border: 1px solid rgba(231, 243, 255, 1);
background: rgba(246, 250, 255, 1); background: rgba(246, 250, 255, 1);
...@@ -2481,21 +2577,21 @@ onMounted(async () => { ...@@ -2481,21 +2577,21 @@ onMounted(async () => {
height: 452px; height: 452px;
display: flex; display: flex;
justify-content: center; justify-content: center;
.box3 { .box5 {
width: 792px; width: 792px;
height: 452px; height: 452px;
box-shadow: 0px 0px 15px 0px rgba(22, 119, 255, 0.1); box-shadow: 0px 0px 15px 0px rgba(22, 119, 255, 0.1);
background: rgba(255, 255, 255, 1); background: rgba(255, 255, 255, 1);
border-radius: 10px; border-radius: 10px;
.box3-header { .box5-header {
height: 48px; height: 48px;
border-bottom: 1px solid rgba(240, 242, 244, 1); border-bottom: 1px solid rgba(240, 242, 244, 1);
margin: 0 auto; margin: 0 auto;
display: flex; display: flex;
justify-content: space-between; justify-content: space-between;
.box3-header-left { .box5-header-left {
display: flex; display: flex;
.box3-header-icon { .box5-header-icon {
margin-top: 17px; margin-top: 17px;
margin-left: 24px; margin-left: 24px;
width: 17px; width: 17px;
...@@ -2505,7 +2601,7 @@ onMounted(async () => { ...@@ -2505,7 +2601,7 @@ onMounted(async () => {
height: 100%; height: 100%;
} }
} }
.box3-header-title { .box5-header-title {
margin-top: 11px; margin-top: 11px;
margin-left: 19px; margin-left: 19px;
height: 26px; height: 26px;
...@@ -2516,7 +2612,7 @@ onMounted(async () => { ...@@ -2516,7 +2612,7 @@ onMounted(async () => {
line-height: 26px; line-height: 26px;
} }
} }
.box3-header-right { .box5-header-right {
width: 49px; width: 49px;
height: 24px; height: 24px;
margin-top: 12px; margin-top: 12px;
...@@ -2528,18 +2624,18 @@ onMounted(async () => { ...@@ -2528,18 +2624,18 @@ onMounted(async () => {
} }
} }
} }
.box3-main { .box5-main {
height: 397px; height: 397px;
} }
} }
.box4 { .box6 {
margin-left: 16px; margin-left: 16px;
width: 792px; width: 792px;
height: 452px; height: 452px;
box-shadow: 0px 0px 15px 0px rgba(22, 119, 255, 0.1); box-shadow: 0px 0px 15px 0px rgba(22, 119, 255, 0.1);
background: rgba(255, 255, 255, 1); background: rgba(255, 255, 255, 1);
border-radius: 10px; border-radius: 10px;
.box4-header { .box6-header {
margin: 0 auto; margin: 0 auto;
height: 53px; height: 53px;
border-bottom: 1px solid rgba(240, 242, 244, 1); border-bottom: 1px solid rgba(240, 242, 244, 1);
...@@ -2578,7 +2674,7 @@ onMounted(async () => { ...@@ -2578,7 +2674,7 @@ onMounted(async () => {
} }
} }
} }
.box4-main { .box6-main {
margin-top: 8px; margin-top: 8px;
height: 390px; height: 390px;
} }
...@@ -2589,13 +2685,13 @@ onMounted(async () => { ...@@ -2589,13 +2685,13 @@ onMounted(async () => {
height: 450px; height: 450px;
display: flex; display: flex;
justify-content: center; justify-content: center;
.box5 { .box7 {
width: 792px; width: 792px;
height: 450px; height: 450px;
border-radius: 4px; border-radius: 4px;
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);
.box5-header { .box7-header {
width: 792px; width: 792px;
height: 48px; height: 48px;
display: flex; display: flex;
...@@ -2621,12 +2717,12 @@ onMounted(async () => { ...@@ -2621,12 +2717,12 @@ onMounted(async () => {
line-height: 26px; line-height: 26px;
} }
} }
.box5-main { .box7-main {
height: 400px; height: 400px;
box-sizing: border-box; box-sizing: border-box;
overflow-y: auto; overflow-y: auto;
overflow-x: hidden; overflow-x: hidden;
.box5-item { .box7-item {
width: 730px; width: 730px;
margin-top: 16px; margin-top: 16px;
margin-left: 25px; margin-left: 25px;
...@@ -2688,14 +2784,14 @@ onMounted(async () => { ...@@ -2688,14 +2784,14 @@ onMounted(async () => {
} }
} }
} }
.box6 { .box8 {
margin-left: 16px; margin-left: 16px;
width: 792px; width: 792px;
height: 450px; height: 450px;
border-radius: 4px; border-radius: 4px;
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);
.box6-header { .box8-header {
width: 792px; width: 792px;
height: 48px; height: 48px;
display: flex; display: flex;
...@@ -2721,7 +2817,7 @@ onMounted(async () => { ...@@ -2721,7 +2817,7 @@ onMounted(async () => {
line-height: 26px; line-height: 26px;
} }
} }
.box6-main { .box8-main {
height: 401px; height: 401px;
} }
} }
...@@ -2739,15 +2835,22 @@ onMounted(async () => { ...@@ -2739,15 +2835,22 @@ onMounted(async () => {
} }
.home-main-footer-header { .home-main-footer-header {
width: 1600px; width: 1600px;
height: 42px; height: 70px;
margin: 36px auto; margin: 36px auto 16px;
// background: orange; // background: orange;
display: flex; display: flex;
justify-content: space-between; justify-content: space-between;
.btn-box { .btn-box {
margin-top: 10px; margin-top: 10px;
width: 1200px; width: 1450px;
overflow-x: auto;
overflow-y: hidden;
.btn-wrapper {
width: 1880px;
display: flex; display: flex;
gap: 10px;
overflow-x: auto;
overflow-y: hidden;
.btn { .btn {
height: 42px; height: 42px;
color: rgba(95, 101, 108, 1); color: rgba(95, 101, 108, 1);
...@@ -2758,7 +2861,6 @@ onMounted(async () => { ...@@ -2758,7 +2861,6 @@ onMounted(async () => {
padding: 0 24px; padding: 0 24px;
border-radius: 21px; border-radius: 21px;
background: rgba(20, 89, 187, 0); background: rgba(20, 89, 187, 0);
margin-right: 20px;
cursor: pointer; cursor: pointer;
&:hover { &:hover {
background: rgba(20, 89, 187, 0.1); background: rgba(20, 89, 187, 0.1);
...@@ -2774,11 +2876,57 @@ onMounted(async () => { ...@@ -2774,11 +2876,57 @@ onMounted(async () => {
} }
} }
} }
}
.select-box { .select-box {
margin-top: 10px; margin-top: 5px;
height: 42px; height: 42px;
box-sizing: border-box; box-sizing: border-box;
padding: 5px 0; padding: 5px 0;
.paixu-btn {
display: flex;
width: 120px;
height: 32px;
box-sizing: border-box;
border: 1px solid rgba(230, 231, 232, 1);
border-radius: 4px;
background: rgba(255, 255, 255, 1);
&:hover {
background: var(--color-bg-hover);
}
cursor: pointer;
.icon1 {
width: 11px;
height: 14px;
margin-top: 10px;
margin-left: 9px;
img {
width: 100%;
height: 100%;
}
}
.text {
height: 19px;
color: rgba(95, 101, 108, 1);
font-family: Microsoft YaHei;
font-size: 14px;
font-weight: 400;
line-height: 18px;
letter-spacing: 0px;
text-align: left;
margin-top: 7px;
margin-left: 9px;
}
.icon2 {
width: 10px;
height: 5px;
margin-top: 5px;
margin-left: 13px;
img {
width: 100%;
height: 100%;
}
}
}
} }
} }
.home-main-footer-main { .home-main-footer-main {
......
...@@ -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(() => {
......
...@@ -6,11 +6,7 @@ ...@@ -6,11 +6,7 @@
<div class="icon"></div> <div class="icon"></div>
<div class="title">{{ "企业影响分析" }}</div> <div class="title">{{ "企业影响分析" }}</div>
<div class="header-right1"> <div class="header-right1">
<el-checkbox <el-checkbox v-model="isCRelated" label="只看中国企业" size="large" />
v-model="isChecked"
label="只看中国企业"
size="large"
/>
</div> </div>
<div class="header-right"> <div class="header-right">
<div class="header-right-icon"> <div class="header-right-icon">
...@@ -25,28 +21,20 @@ ...@@ -25,28 +21,20 @@
<div class="box1-tab-box"> <div class="box1-tab-box">
<div <div
class="tab" class="tab"
:class="{ tabActive: box1BtnActiveName === item }" :class="{ tabActive: box1BtnActiveName === item.name }"
v-for="(item, index) in box1BtnList" v-for="(item, index) in box1BtnList"
:key="index" :key="index"
@click="handleClickBox1Btn(item)" @click="handleClickBox1Btn(item)"
> >
{{ item }} {{ item.name }}
</div> </div>
</div> </div>
<div class="box1-list-box"> <div class="box1-list-box">
<div <div class="box1-item" v-for="(item, index) in showCompanyList" :key="index">
class="box1-item"
v-for="(item, index) in companyList"
:key="index"
>
<div class="id">{{ index + 1 }}</div> <div class="id">{{ index + 1 }}</div>
<div class="title">{{ item.name }}</div> <div class="title">{{ item.name }}</div>
<div class="icon"> <div class="icon">
<img <img v-if="item.status === 'up'" src="./assets/images/up.png" alt="" />
v-if="item.status === 'up'"
src="./assets/images/up.png"
alt=""
/>
<img v-else src="./assets/images/down.png" alt="" /> <img v-else src="./assets/images/down.png" alt="" />
</div> </div>
</div> </div>
...@@ -55,10 +43,13 @@ ...@@ -55,10 +43,13 @@
<div class="box1-footer-left">{{ `共${companyTotalNum}家企业` }}</div> <div class="box1-footer-left">{{ `共${companyTotalNum}家企业` }}</div>
<div class="box1-footer-right"> <div class="box1-footer-right">
<el-pagination <el-pagination
@current-change="handleCurrentChange"
:pageSize="pageSize"
:current-page="currentPage"
background background
layout="prev, pager, next" layout="prev, pager, next"
size="small" size="small"
:total="105" :total="companyTotalNum"
/> />
</div> </div>
</div> </div>
...@@ -165,92 +156,205 @@ ...@@ -165,92 +156,205 @@
</template> </template>
<script setup> <script setup>
import { ref, onMounted } from "vue"; import { ref, computed,watch, onMounted } from "vue";
import { useRoute } from "vue-router";
import setChart from "@/utils/setChart"; import setChart from "@/utils/setChart";
import * as echarts from "echarts"; import * as echarts from "echarts";
import getBarChart from "./utils/barChart"; import getBarChart from "./utils/barChart";
import { getDecreeIndustry, getDecreehylyList, getDecreeCompany, getDecreeAction } from "@/api/decree/influence";
const route = useRoute();
// 企业影响分析 // 企业影响分析
const companyTotalNum = ref(0); // 企业数量
const isCRelated = ref(false); // 只看中国企业
const chart1Data = ref({ const chart1Data = ref({
title: ["集成电路", "新能源", "人工智能", "先进制造", "量子科技"], // title: ["集成电路", "新能源", "人工智能", "先进制造", "量子科技"],
value: [109, 95, 79, 25, 11], // value: [109, 95, 79, 25, 11]
}); });
const box1BtnActiveName = ref('集成电路');
const handleGetChart1Data = async () => {
const params = {
cRelated: isCRelated.value,
id: 147
};
try {
const res = await getDecreeIndustry(params);
console.log("企业影响分析", res);
if (res.code === 200 && res.data) {
chart1Data.value.title = res.data.map(item => {
return item.hylyName;
});
chart1Data.value.value = res.data.map(item => {
return item.companyNum;
});
} else {
chart1Data.value.title = [];
chart1Data.value.value = [];
}
} catch (error) {
chart1Data.value.title = [];
chart1Data.value.value = [];
}
};
const handelBox1 = async () => {
await handleGetChart1Data();
let chart1 = getBarChart(chart1Data.value.title, chart1Data.value.value);
setChart(chart1, "chart1");
};
const box1BtnActiveName = ref("");
const curAreaId = ref(0);
const box1BtnList = ref(["集成电路", "新能源", "人工智能", "先进制造", "量子科技"]); const box1BtnList = ref(["集成电路", "新能源", "人工智能", "先进制造", "量子科技"]);
const handleClickBox1Btn = btn => { const handleClickBox1Btn = btn => {
box1BtnActiveName.value = btn box1BtnActiveName.value = btn.name;
} curAreaId.value = btn.id;
handleGetCompanyListByArea();
};
// 获取行业领域列表
const handleGetHylyList = async () => {
try {
const res = await getDecreehylyList();
console.log("行业领域列表", res);
if (res.code === 200 && res.data) {
box1BtnList.value = res.data;
box1BtnActiveName.value = box1BtnList.value[0].name;
curAreaId.value = box1BtnList.value[0].id;
}
} catch (error) {}
};
const companyList = ref([ const companyList = ref([
{ {
name: "宁德时代新能源科技股份有限公司", name: "宁德时代新能源科技股份有限公司",
status: "down", status: "down"
}, },
{ {
name: "比亚迪股份有限公司", name: "比亚迪股份有限公司",
status: "down", status: "down"
}, },
{ {
name: "隆基绿能科技股份有限公司", name: "隆基绿能科技股份有限公司",
status: "down", status: "down"
}, },
{ {
name: "晶科能源控股有限公司", name: "晶科能源控股有限公司",
status: "down", status: "down"
}, },
{ {
name: "厦门海辰储能科技股份有限公司", name: "厦门海辰储能科技股份有限公司",
status: "down", status: "down"
}, },
{ {
name: "国轩高科股份有限公司", name: "国轩高科股份有限公司",
status: "up", status: "up"
}, },
{ {
name: "远景科技集团", name: "远景科技集团",
status: "down", status: "down"
}, },
{ {
name: "惠州亿纬锂能股份有限公司", name: "惠州亿纬锂能股份有限公司",
status: "down", status: "down"
}, },
{ {
name: "天合光能股份有限公司", name: "天合光能股份有限公司",
status: "down", status: "down"
}, },
{ {
name: "晶澳太阳能科技股份有限公司", name: "晶澳太阳能科技股份有限公司",
status: "up", status: "up"
}, }
]); ]);
const companyTotalNum = ref(105); // 企业数量 const currentPage = ref(1);
const isChecked = ref(true); // 只看中国企业 const pageSize = ref(10);
// 处理页码改变事件
const handleCurrentChange = page => {
currentPage.value = page;
};
const showCompanyList = computed(() => {
const startIndex = (currentPage.value - 1) * pageSize.value;
const endIndex = startIndex + pageSize.value;
return companyList.value.slice(startIndex, endIndex);
});
const handleGetCompanyListByArea = async () => {
const params = {
cRelated: isCRelated.value,
id: curAreaId.value
};
try {
const res = await getDecreeCompany(params);
console.log("行业领域公司列表", res);
if (res.code === 200 && res.data) {
companyList.value = res.data.map(item => {
return {
name: item.name,
id: item.id,
status: "up"
};
});
companyTotalNum.value = companyList.value.length;
} else {
companyList.value = [];
companyTotalNum.value = 0;
}
} catch (error) {
companyList.value = [];
companyTotalNum.value = 0;
}
};
// 政令举措落实情况 // 政令举措落实分析
const timeLineList = ref([ const timeLineList = ref([
{ {
time: "2025年7月25日", time: "2025年7月25日",
content: "商务部已成立AI出口计划办公室,并开始招募专业人员。", content: "商务部已成立AI出口计划办公室,并开始招募专业人员。"
}, },
{ {
time: "2025年7月31日", time: "2025年7月31日",
content: "英伟达、微软、谷歌等企业已提交初步技术栈提案。", content: "英伟达、微软、谷歌等企业已提交初步技术栈提案。"
}, },
{ {
time: "2025年8月5日", time: "2025年8月5日",
content: "国务院开始与盟友国家进行初步磋商。", content: "国务院开始与盟友国家进行初步磋商。"
}, },
{ {
time: "2025年8月9日", time: "2025年8月9日",
content:"国防部、能源部安全审查流程尚未最终确定。", content: "国防部、能源部安全审查流程尚未最终确定。"
}, },
{ {
time: "2025年8月12日", time: "2025年8月12日",
content: "商务部已成立AI出口计划办公室,并开始招募专业人员。", content: "商务部已成立AI出口计划办公室,并开始招募专业人员。"
}, }
]); ]);
const handleGetAction = async () => {
const params = {
id: route.query.id
};
try {
const res = await getDecreeAction(params);
console.log("政令举措落实分析", res);
if (res.code === 200 && res.data) {
timeLineList.value = res.data.map(item => {
return {
time: item.time,
content: item.describe
};
});
} else {
timeLineList.value = [];
}
} catch (error) {
timeLineList.value = [];
}
};
// 历史相似举措及落实情况 // 历史相似举措及落实情况
const box3List = ref([ const box3List = ref([
...@@ -259,48 +363,59 @@ const box3List = ref([ ...@@ -259,48 +363,59 @@ const box3List = ref([
title: "瓦森纳安排", title: "瓦森纳安排",
content: "落实情况:持续有效,但面临技术快速迭代挑战。", content: "落实情况:持续有效,但面临技术快速迭代挑战。",
time: "1996-至今", time: "1996-至今",
tag: "人工智能", tag: "人工智能"
}, },
{ {
type: "科技法案", type: "科技法案",
title: "云计算出口管制", title: "云计算出口管制",
content: "落实情况:部分有效,但执行难度大。", content: "落实情况:部分有效,但执行难度大。",
time: "1996-至今", time: "1996-至今",
tag: "人工智能", tag: "人工智能"
}, },
{ {
type: "科技法案", type: "科技法案",
title: "芯片与科学法案", title: "芯片与科学法案",
content: "落实情况:正在实施,效果待观察。", content: "落实情况:正在实施,效果待观察。",
time: "2022-至今", time: "2022-至今",
tag: "人工智能", tag: "人工智能"
}, },
{ {
type: "科技法案", type: "科技法案",
title: "AI芯片出口管制", title: "AI芯片出口管制",
content: "落实情况:部分有效,但催生中国自主创新。", content: "落实情况:部分有效,但催生中国自主创新。",
time: "1996-至今", time: "1996-至今",
tag: "人工智能", tag: "人工智能"
}, },
{ {
type: "科技法案", type: "科技法案",
title: "瓦森纳安排", title: "瓦森纳安排",
content: "落实情况:持续有效,但面临技术快速迭代挑战。", content: "落实情况:持续有效,但面临技术快速迭代挑战。",
time: "1996-至今", time: "1996-至今",
tag: "人工智能", tag: "人工智能"
}, },
{ {
type: "科技法案", type: "科技法案",
title: "瓦森纳安排", title: "瓦森纳安排",
content: "落实情况:持续有效,但面临技术快速迭代挑战。", content: "落实情况:持续有效,但面临技术快速迭代挑战。",
time: "1996-至今", time: "1996-至今",
tag: "人工智能", tag: "人工智能"
}, }
]); ]);
watch(
() => isCRelated.value,
val => {
handleGetCompanyListByArea();
handelBox1();
}
);
onMounted(() => { onMounted(() => {
let chart1 = getBarChart(chart1Data.value.title, chart1Data.value.value); handleGetCompanyListByArea();
setChart(chart1, "chart1"); handleGetChart1Data();
handleGetHylyList();
handleGetAction();
handelBox1();
}); });
</script> </script>
...@@ -337,10 +452,10 @@ onMounted(() => { ...@@ -337,10 +452,10 @@ onMounted(() => {
display: flex; display: flex;
justify-content: flex-end; justify-content: flex-end;
gap: 4px; gap: 4px;
.header-right-icon{ .header-right-icon {
width: 28px; width: 28px;
height: 28px; height: 28px;
img{ img {
width: 100%; width: 100%;
height: 100%; height: 100%;
} }
...@@ -371,13 +486,16 @@ onMounted(() => { ...@@ -371,13 +486,16 @@ onMounted(() => {
background: rgba(247, 248, 249, 1); background: rgba(247, 248, 249, 1);
} }
.box1-tab-box { .box1-tab-box {
height: 57px; height: 60px;
width: 446px; width: 446px;
margin: 0 auto; margin: 0 auto;
overflow-x: auto;
display: flex; display: flex;
white-space: nowrap;
gap: 8px;
.tab { .tab {
min-width: min-content;
margin-top: 18px; margin-top: 18px;
margin-right: 8px;
padding: 0 8px; padding: 0 8px;
height: 28px; height: 28px;
box-sizing: border-box; box-sizing: border-box;
...@@ -529,7 +647,7 @@ onMounted(() => { ...@@ -529,7 +647,7 @@ onMounted(() => {
bottom: -7px; bottom: -7px;
width: 15px; width: 15px;
height: 15px; height: 15px;
img{ img {
width: 100%; width: 100%;
height: 100%; height: 100%;
} }
...@@ -540,7 +658,7 @@ onMounted(() => { ...@@ -540,7 +658,7 @@ onMounted(() => {
top: -7px; top: -7px;
width: 15px; width: 15px;
height: 15px; height: 15px;
img{ img {
width: 100%; width: 100%;
height: 100%; height: 100%;
} }
......
...@@ -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 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论