+++ /dev/null
-//
-// 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
- }
-}
+++ /dev/null
-//
-// 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()
- }
-}
-
-
+++ /dev/null
-//
-// 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()
- }
- }
-}
+++ /dev/null
-//
-// 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
- }
-}
--- /dev/null
+//
+// 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
+ }
+}
+++ /dev/null
-//
-// 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 "保密"
-// }
-// }
-}
+++ /dev/null
-//
-// 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()
- }
- }
-}
+++ /dev/null
-//
-// 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
- }
-}
-
+++ /dev/null
-//
-// 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
- }
-}
+++ /dev/null
-//
-// 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 []
- }
-}
+++ /dev/null
-//
-// 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"
-
-
-}
+++ /dev/null
-//
-// 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
- }
-}