录音详情修改
authorliangzhenying <867174124@qq.com>
Wed, 5 Nov 2025 07:14:10 +0000 (15:14 +0800)
committerliangzhenying <867174124@qq.com>
Wed, 5 Nov 2025 07:14:10 +0000 (15:14 +0800)
12 files changed:
ShenYin/ShenYin/UI/Home/HistoryRecord/CloudHistoryRecordVC.swift [deleted file]
ShenYin/ShenYin/UI/Home/HistoryRecord/HistoryFontVC.swift [deleted file]
ShenYin/ShenYin/UI/Home/HistoryRecord/HistoryRecordShareVC.swift [deleted file]
ShenYin/ShenYin/UI/Home/HistoryRecord/HistoryRecordVC.swift [deleted file]
ShenYin/ShenYin/UI/Home/HistoryRecord/VC/HistoryRecordVC.swift [new file with mode: 0644]
ShenYin/ShenYin/UI/Mine/Login/ViewModel/UserInfo.swift [deleted file]
ShenYin/ShenYin/UI/Mine/Login/ViewModel/UserModel.swift [deleted file]
ShenYin/ShenYin/UI/common/Cache/CacheManager.swift [deleted file]
ShenYin/ShenYin/UI/common/Cache/FontCache.swift [deleted file]
ShenYin/ShenYin/UI/common/Cache/RecordCache.swift [deleted file]
ShenYin/ShenYin/UI/common/Cache/RecordDetailModel.swift [deleted file]
ShenYin/ShenYin/UI/common/Cache/TipsCache.swift [deleted file]

