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

法案接口和样式更新

上级 b8fd958d
...@@ -39,10 +39,37 @@ export function getHotBills() { ...@@ -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({ return request({
method: 'GET', method: 'GET',
url: '/api/BillOverview/riskSignal', url: `/api/commonFeature/news/${params.moduleId}`,
})
}
// 获取社交媒体
/**
* @param {moduleId}
*/
export function getRemarks(params) {
return request({
method: 'GET',
url: `/api/commonFeature/remarks/${params.moduleId}`,
}) })
} }
...@@ -89,10 +116,27 @@ export function getMemberProposal(params) { ...@@ -89,10 +116,27 @@ export function getMemberProposal(params) {
} }
// 获取资源库 // 获取资源库
export function getBills(params) { export function getBills(params, signal) {
return request({ return request({
method: 'GET', method: 'GET',
url: `/api/BillOverview/bills`, 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) => { ...@@ -505,7 +505,7 @@ const handleGetBillPersonAnalyze = async (isOppose) => {
onMounted(() => { onMounted(() => {
handleGetBillBackground(); handleGetBillBackground();
handleGetRelatedEvent(); handleGetRelatedEvent();
handleGetBillPersonAnalyze(false); // handleGetBillPersonAnalyze(false);
}); });
</script> </script>
......
...@@ -214,22 +214,21 @@ ...@@ -214,22 +214,21 @@
class="box2-main-item" class="box2-main-item"
v-for="(item, index) in warningList" v-for="(item, index) in warningList"
:key="index" :key="index"
@click="handleClickToDetail()"
> >
<div <div
class="item-left" class="item-left"
:class="{ :class="{
itemLeftStatus1: item.riskLevel === '特别重大', itemLeftStatus1: item.signalLevel === '特别重大',
itemLeftStatus2: item.riskLevel === '重大风险' itemLeftStatus2: item.signalLevel === '重大风险'
}" }"
> >
{{ item.riskLevel ? item.riskLevel : "一般风险" }} {{ item.signalLevel ? item.signalLevel : "一般风险" }}
</div> </div>
<div class="item-right"> <div class="item-right">
<div class="text"> <div class="text">
{{ item.description }} {{ item.signalTitle }}
</div> </div>
<div class="time">{{ item.introductionDate }}</div> <div class="time">{{ item.signalTime }}</div>
</div> </div>
</div> </div>
</div> </div>
...@@ -254,16 +253,16 @@ ...@@ -254,16 +253,16 @@
</div> </div>
</div> </div>
<div class="box3-main"> <div class="box3-main">
<div class="box3-item" v-for="(news, index) in newsList" :key="index"> <div class="box3-item" v-for="(news, index) in newsList" :key="index" @click="handleClickToNewsDetail()">
<div class="left"> <div class="left">
<img :src="news.img" alt="" /> <img :src="news.newsImage || News1" alt="" />
</div> </div>
<div class="right"> <div class="right">
<div class="right-top"> <div class="right-top">
<div class="title">{{ news.title }}</div> <div class="title">{{ news.newsTitle }}</div>
<div class="time">{{ news.from }}</div> <div class="time">{{ news.newsDate ? news.newsDate.slice(5) : '' }} - {{ news.newsOrg }}</div>
</div> </div>
<div class="right-footer">{{ news.content }}</div> <div class="right-footer">{{ news.newsContent }}</div>
</div> </div>
</div> </div>
</div> </div>
...@@ -278,14 +277,14 @@ ...@@ -278,14 +277,14 @@
<div class="box4-main"> <div class="box4-main">
<div class="box4-main-item" v-for="(item, index) in messageList" :key="index"> <div class="box4-main-item" v-for="(item, index) in messageList" :key="index">
<div class="left" @click="handleClcikToCharacter(index)"> <div class="left" @click="handleClcikToCharacter(index)">
<img :src="item.img" alt="" /> <img :src="item.personImage" alt="" />
</div> </div>
<div class="right"> <div class="right">
<div class="right-top"> <div class="right-top">
<div class="name">{{ item.name }}</div> <div class="name">{{ item.personName }}</div>
<div class="time">{{ item.time }}</div> <div class="time">{{ formatMessageTime(item.time) }}·发布于{{ item.orgName }}</div>
</div> </div>
<div class="content">{{ item.content }}</div> <div class="content">{{ item.remarks }}</div>
</div> </div>
</div> </div>
</div> </div>
...@@ -311,10 +310,13 @@ ...@@ -311,10 +310,13 @@
<div class="box5-select"> <div class="box5-select">
<el-select v-model="box5Select" placeholder="选择领域" @change="handleBox5Change" style="width: 150px"> <el-select v-model="box5Select" placeholder="选择领域" @change="handleBox5Change" style="width: 150px">
<el-option label="全部领域" value="全部领域" /> <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> </el-select>
</div> </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>
<div class="box6"> <div class="box6">
<div class="box6-header"> <div class="box6-header">
...@@ -358,7 +360,10 @@ ...@@ -358,7 +360,10 @@
/> />
</el-select> </el-select>
</div> </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>
<div class="box8"> <div class="box8">
<div class="box8-header"> <div class="box8-header">
...@@ -385,12 +390,14 @@ ...@@ -385,12 +390,14 @@
/> />
</el-select> </el-select>
</div> </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 <div
v-else
class="box8-main-item" class="box8-main-item"
v-for="(item, index) in box8Data" v-for="(item, index) in box8Data"
:key="index" :key="index"
@click="handleClcikToCharacter(0)" @click="handleClcikToCharacter(index)"
> >
<div class="box8-main-item-left"> <div class="box8-main-item-left">
<img :src="item.img" alt="" referrerpolicy="no-referrer" class="left-img" /> <img :src="item.img" alt="" referrerpolicy="no-referrer" class="left-img" />
...@@ -436,7 +443,10 @@ ...@@ -436,7 +443,10 @@
/> />
</el-select> </el-select>
</div> </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> </div>
</div> </div>
...@@ -447,10 +457,10 @@ ...@@ -447,10 +457,10 @@
<div class="btn-box"> <div class="btn-box">
<div <div
class="btn" class="btn"
:class="{ btnActive: activeTabName === cate.name }" :class="{ btnActive: activeTabName === cate.name, disabled: index !== 0 }"
v-for="(cate, index) in tabList" v-for="(cate, index) in tabList"
:key="index" :key="index"
@click="handleClickTab(cate)" @click="index === 0 && handleClickTab(cate)"
> >
{{ cate.name }} {{ cate.name }}
</div> </div>
...@@ -465,9 +475,12 @@ ...@@ -465,9 +475,12 @@
<div class="title">{{ "科技领域" }}</div> <div class="title">{{ "科技领域" }}</div>
</div> </div>
<div class="select-main"> <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 <el-checkbox
v-for="(area, index) in areaList" v-for="(area, index) in cateKuList"
:key="area.id" :key="area.id"
:label="area.id" :label="area.id"
class="filter-checkbox" class="filter-checkbox"
...@@ -483,7 +496,7 @@ ...@@ -483,7 +496,7 @@
<div class="title">{{ "党派" }}</div> <div class="title">{{ "党派" }}</div>
</div> </div>
<div class="select-main"> <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 <el-checkbox
v-for="(dp, index) in dpList" v-for="(dp, index) in dpList"
:key="dp.id" :key="dp.id"
...@@ -501,7 +514,7 @@ ...@@ -501,7 +514,7 @@
<div class="title">{{ "议院" }}</div> <div class="title">{{ "议院" }}</div>
</div> </div>
<div class="select-main"> <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 <el-checkbox
v-for="(yy, index) in yyList" v-for="(yy, index) in yyList"
:key="yy.id" :key="yy.id"
...@@ -520,7 +533,7 @@ ...@@ -520,7 +533,7 @@
<div class="title">{{ "发布时间" }}</div> <div class="title">{{ "发布时间" }}</div>
</div> </div>
<div class="select-main"> <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 <el-checkbox
v-for="(time, index) in pubTime" v-for="(time, index) in pubTime"
:key="time.id" :key="time.id"
...@@ -536,27 +549,27 @@ ...@@ -536,27 +549,27 @@
<div class="right"> <div class="right">
<div class="right-header"> <div class="right-header">
<div class="right-header-box"> <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 <el-option
v-for="item in footerSelectList1" v-for="item in postOrgList"
:key="item.value" :key="item.departmentId"
:label="item.label" :label="item.departmentName"
:value="item.value" :value="item.departmentId"
/> />
</el-select> </el-select>
</div> </div>
<div class="right-header-box"> <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 <el-option
v-for="item in footerSelectList2" v-for="item in postMemberList"
:key="item.value" :key="item.memberId"
:label="item.label" :label="item.memberName"
:value="item.value" :value="item.memberId"
/> />
</el-select> </el-select>
</div> </div>
<div class="right-header-box" style="margin-left: auto;"> <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 <el-option
v-for="item in releaseTimeList" v-for="item in releaseTimeList"
:key="item.value" :key="item.value"
...@@ -566,8 +579,8 @@ ...@@ -566,8 +579,8 @@
</el-select> </el-select>
</div> </div>
</div> </div>
<div class="right-main"> <div class="right-main" v-loading="loading">
<div class="right-main-box" v-for="(item, index) in footerBillList" :key="index"> <div class="right-main-box" v-for="(item, index) in bills" :key="index" @click="handleClickToDetail()">
<div class="header"> <div class="header">
<div class="title">{{ item.name }}</div> <div class="title">{{ item.name }}</div>
<div class="en-title">{{ item.eName }}</div> <div class="en-title">{{ item.eName }}</div>
...@@ -597,22 +610,19 @@ ...@@ -597,22 +610,19 @@
</div> </div>
</div> </div>
</div> </div>
<div class="right-main-box"></div>
<div class="right-main-box"></div>
<div class="right-main-box"></div>
</div> </div>
<div class="right-footer"> <div class="right-footer">
<div class="footer-left"> <div class="footer-left">
{{ `共1149项调查` }} {{ `共${total}项调查` }}
</div> </div>
<div class="footer-right"> <div class="footer-right">
<el-pagination <el-pagination
@current-change="handleCurrentChange" @current-change="handleCurrentChange"
:pageSize="12" :page-size="pageSize"
:current-page="currentPage" :current-page="currentPage"
background background
layout="prev, pager, next" layout="prev, pager, next"
:total="1149" :total="total"
/> />
</div> </div>
</div> </div>
...@@ -637,7 +647,12 @@ import { ...@@ -637,7 +647,12 @@ import {
getBillOverviewKeyTK, getBillOverviewKeyTK,
getBillCount, getBillCount,
getBillPostOrg, getBillPostOrg,
getMemberProposal getMemberProposal,
getNews,
getRemarks,
getPostOrgList,
getPostMemberList,
getBills
} from "@/api/bill/billHome"; } from "@/api/bill/billHome";
import DivideHeader from "@/components/DivideHeader.vue"; import DivideHeader from "@/components/DivideHeader.vue";
...@@ -692,6 +707,18 @@ import { iteratee } from "lodash"; ...@@ -692,6 +707,18 @@ import { iteratee } from "lodash";
const searchBillText = ref(""); 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 => { const handleClcikToCharacter = index => {
let type; let type;
...@@ -722,6 +749,7 @@ const currentPage = ref(1); ...@@ -722,6 +749,7 @@ const currentPage = ref(1);
// 处理页码改变事件 // 处理页码改变事件
const handleCurrentChange = page => { const handleCurrentChange = page => {
currentPage.value = page; currentPage.value = page;
handleGetBills();
}; };
const containerRef = ref(null); const containerRef = ref(null);
...@@ -772,6 +800,12 @@ const handleToMoreRiskSignal = () => { ...@@ -772,6 +800,12 @@ const handleToMoreRiskSignal = () => {
const route = router.resolve("/riskSignal"); const route = router.resolve("/riskSignal");
window.open(route.href, "_blank"); 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 = () => { const handleToMoreNews = () => {
...@@ -780,161 +814,135 @@ const handleToMoreNews = () => { ...@@ -780,161 +814,135 @@ const handleToMoreNews = () => {
}; };
// 风险信号 // 风险信号
const warningList = ref([ 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 billList = ref([ // const billList = ref([
{ // {
billName: "大而美法案", // billName: "大而美法案",
introductionDate: "2025年7月4日", // introductionDate: "2025年7月4日",
status: "特别重大风险", // status: "特别重大风险",
tagList: ["集成电路", "人工智能"], // tagList: ["集成电路", "人工智能"],
img: bill1, // img: bill1,
yuan: "众议院", // yuan: "众议院",
dangpai: "共和党" // dangpai: "共和党"
}, // },
{ // {
billName: "GENIUS稳定币法案", // billName: "GENIUS稳定币法案",
introductionDate: "2025年7月5日", // introductionDate: "2025年7月5日",
status: "", // status: "",
tagList: ["集成电路", "人工智能"], // tagList: ["集成电路", "人工智能"],
img: bill2, // img: bill2,
yuan: "众议院", // yuan: "众议院",
dangpai: "共和党" // dangpai: "共和党"
}, // },
{ // {
billName: "美越贸易协议", // billName: "美越贸易协议",
introductionDate: "2025年7月6日", // introductionDate: "2025年7月6日",
status: "", // status: "",
tagList: ["集成电路", "人工智能"], // tagList: ["集成电路", "人工智能"],
img: bill3, // img: bill3,
yuan: "众议院", // yuan: "众议院",
dangpai: "共和党" // dangpai: "共和党"
}, // },
{ // {
billName: "美越贸易协议", // billName: "美越贸易协议",
introductionDate: "2025年7月7日", // introductionDate: "2025年7月7日",
status: "特别重大风险", // status: "特别重大风险",
tagList: ["集成电路", "人工智能"], // tagList: ["集成电路", "人工智能"],
img: bill4, // img: bill4,
yuan: "众议院", // yuan: "众议院",
dangpai: "共和党" // dangpai: "共和党"
}, // },
{ // {
billName: "汽车零部件25%关税实施规则", // billName: "汽车零部件25%关税实施规则",
introductionDate: "2025年7月10日", // introductionDate: "2025年7月10日",
status: "重大风险", // status: "重大风险",
tagList: ["集成电路", "人工智能"], // tagList: ["集成电路", "人工智能"],
img: bill5, // img: bill5,
yuan: "众议院", // yuan: "众议院",
dangpai: "共和党" // dangpai: "共和党"
}, // },
{ // {
billName: "汽车零部件25%关税实施规则", // billName: "汽车零部件25%关税实施规则",
introductionDate: "2025年7月12日", // introductionDate: "2025年7月12日",
status: "", // status: "",
tagList: ["集成电路", "人工智能"], // tagList: ["集成电路", "人工智能"],
img: bill6, // img: bill6,
yuan: "众议院", // yuan: "众议院",
dangpai: "共和党" // dangpai: "共和党"
}, // },
{ // {
billName: "小额豁免包裹政策调整", // billName: "小额豁免包裹政策调整",
introductionDate: "2025年7月14日", // introductionDate: "2025年7月14日",
status: "特别重大风险", // status: "特别重大风险",
tagList: ["集成电路", "人工智能"], // tagList: ["集成电路", "人工智能"],
img: bill7, // img: bill7,
yuan: "众议院", // yuan: "众议院",
dangpai: "共和党" // dangpai: "共和党"
}, // },
{ // {
billName: "NIH预算否决案", // billName: "NIH预算否决案",
introductionDate: "2025年7月15日", // introductionDate: "2025年7月15日",
status: "重大风险", // status: "重大风险",
tagList: ["集成电路", "人工智能"], // tagList: ["集成电路", "人工智能"],
img: bill8, // img: bill8,
yuan: "众议院", // yuan: "众议院",
dangpai: "共和党" // dangpai: "共和党"
}, // },
{ // {
billName: "得州国会选区重划法案", // billName: "得州国会选区重划法案",
introductionDate: "2025年7月17日", // introductionDate: "2025年7月17日",
status: "一般风险", // status: "一般风险",
tagList: ["集成电路", "人工智能"], // tagList: ["集成电路", "人工智能"],
img: bill9, // img: bill9,
yuan: "众议院", // yuan: "众议院",
dangpai: "共和党" // dangpai: "共和党"
}, // },
{ // {
billName: "美越贸易协议", // billName: "美越贸易协议",
introductionDate: "2025年7月24日", // introductionDate: "2025年7月24日",
status: "", // status: "",
tagList: ["集成电路", "人工智能"], // tagList: ["集成电路", "人工智能"],
img: bill10, // img: bill10,
yuan: "众议院", // yuan: "众议院",
dangpai: "共和党" // dangpai: "共和党"
}, // },
{ // {
billName: "美越贸易协议", // billName: "美越贸易协议",
introductionDate: "2025年8月4日", // introductionDate: "2025年8月4日",
status: "", // status: "",
tagList: ["集成电路", "人工智能"], // tagList: ["集成电路", "人工智能"],
img: bill11, // img: bill11,
yuan: "众议院", // yuan: "众议院",
dangpai: "共和党" // dangpai: "共和党"
}, // },
{ // {
billName: "美越贸易协议", // billName: "美越贸易协议",
introductionDate: "2025年8月8日", // introductionDate: "2025年8月8日",
status: "特别重大风险", // status: "特别重大风险",
tagList: ["集成电路", "人工智能"], // tagList: ["集成电路", "人工智能"],
img: bill12, // img: bill12,
yuan: "众议院", // yuan: "众议院",
dangpai: "共和党" // dangpai: "共和党"
}, // },
{ // {
billName: "美越贸易协议", // billName: "美越贸易协议",
introductionDate: "2025年8月8日", // introductionDate: "2025年8月8日",
status: "特别重大风险", // status: "特别重大风险",
tagList: ["集成电路", "人工智能"], // tagList: ["集成电路", "人工智能"],
img: bill12, // img: bill12,
yuan: "众议院", // yuan: "众议院",
dangpai: "共和党" // dangpai: "共和党"
} // }
]); // ]);
// 当前展示法案列表 // 当前展示法案列表
const curBillList = computed(() => { // const curBillList = computed(() => {
const startIndex = (currentPage.value - 1) * 12; // const startIndex = (currentPage.value - 1) * 12;
const endIndex = startIndex + 12; // const endIndex = startIndex + 12;
return billList.value.slice(startIndex, endIndex); // return billList.value.slice(startIndex, endIndex);
}); // });
const box7selectetedTime = ref("2025"); const box7selectetedTime = ref("2025");
const box7YearList = ref([ const box7YearList = ref([
...@@ -975,52 +983,24 @@ const box8YearList = ref([ ...@@ -975,52 +983,24 @@ const box8YearList = ref([
value: "2022" value: "2022"
} }
]); ]);
// 排序方式
const releaseTime = ref("近一年发布"); // 发布时间 const releaseTime = ref(true);
const releaseTimeList = ref([ const releaseTimeList = ref([
{ {
label: "近半年发布", label: "正序",
value: "近半年发布" value: true
}, },
{ {
label: "近一年发布", label: "倒序",
value: "近一年发布" value: false
},
{
label: "近两年发布",
value: "近两年发布"
},
{
label: "近三年发布",
value: "近三年发布"
},
{
label: "近五年发布",
value: "近五年发布"
} }
]); ]);
// 涉华法案数量使用的领域分类列表
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 () => { const handleGetHylyList = async () => {
...@@ -1028,79 +1008,14 @@ const handleGetHylyList = async () => { ...@@ -1028,79 +1008,14 @@ const handleGetHylyList = async () => {
const res = await getHylyList(); const res = await getHylyList();
console.log("行业领域列表", res); console.log("行业领域列表", res);
categoryList.value = res.data; categoryList.value = res.data;
const obj = { cateKuList.value = res.data;
id: 0,
pid: "",
name: "全部分类"
};
categoryList.value = [obj, ...categoryList.value];
curCategoryList.value = categoryList.value.slice(0, SHOW_COUNT);
} catch (error) {} } catch (error) {}
}; };
const handleClickCate = cate => {
console.log(cate);
activeCate.value = cate.name;
activeHylyId.value = cate.id;
handleGetBillsByType();
};
// 新闻资讯 // 新闻资讯
const newsList = ref([ 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 messageList = 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 handleGetHotBills = async () => { const handleGetHotBills = async () => {
...@@ -1115,8 +1030,11 @@ const handleGetHotBills = async () => { ...@@ -1115,8 +1030,11 @@ const handleGetHotBills = async () => {
// 获取法案风险信号 // 获取法案风险信号
const handleGetBillRiskSignal = async () => { const handleGetBillRiskSignal = async () => {
const params = {
moduleId: "0100"
};
try { try {
const res = await getBillRiskSignal(); const res = await getBillRiskSignal(params);
console.log("法案风险信号", res); console.log("法案风险信号", res);
if (res.code === 200) { if (res.code === 200) {
warningList.value = res.data; warningList.value = res.data;
...@@ -1124,25 +1042,180 @@ const handleGetBillRiskSignal = async () => { ...@@ -1124,25 +1042,180 @@ const handleGetBillRiskSignal = async () => {
} catch (error) {} } catch (error) {}
}; };
// 根据法案类型获取法案列表 // 获取新闻资讯
const handleGetBillsByType = async () => { const handleGetNews = async () => {
const params = { const params = {
type: activeHylyId.value moduleId: "0100"
}; };
try { try {
const res = await getBillsByType(params); const res = await getNews(params);
console.log("根据法案类型获取法案列表", res); console.log("新闻资讯", res);
billList.value = res.data.map(item => { if (res.code === 200) {
return { newsList.value = res.data;
billId: item.billId, }
billName: item.billName,
introductionDate: item.introductionDate,
img: bill1
};
});
} catch (error) {} } 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 box5Select = ref("全部领域");
const box5Data = ref({ const box5Data = ref({
...@@ -1171,6 +1244,7 @@ const box5Data = ref({ ...@@ -1171,6 +1244,7 @@ const box5Data = ref({
} }
] ]
}); });
const box5HasData = ref(true);
const handleGetBillCount = async () => { const handleGetBillCount = async () => {
try { try {
let params = {}; let params = {};
...@@ -1179,7 +1253,8 @@ const handleGetBillCount = async () => { ...@@ -1179,7 +1253,8 @@ const handleGetBillCount = async () => {
} }
const res = await getBillCount(params); const res = await getBillCount(params);
console.log("涉华法案统计", res); 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)); const sortedData = res.data.sort((a, b) => a.month.localeCompare(b.month));
box5Data.value = { box5Data.value = {
title: sortedData.map(item => item.month), title: sortedData.map(item => item.month),
...@@ -1196,24 +1271,45 @@ const handleGetBillCount = async () => { ...@@ -1196,24 +1271,45 @@ const handleGetBillCount = async () => {
percent: sortedData.map(item => item.percent) percent: sortedData.map(item => item.percent)
}; };
} else { } else {
// 保持默认数据或清空 // 接口异常(如500)时,清空图表数据以避免报错或显示错误信息
// box5Data.value = {}; box5HasData.value = false;
box5Data.value = {
title: [],
data: [
{ name: "提出法案", value: [] },
{ name: "通过法案", value: [] }
],
percent: []
};
} }
} catch (error) { } catch (error) {
console.error("获取涉华法案统计error", error); console.error("获取涉华法案统计error", error);
// 发生错误时同样清空数据
box5HasData.value = false;
box5Data.value = {
title: [],
data: [
{ name: "提出法案", value: [] },
{ name: "通过法案", value: [] }
],
percent: []
};
} }
}; };
const handleBox5 = async () => { const handleBox5 = async () => {
await handleGetBillCount(); await handleGetBillCount();
const proposed = box5Data.value.data[0].value; if (box5HasData.value) {
const passed = box5Data.value.data[1].value; await nextTick();
const rate = box5Data.value.percent || proposed.map((p, i) => { const proposed = box5Data.value.data[0].value;
const pass = passed[i] || 0; const passed = box5Data.value.data[1].value;
return p ? ((pass / p) * 100).toFixed(2) : 0; const rate = box5Data.value.percent || proposed.map((p, i) => {
}); const pass = passed[i] || 0;
let box5Chart = getMultiLineChart(box5Data.value.title, proposed, passed, rate); return p ? ((pass / p) * 100).toFixed(2) : 0;
setChart(box5Chart, "box5Chart"); });
let box5Chart = getMultiLineChart(box5Data.value.title, proposed, passed, rate);
setChart(box5Chart, "box5Chart");
}
}; };
const handleBox5Change = () => { const handleBox5Change = () => {
...@@ -1221,11 +1317,16 @@ const handleBox5Change = () => { ...@@ -1221,11 +1317,16 @@ const handleBox5Change = () => {
}; };
// 法案提出部门 // 法案提出部门
const box7HasData = ref(true);
const handleBox7Data = async () => { const handleBox7Data = async () => {
try { try {
const res = await getBillPostOrg({ year: box7selectetedTime.value }); const res = await getBillPostOrg({ year: box7selectetedTime.value });
console.log("法案提出部门", res); 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 apiData = res.data;
const houseItems = apiData.filter(i => i.congressName === "House"); const houseItems = apiData.filter(i => i.congressName === "House");
...@@ -1250,9 +1351,14 @@ const handleBox7Data = async () => { ...@@ -1250,9 +1351,14 @@ const handleBox7Data = async () => {
const box7Chart = getDoublePieChart(data1, data2); const box7Chart = getDoublePieChart(data1, data2);
setChart(box7Chart, "box7Chart"); setChart(box7Chart, "box7Chart");
} else {
// 接口异常(如500)时,清空图表数据以避免报错或显示错误信息
box7HasData.value = false;
setChart({}, "box7Chart");
} }
} catch (error) { } catch (error) {
console.error("获取法案提出部门数据失败", error); console.error("获取法案提出部门数据失败", error);
box7HasData.value = false;
} }
}; };
...@@ -1261,28 +1367,7 @@ watch(box7selectetedTime, () => { ...@@ -1261,28 +1367,7 @@ watch(box7selectetedTime, () => {
}); });
// 关键条款 // 关键条款
const wordCloudData = ref([ 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 handleGetKeyTK = async () => { const handleGetKeyTK = async () => {
try { try {
const res = await getBillOverviewKeyTK(); const res = await getBillOverviewKeyTK();
...@@ -1306,37 +1391,7 @@ const handleBox6 = async () => { ...@@ -1306,37 +1391,7 @@ const handleBox6 = async () => {
}; };
// 涉华领域分布 // 涉华领域分布
const box9ChartColorList = ref(["#4096FF", "#FFA39E", "#ADC6FF", "#FFC069", "#B5F5EC", "#B37FEB", "#D6E4FF"]); const box9ChartData = ref([]);
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 box9selectetedTime = ref("2025"); const box9selectetedTime = ref("2025");
const box9YearList = ref([ const box9YearList = ref([
{ {
...@@ -1356,6 +1411,7 @@ const box9YearList = ref([ ...@@ -1356,6 +1411,7 @@ const box9YearList = ref([
value: "2022" value: "2022"
} }
]); ]);
const box9HasData = ref(true);
const getBox9Data = async () => { const getBox9Data = async () => {
const params = { const params = {
year: box9selectetedTime.value year: box9selectetedTime.value
...@@ -1363,98 +1419,37 @@ const getBox9Data = async () => { ...@@ -1363,98 +1419,37 @@ const getBox9Data = async () => {
try { try {
const res = await getBillIndustry(params); const res = await getBillIndustry(params);
console.log("box9-涉华法案领域分布", res.data); 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; box9ChartData.value = res.data;
} else {
box9HasData.value = false;
box9ChartData.value = [];
} }
} catch (error) {} } catch (error) {
box9HasData.value = false;
box9ChartData.value = [];
}
}; };
const handleBox9Data = async () => { const handleBox9Data = async () => {
await getBox9Data(); await getBox9Data();
const box9Chart = getPieChart( if (box9HasData.value) {
box9ChartData.value.map(item => { await nextTick();
return { const box9Chart = getPieChart(
name: item.industryName, box9ChartData.value.map(item => {
value: item.countBill return {
}; name: item.industryName,
}) value: item.countBill
); };
setChart(box9Chart, "box9Chart"); })
);
setChart(box9Chart, "box9Chart");
}
}; };
const box7Data = ref([ watch(box9selectetedTime, () => {
[ handleBox9Data();
{ });
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: "参议院"
}
]
]);
const box8Data = ref([]); const box8Data = ref([]);
...@@ -1471,9 +1466,13 @@ const handleBox8Data = async () => { ...@@ -1471,9 +1466,13 @@ const handleBox8Data = async () => {
dangpai: Cyy, dangpai: Cyy,
yuan: item.position === "Democratic" ? Mzd : Ghd yuan: item.position === "Democratic" ? Mzd : Ghd
})); }));
} else {
// 接口异常(如500)时,清空图表数据以避免报错或显示错误信息
box8Data.value = [];
} }
} catch (error) { } catch (error) {
console.error("获取关键议员提案失败", error); console.error("获取关键议员提案失败", error);
box8Data.value = [];
} }
}; };
...@@ -1522,97 +1521,137 @@ const handleClickTab = tab => { ...@@ -1522,97 +1521,137 @@ const handleClickTab = tab => {
activeTabName.value = tab.name; 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 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([ const dpList = ref([
{ id: "全部党派", name: "全部党派" }, { id: "全部党派", name: "全部党派" },
{ id: "民主党", name: "民主党" }, { id: "Democratic", name: "民主党" },
{ id: "共和党", name: "共和党" } { id: "Republican", name: "共和党" }
]); ]);
const activeDpList = ref(["全部党派"]); 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([ const yyList = ref([
{ id: "全部议院", name: "全部议院" }, { id: "全部议院", name: "全部议院" },
{ id: "参议院", name: "参议院" }, { id: "S", name: "参议院" },
{ id: "众议院", name: "众议院" } { id: "H", name: "众议院" }
]); ]);
const activeYyList = ref(["全部议院"]); 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([ const pubTime = ref([
{ id: "全部时间", name: "全部时间" }, { id: "全部时间", name: "全部时间" },
{ id: "2025", name: "2025年" }, { id: "2025", name: "2025年" },
{ id: "2024", name: "2024年" }, { id: "2024", name: "2024年" },
{ id: "2023", name: "2023年" }, { id: "2023", name: "2023年" },
{ id: "2022", name: "2022年" }, { id: "2022", name: "2022年" },
{ id: "2021", name: "2021年" }, { id: "2021", name: "2021年" },
{ id: "更早时间", name: "更早时间" } // { id: "更早时间", name: "更早时间" }
]); ]);
const activePubTime = ref(["全部时间"]); const activePubTime = ref(["全部时间"]);
// 处理选择时间变化
const footerSelectList1 = ref([ const handlePubTimeChange = (val) => {
{ if (val.includes("全部时间") && val.length > 1) {
label: "全部委员会", if (val[val.length - 1] === "全部时间") {
value: "全部委员会" activePubTime.value = ["全部时间"];
} else {
activePubTime.value = val.filter(item => item !== "全部时间");
}
} else if (val.length === 0) {
activePubTime.value = ["全部时间"];
} }
]); console.log("选择时间变化", activePubTime.value);
const footerSelect1 = ref("全部委员会"); handleGetBills();
};
const footerSelectList2 = ref([ const footerSelect1 = ref("全部委员会");
{
label: "全部提出议员",
value: "全部提出议员"
}
]);
const footerSelect2 = ref("全部提出议员"); const footerSelect2 = ref("全部提出议员");
const footerBillList = ref([ // const footerBillList = ref([
{ // {
name: "H.R.1-大而美法案", // name: "H.R.1-大而美法案",
eName: "One Big Beautiful Bill Act", // eName: "One Big Beautiful Bill Act",
tcr: "乔迪·阿灵顿等2人", // tcr: "乔迪·阿灵顿等2人",
wyh: "众议院-预算委员会", // wyh: "众议院-预算委员会",
areaList: ["集成电路", "人工智能"], // areaList: ["集成电路", "人工智能"],
zxdy: "2025.07.04 成为公法 No: 119-21", // zxdy: "2025.07.04 成为公法 No: 119-21",
progress: [] // progress: []
}, // },
{ // {
name: "H.R.1-大而美法案", // name: "H.R.1-大而美法案",
eName: "One Big Beautiful Bill Act", // eName: "One Big Beautiful Bill Act",
tcr: "乔迪·阿灵顿等2人", // tcr: "乔迪·阿灵顿等2人",
wyh: "众议院-预算委员会", // wyh: "众议院-预算委员会",
areaList: ["集成电路", "人工智能"], // areaList: ["集成电路", "人工智能"],
zxdy: "2025.07.04 成为公法 No: 119-21", // zxdy: "2025.07.04 成为公法 No: 119-21",
progress: [] // progress: []
}, // },
{ // {
name: "H.R.1-大而美法案", // name: "H.R.1-大而美法案",
eName: "One Big Beautiful Bill Act", // eName: "One Big Beautiful Bill Act",
tcr: "乔迪·阿灵顿等2人", // tcr: "乔迪·阿灵顿等2人",
wyh: "众议院-预算委员会", // wyh: "众议院-预算委员会",
areaList: ["集成电路", "人工智能"], // areaList: ["集成电路", "人工智能"],
zxdy: "2025.07.04 成为公法 No: 119-21", // zxdy: "2025.07.04 成为公法 No: 119-21",
progress: [] // progress: []
} // }
]); // ]);
onMounted(async () => { onMounted(async () => {
handleGetHylyList(); handleGetHylyList();
// 获取风险信号
handleGetBillRiskSignal(); handleGetBillRiskSignal();
// 获取新闻资讯
handleGetNews();
// 获取社交媒体
handleGetRemarks();
// 获取提出部门列表
handleGetPostOrgList();
// 获取提出议员列表
handleGetPostMemberList();
// 获取资源库
handleGetBills();
// handleGetBillsByType(); // handleGetBillsByType();
handleBox5(); //涉华法案统计 handleBox5(); //涉华法案统计
...@@ -2441,6 +2480,10 @@ onUnmounted(() => {}); ...@@ -2441,6 +2480,10 @@ onUnmounted(() => {});
width: 749px; width: 749px;
margin-left: 21px; margin-left: 21px;
border-bottom: 1px solid rgba(240, 242, 244, 1); border-bottom: 1px solid rgba(240, 242, 244, 1);
cursor: pointer;
&:hover {
background: var(--color-bg-hover);
}
.left { .left {
width: 72px; width: 72px;
height: 48px; height: 48px;
...@@ -2459,7 +2502,7 @@ onUnmounted(() => {}); ...@@ -2459,7 +2502,7 @@ onUnmounted(() => {});
justify-content: space-between; justify-content: space-between;
.title { .title {
margin-top: 13px; margin-top: 13px;
width: 520px; width: 440px;
height: 24px; height: 24px;
color: rgba(59, 65, 75, 1); color: rgba(59, 65, 75, 1);
font-family: Microsoft YaHei; font-family: Microsoft YaHei;
...@@ -3108,6 +3151,13 @@ onUnmounted(() => {}); ...@@ -3108,6 +3151,13 @@ onUnmounted(() => {});
background: var(--color-main-active); background: var(--color-main-active);
} }
} }
.disabled {
cursor: not-allowed;
opacity: 0.5;
&:hover {
background: transparent;
}
}
} }
.select-box { .select-box {
height: 42px; height: 42px;
...@@ -3120,9 +3170,12 @@ onUnmounted(() => {}); ...@@ -3120,9 +3170,12 @@ onUnmounted(() => {});
height: 1401px; height: 1401px;
margin: 0 auto; margin: 0 auto;
display: flex; display: flex;
justify-content: space-between;
align-items: flex-start;
.left { .left {
width: 300px; width: 300px;
height: 784px; // min-height: 784px;
padding-bottom: 33px;
box-sizing: border-box; box-sizing: border-box;
border: 1px solid rgba(234, 236, 238, 1); border: 1px solid rgba(234, 236, 238, 1);
border-radius: 10px; border-radius: 10px;
...@@ -3186,22 +3239,25 @@ onUnmounted(() => {}); ...@@ -3186,22 +3239,25 @@ onUnmounted(() => {});
} }
.right-main { .right-main {
height: 1264px; height: 1264px;
overflow: hidden; // overflow: hidden;
.right-main-box { .right-main-box {
width: 1280px; width: 1280px;
height: 300px; height: 300px;
padding-bottom: 24px;
border-radius: 10px; 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); background: rgba(255, 255, 255, 1);
margin-bottom: 16px; margin-bottom: 16px;
overflow: hidden; cursor: pointer;
.header { .header {
height: 91px; height: 91px;
width: 1200px; width: 1200px;
margin: 0 auto; margin: 0 auto;
border-bottom: 1px solid rgba(234, 236, 238, 1); border-bottom: 1px solid rgba(234, 236, 238, 1);
padding-top: 19px;
.title { .title {
margin-top: 19px; // margin-top: 19px;
// padding-top: 19px;
height: 26px; height: 26px;
color: rgba(59, 65, 75, 1); color: rgba(59, 65, 75, 1);
font-family: Microsoft YaHei; font-family: Microsoft YaHei;
...@@ -3229,13 +3285,13 @@ onUnmounted(() => {}); ...@@ -3229,13 +3285,13 @@ onUnmounted(() => {});
margin-top: 2px; margin-top: 2px;
.item { .item {
margin-top: 12px; margin-top: 12px;
height: 24px; // height: 24px;
display: flex; display: flex;
.item-left { .item-left {
width: 91px; width: 100px;
height: 24px; // height: 24px;
color: rgba(59, 65, 75, 1); color: rgb(59, 65, 75);
font-family: Microsoft YaHei; font-family: "Microsoft YaHei";
font-size: 16px; font-size: 16px;
font-weight: 700; font-weight: 700;
line-height: 24px; line-height: 24px;
...@@ -3243,9 +3299,10 @@ onUnmounted(() => {}); ...@@ -3243,9 +3299,10 @@ onUnmounted(() => {});
text-align: left; text-align: left;
} }
.item-right { .item-right {
max-width: 1000px;
margin-left: 10px; margin-left: 10px;
color: rgba(95, 101, 108, 1); color: rgba(95, 101, 108, 1);
font-family: Microsoft YaHei; font-family: "Microsoft YaHei";
font-size: 16px; font-size: 16px;
font-weight: 400; font-weight: 400;
line-height: 24px; line-height: 24px;
...@@ -3263,7 +3320,7 @@ onUnmounted(() => {}); ...@@ -3263,7 +3320,7 @@ onUnmounted(() => {});
border-radius: 4px; border-radius: 4px;
background: rgba(231, 243, 255, 1); background: rgba(231, 243, 255, 1);
color: var(--color-main-active); color: var(--color-main-active);
font-family: Microsoft YaHei; font-family: "Microsoft YaHei";
font-size: 14px; font-size: 14px;
font-weight: 400; font-weight: 400;
} }
...@@ -3280,7 +3337,7 @@ onUnmounted(() => {}); ...@@ -3280,7 +3337,7 @@ onUnmounted(() => {});
padding-top: 12px; padding-top: 12px;
.footer-left { .footer-left {
color: rgba(59, 65, 75, 1); color: rgba(59, 65, 75, 1);
font-family: Microsoft YaHei; font-family: "Microsoft YaHei";
font-size: 16px; font-size: 16px;
font-weight: 400; font-weight: 400;
line-height: 32px; line-height: 32px;
...@@ -3297,7 +3354,7 @@ onUnmounted(() => {}); ...@@ -3297,7 +3354,7 @@ onUnmounted(() => {});
justify-content: space-between; justify-content: space-between;
.footer-left { .footer-left {
color: rgba(59, 65, 75, 1); color: rgba(59, 65, 75, 1);
font-family: Microsoft YaHei; font-family: "Microsoft YaHei";
font-size: 16px; font-size: 16px;
font-weight: 400; font-weight: 400;
line-height: 32px; line-height: 32px;
......
...@@ -16,11 +16,9 @@ const getDoublePieChart = (data1, data2) => { ...@@ -16,11 +16,9 @@ const getDoublePieChart = (data1, data2) => {
}, },
label: { label: {
position: 'inside', position: 'inside',
textStyle: { fontSize: '16px',
fontSize: '16px', fontWeight: 700,
fontWeight: 700, // color: '#333'
// color: '#333'
}
}, },
data: data1.map(item => { data: data1.map(item => {
return { return {
......
...@@ -212,6 +212,7 @@ onMounted(() => { ...@@ -212,6 +212,7 @@ onMounted(() => {
height: 1016px; height: 1016px;
background: rgba(249, 250, 252, 1); background: rgba(249, 250, 252, 1);
position: relative; position: relative;
margin: 0 auto;
.layout-header { .layout-header {
width: 1920px; width: 1920px;
height: 64px; height: 64px;
......
...@@ -37,10 +37,10 @@ ...@@ -37,10 +37,10 @@
<div class="right1-item" v-for="item in basicInfo.hylyList" :key="item">{{ item }}</div> <div class="right1-item" v-for="item in basicInfo.hylyList" :key="item">{{ item }}</div>
</div> </div>
</div> </div>
<div class="box1-right-item"> <!-- <div class="box1-right-item">
<div class="item-left">法案类别:</div> <div class="item-left">法案类别:</div>
<div class="item-right">{{ basicInfo.typeName }}</div> <div class="item-right">{{ basicInfo.typeName }}</div>
</div> </div> -->
<div class="box1-right-item"> <div class="box1-right-item">
<div class="item-left">委员会报告:</div> <div class="item-left">委员会报告:</div>
<div class="item-right2" v-if="basicInfo.reportList"> <div class="item-right2" v-if="basicInfo.reportList">
...@@ -132,11 +132,11 @@ ...@@ -132,11 +132,11 @@
</div> --> </div> -->
</div> </div>
</div> </div>
<div class="box2-footer"> <!-- <div class="box2-footer">
<div class="btn-more"> <div class="btn-more">
<img src="../assets/images/btn-more.png" alt="" /> <img src="../assets/images/btn-more.png" alt="" />
</div> </div>
</div> </div> -->
</div> </div>
</div> </div>
<div class="introduction-wrap-right"> <div class="introduction-wrap-right">
...@@ -154,7 +154,7 @@ ...@@ -154,7 +154,7 @@
</div> </div>
<div class="introduction-wrap-right-main"> <div class="introduction-wrap-right-main">
<div class="right-main-box1"> <div class="right-main-box1">
<div class="name-box"> <!-- <div class="name-box">
<el-select <el-select
v-model="selectValue" v-model="selectValue"
placeholder="请选择" placeholder="请选择"
...@@ -174,7 +174,7 @@ ...@@ -174,7 +174,7 @@
{{ item.name }} {{ item.name }}
</div> </div>
</div> </div>
</div> </div> -->
<div class="info-box"> <div class="info-box">
<div class="info-left"> <div class="info-left">
<img src="./assets/images/usr1.png" alt="" /> <img src="./assets/images/usr1.png" alt="" />
...@@ -889,6 +889,7 @@ onMounted(() => { ...@@ -889,6 +889,7 @@ onMounted(() => {
background: #fff; background: #fff;
border-radius: 10px; border-radius: 10px;
box-shadow: 0px 0px 15px 0px rgba(22, 119, 255, 0.1); box-shadow: 0px 0px 15px 0px rgba(22, 119, 255, 0.1);
position: relative;
.box2-main { .box2-main {
margin-top: 10px; margin-top: 10px;
height: calc(100% - 70px); // Subtract header height height: calc(100% - 70px); // Subtract header height
...@@ -1001,6 +1002,11 @@ onMounted(() => { ...@@ -1001,6 +1002,11 @@ onMounted(() => {
margin-top: 7px; margin-top: 7px;
display: flex; display: flex;
justify-content: center; justify-content: center;
position: absolute;
bottom: 10px;
left: 50%;
transform: translateX(-50%);
z-index: 99;
.btn-more { .btn-more {
width: 108px; width: 108px;
height: 32px; height: 32px;
...@@ -1024,7 +1030,8 @@ onMounted(() => { ...@@ -1024,7 +1030,8 @@ onMounted(() => {
box-shadow: 0px 0px 15px 0px rgba(22, 119, 255, 0.1); box-shadow: 0px 0px 15px 0px rgba(22, 119, 255, 0.1);
.introduction-wrap-right-main { .introduction-wrap-right-main {
.right-main-box1 { .right-main-box1 {
height: 218px; // height: 218px; 将选择框去掉后高度变化
height: 171px;
// border-bottom: 1px solid rgb(243, 243, 244); // border-bottom: 1px solid rgb(243, 243, 244);
.name-box { .name-box {
display: flex; display: flex;
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论