提交 3ed377d1 authored 作者: 李智林's avatar 李智林

update

...@@ -353,6 +353,24 @@ export function getEntitiesCountBy50PercentRules( ...@@ -353,6 +353,24 @@ export function getEntitiesCountBy50PercentRules(
); );
} }
/**
* 获取前序事件
*/
// /entitiesDataInfo/precedingEvents
export function getPrecedingEvents(startTime = "2025-11-11", pageNum = 1, pageSize = 10) {
return request200(
request({
method: "POST",
url: "/api/entitiesDataInfo/precedingEvents",
data: {
sanctionDate: startTime,
pageNum,
pageSize
}
})
);
}
/** /**
* 领域分布查询 * 领域分布查询
*/ */
...@@ -745,3 +763,76 @@ export function getKeyListedEntityList(date, keyword = "") { ...@@ -745,3 +763,76 @@ export function getKeyListedEntityList(date, keyword = "") {
}) })
); );
} }
/**
* 获取科学仪器对美依赖数量
*/
export function getScientificInstrumentDependencyCount(orgIds = "12100000400012916R,121000004013595328,12100000435230200R") {
return request200(
request({
method: "GET",
url: "/api/instrument/getDependencyUS",
params: {
orgIds
}
})
);
}
/**
* 科学仪器近十年对美依赖度升高风险分析
* url: /instrument/getDependencyUSRisk
*/
export function getScientificInstrumentDependencyRisk() {
return request200(
request({
method: "GET",
url: "/api/instrument/getDependencyUSRisk"
})
);
}
/**
* 科学仪器近十年国产化数量统计
* url:/instrument/getLocalizationRisk
*/
export function getScientificInstrumentLocalizationRisk() {
return request200(
request({
method: "GET",
url: "/api/instrument/getLocalizationRisk"
})
);
}
/**
* 科学仪器进口国统计
* url: /instrument/getOriginCount
*/
export function getScientificInstrumentOriginCount(orgIds = "12100000400012916R,121000004013595328,12100000435230200R") {
return request200(
request({
method: "GET",
url: "/api/instrument/getOriginCount",
params: {
orgIds
}
})
);
}
/**
* 新增科研机构列表
* url: /entitiesDataInfo/scientificImpact/entityList
*/
export function getScientificImpactEntityList(startTime) {
return request200(
request({
method: "GET",
url: "/api/entitiesDataInfo/scientificImpact/entityList",
params: {
sanctionDate: startTime || "2025-11-11"
}
})
);
}
...@@ -106,7 +106,7 @@ ...@@ -106,7 +106,7 @@
<div class="home-main-header-item-box"> <div class="home-main-header-item-box">
<div class="item" v-for="(item, index) in govInsList" :key="index" @click="handleToInstitution(item)"> <div class="item" v-for="(item, index) in govInsList" :key="index" @click="handleToInstitution(item)">
<div class="item-left"> <div class="item-left">
<img :src="item.img?item.img: DefaultIcon2" alt="" /> <img :src="item.img ? item.img : DefaultIcon2" alt="" />
</div> </div>
<div class="item-right">{{ item.name }}</div> <div class="item-right">{{ item.name }}</div>
</div> </div>
...@@ -335,17 +335,15 @@ ...@@ -335,17 +335,15 @@
<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
<div class="btn"
class="btn" :class="{ btnActive: activeCate === cate.id }"
: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.name }}
{{ cate.name }} </div>
</div>
</div> </div>
<div class="select-box"> <div class="select-box">
<div class="paixu-btn" @click="handleSwithSort"> <div class="paixu-btn" @click="handleSwithSort">
...@@ -375,6 +373,7 @@ ...@@ -375,6 +373,7 @@
:key="time.id" :key="time.id"
v-model="activePubTime" v-model="activePubTime"
:label="time.id" :label="time.id"
style="width: 100px"
class="filter-checkbox" class="filter-checkbox"
> >
{{ time.name }} {{ time.name }}
...@@ -414,13 +413,13 @@ ...@@ -414,13 +413,13 @@
class="main-item" class="main-item"
v-for="(item, index) in curDecreeList" v-for="(item, index) in curDecreeList"
:key="index" :key="index"
@click="handleClickToDetail" @click="handleClickDecree(item)"
> >
<div class="main-item-left"> <div class="main-item-left">
<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 class="icon">
<img :src="item.orgImage?item.orgImage:DefaultIcon2" alt=""> <img :src="item.orgImage ? item.orgImage : DefaultIcon2" alt="" />
</div> </div>
<div class="line" v-if="index !== 9 && index !== totalDecreesNum - 1"></div> <div class="line" v-if="index !== 9 && index !== totalDecreesNum - 1"></div>
</div> </div>
...@@ -497,8 +496,8 @@ import getCalendarHeatChart from "./utils/cleandarHeat"; ...@@ -497,8 +496,8 @@ import getCalendarHeatChart from "./utils/cleandarHeat";
import setChart from "@/utils/setChart"; import setChart from "@/utils/setChart";
import DefaultIcon1 from '@/assets/icons/default-icon1.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 p1 from "./assets/images/iconp1.png"; import p1 from "./assets/images/iconp1.png";
import p2 from "./assets/images/iconp2.png"; import p2 from "./assets/images/iconp2.png";
...@@ -534,10 +533,8 @@ import Message3 from "./assets/images/message-icon3.png"; ...@@ -534,10 +533,8 @@ import Message3 from "./assets/images/message-icon3.png";
// 跳转行政机构主页 // 跳转行政机构主页
const handleToInstitution = item => { const handleToInstitution = item => {
if (item.name === "美国商务部") { const curRoute = router.resolve("/institution");
const curRoute = router.resolve("/institution"); window.open(curRoute.href, "_blank");
window.open(curRoute.href, "_blank");
}
}; };
// 返回首页 // 返回首页
...@@ -689,6 +686,17 @@ const handleClickToDetail = () => { ...@@ -689,6 +686,17 @@ const handleClickToDetail = () => {
window.open(route.href, "_blank"); window.open(route.href, "_blank");
}; };
// 点击政令库政令
const handleClickDecree = decree => {
const route = router.resolve({
path: "/decreeLayout",
query: {
id: decree.id
}
});
window.open(route.href, "_blank");
};
// 风险信号 // 风险信号
const warningList = ref([ const warningList = ref([
{ {
...@@ -780,7 +788,6 @@ const messageList = ref([ ...@@ -780,7 +788,6 @@ const messageList = ref([
// time: "14:49 · 发布于X", // time: "14:49 · 发布于X",
// content: `如果这个疯狂的支出法案获得通过,‘美国党’将在第二天成立。` // content: `如果这个疯狂的支出法案获得通过,‘美国党’将在第二天成立。`
// } // }
]); ]);
const handleGetMessage = async () => { const handleGetMessage = async () => {
const params = { const params = {
...@@ -854,7 +861,6 @@ const chart2Data = ref([ ...@@ -854,7 +861,6 @@ const chart2Data = ref([
// name: "人工智能", // name: "人工智能",
// value: 46 // value: 46
// }, // },
]); ]);
// const colorList = ["#69B1FF", "#FFC069", "#87E8DE", "#85A5FF", "#FF7875", "#B37FEB", "#4096FF"]; // const colorList = ["#69B1FF", "#FFC069", "#87E8DE", "#85A5FF", "#FF7875", "#B37FEB", "#4096FF"];
...@@ -892,7 +898,6 @@ const keyDecreeList = ref([ ...@@ -892,7 +898,6 @@ const keyDecreeList = ref([
// time: "2025年2月", // time: "2025年2月",
// content: `将中国列为“外国对手”,系统性收紧中美在半导体、人工智能、量子技术等前沿科技领域的双向投资,构建对华科技封锁体系。` // content: `将中国列为“外国对手”,系统性收紧中美在半导体、人工智能、量子技术等前沿科技领域的双向投资,构建对华科技封锁体系。`
// }, // },
]); ]);
const handleGetKeyDecree = async () => { const handleGetKeyDecree = async () => {
...@@ -1857,7 +1862,7 @@ onMounted(async () => { ...@@ -1857,7 +1862,7 @@ onMounted(async () => {
height: 402px; height: 402px;
overflow-y: auto; overflow-y: auto;
overflow-x: hidden; overflow-x: hidden;
padding-top: 6px; padding: 6px 0;
.box3-item { .box3-item {
display: flex; display: flex;
height: 77px; height: 77px;
...@@ -1967,7 +1972,7 @@ onMounted(async () => { ...@@ -1967,7 +1972,7 @@ onMounted(async () => {
height: 402px; height: 402px;
overflow-y: auto; overflow-y: auto;
box-sizing: border-box; box-sizing: border-box;
padding-top: 8px; padding-bottom: 8px;
.box4-main-item { .box4-main-item {
margin-top: 16px; margin-top: 16px;
display: flex; display: flex;
...@@ -2601,7 +2606,8 @@ onMounted(async () => { ...@@ -2601,7 +2606,8 @@ onMounted(async () => {
} }
} }
.box7-main { .box7-main {
height: 400px; margin-top: 10px;
height: 380px;
box-sizing: border-box; box-sizing: border-box;
overflow-y: auto; overflow-y: auto;
overflow-x: hidden; overflow-x: hidden;
...@@ -2731,32 +2737,31 @@ onMounted(async () => { ...@@ -2731,32 +2737,31 @@ onMounted(async () => {
display: flex; display: flex;
gap: 8px; gap: 8px;
white-space: nowrap; white-space: nowrap;
.btn { .btn {
min-width: min-content; min-width: min-content;
height: 42px; height: 42px;
color: rgba(95, 101, 108, 1); color: rgba(95, 101, 108, 1);
font-family: Microsoft YaHei; font-family: Microsoft YaHei;
font-size: 20px; font-size: 20px;
font-weight: 400; font-weight: 400;
line-height: 42px; line-height: 42px;
padding: 0 24px; padding: 0 24px;
border-radius: 21px; border-radius: 21px;
background: rgba(20, 89, 187, 0); background: rgba(20, 89, 187, 0);
cursor: pointer; cursor: pointer;
&:hover { &:hover {
background: rgba(20, 89, 187, 0.1); background: rgba(20, 89, 187, 0.1);
}
} }
.btnActive { }
font-weight: 700; .btnActive {
background: rgba(20, 89, 187, 1); font-weight: 700;
background: rgba(20, 89, 187, 1);
color: #fff;
&:hover {
color: #fff; color: #fff;
&:hover { background: rgba(20, 89, 187, 1);
color: #fff;
background: rgba(20, 89, 187, 1);
}
} }
}
} }
.select-box { .select-box {
margin-top: 5px; margin-top: 5px;
...@@ -2919,7 +2924,7 @@ onMounted(async () => { ...@@ -2919,7 +2924,7 @@ onMounted(async () => {
height: 24px; height: 24px;
border-radius: 12px; border-radius: 12px;
overflow: hidden; overflow: hidden;
img{ img {
width: 100%; width: 100%;
height: 100%; height: 100%;
} }
......
[ [
{ {
"id": 86, "name": "美国",
"name": "人工智能", "count": 0.37960339943342775
"nameZh": "人工智能", },
"description": null, {
"parentId": null, "name": "德国",
"isMainBranch": "Y", "count": 0.20113314447592068
"children": null },
{
"name": "日本",
"count": 0.1558073654390935
} }
] ]
\ No newline at end of file
...@@ -99,6 +99,13 @@ import college9 from "../../assets/images/college9.png"; ...@@ -99,6 +99,13 @@ import college9 from "../../assets/images/college9.png";
import college10 from "../../assets/images/college10.png"; import college10 from "../../assets/images/college10.png";
import college11 from "../../assets/images/college11.png"; import college11 from "../../assets/images/college11.png";
import { getHorizontalBarChart1, getPieOption2, getMultipleLineChart } from "../../utils/charts"; import { getHorizontalBarChart1, getPieOption2, getMultipleLineChart } from "../../utils/charts";
import {
getScientificImpactEntityList,
getScientificInstrumentDependencyCount,
getScientificInstrumentDependencyRisk,
getScientificInstrumentLocalizationRisk,
getScientificInstrumentOriginCount
} from "@/api/exportControl";
const selectOptions = [ const selectOptions = [
{ {
value: 1, value: 1,
...@@ -170,39 +177,153 @@ const horizontalBarOptions = shallowRef({}); ...@@ -170,39 +177,153 @@ const horizontalBarOptions = shallowRef({});
const pieOptions2 = shallowRef({}); const pieOptions2 = shallowRef({});
const multipleLineOptions1 = shallowRef({}); const multipleLineOptions1 = shallowRef({});
const multipleLineOptions2 = shallowRef({}); const multipleLineOptions2 = shallowRef({});
onMounted(() => { // 获取仪器对美依赖度升高风险分析数据
horizontalBarOptions.value = getHorizontalBarChart1( const fetchDependencyRiskData = async () => {
["地球探测仪器", "计算机及其配套设备", "天文仪器", "分析仪器", "核仪器", "物理性能测试仪器", "医学科研仪器"], try {
[10, 10, 21, 25, 79, 95, 109], const data = await getScientificInstrumentDependencyRisk();
false if (data && data.instrumentCountList && Array.isArray(data.instrumentCountList)) {
); // 提取年份数据(去重并排序)
pieOptions2.value = getPieOption2([ const allYears = [...new Set(data.instrumentCountList.flatMap(item => item.countList.map(c => c.year)))].sort();
{ name: "美国", value: 27 },
{ name: "日本", value: 22 }, // 转换数据格式以适应 getMultipleLineChart
{ name: "德国", value: 18 }, const chartData = data.instrumentCountList.map(item => {
{ name: "英国", value: 15 }, // 为每个仪器类型创建完整的年份数据序列
{ name: "韩国", value: 12 }, const values = allYears.map(year => {
{ name: "荷兰", value: 8 }, const yearData = item.countList.find(c => c.year === year);
{ name: "其他", value: 7 } return yearData ? yearData.count : 0;
]); });
multipleLineOptions1.value = getMultipleLineChart({
dates: ["2016", "2017", "2018", "2019", "2020", "2021", "2022", "2023", "2024", "2025"], return {
data: [ name: item.name,
{ name: "电子测量仪器", value: [45, 35, 25, 20, 20, 14, 15, 15, 23, 21] }, value: values
{ name: "分析仪器", value: [35, 33, 24, 21, 22, 18, 13, 19, 21, 31] }, };
{ name: "工艺试验仪器", value: [32, 22, 12, 11, 14, 15, 17, 13, 12, 26] }, });
{ name: "核仪器", value: [48, 38, 28, 28, 28, 18, 18, 18, 28, 28] }
] // 使用 getMultipleLineChart 生成图表配置
}); multipleLineOptions1.value = getMultipleLineChart({
multipleLineOptions2.value = getMultipleLineChart({ dates: allYears.map(String), // 转换为字符串以匹配原数据格式
dates: ["2016", "2017", "2018", "2019", "2020", "2021", "2022", "2023", "2024", "2025"], data: chartData
data: [ });
{ name: "电子测量仪器", value: [45, 35, 25, 20, 20, 14, 15, 15, 23, 21] }, }
{ name: "分析仪器", value: [35, 33, 24, 21, 22, 18, 13, 19, 21, 31] }, } catch (error) {
{ name: "工艺试验仪器", value: [32, 22, 12, 11, 14, 15, 17, 13, 12, 26] }, console.error("获取仪器对美依赖度升高风险分析数据失败:", error);
{ name: "核仪器", value: [48, 38, 28, 28, 28, 18, 18, 18, 28, 28] } }
] };
});
// 获取仪器国产化降低风险分析数据
const fetchLocalizationRiskData = async () => {
try {
const data = await getScientificInstrumentLocalizationRisk();
if (data && data.instrumentCountList && Array.isArray(data.instrumentCountList)) {
// 提取年份数据(去重并排序)
const allYears = [...new Set(data.instrumentCountList.flatMap(item => item.countList.map(c => c.year)))].sort();
// 转换数据格式以适应 getMultipleLineChart
const chartData = data.instrumentCountList.map(item => {
// 为每个仪器类型创建完整的年份数据序列
const values = allYears.map(year => {
const yearData = item.countList.find(c => c.year === year);
return yearData ? yearData.count : 0;
});
return {
name: item.name,
value: values
};
});
// 使用 getMultipleLineChart 生成图表配置
multipleLineOptions2.value = getMultipleLineChart({
dates: allYears.map(String), // 转换为字符串以匹配原数据格式
data: chartData
});
}
} catch (error) {
console.error("获取仪器国产化降低风险分析数据失败:", error);
}
};
// 获取各类别仪器对美依赖情况数据
const fetchDependencyCountData = async () => {
try {
const data = await getScientificInstrumentDependencyCount();
if (data && Array.isArray(data)) {
// 按照 count 降序排列
const sortedData = data.sort((a, b) => a.count - b.count);
// 提取仪器名称和对应的计数
const names = sortedData.map(item => item.name);
const counts = sortedData.map(item => item.count);
// 使用 getHorizontalBarChart1 生成图表配置
horizontalBarOptions.value = getHorizontalBarChart1(names, counts, false);
}
} catch (error) {
console.error("获取各类别仪器对美依赖情况数据失败:", error);
}
};
// 获取仪器进口国可替代性分析数据
const fetchOriginCountData = async () => {
try {
const data = await getScientificInstrumentOriginCount();
if (data && Array.isArray(data)) {
// 转换数据格式以适应 getPieOption2
// 数据结构应该是 [{ name: "国家名", value: 数量 }]
const pieData = data.map(item => ({
name: item.name,
value: (item.count * 100).toFixed(1)
}));
// 使用 getPieOption2 生成图表配置
pieOptions2.value = getPieOption2(pieData);
}
} catch (error) {
console.error("获取仪器进口国可替代性分析数据失败:", error);
}
};
onMounted(async () => {
// horizontalBarOptions.value = getHorizontalBarChart1(
// ["地球探测仪器", "计算机及其配套设备", "天文仪器", "分析仪器", "核仪器", "物理性能测试仪器", "医学科研仪器"],
// [10, 10, 21, 25, 79, 95, 109],
// false
// );
// pieOptions2.value = getPieOption2([
// { name: "美国", value: 27 },
// { name: "日本", value: 22 },
// { name: "德国", value: 18 },
// { name: "英国", value: 15 },
// { name: "韩国", value: 12 },
// { name: "荷兰", value: 8 },
// { name: "其他", value: 7 }
// ]);
// multipleLineOptions1.value = getMultipleLineChart({
// dates: ["2016", "2017", "2018", "2019", "2020", "2021", "2022", "2023", "2024", "2025"],
// data: [
// { name: "电子测量仪器", value: [45, 35, 25, 20, 20, 14, 15, 15, 23, 21] },
// { name: "分析仪器", value: [35, 33, 24, 21, 22, 18, 13, 19, 21, 31] },
// { name: "工艺试验仪器", value: [32, 22, 12, 11, 14, 15, 17, 13, 12, 26] },
// { name: "核仪器", value: [48, 38, 28, 28, 28, 18, 18, 18, 28, 28] }
// ]
// });
// multipleLineOptions2.value = getMultipleLineChart({
// dates: ["2016", "2017", "2018", "2019", "2020", "2021", "2022", "2023", "2024", "2025"],
// data: [
// { name: "电子测量仪器", value: [45, 35, 25, 20, 20, 14, 15, 15, 23, 21] },
// { name: "分析仪器", value: [35, 33, 24, 21, 22, 18, 13, 19, 21, 31] },
// { name: "工艺试验仪器", value: [32, 22, 12, 11, 14, 15, 17, 13, 12, 26] },
// { name: "核仪器", value: [48, 38, 28, 28, 28, 18, 18, 18, 28, 28] }
// ]
// });
// 获取各类别仪器对美依赖情况数据
await fetchDependencyCountData();
// 获取仪器进口国可替代性分析数据
await fetchOriginCountData();
// 获取仪器对美依赖度升高风险分析数据
await fetchDependencyRiskData();
// 获取仪器国产化降低风险分析数据
await fetchLocalizationRiskData();
}); });
</script> </script>
......
...@@ -12,7 +12,7 @@ ...@@ -12,7 +12,7 @@
<div class="item" v-for="(item, index) in listData" :key="index" @click="handleEttClick(item)"> <div class="item" v-for="(item, index) in listData" :key="index" @click="handleEttClick(item)">
<div class="index" :class="{ isTopTen: index < 10 }">{{ index + 1 }}</div> <div class="index" :class="{ isTopTen: index < 10 }">{{ index + 1 }}</div>
<div class="name">{{ item.name || item.nameEn }}</div> <div class="name">{{ item.name || item.nameEn }}</div>
<div class="icon" :class="{ iconUp: item.isUp, iconDown: !item.isUp }"></div> <div class="icon" :class="{ iconUp: item.marketChange > 0, iconDown: item.marketChange < 0 }"></div>
</div> </div>
</div> </div>
</div> </div>
......
...@@ -186,12 +186,12 @@ const fetchEntityFinancing = async () => { ...@@ -186,12 +186,12 @@ const fetchEntityFinancing = async () => {
// 按日期排序 // 按日期排序
const sortedData = data const sortedData = data
.sort((a, b) => { .sort((a, b) => {
return new Date(a.name) - new Date(b.name); return new Date(a.year) - new Date(b.year);
}) })
.filter((item, idx) => idx % 3 === 0); .filter((item, idx) => idx % 3 === 0);
// 提取 x 轴数据(日期) // 提取 x 轴数据(日期)
const xAxisData = sortedData.map(item => item.name); const xAxisData = sortedData.map(item => item.year);
// 提取 y 轴数据(融资数量) // 提取 y 轴数据(融资数量)
const seriesData = sortedData.map(item => item.count); const seriesData = sortedData.map(item => item.count);
......
...@@ -30,7 +30,7 @@ onMounted(async () => { ...@@ -30,7 +30,7 @@ onMounted(async () => {
.filter(item => item.count > 0) .filter(item => item.count > 0)
.map(item => { .map(item => {
return { return {
name: item?.domain, name: item?.name,
value: item?.count value: item?.count
}; };
}) })
......
<template> <template>
<div class="message-bubble"> <div class="message-bubble">
<div class="avatar-container" @click="handleClick"> <div class="avatar-container" @click="handleClick">
<img :src="avatar" :alt="name" class="avatar" /> <img :src="avatar || avatarUser" :alt="name" class="avatar" />
</div> </div>
<div class="bubble-container"> <div class="bubble-container">
<div class="bubble"> <div class="bubble">
...@@ -19,6 +19,8 @@ ...@@ -19,6 +19,8 @@
</template> </template>
<script setup> <script setup>
import avatarUser from "@/assets/images/avatar_user.png";
const emit = defineEmits(["click", "info-click"]); const emit = defineEmits(["click", "info-click"]);
defineProps({ defineProps({
avatar: { avatar: {
......
...@@ -220,7 +220,7 @@ ...@@ -220,7 +220,7 @@
<template #default> <template #default>
<div class="news-list"> <div class="news-list">
<NewsList :list-data="newsList" @click="handleNewsInfoClick" /> <NewsList :list-data="newsList" @item-click="item => handleNewsInfoClick(item)" />
</div> </div>
</template> </template>
</custom-container> </custom-container>
...@@ -321,7 +321,7 @@ ...@@ -321,7 +321,7 @@
</div> </div>
<div class="box3-content"> <div class="box3-content">
<div class="box3-content-title">商业管制清单(CCL)更新频度</div> <div class="box3-content-title">商业管制清单(CCL)更新频度</div>
<el-table :data="tableData1" stripe style="width: 100%"> <el-table :data="tableData2" stripe style="width: 100%">
<el-table-column prop="year" label="年份" width="150" /> <el-table-column prop="year" label="年份" width="150" />
<el-table-column label="发布次数" width="200"> <el-table-column label="发布次数" width="200">
<template #default="scope"> <template #default="scope">
...@@ -694,6 +694,7 @@ import _ from "lodash"; ...@@ -694,6 +694,7 @@ import _ from "lodash";
const handleCompClick = item => { const handleCompClick = item => {
console.log("item", item); console.log("item", item);
if (item.entityType != 2) return;
const route = router.resolve({ const route = router.resolve({
path: "/companyPages", path: "/companyPages",
query: { query: {
...@@ -712,6 +713,8 @@ const trendOption = ref({}); ...@@ -712,6 +713,8 @@ const trendOption = ref({});
const trendChecked = ref(false); const trendChecked = ref(false);
// 发布频度 // 发布频度
const tableData1 = ref([]); const tableData1 = ref([]);
// CCL发布频度
const tableData2 = ref([]);
// 历次制裁过程 // 历次制裁过程
const sanctionProcessList = ref([]); const sanctionProcessList = ref([]);
const sanctionPage = ref(1); const sanctionPage = ref(1);
...@@ -727,10 +730,11 @@ const newsList = ref([]); ...@@ -727,10 +730,11 @@ const newsList = ref([]);
onMounted(async () => { onMounted(async () => {
try { try {
const [dataCount, entitiesDataInfo, industryCountByYear, countDomainByYear] = await Promise.all([ const [dataCount, entitiesDataInfo, industryCountByYear,cclList, countDomainByYear] = await Promise.all([
getEntitiesDataCount(), getEntitiesDataCount(),
getEntitiesDataInfo(), getEntitiesDataInfo(),
getIndustryCountByYear(1), getIndustryCountByYear(1),
getIndustryCountByYear(13),
getCountDomainByYear(trendChecked.value) getCountDomainByYear(trendChecked.value)
]); ]);
// 交换第二个和第三个元素 // 交换第二个和第三个元素
...@@ -742,6 +746,7 @@ onMounted(async () => { ...@@ -742,6 +746,7 @@ onMounted(async () => {
}); });
entitiesDataInfoList.value = entitiesDataInfo || []; entitiesDataInfoList.value = entitiesDataInfo || [];
const list = _.chain(industryCountByYear).filter("year").orderBy("year", "desc").value(); const list = _.chain(industryCountByYear).filter("year").orderBy("year", "desc").value();
const cclList1 = _.chain(cclList).filter("year").orderBy("year", "desc").value();
const total = _.sumBy(list, "count"); const total = _.sumBy(list, "count");
tableData1.value = _.map(list, item => { tableData1.value = _.map(list, item => {
return { return {
...@@ -751,6 +756,14 @@ onMounted(async () => { ...@@ -751,6 +756,14 @@ onMounted(async () => {
tags: item.domain tags: item.domain
}; };
}).slice(0, 5); }).slice(0, 5);
tableData2.value = _.map(cclList1, item => {
return {
year: item.year,
num: item.count,
percent: item.count / total,
tags: item.domain
};
}).slice(0, 5);
console.log("countDomainByYear", countDomainByYear); console.log("countDomainByYear", countDomainByYear);
// 整理柱状图数据并应用到趋势图 // 整理柱状图数据并应用到趋势图
if (countDomainByYear && countDomainByYear[0].yearDomainCount) { if (countDomainByYear && countDomainByYear[0].yearDomainCount) {
...@@ -1194,6 +1207,7 @@ const fetchNewsInfo = async () => { ...@@ -1194,6 +1207,7 @@ const fetchNewsInfo = async () => {
const data = await getNewsInfo(); const data = await getNewsInfo();
if (data && Array.isArray(data)) { if (data && Array.isArray(data)) {
newsList.value = data.map(item => ({ newsList.value = data.map(item => ({
...item,
avatar: item.newsImage, avatar: item.newsImage,
name: item.newsTitle, name: item.newsTitle,
time: formatTime(item.newsDate), time: formatTime(item.newsDate),
...@@ -1439,7 +1453,7 @@ const handleNewsInfoClick = item => { ...@@ -1439,7 +1453,7 @@ const handleNewsInfoClick = item => {
const route = router.resolve({ const route = router.resolve({
path: "/newsAnalysis", path: "/newsAnalysis",
query: { query: {
newsId: item.id newsId: item.newsId
} }
}); });
window.open(route.href, "_blank"); window.open(route.href, "_blank");
...@@ -1887,10 +1901,14 @@ const handleMediaClick = item => { ...@@ -1887,10 +1901,14 @@ const handleMediaClick = item => {
} }
.home-wrapper { .home-wrapper {
width: 100%;
height: calc(100vh - 96px);
position: relative;
overflow-y: hidden;
.home-main { .home-main {
// width: 1400px; width: 100%;
padding: 0 5%; height: 100%;
margin: 0 auto; overflow-y: auto;
background: url("./assets/images/background.png"); background: url("./assets/images/background.png");
background-size: 100% 100%; background-size: 100% 100%;
.home-main-header { .home-main-header {
......
...@@ -139,6 +139,7 @@ export function getPieOption2(data, title) { ...@@ -139,6 +139,7 @@ export function getPieOption2(data, title) {
} }
}, },
legend: { legend: {
type: "scroll",
icon: "rect", icon: "rect",
top: "center", top: "center",
right: "40", right: "40",
...@@ -825,6 +826,7 @@ export const getMultipleLineChart = obj => { ...@@ -825,6 +826,7 @@ export const getMultipleLineChart = obj => {
containLabel: true containLabel: true
}, },
legend: { legend: {
type: "scroll",
right: "5%", right: "5%",
icon: "circle", icon: "circle",
itemWidth: 15, itemWidth: 15,
...@@ -835,7 +837,7 @@ export const getMultipleLineChart = obj => { ...@@ -835,7 +837,7 @@ export const getMultipleLineChart = obj => {
}, },
itemGap: 17, itemGap: 17,
data: obj.data.map((item, index) => { data: obj.data.map((item, index) => {
return { name: item.name, itemStyle: { color: color[index] } }; return { name: item.name, itemStyle: { color: color[index % 4] } };
}) })
}, },
xAxis: { xAxis: {
......
...@@ -1698,10 +1698,14 @@ onMounted(async () => { ...@@ -1698,10 +1698,14 @@ onMounted(async () => {
} }
.home-wrapper { .home-wrapper {
width: 100%;
height: calc(100vh - 96px);
position: relative;
overflow-y: hidden;
.home-main { .home-main {
// width: 1400px; width: 100%;
padding: 0 5%; height: 100%;
margin: 0 auto; overflow-y: auto;
background: url("./assets/images/background.png"); background: url("./assets/images/background.png");
background-size: 100% 100%; background-size: 100% 100%;
.home-main-header { .home-main-header {
......
...@@ -351,8 +351,7 @@ ...@@ -351,8 +351,7 @@
:value="item.value" :value="item.value"
/> />
</el-select> </el-select>
</div> </div>
</div> </div>
</div> </div>
<div class="center-footer-layout"> <div class="center-footer-layout">
...@@ -405,6 +404,7 @@ ...@@ -405,6 +404,7 @@
</div> </div>
</div> </div>
<div class="home-main-footer-main"> <div class="home-main-footer-main">
<div class="footer-main-item" v-for="item in universityList" :key="item.name" @click="handleClickToDetail"> <div class="footer-main-item" v-for="item in universityList" :key="item.name" @click="handleClickToDetail">
<img :src="item.pic" style="height: 32px; width: 32px;" /> <img :src="item.pic" style="height: 32px; width: 32px;" />
<div class="item-text">{{ item.name }}</div> <div class="item-text">{{ item.name }}</div>
...@@ -894,7 +894,6 @@ onMounted(async () => { ...@@ -894,7 +894,6 @@ onMounted(async () => {
let chart1 = getPieChart(chart1Data.value, colorList); let chart1 = getPieChart(chart1Data.value, colorList);
setChart(chart1, "chart1"); setChart(chart1, "chart1");
}); });
</script> </script>
......
...@@ -1070,10 +1070,14 @@ onMounted(async () => { ...@@ -1070,10 +1070,14 @@ onMounted(async () => {
box-shadow: none; box-shadow: none;
} }
.home-wrapper { .home-wrapper {
width: 100%;
height: calc(100vh - 96px);
position: relative;
overflow-y: hidden;
.home-main { .home-main {
// width: 1400px;
width: 100%; width: 100%;
margin: 0 auto; height: 100%;
overflow-y: auto;
background: url("./assets/images/background.png"); background: url("./assets/images/background.png");
background-size: 100% 100%; background-size: 100% 100%;
.home-main-header { .home-main-header {
...@@ -1217,7 +1221,7 @@ onMounted(async () => { ...@@ -1217,7 +1221,7 @@ onMounted(async () => {
right: 19px; right: 19px;
width: 6px; width: 6px;
height: 12px; height: 12px;
img{ img {
width: 100%; width: 100%;
height: 100%; height: 100%;
} }
......
...@@ -100,10 +100,13 @@ ...@@ -100,10 +100,13 @@
</div> </div>
<div class="box2-main"> <div class="box2-main">
<div class="box2-main-item" v-for="(item, index) in warningList" :key="index"> <div class="box2-main-item" v-for="(item, index) in warningList" :key="index">
<div class="item-left" :class="{ <div
itemLeftStatus1: item.status === '一般风险', class="item-left"
itemLeftStatus2: item.status === '重大风险' :class="{
}"> itemLeftStatus1: item.status === '一般风险',
itemLeftStatus2: item.status === '重大风险'
}"
>
{{ item.status }} {{ item.status }}
</div> </div>
<div class="item-right"> <div class="item-right">
...@@ -131,14 +134,18 @@ ...@@ -131,14 +134,18 @@
<img src="./assets/images/TechnologyFigures-icon3.png" alt="" /> <img src="./assets/images/TechnologyFigures-icon3.png" alt="" />
</div> </div>
<!-- <div class="box3-header-title">{{ "人物动向" }}</div> --> <!-- <div class="box3-header-title">{{ "人物动向" }}</div> -->
<div class="header-title" <div
style="width: 1560px; display: flex; justify-content: space-between; margin-top: 10px"> class="header-title"
style="width: 1560px; display: flex; justify-content: space-between; margin-top: 10px"
>
<div class="box3-header-title"> <div class="box3-header-title">
{{ "人物动向" }} {{ "人物动向" }}
</div> </div>
<div style="display: flex; gap: 8px; margin-right: 12px"> <div style="display: flex; gap: 8px; margin-right: 12px">
<div v-for="value in peoDateList" <div
:class="peoDate !== value ? 'btn-box-samll' : 'btn-box-select-samll'"> v-for="value in peoDateList"
:class="peoDate !== value ? 'btn-box-samll' : 'btn-box-select-samll'"
>
{{ value }} {{ value }}
</div> </div>
</div> </div>
...@@ -154,14 +161,18 @@ ...@@ -154,14 +161,18 @@
<div class="header-icon"> <div class="header-icon">
<img src="./assets/images/header-message.png" alt="" /> <img src="./assets/images/header-message.png" alt="" />
</div> </div>
<div class="header-title" <div
style="width: 1595px; display: flex; justify-content: space-between; margin-top: 10px"> class="header-title"
style="width: 1595px; display: flex; justify-content: space-between; margin-top: 10px"
>
<div> <div>
{{ "重要人物言论及立场" }} {{ "重要人物言论及立场" }}
</div> </div>
<div style="display: flex; gap: 8px; margin-right: 12px"> <div style="display: flex; gap: 8px; margin-right: 12px">
<div v-for="value in fields" <div
:class="fieldSelect !== value ? 'btn-box-samll' : 'btn-box-select-samll'"> v-for="value in fields"
:class="fieldSelect !== value ? 'btn-box-samll' : 'btn-box-select-samll'"
>
{{ value }} {{ value }}
</div> </div>
</div> </div>
...@@ -178,18 +189,33 @@ ...@@ -178,18 +189,33 @@
<div class="box5-header"> <div class="box5-header">
<div class="box5-header-left"> <div class="box5-header-left">
<div class="box5-header-icon"> <div class="box5-header-icon">
<img src="./assets/images/TechnologyFigures-icon1.png" alt="" <img
style="margin: 13px 21px 13px 21px; height: 22px" /> src="./assets/images/TechnologyFigures-icon1.png"
alt=""
style="margin: 13px 21px 13px 21px; height: 22px"
/>
<div class="box5-header-title">{{ "科技人物观点词云" }}</div> <div class="box5-header-title">{{ "科技人物观点词云" }}</div>
</div> </div>
<div> <div>
<div style="height: 45px; display: flex; align-items: center"> <div style="height: 45px; display: flex; align-items: center">
<el-select v-model="wordCloudvalue" style="width: 120px; height: 28px"> <el-select v-model="wordCloudvalue" style="width: 120px; height: 28px">
<el-option v-for="item in yearList" :key="item.value" :label="item.label" :value="item.value" /> <el-option
v-for="item in yearList"
:key="item.value"
:label="item.label"
:value="item.value"
/>
</el-select> </el-select>
<el-select v-model="wordCloudfield" style="width: 120px; height: 28px; margin: 10px 24px 10px 5px"> <el-select
<el-option v-for="item in fieldSelect" :key="item.value" :label="item.label" v-model="wordCloudfield"
:value="item.value" /> style="width: 120px; height: 28px; margin: 10px 24px 10px 5px"
>
<el-option
v-for="item in fieldSelect"
:key="item.value"
:label="item.label"
:value="item.value"
/>
</el-select> </el-select>
</div> </div>
</div> </div>
...@@ -202,17 +228,22 @@ ...@@ -202,17 +228,22 @@
<div class="header-icon"> <div class="header-icon">
<img src="./assets/images/box3-header-icon.png" alt="" /> <img src="./assets/images/box3-header-icon.png" alt="" />
</div> </div>
<div class="header-title" <div
style="display: flex; width: 740px; justify-content: space-between; align-items: center"> class="header-title"
style="display: flex; width: 740px; justify-content: space-between; align-items: center"
>
<div> <div>
{{ "科技人物观点涉及领域变化趋势" }} {{ "科技人物观点涉及领域变化趋势" }}
</div> </div>
<el-select v-model="areaSelect" style="width: 120px; height: 28px"> <el-select v-model="areaSelect" style="width: 120px; height: 28px">
<el-option v-for="item in options" :key="item.value" :label="item.label" :value="item.value" /> <el-option
v-for="item in options"
:key="item.value"
:label="item.label"
:value="item.value"
/>
</el-select> </el-select>
</div> </div>
</div> </div>
<div class="box6-main" id="box6Chart"></div> <div class="box6-main" id="box6Chart"></div>
...@@ -238,16 +269,22 @@ ...@@ -238,16 +269,22 @@
</div> </div>
<div style="display: flex; width: 730px; justify-content: space-between; align-items: center"> <div style="display: flex; width: 730px; justify-content: space-between; align-items: center">
<div class="box8-header-title">{{ "主要人物涉华观点统计" }}</div> <div class="box8-header-title">{{ "主要人物涉华观点统计" }}</div>
<div style="gap: 8px;display: flex;"> <div style="gap: 8px; display: flex">
<div v-for="value in viewOption" <div
:class="viewSelect !== value ? 'btn-box-samll' : 'btn-box-select-samll'"> v-for="value in viewOption"
:class="viewSelect !== value ? 'btn-box-samll' : 'btn-box-select-samll'"
>
{{ value }} {{ value }}
</div> </div>
<el-select v-model="wordCloudvalue" style="width: 120px; height: 28px; margin-top: -5px;"> <el-select v-model="wordCloudvalue" style="width: 120px; height: 28px; margin-top: -5px">
<el-option v-for="item in yearList" :key="item.value" :label="item.label" :value="item.value" /> <el-option
v-for="item in yearList"
:key="item.value"
:label="item.label"
:value="item.value"
/>
</el-select> </el-select>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
...@@ -262,8 +299,13 @@ ...@@ -262,8 +299,13 @@
<DivideHeader id="position4" class="divide-header" :titleText="'资源库'"></DivideHeader> <DivideHeader id="position4" class="divide-header" :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" :class="{ btnActive: activeCate === cate }" v-for="(cate, index) in categoryList" <div
:key="index" @click="handleClickCate(cate)"> class="btn"
:class="{ btnActive: activeCate === cate }"
v-for="(cate, index) in categoryList"
:key="index"
@click="handleClickCate(cate)"
>
{{ cate }} {{ cate }}
</div> </div>
</div> </div>
...@@ -438,13 +480,22 @@ onMounted(() => { ...@@ -438,13 +480,22 @@ onMounted(() => {
} }
.home-wrapper { .home-wrapper {
width: 100%;
height: calc(100vh - 96px);
position: relative;
overflow-y: hidden;
.home-main { .home-main {
width: 1920px; // width: 1920px;
margin: 0 auto; // margin: 0 auto;
// background: url("./assets/images/background.png");
// background-repeat: no-repeat;
// background-color: #fff;
// background-size: contain;
width: 100%;
height: 100%;
overflow-y: auto;
background: url("./assets/images/background.png"); background: url("./assets/images/background.png");
background-repeat: no-repeat; background-size: 100% 100%;
background-color: #fff;
background-size: contain;
.home-main-header { .home-main-header {
display: flex; display: flex;
......
差异被折叠。
差异被折叠。
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论