diff --git a/ui/src/api/folder.ts b/ui/src/api/folder.ts new file mode 100644 index 000000000..0613f5823 --- /dev/null +++ b/ui/src/api/folder.ts @@ -0,0 +1,25 @@ +import { Result } from '@/request/Result' +import { get, post, del, put } from '@/request/index' +import { type Ref } from 'vue' +import type { pageRequest } from '@/api/type/common' +const prefix = '/workspace' + +/** + * 获得知识库文件夹列表 + * @params 参数 + * source : APPLICATION, KNOWLEDGE, TOOL + * { + * name: string} + */ +const getFolder: ( + wordspace_id: string, + source: string, + data?: any, + loading?: Ref, +) => Promise>> = (wordspace_id, source, data, loading) => { + return get(`${prefix}/${wordspace_id}/${source}/folder`, data, loading) +} + +export default { + getFolder, +} diff --git a/ui/src/api/knowledge/knowledge.ts b/ui/src/api/knowledge/knowledge.ts new file mode 100644 index 000000000..4c62aa324 --- /dev/null +++ b/ui/src/api/knowledge/knowledge.ts @@ -0,0 +1,49 @@ +import { Result } from '@/request/Result' +import { get, post, del, put } from '@/request/index' +import { type Ref } from 'vue' +import type { pageRequest } from '@/api/type/common' +const prefix = '/workspace' + +/** + * 获得知识库文件夹列表 + * @params 参数 + * {folder_id: string, + * name: string, + * user_id: string, + * desc: string,} + */ +const getKnowledgeByFolder: ( + wordspace_id: string, + data?: any, + loading?: Ref, +) => Promise>> = (wordspace_id, data, loading) => { + return get(`${prefix}/${wordspace_id}/knowledge`, data, loading) +} + +/** + * 知识库列表 + * @param 参数 +* param { + "folder_id": "string", + "name": "string", + "tool_type": "string", + desc: string, + } + */ +const getKnowledgeList: ( + wordspace_id: string, + page: pageRequest, + param?: any, + loading?: Ref, +) => Promise> = (wordspace_id, page, param, loading) => { + return get( + `${prefix}/${wordspace_id}/knowledge/${page.current_page}/${page.page_size}`, + param, + loading, + ) +} + +export default { + getKnowledgeByFolder, + getKnowledgeList, +} diff --git a/ui/src/api/tool/tool.ts b/ui/src/api/tool/tool.ts new file mode 100644 index 000000000..f8bbdf7dc --- /dev/null +++ b/ui/src/api/tool/tool.ts @@ -0,0 +1,44 @@ +import { Result } from '@/request/Result' +import { get, post, del, put } from '@/request/index' +import { type Ref } from 'vue' +import type { pageRequest } from '@/api/type/common' +const prefix = '/workspace' + +/** + * 获得工具文件夹列表 + * @params 参数 {folder_id: string} + */ +const getToolByFolder: ( + wordspace_id: string, + data?: any, + loading?: Ref, +) => Promise>> = (wordspace_id, data, loading) => { + return get(`${prefix}/${wordspace_id}/tool`, data, loading) +} + +/** + * 工具列表 + * @param 参数 +* param { + "folder_id": "string", + "name": "string", + "tool_type": "string", + } + */ +const getToolList: ( + wordspace_id: string, + page: pageRequest, + param?: any, + loading?: Ref, +) => Promise> = (wordspace_id, page, param, loading) => { + return get( + `${prefix}/${wordspace_id}/tool/${page.current_page}/${page.page_size}`, + param, + loading, + ) +} + +export default { + getToolByFolder, + getToolList, +} diff --git a/ui/src/assets/icon_document.svg b/ui/src/assets/knowledge/icon_document.svg similarity index 100% rename from ui/src/assets/icon_document.svg rename to ui/src/assets/knowledge/icon_document.svg diff --git a/ui/src/assets/knowledge/icon_web.svg b/ui/src/assets/knowledge/icon_web.svg new file mode 100644 index 000000000..f958baf61 --- /dev/null +++ b/ui/src/assets/knowledge/icon_web.svg @@ -0,0 +1,4 @@ + + + + diff --git a/ui/src/assets/knowledge/logo_lark.svg b/ui/src/assets/knowledge/logo_lark.svg new file mode 100644 index 000000000..938c5055d --- /dev/null +++ b/ui/src/assets/knowledge/logo_lark.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/ui/src/components/card-box/index.vue b/ui/src/components/card-box/index.vue index e8c090e05..76672c1a1 100644 --- a/ui/src/components/card-box/index.vue +++ b/ui/src/components/card-box/index.vue @@ -5,14 +5,14 @@
- +
- +
{{ title }} - +
@@ -83,7 +83,6 @@ function subHoveredEnter() { margin-top: -10px; } .description { - color: var(--app-text-color-secondary); line-height: 22px; font-weight: 400; .content { @@ -97,10 +96,9 @@ function subHoveredEnter() { .card-footer { position: absolute; - bottom: 8px; + bottom: 4px; left: 0; min-height: 30px; - color: var(--app-text-color-secondary); font-weight: 400; padding: 0 16px; width: 100%; diff --git a/ui/src/components/folder-tree/index.vue b/ui/src/components/folder-tree/index.vue new file mode 100644 index 000000000..5a7a265ee --- /dev/null +++ b/ui/src/components/folder-tree/index.vue @@ -0,0 +1,83 @@ + + + diff --git a/ui/src/components/index.ts b/ui/src/components/index.ts index 76bfccd83..13bb4a3a1 100644 --- a/ui/src/components/index.ts +++ b/ui/src/components/index.ts @@ -7,6 +7,7 @@ import AppIcon from './app-icon/AppIcon.vue' import LayoutContainer from './layout-container/index.vue' import ContentContainer from './layout-container/ContentContainer.vue' import CardBox from './card-box/index.vue' +import FolderTree from './folder-tree/index.vue' export default { install(app: App) { app.component('LogoFull', LogoFull) @@ -17,5 +18,6 @@ export default { app.component('LayoutContainer', LayoutContainer) app.component('ContentContainer', ContentContainer) app.component('CardBox', CardBox) + app.component('FolderTree', FolderTree) }, } diff --git a/ui/src/components/layout-container/ContentContainer.vue b/ui/src/components/layout-container/ContentContainer.vue index b76b0a30f..f83b92ff4 100644 --- a/ui/src/components/layout-container/ContentContainer.vue +++ b/ui/src/components/layout-container/ContentContainer.vue @@ -1,5 +1,5 @@ @@ -22,7 +21,7 @@ defineOptions({ name: 'ContentContainer' }) const slots = useSlots() const props = defineProps({ header: String || null, - backTo: String + backTo: String, }) const showBack = computed(() => { const { backTo } = props @@ -33,10 +32,9 @@ const showBack = computed(() => { diff --git a/ui/src/locales/lang/zh-CN/views/index.ts b/ui/src/locales/lang/zh-CN/views/index.ts index dde9622cb..be89022bc 100644 --- a/ui/src/locales/lang/zh-CN/views/index.ts +++ b/ui/src/locales/lang/zh-CN/views/index.ts @@ -1,9 +1,11 @@ import login from './login' import model from './model' +import knowledge from './knowledge' +import tool from './tool' // import notFound from './404' // import application from './application' // import applicationOverview from './application-overview' -// import dataset from './dataset' + // import system from './system' // import functionLib from './function-lib' // import user from './user' @@ -19,10 +21,11 @@ import model from './model' export default { login, model, + knowledge, + tool, // notFound, // application, // applicationOverview, - // dataset, // system, // functionLib, // user, diff --git a/ui/src/locales/lang/zh-CN/views/knowledge.ts b/ui/src/locales/lang/zh-CN/views/knowledge.ts new file mode 100644 index 000000000..80ca8af62 --- /dev/null +++ b/ui/src/locales/lang/zh-CN/views/knowledge.ts @@ -0,0 +1,5 @@ +export default { + title: '知识库', + document_count: '文档数', + relatedApp_count: '关联应用', +} diff --git a/ui/src/locales/lang/zh-CN/views/tool.ts b/ui/src/locales/lang/zh-CN/views/tool.ts new file mode 100644 index 000000000..ebdfbc3ae --- /dev/null +++ b/ui/src/locales/lang/zh-CN/views/tool.ts @@ -0,0 +1,3 @@ +export default { + title: '工具', +} diff --git a/ui/src/router/modules/2knowledge.ts b/ui/src/router/modules/2knowledge.ts new file mode 100644 index 000000000..a1caf7f8a --- /dev/null +++ b/ui/src/router/modules/2knowledge.ts @@ -0,0 +1,17 @@ +const ModelRouter = { + path: '/knowledge', + name: 'knowledge', + meta: { title: 'views.knowledge.title', permission: 'KNOWLEDGE:READ' }, + redirect: '/knowledge', + component: () => import('@/layout/layout-template/SimpleLayout.vue'), + children: [ + { + path: '/knowledge', + name: 'knowledge-index', + meta: { title: '知识库主页', activeMenu: '/knowledge' }, + component: () => import('@/views/knowledge/index.vue') + } + ] +} + +export default ModelRouter diff --git a/ui/src/router/modules/3tool.ts b/ui/src/router/modules/3tool.ts new file mode 100644 index 000000000..e9e050811 --- /dev/null +++ b/ui/src/router/modules/3tool.ts @@ -0,0 +1,17 @@ +const ModelRouter = { + path: '/tool', + name: 'tool', + meta: { title: 'views.tool.title', permission: 'TOOL:READ' }, + redirect: '/tool', + component: () => import('@/layout/layout-template/SimpleLayout.vue'), + children: [ + { + path: '/tool', + name: 'tool-index', + meta: { title: '工具主页', activeMenu: '/tool' }, + component: () => import('@/views/tool/index.vue') + } + ] +} + +export default ModelRouter diff --git a/ui/src/router/modules/model.ts b/ui/src/router/modules/4model.ts similarity index 84% rename from ui/src/router/modules/model.ts rename to ui/src/router/modules/4model.ts index d9527b4a4..95fde26e2 100644 --- a/ui/src/router/modules/model.ts +++ b/ui/src/router/modules/4model.ts @@ -8,7 +8,7 @@ const ModelRouter = { { path: '/model', name: 'model-index', - meta: { title: '模型主页', activeMenu: '/function-lib' }, + meta: { title: '模型主页', activeMenu: '/model' }, component: () => import('@/views/model/index.vue') } ] diff --git a/ui/src/stores/index.ts b/ui/src/stores/index.ts index 9f0d07740..ea30e5f54 100644 --- a/ui/src/stores/index.ts +++ b/ui/src/stores/index.ts @@ -1,9 +1,11 @@ import useLoginStore from './modules/login' import useUserStore from './modules/user' +import useFolderStore from './modules/folder' const useStore = () => ({ login: useLoginStore(), user: useUserStore(), + folder: useFolderStore(), }) export default useStore diff --git a/ui/src/stores/modules/folder.ts b/ui/src/stores/modules/folder.ts new file mode 100644 index 000000000..94cd531ff --- /dev/null +++ b/ui/src/stores/modules/folder.ts @@ -0,0 +1,23 @@ +import { defineStore } from 'pinia' +import { type Ref } from 'vue' +import folderApi from '@/api/folder' + +const useFolderStore = defineStore('folder', { + state: () => ({}), + actions: { + async asynGetFolder(workspace_id: string, source: string, data: any, loading?: Ref) { + return new Promise((resolve, reject) => { + folderApi + .getFolder(workspace_id, source, data, loading) + .then((res) => { + resolve(res) + }) + .catch((error) => { + reject(error) + }) + }) + }, + }, +}) + +export default useFolderStore diff --git a/ui/src/styles/app.scss b/ui/src/styles/app.scss index 9d1e80bb5..2e1e51b39 100644 --- a/ui/src/styles/app.scss +++ b/ui/src/styles/app.scss @@ -372,3 +372,7 @@ h5 { white-space: pre-wrap; } +// 颜色 +.color-secondary { + color: var(--app-text-color-secondary); +} diff --git a/ui/src/styles/element-plus.scss b/ui/src/styles/element-plus.scss index f88cc3d8c..a7d622bd9 100644 --- a/ui/src/styles/element-plus.scss +++ b/ui/src/styles/element-plus.scss @@ -17,3 +17,6 @@ cursor: pointer; flex-shrink: 0; } +.el-card { + --el-card-padding: calc(var(--app-base-px) * 2); +} diff --git a/ui/src/styles/variables.scss b/ui/src/styles/variables.scss index f2c2a0ade..c598235dd 100644 --- a/ui/src/styles/variables.scss +++ b/ui/src/styles/variables.scss @@ -17,11 +17,7 @@ --app-logo-color: linear-gradient(180deg, #3370FF 0%, #7f3bf5 100%); --app-avatar-gradient-color: linear-gradient(270deg, #9258f7 0%, #3370FF 100%); - /* 计算高度 */ - --app-main-height: calc(100vh - var(--app-header-height) - var(--app-view-padding) * 2 - 40px); - /** sidebar 组件 */ - --sidebar-bg-color: #ffffff; --sidebar-width: 240px; /** tag */ --tag-default-bg: rgba(51, 112, 255, 0.2); diff --git a/ui/src/utils/common.ts b/ui/src/utils/common.ts index 770adde26..6865f61b9 100644 --- a/ui/src/utils/common.ts +++ b/ui/src/utils/common.ts @@ -22,3 +22,27 @@ export function splitArray(sourceDataList: Array, splitNum: number) { } return arrayList } + +/** + * 数字处理 + */ +export function toThousands(num: any) { + return num?.toString().replace(/\d+/, function (n: any) { + return n.replace(/(\d)(?=(?:\d{3})+$)/g, '$1,') + }) +} +export function numberFormat(num: number) { + return num < 1000 ? toThousands(num) : toThousands((num / 1000).toFixed(1)) + 'k' +} + +export function filesize(size: number) { + if (!size) return '' + /* byte */ + const num = 1024.0 + + if (size < num) return size + 'B' + if (size < Math.pow(num, 2)) return (size / num).toFixed(2) + 'K' //kb + if (size < Math.pow(num, 3)) return (size / Math.pow(num, 2)).toFixed(2) + 'M' //M + if (size < Math.pow(num, 4)) return (size / Math.pow(num, 3)).toFixed(2) + 'G' //G + return (size / Math.pow(num, 4)).toFixed(2) + 'T' //T +} diff --git a/ui/src/views/knowledge/index.vue b/ui/src/views/knowledge/index.vue new file mode 100644 index 000000000..6a3f8a0ac --- /dev/null +++ b/ui/src/views/knowledge/index.vue @@ -0,0 +1,116 @@ + + + + + diff --git a/ui/src/views/model/component/ModelCard.vue b/ui/src/views/model/component/ModelCard.vue index 0bd74ff4a..1f1f6d52b 100644 --- a/ui/src/views/model/component/ModelCard.vue +++ b/ui/src/views/model/component/ModelCard.vue @@ -5,9 +5,7 @@
  • - {{ $t('views.model.modelForm.form.model_type.label') }} + {{ + $t('views.model.modelForm.form.model_type.label') + }} {{ $t(modelType[model.model_type as keyof typeof modelType]) }}
  • - {{ $t('views.model.modelForm.form.base_model.label') }} + {{ + $t('views.model.modelForm.form.base_model.label') + }} {{ model.model_name }} diff --git a/ui/src/views/model/index.vue b/ui/src/views/model/index.vue index ee08c77db..7b69f24f8 100644 --- a/ui/src/views/model/index.vue +++ b/ui/src/views/model/index.vue @@ -148,10 +148,10 @@ + + + +