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 b7ddd1098..be18a7619 100644 --- a/client/src/pages/add-knowledge/components/knowledge-setting/index.tsx +++ b/client/src/pages/add-knowledge/components/knowledge-setting/index.tsx @@ -1,8 +1,8 @@ import React, { useEffect, useState } from 'react'; +import { useNavigate, connect } from 'umi' import { Button, Form, Input, InputNumber, Radio, Select, Tag, Space, Avatar, Divider, List, Skeleton } from 'antd'; -import InfiniteScroll from 'react-infinite-scroll-component'; import styles from './index.less' - +const { CheckableTag } = Tag; const layout = { labelCol: { span: 8 }, wrapperCol: { span: 16 }, @@ -22,9 +22,7 @@ const validateMessages = { }; /* eslint-enable no-template-curly-in-string */ -const onFinish = (values: any) => { - console.log(values); -}; + interface DataType { gender: string; name: { @@ -42,46 +40,95 @@ interface DataType { } const tags = [{ title: '研报' }, { title: '法律' }, { title: '简历' }, { title: '说明书' }, { title: '书籍' }, { title: '演讲稿' }] -const App: React.FC = () => { +const Index: React.FC = ({ settingModel, kSModel, dispatch, ...props }) => { + const { tenantIfo = {} } = settingModel + const { parser_ids = '', embd_id = '' } = tenantIfo + const { id = '' } = props + useEffect(() => { + dispatch({ + type: 'settingModel/getTenantInfo', + payload: { + } + }); + }, []) + const [selectedTag, setSelectedTag] = useState('') + const onFinish = (values: any) => { + console.log(values); + if (id) { + dispatch({ + type: 'kSModel/updateKb', + payload: { + ...values, + parser_id: selectedTag, + kb_id: id + } + }); + } else { + dispatch({ + type: 'kSModel/createKb', + payload: { + ...values, + parser_id: selectedTag + } + }); + } + + + }; + + const handleChange = (tag: string, checked: boolean) => { + const nextSelectedTag = checked + ? tag + : selectedTag; + console.log('You are interested in: ', nextSelectedTag); + setSelectedTag(nextSelectedTag); + }; return
- + - + - + - 只有我 - 所有团队成员 + 只有我 + 所有团队成员 -
- 修改Embedding 模型,请去设置 -
+
+ 修改Embedding 模型,请去设置 +
{ - tags.map(item => { - return ({item.title}) + parser_ids.split(',').map(tag => { + return ( handleChange(tag, checked)} + > + {tag} + ) }) }
@@ -110,4 +157,4 @@ const App: React.FC = () => { -export default App; \ No newline at end of file +export default connect(({ settingModel, kSModel, kAModel, loading }) => ({ settingModel, kSModel, loading }))(Index); \ No newline at end of file diff --git a/client/src/pages/add-knowledge/components/knowledge-setting/model.ts b/client/src/pages/add-knowledge/components/knowledge-setting/model.ts new file mode 100644 index 000000000..796add13b --- /dev/null +++ b/client/src/pages/add-knowledge/components/knowledge-setting/model.ts @@ -0,0 +1,83 @@ +import { message } from 'antd'; +import { addParam } from '@/utils'; +import kbService from '@/services/kbService'; + +const Model = { + namespace: 'kSModel', + state: { + isShowPSwModal: false, + isShowTntModal: false, + loading: false, + tenantIfo: {} + }, + subscriptions: { + setup({ dispatch, history }) { + history.listen(location => { + }); + } + }, + effects: { + * createKb({ payload = {}, callback }, { call, put }) { + const { data, response } = yield call(kbService.createKb, payload); + const { retcode, data: res, retmsg } = data + if (retcode === 0) { + + + } + }, + * updateKb({ payload = {}, callback }, { call, put }) { + const { data, response } = yield call(kbService.updateKb, payload); + const { retcode, data: res, retmsg } = data + if (retcode === 0) { + + + } + }, + *getUserInfo({ payload = {} }, { call, put }) { + const { data, response } = yield call(userService.user_info, payload); + const { retcode, data: res, retmsg } = data + const userInfo = { + avatar: res.avatar, + name: res.nickname, + email: res.email + }; + localStorage.setItem('userInfo', JSON.stringify(userInfo)) + if (retcode === 0) { + // localStorage.setItem('userInfo',res.) + } + }, + *getTenantInfo({ payload = {} }, { call, put }) { + yield put({ + type: 'updateState', + payload: { + loading: true + } + }); + const { data, response } = yield call(userService.get_tenant_info, payload); + const { retcode, data: res, retmsg } = data + yield put({ + type: 'updateState', + payload: { + loading: false + } + }); + if (retcode === 0) { + yield put({ + type: 'updateState', + payload: { + tenantIfo: res + } + }); + } + } + }, + reducers: { + updateState(state, { payload }) { + return { + ...state, + ...payload + }; + } + } +}; +export default Model; diff --git a/client/src/pages/add-knowledge/index.tsx b/client/src/pages/add-knowledge/index.tsx index 09df86e2b..8909f9c97 100644 --- a/client/src/pages/add-knowledge/index.tsx +++ b/client/src/pages/add-knowledge/index.tsx @@ -1,3 +1,4 @@ +import { connect, useNavigate, useLocation } from 'umi' import React, { useMemo, useState, useEffect } from 'react'; import type { MenuProps } from 'antd'; import { Radio, Space, Tabs, Menu } from 'antd'; @@ -13,11 +14,12 @@ import styles from './index.less' import { getWidth } from '@/utils' -const App: React.FC = () => { - const [activeKey, setActiveKey] = useState('file') +const Index: React.FC = ({ kAModel, dispatch }) => { const [collapsed, setCollapsed] = useState(false); + const { id, activeKey } = kAModel const [windowWidth, setWindowWidth] = useState(getWidth()); - + let navigate = useNavigate(); + const location = useLocation(); // 标记一下 useEffect(() => { const widthSize = () => { @@ -31,6 +33,21 @@ const App: React.FC = () => { window.removeEventListener("resize", widthSize); }; }, []); + useEffect(() => { + console.log(location) + const search = location.search.slice(1) + const map = search.split('&').reduce((obj, cur) => { + const [key, value] = cur.split('=') + obj[key] = value + return obj + }, {}) + dispatch({ + type: 'kAModel/updateState', + payload: { + ...map + } + }); + }, [location]) useEffect(() => { if (windowWidth.width > 957) { setCollapsed(false) @@ -61,7 +78,7 @@ const App: React.FC = () => { getItem('搜索测试', 'search', ), ]; const handleSelect: MenuProps['onSelect'] = (e) => { - setActiveKey(e.key) + navigate(`/knowledge/add/setting?activeKey=${e.key}&id=${id}`); } return ( <> @@ -77,13 +94,13 @@ const App: React.FC = () => { />
- {activeKey === 'file' && } - {activeKey === 'setting' && } - {activeKey === 'search' && } + {activeKey === 'file' && } + {activeKey === 'setting' && } + {activeKey === 'search' && }
); }; -export default App; \ No newline at end of file +export default connect(({ kAModel, loading }) => ({ kAModel, loading }))(Index); \ No newline at end of file diff --git a/client/src/pages/add-knowledge/model.ts b/client/src/pages/add-knowledge/model.ts new file mode 100644 index 000000000..7f50e4054 --- /dev/null +++ b/client/src/pages/add-knowledge/model.ts @@ -0,0 +1,79 @@ +import { message } from 'antd'; +import { addParam } from '@/utils'; +import kbService from '@/services/kbService'; + +const Model = { + namespace: 'kAModel', + state: { + isShowPSwModal: false, + isShowTntModal: false, + loading: false, + tenantIfo: {}, + activeKey: 'setting', + id: '' + + }, + subscriptions: { + setup({ dispatch, history }) { + history.listen(location => { + }); + } + }, + effects: { + * createKb({ payload = {}, callback }, { call, put }) { + const { data, response } = yield call(kbService.createKb, payload); + const { retcode, data: res, retmsg } = data + if (retcode === 0) { + + + } + }, + + *getUserInfo({ payload = {} }, { call, put }) { + const { data, response } = yield call(userService.user_info, payload); + const { retcode, data: res, retmsg } = data + const userInfo = { + avatar: res.avatar, + name: res.nickname, + email: res.email + }; + localStorage.setItem('userInfo', JSON.stringify(userInfo)) + if (retcode === 0) { + // localStorage.setItem('userInfo',res.) + } + }, + *getTenantInfo({ payload = {} }, { call, put }) { + yield put({ + type: 'updateState', + payload: { + loading: true + } + }); + const { data, response } = yield call(userService.get_tenant_info, payload); + const { retcode, data: res, retmsg } = data + yield put({ + type: 'updateState', + payload: { + loading: false + } + }); + if (retcode === 0) { + yield put({ + type: 'updateState', + payload: { + tenantIfo: res + } + }); + } + } + }, + reducers: { + updateState(state, { payload }) { + return { + ...state, + ...payload + }; + } + } +}; +export default Model; diff --git a/client/src/pages/knowledge/index.less b/client/src/pages/knowledge/index.less index f0089fbed..77760213f 100644 --- a/client/src/pages/knowledge/index.less +++ b/client/src/pages/knowledge/index.less @@ -36,6 +36,6 @@ margin-bottom: 10px; } - + cursor: pointer; } \ No newline at end of file diff --git a/client/src/pages/knowledge/index.tsx b/client/src/pages/knowledge/index.tsx index c68236e87..8f4677da3 100644 --- a/client/src/pages/knowledge/index.tsx +++ b/client/src/pages/knowledge/index.tsx @@ -1,49 +1,49 @@ -import React, { useState, } from 'react'; -import { useNavigate } from 'umi' +import React, { useEffect, useState, } from 'react'; +import { useNavigate, connect } from 'umi' import { Card, List, Popconfirm, message, FloatButton, Row, Col } from 'antd'; import { MinusSquareOutlined, DeleteOutlined, PlusOutlined } from '@ant-design/icons'; import styles from './index.less' +import { formatDate } from '@/utils/date' -const data = [ - { - title: 'Title 1', - text: '1', - des: '111' - }, - { - title: 'Title 2', - text: '2', - des: '111' - }, - { - title: 'Title 3', - text: '3', - des: '111' - }, - { - title: 'Title 4', - text: '4', - des: '111' - }, -]; const dd = [{ title: 'Title 4', text: '4', des: '111' }] -const App: React.FC = () => { +const Index: React.FC = ({ knowledgeModel, dispatch }) => { const navigate = useNavigate() - const [datas, setDatas] = useState(data) - const confirm = (index: number) => { - console.log(index); - setDatas(datas => datas.filter((item, i) => i !== index)) - message.success('Click on Yes'); + // const [datas, setDatas] = useState(data) + const { data } = knowledgeModel + const confirm = (id) => { + dispatch({ + type: 'knowledgeModel/rmKb', + payload: { + kb_id: id + }, + callback: () => { + dispatch({ + type: 'knowledgeModel/getList', + payload: { + + } + }); + } + }); }; const handleAddKnowledge = () => { - // setDatas((datas) => [...datas, ...dd]) - navigate('add/file'); + navigate(`add/setting?activeKey=setting`); } + const handleEditKnowledge = (id: string) => { + navigate(`add/setting?activeKey=file&id=${id}`); + } + useEffect(() => { + dispatch({ + type: 'knowledgeModel/getList', + payload: { + } + }); + }, []) return (<>
} type="primary" style={{ right: 24, top: 100 }} /> @@ -51,17 +51,19 @@ const App: React.FC = () => { { data.map((item, index) => { return ( - + { handleEditKnowledge(item.id) }} + >
- content + {item.name} { confirm(index) }} + onConfirm={() => { confirm(item.id) }} okText="Yes" cancelText="No" > @@ -72,10 +74,16 @@ const App: React.FC = () => {
- {item.text} + {item.doc_num}文档 - {item.des} + {item.chunk_num}个 + + + {item.token_num}千字符 + + + {formatDate(item.update_date)}
@@ -90,4 +98,4 @@ const App: React.FC = () => { ) }; -export default App; \ No newline at end of file +export default connect(({ knowledgeModel, loading }) => ({ knowledgeModel, loading }))(Index); \ No newline at end of file diff --git a/client/src/pages/knowledge/model.ts b/client/src/pages/knowledge/model.ts new file mode 100644 index 000000000..59ed83fc2 --- /dev/null +++ b/client/src/pages/knowledge/model.ts @@ -0,0 +1,84 @@ +import { message } from 'antd'; +import { addParam } from '@/utils'; +import kbService from '@/services/kbService'; + +const Model = { + namespace: 'knowledgeModel', + state: { + isShowPSwModal: false, + isShowTntModal: false, + loading: false, + data: [] + }, + subscriptions: { + setup({ dispatch, history }) { + history.listen(location => { + console.log(location) + }); + } + }, + effects: { + * rmKb({ payload = {}, callback }, { call, put }) { + const { data, response } = yield call(kbService.rmKb, payload); + const { retcode, data: res, retmsg } = data + if (retcode === 0) { + callback && callback() + + } + }, + *setting({ payload = {}, callback }, { call, put }) { + const { data, response } = yield call(kbService.setting, payload); + const { retcode, data: res, retmsg } = data + if (retcode === 0) { + message.success('密码修改成功!'); + callback && callback() + } + }, + *getUserInfo({ payload = {} }, { call, put }) { + const { data, response } = yield call(kbService.user_info, payload); + const { retcode, data: res, retmsg } = data + const userInfo = { + avatar: res.avatar, + name: res.nickname, + email: res.email + }; + localStorage.setItem('userInfo', JSON.stringify(userInfo)) + if (retcode === 0) { + // localStorage.setItem('userInfo',res.) + } + }, + *getList({ payload = {} }, { call, put }) { + yield put({ + type: 'updateState', + payload: { + loading: true + } + }); + const { data, response } = yield call(kbService.getList, payload); + const { retcode, data: res, retmsg } = data + yield put({ + type: 'updateState', + payload: { + loading: false + } + }); + if (retcode === 0) { + yield put({ + type: 'updateState', + payload: { + data: res + } + }); + } + } + }, + reducers: { + updateState(state, { payload }) { + return { + ...state, + ...payload + }; + } + } +}; +export default Model; diff --git a/client/src/pages/login/index.tsx b/client/src/pages/login/index.tsx index aeecc410c..4ac557dd6 100644 --- a/client/src/pages/login/index.tsx +++ b/client/src/pages/login/index.tsx @@ -38,7 +38,10 @@ const View = ({ payload: { nickname: params.nickname, email: params.email, - password: rsaPassWord + password: rsaPassWord, + }, + callback() { + setTitle('login') } }); } diff --git a/client/src/pages/login/model.ts b/client/src/pages/login/model.ts index e6f5d8df5..37f5b6728 100644 --- a/client/src/pages/login/model.ts +++ b/client/src/pages/login/model.ts @@ -39,15 +39,13 @@ const Model = { }, 300); } }, - *register({ payload = {} }, { call, put }) { + *register({ payload = {}, callback }, { call, put }) { const { data, response } = yield call(userService.register, payload); console.log() const { retcode, data: res, retmsg } = data if (retcode === 0) { message.success('注册成功!'); - setTimeout(() => { - window.location.href = '/login'; - }, 300); + callback && callback() } } }, diff --git a/client/src/pages/setting/TntModal.tsx b/client/src/pages/setting/TntModal.tsx index 15c4c6cb0..f97fe5529 100644 --- a/client/src/pages/setting/TntModal.tsx +++ b/client/src/pages/setting/TntModal.tsx @@ -14,7 +14,7 @@ interface DataType { } const Index = ({ settingModel, dispatch }) => { - const { isShowTntModal, tenantData, loading } = settingModel + const { isShowTntModal, tenantIfo, loading } = settingModel const { t } = useTranslation() const handleCancel = () => { dispatch({ @@ -24,7 +24,7 @@ const Index = ({ settingModel, dispatch }) => { } }); }; - console.log(tenantData) + console.log(tenantIfo) const handleOk = async () => { dispatch({ type: 'settingModel/updateState', @@ -40,8 +40,11 @@ const Index = ({ settingModel, dispatch }) => { ]; return ( - - + +
+ {tenantIfo.name} +
+
); } diff --git a/client/src/pages/setting/index.less b/client/src/pages/setting/index.less index 49c16e80a..30ee6e3db 100644 --- a/client/src/pages/setting/index.less +++ b/client/src/pages/setting/index.less @@ -5,4 +5,14 @@ .avatar { display: flex; justify-content: center; +} + +.tenantIfo { + height: 50px; + background-color: #f4dfdf; + margin-bottom: 10px; + padding: 5px; + box-sizing: border-box; + display: flex; + align-items: center; } \ No newline at end of file diff --git a/client/src/pages/setting/model.ts b/client/src/pages/setting/model.ts index 7c2aefad9..41f5b465e 100644 --- a/client/src/pages/setting/model.ts +++ b/client/src/pages/setting/model.ts @@ -8,7 +8,7 @@ const Model = { isShowPSwModal: false, isShowTntModal: false, loading: false, - tenantData: [] + tenantIfo: {} }, subscriptions: { setup({ dispatch, history }) { @@ -57,7 +57,7 @@ const Model = { yield put({ type: 'updateState', payload: { - tenantData: res + tenantIfo: res } }); } diff --git a/client/src/services/kbService.ts b/client/src/services/kbService.ts new file mode 100644 index 000000000..a8c6204e6 --- /dev/null +++ b/client/src/services/kbService.ts @@ -0,0 +1,43 @@ +import api from '@/utils/api'; +import registerServer from '@/utils/registerServer'; +import request from '@/utils/request'; + +const { + create_kb, + update_kb, + rm_kb, + update_account, + account_detail, + kb_list, } = api; + +const kbService = registerServer( + { + createKb: { + url: create_kb, + method: 'post' + }, + updateKb: { + url: update_kb, + method: 'post' + }, + rmKb: { + url: rm_kb, + method: 'post' + }, + updateAccount: { + url: update_account, + method: 'post' + }, + getAccountDetail: { + url: account_detail, + method: 'post' + }, + getList: { + url: kb_list, + method: 'get' + } + }, + request +); + +export default kbService; diff --git a/client/src/utils/api.ts b/client/src/utils/api.ts index 23cd8d28c..40a72b1d9 100644 --- a/client/src/utils/api.ts +++ b/client/src/utils/api.ts @@ -23,9 +23,11 @@ export default { getUrl: `${api_host}/requestGetUrl`, getAdPermits: `${api_host}/adServer/getAdPermits`, - //子用户管理 - account_list: `${api_host}/user/getUserList`, - create_account: `${api_host}/user/createUserAccountSso`, + //知识库管理 + kb_list: `${api_host}/kb/list`, + create_kb: `${api_host}/kb/create`, + update_kb: `${api_host}/kb/update`, + rm_kb: `${api_host}/kb/rm`, update_account: `${api_host}/user/updateUserAccountSso`, account_detail: `${api_host}/user/getUserDetail`, getUserDetail: `${api_host}/user/getUserDetail`,