提交 226e9c9b authored 作者: coderBryanFu's avatar coderBryanFu

update

上级 6ad6286d
...@@ -26,14 +26,12 @@ ...@@ -26,14 +26,12 @@
<el-main class="main-container"> <el-main class="main-container">
<router-view /> <router-view />
</el-main> </el-main>
<div ref="target" class="draggable-box" :style="style">
<div class="ai-btn" @click="openAiBox"> <div class="ai-btn" @click="openAiBox">
<div class="icon"> <div class="icon">
<img src="@/assets/icons/ai-icon.png" alt="" /> <img src="@/assets/icons/ai-icon.png" alt="" />
</div> </div>
<div class="text">智能问答</div> <div class="text">智能问答</div>
</div> </div>
</div>
<div class="ai-dialog" v-if="isShowAiBox"> <div class="ai-dialog" v-if="isShowAiBox">
<AiBox @close="closeAiBox" /> <AiBox @close="closeAiBox" />
...@@ -48,24 +46,24 @@ import { Monitor, House, User, Location, Document, Bell, Message, ArrowDown } fr ...@@ -48,24 +46,24 @@ import { Monitor, House, User, Location, Document, Bell, Message, ArrowDown } fr
import { useRouter } from "vue-router"; import { useRouter } from "vue-router";
import Breadcrumb from "@/components/BreadCrumb/index.vue"; import Breadcrumb from "@/components/BreadCrumb/index.vue";
import AiBox from "./components/AiBox.vue"; import AiBox from "./components/AiBox.vue";
import { useDraggable } from "@vueuse/core"; // import { useDraggable } from "@vueuse/core";
const router = useRouter(); const router = useRouter();
const target = ref(null); // const target = ref(null);
const { x, y, isDragging } = useDraggable(target, { // const { x, y, isDragging } = useDraggable(target, {
initialValue: { x: 1770, y: 800 }, // initialValue: { x: 1770, y: 800 },
onStart: () => console.log("开始拖动"), // onStart: () => console.log("开始拖动"),
onEnd: () => console.log("结束拖动") // onEnd: () => console.log("结束拖动")
}); // });
const style = computed(() => ({ // const style = computed(() => ({
position: "absolute", // position: "absolute",
left: `${x.value}px`, // left: `${x.value}px`,
top: `${y.value}px`, // top: `${y.value}px`,
cursor: isDragging.value ? "grabbing" : "grab" // cursor: isDragging.value ? "grabbing" : "grab"
})); // }));
const handleToHome = () => { const handleToHome = () => {
router.push({ router.push({
...@@ -294,10 +292,10 @@ body { ...@@ -294,10 +292,10 @@ body {
} }
.ai-btn { .ai-btn {
// position: absolute; position: absolute;
// bottom: 20%; bottom: 240px;
// right: 46px; right: 10px;
// z-index: 9999; z-index: 9999;
cursor: pointer; cursor: pointer;
.icon { .icon {
......
...@@ -34,10 +34,11 @@ export function getDecreeYearOrder(params) { ...@@ -34,10 +34,11 @@ export function getDecreeYearOrder(params) {
} }
// 政令涉及领域 // 政令涉及领域
export function getDecreeArea() { export function getDecreeArea(params) {
return request({ return request({
method: 'GET', method: 'GET',
url: `/api/administrativeOrderOverview/industry`, url: `/api/administrativeOrderOverview/industry/${params.year}`,
params
}) })
} }
......
...@@ -14,7 +14,7 @@ export function getGovOrgBasicInfo(params) { ...@@ -14,7 +14,7 @@ export function getGovOrgBasicInfo(params) {
// 最新动态 // 最新动态
/** /**
* @param { orgId, cRelated, currentPage, pageSize } * @param { orgId, cRelated,dynamicsType, currentPage, pageSize }
*/ */
export function getGovOrgLatestDynamics(params) { export function getGovOrgLatestDynamics(params) {
return request({ return request({
...@@ -62,3 +62,83 @@ export function getGovOrgOpinions(params) { ...@@ -62,3 +62,83 @@ export function getGovOrgOpinions(params) {
params params
}) })
} }
// 人物关系
/**
* @param { orgId }
*/
export function getPersonRelation(params) {
return request({
method: 'GET',
url: `/api/governmentOrg/personRelation/${params.orgId}`,
params
})
}
// 对华制裁 ---------------------------------------
// 实体清单新增数量
/**
* @param { orgId }
*/
export function getGrowthNum(params) {
return request({
method: 'GET',
url: `/api/governmentOrg/growthNum/${params.orgId}`,
params
})
}
// 实体清单新增数量变化趋势
/**
* @param { orgId }
*/
export function getGrowthTrend(params) {
return request({
method: 'GET',
url: `/api/governmentOrg/growthTrend/${params.orgId}`,
params
})
}
// 实体清单新增企业领域分布
/**
* @param { orgId }
*/
export function getEntityListField(params) {
return request({
method: 'GET',
url: `/api/governmentOrg/entityListField/${params.year}/${params.orgId}`,
params
})
}
// 232调查单新增数量
/**
* @param { orgId }
*/
export function getGrowth232Num(params) {
return request({
method: 'GET',
url: `/api/governmentOrg/growth232Num/${params.orgId}`,
params
})
}
// 232调查新增数量变化趋势
/**
* @param { orgId }
*/
export function getGrowth232Trend(params) {
return request({
method: 'GET',
url: `/api/governmentOrg/growth232Trend/${params.orgId}`,
params
})
}
// 232调查新增企业领域分布
/**
* @param { orgId }
*/
export function getSection232Field(params) {
return request({
method: 'GET',
url: `/api/governmentOrg/section232Field/${params.startDate}/${params.orgId}`,
params
})
}
\ No newline at end of file
...@@ -678,7 +678,7 @@ ...@@ -678,7 +678,7 @@
</div> </div>
<div class="right-footer"> <div class="right-footer">
<div class="footer-left"> <div class="footer-left">
{{ `共${total}项调查` }} {{ `共 ${total} 条法案` }}
</div> </div>
<div class="footer-right"> <div class="footer-right">
<el-pagination <el-pagination
......
...@@ -256,7 +256,11 @@ ...@@ -256,7 +256,11 @@
<div class="title">{{ news.title }}</div> <div class="title">{{ news.title }}</div>
<div class="time">{{ news.from }}</div> <div class="time">{{ news.from }}</div>
</div> </div>
<el-popover effect="dark" :width="1000" :content="news.content" placement="top-start">
<template #reference>
<div class="right-footer">{{ news.content }}</div> <div class="right-footer">{{ news.content }}</div>
</template>
</el-popover>
</div> </div>
</div> </div>
</div> </div>
...@@ -294,16 +298,12 @@ ...@@ -294,16 +298,12 @@
</div> </div>
<div class="box5-header-title">{{ "行政令发布频度" }}</div> <div class="box5-header-title">{{ "行政令发布频度" }}</div>
</div> </div>
</div>
<div class="box5-main">
<div class="box5-chart" id="chart1"></div>
<div class="box5-selectbox"> <div class="box5-selectbox">
<el-select <el-select
@change="handleBox5YearChange" @change="handleBox5YearChange"
v-model="box5SelectedYear" v-model="box5SelectedYear"
placeholder="选择时间" placeholder="选择时间"
style="width: 80px" style="width: 120px"
> >
<el-option <el-option
v-for="item in box5YearList" v-for="item in box5YearList"
...@@ -314,6 +314,10 @@ ...@@ -314,6 +314,10 @@
</el-select> </el-select>
</div> </div>
</div> </div>
<div class="box5-main">
<div class="box5-chart" id="chart1"></div>
</div>
</div> </div>
<div class="box6"> <div class="box6">
<div class="box6-header"> <div class="box6-header">
...@@ -321,6 +325,21 @@ ...@@ -321,6 +325,21 @@
<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="box6-selectbox">
<el-select
@change="handleBox6YearChange"
v-model="box6SelectedYear"
placeholder="选择时间"
style="width: 120px"
>
<el-option
v-for="item in box6YearList"
:key="item.value"
:label="item.label"
:value="item.value"
/>
</el-select>
</div>
</div> </div>
<div class="box6-main" id="chart2"></div> <div class="box6-main" id="chart2"></div>
</div> </div>
...@@ -334,7 +353,12 @@ ...@@ -334,7 +353,12 @@
<div class="header-title">{{ "关键行政令" }}</div> <div class="header-title">{{ "关键行政令" }}</div>
</div> </div>
<div class="box7-main"> <div class="box7-main">
<div class="box7-item" v-for="(item, index) in keyDecreeList" :key="index"> <div
class="box7-item"
v-for="(item, index) in keyDecreeList"
:key="index"
@click="handleKeyDecree(item.id)"
>
<div class="icon"> <div class="icon">
<img src="./assets/images/warning.png" alt="" /> <img src="./assets/images/warning.png" alt="" />
</div> </div>
...@@ -343,7 +367,11 @@ ...@@ -343,7 +367,11 @@
<div class="title">{{ item.title }}</div> <div class="title">{{ item.title }}</div>
<div class="time">{{ item.time }}</div> <div class="time">{{ item.time }}</div>
</div> </div>
<el-popover effect="dark" :width="800" :content="item.content" placement="top-start">
<template #reference>
<div class="info-content">{{ item.content ? item.content : "暂无数据" }}</div> <div class="info-content">{{ item.content ? item.content : "暂无数据" }}</div>
</template>
</el-popover>
</div> </div>
</div> </div>
</div> </div>
...@@ -489,7 +517,7 @@ ...@@ -489,7 +517,7 @@
</div> </div>
<div class="footer-box"> <div class="footer-box">
<div class="footer-left"> <div class="footer-left">
{{ `共${totalDecreesNum}项调查` }} {{ `共 ${totalDecreesNum} 条政令` }}
</div> </div>
<div class="footer-right"> <div class="footer-right">
<el-pagination <el-pagination
...@@ -610,13 +638,9 @@ const govInsList = ref([ ...@@ -610,13 +638,9 @@ const govInsList = ref([
// name: "美国财政部" // name: "美国财政部"
// }, // },
]); ]);
const checkedGovIns = ref(['白宫']) const checkedGovIns = ref(["白宫"]);
const handleChangeCheckedGovIns = (val) => {
}
const handleChangeCheckedGovIns = val => {};
const handleGetDepartmentList = async () => { const handleGetDepartmentList = async () => {
try { try {
...@@ -719,6 +743,16 @@ const handleClickDecree = decree => { ...@@ -719,6 +743,16 @@ const handleClickDecree = decree => {
window.open(route.href, "_blank"); window.open(route.href, "_blank");
}; };
const handleKeyDecree = id => {
const route = router.resolve({
path: "/decreeLayout",
query: {
id: id
}
});
window.open(route.href, "_blank");
};
// 风险信号 // 风险信号
const warningList = ref([ const warningList = ref([
{ {
...@@ -919,9 +953,36 @@ const chart2Data = ref([ ...@@ -919,9 +953,36 @@ const chart2Data = ref([
]); ]);
// const colorList = ["#69B1FF", "#FFC069", "#87E8DE", "#85A5FF", "#FF7875", "#B37FEB", "#4096FF"]; // const colorList = ["#69B1FF", "#FFC069", "#87E8DE", "#85A5FF", "#FF7875", "#B37FEB", "#4096FF"];
const box6YearList = ref([
{
label: "2025",
value: "2025"
},
{
label: "2024",
value: "2024"
},
{
label: "2023",
value: "2023"
},
{
label: "2022",
value: "2022"
},
{
label: "2021",
value: "2021"
}
]);
const box6SelectedYear = ref("2025");
const handleGetDecreeArea = async () => { const handleGetDecreeArea = async () => {
const params = {
year: box6SelectedYear.value
};
try { try {
const res = await getDecreeArea(); const res = await getDecreeArea(params);
console.log("政令涉及领域", res); console.log("政令涉及领域", res);
if (res.code === 200 && res.data) { if (res.code === 200 && res.data) {
chart2Data.value = res.data.map(item => { chart2Data.value = res.data.map(item => {
...@@ -941,6 +1002,10 @@ const handleBox6 = async () => { ...@@ -941,6 +1002,10 @@ const handleBox6 = async () => {
setChart(chart2, "chart2"); setChart(chart2, "chart2");
}; };
const handleBox6YearChange = () => {
handleBox6();
};
// 关键行政令 // 关键行政令
const keyDecreeList = ref([ const keyDecreeList = ref([
// { // {
...@@ -964,7 +1029,8 @@ const handleGetKeyDecree = async () => { ...@@ -964,7 +1029,8 @@ const handleGetKeyDecree = async () => {
return { return {
title: item.name, title: item.name,
content: item.describe, content: item.describe,
time: item.postDate time: item.postDate,
id: item.orderId
}; };
}); });
} }
...@@ -1012,7 +1078,6 @@ const handleSwithSort = () => { ...@@ -1012,7 +1078,6 @@ const handleSwithSort = () => {
isSort.value = !isSort.value; isSort.value = !isSort.value;
}; };
const handleToPosi = id => { const handleToPosi = id => {
// 0 618 1240 2350 // 0 618 1240 2350
switch (id) { switch (id) {
...@@ -1088,7 +1153,7 @@ const decreeList = ref([ ...@@ -1088,7 +1153,7 @@ const decreeList = ref([
]); ]);
const handleGetDecreeOrderList = async () => { const handleGetDecreeOrderList = async () => {
const p0 = checkedGovIns.value.join(',') const p0 = checkedGovIns.value.join(",");
const p1 = activeAreaList.value.join(","); const p1 = activeAreaList.value.join(",");
const p2 = activePubTime.value.join(","); const p2 = activePubTime.value.join(",");
const params = { const params = {
...@@ -1109,7 +1174,7 @@ const handleGetDecreeOrderList = async () => { ...@@ -1109,7 +1174,7 @@ const handleGetDecreeOrderList = async () => {
id: item.id, id: item.id,
time: item.postDate, time: item.postDate,
title: item.name, title: item.name,
desc: item.order, desc: item.describe,
img: item.orgImage, img: item.orgImage,
tagList: item.industryList tagList: item.industryList
}; };
...@@ -1157,8 +1222,7 @@ watch( ...@@ -1157,8 +1222,7 @@ watch(
val => { val => {
handleGetDecreeOrderList(); handleGetDecreeOrderList();
} }
);
)
// 切换当前政令 // 切换当前政令
const handleSwithCurDecree = name => { const handleSwithCurDecree = name => {
...@@ -2555,26 +2619,13 @@ onMounted(async () => { ...@@ -2555,26 +2619,13 @@ onMounted(async () => {
line-height: 26px; line-height: 26px;
} }
} }
.box5-header-right { .box5-selectbox {
width: 49px; margin-right: 20px;
height: 24px; margin-top: 8px;
margin-top: 12px;
margin-right: 27px;
cursor: pointer;
img {
width: 100%;
height: 100%;
}
} }
} }
.box5-main { .box5-main {
height: 397px; height: 397px;
position: relative;
.box5-selectbox {
position: absolute;
right: 10px;
top: 10px;
}
.box5-chart { .box5-chart {
height: 397px; height: 397px;
} }
...@@ -2613,17 +2664,10 @@ onMounted(async () => { ...@@ -2613,17 +2664,10 @@ onMounted(async () => {
font-weight: 700; font-weight: 700;
line-height: 26px; line-height: 26px;
} }
.header-right { .box6-selectbox {
position: absolute; position: absolute;
right: 27px; right: 20px;
width: 49px; top: 8px;
height: 24px;
top: 12px;
cursor: pointer;
img {
width: 100%;
height: 100%;
}
} }
} }
.box6-main { .box6-main {
...@@ -2680,6 +2724,10 @@ onMounted(async () => { ...@@ -2680,6 +2724,10 @@ onMounted(async () => {
margin-top: 16px; margin-top: 16px;
margin-left: 25px; margin-left: 25px;
display: flex; display: flex;
cursor: pointer;
&:hover {
background: var(--color-bg-hover);
}
.icon { .icon {
margin-top: 6px; margin-top: 6px;
width: 24px; width: 24px;
......
...@@ -72,7 +72,7 @@ ...@@ -72,7 +72,7 @@
<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 showList" :key="idx"> <div class="list-item" v-for="(val, idx) in showList" :key="idx" @click="handleToDecreeDetail(val)">
<div class="id">{{ idx + 1 }}</div> <div class="id">{{ idx + 1 }}</div>
<div class="title">{{ val.content }}</div> <div class="title">{{ val.content }}</div>
<div class="open"> <div class="open">
...@@ -105,7 +105,7 @@ ...@@ -105,7 +105,7 @@
<script setup> <script setup>
import { ref, computed, onMounted } from "vue"; import { ref, computed, onMounted } from "vue";
import { useRoute } from "vue-router"; import { useRoute } from "vue-router";
import router from "@/router";
import { getDecreeMainContent } from "@/api/decree/introduction"; import { getDecreeMainContent } from "@/api/decree/introduction";
import { getDecreeRelateOrder } from "@/api/decree/deepdig"; import { getDecreeRelateOrder } from "@/api/decree/deepdig";
...@@ -254,6 +254,16 @@ const handleGetRelateOrder = async () => { ...@@ -254,6 +254,16 @@ const handleGetRelateOrder = async () => {
} }
}; };
const handleToDecreeDetail = (item) => {
const route = router.resolve({
path: "/decreeLayout/overview/introduction",
query: {
id: item.id
}
});
window.open(route.href, "_blank");
}
onMounted(() => { onMounted(() => {
handleGetRelateOrder(); handleGetRelateOrder();
}); });
...@@ -483,6 +493,10 @@ onMounted(() => { ...@@ -483,6 +493,10 @@ onMounted(() => {
background: rgba(255, 255, 255, 1); background: rgba(255, 255, 255, 1);
border-bottom: 1px solid rgba(234, 236, 238, 1); border-bottom: 1px solid rgba(234, 236, 238, 1);
display: flex; display: flex;
cursor: pointer;
&:hover{
background: var(--color-bg-hover);
}
.id { .id {
width: 24px; width: 24px;
height: 24px; height: 24px;
......
...@@ -134,7 +134,7 @@ import icon2Active from "./assets/icons/icon2_active.png"; ...@@ -134,7 +134,7 @@ 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";
import DefaultIcon2 from '@/assets/icons/default-icon2.png' import DefaultIcon2 from "@/assets/icons/default-icon2.png";
const route = useRoute(); const route = useRoute();
...@@ -186,7 +186,6 @@ const activeTitle = ref("政令概况"); ...@@ -186,7 +186,6 @@ const activeTitle = ref("政令概况");
const handleClickMainHeaderBtn = item => { const handleClickMainHeaderBtn = item => {
activeTitle.value = item.name; activeTitle.value = item.name;
window.sessionStorage.setItem("activeTitle", item.name);
router.push({ router.push({
path: item.path, path: item.path,
query: { query: {
...@@ -211,16 +210,16 @@ const handleGetSummary = async () => { ...@@ -211,16 +210,16 @@ const handleGetSummary = async () => {
onMounted(() => { onMounted(() => {
handleGetSummary(); handleGetSummary();
if (window.sessionStorage.getItem("activeTitle")) { console.log(route.path);
activeTitle.value = window.sessionStorage.getItem("activeTitle"); if (route.path === "/decreeLayout/overview/introduction" || route.path === "/decreeLayout/overview/background") {
activeTitle.value = "政令概况";
} else if (route.path === "/decreeLayout/deepDig") {
activeTitle.value = "政令概况";
} else {
activeTitle.value = "影响分析";
} }
}); });
onUnmounted(() => {
if (window.sessionStorage.getItem("activeTitle")) {
window.sessionStorage.removeItem("activeTitle");
}
});
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
...@@ -247,7 +246,7 @@ onUnmounted(() => { ...@@ -247,7 +246,7 @@ onUnmounted(() => {
.icon { .icon {
width: 64px; width: 64px;
height: 64px; height: 64px;
img{ img {
width: 100%; width: 100%;
height: 100%; height: 100%;
} }
......
<template> <template>
<div class="introduction-wrap"> <div class="introduction-wrap">
<div
class="hover-dialog"
:style="{ position: 'absolute', zIndex: 9999, top: `${mouseY - 220}px`, left: `${mouseX - 600}px` }"
v-if="isShowBox2Dialog"
>
{{ box2ContentAll }}
</div>
<div class="left"> <div class="left">
<div class="box1"> <div class="box1">
<div class="box-header"> <div class="box-header">
...@@ -29,13 +36,13 @@ ...@@ -29,13 +36,13 @@
<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.content }}</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">{{ `共计${backgroundListNum}指令` }}</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="backgroundListNum" /> <el-pagination :page-size="5" background layout="prev, pager, next" :total="backgroundListNum" />
</div> </div>
...@@ -55,20 +62,19 @@ ...@@ -55,20 +62,19 @@
</div> </div>
</div> </div>
<div class="box2-main"> <div class="box2-main">
<div class="box2-dialog hover-dialog" v-if="isShowBox2Dialog">{{ box2ContentAll }}</div>
<div class="box2-item" v-for="(item, index) in relatedEvents" :key="index"> <div class="box2-item" v-for="(item, index) in relatedEvents" :key="index">
<div class="item-left"> <div class="item-left">
<img :src="item.image" alt="" /> <img :src="item.image" alt="" />
</div> </div>
<div class="item-center"> <div class="item-center">
<div class="title">{{ item.title }}</div> <div class="title">{{ item.title }}</div>
<div <el-popover effect="dark" :width="1000" :content="item.content" placement="top-start">
class="content" <template #reference>
@mouseenter="handleChangeShowBox2Dialog(true, item.content)" <div class="content">
@mouseleave="handleChangeShowBox2Dialog(false)"
>
{{ item.content }} {{ item.content }}
</div> </div>
</template>
</el-popover>
</div> </div>
<div class="item-right">{{ item.time }}</div> <div class="item-right">{{ item.time }}</div>
</div> </div>
...@@ -94,13 +100,13 @@ ...@@ -94,13 +100,13 @@
</div> </div>
</div> </div>
<div class="box3-main"> <div class="box3-main">
<div class="box3-item" v-for="(item, index) in laws" :key="index"> <div class="box3-item" v-for="(item, index) in laws" :key="index" @click="handleToBillDetail(item)">
<div class="id">{{ index + 1 }}</div> <div class="id">{{ index + 1 }}</div>
<div class="item-header"> <div class="item-header">
<div class="name">{{ item.title }}</div> <div class="name">{{ item.title }}</div>
<div class="info">{{ item.info }}</div> <!-- <div class="info">{{ item.info }}</div> -->
</div> </div>
<!-- <div class="item-content">{{ item.content }}</div> --> <div class="item-content">{{ item.content }}</div>
</div> </div>
</div> </div>
</div> </div>
...@@ -111,6 +117,7 @@ ...@@ -111,6 +117,7 @@
<script setup> <script setup>
import { ref, onMounted } from "vue"; import { ref, onMounted } from "vue";
import { useRoute } from "vue-router"; import { useRoute } from "vue-router";
import router from "@/router";
import { getDecreeBackground, getDecreeRelatedEvent, getDecreeDepend } from "@/api/decree/background"; import { getDecreeBackground, getDecreeRelatedEvent, getDecreeDepend } from "@/api/decree/background";
import Img1 from "./assets/images/box2-img1.png"; import Img1 from "./assets/images/box2-img1.png";
...@@ -119,11 +126,16 @@ import Img3 from "./assets/images/box2-img3.png"; ...@@ -119,11 +126,16 @@ 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"; import { reduce } from "lodash";
import Index from "../index.vue";
const route = useRoute(); const route = useRoute();
const decreeId = ref(route.query.id); const decreeId = ref(route.query.id);
// 基本鼠标位置
const mouseX = ref(0);
const mouseY = ref(0);
// 提出背景 // 提出背景
const box1BtnList = ref(["涉华背景", "全部背景"]); const box1BtnList = ref(["涉华背景", "全部背景"]);
const box1ActiveBtn = ref("涉华背景"); const box1ActiveBtn = ref("涉华背景");
...@@ -228,6 +240,17 @@ const handleChangeShowBox2Dialog = (isShow, content) => { ...@@ -228,6 +240,17 @@ const handleChangeShowBox2Dialog = (isShow, content) => {
box2ContentAll.value = content; box2ContentAll.value = content;
}; };
const handleMouseMove = event => {
mouseX.value = event.screenX;
mouseY.value = event.screenY;
};
const handleToBillDetail = item => {
window.sessionStorage.setItem("billId", item.billId);
const route = router.resolve("/billLayout");
window.open(route.href, "_blank");
};
onMounted(() => { onMounted(() => {
handleGetBackground(); handleGetBackground();
handleGetRelateEvents(); handleGetRelateEvents();
...@@ -239,13 +262,6 @@ onMounted(() => { ...@@ -239,13 +262,6 @@ onMounted(() => {
.introduction-wrap { .introduction-wrap {
display: flex; display: flex;
position: relative; position: relative;
position: relative;
.box2-dialog {
position: absolute;
bottom: 350px;
left: 100px;
z-index: 9999;
}
.box-header { .box-header {
height: 56px; height: 56px;
display: flex; display: flex;
...@@ -323,7 +339,7 @@ onMounted(() => { ...@@ -323,7 +339,7 @@ onMounted(() => {
.box1-main { .box1-main {
margin-left: 22px; margin-left: 22px;
width: 1120px; width: 1120px;
height: 280px; height: 290px;
overflow: hidden; overflow: hidden;
overflow-y: auto; overflow-y: auto;
.box1-item { .box1-item {
...@@ -336,7 +352,7 @@ onMounted(() => { ...@@ -336,7 +352,7 @@ onMounted(() => {
background: rgba(255, 255, 255, 1); background: rgba(255, 255, 255, 1);
display: flex; display: flex;
align-items: center; align-items: center;
padding: 12px 0; padding: 8px 0;
.id { .id {
margin-left: 15px; margin-left: 15px;
width: 24px; width: 24px;
...@@ -476,7 +492,8 @@ onMounted(() => { ...@@ -476,7 +492,8 @@ onMounted(() => {
.box3-item { .box3-item {
margin-bottom: 20px; margin-bottom: 20px;
position: relative; position: relative;
border-bottom: 1px solid rgba(234, 236, 238, 1); cursor: pointer;
// border-bottom: 1px solid rgba(234, 236, 238, 1);
.id { .id {
width: 24px; width: 24px;
height: 24px; height: 24px;
......
...@@ -20,7 +20,7 @@ ...@@ -20,7 +20,7 @@
</div> </div>
</template> </template>
<script setup> <script setup>
import { ref, onMounted, onUnmounted } from "vue"; import { ref, onMounted } from "vue";
import router from "@/router"; import router from "@/router";
import { useRoute } from "vue-router"; import { useRoute } from "vue-router";
const route = useRoute(); const route = useRoute();
...@@ -41,7 +41,6 @@ const siderList = ref([ ...@@ -41,7 +41,6 @@ const siderList = ref([
const siderBtnActive = ref("政令简介"); const siderBtnActive = ref("政令简介");
const handleClickLeftSiderBtn = item => { const handleClickLeftSiderBtn = item => {
window.sessionStorage.setItem("siderBarActiveName", item.name);
siderBtnActive.value = item.name; siderBtnActive.value = item.name;
router.push({ router.push({
path: item.path, path: item.path,
...@@ -52,14 +51,10 @@ const handleClickLeftSiderBtn = item => { ...@@ -52,14 +51,10 @@ const handleClickLeftSiderBtn = item => {
}; };
onMounted(() => { onMounted(() => {
if (window.sessionStorage.getItem("siderBarActiveName")) { if (route.path === "/decreeLayout/overview/introduction") {
siderBtnActive.value = window.sessionStorage.getItem("siderBarActiveName"); siderBtnActive.value = "政令简介";
} } else {
}); siderBtnActive.value = "政令背景";
onUnmounted(() => {
if (window.sessionStorage.getItem("siderBarActiveName")) {
window.sessionStorage.removeItem("siderBarActiveName");
} }
}); });
</script> </script>
......
...@@ -43,9 +43,9 @@ ...@@ -43,9 +43,9 @@
<div class="item-right text">{{ basicInfo.signTime }}</div> <div class="item-right text">{{ basicInfo.signTime }}</div>
</div> </div>
<div class="item"> <div class="item">
<div class="item-left">{{ "签署总统:" }}</div> <div class="item-left">{{ "发布机构:" }}</div>
<div class="item-right text"> <div class="item-right text">
{{ basicInfo.signPeople }} {{ basicInfo.proposeOrgName }}
</div> </div>
</div> </div>
<div class="item"> <div class="item">
...@@ -80,9 +80,9 @@ ...@@ -80,9 +80,9 @@
<div class="box2-item" v-for="(item, index) in curmajorList" :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.content }}</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">
...@@ -233,6 +233,7 @@ const handleGetBasicInfo = async () => { ...@@ -233,6 +233,7 @@ const handleGetBasicInfo = async () => {
basicInfo.value.signTime = res.data.postDate; basicInfo.value.signTime = res.data.postDate;
basicInfo.value.bh = res.data.order; basicInfo.value.bh = res.data.order;
basicInfo.value.deadline = res.data.deadline; basicInfo.value.deadline = res.data.deadline;
basicInfo.value.proposeOrgName = res.data.proposeOrgName
} }
} catch (error) { } catch (error) {
console.error("基本信息error", error); console.error("基本信息error", error);
...@@ -297,7 +298,7 @@ const handleClickBox3Btn = (btn, index) => { ...@@ -297,7 +298,7 @@ const handleClickBox3Btn = (btn, index) => {
eventList.value = box3Data.value[index].newsList.map(val => { eventList.value = box3Data.value[index].newsList.map(val => {
return { return {
time: val.newsDate, time: val.newsDate,
title: val.newsTitle title: val.newsContent
}; };
}); });
}; };
...@@ -416,15 +417,14 @@ handleGetOrgnization(); ...@@ -416,15 +417,14 @@ handleGetOrgnization();
} }
.header-btn-box { .header-btn-box {
position: absolute; position: absolute;
width: 360px; z-index: 9999;
height: 35px; width: 320px;
height: 56px;
overflow: hidden;
overflow-x: auto;
top: 14px; top: 14px;
right: 84px; right: 84px;
display: flex; display: flex;
// justify-content: flex-end; justify-content: flex-end;
flex-wrap: wrap;
gap: 8px; gap: 8px;
white-space: nowrap; white-space: nowrap;
.btn { .btn {
...@@ -466,10 +466,10 @@ handleGetOrgnization(); ...@@ -466,10 +466,10 @@ handleGetOrgnization();
} }
} }
.left { .left {
width: 1150px; width: 1064px;
.box1 { .box1 {
margin-top: 16px; margin-top: 16px;
width: 1150px; width: 1064px;
height: 414px; height: 414px;
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);
...@@ -525,7 +525,7 @@ handleGetOrgnization(); ...@@ -525,7 +525,7 @@ handleGetOrgnization();
} }
.box2 { .box2 {
margin-top: 16px; margin-top: 16px;
width: 1150px; width: 1064px;
height: 415px; height: 415px;
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);
...@@ -533,20 +533,23 @@ handleGetOrgnization(); ...@@ -533,20 +533,23 @@ handleGetOrgnization();
.box2-main { .box2-main {
margin-left: 22px; margin-left: 22px;
height: 280px; height: 280px;
overflow: hidden;
overflow-y: auto;
.box2-item { .box2-item {
width: 1101px; width: 1015px;
height: 48px; // height: 48px;
margin-bottom: 8px; margin-bottom: 8px;
box-sizing: border-box; box-sizing: border-box;
border: 1px solid rgba(234, 236, 238, 1); border: 1px solid rgba(234, 236, 238, 1);
border-radius: 2px; border-radius: 2px;
background: rgba(255, 255, 255, 1); background: rgba(255, 255, 255, 1);
display: flex; display: flex;
align-items: center;
padding: 12px 0;
&:nth-child(2n-1) { &:nth-child(2n-1) {
background: rgba(247, 248, 249, 1); background: rgba(247, 248, 249, 1);
} }
.id { .id {
margin-top: 12px;
margin-left: 15px; margin-left: 15px;
width: 24px; width: 24px;
height: 24px; height: 24px;
...@@ -558,15 +561,15 @@ handleGetOrgnization(); ...@@ -558,15 +561,15 @@ handleGetOrgnization();
} }
.title { .title {
width: 1020px; width: 1020px;
line-height: 48px; line-height: 24px;
margin-left: 5px; margin-left: 10px;
color: rgba(59, 65, 75, 1); color: rgba(59, 65, 75, 1);
font-family: Microsoft YaHei; font-family: Microsoft YaHei;
font-size: 16px; font-size: 16px;
font-weight: 700; font-weight: 700;
overflow: hidden; // overflow: hidden;
text-overflow: ellipsis; // text-overflow: ellipsis;
white-space: nowrap; // white-space: nowrap;
} }
.open { .open {
width: 16px; width: 16px;
...@@ -595,17 +598,18 @@ handleGetOrgnization(); ...@@ -595,17 +598,18 @@ handleGetOrgnization();
} }
} }
.right { .right {
width: 520px;
margin-left: 16px; margin-left: 16px;
.box3 { .box3 {
margin-top: 16px; margin-top: 16px;
width: 576px; width: 520px;
height: 845px; height: 845px;
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);
.box3-top { .box3-top {
margin-top: 10px; margin-top: 30px;
height: 261px; height: 241px;
border-bottom: 1px solid rgba(234, 236, 238, 1); border-bottom: 1px solid rgba(234, 236, 238, 1);
.box3-top-top { .box3-top-top {
width: 473px; width: 473px;
...@@ -651,6 +655,7 @@ handleGetOrgnization(); ...@@ -651,6 +655,7 @@ handleGetOrgnization();
} }
} }
.right { .right {
width: 350px;
margin-left: 22px; margin-left: 22px;
.name { .name {
height: 26px; height: 26px;
......
...@@ -159,7 +159,7 @@ import getPieChart from "./utils/piechart"; ...@@ -159,7 +159,7 @@ import getPieChart from "./utils/piechart";
import getWordCloudChart from "./utils/worldCloudChart"; import getWordCloudChart from "./utils/worldCloudChart";
import getGraphChart from "./utils/graph"; import getGraphChart from "./utils/graph";
import { getGovOrgCompanyArea, getGovOrgOpinions } from "@/api/institution/index"; import { getGovOrgCompanyArea, getGovOrgOpinions, getPersonRelation } from "@/api/institution/index";
import Img from "./assets/images/9.png"; import Img from "./assets/images/9.png";
import Img1 from "./assets/images/1.png"; import Img1 from "./assets/images/1.png";
...@@ -171,7 +171,7 @@ import Img6 from "./assets/images/6.png"; ...@@ -171,7 +171,7 @@ import Img6 from "./assets/images/6.png";
import Img7 from "./assets/images/7.png"; import Img7 from "./assets/images/7.png";
import Img8 from "./assets/images/8.png"; import Img8 from "./assets/images/8.png";
const route = useRoute() const route = useRoute();
const box1ChartData = ref({ const box1ChartData = ref({
nodes: [ nodes: [
...@@ -381,19 +381,15 @@ const box3ChartData = ref([ ...@@ -381,19 +381,15 @@ const box3ChartData = ref([
]); ]);
const handleGetOpinions = async () => { const handleGetOpinions = async () => {
const params = { const params = {
orgId: '50754570da464d0a81a5563dcb61d2ec' orgId: "50754570da464d0a81a5563dcb61d2ec"
} };
try { try {
const res = await getGovOrgOpinions(params) const res = await getGovOrgOpinions(params);
console.log('主要科技政策观点', res); console.log("主要科技政策观点", res);
} catch (error) {}
} catch (error) { };
}
}
// 人物关系
const box4ChartData = ref({ const box4ChartData = ref({
nodes: [ nodes: [
{ id: "9", name: "霍华德·卢特尼克", category: 0, symbolSize: 50, symbol: `image://${Img}` }, { id: "9", name: "霍华德·卢特尼克", category: 0, symbolSize: 50, symbol: `image://${Img}` },
...@@ -418,18 +414,42 @@ const box4ChartData = ref({ ...@@ -418,18 +414,42 @@ const box4ChartData = ref({
], ],
categories: [{ name: "a" }, { name: "b" }] categories: [{ name: "a" }, { name: "b" }]
}); });
const handleGetPerosonRelation = async () => {
const params = {
orgId: route.query.id
};
try {
const res = await getPersonRelation(params);
console.log("人物关系", res);
if (res.code === 200 && res.data && res.data.length) {
} else {
box4ChartData.value.nodes = [];
box4ChartData.value.links = [];
box4ChartData.value.categories = [];
}
} catch (error) {
box4ChartData.value.nodes = [];
box4ChartData.value.links = [];
box4ChartData.value.categories = [];
}
};
const handleBox4 = async () => {
await handleGetPerosonRelation();
const box4Chart = getGraphChart(box4ChartData.value);
setChart(box4Chart, "box4Chart");
};
onMounted(() => { onMounted(() => {
handleBox2(); handleBox2();
handleGetOpinions() handleGetOpinions();
const box1Chart = getSankeyChart(box1ChartData.value.nodes, box1ChartData.value.links); const box1Chart = getSankeyChart(box1ChartData.value.nodes, box1ChartData.value.links);
setChart(box1Chart, "box1Chart"); setChart(box1Chart, "box1Chart");
const box3Chart = getWordCloudChart(box3ChartData.value); const box3Chart = getWordCloudChart(box3ChartData.value);
setChart(box3Chart, "box3Chart"); setChart(box3Chart, "box3Chart");
const box4Chart = getGraphChart(box4ChartData.value); handleBox4();
setChart(box4Chart, "box4Chart");
}); });
</script> </script>
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
<div class="wrap"> <div class="wrap">
<div class="header"> <div class="header">
<div class="header-left"> <div class="header-left">
<img :src="institutionInfo.logo?institutionInfo.logo: DefaultIcon2" alt="" /> <img :src="institutionInfo.logo ? institutionInfo.logo : DefaultIcon2" alt="" />
</div> </div>
<div class="header-right"> <div class="header-right">
<div class="title">{{ institutionInfo.name }}</div> <div class="title">{{ institutionInfo.name }}</div>
...@@ -24,8 +24,8 @@ ...@@ -24,8 +24,8 @@
<div class="tab-box"> <div class="tab-box">
<div <div
class="tab" class="tab"
@click="handleClickTab(item, index)" @click="handleClickTab(item)"
:class="{ tabActive: item.active }" :class="{ tabActive: activeTabName == item.name }"
v-for="(item, index) in tabList" v-for="(item, index) in tabList"
:key="index" :key="index"
> >
...@@ -41,70 +41,72 @@ ...@@ -41,70 +41,72 @@
</template> </template>
<script setup> <script setup>
import { ref, computed, onMounted } from "vue"; import { ref, computed, onMounted, onUnmounted } from "vue";
import { useRoute } from "vue-router"; import { useRoute } from "vue-router";
import InsDetail from "./insDetail/index.vue"; import InsDetail from "./insDetail/index.vue";
import Deepdig from "./deepdig/index.vue"; import Deepdig from "./deepdig/index.vue";
import Sanction from "./sanction/index.vue"; import Sanction from "./sanction/index.vue";
import {getGovOrgBasicInfo} from '@/api/institution/index' import { getGovOrgBasicInfo } from "@/api/institution/index";
import DefaultIcon2 from '@/assets/icons/default-icon2.png' import DefaultIcon2 from "@/assets/icons/default-icon2.png";
const route = useRoute() const route = useRoute();
const institutionInfo = ref({ const institutionInfo = ref({
name: "", name: "",
enName: "", enName: "",
desc: "", desc: "",
tagList: [], tagList: [],
logo: '' logo: ""
}); });
const handleGetInfo = async () => { const handleGetInfo = async () => {
const params = { const params = {
id: route.query.id id: route.query.id
} };
try { try {
const res = await getGovOrgBasicInfo(params) const res = await getGovOrgBasicInfo(params);
console.log('机构信息', res); console.log("机构信息", res);
if(res.code === 200 && res.data) { if (res.code === 200 && res.data) {
institutionInfo.value.name = res.data.orgName institutionInfo.value.name = res.data.orgName;
institutionInfo.value.enName = res.data.orgNameEn institutionInfo.value.enName = res.data.orgNameEn;
institutionInfo.value.desc = res.data.orgIntroduction institutionInfo.value.desc = res.data.orgIntroduction;
institutionInfo.value.name = res.data.orgName institutionInfo.value.name = res.data.orgName;
}
} catch (error) {
} }
} } catch (error) {}
};
handleGetInfo() handleGetInfo();
const activeTabName = ref("机构详情"); const activeTabName = ref("机构详情");
const tabList = ref([ const tabList = ref([
{ {
name: "机构详情", name: "机构详情"
active: true
}, },
{ {
name: "深度挖掘", name: "深度挖掘"
active: false
}, },
{ {
name: "对话制裁", name: "对华制裁"
active: false
} }
]); ]);
const handleClickTab = (val, index) => { const handleClickTab = val => {
tabList.value.forEach(item => {
item.active = false;
});
tabList.value[index].active = true;
activeTabName.value = val.name; activeTabName.value = val.name;
window.sessionStorage.setItem("institutionActiveTabName", val.name);
}; };
onMounted(() => {
if (window.sessionStorage.getItem("institutionActiveTabName")) {
activeTabName.value = window.sessionStorage.getItem("institutionActiveTabName");
}
});
onUnmounted(() => {
window.sessionStorage.removeItem('institutionActiveTabName')
})
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
......
...@@ -113,7 +113,7 @@ ...@@ -113,7 +113,7 @@
<div class="user-content"> <div class="user-content">
<div class="user-item" v-for="(item, index) in keyUser" :key="index"> <div class="user-item" v-for="(item, index) in keyUser" :key="index">
<div class="user-item-left"> <div class="user-item-left">
<img :src="item.avatarUrl" alt="" /> <img :src="item.avatarUrl?item.avatarUrl:DefaultIcon1" alt="" />
</div> </div>
<div class="user-item-right"> <div class="user-item-right">
<div class="name">{{ item.name }}</div> <div class="name">{{ item.name }}</div>
...@@ -136,11 +136,13 @@ import User1 from "./assets/images/user1.png"; ...@@ -136,11 +136,13 @@ import User1 from "./assets/images/user1.png";
import User2 from "./assets/images/user2.png"; import User2 from "./assets/images/user2.png";
import User3 from "./assets/images/user3.png"; import User3 from "./assets/images/user3.png";
import User4 from "./assets/images/user4.png"; import User4 from "./assets/images/user4.png";
import DefaultIcon1 from "@/assets/icons/default-icon1.png";
import DefaultIcon2 from "@/assets/icons/default-icon2.png"; import DefaultIcon2 from "@/assets/icons/default-icon2.png";
import { getGovOrgLatestDynamics, getGovOrgKeyPerson } from "@/api/institution/index"; import { getGovOrgBasicInfo, getGovOrgLatestDynamics, getGovOrgKeyPerson } from "@/api/institution/index";
const route = useRoute() const route = useRoute()
// 基本信息
const basicInfo = ref({ const basicInfo = ref({
image: Img, image: Img,
shijian: "1948年", shijian: "1948年",
...@@ -149,6 +151,28 @@ const basicInfo = ref({ ...@@ -149,6 +151,28 @@ const basicInfo = ref({
xiashujigou: "工业与安全局、国际贸易管理局、专利商标局等", xiashujigou: "工业与安全局、国际贸易管理局、专利商标局等",
zhicaishouduan: "实体清单、军事最终用户清单、​​“301条款”关税、​​“232条款”关税、特别指定国民清单" zhicaishouduan: "实体清单、军事最终用户清单、​​“301条款”关税、​​“232条款”关税、特别指定国民清单"
}); });
const handleGetBasicInfo = async () => {
const params = {
id: route.query.id
}
try {
const res = await getGovOrgBasicInfo(params)
console.log('基本信息', res);
if(res.code === 200 && res.data) {
basicInfo.value.image = res.data.logoUrl
basicInfo.value.shijian = res.data.establishmentDate
basicInfo.value.dizhi = res.data.address
basicInfo.value.zhize = res.data.orgIntroduction
basicInfo.value.xiashujigou = res.data.branchOrglist.toString()
basicInfo.value.zhicaishouduan = res.data.taglist.toString()
}
} catch (error) {
}
}
// 关键人物 // 关键人物
const keyUser = ref([ const keyUser = ref([
...@@ -162,16 +186,6 @@ const keyUser = ref([ ...@@ -162,16 +186,6 @@ const keyUser = ref([
// avatarUrl: User2, // avatarUrl: User2,
// position: "副部长" // position: "副部长"
// }, // },
// {
// name: "杰弗里·凯斯勒",
// avatarUrl: User3,
// position: "工业与安全局局长"
// },
// {
// name: "约翰·斯奎尔斯",
// avatarUrl: User4,
// position: "专利商标局局长"
// }
]); ]);
const handleGetKeyUser = async () => { const handleGetKeyUser = async () => {
const params = { const params = {
...@@ -251,49 +265,7 @@ handleGetKeyUser(); ...@@ -251,49 +265,7 @@ handleGetKeyUser();
// }, // },
// tagList: ["集成电路"] // tagList: ["集成电路"]
// }, // },
// {
// title: "美国商务部:加强对华AI芯片出口限制",
// time: "2025 9月10日",
// content:
// "美国政府要求英特尔、AMD、英伟达等公司对向中国出口的先进AI处理器实施严格的许可证制度。英特尔Gaudi系列芯片等因性能超标明确受限。同时,考虑对中国AI初创企业DeepSeek实施制裁。",
// type: {
// name: "行政令",
// status: 2
// },
// tagList: ["人工智能", "集成电路"]
// },
// {
// title: "美国商务部:BIS更新“实体清单”",
// time: "2025 9月15日",
// content:
// "美国商务部工业和安全局宣布更新《出口管理条例》(EAR),并发布两项最终规则,将25家中国企业及其相关实体列入实体清单。",
// type: {
// name: "实体清单",
// status: 4
// },
// tagList: ["集成电路"]
// },
// {
// title: "美国商务部:​发布针对中国网联汽车的禁令",
// time: "2025 8月25日",
// content: "美国商务部工业与安全局(BIS)发布一项最终规则,禁止涉及销售或进口其认定软件与中国有关联的联网汽车的交易。",
// type: {
// name: "行政令",
// status: 2
// },
// tagList: ["能源", "先进制造"]
// },
// {
// title: "美国商务部:考虑对中国无人机实施新限制",
// time: "2025 8月19日",
// content:
// "美国商务部表示正在考虑制定新规则,以限制或禁止中国无人机在美国境内使用,并就所谓“保护无人机供应链”的潜在规则征求公众意见。",
// type: {
// name: "行政令",
// status: 2
// },
// tagList: ["先进制造"]
// }
// ]); // ]);
const dynamicsName = ref("机构动态"); const dynamicsName = ref("机构动态");
const isCrelated = ref(false); const isCrelated = ref(false);
...@@ -318,6 +290,7 @@ const handleGetLatestDynamics = async () => { ...@@ -318,6 +290,7 @@ const handleGetLatestDynamics = async () => {
const params = { const params = {
orgId: route.query.id, orgId: route.query.id,
cRelated: isCrelated.value ? "Y" : "N", cRelated: isCrelated.value ? "Y" : "N",
dynamicsType: dynamicsName === '机构动态' ? "org" : "person",
currentPage: 1, currentPage: 1,
pageSize: 9999999 pageSize: 9999999
}; };
...@@ -330,7 +303,13 @@ const handleGetLatestDynamics = async () => { ...@@ -330,7 +303,13 @@ const handleGetLatestDynamics = async () => {
} }
} catch (error) {} } catch (error) {}
}; };
onMounted(() => {
handleGetLatestDynamics(); handleGetLatestDynamics();
handleGetBasicInfo()
})
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
......
...@@ -18,17 +18,17 @@ ...@@ -18,17 +18,17 @@
<div class="item"> <div class="item">
<div class="item-top">{{ "今年新增" }}</div> <div class="item-top">{{ "今年新增" }}</div>
<div class="item-bottom"> <div class="item-bottom">
<div class="item-bottom-left">{{ "95家" }}</div> <div class="item-bottom-left">{{ `${box1Info.currentYear.num}家` }}</div>
<div class="item-bottom-center">{{ "/" }}</div> <div class="item-bottom-center">{{ "/" }}</div>
<div class="item-bottom-right">{{ "1129家" }}</div> <div class="item-bottom-right">{{ `${box1Info.currentYear.totalNum}家` }}</div>
</div> </div>
</div> </div>
<div class="item"> <div class="item">
<div class="item-top">{{ "今年新增" }}</div> <div class="item-top">{{ "全部企业" }}</div>
<div class="item-bottom"> <div class="item-bottom">
<div class="item-bottom-left">{{ "95家" }}</div> <div class="item-bottom-left">{{ `${box1Info.allYear.num}家` }}</div>
<div class="item-bottom-center">{{ "/" }}</div> <div class="item-bottom-center">{{ "/" }}</div>
<div class="item-bottom-right">{{ "1129家" }}</div> <div class="item-bottom-right">{{ `${box1Info.allYear.totalNum}家` }}</div>
</div> </div>
</div> </div>
</div> </div>
...@@ -80,17 +80,17 @@ ...@@ -80,17 +80,17 @@
<div class="item"> <div class="item">
<div class="item-top">{{ "今年新增" }}</div> <div class="item-top">{{ "今年新增" }}</div>
<div class="item-bottom"> <div class="item-bottom">
<div class="item-bottom-left">{{ "2次" }}</div> <div class="item-bottom-left">{{ `${box3Info.currentYear.num}次` }}</div>
<div class="item-bottom-center">{{ "/" }}</div> <div class="item-bottom-center">{{ "/" }}</div>
<div class="item-bottom-right">{{ "6次" }}</div> <div class="item-bottom-right">{{ `${box3Info.currentYear.totalNum}次` }}</div>
</div> </div>
</div> </div>
<div class="item"> <div class="item">
<div class="item-top">{{ "今年新增" }}</div> <div class="item-top">{{ "全部调查" }}</div>
<div class="item-bottom"> <div class="item-bottom">
<div class="item-bottom-left">{{ "16次" }}</div> <div class="item-bottom-left">{{ `${box3Info.allYear.num}次` }}</div>
<div class="item-bottom-center">{{ "/" }}</div> <div class="item-bottom-center">{{ "/" }}</div>
<div class="item-bottom-right">{{ "91次" }}</div> <div class="item-bottom-right">{{ `${box3Info.allYear.totalNum}次` }}</div>
</div> </div>
</div> </div>
</div> </div>
...@@ -130,117 +130,245 @@ import { ref, computed, onMounted } from "vue"; ...@@ -130,117 +130,245 @@ import { ref, computed, onMounted } from "vue";
import setChart from "@/utils/setChart"; import setChart from "@/utils/setChart";
import getPieChart from "./utils/piechart"; import getPieChart from "./utils/piechart";
import getMultiLineChart from "./utils/multiLineChart"; import getMultiLineChart from "./utils/multiLineChart";
import { useRoute } from "vue-router";
import {
getGrowthNum,
getGrowthTrend,
getEntityListField,
getGrowth232Num,
getGrowth232Trend,
getSection232Field
} from "@/api/institution/index";
const route = useRoute();
const box1Info = ref({
currentYear: {
num: 0,
totalNum: 0
},
allYear: {
num: 0,
totalNum: 0
}
});
const handleGetGrowthNum = async () => {
const params = {
orgId: route.query.id
// orgId: 54
};
try {
const res = await getGrowthNum(params);
console.log("实体清单增长数量", res);
if (res.code === 200 && res.data) {
box1Info.value.currentYear.num = res.data.filter(item => {
return item.yearType === "currentYear";
})[0].chinaNum;
box1Info.value.currentYear.totalNum = res.data.filter(item => {
return item.yearType === "currentYear";
})[0].allNum;
box1Info.value.allYear.num = res.data.filter(item => {
return item.yearType === "AllYear";
})[0].chinaNum;
box1Info.value.allYear.totalNum = res.data.filter(item => {
return item.yearType === "AllYear";
})[0].allNum;
} else {
console.error(res);
}
} catch (error) {
console.error("获取实体清单数量error", error);
}
};
handleGetGrowthNum();
const box1Data = ref({ const box1Data = ref({
title: ["2014", "2015", "2016", "2017", "2018", "2019", "2020", "2021", "2022", "2023", "2024", "2025"], title: [],
data: [ data: [
{ {
name: "全部实体", name: "全部实体",
data: [1104, 468, 602, 635, 486, 622, 811, 967, 952, 1104, 1358, 1196] data: []
}, },
{ {
name: "中国实体", name: "中国实体",
data: [234, 263, 251, 224, 264, 255, 258, 234, 246, 249, 257, 268] data: []
} }
] ]
}); });
const handleGetBox1Data = async () => {
const params = {
orgId: route.query.id
// orgId: 54
};
try {
const res = await getGrowthTrend(params);
console.log("实体清单新增数量变数趋势", res);
if (res.code === 200 && res.data) {
box1Data.value.title = res.data.map(item => {
return item.year;
});
box1Data.value.data[0].data = res.data.map(item => {
return item.allNum;
});
box1Data.value.data[1].data = res.data.map(item => {
return item.chinaNum;
});
}
} catch (error) {}
};
const handleBox1 = async () => {
await handleGetBox1Data();
const box1Chart = getMultiLineChart(box1Data.value.title, box1Data.value.data[0].data, box1Data.value.data[1].data);
setChart(box1Chart, "box1Chart");
};
const box2Data = ref([ const box2Data = ref([
{ // {
name: "集成电路", // name: "集成电路",
value: 50 // value: 50
}, // },
{ ]);
name: "人工智能", const handleGetBox2Data = async () => {
value: 46 const params = {
}, orgId: route.query.id,
{ // orgId: 54,
name: "通信网络", year: 2025
value: 40 };
}, try {
{ const res = await getEntityListField(params);
name: "能源", console.log("实体清单新增企业领域分布", res);
value: 32 if (res.code === 200 && res.data) {
}, box2Data.value = res.data.map(item => {
{ return {
name: "先进制造", name: item.industry,
value: 31 value: item.amount
}, };
{ });
name: "生物科技", }
value: 31 } catch (error) {}
}, };
{
name: "航空航天", const handleBox2 = async () => {
value: 30 await handleGetBox2Data();
const box2Chart = getPieChart(box2Data.value);
setChart(box2Chart, "box2Chart");
};
const box3Info = ref({
currentYear: {
num: 0,
totalNum: 0
}, },
{ allYear: {
name: "新材料", num: 0,
value: 24 totalNum: 0
} }
]); });
const handleGetGrowth232Num = async () => {
const params = {
orgId: route.query.id
// orgId: 54
};
try {
const res = await getGrowth232Num(params);
console.log("232调查新增数量", res);
if (res.code === 200 && res.data) {
box3Info.value.currentYear.num = res.data.filter(item => {
return item.yearType === "currentYear";
})[0].chinaNum;
box3Info.value.currentYear.totalNum = res.data.filter(item => {
return item.yearType === "currentYear";
})[0].allNum;
box3Info.value.allYear.num = res.data.filter(item => {
return item.yearType === "AllYear";
})[0].chinaNum;
box3Info.value.allYear.totalNum = res.data.filter(item => {
return item.yearType === "AllYear";
})[0].allNum;
} else {
console.error(res);
}
} catch (error) {
console.error("获取232调查新增数量error", error);
}
};
handleGetGrowth232Num();
const box3Data = ref({ const box3Data = ref({
title: ["2014", "2015", "2016", "2017", "2018", "2019", "2020", "2021", "2022", "2023", "2024", "2025"], title: [],
data: [ data: [
{ {
name: "全部调查", name: "全部调查",
data: [856, 456, 568, 631, 667, 631, 532, 589, 631, 668, 672, 630] data: []
}, },
{ {
name: "涉华调查", name: "涉华调查",
data: [188, 195, 198, 205, 208, 214, 218, 223, 216, 219, 211, 204] data: []
} }
] ]
}); });
const box4Data = ref([ const handleGetBox3Data = async () => {
{ const params = {
name: "集成电路", orgId: route.query.id
value: 50 // orgId: 54
}, };
{ try {
name: "人工智能", const res = await getGrowth232Trend(params);
value: 46 console.log("232调查新增数量变数趋势", res);
}, if (res.code === 200 && res.data) {
{ box3Data.value.title = res.data.map(item => {
name: "通信网络", return item.year;
value: 40 });
}, box3Data.value.data[0].data = res.data.map(item => {
{ return item.allNum;
name: "能源", });
value: 32 box3Data.value.data[1].data = res.data.map(item => {
}, return item.chinaNum;
{ });
name: "先进制造", }
value: 31 } catch (error) {}
}, };
{ const handleBox3 = async () => {
name: "生物科技", await handleGetBox3Data();
value: 31
},
{
name: "航空航天",
value: 30
},
{
name: "新材料",
value: 24
}
]);
onMounted(() => {
const box1Chart = getMultiLineChart(box1Data.value.title, box1Data.value.data[0].data, box1Data.value.data[1].data);
setChart(box1Chart, "box1Chart");
const box2Chart = getPieChart(box2Data.value);
setChart(box2Chart, "box2Chart");
const box3Chart = getMultiLineChart(box3Data.value.title, box3Data.value.data[0].data, box3Data.value.data[1].data); const box3Chart = getMultiLineChart(box3Data.value.title, box3Data.value.data[0].data, box3Data.value.data[1].data);
setChart(box3Chart, "box3Chart"); setChart(box3Chart, "box3Chart");
};
const box4Data = ref([]);
const handleGetBox4Data = async () => {
const params = {
orgId: route.query.id,
// orgId: 54,
startDate: "2021-01-01"
};
try {
const res = await getSection232Field(params);
console.log("232调查新增企业领域分布", res);
if (res.code === 200 && res.data) {
box4Data.value = res.data.map(item => {
return {
name: item.industry,
value: item.amount
};
});
}
} catch (error) {}
};
const handleBox4 = async () => {
await handleGetBox4Data();
const box4Chart = getPieChart(box4Data.value); const box4Chart = getPieChart(box4Data.value);
setChart(box4Chart, "box4Chart"); setChart(box4Chart, "box4Chart");
};
onMounted(() => {
handleBox1();
handleBox2();
handleBox3();
handleBox4();
}); });
</script> </script>
......
...@@ -429,7 +429,9 @@ onMounted(async () => { ...@@ -429,7 +429,9 @@ onMounted(async () => {
.box1-main { .box1-main {
width: 1056px; width: 1056px;
height: 1280px; min-height: 738px;
max-height: 1280px;
padding-bottom: 20px;
margin: 0 auto; margin: 0 auto;
overflow: hidden; overflow: hidden;
overflow-y: auto; overflow-y: auto;
......
...@@ -145,7 +145,7 @@ ...@@ -145,7 +145,7 @@
</div> </div>
</div> </div>
<div class="right-footer"> <div class="right-footer">
<div class="info">{{ total }}智库报告</div> <div class="info">{{ total }}篇政策建议</div>
<div class="page-box"> <div class="page-box">
<el-pagination :page-size="12" background layout="prev, pager, next" :total="total" <el-pagination :page-size="12" background layout="prev, pager, next" :total="total"
@current-change="handleCurrentChange" :current-page="currentPage" /> @current-change="handleCurrentChange" :current-page="currentPage" />
...@@ -831,7 +831,8 @@ onMounted(() => { ...@@ -831,7 +831,8 @@ onMounted(() => {
.right { .right {
width: 1284px; width: 1284px;
height: 1670px; max-height: 1670px;
margin-bottom: 20px;
box-sizing: border-box; box-sizing: border-box;
border: 1px solid rgba(234, 236, 238, 1); border: 1px solid rgba(234, 236, 238, 1);
border-radius: 10px; border-radius: 10px;
...@@ -841,7 +842,7 @@ onMounted(() => { ...@@ -841,7 +842,7 @@ onMounted(() => {
.right-main { .right-main {
margin: 17px auto; margin: 17px auto;
width: 1209px; width: 1209px;
height: 1540px; max-height: 1540px;
.right-main-item { .right-main-item {
// height: 154px; // height: 154px;
......
...@@ -21,7 +21,10 @@ const getMultiLineChart = (dataX, dataY1, dataY2, dataY3) => { ...@@ -21,7 +21,10 @@ const getMultiLineChart = (dataX, dataY1, dataY2, dataY3) => {
legend: { legend: {
show: true, show: true,
top: 10, top: 10,
left:'10%' left:'10%',
textStyle: {
fontSize: 16
}
}, },
xAxis: [ xAxis: [
{ {
......
...@@ -14,13 +14,20 @@ const getPieChart = (data) => { ...@@ -14,13 +14,20 @@ const getPieChart = (data) => {
label: { label: {
alignTo: 'edge', alignTo: 'edge',
formatter: '{name|{b}}\n{time|{c} 条 {d}%}', formatter: '{name|{b}}\n{time|{c} 条 {d}%}',
minMargin: 5, minMargin: 10,
edgeDistance: 10, edgeDistance: 20,
lineHeight: 15, lineHeight: 24,
rich: { rich: {
name: {
fontSize: 16,
color: 'rgba(59, 65, 75, 1)',
fontFamily: 'Microsoft YaHei',
fontWeight: 700
},
time: { time: {
fontSize: 10, fontSize: 16,
color: '#999' color: 'rgba(95, 101, 108, 1)',
fontFamily: 'Microsoft YaHei',
} }
} }
}, },
......
...@@ -154,8 +154,8 @@ ...@@ -154,8 +154,8 @@
<div class="box3-main-left" id="box3Chart"></div> <div class="box3-main-left" id="box3Chart"></div>
<div class="box3-main-right"> <div class="box3-main-right">
<div class="box3-right-item" v-for="(item, index) in box3RightData" :key="index"> <div class="box3-right-item" v-for="(item, index) in box3RightData" :key="index">
<div class="icon"> <div class="icon" @click="handleClickPerson">
<img :src="item.imageUrl" alt="" /> <img :src="item.imageUrl?item.imageUrl:DefaultIcon1" alt="" />
</div> </div>
<div class="info"> <div class="info">
<div class="info-header"> <div class="info-header">
...@@ -188,6 +188,8 @@ import { ...@@ -188,6 +188,8 @@ import {
import { useRouter } from "vue-router"; import { useRouter } from "vue-router";
import DefaultIcon1 from '@/assets/icons/default-icon1.png'
const router = useRouter(); const router = useRouter();
import InfoImg from "./images/img.png"; import InfoImg from "./images/img.png";
import Icon1 from "./images/icon1.png"; import Icon1 from "./images/icon1.png";
...@@ -477,6 +479,17 @@ const handleGetThinkPerson = async () => { ...@@ -477,6 +479,17 @@ const handleGetThinkPerson = async () => {
} }
}; };
// 点击人物头像,跳转到人物主页
const handleClickPerson = () => {
const route = router.resolve({
path: "/characterPage",
query: {
type: 3 // 1 2 3
}
});
window.open(route.href, "_blank");
};
onMounted(() => { onMounted(() => {
handleGetThinkTankInfoBasic() handleGetThinkTankInfoBasic()
handleGetThinkTankInfoBranch() handleGetThinkTankInfoBranch()
...@@ -950,6 +963,7 @@ onMounted(() => { ...@@ -950,6 +963,7 @@ onMounted(() => {
width: 48px; width: 48px;
height: 48px; height: 48px;
margin-left: 8px; margin-left: 8px;
cursor: pointer;
img { img {
width: 100%; width: 100%;
......
...@@ -129,7 +129,7 @@ ...@@ -129,7 +129,7 @@
<div class="title">{{ box1Data[box1DataIndex]?.reportName }}</div> <div class="title">{{ box1Data[box1DataIndex]?.reportName }}</div>
<div class="tag-box"> <div class="tag-box">
<div class="tag" v-for="(item, index) in box1Data[box1DataIndex]?.industryVOList" :key="index"> <div class="tag" v-for="(item, index) in box1Data[box1DataIndex]?.industryVOList" :key="index">
{{ item }} {{ item.industryName }}
</div> </div>
</div> </div>
<div class="content">{{ box1Data[box1DataIndex]?.summary }}</div> <div class="content">{{ box1Data[box1DataIndex]?.summary }}</div>
...@@ -139,6 +139,7 @@ ...@@ -139,6 +139,7 @@
<div class="logo"> <div class="logo">
<img :src="box1Data[box1DataIndex]?.thinkTankImage" alt="" /> <img :src="box1Data[box1DataIndex]?.thinkTankImage" alt="" />
</div> </div>
<div class="text">{{ box1Data[box1DataIndex]?.thinkTankName }}</div>
<div class="text">{{ box1Data[box1DataIndex]?.reportDate }}</div> <div class="text">{{ box1Data[box1DataIndex]?.reportDate }}</div>
</div> </div>
</div> </div>
...@@ -168,7 +169,7 @@ ...@@ -168,7 +169,7 @@
{{ item.status || "一般风险" }} {{ item.status || "一般风险" }}
</div> </div>
<div class="item-right"> <div class="item-right">
<el-popover effect="dark" :content="item.title" placement="top-start"> <el-popover effect="dark" :width="500" :content="item.title" placement="top-start">
<template #reference> <template #reference>
<div class="text"> <div class="text">
{{ item.title }} {{ item.title }}
...@@ -201,7 +202,7 @@ ...@@ -201,7 +202,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(news)">
<div class="left"> <div class="left">
<img :src="news.newsImage !== null ? news.newsImage : defaultNewsIcon" /> <img :src="news.newsImage !== null ? news.newsImage : defaultNewsIcon" />
</div> </div>
...@@ -211,7 +212,7 @@ ...@@ -211,7 +212,7 @@
<div class="time">{{ news.newsOrg }}</div> <div class="time">{{ news.newsOrg }}</div>
</div> </div>
<el-popover effect="dark" :content="news.newsContent" placement="top-start"> <el-popover effect="dark" :width=700 :content="news.newsContent" placement="top-start">
<template #reference> <template #reference>
<div class="right-footer">{{ news.newsContent }}</div> <div class="right-footer">{{ news.newsContent }}</div>
</template> </template>
...@@ -242,7 +243,7 @@ ...@@ -242,7 +243,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.personImage ? item.personImage : defaultHeaderIcin" alt="" /> <img :src="item.personImage ? item.personImage : defaultHeaderIcin" alt="" />
</div> </div>
<div class="right"> <div class="right">
...@@ -325,14 +326,14 @@ ...@@ -325,14 +326,14 @@
:class="{ itemBold1: index === 0, itemBold2: index === 1, itemBold3: index === 2 }"> :class="{ itemBold1: index === 0, itemBold2: index === 1, itemBold3: index === 2 }">
{{ index + 1 }} {{ index + 1 }}
</div> </div>
<el-popover effect="dark" :content="item.clause" placement="top-start"> <!-- <el-popover effect="dark" :content="item.clause" placement="top-start">
<template #reference> <template #reference> -->
<div class="item-center" <div class="item-center"
:class="{ itemBold1: index === 0, itemBold2: index === 1, itemBold3: index === 2 }"> :class="{ itemBold1: index === 0, itemBold2: index === 1, itemBold3: index === 2 }">
{{ item.clause }} {{ item.clause }}
</div> </div>
</template> <!-- </template>
</el-popover> </el-popover> -->
<!-- <div class="item-right">{{ `${item.count}份报告 >` }}</div> --> <!-- <div class="item-right">{{ `${item.count}份报告 >` }}</div> -->
</div> </div>
...@@ -1420,6 +1421,34 @@ const handleToMoreRiskSignal = () => { ...@@ -1420,6 +1421,34 @@ const handleToMoreRiskSignal = () => {
window.open(route.href, "_blank"); window.open(route.href, "_blank");
}; };
// 查看更多新闻资讯
const handleToMoreNews = () => {
const route = router.resolve("/newsBrief");
window.open(route.href, "_blank");
};
// 点击人物头像,跳转到人物主页
const handleClickPerson = () => {
const route = router.resolve({
path: "/characterPage",
query: {
type: 3 // 1 2 3
}
});
window.open(route.href, "_blank");
};
// 点击新闻条目,跳转到新闻分析页
const handleToNewsAnalysis = news => {
const route = router.resolve({
path: "/newsAnalysis",
query: {
newsId: news.newsId
}
});
window.open(route.href, "_blank");
};
const handleToReportDetail = id => { const handleToReportDetail = id => {
const route = router.resolve({ const route = router.resolve({
name: "ReportDetail", name: "ReportDetail",
...@@ -2046,11 +2075,11 @@ onMounted(async () => { ...@@ -2046,11 +2075,11 @@ onMounted(async () => {
display: flex; display: flex;
justify-content: flex-end; justify-content: flex-end;
gap: 6px; gap: 6px;
height: 36px;
.logo { .logo {
margin-top: 5px; width: 36px;
width: 16px; height: 36px;
height: 16px;
img { img {
width: 100%; width: 100%;
...@@ -2059,6 +2088,7 @@ onMounted(async () => { ...@@ -2059,6 +2088,7 @@ onMounted(async () => {
} }
.text { .text {
margin-top: 6px;
height: 24px; height: 24px;
color: rgba(95, 101, 108, 1); color: rgba(95, 101, 108, 1);
font-family: Microsoft YaHei; font-family: Microsoft YaHei;
...@@ -2392,6 +2422,7 @@ onMounted(async () => { ...@@ -2392,6 +2422,7 @@ onMounted(async () => {
overflow: hidden; overflow: hidden;
text-overflow: ellipsis; text-overflow: ellipsis;
white-space: nowrap; white-space: nowrap;
cursor: pointer;
} }
} }
} }
...@@ -2529,6 +2560,9 @@ onMounted(async () => { ...@@ -2529,6 +2560,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%;
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论