提交 b4781ba4 authored 作者: caijian's avatar caijian
<template>
<div id="app">
<div class="wrapper">
<div class="pro-wrapper">
<div class="navbar">
<div class="nav-brand">
<div class="brand-icon">
......@@ -23,7 +23,7 @@
<div class="main-container">
<router-view />
</div>
<div class="ai-btn" @click="openAiBox">
<div class="ai-btn" @click="openAiBox">
<div class="icon">
<img src="@/assets/icons/ai-icon.png" alt="" />
</div>
......@@ -142,164 +142,106 @@ body {
<style lang="scss" scoped>
#app {
font-family: "Helvetica Neue", Helvetica, "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "微软雅黑", Arial, sans-serif;
width: 100%;
height: 100vh;
// overflow-y: hidden;
}
/* 确保Element Plus容器组件占满宽度 */
.el-container {
width: 100%;
height: 100%;
}
.navbar {
display: flex;
justify-content: center;
align-items: center;
background: #fff;
color: rgba(10, 18, 30, 1);
border-bottom: 1px solid #e5e7eb;
box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);
position: relative;
box-sizing: border-box;
height: 72px;
}
.main-container {
/* 移除宽度限制,让子页面自己控制布局 */
width: 100%;
height: 1008px;
.pro-wrapper {
width: 100vw;
height: 100vh;
position: relative;
}
.nav-brand {
display: flex;
align-items: center;
gap: 12px;
position: absolute;
left: 160px;
.brand-icon {
width: 48px;
height: 48px;
img {
width: 100%;
height: 100%;
}
}
}
.brand-icon {
font-size: 24px;
color: #1e3a8a;
}
.brand-text {
cursor: pointer;
.text-ch {
height: 37px;
color: rgba(10, 18, 30, 1);
font-family: Microsoft YaHei;
font-size: 32px;
font-weight: 700;
line-height: 37px;
}
.text-en {
overflow: hidden;
.navbar {
display: flex;
justify-content: center;
align-items: center;
background: #fff;
color: rgba(10, 18, 30, 1);
font-family: Microsoft YaHei;
font-size: 10px;
font-weight: 400;
line-height: 13px;
}
}
.nav-menu {
display: flex;
align-items: center;
gap: 32px;
}
.nav-link {
display: flex;
align-items: center;
gap: 6px;
color: #333;
text-decoration: none;
padding: 8px 12px;
border-radius: 6px;
transition: all 0.3s;
font-size: 14px;
cursor: pointer;
}
.nav-link:hover,
.nav-link.router-link-active {
background-color: #1459bb;
color: #fff;
}
.home-dropdown {
display: inline-block;
}
.dropdown-trigger {
cursor: pointer;
}
border-bottom: 1px solid #e5e7eb;
box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);
position: relative;
box-sizing: border-box;
height: 72px;
.nav-brand {
display: flex;
align-items: center;
gap: 12px;
position: absolute;
left: 160px;
.brand-icon {
width: 48px;
height: 48px;
img {
width: 100%;
height: 100%;
}
}
.dropdown-arrow {
font-size: 12px;
margin-left: 4px;
transition: transform 0.3s;
}
.brand-text {
cursor: pointer;
.text-ch {
height: 37px;
color: rgba(10, 18, 30, 1);
font-family: Microsoft YaHei;
font-size: 32px;
font-weight: 700;
line-height: 37px;
}
.text-en {
color: rgba(10, 18, 30, 1);
font-family: Microsoft YaHei;
font-size: 10px;
font-weight: 400;
line-height: 13px;
}
}
}
.home-dropdown:hover .dropdown-arrow {
transform: rotate(180deg);
}
.user-info {
display: flex;
align-items: center;
gap: 20px;
padding: 8px 12px;
border-radius: 6px;
color: #333;
position: absolute;
right: 160px;
.email {
width: 20px;
height: 20px;
img {
width: 100%;
height: 100%;
}
}
.user-info {
display: flex;
align-items: center;
gap: 20px;
padding: 8px 12px;
border-radius: 6px;
color: #333;
position: absolute;
right: 160px;
.email {
width: 20px;
height: 20px;
img {
width: 100%;
height: 100%;
}
}
.avator {
width: 32px;
height: 32px;
.avator {
width: 32px;
height: 32px;
img {
width: 100%;
height: 100%;
}
}
img {
width: 100%;
height: 100%;
.user {
color: rgba(59, 65, 75, 1);
font-family: Microsoft YaHei;
font-size: 16px;
font-weight: 400;
line-height: 30px;
}
}
}
.user {
color: rgba(59, 65, 75, 1);
font-family: Microsoft YaHei;
font-size: 16px;
font-weight: 400;
line-height: 30px;
.main-container {
width: 100%;
height: calc(100vh - 72px);
position: relative;
overflow: hidden;
}
}
.wrapper {
position: relative;
.ai-btn {
position: absolute;
bottom: 240px;
......@@ -335,5 +277,4 @@ body {
z-index: 9999;
}
}
</style>
<template>
<div class="menu-wrapper">
<div class="menu-item">
<div class="menu-item" @click="handleToOverview">
<div class="menu-item-icon">
<img src="@/assets/icons/home-header-icon1.png" alt="" />
</div>
<div class="menu-item-text">{{ "首页" }}</div>
</div>
<div class="menu-item">
<div class="menu-item" @click="handleToGjOverview">
<div class="menu-item-icon1">
<img src="@/assets/icons/home-header-icon2.png" alt="" />
</div>
......@@ -33,6 +33,24 @@
</div>
</template>
<script setup>
import {ref, onMounted} from 'vue'
import router from '@/router';
const handleToOverview = () => {
router.push({
path: "/overview"
});
}
const handleToGjOverview = () => {
router.push({
path: "/gjOverview"
});
}
</script>
<style lang="scss" scoped>
.menu-wrapper {
width: 644px;
......@@ -46,6 +64,10 @@
height: 64px;
justify-content: center;
align-items: center;
cursor: pointer;
&:hover{
background: rgba(5, 95, 194, 0.2);
}
.menu-item-icon {
// margin-top: 2px;
width: 22px;
......
......@@ -22,12 +22,11 @@ const router = createRouter({
// 路由守卫 - 设置页面标题
router.beforeEach((to, from, next) => {
if (to.meta.title) {
if (to.meta.dynamicTitle) {
if (to.meta.dynamicTitle) {
console.log('to', to);
document.title = window.sessionStorage.getItem("billId");
document.title = window.sessionStorage.getItem("curTabName") || to.meta.title;
} else {
document.title = to.meta.title
document.title = to.meta.title
}
}
......
......@@ -9,16 +9,16 @@ const innovationSubjectRoutes = [
name: "InnovationSubject",
component: InnovationSubject,
meta: {
title: "主要创新主体"
title: "M国主要创新主体分析概览"
}
},
{
path: "/InnovativeInstitutions/:id",
name: "InnovativeInstitutions",
component: InnovationInstitution,
meta: {
title: "学校详情"
},
// meta: {
// title: "学校详情"
// },
}
]
......
......@@ -31,7 +31,8 @@ const billRoutes = [
component: BillLayoutContainer,
redirect: "/billLayout/bill",
meta: {
title: "法案布局"
title: "法案详情",
dynamicTitle: true // 标记需要动态设置标题
},
children: [
// 法案分析路由
......@@ -40,10 +41,9 @@ const billRoutes = [
name: "BillLayout",
component: BillLayout,
redirect: "/billLayout/bill/introduction",
meta: {
title: "法案分析",
dynamicTitle: true // 标记需要动态设置标题
},
// meta: {
// title: "法案分析",
// },
children: [
{
path: "introduction",
......
......@@ -10,7 +10,8 @@ const characterPageRoutes = [
name: "CharacterPage",
component: CharacterPage,
meta: {
title: "人物主页"
title: "人物主页",
dynamicTitle: true
}
}
......
......@@ -8,7 +8,8 @@ const companyPagesRoutes = [
name: "companyPages",
component: companyPages,
meta: {
title: "企业主页"
title: "企业主页",
dynamicTitle: true
}
},
......
......@@ -10,7 +10,7 @@ const comprehensiveSearchRoutes = [
name: "comprehensiveSearch",
component: ComprehensiveSearch,
meta: {
title: "综合搜索"
title: "搜索-科技安全"
}
},
{
......@@ -18,7 +18,8 @@ const comprehensiveSearchRoutes = [
name: "searchResults",
component: SearchResults,
meta: {
title: "搜索结果"
title: "搜索结果",
dynamicTitle: true
}
},
{
......
......@@ -9,7 +9,7 @@ const cooperationRestrictionsRoutes = [
name: "CooperationRestrictions",
component: CooperationRestrictions,
meta: {
title: "合作限制"
title: "合作限制概览"
}
},
// 合作限制详情
......@@ -18,7 +18,8 @@ const cooperationRestrictionsRoutes = [
name: "CooperationRestrictionsDetail",
component: CooperationRestrictionsDetail,
meta: {
title: "合作限制详情"
title: "合作限制详情",
dynamicTitle: true
}
},
......
......@@ -15,7 +15,7 @@ const decreeRoutes = [
name: "Decree",
component: Decree,
meta: {
title: "政令"
title: "政令概览"
}
},
{
......@@ -23,9 +23,9 @@ const decreeRoutes = [
name: "DecreeLayoutContainer",
component: DecreeLayoutContainer,
redirect: "/decreeLayout/overview",
meta: {
title: "政令布局"
},
// meta: {
// title: "政令布局"
// },
children: [
{
path: "overview",
......@@ -33,20 +33,21 @@ const decreeRoutes = [
component: DecreeOverviewLayout,
redirect: "/decreeLayout/overview/introduction",
meta: {
title: "政令概况"
title: "政令详情",
dynamicTitle: true // 标记需要动态设置标题
},
children: [
{
path: "introduction",
name: "DecreeIntroduction",
component: DecreeIntroduction,
meta: { title: "政令简介" }
// meta: { title: "政令简介" }
},
{
path: "background",
name: "DecreeBackground",
component: DecreeBackground,
meta: { title: "政令背景" }
// meta: { title: "政令背景" }
}
]
},
......@@ -55,18 +56,18 @@ const decreeRoutes = [
path: "deepDig",
name: "DeepDig",
component: DecreeDeepDig,
meta: {
title: "深度挖掘"
}
// meta: {
// title: "深度挖掘"
// }
},
// 影响分析路由
{
path: "influence",
name: "DecreeInfluence",
component: DecreeInfluence,
meta: {
title: "影响分析"
}
// meta: {
// title: "影响分析"
// }
}
]
},
......@@ -75,7 +76,8 @@ const decreeRoutes = [
name: "Institution",
component: Institution,
meta: {
title: "行政机构主页"
title: "行政机构主页",
dynamicTitle: true
}
}
......
......@@ -8,7 +8,7 @@ const exportControlRoutes = [
name: "ExportControl",
component: ExportControl,
meta: {
title: "出口管制"
title: "出口管制概览"
}
},
{
......@@ -92,7 +92,7 @@ const exportControlRoutes = [
name: "entityList",
component: () => import("@/views/exportControl/v2.0EntityList/index.vue"),
meta: {
title: "全部实体清单"
title: "实体清单概览"
}
},
// V2.0单条制裁详情
......@@ -101,7 +101,8 @@ const exportControlRoutes = [
name: "singleSanction",
component: () => import("@/views/exportControl/v2.0SingleSanction/index.vue"),
meta: {
title: "单条制裁详情"
title: "单条制裁详情",
dynamicTitle: true
}
},
// V2.0单条制裁详情-实体清单原文
......@@ -109,9 +110,9 @@ const exportControlRoutes = [
path: "/exportControl/origin",
name: "entityListOrigin",
component: () => import("@/views/exportControl/v2.0SingleSanction/originPage/index.vue"),
meta: {
title: "实体清单原文"
}
// meta: {
// title: "实体清单原文"
// }
},
]
......
......@@ -8,7 +8,7 @@ const financeRoutes = [
name: "finance",
component: Finance,
meta: {
title: "投融资限制"
title: "投融资限制概览"
}
},
......
......@@ -15,7 +15,7 @@ const marketAccessRestrictionsRoutes = [
name: "MarketAccessRestrictions",
component: MarketAccessRestrictions,
meta: {
title: "市场准入限制"
title: "市场准入限制概览"
}
},
{
......@@ -24,7 +24,8 @@ const marketAccessRestrictionsRoutes = [
component: MarketAccessLayout,
redirect: "/marketAccessLayout/case",
meta: {
title: "市场准入限制布局"
title: "调查概览",
dynamicTitle: true
},
children: [
......@@ -32,17 +33,17 @@ const marketAccessRestrictionsRoutes = [
path: "case",
name: "MarketAccessCase",
component: MarketAccessCase,
meta: {
title: "调查案件"
}
// meta: {
// title: "调查案件"
// }
},
{
path: "overview",
name: "MarketAccessOverview",
component: MarketAccessOverview,
meta: {
title: "数据统计"
}
// meta: {
// title: "数据统计"
// }
}
]
},
......@@ -53,24 +54,25 @@ const marketAccessRestrictionsRoutes = [
component: MarketSingleCaseLayout,
redirect: "/marketSingleCaseLayout/overview",
meta: {
title: "单次调查案件布局"
title: "调查详情",
dynamicTitle: true
},
children: [
{
path: "overview",
name: "MarketSingleCaseOverview",
component: MarketSingleCaseOverview,
meta: {
title: "调查简介"
}
// meta: {
// title: "调查简介"
// }
},
{
path: "deepdig",
name: "MarketSingleCaseDeepdig",
component: MarketSingleCaseDeepdig,
meta: {
title: "深度挖掘"
}
// meta: {
// title: "深度挖掘"
// }
}
]
},
......
......@@ -9,7 +9,7 @@ const ruleRestrictionsRoutes = [
name: "RuleRestrictions",
component: RuleRestriction,
meta: {
title: "规则限制"
title: "规则限制概览"
}
},
// 规则限制详情
......@@ -18,7 +18,8 @@ const ruleRestrictionsRoutes = [
name: "RuleRestrictionsDetail",
component: RuleRestrictionDetail,
meta: {
title: "规则限制详情"
title: "规则限制详情",
dynamicTitle: true
}
},
......
......@@ -8,7 +8,7 @@ const scientificFundingRoutes = [
name: "ScientificFunding",
component: ScientificFunding,
meta: {
title: "科研资助体系"
title: "M国科研资助体系分析概览"
}
}
......
......@@ -2,13 +2,12 @@
import TechnologyFigures from "@/views/technologyFigures/index.vue";
const technologyFiguresRoutes = [
//创新主体
{
path: "/technologyFigures",
name: "TechnologyFigures",
component: TechnologyFigures,
meta: {
title: "主要创新主体"
title: "M国科技人物观点分析概览"
}
}
......
......@@ -10,7 +10,7 @@ const thinktankRoutes = [
name: "thinkTank",
component: thinkTank,
meta: {
title: "首页"
title: "科技智库概览"
}
},
{
......@@ -18,7 +18,8 @@ const thinktankRoutes = [
name: "ThinkTankDetail",
component: ThinkTankDetail,
meta: {
title: "智库详情"
title: "智库概览",
dynamicTitle: true
}
},
{
......@@ -26,16 +27,17 @@ const thinktankRoutes = [
name: "ReportDetail",
component: ReportDetail,
meta: {
title: "报告详情"
title: "报告详情",
dynamicTitle: true
}
},
{
path: "/thinkTank/reportOriginal/:id",
name: "ReportOriginal",
component: ReportOriginal,
meta: {
title: "报告原文"
}
// meta: {
// title: "报告原文"
// }
},
]
......
......@@ -2,7 +2,12 @@
<div class="home-wrapper">
<div class="search-header" v-show="isShow">
<div class="home-main-header-center">
<el-input v-model="searchBillText" style="width: 680px; height: 100%" placeholder="搜索科技法案" />
<el-input
v-model="searchBillText"
@keyup.enter="handleSearch"
style="width: 680px; height: 100%"
placeholder="搜索科技法案"
/>
<div class="search">
<div class="search-icon">
<img src="./assets/images/search-icon.png" alt="" />
......@@ -49,7 +54,12 @@
<div class="home-main">
<div class="home-main-header" v-show="!isShow">
<div class="home-main-header-center">
<el-input v-model="searchBillText" style="width: 800px; height: 100%" placeholder="搜索科技法案" />
<el-input
v-model="searchBillText"
@keyup.enter="handleSearch"
style="width: 800px; height: 100%"
placeholder="搜索科技法案"
/>
<div class="search">
<div class="search-icon">
<img src="./assets/images/search-icon.png" alt="" />
......@@ -305,7 +315,7 @@
</div>
<div class="box4-main">
<div class="box4-main-item" v-for="(item, index) in messageList" :key="index">
<div class="left" @click="handleClcikToCharacter(item.personId)">
<div class="left" @click="handleClcikToCharacter(item.personId, item.personName)">
<img
:src="getProxyUrl(item.personImage) || Message3"
alt=""
......@@ -479,7 +489,7 @@
class="box8-main-item"
v-for="(item, index) in box8Data"
:key="index"
@click="handleClcikToCharacter(item.memberId)"
@click="handleClcikToCharacter(item.memberId, item.name)"
>
<div class="box8-main-item-left">
<img :src="getProxyUrl(item.img)" alt="" referrerpolicy="no-referrer" class="left-img" />
......@@ -846,7 +856,7 @@ const formatMessageTime = timeStr => {
};
// 跳转人物主页
const handleClcikToCharacter = async id => {
const handleClcikToCharacter = async (id, name) => {
const personTypeList = JSON.parse(window.sessionStorage.getItem("personTypeList"));
let type = 0;
......@@ -879,6 +889,7 @@ const handleClcikToCharacter = async id => {
ElMessage.warning("找不到当前人员的类型值!");
return;
}
window.sessionStorage.setItem("curTabName", name);
const route = router.resolve({
path: "/characterPage",
query: {
......@@ -949,6 +960,7 @@ const curBill = ref({
// 查看详情
const handleClickToDetail = () => {
window.sessionStorage.setItem("billId", curBill.value.billId);
window.sessionStorage.setItem("curTabName", curBill.value.billName);
const route = router.resolve({
path: "/billLayout",
query: {
......@@ -962,6 +974,7 @@ const handleClickToDetail = () => {
// 查看详情 传递参数
const handleClickToDetailO = item => {
window.sessionStorage.setItem("billId", item.billId);
window.sessionStorage.setItem("curTabName", item.name);
const route = router.resolve("/billLayout?billId=" + item.billId);
window.open(route.href, "_blank");
};
......@@ -1688,6 +1701,7 @@ const footerSelect2 = ref("全部提出议员");
// ]);
const handleSearch = () => {
window.sessionStorage.setItem("curTabName", `搜索-${searchBillText.value}`);
const curRoute = router.resolve({
path: "/searchResults",
query: {
......
......@@ -67,14 +67,16 @@
class="content ai-content"
v-html="renderMarkdown(message.content)"
></div>
<div v-if="message.raw_data?.length" class="answer-title">完整实体列表</div>
<div v-if="message.raw_data?.length" class="content row-content">
<div v-if="message.raw_data?.length || message.raw_data?.rows?.length" class="answer-title">完整实体列表</div>
<div v-if="message.raw_data?.length || message.raw_data?.rows?.length" class="content row-content">
<div class="row-header">
<div class="row-header-item1">{{ message.raw_data.columns?.name_zhs }}</div>
<div class="row-header-item">{{ message.raw_data.columns?.date }}</div>
<div class="row-header-item">{{ message.raw_data.columns?.industry }}</div>
<div class="row-header-item">{{ message.raw_data.columns?.category }}</div>
<div class="row-header-item2">{{ message.raw_data.columns?.sanction_reason }}</div>
<div class="row-header-item2">
{{ message.raw_data.columns?.sanction_reason }}
</div>
</div>
<div class="row-main">
<div
......@@ -194,6 +196,10 @@ const areaList = ref([
label: "法案",
value: "法案"
},
{
label: "法案RAG",
value: "法案RAG"
},
{
label: "清单",
value: "清单"
......@@ -920,8 +926,9 @@ const sendMessage = async () => {
userInput.value = "";
aiMessage.value = "";
if (curArea.value === "法案") {
// await connectSSE(question);
handleBillChat(question)
handleBillChat(question);
} else if (curArea.value === "法案RAG") {
await connectSSE(question);
} else {
handleListChat(question);
}
......
......@@ -64,7 +64,7 @@
</el-select>
</div> -->
</div>
<div class="summary-box">
<!-- <div class="summary-box">
<div class="summary-header">
<img src="./assets/images/summary-icon.png" alt="" />
</div>
......@@ -73,8 +73,8 @@
` 美国众议院共和党人正在起草一项新提案,以限制美国对中国的投资。此前,参议院已将其纳入国防政策立法中。知情人士向Semafor透露,众议院工作人员希望在11月7日前就该提案达成共识,并将财政部的反馈纳入由肯塔基州共和党众议员安迪·巴尔提出的配套提案中(尽管政府停摆可能推迟这一时间表)。随后,众议员将利用该文本与参议员就最终《国防授权法案》的内容进行协商。此前一届国会中,类似的尝试因北卡罗来纳州前众议员帕特里克·麦克亨利的反对而失败,但本届国会中,“所有人都在共同努力”。知情人士补充说,领导人并不担心此举会剥夺特朗普在周四与中国领导人习近平会谈时的谈判筹码,因为财政部已开始实施类似的指导方针。`
}}
</div>
</div>
<div class="header-right">
</div> -->
<!-- <div class="header-right">
<div class="header-right-header">{{ "关联检索" }}</div>
<div class="header-right-main">
<div class="header-right-main-item" v-for="(item, index) in relatedSearchList" :key="index">
......@@ -84,7 +84,7 @@
<div class="text">{{ item }}</div>
</div>
</div>
</div>
</div> -->
</div>
<div class="main">
<div class="item" v-for="(item, index) in searchResults" :key="index" @click="handleToPage(item)">
......@@ -92,8 +92,8 @@
<img :src="item?.img" alt="" />
</div>
<div class="item-right">
<div class="title" v-html="item?.title"></div>
<div class="content" v-html="item?.description"></div>
<div class="title" v-html="item?.originalTitle"></div>
<div class="content" v-html="item?.originalDescription"></div>
<div class="item-right-footer">
<div class="time">{{ item?.date }}</div>
<div class="tag tag3">
......
......@@ -8,7 +8,7 @@
<div class="left-top-title">合作限制动态</div>
<div class="more" @click="handleClickToDetail">查看详情 ></div>
</div>
<el-carousel
ref="carouselRef"
height="412px"
......@@ -42,8 +42,10 @@
<li>
<span class="ul-title">涉及领域:</span>
<div class="ul-tags" v-if="item.AREA">
<span
v-for="(field, fIndex) in (typeof item.AREA === 'string' ? item.AREA.split(',') : item.AREA)"
<span
v-for="(field, fIndex) in typeof item.AREA === 'string'
? item.AREA.split(',')
: item.AREA"
:key="fIndex"
class="ul-pie"
:class="'cl' + ((fIndex % 3) + 1)"
......@@ -68,7 +70,7 @@
</div>
</div>
</el-carousel-item>
<!-- 无数据时的占位展示 -->
<el-carousel-item v-if="coopRestrictionTrends.length === 0">
<div class="carousel-item-content">
......@@ -99,7 +101,7 @@
</div>
</div>
<div style="margin: 6px 34px 0 23px">
<div v-for="item in riskSignals" :key="item.id" class="right-main" @click="handleToRiskDetail">
<div v-for="item in riskSignals" :key="item.id" class="right-main" @click="handleToRiskDetail">
<div class="main-left" :class="{ cl4: item.title === '特别重大', cl5: item.title === '重大风险' }">
{{ item.title }}
</div>
......@@ -134,7 +136,7 @@ const getCoopRestrictionTrendsData = async () => {
}
} catch (error) {
console.error("获取合作限制最新动态数据失败:", error);
}
}
};
// 轮播图手动切换
......@@ -150,7 +152,7 @@ const handleNext = () => {
};
// 轮播切换回调
const handleCarouselChange = (index) => {
const handleCarouselChange = index => {
activeIndex.value = index;
};
......@@ -160,7 +162,7 @@ const mainTrend = computed(() => {
return coopRestrictionTrends.value[activeIndex.value] || coopRestrictionTrends.value[0];
});
// 右侧风险信号列表
// 右侧风险信号列表
const riskSignals = ref([
{
id: 1,
......@@ -189,13 +191,15 @@ const riskSignals = ref([
]);
// 点击查看详情
const handleClickToDetail = (item) => {
const activeItem = (item && item.ID) ? item : mainTrend.value;
const handleClickToDetail = item => {
const activeItem = item && item.ID ? item : mainTrend.value;
const id = activeItem?.ID;
if (!id) return;
window.sessionStorage.setItem("curTabName", activeItem?.LIMITNAME);
const curRoute = router.resolve({
path: "/cooperationRestrictions/detail",
query: { id: id },
query: { id: id }
});
window.open(curRoute.href, "_blank");
};
......@@ -214,7 +218,7 @@ const handleToMoreRiskSignal = () => {
onMounted(() => {
// 合作限制-最新动态数据-获取数据
getCoopRestrictionTrendsData();
getCoopRestrictionTrendsData();
});
</script>
......
......@@ -49,7 +49,7 @@
<HeaderMenu></HeaderMenu>
</div>
<div class="header-right">
<headerInfo curTitleName="政令"></headerInfo>
<headerInfo curTitleName="政令"></headerInfo>
</div>
</div>
<div class="home-main-header-center" v-show="!isShow">
......@@ -57,7 +57,7 @@
v-model="searchDecreeText"
@keyup.enter="handleSearch"
style="width: 838px; height: 100%"
placeholder="搜索科技政令"
placeholder="搜索政令"
/>
<div class="search">
<div class="search-icon">
......@@ -267,11 +267,12 @@
<div class="title">{{ news.title }}</div>
<div class="time">{{ news.from }}</div>
</div>
<el-popover effect="dark" :width="1000" :content="news.content" placement="top-start">
<div class="right-footer">{{ news.content }}</div>
<!-- <el-popover effect="dark" :width="1000" :content="news.content" placement="top-start">
<template #reference>
<div class="right-footer">{{ news.content }}</div>
</template>
</el-popover>
</el-popover> -->
</div>
</div>
</div>
......@@ -368,7 +369,7 @@
class="box7-item"
v-for="(item, index) in keyDecreeList"
:key="index"
@click="handleKeyDecree(item.id)"
@click="handleKeyDecree(item)"
>
<div class="icon">
<img src="./assets/images/warning.png" alt="" />
......@@ -378,11 +379,12 @@
<div class="title">{{ item.title }}</div>
<div class="time">{{ item.time }}</div>
</div>
<el-popover effect="dark" :width="800" :content="item.content" placement="top-start">
<div class="info-content">{{ item.content ? item.content : "暂无数据" }}</div>
<!-- <el-popover effect="dark" :width="800" :content="item.content" placement="top-start">
<template #reference>
<div class="info-content">{{ item.content ? item.content : "暂无数据" }}</div>
</template>
</el-popover>
</el-popover> -->
</div>
</div>
</div>
......@@ -616,6 +618,7 @@ import { ElMessage } from "element-plus";
// 跳转行政机构主页
const handleToInstitution = item => {
window.sessionStorage.setItem("curTabName", item.name);
const curRoute = router.resolve({
path: "/institution",
query: {
......@@ -737,6 +740,7 @@ const handleClickToDetail = () => {
const id = box1DataList.value[activeIndex].id;
window.sessionStorage.setItem("curTabName", box1DataList.value[activeIndex].name);
const route = router.resolve({
path: "/decreeLayout",
query: {
......@@ -748,6 +752,7 @@ const handleClickToDetail = () => {
// 点击政令库政令
const handleClickDecree = decree => {
window.sessionStorage.setItem("curTabName", decree.title);
const route = router.resolve({
path: "/decreeLayout",
query: {
......@@ -757,11 +762,12 @@ const handleClickDecree = decree => {
window.open(route.href, "_blank");
};
const handleKeyDecree = id => {
const handleKeyDecree = item => {
window.sessionStorage.setItem("curTabName", item.title);
const route = router.resolve({
path: "/decreeLayout",
query: {
id: id
id: item.id
}
});
window.open(route.href, "_blank");
......@@ -910,6 +916,7 @@ const handleClickPerson = async item => {
ElMessage.warning("找不到当前人员的类型值!");
return;
}
window.sessionStorage.setItem("curTabName", item.name);
const route = router.resolve({
path: "/characterPage",
query: {
......@@ -1287,6 +1294,7 @@ const handleSwithCurDecree = name => {
// 搜索
const searchDecreeText = ref("");
const handleSearch = () => {
window.sessionStorage.setItem("curTabName", `搜索-${searchDecreeText.value}`);
const curRoute = router.resolve({
path: "/searchResults",
query: {
......@@ -1570,6 +1578,7 @@ onMounted(async () => {
box-shadow: 0px 0px 20px 0px rgba(25, 69, 130, 0.1);
background: rgba(255, 255, 255, 0.65);
align-items: center;
gap:17px;
margin: 0 6px 16px 6px;
cursor: pointer;
transition: transform 0.3s ease, box-shadow 0.3s ease;
......@@ -1578,17 +1587,15 @@ onMounted(async () => {
box-shadow: 0 4px 16px rgba(0, 0, 0, 0.15);
}
.item-left {
margin-left: 24px;
width: 48px;
height: 48px;
margin-left: 24px;
margin-top: 12px;
img {
width: 100%;
height: 100%;
}
}
.item-right {
margin-left: 17px;
width: 140px;
color: rgba(59, 65, 75, 1);
font-family: Microsoft YaHei;
......
......@@ -157,6 +157,7 @@ const siderList = ref([
const siderActiveIndex = ref(0);
const handleClickSider = async index => {
siderActiveIndex.value = index;
decreeInfo.value.id = allData.value[index].id
decreeInfo.value.img = allData.value[index].imageUrl;
decreeInfo.value.totalTitle = allData.value[index].name;
decreeInfo.value.eTotalTitle = allData.value[index].ename;
......@@ -263,6 +264,8 @@ const handleGetRelateOrder = async () => {
};
const handleToDecreeDetail = item => {
console.log('item', item.id);
const route = router.resolve({
path: "/decreeLayout/overview/introduction",
query: {
......
......@@ -11,11 +11,11 @@
<div class="info">
<div class="info-box1">{{ summaryInfo.name }}</div>
<div class="info-box2">
<div class="info-box2-item">{{ summaryInfo.order }}</div>
<div class="info-box2-item item1">{{ summaryInfo.order }}</div>
|
<div class="info-box2-item">{{ summaryInfo.type }}</div>
<div class="info-box2-item item2">{{ summaryInfo.type }}</div>
|
<div class="info-box2-item">{{ summaryInfo.ename }}</div>
<div class="info-box2-item item3">{{ summaryInfo.ename }}</div>
</div>
</div>
</div>
......@@ -43,11 +43,20 @@
<div class="name">{{ summaryInfo.orgName }}</div>
</div>
<div class="right-box-bottom">
<!-- <el-button type="plain" size="large" icon="Search" @click="handleSwitchActiveName('法案原文')"
>政令原文</el-button
> -->
<el-button type="plain" size="large" icon="Search" @click="handleShowReport">政令原文</el-button>
<el-button type="primary" size="large" icon="EditPen">分析报告</el-button>
<div class="btn" @click="handleShowReport">
<div class="icon">
<img src="./assets/icons/report-icon.png" alt="" />
</div>
<div class="text">{{ "政令原文" }}</div>
</div>
<div class="btn-active">
<div class="icon-active">
<img src="./assets/icons/edit-icon.png" alt="" />
</div>
<div class="text-active">{{ "分析报告" }}</div>
</div>
<!-- <el-button type="plain" size="large" icon="Search" @click="handleShowReport">政令原文</el-button>
<el-button type="primary" size="large" icon="EditPen">分析报告</el-button> -->
</div>
</div>
</div>
......@@ -106,7 +115,7 @@
</div>
</div>
</div>
<div class="report" v-if="isShowReport">
<div class="report" v-if="isShowReport">
<div class="report-close" @click="handleCloseReport">
<img src="@/assets/icons/close.png" alt="" />
</div>
......@@ -185,13 +194,13 @@ const mainHeaderBtnList = ref([
activeIcon: icon2Active,
name: "深度挖掘",
path: "/decreeLayout/deepDig"
},
{
icon: icon3,
activeIcon: icon3Active,
name: "影响分析",
path: "/decreeLayout/influence"
}
// {
// icon: icon3,
// activeIcon: icon3Active,
// name: "影响分析",
// path: "/decreeLayout/influence"
// }
]);
const activeTitle = ref("政令概况");
......@@ -237,11 +246,11 @@ const handleGetReport = async () => {
};
const handleCloseReport = () => {
isShowReport.value = false
}
isShowReport.value = false;
};
const handleShowReport = () => {
isShowReport.value = true
}
isShowReport.value = true;
};
onMounted(() => {
handleGetSummary();
......@@ -253,20 +262,17 @@ onMounted(() => {
} else {
activeTitle.value = "影响分析";
}
handleGetReport()
handleGetReport();
});
</script>
<style lang="scss" scoped>
.layout-container {
width: 100vw;
height: 100vh;
min-width: 1920px;
min-height: 1016px;
background: rgba(249, 250, 252, 1);
position: relative;
.report {
width: 100%;
height: 100%;
overflow: hidden;
overflow-y: auto;
.report {
padding: 10px 150px;
position: absolute;
left: 0;
......@@ -335,12 +341,14 @@ onMounted(() => {
}
.layout-main {
width: 100%;
height: 100%;
.layout-main-header {
height: 137px;
background: rgba(255, 255, 255, 1);
display: flex;
justify-content: space-between;
position: sticky;
top: 0;
z-index: 99999999;
.layout-main-header-left-box {
width: 1100px;
margin-left: 160px;
......@@ -359,8 +367,10 @@ onMounted(() => {
}
}
.info {
width: 700px;
margin-left: 9px;
.info-box1 {
width: 700px;
color: rgba(59, 65, 75, 1);
font-family: Microsoft YaHei;
font-size: 20px;
......@@ -369,6 +379,9 @@ onMounted(() => {
letter-spacing: 0px;
text-align: left;
margin-top: 5px;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.info-box2 {
margin-top: 5px;
......@@ -386,6 +399,24 @@ onMounted(() => {
.info-box2-item {
padding: 0 10px;
}
.item1 {
width: 100px;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.item2 {
width: 180px;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.item3 {
width: 420px;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
}
}
}
......@@ -460,12 +491,78 @@ onMounted(() => {
.right-box-bottom {
margin-top: 24px;
text-align: right;
display: flex;
justify-content: flex-end;
gap: 8px;
.btn {
width: 120px;
height: 36px;
box-sizing: border-box;
border: 1px solid rgba(230, 231, 232, 1);
border-radius: 6px;
background: rgba(255, 255, 255, 1);
display: flex;
justify-content: center;
gap: 8px;
align-items: center;
cursor: pointer;
.icon {
width: 16px;
height: 16px;
img {
width: 100%;
height: 100%;
}
}
.text {
width: 64px;
height: 24px;
color: rgba(95, 101, 108, 1);
font-family: Microsoft YaHei;
font-style: Regular;
font-size: 16px;
font-weight: 400;
line-height: 24px;
letter-spacing: 0px;
text-align: left;
}
}
.btn-active {
width: 120px;
height: 36px;
border-radius: 6px;
background: var(--color-main-active);
display: flex;
justify-content: center;
align-items: center;
gap: 8px;
cursor: pointer;
.icon-active {
width: 16px;
height: 16px;
img {
width: 100%;
height: 100%;
}
}
.text-active {
width: 64px;
height: 24px;
color: rgba(255, 255, 255, 1);
font-family: Microsoft YaHei;
font-style: Regular;
font-size: 16px;
font-weight: 400;
line-height: 24px;
letter-spacing: 0px;
text-align: center;
}
}
}
}
}
.layout-main-center {
// height: calc(100% - 137px);
overflow: hidden;
}
}
.layout-report-box {
......@@ -558,8 +655,6 @@ onMounted(() => {
.content-left {
width: 680px;
height: 786px;
// background: #eee;
// overflow-y: auto;
img {
width: 100%;
height: 100%;
......@@ -569,8 +664,6 @@ onMounted(() => {
margin-left: 89px;
width: 680px;
height: 786px;
// background: #eee;
// overflow-y: auto;
img {
width: 100%;
height: 100%;
......
......@@ -815,6 +815,7 @@ const handleToPosi = id => {
// 跳转到单项制裁页面
const handleToRiskSignalDetail = item => {
window.sessionStorage.setItem("curTabName", item.title);
const routeData = router.resolve({
path: "/exportControl/singleSanction",
query: {
......@@ -877,6 +878,7 @@ const checkedTime = ref(["全部时间"]);
// 跳转到单条制裁页面,单独打开一个新页面
const handleTitleClick = item => {
window.sessionStorage.setItem("curTabName", `${item.year}-${item.dateStr}${item.title}》`);
const route = router.resolve({
path: "/exportControl/singleSanction",
query: {
......@@ -893,6 +895,7 @@ import _ from "lodash";
const handleCompClick = item => {
// console.log("item", item);
// if (item.entityType != 2) return;
window.sessionStorage.setItem("curTabName", item.name);
const route = router.resolve({
name: "companyPages",
params: {
......@@ -1065,6 +1068,7 @@ watch(
const handleEntityClick = item => {
console.log("item", item);
window.sessionStorage.setItem("curTabName", item.name || item.entityNameZh);
const route = router.resolve({
name: "companyPages",
params: {
......@@ -1114,6 +1118,10 @@ const handleToEntityList = item => {
const currentItem = entitiesDataInfoList.value[currentCarouselIndex.value];
id = currentItem?.id;
}
window.sessionStorage.setItem(
"curTabName",
entitiesDataInfoList.value[currentCarouselIndex.value].postDate + " 《实体清单新增条目》"
);
const routeData = router.resolve({
path: "/exportControl/singleSanction",
query: {
......@@ -1587,6 +1595,7 @@ const fetchNewsInfo = async () => {
const handlePerClick = item => {
// console.log("点击了社交媒体消息:", item);
window.sessionStorage.setItem("curTabName", item.name);
const route = router.resolve({
path: "/characterPage",
query: {
......@@ -1675,6 +1684,7 @@ const chart1Data = ref({
const handleSanc = item => {
console.log(item);
window.sessionStorage.setItem("curTabName", `${item.postDate}${item.title}》`);
const route = router.resolve({
path: "/exportControl/singleSanction",
query: {
......@@ -1748,6 +1758,7 @@ const handleSwithCurPolicy = name => {
};
const handleSearch = () => {
window.sessionStorage.setItem("curTabName", `搜索-${searchExportControlText.value}`);
const curRoute = router.resolve({
path: "/searchResults",
query: {
......
......@@ -123,6 +123,7 @@ const router = useRouter();
// 跳转公司详情页
const handleCompClick = item => {
console.log("item", item);
window.sessionStorage.setItem('curTabName', item.entityNameZh || item.entityName)
const route = router.resolve({
name: "companyPages",
params: {
......
......@@ -201,6 +201,7 @@ const handleCompClick = item => {
ElMessage.warning("暂无数据");
return;
}
window.sessionStorage.setItem('curTabName', item.name)
const curRoute = router.resolve({ name: "companyPages", params: { id: item.entityId } });
window.open(curRoute.href, "_blank");
};
......@@ -1008,6 +1009,7 @@ onMounted(() => {
line-height: 24px;
font-family: "Microsoft YaHei";
color: rgba(59, 65, 75, 1);
cursor: pointer;
}
}
......
......@@ -3,7 +3,7 @@
<div class="content-main">
<!-- 头部按钮 -->
<div class="content-title">
<div v-for="(value, index) in pageList" :key="index" @click="page = value">
<div v-for="(value, index) in pageList" :key="index" @click="handleClickHeader(value)">
<div class="content-title-item" :style="{ background: page === value ? 'rgba(5, 95, 194, 1)' : '' }">
<img class="title-icon" :src="`src/assets/images/icon/gjOverPreview-icon-${index + 1}.png`" />
{{ value }}
......@@ -119,12 +119,24 @@
<script setup>
import { ref } from 'vue';
import router from '@/router';
import MeansAnalysis from './component/MeansAnalysis.vue';
import ResourceAnalysis from './component/ResourceAnalysis.vue'
import AdvantagesAnalysis from './component/AdvantagesAnalysis.vue'
const page = ref('首页');
const pageList = ['首页', '科技动向感知', '中美博弈概览'];
const handleClickHeader = (value) => {
page.value = value
if(value === '首页' || value === '中美博弈概览') {
router.push({
path: '/overview'
})
}
}
const technologicalTrends = ref({
image: '/testData/gjOverPreview-data-1.png',
imageTitle: {
......
......@@ -68,7 +68,10 @@
</div>
</div>
<div class="home-main-header-card-box">
<div class="home-main-header-card-box-box1 card" @click="handleClickCardToDetail(sortInfo[1]?.sortCode)">
<div
class="home-main-header-card-box-box1 card"
@click="handleClickCardToDetail(sortInfo[1]?.sortCode, sortInfo[1]?.sortName)"
>
<div class="header">
<div class="header-left">{{ sortInfo[1]?.sortName }}</div>
<div class="header-right">{{ `${sortInfo[1]?.sortCount}项` }}</div>
......@@ -80,7 +83,10 @@
</div>
</div>
</div>
<div class="home-main-header-card-box-box2 card" @click="handleClickCardToDetail(sortInfo[2]?.sortCode)">
<div
class="home-main-header-card-box-box2 card"
@click="handleClickCardToDetail(sortInfo[2]?.sortCode, sortInfo[2]?.sortName)"
>
<div class="header">
<div class="header-left">{{ sortInfo[2]?.sortName }}</div>
<div class="header-right">{{ `${sortInfo[2]?.sortCount}项` }}</div>
......@@ -92,7 +98,10 @@
</div>
</div>
</div>
<div class="home-main-header-card-box-box3 card" @click="handleClickCardToDetail(sortInfo[0]?.sortCode)">
<div
class="home-main-header-card-box-box3 card"
@click="handleClickCardToDetail(sortInfo[0]?.sortCode, sortInfo[0]?.sortName)"
>
<div class="header">
<div class="header-left">{{ sortInfo[0]?.sortName }}</div>
<div class="header-right">{{ `${sortInfo[0]?.sortCount}项` }}</div>
......@@ -291,7 +300,7 @@
</div>
<div class="box4-main">
<div class="box4-main-item" v-for="(item, index) in messageList" :key="index">
<div class="left" @click="handleClickPerson()">
<div class="left" @click="handleClickPerson(item)">
<img :src="item.personImage ? item.personImage : DefaultUserIcon" alt="" />
</div>
<div class="right">
......@@ -694,6 +703,7 @@ const handleClickToDetail = () => {
console.log("当前 Carousel 激活索引:", activeIndex);
const id = box1DataList.value[activeIndex].SEARCHSORT;
window.sessionStorage.setItem("curTabName", id + "调查概览");
const route = router.resolve({
path: "/marketAccessLayout",
......@@ -704,15 +714,16 @@ const handleClickToDetail = () => {
window.open(route.href, "_blank");
};
const handleClickCardToDetail = (id) => {
const route = router.resolve({
const handleClickCardToDetail = (id, name) => {
window.sessionStorage.setItem("curTabName", name);
const route = router.resolve({
path: "/marketAccessLayout",
query: {
id: id
}
});
window.open(route.href, "_blank");
}
};
// 切换当前调查
const handleSwithCurSurvey = name => {
......@@ -823,6 +834,8 @@ const handleGetBox4Data = async () => {
};
// 点击人物头像,跳转到人物主页
const handleClickPerson = () => {
window.sessionStorage.setItem("curTabName", item.personName);
const route = router.resolve({
path: "/characterPage",
query: {
......
......@@ -110,7 +110,7 @@
<div class="legend-icon" style="background-color:#14A8A8 ;">
</div>
<div>
政令
政令
</div>
<div>
14个
......@@ -243,7 +243,7 @@ const totalDistribution = ref([
color: ["#9AC8FF", "#BCDCFF", "#E7F4FF", "#0F5EDB"]
},
{
titlle: "政令",
titlle: "政令",
value: 20,
text: "1626",
unit: "个",
......
......@@ -64,7 +64,7 @@
<div class="right">
<div class="card-box">
<div class="footer-card" v-for="(item, index) in curFooterList" :key="index"
@click="handleToReportDetail(item.id)">
@click="handleToReportDetail(item)">
<div class="footer-card-top">
<img :src="item.imageUrl" alt="" />
</div>
......@@ -116,11 +116,12 @@ const router = useRouter();
const searchReport = ref('')
const handleToReportDetail = (id) => {
const handleToReportDetail = (item) => {
window.sessionStorage.setItem('curTabName', item.name)
const route = router.resolve({
name: 'ReportDetail',
params: {
id: id
id: item.id
}
});
window.open(route.href, "_blank");
......
......@@ -11,7 +11,7 @@
</div>
</div>
<div class="home-main-header-center">
<el-input v-model="searchThinktankText" style="width: 838px; height: 100%" placeholder="搜索智库报告" />
<el-input v-model="searchThinktankText" @keyup.enter="handleSearch" style="width: 838px; height: 100%" placeholder="搜索智库报告" />
<div class="search">
<div class="search-icon">
<img src="./assets/images/search-icon.png" alt="" />
......@@ -493,7 +493,7 @@
class="footer-card"
v-for="(item, index) in curFooterList"
:key="index"
@click="handleToReportDetail(item.id)"
@click="handleToReportDetail(item)"
>
<div class="footer-card-top">
<img :src="item.imageUrl" alt="" />
......@@ -710,6 +710,7 @@ const handleClickToDetail = () => {
};
const toDetaile = () => {
window.sessionStorage.setItem("curTabName", box1Data.value[box1DataIndex.value].reportName);
const route = router.resolve({
name: "ReportDetail",
params: {
......@@ -1521,6 +1522,7 @@ const handleGetetThinkTankReport = async () => {
const handleClick = tank => {
console.log(tank);
window.sessionStorage.setItem("curTabName", tank.name+'概览');
// router.push({ name: "ThinkTankDetail", params: { id: tank.id } });
if (!tank.id) {
ElMessage.warning("当前智库id为空,无法进入详情页");
......@@ -1585,6 +1587,7 @@ const handleClickPerson = async item => {
ElMessage.warning("找不到当前人员的类型值!");
return;
}
window.sessionStorage.setItem("curTabName", item.personName);
const route = router.resolve({
path: "/characterPage",
query: {
......@@ -1616,17 +1619,19 @@ const handleToNewsAnalysis = news => {
window.open(route.href, "_blank");
};
const handleToReportDetail = id => {
const handleToReportDetail = item => {
window.sessionStorage.setItem("curTabName", item.name);
const route = router.resolve({
name: "ReportDetail",
params: {
id: id
id: item.id
}
});
window.open(route.href, "_blank");
};
const handleSearch = () => {
window.sessionStorage.setItem("curTabName", `搜索-${searchThinktankText.value}`);
const curRoute = router.resolve({
path: "/searchResults",
query: {
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论