提交 46febd14 authored 作者: coderBryanFu's avatar coderBryanFu

update

<!-- 中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;
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论