houyaf 3 tahun lalu
induk
melakukan
a94e548064

+ 27 - 3
src/router/modules/module.ts

@@ -111,13 +111,37 @@ const routes: RouteRecordRaw[] = [
           activeMenu: '/article',
         },
       },
+      {
+        path: 'add/:artCatId',
+        name: 'article_add',
+        component: () => import('@/views/article/components/Art.vue'),
+        meta: {
+          title: '发布文章',
+          sidebar: false,
+          activeMenu: '/article/index',
+          cache: true,
+          noCache: 'article_add',
+        },
+      },
+      {
+        path: 'edit/:artId',
+        name: 'article_edit',
+        component: () => import('@/views/article/components/Art.vue'),
+        meta: {
+          title: '编辑文章',
+          sidebar: false,
+          activeMenu: '/article/index',
+          cache: true,
+          noCache: 'article_edit',
+        },
+      },
     ],
   },
 
   {
-    path: '/components',
+    path: '/doc',
     component: Layout,
-    redirect: '/components/index',
+    redirect: '/doc/index',
     name: 'document',
     meta: {
       title: '企业网盘',
@@ -131,7 +155,7 @@ const routes: RouteRecordRaw[] = [
         meta: {
           title: '文件管理',
           sidebar: false,
-          activeMenu: '/components',
+          activeMenu: '/doc/index',
         },
       },
     ],

+ 190 - 0
src/views/app_center/permit/components/PermitList.vue

@@ -0,0 +1,190 @@
+<route lang="yaml">
+meta:
+  enabled: false
+</route>
+
+<script lang="ts" setup name="AppPermitList">
+import Permit from './Permit.vue'
+import { getAppPermitListById } from '@/api/apps/appPermitApi'
+interface TreeNode {
+  label: string
+  roleId: number
+  isLeaf: boolean
+  children?: any[]
+}
+
+const state = reactive({
+  loading: false,
+  curRoleId: 0,
+  roles: [] as TreeNode[],
+  permitList: [],
+  permitTreeData: [] as any[],
+  search: {
+    appId: 0,
+    roleId: 0,
+    keywords: '',
+  },
+})
+
+function tranListToTreeData(list: any[], rootValue: number): any[] {
+  const arr: any[] = []
+  list.forEach((item) => {
+    if (item.parentId === rootValue) {
+      // 找到之后 就要去找 item 下面有没有子节点
+      const children = tranListToTreeData(list, item.permitId)
+      if (children.length) {
+        // 如果children的长度大于0 说明找到了子节点
+        item.children = children
+      }
+      arr.push(item) // 将内容加入到数组中
+    }
+  })
+  return arr
+}
+
+// 查询Permit列表
+const getData = async () => {
+  const { appId, roleId } = state.search
+  if (appId > 0 && roleId > 0) {
+    state.loading = true
+    const { data } = await getAppPermitListById(appId, roleId)
+    state.loading = false
+    state.permitList = data
+    state.permitTreeData = tranListToTreeData(data, 0)
+  }
+}
+
+const permitTableRef = ref()
+const permitRef = ref()
+
+onMounted(() => {
+  getData()
+})
+
+const onPermitAdd = () => {
+  const { appId, roleId } = state.search
+  permitRef.value.showAddModel(appId, roleId)
+}
+
+const onAddSub = (row: any) => {
+  window.console.log(row)
+}
+
+const onEdit = (row: { appId: any; roleId: any; permitId: any }) => {
+  const { appId, roleId, permitId } = row
+  permitRef.value.showEditModel(appId, roleId, permitId)
+}
+
+const onDelete = (row: any) => {
+  window.console.log(row)
+}
+
+const onUp = (row: any) => {
+  window.console.log(row)
+}
+const onDown = (row: any) => {
+  window.console.log(row)
+}
+defineExpose({
+  loadData(appId: number, roleId: number) {
+    state.search.appId = appId
+    state.search.roleId = roleId
+    getData()
+  },
+})
+</script>
+
+<template>
+  <div class="container">
+    <tool-bar>
+      <template #right>
+        <el-input v-model="state.search.keywords" placeholder="请输入关键词筛选" clearable style="width: 200px;" />
+        <el-button style="margin-left: 10px;" @click="getData">
+          <template #icon>
+            <el-icon>
+              <svg-icon name="i-ep:search" />
+            </el-icon>
+          </template>
+        </el-button>
+
+        <el-button type="primary" @click="onPermitAdd">
+          <template #icon>
+            <el-icon>
+              <svg-icon name="i-ep:plus" />
+            </el-icon>
+          </template>
+        </el-button>
+      </template>
+    </tool-bar>
+
+    <el-table
+      ref="permitTableRef"
+      v-loading="state.loading"
+      class="list-table"
+      :data="state.permitTreeData"
+      row-key="permitId"
+      default-expand-all
+      size="small"
+      border stripe highlight-current-row
+      height="100%"
+    >
+      <el-table-column type="index" align="center" label="序号" width="70" />
+
+      <el-table-column label="权限名称" width="250px">
+        <template #default="{ row }">
+          <span>{{ row.permitTitle }}</span>
+        </template>
+      </el-table-column>
+
+      <el-table-column label="权限编码" min-width="100">
+        <template #default="{ row }">
+          <span>{{ row.permitCode }}</span>
+        </template>
+      </el-table-column>
+
+      <el-table-column label="类型" header-align="center" align="center" width="80">
+        <template #default="{ row }">
+          <span v-if="row.permitType === 0"><el-tag>分组</el-tag></span>
+          <span v-else><el-tag>权限</el-tag></span>
+        </template>
+      </el-table-column>
+
+      <el-table-column label="简要说明">
+        <template #default="{ row }">
+          <span>{{ row.permitDesc }}</span>
+        </template>
+      </el-table-column>
+
+      <el-table-column label="排序" header-align="center" align="center" width="60">
+        <template #default="{ row }">
+          <span>{{ row.sortNo }}</span>
+        </template>
+      </el-table-column>
+
+      <el-table-column label="操作" width="210" header-align="center" align="center">
+        <template #default="{ row }">
+          <div>
+            <el-button v-if="row.permitType === 0" size="small" type="primary" @click="onAddSub(row)">
+              添加
+            </el-button>
+            <el-button size="small" type="success" @click="onEdit(row)">
+              修改
+            </el-button>
+            <el-button size="small" type="danger" @click="onDelete(row)">
+              删除
+            </el-button>
+          </div>
+        </template>
+      </el-table-column>
+    </el-table>
+    <Permit ref="permitRef" @success="getData" />
+  </div>
+</template>
+
+<style lang="scss" scoped>
+.container {
+  height: 100%;
+  display: flex;
+  flex-direction: column;
+}
+</style>

+ 143 - 0
src/views/app_center/permit/components/RoleList.vue

@@ -0,0 +1,143 @@
+<route lang="yaml">
+meta:
+  enabled: false
+</route>
+
+<script lang="ts" setup name="RoleList">
+import { getRoleByList } from '@/api/system/roleApi'
+const emit = defineEmits(['onItemSelect'])
+
+interface TreeNode {
+  label: string
+  roleId: number
+  isLeaf: boolean
+  children?: any[]
+}
+
+const state = reactive({
+  loading: false,
+  curRoleId: 0,
+  treeData: [] as TreeNode[],
+  search: {
+    keywords: '',
+  },
+})
+
+const roleTreeRef = ref()
+
+// 查询数据
+const getData = async () => {
+  state.loading = true
+  const { data } = await getRoleByList({})
+  if (data && data.length > 0) {
+    state.curRoleId = data[0].roleId
+    const children: TreeNode[] = []
+    data.forEach((item: any) => {
+      return children.push({
+        label: item.roleName,
+        roleId: item.roleId,
+        isLeaf: true,
+      })
+    })
+    state.treeData = children
+  }
+  await nextTick(() => {
+    state.curRoleId = data[0].roleId
+    roleTreeRef.value.setCurrentKey(state.curRoleId)
+    emit('onItemSelect', state.curRoleId)
+  })
+}
+
+const onTreeNodeClick = async (node: TreeNode) => {
+  state.curRoleId = node.roleId
+  emit('onItemSelect', state.curRoleId)
+}
+onMounted(() => {
+  getData()
+})
+</script>
+
+<template>
+  <el-scrollbar class="tree">
+    <ElTree ref="roleTreeRef" :data="state.treeData" default-expand-all node-key="roleId" @node-click="onTreeNodeClick">
+      <template #default="{ node, data }">
+        <div class="custom-tree-node">
+          <div class="label" :title="node.label">
+            <el-icon v-if="data.isLeaf" size="16px" style="margin-right: 5px;">
+              <svg-icon name="ep:user" />
+            </el-icon>
+            <div class="text">
+              {{ data.label }}
+            </div>
+          </div>
+        </div>
+      </template>
+    </ElTree>
+  </el-scrollbar>
+</template>
+
+<style lang="scss" scoped>
+  .btns {
+    display: inline-flex;
+    width: 100%;
+    margin-bottom: var(--container-padding);
+
+    .add {
+      width: 100%;
+    }
+  }
+
+  .tree {
+    flex: 1;
+    overflow-y: auto;
+
+    :deep(.el-tree) {
+      .el-tree-node__content {
+        height: 40px;
+      }
+
+      .is-current > .el-tree-node__content {
+        background-color: var(--el-color-primary-light-9);
+      }
+
+      .custom-tree-node {
+        flex: 1;
+        position: relative;
+        width: 0;
+        height: 100%;
+        display: flex;
+        flex-direction: column;
+        justify-content: center;
+
+        .label {
+          display: inline-flex;
+          align-items: center;
+          width: calc(100% - 10px);
+          color: var(--el-text-color-primary);
+
+          .text {
+            @include text-overflow;
+          }
+        }
+
+        &:hover {
+          .actions {
+            display: block;
+          }
+        }
+
+        .actions {
+          display: none;
+          position: absolute;
+          right: 10px;
+          top: 50%;
+          transform: translateY(-50%);
+
+          .el-button {
+            padding: 5px 8px;
+          }
+        }
+      }
+    }
+  }
+</style>

+ 8 - 288
src/views/app_center/permit/index.vue

@@ -4,9 +4,8 @@ meta:
 </route>
 
 <script lang="ts" setup name="AppRolePermit">
-import Permit from './components/Permit.vue'
-import { getAppPermitListById } from '@/api/apps/appPermitApi'
-import { getRoleByList } from '@/api/system/roleApi'
+import LeftRoleListComponent from './components/RoleList.vue'
+import PermitListComponent from './components/PermitList.vue'
 import useSettingsStore from '@/store/modules/settings'
 
 const settingsStore = useSettingsStore()
@@ -16,130 +15,12 @@ const router = useRouter()
 const tabbar = useTabbar()
 const appId = parseInt(route.params.appId.toString())
 
-interface TreeNode {
-  label: string
-  roleId: number
-  isLeaf: boolean
-  children?: any[]
+const roleListRef = ref()
+const permitListRef = ref()
+const onItemSelect = (roleId: number) => {
+  permitListRef.value.loadData(appId, roleId)
 }
 
-const state = reactive({
-  loading: false,
-  curRoleId: 0,
-  roles: [] as TreeNode[],
-  permitList: [],
-  permitTreeData: [] as any[],
-  search: {
-    appId,
-    roleId: 0,
-    keywords: '',
-  },
-})
-
-const roleTreeRef = ref()
-
-function tranListToTreeData(list: any[], rootValue: number): any[] {
-  const arr: any[] = []
-  list.forEach((item) => {
-    if (item.parentId === rootValue) {
-      // 找到之后 就要去找 item 下面有没有子节点
-      const children = tranListToTreeData(list, item.permitId)
-      if (children.length) {
-        // 如果children的长度大于0 说明找到了子节点
-        item.children = children
-      }
-      arr.push(item) // 将内容加入到数组中
-    }
-  })
-  return arr
-}
-
-// 查询Permit列表
-const getAppRolePermitData = async () => {
-  const curRoleId = state.curRoleId
-  if (curRoleId > 0) {
-    state.loading = true
-    const { data } = await getAppPermitListById(appId, state.curRoleId)
-    state.loading = false
-    state.permitList = data
-    state.permitTreeData = tranListToTreeData(data, 0)
-  }
-}
-
-// 查询Role数据
-const getRoleData = async () => {
-  state.loading = true
-  const { data } = await getRoleByList({})
-  if (data && data.length > 0) {
-    state.curRoleId = data[0].roleId
-    await getAppRolePermitData()
-    const children: TreeNode[] = []
-    data.forEach((item: any) => {
-      return children.push({
-        label: item.roleName,
-        roleId: item.roleId,
-        isLeaf: true,
-      })
-    })
-    state.roles = [
-      {
-        label: '系统角色',
-        isLeaf: false,
-        roleId: -1,
-        children,
-      },
-    ]
-  }
-  await nextTick(() => {
-    roleTreeRef.value.setCurrentKey(data[0].roleId)
-  })
-}
-
-const onTreeNodeClick = async (node: TreeNode) => {
-  state.curRoleId = node.roleId
-  await getAppRolePermitData()
-}
-
-const permitTableRef = ref()
-const permitRef = ref()
-
-const onPermitAdd = () => {
-  permitRef.value.showAddModel(appId, state.curRoleId)
-}
-
-const onAddSub = (row: any) => {
-  window.console.log(row)
-}
-
-const onEdit = (row: { appId: any; roleId: any; permitId: any }) => {
-  const { appId, roleId, permitId } = row
-  permitRef.value.showEditModel(appId, roleId, permitId)
-}
-
-const onDelete = (row: any) => {
-  window.console.log(row)
-}
-
-const onUp = (row: any) => {
-  window.console.log(row)
-}
-const onDown = (row: any) => {
-  window.console.log(row)
-}
-
-// 组件处理成功回调
-const onSuccess = () => {
-  getAppRolePermitData()
-}
-
-const onSearch = () => {
-  getAppRolePermitData()
-}
-
-onMounted(() => {
-  getRoleData()
-})
-
 // 返回列表页
 function goBack() {
   if (settingsStore.settings.tabbar.enable && settingsStore.settings.tabbar.mergeTabsBy !== 'activeMenu') {
@@ -167,108 +48,11 @@ function goBack() {
     <div class="page-main">
       <LayoutContainer left-side-width="250px" hide-left-side-toggle>
         <template #leftSide>
-          <el-scrollbar class="tree">
-            <ElTree ref="roleTreeRef" :data="state.roles" default-expand-all node-key="roleId" @node-click="onTreeNodeClick">
-              <template #default="{ node, data }">
-                <div class="custom-tree-node">
-                  <div class="label" :title="node.label">
-                    <el-icon v-if="data.isLeaf" size="16px" style="margin-right: 5px;">
-                      <svg-icon name="ep:avatar" />
-                    </el-icon>
-                    <div class="text">
-                      {{ data.label }}
-                    </div>
-                  </div>
-                </div>
-              </template>
-            </ElTree>
-          </el-scrollbar>
+          <LeftRoleListComponent ref="roleListRef" @onItemSelect="onItemSelect" />
         </template>
 
-        <div class="container">
-          <tool-bar>
-            <template #right>
-              <el-input v-model="state.search.keywords" placeholder="请输入关键词筛选" clearable style="width: 200px;" />
-              <el-button style="margin-left: 10px;" @click="onSearch">
-                <template #icon>
-                  <el-icon>
-                    <svg-icon name="i-ep:search" />
-                  </el-icon>
-                </template>
-              </el-button>
-
-              <el-button type="primary" @click="onPermitAdd">
-                <template #icon>
-                  <el-icon>
-                    <svg-icon name="i-ep:plus" />
-                  </el-icon>
-                </template>
-              </el-button>
-            </template>
-          </tool-bar>
-          <el-table
-            ref="permitTableRef"
-            v-loading="state.loading"
-            class="list-table"
-            :data="state.permitTreeData"
-            row-key="permitId"
-            default-expand-all
-            size="small"
-            border stripe highlight-current-row
-            height="100%"
-          >
-            <el-table-column type="index" align="center" label="序号" width="70" />
-
-            <el-table-column label="权限名称" width="250px">
-              <template #default="{ row }">
-                <span>{{ row.permitTitle }}</span>
-              </template>
-            </el-table-column>
-
-            <el-table-column label="权限编码" min-width="100">
-              <template #default="{ row }">
-                <span>{{ row.permitCode }}</span>
-              </template>
-            </el-table-column>
-
-            <el-table-column label="类型" header-align="center" align="center" width="80">
-              <template #default="{ row }">
-                <span v-if="row.permitType === 0"><el-tag>分组</el-tag></span>
-                <span v-else><el-tag>权限</el-tag></span>
-              </template>
-            </el-table-column>
-
-            <el-table-column label="简要说明">
-              <template #default="{ row }">
-                <span>{{ row.permitDesc }}</span>
-              </template>
-            </el-table-column>
-
-            <el-table-column label="排序" header-align="center" align="center" width="60">
-              <template #default="{ row }">
-                <span>{{ row.sortNo }}</span>
-              </template>
-            </el-table-column>
-
-            <el-table-column label="操作" width="160" header-align="center" align="center">
-              <template #default="{ row }">
-                <div>
-                  <el-button v-if="row.permitType === 0" size="small" type="primary" @click="onAddSub(row)">
-                    添加
-                  </el-button>
-                  <el-button size="small" type="success" @click="onEdit(row)">
-                    修改
-                  </el-button>
-                  <el-button size="small" type="danger" @click="onDelete(row)">
-                    删除
-                  </el-button>
-                </div>
-              </template>
-            </el-table-column>
-          </el-table>
-        </div>
+        <PermitListComponent ref="permitListRef" />
       </LayoutContainer>
-      <Permit ref="permitRef" @success="onSuccess" />
     </div>
   </div>
 </template>
@@ -283,70 +67,6 @@ function goBack() {
     display: flex;
     flex-direction: column;
     height: 100%;
-
-    .btns {
-      display: inline-flex;
-      width: 100%;
-      margin-bottom: var(--container-padding);
-
-      .add {
-        width: 100%;
-      }
-    }
-
-    .tree {
-      flex: 1;
-      overflow-y: auto;
-
-      .el-tree {
-        .el-tree-node__content {
-          height: 40px;
-        }
-
-        .is-current > .el-tree-node__content {
-          background-color: var(--el-color-primary-light-9);
-        }
-
-        .custom-tree-node {
-          flex: 1;
-          position: relative;
-          width: 0;
-          height: 100%;
-          display: flex;
-          flex-direction: column;
-          justify-content: center;
-
-          .label {
-            display: inline-flex;
-            align-items: center;
-            width: calc(100% - 10px);
-            color: var(--el-text-color-primary);
-
-            .text {
-              @include text-overflow;
-            }
-          }
-
-          &:hover {
-            .actions {
-              display: block;
-            }
-          }
-
-          .actions {
-            display: none;
-            position: absolute;
-            right: 10px;
-            top: 50%;
-            transform: translateY(-50%);
-
-            .el-button {
-              padding: 5px 8px;
-            }
-          }
-        }
-      }
-    }
   }
 }
 </style>

+ 113 - 54
src/views/article/components/Art.vue

@@ -7,17 +7,13 @@ meta:
 import { ElMessage } from 'element-plus'
 import type { FormInstance, FormRules } from 'element-plus'
 import { createArt, getArtById, updateArt } from '@/api/system/artApi'
-const emit = defineEmits(['success'])
+import useSettingsStore from '@/store/modules/settings'
 
-const formRef = ref<FormInstance>()
-const formRules = ref<FormRules>({
-  artTitle: [
-    { required: true, message: '请输入标题', trigger: 'blur' },
-  ],
-  artContent: [
-    { required: true, message: '请输入描述', trigger: 'blur' },
-  ],
-})
+const emit = defineEmits(['success'])
+const settingsStore = useSettingsStore()
+const route = useRoute()
+const router = useRouter()
+const tabbar = useTabbar()
 
 const state = reactive({
   title: '',
@@ -25,8 +21,14 @@ const state = reactive({
   loading: false,
   formData: {
     artId: 0,
+    artCatId: 0,
+    artCatTitle: '',
     artTitle: '',
     artContent: '',
+    artSource: '',
+    artAuthor: '',
+    status: 0,
+    attachList: [],
   },
   search: {
     artId: 0,
@@ -34,8 +36,6 @@ const state = reactive({
   actionType: 1,
 })
 
-onMounted(() => {})
-
 const getData = async () => {
   state.loading = true
   const { data } = await getArtById(state.search.artId)
@@ -43,6 +43,52 @@ const getData = async () => {
   state.formData = data
 }
 
+if (route.name === 'article_add') {
+  state.actionType = 1
+  state.title = '发布文章'
+  state.formData.artCatId = parseInt(route.params.artCatId.toString())
+}
+else {
+  state.actionType = 2
+  state.title = '编辑文章'
+  state.search.artId = parseInt(route.params.artId.toString())
+  getData()
+}
+
+const formRef = ref<FormInstance>()
+const formRules = ref<FormRules>({
+  artTitle: [
+    { required: true, message: '请输入标题', trigger: 'blur' },
+  ],
+  artContent: [
+    { required: true, message: '请输入描述', trigger: 'blur' },
+  ],
+  artCatId: [
+    { required: true, message: '请选择分类', trigger: 'blur' },
+  ],
+})
+
+onMounted(() => {
+})
+
+function onCancel() {
+  state.dialogVisible = false
+}
+
+function resetFormData() {
+  state.formData = {
+    artId: 0,
+    artCatId: 0,
+    artCatTitle: '',
+    artTitle: '',
+    artContent: '',
+    artSource: '',
+    artAuthor: '',
+    status: 0,
+    attachList: [],
+  }
+}
+
 function onSubmit() {
   formRef.value && formRef.value.validate(async (valid) => {
     if (valid) {
@@ -62,55 +108,68 @@ function onSubmit() {
   })
 }
 
-function onCancel() {
-  state.dialogVisible = false
-}
-
-function resetFormData() {
-  state.formData = {
-    artId: 0,
-    artTitle: '',
-    artContent: '',
+// 返回列表页
+function goBack() {
+  if (settingsStore.settings.tabbar.enable && settingsStore.settings.tabbar.mergeTabsBy !== 'activeMenu') {
+    tabbar.close({ name: 'article' })
+  }
+  else {
+    router.push({ name: 'article' })
   }
 }
-
-defineExpose({
-  showAddModel() {
-    resetFormData()
-    state.title = '新增'
-    state.actionType = 1
-    state.dialogVisible = true
-  },
-  showEditModel(artId: number) {
-    resetFormData()
-    state.title = '编辑'
-    state.actionType = 2
-    state.dialogVisible = true
-    state.search.artId = artId
-    getData()
-  },
-})
 </script>
 
 <template>
-  <el-drawer v-model="state.dialogVisible" :title="state.title" width="600px" :close-on-click-modal="false" append-to-body destroy-on-close>
-    <el-form ref="formRef" :model="state.formData" :rules="formRules" label-width="120px" label-suffix=":">
-      <el-form-item label="名称" prop="artTitle">
-        <el-input v-model="state.formData.artTitle" placeholder="请输入标题" />
-      </el-form-item>
-
-      <el-form-item label="简要说明" prop="artCatDesc">
-        <el-input v-model="state.formData.artCatDesc" type="textarea" rows="10" placeholder="请输入简要说明" />
-      </el-form-item>
-    </el-form>
-
-    <template #footer>
-      <el-button size="large" @click="onCancel">
-        取消
+  <div class="absolute-container">
+    <page-header :title="state.title">
+      <el-button size="default" round @click="goBack">
+        <template #icon>
+          <el-icon>
+            <svg-icon name="i-ep:arrow-left" />
+          </el-icon>
+        </template>
+        返回
       </el-button>
+    </page-header>
+    <page-main>
+      <el-form ref="formRef" :model="state.formData" :rules="formRules" label-width="120px" label-suffix=":">
+        <el-row :gutter="1">
+          <el-col :xs="23" :sm="17" :md="17" :lg="17" :xl="17">
+            <div>
+              <el-input v-model="state.formData.artTitle" placeholder="请输入标题" />
+            </div>
+            <div>
+              <editor v-model="state.formData.artContent" />
+            </div>
+          </el-col>
+          <el-col :xs="23" :sm="6" :md="6" :lg="6" :xl="6">
+            <el-form-item label="分类" prop="artCatId">
+              <art-cat-selector v-model="state.formData.artCatId" />
+            </el-form-item>
+
+            <el-form-item label="作者" prop="artAuthor">
+              <el-input v-model="state.formData.artAuthor" />
+            </el-form-item>
+
+            <el-form-item label="来源" prop="artSource">
+              <el-input v-model="state.formData.artSource" />
+            </el-form-item>
+
+            <el-form-item label="附件" prop="fileUrl">
+              <file-upload v-model="state.formData.attachList" :limit="10" :max-size="5" />
+            </el-form-item>
+          </el-col>
+        </el-row>
+      </el-form>
+    </page-main>
+
+    <fixed-action-bar>
       <el-button type="primary" size="large" @click="onSubmit">
         保存
       </el-button>
-    </template>
-  </el-drawer>
+      <el-button size="large" @click="onCancel">
+        取消
+      </el-button>
+    </fixed-action-bar>
+  </div>
 </template>

+ 5 - 7
src/views/article/components/ArtCatTree.vue

@@ -27,8 +27,6 @@ const state = reactive({
   keywords: '',
   treeData: [] as TreeNode[],
   curArtCatId: 0,
-  dataList: [] as Object[],
-  dialogState: 1,
   search: {
     keywords: '',
   },
@@ -36,7 +34,7 @@ const state = reactive({
 
 const leftTreeRef = ref()
 
-const getArtCatData = async () => {
+const getData = async () => {
   const { data } = await getArtCatByList(state.search)
   const children: TreeNode[] = []
   data.forEach((item: any) => {
@@ -58,7 +56,7 @@ const getArtCatData = async () => {
 }
 
 onMounted(() => {
-  getArtCatData()
+  getData()
 })
 
 // 模型选择
@@ -96,7 +94,7 @@ const onArtCatDelete = (row: any) => {
   ElMessageBox.confirm(`确认删除「${artCatTitle}」吗?`, '确认信息').then(async () => {
     const { msg } = await deleteArtCatById(artCatId)
     ElMessage.success(msg)
-    await getArtCatData()
+    await getData()
   })
 }
 </script>
@@ -112,7 +110,7 @@ const onArtCatDelete = (row: any) => {
         </template>
         内容分类
       </el-button>
-      <el-button @click="getArtCatData">
+      <el-button @click="getData">
         <template #icon>
           <el-icon>
             <svg-icon name="i-ep:refresh" />
@@ -161,7 +159,7 @@ const onArtCatDelete = (row: any) => {
         </div>
       </template>
     </ElTree>
-    <ArtCatComponent ref="artCatRef" @success="getArtCatData" />
+    <ArtCatComponent ref="artCatRef" @success="getData" />
   </el-scrollbar>
 </template>
 

+ 39 - 11
src/views/article/components/ArtList.vue

@@ -5,8 +5,11 @@ meta:
 
 <script lang="ts" setup>
 import { ElMessage, ElMessageBox } from 'element-plus'
-import ArtComponent from './Art.vue'
 import { deleteArtById, getArtByPage } from '@/api/system/artApi'
+import useSettingsStore from '@/store/modules/settings'
+const settingsStore = useSettingsStore()
+const router = useRouter()
+const tabbar = useTabbar()
 
 const state = reactive({
   loading: false,
@@ -29,7 +32,6 @@ const getArtData = async () => {
 }
 
 const artTableRef = ref()
-const artDefRef = ref()
 
 // 查询
 const onSearch = () => {
@@ -38,18 +40,45 @@ const onSearch = () => {
 
 // 新增
 const onArtAdd = () => {
-  artDefRef.value.showAddModel()
+  if (settingsStore.settings.tabbar.enable && settingsStore.settings.tabbar.mergeTabsBy !== 'activeMenu') {
+    tabbar.open({
+      name: 'article_add',
+      params: {
+        artCatId: state.search.artCatId,
+      },
+    })
+  }
+  else {
+    router.push({
+      name: 'article_add',
+      params: {
+        artCatId: state.search.artCatId,
+      },
+    })
+  }
 }
 
-// 查看
-const onArtView = (row: any) => {
-  artDefRef.value.showAddModel()
+// 编辑对象
+const onArtEdit = (row: { artId: number }) => {
+  if (settingsStore.settings.tabbar.enable && settingsStore.settings.tabbar.mergeTabsBy !== 'activeMenu') {
+    tabbar.open({
+      name: 'article_edit',
+      params: {
+        artId: row.artId,
+      },
+    })
+  }
+  else {
+    router.push({
+      name: 'article_edit',
+      params: {
+        artId: row.artId,
+      },
+    })
+  }
 }
 
-// 修改
-const onArtEdit = (row: any) => {
-  artDefRef.value.showEditModel(row.artId)
-}
+const onArtView = (row: { art: number }) => {}
 
 // 删除
 const onArtDelete = (row: any) => {
@@ -141,6 +170,5 @@ defineExpose({
         </template>
       </el-table-column>
     </el-table>
-    <ArtComponent ref="artDefRef" @success="getArtData" />
   </div>
 </template>

+ 1 - 2
src/views/article/index.vue

@@ -10,14 +10,13 @@ const artCatTreeRef = ref()
 const artListRef = ref()
 
 const onItemSelect = (artCatId: number) => {
-  artListRef.value.loadData(artCatId)
+  artListRef.value?.loadData(artCatId)
 }
 </script>
 
 <template>
   <div class="absolute-container">
     <tool-header title="企业智库" />
-
     <div class="page-main">
       <LayoutContainer left-side-width="250px" hide-left-side-toggle>
         <template #leftSide>

+ 12 - 2
src/views/document/components/FileList.vue

@@ -131,13 +131,23 @@ defineExpose({
         </template>
       </el-table-column>
 
-      <el-table-column label="操作" width="150" align="center" fixed="right">
+      <el-table-column label="操作" width="180" align="center" fixed="right">
         <template #default="scope">
           <div>
-            <el-button type="primary" size="small" plain @click="onDownload(scope.row)">
+            <el-button plain size="small" @click="open('{{ scope.row.fileUrl }}')">
+              <template #icon>
+                <el-icon>
+                  <svg-icon name="i-ep:link" />
+                </el-icon>
+              </template>
               下载
             </el-button>
             <el-button v-if="!scope.row.isFixed" type="danger" size="small" plain @click="onDelete(scope.row)">
+              <template #icon>
+                <el-icon>
+                  <svg-icon name="ep:delete" />
+                </el-icon>
+              </template>
               删除
             </el-button>
           </div>

+ 1 - 1
src/views/document/index.vue

@@ -16,7 +16,7 @@ const onItemSelect = (dirId: number) => {
 
 <template>
   <div class="absolute-container">
-    <tool-header title="企业智库" />
+    <tool-header title="企业网盘" />
 
     <div class="page-main">
       <LayoutContainer left-side-width="250px" hide-left-side-toggle>

+ 3 - 3
src/views/repo/repo/index.vue

@@ -96,7 +96,7 @@ const onRepoDetails = (row: { repoTypeId: number; repoId: number }) => {
     </page-header>
 
     <el-row :gutter="20" style="margin: -10px 10px;">
-      <el-col :md="16">
+      <el-col :md="14">
         <page-main style="margin: 10px 0;">
           <tool-bar>
             <template #left>
@@ -158,7 +158,7 @@ const onRepoDetails = (row: { repoTypeId: number; repoId: number }) => {
         </page-main>
       </el-col>
 
-      <el-col :md="8">
+      <el-col :md="10">
         <page-main style="margin: 10px 0;">
           <tool-bar>
             <template #left>
@@ -178,7 +178,7 @@ const onRepoDetails = (row: { repoTypeId: number; repoId: number }) => {
           <el-table v-loading="state.loading" class="list-table" :data="state.repoFileList" :border="false" :stripe="false" :show-header="false" height="100%">
             <el-table-column type="index" label="序号" width="50" header-align="center" align="center" />
 
-            <el-table-column prop="repoTitle" label="名称" header-align="center" align="center" width="100">
+            <el-table-column prop="repoTitle" label="名称" header-align="center" align="center" width="250">
               <template #default="scope">
                 <el-icon size="16px" style="margin-right: 5px;">
                   <svg-icon name="ep:files" />