1. 文件夹列表: FolderManageViewController.swift

   /// 申请数据    private func requestData() {        if folders.count == 0 {            showLoading()        }                let page = (folders.count / 30) + 1        NetworkManager.shared.folderList(page: page, pageSize: 30) { [weak self] response in            guard let self = self else { return }            self.hideLoading()            self.folders.append(contentsOf: response.list)            self.collectionView.mj_header?.endRefreshing()            self.collectionView.mj_footer?.endRefreshing()            if !response.pager.has_more {                self.collectionView.mj_footer?.endRefreshingWithNoMoreData()            }            self.collectionView.reloadData()        } failureCallback: { [weak self] code, err in            self?.collectionView.mj_header?.endRefreshing()            self?.collectionView.mj_footer?.endRefreshing()            self?.collectionView.reloadData()            self?.hideLoading()            self?.showToast(err)        }    }    /// cell配置    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: FolderManageCell.reusableIdentifier, for: indexPath) as! FolderManageCell                let folder = folders[indexPath.row]        cell.folder = folder        /// menu按钮回调        cell.menuCallback = { [weak self] in            guard let self = self, let cell = self.collectionView.cellForItem(at: indexPath) else { return }            let x = 35.ztScaleValue            let y = 50.ztScaleValue + Screen.k_nav_height            let alertPoint = cell.convert(CGPoint(x: x, y: y), to: self.view)            let alert = MenuAlert(items: [.init(title: "更改明码", icon: .assets(.icon_lock))], alertPoint: alertPoint)            alert.selectCallback = { [weak self] item in                guard let self = self else { return }                if item.title == "更改明码" {                    let alert = FolderEditPwdAlert()                    alert.saveCallback = { [weak self] old, new, confrim in                        guard let self = self else { return }                        LoadingView.show()                        NetworkManager.shared.editFolderPwd(id: folder.id, oldPwd: old, newPwd: new, confirmPwd: confrim) { [weak self] _ in                            guard let self = self else { return }                            alert.removeFromSuperview()                            LoadingView.hide()                            SceneDelegate.shared.window?.makeToast("批改胜利".localizedString)                            self.reloadData()                        } failureCallback: { code, err in                            LoadingView.hide()                            SceneDelegate.shared.window?.makeToast(err)                        }                    }                    SceneDelegate.shared.window?.addSubview(alert)                }            }            SceneDelegate.shared.window?.addSubview(alert)        }                 /// 状态cover 按钮回调        cell.statusCoverCallback = { [weak self] index in            guard let self = self else { return }            switch folder.statusEnum {            case .failToDelete:                if index == 0 { // 批改文件夹失败 - 重试                    self.showLoading()                    NetworkManager.shared.restartAsyncTask(task_id: folder.task_id) { [weak self] _ in                        guard let self = self else { return }                        self.hideLoading()                        self.reloadData()                                            } failureCallback: { [weak self] code, err in                        self?.hideLoading()                        self?.showToast(err)                    }                }            case .failToEdit:                if index == 0 { // 批改文件夹失败 - 确定                    self.showLoading()                    NetworkManager.shared.deleteAsyncTask(task_id: folder.task_id) { [weak self] _ in                        guard let self = self else { return }                        self.hideLoading()                        self.reloadData()                                            } failureCallback: { [weak self] code, err in                        self?.hideLoading()                        self?.showToast(err)                    }                }            default:                break            }        }        return cell    }

2. 文件夹设置: FolderManageSettingViewController.swift

   /// 保留文件夹设置    @objc    private func tapSave() {        guard let pool = selectedPool, let partition = selectedPartition else { return }        showLoading()                NetworkManager.shared.setFolderSettings(poolName: pool.name, partitionName: partition.name, autoDel: autoDeleteCell.switchBtn.isOn) { [weak self] _ in            self?.hideLoading()            SceneDelegate.shared.window?.makeToast("保留胜利".localizedString)            self?.navigationController?.popViewController(animated: true)        } failureCallback: { [weak self] code, err in            self?.hideLoading()            self?.showToast(err)        }    }        /// 获取文件夹设置    private func getFolderSettings() {        showLoading(.custom(.white_ffffff))        let sp = DispatchSemaphore(value: 1)        DispatchQueue.global().async {            sp.wait()            /// 1获取存储池列表            NetworkManager.shared.storagePoolList(page: 0, pageSize: 0) { [weak self] response in                guard let self = self else { return }                self.storagePools = response.list                sp.signal()            } failureCallback: { _, _ in                sp.signal()            }            sp.wait()            NetworkManager.shared.getFolderSettings { [weak self] settings in                sp.signal()                guard let self = self else { return }                self.hideLoading()                self.autoDeleteCell.switchBtn.setIsOn(settings.is_auto_del)                 self.storageDefaultCell.nameLabel.text = "\(settings.pool_name)-\(settings.partition_name)"                self.selectedPool = self.storagePools.first(where: { $0.name == settings.pool_name })                if let selectedPool = self.selectedPool {                    self.selectedPartition = selectedPool.lv.first(where: { $0.name == settings.partition_name })                }                            } failureCallback: { [weak self] code, err in                sp.signal()                self?.hideLoading()                self?.showToast(err)            }        }    }

