Przeglądaj źródła

- 添加文件夹时加入关键字标签

Huanyi 2 miesięcy temu
rodzic
commit
7cc4905d4b

+ 12 - 0
src/api/document/folder/index.ts

@@ -86,3 +86,15 @@ export const listFolderOnProject = (projectId: string | number): AxiosPromise<Fo
     params: { projectId }
   });
 };
+
+/**
+ * 根据中心ID获取项目名称
+ * @param centerId 中心ID
+ */
+export const getNameByCenterId = (centerId: number): AxiosPromise<{ projectName: string; centerId: number }> => {
+  return request({
+    url: '/document/folder/getName',
+    method: 'get',
+    params: { centerId }
+  });
+};

+ 3 - 1
src/lang/modules/document/document/en_US.ts

@@ -69,7 +69,9 @@ export default {
     noRestriction: 'No Restriction',
     restricted: 'Restricted',
     note: 'Note',
-    notePlaceholder: 'Please enter note'
+    notePlaceholder: 'Please enter note',
+    keywords: 'Keywords',
+    keywordsPlaceholder: 'Please select keywords'
   },
   // Type Labels
   type: {

+ 3 - 1
src/lang/modules/document/document/zh_CN.ts

@@ -69,7 +69,9 @@ export default {
     noRestriction: '不限制',
     restricted: '限制',
     note: '备注',
-    notePlaceholder: '请输入备注'
+    notePlaceholder: '请输入备注',
+    keywords: '标签',
+    keywordsPlaceholder: '请选择标签'
   },
   // 类型标签
   type: {

+ 121 - 10
src/views/document/folder/document/FolderTree.vue

@@ -6,7 +6,7 @@
       </el-button>
     </div>
     <el-scrollbar class="tree-scrollbar">
-      <el-tree v-loading="loading" :data="treeData" :props="treeProps" node-key="id" default-expand-all
+      <el-tree ref="treeRef" v-loading="loading" :data="treeData" :props="treeProps" node-key="id"
         :expand-on-click-node="false">
         <template #default="{ node, data }">
           <span class="custom-tree-node">
@@ -102,6 +102,12 @@
           <el-input v-model="form.note" type="textarea" :rows="4"
             :placeholder="t('document.document.form.notePlaceholder')" />
         </el-form-item>
+        <el-form-item :label="t('document.document.form.keywords')" prop="keywords">
+          <el-select v-loading="keywordLoading" v-model="form.keywords" multiple
+            :placeholder="t('document.document.form.keywordsPlaceholder')" style="width: 100%">
+            <el-option v-for="keyword in keywordList" :key="keyword.id" :label="keyword.content" :value="keyword.id" />
+          </el-select>
+        </el-form-item>
       </el-form>
       <template #footer>
         <div class="dialog-footer">
@@ -117,13 +123,14 @@
 <script setup lang="ts">
 import { ref, reactive, onMounted, onUnmounted, nextTick, getCurrentInstance, watch, computed } from 'vue';
 import { useI18n } from 'vue-i18n';
-import { listFolder, addFolder, delFolder, getFolder, updateFolder } from '@/api/document/folder';
+import { listFolder, addFolder, delFolder, getFolder, updateFolder, getNameByCenterId } from '@/api/document/folder';
 import { FolderListVO, FolderForm } from '@/api/document/folder/types';
 import { countTempDocuments } from '@/api/document/document';
 import { Folder, Document, Location, OfficeBuilding, MoreFilled, ArrowRight } from '@element-plus/icons-vue';
 import { ElMessage, ElMessageBox } from 'element-plus';
 import type { FormInstance } from 'element-plus';
 import type { ComponentInternalInstance } from 'vue';
+import request from '@/utils/request';
 
 interface Props {
   projectId?: number | string;
@@ -133,20 +140,48 @@ const props = defineProps<Props>();
 
 const emit = defineEmits<{
   folderClick: [folder: FolderListVO];
-  addDocument: [folder: FolderListVO];
+  addDocument: [folder: FolderListVO, projectInfo?: { projectName: string; centerId: number }];
   refresh: [];
 }>();
 
 const { proxy } = getCurrentInstance() as ComponentInternalInstance;
 const { t } = useI18n();
 
+// 标签类型定义
+interface KeywordVO {
+  id: number;
+  content: string;
+  note?: string;
+}
+
 // 数据定义
 const loading = ref(false);
 const buttonLoading = ref(false);
 const treeData = ref<FolderListVO[]>([]);
+const treeRef = ref();
 const folderFormRef = ref<FormInstance>();
 const scanFormRef = ref<FormInstance>();
 const tempDocumentCount = ref(0);
+const keywordList = ref<KeywordVO[]>([]);
+const keywordLoading = ref(false);
+
+// 获取标签列表
+const getKeywordList = async () => {
+  keywordLoading.value = true;
+  try {
+    const res = await request({
+      url: '/setting/keyword/listOnFolder',
+      method: 'get'
+    });
+    keywordList.value = res.data || [];
+  } catch (error) {
+    ElMessage.error('获取标签列表失败');
+    console.error('获取标签列表失败:', error);
+    keywordList.value = [];
+  } finally {
+    keywordLoading.value = false;
+  }
+};
 
 // 对话框
 const dialog = reactive({
@@ -163,7 +198,7 @@ const isRestricted = ref(false);
 const restrictionLevelValue = ref(0);
 
 // 表单初始数据
-const initFormData: FolderForm = {
+const initFormData: FolderForm & { keywords?: number[] } = {
   id: undefined,
   projectId: undefined,
   parentId: undefined,
@@ -171,11 +206,12 @@ const initFormData: FolderForm = {
   name: '',
   status: 0,
   note: '',
-  restrictionLevel: -1
+  restrictionLevel: -1,
+  keywords: []
 };
 
 // 表单数据
-const form = ref<FolderForm>({ ...initFormData });
+const form = ref<FolderForm & { keywords?: number[] }>({ ...initFormData });
 
 // 表单验证规则
 const rules = {
@@ -205,6 +241,10 @@ const getList = async () => {
 
   loading.value = true;
   try {
+    // 保存当前展开的节点
+    const expandedKeys = treeRef.value?.store?.nodesMap ? 
+      Object.keys(treeRef.value.store.nodesMap).filter(key => treeRef.value.store.nodesMap[key].expanded) : [];
+    
     const res = await listFolder({ projectId: props.projectId } as any);
     const folders = res.data || [];
 
@@ -223,6 +263,18 @@ const getList = async () => {
 
     treeData.value = [...folders, tempFolder];
 
+    // 恢复展开状态
+    nextTick(() => {
+      if (expandedKeys.length > 0 && treeRef.value) {
+        expandedKeys.forEach(key => {
+          const node = treeRef.value.store.nodesMap[key];
+          if (node) {
+            node.expanded = true;
+          }
+        });
+      }
+    });
+
     // 获取临时文件夹文档数量
     await getTempDocumentCount();
   } catch (error) {
@@ -277,24 +329,28 @@ const cancel = () => {
 };
 
 // 新建文件夹(顶级)
-const handleAddFolder = () => {
+const handleAddFolder = async () => {
   reset();
   currentNode.value = null;
   form.value.projectId = props.projectId;
   form.value.parentId = undefined;
   form.value.type = 1; // 默认选择国家类型
+  // 获取标签列表
+  await getKeywordList();
   dialog.visible = true;
   dialog.title = t('document.document.dialog.addFolder');
   dialog.isEdit = false;
 };
 
 // 新增子节点(指定类型)
-const handleAddChildWithType = (data: FolderListVO, type: number) => {
+const handleAddChildWithType = async (data: FolderListVO, type: number) => {
   reset();
   currentNode.value = data;
   form.value.projectId = props.projectId;
   form.value.parentId = data.id;
   form.value.type = type;
+  // 获取标签列表
+  await getKeywordList();
   dialog.visible = true;
   const typeLabel =
     type === 0 ? t('document.document.type.folder') : type === 1 ? t('document.document.type.country') : t('document.document.type.center');
@@ -368,6 +424,9 @@ const handleEdit = async (data: FolderListVO) => {
       restrictionLevelValue.value = form.value.restrictionLevel;
     }
 
+    // 获取标签列表
+    await getKeywordList();
+
     currentNode.value = null;
     dialog.visible = true;
     dialog.title = t('document.document.dialog.editFolder');
@@ -465,11 +524,29 @@ const handleMenuItemClick = (command: string, data: FolderListVO | null) => {
 };
 
 // 下拉菜单命令处理
-const handleCommand = (command: string, data: FolderListVO) => {
+const handleCommand = async (command: string, data: FolderListVO) => {
   if (command.startsWith('add:')) {
     const cmdPart = command.split(':')[1];
     if (cmdPart === 'document') {
-      emit('addDocument', data);
+      // 查找该文件夹所属的中心ID
+      const centerId = findCenterId(data);
+      console.log('新增文档 - 所属中心ID:', centerId);
+      console.log('新增文档 - 当前文件夹信息:', data);
+      
+      // 如果找到中心ID,调用接口获取项目名称
+      if (centerId !== undefined) {
+        try {
+          const res = await getNameByCenterId(centerId);
+          console.log('获取到的项目信息:', res.data);
+          emit('addDocument', data, res.data);
+        } catch (error) {
+          console.error('获取项目名称失败:', error);
+          ElMessage.error('获取项目名称失败');
+          emit('addDocument', data);
+        }
+      } else {
+        emit('addDocument', data);
+      }
     } else {
       const type = parseInt(cmdPart);
       handleAddChildWithType(data, type);
@@ -481,6 +558,40 @@ const handleCommand = (command: string, data: FolderListVO) => {
   }
 };
 
+// 查找文件夹所属的中心ID
+const findCenterId = (folder: FolderListVO): number | undefined => {
+  // 如果当前节点就是中心,直接返回其ID
+  if (folder.type === 2) {
+    return folder.id;
+  }
+  
+  // 如果有父节点ID,递归查找父节点
+  if (folder.parentId !== undefined && folder.parentId !== null) {
+    const parentFolder = findFolderById(treeData.value, folder.parentId);
+    if (parentFolder) {
+      return findCenterId(parentFolder);
+    }
+  }
+  
+  return undefined;
+};
+
+// 根据ID查找文件夹
+const findFolderById = (folders: FolderListVO[], id: number): FolderListVO | undefined => {
+  for (const folder of folders) {
+    if (folder.id === id) {
+      return folder;
+    }
+    if (folder.children && folder.children.length > 0) {
+      const found = findFolderById(folder.children, id);
+      if (found) {
+        return found;
+      }
+    }
+  }
+  return undefined;
+};
+
 // 点击文件夹节点
 const handleFolderClick = (data: FolderListVO) => {
   emit('folderClick', data);

+ 58 - 5
src/views/document/folder/document/index.vue

@@ -27,8 +27,14 @@
         <el-form-item
           :label="documentForm.type === 1 ? t('document.document.documentForm.planName') : t('document.document.documentForm.name')"
           prop="name">
-          <el-input v-model="documentForm.name" :placeholder="t('document.document.documentForm.namePlaceholder')"
-            clearable />
+          <div style="display: flex; align-items: center; gap: 8px; width: 100%;">
+            <span v-if="documentNamePrefix" style="white-space: nowrap; color: #606266;">{{ documentNamePrefix }}</span>
+            <el-input v-model="documentNameInput" :placeholder="t('document.document.documentForm.namePlaceholder')"
+              clearable style="flex: 1;" @input="handleNameInputChange" />
+            <span v-if="documentNamePrefix" style="white-space: nowrap; color: #606266;">-</span>
+            <el-date-picker v-model="documentForm.documentDate" type="date" value-format="YYYYMMDD" format="YYYYMMDD"
+              placeholder="请选择生效日期" style="width: 180px;" @change="handleDocumentDateChange" />
+          </div>
         </el-form-item>
 
         <el-form-item :label="t('document.document.documentForm.type')" prop="type" v-if="hasAddPlanPermission">
@@ -91,7 +97,7 @@
         <div class="dialog-footer">
           <el-button :loading="documentButtonLoading" type="primary" @click="submitDocumentForm">{{
             t('document.document.button.confirm')
-            }}</el-button>
+          }}</el-button>
           <el-button @click="cancelDocument">{{ t('document.document.button.cancel') }}</el-button>
         </div>
       </template>
@@ -178,7 +184,42 @@ const initDocumentFormData: DocumentForm = {
 const uploadedFileId = ref<string>('');
 
 // 文档表单数据
-const documentForm = ref<DocumentForm>({ ...initDocumentFormData });
+const documentForm = ref<DocumentForm & { documentDate?: string }>({ ...initDocumentFormData });
+
+// 存储项目信息前缀(用于拼接文档名称)
+const documentNamePrefix = ref<string>('');
+
+// 用户输入的名称部分(不包含前缀和日期)
+const documentNameInput = ref<string>('');
+
+// 处理名称输入变化
+const handleNameInputChange = (value: string) => {
+  documentNameInput.value = value;
+  updateDocumentName();
+};
+
+// 处理文档日期变化
+const handleDocumentDateChange = (value: string) => {
+  updateDocumentName();
+};
+
+// 更新文档名称
+const updateDocumentName = () => {
+  if (!documentNamePrefix.value) {
+    // 如果没有前缀,直接使用用户输入
+    documentForm.value.name = documentNameInput.value;
+    return;
+  }
+
+  // 拼接完整名称:{projectName}-{centerId}-{用户输入}-{日期}
+  let fullName = documentNamePrefix.value + documentNameInput.value;
+
+  if (documentForm.value.documentDate) {
+    fullName += `-${documentForm.value.documentDate}`;
+  }
+
+  documentForm.value.name = fullName;
+};
 
 // 递交人搜索相关
 const submitterSearchLoading = ref(false);
@@ -210,9 +251,19 @@ const handleFolderClick = (folder: FolderListVO) => {
 };
 
 // 处理添加文档
-const handleAddDocument = (folder: FolderListVO) => {
+const handleAddDocument = (folder: FolderListVO, projectInfo?: { projectName: string; centerId: number }) => {
   resetDocumentForm();
   documentForm.value.folderId = folder.id;
+
+  // 如果有项目信息,设置文档名称前缀为:{projectName}-{centerId}-
+  if (projectInfo) {
+    documentNamePrefix.value = `${projectInfo.projectName}-${projectInfo.centerId}-`;
+    // 初始化时更新一次名称
+    updateDocumentName();
+  } else {
+    documentNamePrefix.value = '';
+  }
+
   documentDialog.visible = true;
   documentDialog.title = t('document.document.dialog.addDocument');
 };
@@ -232,6 +283,8 @@ const handleTreeRefresh = () => {
 const resetDocumentForm = () => {
   documentForm.value = { ...initDocumentFormData };
   uploadedFileId.value = '';
+  documentNamePrefix.value = '';
+  documentNameInput.value = '';
   if (!hasAddPlanPermission.value) {
     documentForm.value.type = 0;
   }

+ 32 - 1
src/views/document/folder/project.vue

@@ -115,7 +115,11 @@
               <dict-tag :options="project_type" :value="scope.row.type" />
             </template>
           </el-table-column>
-          <el-table-column :label="t('project.management.table.status')" align="center" prop="status" width="100" />
+          <el-table-column :label="t('project.management.table.status')" align="center" prop="status" width="100">
+            <template #default="scope">
+              <el-tag :type="getStatusType(scope.row.status)">{{ getStatusText(scope.row.status) }}</el-tag>
+            </template>
+          </el-table-column>
           <el-table-column :label="t('project.management.table.startTime')" align="center" prop="startTime" width="120">
             <template #default="scope">
               <span>{{ parseTime(scope.row.startTime, '{y}-{m}-{d}') }}</span>
@@ -158,6 +162,33 @@ const { proxy } = getCurrentInstance() as ComponentInternalInstance;
 const { t } = useI18n();
 const { project_type, project_language } = toRefs<any>(proxy?.useDict('project_type', 'project_language'));
 
+// 项目状态枚举映射
+const projectStatusMap: Record<number, string> = {
+  0: 'unstarted',
+  1: 'underway',
+  2: 'paused',
+  3: 'finished'
+};
+
+// 获取状态文本(国际化)
+const getStatusText = (status: number | undefined) => {
+  if (status === undefined || status === null) return '-';
+  const statusKey = projectStatusMap[status];
+  return statusKey ? t(`project.management.status.${statusKey}`) : status;
+};
+
+// 获取状态标签类型
+const getStatusType = (status: number | undefined): 'success' | 'info' | 'warning' | 'primary' | 'danger' => {
+  const typeMap: Record<number, 'success' | 'info' | 'warning' | 'primary' | 'danger'> = {
+    0: 'info',
+    1: 'success',
+    2: 'warning',
+    3: 'primary'
+  };
+  if (status === undefined || status === null) return 'info';
+  return typeMap[status] || 'info';
+};
+
 const projectList = ref<ProjectVO[]>([]);
 const loading = ref(true);
 const showSearch = ref(true);

+ 14 - 26
src/views/home/taskCenter/filing/index.vue

@@ -10,16 +10,20 @@
       <!-- 搜索栏 -->
       <el-form :model="queryParams" :inline="true" class="search-form">
         <el-form-item label="项目编号">
-          <el-input v-model="queryParams.projectCode" placeholder="请输入项目编号" clearable style="width: 240px" @keyup.enter="handleQuery" />
+          <el-input v-model="queryParams.projectCode" placeholder="请输入项目编号" clearable style="width: 240px"
+            @keyup.enter="handleQuery" />
         </el-form-item>
         <el-form-item label="项目名称">
-          <el-input v-model="queryParams.projectName" placeholder="请输入项目名称" clearable style="width: 240px" @keyup.enter="handleQuery" />
+          <el-input v-model="queryParams.projectName" placeholder="请输入项目名称" clearable style="width: 240px"
+            @keyup.enter="handleQuery" />
         </el-form-item>
         <el-form-item label="中心名称">
-          <el-input v-model="queryParams.centerName" placeholder="请输入中心名称" clearable style="width: 240px" @keyup.enter="handleQuery" />
+          <el-input v-model="queryParams.centerName" placeholder="请输入中心名称" clearable style="width: 240px"
+            @keyup.enter="handleQuery" />
         </el-form-item>
         <el-form-item label="名称">
-          <el-input v-model="queryParams.name" placeholder="请输入名称" clearable style="width: 240px" @keyup.enter="handleQuery" />
+          <el-input v-model="queryParams.name" placeholder="请输入名称" clearable style="width: 240px"
+            @keyup.enter="handleQuery" />
         </el-form-item>
         <el-form-item>
           <el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button>
@@ -77,23 +81,12 @@
         <!-- 操作列 -->
         <el-table-column label="操作" width="200" align="center" fixed="right" class-name="small-padding fixed-width">
           <template #default="scope">
-            <el-button
-              v-if="scope.row.status === 3"
-              v-hasPermi="['taskCenter:filing:filing']"
-              type="primary"
-              icon="FolderAdd"
-              style="padding: 0 5px; font-size: 10px; height: 24px"
-              @click="handleArchive(scope.row)"
-            >
+            <el-button v-if="scope.row.status === 3" v-hasPermi="['taskCenter:filing:filing']" type="primary"
+              icon="FolderAdd" style="padding: 0 5px; font-size: 10px; height: 24px" @click="handleArchive(scope.row)">
               归档
             </el-button>
-            <el-button
-              v-if="scope.row.ossId"
-              type="success"
-              icon="Download"
-              style="padding: 0 5px; font-size: 10px; height: 24px"
-              @click="handleDownload(scope.row)"
-            >
+            <el-button v-if="scope.row.ossId" type="success" icon="Download"
+              style="padding: 0 5px; font-size: 10px; height: 24px" @click="handleDownload(scope.row)">
               下载
             </el-button>
           </template>
@@ -101,13 +94,8 @@
       </el-table>
 
       <!-- 分页 -->
-      <pagination
-        v-show="total > 0"
-        v-model:page="queryParams.pageNum"
-        v-model:limit="queryParams.pageSize"
-        :total="total"
-        @pagination="getTaskList"
-      />
+      <pagination v-show="total > 0" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize"
+        :total="total" @pagination="getTaskList" />
     </el-card>
   </div>
 </template>

+ 2 - 7
src/views/home/taskCenter/submission/index.vue

@@ -129,13 +129,8 @@
           <fileUpload v-model="submitForm.ossId" :limit="1" :action="'/common/resource/oss/upload'" accept=".pdf" />
         </el-form-item>
         <el-form-item label="生效日期" prop="effectiveDate">
-          <el-date-picker
-            v-model="submitForm.effectiveDate"
-            type="date"
-            value-format="YYYY-MM-DD"
-            placeholder="请选择生效日期"
-            style="width: 100%"
-          />
+          <el-date-picker v-model="submitForm.effectiveDate" type="date" value-format="YYYY-MM-DD" placeholder="请选择生效日期"
+            style="width: 100%" />
         </el-form-item>
       </el-form>
       <template #footer>

+ 1 - 1
src/views/project/management/detail/pages/centerMember.vue

@@ -23,7 +23,7 @@
     <el-card shadow="never">
       <el-table v-loading="loading" border :data="memberList" style="width: 100%">
         <el-table-column label="序号" align="center" prop="id" width="80" />
-        <el-table-column label="姓名" align="center" prop="name" width="120" />
+        <el-table-column label="姓名" align="center" prop="name" width="200" />
         <el-table-column label="手机号" align="center" prop="phoneNumber" width="150" />
         <el-table-column label="部门" align="center" prop="dept" width="200" show-overflow-tooltip />
         <el-table-column label="中心" align="center" prop="centers" min-width="200" show-overflow-tooltip />

+ 28 - 52
src/views/search/index.vue

@@ -10,40 +10,27 @@
       <!-- 搜索栏 -->
       <el-form :model="queryParams" :inline="true" label-width="150px" class="search-form">
         <el-form-item :label="t('search.search.name')">
-          <el-input
-            v-model="queryParams.name"
-            :placeholder="t('search.search.namePlaceholder')"
-            clearable
-            style="width: 250px"
-            @keyup.enter="handleQuery"
-          />
+          <el-input v-model="queryParams.name" :placeholder="t('search.search.namePlaceholder')" clearable
+            style="width: 250px" @keyup.enter="handleQuery" />
         </el-form-item>
         <el-form-item :label="t('search.search.projectCode')">
-          <el-input
-            v-model="queryParams.projectCode"
-            :placeholder="t('search.search.projectCodePlaceholder')"
-            clearable
-            style="width: 250px"
-            @keyup.enter="handleQuery"
-          />
+          <el-input v-model="queryParams.projectCode" :placeholder="t('search.search.projectCodePlaceholder')" clearable
+            style="width: 250px" @keyup.enter="handleQuery" />
         </el-form-item>
         <el-form-item :label="t('search.search.projectName')">
-          <el-input
-            v-model="queryParams.projectName"
-            :placeholder="t('search.search.projectNamePlaceholder')"
-            clearable
-            style="width: 250px"
-            @keyup.enter="handleQuery"
-          />
+          <el-input v-model="queryParams.projectName" :placeholder="t('search.search.projectNamePlaceholder')" clearable
+            style="width: 250px" @keyup.enter="handleQuery" />
         </el-form-item>
         <el-form-item :label="t('search.search.type')">
-          <el-select v-model="queryParams.type" :placeholder="t('search.search.typePlaceholder')" clearable style="width: 250px">
+          <el-select v-model="queryParams.type" :placeholder="t('search.search.typePlaceholder')" clearable
+            style="width: 250px">
             <el-option :label="t('search.type.normalDocument')" :value="0" />
             <el-option :label="t('search.type.planDocument')" :value="1" />
           </el-select>
         </el-form-item>
         <el-form-item :label="t('search.search.status')">
-          <el-select v-model="queryParams.status" :placeholder="t('search.search.statusPlaceholder')" clearable style="width: 250px">
+          <el-select v-model="queryParams.status" :placeholder="t('search.search.statusPlaceholder')" clearable
+            style="width: 250px">
             <el-option :label="t('search.status.unUpload')" :value="0" />
             <el-option :label="t('search.status.unAudit')" :value="1" />
             <el-option :label="t('search.status.auditReject')" :value="2" />
@@ -55,26 +42,14 @@
           </el-select>
         </el-form-item>
         <el-form-item :label="t('search.search.createTime')">
-          <el-date-picker
-            v-model="createTimeRange"
-            type="daterange"
-            range-separator="-"
-            :start-placeholder="t('search.search.startTime')"
-            :end-placeholder="t('search.search.endTime')"
-            value-format="YYYY-MM-DD HH:mm:ss"
-            style="width: 250px"
-          />
+          <el-date-picker v-model="createTimeRange" type="daterange" range-separator="-"
+            :start-placeholder="t('search.search.startTime')" :end-placeholder="t('search.search.endTime')"
+            value-format="YYYY-MM-DD HH:mm:ss" style="width: 250px" />
         </el-form-item>
         <el-form-item :label="t('search.search.updateTime')">
-          <el-date-picker
-            v-model="updateTimeRange"
-            type="daterange"
-            range-separator="-"
-            :start-placeholder="t('search.search.startTime')"
-            :end-placeholder="t('search.search.endTime')"
-            value-format="YYYY-MM-DD HH:mm:ss"
-            style="width: 250px"
-          />
+          <el-date-picker v-model="updateTimeRange" type="daterange" range-separator="-"
+            :start-placeholder="t('search.search.startTime')" :end-placeholder="t('search.search.endTime')"
+            value-format="YYYY-MM-DD HH:mm:ss" style="width: 250px" />
         </el-form-item>
         <el-form-item>
           <el-button type="primary" icon="Search" @click="handleQuery">{{ t('search.button.search') }}</el-button>
@@ -85,7 +60,8 @@
       <!-- 文档列表 -->
       <el-table v-loading="loading" :data="documentList" border style="margin-top: 10px; width: 100%">
         <el-table-column prop="id" :label="t('search.table.id')" width="80" align="center" />
-        <el-table-column prop="folderName" :label="t('search.table.folderName')" min-width="120" show-overflow-tooltip />
+        <el-table-column prop="folderName" :label="t('search.table.folderName')" min-width="120"
+          show-overflow-tooltip />
         <el-table-column prop="name" :label="t('search.table.name')" min-width="150" show-overflow-tooltip />
         <el-table-column prop="type" :label="t('search.table.type')" width="120" align="center">
           <template #default="scope">
@@ -94,13 +70,16 @@
             <span v-else>-</span>
           </template>
         </el-table-column>
-        <el-table-column prop="specificationLabel" :label="t('search.table.specification')" min-width="120" show-overflow-tooltip>
+        <el-table-column prop="specificationLabel" :label="t('search.table.specification')" min-width="120"
+          show-overflow-tooltip>
           <template #default="scope">
-            <dict-tag v-if="scope.row.specification" :options="getSpecificationDict(scope.row.specificationType)" :value="scope.row.specification" />
+            <dict-tag v-if="scope.row.specification" :options="getSpecificationDict(scope.row.specificationType)"
+              :value="scope.row.specification" />
             <span v-else>-</span>
           </template>
         </el-table-column>
-        <el-table-column prop="planDocumentTypeLabel" :label="t('search.table.planDocumentType')" min-width="120" show-overflow-tooltip>
+        <el-table-column prop="planDocumentTypeLabel" :label="t('search.table.planDocumentType')" min-width="120"
+          show-overflow-tooltip>
           <template #default="scope">
             <dict-tag v-if="scope.row.planType" :options="plan_document_type" :value="scope.row.planType" />
             <span v-else>-</span>
@@ -149,13 +128,9 @@
         <!-- 操作列 -->
         <el-table-column :label="t('search.table.action')" width="120" align="center" fixed="right">
           <template #default="scope">
-            <el-button
-              v-if="scope.row.actualDocument"
-              type="primary"
-              icon="Download"
+            <el-button v-if="scope.row.actualDocument" type="primary" icon="Download"
               style="padding: 0 5px; font-size: 10px; height: 24px; --el-button-icon-span-gap: 2px"
-              @click="handleDownload(scope.row.actualDocument, scope.row.actualDocumentName)"
-            >
+              @click="handleDownload(scope.row.actualDocument, scope.row.actualDocumentName)">
               {{ t('search.button.download') }}
             </el-button>
             <span v-else>-</span>
@@ -164,7 +139,8 @@
       </el-table>
 
       <!-- 分页 -->
-      <pagination v-show="total > 0" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" :total="total" @pagination="getList" />
+      <pagination v-show="total > 0" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize"
+        :total="total" @pagination="getList" />
     </el-card>
   </div>
 </template>

+ 1 - 1
src/views/setting/carousel/index.vue

@@ -64,7 +64,7 @@
       <template #footer>
         <div class="dialog-footer">
           <el-button :loading="buttonLoading" type="primary" @click="submitForm">{{ t('carousel.button.save')
-          }}</el-button>
+            }}</el-button>
           <el-button @click="cancel">{{ t('carousel.button.cancel') }}</el-button>
         </div>
       </template>

+ 1 - 1
src/views/setting/keyword/index.vue

@@ -88,7 +88,7 @@
       <template #footer>
         <div class="dialog-footer">
           <el-button :loading="buttonLoading" type="primary" @click="submitForm">{{ t('keyword.button.save')
-            }}</el-button>
+          }}</el-button>
           <el-button @click="cancel">{{ t('keyword.button.cancel') }}</el-button>
         </div>
       </template>