提交 62317e7e authored 作者: 张伊明's avatar 张伊明
...@@ -391,6 +391,7 @@ body { ...@@ -391,6 +391,7 @@ body {
.navbar { .navbar {
width: 100%; width: 100%;
height: 64px; height: 64px;
border-bottom: 1px solid rgba(234, 236, 238, 1);
box-shadow: 0px 0px 20px 0px rgba(25, 69, 130, 0.1); box-shadow: 0px 0px 20px 0px rgba(25, 69, 130, 0.1);
background: linear-gradient(180deg, rgba(246, 250, 255, 0.8) 0%, rgba(255, 255, 255, 0.8) 100%); background: linear-gradient(180deg, rgba(246, 250, 255, 0.8) 0%, rgba(255, 255, 255, 0.8) 100%);
.nav-content { .nav-content {
...@@ -680,6 +681,7 @@ body { ...@@ -680,6 +681,7 @@ body {
position: absolute; position: absolute;
top: 132px; top: 132px;
right: 0; right: 0;
z-index: 10000000000000;
.item { .item {
width: 108px; width: 108px;
height: 40px; height: 40px;
......
...@@ -77,9 +77,34 @@ export function getUSGovernmentSanctionHistory(params) { ...@@ -77,9 +77,34 @@ export function getUSGovernmentSanctionHistory(params) {
/** /**
* @header token * @header token
*/ */
export function getDepartmentList() { export function getDepartmentList(params) {
return request({ return request({
method: 'GET', method: 'GET',
url: `/api/organization/summaryDepartList` url: `/api/organization/summaryDepartList`,
params
})
}
// 全政府-获取制裁手段数据
/**
* @params {orgId}
*/
export function getSanTypeList(params) {
return request({
method: 'GET',
url: `/api/rivalryIndex/sanTypeList`,
params
})
}
// 全政府-获取未来三个月内的打压遏制时间线
/**
* @params {field}
*/
export function getThreeMonthSanctionProcess(params) {
return request({
method: 'GET',
url: `/api/rivalryIndex/nextThreeMonthSanctionProcess`,
params
}) })
} }
\ No newline at end of file
...@@ -277,7 +277,7 @@ import { ...@@ -277,7 +277,7 @@ import {
getDomainContainmentRanking, getDomainContainmentRanking,
getDomainContainmentTimeline getDomainContainmentTimeline
} from "@/api/zmOverview/allDomains"; } from "@/api/zmOverview/allDomains";
import { getUSGovernmentLatestDynamic, getDepartmentList } from "@/api/allGovernment.js"; import { getUSGovernmentLatestDynamic, getDepartmentList, getSanTypeList, } from "@/api/allGovernment.js";
const router = useRouter(); const router = useRouter();
...@@ -286,27 +286,48 @@ const deptValue = ref(""); ...@@ -286,27 +286,48 @@ const deptValue = ref("");
const methodValue = ref(""); const methodValue = ref("");
const departmentList = ref([]); const departmentList = ref([]);
const methodOptions = ref([ const methodOptions = ref([
{ label: "全部制裁手段", value: "" }, // { label: "全部制裁手段", value: "" },
{ label: "法案", value: "-1" }, // { label: "法案", value: "-1" },
{ label: "政令", value: "-2" }, // { label: "政令", value: "-2" },
{ label: "实体清单", value: "1" }, // { label: "实体清单", value: "1" },
{ label: "特别国民指定清单", value: "2" }, // { label: "特别国民指定清单", value: "2" },
{ label: "涉军企业", value: "3" }, // { label: "涉军企业", value: "3" },
{ label: "行业制裁识别清单", value: "4" }, // { label: "行业制裁识别清单", value: "4" },
{ label: "无法核实清单", value: "5" }, // { label: "无法核实清单", value: "5" },
{ label: "军事最终用户清单", value: "6" }, // { label: "军事最终用户清单", value: "6" },
{ label: "非SDN中国军工企业名单", value: "7" }, // { label: "非SDN中国军工企业名单", value: "7" },
{ label: "拒绝往来人员清单", value: "8" }, // { label: "拒绝往来人员清单", value: "8" },
{ label: "军事最终用途与最终用户规则", value: "9" }, // { label: "军事最终用途与最终用户规则", value: "9" },
{ label: "欧盟合并制裁清单", value: "10" }, // { label: "欧盟合并制裁清单", value: "10" },
{ label: "英国制裁清单", value: "11" }, // { label: "英国制裁清单", value: "11" },
{ label: "加拿大合并自主制裁清单", value: "12" }, // { label: "加拿大合并自主制裁清单", value: "12" },
{ label: "商业管制清单", value: "13" } // { label: "商业管制清单", value: "13" }
]); ]);
const handleGetSanList = async () => {
const params = {
orgId: deptValue.value
};
try {
const res = await getSanTypeList(params);
console.log("制裁手段列表", res);
if (res.code === 200 && res.data) {
methodOptions.value = res.data.map(item => {
return {
label: item.name,
value: item.id
};
});
}
} catch (error) {}
};
const getDepartmentListData = async () => { const getDepartmentListData = async () => {
const params = {
sanTypeId: methodValue.value
};
try { try {
const res = await getDepartmentList(); const res = await getDepartmentList(params);
if (res.code === 200 && res.data) { if (res.code === 200 && res.data) {
departmentList.value = res.data; departmentList.value = res.data;
} }
...@@ -314,6 +335,21 @@ const getDepartmentListData = async () => { ...@@ -314,6 +335,21 @@ const getDepartmentListData = async () => {
console.error("获取部门数据失败:", error); console.error("获取部门数据失败:", error);
} }
}; };
watch(
() => methodValue.value,
val => {
getDepartmentListData();
}
);
watch(
() => deptValue.value,
val => {
handleGetSanList();
}
);
const rankType = ref("institution"); const rankType = ref("institution");
const rankLoading = ref(false); const rankLoading = ref(false);
const selectedField = ref(""); const selectedField = ref("");
...@@ -976,7 +1012,7 @@ onMounted(() => { ...@@ -976,7 +1012,7 @@ onMounted(() => {
// setChart(Chart, "chartRef"); // setChart(Chart, "chartRef");
handleGetDomainContainmentTrend(); handleGetDomainContainmentTrend();
getDepartmentListData(); getDepartmentListData();
handleGetSanList();
handleGetAllDomainCount(); handleGetAllDomainCount();
handleGetDomainContainmentRanking(); handleGetDomainContainmentRanking();
handleGetDomainContainmentTimeline(); handleGetDomainContainmentTimeline();
......
...@@ -178,7 +178,7 @@ ...@@ -178,7 +178,7 @@
<div class="bottom-content"> <div class="bottom-content">
<div class="timeline-container"> <div class="timeline-container">
<div class="timeline-list"> <div class="timeline-list">
<div v-for="(dept, index) in filteredTimelineList" :key="index" class="dept-row"> <div v-for="(dept, index) in timelineList" :key="index" class="dept-row">
<div class="dept-info"> <div class="dept-info">
<img :src="dept.icon || defaultImg" alt="" class="dept-icon" /> <img :src="dept.icon || defaultImg" alt="" class="dept-icon" />
<div class="dept-text"> <div class="dept-text">
...@@ -191,8 +191,16 @@ ...@@ -191,8 +191,16 @@
v-for="(event, eIndex) in dept.events" v-for="(event, eIndex) in dept.events"
:key="eIndex" :key="eIndex"
class="event-card" class="event-card"
:class="getCardColorClass(event.level)" :class="{
'card-red': event.level === 'red',
'card-yellow': event.level === 'yellow',
'card-green': event.level === 'green',
'card-white': event.level === 'white',
'card-default': !event.level
}"
@click="handleClickEventCard(event)"
> >
<div class="card-mask" v-if="activeSanctionId && activeSanctionId !== event.sanctionId"></div>
<div class="card-top-line" :class="getLineColorClass(event.level)"></div> <div class="card-top-line" :class="getLineColorClass(event.level)"></div>
<div class="event-header"> <div class="event-header">
<div class="event-date">{{ event.date }}</div> <div class="event-date">{{ event.date }}</div>
...@@ -249,7 +257,9 @@ import { ...@@ -249,7 +257,9 @@ import {
getUSGovernmentLatestDynamic, getUSGovernmentLatestDynamic,
getUSGovernmentJointSanctionRank, getUSGovernmentJointSanctionRank,
getUSGovernmentSanctionHistory, getUSGovernmentSanctionHistory,
getDepartmentList getDepartmentList,
getSanTypeList,
getThreeMonthSanctionProcess
} from "@/api/allGovernment.js"; } from "@/api/allGovernment.js";
const router = useRouter(); const router = useRouter();
...@@ -279,16 +289,16 @@ const getUSGovernmentSanctionHistoryData = async () => { ...@@ -279,16 +289,16 @@ const getUSGovernmentSanctionHistoryData = async () => {
const params = { const params = {
// onlyHistory: measureType.value === "history", // onlyHistory: measureType.value === "history",
// onlyFuture: measureType.value === "future", // onlyFuture: measureType.value === "future",
onlyHistory: false, // onlyHistory: false,
onlyFuture: true, // onlyFuture: true,
field: selectedField.value || null, field: selectedField.value || null
startDate: new Date(), // startDate: new Date(),
endDate: new Date(new Date().setMonth(new Date().getMonth() + 3)) // endDate: new Date(new Date().setMonth(new Date().getMonth() + 3))
}; };
const res = await getUSGovernmentSanctionHistory(params); const res = await getThreeMonthSanctionProcess(params);
console.log('遏制时间线', res); console.log("未来三个月打压遏制时间线", res);
if (res.code === 200 && res.data) { if (res.code === 200 && res.data) {
// 如果返回的是 content 数组(分页结构)或直接是数组 // 如果返回的是 content 数组(分页结构)或直接是数组
const rawList = res.data.content || res.data; const rawList = res.data.content || res.data;
...@@ -319,10 +329,13 @@ const getUSGovernmentSanctionHistoryData = async () => { ...@@ -319,10 +329,13 @@ const getUSGovernmentSanctionHistoryData = async () => {
date: item.postDate ? item.postDate.replace(/^(\d{4})-(\d{2})-(\d{2})$/, "$1年$2月$3日") : "", date: item.postDate ? item.postDate.replace(/^(\d{4})-(\d{2})-(\d{2})$/, "$1年$2月$3日") : "",
content: item.name || item.summary, content: item.name || item.summary,
tags: item.techDomainList ? item.techDomainList.slice(0, 2) : [], tags: item.techDomainList ? item.techDomainList.slice(0, 2) : [],
level: level level: level,
sanctionId: item.sanctionId
}); });
}); });
timelineList.value = Object.values(grouped); timelineList.value = Object.values(grouped);
console.log("timelineList", timelineList.value);
initSlider(); initSlider();
} }
} catch (error) { } catch (error) {
...@@ -469,18 +482,22 @@ const getUSChinaSanctionTrendData = async () => { ...@@ -469,18 +482,22 @@ const getUSChinaSanctionTrendData = async () => {
}; };
// 全政府-获取部门数据 // 全政府-获取部门数据
const departmentList = ref([]); const departmentList = ref([]);
const loadingDepartment = ref(false); // const loadingDepartment = ref(false);
const getDepartmentListData = async () => { const getDepartmentListData = async () => {
loadingDepartment.value = true; // loadingDepartment.value = true;
const params = {
sanTypeId: methodValue.value
};
try { try {
const res = await getDepartmentList(); const res = await getDepartmentList(params);
console.log("部门列表", res);
if (res.code === 200 && res.data) { if (res.code === 200 && res.data) {
departmentList.value = res.data; departmentList.value = res.data;
} }
} catch (error) { } catch (error) {
console.error("获取部门数据失败:", error); console.error("获取部门数据失败:", error);
} finally { } finally {
loadingDepartment.value = false; // loadingDepartment.value = false;
} }
}; };
...@@ -672,22 +689,22 @@ const fieldOptions = ref([ ...@@ -672,22 +689,22 @@ const fieldOptions = ref([
]); ]);
const methodOptions = ref([ const methodOptions = ref([
{ label: "全部制裁手段", value: "" }, // { label: "全部制裁手段", value: "" },
{ label: "法案", value: "-1" }, // { label: "法案", value: "-1" },
{ label: "政令", value: "-2" }, // { label: "政令", value: "-2" },
{ label: "实体清单", value: "1" }, // { label: "实体清单", value: "1" },
{ label: "特别国民指定清单", value: "2" }, // { label: "特别国民指定清单", value: "2" },
{ label: "涉军企业", value: "3" }, // { label: "涉军企业", value: "3" },
{ label: "行业制裁识别清单", value: "4" }, // { label: "行业制裁识别清单", value: "4" },
{ label: "无法核实清单", value: "5" }, // { label: "无法核实清单", value: "5" },
{ label: "军事最终用户清单", value: "6" }, // { label: "军事最终用户清单", value: "6" },
{ label: "非SDN中国军工企业名单", value: "7" }, // { label: "非SDN中国军工企业名单", value: "7" },
{ label: "拒绝往来人员清单", value: "8" }, // { label: "拒绝往来人员清单", value: "8" },
{ label: "军事最终用途与最终用户规则", value: "9" }, // { label: "军事最终用途与最终用户规则", value: "9" },
{ label: "欧盟合并制裁清单", value: "10" }, // { label: "欧盟合并制裁清单", value: "10" },
{ label: "英国制裁清单", value: "11" }, // { label: "英国制裁清单", value: "11" },
{ label: "加拿大合并自主制裁清单", value: "12" }, // { label: "加拿大合并自主制裁清单", value: "12" },
{ label: "商业管制清单", value: "13" } // { label: "商业管制清单", value: "13" }
// { label: "232调查", value: "14" }, // { label: "232调查", value: "14" },
// { label: "Capta List (CAP) - Treasury Department", value: "15" }, // { label: "Capta List (CAP) - Treasury Department", value: "15" },
// { label: "ITAR Debarred (DTC) - State Department", value: "16" }, // { label: "ITAR Debarred (DTC) - State Department", value: "16" },
...@@ -697,6 +714,38 @@ const methodOptions = ref([ ...@@ -697,6 +714,38 @@ const methodOptions = ref([
// { label: "经验证最终用户清单", value: "20" } // { label: "经验证最终用户清单", value: "20" }
]); ]);
const handleGetSanList = async () => {
const params = {
orgId: deptValue.value
};
try {
const res = await getSanTypeList(params);
console.log("制裁手段列表", res);
if (res.code === 200 && res.data) {
methodOptions.value = res.data.map(item => {
return {
label: item.name,
value: item.id
};
});
}
} catch (error) {}
};
watch(
() => methodValue.value,
val => {
getDepartmentListData();
}
);
watch(
() => deptValue.value,
val => {
handleGetSanList();
}
);
const dynamicList = ref([]); const dynamicList = ref([]);
const getColorName = tag => { const getColorName = tag => {
...@@ -973,6 +1022,16 @@ const initChart = (xAxisData = [], seriesData = []) => { ...@@ -973,6 +1022,16 @@ const initChart = (xAxisData = [], seriesData = []) => {
myChart.setOption(option); myChart.setOption(option);
}; };
const activeSanctionId = ref(null);
const handleClickEventCard = item => {
console.log("item", item);
if (activeSanctionId.value === item.sanctionId) {
activeSanctionId.value = null;
} else {
activeSanctionId.value = item.sanctionId;
}
};
// 监听时间范围变化,重新获取趋势数据 // 监听时间范围变化,重新获取趋势数据
watch( watch(
() => activeDate.value, () => activeDate.value,
...@@ -988,6 +1047,8 @@ watch([() => measureType.value, () => selectedField.value], () => { ...@@ -988,6 +1047,8 @@ watch([() => measureType.value, () => selectedField.value], () => {
}); });
onMounted(() => { onMounted(() => {
getDepartmentListData();
handleGetSanList();
initChart(); initChart();
initSlider(); initSlider();
getGovernmentList(); getGovernmentList();
...@@ -995,7 +1056,7 @@ onMounted(() => { ...@@ -995,7 +1056,7 @@ onMounted(() => {
getUSGovernmentLatestDynamicData(); getUSGovernmentLatestDynamicData();
getUSGovernmentJointSanctionRankData(); getUSGovernmentJointSanctionRankData();
getUSGovernmentSanctionHistoryData(); getUSGovernmentSanctionHistoryData();
getDepartmentListData();
startAutoPlay(); startAutoPlay();
window.addEventListener("resize", () => { window.addEventListener("resize", () => {
myChart && myChart.resize(); myChart && myChart.resize();
...@@ -1790,6 +1851,16 @@ const prev = () => { ...@@ -1790,6 +1851,16 @@ const prev = () => {
position: relative; position: relative;
overflow: hidden; overflow: hidden;
flex-shrink: 0; flex-shrink: 0;
cursor: pointer;
.card-mask {
width: 100%;
height: 100%;
left: 0;
top: 0;
position: absolute;
z-index: 99;
background: rgba(125, 125, 125, 0.8) !important;
}
&.card-red { &.card-red {
background: linear-gradient(180deg, rgba(206, 79, 81, 0.08) 0%, rgba(255, 255, 255, 1) 60%); background: linear-gradient(180deg, rgba(206, 79, 81, 0.08) 0%, rgba(255, 255, 255, 1) 60%);
......
...@@ -49,6 +49,7 @@ ...@@ -49,6 +49,7 @@
default-expand-all default-expand-all
:header-cell-style="{ 'border-right': 'none' }" :header-cell-style="{ 'border-right': 'none' }"
:cell-style="{ 'border-right': 'none' }" :cell-style="{ 'border-right': 'none' }"
height="600"
> >
<!-- 自定义展开图标 --> <!-- 自定义展开图标 -->
...@@ -62,10 +63,9 @@ ...@@ -62,10 +63,9 @@
</div> </div>
<div <div
class="progress-wrapper left" class="progress-wrapper left"
:style="{ '--i': '40px', '--j': '-20px', marginLeft: '20px' }"
> >
<el-progress <el-progress
:percentage="scope.row.chinaScore" :percentage="scope.row.usScore"
:stroke-width="20" :stroke-width="20"
class="left-progress" class="left-progress"
:show-text="false" :show-text="false"
...@@ -79,7 +79,7 @@ ...@@ -79,7 +79,7 @@
<div style="display: flex"> <div style="display: flex">
<div class="progress-wrapper right" :style="{ '--i': '40px', marginRight: '20px' }"> <div class="progress-wrapper right" :style="{ '--i': '40px', marginRight: '20px' }">
<el-progress <el-progress
:percentage="scope.row.usScore" :percentage="scope.row.chinaScore"
:stroke-width="20" :stroke-width="20"
class="right-progress" class="right-progress"
:class="{ cLead: scope.row.chinaRank < scope.row.usRank }" :class="{ cLead: scope.row.chinaRank < scope.row.usRank }"
......
...@@ -269,7 +269,7 @@ onMounted(() => { ...@@ -269,7 +269,7 @@ onMounted(() => {
overflow: hidden; overflow: hidden;
} }
.layout-main-header { .layout-main-header {
width: 1744px; width: 1600px;
background: #fff; background: #fff;
display: flex; display: flex;
justify-content: space-between; justify-content: space-between;
...@@ -361,8 +361,6 @@ onMounted(() => { ...@@ -361,8 +361,6 @@ onMounted(() => {
} }
.layout-main-header-right-box { .layout-main-header-right-box {
width: 600px; width: 600px;
// margin-right: 150px;
// margin-top: 19px;
.right-box-top { .right-box-top {
.time { .time {
height: 24px; height: 24px;
......
...@@ -73,7 +73,7 @@ ...@@ -73,7 +73,7 @@
<div class="title">{{ "政治献金流向" }}</div> <div class="title">{{ "政治献金流向" }}</div>
<div class="header-right"> <div class="header-right">
<div class="more-btn" v-if="fullSourceList.length > 5" @click="toggleSankeyData"> <div class="more-btn" v-if="fullSourceList.length > 5" @click="toggleSankeyData">
{{ showAllSankeyData ? '收起' : '更多+' }} {{ showAllSankeyData ? "收起" : "更多+" }}
</div> </div>
<div class="right-icon"> <div class="right-icon">
<img src="@/assets/icons/box-header-icon1.png" alt="" /> <img src="@/assets/icons/box-header-icon1.png" alt="" />
...@@ -86,13 +86,18 @@ ...@@ -86,13 +86,18 @@
</div> </div>
</div> </div>
</div> </div>
<div class="box2-main" id="chart1"></div>
<div class="box2-main">
<el-empty v-if="!fullSourceList.length" description="暂无数据" :image-size="100" />
<div class="chart-box2" id="chart1"></div>
</div>
<div class="box-footer"> <div class="box-footer">
<div class="box-footer-left"> <div class="box-footer-left">
<img src="@/assets/icons/box-footer-left-icon.png" alt="" /> <img src="@/assets/icons/box-footer-left-icon.png" alt="" />
</div> </div>
<div class="box-footer-center"> <div class="box-footer-center">
{{ currentPersonName }}的政治资金主要依赖于一个由亿万富翁、特定行业利益集团及通过​“超级政治行动委员会”​​ 运作的大额捐款网络。 {{ currentPersonName }}的政治资金主要依赖于一个由亿万富翁、特定行业利益集团及通过​“超级政治行动委员会”​​
运作的大额捐款网络。
</div> </div>
<div class="box-footer-right"> <div class="box-footer-right">
<img src="@/assets/icons/box-footer-right-icon.png" alt="" /> <img src="@/assets/icons/box-footer-right-icon.png" alt="" />
...@@ -118,6 +123,7 @@ ...@@ -118,6 +123,7 @@
<div class="box3-main"> <div class="box3-main">
<div class="box3-main-left" id="chart2"></div> <div class="box3-main-left" id="chart2"></div>
<div class="box3-main-right"> <div class="box3-main-right">
<el-empty v-if="!areaList.length" description="暂无数据" :image-size="100" />
<div class="box3-main-right-item" v-for="(item, index) in areaList" :key="index"> <div class="box3-main-right-item" v-for="(item, index) in areaList" :key="index">
<div class="id">{{ index + 1 }}</div> <div class="id">{{ index + 1 }}</div>
<div class="name">{{ item.name }}</div> <div class="name">{{ item.name }}</div>
...@@ -134,7 +140,8 @@ ...@@ -134,7 +140,8 @@
<img src="@/assets/icons/box-footer-left-icon.png" alt="" /> <img src="@/assets/icons/box-footer-left-icon.png" alt="" />
</div> </div>
<div class="box-footer-center"> <div class="box-footer-center">
{{ currentPersonName }}的政治资金主要依赖于一个由亿万富翁、特定行业利益集团及通过​“超级政治行动委员会”​​ 运作的大额捐款网络。 {{ currentPersonName }}的政治资金主要依赖于一个由亿万富翁、特定行业利益集团及通过​“超级政治行动委员会”​​
运作的大额捐款网络。
</div> </div>
<div class="box-footer-right"> <div class="box-footer-right">
<img src="@/assets/icons/box-footer-right-icon.png" alt="" /> <img src="@/assets/icons/box-footer-right-icon.png" alt="" />
...@@ -426,7 +433,7 @@ const getPoliContribution = async () => { ...@@ -426,7 +433,7 @@ const getPoliContribution = async () => {
const res = await getBillPoliContribution(params); const res = await getBillPoliContribution(params);
if (res.code === 200) { if (res.code === 200) {
poliContribution.value = res.data; poliContribution.value = res.data;
// 重置为默认值 // 重置为默认值
partyContributionList.value = [ partyContributionList.value = [
{ name: "共和党", img: Ghd, num: "$0" }, { name: "共和党", img: Ghd, num: "$0" },
...@@ -520,16 +527,16 @@ const renderSankeyChart = () => { ...@@ -520,16 +527,16 @@ const renderSankeyChart = () => {
if (sourceList.length > 0) { if (sourceList.length > 0) {
const currentPerson = mainPoliContribution.value[itemActiveIndex.value]; const currentPerson = mainPoliContribution.value[itemActiveIndex.value];
const personName = currentPerson ? currentPerson.name : "Person"; const personName = currentPerson ? currentPerson.name : "Person";
const totalAmount = sourceList.reduce((sum, item) => sum + (item.amount || 0), 0); const totalAmount = sourceList.reduce((sum, item) => sum + (item.amount || 0), 0);
const nodes = [ const nodes = [
{ {
name: personName, name: personName,
value: totalAmount, value: totalAmount,
label: { position: 'left' }, label: { position: "left" },
itemStyle: { itemStyle: {
color: '#FF1493' color: "#FF1493"
} }
}, },
...sourceList.map((item, index) => ({ ...sourceList.map((item, index) => ({
...@@ -540,13 +547,13 @@ const renderSankeyChart = () => { ...@@ -540,13 +547,13 @@ const renderSankeyChart = () => {
} }
})) }))
]; ];
const links = sourceList.map(item => ({ const links = sourceList.map(item => ({
source: item.orgName, source: item.orgName,
target: personName, target: personName,
value: item.amount value: item.amount
})); }));
let chart1 = getSankeyChart(nodes, links); let chart1 = getSankeyChart(nodes, links);
setChart(chart1, "chart1"); setChart(chart1, "chart1");
} else { } else {
...@@ -562,7 +569,7 @@ const toggleSankeyData = () => { ...@@ -562,7 +569,7 @@ const toggleSankeyData = () => {
// 获取人员政治献金来源及行业领域分布 // 获取人员政治献金来源及行业领域分布
const personPoliContribution = ref(); const personPoliContribution = ref();
const getPersonPoliContribution = async (personId) => { const getPersonPoliContribution = async personId => {
if (!personId) return; if (!personId) return;
const params = { const params = {
id: window.sessionStorage.getItem("billId"), id: window.sessionStorage.getItem("billId"),
...@@ -574,20 +581,20 @@ const getPersonPoliContribution = async (personId) => { ...@@ -574,20 +581,20 @@ const getPersonPoliContribution = async (personId) => {
console.log("人员政治献金:", res); console.log("人员政治献金:", res);
if (res.code === 200 && res.data) { if (res.code === 200 && res.data) {
personPoliContribution.value = res.data; personPoliContribution.value = res.data;
fullSourceList.value = res.data.sourceList || []; fullSourceList.value = res.data.sourceList || [];
showAllSankeyData.value = false; // Reset to default (top 5) showAllSankeyData.value = false; // Reset to default (top 5)
renderSankeyChart(); renderSankeyChart();
// Update Industry List (Chart 2 and List) // Update Industry List (Chart 2 and List)
const industries = res.data.industryList || []; const industries = res.data.industryList || [];
// Update Chart 2 Data // Update Chart 2 Data
chart2Data.value = industries.map(item => ({ chart2Data.value = industries.map(item => ({
name: item.industryName, name: item.industryName,
value: item.amount value: item.amount
})); }));
// Re-render Chart 2 // Re-render Chart 2
let chart2 = getPieChart(chart2Data.value, chart2ColorList.value); let chart2 = getPieChart(chart2Data.value, chart2ColorList.value);
setChart(chart2, "chart2"); setChart(chart2, "chart2");
...@@ -595,7 +602,7 @@ const getPersonPoliContribution = async (personId) => { ...@@ -595,7 +602,7 @@ const getPersonPoliContribution = async (personId) => {
// Update List Data // Update List Data
// Sort by amount desc to ensure first item is max for progress bar // Sort by amount desc to ensure first item is max for progress bar
const sortedIndustries = [...industries].sort((a, b) => (b.amount || 0) - (a.amount || 0)); const sortedIndustries = [...industries].sort((a, b) => (b.amount || 0) - (a.amount || 0));
areaList.value = sortedIndustries.map(item => ({ areaList.value = sortedIndustries.map(item => ({
name: item.industryName, name: item.industryName,
num: item.amount, num: item.amount,
...@@ -606,7 +613,7 @@ const getPersonPoliContribution = async (personId) => { ...@@ -606,7 +613,7 @@ const getPersonPoliContribution = async (personId) => {
personPoliContribution.value = []; personPoliContribution.value = [];
fullSourceList.value = []; fullSourceList.value = [];
renderSankeyChart(); renderSankeyChart();
chart2Data.value = []; chart2Data.value = [];
areaList.value = []; areaList.value = [];
let chart2 = getPieChart([], chart2ColorList.value); let chart2 = getPieChart([], chart2ColorList.value);
...@@ -635,7 +642,7 @@ const handlePersonClick = (item, index) => { ...@@ -635,7 +642,7 @@ const handlePersonClick = (item, index) => {
onMounted(() => { onMounted(() => {
getPoliContribution(); getPoliContribution();
getMainPoliContribution(); getMainPoliContribution();
let chart1 = getSankeyChart(); let chart1 = getSankeyChart();
setChart(chart1, "chart1"); setChart(chart1, "chart1");
...@@ -944,6 +951,10 @@ onMounted(() => { ...@@ -944,6 +951,10 @@ onMounted(() => {
height: 302px; height: 302px;
margin: 0 auto; margin: 0 auto;
margin-bottom: 9px; margin-bottom: 9px;
.chart-box2 {
width: 1020px;
height: 302px;
}
} }
} }
.box3 { .box3 {
......
...@@ -67,8 +67,16 @@ ...@@ -67,8 +67,16 @@
class="content ai-content" class="content ai-content"
v-html="renderMarkdown(message.content)" v-html="renderMarkdown(message.content)"
></div> ></div>
<div v-if="message.raw_data?.length || message.raw_data?.rows?.length" class="answer-title">完整实体列表</div> <div
<div v-if="message.raw_data?.length || message.raw_data?.rows?.length" class="content row-content"> v-if="message.raw_data?.length || message.raw_data?.rows?.length"
class="answer-title"
>
完整实体列表
</div>
<div
v-if="message.raw_data?.length || message.raw_data?.rows?.length"
class="content row-content"
>
<div class="row-header"> <div class="row-header">
<div class="row-header-item1">{{ message.raw_data.columns?.name_zhs }}</div> <div class="row-header-item1">{{ message.raw_data.columns?.name_zhs }}</div>
<div class="row-header-item">{{ message.raw_data.columns?.date }}</div> <div class="row-header-item">{{ message.raw_data.columns?.date }}</div>
...@@ -157,7 +165,7 @@ ...@@ -157,7 +165,7 @@
<img src="./assets/images/attach.png" alt="" /> <img src="./assets/images/attach.png" alt="" />
</el-tooltip> </el-tooltip>
</div> </div>
<div class="select-box"> <!-- <div class="select-box">
<el-select v-model="curArea" placeholder="选择领域方向" style="width: 160px"> <el-select v-model="curArea" placeholder="选择领域方向" style="width: 160px">
<el-option <el-option
v-for="item in areaList" v-for="item in areaList"
...@@ -166,7 +174,7 @@ ...@@ -166,7 +174,7 @@
:value="item.value" :value="item.value"
/> />
</el-select> </el-select>
</div> </div> -->
<div class="submit" @click="sendMessage"> <div class="submit" @click="sendMessage">
<el-tooltip effect="dark" content="发送" placement="top"> <el-tooltip effect="dark" content="发送" placement="top">
<img src="./assets/images/submit.png" alt="" /> <img src="./assets/images/submit.png" alt="" />
...@@ -598,7 +606,7 @@ const handleBillChat = async question => { ...@@ -598,7 +606,7 @@ const handleBillChat = async question => {
}, 500); }, 500);
try { try {
const response = await fetch("/checklistChat/langgraph/bills/chat", { const response = await fetch("/checklistChat/langgraph/union/chat", {
method: "POST", method: "POST",
headers: { "Content-Type": "application/json" }, headers: { "Content-Type": "application/json" },
body: JSON.stringify(params) body: JSON.stringify(params)
...@@ -925,13 +933,14 @@ const sendMessage = async () => { ...@@ -925,13 +933,14 @@ const sendMessage = async () => {
userInput.value = ""; userInput.value = "";
aiMessage.value = ""; aiMessage.value = "";
if (curArea.value === "法案") { // if (curArea.value === "法案") {
handleBillChat(question); // handleBillChat(question);
} else if (curArea.value === "法案RAG") { // } else if (curArea.value === "法案RAG") {
await connectSSE(question); // await connectSSE(question);
} else { // } else {
handleListChat(question); // handleListChat(question);
} // }
handleBillChat(question);
}; };
const newChatTitle = ref(""); // 新对话 const newChatTitle = ref(""); // 新对话
......
...@@ -152,7 +152,7 @@ const route = useRoute(); ...@@ -152,7 +152,7 @@ const route = useRoute();
const selectTime = ref("全部时间"); const selectTime = ref("全部时间");
const selectRelation = ref("相关度优先"); const selectRelation = ref("相关度优先");
const keyword = ref("出口"); const keyword = ref("");
const tabList = ref([ const tabList = ref([
{ {
......
...@@ -15,6 +15,7 @@ ...@@ -15,6 +15,7 @@
</div> </div>
<div class="box1-main"> <div class="box1-main">
<div class="left"> <div class="left">
<el-empty v-if="siderList.length === 0" description="暂无数据" :image-size="100" />
<div <div
class="left-item" class="left-item"
:class="{ leftItemActive: siderActiveIndex === index }" :class="{ leftItemActive: siderActiveIndex === index }"
...@@ -76,6 +77,7 @@ ...@@ -76,6 +77,7 @@
<div class="title">{{ "政令主要内容" }}</div> <div class="title">{{ "政令主要内容" }}</div>
</div> </div>
<div class="list-main"> <div class="list-main">
<el-empty v-if="showList.length === 0" description="暂无数据" :image-size="200" />
<div class="list-item" v-for="(val, idx) in showList" :key="idx"> <div class="list-item" v-for="(val, idx) in showList" :key="idx">
<div class="id">{{ idx + 1 }}</div> <div class="id">{{ idx + 1 }}</div>
<div class="title">{{ val.content }}</div> <div class="title">{{ val.content }}</div>
...@@ -157,7 +159,7 @@ const siderList = ref([ ...@@ -157,7 +159,7 @@ const siderList = ref([
const siderActiveIndex = ref(0); const siderActiveIndex = ref(0);
const handleClickSider = async index => { const handleClickSider = async index => {
siderActiveIndex.value = index; siderActiveIndex.value = index;
decreeInfo.value.id = allData.value[index].id decreeInfo.value.id = allData.value[index].id;
decreeInfo.value.img = allData.value[index].imageUrl; decreeInfo.value.img = allData.value[index].imageUrl;
decreeInfo.value.totalTitle = allData.value[index].name; decreeInfo.value.totalTitle = allData.value[index].name;
decreeInfo.value.eTotalTitle = allData.value[index].ename; decreeInfo.value.eTotalTitle = allData.value[index].ename;
...@@ -264,8 +266,8 @@ const handleGetRelateOrder = async () => { ...@@ -264,8 +266,8 @@ const handleGetRelateOrder = async () => {
}; };
const handleToDecreeDetail = item => { const handleToDecreeDetail = item => {
console.log('item', item.id); console.log("item", item.id);
window.sessionStorage.setItem('curTabName', item.totalTitle) window.sessionStorage.setItem("curTabName", item.totalTitle);
const route = router.resolve({ const route = router.resolve({
path: "/decreeLayout/overview/introduction", path: "/decreeLayout/overview/introduction",
query: { query: {
......
...@@ -348,7 +348,9 @@ onMounted(() => { ...@@ -348,7 +348,9 @@ onMounted(() => {
.layout-main { .layout-main {
width: 100%; width: 100%;
.layout-main-header { .layout-main-header {
width: 1600px;
height: 137px; height: 137px;
margin: 0 auto;
background: rgba(255, 255, 255, 1); background: rgba(255, 255, 255, 1);
display: flex; display: flex;
justify-content: space-between; justify-content: space-between;
...@@ -357,7 +359,6 @@ onMounted(() => { ...@@ -357,7 +359,6 @@ onMounted(() => {
z-index: 99999999; z-index: 99999999;
.layout-main-header-left-box { .layout-main-header-left-box {
width: 1100px; width: 1100px;
margin-left: 160px;
margin-top: 13px; margin-top: 13px;
.left-box-top { .left-box-top {
height: 64px; height: 64px;
...@@ -468,7 +469,6 @@ onMounted(() => { ...@@ -468,7 +469,6 @@ onMounted(() => {
} }
.layout-main-header-right-box { .layout-main-header-right-box {
width: 300px; width: 300px;
margin-right: 150px;
margin-top: 19px; margin-top: 19px;
.right-box-top { .right-box-top {
.time { .time {
......
...@@ -62,6 +62,7 @@ ...@@ -62,6 +62,7 @@
</div> </div>
</div> </div>
<div class="box2-main"> <div class="box2-main">
<el-empty v-if="!relatedEvents.length" description="暂无数据" :image-size="100" />
<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="" />
...@@ -100,6 +101,7 @@ ...@@ -100,6 +101,7 @@
</div> </div>
</div> </div>
<div class="box3-main"> <div class="box3-main">
<el-empty v-if="!laws.length" description="暂无数据" :image-size="100" />
<div class="box3-item" v-for="(item, index) in laws" :key="index" @click="handleToBillDetail(item)"> <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">
...@@ -205,20 +207,7 @@ const handleGetRelateEvents = async () => { ...@@ -205,20 +207,7 @@ const handleGetRelateEvents = async () => {
}; };
// 法律依据 // 法律依据
const laws = ref([ const laws = ref([]);
{
title: "《美国法典》",
info: "第3编第301条",
content:
"允许总统通过行政命令(Executive Order)​​ 或其它书面形式授权行政部门或机构的负责人​(如国务卿、财政部长等)代行本属于总统的法定职能(由国会立法授予总统的职能)。"
},
{
title: "《出口管制改革法案》",
info: "",
content:
"该法案授权政府出于国家安全和外交政策目的对特定技术、商品和软件的出口进行管制。确保AI技术不流向“对手国家”是其题中应有之义。"
}
]);
const handleGetLaws = async () => { const handleGetLaws = async () => {
const params = { const params = {
id: decreeId.value id: decreeId.value
...@@ -246,7 +235,7 @@ const handleMouseMove = event => { ...@@ -246,7 +235,7 @@ const handleMouseMove = event => {
}; };
const handleToBillDetail = item => { const handleToBillDetail = item => {
window.sessionStorage.setItem('curTabName', item.title) window.sessionStorage.setItem("curTabName", item.title);
const route = router.resolve({ const route = router.resolve({
path: "/billLayout", path: "/billLayout",
query: { query: {
......
...@@ -84,6 +84,7 @@ ...@@ -84,6 +84,7 @@
</div> </div>
</div> </div>
<div class="box2-main"> <div class="box2-main">
<el-empty v-if="!curmajorList.length" description="暂无数据" :image-size="100" />
<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>
...@@ -189,7 +190,12 @@ import { useRoute } from "vue-router"; ...@@ -189,7 +190,12 @@ import { useRoute } from "vue-router";
import router from "@/router"; import router from "@/router";
import box1Img from "./assets/images/box1-img.png"; import box1Img from "./assets/images/box1-img.png";
import Box3Logo from "./assets/images/box3-img.png"; import Box3Logo from "./assets/images/box3-img.png";
import { getDecreeBasicInfo, getDecreeMainContent, getDecreeOrganization, getDecreeIssueOrganization } from "@/api/decree/introduction"; import {
getDecreeBasicInfo,
getDecreeMainContent,
getDecreeOrganization,
getDecreeIssueOrganization
} from "@/api/decree/introduction";
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";
...@@ -278,12 +284,10 @@ const box3TopTopData = ref({ ...@@ -278,12 +284,10 @@ const box3TopTopData = ref({
id: "", id: "",
logo: "", logo: "",
name: "", name: "",
eName: "", eName: ""
}); });
const box3TopBottomData = ref([ const box3TopBottomData = ref([]);
]);
// 跳转行政机构主页 // 跳转行政机构主页
const handleToInstitution = item => { const handleToInstitution = item => {
...@@ -320,21 +324,20 @@ const handleGetOrgnization = async () => { ...@@ -320,21 +324,20 @@ const handleGetOrgnization = async () => {
const res = await getDecreeIssueOrganization(params); const res = await getDecreeIssueOrganization(params);
console.log("发布机构", res); console.log("发布机构", res);
if (res.code === 200 && res.data) { if (res.code === 200 && res.data) {
box3TopTopData.value.id = res.data.id box3TopTopData.value.id = res.data.id;
box3TopTopData.value.logo = res.data.image box3TopTopData.value.logo = res.data.image;
box3TopTopData.value.name = res.data.name box3TopTopData.value.name = res.data.name;
box3TopTopData.value.eName = res.data.ename box3TopTopData.value.eName = res.data.ename;
eventList.value = res.data.newsList eventList.value = res.data.newsList;
box3TopBottomData.value = res.data.personList box3TopBottomData.value = res.data.personList;
} }
} catch (error) { } catch (error) {
console.error("执行机构error", error); console.error("执行机构error", error);
box3TopTopData.value = { box3TopTopData.value = {
id: "", id: "",
logo: "", logo: "",
name: "", name: "",
eName: "", eName: ""
}; };
eventList.value = []; eventList.value = [];
} }
...@@ -725,7 +728,7 @@ onMounted(() => { ...@@ -725,7 +728,7 @@ onMounted(() => {
line-height: 24px; line-height: 24px;
letter-spacing: 0px; letter-spacing: 0px;
text-align: left; text-align: left;
overflow: hidden; overflow: hidden;
text-overflow: ellipsis; text-overflow: ellipsis;
white-space: nowrap; white-space: nowrap;
} }
......
...@@ -42,6 +42,7 @@ ...@@ -42,6 +42,7 @@
:class="['button', {'click': item.isClick}]" :class="['button', {'click': item.isClick}]"
@click="changeECCN(item)" @click="changeECCN(item)"
v-for="(item, i) in ECCNList" v-for="(item, i) in ECCNList"
:key="i"
> >
<span>{{ item.ranking }}{{ item.name }}</span> <span>{{ item.ranking }}{{ item.name }}</span>
</div> </div>
...@@ -87,7 +88,7 @@ ...@@ -87,7 +88,7 @@
</div> </div>
<div class="img-zone"> <div class="img-zone">
<img :src="item.icon || title" alt /> <img :src="item.icon || title" alt />
<div :class="['img-line', {'img-line-last': i === sanctionList.length - 1}]"></div> <div v-if="i < sanctionList.length - 1" :class="['img-line', {'img-line-last': i === sanctionList.length - 1}]"></div>
</div> </div>
<div class="main"> <div class="main">
<div class="main-title">{{ item.name }}</div> <div class="main-title">{{ item.name }}</div>
...@@ -638,6 +639,7 @@ onMounted(() => { ...@@ -638,6 +639,7 @@ onMounted(() => {
.table-class { .table-class {
width: 1013px; width: 1013px;
height: auto; height: auto;
padding-bottom: 10px;
margin-top: 16px; margin-top: 16px;
margin-left: 24px; margin-left: 24px;
color: rgb(59, 65, 75); color: rgb(59, 65, 75);
...@@ -651,7 +653,7 @@ onMounted(() => { ...@@ -651,7 +653,7 @@ onMounted(() => {
} }
.left-bottom { .left-bottom {
width: 100%; width: 100%;
min-height: 1000px; // min-height: 1000px;
border-radius: 10px; border-radius: 10px;
box-shadow: 0px 0px 20px 0px rgba(25, 69, 130, 0.1); box-shadow: 0px 0px 20px 0px rgba(25, 69, 130, 0.1);
background-color: #fff; background-color: #fff;
...@@ -668,13 +670,13 @@ onMounted(() => { ...@@ -668,13 +670,13 @@ onMounted(() => {
} }
} }
.left-bottom-main { .left-bottom-main {
padding: 16px 42px 0 25px; padding: 16px 42px 20px 25px;
.sanction-list { .sanction-list {
width: 1169px; width: 1169px;
// padding: 0px 0 12px 0; // padding: 0px 0 12px 0;
display: flex; display: flex;
// justify-content: flex-start; // justify-content: flex-start;
height: 154px; // height: 154px;
.time { .time {
width: 80px; width: 80px;
height: 50px; height: 50px;
......
...@@ -70,7 +70,8 @@ ...@@ -70,7 +70,8 @@
<div class="title">{{ "相关新闻" }}</div> <div class="title">{{ "相关新闻" }}</div>
</div> </div>
<div class="box2-main"> <div class="box2-main">
<div class="box2-item" v-for="(item, index) in relevantNews" :key="index"> <el-empty v-if="!relevantNews.length" description="暂无数据" :image-size="200" />
<div v-else class="box2-item" v-for="(item, index) in relevantNews" :key="index">
<div class="box2-item-left"> <div class="box2-item-left">
<img :src="item.newsImage" alt="" /> <img :src="item.newsImage" alt="" />
</div> </div>
...@@ -194,8 +195,6 @@ const handleGetNewsEvent = async () => { ...@@ -194,8 +195,6 @@ const handleGetNewsEvent = async () => {
} }
}; };
const handleWarning = () => { const handleWarning = () => {
ElMessage.warning("当前功能正在开发中,敬请期待!"); ElMessage.warning("当前功能正在开发中,敬请期待!");
return; return;
...@@ -256,7 +255,7 @@ const handleGetRelationNews = async () => { ...@@ -256,7 +255,7 @@ const handleGetRelationNews = async () => {
const res = await getRelationNews(params); const res = await getRelationNews(params);
console.log("相关新闻", res); console.log("相关新闻", res);
if (res.code === 200 && res.data) { if (res.code === 200 && res.data) {
relevantNews.value = res.data relevantNews.value = res.data;
} else { } else {
relevantNews.value = []; relevantNews.value = [];
} }
...@@ -265,7 +264,6 @@ const handleGetRelationNews = async () => { ...@@ -265,7 +264,6 @@ const handleGetRelationNews = async () => {
} }
}; };
onMounted(() => { onMounted(() => {
handleGetNewsSummary(); handleGetNewsSummary();
handleGetNewsContent(); handleGetNewsContent();
......
...@@ -130,18 +130,18 @@ onMounted(async () => { ...@@ -130,18 +130,18 @@ onMounted(async () => {
height: 188px; height: 188px;
box-sizing: border-box; box-sizing: border-box;
border-bottom: 1px solid rgba(234, 236, 238, 1); border-bottom: 1px solid rgba(234, 236, 238, 1);
border-top: 1px solid rgba(234, 236, 238, 1);
box-shadow: 0px 0px 20px 0px rgba(25, 69, 130, 0.1); box-shadow: 0px 0px 20px 0px rgba(25, 69, 130, 0.1);
background: rgba(255, 255, 255, 1); background: rgba(255, 255, 255, 1);
position: sticky; position: sticky;
top: 0; top: 0;
z-index: 99999999; z-index: 99999;
overflow: hidden;
.header-top { .header-top {
margin: 0 auto;
margin-top: 20px; margin-top: 20px;
margin-left: 160px; width: 1600px;
display: flex; display: flex;
justify-content: space-between; justify-content: space-between;
margin-right: 160px;
.header-top-left { .header-top-left {
display: flex; display: flex;
......
...@@ -95,19 +95,21 @@ onMounted(async () => { ...@@ -95,19 +95,21 @@ onMounted(async () => {
overflow: hidden; overflow: hidden;
overflow-y: auto; overflow-y: auto;
.header { .header {
width: 1920px; width: 100%;
height: 188px; height: 188px;
box-sizing: border-box; box-sizing: border-box;
padding: 0 160px; padding: 0 160px;
border-bottom: 1px solid rgba(234, 236, 238, 1); border-bottom: 1px solid rgba(234, 236, 238, 1);
border-top: 1px solid rgba(234, 236, 238, 1);
box-shadow: 0px 0px 20px 0px rgba(25, 69, 130, 0.1); box-shadow: 0px 0px 20px 0px rgba(25, 69, 130, 0.1);
background: rgba(255, 255, 255, 1); background: rgba(255, 255, 255, 1);
position: relative; position: relative;
position: sticky; position: sticky;
top: 0; top: 0;
z-index: 99999999; z-index: 99999;
overflow: hidden;
.header-top { .header-top {
width: 1600px;
margin: 0 auto;
margin-top: 24px; margin-top: 24px;
display: flex; display: flex;
...@@ -187,11 +189,10 @@ onMounted(async () => { ...@@ -187,11 +189,10 @@ onMounted(async () => {
} }
.header-footer { .header-footer {
width: 340px; width: 1600px;
margin: 0 auto;
margin-top: 25px;
height: 48px; height: 48px;
position: absolute;
bottom: 0;
left: 160px;
display: flex; display: flex;
gap: 24px; gap: 24px;
......
...@@ -3068,8 +3068,8 @@ onMounted(async () => { ...@@ -3068,8 +3068,8 @@ onMounted(async () => {
} }
.box6-main { .box6-main {
margin: 15px; margin: 5px 15px;
height: 360px; height: 395px;
} }
} }
} }
......
...@@ -23,7 +23,7 @@ const getPieChart = (data) => { ...@@ -23,7 +23,7 @@ const getPieChart = (data) => {
formatter: '{name|{b}}\n{time|{c} 条 {d}%}', formatter: '{name|{b}}\n{time|{c} 条 {d}%}',
minMargin: 5, minMargin: 5,
edgeDistance: 10, edgeDistance: 10,
lineHeight: 24, lineHeight: 20,
rich: { rich: {
name: { name: {
fontSize: 16, fontSize: 16,
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论