index.tsx 9.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239
  1. import * as React from 'react';
  2. import { observer } from 'mobx-react';
  3. import { useParams } from 'react-router-dom';
  4. import { List, Button, Divider, Empty, Modal, Form, Input, message } from 'antd';
  5. import { SettingOutlined, DeleteOutlined, ArrowLeftOutlined, PlusOutlined } from '@ant-design/icons';
  6. import { apis } from '@/apis';
  7. import { PaginationConfig } from 'antd/es/pagination';
  8. import router from '@/router';
  9. import './style.less';
  10. const FormItem = Form.Item;
  11. const SliceList: React.FC = () => {
  12. const [form] = Form.useForm();
  13. const params = useParams();
  14. interface Item {
  15. slice_id: string,
  16. document_id: string,
  17. slice_text: string,
  18. slice_char_len: number,
  19. };
  20. interface PageInfo {
  21. pageNum: number,
  22. pageSize: number,
  23. total: number,
  24. };
  25. const [listLoading, setListLoading] = React.useState(false);
  26. const [list, setList] = React.useState<Item[]>([]);
  27. const [page, setPage] = React.useState<PageInfo>({
  28. pageNum: 1,
  29. pageSize: 10,
  30. total: 0,
  31. });
  32. const appApi = {
  33. fetchList: async (p0: { searchText: string; }) => {
  34. setListLoading(true);
  35. try {
  36. const res = await apis.fetchTakaiSliceList({
  37. knowledge_id: params.knowledgeId || '',
  38. document_id: params.documentId || '',
  39. text: p0.searchText,
  40. pageSize: page.pageSize,
  41. pageNum: page.pageNum
  42. })
  43. console.log('fetchTakaiSliceList', res);
  44. const list = res.rows.map((item: any) => {
  45. return {
  46. slice_id: item.sliceId,
  47. document_id: item.documentId,
  48. slice_text: item.sliceText,
  49. slice_char_len: item.sliceText.length,
  50. }
  51. });
  52. setList(list);
  53. setPage({
  54. pageNum: page.pageNum,
  55. pageSize: page.pageSize,
  56. total: res.total,
  57. });
  58. } catch (error) {
  59. console.error(error);
  60. } finally {
  61. setListLoading(false);
  62. }
  63. },
  64. };
  65. const handleClickSearch = () => {
  66. const values = form.getFieldsValue();
  67. appApi.fetchList({ searchText: values.text });
  68. }
  69. const handleClickReset = () => {
  70. form.resetFields();
  71. appApi.fetchList({ searchText: '' });
  72. }
  73. const deleteSlice = async (slice_id: string, knowledgeId: string) => {
  74. try {
  75. if (!params.knowledgeId || !params.documentId) {
  76. throw new Error('knowledgeId或documentId未定义,请检查路由参数');
  77. }
  78. const res = await apis.deleteTakaiSlice(slice_id, params.knowledgeId, params.documentId);
  79. if (res.code === 200 && res.data === 1) {
  80. appApi.fetchList({ searchText: '' });
  81. message.success('删除切片成功');
  82. }
  83. } catch (error) {
  84. console.error('删除切片失败:', error);
  85. }
  86. }
  87. const init = async () => {
  88. console.log('params', params.knowledgeId);
  89. await appApi.fetchList({ searchText: '' });
  90. }
  91. React.useEffect(() => {
  92. init();
  93. }, [page.pageSize, page.pageNum])
  94. const paginationConfig: PaginationConfig = {
  95. // 显示数据总量
  96. showTotal: (total: number) => {
  97. return `共 ${total} 条`;
  98. },
  99. // 展示分页条数切换
  100. showSizeChanger: true,
  101. // 指定每页显示条数
  102. // pageSizeOptions: ['2', '20', '50', '100'],
  103. // 快速跳转至某页
  104. showQuickJumper: true,
  105. current: page.pageNum,
  106. pageSize: page.pageSize,
  107. total: page.total,
  108. onChange: (pageNum, pageSize) => {
  109. setPage({
  110. pageNum: pageNum,
  111. pageSize: pageSize,
  112. total: page.total,
  113. });
  114. },
  115. };
  116. return (
  117. <div>
  118. <div className='dataExport-search'>
  119. <div style={{ display: 'flex', justifyContent: 'space-between' }}>
  120. <Form form={form} layout='inline' colon={false}>
  121. <FormItem label='切片' name='text'>
  122. <Input />
  123. </FormItem>
  124. <FormItem>
  125. <Button
  126. style={{ marginRight: 16 }}
  127. type='primary'
  128. onClick={handleClickSearch}
  129. >
  130. 查询
  131. </Button>
  132. <Button onClick={handleClickReset}>
  133. 重置
  134. </Button>
  135. </FormItem>
  136. </Form>
  137. <div >
  138. <Button style={{ marginRight: 16 }} type='primary' icon={<PlusOutlined />} onClick={() => {
  139. router.navigate({
  140. pathname: '/deepseek/knowledgeLib/slice/detail/' + null + '/' + params.knowledgeId + '/' + params.documentId + '/'
  141. + params.embeddingId
  142. });
  143. }}>新增切片</Button>
  144. <Button type='primary' icon={<ArrowLeftOutlined />} onClick={() => {
  145. router.navigate(-1);
  146. }}>返回</Button>
  147. </div>
  148. </div>
  149. </div>
  150. {
  151. list.length
  152. ?
  153. <div className='questionAnswerList'>
  154. <div className='applicationList'>
  155. <List style={{ height: 400 }}
  156. grid={{
  157. gutter: 16,
  158. xs: 1,
  159. sm: 2,
  160. md: 4,
  161. lg: 4,
  162. xl: 6,
  163. xxl: 2, // 展示的列数
  164. }}
  165. dataSource={list}
  166. renderItem={(item) => (
  167. <List.Item>
  168. <div className='card'>
  169. <div style={{ height: 80, overflow: 'auto' }}>
  170. {
  171. item.slice_text
  172. }
  173. </div>
  174. <Divider plain></Divider>
  175. <div style={{ display: 'flex', justifyContent: 'space-between', overflow: 'auto' }}>
  176. <div style={{ overflow: 'auto' }}>
  177. <a style={{ marginRight: 20 }} onClick={() => {
  178. router.navigate({
  179. pathname: '/deepseek/knowledgeLib/slice/detail/' + item.slice_id + '/' + params.knowledgeId + '/' + params.documentId + '/'
  180. + params.embeddingId
  181. });
  182. }}>
  183. <SettingOutlined /> 编辑
  184. </a>
  185. <a className='text-error' onClick={() => {
  186. Modal.confirm({
  187. title: '删除',
  188. content: `确定删除切片: ` + item.slice_id + ` 吗?`,
  189. okType: 'danger',
  190. onOk: async () => {
  191. const knowledgeId = params.knowledgeId || ''; // 提供默认值
  192. await deleteSlice(item.slice_id, knowledgeId);
  193. }
  194. });
  195. }}>
  196. <DeleteOutlined /> 删除
  197. </a>
  198. </div>
  199. <div>
  200. {
  201. item.slice_char_len
  202. }
  203. </div>
  204. </div>
  205. </div>
  206. </List.Item>
  207. )}
  208. pagination={paginationConfig} // 分页
  209. />
  210. </div>
  211. </div>
  212. :
  213. <Empty image={Empty.PRESENTED_IMAGE_SIMPLE} />
  214. }
  215. </div >
  216. )
  217. };
  218. export default observer(SliceList);