From e0b626159664bbd9d673537debc8ab7cef0a5cde Mon Sep 17 00:00:00 2001 From: zhaofengchao <13723060510@163.com> Date: Wed, 10 Jan 2024 17:04:07 +0800 Subject: [PATCH] add file --- client/package-lock.json | 7 + client/package.json | 1 + client/routes.js | 2 +- client/src/assets/logo.png | Bin 0 -> 12553 bytes client/src/layouts/index.tsx | 22 +-- .../components/knowledge-file/idnex.less | 10 + .../components/knowledge-file/index.tsx | 186 ++++++++++++------ .../components/knowledge-setting/index.tsx | 2 +- client/src/pages/add-knowledge/index.less | 20 +- client/src/pages/add-knowledge/index.tsx | 96 ++++++--- client/src/pages/knowledge/index.less | 6 + client/src/pages/knowledge/index.tsx | 83 ++++---- client/src/pages/login/model.ts | 1 - client/src/utils/StorageManager.ts | 27 +-- client/src/utils/index.ts | 6 +- 15 files changed, 289 insertions(+), 180 deletions(-) create mode 100644 client/src/assets/logo.png diff --git a/client/package-lock.json b/client/package-lock.json index b3f0b33d5..17fa55fba 100644 --- a/client/package-lock.json +++ b/client/package-lock.json @@ -19,6 +19,7 @@ "umi-request": "^1.4.0" }, "devDependencies": { + "@types/lodash": "^4.14.202", "@types/react": "^18.0.33", "@types/react-dom": "^18.0.11", "@umijs/plugins": "^4.1.0", @@ -2557,6 +2558,12 @@ "resolved": "https://registry.npmmirror.com/@types/json-schema/-/json-schema-7.0.15.tgz", "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==" }, + "node_modules/@types/lodash": { + "version": "4.14.202", + "resolved": "https://registry.npmmirror.com/@types/lodash/-/lodash-4.14.202.tgz", + "integrity": "sha512-OvlIYQK9tNneDlS0VN54LLd5uiPCBOp7gS5Z0f1mjoJYBrtStzgmJBxONW3U6OZqdtNzZPmn9BS/7WI7BFFcFQ==", + "dev": true + }, "node_modules/@types/minimist": { "version": "1.2.5", "resolved": "https://registry.npmmirror.com/@types/minimist/-/minimist-1.2.5.tgz", diff --git a/client/package.json b/client/package.json index ef7cac654..7f4320b96 100644 --- a/client/package.json +++ b/client/package.json @@ -22,6 +22,7 @@ "umi-request": "^1.4.0" }, "devDependencies": { + "@types/lodash": "^4.14.202", "@types/react": "^18.0.33", "@types/react-dom": "^18.0.11", "@umijs/plugins": "^4.1.0", diff --git a/client/routes.js b/client/routes.js index df28494eb..d989b608a 100644 --- a/client/routes.js +++ b/client/routes.js @@ -29,7 +29,7 @@ const routes = [ name: '知识库', icon: 'home', auth: [3, 4, 100], - path: '/knowledge/add', + path: '/knowledge/add/*', component: '@/pages/add-knowledge', pathname: 'knowledge', // routes: [{ diff --git a/client/src/assets/logo.png b/client/src/assets/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..24616f1d13b1a9dd602453b65c78aa2cc76b6cb6 GIT binary patch literal 12553 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 ah->rXBXlWl8vgx_Kvhvgp^YuX$kr literal 0 HcmV?d00001 diff --git a/client/src/layouts/index.tsx b/client/src/layouts/index.tsx index 376ec8890..85b185cdc 100644 --- a/client/src/layouts/index.tsx +++ b/client/src/layouts/index.tsx @@ -3,19 +3,19 @@ import { history, Outlet, useLocation, useNavigate } from 'umi'; import { useTranslation, Trans } from 'react-i18next' import classnames from 'classnames' import '../locales/config'; +import logo from '@/assets/logo.png' import { - MenuFoldOutlined, - MenuUnfoldOutlined, + RedditOutlined } from '@ant-design/icons'; import { Layout, Button, theme, Space, } from 'antd'; import styles from './index.less' import User from './components/user' +import { head } from 'lodash'; const { Header, Content } = Layout; const App: React.FC = (props) => { const { t } = useTranslation() - const [collapsed, setCollapsed] = useState(false); const navigate = useNavigate() const { token: { colorBgContainer, borderRadiusLG }, @@ -40,17 +40,9 @@ const App: React.FC = (props) => { return ( -

- + + + ), + }, + { + key: '2', + label: ( +
+ +
+ ), + // disabled: true, + }, + ]; + + const columns: ColumnsType = [ + { + title: '名称', + dataIndex: 'name', + key: 'name', + render: (text) => {text}, + className: `${styles.column}` + }, + { + title: '数据总量', + dataIndex: 'total', + key: 'total', + className: `${styles.column}` + }, + { + title: 'Tokens', + dataIndex: 'tokens', + key: 'tokens', + className: `${styles.column}` + }, + { + title: '状态', + key: 'status', + dataIndex: 'status', + className: `${styles.column}`, + render: (_, { status }) => ( + <> + + + ), + }, + { + title: 'Action', + key: 'action', + className: `${styles.column}`, + render: (_, record) => ( + + + + 分段设置 + + + + ), + }, + ]; return <>
- + + + 导入文件 + + +
- +
}; diff --git a/client/src/pages/add-knowledge/components/knowledge-setting/index.tsx b/client/src/pages/add-knowledge/components/knowledge-setting/index.tsx index 06003520d..b7ddd1098 100644 --- a/client/src/pages/add-knowledge/components/knowledge-setting/index.tsx +++ b/client/src/pages/add-knowledge/components/knowledge-setting/index.tsx @@ -48,7 +48,7 @@ const App: React.FC = () => { {...layout} name="nest-messages" onFinish={onFinish} - style={{ maxWidth: 600 }} + style={{ maxWidth: 1000, padding: 14 }} validateMessages={validateMessages} > diff --git a/client/src/pages/add-knowledge/index.less b/client/src/pages/add-knowledge/index.less index 2ac5bc999..8cabb8e6c 100644 --- a/client/src/pages/add-knowledge/index.less +++ b/client/src/pages/add-knowledge/index.less @@ -1,7 +1,19 @@ -.tab { - :global { - .ant-tabs-tabpane { - margin: 20px; +.container { + display: flex; + + .menu { + .defaultWidth { + width: 256px; + } + + .minWidth { + width: 50px } } + + .content { + flex: 1; + overflow-x: auto; + height: 100%; + } } \ No newline at end of file diff --git a/client/src/pages/add-knowledge/index.tsx b/client/src/pages/add-knowledge/index.tsx index b228d7b8f..09df86e2b 100644 --- a/client/src/pages/add-knowledge/index.tsx +++ b/client/src/pages/add-knowledge/index.tsx @@ -1,6 +1,6 @@ -import React, { useState } from 'react'; -import type { RadioChangeEvent } from 'antd'; -import { Radio, Space, Tabs } from 'antd'; +import React, { useMemo, useState, useEffect } from 'react'; +import type { MenuProps } from 'antd'; +import { Radio, Space, Tabs, Menu } from 'antd'; import { ToolOutlined, BarsOutlined, @@ -10,40 +10,78 @@ import File from './components/knowledge-file' import Setting from './components/knowledge-setting' import Search from './components/knowledge-search' import styles from './index.less' +import { getWidth } from '@/utils' const App: React.FC = () => { - type keyType = 'setting' | 'file' | 'search' - const [activeKey, setActiveKey] = useState('file') - // type tab = { label: string, icon: Element, tag: string } - const tabs = [{ label: '配置', icon: , tag: 'setting' }, { label: '知识库', icon: , tag: 'file' }, { label: '搜索测试', icon: , tag: 'search' }] + const [activeKey, setActiveKey] = useState('file') + const [collapsed, setCollapsed] = useState(false); + const [windowWidth, setWindowWidth] = useState(getWidth()); - const onTabClick = (activeKey: keyType) => { - setActiveKey(activeKey) + // 标记一下 + useEffect(() => { + const widthSize = () => { + const width = getWidth() + console.log(width) + + setWindowWidth(width); + }; + window.addEventListener("resize", widthSize); + return () => { + window.removeEventListener("resize", widthSize); + }; + }, []); + useEffect(() => { + if (windowWidth.width > 957) { + setCollapsed(false) + } else { + setCollapsed(true) + } + }, [windowWidth.width]) + type MenuItem = Required['items'][number]; + + function getItem( + label: React.ReactNode, + key: React.Key, + icon?: React.ReactNode, + children?: MenuItem[], + type?: 'group', + ): MenuItem { + return { + key, + icon, + children, + label, + type, + } as MenuItem; } - // type stringKey = Record - - const mapComponent = { - file: , - setting: , - search: + const items: MenuItem[] = [ + getItem('配置', 'setting', ), + getItem('知识库', 'file', ), + getItem('搜索测试', 'search', ), + ]; + const handleSelect: MenuProps['onSelect'] = (e) => { + setActiveKey(e.key) } return ( <> - | MouseEvent) => { onTabClick(activeKey) }} - className={styles.tab} - items={tabs.map((item) => { - return { - label: item.label, - icon: item.icon, - key: item.tag, - children: mapComponent[activeKey] as Element, - }; - })} - /> +
+
+ 957 ? styles.defaultWidth : styles.minWidth} + inlineCollapsed={collapsed} + items={items} + onSelect={handleSelect} + /> +
+
+ {activeKey === 'file' && } + {activeKey === 'setting' && } + {activeKey === 'search' && } +
+
); }; diff --git a/client/src/pages/knowledge/index.less b/client/src/pages/knowledge/index.less index 45da6f445..f0089fbed 100644 --- a/client/src/pages/knowledge/index.less +++ b/client/src/pages/knowledge/index.less @@ -1,3 +1,7 @@ +.knowledge { + padding: 24px; +} + .container { height: 100px; display: flex; @@ -28,6 +32,8 @@ padding: 10px; margin: 0; } + + margin-bottom: 10px; } diff --git a/client/src/pages/knowledge/index.tsx b/client/src/pages/knowledge/index.tsx index 69363330e..c68236e87 100644 --- a/client/src/pages/knowledge/index.tsx +++ b/client/src/pages/knowledge/index.tsx @@ -1,6 +1,6 @@ import React, { useState, } from 'react'; import { useNavigate } from 'umi' -import { Card, List, Popconfirm, message, FloatButton } from 'antd'; +import { Card, List, Popconfirm, message, FloatButton, Row, Col } from 'antd'; import { MinusSquareOutlined, DeleteOutlined, PlusOutlined } from '@ant-design/icons'; import styles from './index.less' @@ -41,47 +41,52 @@ const App: React.FC = () => { }; const handleAddKnowledge = () => { // setDatas((datas) => [...datas, ...dd]) - navigate('add'); + navigate('add/file'); } - return (<>} type="primary" style={{ right: 24, top: 100 }} /> - ( - - -
-
- - content - - - { confirm(index) }} - okText="Yes" - cancelText="No" - > - - - -
-
- - {item.text} - - - {item.des} - -
+ return (<> +
+ } type="primary" style={{ right: 24, top: 100 }} /> + + { + data.map((item, index) => { + return (
+ +
+
+ + content + + + { confirm(index) }} + okText="Yes" + cancelText="No" + > + + -
- - - )} - /> + +
+
+ + {item.text} + + + {item.des} + +
+ + +
+ ) + }) + } + + + ) }; diff --git a/client/src/pages/login/model.ts b/client/src/pages/login/model.ts index 05c1428ed..cd88d7ba9 100644 --- a/client/src/pages/login/model.ts +++ b/client/src/pages/login/model.ts @@ -1,5 +1,4 @@ import { message } from 'antd'; -import store from '@/utils/persistStore'; import { addParam } from '@/utils'; import loginService from '@/services/loginService'; diff --git a/client/src/utils/StorageManager.ts b/client/src/utils/StorageManager.ts index 83614ab7d..423cd808f 100644 --- a/client/src/utils/StorageManager.ts +++ b/client/src/utils/StorageManager.ts @@ -2,32 +2,7 @@ import { debounce } from 'lodash'; import semver from 'semver'; import merge from 'lodash/merge'; import isPlainObject from 'lodash/isPlainObject'; -/** - * 统一localStorage存储管理器 - * - * 参数说明: - * lazy: boolean 是否懒加载,未开启懒加载在初始化时就读取localstorage,开启懒加载将在第一次获取或设置值时读取localstorage - * namespace: string localstorage的key,定义多个manager时区分 - * version: string 'x.x.x'格式,采用语义化版本控制,用于重置用户设备中的localstorage - * - * 使用说明: - * 创建一个初始结构,可用来初始化用户存储,或者重置用户存储, 格式类似于redux里的state - * const store = { - * token: '', - * }; - * - * 创建manager对象, 此处传入version便于标明版本号,方便后续升级重置用户数据 - * const manager = new StorageManager(store, { version: '0.0.0' }); - * - * 直接设置属性,将存入localstorage, 多次设置只会存入最后的值,此处使用debounce减少io操作 - * manager.token = '123456' - * manager.token = '123' - * manager.token = '456' - * - * 直接读取值,获取到的的localstorage中的值 - * console.log(manager.token) - * - */ + class StorageManager { constructor(store, options) { options = Object.assign( diff --git a/client/src/utils/index.ts b/client/src/utils/index.ts index ffdf0445d..25e21f68d 100644 --- a/client/src/utils/index.ts +++ b/client/src/utils/index.ts @@ -147,9 +147,13 @@ export const formatRequestUrlByDomainPrefix = url => { } return `${prefix}${url}`; }; +export const getWidth = () => { + return { width: window.innerWidth }; +}; export default { parseQuery, downloadWithIframe, - formatRequestUrlByDomainPrefix + formatRequestUrlByDomainPrefix, + getWidth };