提交 5f63cd2e authored 作者: 朱政's avatar 朱政

feat:智库概览页,智库报告详情报告分析

上级 d0ae5131
...@@ -217,6 +217,15 @@ export const getThinkTankReportSummary = (params) => { ...@@ -217,6 +217,15 @@ export const getThinkTankReportSummary = (params) => {
} }
); );
} }
//智库报告:获取相关报告
export const getThinkTankReportRelated = (params) => {
return request(
{
method: 'GET',
url: `/api/thinkTankReport/related/${params}`,
}
);
}
//获取报告原文 //获取报告原文
export const getThinkTankReportcontentUrl = (params) => { export const getThinkTankReportcontentUrl = (params) => {
......
...@@ -50,7 +50,7 @@ ...@@ -50,7 +50,7 @@
</template> </template>
<script setup> <script setup>
import NewsList from "@/components/NewsList.vue"; import NewsList from "@/components/base/newsList/index.vue";
import { ref, onMounted } from "vue"; import { ref, onMounted } from "vue";
import router from '@/router' import router from '@/router'
import { getCoopRestrictionNews, getCoopRestrictionSocial } from '@/api/coopRestriction/coopRestriction' import { getCoopRestrictionNews, getCoopRestrictionSocial } from '@/api/coopRestriction/coopRestriction'
......
...@@ -50,25 +50,12 @@ ...@@ -50,25 +50,12 @@
<div class="home-main" ref="homeMainRef"> <div class="home-main" ref="homeMainRef">
<div class="home-top-bg"></div> <div class="home-top-bg"></div>
<div class="home-main-header"> <div class="home-main-header">
<SearchContainer <SearchContainer style="margin-bottom: 0; margin-top: 48px; height: fit-content" v-if="homeMainRef"
style="margin-bottom: 0; margin-top: 48px; height: fit-content" placeholder="搜索出口管制" :containerRef="homeMainRef" areaName="实体清单" />
v-if="homeMainRef"
placeholder="搜索出口管制"
:containerRef="homeMainRef"
areaName="实体清单"
/>
<div class="home-main-header-footer-info"> <div class="home-main-header-footer-info">
<InfoCard <InfoCard v-for="(item, index) in infoList" :key="item.id" :title="item.nameZh" :subtitle="item.nameAbbr"
v-for="(item, index) in infoList" :description="item.description" :quantity="item.postCount" unit="次" :color="infoListColor[index]"
:key="item.id" @click="handleToEntityListNoId(item)" />
:title="item.nameZh"
:subtitle="item.nameAbbr"
:description="item.description"
:quantity="item.postCount"
unit="次"
:color="infoListColor[index]"
@click="handleToEntityListNoId(item)"
/>
</div> </div>
</div> </div>
...@@ -94,15 +81,8 @@ ...@@ -94,15 +81,8 @@
<img src="./assets/images/box1-right.png" alt="" /> <img src="./assets/images/box1-right.png" alt="" />
</div> </div>
</div> </div>
<el-carousel <el-carousel ref="carouselRef" height="370px" :autoplay="true" :interval="3000" arrow="never"
ref="carouselRef" indicator-position="none" @change="handleCarouselChange">
height="370px"
:autoplay="true"
:interval="3000"
arrow="never"
indicator-position="none"
@change="handleCarouselChange"
>
<el-carousel-item v-for="(item, index) in entitiesDataInfoList" :key="item.id + index"> <el-carousel-item v-for="(item, index) in entitiesDataInfoList" :key="item.id + index">
<div> <div>
<div class="box1-top"> <div class="box1-top">
...@@ -120,11 +100,8 @@ ...@@ -120,11 +100,8 @@
</div> </div>
<div class="box1-top-content-item"> <div class="box1-top-content-item">
<span class="box1-top-content-item-title">· 涉及领域:</span> <span class="box1-top-content-item-title">· 涉及领域:</span>
<div <div class="box1-top-content-item-tags" v-for="(domainItem, index) in item.domains"
class="box1-top-content-item-tags" :key="index">
v-for="(domainItem, index) in item.domains"
:key="index"
>
<el-tag :type="getTagType(domainItem)">{{ domainItem }}</el-tag> <el-tag :type="getTagType(domainItem)">{{ domainItem }}</el-tag>
</div> </div>
</div> </div>
...@@ -133,18 +110,10 @@ ...@@ -133,18 +110,10 @@
<div class="box1-bottom"> <div class="box1-bottom">
<div class="box1-bottom-title">· 涉及主要实体:</div> <div class="box1-bottom-title">· 涉及主要实体:</div>
<div class="box1-bottom-content"> <div class="box1-bottom-content">
<div <div class="box1-bottom-content-item" v-for="(ett, index) in item.sanEntities" :key="index"
class="box1-bottom-content-item" @click="handleEntityClick(ett)">
v-for="(ett, index) in item.sanEntities" <el-image v-if="ett.img" class="box1-bottom-content-item-img" :src="ett.img"
:key="index" alt=""></el-image>
@click="handleEntityClick(ett)"
>
<el-image
v-if="ett.img"
class="box1-bottom-content-item-img"
:src="ett.img"
alt=""
></el-image>
<div v-else class="box1-bottom-content-item-imgUndefined"> <div v-else class="box1-bottom-content-item-imgUndefined">
{{ {{
(ett.entityNameZh || ett.enName)?.match( (ett.entityNameZh || ett.enName)?.match(
...@@ -217,14 +186,8 @@ ...@@ -217,14 +186,8 @@
</div> </div>
</template> </template>
</custom-container> --> </custom-container> -->
<RiskSignal <RiskSignal :list="warningList" @item-click="handleToRiskSignalDetail" @more-click="handleToMoreRiskSignal"
:list="warningList" riskLevel="signalLevel" postDate="signalTime" name="signalTitle" />
@item-click="handleToRiskSignalDetail"
@more-click="handleToMoreRiskSignal"
riskLevel="signalLevel"
postDate="signalTime"
name="signalTitle"
/>
</el-col> </el-col>
</el-row> </el-row>
...@@ -247,19 +210,11 @@ ...@@ -247,19 +210,11 @@
</custom-container> </custom-container>
</el-col> --> </el-col> -->
<div class="center-center"> <div class="center-center">
<NewsList <NewsList :newsList="newsList" @item-click="handleNewsInfoClick" @more-click="handleToMoreNews"
:newsList="newsList" content="newsContent" />
@item-click="handleNewsInfoClick"
@more-click="handleToMoreNews" <MessageBubble :messageList="socialMediaList" @person-click="handlePerClick" imageUrl="avatar"
content="newsContent" @more-click="handleToSocialDetail" />
/>
<MessageBubble
:messageList="socialMediaList"
@person-click="handlePerClick"
imageUrl="avatar"
@more-click="handleToSocialDetail"
/>
<!-- <custom-container title="社交媒体" :titleIcon="dialogIcon" height="450px"> <!-- <custom-container title="社交媒体" :titleIcon="dialogIcon" height="450px">
<template #default> <template #default>
<div class="dialog-list"> <div class="dialog-list">
...@@ -285,19 +240,14 @@ ...@@ -285,19 +240,14 @@
<template #default="scope"> <template #default="scope">
<div style="display: flex; align-items: center"> <div style="display: flex; align-items: center">
<span style="margin-right: 10px; width: 40px">{{ scope.row.num }}</span> <span style="margin-right: 10px; width: 40px">{{ scope.row.num }}</span>
<el-progress <el-progress :percentage="scope.row.percent * 100" :show-text="false"
:percentage="scope.row.percent * 100" :status="getStatus(scope.row.percent)" />
:show-text="false"
:status="getStatus(scope.row.percent)"
/>
</div> </div>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="重点领域" width="220" align="center"> <el-table-column label="重点领域" width="220" align="center">
<template #default="scope"> <template #default="scope">
<div <div style="display: flex; justify-content: center; align-items: center; gap: 5px">
style="display: flex; justify-content: center; align-items: center; gap: 5px"
>
<el-tag v-for="tag in scope.row.tags" :key="tag" :type="getTagType(tag)">{{ <el-tag v-for="tag in scope.row.tags" :key="tag" :type="getTagType(tag)">{{
tag tag
}}</el-tag> }}</el-tag>
...@@ -314,19 +264,14 @@ ...@@ -314,19 +264,14 @@
<template #default="scope"> <template #default="scope">
<div style="display: flex; align-items: center"> <div style="display: flex; align-items: center">
<span style="margin-right: 10px; width: 40px">{{ scope.row.num }}</span> <span style="margin-right: 10px; width: 40px">{{ scope.row.num }}</span>
<el-progress <el-progress :percentage="scope.row.percent * 100" :show-text="false"
:percentage="scope.row.percent * 100" :status="getStatus(scope.row.percent)" />
:show-text="false"
:status="getStatus(scope.row.percent)"
/>
</div> </div>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="重点领域" width="220" align="center"> <el-table-column label="重点领域" width="220" align="center">
<template #default="scope"> <template #default="scope">
<div <div style="display: flex; justify-content: center; align-items: center; gap: 5px">
style="display: flex; justify-content: center; align-items: center; gap: 5px"
>
<el-tag v-for="tag in scope.row.tags" :key="tag" :type="getTagType(tag)">{{ <el-tag v-for="tag in scope.row.tags" :key="tag" :type="getTagType(tag)">{{
tag tag
}}</el-tag> }}</el-tag>
...@@ -343,11 +288,8 @@ ...@@ -343,11 +288,8 @@
<template #default="scope"> <template #default="scope">
<div style="display: flex; align-items: center"> <div style="display: flex; align-items: center">
<span style="margin-right: 10px; width: 40px">{{ scope.row.num }}</span> <span style="margin-right: 10px; width: 40px">{{ scope.row.num }}</span>
<el-progress <el-progress :percentage="scope.row.percent * 100" :show-text="false"
:percentage="scope.row.percent * 100" :status="getStatus(scope.row.percent)" />
:show-text="false"
:status="getStatus(scope.row.percent)"
/>
</div> </div>
</template> </template>
</el-table-column> </el-table-column>
...@@ -399,13 +341,9 @@ ...@@ -399,13 +341,9 @@
<el-row :gutter="20" style="width: 1600px; margin: 0 auto; margin-top: 39px"> <el-row :gutter="20" style="width: 1600px; margin: 0 auto; margin-top: 39px">
<CustomTitle id="position4" title="资源库" style="margin-top: 0px" /> <CustomTitle id="position4" title="资源库" style="margin-top: 0px" />
<div class="resource-tabs"> <div class="resource-tabs">
<div <div v-for="tab in resourceTabs" :key="tab.value" class="resource-tab-item"
v-for="tab in resourceTabs"
:key="tab.value"
class="resource-tab-item"
:class="{ active: activeResourceTab === tab.value, disabled: tab.disabled }" :class="{ active: activeResourceTab === tab.value, disabled: tab.disabled }"
@click="handleResourceTabClick(tab)" @click="handleResourceTabClick(tab)">
>
{{ tab.label }} {{ tab.label }}
</div> </div>
</div> </div>
...@@ -418,25 +356,15 @@ ...@@ -418,25 +356,15 @@
<div class="box4-item" v-for="(item, idx) in sanctionProcessList" :key="item.title"> <div class="box4-item" v-for="(item, idx) in sanctionProcessList" :key="item.title">
<div class="box4-item-left"> <div class="box4-item-left">
<el-image :src="dotIcon" alt="图片" class="box4-item-left-icon" /> <el-image :src="dotIcon" alt="图片" class="box4-item-left-icon" />
<div <div class="box4-item-left-line" v-if="idx + 1 != sanctionProcessList.length"></div>
class="box4-item-left-line"
v-if="idx + 1 != sanctionProcessList.length"
></div>
</div> </div>
<div class="box4-item-right"> <div class="box4-item-right">
<div class="box4-item-right-header" @click="handleSanc(item)"> <div class="box4-item-right-header" @click="handleSanc(item)">
<span class="box4-item-right-header-title" <span class="box4-item-right-header-title">{{ item.postDate }}{{ item.title }}</span>
>{{ item.postDate }}{{ item.title }}</span
>
<span class="box4-item-right-header-desc">{{ item.desc }}</span> <span class="box4-item-right-header-desc">{{ item.desc }}</span>
</div> </div>
<el-tooltip <el-tooltip effect="dark" :content="item.content" popper-class="common-prompt-popper"
effect="dark" placement="top" :show-after="500">
:content="item.content"
popper-class="common-prompt-popper"
placement="top"
:show-after="500"
>
<div class="box4-item-right-content"> <div class="box4-item-right-content">
{{ item.content }} {{ item.content }}
</div> </div>
...@@ -444,12 +372,8 @@ ...@@ -444,12 +372,8 @@
</div> </div>
</div> </div>
</div> </div>
<div <div class="box4-footer" :style="{ marginTop: sanctionProcessList.length > 0 ? '0px' : 'auto' }">
class="box4-footer" <el-button type="primary" link @click="handleGetMore">查看更多
:style="{ marginTop: sanctionProcessList.length > 0 ? '0px' : 'auto' }"
>
<el-button type="primary" link @click="handleGetMore"
>查看更多
<el-icon> <el-icon>
<DArrowRight /> <DArrowRight />
</el-icon> </el-icon>
...@@ -466,15 +390,8 @@ ...@@ -466,15 +390,8 @@
</template> </template>
<template #default> <template #default>
<div class="box5"> <div class="box5">
<el-table <el-table :data="entitiesList" class="sanction-table" stripe empty-text="暂无数据" height="700px"
:data="entitiesList" header-row-class-name="table-header" row-class-name="table-row">
class="sanction-table"
stripe
empty-text="暂无数据"
height="700px"
header-row-class-name="table-header"
row-class-name="table-row"
>
<!-- <el-table-column prop="index" label="序号" width="80" align="center"> <!-- <el-table-column prop="index" label="序号" width="80" align="center">
<template #default="scope"> <template #default="scope">
{{ scope.$index + 1 + (currentPage - 1) * pageSize }} {{ scope.$index + 1 + (currentPage - 1) * pageSize }}
...@@ -484,12 +401,8 @@ ...@@ -484,12 +401,8 @@
<el-table-column prop="name" label="实体名称" min-width="200"> <el-table-column prop="name" label="实体名称" min-width="200">
<template #default="scope"> <template #default="scope">
<div class="tableName" @click="handleCompClick(scope.row)"> <div class="tableName" @click="handleCompClick(scope.row)">
<el-image <el-image v-if="scope.row.img" class="box1-bottom-content-item-img" :src="scope.row.img"
v-if="scope.row.img" alt=""></el-image>
class="box1-bottom-content-item-img"
:src="scope.row.img"
alt=""
></el-image>
<div v-else class="box1-bottom-content-item-imgUndefined"> <div v-else class="box1-bottom-content-item-imgUndefined">
{{ {{
(scope.row.name || scope.row.enName)?.match( (scope.row.name || scope.row.enName)?.match(
...@@ -540,19 +453,13 @@ ...@@ -540,19 +453,13 @@
<el-table-column prop="revenue" label="50%规则子企业" width="280" align="right"> <el-table-column prop="revenue" label="50%规则子企业" width="280" align="right">
<template #default="scope"> <template #default="scope">
<div class="num-item" v-if="scope.row.ruleOrgCount > 0"> <div class="num-item" v-if="scope.row.ruleOrgCount > 0">
<div <div class="name-item" :class="[
class="name-item" 'revenue-cell',
:class="[ scope.row.revenue === '无营收数据' ? 'no-revenue' : ''
'revenue-cell', ]">
scope.row.revenue === '无营收数据' ? 'no-revenue' : ''
]"
>
{{ scope.row.ruleOrgList[0].orgName }}...等 {{ scope.row.ruleOrgList[0].orgName }}...等
</div> </div>
<div <div style="width: 50px; color: #409eff; cursor: pointer" @click="handleOrgClick(scope.row)">
style="width: 50px; color: #409eff; cursor: pointer"
@click="handleOrgClick(scope.row)"
>
{{ scope.row.ruleOrgCount }}家> {{ scope.row.ruleOrgCount }}家>
</div> </div>
</div> </div>
...@@ -564,15 +471,8 @@ ...@@ -564,15 +471,8 @@
<!-- <div class="pagination-info"> <!-- <div class="pagination-info">
第{{ currentPage }}页,共{{ totalPages }}页 第{{ currentPage }}页,共{{ totalPages }}页
</div> --> </div> -->
<el-pagination <el-pagination v-model:current-page="currentPage" :page-size="pageSize" :total="total"
v-model:current-page="currentPage" :pager-count="5" layout="prev, pager, next" background @current-change="handlePageChange" />
:page-size="pageSize"
:total="total"
:pager-count="5"
layout="prev, pager, next"
background
@current-change="handlePageChange"
/>
</div> </div>
</div> </div>
</template> </template>
...@@ -638,14 +538,8 @@ ...@@ -638,14 +538,8 @@
</div> </div>
<div class="right-footer"> <div class="right-footer">
<div class="total-count">{{ totalAll }}</div> <div class="total-count">{{ totalAll }}</div>
<el-pagination <el-pagination v-model:current-page="currentPageAll" :page-size="pageSizeAll" :total="totalAll"
v-model:current-page="currentPageAll" layout="prev, pager, next" background @current-change="handlePageChangeAll" />
:page-size="pageSizeAll"
:total="totalAll"
layout="prev, pager, next"
background
@current-change="handlePageChangeAll"
/>
</div> </div>
</div> </div>
</div> </div>
...@@ -680,12 +574,8 @@ ...@@ -680,12 +574,8 @@
</div> </div>
</template> </template>
</el-dialog> --> </el-dialog> -->
<RuleSubsidiaryDialog <RuleSubsidiaryDialog v-model="dialogVisible" :company-name="currentRuleCompany" :total-count="currentRuleCount"
v-model="dialogVisible" :data-list="currentOrgList" />
:company-name="currentRuleCompany"
:total-count="currentRuleCount"
:data-list="currentOrgList"
/>
</div> </div>
<el-dialog v-model="mediaVisible" title="社交媒体信息" width="500" :before-close="handleMediaClose"> <el-dialog v-model="mediaVisible" title="社交媒体信息" width="500" :before-close="handleMediaClose">
<div class="dialog-content"> <div class="dialog-content">
...@@ -701,7 +591,7 @@ ...@@ -701,7 +591,7 @@
</template> </template>
<script setup> <script setup>
import NewsList from "@/components/NewsList.vue"; import NewsList from "@/components/base/newsList/index.vue";
import RiskSignal from "@/components/base/RiskSignal/index.vue"; import RiskSignal from "@/components/base/RiskSignal/index.vue";
import { onMounted, ref, computed, reactive, shallowRef, watch, nextTick } from "vue"; import { onMounted, ref, computed, reactive, shallowRef, watch, nextTick } from "vue";
import { useContainerScroll } from "@/hooks/useScrollShow"; import { useContainerScroll } from "@/hooks/useScrollShow";
...@@ -1370,7 +1260,7 @@ const fetchSanctionList = async () => { ...@@ -1370,7 +1260,7 @@ const fetchSanctionList = async () => {
}); });
totalAll.value = res.totalElements; totalAll.value = res.totalElements;
} }
} catch (error) {} } catch (error) { }
}; };
const handlePageChangeAll = val => { const handlePageChangeAll = val => {
...@@ -1642,7 +1532,7 @@ const handleGetHylyList = async () => { ...@@ -1642,7 +1532,7 @@ const handleGetHylyList = async () => {
hylymc: "全部分类" hylymc: "全部分类"
}; };
categoryList.value = [obj, ...categoryList.value]; categoryList.value = [obj, ...categoryList.value];
} catch (error) {} } catch (error) { }
}; };
const chart1Data = ref({ const chart1Data = ref({
...@@ -2118,6 +2008,7 @@ const handleMediaClick = item => { ...@@ -2118,6 +2008,7 @@ const handleMediaClick = item => {
// align-items: flex-start; // align-items: flex-start;
gap: 100px; gap: 100px;
flex: 1; flex: 1;
.box3-content { .box3-content {
display: flex; display: flex;
flex-direction: column; flex-direction: column;
...@@ -2141,6 +2032,7 @@ const handleMediaClick = item => { ...@@ -2141,6 +2032,7 @@ const handleMediaClick = item => {
} }
.box3-content { .box3-content {
// flex: 1; // flex: 1;
.el-progress--line { .el-progress--line {
width: 82px; width: 82px;
...@@ -3535,7 +3427,6 @@ const handleMediaClick = item => { ...@@ -3535,7 +3427,6 @@ const handleMediaClick = item => {
height: 450px; height: 450px;
display: flex; display: flex;
gap: 20px; gap: 20px;
.center-center-news { .center-center-news {
flex-shrink: 0; flex-shrink: 0;
} }
......
...@@ -12,13 +12,8 @@ ...@@ -12,13 +12,8 @@
<div class="home-top-bg"></div> <div class="home-top-bg"></div>
<div class="home-main-header"> <div class="home-main-header">
<div class="home-main-header-center"> <div class="home-main-header-center">
<SearchContainer <SearchContainer style="margin-bottom: 0; height: fit-content" v-if="containerRef" placeholder="搜索投融资限制政策"
style="margin-bottom: 0; height: fit-content" :containerRef="containerRef" areaName="" />
v-if="containerRef"
placeholder="搜索投融资限制政策"
:containerRef="containerRef"
areaName=""
/>
<!-- <el-input <!-- <el-input
v-model="searchKey" v-model="searchKey"
style="width: 100%; height: 48px" style="width: 100%; height: 48px"
...@@ -115,17 +110,9 @@ ...@@ -115,17 +110,9 @@
</div> </div>
<div class="box1-top-content-item"> <div class="box1-top-content-item">
<span class="box1-top-content-item-title">· 涉及领域:</span> <span class="box1-top-content-item-title">· 涉及领域:</span>
<div <div class="box1-top-content-item-tags" v-for="item in ['航空航天', '人工智能', '集成电路']" :key="item">
class="box1-top-content-item-tags" <el-tag :type="item === '航空航天' ? 'primary' : item === '人工智能' ? 'danger' : 'info'
v-for="item in ['航空航天', '人工智能', '集成电路']" ">{{ item }}</el-tag>
:key="item"
>
<el-tag
:type="
item === '航空航天' ? 'primary' : item === '人工智能' ? 'danger' : 'info'
"
>{{ item }}</el-tag
>
</div> </div>
</div> </div>
</div> </div>
...@@ -183,14 +170,8 @@ ...@@ -183,14 +170,8 @@
</template> </template>
</custom-container> --> </custom-container> -->
<RiskSignal <RiskSignal :list="warningList" @item-click="handleToRiskSignalDetail" @more-click="handleToMoreRiskSignal"
:list="warningList" riskLevel="status" postDate="time" name="title" />
@item-click="handleToRiskSignalDetail"
@more-click="handleToMoreRiskSignal"
riskLevel="status"
postDate="time"
name="title"
/>
</el-col> </el-col>
</el-row> </el-row>
<el-row :gutter="20" style="width: 1600px; margin: 0 auto"> <el-row :gutter="20" style="width: 1600px; margin: 0 auto">
...@@ -214,22 +195,11 @@ ...@@ -214,22 +195,11 @@
<div class="center-center"> <div class="center-center">
<div class="center-center-news"> <div class="center-center-news">
<NewsList <NewsList :newsList="customNewsData" @item-click="handleNewsInfoClick" @more-click="handleToMoreNews"
:newsList="customNewsData" from="from" content="description" title="title" img="image" />
@item-click="handleNewsInfoClick"
@more-click="handleToMoreNews"
from="from"
content="description"
title="title"
img="image"
/>
</div> </div>
<MessageBubble <MessageBubble :messageList="messageList" @person-click="handlePerClick" imageUrl="avatar"
:messageList="messageList" @more-click="handleToSocialDetail" />
@person-click="handlePerClick"
imageUrl="avatar"
@more-click="handleToSocialDetail"
/>
<!-- <div class="boxs4"> <!-- <div class="boxs4">
<custom-container title="社交媒体" :titleIcon="dialogIcon" height="450px"> <custom-container title="社交媒体" :titleIcon="dialogIcon" height="450px">
<template #default> <template #default>
...@@ -269,27 +239,18 @@ ...@@ -269,27 +239,18 @@
<template #default="scope"> <template #default="scope">
<div style="display: flex; align-items: center"> <div style="display: flex; align-items: center">
<span style="margin-right: 10px; width: 40px">{{ scope.row.num }}</span> <span style="margin-right: 10px; width: 40px">{{ scope.row.num }}</span>
<el-progress <el-progress :percentage="scope.row.percent * 100" :show-text="false"
:percentage="scope.row.percent * 100" :status="getStatus(scope.row.percent)" />
:show-text="false"
:status="getStatus(scope.row.percent)"
/>
</div> </div>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="重点领域" width="180"> <el-table-column label="重点领域" width="180">
<template #default="scope"> <template #default="scope">
<div style="display: flex; align-items: center; gap: 5px"> <div style="display: flex; align-items: center; gap: 5px">
<el-tag <el-tag v-for="tag in scope.row.tags" :key="tag" :type="tag === '通信网络'
v-for="tag in scope.row.tags" ? 'primary'
:key="tag" : TAGTYPE[Math.floor(Math.random() * 5)]
:type=" ">{{ tag }}</el-tag>
tag === '通信网络'
? 'primary'
: TAGTYPE[Math.floor(Math.random() * 5)]
"
>{{ tag }}</el-tag
>
</div> </div>
</template> </template>
</el-table-column> </el-table-column>
...@@ -303,27 +264,18 @@ ...@@ -303,27 +264,18 @@
<template #default="scope"> <template #default="scope">
<div style="display: flex; align-items: center"> <div style="display: flex; align-items: center">
<span style="margin-right: 10px; width: 40px">{{ scope.row.num }}</span> <span style="margin-right: 10px; width: 40px">{{ scope.row.num }}</span>
<el-progress <el-progress :percentage="scope.row.percent * 100" :show-text="false"
:percentage="scope.row.percent * 100" :status="getStatus(scope.row.percent)" />
:show-text="false"
:status="getStatus(scope.row.percent)"
/>
</div> </div>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="重点领域" width="180"> <el-table-column label="重点领域" width="180">
<template #default="scope"> <template #default="scope">
<div style="display: flex; align-items: center; gap: 5px"> <div style="display: flex; align-items: center; gap: 5px">
<el-tag <el-tag v-for="tag in scope.row.tags" :key="tag" :type="tag === '通信网络'
v-for="tag in scope.row.tags" ? 'primary'
:key="tag" : TAGTYPE[Math.floor(Math.random() * 5)]
:type=" ">{{ tag }}</el-tag>
tag === '通信网络'
? 'primary'
: TAGTYPE[Math.floor(Math.random() * 5)]
"
>{{ tag }}</el-tag
>
</div> </div>
</template> </template>
</el-table-column> </el-table-column>
...@@ -337,27 +289,18 @@ ...@@ -337,27 +289,18 @@
<template #default="scope"> <template #default="scope">
<div style="display: flex; align-items: center"> <div style="display: flex; align-items: center">
<span style="margin-right: 10px; width: 40px">{{ scope.row.num }}</span> <span style="margin-right: 10px; width: 40px">{{ scope.row.num }}</span>
<el-progress <el-progress :percentage="scope.row.percent * 100" :show-text="false"
:percentage="scope.row.percent * 100" :status="getStatus(scope.row.percent)" />
:show-text="false"
:status="getStatus(scope.row.percent)"
/>
</div> </div>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="重点领域" width="180"> <el-table-column label="重点领域" width="180">
<template #default="scope"> <template #default="scope">
<div style="display: flex; align-items: center; gap: 5px"> <div style="display: flex; align-items: center; gap: 5px">
<el-tag <el-tag v-for="tag in scope.row.tags" :key="tag" :type="tag === '通信网络'
v-for="tag in scope.row.tags" ? 'primary'
:key="tag" : TAGTYPE[Math.floor(Math.random() * 5)]
:type=" ">{{ tag }}</el-tag>
tag === '通信网络'
? 'primary'
: TAGTYPE[Math.floor(Math.random() * 5)]
"
>{{ tag }}</el-tag
>
</div> </div>
</template> </template>
</el-table-column> </el-table-column>
...@@ -414,8 +357,7 @@ ...@@ -414,8 +357,7 @@
</div> </div>
</div> </div>
<div class="box4-footer"> <div class="box4-footer">
<el-button type="primary" link :icon="DownRight" <el-button type="primary" link :icon="DownRight">查看更多
>查看更多
<el-icon> <el-icon>
<DArrowRight /> <DArrowRight />
</el-icon> </el-icon>
...@@ -432,15 +374,8 @@ ...@@ -432,15 +374,8 @@
</template> </template>
<template #default> <template #default>
<div class="box5"> <div class="box5">
<el-table <el-table :data="paginatedData" class="sanction-table" stripe empty-text="暂无数据" height="700px"
:data="paginatedData" header-row-class-name="table-header" row-class-name="table-row">
class="sanction-table"
stripe
empty-text="暂无数据"
height="700px"
header-row-class-name="table-header"
row-class-name="table-row"
>
<!-- <el-table-column prop="index" label="序号" width="80" align="center"> <!-- <el-table-column prop="index" label="序号" width="80" align="center">
<template #default="scope"> <template #default="scope">
{{ scope.$index + 1 + (currentPage - 1) * pageSize }} {{ scope.$index + 1 + (currentPage - 1) * pageSize }}
...@@ -449,14 +384,12 @@ ...@@ -449,14 +384,12 @@
<el-table-column prop="name" label="实体名称" min-width="200"> <el-table-column prop="name" label="实体名称" min-width="200">
<template #default="scope"> <template #default="scope">
<div <div style="
style="
font-weight: 700; font-weight: 700;
font-size: 16px; font-size: 16px;
color: rgba(59, 65, 75, 1); color: rgba(59, 65, 75, 1);
font-family: Microsoft YaHei; font-family: Microsoft YaHei;
" ">
>
{{ scope.row.name }} {{ scope.row.name }}
</div> </div>
</template> </template>
...@@ -465,12 +398,8 @@ ...@@ -465,12 +398,8 @@
<el-table-column prop="domains" label="涉及领域" min-width="180"> <el-table-column prop="domains" label="涉及领域" min-width="180">
<template #default="scope"> <template #default="scope">
<div class="domain-tags"> <div class="domain-tags">
<el-tag <el-tag v-for="tag in scope.row.domains" :key="tag"
v-for="tag in scope.row.domains" :type="tag === '通信网络' ? 'primary' : 'danger'">{{ tag }}</el-tag>
:key="tag"
:type="tag === '通信网络' ? 'primary' : 'danger'"
>{{ tag }}</el-tag
>
</div> </div>
</template> </template>
</el-table-column> </el-table-column>
...@@ -506,9 +435,7 @@ ...@@ -506,9 +435,7 @@
<el-table-column prop="revenue" label="50%规则子企业" width="140" align="right"> <el-table-column prop="revenue" label="50%规则子企业" width="140" align="right">
<template #default="scope"> <template #default="scope">
<span <span :class="['revenue-cell', scope.row.revenue === '无营收数据' ? 'no-revenue' : '']">
:class="['revenue-cell', scope.row.revenue === '无营收数据' ? 'no-revenue' : '']"
>
{{ scope.row.revenue }} {{ scope.row.revenue }}
</span> </span>
</template> </template>
...@@ -519,14 +446,8 @@ ...@@ -519,14 +446,8 @@
<!-- <div class="pagination-info"> <!-- <div class="pagination-info">
第{{ currentPage }}页,共{{ totalPages }}页 第{{ currentPage }}页,共{{ totalPages }}页
</div> --> </div> -->
<el-pagination <el-pagination v-model:current-page="currentPage" :page-size="pageSize" :total="total"
v-model:current-page="currentPage" :pager-count="5" layout="prev, pager, next" background />
:page-size="pageSize"
:total="total"
:pager-count="5"
layout="prev, pager, next"
background
/>
</div> </div>
</div> </div>
</template> </template>
...@@ -555,7 +476,7 @@ import CustomContainer from "@/components/Container/index.vue"; ...@@ -555,7 +476,7 @@ import CustomContainer from "@/components/Container/index.vue";
import ClickableCard from "./components/link.vue"; import ClickableCard from "./components/link.vue";
import InfoCard from "./components/info.vue"; import InfoCard from "./components/info.vue";
import CustomTitle from "./components/title.vue"; import CustomTitle from "./components/title.vue";
import NewsList from "@/components/NewsList.vue"; import NewsList from "@/components/base/newsList/index.vue";
import trumpAvatar from "@/assets/images/icon-trump.png"; import trumpAvatar from "@/assets/images/icon-trump.png";
import elongAvatar from "@/assets/images/icon-elong.png"; import elongAvatar from "@/assets/images/icon-elong.png";
...@@ -1297,7 +1218,7 @@ const handleGetHylyList = async () => { ...@@ -1297,7 +1218,7 @@ const handleGetHylyList = async () => {
hylymc: "全部分类" hylymc: "全部分类"
}; };
categoryList.value = [obj, ...categoryList.value]; categoryList.value = [obj, ...categoryList.value];
} catch (error) {} } catch (error) { }
}; };
const chart1Data = ref({ const chart1Data = ref({
...@@ -1343,7 +1264,7 @@ const handleGetBillsByType = async () => { ...@@ -1343,7 +1264,7 @@ const handleGetBillsByType = async () => {
img: bill1 img: bill1
}; };
}); });
} catch (error) {} } catch (error) { }
}; };
// 查看社交媒体详情 // 查看社交媒体详情
const handleToSocialDetail = item => { const handleToSocialDetail = item => {
......
...@@ -374,8 +374,8 @@ ...@@ -374,8 +374,8 @@
<script setup> <script setup>
import RiskSignal from "@/components/base/RiskSignal/index.vue"; import RiskSignal from "@/components/base/riskSignal/index.vue";
import NewsList from "@/components/NewsList.vue"; import NewsList from "@/components/base/newsList/index.vue";
import { onMounted, ref, computed } from "vue"; import { onMounted, ref, computed } from "vue";
import router from "@/router"; import router from "@/router";
import DivideHeader from "@/components/DivideHeader.vue"; import DivideHeader from "@/components/DivideHeader.vue";
......
...@@ -61,7 +61,7 @@ ...@@ -61,7 +61,7 @@
</template> </template>
<script setup> <script setup>
import NewsList from "@/components/NewsList.vue"; import NewsList from "@/components/base/newsList/index.vue";
import { ref, onBeforeMount } from "vue"; import { ref, onBeforeMount } from "vue";
import router from "@/router" import router from "@/router"
......
...@@ -53,7 +53,7 @@ ...@@ -53,7 +53,7 @@
</template> </template>
<script setup> <script setup>
import NewsList from "@/components/NewsList.vue"; import NewsList from "@/components/base/newsList/index.vue";
import { ref, onMounted } from "vue"; import { ref, onMounted } from "vue";
import { import {
......
...@@ -50,6 +50,12 @@ ...@@ -50,6 +50,12 @@
</div> </div>
<div class="text">{{ "查看官网" }}</div> <div class="text">{{ "查看官网" }}</div>
</div> --> </div> -->
<div class="btn">
<div class="icon">
<img src="./images/btn-icon2.png" alt="" />
</div>
<div class="text" @click="goToOfficialWebsite()">{{ "查看官网" }}</div>
</div>
<div class="btn"> <div class="btn">
<div class="icon"> <div class="icon">
<img src="./images/btn-icon2.png" alt="" /> <img src="./images/btn-icon2.png" alt="" />
...@@ -72,7 +78,7 @@ ...@@ -72,7 +78,7 @@
</div> </div>
</div> </div>
<div class="main"> <div class="main">
<ReportAnalysis v-if="tabActiveName === '报告分析'"></ReportAnalysis> <ReportAnalysis v-if="tabActiveName === '报告分析'" :thinkInfo="thinkInfo" :reportList="reportList"></ReportAnalysis>
<PolicyTracking v-else></PolicyTracking> <PolicyTracking v-else></PolicyTracking>
</div> </div>
</div> </div>
...@@ -83,12 +89,13 @@ import { ref, onMounted } from "vue"; ...@@ -83,12 +89,13 @@ import { ref, onMounted } from "vue";
import ReportAnalysis from "./reportAnalysis/index.vue"; import ReportAnalysis from "./reportAnalysis/index.vue";
import PolicyTracking from "./policyTracking/index.vue"; import PolicyTracking from "./policyTracking/index.vue";
import { getThinkTankReportSummary } from "@/api/thinkTank/overview"; import { getThinkTankReportSummary, getThinkTankReportRelated } from "@/api/thinkTank/overview";
import { useRoute, useRouter } from "vue-router"; import { useRoute, useRouter } from "vue-router";
const router = useRouter(); const router = useRouter();
const route = useRoute(); const route = useRoute();
const reportUrl = ref(""); const reportUrl = ref("");
const thinkInfo = ref({}); const thinkInfo = ref({});
const reportList = ref({})
// 获取报告全局信息 // 获取报告全局信息
const handleGetThinkTankReportSummary = async () => { const handleGetThinkTankReportSummary = async () => {
...@@ -104,7 +111,20 @@ const handleGetThinkTankReportSummary = async () => { ...@@ -104,7 +111,20 @@ const handleGetThinkTankReportSummary = async () => {
console.error("获取报告全局信息error", error); console.error("获取报告全局信息error", error);
} }
}; };
// 获取相关报告信息
const handleGetThinkTankReport = async () => {
try {
const res = await getThinkTankReportRelated(router.currentRoute._value.params.id);
console.log("报告全局信息", res);
if (res.code === 200 && res.data) {
reportList.value = res.data;
}
} catch (error) {
console.error("获取相关报告error", error);
}
};
const toReport = () => { const toReport = () => {
console.log(reportUrl.value, "reportUrl.valuereportUrl.value"); console.log(reportUrl.value, "reportUrl.valuereportUrl.value");
const route = router.resolve({ const route = router.resolve({
...@@ -132,7 +152,17 @@ const handleAnalysisClick = () => { ...@@ -132,7 +152,17 @@ const handleAnalysisClick = () => {
}; };
onMounted(async () => { onMounted(async () => {
handleGetThinkTankReportSummary(); handleGetThinkTankReportSummary();
handleGetThinkTankReport();
}); });
const goToOfficialWebsite = () => {
const url = thinkInfo.value?.reportUrl;
if (!url) {
return;
}
// 简单校验一下,防止空字符串
window.open(url, "_blank");
};
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
......
...@@ -17,9 +17,39 @@ ...@@ -17,9 +17,39 @@
<div class="box1-main"> <div class="box1-main">
{{ box1Data }} {{ box1Data }}
</div> --> </div> -->
<AnalysisBox title="内容摘要" :showAllBtn="false"> <AnalysisBox title="基本信息" :showAllBtn="true">
<div class="box1-main"> <div class="box1-main">
{{ box1Data }} <div class="text-box">
<div class="time">
<div class="time-title">发布时间:</div>
<div class="time-content">{{ publishTime }}</div>
</div>
<div class="topic">
<div class="topic-title">报告主题:</div>
<div class="topic-content">{{ reportTopic }}</div>
</div>
<div class="author">
<div class="author-title">报告作者:</div>
<div class="author-content">
<template v-if="Array.isArray(reportAuthors) && reportAuthors.length">
<span v-for="(author, idx) in reportAuthors" :key="idx">
{{ author.name }}
<span v-if="idx < reportAuthors.length - 1"></span>
</span>
</template>
</div>
</div>
</div>
<div class="author-box" v-for="(author, idx) in reportAuthors" :key="idx"
v-if="Array.isArray(reportAuthors) && reportAuthors.length">
<div class="author-item">
<div class="image"><img :src="author.avatar" :alt="reportAuthors[0].name" /></div>
<div class="author-text">
<div class="author-name">{{ author.name }}</div>
<div class="author-position">{{ author.job }}</div>
</div>
</div>
</div>
</div> </div>
</AnalysisBox> </AnalysisBox>
</div> </div>
...@@ -39,31 +69,65 @@ ...@@ -39,31 +69,65 @@
<div class="box2-main"> <div class="box2-main">
<div class="box2-content" id="box2Chart"></div> <div class="box2-content" id="box2Chart"></div>
</div> --> </div> -->
<AnalysisBox title="关键词云" :showAllBtn="false"> <AnalysisBox title="相关报告" :showAllBtn="true">
<div class="box2-main"> <div class="box2-main">
<div class="box2-content" id="box2Chart"></div> <div class="box2-item" v-for="(report, idx) in reportList" :key="idx">
<div class="box2-item-content">
<div class="left"><img :src="report.image" alt="" /></div>
<div class="right-content">
<div class="report-title">{{ report.name }}</div>
<div class="report-footer">
<div class="report-time">{{ report.postDate }}</div>
<div class="report-footer-right">
<div class="footer-image">
<img :src="report.thinktankLogo" alt="" />
</div>
<div class="think-name">{{ report.thinktankName }}</div>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="box2-btn">
<div class="btn-text">
多智库报告观点汇聚分析
</div>
<div class="btn-image">
<img src="../images/btn-right.png" alt="">
</div>
</div> </div>
</AnalysisBox> </AnalysisBox>
</div> </div>
</div> </div>
<div class="right"> <div class="right">
<div class="box3"> <div class="box3">
<AnalysisBox title="主要观点" :showAllBtn="false"> <AnalysisBox title="报告摘要" :showAllBtn="true">
<div class="box3-main"> <div class="box3-main">
<div class="box3-main-main"> <div class="box3-top">
<div class="box3-item" v-for="(item, index) in majorOpinions" :key="index"> <div class="top-title">
<div class="title-image">
<img src="../images/title-image.png" alt="" />
</div>
</div>
</div>
<div class="box3-text"> {{ box1Data }}</div>
</div>
</AnalysisBox>
</div>
<div class="box4">
<AnalysisBox title="核心论点" :showAllBtn="true">
<div class="box4-main">
<div class="box4-main-main">
<div class="box4-item" v-for="(item, index) in majorOpinions" :key="index">
<div class="left"> <div class="left">
{{ index + 1 }} {{ index + 1 }}
</div> </div>
<div class="center"> <div class="center">
<div class="title">{{ item.content }}</div> <div class="title">{{ item.content }}</div>
<div> <div>
<img <img src="../images/image-open.png" alt="" class="center-image"
src="../images/image-open.png" @click="handleOpenReportOriginal(item)" />
alt=""
class="center-image"
@click="handleOpenReportOriginal(item)"
/>
</div> </div>
<!-- <div class="desc">{{ item.econtent }}</div> --> <!-- <div class="desc">{{ item.econtent }}</div> -->
</div> </div>
...@@ -81,17 +145,11 @@ ...@@ -81,17 +145,11 @@
</div> --> </div> -->
</div> </div>
</div> </div>
<div class="box3-main-footer"> <div class="box4-main-footer">
<div class="info">共{{ total }}条核心论点</div> <div class="info">共{{ total }}条核心论点</div>
<div class="page-box"> <div class="page-box">
<el-pagination <el-pagination :page-size="12" background layout="prev, pager, next" :total="total"
:page-size="12" @current-change="handleCurrentChange" :current-page="currentPage" />
background
layout="prev, pager, next"
:total="total"
@current-change="handleCurrentChange"
:current-page="currentPage"
/>
</div> </div>
</div> </div>
</div> </div>
...@@ -102,7 +160,7 @@ ...@@ -102,7 +160,7 @@
</template> </template>
<script setup> <script setup>
import { ref, onMounted } from "vue"; import { ref, onMounted, computed, defineProps } from "vue";
import setChart from "@/utils/setChart"; import setChart from "@/utils/setChart";
import getWordCloudChart from "./utils/worldCloudChart"; import getWordCloudChart from "./utils/worldCloudChart";
import { import {
...@@ -116,6 +174,41 @@ import { useRouter } from "vue-router"; ...@@ -116,6 +174,41 @@ import { useRouter } from "vue-router";
const router = useRouter(); const router = useRouter();
import "echarts-wordcloud"; import "echarts-wordcloud";
const props = defineProps({
thinkInfo: {
type: Object,
default: () => ({})
},
reportList: {
type: Object,
default: () => ({})
}
});
const publishTime = computed(() => {
const info = props.thinkInfo || {};
// 优先用 times,其次用 reportTime 的日期部分
if (info.times) return info.times;
if (info.reportTime && typeof info.reportTime === "string") {
return info.reportTime.split("T")[0];
}
return "";
});
const reportTopic = computed(() => {
const info = props.thinkInfo || {};
return info.summary;
});
const reportAuthors = computed(() => {
const info = props.thinkInfo || {};
if (Array.isArray(info.authors) && info.authors.length) {
return info.authors;
}
return [];
});
// 内容摘要 // 内容摘要
const box1Data = const box1Data =
ref(`包括经济竞争在内的美中竞争自2017年以来一直在定义美国外交政策。这两个经济体是世界上第一和第二大国家经济体,并且深深交织在一起。改变关系,无论多么必要,可能是昂贵的。因此,美国面临着一项挑战,确保其经济在耦合的战略竞争条件下满足国家的需求。 ref(`包括经济竞争在内的美中竞争自2017年以来一直在定义美国外交政策。这两个经济体是世界上第一和第二大国家经济体,并且深深交织在一起。改变关系,无论多么必要,可能是昂贵的。因此,美国面临着一项挑战,确保其经济在耦合的战略竞争条件下满足国家的需求。
...@@ -391,122 +484,321 @@ onMounted(() => { ...@@ -391,122 +484,321 @@ onMounted(() => {
} }
.left { .left {
gap: 16px;
display: flex;
flex-direction: column;
.box1 { .box1 {
margin-top: 17px; margin-top: 17px;
width: 480px; width: 480px;
height: 390px; height: 486px;
// border: 1px solid rgba(234, 236, 238, 1); // border: 1px solid rgba(234, 236, 238, 1);
// border-radius: 10px; // border-radius: 10px;
// box-shadow: 0px 0px 20px 0px rgba(25, 69, 130, 0.1); // box-shadow: 0px 0px 20px 0px rgba(25, 69, 130, 0.1);
// background: rgba(255, 255, 255, 1); // background: rgba(255, 255, 255, 1);
.box1-main { .box1-main {
margin: 5px auto; width: 480px;
width: 428px; height: 438px;
height: 315px;
/* 9行 * 30px/行 = 270px,这里可以稍微调整 */
color: rgba(59, 65, 75, 1);
font-family: Microsoft YaHei;
font-size: 16px;
font-weight: 400;
line-height: 30px;
letter-spacing: 0px;
text-align: justify;
overflow-y: auto;
// display: -webkit-box;
// /* 使用Webkit的弹性盒模型 */
// -webkit-box-orient: vertical;
// /* 垂直排列 */
// -webkit-line-clamp: 9;
// /* 限制显示9行 */
// overflow: hidden;
// /* 隐藏超出部分 */
}
.box1-footer { .text-box {
margin: 0 auto; width: 437px;
width: 108px;
height: 32px;
display: flex;
align-items: center;
justify-content: center;
gap: 4px;
cursor: pointer;
&:hover { margin-left: 22px;
background: var(--color-bg-hover); margin-top: 8px;
} gap: 12px;
display: flex;
flex-direction: column;
.text { .time {
height: 22px; height: 24px;
color: var(--color-main-active); display: flex;
font-family: Microsoft YaHei; gap: 4px;
font-size: 14px;
font-weight: 400; .time-title {
line-height: 22px; width: 88px;
letter-spacing: 0px;
text-align: left; font-family: "Source Han Sans CN";
font-weight: 700;
font-size: 16px;
line-height: 24px;
letter-spacing: 1px;
text-align: left;
color: rgb(59, 65, 75);
}
.time-content {
width: 345px;
font-family: "Source Han Sans CN";
font-weight: 400;
font-size: 16px;
line-height: 24px;
letter-spacing: 0px;
text-align: left;
color: rgb(59, 65, 75);
}
}
.topic {
display: flex;
gap: 4px;
.topic-title {
width: 88px;
font-family: "Source Han Sans CN";
font-weight: 700;
font-size: 16px;
line-height: 24px;
letter-spacing: 1px;
text-align: left;
color: rgb(59, 65, 75);
}
.topic-content {
width: 345px;
font-family: "Source Han Sans CN";
font-weight: 400;
font-size: 16px;
line-height: 30px;
letter-spacing: 0px;
text-align: left;
color: rgb(59, 65, 75);
}
}
.author {
height: 24px;
display: flex;
gap: 4px;
.author-title {
width: 88px;
font-family: "Source Han Sans CN";
font-weight: 700;
font-size: 16px;
line-height: 24px;
letter-spacing: 1px;
text-align: left;
color: rgb(59, 65, 75);
}
.author-content {
width: 345px;
font-family: "Source Han Sans CN";
font-weight: 400;
font-size: 16px;
line-height: 24px;
letter-spacing: 0px;
text-align: left;
color: rgb(59, 65, 75);
}
}
} }
.icon { .author-box {
width: 16px; width: 437px;
height: 16px; height: 220px;
margin-top: 34px;
margin-left: 18px;
.author-item {
width: 213px;
height: 49px;
display: flex;
gap: 11px;
.image {
width: 42px;
height: 42px;
margin-top: 3px;
margin-left: 3px;
display: inline-block;
img {
width: 100%;
height: 100%;
border-radius: 50%;
}
}
.author-text {
width: 154px;
height: 49px;
.author-name {
width: 154px;
height: 24px;
font-family: "Source Han Sans CN";
font-weight: 700;
font-size: 16px;
line-height: 24px;
letter-spacing: 0;
text-align: left;
color: rgb(59, 65, 75);
}
.author-position {
width: 154px;
height: 22px;
font-family: "Source Han Sans CN";
font-weight: 400;
font-size: 14px;
line-height: 22px;
letter-spacing: 0;
text-align: left;
color: rgb(95, 101, 108);
}
}
img {
width: 100%;
height: 100%;
} }
} }
} }
} }
.box2 { .box2 {
margin-top: 16px;
width: 480px; width: 480px;
height: 390px; height: 648px;
// border: 1px solid rgba(234, 236, 238, 1); // border: 1px solid rgba(234, 236, 238, 1);
// border-radius: 10px; // border-radius: 10px;
// box-shadow: 0px 0px 20px 0px rgba(25, 69, 130, 0.1); // box-shadow: 0px 0px 20px 0px rgba(25, 69, 130, 0.1);
// background: rgba(255, 255, 255, 1); // background: rgba(255, 255, 255, 1);
.box2-main { .box2-main {
width: 430px; width: 436px;
height: 320px; margin-top: 5px;
margin: 10px auto; margin-left: 23px;
.box2-main-tag-box { .box2-item {
display: flex; height: 103px;
flex-wrap: wrap; width: 100%;
height: 89px; border-bottom: 1px solid rgba(234, 236, 238, 1);
box-sizing: border-box; border-top: 1px solid rgba(234, 236, 238, 1);
padding: 8px 0;
gap: 8px; .box2-item-content {
width: 100%;
.tag { height: 90px;
height: 28px; margin-top: 7px;
line-height: 28px; display: flex;
padding: 0 8px;
box-sizing: border-box; .left {
border: 1px solid rgba(230, 231, 232, 1); width: 56px;
border-radius: 4px; height: 74px;
background: rgba(255, 255, 255, 1); margin-top: 8px;
cursor: pointer;
} img {
width: 100%;
height: 100%;
}
}
.tagActive { .right-content {
color: var(--color-main-active); margin-left: 13px;
border: 1px solid var(--color-main-active); width: 365px;
background: rgba(231, 243, 255, 1); height: 76px;
margin-top: 7px;
.report-title {
height: 48px;
font-family: "Source Han Sans CN";
font-weight: 700;
font-size: 16px;
line-height: 24px;
letter-spacing: 0;
text-align: left;
}
.report-footer {
margin-top: 4px;
height: 22px;
justify-content: space-between;
display: flex;
.report-time {
height: 22px;
width: 97px;
font-family: "Source Han Sans CN";
font-weight: 400;
font-size: 14px;
line-height: 22px;
letter-spacing: 0;
text-align: left;
color: rgb(95, 101, 108);
}
.report-footer-right {
height: 22px;
display: flex;
gap: 6px;
.footer-image {
width: 16px;
height: 16px;
margin-top: 3px;
img {
width: 100%;
height: 100%;
}
}
.think-name {
height: 22px;
}
}
}
}
} }
} }
}
.box2-btn {
margin-top: 16px;
margin-left: 23px;
width: 436px;
height: 36px;
background-color: rgb(5, 95, 194);
border-radius: 6px;
display: flex;
.btn-text {
color: rgb(255, 255, 255);
font-family: "Source Han Sans CN";
font-weight: 400;
font-size: 16px;
line-height: 22px;
letter-spacing: 0;
margin-left: 120px;
margin-top: 7px;
.box2-content { }
width: 430px;
height: 315px; .btn-image {
box-sizing: border-box; width: 13px;
border: 1px solid rgba(234, 236, 238, 1); height: 8px;
border-radius: 4px;
background: rgba(247, 248, 249, 1); margin-left: 8px;
display: inline-block;
margin-top: 14px;
img {
width: 100%;
height: 100%;
display: block;
}
} }
} }
} }
...@@ -514,8 +806,73 @@ onMounted(() => { ...@@ -514,8 +806,73 @@ onMounted(() => {
.right { .right {
margin-top: 17px; margin-top: 17px;
gap: 16px;
display: flex;
flex-direction: column;
.box3 { .box3 {
width: 1103px;
height: 545px;
// border: 1px solid rgba(234, 236, 238, 1);
// border-radius: 10px;
// box-shadow: 0px 0px 20px 0px rgba(25, 69, 130, 0.1);
// background: rgba(255, 255, 255, 1);
.box3-main {
width: 1058px;
height: 466px;
margin-top: 3px;
margin-left: 22px;
.box3-top {
width: 1058px;
height: 48px;
background: linear-gradient(rgb(137, 193, 255, 0.1), rgb(255, 255, 255));
display: flex;
.top-title {
width: 1010px;
height: 32px;
margin-left: 24px;
margin-top: 16px;
.title-image {
width: 199px;
height: 32px;
img {
width: 100%;
height: 100%;
}
}
}
}
.box3-text {
width: 1006px;
margin-top: 24px;
margin-left: 26px;
font-family: "Source Han Sans CN";
font-weight: 400;
font-size: 16px;
line-height: 30px;
letter-spacing: 0px;
text-align: justify;
text-justify: inter-ideograph;
}
}
}
.box4 {
width: 1103px; width: 1103px;
height: 965px; height: 965px;
// border: 1px solid rgba(234, 236, 238, 1); // border: 1px solid rgba(234, 236, 238, 1);
...@@ -524,16 +881,16 @@ onMounted(() => { ...@@ -524,16 +881,16 @@ onMounted(() => {
// background: rgba(255, 255, 255, 1); // background: rgba(255, 255, 255, 1);
position: relative; position: relative;
.box3-main { .box4-main {
width: 1057px; width: 1057px;
margin: 0 auto; margin: 0 auto;
.box3-main-main { .box4-main-main {
height: 767px; height: 767px;
overflow: hidden; overflow: hidden;
.box3-item { .box4-item {
width: 1057px; width: 1057px;
height: 72px; height: 72px;
box-sizing: border-box; box-sizing: border-box;
...@@ -594,19 +951,7 @@ onMounted(() => { ...@@ -594,19 +951,7 @@ onMounted(() => {
margin-left: 18px; margin-left: 18px;
} }
.desc {
height: 22px;
color: rgba(95, 101, 108, 1);
font-family: Microsoft YaHei;
font-size: 14px;
font-weight: 400;
line-height: 22px;
letter-spacing: 0px;
text-align: left;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
} }
.right { .right {
...@@ -650,14 +995,14 @@ onMounted(() => { ...@@ -650,14 +995,14 @@ onMounted(() => {
} }
} }
.box3-item:nth-child(2n-1) { .box4-item {
border-bottom: 1px solid rgba(234, 236, 238, 1); border-bottom: 1px solid rgba(234, 236, 238, 1);
border-top: 1px solid rgba(234, 236, 238, 1); border-top: 1px solid rgba(234, 236, 238, 1);
background: rgba(247, 248, 249, 1);
} }
} }
.box3-main-footer { .box4-main-footer {
height: 80px; height: 80px;
display: flex; display: flex;
justify-content: space-between; justify-content: space-between;
...@@ -675,7 +1020,7 @@ onMounted(() => { ...@@ -675,7 +1020,7 @@ onMounted(() => {
} }
} }
.box3-footer { .box4-footer {
position: absolute; position: absolute;
left: 22px; left: 22px;
bottom: 19px; bottom: 19px;
...@@ -725,4 +1070,8 @@ onMounted(() => { ...@@ -725,4 +1070,8 @@ onMounted(() => {
} }
} }
} }
:deep(.analysis-box-wrapper .wrapper-header) {
height: 54px !important;
}
</style> </style>
...@@ -10,18 +10,17 @@ ...@@ -10,18 +10,17 @@
<!-- <div class="box-header-right">{{ "查看数据源 >" }}</div> --> <!-- <div class="box-header-right">{{ "查看数据源 >" }}</div> -->
<div class="select-box"> <div class="select-box">
<el-select v-model="box1SelectYear" placeholder="选择时间" style="width: 100px"> <el-select v-model="box1SelectYear" placeholder="选择时间" style="width: 100px">
<el-option <el-option v-for="(item, index) in box1YearList" :key="index" :label="item.label + '年'"
v-for="(item, index) in box1YearList" :value="item.value" @click="handleGetThinkPolicyIndustry()" />
:key="index"
:label="item.label + '年'"
:value="item.value"
@click="handleGetThinkPolicyIndustry()"
/>
</el-select> </el-select>
</div> </div>
</div> </div>
<div class="box-main"> <div class="box-main">
<div id="box1Chart"></div> <div id="box1Chart"></div>
<div class="source">
<div class="info"><img src="./images/image-exclamation.png"></div>
<div class="text"> 数据来源:美国国会官网,数据时间:2015.1至2025.12</div>
</div>
</div> </div>
</div> </div>
<div class="box1 box"> <div class="box1 box">
...@@ -40,6 +39,10 @@ ...@@ -40,6 +39,10 @@
</div> </div>
<div class="box-main"> <div class="box-main">
<div id="box2Chart"></div> <div id="box2Chart"></div>
<div class="source">
<div class="info"><img src="./images/image-exclamation.png"></div>
<div class="text"> 数据来源:美国国会官网,数据时间:2015.1至2025.12</div>
</div>
</div> </div>
</div> </div>
<!-- <div class="box2 box"> <!-- <div class="box2 box">
...@@ -78,18 +81,17 @@ ...@@ -78,18 +81,17 @@
<!-- <div class="box-header-right">{{ "查看数据源 >" }}</div> --> <!-- <div class="box-header-right">{{ "查看数据源 >" }}</div> -->
<div class="select-box"> <div class="select-box">
<el-select v-model="box3SelectMonths" placeholder="选择时间" style="width: 100px"> <el-select v-model="box3SelectMonths" placeholder="选择时间" style="width: 100px">
<el-option <el-option v-for="item in box3MonthsList" :key="item.value" :label="item.label + '年'" :value="item.value"
v-for="item in box3MonthsList" @click="handleGetThinkPolicyIndustryChange()" />
:key="item.value"
:label="item.label + '年'"
:value="item.value"
@click="handleGetThinkPolicyIndustryChange()"
/>
</el-select> </el-select>
</div> </div>
</div> </div>
<div class="box3-main"> <div class="box3-main">
<div id="box3Chart"></div> <div id="box3Chart"></div>
<div class="source">
<div class="info"><img src="./images/image-exclamation.png"></div>
<div class="text"> 数据来源:美国国会官网,数据时间:2015.1至2025.12</div>
</div>
</div> </div>
</div> </div>
</div> </div>
...@@ -106,14 +108,8 @@ ...@@ -106,14 +108,8 @@
<el-select v-model="selectedYear" placeholder="选择时间" style="width: 120px" @click="handleGetThinkPolicy()"> <el-select v-model="selectedYear" placeholder="选择时间" style="width: 120px" @click="handleGetThinkPolicy()">
<el-option v-for="item in yearList" :key="item.value" :label="item.label" :value="item.value" /> <el-option v-for="item in yearList" :key="item.value" :label="item.label" :value="item.value" />
</el-select> </el-select>
<el-select <el-select class="select-box-sort" v-model="sort" placeholder="倒序" style="width: 120px" :teleported="true"
class="select-box-sort" :placement="'bottom-start'" :popper-options="{
v-model="sort"
placeholder="倒序"
style="width: 120px"
:teleported="true"
:placement="'bottom-start'"
:popper-options="{
modifiers: [ modifiers: [
{ {
name: 'preventOverflow', name: 'preventOverflow',
...@@ -124,8 +120,7 @@ ...@@ -124,8 +120,7 @@
enabled: false enabled: false
} }
] ]
}" }">
>
<template #prefix> <template #prefix>
<img v-if="!sort" src="../thinkDynamics/images/image down.png" class="select-prefix-img" alt="" /> <img v-if="!sort" src="../thinkDynamics/images/image down.png" class="select-prefix-img" alt="" />
<img v-else src="../thinkDynamics/images/image up.png" class="select-prefix-img" alt="" /> <img v-else src="../thinkDynamics/images/image up.png" class="select-prefix-img" alt="" />
...@@ -149,13 +144,8 @@ ...@@ -149,13 +144,8 @@
{{ item }} {{ item }}
</el-checkbox> --> </el-checkbox> -->
<el-checkbox class="filter-checkbox" label="全部领域"></el-checkbox> <el-checkbox class="filter-checkbox" label="全部领域"></el-checkbox>
<el-checkbox <el-checkbox class="filter-checkbox" v-for="research in areaList" :key="research.id"
class="filter-checkbox" v-model="selectedAreaList" :label="research.id">
v-for="research in areaList"
:key="research.id"
v-model="selectedAreaList"
:label="research.id"
>
{{ research.name }} {{ research.name }}
</el-checkbox> </el-checkbox>
</div> </div>
...@@ -173,13 +163,8 @@ ...@@ -173,13 +163,8 @@
{{ item }} {{ item }}
</el-checkbox> --> </el-checkbox> -->
<el-checkbox class="filter-checkbox" label="全部领域"></el-checkbox> <el-checkbox class="filter-checkbox" label="全部领域"></el-checkbox>
<el-checkbox <el-checkbox class="filter-checkbox" v-for="year in selectableYears" :key="year"
class="filter-checkbox" v-model="selectedAreaList" :label="year">
v-for="year in selectableYears"
:key="year"
v-model="selectedAreaList"
:label="year"
>
{{ year }} {{ year }}
</el-checkbox> </el-checkbox>
</div> </div>
...@@ -198,10 +183,7 @@ ...@@ -198,10 +183,7 @@
<div class="info"> <div class="info">
{{ item.times }} · {{ item.name }} {{ item.times }} · {{ item.name }}
<div class="more" @click="toDetail(item)"> <div class="more" @click="toDetail(item)">
<img <img src="@/views/thinkTank/ThinkTankDetail/thinkDynamics/images/image open.png" alt="" />
src="@/views/thinkTank/ThinkTankDetail/thinkDynamics/images/image open.png"
alt=""
/>
</div> </div>
</div> </div>
<div class="tag-box"> <div class="tag-box">
...@@ -231,14 +213,8 @@ ...@@ -231,14 +213,8 @@
<div class="right-footer"> <div class="right-footer">
<div class="info">共{{ total }}条政策建议</div> <div class="info">共{{ total }}条政策建议</div>
<div class="page-box"> <div class="page-box">
<el-pagination <el-pagination :page-size="12" background layout="prev, pager, next" :total="total"
:page-size="12" @current-change="handleCurrentChange" :current-page="currentPage" />
background
layout="prev, pager, next"
:total="total"
@current-change="handleCurrentChange"
:current-page="currentPage"
/>
</div> </div>
</div> </div>
</div> </div>
...@@ -825,26 +801,59 @@ onMounted(() => { ...@@ -825,26 +801,59 @@ onMounted(() => {
.box-main { .box-main {
height: 372px; height: 372px;
width: 520px; width: 520px;
position: relative;
overflow: hidden;
box-sizing: border-box; box-sizing: border-box;
padding: 24px 24px 0; padding: 24px 24px 0;
#box1Chart { #box1Chart {
height: 309px; height: 309px;
width: 446.5px; width: 472px;
} }
#box2Chart { #box2Chart {
height: 309px; height: 309px;
width: 446.5px; width: 472px;
} }
#box3Chart { #box3Chart {
height: 309px; height: 309px;
width: 446.5px; width: 472px;
} }
.source {
margin: 0 auto;
margin-top: 10px;
/* 上下0,左右自动居中 */
width: 370px;
height: 22px;
display: flex;
.info {
width: 16px;
height: 16px;
margin-top: 3px;
img {
width: 100%;
height: 100%;
}
}
.text {
font-family: "Source Han Sans CN";
font-weight: 400;
font-size: 14px;
line-height: 22px;
letter-spacing: 0px;
text-align: left;
color: rgb(132, 136, 142);
margin-left: 8px;
}
}
} }
...@@ -863,6 +872,41 @@ onMounted(() => { ...@@ -863,6 +872,41 @@ onMounted(() => {
height: 300px; height: 300px;
width: 520px; width: 520px;
} }
.source {
margin: 0 auto;
margin-top: 10px;
/* 上下0,左右自动居中 */
width: 370px;
height: 22px;
display: flex;
.info {
width: 16px;
height: 16px;
margin-top: 3px;
img {
width: 100%;
height: 100%;
}
}
.text {
font-family: "Source Han Sans CN";
font-weight: 400;
font-size: 14px;
line-height: 22px;
letter-spacing: 0px;
text-align: left;
color: rgb(132, 136, 142);
margin-left: 8px;
}
}
} }
} }
} }
...@@ -975,6 +1019,7 @@ onMounted(() => { ...@@ -975,6 +1019,7 @@ onMounted(() => {
border-radius: 10px; border-radius: 10px;
box-shadow: 0px 0px 20px 0px rgba(25, 69, 130, 0.1); box-shadow: 0px 0px 20px 0px rgba(25, 69, 130, 0.1);
background: rgba(255, 255, 255, 1); background: rgba(255, 255, 255, 1);
padding-bottom: 24px;
.select-box-science { .select-box-science {
margin-top: 16px; margin-top: 16px;
...@@ -998,12 +1043,13 @@ onMounted(() => { ...@@ -998,12 +1043,13 @@ onMounted(() => {
.checkbox-group { .checkbox-group {
display: grid; display: grid;
grid-template-columns: repeat(2, 1fr); grid-template-columns: repeat(2, 160px);
gap: 8px 4px; gap: 8px 4px;
margin-left: 24px; margin-left: 24px;
.filter-checkbox { .filter-checkbox {
width: 160px; width: 160px;
height: 24px;
margin: 0; margin: 0;
font-family: "Source Han Sans CN", sans-serif; font-family: "Source Han Sans CN", sans-serif;
font-weight: 400; font-weight: 400;
...@@ -1089,8 +1135,8 @@ onMounted(() => { ...@@ -1089,8 +1135,8 @@ onMounted(() => {
} }
.select-box-publish { .select-box-publish {
margin-top: 24px; margin-top: 16px;
margin-bottom: 24px;
.select-box-header { .select-box-header {
display: flex; display: flex;
...@@ -1111,12 +1157,13 @@ onMounted(() => { ...@@ -1111,12 +1157,13 @@ onMounted(() => {
.checkbox-group { .checkbox-group {
display: grid; display: grid;
grid-template-columns: repeat(2, 1fr); grid-template-columns: repeat(2, 160px);
gap: 8px 4px; gap: 8px 4px;
margin-left: 24px; margin-left: 24px;
.filter-checkbox { .filter-checkbox {
width: 160px; width: 160px;
height: 24px;
margin: 0; margin: 0;
font-family: "Source Han Sans CN", sans-serif; font-family: "Source Han Sans CN", sans-serif;
font-weight: 400; font-weight: 400;
......
...@@ -18,7 +18,7 @@ ...@@ -18,7 +18,7 @@
</div> </div>
</div> </div>
<div class="header-top-right"> <div class="header-top-right">
<button class="blue-btn"> <button class="blue-btn" @click="handleOpenThinkTankSite">
<img class="btn-img" src="./images/image1.png" alt="" /> <img class="btn-img" src="./images/image1.png" alt="" />
<span class="text">{{ '查看智库官网' }}</span> <span class="text">{{ '查看智库官网' }}</span>
</button> </button>
...@@ -88,6 +88,16 @@ const handleGetThinkTankSummary = async () => { ...@@ -88,6 +88,16 @@ const handleGetThinkTankSummary = async () => {
} }
}; };
// 查看智库官网
const handleOpenThinkTankSite = () => {
const url = thinkTank.value?.url;
if (!url) {
return;
}
// 简单校验一下,防止空字符串
window.open(url, "_blank");
};
onMounted(async () => { onMounted(async () => {
handleGetThinkTankSummary(); handleGetThinkTankSummary();
}); });
......
...@@ -18,7 +18,7 @@ ...@@ -18,7 +18,7 @@
<div class="select-research-box"> <div class="select-research-box">
<div class="select-box-header"> <div class="select-box-header">
<div class="icon"></div> <div class="icon"></div>
<div class="title">{{ "研究类型" }}</div> <div class="title">{{ "科技领域" }}</div>
</div> </div>
<div class="select-main"> <div class="select-main">
<div class="checkbox-group"> <div class="checkbox-group">
...@@ -271,16 +271,19 @@ const handleToReportDetail = item => { ...@@ -271,16 +271,19 @@ const handleToReportDetail = item => {
}; };
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
/* 统一智库动态国会听证会内所有 el-checkbox 文本为 16px */
:deep(.el-checkbox__label) {
font-size: 16px;
}
.main-content { .main-content {
display: flex; display: flex;
gap: 16px; gap: 16px;
.left { .left {
width: 360px; width: 360px;
height: 874px; height: 100%;
padding-bottom: 36px; padding-bottom: 24px;
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;
...@@ -290,8 +293,8 @@ const handleToReportDetail = item => { ...@@ -290,8 +293,8 @@ const handleToReportDetail = item => {
.select-research-box { .select-research-box {
width: 360px; width: 360px;
height: 284px; height: 100%;
margin-top: 19px; margin-top: 16px;
.select-box-header { .select-box-header {
display: flex; display: flex;
...@@ -309,10 +312,10 @@ const handleToReportDetail = item => { ...@@ -309,10 +312,10 @@ const handleToReportDetail = item => {
.title { .title {
height: 26px; height: 26px;
color: var(--color-main-active); color: var(--color-main-active);
font-family: Microsoft YaHei; font-family: "Source Han Sans CN";
font-size: 20px; font-size: 16px;
font-weight: 700; font-weight: 700;
line-height: 26px; line-height: 24px;
letter-spacing: 1px; letter-spacing: 1px;
text-align: left; text-align: left;
} }
...@@ -325,7 +328,7 @@ const handleToReportDetail = item => { ...@@ -325,7 +328,7 @@ const handleToReportDetail = item => {
.checkbox-group { .checkbox-group {
display: grid; display: grid;
grid-template-columns: repeat(2, 1fr); grid-template-columns: repeat(2, 160px);
gap: 8px 4px; gap: 8px 4px;
.filter-checkbox { .filter-checkbox {
...@@ -343,9 +346,9 @@ const handleToReportDetail = item => { ...@@ -343,9 +346,9 @@ const handleToReportDetail = item => {
} }
.select-time-box { .select-time-box {
margin-top: 44px; margin-top: 16px;
width: 360px; width: 360px;
height: 156px; height: 100%;
.select-box-header { .select-box-header {
margin-bottom: 12px; margin-bottom: 12px;
...@@ -363,10 +366,10 @@ const handleToReportDetail = item => { ...@@ -363,10 +366,10 @@ const handleToReportDetail = item => {
.title { .title {
height: 26px; height: 26px;
color: var(--color-main-active); color: var(--color-main-active);
font-family: Microsoft YaHei; font-family: "Source Han Sans CN";
font-size: 20px; font-size: 16px;
font-weight: 700; font-weight: 700;
line-height: 26px; line-height: 24px;
letter-spacing: 1px; letter-spacing: 1px;
text-align: left; text-align: left;
} }
...@@ -379,7 +382,7 @@ const handleToReportDetail = item => { ...@@ -379,7 +382,7 @@ const handleToReportDetail = item => {
.checkbox-group { .checkbox-group {
display: grid; display: grid;
grid-template-columns: repeat(2, 1fr); grid-template-columns: repeat(2, 160px);
gap: 8px 4px; gap: 8px 4px;
.filter-checkbox { .filter-checkbox {
...@@ -405,8 +408,8 @@ const handleToReportDetail = item => { ...@@ -405,8 +408,8 @@ const handleToReportDetail = item => {
} }
.select-hearing-box { .select-hearing-box {
margin-top: 36px; margin-top: 16px;
width: 360px; width: 100%;
.select-box-header { .select-box-header {
display: flex; display: flex;
...@@ -425,9 +428,9 @@ const handleToReportDetail = item => { ...@@ -425,9 +428,9 @@ const handleToReportDetail = item => {
height: 26px; height: 26px;
color: var(--color-main-active); color: var(--color-main-active);
font-family: Microsoft YaHei; font-family: Microsoft YaHei;
font-size: 20px; font-size: 16px;
font-weight: 700; font-weight: 700;
line-height: 26px; line-height: 24px;
letter-spacing: 1px; letter-spacing: 1px;
text-align: left; text-align: left;
} }
......
...@@ -18,7 +18,7 @@ ...@@ -18,7 +18,7 @@
<div class="select-research-box"> <div class="select-research-box">
<div class="select-box-header"> <div class="select-box-header">
<div class="icon"></div> <div class="icon"></div>
<div class="title">{{ "研究类型" }}</div> <div class="title">{{ "科技领域" }}</div>
</div> </div>
<div class="select-main"> <div class="select-main">
<div class="checkbox-group"> <div class="checkbox-group">
...@@ -183,14 +183,19 @@ const handleToReportDetail = item => { ...@@ -183,14 +183,19 @@ const handleToReportDetail = item => {
}; };
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
/* 统一智库动态调查报告内所有 el-checkbox 文本为 16px */
:deep(.el-checkbox__label) {
font-size: 16px;
}
.main-content { .main-content {
display: flex; display: flex;
gap: 16px; gap: 16px;
.left { .left {
width: 360px; width: 360px;
height: 541px; height: 100%;
padding-bottom: 36px; padding-bottom: 24px;
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;
...@@ -200,8 +205,8 @@ const handleToReportDetail = item => { ...@@ -200,8 +205,8 @@ const handleToReportDetail = item => {
.select-research-box { .select-research-box {
width: 360px; width: 360px;
height: 284px; height: 100%;
margin-top: 19px; margin-top: 16px;
.select-box-header { .select-box-header {
display: flex; display: flex;
...@@ -219,10 +224,10 @@ const handleToReportDetail = item => { ...@@ -219,10 +224,10 @@ const handleToReportDetail = item => {
.title { .title {
height: 26px; height: 26px;
color: var(--color-main-active); color: var(--color-main-active);
font-family: Microsoft YaHei; font-family: "Source Han Sans CN";
font-size: 20px; font-size: 16px;
font-weight: 700; font-weight: 700;
line-height: 26px; line-height: 24px;
letter-spacing: 1px; letter-spacing: 1px;
text-align: left; text-align: left;
} }
...@@ -234,7 +239,7 @@ const handleToReportDetail = item => { ...@@ -234,7 +239,7 @@ const handleToReportDetail = item => {
.checkbox-group { .checkbox-group {
display: grid; display: grid;
grid-template-columns: repeat(2, 1fr); grid-template-columns: repeat(2, 160px);
gap: 8px 4px; gap: 8px 4px;
.filter-checkbox { .filter-checkbox {
...@@ -260,9 +265,9 @@ const handleToReportDetail = item => { ...@@ -260,9 +265,9 @@ const handleToReportDetail = item => {
} }
.select-time-box { .select-time-box {
margin-top: 44px; margin-top: 16px;
width: 360px; width: 360px;
height: 156px; height: 100%;
.select-box-header { .select-box-header {
display: flex; display: flex;
...@@ -280,10 +285,10 @@ const handleToReportDetail = item => { ...@@ -280,10 +285,10 @@ const handleToReportDetail = item => {
.title { .title {
height: 26px; height: 26px;
color: var(--color-main-active); color: var(--color-main-active);
font-family: Microsoft YaHei; font-family: "Source Han Sans CN";
font-size: 20px; font-size: 16px;
font-weight: 700; font-weight: 700;
line-height: 26px; line-height: 24px;
letter-spacing: 1px; letter-spacing: 1px;
text-align: left; text-align: left;
} }
...@@ -295,7 +300,7 @@ const handleToReportDetail = item => { ...@@ -295,7 +300,7 @@ const handleToReportDetail = item => {
.checkbox-group { .checkbox-group {
display: grid; display: grid;
grid-template-columns: repeat(2, 1fr); grid-template-columns: repeat(2, 160px);
gap: 8px 4px; gap: 8px 4px;
.filter-checkbox { .filter-checkbox {
......
...@@ -18,7 +18,7 @@ ...@@ -18,7 +18,7 @@
<div class="select-research-box"> <div class="select-research-box">
<div class="select-box-header"> <div class="select-box-header">
<div class="icon"></div> <div class="icon"></div>
<div class="title">{{ "研究类型" }}</div> <div class="title">{{ "科技领域" }}</div>
</div> </div>
<div class="select-main"> <div class="select-main">
<div class="checkbox-group"> <div class="checkbox-group">
...@@ -183,14 +183,19 @@ const handleToReportDetail = item => { ...@@ -183,14 +183,19 @@ const handleToReportDetail = item => {
}; };
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
/* 统一智库动态智库报告内所有 el-checkbox 文本为 16px */
:deep(.el-checkbox__label) {
font-size: 16px;
}
.main-content { .main-content {
display: flex; display: flex;
gap: 16px; gap: 16px;
.left { .left {
width: 360px; width: 360px;
height: 541px; height: 100%;
padding-bottom: 36px; padding-bottom: 24px;
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;
...@@ -200,8 +205,8 @@ const handleToReportDetail = item => { ...@@ -200,8 +205,8 @@ const handleToReportDetail = item => {
.select-research-box { .select-research-box {
width: 360px; width: 360px;
height: 284px; height: 100%;
margin-top: 19px; margin-top: 16px;
.select-box-header { .select-box-header {
display: flex; display: flex;
...@@ -219,10 +224,10 @@ const handleToReportDetail = item => { ...@@ -219,10 +224,10 @@ const handleToReportDetail = item => {
.title { .title {
height: 26px; height: 26px;
color: var(--color-main-active); color: var(--color-main-active);
font-family: Microsoft YaHei; font-family: "Source Han Sans CN";
font-size: 20px; font-size: 16px;
font-weight: 700; font-weight: 700;
line-height: 26px; line-height: 24px;
letter-spacing: 1px; letter-spacing: 1px;
text-align: left; text-align: left;
} }
...@@ -234,7 +239,7 @@ const handleToReportDetail = item => { ...@@ -234,7 +239,7 @@ const handleToReportDetail = item => {
.checkbox-group { .checkbox-group {
display: grid; display: grid;
grid-template-columns: repeat(2, 1fr); grid-template-columns: repeat(2, 160px);
gap: 8px 4px; gap: 8px 4px;
.filter-checkbox { .filter-checkbox {
...@@ -260,9 +265,9 @@ const handleToReportDetail = item => { ...@@ -260,9 +265,9 @@ const handleToReportDetail = item => {
} }
.select-time-box { .select-time-box {
margin-top: 44px; margin-top: 16px;
width: 360px; width: 360px;
height: 156px; height: 100%;
.select-box-header { .select-box-header {
display: flex; display: flex;
...@@ -280,10 +285,10 @@ const handleToReportDetail = item => { ...@@ -280,10 +285,10 @@ const handleToReportDetail = item => {
.title { .title {
height: 26px; height: 26px;
color: var(--color-main-active); color: var(--color-main-active);
font-family: Microsoft YaHei; font-family: "Source Han Sans CN";
font-size: 20px; font-size: 16px;
font-weight: 700; font-weight: 700;
line-height: 26px; line-height: 24px;
letter-spacing: 1px; letter-spacing: 1px;
text-align: left; text-align: left;
} }
...@@ -295,7 +300,7 @@ const handleToReportDetail = item => { ...@@ -295,7 +300,7 @@ const handleToReportDetail = item => {
.checkbox-group { .checkbox-group {
display: grid; display: grid;
grid-template-columns: repeat(2, 1fr); grid-template-columns: repeat(2, 160px);
gap: 8px 4px; gap: 8px 4px;
.filter-checkbox { .filter-checkbox {
......
...@@ -630,8 +630,9 @@ onMounted(async () => { ...@@ -630,8 +630,9 @@ onMounted(async () => {
<style lang="scss" scoped> <style lang="scss" scoped>
.main-header { .main-header {
height: 64px;
width: 1600px; width: 1600px;
margin-bottom: 16px;
display: flex; display: flex;
align-items: center; align-items: center;
background: rgb(255, 255, 255); background: rgb(255, 255, 255);
......
...@@ -113,6 +113,10 @@ ...@@ -113,6 +113,10 @@
</div> </div>
<div class="box1-main-right" id="box1Chart"></div> <div class="box1-main-right" id="box1Chart"></div>
</div> </div>
<div class="source">
<div class="info"><img src="./images/image-exclamation.png"></div>
<div class="text"> 数据来源:美国国会官网,数据时间:2015.1至2025.12</div>
</div>
</AnalysisBox> </AnalysisBox>
</div> </div>
<div class="box"> <div class="box">
...@@ -211,7 +215,13 @@ ...@@ -211,7 +215,13 @@
</div> --> </div> -->
<AnalysisBox title="核心研究人员"> <AnalysisBox title="核心研究人员">
<div class="box3-main"> <div class="box3-main">
<div class="box3-main-left" id="box3Chart"></div> <div class="box3-main-left">
<div id="box3Chart"></div>
<div class="source">
<div class="info"><img src="./images/image-exclamation.png"></div>
<div class="text"> 数据来源:美国国会官网,数据时间:2015.1至2025.12</div>
</div>
</div>
<div class="box3-main-right"> <div class="box3-main-right">
<div class="box3-right-item" v-for="(item, index) in box3RightData" :key="index"> <div class="box3-right-item" v-for="(item, index) in box3RightData" :key="index">
<div class="icon" @click="handleClickPerson(item)"> <div class="icon" @click="handleClickPerson(item)">
...@@ -250,6 +260,7 @@ import { ...@@ -250,6 +260,7 @@ import {
import { useRouter } from "vue-router"; import { useRouter } from "vue-router";
import DefaultIcon1 from '@/assets/icons/default-icon1.png' import DefaultIcon1 from '@/assets/icons/default-icon1.png'
import { getPersonSummaryInfo } from "@/api/common/index";
const router = useRouter(); const router = useRouter();
import InfoImg from "./images/img.png"; import InfoImg from "./images/img.png";
...@@ -662,18 +673,64 @@ const handleGetThinkPerson = async () => { ...@@ -662,18 +673,64 @@ const handleGetThinkPerson = async () => {
}; };
// 点击人物头像,跳转到人物主页 // 点击人物头像,跳转到人物主页
const handleClickPerson = (item) => {
console.log('item', item); const handleClickPerson = async item => {
window.sessionStorage.setItem("curTabName", item.name) console.log("person", item);
const route = router.resolve({ const personTypeList = JSON.parse(window.sessionStorage.getItem("personTypeList"));
path: "/characterPage", console.log("personTypeList", personTypeList);
query: {
type: 3 // 1 2 3 let type = 0;
let personTypeName = "";
const params = {
personId: item.personId
};
try {
const res = await getPersonSummaryInfo(params);
console.log("人物全局信息", res);
if (res.code === 200 && res.data) {
const arr = personTypeList.filter(t => {
const typeIdNum = Number(t.typeId);
const personTypeNum = Number(res.data.personType);
return !Number.isNaN(typeIdNum) && !Number.isNaN(personTypeNum) && typeIdNum === personTypeNum;
});
console.log("arr", arr);
if (arr && arr.length > 0) {
personTypeName = arr[0].typeName;
console.log("personTypeName", personTypeName);
if (personTypeName === "科技企业领袖") {
type = 1;
} else if (personTypeName === "国会议员") {
type = 2;
} else if (personTypeName === "智库研究人员") {
type = 3;
} else {
personTypeName = "";
ElMessage.warning("找不到当前人员的类型值!");
return;
}
window.sessionStorage.setItem("curTabName", item.name);
const route = router.resolve({
path: "/characterPage",
query: {
type: type, // type=1为科技企业领袖,2为国会议员,3为智库研究人员
personId: item.personId
}
});
window.open(route.href, "_blank");
} else {
personTypeName = "";
ElMessage.warning("找不到当前人员的类型值!");
return;
}
} else {
ElMessage.warning("找不到当前人员的类型值!");
return;
} }
}); } catch (error) { }
window.open(route.href, "_blank");
}; };
onMounted(() => { onMounted(() => {
handleGetThinkTankInfoBasic() handleGetThinkTankInfoBasic()
handleGetThinkTankInfoBranch() handleGetThinkTankInfoBranch()
...@@ -1003,6 +1060,42 @@ onMounted(() => { ...@@ -1003,6 +1060,42 @@ onMounted(() => {
} }
} }
.source {
margin: 0 auto;
margin-top: 10px;
/* 上下0,左右自动居中 */
width: 370px;
height: 22px;
display: flex;
.info {
width: 16px;
height: 16px;
margin-top: 3px;
img {
width: 100%;
height: 100%;
}
}
.text {
font-family: "Source Han Sans CN";
font-weight: 400;
font-size: 14px;
line-height: 22px;
letter-spacing: 0px;
text-align: left;
color: rgb(132, 136, 142);
margin-left: 8px;
}
}
.box2-main { .box2-main {
height: 320px; height: 320px;
display: flex; display: flex;
...@@ -1143,7 +1236,48 @@ onMounted(() => { ...@@ -1143,7 +1236,48 @@ onMounted(() => {
height: 326px; height: 326px;
margin-left: 9px; margin-left: 9px;
box-sizing: border-box; box-sizing: border-box;
padding: 24px 24px 0;
#box3Chart {
width: 536px;
height: 290px;
}
.source {
margin: 0 auto;
margin-top: 10px;
/* 上下0,左右自动居中 */
width: 370px;
height: 22px;
display: flex;
.info {
width: 16px;
height: 16px;
margin-top: 3px;
img {
width: 100%;
height: 100%;
}
}
.text {
font-family: "Source Han Sans CN";
font-weight: 400;
font-size: 14px;
line-height: 22px;
letter-spacing: 0px;
text-align: left;
color: rgb(132, 136, 142);
margin-left: 8px;
}
}
} }
.box3-main-right { .box3-main-right {
...@@ -1221,6 +1355,8 @@ onMounted(() => { ...@@ -1221,6 +1355,8 @@ onMounted(() => {
} }
} }
} }
} }
} }
} }
......
...@@ -8,8 +8,7 @@ ...@@ -8,8 +8,7 @@
</div> </div>
<div class="select-main"> <div class="select-main">
<div class="checkbox-group"> <div class="checkbox-group">
<el-checkbox v-model="checkAllModel" :indeterminate="isIndeterminate" class="all-checkbox" <el-checkbox v-model="checkAllModel" class="all-checkbox" @change="emit('check-all-change', $event)">
@change="emit('check-all-change', $event)">
全部领域 全部领域
</el-checkbox> </el-checkbox>
<el-checkbox v-for="research in areaList" :key="research.id" v-model="selectedAreaListModel" <el-checkbox v-for="research in areaList" :key="research.id" v-model="selectedAreaListModel"
...@@ -27,16 +26,15 @@ ...@@ -27,16 +26,15 @@
</div> </div>
<div class="select-main"> <div class="select-main">
<div class="checkbox-group"> <div class="checkbox-group">
<el-checkbox v-model="checkAllTimeModel" class="all-checkbox" :indeterminate="isIndeterminateTime" <el-checkbox v-model="checkAllTimeModel" class="all-checkbox"
@change="emit('check-all-time-change', $event)"> @change="emit('check-all-time-change', $event)">
全部时间 全部时间
</el-checkbox> </el-checkbox>
<el-checkbox-group v-model="selectedPubTimeListModel"> <el-checkbox v-for="time in pubTimeList" :key="time.id" v-model="selectedPubTimeListModel" :label="time.id"
<el-checkbox v-for="time in pubTimeList" :key="time.id" :label="time.id" class="filter-checkbox" class="filter-checkbox" @change="emit('checked-area-time-change')">
@change="emit('checked-area-time-change')"> {{ time.name }}
{{ time.name }} </el-checkbox>
</el-checkbox>
</el-checkbox-group>
</div> </div>
</div> </div>
</div> </div>
...@@ -133,7 +131,7 @@ const selectedPubTimeListModel = computed({ ...@@ -133,7 +131,7 @@ const selectedPubTimeListModel = computed({
.left { .left {
width: 360px; width: 360px;
height: 100%; height: 100%;
padding-bottom: 36px; padding-bottom: 24px;
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;
...@@ -142,7 +140,7 @@ const selectedPubTimeListModel = computed({ ...@@ -142,7 +140,7 @@ const selectedPubTimeListModel = computed({
position: relative; position: relative;
.select-box { .select-box {
margin-top: 21px; margin-top: 16px;
.header { .header {
display: flex; display: flex;
...@@ -159,7 +157,7 @@ const selectedPubTimeListModel = computed({ ...@@ -159,7 +157,7 @@ const selectedPubTimeListModel = computed({
.title { .title {
height: 24px; height: 24px;
color: var(--color-main-active); color: var(--color-main-active);
font-family: Microsoft YaHei; font-family: "Source Han Sans CN";
font-size: 16px; font-size: 16px;
font-weight: 700; font-weight: 700;
line-height: 24px; line-height: 24px;
...@@ -169,11 +167,43 @@ const selectedPubTimeListModel = computed({ ...@@ -169,11 +167,43 @@ const selectedPubTimeListModel = computed({
} }
.select-main { .select-main {
margin-left: 25px; margin-left: 24px;
margin-top: 12px;
.checkbox-group {
display: grid;
grid-template-columns: repeat(2, 160px);
gap: 8px 4px;
.all-checkbox {
width: 160px;
height: 24px;
margin: 0;
}
.filter-checkbox {
width: 160px;
height: 24px;
margin-right: 0 !important;
}
}
} }
.select-main1 { .select-main1 {
width: 100px; width: 100px;
.checkbox-group {
display: grid;
grid-template-columns: repeat(2, 160px);
gap: 8px 4px;
.filter-checkbox {
width: 160px;
height: 24px;
margin-right: 0 !important;
}
}
} }
} }
} }
...@@ -268,11 +298,11 @@ const selectedPubTimeListModel = computed({ ...@@ -268,11 +298,11 @@ const selectedPubTimeListModel = computed({
} }
} }
.all-checkbox {
width: 220px;
}
.filter-checkbox { .filter-checkbox {
width: 105px; width: 160px;
height: 24px;
margin: 0;
} }
</style> </style>
...@@ -9,8 +9,7 @@ ...@@ -9,8 +9,7 @@
</div> </div>
<div class="select-main"> <div class="select-main">
<div class="checkbox-group"> <div class="checkbox-group">
<el-checkbox v-model="checkAllModel" :indeterminate="isIndeterminate" class="all-checkbox" <el-checkbox v-model="checkAllModel" class="all-checkbox" @change="emit('check-all-change', $event)">
@change="emit('check-all-change', $event)">
全部领域 全部领域
</el-checkbox> </el-checkbox>
<el-checkbox v-for="research in areaList" :key="research.id" v-model="selectedAreaListModel" <el-checkbox v-for="research in areaList" :key="research.id" v-model="selectedAreaListModel"
...@@ -28,16 +27,14 @@ ...@@ -28,16 +27,14 @@
</div> </div>
<div class="select-main"> <div class="select-main">
<div class="checkbox-group"> <div class="checkbox-group">
<el-checkbox v-model="checkAllTimeModel" class="all-checkbox" :indeterminate="isIndeterminateTime" <el-checkbox v-model="checkAllTimeModel" class="all-checkbox"
@change="emit('check-all-time-change', $event)"> @change="emit('check-all-time-change', $event)">
全部时间 全部时间
</el-checkbox> </el-checkbox>
<el-checkbox-group v-model="selectedPubTimeListModel"> <el-checkbox v-model="selectedPubTimeListModel" v-for="time in pubTimeList" :key="time.id" :label="time.id"
<el-checkbox v-for="time in pubTimeList" :key="time.id" :label="time.id" class="filter-checkbox" class="filter-checkbox" @change="emit('checked-area-time-change')">
@change="emit('checked-area-time-change')"> {{ time.name }}
{{ time.name }} </el-checkbox>
</el-checkbox>
</el-checkbox-group>
</div> </div>
</div> </div>
</div> </div>
...@@ -60,7 +57,7 @@ ...@@ -60,7 +57,7 @@
</div> </div>
</div> </div>
<div class="right-footer"> <div class="right-footer">
<div class="info">{{ total }}调查项目</div> <div class="info">{{ total }}智库报告</div>
<div class="page-box"> <div class="page-box">
<el-pagination :page-size="12" background layout="prev, pager, next" :total="total" <el-pagination :page-size="12" background layout="prev, pager, next" :total="total"
@current-change="emit('page-change', $event)" :current-page="currentPage" /> @current-change="emit('page-change', $event)" :current-page="currentPage" />
...@@ -135,7 +132,7 @@ const selectedPubTimeListModel = computed({ ...@@ -135,7 +132,7 @@ const selectedPubTimeListModel = computed({
.left { .left {
width: 360px; width: 360px;
height: 100%; height: 100%;
padding-bottom: 36px; padding-bottom: 24px;
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;
...@@ -144,7 +141,7 @@ const selectedPubTimeListModel = computed({ ...@@ -144,7 +141,7 @@ const selectedPubTimeListModel = computed({
position: relative; position: relative;
.select-box { .select-box {
margin-top: 21px; margin-top: 16px;
.header { .header {
display: flex; display: flex;
...@@ -161,7 +158,7 @@ const selectedPubTimeListModel = computed({ ...@@ -161,7 +158,7 @@ const selectedPubTimeListModel = computed({
.title { .title {
height: 24px; height: 24px;
color: var(--color-main-active); color: var(--color-main-active);
font-family: Microsoft YaHei; font-family: "Source Han Sans CN";
font-size: 16px; font-size: 16px;
font-weight: 700; font-weight: 700;
line-height: 24px; line-height: 24px;
...@@ -171,7 +168,14 @@ const selectedPubTimeListModel = computed({ ...@@ -171,7 +168,14 @@ const selectedPubTimeListModel = computed({
} }
.select-main { .select-main {
margin-left: 25px; margin-left: 24px;
margin-top: 12px;
.checkbox-group {
display: grid;
grid-template-columns: repeat(2, 160px);
gap: 8px 4px;
}
} }
.select-main1 { .select-main1 {
...@@ -265,10 +269,14 @@ const selectedPubTimeListModel = computed({ ...@@ -265,10 +269,14 @@ const selectedPubTimeListModel = computed({
} }
.all-checkbox { .all-checkbox {
width: 220px; width: 160px;
height: 24px;
margin: 0;
} }
.filter-checkbox { .filter-checkbox {
width: 105px; width: 160px;
height: 24px;
margin: 0;
} }
</style> </style>
...@@ -4,7 +4,7 @@ ...@@ -4,7 +4,7 @@
<div class="select-research-box"> <div class="select-research-box">
<div class="select-box-header"> <div class="select-box-header">
<div class="icon"></div> <div class="icon"></div>
<div class="title">{{ "研究类型" }}</div> <div class="title">{{ "科技领域" }}</div>
</div> </div>
<div class="select-main"> <div class="select-main">
<div class="checkbox-group"> <div class="checkbox-group">
...@@ -75,7 +75,10 @@ ...@@ -75,7 +75,10 @@
<img src="../ThinkTankDetail/thinkDynamics/images/image open.png" alt="open icon" <img src="../ThinkTankDetail/thinkDynamics/images/image open.png" alt="open icon"
class="card-open-image" /> class="card-open-image" />
</div> </div>
<div class="card-item-category"> {{ item.category }}</div> <div class="card-item-category">
<AreaTag :key="index" :tagName="item.category">
</AreaTag>
</div>
</div> </div>
</div> </div>
<div class="divider" v-if="index !== displayList.length - 1"></div> <div class="divider" v-if="index !== displayList.length - 1"></div>
...@@ -118,6 +121,15 @@ const hearingData = ref([ ...@@ -118,6 +121,15 @@ const hearingData = ref([
{ id: 1, title: "美国国会听证会:人工智能与国家安全", content: "美中经济与安全审查委员会", category: "人工智能", time: "2025年7月8日" }, { id: 1, title: "美国国会听证会:人工智能与国家安全", content: "美中经济与安全审查委员会", category: "人工智能", time: "2025年7月8日" },
{ id: 2, title: "美国国会听证会:先进制造供应链韧性", content: "国会-行政部门中国委员会", category: "先进制造", time: "2025年6月15日" }, { id: 2, title: "美国国会听证会:先进制造供应链韧性", content: "国会-行政部门中国委员会", category: "先进制造", time: "2025年6月15日" },
{ id: 3, title: "美国国会听证会:半导体出口管制与产业政策", content: "美国商务部", category: "半导体", time: "2025年5月22日" }, { id: 3, title: "美国国会听证会:半导体出口管制与产业政策", content: "美国商务部", category: "半导体", time: "2025年5月22日" },
{ id: 4, title: "美国国会听证会:人工智能与国家安全", content: "美中经济与安全审查委员会", category: "人工智能", time: "2025年7月8日" },
{ id: 5, title: "美国国会听证会:先进制造供应链韧性", content: "国会-行政部门中国委员会", category: "先进制造", time: "2025年6月15日" },
{ id: 6, title: "美国国会听证会:半导体出口管制与产业政策", content: "美国商务部", category: "半导体", time: "2025年5月22日" },
{ id: 7, title: "美国国会听证会:人工智能与国家安全", content: "美中经济与安全审查委员会", category: "人工智能", time: "2025年7月8日" },
{ id: 8, title: "美国国会听证会:先进制造供应链韧性", content: "国会-行政部门中国委员会", category: "先进制造", time: "2025年6月15日" },
{ id: 9, title: "美国国会听证会:半导体出口管制与产业政策", content: "美国商务部", category: "半导体", time: "2025年5月22日" },
{ id: 10, title: "美国国会听证会:人工智能与国家安全", content: "美中经济与安全审查委员会", category: "人工智能", time: "2025年7月8日" },
{ id: 11, title: "美国国会听证会:先进制造供应链韧性", content: "国会-行政部门中国委员会", category: "先进制造", time: "2025年6月15日" },
{ id: 12, title: "美国国会听证会:半导体出口管制与产业政策", content: "美国商务部", category: "半导体", time: "2025年5月22日" },
]); ]);
const researchHearingList = ref([ const researchHearingList = ref([
...@@ -187,6 +199,11 @@ const handlePageChange = page => { ...@@ -187,6 +199,11 @@ const handlePageChange = page => {
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
/* 统一资源库国会听证会内所有 el-checkbox 文本为 16px */
:deep(.el-checkbox__label) {
font-size: 16px;
}
/* 外层对齐智库报告资源库布局 */ /* 外层对齐智库报告资源库布局 */
.home-main-footer-main { .home-main-footer-main {
margin: 0 auto; margin: 0 auto;
...@@ -198,8 +215,8 @@ const handlePageChange = page => { ...@@ -198,8 +215,8 @@ const handlePageChange = page => {
.left { .left {
width: 360px; width: 360px;
height: 874px; height: 100%;
padding-bottom: 36px; padding-bottom: 24px;
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;
...@@ -211,7 +228,7 @@ const handlePageChange = page => { ...@@ -211,7 +228,7 @@ const handlePageChange = page => {
.select-box-header { .select-box-header {
display: flex; display: flex;
gap: 17px; gap: 17px;
margin-bottom: 12px;
.icon { .icon {
margin-top: 4px; margin-top: 4px;
...@@ -222,12 +239,12 @@ const handlePageChange = page => { ...@@ -222,12 +239,12 @@ const handlePageChange = page => {
} }
.title { .title {
height: 26px; height: 24px;
color: var(--color-main-active); color: var(--color-main-active);
font-family: Microsoft YaHei; font-family: "Source Han Sans CN";
font-size: 20px; font-size: 16px;
font-weight: 700; font-weight: 700;
line-height: 26px; line-height: 24px;
letter-spacing: 1px; letter-spacing: 1px;
text-align: left; text-align: left;
} }
...@@ -236,26 +253,27 @@ const handlePageChange = page => { ...@@ -236,26 +253,27 @@ const handlePageChange = page => {
.select-research-box { .select-research-box {
width: 360px; width: 360px;
height: 284px; height: 284px;
margin-top: 19px; margin-top: 16px;
} }
.select-time-box { .select-time-box {
margin-top: 44px; margin-top: 16px;
width: 360px; width: 360px;
height: 156px;
} }
.select-hearing-box { .select-hearing-box {
margin-top: 36px; margin-top: 16px;
width: 360px; width: 360px;
} }
.select-main { .select-main {
margin-left: 24px; margin-left: 24px;
margin-top: 12px;
.checkbox-group { .checkbox-group {
display: grid; display: grid;
grid-template-columns: repeat(2, 1fr); grid-template-columns: repeat(2, 160px);
gap: 8px 4px; gap: 8px 4px;
.filter-checkbox { .filter-checkbox {
...@@ -266,7 +284,7 @@ const handlePageChange = page => { ...@@ -266,7 +284,7 @@ const handlePageChange = page => {
} }
.hearing-grid { .hearing-grid {
grid-template-columns: 1fr; grid-template-columns: 160px;
width: 259px; width: 259px;
gap: 4px; gap: 4px;
} }
...@@ -278,13 +296,14 @@ const handlePageChange = page => { ...@@ -278,13 +296,14 @@ const handlePageChange = page => {
.card-box { .card-box {
width: 100%; width: 100%;
height: 1248px; height: 1134px;
display: flex; display: flex;
background: rgba(255, 255, 255, 1); background: rgba(255, 255, 255, 1);
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;
box-shadow: 0px 0px 20px 0px rgba(94, 95, 95, 0.1); box-shadow: 0px 0px 20px 0px rgba(94, 95, 95, 0.1);
padding-right: 36px;
.card-content { .card-content {
width: 1211px; width: 1211px;
...@@ -360,18 +379,10 @@ const handlePageChange = page => { ...@@ -360,18 +379,10 @@ const handlePageChange = page => {
} }
.card-item-category { .card-item-category {
padding: 1px 8px; gap: 8px;
box-sizing: border-box; height: 24px;
border: 1px solid rgb(231, 243, 255); display: flex;
border-radius: 4px;
display: inline-flex;
background-color: rgb(247, 248, 249);
color: rgba(132, 136, 142, 1);
font-family: Microsoft YaHei;
font-size: 14px;
font-weight: 400;
line-height: 20px;
width: fit-content;
} }
} }
} }
......
...@@ -41,27 +41,50 @@ ...@@ -41,27 +41,50 @@
</div> </div>
<div class="right"> <div class="right">
<div class="right-main"> <div class="card-box">
<div class="right-main-item" v-for="(item, index) in list" :key="index" @click="emit('item-click', item)"> <div class="card-content">
<div class="item-left"> <div v-for="(item, index) in list" :key="item.id ?? index">
<img :src="item.coverImage" alt="" /> <div class="card-item" @click="emit('item-click', item)">
</div> <div class="card-item-img">
<div class="item-right"> <img :src="item.imageUrl" alt="" />
<div class="title">{{ item.content }}</div> </div>
<div class="info"> <div class="card-item-text">
<span class="info-text">{{ item.date }} · {{ item.title }}</span> <div class="card-item-title">{{ item.name }}</div>
<div class="more"> <div class="card-item-time">
<img src="@/views/thinkTank/ThinkTankDetail/thinkDynamics/images/image open.png" alt="" /> <span class="info-text">{{ item.times }} · {{ item.thinkTankName }} · {{ item.reportName }}</span>
<div class="card-open-image">
<img src="@/views/thinkTank/ThinkTankDetail/thinkDynamics/images/image open.png" alt="" />
</div>
</div>
<div class="card-item-category" v-if="item.tagList && item.tagList.length">
<AreaTag v-for="d in item.tagList" :key="d" :tagName="d" />
</div>
<div class="file-box">
<div class="file">
<div class="type">法案</div>
<div class="title">{{ item.billInfoList[0].name }}</div>
<div class="more">
<img src="../assets/images/image-right.png" alt="" />
</div>
</div>
<div class="file">
<div class="type">政令</div>
<div class="title">{{ item.billInfoList[0].name }}</div>
<div class="more">
<img src="../assets/images/image-right.png" alt="" />
</div>
</div>
</div>
</div> </div>
</div> </div>
<div class="tag-box" v-if="item.domains && item.domains.length"> <div class="divider" v-if="index !== list.length - 1"></div>
<AreaTag v-for="d in item.domains" :key="d" :tagName="d" />
</div>
</div> </div>
</div> </div>
</div> </div>
<div class="right-footer"> <div class="right-footer">
<div class="info">{{ total }}条政策建议</div> <div class="info">{{ total }}篇智库报告</div>
<div class="page-box"> <div class="page-box">
<el-pagination :page-size="pageSize" background layout="prev, pager, next" :total="total" <el-pagination :page-size="pageSize" background layout="prev, pager, next" :total="total"
@current-change="p => emit('page-change', p)" :current-page="currentPage" /> @current-change="p => emit('page-change', p)" :current-page="currentPage" />
...@@ -123,14 +146,63 @@ const emitChange = () => { ...@@ -123,14 +146,63 @@ const emitChange = () => {
.left { .left {
width: 360px; width: 360px;
height: 100%; height: 100%;
padding-bottom: 36px; padding-bottom: 24px;
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;
box-shadow: 0px 0px 20px 0px rgba(25, 69, 130, 0.1); box-shadow: 0px 0px 20px 0px rgba(25, 69, 130, 0.1);
background: rgba(255, 255, 255, 1); background: rgba(255, 255, 255, 1);
.select-box-science, .select-box-science {
margin-top: 16px;
.select-box-header {
display: flex;
.icon {
margin-top: 4px;
width: 8px;
height: 16px;
background: var(--color-main-active);
border-radius: 0 4px 4px 0;
}
.title {
margin-left: 17px;
font-family: "Source Han Sans CN";
font-weight: 700;
font-size: 16px;
line-height: 24px;
letter-spacing: 1px;
text-align: left;
color: rgba(5, 95, 194, 1);
}
}
.select-main {
margin-top: 12px;
}
.checkbox-group {
display: grid;
grid-template-columns: repeat(2, 160px);
gap: 8px 4px;
margin-left: 24px;
.filter-checkbox {
width: 160px;
margin: 0;
height: 24px;
font-family: "Source Han Sans CN", sans-serif;
font-weight: 400;
font-size: 16px;
line-height: 24px;
letter-spacing: 0px;
text-align: justify;
}
}
}
.select-box-publish { .select-box-publish {
margin-top: 16px; margin-top: 16px;
...@@ -163,13 +235,14 @@ const emitChange = () => { ...@@ -163,13 +235,14 @@ const emitChange = () => {
.checkbox-group { .checkbox-group {
display: grid; display: grid;
grid-template-columns: repeat(2, 1fr); grid-template-columns: repeat(2, 160px);
gap: 8px 4px; gap: 8px 4px;
margin-left: 24px; margin-left: 24px;
.filter-checkbox { .filter-checkbox {
width: 160px; width: 160px;
margin: 0; margin: 0;
height: 24px;
font-family: "Source Han Sans CN", sans-serif; font-family: "Source Han Sans CN", sans-serif;
font-weight: 400; font-weight: 400;
font-size: 16px; font-size: 16px;
...@@ -183,115 +256,198 @@ const emitChange = () => { ...@@ -183,115 +256,198 @@ const emitChange = () => {
.right { .right {
width: 1224px; width: 1224px;
height: 1200px; height: 1377px;
margin-bottom: 20px;
box-sizing: border-box;
border: 1px solid rgba(234, 236, 238, 1);
border-radius: 10px;
box-shadow: 0px 0px 20px 0px rgba(25, 69, 130, 0.1);
background: rgba(255, 255, 255, 1);
.right-main { .card-box {
height: 1100px;
margin-top: 17px;
margin-left: 0;
width: 100%; width: 100%;
height: 1134px;
display: flex;
background: rgba(255, 255, 255, 1);
box-sizing: border-box; box-sizing: border-box;
padding-left: 37px; border: 1px solid rgba(234, 236, 238, 1);
padding-right: 0; border-radius: 10px;
box-shadow: 0px 0px 20px 0px rgba(94, 95, 95, 0.1);
padding-right: 36px;
.right-main-item {
box-sizing: border-box; .card-content {
padding-top: 16px; width: 1211px;
padding-bottom: 16px; height: 1067px;
margin-left: -37px; margin-top: 33px;
padding-left: 37px; margin-left: 37px;
padding-right: 36px; }
width: calc(100% + 37px - 36px); }
border-bottom: 1px solid rgba(234, 236, 238, 1);
.card-item {
width: 100%;
height: 100%;
display: flex;
.card-item-img {
width: 56px;
height: 77px;
margin-right: 22px;
flex-shrink: 0;
img {
width: 100%;
height: 100%;
}
}
.card-item-text {
flex: 1;
min-width: 0;
display: flex; display: flex;
align-items: center; flex-direction: column;
cursor: pointer; gap: 7px;
.item-left { .card-item-title {
width: 112px; color: rgb(59, 65, 75);
height: 76px; font-family: "Source Han Sans CN";
margin-right: 22px; font-size: 18px;
flex-shrink: 0; font-weight: 700;
line-height: 22px;
img {
width: 100%; display: inline-flex;
height: 100%;
}
} }
.item-right { .card-item-time {
flex: 1; color: rgb(95, 101, 108);
min-width: 0; font-family: "Source Han Sans CN";
display: flex; font-size: 14px;
flex-direction: column; font-weight: 400;
line-height: 22px;
.title { text-align: left;
color: rgba(59, 65, 75, 1); display: inline-flex;
font-family: "Source Han Sans CN";
font-size: 18px; .card-open-image {
font-weight: 700; width: 16px;
line-height: 24px; height: 16px;
letter-spacing: 0px; margin-left: 9px;
text-align: left; margin-top: 3px;
overflow: hidden;
text-overflow: ellipsis; img {
white-space: nowrap; width: 100%;
height: 100%;
}
} }
.info {
margin-top: 7px; }
color: rgba(95, 101, 108, 1);
}
.card-item-category {
gap: 8px;
height: 24px;
display: flex;
overflow: hidden;
white-space: nowrap;
}
.tag-box {
display: flex;
gap: 8px;
.tag {
height: 22px;
padding: 0 8px;
box-sizing: border-box;
border: 1px solid rgba(230, 231, 232, 1);
border-radius: 4px;
background: rgba(247, 248, 249, 1);
color: rgba(95, 101, 108, 1);
font-family: Microsoft YaHei;
font-size: 14px;
font-weight: 400;
line-height: 20px;
}
}
.file-box {
display: flex;
gap: 8px;
.file {
height: 32px;
display: flex;
justify-content: center;
align-items: center;
gap: 12px;
border-radius: 4px;
background: rgba(246, 250, 255, 1);
padding-left: 8px;
padding-right: 8px;
.type {
height: 22px;
padding: 0 4px;
border-radius: 4px;
background: rgba(231, 243, 255, 1);
color: rgba(5, 95, 194, 1);
font-family: "Source Han Sans CN"; font-family: "Source Han Sans CN";
font-size: 14px; font-size: 14px;
font-weight: 400; font-weight: 400;
line-height: 22px; line-height: 22px;
display: flex;
align-items: center;
.info-text { }
flex: 1;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.more { .title {
flex-shrink: 0; color: rgba(5, 95, 194, 1);
font-family: "Source Han Sans CN";
font-size: 16px;
font-weight: 400;
line-height: 24px;
img {
width: 16px;
height: 16px;
display: block;
margin-left: 9px;
margin-top: 3px;
}
}
} }
.tag-box { .more {
margin-top: 6px; width: 20px;
height: 20px;
display: flex; display: flex;
flex-wrap: wrap; margin-top: 2px;
gap: 8px;
.img {
width: 100%;
height: 100%;
}
} }
} }
} }
} }
.right-footer { .right-footer {
margin-top: 24px; margin-top: 43px;
padding: 0 37px 24px 37px;
display: flex; display: flex;
justify-content: space-between; justify-content: space-between;
align-items: center;
.info {
height: 19px;
color: rgba(132, 136, 142, 1);
font-family: Microsoft YaHei;
font-size: 14px;
font-weight: 400;
line-height: 18px;
letter-spacing: 0px;
text-align: left;
}
} }
} }
} }
.divider {
height: 1px;
background: rgb(234, 236, 238);
margin: 16px 0;
}
</style> </style>
...@@ -169,7 +169,13 @@ ...@@ -169,7 +169,13 @@
</el-select> </el-select>
</div> </div>
</div> </div>
<div class="box5-main" id="box5Chart"></div> <div class="box5-main">
<div id="box5Chart"></div>
<div class="source">
<div class="info"><img src="./assets/images/image-exclamation.png"></div>
<div class="text"> 数据来源:美国国会官网,数据时间:2015.1至2025.12</div>
</div>
</div>
</div> </div>
<div class="box6"> <div class="box6">
<div class="box6-header"> <div class="box6-header">
...@@ -184,7 +190,13 @@ ...@@ -184,7 +190,13 @@
</el-select> </el-select>
</div> </div>
</div> </div>
<div class="box6-main" id="box6Chart"></div> <div class="box6-main">
<div id="box6Chart"></div>
<div class="source">
<div class="info"><img src="./assets/images/image-exclamation.png"></div>
<div class="text"> 数据来源:美国国会官网,数据时间:2015.1至2025.12</div>
</div>
</div>
</div> </div>
</div> </div>
<div class="center-footer1"> <div class="center-footer1">
...@@ -291,8 +303,8 @@ ...@@ -291,8 +303,8 @@
<ThinkTankPolicyAdviceOverview v-else :key="`policy-${resourceTabResetKey}`" :research-type-list="areaList" <ThinkTankPolicyAdviceOverview v-else :key="`policy-${resourceTabResetKey}`" :research-type-list="areaList"
:research-time-list="pubTimeList" :list="policyFooterList" :total="policyTotal" :research-time-list="pubTimeList" :list="policyFooterList" :total="policyTotal"
:current-page="policyCurrentPage" :page-size="3" @filter-change="handlePolicyFilterChange" :current-page="policyCurrentPage" :page-size="7" @filter-change="handlePolicyFilterChange"
@page-change="handlePolicyCurrentChange" @item-click="handleToReportDetail" /> @page-change="handlePolicyCurrentChange" />
</div> </div>
</div> </div>
</div> </div>
...@@ -300,9 +312,9 @@ ...@@ -300,9 +312,9 @@
</template> </template>
<script setup> <script setup>
import RiskSignal from "@/components/base/RiskSignal/index.vue"; import RiskSignal from "@/components/base/riskSignal/index.vue";
import NewsList from "@/components/base/NewsList/index.vue"; import NewsList from "@/components/base/newsList/index.vue";
import MessageBubble from "@/components/base/messageBubble/index.vue" import MessageBubble from "@/components/base/MessageBubble/index.vue"
import { onMounted, ref, computed, reactive, nextTick } from "vue"; import { onMounted, ref, computed, reactive, nextTick } from "vue";
import scrollToTop from "@/utils/scrollToTop"; import scrollToTop from "@/utils/scrollToTop";
import router from "@/router"; import router from "@/router";
...@@ -688,7 +700,8 @@ const handleGetThinkTankReportRemarks = async () => { ...@@ -688,7 +700,8 @@ const handleGetThinkTankReportRemarks = async () => {
const res = await getThinkTankReportRemarks(); const res = await getThinkTankReportRemarks();
console.log("智库人物动态", res); console.log("智库人物动态", res);
if (res.code === 200 && res.data) { if (res.code === 200 && res.data) {
messageList.value = res.data; // 只展示后端返回的前三条
messageList.value = (res.data || []).slice(0, 3);
messageList.value.forEach(item => { messageList.value.forEach(item => {
item.time = item.time.replace("T", " "); item.time = item.time.replace("T", " ");
}); });
...@@ -1489,6 +1502,40 @@ const handlePolicyCurrentChange = page => { ...@@ -1489,6 +1502,40 @@ const handlePolicyCurrentChange = page => {
}; };
const handleGetThinkTankPolicyAdvice = async () => { const handleGetThinkTankPolicyAdvice = async () => {
const mockPolicyAdviceList = () => ([
{
id: 23702,
content: "研究未来AI数据中心电力需求与供应",
imageUrl: "https://www.rand.org/content/rand/pubs/research_reports/RRA3572-1/jcr:content/par/teaser.crop.1200x900.cm.jpeg/1738160125961.jpeg",
name: "指数级增长下AI的电力需求:外推AI数据中心的电力需求并评估其对美国竞争力的潜在影响",
reportId: "Rand_RRA3572-1",
tagList: ["新能源", "人工智能"],
thinkTankName: null,
times: "2025-12-28"
},
{ id: 23703, content: "构建可信任的AI治理框架:监管与创新的平衡", imageUrl: "https://www.rand.org/content/rand/pubs/research_reports/RRA3572-1/jcr:content/par/teaser.crop.1200x900.cm.jpeg/1738160125961.jpeg", name: "AI治理路线图:从风险评估到合规落地的实践建议", reportId: "Rand_RRA3572-2", tagList: ["人工智能", "网络安全"], thinkTankName: null, times: "2025-12-21" },
{ id: 23704, content: "先进制造供应链韧性评估与关键节点识别", imageUrl: "https://www.rand.org/content/rand/pubs/research_reports/RRA3572-1/jcr:content/par/teaser.crop.1200x900.cm.jpeg/1738160125961.jpeg", name: "供应链韧性:关键材料、关键设备与关键人才的系统性策略", reportId: "Rand_RRA3572-3", tagList: ["先进制造", "新材料"], thinkTankName: null, times: "2025-12-14" },
{ id: 23705, content: "半导体出口管制对产业生态的中长期影响", imageUrl: "https://www.rand.org/content/rand/pubs/research_reports/RRA3572-1/jcr:content/par/teaser.crop.1200x900.cm.jpeg/1738160125961.jpeg", name: "出口管制与产业政策:如何降低对关键环节的外部依赖", reportId: "Rand_RRA3572-4", tagList: ["集成电路", "先进制造"], thinkTankName: null, times: "2025-12-07" },
{ id: 23706, content: "量子信息技术发展态势与应用落地路径", imageUrl: "https://www.rand.org/content/rand/pubs/research_reports/RRA3572-1/jcr:content/par/teaser.crop.1200x900.cm.jpeg/1738160125961.jpeg", name: "量子科技:从基础研究到产业化的阶段性里程碑", reportId: "Rand_RRA3572-5", tagList: ["量子科技", "前沿基础"], thinkTankName: null, times: "2025-11-30" },
{ id: 23707, content: "网络安全威胁图谱:关键基础设施的攻击面", imageUrl: "https://www.rand.org/content/rand/pubs/research_reports/RRA3572-1/jcr:content/par/teaser.crop.1200x900.cm.jpeg/1738160125961.jpeg", name: "关键基础设施安全:供应链、身份与数据的三重防护", reportId: "Rand_RRA3572-6", tagList: ["网络安全", "数据安全"], thinkTankName: null, times: "2025-11-23" },
{ id: 23708, content: "生物技术与医疗创新的监管协同机制", imageUrl: "https://www.rand.org/content/rand/pubs/research_reports/RRA3572-1/jcr:content/par/teaser.crop.1200x900.cm.jpeg/1738160125961.jpeg", name: "生物科技创新:试验、审批与产业化的全流程政策工具箱", reportId: "Rand_RRA3572-7", tagList: ["生物科技", "医疗健康"], thinkTankName: null, times: "2025-11-16" },
{ id: 23709, content: "清洁能源转型下的电网规划与储能配置", imageUrl: "https://www.rand.org/content/rand/pubs/research_reports/RRA3572-1/jcr:content/par/teaser.crop.1200x900.cm.jpeg/1738160125961.jpeg", name: "能源系统转型:电网升级、储能布局与成本测算", reportId: "Rand_RRA3572-8", tagList: ["新能源", "储能"], thinkTankName: null, times: "2025-11-09" },
{ id: 23710, content: "新材料在国防与先进制造中的应用瓶颈", imageUrl: "https://www.rand.org/content/rand/pubs/research_reports/RRA3572-1/jcr:content/par/teaser.crop.1200x900.cm.jpeg/1738160125961.jpeg", name: "关键新材料:验证体系、规模化与供应链安全", reportId: "Rand_RRA3572-9", tagList: ["新材料", "先进制造"], thinkTankName: null, times: "2025-11-02" },
{ id: 23711, content: "通信网络演进:6G 与卫星互联网的融合", imageUrl: "https://www.rand.org/content/rand/pubs/research_reports/RRA3572-1/jcr:content/par/teaser.crop.1200x900.cm.jpeg/1738160125961.jpeg", name: "下一代通信:频谱、标准与产业联盟策略", reportId: "Rand_RRA3572-10", tagList: ["通信网络", "卫星互联网"], thinkTankName: null, times: "2025-10-26" },
{ id: 23712, content: "数据要素市场建设与跨境数据合规路径", imageUrl: "https://www.rand.org/content/rand/pubs/research_reports/RRA3572-1/jcr:content/par/teaser.crop.1200x900.cm.jpeg/1738160125961.jpeg", name: "数据治理与合规:分类分级、出境评估与执法协同", reportId: "Rand_RRA3572-11", tagList: ["数据安全", "数字治理"], thinkTankName: null, times: "2025-10-19" },
{ id: 23713, content: "AI 研发人才供需缺口与教育体系对接", imageUrl: "https://www.rand.org/content/rand/pubs/research_reports/RRA3572-1/jcr:content/par/teaser.crop.1200x900.cm.jpeg/1738160125961.jpeg", name: "AI 人才战略:培养、引进与留用的组合政策", reportId: "Rand_RRA3572-12", tagList: ["人工智能", "人才政策"], thinkTankName: null, times: "2025-10-12" },
{ id: 23714, content: "自动驾驶安全监管与测试评价体系", imageUrl: "https://www.rand.org/content/rand/pubs/research_reports/RRA3572-1/jcr:content/par/teaser.crop.1200x900.cm.jpeg/1738160125961.jpeg", name: "自动驾驶:安全标准、责任划分与道路试点机制", reportId: "Rand_RRA3572-13", tagList: ["智能网联", "交通出行"], thinkTankName: null, times: "2025-10-05" },
{ id: 23715, content: "关键基础设施数字化升级的投融资机制", imageUrl: "https://www.rand.org/content/rand/pubs/research_reports/RRA3572-1/jcr:content/par/teaser.crop.1200x900.cm.jpeg/1738160125961.jpeg", name: "基础设施升级:公共资金撬动与绩效评估体系", reportId: "Rand_RRA3572-14", tagList: ["数字化转型", "基础设施"], thinkTankName: null, times: "2025-09-28" }
]);
const applyMockPolicyAdvice = () => {
const mock = mockPolicyAdviceList();
policyTotal.value = mock.length;
const pageSize = 7;
const page = Math.max(1, Number(policyCurrentPage.value) || 1);
const start = (page - 1) * pageSize;
policyFooterList.value = mock.slice(start, start + pageSize);
};
const fallbackYear = pubTimeList.value?.length ? String(pubTimeList.value[0].id) : null const fallbackYear = pubTimeList.value?.length ? String(pubTimeList.value[0].id) : null
const yearsStr = arrayToString(policySelectedYearIds.value) const yearsStr = arrayToString(policySelectedYearIds.value)
// 领域:如果用户还没选领域,则默认使用“全部领域”的 id 列表 // 领域:如果用户还没选领域,则默认使用“全部领域”的 id 列表
...@@ -1508,22 +1555,34 @@ const handleGetThinkTankPolicyAdvice = async () => { ...@@ -1508,22 +1555,34 @@ const handleGetThinkTankPolicyAdvice = async () => {
const res = await getThinkTankOverviewPolicy(params); const res = await getThinkTankOverviewPolicy(params);
if (res.code === 200 && res.data) { if (res.code === 200 && res.data) {
// /thinkTankOverview/policy 返回:data.content[{id,title,content,date,coverImage,domains,...}] // /thinkTankOverview/policy 返回:data.content[{id,title,content,date,coverImage,domains,...}]
policyFooterList.value = (res.data.content || []).map(item => ({ const mapped = (res.data.content || []).map(item => ({
// 兼容你需要的结构(更接近政策追踪)
id: item.id, id: item.id,
title: item.title,
content: item.content, content: item.content,
date: item.date, name: item.title,
coverImage: item.coverImage, reportName: item.reportName,
domains: item.domains, times: item.date,
imageUrl: item.coverImage,
tagList: item.domains || [],
thinkTankName: item.thinkTankName ?? null,
reportId: item.reportId ?? item.id,
// 保留原字段备用
billInfoList: item.billInfoList, billInfoList: item.billInfoList,
administrativeOrderInfoVOList: item.administrativeOrderInfoVOList administrativeOrderInfoVOList: item.administrativeOrderInfoVOList
})); }));
policyTotal.value = res.data.totalElements || 0;
if (!mapped.length) {
applyMockPolicyAdvice();
return;
}
policyFooterList.value = mapped;
policyTotal.value = res.data.totalElements || mapped.length;
} else { } else {
policyFooterList.value = []; applyMockPolicyAdvice();
policyTotal.value = 0;
} }
} catch (error) { } catch (error) {
applyMockPolicyAdvice();
console.error("获取政策建议 error", error); console.error("获取政策建议 error", error);
} }
}; };
...@@ -2641,6 +2700,7 @@ onMounted(async () => { ...@@ -2641,6 +2700,7 @@ onMounted(async () => {
.center-center { .center-center {
margin-top: 21px; margin-top: 21px;
gap: 20px;
height: 450px; height: 450px;
display: flex; display: flex;
justify-content: center; justify-content: center;
...@@ -3033,6 +3093,45 @@ onMounted(async () => { ...@@ -3033,6 +3093,45 @@ onMounted(async () => {
width: 1063px; width: 1063px;
box-sizing: border-box; box-sizing: border-box;
#box5Chart {
height: 340px;
width: 1063px;
}
.source {
margin: 0 auto;
margin-top: 23px;
/* 上下0,左右自动居中 */
width: 370px;
height: 22px;
display: flex;
.info {
width: 16px;
height: 16px;
margin-top: 3px;
img {
width: 100%;
height: 100%;
}
}
.text {
font-family: "Source Han Sans CN";
font-weight: 400;
font-size: 14px;
line-height: 22px;
letter-spacing: 0px;
text-align: left;
color: rgb(132, 136, 142);
margin-left: 8px;
}
}
} }
} }
...@@ -3091,7 +3190,49 @@ onMounted(async () => { ...@@ -3091,7 +3190,49 @@ onMounted(async () => {
height: 412px; height: 412px;
box-sizing: border-box; box-sizing: border-box;
padding: 24px 24px 0; padding: 24px 24px 0;
#box6Chart {
width: 446px;
height: 309px;
}
.source {
margin: 0 auto;
margin-top: 23px;
/* 上下0,左右自动居中 */
width: 370px;
height: 22px;
display: flex;
.info {
width: 16px;
height: 16px;
margin-top: 3px;
img {
width: 100%;
height: 100%;
}
}
.text {
font-family: "Source Han Sans CN";
font-weight: 400;
font-size: 14px;
line-height: 22px;
letter-spacing: 0px;
text-align: left;
color: rgb(132, 136, 142);
margin-left: 8px;
}
}
} }
} }
} }
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论