You can not select more than 25 topics Topics must start with a chinese character,a letter or number, can include dashes ('-') and can be up to 35 characters long.

personalData.jsx 18 kB

2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525
  1. import { getAccessToken } from '@/access';
  2. import clock from '@/assets/img/clock.png';
  3. import creatByImg from '@/assets/img/creatBy.png';
  4. import deleteIcon from '@/assets/img/delete-icon.png';
  5. import KFIcon from '@/components/KFIcon';
  6. import { addModel, deleteModel, getAssetIcon, getModelList } from '@/services/dataset/index.js';
  7. import { modalConfirm } from '@/utils/ui';
  8. import { UploadOutlined } from '@ant-design/icons';
  9. import { Button, Form, Input, Modal, Pagination, Select, Upload, message } from 'antd';
  10. import moment from 'moment';
  11. import { useEffect, useState } from 'react';
  12. import { useNavigate } from 'react-router-dom';
  13. import Styles from './index.less';
  14. const { Search } = Input;
  15. const leftdataList = [1, 2, 3];
  16. const PublicData = () => {
  17. const props = {
  18. action: '/api/mmp/dataset/upload',
  19. // headers: {
  20. // 'X-Requested-With': null
  21. // },
  22. headers: {
  23. Authorization: getAccessToken(),
  24. 'X-Requested-With': null,
  25. },
  26. onChange({ file, fileList }) {
  27. if (file.status !== 'uploading') {
  28. console.log(file, fileList);
  29. form.setFieldsValue({
  30. models_version_vos: fileList.map((item) => {
  31. const data = item.response.data[0];
  32. return {
  33. file_name: data.fileName,
  34. file_size: data.fileSize,
  35. url: data.url,
  36. };
  37. }),
  38. });
  39. }
  40. },
  41. defaultFileList: [],
  42. };
  43. const [queryFlow, setQueryFlow] = useState({
  44. page: 0,
  45. size: 20,
  46. name: null,
  47. available_range: 0,
  48. });
  49. const navgite = useNavigate();
  50. const [iconParams, setIconParams] = useState({
  51. name: null,
  52. page: 0,
  53. size: 10000,
  54. });
  55. const [activeType, setActiveType] = useState(null);
  56. const [activeTag, setActiveTag] = useState(null);
  57. const [modelTypeList, setmodelTypeList] = useState([]);
  58. const [modelDirectionList, setmodelDirectionList] = useState([]);
  59. const [isModalOpen, setIsModalOpen] = useState(false);
  60. const [datasetList, setDatasetList] = useState([]);
  61. const [total, setTotal] = useState(0);
  62. const [form] = Form.useForm();
  63. const [dialogTitle, setDialogTitle] = useState('新建模型');
  64. const [uuid, setUuid] = useState(Date.now());
  65. const getModelLists = (queryFlow) => {
  66. getModelList(queryFlow).then((ret) => {
  67. console.log(ret);
  68. if (ret.code == 200) {
  69. setDatasetList(ret.data.content);
  70. setTotal(ret.data.totalElements);
  71. }
  72. });
  73. };
  74. const showModal = () => {
  75. form.resetFields();
  76. setDialogTitle('新建模型');
  77. setUuid(Date.now());
  78. setIsModalOpen(true);
  79. };
  80. const getAssetIconList = (params) => {
  81. getAssetIcon(params).then((ret) => {
  82. console.log(ret);
  83. if (ret.code == 200 && ret.data.content && ret.data.content.length > 0) {
  84. setmodelTypeList(ret.data.content.filter((item) => item.category_id == 3));
  85. setmodelDirectionList(ret.data.content.filter((item) => item.category_id == 4));
  86. } else {
  87. setmodelTypeList([]);
  88. setmodelDirectionList([]);
  89. }
  90. });
  91. };
  92. const onSearch = (values) => {
  93. console.log(values);
  94. getAssetIconList({ ...iconParams, name: values });
  95. };
  96. const nameSearch = (values) => {
  97. console.log(values);
  98. getModelLists({ ...queryFlow, name: values });
  99. };
  100. const handleOk = () => {
  101. console.log(1111);
  102. setIsModalOpen(false);
  103. };
  104. const handleCancel = () => {
  105. setIsModalOpen(false);
  106. };
  107. const onFinish = (values) => {
  108. const params = {
  109. ...values,
  110. available_range: 0,
  111. };
  112. addModel(values).then((ret) => {
  113. console.log(ret);
  114. getModelLists(queryFlow);
  115. setIsModalOpen(false);
  116. });
  117. };
  118. const chooseModelType = (val, item) => {
  119. console.log(val, item);
  120. if (item.id == queryFlow.model_type) {
  121. setActiveType('');
  122. setQueryFlow({ ...queryFlow, model_type: null });
  123. getModelLists({ ...queryFlow, model_type: null });
  124. } else {
  125. setActiveType(item.id);
  126. setQueryFlow({ ...queryFlow, model_type: item.id });
  127. getModelLists({ ...queryFlow, model_type: item.id });
  128. }
  129. // setQueryFlow({...queryFlow,data_type:item.path},()=>{
  130. // getDatasetlist()
  131. // })
  132. };
  133. const chooseModelTag = (val, item) => {
  134. if (item.id == queryFlow.model_tag) {
  135. setActiveTag('');
  136. setQueryFlow({ ...queryFlow, model_tag: null });
  137. getModelLists({ ...queryFlow, model_tag: null });
  138. } else {
  139. setActiveTag(item.id);
  140. setQueryFlow({ ...queryFlow, model_tag: item.id });
  141. getModelLists({ ...queryFlow, model_tag: item.id });
  142. }
  143. // setQueryFlow({...queryFlow,data_type:item.path},()=>{
  144. // getDatasetlist()
  145. // })
  146. };
  147. const routeToIntro = (e, record) => {
  148. e.stopPropagation();
  149. console.log(record);
  150. navgite({ pathname: `/dataset/modelIntro/${record.id}` });
  151. };
  152. const onFinishFailed = (errorInfo) => {
  153. console.log('Failed:', errorInfo);
  154. };
  155. const onPageChange = (pageNum, pageSize) => {
  156. console.log(pageNum, pageSize);
  157. setQueryFlow({ ...queryFlow, page: pageNum - 1, size: pageSize });
  158. getModelLists({ ...queryFlow, page: pageNum - 1, size: pageSize });
  159. };
  160. useEffect(() => {
  161. getAssetIconList(iconParams);
  162. getModelLists(queryFlow);
  163. return () => {};
  164. }, []);
  165. return (
  166. <>
  167. <div className={Styles.datasetCneterBox}>
  168. <div className={Styles.datasetCneterLeftBox}>
  169. <div className={Styles.leftContentBox}>
  170. <Search
  171. placeholder="搜索"
  172. allowClear
  173. onSearch={onSearch}
  174. style={{
  175. width: 300,
  176. marginBottom: '15px',
  177. }}
  178. />
  179. <div className={Styles.itemTitle}>模型框架</div>
  180. <div className={Styles.itemBox}>
  181. {modelTypeList && modelTypeList.length > 0
  182. ? modelTypeList.map((item) => {
  183. return (
  184. <div>
  185. <div
  186. className={[
  187. Styles.messageBox,
  188. item.id === activeType ? Styles.active : null,
  189. ].join(' ')}
  190. onClick={(e) => {
  191. chooseModelType(e, item);
  192. }}
  193. >
  194. <img
  195. className={Styles.ptIcon}
  196. style={{ width: '22px' }}
  197. src={`/assets/images/model/${item.path}.png`}
  198. alt=""
  199. />
  200. <img
  201. className={Styles.hoverIcon}
  202. style={{ width: '22px' }}
  203. src={`/assets/images/model/${item.path}-hover.png`}
  204. alt=""
  205. />
  206. <span
  207. className={Styles.messageText}
  208. onClick={(e) => {
  209. chooseModelTag(e, item);
  210. }}
  211. >
  212. {item.name}
  213. </span>
  214. </div>
  215. </div>
  216. );
  217. })
  218. : ''}
  219. </div>
  220. <div className={Styles.itemTitle}>模型能力</div>
  221. <div className={Styles.itemBox}>
  222. {modelDirectionList && modelDirectionList.length > 0
  223. ? modelDirectionList.map((item) => {
  224. return (
  225. <div>
  226. <div
  227. className={[
  228. Styles.messageBox,
  229. item.id === activeTag ? Styles.active : null,
  230. ].join(' ')}
  231. onClick={(e) => {
  232. chooseModelTag(e, item);
  233. }}
  234. >
  235. <img
  236. className={Styles.ptIcon}
  237. style={{ width: '22px' }}
  238. src={`/assets/images/model/${item.path}.png`}
  239. alt=""
  240. />
  241. <img
  242. className={Styles.hoverIcon}
  243. style={{ width: '22px' }}
  244. src={`/assets/images/model/${item.path}-hover.png`}
  245. alt=""
  246. />
  247. <span className={Styles.messageText}>{item.name}</span>
  248. </div>
  249. </div>
  250. );
  251. })
  252. : ''}
  253. </div>
  254. </div>
  255. </div>
  256. <div className={Styles.datasetCneterRightBox}>
  257. <div className={Styles.dataSource}>
  258. <span>数据总数:{total}个</span>
  259. <div>
  260. <Search
  261. placeholder="按模型名称筛选"
  262. allowClear
  263. onSearch={nameSearch}
  264. style={{
  265. width: 300,
  266. }}
  267. />
  268. <Button
  269. type="default"
  270. style={{ marginLeft: '20px' }}
  271. onClick={showModal}
  272. icon={<KFIcon type="icon-xinjian2" />}
  273. >
  274. 模型注册
  275. </Button>
  276. </div>
  277. </div>
  278. <div className={Styles.dataContent}>
  279. {datasetList && datasetList.length > 0
  280. ? datasetList.map((item) => {
  281. return (
  282. <div
  283. className={Styles.dataItem}
  284. onClick={(e) => {
  285. routeToIntro(e, item);
  286. }}
  287. >
  288. <span className={Styles.itemText}>{item.name}</span>
  289. <img
  290. onClick={(e) => {
  291. e.stopPropagation();
  292. modalConfirm({
  293. title: '确定删除该条模型实例吗?',
  294. onOk: () => {
  295. deleteModel(item.id).then((ret) => {
  296. if (ret.code === 200) {
  297. message.success('删除成功');
  298. getModelLists(queryFlow);
  299. } else {
  300. message.error(ret.msg);
  301. }
  302. });
  303. },
  304. });
  305. }}
  306. className={Styles.dropdown}
  307. style={{ width: '17px', marginRight: '6px' }}
  308. src={deleteIcon}
  309. alt=""
  310. />
  311. {/* <Dropdown
  312. className={Styles.dropdown}
  313. key={item.name}
  314. menu={{
  315. items: [
  316. {
  317. label: '详情',
  318. key: 'detail',
  319. },
  320. {
  321. label: '删除',
  322. key: 'delete',
  323. },
  324. ],
  325. onClick: (e) => {
  326. console.log(e);
  327. if (e.key === 'detail') {
  328. routeToIntro(e, item);
  329. } else if (e.key === 'delete') {
  330. modalConfirm({
  331. title: '确定删除该条模型实例吗?',
  332. onOk: () => {
  333. deleteModel(item.id).then((ret) => {
  334. if (ret.code === 200) {
  335. message.success('删除成功');
  336. getModelLists(queryFlow);
  337. } else {
  338. message.error(ret.msg);
  339. }
  340. });
  341. },
  342. });
  343. }
  344. },
  345. }}
  346. >
  347. <div>
  348. <img
  349. style={{ width: '17px', marginRight: '6px' }}
  350. src={moreBack}
  351. alt=""
  352. />
  353. </div>
  354. </Dropdown> */}
  355. ,<div className={Styles.itemDescripition}>{item.description}</div>
  356. <div className={Styles.itemTime}>
  357. <img
  358. style={{ width: '17px', marginRight: '6px' }}
  359. src={creatByImg}
  360. alt=""
  361. />
  362. <span>{item.create_by}</span>
  363. </div>
  364. <div className={Styles.itemIcon}>
  365. <img style={{ width: '12px', marginRight: '5px' }} src={clock} alt="" />
  366. <span>最近更新: {moment(item.update_time).format('YYYY-MM-DD')}</span>
  367. </div>
  368. </div>
  369. );
  370. })
  371. : ''}
  372. {/* <Select.Option value="demo">Demo</Select.Option> */}
  373. </div>
  374. <Pagination
  375. total={total}
  376. showSizeChanger
  377. defaultPageSize={20}
  378. pageSizeOptions={[20, 40, 60, 80, 100]}
  379. showQuickJumper
  380. onChange={onPageChange}
  381. />
  382. </div>
  383. </div>
  384. <Modal
  385. title={
  386. <div style={{ display: 'flex', alignItems: 'center', fontWeight: 500 }}>
  387. <img
  388. style={{ width: '20px', marginRight: '10px' }}
  389. src={`/assets/images/pipeline-edit-icon.png`}
  390. alt=""
  391. />
  392. {dialogTitle}
  393. </div>
  394. }
  395. open={isModalOpen}
  396. className={Styles.modal}
  397. okButtonProps={{
  398. htmlType: 'submit',
  399. form: 'form',
  400. }}
  401. onCancel={handleCancel}
  402. >
  403. <Form
  404. name="form"
  405. form={form}
  406. layout="vertical"
  407. initialValues={{
  408. remember: true,
  409. }}
  410. onFinish={onFinish}
  411. onFinishFailed={onFinishFailed}
  412. autoComplete="off"
  413. >
  414. <Form.Item
  415. label="模型名称"
  416. name="name"
  417. rules={[
  418. {
  419. required: true,
  420. message: '请输入模型名称!',
  421. },
  422. ]}
  423. >
  424. <Input placeholder="请输入模型名称" showCount maxLength={64} />
  425. </Form.Item>
  426. <Form.Item
  427. label="模型版本"
  428. name="version"
  429. rules={
  430. [
  431. // {
  432. // required: true,
  433. // message: 'Please input your username!',
  434. // },
  435. ]
  436. }
  437. >
  438. <Input placeholder="请输入模型版本" />
  439. </Form.Item>
  440. <Form.Item
  441. label="模型描述"
  442. name="description"
  443. rules={[
  444. {
  445. required: true,
  446. message: '请输入模型描述!',
  447. },
  448. ]}
  449. >
  450. <Input placeholder="请输入模型描述" showCount maxLength={256} />
  451. </Form.Item>
  452. {/* <Form.Item label="可见范围" name="available_range">
  453. <Radio.Group>
  454. <Radio value="0">仅自己可见</Radio>
  455. <Radio value="1">工作空间可见</Radio>
  456. </Radio.Group>
  457. </Form.Item> */}
  458. <Form.Item
  459. label="模型框架"
  460. name="model_type"
  461. rules={
  462. [
  463. // {
  464. // required: true,
  465. // message: 'Please input your username!',
  466. // },
  467. ]
  468. }
  469. >
  470. <Select
  471. allowClear
  472. placeholder="请选择模型类型"
  473. options={modelTypeList.map((item) => {
  474. return { value: item.id, label: item.name };
  475. })}
  476. />
  477. </Form.Item>
  478. <Form.Item
  479. label="模型能力"
  480. name="model_tag"
  481. rules={
  482. [
  483. // {
  484. // required: true,
  485. // message: 'Please input your username!',
  486. // },
  487. ]
  488. }
  489. >
  490. <Select
  491. allowClear
  492. placeholder="请选择模型标签"
  493. options={modelDirectionList.map((item) => {
  494. return { value: item.id, label: item.name };
  495. })}
  496. />
  497. </Form.Item>
  498. <Form.Item label="模型文件" name="models_version_vos">
  499. <Upload {...props} data={{ uuid: uuid }}>
  500. <Button
  501. style={{
  502. fontSize: '14px',
  503. border: '1px solid',
  504. borderColor: '#1664ff',
  505. background: '#fff',
  506. }}
  507. icon={<UploadOutlined style={{ color: '#1664ff', fontSize: '14px' }} />}
  508. >
  509. 上传文件
  510. </Button>
  511. </Upload>
  512. </Form.Item>
  513. </Form>
  514. </Modal>
  515. </>
  516. );
  517. };
  518. export default PublicData;