提交 42c74a3f authored 作者: 张烨's avatar 张烨

科技政令-深度挖掘增加冲突关系弹出框

上级 9b312ae7
...@@ -364,7 +364,7 @@ ...@@ -364,7 +364,7 @@
</div> </div>
</div> </div>
</div> </div>
<div class="select-box"> <!-- <div class="select-box">
<div class="select-box-header"> <div class="select-box-header">
<div class="icon"></div> <div class="icon"></div>
<div class="title">{{ "涉及领域" }}</div> <div class="title">{{ "涉及领域" }}</div>
...@@ -378,7 +378,7 @@ ...@@ -378,7 +378,7 @@
</el-checkbox> </el-checkbox>
</div> </div>
</div> </div>
</div> </div> -->
</div> </div>
<div class="right"> <div class="right">
<div class="content-header"> <div class="content-header">
...@@ -521,6 +521,7 @@ const pageSize = ref(10); ...@@ -521,6 +521,7 @@ const pageSize = ref(10);
// 处理页码改变事件 // 处理页码改变事件
const handleCurrentChange = page => { const handleCurrentChange = page => {
currentPage.value = page; currentPage.value = page;
handleToPosi('position4')
handleGetDecreeOrderList(); handleGetDecreeOrderList();
}; };
...@@ -1235,7 +1236,8 @@ const handleGetDecreeOrderList = async () => { ...@@ -1235,7 +1236,8 @@ const handleGetDecreeOrderList = async () => {
watch([activePubTime, activeAreaList, checkedGovIns, isSort, isChina, searchType], val => { watch([activePubTime, activeAreaList, checkedGovIns, isSort, isChina, searchType], val => {
// 切换页码到第一页 // 切换页码到第一页
handleCurrentChange(1); currentPage.value = 1;
handleGetDecreeOrderList();
}); });
// 切换当前政令 // 切换当前政令
...@@ -3182,11 +3184,11 @@ onMounted(async () => { ...@@ -3182,11 +3184,11 @@ onMounted(async () => {
border-radius: 10px; border-radius: 10px;
.select-box { .select-box {
margin-top: 21px; margin-top: 16px;
.select-box-header { .select-box-header {
display: flex; display: flex;
gap: 17px; gap: 16px;
.icon { .icon {
margin-top: 4px; margin-top: 4px;
......
...@@ -328,7 +328,7 @@ onMounted(() => { ...@@ -328,7 +328,7 @@ onMounted(() => {
.icon1 { .icon1 {
width: 19px; width: 19px;
height: 20px; height: 20px;
background-image: url("./assets/images/ai.png"); background-image: url("../assets/icons/ai.png");
background-size: 100% 100%; background-size: 100% 100%;
flex-shrink: 0; flex-shrink: 0;
} }
...@@ -356,7 +356,7 @@ onMounted(() => { ...@@ -356,7 +356,7 @@ onMounted(() => {
.icon2 { .icon2 {
width: 24px; width: 24px;
height: 24px; height: 24px;
background-image: url("./assets/images/right.png"); background-image: url("../assets/icons/right.png");
background-size: 100% 100%; background-size: 100% 100%;
} }
} }
......
...@@ -11,20 +11,22 @@ ...@@ -11,20 +11,22 @@
</div> </div>
</div> </div>
</template> </template>
<div class="box1-main"> <div class="box1-container">
<el-empty v-if="backgroundList.length === 0" style="padding-top: 60px;" description="暂无数据" :image-size="100" /> <div class="box1-main">
<div class="box1-item" v-for="(item, index) in backgroundList" :key="index"> <el-empty v-if="backgroundList.length === 0" style="padding-top: 60px;" description="暂无数据" :image-size="100" />
<div class="id">{{ index + 1 }}</div> <div class="box1-item" v-for="(item, index) in backgroundList" :key="index">
<div class="title">{{ item.content }}</div> <div class="id">{{ index + 1 }}</div>
<div class="open"> <div class="title">{{ item.content }}</div>
<img src="./assets/images/open-icon.png" alt="" /> <div class="open">
<img src="./assets/images/open-icon.png" alt="" />
</div>
</div> </div>
</div> </div>
</div> <div class="box1-footer">
<div class="box1-footer"> <div class="box1-footer-left">{{ `共 ${backgroundListNum} 项` }}</div>
<div class="box1-footer-left">{{ `共 ${backgroundListNum} 项` }}</div> <div class="box1-footer-right">
<div class="box1-footer-right"> <el-pagination :page-size="10" @current-change="handleCurrentChange" :current-page="currentPage" background layout="prev, pager, next" :total="backgroundListNum" />
<el-pagination :page-size="10" @current-change="handleCurrentChange" :current-page="currentPage" background layout="prev, pager, next" :total="backgroundListNum" /> </div>
</div> </div>
</div> </div>
</AnalysisBox> </AnalysisBox>
...@@ -203,7 +205,6 @@ onMounted(() => { ...@@ -203,7 +205,6 @@ onMounted(() => {
.introduction-wrap { .introduction-wrap {
display: flex; display: flex;
width: 1600px; width: 1600px;
height: 901px;
padding: 16px 0; padding: 16px 0;
gap: 16px; gap: 16px;
...@@ -215,8 +216,7 @@ onMounted(() => { ...@@ -215,8 +216,7 @@ onMounted(() => {
gap: 16px; gap: 16px;
.box1 { .box1 {
height: 50%; height: 690px;
flex: auto;
.header-btn-box { .header-btn-box {
display: flex; display: flex;
...@@ -245,12 +245,17 @@ onMounted(() => { ...@@ -245,12 +245,17 @@ onMounted(() => {
} }
} }
.box1-container {
height: 100%;
display: flex;
flex-direction: column;
padding: 16px;
}
.box1-main { .box1-main {
margin-top: 16px;
margin-left: 22px;
width: 1034px; width: 1034px;
height: 290px; height: 20px;
overflow: hidden; flex: auto;
overflow-y: auto; overflow-y: auto;
.box1-item { .box1-item {
...@@ -300,7 +305,6 @@ onMounted(() => { ...@@ -300,7 +305,6 @@ onMounted(() => {
} }
.box1-footer { .box1-footer {
margin: 20px 22px;
display: flex; display: flex;
justify-content: space-between; justify-content: space-between;
...@@ -316,14 +320,11 @@ onMounted(() => { ...@@ -316,14 +320,11 @@ onMounted(() => {
} }
.box2 { .box2 {
height: 50%; height: 500px;
flex: auto;
.box2-main { .box2-main {
margin-top: 3px; padding: 16px 20px;
margin-left: 31px; height: 100%;
height: 330px;
width: 1004px;
overflow: hidden; overflow: hidden;
overflow-y: auto; overflow-y: auto;
.custom-collapse { .custom-collapse {
...@@ -335,6 +336,9 @@ onMounted(() => { ...@@ -335,6 +336,9 @@ onMounted(() => {
:deep(.el-collapse-item__header) { :deep(.el-collapse-item__header) {
border-bottom: 1px solid rgba(234, 236, 238, 1); border-bottom: 1px solid rgba(234, 236, 238, 1);
} }
:deep(.el-collapse-item__content) {
padding-bottom: 16px;
}
.custom-collapse-title { .custom-collapse-title {
position: relative; position: relative;
.custom-collapse-index { .custom-collapse-index {
......
...@@ -114,7 +114,6 @@ onMounted(() => { ...@@ -114,7 +114,6 @@ onMounted(() => {
} }
.main { .main {
width: 1760px; width: 1760px;
height: 901px;
} }
} }
</style> </style>
\ No newline at end of file
...@@ -29,19 +29,19 @@ ...@@ -29,19 +29,19 @@
</div> </div>
<!-- 渲染一级列表 --> <!-- 渲染一级列表 -->
<div class="numbered-list"> <div class="numbered-list">
<div v-for="(item, itemIndex) in section.children" :key="itemIndex" class="list-item"> <div v-for="(item, itemIndex) in section.slaver" :key="itemIndex" class="list-item">
<div class="list-item-dot">{{itemIndex+1}}.</div> <div class="list-item-dot">{{itemIndex+1}}.</div>
<div class="list-item-word">{{ item.content }}</div> <div class="list-item-word">{{ item.content }}</div>
<!-- 渲染二级列表 --> <!-- 渲染二级列表 -->
<div v-if="item.children" class="sub-list"> <div v-if="item.slaver" class="sub-list">
<div v-for="(subItem, subIndex) in item.children" :key="subIndex" class="sub-item"> <div v-for="(subItem, subIndex) in item.slaver" :key="subIndex" class="sub-item">
<div class="sub-item-dot">({{subIndex+1}})</div> <div class="sub-item-dot">({{subIndex+1}})</div>
<div class="sub-item-word">{{ subItem.content }}</div> <div class="sub-item-word">{{ subItem.content }}</div>
<!-- 渲染三级列表 --> <!-- 渲染三级列表 -->
<div v-if="subItem.children" class="sub-sub-list"> <div v-if="subItem.slaver" class="sub-sub-list">
<div v-for="(subSubItem, subSubIndex) in subItem.children" :key="subSubIndex" class="sub-sub-item"> <div v-for="(subSubItem, subSubIndex) in subItem.slaver" :key="subSubIndex" class="sub-sub-item">
<div class="sub-sub-item-dot">{{ALPHABET[subSubIndex%26]}}.</div> <div class="sub-sub-item-dot">{{ALPHABET[subSubIndex%26]}}.</div>
<div class="sub-sub-item-word">{{ subSubItem.content }}</div> <div class="sub-sub-item-word">{{ subSubItem.content }}</div>
</div> </div>
...@@ -149,16 +149,16 @@ const commandWord = ref(""); ...@@ -149,16 +149,16 @@ const commandWord = ref("");
const contentList = ref([ const contentList = ref([
// { // {
// content: "建立美国人工智能出口计划建立美国人工智能出口计划建立美国人工智能出口计划建立美国人工智能出口计划建立美国人工智能出口计划", // content: "建立美国人工智能出口计划建立美国人工智能出口计划建立美国人工智能出口计划建立美国人工智能出口计划建立美国人工智能出口计划",
// children: [ // slaver: [
// { // {
// content: '在本命令发布之日起 90 天内,商务部长应与国务卿及科学技术政策办公室(OSTP)主任协商,建立并实施美国人工智能出口计划(计划),以支持美国全栈人工智能出口软件包的开发和部署。' // content: '在本命令发布之日起 90 天内,商务部长应与国务卿及科学技术政策办公室(OSTP)主任协商,建立并实施美国人工智能出口计划(计划),以支持美国全栈人工智能出口软件包的开发和部署。'
// }, // },
// { // {
// content: '商务部长应公开征集由行业主导的联盟提案,以纳入该计划。公开征集要求每项提案必须:', // content: '商务部长应公开征集由行业主导的联盟提案,以纳入该计划。公开征集要求每项提案必须:',
// children: [ // slaver: [
// { // {
// content: '包含一套全栈人工智能技术包,涵盖:', // content: '包含一套全栈人工智能技术包,涵盖:',
// children: [ // slaver: [
// { // {
// content: 'AI 优化的计算机硬件(如芯片、服务器和加速器)、数据中心存储、云服务和网络,以及这些设备是否以及在多大程度上在美国制造的描述;' // content: 'AI 优化的计算机硬件(如芯片、服务器和加速器)、数据中心存储、云服务和网络,以及这些设备是否以及在多大程度上在美国制造的描述;'
// }, // },
...@@ -200,7 +200,7 @@ const contentList = ref([ ...@@ -200,7 +200,7 @@ const contentList = ref([
// }, // },
// { // {
// content: "动员联邦融资工具", // content: "动员联邦融资工具",
// children: [ // slaver: [
// { // {
// content: '经济外交行动小组(EDAG),于 2024 年 6 月 21 日总统备忘录中成立,由国务卿主持,并与商务部长和美国贸易代表协商,并根据 2019 年《通过外交倡导美国企业法案》(公共法 116-94 J 部分第七章)第 708 条(CABDA)所述,应协调联邦融资工具的动员,以支持优先的人工智能出口方案。' // content: '经济外交行动小组(EDAG),于 2024 年 6 月 21 日总统备忘录中成立,由国务卿主持,并与商务部长和美国贸易代表协商,并根据 2019 年《通过外交倡导美国企业法案》(公共法 116-94 J 部分第七章)第 708 条(CABDA)所述,应协调联邦融资工具的动员,以支持优先的人工智能出口方案。'
// }, // },
...@@ -319,7 +319,6 @@ onMounted(() => { ...@@ -319,7 +319,6 @@ onMounted(() => {
.introduction-wrap { .introduction-wrap {
display: flex; display: flex;
width: 1600px; width: 1600px;
height: 100%;
padding: 16px 0; padding: 16px 0;
gap: 16px; gap: 16px;
...@@ -723,8 +722,7 @@ onMounted(() => { ...@@ -723,8 +722,7 @@ onMounted(() => {
} }
.box4 { .box4 {
height: 20px; height: 610px;
flex: auto;
.left-bottom-main { .left-bottom-main {
padding: 20px 20px 0; padding: 20px 20px 0;
......
...@@ -60,6 +60,7 @@ ...@@ -60,6 +60,7 @@
<script setup> <script setup>
import { ref, onMounted } from "vue"; import { ref, onMounted } from "vue";
import { useRoute } from "vue-router"; import { useRoute } from "vue-router";
import { ElMessage } from "element-plus";
import { getDecreeSummary } from "@/api/decree/introduction"; import { getDecreeSummary } from "@/api/decree/introduction";
import { getDecreeReport } from "@/api/decree/introduction"; import { getDecreeReport } from "@/api/decree/introduction";
...@@ -72,8 +73,44 @@ const summaryInfo = ref({}); ...@@ -72,8 +73,44 @@ const summaryInfo = ref({});
// 政令原文操作 // 政令原文操作
const isHighlight = ref(true); const isHighlight = ref(true);
const isTranslate = ref(true); const isTranslate = ref(true);
const handleDownload = () => { const handleDownload = async () => {
if (summaryInfo.value?.url) {
try {
const response = await fetch(summaryInfo.value.url, {
method: 'GET',
headers: { 'Content-Type': 'application/pdf' },
});
if (!response.ok) {
throw new Error(`HTTP error! status: ${response.status}`);
}
const blob = await response.blob();
// 创建 Blob URL
const blobUrl = window.URL.createObjectURL(blob);
// 创建隐藏的下载链接
const link = document.createElement('a');
link.href = blobUrl;
link.download = `${summaryInfo.value.name}.pdf`;
// 添加到文档中并点击
document.body.appendChild(link);
link.click();
// 清理
document.body.removeChild(link);
window.URL.revokeObjectURL(blobUrl);
} catch (error) {
console.error('下载失败:', error);
// 可以在这里提示用户下载失败
alert('PDF 下载失败,请稍后重试');
}
} else {
ElMessage.warning("暂无下载链接!");
}
} }
const handleFindWord = () => { const handleFindWord = () => {
......
...@@ -53,7 +53,7 @@ export default defineConfig({ ...@@ -53,7 +53,7 @@ export default defineConfig({
'/api': { '/api': {
// target: 'http://8.140.26.4:9085/', // target: 'http://8.140.26.4:9085/',
target: 'http://192.168.0.6:28080/', target: 'http://192.168.0.5:28080/',
changeOrigin: true, changeOrigin: true,
rewrite: (path) => path.replace(/^\/api/, '') rewrite: (path) => path.replace(/^\/api/, '')
}, },
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论