diff --git a/ShenYin/ShenYin/UI/Home/HistoryRecord/CloudHistoryRecordVC.swift b/ShenYin/ShenYin/UI/Home/HistoryRecord/CloudHistoryRecordVC.swift
deleted file mode 100644 (file)
index 9821b11..0000000
+++ /dev/null
@@ -1,142 +0,0 @@
-//
-//  CloudHistoryRecordVC.swift
-//  ShenYin
-//
-//  Created by liangshi on 2025/10/25.
-//
-
-
-import UIKit
-import MJRefresh
-class CloudHistoryRecordVC: BaseVC{
-    let tableView = UITableView(frame: .zero, style: .plain)
-    let vm = HistoryRecordVM()
-    var list = [RecordHistoryModel]()
-    
-    override func viewDidLoad() {
-        super.viewDidLoad()
-        // Do any additional setup after loading the view.
-    }
-    override func viewWillAppear(_ animated: Bool) {
-        super.viewWillAppear(animated)
-        tableView.reloadData()
-    }
-    override func setupViews() {
-        navBar.do { v in
-            v.title = "云存储空间"
-            let items = [NavigationRightItem(image: UIImage(named: "filter"),target: self, action: #selector(filterAction)),NavigationRightItem(image: UIImage(named: "search"), target: self,action: #selector(searchAction))]
-            v.setupRightViews(items)
-        }
-        
-        tableView.do { v in
-            v.backgroundColor = .rgb(0xF7F7F7)
-            v.delegate = self
-            v.dataSource = self
-            v.estimatedRowHeight = 84
-            v.separatorStyle = .none
-            v.register(HistoryRecordCell.self, forCellReuseIdentifier: HistoryRecordCell.reuseID)
-            v.mj_header = MJRefreshNormalHeader(refreshingTarget: self, refreshingAction: #selector(refreshAction))
-            v.mj_footer = MJRefreshBackNormalFooter(refreshingTarget: self, refreshingAction: #selector(loadMoreAction))
-        }
-        view.addSubviews([tableView])
-    }
-    override func setupLayout() {
-        tableView.snp.makeConstraints { make in
-            make.left.right.equalToSuperview()
-            make.top.equalTo(kNavBtm)
-            make.bottom.equalToSuperview()
-        }
-    }
-    override func setupData() {
-        refreshAction()
-    }
-    @objc func searchAction(){
-        
-    }
-    @objc func filterAction(){
-        let list = FiltterRecordType.alls.map({$0.title})
-        let v = CustomPicker(title: "筛选录音", list:list )
-        v.selectedIndex = list.firstIndex(where: {vm.type.title == $0})!
-        v.show()
-        v.didSelected = {[weak self] (index,value) in
-            guard let self = self else { return  }
-            vm.type = FiltterRecordType.alls.first(where: {$0.title == value})!
-            tableView.mj_header?.beginRefreshing()
-        }
-    }
-    @objc func refreshAction(){
-        vm.refresh {[weak self] result in
-            guard let self = self else {return}
-            tableView.mj_header?.endRefreshing()
-            if result.success{
-                tableView.reloadData()
-            }
-            
-            if result.success,result.data.hasNext == false{
-                tableView.mj_footer?.endRefreshingWithNoMoreData()
-            }
-            else{
-                tableView.mj_footer?.endRefreshing()
-            }
-        }
-    }
-    @objc func loadMoreAction(){
-        vm.loadMore {[weak self] result in
-            guard let self = self else {return}
-            if result.success{
-                tableView.reloadData()
-            }
-        }
-    }
-}
-
-extension CloudHistoryRecordVC:UITableViewDelegate,UITableViewDataSource {
-    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
-        return vm.list.count
-    }
-    
-    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
-        let cell = HistoryRecordCell.cell(withTableView: tableView, indexPath: indexPath)
-        cell.model = vm.list[indexPath.row]
-        return cell
-    }
-    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
-        let data = vm.list[indexPath.row]
-        let vc = RecordDetailVC(remoteData: data)
-        vc.delegateCallback = {[weak self] in
-            guard let self = self else{return}
-            vm.list.removeAll(where: {data === $0})
-            tableView.reloadData()
-        }
-        App.shared.goToPage(vc)
-//        let api = CommomApi.getVoiceRecord(recordId: data.id)
-//        HttpClient.request(api) {[weak self] (result:RecordHistoryDetailRoot,res) in
-//            guard let self = self else {return}
-//            if result.isSuccess{
-//                let model = RecordDetailModel()
-//                model.type = .translate
-//                model.origin = result.data.summary
-//                model.translate = ""
-//                model.path = result.data.fileId
-//                model.name = result.data.name
-//                App.shared.goToPage(RecordDetailVC(record: model))
-//            }
-//        }
-        
-        
-    }
-    // 实现滑动删除功能
-    func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCell.EditingStyle, forRowAt indexPath: IndexPath) {
-        if editingStyle == .delete {
-            // 从数据源中移除对应数据
-            vm.list.remove(at: indexPath.row)
-            // 从表格中删除对应行
-            tableView.deleteRows(at: [indexPath], with:.fade)
-        }
-    }
-    
-    // 允许编辑
-    func tableView(_ tableView: UITableView, canEditRowAt indexPath: IndexPath) -> Bool {
-        return true
-    }
-}
diff --git a/ShenYin/ShenYin/UI/Home/HistoryRecord/HistoryFontVC.swift b/ShenYin/ShenYin/UI/Home/HistoryRecord/HistoryFontVC.swift
deleted file mode 100644 (file)
index 81ed008..0000000
+++ /dev/null
@@ -1,80 +0,0 @@
-//
-//  HistoryFontVC.swift
-//  ShenYin
-//
-//  Created by liangshi on 2025/8/13.
-//
-
-import UIKit
-class HistoryFontVC: BaseVC{
-    let tableView = UITableView(frame: .zero, style: .plain)
-    var list:[FontType] = [.min,.stand,.big]
-    var currentType = FontCache.getFont()
-    let btn = CustomButton()
-    
-    override func viewDidLoad() {
-        super.viewDidLoad()
-        // Do any additional setup after loading the view.
-    }
-    override func setupViews() {
-        self.navBar.title = "调整字号"
-        tableView.do { v in
-            v.backgroundColor = .rgb(0xF7F7F7)
-            v.delegate = self
-            v.dataSource = self
-            v.rowHeight = 52
-            v.separatorStyle = .none
-            v.contentInset = UIEdgeInsets(top: 10, left: 0, bottom: 0, right: 0)
-            v.register(SelectCell.self, forCellReuseIdentifier: SelectCell.reuseID)
-        }
-        view.addSubviews([tableView,btn])
-        
-        btn.set(title: "设置", target: self, action: #selector(btnAction))
-    }
-    override func setupLayout() {
-        tableView.snp.makeConstraints { make in
-            make.left.right.bottom.equalToSuperview()
-            make.top.equalTo(kNavBtm)
-        }
-        btn.snp.makeConstraints { make in
-            make.width.equalTo(272)
-            make.height.equalTo(46)
-            make.centerX.equalToSuperview()
-            make.bottom.equalToSuperview().inset(82)
-        }
-    }
-    @objc func btnAction(){
-        FontCache.saveFont(type: currentType)
-        self.navigationController?.popViewController(animated: true)
-    }
-}
-
-extension HistoryFontVC:UITableViewDelegate,UITableViewDataSource {
-    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
-        return list.count
-    }
-    
-    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
-        let cell = SelectCell.cell(withTableView: tableView, indexPath: indexPath)
-        cell.fontType = list[indexPath.row]
-        let rect = CGRect(x: 0, y: 0, width: kScreenWid - 36, height: 52)
-        if indexPath.row == 0 {
-            cell.bgView.yc.setCorners(withRoundedRect: rect, roundingCorners: [.topLeft,.topRight], cornerRadii: CGSize(width: 8, height: 8))
-        }
-        else if indexPath.row == list.count - 1{
-            cell.bgView.yc.setCorners(withRoundedRect: rect, roundingCorners: [.bottomLeft,.bottomRight], cornerRadii: CGSize(width: 8, height: 8))
-        }
-        else{
-            cell.bgView.yc.setCorners(withRoundedRect: rect, roundingCorners: [.allCorners], cornerRadii: CGSize(width: 0, height: 0))
-        }
-        cell.selectedIcon.isHidden = cell.fontType != currentType
-        return cell
-    }
-    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
-        let data = list[indexPath.row]
-        currentType = data
-        tableView.reloadData()
-    }
-}
-
-
diff --git a/ShenYin/ShenYin/UI/Home/HistoryRecord/HistoryRecordShareVC.swift b/ShenYin/ShenYin/UI/Home/HistoryRecord/HistoryRecordShareVC.swift
deleted file mode 100644 (file)
index f697724..0000000
+++ /dev/null
@@ -1,182 +0,0 @@
-//
-//  HistoryRecordShareVC.swift
-//  ShenYin
-//
-//  Created by liangshi on 2025/8/13.
-//
-
-import UIKit
-class HistoryRecordShareVC: BaseVC{
-    let tableView = UITableView(frame: .zero, style: .plain)
-    var list:[ShareType] = [.audio_document,.audio,.document]
-    var currentType = ShareType.audio_document
-    let btn = CustomButton()
-    
-    let recordModel:RecordDetailModel
-    
-    init(record model: RecordDetailModel,fileId:String?) {
-        self.recordModel = model
-        super.init()
-        if let id = fileId {
-            loadFile(filedId: id)
-        }
-    }
-    override func viewDidLoad() {
-        super.viewDidLoad()
-        // Do any additional setup after loading the view.
-    }
-    override func setupViews() {
-        self.navBar.title = "分享"
-        tableView.do { v in
-            v.backgroundColor = .rgb(0xF7F7F7)
-            v.delegate = self
-            v.dataSource = self
-            v.rowHeight = 52
-            v.contentInset = UIEdgeInsets(top: 10, left: 0, bottom: 0, right: 0)
-            v.separatorStyle = .none
-            v.register(SelectCell.self, forCellReuseIdentifier: SelectCell.reuseID)
-            v.tableHeaderView = ShareHeaderView(frame: CGRect(x: 0, y: 0, width: kScreenWid, height: 70))
-        }
-        view.addSubviews([tableView,btn])
-        
-        btn.set(title: "导出", target: self, action: #selector(btnAction))
-    }
-    override func setupLayout() {
-        tableView.snp.makeConstraints { make in
-            make.left.right.bottom.equalToSuperview()
-            make.top.equalTo(kNavBtm)
-        }
-        btn.snp.makeConstraints { make in
-            make.width.equalTo(272)
-            make.height.equalTo(46)
-            make.centerX.equalToSuperview()
-            make.bottom.equalToSuperview().inset(82)
-        }
-    }
-    
-    override func setupData() {
-
-    }
-    func loadFile(filedId id:String){
-        let api = CommomApi.recordUrl(filedId: id)
-        HttpClient.request(api) {[weak self] (model:CommonDataModel,res) in
-            guard let self = self else {return}
-            if model.isSuccess{
-                startDownload(url: model.data)
-            }
-        }
-    }
-    func startDownload(url:String){
-        //        let url = "https://dc-cloud-priv.tos-cn-guangzhou.volces.com/music-file/2025_10_09/1976135290430767105.mp3"
-        HttpClient.download(url: url,type: "wav"){[weak self] result in
-            guard let self = self else {return}
-            if let path = result{
-                recordModel.path = path
-            }
-        }
-    }
-    
-    @objc func btnAction(){
-        if currentType == .audio {
-            if recordModel.path.isNotEmpty {
-                saveFile(filePath: recordModel.path)
-            }
-            
-        }
-        else if currentType == .document{
-            guard let path = FileSaver.saveStringAsTxt(recordModel.origin) else {
-                return
-            }
-            saveFile(filePath: path)
-        }
-        else{
-
-            guard let orginPath = FileSaver.saveStringAsTxt(recordModel.origin) else {
-                return
-            }
-            var list = [orginPath]
-            if recordModel.path.isNotEmpty {
-                list.append(recordModel.path)
-            }
-            
-            if recordModel.translate.count > 0,let path = FileSaver.saveStringAsTxt(recordModel.translate) {
-                list.append(path)
-            }
-            if recordModel.summary.count > 0,let path = FileSaver.saveStringAsTxt(recordModel.summary) {
-                list.append(path)
-            }
-            guard let path = FileSaver.zipFiles(files: list) else { return  }
-            
-            saveFile(filePath: path)
-        }
-        
-    }
-}
-extension HistoryRecordShareVC:UIDocumentPickerDelegate{
-    //保存文件到手机文件指定目录
-    func saveFile(filePath:String) {
-        let fUrl = NSURL(fileURLWithPath: filePath)
-        let vc = UIDocumentPickerViewController(url: fUrl as URL, in: .exportToService);
-        vc.delegate = self
-        vc.modalPresentationStyle = .overFullScreen
-        self.present(vc, animated: true)
-    }
-    public func documentPicker(_ controller: UIDocumentPickerViewController, didPickDocumentsAt urls: [URL]) {
-        controller.dismiss(animated: true)
-    }
-}
-
-extension HistoryRecordShareVC:UITableViewDelegate,UITableViewDataSource {
-    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
-        return list.count
-    }
-    
-    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
-        let cell = SelectCell.cell(withTableView: tableView, indexPath: indexPath)
-        cell.shareType = list[indexPath.row]
-        let rect = CGRect(x: 0, y: 0, width: kScreenWid - 36, height: 52)
-        if indexPath.row == 0 {
-            cell.bgView.yc.setCorners(withRoundedRect: rect, roundingCorners: [.topLeft,.topRight], cornerRadii: CGSize(width: 8, height: 8))
-        }
-        else if indexPath.row == list.count - 1{
-            cell.bgView.yc.setCorners(withRoundedRect: rect, roundingCorners: [.bottomLeft,.bottomRight], cornerRadii: CGSize(width: 8, height: 8))
-        }
-        else{
-            cell.bgView.yc.setCorners(withRoundedRect: rect, roundingCorners: [.allCorners], cornerRadii: CGSize(width: 0, height: 0))
-        }
-        cell.selectedIcon.isHidden = cell.shareType != currentType
-        return cell
-    }
-    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
-        let data = list[indexPath.row]
-        currentType = data
-        tableView.reloadData()
-    }
-}
-
-class ShareHeaderView: BaseView {
-    let titleLabel = UILabel()
-
-    override func setupViews() {
-        addSubviews([titleLabel])
-        titleLabel.do { (v) in
-            v.textColor = .hexString("#666666")
-            v.font = .regular(14)
-            v.numberOfLines = 0
-
-            let text = "多个文件将压缩成一个.zip的文件以便于分享。请选择您需要导出的文件类型:"
-            let textString = NSAttributedString(string: text)
-            let mutableAttributedString = NSMutableAttributedString()
-            mutableAttributedString.append(textString)
-            v.attributedText = mutableAttributedString
-        }
-    }
-    
-    override func setupLayout() {
-        titleLabel.snp.makeConstraints { make in
-            make.left.right.equalToSuperview().inset(18)
-            make.top.equalToSuperview()
-            make.bottom.equalToSuperview()
-        }
-    }
-}
diff --git a/ShenYin/ShenYin/UI/Home/HistoryRecord/HistoryRecordVC.swift b/ShenYin/ShenYin/UI/Home/HistoryRecord/HistoryRecordVC.swift
deleted file mode 100644 (file)
index e7ba7ce..0000000
+++ /dev/null
@@ -1,91 +0,0 @@
-//
-//  HistoryRecordVC.swift
-//  ShenYin
-//
-//  Created by liangshi on 2025/8/6.
-//
-
-
-import UIKit
-class HistoryRecordVC: BaseVC{
-    let tableView = UITableView(frame: .zero, style: .plain)
-//    let bottomView = HistoryBottonView()
-    var list = [RecordDetailModel]()
-    
-    override func viewDidLoad() {
-        super.viewDidLoad()
-        // Do any additional setup after loading the view.
-    }
-    override func viewWillAppear(_ animated: Bool) {
-        super.viewWillAppear(animated)
-        tableView.reloadData()
-    }
-    override func setupViews() {
-        navBar.do { v in
-            v.title = "历史记录"
-            let items = [NavigationRightItem(image: UIImage(named: "filter"),target: self, action: #selector(filterAction)),NavigationRightItem(image: UIImage(named: "search"), target: self,action: #selector(searchAction))]
-            v.setupRightViews(items)
-        }
-        
-        tableView.do { v in
-            v.backgroundColor = .rgb(0xF7F7F7)
-            v.delegate = self
-            v.dataSource = self
-            v.estimatedRowHeight = 84
-            v.separatorStyle = .none
-            v.register(HistoryRecordCell.self, forCellReuseIdentifier: HistoryRecordCell.reuseID)
-        }
-        view.addSubviews([tableView])
-    }
-    override func setupLayout() {
-//        bottomView.snp.makeConstraints { make in
-//            make.left.right.bottom.equalToSuperview()
-//        }
-        tableView.snp.makeConstraints { make in
-            make.left.right.equalToSuperview()
-            make.top.equalTo(kNavBtm)
-            make.bottom.equalToSuperview()
-        }
-    }
-    override func setupData() {
-        list = RecordCache.shared.getList()
-        list = list.sorted(by: {$0.createTime > $1.createTime})
-        tableView.reloadData()
-    }
-    @objc func searchAction(){
-        
-    }
-    @objc func filterAction(){
-        
-    }
-}
-
-extension HistoryRecordVC:UITableViewDelegate,UITableViewDataSource {
-    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
-        return list.count
-    }
-    
-    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
-        let cell = HistoryRecordCell.cell(withTableView: tableView, indexPath: indexPath)
-        cell.localModel = list[indexPath.row]
-        return cell
-    }
-    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
-        let data = list[indexPath.row]
-        App.shared.goToPage(RecordDetailVC(record: data,needFrontVC:true))
-    }
-    // 实现滑动删除功能
-    func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCell.EditingStyle, forRowAt indexPath: IndexPath) {
-        if editingStyle == .delete {
-            // 从数据源中移除对应数据
-            list.remove(at: indexPath.row)
-            // 从表格中删除对应行
-            tableView.deleteRows(at: [indexPath], with:.fade)
-        }
-    }
-    
-    // 允许编辑
-    func tableView(_ tableView: UITableView, canEditRowAt indexPath: IndexPath) -> Bool {
-        return true
-    }
-}
diff --git a/ShenYin/ShenYin/UI/Home/HistoryRecord/VC/HistoryRecordVC.swift b/ShenYin/ShenYin/UI/Home/HistoryRecord/VC/HistoryRecordVC.swift
new file mode 100644 (file)
index 0000000..2079f98
--- /dev/null
@@ -0,0 +1,166 @@
+//
+//  HistoryRecordVC.swift
+//  ShenYin
+//
+//  Created by liangshi on 2025/8/6.
+//
+
+
+import UIKit
+class HistoryRecordVC: BaseVC{
+    let tableView = UITableView(frame: .zero, style: .plain)
+//    let bottomView = HistoryBottonView()
+    var list = [RecordDetailModel]()
+    var filtterType = FiltterRecordType.all
+    
+    override func viewDidLoad() {
+        super.viewDidLoad()
+        // Do any additional setup after loading the view.
+    }
+    override func viewWillAppear(_ animated: Bool) {
+        super.viewWillAppear(animated)
+        tableView.reloadData()
+    }
+    override func setupViews() {
+        navBar.do { v in
+            v.title = "历史记录"
+            let items = [NavigationRightItem(image: UIImage(named: "filter"),target: self, action: #selector(filterAction)),NavigationRightItem(image: UIImage(named: "search"), target: self,action: #selector(searchAction))]
+            v.setupRightViews(items)
+        }
+        
+        tableView.do { v in
+            v.backgroundColor = .rgb(0xF7F7F7)
+            v.delegate = self
+            v.dataSource = self
+            v.estimatedRowHeight = 84
+            v.separatorStyle = .none
+//            v.isEditing = true
+            v.register(HistoryRecordCell.self, forCellReuseIdentifier: HistoryRecordCell.reuseID)
+        }
+        view.addSubviews([tableView])
+    }
+    override func setupLayout() {
+        tableView.snp.makeConstraints { make in
+            make.left.right.equalToSuperview()
+            make.top.equalTo(kNavBtm)
+            make.bottom.equalToSuperview()
+        }
+    }
+    override func setupData() {
+        var cacheList = RecordCache.shared.getList()
+        cacheList = cacheList.sorted(by: {$0.createTime > $1.createTime})
+        if filtterType == .all {
+            list = cacheList
+        }
+        else if filtterType == .colletion{
+            list = cacheList.filter({$0.favorite == "1"})
+        }
+        else {
+            list = cacheList.filter({$0.type == RecordType(rawValue: filtterType.rawValue)})
+        }
+        tableView.reloadData()
+    }
+    @objc func searchAction(){
+        
+    }
+    @objc func filterAction(){
+        let list = FiltterRecordType.alls.map({$0.title})
+        let v = CustomPicker(title: "筛选录音", list:list )
+        v.selectedIndex = list.firstIndex(where: {filtterType.title == $0})!
+        v.show()
+        v.didSelected = {[weak self] (index,value) in
+            guard let self = self else { return  }
+            filtterType = FiltterRecordType.alls.first(where: {$0.title == value})!
+            setupData()
+        }
+    }
+    func longpressAction(cell:HistoryRecordCell){
+        let window = App.shared.window
+        let rect = cell.superview!.convert(cell.frame, to: window)
+        let top = CGRectGetMaxY(rect)
+        Logger.debug(rect,top)
+        
+        let model = cell.localModel!
+        
+        let v = RecordPopView()
+        v.contentTop = top
+        v.show()
+        v.hidenCallback = {
+            cell.bgView.backgroundColor = .white
+        }
+        v.shareCallback = {
+            App.shared.goToPage(RecordShareVC(localList: [model]))
+        }
+        v.renameCallback = {[weak self] in
+            let v = PopTextField()
+            v.textFiled.text = model.name
+            v.cancelButton.setTitle("取消", for: .normal)
+            v.show()
+            v.cancelTap = {
+                
+            }
+            v.okTap = { [weak self]  text in
+                guard let self = self else{return}
+                model.name = text
+                RecordCache.shared.add(model)
+                tableView.reloadData()
+            }
+        }
+        v.deleteCallback = {[weak self] in
+            self?.deleteAction(model)
+        }
+        v.selectedCallback = { [weak self] in
+            guard let self = self else{return}
+            let vc = HistorySelectedVC(data: list)
+            vc.deleteCallback = { [weak self] deleteList in
+                guard let self = self else{return}
+                for item in deleteList{
+                    list.removeAll(where: {$0.createTime == item.createTime})
+                }
+                tableView.reloadData()
+            }
+            App.shared.goToPage(vc,animated: false)
+        }
+    }
+    func deleteAction(_ model:RecordDetailModel){
+        CustomAlert.showWith(title: "您要删除这条录音吗?", messgage: "删除后,此记录将无法恢复。", cancelCallback: {}) {[weak self] in
+            guard let self = self else{return}
+            list.removeAll(where: {$0 === model})
+            RecordCache.shared.remove(model)
+            tableView.reloadData()
+        }
+    }
+}
+
+extension HistoryRecordVC:UITableViewDelegate,UITableViewDataSource {
+    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
+        return list.count
+    }
+    
+    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
+        let cell = HistoryRecordCell.cell(withTableView: tableView, indexPath: indexPath)
+        cell.localModel = list[indexPath.row]
+        cell.longPressCallback = {[weak self] cell in
+            self?.longpressAction(cell: cell)
+        }
+        return cell
+    }
+    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
+        let data = list[indexPath.row]
+        App.shared.goToPage(RecordDetailVC(record: data,needFrontVC:true))
+    }
+    // 实现滑动删除功能
+    func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCell.EditingStyle, forRowAt indexPath: IndexPath) {
+        if editingStyle == .delete {
+            // 从数据源中移除对应数据
+            list.remove(at: indexPath.row)
+            // 从表格中删除对应行
+            tableView.deleteRows(at: [indexPath], with:.fade)
+        }
+    }
+    
+    // 允许编辑
+    func tableView(_ tableView: UITableView, canEditRowAt indexPath: IndexPath) -> Bool {
+        return true
+    }
+}
diff --git a/ShenYin/ShenYin/UI/Mine/Login/ViewModel/UserInfo.swift b/ShenYin/ShenYin/UI/Mine/Login/ViewModel/UserInfo.swift
deleted file mode 100644 (file)
index ff31390..0000000
+++ /dev/null
@@ -1,54 +0,0 @@
-//
-//  Untitled.swift
-//  ShenYin
-//
-//  Created by liangshi on 2025/9/29.
-//
-import HandyJSON
-
-enum GenderType:String,HandyJSONEnum{
-    case man = "1"
-    case female = "0"
-    case unnkown = "2"
-    var title:String{
-        switch self {
-        case .man:
-            return "男"
-        case .female:
-            return "女"
-        case .unnkown:
-            return "保密"
-        }
-    }
-}
-
-
-class UserInfoRoot:ResponseBaseModel {
-    var data = UserInfo()
-}
-
-class UserInfo:ResponseBaseModel {
-    var id = ""
-    var avatar = ""
-    var userName = ""
-    var createTime = ""
-    var phone = ""
-    var state = "1"
-    var gender = GenderType.unnkown
-    var verify = false
-    var countryName = ""
-    var countryId = ""
-    var email = ""
-    
-//    var genderText:String{
-//        if gender == 1 {
-//            return "男"
-//        }
-//        else if gender == 0 {
-//            return "女"
-//        }
-//        else{
-//            return "保密"
-//        }
-//    }
-}
diff --git a/ShenYin/ShenYin/UI/Mine/Login/ViewModel/UserModel.swift b/ShenYin/ShenYin/UI/Mine/Login/ViewModel/UserModel.swift
deleted file mode 100644 (file)
index e7e9d08..0000000
+++ /dev/null
@@ -1,65 +0,0 @@
-//
-//  UserModel.swift
-//  ShenYin
-//
-//  Created by liangshi on 2025/7/30.
-//
-class StorageSizeModel:ResponseBaseModel {
-    var data:Int = 0
-}
-
-
-class UserModel {
-    static let cacheKey = "Login"
-    var token:String? {
-        didSet{
-           saveToken(text: token)
-        }
-    }
-    var isLogin:Bool{
-        return token != nil
-    }
-    func loadCache(){
-        self.token = getToken()
-        if self.token != nil {
-        }
-    }
-    
-    var storageSize = 0
-    var info = UserInfo()
-}
-
-extension UserModel{
-    func getStorageSize(completion:@escaping (_ result:StorageSizeModel) ->Void){
-        HttpClient.request(.storageSize) { [weak self](result:StorageSizeModel,res) in
-            guard let self = self else{return}
-            if result.isSuccess{
-                storageSize = result.data
-            }
-            completion(result)
-        }
-    }
-}
-
-
-
-
-extension UserModel{
-     private func getToken()->String?{
-         if let value = UserDefaults.standard.value(forKey: UserModel.cacheKey),let token = value as? String{
-            return token
-        }
-        return nil
-
-    }
-    private func saveToken(text:String?){
-        if let text = text {
-            UserDefaults.standard.set(text, forKey: UserModel.cacheKey)
-            UserDefaults.standard.synchronize()
-        }
-        else{
-            UserDefaults.standard.removeObject(forKey: UserModel.cacheKey)
-            UserDefaults.standard.synchronize()
-        }
-    }
-}
diff --git a/ShenYin/ShenYin/UI/common/Cache/CacheManager.swift b/ShenYin/ShenYin/UI/common/Cache/CacheManager.swift
deleted file mode 100644 (file)
index 9a0b2c2..0000000
+++ /dev/null
@@ -1,98 +0,0 @@
-//
-//  c.swift
-//  ShenYin
-//
-//  Created by liangshi on 2025/9/11.
-//
-import CoreBluetooth
-
-class CacheManager{
-    static let shared = CacheManager()
-//    var currentDevice:DeviceModel?
-//    
-//    func saveDevice(_ device: DeviceModel) {
-//        self.currentDevice = device
-//        DeviceCache.shared.saveDevice(device)
-//    }
-    
-    var user = UserModel()
-    
-    init(){
-        user.loadCache()
-        if user.isLogin{
-            tokenIsValid()
-        }
-        
-    }
-}
-
-extension CacheManager{
-    func login(token:String){
-        user.token = token
-        NotificationManager.post(type: .login, objtect: nil)
-        
-    }
-    func logout(){
-        user.token = nil
-        NotificationManager.post(type: .logout, objtect: nil)
-        App.shared.goToLogin()
-    }
-    func tokenIsValid(finished: (() -> Void)? = nil){
-        HttpClient.request(CommomApi.token) { [weak self](model:UserInfoRoot,res) in
-            guard let self = self else{return}
-            if model.isSuccess{
-                user.info = model.data
-            }
-            else{
-                logout()
-            }
-            finished?()
-        }
-    }
-}
-
-
-extension CacheManager{
-    static func uuid()->String{
-        if let value = UserDefaults.standard.value(forKey: "uuid"),let uuid = value as? String{
-            return uuid
-        }
-        let uuid =  UUID().uuidString
-        UserDefaults.standard.setValue(uuid, forKey: "uuid")
-        UserDefaults.standard.synchronize()
-        return uuid
-    }
-}
-
-
-extension CacheManager{
-    static func saveImg(_ img:UIImage)->String?{
-        guard let data = img.pngData() else{
-            return nil
-        }
-        
-        let filePath = getCacheDirectoryPath()! + "/\(Date().timeIntervalSince1970).png"
-        return saveToFile(data: data, filePath: filePath)
-    }
-    static func saveToFile(data:Data,filePath:String)->String?{
-        let url = URL(fileURLWithPath: filePath)
-        do {
-            try data.write(to: url)
-            return filePath
-        } catch {
-            Logger.debug("Error saving compressed data: \(error)")
-            return nil
-        }
-    }
-    
-    // 获取应用沙盒中的缓存目录路径
-    static func getCacheDirectoryPath() -> String? {
-        // 获取缓存目录的URL
-        if let cacheURL = FileManager.default.urls(for: .cachesDirectory, in: .userDomainMask).first {
-            // 转换为路径字符串
-            return cacheURL.path
-        }
-        return nil
-    }
-}
-
diff --git a/ShenYin/ShenYin/UI/common/Cache/FontCache.swift b/ShenYin/ShenYin/UI/common/Cache/FontCache.swift
deleted file mode 100644 (file)
index 36f1c61..0000000
+++ /dev/null
@@ -1,19 +0,0 @@
-//
-//  FontCache.swift
-//  ShenYin
-//
-//  Created by liangshi on 2025/10/24.
-//
-
-class FontCache{
-    static func saveFont(type:FontType){
-        UserDefaults.standard.set(type.rawValue, forKey: "FontCache")
-        UserDefaults.standard.synchronize()
-    }
-    static func getFont()->FontType{
-        if let value = UserDefaults.standard.value(forKey: "FontCache"),let font = value as? Int {
-            return FontType(rawValue: font) ?? .stand
-        }
-        return FontType.stand
-    }
-}
diff --git a/ShenYin/ShenYin/UI/common/Cache/RecordCache.swift b/ShenYin/ShenYin/UI/common/Cache/RecordCache.swift
deleted file mode 100644 (file)
index f8e214d..0000000
+++ /dev/null
@@ -1,43 +0,0 @@
-//
-//  RecordCache.swift
-//  ShenYin
-//
-//  Created by liangshi on 2025/10/24.
-//
-
-class RecordCache {
-    static let shared = RecordCache()
-    private let userDefaults = UserDefaults.standard
-    private let deviceListKey = "deviceListKey"
-    
-    func add(_ device: RecordDetailModel) {
-        var deviceList = getList()
-        if let index = deviceList.firstIndex(where: { $0.createTime == device.createTime }) {
-            deviceList[index] = device
-        }
-        else{
-            deviceList.append(device)
-        }
-        let encoder = NSKeyedArchiver.archivedData(withRootObject: deviceList)
-        userDefaults.set(encoder, forKey: deviceListKey)
-        userDefaults.synchronize()
-    }
-    func remove(_ device: RecordDetailModel) {
-        var deviceList = getList()
-        if let index = deviceList.firstIndex(where: { $0.createTime == device.createTime }) {
-            deviceList.remove(at: index)
-        }
-
-        let encoder = NSKeyedArchiver.archivedData(withRootObject: deviceList)
-        userDefaults.set(encoder, forKey: deviceListKey)
-        userDefaults.synchronize()
-    }
-    
-    func getList() -> [RecordDetailModel] {
-        if let data = userDefaults.data(forKey: deviceListKey),
-           let deviceList = NSKeyedUnarchiver.unarchiveObject(with: data) as? [RecordDetailModel] {
-            return deviceList
-        }
-        return []
-    }
-}
diff --git a/ShenYin/ShenYin/UI/common/Cache/RecordDetailModel.swift b/ShenYin/ShenYin/UI/common/Cache/RecordDetailModel.swift
deleted file mode 100644 (file)
index 04e0f1a..0000000
+++ /dev/null
@@ -1,97 +0,0 @@
-//
-//  RecordDetailModel.swift
-//  ShenYin
-//
-//  Created by liangshi on 2025/10/23.
-//
-import HandyJSON
-
-enum FiltterRecordType:String,HandyJSONEnum{
-    case present = "present"
-    case phone = "phone"
-    case translate = "translate"
-    case all = "all"
-    case colletion = "colletion"
-    
-    var title:String{
-        switch self {
-        case .present:
-            return "现场录音"
-        case .phone:
-            return "通话录音"
-        case .translate:
-            return "同传听译"
-        case .all:
-            return "全部录音"
-        case .colletion:
-            return "收藏录音"
-        }
-    }
-    static var alls:[FiltterRecordType]{
-        return [.all,.colletion,.present,.phone,.translate]
-    }
-}
-
-enum RecordType:String,HandyJSONEnum{
-    case present = "present"
-    case phone = "phone"
-    case translate = "translate"
-    
-    var title:String{
-        switch self {
-        case .present:
-            return "现场录音"
-        case .phone:
-            return "通话录音"
-        case .translate:
-            return "同传听译"
-        }
-    }
-}
-
-class RecordDetailModel:NSObject, NSCoding{
-    func encode(with coder: NSCoder) {
-        coder.encode(from.rawValue, forKey: "from")
-        coder.encode(to.rawValue, forKey: "to")
-        coder.encode(type.rawValue, forKey: "type")
-        coder.encode(origin, forKey: "origin")
-        coder.encode(translate, forKey: "translate")
-        coder.encode(summary, forKey: "summary")
-        coder.encode(path, forKey: "path")
-        coder.encode(name, forKey: "name")
-        coder.encode("\(duration)", forKey: "duration")
-        coder.encode(createTime, forKey: "createTime")
-        coder.encode(favorite, forKey: "favorite")
-    }
-    override init() {
-        createTime = Date().format(.full)
-    }
-    
-    required init?(coder: NSCoder) {
-        from = AiSupportLanguage(rawValue: coder.decodeObject(forKey: "from") as! String) ?? .chinse
-        to = AiSupportLanguage(rawValue: coder.decodeObject(forKey: "to") as! String) ?? .english
-        type = RecordType(rawValue: coder.decodeObject(forKey: "type") as! String) ?? .present
-        origin = coder.decodeObject(forKey: "origin") as? String ?? ""
-        translate = coder.decodeObject(forKey: "translate") as? String ?? ""
-        summary = coder.decodeObject(forKey: "summary") as? String ?? ""
-        path = coder.decodeObject(forKey: "path") as? String ?? ""
-        name = coder.decodeObject(forKey: "name") as? String ?? ""
-        duration = Int(coder.decodeObject(forKey: "duration") as! String) ?? 0
-        createTime = coder.decodeObject(forKey: "createTime") as? String ?? ""
-        favorite = coder.decodeObject(forKey: "favorite") as? String ?? ""
-    }
-    var type:RecordType = .present
-    var from:AiSupportLanguage = .chinse
-    var to:AiSupportLanguage = .english
-    var path = ""
-    var name = ""
-    var duration = 0
-    var createTime = ""
-    var origin = ""
-    
-    var translate = ""
-    var summary = ""
-    var favorite = "0"
-    
-
-}
diff --git a/ShenYin/ShenYin/UI/common/Cache/TipsCache.swift b/ShenYin/ShenYin/UI/common/Cache/TipsCache.swift
deleted file mode 100644 (file)
index c8958a2..0000000
+++ /dev/null
@@ -1,22 +0,0 @@
-//
-//  TipsCache.swift
-//  ShenYin
-//
-//  Created by liangshi on 2025/9/26.
-//
-
-
- 
-
-class TipsCache{
-    static func needShow(type:RecordTipsType,show:Bool){
-        UserDefaults.standard.set(show, forKey: type.title)
-        UserDefaults.standard.synchronize()
-    }
-    static func needShow(type:RecordTipsType)->Bool{
-        if let value = UserDefaults.standard.value(forKey: type.title){
-            return value as? Bool ?? false
-        }
-        return true
-    }
-}