提交 df08706e authored 作者: 付康's avatar 付康

合并分支 'lzl-dev' 到 'master'

法案接口和样式更新 查看合并请求 !45
......@@ -39,10 +39,37 @@ export function getHotBills() {
}
// 获取法案风险信号
export function getBillRiskSignal() {
/**
* @param {moduleId}
*/
export function getBillRiskSignal(params) {
return request({
method: 'GET',
// 这个是之前的接口地址,现在接口地址换成新的了所以使用新地址
// url: '/api/BillOverview/riskSignal',
url: `/api/commonFeature/riskSignal/${params.moduleId}`,
})
}
// 获取新闻资讯
/**
* @param {moduleId}
*/
export function getNews(params) {
return request({
method: 'GET',
url: `/api/commonFeature/news/${params.moduleId}`,
})
}
// 获取社交媒体
/**
* @param {moduleId}
*/
export function getRemarks(params) {
return request({
method: 'GET',
url: '/api/BillOverview/riskSignal',
url: `/api/commonFeature/remarks/${params.moduleId}`,
})
}
......@@ -89,10 +116,27 @@ export function getMemberProposal(params) {
}
// 获取资源库
export function getBills(params) {
export function getBills(params, signal) {
return request({
method: 'GET',
url: `/api/BillOverview/bills`,
params
params,
signal
})
}
// 获取提出部门列表
export function getPostOrgList() {
return request({
method: 'GET',
url: `/api/BillDict/department`,
})
}
// 获取提出议员列表
export function getPostMemberList() {
return request({
method: 'GET',
url: `/api/BillDict/member`,
})
}
\ No newline at end of file
......@@ -505,7 +505,7 @@ const handleGetBillPersonAnalyze = async (isOppose) => {
onMounted(() => {
handleGetBillBackground();
handleGetRelatedEvent();
handleGetBillPersonAnalyze(false);
// handleGetBillPersonAnalyze(false);
});
</script>
......
......@@ -214,22 +214,21 @@
class="box2-main-item"
v-for="(item, index) in warningList"
:key="index"
@click="handleClickToDetail()"
>
<div
class="item-left"
:class="{
itemLeftStatus1: item.riskLevel === '特别重大',
itemLeftStatus2: item.riskLevel === '重大风险'
itemLeftStatus1: item.signalLevel === '特别重大',
itemLeftStatus2: item.signalLevel === '重大风险'
}"
>
{{ item.riskLevel ? item.riskLevel : "一般风险" }}
{{ item.signalLevel ? item.signalLevel : "一般风险" }}
</div>
<div class="item-right">
<div class="text">
{{ item.description }}
{{ item.signalTitle }}
</div>
<div class="time">{{ item.introductionDate }}</div>
<div class="time">{{ item.signalTime }}</div>
</div>
</div>
</div>
......@@ -254,16 +253,16 @@
</div>
</div>
<div class="box3-main">
<div class="box3-item" v-for="(news, index) in newsList" :key="index">
<div class="box3-item" v-for="(news, index) in newsList" :key="index" @click="handleClickToNewsDetail()">
<div class="left">
<img :src="news.img" alt="" />
<img :src="news.newsImage || News1" alt="" />
</div>
<div class="right">
<div class="right-top">
<div class="title">{{ news.title }}</div>
<div class="time">{{ news.from }}</div>
<div class="title">{{ news.newsTitle }}</div>
<div class="time">{{ news.newsDate ? news.newsDate.slice(5) : '' }} - {{ news.newsOrg }}</div>
</div>
<div class="right-footer">{{ news.content }}</div>
<div class="right-footer">{{ news.newsContent }}</div>
</div>
</div>
</div>
......@@ -278,14 +277,14 @@
<div class="box4-main">
<div class="box4-main-item" v-for="(item, index) in messageList" :key="index">
<div class="left" @click="handleClcikToCharacter(index)">
<img :src="item.img" alt="" />
<img :src="item.personImage" alt="" />
</div>
<div class="right">
<div class="right-top">
<div class="name">{{ item.name }}</div>
<div class="time">{{ item.time }}</div>
<div class="name">{{ item.personName }}</div>
<div class="time">{{ formatMessageTime(item.time) }}·发布于{{ item.orgName }}</div>
</div>
<div class="content">{{ item.content }}</div>
<div class="content">{{ item.remarks }}</div>
</div>
</div>
</div>
......@@ -311,10 +310,13 @@
<div class="box5-select">
<el-select v-model="box5Select" placeholder="选择领域" @change="handleBox5Change" style="width: 150px">
<el-option label="全部领域" value="全部领域" />
<el-option v-for="item in categoryList.slice(1)" :key="item.id" :label="item.name" :value="item.id" />
<el-option v-for="item in categoryList" :key="item.id" :label="item.name" :value="item.id" />
</el-select>
</div>
<div class="box5-main" id="box5Chart"></div>
<div class="box5-main" :style="{ display: !box5HasData ? 'flex' : 'block', justifyContent: 'center', alignItems: 'center' }">
<el-empty v-if="!box5HasData" description="暂无数据" :image-size="100" />
<div v-else id="box5Chart" style="width: 100%; height: 100%;"></div>
</div>
</div>
<div class="box6">
<div class="box6-header">
......@@ -358,7 +360,10 @@
/>
</el-select>
</div>
<div class="box7-main" id="box7Chart"></div>
<div class="box7-main" :style="{ display: !box7HasData ? 'flex' : 'block', justifyContent: 'center', alignItems: 'center' }">
<el-empty v-if="!box7HasData" description="暂无数据" :image-size="100" />
<div v-else id="box7Chart" style="width: 100%; height: 100%;"></div>
</div>
</div>
<div class="box8">
<div class="box8-header">
......@@ -385,12 +390,14 @@
/>
</el-select>
</div>
<div class="box8-main">
<div class="box8-main" :style="{ display: box8Data.length === 0 ? 'flex' : 'block', justifyContent: 'center', alignItems: 'center' }">
<el-empty v-if="box8Data.length === 0" description="暂无数据" :image-size="100" />
<div
v-else
class="box8-main-item"
v-for="(item, index) in box8Data"
:key="index"
@click="handleClcikToCharacter(0)"
@click="handleClcikToCharacter(index)"
>
<div class="box8-main-item-left">
<img :src="item.img" alt="" referrerpolicy="no-referrer" class="left-img" />
......@@ -436,7 +443,10 @@
/>
</el-select>
</div>
<div class="box9-main" id="box9Chart"></div>
<div class="box9-main" :style="{ display: !box9HasData ? 'flex' : 'block', justifyContent: 'center', alignItems: 'center' }">
<el-empty v-if="!box9HasData" description="暂无数据" :image-size="100" />
<div v-else id="box9Chart" style="width: 100%; height: 100%;"></div>
</div>
</div>
</div>
</div>
......@@ -447,10 +457,10 @@
<div class="btn-box">
<div
class="btn"
:class="{ btnActive: activeTabName === cate.name }"
:class="{ btnActive: activeTabName === cate.name, disabled: index !== 0 }"
v-for="(cate, index) in tabList"
:key="index"
@click="handleClickTab(cate)"
@click="index === 0 && handleClickTab(cate)"
>
{{ cate.name }}
</div>
......@@ -465,9 +475,12 @@
<div class="title">{{ "科技领域" }}</div>
</div>
<div class="select-main">
<el-checkbox-group class="checkbox-group" v-model="activeAreaList">
<el-checkbox-group class="checkbox-group" v-model="activeAreaList" @change="handleAreaChange">
<el-checkbox class="filter-checkbox" label="全部领域">
全部领域
</el-checkbox>
<el-checkbox
v-for="(area, index) in areaList"
v-for="(area, index) in cateKuList"
:key="area.id"
:label="area.id"
class="filter-checkbox"
......@@ -483,7 +496,7 @@
<div class="title">{{ "党派" }}</div>
</div>
<div class="select-main">
<el-checkbox-group class="checkbox-group" v-model="activeDpList">
<el-checkbox-group class="checkbox-group" v-model="activeDpList" @change="handleDpChange">
<el-checkbox
v-for="(dp, index) in dpList"
:key="dp.id"
......@@ -501,7 +514,7 @@
<div class="title">{{ "议院" }}</div>
</div>
<div class="select-main">
<el-checkbox-group class="checkbox-group" v-model="activeYyList">
<el-checkbox-group class="checkbox-group" v-model="activeYyList" @change="handleYyChange">
<el-checkbox
v-for="(yy, index) in yyList"
:key="yy.id"
......@@ -520,7 +533,7 @@
<div class="title">{{ "发布时间" }}</div>
</div>
<div class="select-main">
<el-checkbox-group class="checkbox-group" v-model="activePubTime">
<el-checkbox-group class="checkbox-group" v-model="activePubTime" @change="handlePubTimeChange">
<el-checkbox
v-for="(time, index) in pubTime"
:key="time.id"
......@@ -536,27 +549,27 @@
<div class="right">
<div class="right-header">
<div class="right-header-box">
<el-select v-model="footerSelect1" placeholder="选择委员会" style="width: 240px">
<el-select v-model="footerSelect1" placeholder="选择委员会" style="width: 240px" @change="handleFooterSelect1Change">
<el-option
v-for="item in footerSelectList1"
:key="item.value"
:label="item.label"
:value="item.value"
v-for="item in postOrgList"
:key="item.departmentId"
:label="item.departmentName"
:value="item.departmentId"
/>
</el-select>
</div>
<div class="right-header-box">
<el-select v-model="footerSelect2" placeholder="选择提出议员" style="width: 240px">
<el-select v-model="footerSelect2" placeholder="选择提出议员" style="width: 240px" @change="handleFooterSelect2Change">
<el-option
v-for="item in footerSelectList2"
:key="item.value"
:label="item.label"
:value="item.value"
v-for="item in postMemberList"
:key="item.memberId"
:label="item.memberName"
:value="item.memberId"
/>
</el-select>
</div>
<div class="right-header-box" style="margin-left: auto;">
<el-select v-model="releaseTime" placeholder="选择发布时间" style="width: 120px">
<el-select v-model="releaseTime" placeholder="选择排序方式" style="width: 120px" @change="handlePxChange">
<el-option
v-for="item in releaseTimeList"
:key="item.value"
......@@ -566,8 +579,8 @@
</el-select>
</div>
</div>
<div class="right-main">
<div class="right-main-box" v-for="(item, index) in footerBillList" :key="index">
<div class="right-main" v-loading="loading">
<div class="right-main-box" v-for="(item, index) in bills" :key="index" @click="handleClickToDetail()">
<div class="header">
<div class="title">{{ item.name }}</div>
<div class="en-title">{{ item.eName }}</div>
......@@ -597,22 +610,19 @@
</div>
</div>
</div>
<div class="right-main-box"></div>
<div class="right-main-box"></div>
<div class="right-main-box"></div>
</div>
<div class="right-footer">
<div class="footer-left">
{{ `共1149项调查` }}
{{ `共${total}项调查` }}
</div>
<div class="footer-right">
<el-pagination
@current-change="handleCurrentChange"
:pageSize="12"
:page-size="pageSize"
:current-page="currentPage"
background
layout="prev, pager, next"
:total="1149"
:total="total"
/>
</div>
</div>
......@@ -637,7 +647,12 @@ import {
getBillOverviewKeyTK,
getBillCount,
getBillPostOrg,
getMemberProposal
getMemberProposal,
getNews,
getRemarks,
getPostOrgList,
getPostMemberList,
getBills
} from "@/api/bill/billHome";
import DivideHeader from "@/components/DivideHeader.vue";
......@@ -692,6 +707,18 @@ import { iteratee } from "lodash";
const searchBillText = ref("");
const formatMessageTime = (timeStr) => {
if (!timeStr) return '';
// 假设格式为 2025-11-02T12:09:45
if (timeStr.includes('T')) {
const [date, time] = timeStr.split('T');
const [year, month, day] = date.split('-');
const [hour, minute] = time.split(':');
return `${year}-${month}-${day} ${hour}:${minute}`;
}
return timeStr;
};
// 跳转人物主页
const handleClcikToCharacter = index => {
let type;
......@@ -722,6 +749,7 @@ const currentPage = ref(1);
// 处理页码改变事件
const handleCurrentChange = page => {
currentPage.value = page;
handleGetBills();
};
const containerRef = ref(null);
......@@ -772,6 +800,12 @@ const handleToMoreRiskSignal = () => {
const route = router.resolve("/riskSignal");
window.open(route.href, "_blank");
};
// 跳转新闻详情页
const handleClickToNewsDetail = () => {
// window.sessionStorage.setItem("newsId", "119_HR_1");
const route = router.resolve("/newsAnalysis");
window.open(route.href, "_blank");
};
// 查看更多新闻资讯
const handleToMoreNews = () => {
......@@ -780,161 +814,135 @@ const handleToMoreNews = () => {
};
// 风险信号
const warningList = ref([
{
title: "美国大而美法案落地,总统签署通过",
time: "一天前",
status: "特别重大"
},
{
title: "美大而美法案7月1日以51:50的票数通过...",
time: "一天前",
status: "特别重大"
},
{
title: "首次提出“限制外国敏感实体获取补贴”",
time: "一天前",
status: "重大风险"
},
{
title: "将中国企业海外子公司、合资公司纳入受...",
time: "一天前",
status: "重大风险"
},
{
title: "H.R.8333《生物安全法案》将华大基因等...",
time: "一天前",
status: "一般风险"
}
]);
const warningList = ref([]);
// 资源库 法案列表
const billList = ref([
{
billName: "大而美法案",
introductionDate: "2025年7月4日",
status: "特别重大风险",
tagList: ["集成电路", "人工智能"],
img: bill1,
yuan: "众议院",
dangpai: "共和党"
},
{
billName: "GENIUS稳定币法案",
introductionDate: "2025年7月5日",
status: "",
tagList: ["集成电路", "人工智能"],
img: bill2,
yuan: "众议院",
dangpai: "共和党"
},
{
billName: "美越贸易协议",
introductionDate: "2025年7月6日",
status: "",
tagList: ["集成电路", "人工智能"],
img: bill3,
yuan: "众议院",
dangpai: "共和党"
},
{
billName: "美越贸易协议",
introductionDate: "2025年7月7日",
status: "特别重大风险",
tagList: ["集成电路", "人工智能"],
img: bill4,
yuan: "众议院",
dangpai: "共和党"
},
{
billName: "汽车零部件25%关税实施规则",
introductionDate: "2025年7月10日",
status: "重大风险",
tagList: ["集成电路", "人工智能"],
img: bill5,
yuan: "众议院",
dangpai: "共和党"
},
{
billName: "汽车零部件25%关税实施规则",
introductionDate: "2025年7月12日",
status: "",
tagList: ["集成电路", "人工智能"],
img: bill6,
yuan: "众议院",
dangpai: "共和党"
},
{
billName: "小额豁免包裹政策调整",
introductionDate: "2025年7月14日",
status: "特别重大风险",
tagList: ["集成电路", "人工智能"],
img: bill7,
yuan: "众议院",
dangpai: "共和党"
},
{
billName: "NIH预算否决案",
introductionDate: "2025年7月15日",
status: "重大风险",
tagList: ["集成电路", "人工智能"],
img: bill8,
yuan: "众议院",
dangpai: "共和党"
},
{
billName: "得州国会选区重划法案",
introductionDate: "2025年7月17日",
status: "一般风险",
tagList: ["集成电路", "人工智能"],
img: bill9,
yuan: "众议院",
dangpai: "共和党"
},
{
billName: "美越贸易协议",
introductionDate: "2025年7月24日",
status: "",
tagList: ["集成电路", "人工智能"],
img: bill10,
yuan: "众议院",
dangpai: "共和党"
},
{
billName: "美越贸易协议",
introductionDate: "2025年8月4日",
status: "",
tagList: ["集成电路", "人工智能"],
img: bill11,
yuan: "众议院",
dangpai: "共和党"
},
{
billName: "美越贸易协议",
introductionDate: "2025年8月8日",
status: "特别重大风险",
tagList: ["集成电路", "人工智能"],
img: bill12,
yuan: "众议院",
dangpai: "共和党"
},
{
billName: "美越贸易协议",
introductionDate: "2025年8月8日",
status: "特别重大风险",
tagList: ["集成电路", "人工智能"],
img: bill12,
yuan: "众议院",
dangpai: "共和党"
}
]);
// const billList = ref([
// {
// billName: "大而美法案",
// introductionDate: "2025年7月4日",
// status: "特别重大风险",
// tagList: ["集成电路", "人工智能"],
// img: bill1,
// yuan: "众议院",
// dangpai: "共和党"
// },
// {
// billName: "GENIUS稳定币法案",
// introductionDate: "2025年7月5日",
// status: "",
// tagList: ["集成电路", "人工智能"],
// img: bill2,
// yuan: "众议院",
// dangpai: "共和党"
// },
// {
// billName: "美越贸易协议",
// introductionDate: "2025年7月6日",
// status: "",
// tagList: ["集成电路", "人工智能"],
// img: bill3,
// yuan: "众议院",
// dangpai: "共和党"
// },
// {
// billName: "美越贸易协议",
// introductionDate: "2025年7月7日",
// status: "特别重大风险",
// tagList: ["集成电路", "人工智能"],
// img: bill4,
// yuan: "众议院",
// dangpai: "共和党"
// },
// {
// billName: "汽车零部件25%关税实施规则",
// introductionDate: "2025年7月10日",
// status: "重大风险",
// tagList: ["集成电路", "人工智能"],
// img: bill5,
// yuan: "众议院",
// dangpai: "共和党"
// },
// {
// billName: "汽车零部件25%关税实施规则",
// introductionDate: "2025年7月12日",
// status: "",
// tagList: ["集成电路", "人工智能"],
// img: bill6,
// yuan: "众议院",
// dangpai: "共和党"
// },
// {
// billName: "小额豁免包裹政策调整",
// introductionDate: "2025年7月14日",
// status: "特别重大风险",
// tagList: ["集成电路", "人工智能"],
// img: bill7,
// yuan: "众议院",
// dangpai: "共和党"
// },
// {
// billName: "NIH预算否决案",
// introductionDate: "2025年7月15日",
// status: "重大风险",
// tagList: ["集成电路", "人工智能"],
// img: bill8,
// yuan: "众议院",
// dangpai: "共和党"
// },
// {
// billName: "得州国会选区重划法案",
// introductionDate: "2025年7月17日",
// status: "一般风险",
// tagList: ["集成电路", "人工智能"],
// img: bill9,
// yuan: "众议院",
// dangpai: "共和党"
// },
// {
// billName: "美越贸易协议",
// introductionDate: "2025年7月24日",
// status: "",
// tagList: ["集成电路", "人工智能"],
// img: bill10,
// yuan: "众议院",
// dangpai: "共和党"
// },
// {
// billName: "美越贸易协议",
// introductionDate: "2025年8月4日",
// status: "",
// tagList: ["集成电路", "人工智能"],
// img: bill11,
// yuan: "众议院",
// dangpai: "共和党"
// },
// {
// billName: "美越贸易协议",
// introductionDate: "2025年8月8日",
// status: "特别重大风险",
// tagList: ["集成电路", "人工智能"],
// img: bill12,
// yuan: "众议院",
// dangpai: "共和党"
// },
// {
// billName: "美越贸易协议",
// introductionDate: "2025年8月8日",
// status: "特别重大风险",
// tagList: ["集成电路", "人工智能"],
// img: bill12,
// yuan: "众议院",
// dangpai: "共和党"
// }
// ]);
// 当前展示法案列表
const curBillList = computed(() => {
const startIndex = (currentPage.value - 1) * 12;
const endIndex = startIndex + 12;
return billList.value.slice(startIndex, endIndex);
});
// const curBillList = computed(() => {
// const startIndex = (currentPage.value - 1) * 12;
// const endIndex = startIndex + 12;
// return billList.value.slice(startIndex, endIndex);
// });
const box7selectetedTime = ref("2025");
const box7YearList = ref([
......@@ -975,52 +983,24 @@ const box8YearList = ref([
value: "2022"
}
]);
const releaseTime = ref("近一年发布"); // 发布时间
// 排序方式
const releaseTime = ref(true);
const releaseTimeList = ref([
{
label: "近半年发布",
value: "近半年发布"
},
{
label: "近一年发布",
value: "近一年发布"
},
{
label: "近两年发布",
value: "近两年发布"
},
{
label: "近三年发布",
value: "近三年发布"
label: "正序",
value: true
},
{
label: "近五年发布",
value: "近五年发布"
label: "倒序",
value: false
}
]);
// 涉华法案数量使用的领域分类列表
const categoryList = ref([]);
// 资源库使用的领域分类列表
const cateKuList = ref([]);
const categoryList = ref([
// "全部分类",
// "生物科技",
// "集成电路",
// "通信网络",
// "量子科技",
// "新能源",
// "新一代信息技术",
// "海洋",
// "先进制造",
// "新材料",
// "航空航天",
]);
const curCategoryList = ref([]);
const curCategoryIndex = ref(0);
const SHOW_COUNT = 10;
const activeCate = ref("全部分类");
const activeHylyId = ref("");
// 获取领域分类
const handleGetHylyList = async () => {
......@@ -1028,79 +1008,14 @@ const handleGetHylyList = async () => {
const res = await getHylyList();
console.log("行业领域列表", res);
categoryList.value = res.data;
const obj = {
id: 0,
pid: "",
name: "全部分类"
};
categoryList.value = [obj, ...categoryList.value];
curCategoryList.value = categoryList.value.slice(0, SHOW_COUNT);
cateKuList.value = res.data;
} catch (error) {}
};
const handleClickCate = cate => {
console.log(cate);
activeCate.value = cate.name;
activeHylyId.value = cate.id;
handleGetBillsByType();
};
// 新闻资讯
const newsList = ref([
{
img: News1,
title: "美政府停摆仍持续,拨款法案存缺陷,但两党磋商露曙光",
content: `美国政府停摆已持续34天,距离历史上最长的停摆纪录仅差一天,参议院已先后13次尝试...`,
from: "11-4 · 华盛顿邮报"
},
{
img: News2,
title: "美参议院通过决议,要求终止特朗普全球关税政策",
content: `参议院以51票赞成、47票反对通过一项决议,旨在终止特朗普实施的全面关税政策,四名......`,
from: "11-4 · 纽约时报"
},
{
img: News3,
title: "美众院通过950亿美元对外援助法案,包含对台军援",
content: `国会众议院在4月通过了大规模对外援助法案,其中包括为“印太安全”提供资金的条款,......`,
from: "11-3 · 洛杉矶时报"
},
{
img: News4,
title: "“大而美”法案在激烈争议中通过",
content: `特朗普力推的大规模税收与支出法案在国会以微弱优势通过。该法案因大幅削减医疗补助和......`,
from: "11-3 · 今日美国"
},
{
img: News5,
title: "美政府“停摆”追平历史最长纪录,民生多领域受重创",
content: `联邦政府“停摆”进入第35天,追平历史纪录。食品救济项目资金中断,数百万低收入民......`,
from: "11-2 · ​福克斯新闻网"
}
]);
const newsList = ref([]);
// 社交媒体
const messageList = ref([
{
img: Message1,
name: "唐纳德·特朗普",
time: "15:23 · 发布于真实社交",
content: `埃隆·马斯克在强力支持我竞选总统之前,早就知道我强烈反对‘电动汽车强制令’。这太荒谬了,这一直是我竞选活动的主要部分。电动汽车没问题,但不应该强迫每个人都拥有一辆。埃隆获得的补贴可能远远超过历史上任何一个人。如果没有补贴,埃隆可能不得不关门大吉,回到南非老家。`
},
{
img: Message2,
name: "埃隆·马斯克",
time: "14:49 · 发布于X",
content: `如果这个疯狂的支出法案获得通过,‘美国党’将在第二天成立。`
},
{
img: Message3,
name: "塞巴斯蒂安·马拉比",
time: "11:05 · 发布于X",
content: `提出特朗普政府的AI政策强调技术开放与快速应用,但可能以牺牲安全防范为代价,开启了“潘多拉魔盒”。`
}
]);
const messageList = ref([]);
// 获取热门法案
const handleGetHotBills = async () => {
......@@ -1115,8 +1030,11 @@ const handleGetHotBills = async () => {
// 获取法案风险信号
const handleGetBillRiskSignal = async () => {
const params = {
moduleId: "0100"
};
try {
const res = await getBillRiskSignal();
const res = await getBillRiskSignal(params);
console.log("法案风险信号", res);
if (res.code === 200) {
warningList.value = res.data;
......@@ -1124,25 +1042,180 @@ const handleGetBillRiskSignal = async () => {
} catch (error) {}
};
// 根据法案类型获取法案列表
const handleGetBillsByType = async () => {
// 获取新闻资讯
const handleGetNews = async () => {
const params = {
type: activeHylyId.value
moduleId: "0100"
};
try {
const res = await getBillsByType(params);
console.log("根据法案类型获取法案列表", res);
billList.value = res.data.map(item => {
return {
billId: item.billId,
billName: item.billName,
introductionDate: item.introductionDate,
img: bill1
const res = await getNews(params);
console.log("新闻资讯", res);
if (res.code === 200) {
newsList.value = res.data;
}
} catch (error) {}
};
// 获取社交媒体
const handleGetRemarks = async () => {
const params = {
moduleId: "0100"
};
});
try {
const res = await getRemarks(params);
console.log("社交媒体", res);
if (res.code === 200) {
messageList.value = res.data;
}
} catch (error) {}
};
// 获取提出部门列表
const postOrgList = ref([{ departmentName: "全部委员会", departmentId: "全部委员会" }]);
const handleGetPostOrgList = async () => {
try {
const res = await getPostOrgList();
console.log("提出部门列表", res);
if (res.code === 200) {
const list = res.data.filter(item => item.departmentId);
postOrgList.value = [
{ departmentName: "全部委员会", departmentId: "全部委员会" },
...list
];
}
} catch (error) {}
};
// 获取提出议员列表
const postMemberList = ref([{ memberName: "全部提出议员", memberId: "全部提出议员" }]);
const handleGetPostMemberList = async () => {
try {
const res = await getPostMemberList();
console.log("提出议员列表", res);
if (res.code === 200) {
const list = res.data.filter(item => item.memberId);
postMemberList.value = [
{ memberName: "全部提出议员", memberId: "全部提出议员" },
...list
];
}
} catch (error) {}
};
// 获取资源库
const bills = ref([]);
const total = ref(0);
const pageSize = ref(4);
const loading = ref(false);
const abortController = ref(null);
const handleGetBills = async () => {
// 取消上一次未完成的请求
if (abortController.value) {
abortController.value.abort();
}
// 创建新的 AbortController
abortController.value = new AbortController();
loading.value = true;
const params = {
currentPage: currentPage.value - 1, // Standard Spring Boot page index is 0-based
pageSize: pageSize.value
};
if (!activeYyList.value.includes("全部议院")) {
params.congressIds = activeYyList.value.join(',');
}
if (footerSelect1.value !== "全部委员会") {
params.departmentId = footerSelect1.value;
}
if (!activeDpList.value.includes("全部党派")) {
params.partyIds = activeDpList.value.join(',');
}
if (footerSelect2.value !== "全部提出议员") {
params.personId = footerSelect2.value;
}
if (!activeAreaList.value.includes("全部领域")) {
params.researchIds = activeAreaList.value.join(',');
}
if (releaseTime.value !== true) {
params.sortFun = releaseTime.value;
}
if (!activePubTime.value.includes("全部时间")) {
params.years = activePubTime.value.join(',');
}
try {
const res = await getBills(params, abortController.value.signal);
console.log("资源库列表", res);
if (res.code === 200) {
if (res.data && res.data.content) {
bills.value = res.data.content.map(item => ({
// id: item.billId,
name: item.billName,
eName: item.billNameEn,
tcr: item.personName,
wyh: item.congressName,
areaList: item.hylyList || [],
zxdy: item.latestAction,
progress: item.stageList || []
}));
total.value = res.data.totalElements;
} else {
bills.value = [];
total.value = 0;
}
}else {
bills.value = [];
total.value = 0;
}
loading.value = false;
} catch (error) {
if (error.name !== 'AbortError') {
console.error(error);
loading.value = false;
}
}
};
// 处理选择委员会变化
const handleFooterSelect1Change = (val) => {
console.log("选择委员会变化", val);
// 等会再做处理
handleGetBills();
};
// 处理选择议员变化
const handleFooterSelect2Change = (val) => {
console.log("选择议员变化", val);
// 等会再做处理
handleGetBills();
};
// 处理选择排序方式变化
const handlePxChange = (val) => {
console.log("选择排序方式变化", val);
// 等会再做处理
handleGetBills();
};
// 根据法案类型获取法案列表
// const handleGetBillsByType = async () => {
// const params = {
// type: activeHylyId.value
// };
// try {
// const res = await getBillsByType(params);
// console.log("根据法案类型获取法案列表", res);
// billList.value = res.data.map(item => {
// return {
// billId: item.billId,
// billName: item.billName,
// introductionDate: item.introductionDate,
// img: bill1
// };
// });
// } catch (error) {}
// };
// 涉华法案数量
const box5Select = ref("全部领域");
const box5Data = ref({
......@@ -1171,6 +1244,7 @@ const box5Data = ref({
}
]
});
const box5HasData = ref(true);
const handleGetBillCount = async () => {
try {
let params = {};
......@@ -1179,7 +1253,8 @@ const handleGetBillCount = async () => {
}
const res = await getBillCount(params);
console.log("涉华法案统计", res);
if (res.code === 200 && res.data) {
if (res.code === 200 && res.data && res.data.length > 0) {
box5HasData.value = true;
const sortedData = res.data.sort((a, b) => a.month.localeCompare(b.month));
box5Data.value = {
title: sortedData.map(item => item.month),
......@@ -1196,16 +1271,36 @@ const handleGetBillCount = async () => {
percent: sortedData.map(item => item.percent)
};
} else {
// 保持默认数据或清空
// box5Data.value = {};
// 接口异常(如500)时,清空图表数据以避免报错或显示错误信息
box5HasData.value = false;
box5Data.value = {
title: [],
data: [
{ name: "提出法案", value: [] },
{ name: "通过法案", value: [] }
],
percent: []
};
}
} catch (error) {
console.error("获取涉华法案统计error", error);
// 发生错误时同样清空数据
box5HasData.value = false;
box5Data.value = {
title: [],
data: [
{ name: "提出法案", value: [] },
{ name: "通过法案", value: [] }
],
percent: []
};
}
};
const handleBox5 = async () => {
await handleGetBillCount();
if (box5HasData.value) {
await nextTick();
const proposed = box5Data.value.data[0].value;
const passed = box5Data.value.data[1].value;
const rate = box5Data.value.percent || proposed.map((p, i) => {
......@@ -1214,6 +1309,7 @@ const handleBox5 = async () => {
});
let box5Chart = getMultiLineChart(box5Data.value.title, proposed, passed, rate);
setChart(box5Chart, "box5Chart");
}
};
const handleBox5Change = () => {
......@@ -1221,11 +1317,16 @@ const handleBox5Change = () => {
};
// 法案提出部门
const box7HasData = ref(true);
const handleBox7Data = async () => {
try {
const res = await getBillPostOrg({ year: box7selectetedTime.value });
console.log("法案提出部门", res);
if (res.code === 200 && res.data) {
if (res.code === 200 && res.data && res.data.length > 0) {
box7HasData.value = true;
// 必须等待DOM更新,因为v-if切换可能导致元素刚被创建
await nextTick();
const apiData = res.data;
const houseItems = apiData.filter(i => i.congressName === "House");
......@@ -1250,9 +1351,14 @@ const handleBox7Data = async () => {
const box7Chart = getDoublePieChart(data1, data2);
setChart(box7Chart, "box7Chart");
} else {
// 接口异常(如500)时,清空图表数据以避免报错或显示错误信息
box7HasData.value = false;
setChart({}, "box7Chart");
}
} catch (error) {
console.error("获取法案提出部门数据失败", error);
box7HasData.value = false;
}
};
......@@ -1261,28 +1367,7 @@ watch(box7selectetedTime, () => {
});
// 关键条款
const wordCloudData = ref([
{ name: "限制中国获取能源技术", value: 100 },
{ name: "未实现赤字控制目标", value: 66 },
{ name: "关注核聚变能源研究", value: 77 },
{ name: "抵制外国人才争夺", value: 35 },
{ name: "进行可再生能源税收减免", value: 88 },
{ name: "评估中美现代化技术", value: 57 },
{ name: "应对中国制造2025战略", value: 72 },
{ name: "实施能源税收延期", value: 18 },
{ name: "限制采购中国产电池", value: 34 },
{ name: "加强美国在核能领域得到领导力", value: 16 },
{ name: "发展替代燃料", value: 72 },
{ name: "发展风能", value: 58 },
{ name: "发展太阳能", value: 24 },
{ name: "施加额外能源出口限制", value: 33 },
{ name: "评估中美能源技术", value: 47 },
{ name: "禁止资助中国能源项目", value: 32 },
{ name: "不得向中国机构提供援助", value: 62 },
{ name: "开展先进生物能源计划", value: 51 },
{ name: "减少燃料对外依赖", value: 81 },
{ name: "加强供应链风险管理", value: 73 }
]);
const wordCloudData = ref([]);
const handleGetKeyTK = async () => {
try {
const res = await getBillOverviewKeyTK();
......@@ -1306,37 +1391,7 @@ const handleBox6 = async () => {
};
// 涉华领域分布
const box9ChartColorList = ref(["#4096FF", "#FFA39E", "#ADC6FF", "#FFC069", "#B5F5EC", "#B37FEB", "#D6E4FF"]);
const box9ChartData = ref([
// {
// name: "半导体",
// value: 50
// },
// {
// name: "电子设备",
// value: 46
// },
// {
// name: "显示技术",
// value: 40
// },
// {
// name: "新能源",
// value: 32
// },
// {
// name: "通信设备",
// value: 31
// },
// {
// name: "汽车",
// value: 30
// },
// {
// name: "其他",
// value: 24
// }
]);
const box9ChartData = ref([]);
const box9selectetedTime = ref("2025");
const box9YearList = ref([
{
......@@ -1356,6 +1411,7 @@ const box9YearList = ref([
value: "2022"
}
]);
const box9HasData = ref(true);
const getBox9Data = async () => {
const params = {
year: box9selectetedTime.value
......@@ -1363,13 +1419,22 @@ const getBox9Data = async () => {
try {
const res = await getBillIndustry(params);
console.log("box9-涉华法案领域分布", res.data);
if (res.code === 200 && res.data) {
if (res.code === 200 && res.data && res.data.length > 0) {
box9HasData.value = true;
box9ChartData.value = res.data;
} else {
box9HasData.value = false;
box9ChartData.value = [];
}
} catch (error) {
box9HasData.value = false;
box9ChartData.value = [];
}
} catch (error) {}
};
const handleBox9Data = async () => {
await getBox9Data();
if (box9HasData.value) {
await nextTick();
const box9Chart = getPieChart(
box9ChartData.value.map(item => {
return {
......@@ -1379,82 +1444,12 @@ const handleBox9Data = async () => {
})
);
setChart(box9Chart, "box9Chart");
}
};
const box7Data = ref([
[
{
name: "众议院",
value: 298
},
{
name: "参议院",
value: 149
}
],
[
{
name: "拨款委员会",
value: 50,
type: "众议院"
},
{
name: "筹款委员会",
value: 50,
type: "众议院"
},
{
name: "外交事务委员会",
value: 46,
type: "众议院"
},
{
name: "国土安全委员会",
value: 40,
type: "众议院"
},
{
name: "司法委员会",
value: 40,
type: "众议院"
},
{
name: "军事委员会",
value: 40,
type: "众议院"
},
{
name: "能源和商业委员会",
value: 32,
type: "众议院"
},
{
name: "拨款委员会1",
value: 32,
type: "参议院"
},
{
name: "财政委员会",
value: 31,
type: "参议院"
},
{
name: "能源",
value: 30,
type: "参议院"
},
{
name: "能源1",
value: 30,
type: "参议院"
},
{
name: "其他",
value: 24,
type: "参议院"
}
]
]);
watch(box9selectetedTime, () => {
handleBox9Data();
});
const box8Data = ref([]);
......@@ -1471,9 +1466,13 @@ const handleBox8Data = async () => {
dangpai: Cyy,
yuan: item.position === "Democratic" ? Mzd : Ghd
}));
} else {
// 接口异常(如500)时,清空图表数据以避免报错或显示错误信息
box8Data.value = [];
}
} catch (error) {
console.error("获取关键议员提案失败", error);
box8Data.value = [];
}
};
......@@ -1522,96 +1521,136 @@ const handleClickTab = tab => {
activeTabName.value = tab.name;
};
const areaList = [
{ id: "全部领域", name: "全部领域" },
{ id: "人工智能", name: "人工智能" },
{ id: "集成电路", name: "集成电路" },
{ id: "通信网络", name: "通信网络" },
{ id: "先进制造", name: "先进制造" },
{ id: "量子科技", name: "量子科技" },
{ id: "生物科技", name: "生物科技" },
{ id: "能源", name: "能源" },
{ id: "航空航天", name: "航空航天" },
{ id: "新材料", name: "新材料" },
{ id: "海洋", name: "海洋" }
];
const activeAreaList = ref(["全部领域"]);
const handleAreaChange = (val) => {
if (val.includes("全部领域") && val.length > 1) {
if (val[val.length - 1] === "全部领域") {
activeAreaList.value = ["全部领域"];
} else {
activeAreaList.value = val.filter(item => item !== "全部领域");
}
} else if (val.length === 0) {
activeAreaList.value = ["全部领域"];
}
// 打印 activeAreaList.value
console.log(activeAreaList.value);
handleGetBills();
};
const dpList = ref([
{ id: "全部党派", name: "全部党派" },
{ id: "民主党", name: "民主党" },
{ id: "共和党", name: "共和党" }
{ id: "Democratic", name: "民主党" },
{ id: "Republican", name: "共和党" }
]);
const activeDpList = ref(["全部党派"]);
// 处理选择党派变化
const handleDpChange = (val) => {
if (val.includes("全部党派") && val.length > 1) {
if (val[val.length - 1] === "全部党派") {
activeDpList.value = ["全部党派"];
} else {
activeDpList.value = val.filter(item => item !== "全部党派");
}
} else if (val.length === 0) {
activeDpList.value = ["全部党派"];
}
console.log("选择党派变化", activeDpList.value);
handleGetBills();
};
const yyList = ref([
{ id: "全部议院", name: "全部议院" },
{ id: "参议院", name: "参议院" },
{ id: "众议院", name: "众议院" }
{ id: "S", name: "参议院" },
{ id: "H", name: "众议院" }
]);
const activeYyList = ref(["全部议院"]);
// 处理选择议院变化
const handleYyChange = (val) => {
if (val.includes("全部议院") && val.length > 1) {
if (val[val.length - 1] === "全部议院") {
activeYyList.value = ["全部议院"];
} else {
activeYyList.value = val.filter(item => item !== "全部议院");
}
} else if (val.length === 0) {
activeYyList.value = ["全部议院"];
}
console.log("选择议院变化", activeYyList.value);
handleGetBills();
};
const pubTime = ref([
{ id: "全部时间", name: "全部时间" },
{ id: "2025", name: "2025年" },
{ id: "2024", name: "2024年" },
{ id: "2023", name: "2023年" },
{ id: "2022", name: "2022年" },
{ id: "2021", name: "2021年" },
{ id: "更早时间", name: "更早时间" }
{ id: "2025", name: "2025年" },
{ id: "2024", name: "2024年" },
{ id: "2023", name: "2023年" },
{ id: "2022", name: "2022年" },
{ id: "2021", name: "2021年" },
// { id: "更早时间", name: "更早时间" }
]);
const activePubTime = ref(["全部时间"]);
const footerSelectList1 = ref([
{
label: "全部委员会",
value: "全部委员会"
// 处理选择时间变化
const handlePubTimeChange = (val) => {
if (val.includes("全部时间") && val.length > 1) {
if (val[val.length - 1] === "全部时间") {
activePubTime.value = ["全部时间"];
} else {
activePubTime.value = val.filter(item => item !== "全部时间");
}
]);
const footerSelect1 = ref("全部委员会");
const footerSelectList2 = ref([
{
label: "全部提出议员",
value: "全部提出议员"
} else if (val.length === 0) {
activePubTime.value = ["全部时间"];
}
]);
console.log("选择时间变化", activePubTime.value);
handleGetBills();
};
const footerSelect1 = ref("全部委员会");
const footerSelect2 = ref("全部提出议员");
const footerBillList = ref([
{
name: "H.R.1-大而美法案",
eName: "One Big Beautiful Bill Act",
tcr: "乔迪·阿灵顿等2人",
wyh: "众议院-预算委员会",
areaList: ["集成电路", "人工智能"],
zxdy: "2025.07.04 成为公法 No: 119-21",
progress: []
},
{
name: "H.R.1-大而美法案",
eName: "One Big Beautiful Bill Act",
tcr: "乔迪·阿灵顿等2人",
wyh: "众议院-预算委员会",
areaList: ["集成电路", "人工智能"],
zxdy: "2025.07.04 成为公法 No: 119-21",
progress: []
},
{
name: "H.R.1-大而美法案",
eName: "One Big Beautiful Bill Act",
tcr: "乔迪·阿灵顿等2人",
wyh: "众议院-预算委员会",
areaList: ["集成电路", "人工智能"],
zxdy: "2025.07.04 成为公法 No: 119-21",
progress: []
}
]);
// const footerBillList = ref([
// {
// name: "H.R.1-大而美法案",
// eName: "One Big Beautiful Bill Act",
// tcr: "乔迪·阿灵顿等2人",
// wyh: "众议院-预算委员会",
// areaList: ["集成电路", "人工智能"],
// zxdy: "2025.07.04 成为公法 No: 119-21",
// progress: []
// },
// {
// name: "H.R.1-大而美法案",
// eName: "One Big Beautiful Bill Act",
// tcr: "乔迪·阿灵顿等2人",
// wyh: "众议院-预算委员会",
// areaList: ["集成电路", "人工智能"],
// zxdy: "2025.07.04 成为公法 No: 119-21",
// progress: []
// },
// {
// name: "H.R.1-大而美法案",
// eName: "One Big Beautiful Bill Act",
// tcr: "乔迪·阿灵顿等2人",
// wyh: "众议院-预算委员会",
// areaList: ["集成电路", "人工智能"],
// zxdy: "2025.07.04 成为公法 No: 119-21",
// progress: []
// }
// ]);
onMounted(async () => {
handleGetHylyList();
// 获取风险信号
handleGetBillRiskSignal();
// 获取新闻资讯
handleGetNews();
// 获取社交媒体
handleGetRemarks();
// 获取提出部门列表
handleGetPostOrgList();
// 获取提出议员列表
handleGetPostMemberList();
// 获取资源库
handleGetBills();
// handleGetBillsByType();
......@@ -2441,6 +2480,10 @@ onUnmounted(() => {});
width: 749px;
margin-left: 21px;
border-bottom: 1px solid rgba(240, 242, 244, 1);
cursor: pointer;
&:hover {
background: var(--color-bg-hover);
}
.left {
width: 72px;
height: 48px;
......@@ -2459,7 +2502,7 @@ onUnmounted(() => {});
justify-content: space-between;
.title {
margin-top: 13px;
width: 520px;
width: 440px;
height: 24px;
color: rgba(59, 65, 75, 1);
font-family: Microsoft YaHei;
......@@ -3108,6 +3151,13 @@ onUnmounted(() => {});
background: var(--color-main-active);
}
}
.disabled {
cursor: not-allowed;
opacity: 0.5;
&:hover {
background: transparent;
}
}
}
.select-box {
height: 42px;
......@@ -3120,9 +3170,12 @@ onUnmounted(() => {});
height: 1401px;
margin: 0 auto;
display: flex;
justify-content: space-between;
align-items: flex-start;
.left {
width: 300px;
height: 784px;
// min-height: 784px;
padding-bottom: 33px;
box-sizing: border-box;
border: 1px solid rgba(234, 236, 238, 1);
border-radius: 10px;
......@@ -3186,22 +3239,25 @@ onUnmounted(() => {});
}
.right-main {
height: 1264px;
overflow: hidden;
// overflow: hidden;
.right-main-box {
width: 1280px;
height: 300px;
padding-bottom: 24px;
border-radius: 10px;
box-shadow: 0px 0px 10px 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);
margin-bottom: 16px;
overflow: hidden;
cursor: pointer;
.header {
height: 91px;
width: 1200px;
margin: 0 auto;
border-bottom: 1px solid rgba(234, 236, 238, 1);
padding-top: 19px;
.title {
margin-top: 19px;
// margin-top: 19px;
// padding-top: 19px;
height: 26px;
color: rgba(59, 65, 75, 1);
font-family: Microsoft YaHei;
......@@ -3229,13 +3285,13 @@ onUnmounted(() => {});
margin-top: 2px;
.item {
margin-top: 12px;
height: 24px;
// height: 24px;
display: flex;
.item-left {
width: 91px;
height: 24px;
color: rgba(59, 65, 75, 1);
font-family: Microsoft YaHei;
width: 100px;
// height: 24px;
color: rgb(59, 65, 75);
font-family: "Microsoft YaHei";
font-size: 16px;
font-weight: 700;
line-height: 24px;
......@@ -3243,9 +3299,10 @@ onUnmounted(() => {});
text-align: left;
}
.item-right {
max-width: 1000px;
margin-left: 10px;
color: rgba(95, 101, 108, 1);
font-family: Microsoft YaHei;
font-family: "Microsoft YaHei";
font-size: 16px;
font-weight: 400;
line-height: 24px;
......@@ -3263,7 +3320,7 @@ onUnmounted(() => {});
border-radius: 4px;
background: rgba(231, 243, 255, 1);
color: var(--color-main-active);
font-family: Microsoft YaHei;
font-family: "Microsoft YaHei";
font-size: 14px;
font-weight: 400;
}
......@@ -3280,7 +3337,7 @@ onUnmounted(() => {});
padding-top: 12px;
.footer-left {
color: rgba(59, 65, 75, 1);
font-family: Microsoft YaHei;
font-family: "Microsoft YaHei";
font-size: 16px;
font-weight: 400;
line-height: 32px;
......@@ -3297,7 +3354,7 @@ onUnmounted(() => {});
justify-content: space-between;
.footer-left {
color: rgba(59, 65, 75, 1);
font-family: Microsoft YaHei;
font-family: "Microsoft YaHei";
font-size: 16px;
font-weight: 400;
line-height: 32px;
......
......@@ -16,11 +16,9 @@ const getDoublePieChart = (data1, data2) => {
},
label: {
position: 'inside',
textStyle: {
fontSize: '16px',
fontWeight: 700,
// color: '#333'
}
},
data: data1.map(item => {
return {
......
......@@ -212,6 +212,7 @@ onMounted(() => {
height: 1016px;
background: rgba(249, 250, 252, 1);
position: relative;
margin: 0 auto;
.layout-header {
width: 1920px;
height: 64px;
......
......@@ -37,10 +37,10 @@
<div class="right1-item" v-for="item in basicInfo.hylyList" :key="item">{{ item }}</div>
</div>
</div>
<div class="box1-right-item">
<!-- <div class="box1-right-item">
<div class="item-left">法案类别:</div>
<div class="item-right">{{ basicInfo.typeName }}</div>
</div>
</div> -->
<div class="box1-right-item">
<div class="item-left">委员会报告:</div>
<div class="item-right2" v-if="basicInfo.reportList">
......@@ -132,11 +132,11 @@
</div> -->
</div>
</div>
<div class="box2-footer">
<!-- <div class="box2-footer">
<div class="btn-more">
<img src="../assets/images/btn-more.png" alt="" />
</div>
</div>
</div> -->
</div>
</div>
<div class="introduction-wrap-right">
......@@ -154,7 +154,7 @@
</div>
<div class="introduction-wrap-right-main">
<div class="right-main-box1">
<div class="name-box">
<!-- <div class="name-box">
<el-select
v-model="selectValue"
placeholder="请选择"
......@@ -174,7 +174,7 @@
{{ item.name }}
</div>
</div>
</div>
</div> -->
<div class="info-box">
<div class="info-left">
<img src="./assets/images/usr1.png" alt="" />
......@@ -889,6 +889,7 @@ onMounted(() => {
background: #fff;
border-radius: 10px;
box-shadow: 0px 0px 15px 0px rgba(22, 119, 255, 0.1);
position: relative;
.box2-main {
margin-top: 10px;
height: calc(100% - 70px); // Subtract header height
......@@ -1001,6 +1002,11 @@ onMounted(() => {
margin-top: 7px;
display: flex;
justify-content: center;
position: absolute;
bottom: 10px;
left: 50%;
transform: translateX(-50%);
z-index: 99;
.btn-more {
width: 108px;
height: 32px;
......@@ -1024,7 +1030,8 @@ onMounted(() => {
box-shadow: 0px 0px 15px 0px rgba(22, 119, 255, 0.1);
.introduction-wrap-right-main {
.right-main-box1 {
height: 218px;
// height: 218px; 将选择框去掉后高度变化
height: 171px;
// border-bottom: 1px solid rgb(243, 243, 244);
.name-box {
display: flex;
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论