CzRger 2 月之前
父节点
当前提交
1e804eae68

二进制
src/assets/images/knowledge-document-menu.png


文件差异内容过多而无法显示
+ 5 - 0
src/assets/svg/back_1.svg


文件差异内容过多而无法显示
+ 6 - 0
src/assets/svg/cloud.svg


文件差异内容过多而无法显示
+ 6 - 0
src/assets/svg/config.svg


文件差异内容过多而无法显示
+ 6 - 0
src/assets/svg/document.svg


文件差异内容过多而无法显示
+ 6 - 0
src/assets/svg/move.svg


+ 2 - 2
src/components/SvgIcon/index.vue

@@ -1,6 +1,6 @@
 <template>
-  <div>
-    <svg aria-hidden="true" class="svg-icon" :style="`width: ${size}px;height: ${size}px;transform: rotate(${rotate}deg);`">
+  <div class="svg-icon">
+    <svg aria-hidden="true" :style="`width: ${size}px;height: ${size}px;transform: rotate(${rotate}deg);`">
       <use :xlink:href="symbolId" :fill="colorCpt" />
     </svg>
   </div>

+ 18 - 13
src/components/czr-ui/CzrButton.vue

@@ -8,22 +8,22 @@
     </template>
     <template v-else-if="type == 'export'">
       <div class="czr-button __hover">
-        <SvgIcon name="czr_export" color="var(--czr-main-color)" size="12"/>{{title || '导出'}}
+        <SvgIcon name="czr_export" color="var(--czr-main-color)"/>{{title || '导出'}}
       </div>
     </template>
     <template v-else-if="type == 'add'">
-      <div class="czr-button __hover">
-        <SvgIcon name="czr_add2" color="var(--czr-main-color)" size="12"/>{{title || '新增'}}
+      <div class="czr-button _add __hover">
+        <SvgIcon name="czr_add2" color="#fffff"/>{{title || '新增'}}
       </div>
     </template>
     <template v-else-if="type == 'del'">
       <div class="czr-button __hover del">
-        <SvgIcon :name="icon || 'czr_del'" color="#FF5454" size="12"/>{{title || '删除'}}
+        <SvgIcon :name="icon || 'czr_del'" color="#FF5454"/>{{title || '删除'}}
       </div>
     </template>
     <template v-else>
       <div class="czr-button __hover">
-        <SvgIcon v-if="icon" :name="icon" color="var(--czr-main-color)" size="12"/>{{ title }}
+        <SvgIcon v-if="icon" :name="icon"/>{{ title }}
       </div>
     </template>
   </div>
