bot commited on
Commit
df44ba9
·
1 Parent(s): aa547c1

新增离线功能

Browse files
Files changed (2) hide show
  1. main.py +7 -0
  2. templates/index.html +168 -5
main.py CHANGED
@@ -169,6 +169,13 @@ async def get_file_info(file_id: str):
169
  return await THUNDERX_CLIENT.get_download_url(file_id)
170
 
171
 
 
 
 
 
 
 
 
172
  @api_router.post(
173
  "/emptytrash", summary="清空回收站", description="清空回收站【慎用】", tags=["文件"]
174
  )
 
169
  return await THUNDERX_CLIENT.get_download_url(file_id)
170
 
171
 
172
+ @api_router.delete(
173
+ "/files/{file_id}", summary="删除文件", description="删除文件", tags=["文件"]
174
+ )
175
+ async def delete_file_info(file_id: str):
176
+ return await THUNDERX_CLIENT.delete_forever([file_id])
177
+
178
+
179
  @api_router.post(
180
  "/emptytrash", summary="清空回收站", description="清空回收站【慎用】", tags=["文件"]
181
  )
templates/index.html CHANGED
@@ -845,6 +845,7 @@
845
  </Navbar.Brand>
846
  </div>
847
  <div className="d-flex">
 
848
  <Tasks />
849
  <LocalTasks />
850
  <Button
@@ -1031,6 +1032,15 @@
1031
  />)
1032
  }
1033
 
 
 
 
 
 
 
 
 
 
1034
 
1035
  <Icon
1036
  icon="share-variant"
@@ -1069,7 +1079,7 @@
1069
  mutationKey: ["create_share"],
1070
  mutationFn: async (fileinfo) => {
1071
  showLoading();
1072
- var url = 'file_batch_share?need_password=false&expiration_days=-1';
1073
  return await axios.post(url, [fileinfo.id], {
1074
  headers: {
1075
  'Authorization': authorization,
@@ -1084,6 +1094,26 @@
1084
  hideLoading();
1085
  }
1086
  })
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1087
 
1088
  const { data: linksData, mutateAsync: filesMutation, error: linksError, isPending: linksLoading } = useMutation({
1089
  mutationKey: ["get-files", pageToken],
@@ -1137,14 +1167,18 @@
1137
  }
1138
  }, [fileData]);
1139
 
 
 
 
 
 
 
1140
  useEffect(() => {
1141
  if (shareData) {
1142
  layer.alert(shareData.data.share_url);
1143
  }
1144
  }, [shareData]);
1145
 
1146
-
1147
-
1148
  const handleSearchClick = () => {
1149
  setSearch(keyword)
1150
  };
@@ -1311,8 +1345,6 @@
1311
  }, [linksData]);
1312
 
1313
 
1314
-
1315
-
1316
  const forceUpdate = () => {
1317
  setReload((pre) => !pre);
1318
  };
@@ -1366,7 +1398,138 @@
1366
  );
1367
  };
1368
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1369
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1370
  const Tasks = () => {
1371
  const [show, setShow] = useState(false);
1372
  const handleClose = () => setShow(false);
 
845
  </Navbar.Brand>
846
  </div>
847
  <div className="d-flex">
848
+ <Offline />
849
  <Tasks />
850
  <LocalTasks />
851
  <Button
 
1032
  />)
1033
  }
1034
 
1035
+ <Icon
1036
+ icon="delete"
1037
+ size="6"
1038
+ className="me-2"
1039
+ onClick={ async () => {
1040
+ let data = { "id": row.id }
1041
+ await deleteMutation(data);
1042
+ } }
1043
+ />
1044
 
1045
  <Icon
1046
  icon="share-variant"
 
1079
  mutationKey: ["create_share"],
1080
  mutationFn: async (fileinfo) => {
1081
  showLoading();
1082
+ var url = '/file_batch_share?need_password=false&expiration_days=-1';
1083
  return await axios.post(url, [fileinfo.id], {
1084
  headers: {
1085
  'Authorization': authorization,
 
1094
  hideLoading();
1095
  }
1096
  })
1097
+ const { data: deleteData, mutateAsync: deleteMutation } = useMutation({
1098
+ mutationKey: ["delete_file"],
1099
+ mutationFn: async (fileinfo) => {
1100
+ showLoading();
1101
+ var url = '/files/' + fileinfo.id;
1102
+ return await axios.delete(url, {
1103
+ headers: {
1104
+ 'Authorization': authorization,
1105
+ 'Content-Type': 'application/json'
1106
+ },
1107
+ })
1108
+ },
1109
+ onSuccess: async (data, variables, context) => {
1110
+ hideLoading();
1111
+ forceUpdate();
1112
+ },
1113
+ onError: () => {
1114
+ hideLoading();
1115
+ }
1116
+ })
1117
 
1118
  const { data: linksData, mutateAsync: filesMutation, error: linksError, isPending: linksLoading } = useMutation({
1119
  mutationKey: ["get-files", pageToken],
 
1167
  }
1168
  }, [fileData]);
1169
 
