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