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

update

<template>
<div id="app">
<div class="wrapper">
<div class="pro-wrapper">
<div class="navbar">
<div class="nav-brand">
<div class="brand-icon">
......@@ -142,8 +142,12 @@ body {
<style lang="scss" scoped>
#app {
font-family: "Helvetica Neue", Helvetica, "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "微软雅黑", Arial, sans-serif;
width: 100%;
}
.pro-wrapper {
width: 100vw;
height: 100vh;
<<<<<<< HEAD
// overflow-y: hidden;
}
......@@ -200,6 +204,41 @@ body {
.brand-text {
cursor: pointer;
.text-ch {
height: 37px;
=======
position: relative;
overflow: hidden;
.navbar {
display: flex;
justify-content: center;
align-items: center;
background: #fff;
>>>>>>> c1d8a1e364a6650ee4e3e5b1049b0a673ec53337
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;
.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-text {
cursor: pointer;
.text-ch {
height: 37px;
color: rgba(10, 18, 30, 1);
......@@ -216,52 +255,10 @@ body {
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;
}
.dropdown-arrow {
font-size: 12px;
margin-left: 4px;
transition: transform 0.3s;
}
.home-dropdown:hover .dropdown-arrow {
transform: rotate(180deg);
}
}
}
.user-info {
.user-info {
display: flex;
align-items: center;
gap: 20px;
......@@ -298,10 +295,14 @@ body {
font-weight: 400;
line-height: 30px;
}
}
.wrapper {
}
}
.main-container {
width: 100%;
height: calc(100vh - 72px);
position: relative;
overflow: hidden;
}
.ai-btn {
position: absolute;
bottom: 240px;
......@@ -337,5 +338,4 @@ body {
z-index: 9999;
}
}
</style>
......@@ -36,6 +36,18 @@ export function getDecreeOrganization(params) {
})
}
// 发布机构
/**
* @param {id}
*/
export function getDecreeIssueOrganization(params) {
return request({
method: 'GET',
url: `/api/administrativeOrderInfo/issueOrganization/${params.id}`,
params
})
}
// 获取全局信息
/**
* @param {id}
......
......@@ -94,6 +94,14 @@ export function getResearchFieldSubjectType(params) {
params
})
}
// 获取行业领域列表
export function getAreaType() {
return request({
method: 'GET',
url: `/api/commonDict/areaType`,
})
}
/***********详情页 */
//创新主体详情:基本信息
export function getInfo(params) {
......@@ -150,6 +158,14 @@ export function getPaperList(params) {
})
}
//创新主体科研实力:领域实力分布
export function getStudyFieldList(params) {
return request({
method: 'GET',
url: `/api/innovateSubject/studyFieldList/${params.id}`,
})
}
//创新主体科研实力:经费增长情况
export function getFundGrowth(params) {
return request({
......@@ -177,3 +193,65 @@ export function getFundToList(params) {
})
}
//合作情况:与中国合作数量变化
export function getCooperateNumWithChina(params) {
return request({
method: 'GET',
url: `/api/innovateSubject/cooperateNumWithChina/${params.id}`,
params
})
}
// 合作情况:与中国合作类型变化
export function getCooperateTypeWithChina(params) {
return request({
method: 'GET',
url: `/api/innovateSubject/cooperateTypeWithChina/${params.year}/${params.id}`,
params
})
}
// 合作情况:与中国合作领域变化
export function getCooperateAreaWithChina(params) {
return request({
method: 'GET',
url: `/api/innovateSubject/cooperateAreaWithChina/${params.id}`,
params
})
}
//合作情况:与中国合作经费变化
export function getCooperateFundWithChina(params) {
return request({
method: 'GET',
url: `/api/innovateSubject/cooperateFundWithChina/${params.id}`,
params
})
}
//合作情况:与中国合作事例
export function getCooperateExampleWithChina(params) {
return request({
method: 'GET',
url: `/api/innovateSubject/cooperateExampleWithChina/${params.id}`,
params
})
}
//创新主体其他情况:重点实验室
export function getLabList(params) {
return request({
method: 'GET',
url: `/api/innovateSubject/labList/${params.id}`,
})
}
//创新主体其他情况:政策文件
export function getPolicyList(params) {
return request({
method: 'GET',
url: `/api/innovateSubject/policyList/${params.id}`,
params
})
}
\ No newline at end of file
<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"
@mouseenter="handleIsShowCountryMore(true)"
@mouseleave="handleIsShowCountryMore(false)"
>
<div class="menu-item-icon1">
<img src="@/assets/icons/home-header-icon2.png" alt="" />
</div>
......@@ -31,14 +36,138 @@
<div class="menu-item-text">{{ "事件" }}</div>
</div>
</div>
<div
class="more-wrapper"
v-if="isShowCountryMore"
@mouseenter="handleIsShowCountryMore(true)"
@mouseleave="handleIsShowCountryMore(false)"
>
<div class="left">
<div class="left-header">
<div class="title">{{ "中美科技博弈概览" }}</div>
<div class="icon">
<img src="@/assets/icons/more.png" alt="" />
</div>
</div>
<div class="left-main">
<div class="item" v-for="(item, index) in leftList" :key="index" @click="handleClickItem(item)">
<div class="icon"></div>
<div class="text">{{ item.name }}</div>
</div>
</div>
</div>
<div class="right">
<div class="right-header">
<div class="title">{{ "风险检测" }}</div>
<div class="icon">
<img src="@/assets/icons/more.png" alt="" />
</div>
</div>
<div class="right-main">
<div class="item" v-for="(item, index) in rightList" :key="index">
<div class="icon"></div>
<div class="text">{{ item.name }}</div>
</div>
</div>
</div>
</div>
</template>
<script setup>
import { ref, onMounted } from "vue";
import router from "@/router";
const isShowCountryMore = ref(false);
const handleIsShowCountryMore = isShow => {
isShowCountryMore.value = isShow;
};
const handleToOverview = () => {
router.push({
path: "/overview"
});
};
const handleToGjOverview = () => {
router.push({
path: "/gjOverview"
});
};
const leftList = ref([
{
name: "科技法案",
path: "/billHome"
},
{
name: "政令",
path: "/decree"
},
{
name: "美国科技智库",
path: "/thinkTank"
},
{
name: "出口管制",
path: "/exportControl"
},
{
name: "投融资限制",
path: "/finance"
},
{
name: "市场准入限制",
path: "/marketAccessRestrictions"
},
{
name: "合作限制",
path: "/cooperationRestrictions"
},
{
name: "规则限制",
path: "/ruleRestrictions"
},
{
name: "美国主要创新主体",
path: "/innovationSubject"
},
{
name: "美国科技人物观点",
path: "/technologyFigures"
},
{
name: "美国科研资助体系",
path: "/scientificFunding"
}
]);
const handleClickItem = item => {
const curRoute = router.resolve({
path: item.path
});
window.open(curRoute.href, "_blank");
};
const rightList = ref([
{
name: "科技战略布局",
path: ""
},
{
name: "创新体系位势分析",
path: ""
}
]);
</script>
<style lang="scss" scoped>
.menu-wrapper {
width: 644px;
height: 64px;
display: flex;
justify-content: space-between;
.menu-item {
display: flex;
gap: 11px;
......@@ -46,6 +175,10 @@
height: 64px;
justify-content: center;
align-items: center;
cursor: pointer;
&:hover {
background: var(--color-main-active);
}
.menu-item-icon {
// margin-top: 2px;
width: 22px;
......@@ -104,4 +237,162 @@
}
}
}
.more-wrapper {
position: absolute;
z-index: 99999;
top: 64px;
left: 0;
width: 100%;
height: 299px;
background: #fff;
display: flex;
.left {
margin-top: 35px;
margin-left: 179px;
width: 769px;
height: 218px;
.left-header {
display: flex;
height: 26px;
align-items: center;
.title {
width: 160px;
height: 26px;
color: var(--color-main-active);
font-family: Microsoft YaHei;
font-style: Bold;
font-size: 20px;
font-weight: 700;
line-height: 26px;
letter-spacing: 0px;
text-align: left;
}
.icon {
margin-top: -8px;
margin-left: 8px;
width: 10px;
height: 10px;
img {
width: 100%;
height: 100%;
}
}
}
.left-main {
height: 192px;
display: flex;
flex-wrap: wrap;
.item {
margin-top: 18px;
display: flex;
width: 256px;
height: 36px;
align-items: center;
cursor: pointer;
&:hover {
background: var(--color-bg-hover);
.icon {
background: var(--color-main-active) !important;
}
.text {
color: var(--color-main-active) !important;
font-weight: 700;
font-size: 20px;
}
}
.icon {
width: 6px;
height: 6px;
border-radius: 3px;
background: rgba(95, 101, 108, 1);
}
.text {
margin-left: 10px;
height: 24px;
color: rgba(95, 101, 108, 1);
font-family: Microsoft YaHei;
font-style: Regular;
font-size: 18px;
font-weight: 400;
line-height: 24px;
letter-spacing: 0px;
text-align: left;
}
}
}
}
.right {
margin-top: 35px;
margin-left: 53px;
width: 192px;
height: 116px;
.right-header {
display: flex;
height: 26px;
align-items: center;
.title {
width: 80px;
height: 26px;
color: var(--color-main-active);
font-family: Microsoft YaHei;
font-style: Bold;
font-size: 20px;
font-weight: 700;
line-height: 26px;
letter-spacing: 0px;
text-align: left;
}
.icon {
margin-top: -8px;
margin-left: 8px;
width: 10px;
height: 10px;
img {
width: 100%;
height: 100%;
}
}
}
.right-main {
.item {
margin-top: 18px;
display: flex;
width: 256px;
height: 36px;
align-items: center;
cursor: pointer;
&:hover {
background: var(--color-bg-hover);
.icon {
background: var(--color-main-active) !important;
}
.text {
color: var(--color-main-active) !important;
font-weight: 700;
font-size: 20px;
}
}
.icon {
width: 6px;
height: 6px;
border-radius: 3px;
background: rgba(95, 101, 108, 1);
}
.text {
margin-left: 10px;
height: 24px;
color: rgba(95, 101, 108, 1);
font-family: Microsoft YaHei;
font-style: Regular;
font-size: 18px;
font-weight: 400;
line-height: 24px;
letter-spacing: 0px;
text-align: left;
}
}
}
}
}
</style>
\ No newline at end of file
......@@ -24,8 +24,7 @@ router.beforeEach((to, from, next) => {
if (to.meta.title) {
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
......
......@@ -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: "报告原文"
// }
},
]
......
......@@ -220,6 +220,7 @@ const handleClickEvent = item => {
// 跳转人员详情
const handleClickUser = item => {
window.sessionStorage.setItem('curTabName', item.name)
const routeData = router.resolve({
path: "/characterPage",
query: {
......
......@@ -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: {
......@@ -950,6 +961,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: {
......@@ -963,6 +975,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");
};
......@@ -1690,6 +1703,7 @@ const footerSelect2 = ref("全部提出议员");
// ]);
const handleSearch = () => {
window.sessionStorage.setItem("curTabName", `搜索-${searchBillText.value}`);
const curRoute = router.resolve({
path: "/searchResults",
query: {
......@@ -1746,7 +1760,7 @@ onUnmounted(() => {
}
.home-wrapper {
width: 100%;
height: calc(100vh - 96px);
height: 100%;
position: relative;
overflow-y: hidden;
.search-header {
......
......@@ -174,7 +174,7 @@
</div>
<div class="info-box">
<div class="info-left">
<img :src="defaultAvatar" alt="" @click="handleClickAvatar(curPerson.id)"/>
<img :src="defaultAvatar" alt="" @click="handleClickAvatar(curPerson)"/>
<div class="usr-icon1">
<img src="./assets/images/usr-icon1.png" alt="" />
</div>
......@@ -358,11 +358,12 @@ const route = useRoute();
const router = useRouter();
// 跳转到人物页面
const handleClickAvatar = id => {
const handleClickAvatar = item => {
window.sessionStorage.setItem('curTabName', item.name)
const routeData = router.resolve({
path: "/characterPage",
query: {
personId: id
personId: item.id
}
});
window.open(routeData.href, "_blank");
......
......@@ -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">
......@@ -166,7 +166,7 @@ const tabList = ref([
{
name: "新闻",
id: 8
},
}
// {
// name: "社媒",
// id: 9
......@@ -304,8 +304,10 @@ const handleSearch = async () => {
} catch (error) {}
};
const handleToPage = async (item) => {
if(item.typeStr === '人物') {
const handleToPage = async item => {
console.log("item", item);
if (item.typeStr === "人物") {
const personTypeList = JSON.parse(window.sessionStorage.getItem("personTypeList"));
let type = 0;
let personTypeName = "";
......@@ -356,6 +358,7 @@ const handleToPage = async (item) => {
}
} catch (error) {}
}
window.sessionStorage.setItem("curTabName", item.originalTitle);
let curRoute;
switch (item.typeStr) {
case "法案":
......@@ -487,7 +490,7 @@ onMounted(() => {
}
.wrapper {
width: 100%;
height: calc(100vh - 96px);
height: 100%;
background: url("../assets/images/background.png") no-repeat;
background-size: 100% 100%;
.header {
......
......@@ -43,7 +43,9 @@
<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)"
v-for="(field, fIndex) in typeof item.AREA === 'string'
? item.AREA.split(',')
: item.AREA"
:key="fIndex"
class="ul-pie"
:class="'cl' + ((fIndex % 3) + 1)"
......@@ -178,7 +180,7 @@ const handleNext = () => {
};
// 轮播切换回调
const handleCarouselChange = (index) => {
const handleCarouselChange = index => {
activeIndex.value = index;
};
......@@ -192,13 +194,15 @@ const mainTrend = computed(() => {
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");
};
......
......@@ -61,8 +61,8 @@
<div class="right-top">
<img class="img1" src="./assets/bluetitle.png" alt="" />
<div class="right-top-title">背景分析</div>
<div class="btn cl1" :class="{'active': active === '涉华背景'}" @click="active = '涉华背景'">涉华背景</div>
<div class="btn cl2" :class="{'active': active === '全部背景'}" @click="active = '全部背景'">全部背景</div>
<div class="btn cl1" :class="{ active: active === '涉华背景' }" @click="active = '涉华背景'">涉华背景</div>
<div class="btn cl2" :class="{ active: active === '全部背景' }" @click="active = '全部背景'">全部背景</div>
<div class="right-top-content">
<div v-for="(item, index) in filteredBackgroundList" :key="index" class="right-top-item">
<span class="id">{{ index + 1 }}</span>
......@@ -367,8 +367,8 @@ const dataList3 = ref([
{
id: 5,
name: "本公告发布日起不迟于 90 天内,司法部长与国土安全部长应通过总统国家安全事务助理共同向总统提交建议,决定是否延长或续期本公告第 1 条中暂停和限制入境的条款符合美国利益。"
},
])
}
]);
</script>
<style lang="scss" scoped>
......@@ -388,6 +388,9 @@ const dataList3 = ref([
padding: 19px 0 20px;
background: rgba(255, 255, 255, 1);
box-shadow: 0px 0px 20px 0px rgba(25, 69, 130, 0.1);
position: sticky;
top: 0;
z-index: 99999999;
.nav-main {
width: 1600px;
height: 81px;
......
......@@ -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: {
......@@ -1313,7 +1321,7 @@ onMounted(async () => {
}
.home-wrapper {
width: 100%;
height: calc(100vh - 96px);
height: 100%;
position: relative;
overflow-y: hidden;
.search-header {
......@@ -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);
window.sessionStorage.setItem('curTabName', item.totalTitle)
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>
......@@ -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,19 +262,16 @@ 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;
width: 100%;
height: 100%;
overflow: hidden;
overflow-y: auto;
.report {
padding: 10px 150px;
position: absolute;
......@@ -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%;
......
......@@ -246,6 +246,7 @@ const handleMouseMove = event => {
};
const handleToBillDetail = item => {
window.sessionStorage.setItem('curTabName', item.title)
const route = router.resolve({
path: "/billLayout",
query: {
......
......@@ -104,9 +104,8 @@ onMounted(() => {
});
onUnmounted(() => {
window.sessionStorage.removeItem('institutionActiveTabName')
})
window.sessionStorage.removeItem("institutionActiveTabName");
});
</script>
<style lang="scss" scoped>
......@@ -139,6 +138,9 @@ onUnmounted(() => {
}
.header-right {
margin-left: 24px;
width: 1350px;
overflow: hidden;
overflow-y: auto;
.title {
margin-top: 26px;
height: 42px;
......@@ -149,6 +151,9 @@ onUnmounted(() => {
line-height: 42px;
letter-spacing: 0px;
text-align: left;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.en-title {
margin-top: 8px;
......@@ -160,10 +165,12 @@ onUnmounted(() => {
line-height: 24px;
letter-spacing: 0px;
text-align: left;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.desc {
margin-top: 6px;
height: 24px;
color: rgba(59, 65, 75, 1);
font-family: Microsoft YaHei;
font-size: 16px;
......
......@@ -794,6 +794,7 @@ const handleToPosi = id => {
// 跳转到单项制裁页面
const handleToRiskSignalDetail = item => {
window.sessionStorage.setItem("curTabName", item.title);
const routeData = router.resolve({
path: "/exportControl/singleSanction",
query: {
......@@ -856,6 +857,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: {
......@@ -872,6 +874,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: {
......@@ -1052,6 +1055,7 @@ const processYearDomainCountData = yearDomainCountData => {
const handleEntityClick = item => {
console.log("item", item);
window.sessionStorage.setItem("curTabName", item.name || item.entityNameZh);
const route = router.resolve({
name: "companyPages",
params: {
......@@ -1101,6 +1105,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: {
......@@ -1566,6 +1574,7 @@ const fetchNewsInfo = async () => {
const handlePerClick = item => {
// console.log("点击了社交媒体消息:", item);
window.sessionStorage.setItem("curTabName", item.name);
const route = router.resolve({
path: "/characterPage",
query: {
......@@ -1654,6 +1663,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: {
......@@ -1698,6 +1708,7 @@ const handleSwithCurPolicy = name => {
};
const handleSearch = () => {
window.sessionStorage.setItem("curTabName", `搜索-${searchExportControlText.value}`);
const curRoute = router.resolve({
path: "/searchResults",
query: {
......@@ -2239,7 +2250,7 @@ const handleMediaClick = item => {
.home-wrapper {
width: 100%;
height: calc(100vh - 96px);
height: 100%;
position: relative;
overflow-y: hidden;
......
......@@ -201,6 +201,7 @@ const handlePerClick = item => {
// 处理点击实体名称的方法
const handleClick = item => {
// console.log("点击了实体名称:", item);
window.sessionStorage.setItem("curTabName", `${item.year}-${item.date}《${item.name}》`);
const route = router.resolve({
path: "/exportControl/singleSanction",
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: {
......
......@@ -40,15 +40,15 @@
</template>
<script setup>
import { ref } from 'vue'
import { ref } from "vue";
import sanctionsOverview from "./components/sanctionsOverview/index.vue"
import dataStatistics from "./components/dataStatistics/index.vue"
import deepMining from "./components/deepMining/index.vue"
import impactAnalysis from "./components/impactAnalysis/index.vue"
import sanctionsOverview from "./components/sanctionsOverview/index.vue";
import dataStatistics from "./components/dataStatistics/index.vue";
import deepMining from "./components/deepMining/index.vue";
import impactAnalysis from "./components/impactAnalysis/index.vue";
import title from "./assets/title.png"
import icon01 from "./assets/icon01.png"
import title from "./assets/title.png";
import icon01 from "./assets/icon01.png";
import icon1 from "../assets/icons/icon1.png";
import icon1Active from "../assets/icons/icon1_active.png";
import icon5 from "../assets/icons/icon5.png";
......@@ -58,7 +58,6 @@ import icon2Active from "../assets/icons/icon2_active.png";
import icon3 from "../assets/icons/icon3.png";
import icon3Active from "../assets/icons/icon3_active.png";
const headerTitle = ref({
// img: title,
// title: "实体清单",
......@@ -96,28 +95,25 @@ const headerNavList = ref([
img: icon2,
imgActive: icon2Active,
title: "深度挖掘"
},
}
// {
// img: icon3,
// imgActive: icon3Active,
// title: "影响分析"
// }
])
]);
</script>
<style scoped lang="scss">
*{
* {
margin: 0;
padding: 0;
}
.entity-list{
.entity-list {
width: 100%;
height: 100%;
overflow-y: auto;
.header{
.header {
width: 100%;
height: 148px;
background-color: #fff;
......@@ -126,7 +122,7 @@ const headerNavList = ref([
top: 0;
z-index: 1000;
box-shadow: 0px 4px 10px rgba(0, 0, 0, 0.05);
.header-title{
.header-title {
width: 1601px;
height: 72px;
background-color: rgba(246, 250, 255, 1);
......@@ -230,11 +226,11 @@ const headerNavList = ref([
}
}
}
.main{
.main {
width: 100%;
height: auto;
min-height: calc(100% - 148px);
background-color: #F7F8F9;
background-color: #f7f8f9;
}
}
</style>
......@@ -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");
};
......@@ -208,6 +209,7 @@ const handleCompClick = item => {
// 跳转发布机构详情页
const handleClickDp = () => {
// console.log("点击了发布机构:", props.data);
window.sessionStorage.setItem('curTabName', props.data.postOrgName)
const route = router.resolve({
path: "/institution",
query: {
......@@ -366,6 +368,7 @@ const props = defineProps({
});
// 跳转到人物页
const handleClick = () => {
window.sessionStorage.setItem("curTabName", props.data.postPersonName)
const route = router.resolve({
path: "/characterPage",
query: {
......@@ -1008,6 +1011,7 @@ onMounted(() => {
line-height: 24px;
font-family: "Microsoft YaHei";
color: rgba(59, 65, 75, 1);
cursor: pointer;
}
}
......
......@@ -1685,7 +1685,7 @@ onMounted(async () => {
.home-wrapper {
width: 100%;
height: calc(100vh - 96px);
height: 100%;
position: relative;
overflow-y: hidden;
.home-main {
......
......@@ -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: {
......
......@@ -361,8 +361,9 @@
</div>
</div>
<div class="select-box">
<el-select v-model="value" placeholder="全部领域" style="width: 120px">
<el-option v-for="item in areaList" :key="item.value" :label="item.label" :value="item.value" />
<el-select v-model="areaSelect" placeholder="全部领域" style="width: 120px"
@change="handleFindListBySubjectTypeId">
<el-option v-for="item in areaList" :key="item.id" :label="item.name" :value="item.id" />
</el-select>
</div>
</div>
......@@ -415,6 +416,7 @@ import getCalendarHeatChart from "./utils/cleandarHeat";
import EChart from "@/components/Chart/index.vue";
import { pieOption, raderOption } from "./utils/charts";
import {
getAreaType,
getNews,
getSocialMediaInfo,
getBillRiskSignal,
......@@ -973,6 +975,19 @@ const areaList = ref([
value: "全部领域"
}
]);
const areaSelect = ref([])
//获取行业领域列表
const handleGetAreaType = async () => {
try {
const res = await getAreaType();
console.log("行业领域列表 ", res);
if (res.code === 200 && res.data) {
areaList.value = res.data
}
} catch (error) {
console.error("获取行业领域列表 error", error);
}
};
const categoryList1 = ref(["研究型大学", "国家实验室", "科技企业", "国防承包商"]);
const activeCate1 = ref('');
......@@ -1005,7 +1020,7 @@ const handleFindListBySubjectTypeId = async () => {
try {
let params = {
subjectTypeId: activeCate1.value,
// arealist:
arealist: areaSelect.value,
currentPage: currentPage.value,
pageSize: 16,
......@@ -1040,6 +1055,7 @@ const handleToPosi = id => {
};
onMounted(async () => {
handleGetAreaType()
handleGetNews()
handleGetSocialMediaInfo()
handleGetBillRiskSignal()
......@@ -1063,7 +1079,7 @@ onMounted(async () => {
.home-wrapper {
width: 100%;
height: calc(100vh - 96px);
height: 100%;
position: relative;
overflow-y: hidden;
......
<template>
<div class="timeline-wrapper">
<button class="arrow left" :disabled="index <= 0" @click="index--">
{{ '<' }} </button>
<div class="timeline-box">
<div class="line"></div>
<div v-for="(item, i) in showList" :key="item[idKey]" class="node" :style="leftOffset(i)">
<div class="node" :style="leftOffset(i)">
<div class="time">
{{ item.cooperateDate }}
</div>
<!-- 圆环 -->
<div class="dot" :class="linePos(i, flip)"></div>
<!-- 卡片:放到线右侧 -->
<div class="card" :class="[cardPos(i, flip), 'right-side']" @click="$emit('click-card', item)">
<div class="tag">
{{ item.typeName }}
</div>
<div class="title">
{{ '合作主体:' + item.subjectlist.join(',') }}
<img class="item-header-icon" src="@/assets/images/icon/copy.png" style="cursor: pointer;" />
</div>
<div class="content">
{{ item.cooperateName }}
</div>
</div>
</div>
</div>
</div>
<button class="arrow right" :disabled="index >= total - 5" @click="index++">
{{ '>' }}
</button>
</div>
</template>
<script>
export default {
name: 'TimeLine',
props: {
data: { // 父组件传入的数组
type: Array,
required: true
},
textKey: { // 要显示的文本字段
type: String,
default: 'text'
},
idKey: { // 唯一标识字段
type: String,
default: 'id'
}
},
data() {
return { index: 0 };
},
computed: {
total() {
return this.data.length;
},
showList() {
return this.data.slice(this.index, this.index + 5);
},
flip() { return this.index % 2 === 1; }
},
methods: {
leftOffset(i) {
return { left: `${(i * 100) / 5}%` };
},
/* 上下层翻转(保留上次逻辑) */
cardPos(i, flip = false) {
// return (i % 2) ^ flip ? 'down' : 'up';
return 'down';
},
/* 线延伸方向 = 卡片出现方向 */
linePos(i, flip = false) {
return this.cardPos(i, flip); // up / down
}
}
};
</script>
<style scoped>
/* 样式与之前完全一致,不再重复 */
.timeline-wrapper {
display: flex;
align-items: center;
width: 100%;
position: relative;
padding: 0 40px;
}
.arrow {
position: absolute;
top: 45px;
/* 左右切换按钮 */
width: 24px;
height: 48px;
font-size: 24px;
border-color: #E7F3FF;
border: 0;
background: #E7F3FF;
cursor: pointer;
z-index: 10;
color: #3E84D1;
}
.arrow:disabled {
color: #c0c4cc;
cursor: not-allowed;
}
.left {
left: 0;
border-radius: 0px 4px 4px 0px;
}
.right {
right: 0;
border-radius: 4px 0px 0px 4px;
}
.timeline-box {
flex: 1;
height: 100%;
position: relative;
}
.line {
position: absolute;
left: 0;
right: 0;
top: 50%;
height: 6px;
background-image: url("@/assets/images/bg/timeLine-bg.jpg");
transform: translateY(-50%);
background-size: auto 100%;
}
.node {
position: absolute;
top: 50%;
transform: translate(-50%, -50%);
z-index: 2;
}
/* ===== 圆环基础 ===== */
.dot {
top: -30px;
width: 14px;
height: 14px;
border-radius: 50%;
border: 3px solid #409eff;
background: #fff;
position: relative;
margin: 0 auto;
z-index: 2;
}
/* ===== 延伸线 ===== */
.dot::after {
content: '';
position: absolute;
left: 50%;
transform: translateX(-1px);
/* 居中细线 */
width: 1px;
background: #409eff;
}
/* 向上节点:线往下伸 */
.dot.up::after {
bottom: 100%;
height: 165px;
/* 圆环底部 → 卡片顶 */
}
/* 向下节点:线往上伸 */
.dot.down::after {
top: 100%;
height: 165px;
}
.card {
position: absolute;
padding: 8px 12px;
text-align: left;
cursor: pointer;
font-size: 14px;
/* 容器 299 */
width: 273px;
height: 210px;
border-radius: 4px;
/* 业务系统/模块阴影 */
box-shadow: 0px 0px 20px 0px rgba(25, 69, 130, 0.1);
background: var(--主色/白色主色, rgba(255, 255, 255, 1));
}
.time {
width: 125px;
color: rgba(5, 95, 194, 1);
font-family: Microsoft YaHei;
font-size: 20px;
font-weight: 700;
line-height: 26px;
letter-spacing: 0px;
text-align: justify;
margin-bottom: 35px;
margin-left: 125px;
}
.title {
color: rgba(59, 65, 75, 1);
height: 85px;
font-family: Microsoft YaHei;
font-style: Regular;
font-size: 18px;
font-weight: 400;
line-height: 24px;
letter-spacing: 0px;
text-align: left;
}
.content {
color: rgba(59, 65, 75, 1);
font-family: Microsoft YaHei;
font-style: Bold;
font-size: 18px;
font-weight: 700;
line-height: 24px;
letter-spacing: 0px;
text-align: left;
}
.card.up {
bottom: 20px;
}
.card.down {
top: 55px;
left: 115px;
}
</style>
\ No newline at end of file
......@@ -65,8 +65,8 @@
</div>
</div>
</div>
<div class="statisticsChart">
<Echarts :option="raderOption1" height="100%"></Echarts>
<div class="statisticsChart" v-if="studyFieldList.length > 0">
<Echarts :option="raderOption1(studyFieldList)" height="100%"></Echarts>
</div>
<div class="statisticsAI">
<div class="AIbox">
......@@ -167,7 +167,7 @@ import Echarts from "@/components/Chart/index.vue";
import { barOption, lineChart, raderOption1, lineChart1, pieOption1, horizontalBaroption } from "../../utils/charts.js";
import {
getPatentList,
getPaperList, getFundGrowth, getFundFromList, getFundToList
getPaperList, getFundGrowth, getFundFromList, getFundToList, getStudyFieldList
} from "@/api/innovationSubject/overview.js";
import { useRouter } from "vue-router";
const router = useRouter();
......@@ -221,6 +221,22 @@ const handleGetFundGrowth = async () => {
}
};
//创新主体科研实力:领域实力分布
const studyFieldList = ref([])
const handleGetStudyFieldList = async () => {
try {
let params = {
id: router.currentRoute._value.params.id
}
const res = await getStudyFieldList(params);
console.log("领域实力分布", res);
if (res.code === 200 && res.data) {
studyFieldList.value = res.data
}
} catch (error) {
console.error("获取领域实力分布error", error);
}
};
//经费来源
const fundFromList = ref([])
const handleGetFundFromList = async () => {
......@@ -256,9 +272,11 @@ const handlegGetFundToList = async () => {
};
onMounted(async () => {
handleGetFundGrowth()
handleGetPatentList()
handleGetPaperList()
handleGetFundGrowth()
handleGetStudyFieldList()
handleGetFundFromList()
handlegGetFundToList()
});
......
......@@ -223,45 +223,8 @@ export const raderOption = (data) => {
return option;
}
export const raderOption1 = {
grid: {
top: '3%',
right: '3%',
bottom: '1%',
left: '1%',
containLabel: true
},
radar: {
radius: '60%', // 关键:缩小整个雷达
indicator: [
{ name: '能源领域', max: 6500 },
{ name: '集成电路', max: 16000 },
{ name: '人工智能', max: 30000 },
{ name: '通信网络', max: 38000 },
{ name: '量子科技', max: 52000 },
{ name: '生物科技', max: 25000 }
],
axisName: {
formatter: '{value}',
color: 'rgba(59, 65, 75, 1)',
fontSize: 16,
fontWeight: 700
}
},
series: [
{
name: 'Budget vs spending',
type: 'radar',
data: [
{
value: [4200, 3000, 20000, 35000, 50000, 18000],
name: '哈佛大学',
areaStyle: { color: 'rgba(179, 127, 235, 0.1)' }
}
]
}
]
};
export const barOption = (data) => {
// 提取年份和对应的专利数量
const years = data.map(item => item.year.toString());
......@@ -344,7 +307,6 @@ export const barOption = (data) => {
]
};
return option;
}
export const lineChart = (data) => {
// 提取年份和对应的专利数量
......@@ -549,3 +511,57 @@ export const horizontalBaroption = (data) => {
};
return option;
}
export const raderOption1 = (data) => {
// 提取指标名称和对应的值
const indicatorNames = data.map(item => item.areaName);
const indicatorValues = data.map(item => item.areaValue);
// 动态生成雷达图的 indicator 配置
const indicators = indicatorNames.map((name, index) => ({
name,
max: Math.max(...indicatorValues) * 1.2 // 设置最大值为所有值的最大值的1.2倍
}));
let radarData = {
color:
"rgba(215, 27, 56, 0.2)",
name: '',
value: indicatorValues
}
console.log(indicators, 'indicators', radarData, 'radarDataradarData')
// 雷达图配置
const option = {
title: { text: '' },
legend: {
icon: 'circle',
orient: 'vertical',
right: 50,
top: 'center',
align: 'left',
textStyle: {
color: "rgba(59, 65, 75, 1)",
fontSize: "16px"
}
},
radar: {
radius: '60%',
indicator: indicators,
axisName: {
formatter: '{value}',
color: 'rgba(59, 65, 75, 1)',
fontSize: 16,
fontWeight: 700
}
},
series: [
{
name: 'Budget vs spending',
type: 'radar',
data: [radarData]
}
]
};
return option;
}
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论