更新数据库接口

This commit is contained in:
zhaofengchao 2024-01-12 18:54:38 +08:00
parent 55b18fac12
commit cf4a0417b7
14 changed files with 459 additions and 82 deletions

View file

@ -1,8 +1,8 @@
import React, { useEffect, useState } from 'react'; 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 { 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' import styles from './index.less'
const { CheckableTag } = Tag;
const layout = { const layout = {
labelCol: { span: 8 }, labelCol: { span: 8 },
wrapperCol: { span: 16 }, wrapperCol: { span: 16 },
@ -22,9 +22,7 @@ const validateMessages = {
}; };
/* eslint-enable no-template-curly-in-string */ /* eslint-enable no-template-curly-in-string */
const onFinish = (values: any) => {
console.log(values);
};
interface DataType { interface DataType {
gender: string; gender: string;
name: { name: {
@ -42,46 +40,95 @@ interface DataType {
} }
const tags = [{ title: '研报' }, { title: '法律' }, { title: '简历' }, { title: '说明书' }, { title: '书籍' }, { title: '演讲稿' }] 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 <Form return <Form
{...layout} {...layout}
name="nest-messages" name="nest-messages"
onFinish={onFinish} onFinish={onFinish}
style={{ maxWidth: 1000, padding: 14 }} style={{ maxWidth: 1000, padding: 14 }}
validateMessages={validateMessages}
> >
<Form.Item name={['user', 'name']} label="知识库名称" rules={[{ required: true }]}> <Form.Item name='name' label="知识库名称" rules={[{ required: true }]}>
<Input /> <Input />
</Form.Item> </Form.Item>
<Form.Item name={['user', 'introduction']} label="知识库描述"> <Form.Item name='description' label="知识库描述">
<Input.TextArea /> <Input.TextArea />
</Form.Item> </Form.Item>
<Form.Item name="radio-group" label="可见权限"> <Form.Item name="permission" label="可见权限">
<Radio.Group> <Radio.Group>
<Radio value="a"></Radio> <Radio value="me"></Radio>
<Radio value="b"></Radio> <Radio value="team"></Radio>
</Radio.Group> </Radio.Group>
</Form.Item> </Form.Item>
<Form.Item <Form.Item
name="select" name="embd_id"
label="Embedding 模型" label="Embedding 模型"
hasFeedback hasFeedback
rules={[{ required: true, message: 'Please select your country!' }]} rules={[{ required: true, message: 'Please select your country!' }]}
> >
<Select placeholder="Please select a country"> <Select placeholder="Please select a country">
<Option value="china">China</Option> {embd_id.split(',').map(item => {
<Option value="usa">U.S.A</Option> return <Option value={item} key={item}>{item}</Option>
})}
</Select> </Select>
<div style={{ marginTop: '5px' }}>
Embedding <span style={{ color: '#1677ff' }}></span>
</div>
</Form.Item> </Form.Item>
<div style={{ marginTop: '5px' }}>
Embedding <span style={{ color: '#1677ff' }}></span>
</div>
<Space size={[0, 8]} wrap> <Space size={[0, 8]} wrap>
<div className={styles.tags}> <div className={styles.tags}>
{ {
tags.map(item => { parser_ids.split(',').map(tag => {
return (<Tag key={item.title}>{item.title}</Tag>) return (<CheckableTag
key={tag}
checked={selectedTag === tag}
onChange={(checked) => handleChange(tag, checked)}
>
{tag}
</CheckableTag>)
}) })
} }
</div> </div>
@ -110,4 +157,4 @@ const App: React.FC = () => {
export default App; export default connect(({ settingModel, kSModel, kAModel, loading }) => ({ settingModel, kSModel, loading }))(Index);

View file

@ -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;

View file

@ -1,3 +1,4 @@
import { connect, useNavigate, useLocation } from 'umi'
import React, { useMemo, useState, useEffect } from 'react'; import React, { useMemo, useState, useEffect } from 'react';
import type { MenuProps } from 'antd'; import type { MenuProps } from 'antd';
import { Radio, Space, Tabs, Menu } from 'antd'; import { Radio, Space, Tabs, Menu } from 'antd';
@ -13,11 +14,12 @@ import styles from './index.less'
import { getWidth } from '@/utils' import { getWidth } from '@/utils'
const App: React.FC = () => { const Index: React.FC = ({ kAModel, dispatch }) => {
const [activeKey, setActiveKey] = useState<string>('file')
const [collapsed, setCollapsed] = useState(false); const [collapsed, setCollapsed] = useState(false);
const { id, activeKey } = kAModel
const [windowWidth, setWindowWidth] = useState(getWidth()); const [windowWidth, setWindowWidth] = useState(getWidth());
let navigate = useNavigate();
const location = useLocation();
// 标记一下 // 标记一下
useEffect(() => { useEffect(() => {
const widthSize = () => { const widthSize = () => {
@ -31,6 +33,21 @@ const App: React.FC = () => {
window.removeEventListener("resize", widthSize); 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(() => { useEffect(() => {
if (windowWidth.width > 957) { if (windowWidth.width > 957) {
setCollapsed(false) setCollapsed(false)
@ -61,7 +78,7 @@ const App: React.FC = () => {
getItem('搜索测试', 'search', <SearchOutlined />), getItem('搜索测试', 'search', <SearchOutlined />),
]; ];
const handleSelect: MenuProps['onSelect'] = (e) => { const handleSelect: MenuProps['onSelect'] = (e) => {
setActiveKey(e.key) navigate(`/knowledge/add/setting?activeKey=${e.key}&id=${id}`);
} }
return ( return (
<> <>
@ -77,13 +94,13 @@ const App: React.FC = () => {
/> />
</div> </div>
<div className={styles.content}> <div className={styles.content}>
{activeKey === 'file' && <File />} {activeKey === 'file' && <File id={id} />}
{activeKey === 'setting' && <Setting />} {activeKey === 'setting' && <Setting id={id} />}
{activeKey === 'search' && <Search />} {activeKey === 'search' && <Search id={id} />}
</div> </div>
</div> </div>
</> </>
); );
}; };
export default App; export default connect(({ kAModel, loading }) => ({ kAModel, loading }))(Index);

View file

@ -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;

View file

@ -36,6 +36,6 @@
margin-bottom: 10px; margin-bottom: 10px;
} }
cursor: pointer;
} }

View file

@ -1,49 +1,49 @@
import React, { useState, } from 'react'; import React, { useEffect, useState, } from 'react';
import { useNavigate } from 'umi' import { useNavigate, connect } from 'umi'
import { Card, List, Popconfirm, message, FloatButton, Row, Col } from 'antd'; import { Card, List, Popconfirm, message, FloatButton, Row, Col } from 'antd';
import { MinusSquareOutlined, DeleteOutlined, PlusOutlined } from '@ant-design/icons'; import { MinusSquareOutlined, DeleteOutlined, PlusOutlined } from '@ant-design/icons';
import styles from './index.less' 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 = [{ const dd = [{
title: 'Title 4', title: 'Title 4',
text: '4', text: '4',
des: '111' des: '111'
}] }]
const App: React.FC = () => { const Index: React.FC = ({ knowledgeModel, dispatch }) => {
const navigate = useNavigate() const navigate = useNavigate()
const [datas, setDatas] = useState(data) // const [datas, setDatas] = useState(data)
const confirm = (index: number) => { const { data } = knowledgeModel
console.log(index); const confirm = (id) => {
setDatas(datas => datas.filter((item, i) => i !== index)) dispatch({
message.success('Click on Yes'); type: 'knowledgeModel/rmKb',
payload: {
kb_id: id
},
callback: () => {
dispatch({
type: 'knowledgeModel/getList',
payload: {
}
});
}
});
}; };
const handleAddKnowledge = () => { const handleAddKnowledge = () => {
// setDatas((datas) => [...datas, ...dd]) navigate(`add/setting?activeKey=setting`);
navigate('add/file');
} }
const handleEditKnowledge = (id: string) => {
navigate(`add/setting?activeKey=file&id=${id}`);
}
useEffect(() => {
dispatch({
type: 'knowledgeModel/getList',
payload: {
}
});
}, [])
return (<> return (<>
<div className={styles.knowledge}> <div className={styles.knowledge}>
<FloatButton onClick={handleAddKnowledge} icon={<PlusOutlined />} type="primary" style={{ right: 24, top: 100 }} /> <FloatButton onClick={handleAddKnowledge} icon={<PlusOutlined />} type="primary" style={{ right: 24, top: 100 }} />
@ -51,17 +51,19 @@ const App: React.FC = () => {
{ {
data.map((item, index) => { data.map((item, index) => {
return (<Col className="gutter-row" key={item.title} xs={24} sm={12} md={8} lg={6}> return (<Col className="gutter-row" key={item.title} xs={24} sm={12} md={8} lg={6}>
<Card className={styles.card}> <Card className={styles.card}
onClick={() => { handleEditKnowledge(item.id) }}
>
<div className={styles.container}> <div className={styles.container}>
<div className={styles.content}> <div className={styles.content}>
<span className={styles.context}> <span className={styles.context}>
content {item.name}
</span> </span>
<span className={styles.delete}> <span className={styles.delete}>
<Popconfirm <Popconfirm
title="Delete the task" title="Delete the task"
description="Are you sure to delete this task?" description="Are you sure to delete this task?"
onConfirm={() => { confirm(index) }} onConfirm={() => { confirm(item.id) }}
okText="Yes" okText="Yes"
cancelText="No" cancelText="No"
> >
@ -72,10 +74,16 @@ const App: React.FC = () => {
</div> </div>
<div className={styles.footer}> <div className={styles.footer}>
<span className={styles.text}> <span className={styles.text}>
<MinusSquareOutlined />{item.text} <MinusSquareOutlined />{item.doc_num}
</span> </span>
<span className={styles.text}> <span className={styles.text}>
<MinusSquareOutlined />{item.des} <MinusSquareOutlined />{item.chunk_num}
</span>
<span className={styles.text}>
<MinusSquareOutlined />{item.token_num}
</span>
<span style={{ float: 'right' }}>
{formatDate(item.update_date)}
</span> </span>
</div> </div>
@ -90,4 +98,4 @@ const App: React.FC = () => {
) )
}; };
export default App; export default connect(({ knowledgeModel, loading }) => ({ knowledgeModel, loading }))(Index);

View file

@ -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;

View file

@ -38,7 +38,10 @@ const View = ({
payload: { payload: {
nickname: params.nickname, nickname: params.nickname,
email: params.email, email: params.email,
password: rsaPassWord password: rsaPassWord,
},
callback() {
setTitle('login')
} }
}); });
} }

View file

@ -39,15 +39,13 @@ const Model = {
}, 300); }, 300);
} }
}, },
*register({ payload = {} }, { call, put }) { *register({ payload = {}, callback }, { call, put }) {
const { data, response } = yield call(userService.register, payload); const { data, response } = yield call(userService.register, payload);
console.log() console.log()
const { retcode, data: res, retmsg } = data const { retcode, data: res, retmsg } = data
if (retcode === 0) { if (retcode === 0) {
message.success('注册成功!'); message.success('注册成功!');
setTimeout(() => { callback && callback()
window.location.href = '/login';
}, 300);
} }
} }
}, },

View file

@ -14,7 +14,7 @@ interface DataType {
} }
const Index = ({ settingModel, dispatch }) => { const Index = ({ settingModel, dispatch }) => {
const { isShowTntModal, tenantData, loading } = settingModel const { isShowTntModal, tenantIfo, loading } = settingModel
const { t } = useTranslation() const { t } = useTranslation()
const handleCancel = () => { const handleCancel = () => {
dispatch({ dispatch({
@ -24,7 +24,7 @@ const Index = ({ settingModel, dispatch }) => {
} }
}); });
}; };
console.log(tenantData) console.log(tenantIfo)
const handleOk = async () => { const handleOk = async () => {
dispatch({ dispatch({
type: 'settingModel/updateState', type: 'settingModel/updateState',
@ -40,8 +40,11 @@ const Index = ({ settingModel, dispatch }) => {
]; ];
return ( return (
<Modal title="Basic Modal" open={isShowTntModal} onOk={handleOk} onCancel={handleCancel}> <Modal title="用户" open={isShowTntModal} onOk={handleOk} onCancel={handleCancel}>
<Table rowKey='name' loading={loading} columns={columns} dataSource={tenantData} /> <div className={styles.tenantIfo}>
{tenantIfo.name}
</div>
<Table rowKey='name' loading={loading} columns={columns} dataSource={[]} />
</Modal > </Modal >
); );
} }

View file

@ -5,4 +5,14 @@
.avatar { .avatar {
display: flex; display: flex;
justify-content: center; justify-content: center;
}
.tenantIfo {
height: 50px;
background-color: #f4dfdf;
margin-bottom: 10px;
padding: 5px;
box-sizing: border-box;
display: flex;
align-items: center;
} }

View file

@ -8,7 +8,7 @@ const Model = {
isShowPSwModal: false, isShowPSwModal: false,
isShowTntModal: false, isShowTntModal: false,
loading: false, loading: false,
tenantData: [] tenantIfo: {}
}, },
subscriptions: { subscriptions: {
setup({ dispatch, history }) { setup({ dispatch, history }) {
@ -57,7 +57,7 @@ const Model = {
yield put({ yield put({
type: 'updateState', type: 'updateState',
payload: { payload: {
tenantData: res tenantIfo: res
} }
}); });
} }

View file

@ -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;

View file

@ -23,9 +23,11 @@ export default {
getUrl: `${api_host}/requestGetUrl`, getUrl: `${api_host}/requestGetUrl`,
getAdPermits: `${api_host}/adServer/getAdPermits`, getAdPermits: `${api_host}/adServer/getAdPermits`,
//子用户管理 //知识库管理
account_list: `${api_host}/user/getUserList`, kb_list: `${api_host}/kb/list`,
create_account: `${api_host}/user/createUserAccountSso`, create_kb: `${api_host}/kb/create`,
update_kb: `${api_host}/kb/update`,
rm_kb: `${api_host}/kb/rm`,
update_account: `${api_host}/user/updateUserAccountSso`, update_account: `${api_host}/user/updateUserAccountSso`,
account_detail: `${api_host}/user/getUserDetail`, account_detail: `${api_host}/user/getUserDetail`,
getUserDetail: `${api_host}/user/getUserDetail`, getUserDetail: `${api_host}/user/getUserDetail`,