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) } } }