1170
+ useEffect(() => {
1171
+ if (deleteData) {
1172
+ layer.msg("删除完成,请刷新查看结果");
1173
+ }
1174
+ }, [deleteData]);
1175
+
1176
  useEffect(() => {
1177
  if (shareData) {
1178
  layer.alert(shareData.data.share_url);
1179
  }
1180
  }, [shareData]);
1181
 
 
 
1182
  const handleSearchClick = () => {
1183
  setSearch(keyword)
1184
  };
 
1345
  }, [linksData]);
1346
 
1347
 
 
 
1348
  const forceUpdate = () => {
1349
  setReload((pre) => !pre);
1350
  };
 
1398
  );
1399
  };
1400
 
1401
+ const Offline = () => {
1402
+ const [selectedOption, setSelectedOption] = useState(1);
1403
+ const handleOptionChange = (event) => {
1404
+ setSelectedOption(event.target.value);
1405
+ };
1406
+
1407
+ const [linkValue, setLinkValue] = useState('');
1408
+ const handleLinkChange = (event) => {
1409
+ setLinkValue(event.target.value);
1410
+ };
1411
+
1412
+ const [show, setShow] = useState(false);
1413
+ const handleClose = () => setShow(false);
1414
+ const handleShow = () => setShow(true);
1415
+ const setting = STORE.getState().settings;
1416
+ const authorization = 'Bearer ' + setting.secret_token;
1417
+
1418
+ const { data: taskData, mutateAsync: offlineMutation, error: taskError, isPending: taskLoading } = useMutation({
1419
+ mutationKey: ["offfline-files"],
1420
+ mutationFn: async (query) => {
1421
+ showLoading();
1422
+ var url = query.url;
1423
+ return await axios.post(url, query.data, {
1424
+ headers: {
1425
+ 'Authorization': authorization,
1426
+ 'Content-Type': 'application/json'
1427
+ },
1428
+ })
1429
+ },
1430
+ onSuccess: async (data, variables, context) => {
1431
+ hideLoading();
1432
+ },
1433
+ onError: () => {
1434
+ hideLoading();
1435
+ }
1436
+ })
1437
+
1438
+ useEffect(() => {
1439
+ if (taskData) {
1440
+ layer.msg("添加完成,刷新查看");
1441
+ }
1442
+ }, [taskData]);
1443
+
1444
 
1445
+ return (
1446
+ <div>
1447
+ <Button
1448
+ style={ {
1449
+ backgroundColor: "transparent",
1450
+ } }
1451
+ className="nav-link btn mr-1"
1452
+ onClick={ handleShow }
1453
+ children={
1454
+ <span>
1455
+ <Icon
1456
+ icon="plus"
1457
+ size="3"
1458
+ className="text-white"
1459
+ />
1460
+ </span>
1461
+ }
1462
+ ></Button>
1463
+ <Modal show={ show } onHide={ handleClose }>
1464
+ <Modal.Header closeButton>
1465
+ <Modal.Title>添加离线</Modal.Title>
1466
+ </Modal.Header>
1467
+ <Modal.Body>
1468
+ <Form>
1469
+ <Form.Group className="mb-3" controlId="exampleForm.ControlInput1">
1470
+ <Form.Label>链接类型</Form.Label>
1471
+ <div>
1472
+ <Form.Check
1473
+ inline
1474
+ label="磁力"
1475
+ name="offline_type"
1476
+ type="radio"
1477
+ value={ 1 }
1478
+ checked={ selectedOption == 1 }
1479
+ onChange={ handleOptionChange }
1480
+ />
1481
+ <Form.Check
1482
+ inline
1483
+ label="分享"
1484
+ name="offline_type"
1485
+ type="radio"
1486
+ value={ 2 }
1487
+ checked={ selectedOption == 2 }
1488
+ onChange={ handleOptionChange }
1489
+ />
1490
+ </div>
1491
+ </Form.Group>
1492
+ <Form.Group
1493
+ className="mb-3"
1494
+ controlId="exampleForm.ControlTextarea1"
1495
+ >
1496
+ <Form.Label>链接地址</Form.Label>
1497
+ <Form.Control as="textarea" value={ linkValue }
1498
+ onChange={ handleLinkChange } rows={ 3 } />
1499
+ </Form.Group>
1500
+ </Form>
1501
+ </Modal.Body>
1502
+ <Modal.Footer>
1503
+ <Button variant="secondary" onClick={ handleClose }>
1504
+ 关闭
1505
+ </Button>
1506
+ <Button variant="primary" onClick={ async () => {
1507
+ var data = {};
1508
+ if (selectedOption == 1) {
1509
+ data = {
1510
+ url: "/offline",
1511
+ data: {
1512
+ "file_url": linkValue,
1513
+ "parent_id": "",
1514
+ "name": "",
1515
+ "additionalProp1": {}
1516
+ }
1517
+ }
1518
+ } else {
1519
+ data = {
1520
+ url: "/restore?share_id=" + linkValue,
1521
+ data: []
1522
+ }
1523
+ }
1524
+ await offlineMutation(data);
1525
+ } }>
1526
+ 保存
1527
+ </Button>
1528
+ </Modal.Footer>
1529
+ </Modal>
1530
+ </div>
1531
+ );
1532
+ }
1533
  const Tasks = () => {
1534
  const [show, setShow] = useState(false);
1535
  const handleClose = () => setShow(false);