|
@@ -45,33 +45,6 @@
|
|
|
</div>
|
|
</div>
|
|
|
</div>
|
|
</div>
|
|
|
|
|
|
|
|
- <!-- 搜索和筛选 -->
|
|
|
|
|
-<!-- <div class="filter-section">-->
|
|
|
|
|
-<!-- <div class="search-input">-->
|
|
|
|
|
-<!-- <el-input-->
|
|
|
|
|
-<!-- v-model="searchQuery"-->
|
|
|
|
|
-<!-- placeholder="搜索问题内容..."-->
|
|
|
|
|
-<!-- size="large"-->
|
|
|
|
|
-<!-- clearable-->
|
|
|
|
|
-<!-- @input="handleSearch"-->
|
|
|
|
|
-<!-- >-->
|
|
|
|
|
-<!-- <template #prefix>-->
|
|
|
|
|
-<!-- <span class="search-icon">🔍</span>-->
|
|
|
|
|
-<!-- </template>-->
|
|
|
|
|
-<!-- </el-input>-->
|
|
|
|
|
-<!-- </div>-->
|
|
|
|
|
-<!-- <div class="filter-actions">-->
|
|
|
|
|
-<!-- <el-button-->
|
|
|
|
|
-<!-- class="refresh-btn"-->
|
|
|
|
|
-<!-- @click="refreshData"-->
|
|
|
|
|
-<!-- :loading="loading"-->
|
|
|
|
|
-<!-- >-->
|
|
|
|
|
-<!-- <span class="btn-icon">🔄</span>-->
|
|
|
|
|
-<!-- 刷新-->
|
|
|
|
|
-<!-- </el-button>-->
|
|
|
|
|
-<!-- </div>-->
|
|
|
|
|
-<!-- </div>-->
|
|
|
|
|
-
|
|
|
|
|
<!-- 加载状态 -->
|
|
<!-- 加载状态 -->
|
|
|
<div v-if="loading" class="loading-section">
|
|
<div v-if="loading" class="loading-section">
|
|
|
<div class="loading-content">
|
|
<div class="loading-content">
|
|
@@ -259,6 +232,11 @@
|
|
|
<span class="badge-icon">🎯</span>
|
|
<span class="badge-icon">🎯</span>
|
|
|
相关度: {{ (selectedResult.score * 100).toFixed(1) }}%
|
|
相关度: {{ (selectedResult.score * 100).toFixed(1) }}%
|
|
|
</span>
|
|
</span>
|
|
|
|
|
+ <!-- PDF标签 -->
|
|
|
|
|
+ <span v-if="isPdfDocument" class="meta-badge pdf-badge">
|
|
|
|
|
+ <span class="badge-icon">📎</span>
|
|
|
|
|
+ PDF文档
|
|
|
|
|
+ </span>
|
|
|
</div>
|
|
</div>
|
|
|
</div>
|
|
</div>
|
|
|
</div>
|
|
</div>
|
|
@@ -283,19 +261,22 @@
|
|
|
<span class="tab-icon">📖</span>
|
|
<span class="tab-icon">📖</span>
|
|
|
完整原文
|
|
完整原文
|
|
|
</div>
|
|
</div>
|
|
|
|
|
+ <!-- PDF预览标签 -->
|
|
|
|
|
+ <div
|
|
|
|
|
+ v-if="isPdfDocument"
|
|
|
|
|
+ class="tab-item"
|
|
|
|
|
+ :class="{ active: activeTab === 'pdf' }"
|
|
|
|
|
+ @click="activeTab = 'pdf'"
|
|
|
|
|
+ >
|
|
|
|
|
+ <span class="tab-icon">📎</span>
|
|
|
|
|
+ PDF预览
|
|
|
|
|
+ </div>
|
|
|
</div>
|
|
</div>
|
|
|
|
|
|
|
|
<div class="tab-content">
|
|
<div class="tab-content">
|
|
|
<div v-show="activeTab === 'summary'" class="content-section summary-section">
|
|
<div v-show="activeTab === 'summary'" class="content-section summary-section">
|
|
|
<div class="section-header">
|
|
<div class="section-header">
|
|
|
<h4>内容摘要</h4>
|
|
<h4>内容摘要</h4>
|
|
|
-<!-- <el-button-->
|
|
|
|
|
-<!-- text-->
|
|
|
|
|
-<!-- class="copy-btn"-->
|
|
|
|
|
-<!-- @click="copyToClipboard(selectedResult.content)"-->
|
|
|
|
|
-<!-- >-->
|
|
|
|
|
-<!-- 📋 复制内容-->
|
|
|
|
|
-<!-- </el-button>-->
|
|
|
|
|
</div>
|
|
</div>
|
|
|
<div class="summary-content">
|
|
<div class="summary-content">
|
|
|
{{ selectedResult.content }}
|
|
{{ selectedResult.content }}
|
|
@@ -305,18 +286,41 @@
|
|
|
<div v-show="activeTab === 'original'" class="content-section original-section">
|
|
<div v-show="activeTab === 'original'" class="content-section original-section">
|
|
|
<div class="section-header">
|
|
<div class="section-header">
|
|
|
<h4>完整原文</h4>
|
|
<h4>完整原文</h4>
|
|
|
-<!-- <el-button-->
|
|
|
|
|
-<!-- text-->
|
|
|
|
|
-<!-- class="copy-btn"-->
|
|
|
|
|
-<!-- @click="copyToClipboard(originalContent)"-->
|
|
|
|
|
-<!-- >-->
|
|
|
|
|
-<!-- 📋 复制原文-->
|
|
|
|
|
-<!-- </el-button>-->
|
|
|
|
|
</div>
|
|
</div>
|
|
|
<div class="original-content">
|
|
<div class="original-content">
|
|
|
<pre>{{ originalContent }}</pre>
|
|
<pre>{{ originalContent }}</pre>
|
|
|
</div>
|
|
</div>
|
|
|
</div>
|
|
</div>
|
|
|
|
|
+
|
|
|
|
|
+ <!-- PDF预览内容 -->
|
|
|
|
|
+ <div v-show="activeTab === 'pdf'" class="content-section pdf-section">
|
|
|
|
|
+ <div class="section-header">
|
|
|
|
|
+ <h4>PDF文档预览</h4>
|
|
|
|
|
+ <el-button
|
|
|
|
|
+ v-if="pdfUrl"
|
|
|
|
|
+ type="primary"
|
|
|
|
|
+ class="download-btn"
|
|
|
|
|
+ @click="downloadPdf"
|
|
|
|
|
+ >
|
|
|
|
|
+ <span class="button-icon">👀</span>
|
|
|
|
|
+ 在新窗口查看PDF
|
|
|
|
|
+ </el-button>
|
|
|
|
|
+ </div>
|
|
|
|
|
+ <div class="pdf-preview">
|
|
|
|
|
+ <div v-if="!pdfUrl" class="no-pdf-content">
|
|
|
|
|
+ <div class="no-pdf-icon">📄</div>
|
|
|
|
|
+ <h3>无法预览PDF文档</h3>
|
|
|
|
|
+ <p>该文档的PDF文件暂时无法访问</p>
|
|
|
|
|
+ </div>
|
|
|
|
|
+ <iframe
|
|
|
|
|
+ v-else
|
|
|
|
|
+ :src="pdfUrl"
|
|
|
|
|
+ class="pdf-iframe"
|
|
|
|
|
+ frameborder="0"
|
|
|
|
|
+ @load="pdfLoading = false"
|
|
|
|
|
+ ></iframe>
|
|
|
|
|
+ </div>
|
|
|
|
|
+ </div>
|
|
|
</div>
|
|
</div>
|
|
|
</div>
|
|
</div>
|
|
|
|
|
|
|
@@ -348,8 +352,6 @@ import { ref, onMounted, computed } from 'vue';
|
|
|
import { ElMessage } from 'element-plus';
|
|
import { ElMessage } from 'element-plus';
|
|
|
import { marked } from 'marked';
|
|
import { marked } from 'marked';
|
|
|
import { API_BASE_URL } from "@/config";
|
|
import { API_BASE_URL } from "@/config";
|
|
|
-import dayjs from 'dayjs';
|
|
|
|
|
-
|
|
|
|
|
|
|
|
|
|
// 响应式数据
|
|
// 响应式数据
|
|
|
const historyList = ref([]);
|
|
const historyList = ref([]);
|
|
@@ -364,6 +366,9 @@ const resultDialogVisible = ref(false);
|
|
|
const selectedResult = ref({});
|
|
const selectedResult = ref({});
|
|
|
const originalContent = ref('');
|
|
const originalContent = ref('');
|
|
|
const activeTab = ref('summary');
|
|
const activeTab = ref('summary');
|
|
|
|
|
+const pdfUrl = ref('');
|
|
|
|
|
+const pdfLoading = ref(false);
|
|
|
|
|
+const textType = ref(0); // 存储文档类型
|
|
|
|
|
|
|
|
// 计算属性
|
|
// 计算属性
|
|
|
const filteredHistory = computed(() => {
|
|
const filteredHistory = computed(() => {
|
|
@@ -379,6 +384,11 @@ const filteredHistory = computed(() => {
|
|
|
);
|
|
);
|
|
|
});
|
|
});
|
|
|
|
|
|
|
|
|
|
+// 判断是否为PDF文档
|
|
|
|
|
+const isPdfDocument = computed(() => {
|
|
|
|
|
+ return textType.value === 3;
|
|
|
|
|
+});
|
|
|
|
|
+
|
|
|
// 方法
|
|
// 方法
|
|
|
const parseMarkdown = (content) => {
|
|
const parseMarkdown = (content) => {
|
|
|
if (!content) return '';
|
|
if (!content) return '';
|
|
@@ -389,25 +399,19 @@ const parseMarkdown = (content) => {
|
|
|
|
|
|
|
|
const formatTime = (timeString) => {
|
|
const formatTime = (timeString) => {
|
|
|
try {
|
|
try {
|
|
|
- // 处理 GMT 时间格式 "Tue, 30 Sep 2025 14:02:21 GMT"
|
|
|
|
|
if (timeString.includes('GMT')) {
|
|
if (timeString.includes('GMT')) {
|
|
|
- // 使用 UTC 方法获取时间组件,避免时区转换
|
|
|
|
|
const date = new Date(timeString);
|
|
const date = new Date(timeString);
|
|
|
-
|
|
|
|
|
if (!isNaN(date.getTime())) {
|
|
if (!isNaN(date.getTime())) {
|
|
|
- // 使用 UTC 相关的方法获取时间组件
|
|
|
|
|
const year = date.getUTCFullYear();
|
|
const year = date.getUTCFullYear();
|
|
|
const month = String(date.getUTCMonth() + 1).padStart(2, '0');
|
|
const month = String(date.getUTCMonth() + 1).padStart(2, '0');
|
|
|
const day = String(date.getUTCDate()).padStart(2, '0');
|
|
const day = String(date.getUTCDate()).padStart(2, '0');
|
|
|
const hours = String(date.getUTCHours()).padStart(2, '0');
|
|
const hours = String(date.getUTCHours()).padStart(2, '0');
|
|
|
const minutes = String(date.getUTCMinutes()).padStart(2, '0');
|
|
const minutes = String(date.getUTCMinutes()).padStart(2, '0');
|
|
|
const seconds = String(date.getUTCSeconds()).padStart(2, '0');
|
|
const seconds = String(date.getUTCSeconds()).padStart(2, '0');
|
|
|
-
|
|
|
|
|
return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`;
|
|
return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`;
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- // 对于其他格式,使用原来的逻辑
|
|
|
|
|
const date = new Date(timeString);
|
|
const date = new Date(timeString);
|
|
|
if (!isNaN(date.getTime())) {
|
|
if (!isNaN(date.getTime())) {
|
|
|
return date.toLocaleString('zh-CN', {
|
|
return date.toLocaleString('zh-CN', {
|
|
@@ -453,13 +457,11 @@ const getDisplayedResults = (item) => {
|
|
|
};
|
|
};
|
|
|
|
|
|
|
|
const processHistoryItem = (item) => {
|
|
const processHistoryItem = (item) => {
|
|
|
- // 确保所有字段都有值,如果没有则从其他字段获取
|
|
|
|
|
return {
|
|
return {
|
|
|
...item,
|
|
...item,
|
|
|
final_result: item.final_result || item.chat_res || item.ai_answer || '',
|
|
final_result: item.final_result || item.chat_res || item.ai_answer || '',
|
|
|
chat_res: item.chat_res || '',
|
|
chat_res: item.chat_res || '',
|
|
|
ai_answer: item.ai_answer || '',
|
|
ai_answer: item.ai_answer || '',
|
|
|
- // 添加展开状态
|
|
|
|
|
isResultsExpanded: false
|
|
isResultsExpanded: false
|
|
|
};
|
|
};
|
|
|
};
|
|
};
|
|
@@ -481,26 +483,45 @@ const handleResultDetails = async (result) => {
|
|
|
selectedResult.value = result;
|
|
selectedResult.value = result;
|
|
|
resultDialogVisible.value = true;
|
|
resultDialogVisible.value = true;
|
|
|
activeTab.value = 'summary';
|
|
activeTab.value = 'summary';
|
|
|
|
|
+ pdfUrl.value = '';
|
|
|
|
|
+ pdfLoading.value = false;
|
|
|
|
|
+ textType.value = 0;
|
|
|
|
|
|
|
|
try {
|
|
try {
|
|
|
const response = await fetch(`${API_BASE_URL}/content/get?docId=${result.docId}`);
|
|
const response = await fetch(`${API_BASE_URL}/content/get?docId=${result.docId}`);
|
|
|
const data = await response.json();
|
|
const data = await response.json();
|
|
|
|
|
+
|
|
|
if (data.status_code === 200) {
|
|
if (data.status_code === 200) {
|
|
|
- originalContent.value = data.data.text;
|
|
|
|
|
|
|
+ textType.value = data.data.textType || 0;
|
|
|
|
|
+
|
|
|
|
|
+ if (textType.value === 3) {
|
|
|
|
|
+ pdfUrl.value = data.data.url;
|
|
|
|
|
+ originalContent.value = '此文档为PDF格式,请在PDF预览中查看完整内容';
|
|
|
|
|
+ pdfLoading.value = true;
|
|
|
|
|
+ } else {
|
|
|
|
|
+ originalContent.value = data.data.text || '';
|
|
|
|
|
+ }
|
|
|
} else {
|
|
} else {
|
|
|
- ElMessage.error('获取原文内容失败');
|
|
|
|
|
|
|
+ ElMessage.error('获取文档内容失败');
|
|
|
}
|
|
}
|
|
|
} catch (error) {
|
|
} catch (error) {
|
|
|
- ElMessage.error('请求原文内容失败');
|
|
|
|
|
|
|
+ console.error('请求文档内容失败:', error);
|
|
|
|
|
+ ElMessage.error('请求文档内容失败');
|
|
|
}
|
|
}
|
|
|
};
|
|
};
|
|
|
|
|
|
|
|
-const copyToClipboard = async (text) => {
|
|
|
|
|
- try {
|
|
|
|
|
- await navigator.clipboard.writeText(text);
|
|
|
|
|
- ElMessage.success('已复制到剪贴板');
|
|
|
|
|
- } catch (err) {
|
|
|
|
|
- ElMessage.error('复制失败');
|
|
|
|
|
|
|
+// 下载PDF
|
|
|
|
|
+const downloadPdf = () => {
|
|
|
|
|
+ if (pdfUrl.value) {
|
|
|
|
|
+ const link = document.createElement('a');
|
|
|
|
|
+ link.href = pdfUrl.value;
|
|
|
|
|
+ link.download = selectedResult.value.fileName || 'document.pdf';
|
|
|
|
|
+ link.target = '_blank';
|
|
|
|
|
+ document.body.appendChild(link);
|
|
|
|
|
+ link.click();
|
|
|
|
|
+ document.body.removeChild(link);
|
|
|
|
|
+ } else {
|
|
|
|
|
+ ElMessage.warning('无法下载PDF文件');
|
|
|
}
|
|
}
|
|
|
};
|
|
};
|
|
|
|
|
|
|
@@ -533,7 +554,6 @@ const fetchHistory = async () => {
|
|
|
const data = await response.json();
|
|
const data = await response.json();
|
|
|
|
|
|
|
|
if (data.status_code === 200) {
|
|
if (data.status_code === 200) {
|
|
|
- // 处理每个历史记录项,确保字段正确
|
|
|
|
|
historyList.value = (data.data.entities || []).map(processHistoryItem);
|
|
historyList.value = (data.data.entities || []).map(processHistoryItem);
|
|
|
totalCount.value = data.data.total_count || 0;
|
|
totalCount.value = data.data.total_count || 0;
|
|
|
totalPages.value = data.data.total_pages || 0;
|
|
totalPages.value = data.data.total_pages || 0;
|
|
@@ -555,7 +575,6 @@ onMounted(() => {
|
|
|
</script>
|
|
</script>
|
|
|
|
|
|
|
|
<style scoped>
|
|
<style scoped>
|
|
|
-/* 保持原有的所有样式不变 */
|
|
|
|
|
.history-container {
|
|
.history-container {
|
|
|
min-height: 100vh;
|
|
min-height: 100vh;
|
|
|
background: linear-gradient(135deg, rgba(102, 126, 234, 0.6) 0%, rgba(118, 75, 162, 0.4) 100%);
|
|
background: linear-gradient(135deg, rgba(102, 126, 234, 0.6) 0%, rgba(118, 75, 162, 0.4) 100%);
|
|
@@ -681,32 +700,6 @@ onMounted(() => {
|
|
|
font-weight: 600;
|
|
font-weight: 600;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-.filter-section {
|
|
|
|
|
- background: white;
|
|
|
|
|
- border-radius: 16px;
|
|
|
|
|
- padding: 20px;
|
|
|
|
|
- margin-bottom: 24px;
|
|
|
|
|
- box-shadow: 0 8px 32px rgba(0, 0, 0, 0.1);
|
|
|
|
|
- display: flex;
|
|
|
|
|
- gap: 16px;
|
|
|
|
|
- align-items: center;
|
|
|
|
|
-}
|
|
|
|
|
-
|
|
|
|
|
-.search-input {
|
|
|
|
|
- flex: 1;
|
|
|
|
|
-}
|
|
|
|
|
-
|
|
|
|
|
-.filter-actions {
|
|
|
|
|
- display: flex;
|
|
|
|
|
- gap: 12px;
|
|
|
|
|
-}
|
|
|
|
|
-
|
|
|
|
|
-.refresh-btn {
|
|
|
|
|
- border-radius: 12px;
|
|
|
|
|
- padding: 10px 20px;
|
|
|
|
|
- font-weight: 600;
|
|
|
|
|
-}
|
|
|
|
|
-
|
|
|
|
|
.loading-section {
|
|
.loading-section {
|
|
|
background: white;
|
|
background: white;
|
|
|
border-radius: 16px;
|
|
border-radius: 16px;
|
|
@@ -732,8 +725,12 @@ onMounted(() => {
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
@keyframes spin {
|
|
@keyframes spin {
|
|
|
- 0% { transform: rotate(0deg); }
|
|
|
|
|
- 100% { transform: rotate(360deg); }
|
|
|
|
|
|
|
+ 0% {
|
|
|
|
|
+ transform: rotate(0deg);
|
|
|
|
|
+ }
|
|
|
|
|
+ 100% {
|
|
|
|
|
+ transform: rotate(360deg);
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
.history-list {
|
|
.history-list {
|
|
@@ -1090,7 +1087,7 @@ onMounted(() => {
|
|
|
margin-right: 6px;
|
|
margin-right: 6px;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-/* 弹窗样式 - 从主页面复制并调整 */
|
|
|
|
|
|
|
+/* 弹窗样式 */
|
|
|
.content-dialog :deep(.el-dialog) {
|
|
.content-dialog :deep(.el-dialog) {
|
|
|
border-radius: 24px;
|
|
border-radius: 24px;
|
|
|
overflow: hidden;
|
|
overflow: hidden;
|
|
@@ -1192,6 +1189,12 @@ onMounted(() => {
|
|
|
border: 1px solid #fed7d7;
|
|
border: 1px solid #fed7d7;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+.pdf-badge {
|
|
|
|
|
+ background: #fff5f5;
|
|
|
|
|
+ color: #c53030;
|
|
|
|
|
+ border: 1px solid #fed7d7;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
.badge-icon {
|
|
.badge-icon {
|
|
|
font-size: 0.8rem;
|
|
font-size: 0.8rem;
|
|
|
}
|
|
}
|
|
@@ -1254,12 +1257,6 @@ onMounted(() => {
|
|
|
font-weight: 600;
|
|
font-weight: 600;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-.copy-btn {
|
|
|
|
|
- font-size: 0.9rem;
|
|
|
|
|
- padding: 6px 12px;
|
|
|
|
|
- border-radius: 8px;
|
|
|
|
|
-}
|
|
|
|
|
-
|
|
|
|
|
.summary-content {
|
|
.summary-content {
|
|
|
background: #f7fafc;
|
|
background: #f7fafc;
|
|
|
padding: 20px;
|
|
padding: 20px;
|
|
@@ -1288,6 +1285,55 @@ onMounted(() => {
|
|
|
word-wrap: break-word;
|
|
word-wrap: break-word;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+/* PDF预览样式 */
|
|
|
|
|
+.pdf-preview {
|
|
|
|
|
+ width: 100%;
|
|
|
|
|
+ height: 600px;
|
|
|
|
|
+ border: 1px solid #e2e8f0;
|
|
|
|
|
+ border-radius: 12px;
|
|
|
|
|
+ overflow: hidden;
|
|
|
|
|
+ background: #f7fafc;
|
|
|
|
|
+ display: flex;
|
|
|
|
|
+ align-items: center;
|
|
|
|
|
+ justify-content: center;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+.pdf-iframe {
|
|
|
|
|
+ width: 100%;
|
|
|
|
|
+ height: 100%;
|
|
|
|
|
+ border: none;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+.no-pdf-content {
|
|
|
|
|
+ text-align: center;
|
|
|
|
|
+ padding: 60px 20px;
|
|
|
|
|
+ color: #718096;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+.no-pdf-icon {
|
|
|
|
|
+ font-size: 4rem;
|
|
|
|
|
+ margin-bottom: 20px;
|
|
|
|
|
+ opacity: 0.6;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+.no-pdf-content h3 {
|
|
|
|
|
+ margin: 0 0 12px 0;
|
|
|
|
|
+ color: #2d3748;
|
|
|
|
|
+ font-size: 1.25rem;
|
|
|
|
|
+ font-weight: 600;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+.no-pdf-content p {
|
|
|
|
|
+ margin: 0;
|
|
|
|
|
+ font-size: 0.95rem;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+.download-btn {
|
|
|
|
|
+ border-radius: 8px;
|
|
|
|
|
+ padding: 8px 16px;
|
|
|
|
|
+ font-weight: 500;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
.dialog-footer {
|
|
.dialog-footer {
|
|
|
padding: 0 32px 24px;
|
|
padding: 0 32px 24px;
|
|
|
}
|
|
}
|
|
@@ -1349,11 +1395,6 @@ onMounted(() => {
|
|
|
grid-template-columns: 1fr;
|
|
grid-template-columns: 1fr;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- .filter-section {
|
|
|
|
|
- flex-direction: column;
|
|
|
|
|
- align-items: stretch;
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
.item-header {
|
|
.item-header {
|
|
|
flex-direction: column;
|
|
flex-direction: column;
|
|
|
align-items: stretch;
|
|
align-items: stretch;
|
|
@@ -1374,5 +1415,19 @@ onMounted(() => {
|
|
|
width: 95% !important;
|
|
width: 95% !important;
|
|
|
margin: 20px auto;
|
|
margin: 20px auto;
|
|
|
}
|
|
}
|
|
|
|
|
+
|
|
|
|
|
+ .pdf-preview {
|
|
|
|
|
+ height: 400px;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ .dialog-title {
|
|
|
|
|
+ flex-direction: column;
|
|
|
|
|
+ text-align: center;
|
|
|
|
|
+ gap: 12px;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ .title-meta {
|
|
|
|
|
+ justify-content: center;
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|
|
|
</style>
|
|
</style>
|