@@ -43,23 +43,28 @@ const props = defineProps({
 <style lang="scss" scoped>
 .czr-button {
   width: fit-content;
-  height: 28px;
-  background: rgba(var(--czr-main-color-rgb),0.1);
-  border-radius: 2px;
+  height: 2.25rem;
+  background: #ffffff;
+  border-radius: 0.25rem;
   display: flex;
   align-items: center;
   justify-content: center;
-  padding: 0 12px;
+  padding: 0 1rem;
+  border: 0.06rem solid #C0C4CC;
   font-weight: 400;
-  font-size: 12px;
-  color: var(--czr-main-color);
+  font-size: 0.88rem;
+  color: #606266;
   line-height: 1;
   .svg-icon {
-    margin-right: 4px;
+    margin-right: var(--czr-gap);
   }
   &.del {
     background: rgba(255, 84, 84, 0.10);
-    color: rgba(255, 84, 84, 1);
+    color: #FF5454;
+  }
+  &._add {
+    color: #ffffff;
+    background-color: var(--czr-main-color)
   }
 }
 .czr-button-table {

+ 1 - 1
src/style/czr.scss

@@ -251,7 +251,7 @@
   display: flex;
   align-items: center;
   position: relative;
-  padding-left: 0.63rem;
+  padding-left: var(--czr-gap);
   box-sizing: border-box;
   &:before {
     content: '';

+ 208 - 0
src/views/manage/knowledge/documents/document/index.vue

@@ -0,0 +1,208 @@
+<template>
+  <div class="bm-main-box">
+    <div class="flex items-center">
+      <div class="bm-main-box-title">文档</div>
+    </div>
+    <div class="flex items-center mt-[1rem]">
+      <div class="flex gap-[var(--czr-gap)]">
+        <CzrButton type="add" title="添加文件"/>
+        <CzrButton title="迁移" icon="move"/>
+        <CzrButton title="归档" icon="cloud"/>
+        <CzrButton title="删除" icon="czr_del"/>
+      </div>
+      <div class="ml-auto flex items-center gap-[var(--czr-gap)]">
+        <div class="__hover text-[0.88rem] text-[#576275] flex items-center gap-[0.3rem]" @click="state.query.form.isCreate = !state.query.form.isCreate">
+          <SvgIcon name="czr_add1" size="14" :active="state.query.form.isCreate"/>我的创建
+        </div>
+        <div class="__hover text-[0.88rem] text-[#576275] flex items-center gap-[0.3rem]" @click="state.query.form.isStar = !state.query.form.isStar">
+          <SvgIcon name="star" size="15" class="mb-[2px]" :active="state.query.form.isStar"/>我的收藏
+        </div>
+        <CzrForm class="bm-filter" label-width="0px" @handleEnter="onSearch">
+          <CzrFormColumn
+            width="6.68rem"
+            class="__czr-table-form-column"
+            :span="24"
+            label-width="0px"
+            v-model:param="state.query.form.group"
+            link="select"
+            :options="DictionaryStore.knowledgeGroups.list"
+            placeholder="全部分组"
+          />
+          <CzrFormColumn
+            width="6.68rem"
+            class="__czr-table-form-column"
+            :span="24"
+            label-width="0px"
+            v-model:param="state.query.form.tag"
+            link="select"
+            :options="DictionaryStore.knowledgeTags.list"
+            placeholder="全部标签"
+          />
+          <CzrFormColumn
+            width="15.63rem"
+            class="__czr-table-form-column"
+            :span="24"
+            label-width="0px"
+            v-model:param="state.text"
+            placeholder="按名称搜索"
+            :prefix-icon="Search"
+          />
+        </CzrForm>
+      </div>
+    </div>
+    <div class="overflow-hidden flex-1 mt-[1rem]" v-loading="state.query.loading">
+
+    </div>
+  </div>
+</template>
+
+<script setup lang="ts">
+import {getCurrentInstance, onMounted, reactive, ref, watch} from "vue";
+import { Search } from '@element-plus/icons-vue'
+import {debounce} from "lodash";
+import {useDialogStore, useDictionaryStore} from "@/stores";
+import {ElMessage} from "element-plus";
+
+const DialogStore = useDialogStore();
+const DictionaryStore = useDictionaryStore();
+const emits = defineEmits([])
+const props = defineProps({
+  knowledge: <any>{}
+})
+const {proxy}: any = getCurrentInstance()
+const state: any = reactive({
+  text: '',
+  query: {
+    loading: false,
+    page: {
+      pageNum: 1,
+      pageSize: 20
+    },
+    form: {},
+    formReal: {},
+    result: {
+      total: 0,
+      data: []
+    },
+    selected: []
+  },
+  detail: {
+    show: false,
+    transfer: {}
+  },
+})
+const setText = debounce((v) => {
+  state.query.form.name = v
+}, 1000)
+watch(() => state.text, (n) => {
+  setText(n)
+})
+watch(() => state.query.form, (n) => {
+  onSearch()
+}, {deep: true})
+const onPage = (pageNum, pageSize) => {
+  state.query.page = {
+    pageNum: pageNum,
+    pageSize: pageSize,
+  }
+  const params = {
+    pageNum: state.query.page.pageNum,
+    pageSize: state.query.page.pageSize,
+  }
+  //  添加表单参数
+  for (const [k, v] of Object.entries(state.query.formReal)) {
+    if (proxy.$czrUtil.isValue(v)) {
+      params[k] = v
+    }
+  }
+  state.query.loading = true
+  setTimeout(() => {
+    state.query.result.total = 100
+    const arr: any = [{empty: true}]
+    for (let i = 1; i <= params.pageSize; i++) {
+      const n = (params.pageNum - 1) * params.pageSize + i
+      arr.push({
+        p1: '部门知识库-部门知识库-部门知识库-' + n,
+        p2: '王一鸣',
+        p3: '只是一个政务服务事项办事指南',
+        p4: n,
+        p5: '2980k',
+        p6: n % 4,
+        p7: n % 2,
+        tags: n % 2 ? '1,2,3,41,2,3,41,2,3,41,2,3,41,2,3,4' : ''
+      })
+    }
+    state.query.result.data = arr
+    state.query.loading = false
+  }, 1000)
+  // state.query.loading = true
+  // listRuleLogisticsDataSubscribeInfo(params).then(res => {
+  //   if (res.code == 200) {
+  //     state.query.result.total = res.total
+  //     state.query.result.data = res.rows
+  //     state.query.loading = false
+  //   } else {
+  //     ElMessage.error(res.msg)
+  //   }
+  // }).catch(() => {
+  //   state.query.loading = false
+  // })
+}
+const onSearch = () => {
+  state.query.formReal = JSON.parse(JSON.stringify(state.query.form))
+  onPage(1, state.query.page.pageSize)
+}
+const onReset = () => {
+  state.query.page = {
+    pageNum: 1,
+    pageSize: 20
+  }
+  state.query.form = {}
+  onSearch()
+}
+const onAdd = () => {
+  state.detail.transfer = {
+    mode: 'add'
+  }
+  state.detail.show = true
+}
+const onEdit = (row) => {
+  state.detail.transfer = {
+    mode: 'edit',
+    id: row.id
+  }
+  state.detail.show = true
+}
+const onDel = (row: any) => {
+  DialogStore.confirm({
+    title: '删除确认',
+    content: `${row.p6}个应用正在使用该大模型,请确认是否删除`,
+    onSubmit: () => {
+      ElMessage.success('删除成功!')
+    }
+  })
+}
+const onChangeTag = (row, tags) => {
+  row.tags = tags
+  // onSearch()
+}
+const initDictionary = () => {
+  DictionaryStore.initKnowledgeGroups()
+}
+onMounted(() => {
+  console.log(props.knowledge)
+  initDictionary()
+  onReset()
+})
+</script>
+
+<style lang="scss" scoped>
+.knowledge {
+  width: 100%;
+  height: 11.81rem;
+  background-image: url("@/assets/images/knowledge-item-bg.png");
+  background-repeat: no-repeat;
+  background-size: 100% 100%;
+  padding: 1rem 1.5rem;
+}
+</style>

+ 58 - 4
src/views/manage/knowledge/documents/index.vue

@@ -1,9 +1,23 @@
 <template>
-  知识库文档
+  <div class="w-full h-full flex">
+    <div class="w-[13rem] mr-[1rem]">
+      <div class="menu-title">
+        <span v-title>部门知识库-新</span>
+      </div>
+      <template v-for="(item, index) in menus">
+        <div class="w-full p-[var(--czr-gap)] bg-[#ffffff] last:rounded-b-[0.5rem]">
+          <div class="menu-item __hover" :class="{active: state.menu === item.value}" @click="state.menu = item.value">
+            <SvgIcon :name="item.icon" :active="state.menu === item.value"/>{{item.label}}
+          </div>
+        </div>
+      </template>
+    </div>
+    <component v-if="state.menu" :is="menus.filter(v => v.value === state.menu)[0].com" :knowledge="state.knowledge"/>
+  </div>
 </template>
 
 <script setup lang="ts">
-import {getCurrentInstance, onMounted, reactive, ref} from "vue";
+import {defineAsyncComponent, getCurrentInstance, onMounted, reactive, ref} from "vue";
 import {useRoute, useRouter} from "vue-router";
 
 const route = useRoute();
@@ -11,12 +25,22 @@ const router = useRouter();
 const emits = defineEmits([])
 const props = defineProps({})
 const {proxy}: any = getCurrentInstance()
+const menus = [
+  {label: '文档', value: 1, icon: 'document', com: defineAsyncComponent(() => import("./document/index.vue"))},
+  {label: '召回测试', value: 2, icon: 'back_1'},
+  {label: '设置', value: 3, icon: 'config'},
+]
 const state: any = reactive({
-  ID: route.params.id
+  ID: route.params.id,
+  knowledge: {},
+  menu: null
 })
 const initDetail = () => {
   if (state.ID) {
-
+    state.knowledge = {
+      ID: state.ID
+    }
+    state.menu = menus[0].value
   } else {
     router.push({name: '4342bfff-1ea8-4f4c-b562-3cdc1fde116f'})
   }
@@ -27,4 +51,34 @@ onMounted(() => {
 </script>
 
 <style lang="scss" scoped>
+.menu-title {
+  width: 13rem;
+  height: 2.88rem;
+  background-image: url("@/assets/images/knowledge-document-menu.png");
+  background-size: 100% 100%;
+  background-repeat: no-repeat;
+  border-radius: 0.5rem 0.5rem 0 0;font-weight: bold;
+  font-size: 1rem;
+  color: #303133;
+  display: flex;
+  align-items: center;
+  padding: 0 var(--czr-gap);
+}
+.menu-item {
+  width: 100%;
+  height: 2.25rem;
+  display: flex;
+  align-items: center;
+  font-size: 0.88rem;
+  padding: 0 var(--czr-gap);
+  color: #606266;
+  border-radius: 0.25rem;
+  .svg-icon {
+    margin-right: 1rem;
+  }
+  &.active {
+    color: var(--czr-main-color);
+    background-color: rgba(var(--czr-main-color-rgb), 0.1);
+  }
+}
 </style>