3. 创立、编辑、删除文件夹:EditFolderViewController.swift



 /// 删除文件夹    @objc    private func tapDelete() {        let alert = TipsAlertView(title: "确定删除该文件夹吗?", detail: "删除后,该文件夹及其蕴含的所有文件夹/文件都全副删除。", warning: "操作不可撤销,请审慎操作!", sureBtnTitle: "确认删除")                alert.sureCallback = { [weak self] in            guard let self = self else { return }            guard let id = self.type.folderId else { return }            LoadingView.show()            NetworkManager.shared.deleteFolder(id: id) { [weak self] _ in                LoadingView.hide()                self?.showToast("删除胜利".localizedString)                alert.removeFromSuperview()                self?.navigationController?.popViewController(animated: true)            } failureCallback: { [weak self] code, err in                LoadingView.hide()                self?.showToast(err)                alert.removeFromSuperview()            }        }        SceneDelegate.shared.window?.addSubview(alert)    }        /// 保留批改    @objc    private func save() {        if type == .create {            let name = nameCell.textField.text ?? ""            let pool_name = selectedPool?.name ?? ""            let partition_name = selectedPartition?.name ?? ""            let is_encrypt = isSecureCell.selectView.selectedIndex == 0 ? 1 : 0            let pwd = pwdCell1.textField.text ?? ""            let confirmPwd = pwdCell2.textField.text ?? ""            var mode: FolderModel.FolderMode = .shared            if folderTypeCell.selectView.selectedIndex == 0 {                mode = .private            }            showLoading()            NetworkManager.shared.createFolder(name: name, pool_name: pool_name, partition_name: partition_name, is_encrypt: is_encrypt, pwd: pwd, confirm_pwd: confirmPwd, mode: mode, auth: members) { [weak self] _ in                self?.showToast("保留胜利".localizedString)                self?.navigationController?.popViewController(animated: true)            } failureCallback: { [weak self] code, err in                self?.hideLoading()                self?.showToast(err)            }        } else {            guard let folder = folder else { return }            let name = nameCell.textField.text ?? ""            let pool_name = selectedPool?.name ?? ""            let partition_name = selectedPartition?.name ?? ""            var mode: FolderModel.FolderMode = .shared            if folderTypeCell.selectView.selectedIndex == 0 {                mode = .private            }            //如果批改了分区            if pool_name != folder.pool_name || partition_name != folder.partition_name {                let tipsAlert = TipsAlertView(title: "存储分区转移".localizedString, titleColor: .custom(.black_3f4663), detail: "\(name)存储分区从“\(folder.pool_name ?? "")-\(folder.partition_name ?? "")”改为“\(pool_name)-\(partition_name)”", detailColor: .custom(.black_3f4663), warning: "批改预计须要一段时间解决,且中途不可勾销。确定要批改吗?".localizedString, warningColor: .custom(.red_fe0000), sureBtnTitle: "确定".localizedString)                tipsAlert.sureCallback = { [weak self] in                    guard let self = self else { return }                    self.editFolder(id: folder.id, name: name, pool_name: pool_name, partition_name: partition_name, is_encrypt: folder.is_encrypt, mode: mode, auth: self.members)                    tipsAlert.removeFromSuperview()                }                                SceneDelegate.shared.window?.addSubview(tipsAlert)                            } else {                editFolder(id: folder.id, name: name, pool_name: pool_name, partition_name: partition_name, is_encrypt: folder.is_encrypt, mode: mode, auth: members)            }            }    }        /// 编辑文件夹    private func editFolder(id: Int, name: String, pool_name: String, partition_name: String, is_encrypt: Int, mode: FolderModel.FolderMode, auth: [User]) {        showLoading()        NetworkManager.shared.editFolder(id: id, name: name, pool_name: pool_name, partition_name: partition_name, is_encrypt: is_encrypt, mode: mode, auth: auth) { [weak self] _ in            guard let self = self else { return }            if pool_name != self.folder?.pool_name || partition_name != self.folder?.partition_name {                //如果批改了分区                let alert = SingleTipsAlertView(detail: "存储分区转移" + "\n\n" + "\(name)存储分区正在从“\(self.folder?.pool_name ?? "")-\(self.folder?.partition_name ?? "")”改为“\(pool_name)-\(partition_name)”,已为您后盾运行,可返回列表查看。", sureBtnTitle: "确定".localizedString)                alert.sureCallback = { [weak self] in                    guard let self = self else { return }                    alert.removeFromSuperview()                    self.showToast("保留胜利".localizedString)                    self.navigationController?.popViewController(animated: true)                }                SceneDelegate.shared.window?.addSubview(alert)            } else {                self.showToast("保留胜利".localizedString)                self.navigationController?.popViewController(animated: true)            }        } failureCallback: { [weak self] code, err in            guard let self = self else { return }            self.hideLoading()            if code == 20019 {                //指标分区容量有余,不能迁徙                let errAlert = SingleTipsAlertView(detail: "存储分区批改失败".localizedString + "\n\n" + "分区容量有余!".localizedString, sureBtnTitle: "确定".localizedString)                errAlert.sureCallback = {                    errAlert.removeFromSuperview()                }                SceneDelegate.shared.window?.addSubview(errAlert)                            } else {                self.showToast(err)            }         }    }