更新数据库接口
This commit is contained in:
parent
55b18fac12
commit
cf4a0417b7
14 changed files with 459 additions and 82 deletions
|
|
@ -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);
|
||||||
|
|
@ -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;
|
||||||
|
|
@ -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);
|
||||||
79
client/src/pages/add-knowledge/model.ts
Normal file
79
client/src/pages/add-knowledge/model.ts
Normal 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;
|
||||||
|
|
@ -36,6 +36,6 @@
|
||||||
margin-bottom: 10px;
|
margin-bottom: 10px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
cursor: pointer;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
@ -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);
|
||||||
84
client/src/pages/knowledge/model.ts
Normal file
84
client/src/pages/knowledge/model.ts
Normal 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;
|
||||||
|
|
@ -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')
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
|
||||||
|
|
@ -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 >
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
@ -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
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
|
||||||
43
client/src/services/kbService.ts
Normal file
43
client/src/services/kbService.ts
Normal 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;
|
||||||
|
|
@ -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`,
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue