提交 6ec1e289 authored 作者: yanpeng's avatar yanpeng

news analysis

......@@ -5,10 +5,10 @@
<slot name="header-top"></slot>
</div>
<div class="container-header">
<div class="header-left">
<div class="header-left" :style="{ paddingLeft: block ? 0 : '14px' }">
<slot name="header-left">
<!-- <div class="blue-title-block"></div> -->
<el-image :src="titleIcon" class="header-icon" fit="contain" />
<div v-if="block" class="blue-title-block"></div>
<el-image v-else :src="titleIcon" class="header-icon" fit="contain" />
<div :class="headerTitleClasses">{{ title }}</div>
</slot>
</div>
......@@ -57,6 +57,10 @@ const props = defineProps({
titleType: {
type: String,
default: ""
},
block: {
type: Boolean,
default: false
}
});
......@@ -106,9 +110,9 @@ const headerTitleClasses = computed(() => [
.blue-title-block {
width: 8px;
height: 16px;
background-color: var(--base-color);
background-color: $base-color;
/* border-radius: 3px; */
margin-right: 14px;
margin-right: 4px;
}
.header-title {
......
......@@ -47,12 +47,19 @@ import MarketSingleCaseDeepdig from "@/views/marketAccessRestrictions/singleCase
// 投融资限制
import Finance from "@/views/finance/index.vue";
// 新闻事件分析
import NewsAnalysis from "@/views/newsAnalysis/index.vue";
// 智能写报
import WrittingAsstaint from "@/views/writtingAsstaint/index.vue";
// 门户
import Portal1 from "@/views/portals/portal1/index.vue";
import Portal2 from "@/views/portals/portal2/index.vue";
// 综合搜索
import ComprehensiveSearch from "@/views/comprehensiveSearch/index.vue";
import SearchResults from "@/views/comprehensiveSearch/searchResults/index.vue";
const routes = [
// 智能写报
{
......@@ -396,6 +403,112 @@ const routes = [
}
},
// 市场准入限制首页
{
path: "/marketAccessRestrictions",
name: "MarketAccessRestrictions",
component: MarketAccessRestrictions,
meta: {
title: "市场准入限制"
}
},
{
path: "/marketAccessLayout",
name: "MarketAccessLayout",
component: MarketAccessLayout,
redirect: "/marketAccessLayout/overview",
meta: {
title: "市场准入限制布局"
},
children: [
{
path: "overview",
name: "MarketAccessOverview",
component: MarketAccessOverview,
meta: {
title: "调查概况"
}
},
{
path: "case",
name: "MarketAccessCase",
component: MarketAccessCase,
meta: {
title: "调查案件"
}
}
]
},
{
path: "/marketSingleCaseLayout",
name: "MarketSingleCaseLayout",
component: MarketSingleCaseLayout,
redirect: "/marketSingleCaseLayout/overview",
meta: {
title: "单次调查案件布局"
},
children: [
{
path: "overview",
name: "MarketSingleCaseOverview",
component: MarketSingleCaseOverview,
meta: {
title: "调查简介"
}
},
{
path: "deepdig",
name: "MarketSingleCaseDeepdig",
component: MarketSingleCaseDeepdig,
meta: {
title: "深度挖掘"
}
}
]
},
// 出口管制转移过来的页面
{
path: "/exportControl/analysis",
name: "analysis",
component: () => import("@/views/exportControl/analysis/index.vue"),
meta: {
title: "分析页"
}
},
{
path: "/exportControl/infoplatform",
name: "infoplatform",
component: () => import("@/views/exportControl/infoPlatform/index.vue"),
meta: {
title: "信息平台"
}
},
{
path: "/exportControl/rulelimit",
name: "rulelimit",
component: () => import("@/views/exportControl/ruleLimit/index.vue"),
meta: {
title: "规则限制"
}
},
{
path: "/exportControl/ruledetail",
name: "ruledetail",
component: () => import("@/views/exportControl/ruleDetail/index.vue"),
meta: {
title: "规则详情"
}
},
{
path: "/exportControl/researchfunding",
name: "researchfunding",
component: () => import("@/views/exportControl/researchFunding/index.vue"),
meta: {
title: "科研资助"
}
},
// 投融资限制
{
path: "/finance",
......@@ -406,7 +519,17 @@ const routes = [
}
},
// 门户路由放在这块
// 新闻事件分析
{
path: "/newsAnalysis",
name: "newsAnalysis",
component: NewsAnalysis,
meta: {
title: "新闻事件分析"
}
},
// 门户
{
path: "/portal1",
name: "portal1",
......@@ -422,6 +545,24 @@ const routes = [
meta: {
title: "门户2"
}
},
// 综合搜索
{
path: "/comprehensiveSearch",
name: "comprehensiveSearch",
component: ComprehensiveSearch,
meta: {
title: "综合搜索"
}
},
{
path: "/searchResults",
name: "searchResults",
component: SearchResults,
meta: {
title: "搜索结果"
}
}
];
......
<template>
<div class="wrapper">
<div class="header"><span>首页 </span>> <span>综合检索 </span></div>
<div class="main">
<div class="main-header">
<div class="title">{{ "一站式信息智能检索子系统" }}</div>
<div class="desc">{{ "汇聚全球科技政策、企业动态与管制清单的权威信息检索与分析平台" }}</div>
<div class="search">
<div class="search-left">
<el-input placeholder="搜索关键词" style="width: 700px; height: 100%" />
<div class="btn1">
<div class="icon">
<img src="./assets/images/ai-icon.png" alt="" />
</div>
<div class="text">{{ "智能问答" }}</div>
</div>
<div class="btn2" @click="handleToSearchResults">
<div class="icon">
<img src="./assets/images/search-icon.png" alt="" />
</div>
<div class="text">{{ "全文搜索" }}</div>
</div>
</div>
<div class="search-right">{{ "高级检索" }}</div>
</div>
<div class="info">
<div class="item" v-for="(item, index) in headerInfoList" :key="index">
<div class="num">{{ item.num }}</div>
<div class="name">{{ item.name }}</div>
</div>
</div>
</div>
<div class="main-main">
<div class="main-main-top">
<div class="box1">
<div class="box-header">
<div class="icon">
<img src="./assets/images/box-header-icon.png" alt="" />
</div>
<div class="title">{{ "热点科技动向" }}</div>
<div class="box-header-right">{{ "换一批" }}</div>
</div>
<div class="box1-main">
<div class="box1-item" v-for="(item, index) in box1List" :key="index">
<div class="title">{{ item.title }}</div>
<div class="tag-box">
<div
class="tag"
v-for="(val, idx) in box1List[index].tagList"
:key="idx"
:class="{ tag1: val.status === 1, tag2: val.status === 2, tag3: val.status === 3 }"
>
{{ val.name }}
</div>
</div>
<div class="time">{{ item.time }}</div>
</div>
</div>
</div>
<div class="box2">
<div class="box-header">
<div class="icon">
<img src="./assets/images/box-header-icon.png" alt="" />
</div>
<div class="title">{{ "热点科技安全话题" }}</div>
</div>
<div class="box2-main" id="box2Chart"></div>
</div>
</div>
<div class="main-main-footer">
<div class="box3">
<div class="box-header">
<div class="icon">
<img src="./assets/images/box-header-icon.png" alt="" />
</div>
<div class="title">{{ "智能推荐" }}</div>
</div>
<div class="box3-main">
<div class="box3-item" v-for="(item, index) in box3List" :key="index">
<div class="item-left">
<img :src="item.img" alt="" />
</div>
<div class="item-right">
<div class="title">{{ item.title }}</div>
<div class="content">{{ item.content }}</div>
<div class="item-right-footer">
<div class="time">{{ item.time }}</div>
<div
class="tag"
:class="{
tag1: item.tag.status === 1,
tag2: item.tag.status === 2,
tag3: item.tag.status === 3
}"
>{{ item.tag.name }}</div>
</div>
</div>
</div>
</div>
</div>
<div class="main-main-footer-footer">
<div class="footer-left">{{ "共12894条法案" }}</div>
<div class="footer-right">
<el-pagination background layout="prev, pager, next" :total="96" />
</div>
</div>
</div>
</div>
</div>
</div>
</template>
<script setup>
import { ref, onMounted } from "vue";
import router from '@/router/index'
import getWordCloudChart from "./utils/wordCloud";
import setChart from "@/utils/setChart";
import Img1 from "./assets/images/box3-img1.png";
import Img2 from "./assets/images/box3-img2.png";
import Img3 from "./assets/images/box3-img3.png";
import Img4 from "./assets/images/box3-img4.png";
import Img5 from "./assets/images/box3-img5.png";
const headerInfoList = ref([
{
name: "美国",
num: 36447
},
{
name: "欧盟",
num: 14433
},
{
name: "日本",
num: 1986
},
{
name: "韩国",
num: 341
},
{
name: "其他",
num: 12548
}
]);
const box1List = ref([
{
title: "openAI 推出 AI 搜索浏览器 Atlas,直接挑战谷歌 Chrome 的主导地位",
tagList: [{ name: "人工智能", status: 1 }],
time: "2024年12月"
},
{
title: "2025 年 11 月 6 日,2025 年世界互联网大会领先科技奖在浙江乌镇揭晓,清华大学、中国科学院计算技术...",
tagList: [{ name: "互联网", status: 2 }],
time: "2024年12月"
},
{
title: "上海交通大学建成中国首条光子芯片中试线,推出实用化大规模高速可编程光量子计算芯片。",
tagList: [{ name: "芯片", status: 1 }],
time: "2024年12月"
},
{
title: "ALTO Robotics 公司的协作式移动机器人运用模块化结构,专为深度人机协作场景设计,能够显著提升生产...",
tagList: [{ name: "机器人", status: 3 }],
time: "2024年12月"
},
{
title: "国际氢能燃料电池协会发布《AI 技术在氢能领域的应用研究》成果,总结 AI + 氢能实践并给出推动氢能产...",
tagList: [
{ name: "燃料电池", status: 3 },
{ name: "AI", status: 2 }
],
time: "2024年12月"
},
{
title: "百度推出 “剧本驱动多模协同的高拟真数字人技术”,提升数字人直播内容质量和交互能力。",
tagList: [
{ name: "数字人", status: 2 },
{ name: "稳定币", status: 1 }
],
time: "2024年12月"
},
{
title: "中国科学院微小卫星创新研究院的 “千帆星座卫星规模化研制” 项目,展示着星座商用步伐的提速。",
tagList: [
{ name: "中科院", status: 3 },
{ name: "卫星", status: 2 }
],
time: "2024年12月"
},
{
title: "RAER Therapeutics 公司利用创新开发平台,针对各类已知罕见病展开研究,为全球罕见病患者带来新希望。",
tagList: [{ name: "罕见病", status: 2 }],
time: "2024年12月"
}
]);
const box2Data = ref([
{ name: "限制中国获取能源技术", value: 100 },
{ name: "未实现赤字控制目标", value: 66 },
{ name: "关注核聚变能源研究", value: 77 },
{ name: "抵制外国人才争夺", value: 35 },
{ name: "进行可再生能源税收减免", value: 88 },
{ name: "评估中美现代化技术", value: 57 },
{ name: "应对中国制造2025战略", value: 72 },
{ name: "实施能源税收延期", value: 18 },
{ name: "限制采购中国产电池", value: 34 },
{ name: "加强美国在核能领域得到领导力", value: 16 },
{ name: "发展替代燃料", value: 72 },
{ name: "发展风能", value: 58 },
{ name: "发展太阳能", value: 24 },
{ name: "施加额外能源出口限制", value: 33 },
{ name: "评估中美能源技术", value: 47 },
{ name: "禁止资助中国能源项目", value: 32 },
{ name: "不得向中国机构提供援助", value: 62 },
{ name: "开展先进生物能源计划", value: 51 },
{ name: "减少燃料对外依赖", value: 81 },
{ name: "加强供应链风险管理", value: 73 }
]);
const box3List = ref([
{
img: Img1,
title: "美元 “上链”!美国联邦金融稳定币监管法案正式生效",
content:
"《指导与建立美国稳定币国家创新法案》落地,要求稳定币发行方以 1:1 比例储备美元现金、短期美债等高度流动资产,建立联邦与州双轨监管体系。",
time: "创建时期:2025-10- 05",
tag: {
name: "科技法案",
status: 3
}
},
{
img: Img2,
title: "蓝天航空材料有限公司 (Blue Sky Aviation Materials Co., Ltd)",
content:
"专业从事航空航天材料研发、生产和销售的高科技企业,主要产品包括航空发动机叶片、结构胶等关键航空材料,产品广泛应用于国内外主流航空公司。",
time: "创建时期:2025-10- 05",
tag: {
name: "科技法案",
status: 3
}
},
{
img: Img3,
title: "拒绝政府数字货币!美国众议院通过反 CBDC 监控法案",
content:
"《反 CBDC 监控国家法案》以保护金融隐私为核心,拟永久禁止美联储发行数字美元,禁止其向个人直接或间接发行 CBDC,也不得将 CBDC 用于货币政策工具或开展相关...",
time: "创建时期:2025-10- 05",
tag: {
name: "科技法案",
status: 3
}
},
{
img: Img4,
title: "降低机构入场门槛!SEC 撤销银行加密托管负债要求",
content:
"美国 SEC 出台新规,撤销银行参与加密资产托管的相关负债限制,简化合规流程。这一调整为银行等传统金融机构进入加密市场扫清关键障碍,有望吸引更多机构资金流入...",
time: "创建时期:2025-10- 05",
tag: {
name: "科技法案",
status: 3
}
},
{
img: Img5,
title: "皮特・阿吉拉尔(Pete Aguilar)",
content: "所属州:内华达州、出生年月:1982年、现任状态:现任、发起法案数量:11项",
time: "出生日期:1986-04-21",
tag: {
name: "重要人物",
status: 2
}
}
]);
// 点击全文搜索,进入搜索结果页
const handleToSearchResults = () => {
router.push({
path: '/searchResults'
})
}
onMounted(() => {
const box2Chart = getWordCloudChart(box2Data.value)
setChart(box2Chart, 'box2Chart')
})
</script>
<style lang="scss" scoped>
.wrapper {
.box-header {
position: relative;
height: 48px;
display: flex;
align-items: center;
border-bottom: 1px solid rgba(234, 236, 238, 1);
.icon {
width: 19px;
height: 19px;
margin-left: 21px;
img {
width: 100%;
height: 100%;
}
}
.title {
margin-left: 20px;
height: 26px;
color: var(--color-main-active);
font-family: Microsoft YaHei;
font-size: 20px;
font-weight: 700;
line-height: 26px;
letter-spacing: 0px;
text-align: left;
}
.box-header-right {
position: absolute;
top: 12px;
right: 27px;
height: 24px;
color: var(--color-main-active);
font-family: Microsoft YaHei;
font-size: 16px;
font-weight: 400;
line-height: 24px;
letter-spacing: 0px;
text-align: right;
}
}
.header {
height: 64px;
color: #fff;
font-family: Microsoft YaHei;
font-size: 20px;
font-weight: 700;
line-height: 26px;
line-height: 64px;
background: url("./assets/images/header-bg.png");
box-sizing: border-box;
padding-left: 160px;
}
.main {
width: 100%;
height: calc(100vh - 160px);
background: url("./assets/images/background.png") no-repeat;
background-size: 100% 100%;
.main-header {
height: 491px;
.title {
margin-top: 80px;
height: 66px;
color: rgba(34, 41, 52, 1);
font-family: Microsoft YaHei;
font-size: 50px;
font-weight: 700;
line-height: 66px;
text-align: center;
}
.desc {
height: 24px;
margin-top: 16px;
color: rgba(95, 101, 108, 1);
font-family: Microsoft YaHei;
font-size: 18px;
font-weight: 400;
line-height: 24px;
text-align: center;
}
.search {
margin-top: 80px;
height: 48px;
display: flex;
justify-content: center;
gap: 16px;
.search-left {
width: 960px;
height: 48px;
box-sizing: border-box;
border: 1px solid rgba(255, 255, 255, 1);
border-radius: 10px;
box-shadow: 0px 0px 20px 0px rgba(25, 69, 130, 0.1);
background: rgba(255, 255, 255, 0.65);
position: relative;
.btn1 {
position: absolute;
top: 3px;
right: 131px;
width: 120px;
height: 42px;
box-sizing: border-box;
border: 1px solid rgba(5, 95, 194, 1);
border-radius: 8px;
background: rgba(255, 255, 255, 1);
display: flex;
justify-content: center;
gap: 8px;
cursor: pointer;
.icon {
margin-top: 12px;
width: 20px;
height: 13px;
img {
width: 100%;
height: 100%;
}
}
.text {
margin-top: 9px;
width: 72px;
height: 24px;
color: var(--color-main-active);
font-family: Microsoft YaHei;
font-size: 18px;
font-weight: 400;
line-height: 24px;
text-align: center;
}
}
.btn2 {
position: absolute;
top: 3px;
right: 3px;
width: 120px;
height: 42px;
border-radius: 8px;
background: var(--color-main-active);
display: flex;
justify-content: center;
gap: 8px;
cursor: pointer;
.icon {
margin-top: 10px;
width: 22px;
height: 22px;
img {
width: 100%;
height: 100%;
}
}
.text {
margin-top: 9px;
width: 72px;
height: 24px;
color: #fff;
font-family: Microsoft YaHei;
font-size: 18px;
font-weight: 400;
line-height: 24px;
text-align: center;
}
}
}
.search-right {
height: 48px;
color: rgba(5, 95, 194, 1);
font-family: Microsoft YaHei;
font-size: 16px;
font-weight: 400;
line-height: 48px;
}
}
.info {
margin-top: 40px;
height: 60px;
display: flex;
justify-content: center;
gap: 42px;
.item {
padding: 0 8px;
.num {
height: 22px;
color: rgba(5, 95, 194, 1);
font-family: Microsoft YaHei;
font-size: 36px;
font-weight: 700;
line-height: 22px;
letter-spacing: 0px;
text-align: center;
}
.name {
margin-top: 14px;
height: 24px;
color: rgba(95, 101, 108, 1);
font-family: Microsoft YaHei;
font-size: 16px;
font-weight: 400;
line-height: 24px;
letter-spacing: 0px;
text-align: center;
}
}
}
}
.main-main {
.main-main-top {
display: flex;
gap: 16px;
justify-content: center;
.box1 {
width: 1064px;
height: 450px;
box-sizing: border-box;
border: 1px solid rgba(234, 236, 238, 1);
border-radius: 10px;
box-shadow: 0px 0px 20px 0px rgba(25, 69, 130, 0.1);
background: rgba(255, 255, 255, 1);
.box1-main {
.box1-item {
width: 1016px;
margin-left: 24px;
height: 46px;
display: flex;
align-items: center;
border-bottom: 1px solid rgba(240, 242, 244, 1);
.title {
width: 768px;
height: 46px;
color: rgba(59, 65, 75, 1);
font-family: Microsoft YaHei;
font-size: 16px;
font-weight: 400;
line-height: 46px;
letter-spacing: 0px;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.tag-box {
width: 150px;
display: flex;
justify-content: flex-end;
align-items: center;
gap: 12px;
.tag {
max-width: 75px;
height: 24px;
line-height: 24px;
padding: 0 8px;
text-align: center;
box-sizing: border-box;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
border-radius: 4px;
font-family: Microsoft YaHei;
font-size: 14px;
font-weight: 400;
}
.tag1 {
border: 1px solid rgba(255, 204, 199, 1);
background: rgba(255, 241, 240, 1);
color: rgba(255, 77, 79, 1);
}
.tag2 {
color: rgba(250, 173, 20, 1);
border: 1px solid rgba(255, 241, 184, 1);
background: rgba(255, 251, 230, 1);
}
.tag3 {
color: rgba(22, 119, 255, 1);
border: 1px solid rgba(186, 224, 255, 1);
background: rgba(230, 244, 255, 1);
}
}
.time {
margin-left: 2px;
width: 100px;
height: 22px;
color: rgba(132, 136, 142, 1);
font-family: Microsoft YaHei;
font-size: 14px;
font-weight: 400;
line-height: 22px;
letter-spacing: 0px;
text-align: right;
}
}
}
}
.box2 {
width: 520px;
height: 450px;
box-sizing: border-box;
border: 1px solid rgba(234, 236, 238, 1);
border-radius: 10px;
box-shadow: 0px 0px 20px 0px rgba(25, 69, 130, 0.1);
background: rgba(255, 255, 255, 1);
.box2-main{
height: 390px;
}
}
}
.main-main-footer {
margin-top: 16px;
.box3 {
margin: 0 auto;
width: 1600px;
height: 695px;
box-sizing: border-box;
border: 1px solid rgba(234, 236, 238, 1);
border-radius: 10px;
box-shadow: 0px 0px 20px 0px rgba(25, 69, 130, 0.1);
background: rgba(255, 255, 255, 1);
.box3-main {
padding-top: 8px;
.box3-item {
margin-left: 24px;
height: 122px;
border-bottom: 1px solid rgba(234, 236, 238, 1);
display: flex;
.item-left {
width: 135px;
height: 90px;
margin-top: 16px;
img {
width: 100%;
height: 100%;
}
}
.item-right {
margin-left: 16px;
margin-top: 16px;
.title {
height: 26px;
color: rgba(59, 65, 75, 1);
font-family: Microsoft YaHei;
font-size: 20px;
font-weight: 700;
line-height: 26px;
letter-spacing: 0px;
text-align: left;
}
.content {
margin-top: 8px;
width: 1236px;
height: 24px;
color: rgba(95, 101, 108, 1);
font-family: Microsoft YaHei;
font-size: 16px;
font-weight: 400;
line-height: 24px;
letter-spacing: 0px;
text-align: left;
}
.item-right-footer {
display: flex;
margin-top: 9px;
.time {
width: 152px;
height: 22px;
color: rgba(132, 136, 142, 1);
font-family: Microsoft YaHei;
font-size: 14px;
font-weight: 400;
line-height: 22px;
letter-spacing: 0px;
text-align: left;
}
.tag {
margin-left: 16px;
height: 24px;
line-height: 24px;
padding: 0 8px;
text-align: center;
box-sizing: border-box;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
border-radius: 4px;
font-family: Microsoft YaHei;
font-size: 14px;
font-weight: 400;
}
.tag1 {
border: 1px solid rgba(255, 204, 199, 1);
background: rgba(255, 241, 240, 1);
color: rgba(255, 77, 79, 1);
}
.tag2 {
color: rgba(250, 173, 20, 1);
border: 1px solid rgba(255, 241, 184, 1);
background: rgba(255, 251, 230, 1);
}
.tag3 {
color: rgba(22, 119, 255, 1);
border: 1px solid rgba(186, 224, 255, 1);
background: rgba(230, 244, 255, 1);
}
}
}
}
}
}
.main-main-footer-footer {
width: 1600px;
margin: 0 auto;
height: 95px;
display: flex;
justify-content: space-between;
align-items: center;
.footer-left {
height: 20px;
color: rgba(132, 136, 142, 1);
font-family: Microsoft YaHei;
font-size: 14px;
font-weight: 400;
line-height: 20px;
letter-spacing: 0px;
text-align: left;
}
}
}
}
}
}
:deep(.el-input__wrapper) {
box-shadow: none;
}
</style>
\ No newline at end of file
<template>
<div class="wrapper">
<div class="header">
<div class="search-box">
<div class="left">
<div class="icon">
<img src="./assets/images/search-icon1.png" alt="" />
</div>
<el-input :border="false" style="width: 900px; height: 100%" />
</div>
<div class="right">
<img src="./assets/images/ai-icon.png" alt="" />
</div>
</div>
<div class="tab-box">
<div class="tab-left">
<div class="tab" :class="{ tabActive: item.isActive }" v-for="(item, index) in tabList" :key="index">
{{ item.name }}
</div>
</div>
<div class="tab-right">
<div class="text">{{ "全部国家" }}</div>
<div class="icon">
<img src="./assets/images/down.png" alt="" />
</div>
</div>
</div>
<div class="tag-box">
<div class="tag" v-for="(item, index) in tagList" :key="index">{{ item.name }}</div>
</div>
<div class="info-box">
<div class="info-left">
<div class="text-box">
搜索结果<span class="text-1">{{ "356" }}</span
>
</div>
<div class="text-box">
搜索关键词:<span class="text-2">{{ "金融" }}</span>
</div>
<div class="text-box">
当前领域:<span class="text-2">{{ "科技法案" }}</span>
</div>
</div>
<div class="info-right">
<el-select v-model="selectTime" placeholder="选择时间" style="width: 125px">
<el-option v-for="item in timeList" :key="item.value" :label="item.label" :value="item.value" />
</el-select>
<el-select v-model="selectRelation" placeholder="选择相关度" style="width: 125px">
<el-option v-for="item in relationList" :key="item.value" :label="item.label" :value="item.value" />
</el-select>
</div>
</div>
<div class="summary-box">
<div class="summary-header">
<img src="./assets/images/summary-icon.png" alt="" />
</div>
<div class="summary-content">
{{
` 美国众议院共和党人正在起草一项新提案,以限制美国对中国的投资。此前,参议院已将其纳入国防政策立法中。知情人士向Semafor透露,众议院工作人员希望在11月7日前就该提案达成共识,并将财政部的反馈纳入由肯塔基州共和党众议员安迪·巴尔提出的配套提案中(尽管政府停摆可能推迟这一时间表)。随后,众议员将利用该文本与参议员就最终《国防授权法案》的内容进行协商。此前一届国会中,类似的尝试因北卡罗来纳州前众议员帕特里克·麦克亨利的反对而失败,但本届国会中,“所有人都在共同努力”。知情人士补充说,领导人并不担心此举会剥夺特朗普在周四与中国领导人习近平会谈时的谈判筹码,因为财政部已开始实施类似的指导方针。`
}}
</div>
</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">
<div class="icon">
<img src="./assets/images/search-icon2.png" alt="" />
</div>
<div class="text">{{ item }}</div>
</div>
</div>
</div>
</div>
</div>
</template>
<script setup>
import { ref, onMounted } from "vue";
const selectTime = ref("全部时间");
const selectRelation = ref("相关度优先");
const tabList = ref([
{
name: "法案",
isActive: true
},
{
name: "政令",
isActive: false
},
{
name: "科技智库",
isActive: false
},
{
name: "企业",
isActive: false
},
{
name: "出口管制",
isActive: false
},
{
name: "市场准入",
isActive: false
},
{
name: "投融资限制",
isActive: false
},
{
name: "重要人物",
isActive: false
}
]);
const tagList = ref([
{
name: "人工智能"
},
{
name: "集成电路"
},
{
name: "通信网络"
},
{
name: "量子科技"
},
{
name: "能源"
},
{
name: "生物科技"
},
{
name: "航空航天"
},
{
name: "海洋"
},
{
name: "新材料"
},
{
name: "先进制造"
}
]);
const timeList = ref([
{
label: "全部时间",
value: "全部时间"
},
{
label: "2025年",
value: "2025年"
},
{
label: "2024年",
value: "2024年"
}
]);
const relationList = ref([
{
label: "相关度优先",
value: "相关度优先"
},
{
label: "相关度优先1",
value: "相关度优先1"
},
{
label: "相关度优先2",
value: "相关度优先2"
}
]);
// 关联检索
const relatedSearchList = ref([
'金融制度是如何建立的?',
'金融有什么用?',
'如何办理金融贷款?',
'2025年美国金融法案发布情况',
'中国如何应对金融制裁',
'中国金融制度建立历史'
])
</script>
<style lang="scss" scoped>
:deep(.el-input__wrapper) {
box-shadow: none;
}
:deep(.el-input__wrapper:hover) {
box-shadow: none !important;
}
:deep(.el-input__wrapper.is-focus) {
box-shadow: none !important;
}
.wrapper {
width: 100%;
height: calc(100vh - 96px);
background: url("../assets/images/background.png") no-repeat;
background-size: 100% 100%;
.header {
margin-top: 24px;
position: relative;
.header-right {
position: absolute;
width: 360px;
top: 134px;
left: 1300px;
.header-right-header {
height: 30px;
color: rgba(59, 65, 75, 1);
font-family: Microsoft YaHei;
font-size: 16px;
font-weight: 700;
line-height: 30px;
letter-spacing: 0px;
text-align: left;
}
.header-right-main {
margin-top: 24px;
height: 300px;
.header-right-main-item {
width: 360px;
height: 40px;
border-radius: 20px;
background: rgba(247, 248, 249, 1);
display: flex;
gap: 8px;
margin-bottom: 8px;
cursor: pointer;
&:hover{
background: rgb(234, 234, 234);
}
.icon {
width: 16px;
height: 16px;
img {
width: 100%;
height: 100%;
}
margin-left: 16px;
margin-top: 12px;
}
.text {
font-family: Microsoft YaHei;
font-size: 16px;
font-weight: 400;
line-height: 38px;
color: rgba(59, 65, 75, 1);
}
}
}
}
.search-box {
display: flex;
.left {
margin-left: 240px;
width: 960px;
height: 48px;
box-sizing: border-box;
border: 1px solid rgba(255, 255, 255, 1);
border-radius: 10px;
box-shadow: 0px 0px 20px 0px rgba(25, 69, 130, 0.1);
background: rgba(255, 255, 255, 0.65);
display: flex;
&:hover {
border: 1px solid var(--color-main-active);
}
.icon {
width: 20px;
height: 20px;
margin-top: 14px;
margin-left: 16px;
margin-right: 10px;
img {
width: 100%;
height: 100%;
}
}
}
.right {
margin-left: 2px;
margin-top: -16px;
width: 80px;
height: 80px;
cursor: pointer;
img {
width: 100%;
height: 100%;
}
}
}
.tab-box {
margin-top: 12px;
height: 48px;
display: flex;
margin-left: 257px;
align-items: center;
.tab-left {
width: 726px;
height: 48px;
display: flex;
gap: 32px;
.tab {
color: rgba(59, 65, 75, 1);
font-family: Microsoft YaHei;
font-size: 18px;
font-weight: 400;
line-height: 48px;
box-sizing: border-box;
border-bottom: 3px solid transparent;
cursor: pointer;
&:hover {
color: var(--color-main-active);
}
}
.tabActive {
color: var(--color-main-active);
font-size: 18px;
font-weight: 700;
border-bottom: 3px solid var(--color-main-active);
}
}
.tab-right {
margin-left: 74px;
width: 120px;
height: 32px;
box-sizing: border-box;
border: 1px solid var(--color-main-active);
border-radius: 20px;
background: rgba(231, 243, 255, 1);
display: flex;
justify-content: center;
gap: 8px;
.text {
margin-top: 4px;
height: 24px;
color: rgba(5, 95, 194, 1);
font-family: Microsoft YaHei;
font-size: 18px;
font-weight: 700;
line-height: 24px;
}
.icon {
margin-top: 3px;
width: 8px;
height: 5px;
img {
width: 100%;
height: 100%;
}
}
}
}
.tag-box {
margin-top: 16px;
width: 908px;
height: 32px;
display: flex;
gap: 12px;
margin-left: 256px;
.tag {
height: 32px;
line-height: 30px;
box-sizing: border-box;
border: 1px solid rgba(230, 231, 232, 1);
border-radius: 4px;
background: rgba(255, 255, 255, 1);
padding: 0 10px;
color: rgba(59, 65, 75, 1);
font-family: Microsoft YaHei;
font-size: 16px;
font-weight: 400;
}
}
.info-box {
margin-top: 16px;
margin-left: 257px;
width: 920px;
height: 32px;
display: flex;
justify-content: space-between;
.info-left {
display: flex;
gap: 24px;
.text-box {
height: 32px;
line-height: 32px;
font-family: Microsoft YaHei;
font-size: 16px;
font-weight: 400;
color: rgba(59, 65, 75, 1);
.text-1 {
color: var(--color-main-active);
font-weight: 700;
font-size: 20px;
margin: 0 5px;
}
.text-2 {
color: var(--color-main-active);
font-size: 18px;
margin: 0 5px;
}
}
}
.info-right {
display: flex;
gap: 13px;
}
}
.summary-box {
width: 960px;
height: 260px;
margin-left: 240px;
margin-top: 36px;
box-sizing: border-box;
border: 1px solid rgba(231, 243, 255, 1);
border-radius: 10px;
background: linear-gradient(180deg, rgba(246, 250, 255, 1), rgba(246, 250, 255, 0) 100%);
.summary-header {
width: 135px;
height: 32px;
margin-top: 16px;
margin-left: 24px;
img {
width: 100%;
height: 100%;
}
}
.summary-content {
width: 912px;
height: 180px;
margin: 16px auto;
font-family: Microsoft YaHei;
font-size: 16px;
font-weight: 400;
line-height: 30px;
letter-spacing: 0px;
text-align: justify;
color: rgba(59, 65, 75, 1);
}
}
}
}
</style>
\ No newline at end of file
const getWordCloudChart = (data) => {
const option = {
grid: {
left: 0,
top: 0,
right: 0,
bottom: 0,
},
series: [
{
type: "wordCloud",
shape: "rect", //
// 其他形状你可以使用形状路径
// 或者自定义路径
// shape: 'circle' // 圆形(默认)
// shape: 'rect' // 矩形
// shape: 'roundRect' // 圆角矩形
// shape: 'triangle' // 三角形
// shape: 'diamond' // 菱形
// shape: 'pentagon' // 五边形
// shape: 'star' // 星形
// shape: 'cardioid' // 心形
gridSize: 5, // 网格大小,影响词间距。
sizeRange: [10, 30], // 定义词云中文字大小的范围
rotationRange: [0, 0],
rotationStep: 10,
drawOutOfBound: false, // 是否超出画布
// 字体
textStyle: {
// normal: {
// color: function () {
// return 'rgb(' + [
// Math.round(Math.random() * 160),
// Math.round(Math.random() * 160),
// Math.round(Math.random() * 160)
// ].join(',') + ')';
// }
// },
color: function () {
let colors = [
"rgba(189, 33, 33, 1)",
"rgba(232, 151, 21, 1)",
"rgba(220, 190, 68, 1)",
"rgba(96, 58, 186, 1)",
"rgba(32, 121, 69, 1)",
"rgba(22, 119, 255, 1)",
];
return colors[parseInt(Math.random() * colors.length)];
},
emphasis: {
shadowBlur: 5,
shadowColor: "#333",
},
},
// 设置词云数据
data: data,
},
],
}
return option
}
export default getWordCloudChart
\ No newline at end of file
......@@ -657,9 +657,9 @@ import aircasIcon from "./assets/images/aircas.png";
const handleToDetail = () => {
router.push({
path: '/exportControl/analysis'
})
}
path: "/exportControl/analysis"
});
};
const billList = ref([]);
const curBillListIndex = ref(0);
......
<template>
<div class="page-container">
<div class="page-header">
<div class="page-header-left">
<el-image :src="newsImg" alt="新闻" class="page-header-left-img"></el-image>
<div class="page-header-left-top">
<div class="page-header-left-top-title">众议院共和党人起草新的中国投资限制</div>
<div class="page-header-left-top-en">House Republicans draft new China investment curbs</div>
<div class="page-header-left-top-desc">
2025年11月11日 10:33 · 福克斯新闻网
<el-tag type="primary">生物科技</el-tag>
<el-tag type="primary">人工智能</el-tag>
</div>
</div>
</div>
<div class="page-header-right">
<el-button type="primary">
<el-image :src="openIcon" alt="打开" class="page-header-right-icon"></el-image>
查看原网页
</el-button>
</div>
</div>
<div class="page-content">
<el-row :gutter="20">
<el-col :span="17">
<custom-container block title="新闻内容" :titleIcon="houseIcon" height="1180px">
<template #header-right>
<div class="page-content-right-switch">
<el-switch v-model="highlightEntities" />
高亮实体
</div>
<el-button type="primary" @click="handleToDetail"> 译文 </el-button>
</template>
<template #default>
<!-- 内容区域 - 分三块-->
<div class="page-content-news-abstract">
美国众议院共和党人正在起草一项新提案,以限制美国对中国的投资。此前,参议院已将其纳入国防政策立法中。知情人士向Semafor透露,众议院工作人员希望在11月7日前就该提案达成共识,并将财政部的反馈纳入由肯塔基州共和党众议员安迪·巴尔提出的配套提案中(尽管政府停摆可能推迟这一时间表)。随后,众议员将利用该文本与参议员就最终《国防授权法案》的内容进行协商。此前一届国会中,类似的尝试因北卡罗来纳州前众议员帕特里克·麦克亨利的反对而失败,但本届国会中,“所有人都在共同努力”。知情人士补充说,领导人并不担心此举会剥夺特朗普在周四与中国领导人习近平会谈时的谈判筹码,因为财政部已开始实施类似的指导方针。
</div>
<div class="page-content-news-artical">
<div class="page-content-news-artical-zn">
<p>
<span class="highlight">华盛顿邮报</span>报道,了解谈判情况的知情人士透露,<span
class="highlight"
>美国众议院</span
><span class="highlight">共和党人</span
>正在起草一项新的提案,以限制美国对华投资。目前<span class="highlight">参议院</span
>已将其相关法案作为国防政策立法的一部分通过。
</p>
<p>
谈判各方希望能在11月7日前就这项措施的文本达成共识(尽管政府停摆、可能推迟这一日期)。该措施已将财政部的反馈意见纳入<span
class="highlight"
>肯塔基州</span
><span class="highlight">共和党众议员</span
><span class="highlight">安迪·巴尔</span><span class="highlight">配套提案中</span>
</p>
<p>
此后,<span class="highlight">国会议员</span
>们将利用这份文本来与参议员进行协商,以决定哪些内容能最终纳入定版的《国防授权法案》中。
</p>
<p>
在上届国会期间,类似的立法尝试曾因<span class="highlight">北卡罗来纳州</span><span
class="highlight"
>共和党前众议员</span
><span class="highlight">帕特里克·麦克亨利</span>的反对而失败。但在本届国会中,<span
class="highlight"
>一位知情人士</span
>表示,"现在所有人实际上都在共同努力"。
</p>
<p>
该人士还补充说,领导层并不担心此举会剥夺<span class="highlight">特朗普</span
><span class="highlight">总统</span>的一个谈判工具。
</p>
</div>
<div class="page-content-news-artical-en">
<p class="indented-paragraph">
<span class="highlight">House Republicans</span> are drafting a fresh proposal to curb US
investments in China after the <span class="highlight">Senate</span> passed its bill as
part of defense policy legislation, people familiar with the talks told Semafor.
</p>
<p class="indented-paragraph">
Staff hope to reach consensus on the measure, which incorporates
<span class="highlight">Treasury Department</span> feedback into a companion proposal from
Rep. <span class="highlight">Andy Barr</span>, R-Ky., by
<span class="highlight">Nov. 7</span> (though the shutdown could delay that date).
</p>
<p class="indented-paragraph">
Members will then use that text to negotiate with senators over what makes it into the
final <span class="highlight">National Defense Authorization Act</span>.
</p>
<p class="indented-paragraph">
Last Congress, similar attempts to add language implored amid pushback from former Rep.
<span class="highlight">Patrick McHenry</span>, R-N.C.; this Congress, "everyone's
actually working together" now, one of the people said.
</p>
<p class="indented-paragraph">
They added that leaders are unconcerned about depriving
<span class="highlight">Trump</span> of a negotiating tool in talks with Chinese leader
<span class="highlight">Xi Jinping</span> on Thursday because
<span class="highlight">Treasury</span> is already implementing parallel guidance.
</p>
</div>
</div>
<div class="page-content-news-img">
<el-image :src="newsImg1" alt="新闻图片" fit="contain" />
<el-image :src="newsImg2" alt="新闻图片" fit="contain" />
<el-image :src="newsImg3" alt="新闻图片" fit="contain" />
</div>
</template>
</custom-container>
</el-col>
<el-col :span="7">
<custom-container block title="事件脉络" :titleIcon="houseIcon" height="630px">
<template #default>
<div class="box4">
<div class="box4-item" v-for="(item, idx) in sanctionProcessList" :key="item.title">
<div class="box4-item-left">
<el-image :src="dotIcon" alt="图片" class="box4-item-left-icon" />
<div class="box4-item-left-line" v-if="idx + 1 != sanctionProcessList.length"></div>
</div>
<div class="box4-item-right">
<div class="box4-item-right-header">
<span class="box4-item-right-header-title" :title="item.title">{{ item.title }}</span>
<span class="box4-item-right-header-desc">{{ item.desc }}</span>
</div>
<div class="box4-item-right-content">
{{ item.content }}
</div>
</div>
</div>
</div>
</template>
</custom-container>
<custom-container block title="相关新闻" :titleIcon="houseIcon" height="500px">
<template #default>
<div class="news-list">
<NewsList :list-data="customNewsData" />
</div>
</template>
</custom-container>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="17">
<custom-container block title="关系图谱" :titleIcon="linkIcon" height="500px">
<template #default>
<Graph />
</template>
</custom-container>
</el-col>
</el-row>
</div>
</div>
</template>
<script setup>
import { ref } from "vue";
import CustomContainer from "@/components/Container/index.vue";
import NewsList from "@/views/exportControl/components/news.vue";
import Graph from "./relation.vue";
import newsImg from "@/assets/images/img-news.png";
import openIcon from "@/assets/images/icon-open.png";
import dotIcon from "@/assets/images/dot.png";
import newsImg1 from "@/assets/images/news-image-1.png";
import newsImg2 from "@/assets/images/news-image-2.png";
import newsImg3 from "@/assets/images/news-image-3.png";
import newsImg4 from "@/assets/images/news-img.png";
const highlightEntities = ref(false);
const handleToDetail = () => {
// window.open("https://www.foxnews.com/technology/house-republicans-draft-new-china-investment-curbs");
};
// 历次制裁过程
const sanctionProcessList = ref([
{
title: "减税与就业法案的出台与立法博弈",
desc: "2025-08-30 11:30",
content: "2017年,美国通过了一项自里根时代以来最为重大的税制改革——《减税与就业法案..."
},
{
title: "信用评级机构穆迪下调美国信用评级",
desc: "2025-08-16 13:00",
content: "2025年5月16日,信用评级机构穆迪自2011年以来第三次下调美国主权信用评级,直..."
},
{
title: "马斯克与特朗普决裂",
desc: "2025-08-16 11:05",
content: "马斯克5月30日离任政府效率部负责人时与特朗普友好告别,但6月3日突然批评OBB..."
},
{
title: "马斯克成立“美国党”​",
desc: "2025-08-16 08:30",
content: "7月5日(法案签署次日),马斯克宣布成立新政党“美国党”,计划参与2026年中期..."
},
{
title: "“90天关税暂缓期”即将到期",
desc: "2025-08-14 18:00",
content: "法案通过恰逢美国对多国“90天关税暂缓期”即将到期(2025年7月9日)。欧盟、..."
}
]);
const customNewsData = ref([
{
image: newsImg4,
title: "市场因结束美国政府关门协议的希望而提振",
time: "",
source: "",
description: "2017-08-30 · Channel NewsAsia..."
},
{
image: newsImg4,
title: "市场因结束美国政府关门协议的希望而提振",
time: "",
source: "",
description: "2017-08-30 · Channel NewsAsia..."
},
{
image: newsImg4,
title: "市场因结束美国政府关门协议的希望而提振",
time: "",
source: "",
description: "2017-08-30 · Channel NewsAsia..."
},
{
image: newsImg4,
title: "市场因结束美国政府关门协议的希望而提振",
time: "",
source: "",
description: "2017-08-30 · Channel NewsAsia..."
}
]);
</script>
<style scoped lang="scss">
.page-container {
/* padding: 20px; */
width: 100%;
overflow-x: hidden;
}
.page-header {
display: flex;
align-items: center;
justify-content: center;
height: 120px;
background: #fff;
padding: 0 160px;
&-left {
display: flex;
align-items: center;
justify-content: center;
gap: 15px;
margin-right: auto;
&-img {
width: 72px;
height: 72px;
}
&-top {
display: flex;
flex-direction: column;
align-items: flex-start;
justify-content: flex-start;
gap: 5px;
&-title {
font-size: 24px;
font-weight: 700;
// margin-bottom: 10px;
color: rgba(59, 65, 75, 1);
}
&-en {
font-size: 16px;
font-weight: 400;
// margin-bottom: 10px;
color: rgba(59, 65, 75, 1);
}
&-desc {
font-size: 16px;
font-weight: 400;
color: rgba(95, 101, 108, 1);
display: flex;
align-items: center;
justify-content: center;
gap: 5px;
}
}
}
&-right {
&-icon {
width: 12px;
height: 12px;
margin-right: 5px;
}
}
}
.page-content {
padding: 20px 160px;
&-news-abstract {
height: 260px;
width: 100%;
padding: 10px;
background: linear-gradient(to bottom, rgba(246, 250, 255, 1), rgba(246, 250, 255, 0));
font-size: 16px;
font-weight: 400;
line-height: 30px;
border-radius: 4px;
border: 1px solid rgba(246, 250, 255, 1);
text-indent: 2em;
}
&-news-artical {
line-height: 1.8;
color: #303133;
display: flex;
align-items: flex-start;
justify-content: space-between;
gap: 25px;
&-zn,
&-en {
width: 50%;
}
p {
text-align: justify;
text-indent: 2em; /* 段落开头缩进2个字符 */
margin-bottom: -1px;
line-height: 28px;
}
.highlight {
color: rgba(5, 95, 194, 1); /* 指定的蓝色高亮 */
font-weight: 500;
}
}
&-news-img {
border-top: 1px solid rgba(234, 236, 238, 1);
padding: 15px 10px;
display: flex;
align-items: center;
justify-content: center;
gap: 20px;
}
.box4 {
.box4-item {
display: flex;
gap: 10px;
align-items: flex-start;
padding-bottom: 30px;
.box4-item-left {
display: flex;
flex-direction: column;
align-items: center;
padding-top: 8px;
position: relative;
.box4-item-left-icon {
width: 10px;
height: 10px;
}
.box4-item-left-line {
width: 1px;
height: 120px;
position: absolute;
top: 15px;
border-left: 1px solid rgba(10, 87, 166, 0.3);
}
}
.box4-item-right {
display: flex;
flex-direction: column;
gap: 5px;
.box4-item-right-header {
display: flex;
justify-content: space-between;
align-items: center;
padding-bottom: 12px;
border-bottom: 1px solid rgba(234, 236, 238, 1);
&-title {
width: 60%;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
font-size: 16px;
color: rgba(59, 65, 75, 1);
font-weight: 700;
}
&-desc {
font-size: 14px;
font-weight: 400;
color: rgba(95, 101, 108, 1);
}
}
.box4-item-right-content {
// margin-top: 10px;
font-size: 16px;
font-weight: 400;
color: rgba(95, 101, 108, 1);
overflow: hidden;
display: -webkit-box;
-webkit-line-clamp: 2;
-webkit-box-orient: vertical;
text-overflow: ellipsis;
height: 48px;
line-height: 24px;
}
}
}
}
}
</style>
<!-- src/components/HuaweiSupplyChainChart.vue -->
<template>
<div class="chart-container" ref="chartRef"></div>
</template>
<script setup>
import { ref, onMounted } from "vue";
import * as echarts from "echarts";
// import { graphData } from "./mockData";
const graphData = {
nodes: [
{ id: "huawei", name: "美国众议院", category: 0, symbolSize: 80 },
{ id: "huawei-cloud", name: "约翰·斯奎尔斯", category: 0, symbolSize: 50 },
{ id: "huawei-digital-energy", name: "马尔科·卢比奥", category: 0, symbolSize: 50 },
{ id: "huawei-intelligent-car", name: "埃隆·马斯克", category: 0, symbolSize: 50 },
{ id: "qualcomm", name: "道格·伯格姆", category: 1, symbolSize: 50 },
{ id: "intel", name: "斯科特·贝森特", category: 1, symbolSize: 50 },
{ id: "mediatek", name: "杰弗里·凯斯勒", category: 1, symbolSize: 50 },
{ id: "shenghongda", name: "杰弗里·凯斯勒", category: 1, symbolSize: 50 },
{ id: "foxconn", name: "唐纳德·特朗普", category: 1, symbolSize: 50 }
// { id: "luxshare", name: "立讯精密", category: 1, symbolSize: 20 },
// { id: "tianma", name: "天马微电子", category: 1, symbolSize: 20 },
// { id: "desay", name: "德赛电池", category: 1, symbolSize: 20 },
// { id: "auspicious-sound", name: "瑞声科技", category: 1, symbolSize: 20 },
// { id: "goertek", name: "歌尔股份", category: 1, symbolSize: 20 },
// { id: "sony-semiconductor", name: "索尼半导体", category: 1, symbolSize: 20 },
// { id: "ibm", name: "IBM", category: 1, symbolSize: 20 },
// { id: "lg-innotek", name: "LG伊诺特", category: 1, symbolSize: 20 },
// { id: "micron", name: "美光科技", category: 1, symbolSize: 20 }
// { id: "nokia", name: "诺基亚", category: 1, symbolSize: 20 },
// { id: "google", name: "谷歌", category: 1, symbolSize: 20 },
// { id: "vodafone", name: "沃达丰", category: 1, symbolSize: 20 },
// { id: "microsoft", name: "微软", category: 1, symbolSize: 20 },
// { id: "china-unicom", name: "中国联通", category: 1, symbolSize: 20 },
// { id: "china-mobile", name: "中国移动", category: 1, symbolSize: 20 },
// { id: "tsmc", name: "台积电", category: 1, symbolSize: 20 }
// { id: "orange", name: "Orange", category: 1, symbolSize: 20 },
// { id: "germany-telecom", name: "德国电信", category: 1, symbolSize: 20 },
// { id: "byd-electronics", name: "比亚迪电子", category: 1, symbolSize: 20 },
// { id: "boe", name: "京东方", category: 1, symbolSize: 20 },
// { id: "dali-optical", name: "大力光", category: 1, symbolSize: 20 },
// { id: "lg-display", name: "LG显示", category: 1, symbolSize: 20 },
// { id: "sunny-optical", name: "舜宇光学", category: 1, symbolSize: 20 }
],
links: [
{ source: "huawei", target: "huawei-cloud" },
{ source: "huawei", target: "huawei-digital-energy" },
{ source: "huawei", target: "huawei-intelligent-car" },
{ source: "huawei", target: "qualcomm" },
{ source: "huawei", target: "intel" },
{ source: "huawei", target: "mediatek" },
{ source: "huawei", target: "shenghongda" },
{ source: "huawei", target: "foxconn" }
// { source: "huawei", target: "luxshare" },
// { source: "huawei", target: "tianma" },
// { source: "huawei", target: "desay" },
// { source: "huawei", target: "auspicious-sound" },
// { source: "huawei", target: "goertek" },
// { source: "huawei", target: "sony-semiconductor" },
// { source: "huawei", target: "ibm" },
// { source: "huawei", target: "lg-innotek" },
// { source: "huawei", target: "micron" }
// { source: "huawei", target: "nokia" },
// { source: "huawei", target: "google" },
// { source: "huawei", target: "vodafone" },
// { source: "huawei", target: "microsoft" },
// { source: "huawei", target: "china-unicom" },
// { source: "huawei", target: "china-mobile" },
// { source: "huawei", target: "tsmc" }
// { source: "huawei", target: "orange" },
// { source: "huawei", target: "germany-telecom" },
// { source: "huawei", target: "byd-electronics" },
// { source: "huawei", target: "boe" },
// { source: "huawei", target: "dali-optical" },
// { source: "huawei", target: "lg-display" },
// { source: "huawei", target: "sunny-optical" }
],
categories: [{ name: "子业务" }, { name: "合作商" }]
};
const chartRef = ref(null);
onMounted(() => {
const chart = echarts.init(chartRef.value);
const option = {
title: { text: "", left: "center" },
tooltip: {},
legend: {
data: graphData.categories.map(item => item.name),
left: "left"
},
series: [
{
type: "graph",
layout: "force", // 力导向布局
force: {
repulsion: 1000, // 节点排斥力
edgeLength: [50, 200] // 边长度范围
},
data: graphData.nodes,
links: graphData.links,
categories: graphData.categories,
roam: true, // 支持缩放、平移
label: {
show: true,
fontSize: 12
},
edgeSymbol: ["arrow", "none"], // 边的箭头
edgeSymbolSize: [8, 50],
itemStyle: {
color: "rgba(5, 95, 194, 1)"
// borderColor: "red",
// borderWidth: 1
},
lineStyle: {
color: "rgba(174, 214, 255, 1)",
width: 2,
opacity: 0.5
},
emphasis: {
focus: "adjacency",
lineStyle: {
width: 2
}
}
}
]
};
chart.setOption(option);
// 窗口resize时自适应
window.addEventListener("resize", () => chart.resize());
});
</script>
<style scoped>
.chart-container {
width: 100%;
height: 600px;
background-color: #fff; /* 深色背景,模拟原图风格 */
}
</style>
<!-- 中M博弈概览页 -->
<!-- 中M博弈资源支撑 -->
<template>
<div class="resource-box">
<img class="title-img" src="@/assets/images/bg/概览页模块标题2.png"></img>
<DivideHeader class="divide1" :titleText="'中美博弈资源支撑'"></DivideHeader>
<div style="margin-top: 20px;height: 450px;display: flex;">
<div class="resource-content" style="width: 45%; display: block;">
<div class="resource-content" style="width: 47.5%; display: block;">
<div class="item-header">
<img class="item-header-icon" src="@/assets/images/icon/thematic-card-header-time.png"></img>
<div class="item-header-text">中美博弈资源新闻动态</div>
<div class="item-header-right"> 更多 +</div>
</div>
<div class="item-header-divider"></div>
<div style=" height: 400px;overflow: auto;">
<el-timeline style="max-width: 600px;padding: 25px; ">
<el-timeline-item placement="top" v-for="(activity, index) in newsData" :key="index" :icon="activity.icon"
type="primary" :hollow="true" :timestamp="activity.time">
<div class="row">
<div class="content-wrapper">
{{ activity.content }}
</div>
<img :src="activity.image" />
</div>
</el-timeline-item>
</el-timeline>
</div>
</div>
<div class="resource-content" style="width: 45%;margin-left: 5%;">
<div class="resource-content" style="width: 47.5%;margin-left: 5%;">
<div class="item-header">
<img class="item-header-icon" src="@/assets/images/icon/thematic-card-header-time.png"></img>
<div class="item-header-text">创新主体排名</div>
<div class="item-header-text" style="width: 130px;">创新主体排名</div>
<el-radio-group v-model="InnovationRankingBtn" size="small" @change="handleInnovationRankingBtn">
<el-radio-button value="enterprise" border>科技企业
</el-radio-button>
<el-radio-button value="lab" border>国家重点实验室</el-radio-button>
<el-radio-button value="university" border>研究型大学
</el-radio-button>
<el-radio-button value="contractor" border>国防承包商</el-radio-button>
</el-radio-group>
</div>
<div class="item-header-divider"></div>
<el-table :data="InnovationRanking" stripe style="width: 100%;padding: 5px 25px;"
:header-cell-style="headerCellStyle">
<el-table-column prop="name" label="创新主体" width="100" />
<el-table-column prop="markValue" align="right">
<template #header>
<div class="custom-header">
<div class="label">市值</div>
<div class="unit">(亿元)</div>
</div>
</template>
</el-table-column>
<el-table-column label="所属领域" width="180">
<template #default="scope">
<div style="display: flex; align-items: center; gap: 5px">
<el-tag v-for="tag in scope.row.area" :key="tag" :type="tag === '人工智能'
? 'primary'
: TAGTYPE[Math.floor(Math.random() * 5)]
">{{ tag }}</el-tag>
</div>
</template>
</el-table-column>
<el-table-column label="创新实力">
<template #default="scope">
<div style="display: flex; align-items: center">
<el-progress :percentage="scope.row.value * 100" :show-text="false" style="width: 50px;"
:status="getStatus(scope.row.value)" />
</div>
</template>
</el-table-column>
</el-table>
</div>
</div>
<div style="margin-top: 20px;height: 450px;display: flex;">
<div class="resource-content" style="width: 45%; display: block;">
<div class="resource-content" style="width: 47.5%; display: block;">
<div class="item-header">
<img class="item-header-icon" src="@/assets/images/icon/thematic-card-header-time.png"></img>
<div class="item-header-text">研发投入情况</div>
......@@ -37,7 +92,7 @@
</div>
</div>
<div class="resource-content" style="width: 45%;margin-left: 5%;">
<div class="resource-content" style="width: 47.5%;margin-left: 5%;">
<div class="item-header">
<img class="item-header-icon" src="@/assets/images/icon/thematic-card-header-time.png"></img>
<div class="item-header-text">研发投入领域</div>
......@@ -51,7 +106,7 @@
</div>
<div style="margin-top: 20px;height: 450px;display: flex;">
<div class="resource-content" style="width: 45%; display: block;">
<div class="resource-content" style="width: 47.5%; display: block;">
<div class="item-header">
<img class="item-header-icon" src="@/assets/images/icon/thematic-card-header-time.png"></img>
<div class="item-header-text">专利申请情况</div>
......@@ -62,7 +117,7 @@
</div>
</div>
<div class="resource-content" style="width: 45%;margin-left: 5%;">
<div class="resource-content" style="width: 47.5%;margin-left: 5%;">
<div class="item-header">
<img class="item-header-icon" src="@/assets/images/icon/thematic-card-header-time.png"></img>
<div class="item-header-text">论文发表情况</div>
......@@ -82,6 +137,8 @@
<script setup>
import { onMounted, ref, computed } from "vue";
import * as echarts from "echarts";
import DivideHeader from "@/components/DivideHeader.vue";
import { TAGTYPE } from "@/public/constant";
import getBarChart2 from '../js/barChart2.js'
import radarChart2 from '../js/radarChart2.js'
import getMultiLineChart1 from "../js/multiLineChart1.js";
......@@ -91,6 +148,83 @@ const names = ['Jan', 'Feb', 'Mar', 'Apr', 'May']
const data1 = [120, 200, 150, 80, 70]
const data2 = [90, 230, 180, 110, 100]
//博弈资源新闻动态
const newsData = ref([
{
time: ' 2025-07-31',
content: '美商务部发布指南,警告全球企业使用华为异腾芯片可能违反美国出口管制。意在限制中国AI产业发展,阻碍其获得先进算力。',
image: '/testData/newsData1.jpg',
},
{
time: '2025-07-30',
content: '美商务部持续对多种中国产品发起“双反”(反倾销、反补贴)调查并作出裁决,涉及产品从工业原料到日常用品,且裁定的税率普遍较高。',
image: '/testData/newsData1.jpg',
}, {
time: '2025-07-30',
content: '美商务部进一步收紧对华先进半导体出口管制,将更多中国实体列入“实体清单”限制14纳米及以下先进芯片、DRAM等对华出口。',
image: '/testData/newsData1.jpg',
}, {
time: '2025-07-27',
content: '美商务部发起第三次反倾销和反补贴日落复审调査。',
image: '/testData/newsData1.jpg',
}
])
function headerCellStyle() {
return {
color: 'rgba(59, 65, 75, 1)',
fontSize: '16px',
fontWeight: 700,
};
}
//创新主体排名
const InnovationRanking = ref([
{
name: '微软(Microsoft)',
markValue: '3200',
area: ['人工智能', '先进制造'],
value: 0.9
}, {
name: '苹果(Apple)',
markValue: '1600',
area: ['人工智能'],
value: 0.8
}, {
name: '英伟达(NVIDIA)',
markValue: '1200',
area: ['人工智能'],
value: 0.7
}, {
name: '谷歌(Google)',
markValue: '800',
area: ['人工智能'],
value: 0.5
}, {
name: 'Meta (Facebook)',
markValue: '900',
area: ['人工智能'],
value: 0.2
}
])
// 进度条状态
const getStatus = _percent => {
const percent = _percent * 100;
if (percent >= 90) {
return "exception";
} else if (percent >= 50) {
return "warning";
} else {
return "success";
}
};
//科技主体排名按钮
const InnovationRankingBtn = ref('enterprise')
function handleInnovationRankingBtn() {
}
//专利申请情况
const chart5Data = ref({
title: [
......@@ -145,6 +279,11 @@ onMounted(() => {
</script>
<style lang="scss" scoped>
.divide1 {
margin-top: 64px;
margin-bottom: 36px;
}
.resource-box {
height: 1550px;
}
......@@ -173,6 +312,44 @@ onMounted(() => {
box-shadow: 0px 0px 20px 0px rgba(25, 69, 130, 0.1);
background: rgba(255, 255, 255, 1);
.row {
display: flex;
/* 横向排列 */
align-items: center;
/* 垂直居中(可选) */
width: 100%;
/* 和外层容器同宽 */
}
.content-wrapper {
flex: 1 1 auto;
/* 占满剩余空间,把图片顶到最右 */
/* 文字过长时自动换行 */
word-break: break-all;
}
.row img {
width: 96px;
height: 72px;
margin-left: 8px;
/* 图片与文字间距,可删 */
flex-shrink: 0;
/* 防止图片被压缩 */
}
:deep(.el-timeline-item__timestamp.is-top) {
color: rgba(59, 65, 75, 1);
font-size: 16px;
font-weight: 700;
line-height: 24px;
text-align: left;
}
:deep(.el-timeline-item__node.is-hollow) {
border-width: 4px
}
.item-header {
height: 48px;
width: 100%;
......@@ -226,6 +403,24 @@ onMounted(() => {
}
}
.custom-header {
text-align: center;
line-height: 1.3;
}
.custom-header .label {
color: rgba(59, 65, 75, 1);
font-size: 16px;
font-weight: 700;
line-height: 24px;
}
.custom-header .unit {
font-size: 12px;
color: #909399;
}
.item-header-divider {
/* 矩形 249 */
width: 100%;
......
<!-- 中M博弈概览页 -->
<!-- 打压遏制ts分析 -->
<template>
<div class="thematic-box">
<div class="title-text">中美博弈专题分析</div>
<img class="title-img" src="@/assets/images/bg/概览页模块标题.png"></img>
<DivideHeader class="divide" :titleText="'打压遏制态势分析'"></DivideHeader>
<div class="thematic-content">
<div class="item-header">
<img class="item-header-icon" src="@/assets/images/icon/thematic-card-header-time.png"></img>
......@@ -12,11 +12,13 @@
</div>
<div class="item-header-divider"></div>
<div style="display: flex;height: calc(100% - 60px);">
<div class="thematic-btn-left" @click="changeBtn('timwLine', 'left')">
<!-- <div class="thematic-btn-left" @click="changeBtn('timwLine', 'left')">
<img class="thematic-btn-icon" src="@/assets/images/icon/card-btn-left.png"></img>
</div>
<div class="timeLine-box">
</div> -->
<Timeline :data="course" text-key="title" id-key="seq" @click-card="showDetail" />
<!-- <div class="timeLine-box">
<div style="height: calc(50% - 8px);display: flex">
<div v-for="(item, index) in timeLineOddIndexItems" class="time-item-box">
{{ item.titlle }}
......@@ -28,7 +30,7 @@
{{ item.titlle }}
</div>
</div>
</div>
</div> -->
<div class="thematic-btn-right" @click="changeBtn('right')">
<img class="thematic-btn-icon" src="@/assets/images/icon/card-btn-right.png"></img>
......@@ -84,7 +86,7 @@
</div>
<div style="margin-top: 20px;height: 450px;display: flex;">
<div class="thematic-content" style="width: 45%; display: block;">
<div class="thematic-content" style="width: 47.5%; display: block;">
<div class="item-header">
<img class="item-header-icon" src="@/assets/images/icon/thematic-card-header-time.png"></img>
<div class="item-header-text">打压遏制强度变化</div>
......@@ -96,7 +98,7 @@
</div>
</div>
<div class="thematic-content" style="width: 45%;margin-left: 5%;">
<div class="thematic-content" style="width: 47.5%;margin-left: 5%;">
<div class="item-header">
<img class="item-header-icon" src="@/assets/images/icon/thematic-card-header-time.png"></img>
<div class="item-header-text">打压遏制强度变化</div>
......@@ -117,36 +119,69 @@
<script setup>
import { onMounted, ref, computed } from "vue";
import * as echarts from "echarts";
import DivideHeader from "@/components/DivideHeader.vue";
import Timeline from '../component/Timeline.vue'
import getBarChart from '../js/barChart.js'
import radarChart from '../js/radarChart.js'
const timeLine = ref([
const course = ref([
{
time: '2025年1月',
titlle: '《AI扩散暂行最终规则》发布0',
title: '《AI扩散暂行最终规则》发布',
content: '拜登政府发布《AI扩散暂行最终规则》,建立三级许可制度。'
},
{
time: '2025年1月',
titlle: '《AI扩散暂行最终规则》发布1',
title: '特朗普宣布撤销拜登AI规则',
content: '拜登政府发布《AI扩散暂行最终规则》,建立三级许可制度。'
},
{
time: '2025年1月',
titlle: '特朗普签署EO 143202',
title: '特朗普签署EO 143202',
content: '特朗普政府宣布撤销拜登AI规则,计划'
},
{
time: '2025年1月',
title: '中国网信办约谈英伟达',
content: '中国网信办约谈英伟达,要求就H20算力芯片漏洞后门安全风险问题进行说明。'
},
{
time: '2025年7月23日',
title: '英伟达H20发放出口许可证',
content: '美国商务部为4月份被实质禁售的英伟达H20发放出口许可证。'
},
{
time: '2025年1月',
title: '《AI扩散暂行最终规则》发布',
content: '拜登政府发布《AI扩散暂行最终规则》,建立三级许可制度。'
},
{
time: '2025年1月',
titlle: '《AI扩散暂行最终规则》发布3',
title: '特朗普宣布撤销拜登AI规则',
content: '拜登政府发布《AI扩散暂行最终规则》,建立三级许可制度。'
},
{
time: '2025年1月',
title: '特朗普签署EO 143202',
content: '特朗普政府宣布撤销拜登AI规则,计划'
},
{
time: '2025年1月',
title: '中国网信办约谈英伟达',
content: '中国网信办约谈英伟达,要求就H20算力芯片漏洞后门安全风险问题进行说明。'
},
{
time: '2025年7月23日',
titlle: '《AI扩散暂行最终规则》发布4',
content: '拜登政府发布《AI扩散暂行最终规则》,建立三级许可制度。'
title: '英伟达H20发放出口许可证',
content: '美国商务部为4月份被实质禁售的英伟达H20发放出口许可证。'
},
])
function showDetail(item) {
console.log('点击了:', item);
}
// 过滤出奇数下标(1,3,5...)
const timeLineOddIndexItems = computed(() =>
timeLine.value.filter((_, idx) => idx % 2 === 1)
......@@ -344,6 +379,13 @@ onMounted(() => {
.thematic-box {
height: 1500px;
.divide {
width: 100%;
margin: 0 auto;
margin-top: 52px;
margin-bottom: 36px;
}
}
.title-text {
......@@ -370,6 +412,8 @@ onMounted(() => {
box-shadow: 0px 0px 20px 0px rgba(25, 69, 130, 0.1);
background: rgba(255, 255, 255, 1);
.item-header {
height: 48px;
width: 100%;
......
<template>
<div class="timeline-wrapper">
<button class="arrow left" :disabled="index <= 0" @click="index--">
&lt;
</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="dot" :class="linePos(i, flip)"></div>
<!-- 卡片:放到线右侧 -->
<div class="card" :class="[cardPos(i, flip), 'right-side']" @click="$emit('click-card', item)">
<div class="title">
{{ item.time }}
</div>
<div class="name">
{{ item.name }}
</div>
<div class="content">
{{ item.content }}
</div>
</div>
</div>
</div>
</div>
<button class="arrow right" :disabled="index >= total - 5" @click="index++">
&gt;
</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';
},
/* 线延伸方向 = 卡片出现方向 */
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;
box-sizing: border-box;
}
.arrow {
position: absolute;
top: 50%;
transform: translateY(-50%);
width: 32px;
height: 32px;
border-radius: 50%;
border: 1px solid #dcdfe6;
background: #fff;
cursor: pointer;
z-index: 10;
}
.arrow:disabled {
color: #c0c4cc;
cursor: not-allowed;
}
.left {
left: 0;
}
.right {
right: 0;
}
.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 {
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: 120px;
/* 圆环底部 → 卡片顶 */
}
/* 向下节点:线往上伸 */
.dot.down::after {
top: 100%;
height: 120px;
}
.card {
position: absolute;
height: 120px;
width: 15vw;
padding: 8px 12px;
text-align: center;
cursor: pointer;
font-size: 14px;
}
.title {
color: rgba(5, 95, 194, 1);
font-size: 18px;
font-weight: 700;
line-height: 26px;
letter-spacing: 0px;
text-align: justify;
}
.name {
color: var(----80, rgba(59, 65, 75, 1));
font-size: 20px;
font-weight: 700;
line-height: 26px;
letter-spacing: 0px;
text-align: justify;
}
.content {}
.card.up {
bottom: 20px;
}
.card.down {
top: 20px;
}
</style>
\ No newline at end of file
<!-- 中M博弈概览页 -->
<!-- 中M科技实力对比 -->
<template>
<div class="resource-box">
<img class="title-img" src="@/assets/images/bg/概览页模块标题3.png"></img>
<DivideHeader class="divide1" :titleText="'中美科技实力对比'"></DivideHeader>
<div style="margin-top: 20px;height: 450px;display: flex;">
<div class="resource-content" style="width:100%; display: flex;">
......@@ -49,6 +48,7 @@
<script setup>
import { onMounted, ref, computed } from "vue";
import * as echarts from "echarts";
import DivideHeader from "@/components/DivideHeader.vue";
import radarChart3 from '../js/radarChart3.js'
......@@ -94,6 +94,11 @@ onMounted(() => {
</script>
<style lang="scss" scoped>
.divide1 {
margin-top: 64px;
margin-bottom: 36px;
}
/* ========== 一行两个 ========== */
.progress-row {
display: flex;
......
......@@ -377,7 +377,7 @@ onMounted(() => { });
width: 100%;
height: 100%;
overflow: auto;
padding: 0 160px;
padding: 0 10%;
.title-text {
font-size: 32px;
......
......@@ -16,7 +16,8 @@
</div>
<div class="btn" @click="handleSwitchMode">
<div class="icon">
<img src="./assets/images/preview-icon.png" alt="" />
<img v-if="isEditMode" src="./assets/images/preview-icon.png" alt="" />
<img v-else src="./assets/images/edit.png" alt="" />
</div>
<div class="text">{{ isEditMode ? "预览" : "编辑" }}</div>
</div>
......@@ -92,6 +93,62 @@
<div class="submit-text">生成报文</div>
</div>
</div>
<!-- <div class="process-box">
<div class="back">
{{ "< 返回" }}
</div>
<div class="process-main-box">
<div class="analysis-box">
<div class="analysis-header">
<div class="icon">
<img src="./assets/images/right-arrow.png" alt="" />
</div>
<div class="text">{{ "任务分析:" }}</div>
</div>
<div class="analysis-content">
{{
"用户需求属于态势要图制图任务,需要围绕“伊以冲突”主题生成关键词、搜索相关新闻、抽取并聚类事件、获取地理位置信息,最终完成事件和地点的可视化标绘"
}}
</div>
</div>
<div class="steps-box">
<div class="steps-header">
<div class="icon">
<img src="./assets/images/right-arrow.png" alt="" />
</div>
<div class="text">{{ "执行步骤:" }}</div>
</div>
<div class="steps-content">
<div class="steps" v-for="(step, index) in steps" :key="index">
<div class="steps-id">{{ step.id }}</div>
<div class="steps-content">{{ step.content }}</div>
</div>
</div>
</div>
<div class="doing-box">
{{ "正在执行步骤1/7:根据制图主题生成关键词" }}
</div>
<div class="tool-box">
<div class="tool-header">{{ '工具调用' }}</div>
<div class="tool-main"></div>
</div>
</div>
<div class="process-tips-box">
<div class="tips-icon">
<img src="./assets/images/tips-icon.png" alt="" />
</div>
<div class="tips-text">内容由AI生成,无法确保真实准确,仅供参考</div>
</div>
<div class="process-footer-box">
<div class="footer-left">
{{ "报文生成中..." }}
</div>
<div class="footer-right">
<div class="icon"></div>
<div class="text">{{ "停止" }}</div>
</div>
</div>
</div> -->
<div class="main-box">
<div v-if="isEditMode" class="edit-panel">
<v-md-editor
......@@ -127,6 +184,37 @@ VMdEditor.use(vuepressTheme, {
Prism
});
const steps = [
{
id: 1,
content: "111111111111111111111111111"
},
{
id: 2,
content: "111111111111111111111111111"
},
{
id: 3,
content: "111111111111111111111111111222222222222222222222222222222222233333333333333333333333333"
},
{
id: 4,
content: "111111111111111111111111111"
},
{
id: 5,
content: "111111111111111111111111111"
},
{
id: 6,
content: "111111111111111111111111111"
},
{
id: 7,
content: "111111111111111111111111111"
}
];
const isEditMode = ref(false);
const handleSwitchMode = () => {
......@@ -162,9 +250,13 @@ const { renderedContent, updateContent } = useMarkdownStream();
const reportContent = ref("");
const curTempTitle = ref("法案");
const getStreamChat = async (search, inputValue) => {
const params = {
query: "输出一篇报文"
query: writtingTitle.value, // "输出一篇报文"
desc: descText.value,
topic: curTempTitle.value // 政令、智库、法案、清单
};
abortController.value = new AbortController();
......@@ -185,8 +277,12 @@ const getStreamChat = async (search, inputValue) => {
console.log("resss", msgData.content);
let str = msgData.content;
if (str !== "[DONE]") {
reportContent.value += str;
updateContent(reportContent.value, scrollContainer.value);
reportContent.value += str;
if (reportContent.value.includes("./out/img")) {
reportContent.value = reportContent.value.replaceAll("./out/img", "http://192.168.26.70:8000/out/img");
console.log(111, reportContent.value);
}
updateContent(reportContent.value, scrollContainer.value);
} else {
ElMessage.success("报文生成结束");
abortController.value.abort();
......@@ -231,12 +327,20 @@ const tabList = ref([
]);
const tempList = ref([
{
title: "主题报",
desc: "基于特定主题生成各维度的综合分析报告"
title: "法案",
desc: "基于法案内容生成各维度的综合分析报告"
},
{
title: "智库",
desc: "基于智库内容生成各维度的综合分析报告"
},
{
title: "政令",
desc: "基于政令内容生成各维度的综合分析报告"
},
{
title: "统计速报",
desc: "基于定期更新的数据源生成各关键指标统计"
title: "清单",
desc: "基于清单内容生成各维度的综合分析报告"
}
]);
......@@ -244,6 +348,7 @@ const tempActiveIndex = ref(0);
const handleClickTemp = (item, index) => {
tempActiveIndex.value = index;
curTempTitle.value = item.title;
};
// 导出
......@@ -352,6 +457,217 @@ onUnmounted(() => {
.writting-main {
display: flex;
height: calc(100% - 60px);
position: relative;
.process-box {
position: absolute;
left: 0;
top: 0;
width: 520px;
height: 100%;
z-index: 9999;
background: #fff;
.back {
margin-top: 21px;
height: 24px;
line-height: 24px;
margin-left: 22px;
color: var(--color-main-active);
font-family: Microsoft YaHei;
font-size: 16px;
font-weight: 400;
line-height: 24px;
cursor: pointer;
}
.process-main-box {
margin-top: 20px;
margin-left: 22px;
width: 476px;
height: 900px;
// background: orange;
.analysis-box {
.analysis-header {
display: flex;
.icon {
margin-top: 5px;
width: 20px;
height: 20px;
img {
width: 100%;
height: 100%;
}
}
.text {
height: 30px;
line-height: 30px;
font-family: Microsoft YaHei;
color: #333;
font-size: 20px;
font-weight: 700;
margin-left: 5px;
}
}
.analysis-content {
height: 90px;
line-height: 30px;
color: #555;
font-family: Microsoft YaHei;
font-size: 16px;
font-weight: 400;
text-indent: 32px;
}
}
.steps-box {
margin-top: 20px;
.steps-header {
display: flex;
.icon {
margin-top: 5px;
width: 20px;
height: 20px;
img {
width: 100%;
height: 100%;
}
}
.text {
height: 30px;
line-height: 30px;
font-family: Microsoft YaHei;
color: #333;
font-size: 20px;
font-weight: 700;
margin-left: 5px;
}
}
.steps-content {
max-height: 500px;
width: 100%;
background: skyblue;
overflow-x: hidden;
overflow-y: auto;
.steps {
display: flex;
width: 410px;
margin-left: 40px;
color: #555;
font-family: Microsoft YaHei;
line-height: 35px;
.steps-id {
width: 20px;
font-size: 18px;
font-weight: 700;
}
.steps-content {
font-size: 16px;
font-weight: 400;
width: 430px;
word-wrap: break-word;
}
}
}
}
.doing-box {
height: 40px;
line-height: 40px;
color: #555;
font-family: Microsoft YaHei;
font-size: 16px;
font-weight: 400;
margin-left: 20px;
}
.tool-box {
width: 440px;
height: 160px;
margin: 10px auto;
background: #f6f9fe;
border-radius: 10px;
.tool-header {
height: 30px;
line-height: 30px;
margin-left: 20px;
color: var(--color-main-active);
}
.tool-main {
height: 110px;
width: 400px;
margin: 0 auto;
background: #fff;
}
}
}
.process-tips-box {
position: absolute;
left: 22px;
bottom: 81px;
height: 22px;
display: flex;
.tips-icon {
width: 14px;
height: 16px;
margin-top: 3px;
img {
width: 100%;
height: 100%;
}
}
.tips-text {
margin-left: 8px;
color: rgba(132, 136, 142, 1);
font-family: Microsoft YaHei;
font-size: 14px;
font-weight: 400;
line-height: 22px;
}
}
.process-footer-box {
height: 36px;
display: flex;
position: absolute;
left: 22px;
bottom: 29px;
.footer-left {
width: 348px;
height: 36px;
border-radius: 4px;
background: rgba(234, 236, 238, 1);
color: rgba(132, 136, 142, 1);
font-family: Microsoft YaHei;
font-size: 16px;
font-weight: 400;
text-align: center;
line-height: 36px;
}
.footer-right {
margin-left: 8px;
display: flex;
width: 120px;
height: 36px;
box-sizing: border-box;
border: 1px solid var(--color-main-active);
border-radius: 4px;
background: rgba(246, 250, 255, 1);
justify-content: center;
align-items: center;
gap: 8px;
cursor: pointer;
.icon {
width: 8px;
height: 8px;
border-radius: 2px;
background: var(--color-main-active);
}
.text {
color: var(--color-main-active);
font-family: Microsoft YaHei;
font-size: 16px;
font-weight: 400;
line-height: 24px;
}
}
}
}
.sider {
width: 520px;
box-sizing: border-box;
......@@ -411,10 +727,10 @@ onUnmounted(() => {
}
.template-box {
margin-top: 19px;
height: 120px;
height: 260px;
display: flex;
flex-wrap: wrap;
gap: 16px;
.template {
width: 230px;
height: 120px;
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论