From: liangzhenying <867174124@qq.com> Date: Wed, 15 Oct 2025 09:53:21 +0000 (+0800) Subject: 登录注册修改密码接口修改 X-Git-Tag: 1.0.2~90 X-Git-Url: http://git.snicker.com.cn/sitemap.xml?a=commitdiff_plain;h=578de4a7dc4832fd2063d71d0abc5f0b1eaa7085;p=mirrors%2FShenYin.git 登录注册修改密码接口修改 --- diff --git a/ShenYin/ShenYin/Api/Config.swift b/ShenYin/ShenYin/Api/Config.swift new file mode 100644 index 0000000..7172427 --- /dev/null +++ b/ShenYin/ShenYin/Api/Config.swift @@ -0,0 +1,13 @@ +// +// Config.swift +// ShenYin +// +// Created by liangshi on 2025/10/15. +// + +class Config{ + static let privacyUrl = "https://app-api.deepchords.com/cmp-page/privacy.html" + static let userUrl = "https://app-api.deepchords.com/cmp-page/user.html" + + static var appLanguage = AppSupportLanguage.chinse +} diff --git a/ShenYin/ShenYin/Api/HttpClient2.swift b/ShenYin/ShenYin/Api/HttpClient2.swift index cb99eba..b1d45e5 100644 --- a/ShenYin/ShenYin/Api/HttpClient2.swift +++ b/ShenYin/ShenYin/Api/HttpClient2.swift @@ -21,14 +21,16 @@ enum RequestMethod{ enum CommomApi { /// 获取验证码 - case sms(phone:String,type:SmsType) + case sms(account:String,type:SmsType) /// 获取国家 case countryList case list(pageNO: Int = 1, pageSize: Int = 10) /// 注册 case register(param:[String:Any]) - /// 验证码登录 - case smsLogin(param:[String:Any]) + /// 手机验证码登录 + case phoneCodeLogin(param:[String:Any]) + /// 邮箱验证码登录 + case emailCodeLogin(param:[String:Any]) /// 登录 case login(param:[String:Any]) /// 注销 @@ -37,7 +39,10 @@ enum CommomApi case updatePwd(param:[String:Any]) /// 检查令牌 case token - + /// 更新手机号码 + case updatePhone(param:[String:Any]) + /// 更新邮箱 + case updateEmail(param:[String:Any]) /// 更新用户信息 case updateUserInfo(param:[String:Any]) /// 获取用户存储空间 @@ -48,6 +53,8 @@ enum CommomApi case musicCategoryList(categoryId:String,page:Int) /// 获取音乐地址 case musicUrl(filedId:String) + /// 上传图片 + case uploadImage(param:[String:Any]) } // 实现TargetType协议 @@ -68,16 +75,18 @@ extension CommomApi{ /// 请求路径 var path: String { switch self { - case .sms(_,_): - return "/uc/sms" + case .sms(let account,let type): + return "/uc/code?account=\(account)&type=\(type.value)" case .countryList: return "/uc/country/list" case .list: return "list" case .register( let param): return "/uc/sign-up?smsCode=\(param["smsCode"]!)" - case .smsLogin(_): + case .phoneCodeLogin(_): return "/uc/phone/sms-login" + case .emailCodeLogin(_): + return "/uc/email/login" case .login(_): return "/uc/sign-in" case .deactivate: @@ -86,8 +95,22 @@ extension CommomApi{ return "/uc/reset" case .token: return "/uc/token" - case .updateUserInfo(_): - return "/uc/userinfo" + case .updatePhone(let param): + return "/uc/phone?smsCode=\(param["smsCode"]!)&phone=\(param["phone"]!)" + case .updateEmail(let param): + return "/uc/email?emailCode=\(param["emailCode"]!)&email=\(param["email"]!)" + case .updateUserInfo(let param): + var path = "/uc/userinfo?" + if let username = param["username"]{ + path += "username=\(username)&" + } + if let gender = param["gender"]{ + path += "gender=\(gender)&" + } + if let countyId = param["countryId"]{ + path += "countyId=\(countyId)" + } + return path case .storageSize: return "/res/voice-file/storage-size" case .musicCategory: @@ -96,14 +119,16 @@ extension CommomApi{ return "/res/sleep-music/list/\(page)?categoryId=\(categoryId)" case .musicUrl( let id): return "/res/music-file/path/\(id)" + case .uploadImage(_): + return "/res/image" } } var method:RequestMethod{ switch self { - case .register(_),.smsLogin(_),.login(_): + case .register(_),.phoneCodeLogin(_),.emailCodeLogin(_),.login(_): return .post - case .updatePwd(_),.updateUserInfo(_): + case .updatePwd(_),.updateUserInfo(_),.updatePhone(_),.updateEmail(_): return .put default: return .get @@ -124,15 +149,18 @@ extension CommomApi{ // 收集参数 switch self { - case let .sms(phone, type): - params["phone"] = phone - params["type"] = type.value +// case let .sms(phone, type): +// params["phone"] = phone +// params["type"] = type.value case let .list(pageNO, pageSize): params["pageNO"] = pageNO params["pageSize"] = pageSize case let .register(para): params += para - case let .smsLogin(para): + case let .phoneCodeLogin(para): + params += para + break + case let .emailCodeLogin(para): params += para break case let .login(para): @@ -144,6 +172,9 @@ extension CommomApi{ case let .updateUserInfo(para): params += para break + case let .uploadImage(para): + params += para + break default: break } @@ -185,6 +216,28 @@ class HttpClient{ } } + static func uploadImage(_ target: CommomApi,completionHandler:@escaping ((T, String) -> Void)) { + Logger.debug("request => ",target.url) + guard let fileUrl = target.param["fileUrl"] as? URL else { + Logger.debug("后",target.param) + return + } + if FileManager.default.fileExists(atPath: fileUrl.path){ + Logger.debug("文件存在") + } + else{ + Logger.debug("文件不存在") + } + Logger.debug(fileUrl) + let type = target.param["type"] + let request = HTTP.POST(target.url, parameters: ["type": type, "image": Upload(fileUrl: fileUrl)]) { response in + handleResponse(response, completionHandler: completionHandler) + } + request?.progress = { progress in + Logger.debug("上传进度: \(progress)%") + } + } + static func download(url:String,fileId:String,completionHandler:@escaping ((String?) -> Void)){ Logger.debug("dowload => ",url) if let request = URLRequest(urlString:url) { diff --git a/ShenYin/ShenYin/Api/LanConfig.swift b/ShenYin/ShenYin/Api/LanConfig.swift new file mode 100644 index 0000000..904b077 --- /dev/null +++ b/ShenYin/ShenYin/Api/LanConfig.swift @@ -0,0 +1,125 @@ +// +// LangConfig.swift +// ShenYin +// +// Created by liangshi on 2025/10/15. +// + +enum AppSupportLanguage{ + case chinse + case english + case japanese + case korean + case french + case spanish + case portuguese + case indonesian + case russian + case malay + + static var all:[AppSupportLanguage]{ + return [.chinse,.english,.japanese,.korean,.french,.spanish,.portuguese,.indonesian,.russian,.malay] + } + var title:String{ + switch self { + case .chinse: + return "中文" + case .english: + return "英文" + case .japanese: + return "日文" + case .korean: + return "韩文" + case .french: + return "法语" + case .spanish: + return "西班牙文" + case .portuguese: + return "葡萄牙文" + case .indonesian: + return "印度尼西亚文" + case .russian: + return "俄文" + case .malay: + return "马来文" + } + } + var map:[String:String]{ + switch self { + case .chinse: + return englishMap + case .english: + return englishMap + case .japanese: + return japaneseMap + case .korean: + return koreanMap + case .french: + return frenchMap + case .spanish: + return spanishMap + case .portuguese: + return portugueseMap + case .indonesian: + return indonesianMap + case .russian: + return russianMap + case .malay: + return malayMap + } + } +} + +let chineseMap:[String:String] = [ + "登录" : "login", + "注册" : "register", +] +let englishMap:[String:String] = [ + "登录" : "login", + "注册" : "register", +] +let japaneseMap:[String:String] = [ + "登录" : "login", + "注册" : "register", +] +let koreanMap:[String:String] = [ + "登录" : "login", + "注册" : "register", +] +let frenchMap:[String:String] = [ + "登录" : "login", + "注册" : "register", +] +let spanishMap:[String:String] = [ + "登录" : "login", + "注册" : "register", +] +let portugueseMap:[String:String] = [ + "登录" : "login", + "注册" : "register", +] +let indonesianMap:[String:String] = [ + "登录" : "login", + "注册" : "register", +] +let russianMap:[String:String] = [ + "登录" : "login", + "注册" : "register", +] +let malayMap:[String:String] = [ + "登录" : "login", + "注册" : "register", +] + +extension String{ + var l10n:String{ + if let value = Config.appLanguage.map[self] { + return value + } + else{ + return self + } + } +} + + diff --git a/ShenYin/ShenYin/Tools/Extensions/UIImage+Develop.swift b/ShenYin/ShenYin/Tools/Extensions/UIImage+Develop.swift index d64deb2..d63766d 100644 --- a/ShenYin/ShenYin/Tools/Extensions/UIImage+Develop.swift +++ b/ShenYin/ShenYin/Tools/Extensions/UIImage+Develop.swift @@ -263,3 +263,181 @@ public extension YCDevelop where Base: UIImage { // } // } //} +import UIKit + +extension UIImage { + + static func resizeImage(image:UIImage, toWidth maxWidth: CGFloat) -> UIImage? { + + // 获取图片原始尺寸 + let originalSize = image.size + + // 计算缩放比例 + let scaleFactor = maxWidth / originalSize.width + let newWidth = maxWidth + let newHeight = maxWidth + + // 创建一个新的位图上下文 + UIGraphicsBeginImageContextWithOptions(CGSize(width: newWidth, height: newHeight), false, 1) + + // 将原图绘制到上下文中 + image.draw(in: CGRect(x: 0, y: 0, width: newWidth, height: newHeight)) + + // 从上下文中获取新图像 + guard let resizedImage = UIGraphicsGetImageFromCurrentImageContext() else { + return nil // 如果发生错误,返回nil + } + // 结束上下文 + UIGraphicsEndImageContext() + guard let path1 = BMutilis.saveImg(resizedImage) else {return nil} + return UIImage(contentsOfFile: path1) + } + func resizeAndCropToCircle(image: UIImage, diameter: CGFloat) -> UIImage? { + // 创建一个正方形区域 + let size = CGSize(width: diameter, height: diameter) + + // 开始图形上下文 (透明背景) + UIGraphicsBeginImageContextWithOptions(size, false, 0) + defer { UIGraphicsEndImageContext() } + + guard let context = UIGraphicsGetCurrentContext() else { return nil } + + // 创建圆形路径 + let circlePath = UIBezierPath(roundedRect: CGRect(origin: .zero, size: size), cornerRadius: diameter / 2) + + // 设置裁剪区域 + circlePath.addClip() + context.addPath(circlePath.cgPath) + + // 计算等比缩放的图像位置 + let originalSize = image.size + let scale = diameter / max(originalSize.width, originalSize.height) + let scaledWidth = originalSize.width * scale + let scaledHeight = originalSize.height * scale + let x = (diameter - scaledWidth) / 2 + let y = (diameter - scaledHeight) / 2 + + // 绘制图像 (自动保持宽高比) + image.draw(in: CGRect(x: x, y: y, width: scaledWidth, height: scaledHeight)) + + // 获取裁剪后的圆形图像 + return UIGraphicsGetImageFromCurrentImageContext() + } + + func croppedToCircle() -> UIImage? { + let squareSize = min(size.width, size.height) + let squareRect = CGRect( + x: (size.width - squareSize) / 2, + y: (size.height - squareSize) / 2, + width: squareSize, + height: squareSize + ) + + UIGraphicsBeginImageContextWithOptions(CGSize(width: squareSize, height: squareSize), false, scale) + defer { UIGraphicsEndImageContext() } + + guard let context = UIGraphicsGetCurrentContext(), + let cgImage = cgImage?.cropping(to: CGRect( + x: squareRect.origin.x * scale, + y: squareRect.origin.y * scale, + width: squareSize * scale, + height: squareSize * scale + )) else { return nil } + + // 创建圆形路径并裁剪 + let path = UIBezierPath(roundedRect: CGRect(x: 0, y: 0, width: squareSize, height: squareSize), cornerRadius: squareSize / 2) + path.addClip() + + // 绘制图像到上下文 + context.draw(cgImage, in: CGRect(x: 0, y: 0, width: squareSize, height: squareSize)) + + return UIGraphicsGetImageFromCurrentImageContext() + } + + + /// 判断图片是否超过指定大小并压缩到目标大小以下 + /// - Parameters: + /// - targetSize: 目标大小(以字节为单位),默认值为 1MB + /// - Returns: 压缩后的图片数据,如果压缩失败则返回原始图片数据 + func compressIfNeeded(to targetSize: Int = 1 * 1024 * 1024) -> UIImage? { + guard let originalData = self.jpegData(compressionQuality: 1.0) else { + return nil + } + + // 如果图片已经小于目标大小,直接返回原始数据 + if originalData.count <= targetSize { + return self + } + + // 二分查找合适的压缩质量 + var low: CGFloat = 0.0 + var high: CGFloat = 1.0 + var bestData = originalData + var bestQuality: CGFloat = 1.0 + + // 最多尝试10次,避免无限循环 + for _ in 0..<10 { + let mid = (low + high) / 2 + guard let compressedData = self.jpegData(compressionQuality: mid) else { + break + } + + if compressedData.count <= targetSize { + // 记录当前符合条件的结果 + bestData = compressedData + bestQuality = mid + // 尝试更高的质量 + low = mid + } else { + // 尝试更低的质量 + high = mid + } + + // 如果质量变化很小,认为已经找到最优解 + if high - low < 0.01 { + break + } + } + + return UIImage(data: bestData) + } + + // 直接压缩到1MB以下的便捷方法 + func compressTo1MB() -> UIImage? { + return compressIfNeeded() + } + func compressImg() -> UIImage? { + return compressIfNeeded(to: 1024*200) + } +} + +class BMutilis { + 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 { + print("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/Tools/LogManager.swift b/ShenYin/ShenYin/Tools/LogManager.swift index 073bd11..5ae693a 100644 --- a/ShenYin/ShenYin/Tools/LogManager.swift +++ b/ShenYin/ShenYin/Tools/LogManager.swift @@ -25,7 +25,7 @@ class Logger { private func getPath()->String{ - let foldPath = NSHomeDirectory() + "/Documents/MixSdk/" + let foldPath = NSHomeDirectory() + "/Documents" let fileManager = FileManager.default if !fileManager.fileExists(atPath: foldPath) { do { @@ -46,9 +46,9 @@ extension Logger { static func debug(_ logs: Any..., line: Int = #line, separator: String = " ", terminator: String = "\n") { objc_sync_enter(Logger.shared) if Logger.isDebug { - print(Logger.shared.dateString, terminator: " [MixSdk-\(String(format: "%03d", line))]: ") + print(Logger.shared.dateString, terminator: " [DeepChords-\(String(format: "%03d", line))]: ") print(logs, separator: separator, terminator: terminator) - let logString = Logger.shared.dateString + " [MixSdk-\(String(format: "%03d", line))]: " + logs.map({ "\($0)" }).joined(separator: separator) + terminator + let logString = Logger.shared.dateString + " [DeepChords-\(String(format: "%03d", line))]: " + logs.map({ "\($0)" }).joined(separator: separator) + terminator Self.logs.append(logString) Logger.shared.saveLog(log: logString) } diff --git a/ShenYin/ShenYin/UI/Base/BaseTC.swift b/ShenYin/ShenYin/UI/Base/BaseTC.swift index 383c318..afa86ac 100644 --- a/ShenYin/ShenYin/UI/Base/BaseTC.swift +++ b/ShenYin/ShenYin/UI/Base/BaseTC.swift @@ -55,6 +55,6 @@ class BaseTC:UITabBarController{ self.tabBar.backgroundColor = .white view.backgroundColor = .color(.bgColor) - self.selectedIndex = 2 + self.selectedIndex = 4 } } diff --git a/ShenYin/ShenYin/UI/Launch/AppLaunch.swift b/ShenYin/ShenYin/UI/Launch/AppLaunch.swift index de4a113..0b47d5f 100644 --- a/ShenYin/ShenYin/UI/Launch/AppLaunch.swift +++ b/ShenYin/ShenYin/UI/Launch/AppLaunch.swift @@ -10,7 +10,7 @@ import IQKeyboardManagerSwift import netfox class AppLaunch:NSObject{ @MainActor static func start(){ - NFX.sharedInstance().start() +// NFX.sharedInstance().start() JoySdkManager.shared.setupSdk() setupKeyboard() diff --git a/ShenYin/ShenYin/UI/Launch/AppManager.swift b/ShenYin/ShenYin/UI/Launch/AppManager.swift index 500ac80..afd8487 100644 --- a/ShenYin/ShenYin/UI/Launch/AppManager.swift +++ b/ShenYin/ShenYin/UI/Launch/AppManager.swift @@ -31,7 +31,23 @@ class App{ func popPage(){ topVC().navigationController?.popViewController(animated: true) } - + func popToViewController(_ vc:UIViewController){ + let vcs = topVC().navigationController?.viewControllers ?? [] + for item in vcs { + if vc == item { + topVC().navigationController?.popToViewController(item, animated: true) + } + } + } + func popToPage(num:Int){ + guard let vcs = topVC().navigationController?.viewControllers else{ + return + } + let index = vcs.count - num - 1 + if vcs.count > index { + topVC().navigationController?.popToViewController(vcs[index], animated: true) + } + } } extension App{ private func getTopViewController(from vc: UIViewController) -> UIViewController { diff --git a/ShenYin/ShenYin/UI/Mine/AboutVC.swift b/ShenYin/ShenYin/UI/Mine/AboutVC.swift index a08c322..5d87b7a 100644 --- a/ShenYin/ShenYin/UI/Mine/AboutVC.swift +++ b/ShenYin/ShenYin/UI/Mine/AboutVC.swift @@ -59,7 +59,19 @@ extension AboutVC:UITableViewDelegate,UITableViewDataSource { } func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { let data = list[indexPath.row] - + if data == .privacyPolicy{ + let param = BaseWebViewParams(urlStr: Config.privacyUrl) + let vc = BaseWebViewController(initData: param) + App.shared.goToPage(vc) + } + else if data == .userAgreement{ + let param = BaseWebViewParams(urlStr: Config.userUrl) + let vc = BaseWebViewController(initData: param) + App.shared.goToPage(vc) + } + else if data == .update{ + + } } } @@ -78,7 +90,7 @@ class AboutHeaderView: BaseView { v.textColor = .hexString("#666666") v.font = .regular(14) v.textAlignment = .left - v.text = "当前版本:2.1.1" + v.text = "当前版本:\(Bundle.main.appVersion ?? "") " } } @@ -96,3 +108,14 @@ class AboutHeaderView: BaseView { } } + + +extension Bundle { + var appVersion: String? { + return infoDictionary?["CFBundleShortVersionString"] as? String + } + + var appBuild: String? { + return infoDictionary?["CFBundleVersion"] as? String + } +} diff --git a/ShenYin/ShenYin/UI/Mine/AccountSetVC.swift b/ShenYin/ShenYin/UI/Mine/AccountSetVC.swift index c4510ad..1a30692 100644 --- a/ShenYin/ShenYin/UI/Mine/AccountSetVC.swift +++ b/ShenYin/ShenYin/UI/Mine/AccountSetVC.swift @@ -7,6 +7,7 @@ import UIKit class AccountSetVC: BaseVC{ + let header = AccountSetHeaderView(frame: CGRect(x: 0, y: 0, width: kScreenWid, height: 50)) let tableView = UITableView(frame: .zero, style: .plain) let list:[(title:String,list:[CustomCellType])] = [("登录方式",[.account,.phone,.email,.thirdLogin]),] @@ -25,12 +26,9 @@ class AccountSetVC: BaseVC{ v.separatorStyle = .none v.register(CustomCell1.self, forCellReuseIdentifier: CustomCell1.reuseID) v.register(CustomSectionHeader.self, forHeaderFooterViewReuseIdentifier: CustomSectionHeader.reuseID) - v.tableHeaderView = AccountSetHeaderView(frame: CGRect(x: 0, y: 0, width: kScreenWid, height: 50)) - + v.tableHeaderView = header } - - view.addSubview(tableView) } override func setupLayout() { @@ -39,6 +37,12 @@ class AccountSetVC: BaseVC{ make.top.equalTo(kNavBtm) } } + override func viewWillAppear(_ animated: Bool) { + super.viewWillAppear(animated) + CacheManager.shared.tokenIsValid(){[weak self] in + self?.header.updateUI() + } + } } extension AccountSetVC:UITableViewDelegate,UITableViewDataSource { @@ -73,7 +77,7 @@ extension AccountSetVC:UITableViewDelegate,UITableViewDataSource { let data = list[indexPath.section].list[indexPath.row] switch data { case .account: - App.shared.goToPage(SetAccountVC()) + App.shared.goToPage(ForgetVC(type: .reset)) case .phone: App.shared.goToPage(SetPhoneVC()) case .email: @@ -98,35 +102,42 @@ class AccountSetHeaderView: BaseView { icon.do { v in v.image = UIImage(named: "head") - v.yc.setCornerRadius(27) + v.yc.setCornerRadius(25) v.backgroundColor = .black.withAlphaComponent(0.1) } titleLabel.do { (v) in v.textColor = .rgb(0x121212) v.font = .regular(20) v.textAlignment = .left - v.text = "Juliaxxxx" } valueLabel.do { (v) in v.textColor = .rgb(0x666666) v.font = .regular(14) v.textAlignment = .left - v.text = "手机号:+86 134****4811" } nextIcon.image = UIImage(named: "arrow_next") yc.addTap(target: self, action: #selector(tapAction)) + + updateUI() + } + + func updateUI(){ + titleLabel.text = CacheManager.shared.user.info.userName + icon.kf.setImage(with:CacheManager.shared.user.info.avatar.yc.asUrl ) + valueLabel.text = CacheManager.shared.user.info.phone } override func setupLayout() { icon.snp.makeConstraints { (m) in - m.width.equalTo(54) - m.height.equalTo(54) + m.width.equalTo(50) + m.height.equalTo(50) m.left.equalToSuperview().inset(15) m.top.equalToSuperview() } titleLabel.snp.makeConstraints { (m) in m.top.equalToSuperview().inset(5) m.left.equalTo(icon.snp.right).offset(15) + m.right.equalToSuperview().inset(40) } valueLabel.snp.makeConstraints { (m) in m.bottom.equalToSuperview().inset(5) diff --git a/ShenYin/ShenYin/UI/Mine/Login/Controller/ForgetVC.swift b/ShenYin/ShenYin/UI/Mine/Login/Controller/ForgetVC.swift index 4322ec1..75bc6b3 100644 --- a/ShenYin/ShenYin/UI/Mine/Login/Controller/ForgetVC.swift +++ b/ShenYin/ShenYin/UI/Mine/Login/Controller/ForgetVC.swift @@ -7,6 +7,11 @@ import UIKit +enum ForgetVCType{ + case forget + case reset +} + class ForgetVC:BaseVC{ let tipsLabel = UILabel() @@ -18,6 +23,13 @@ class ForgetVC:BaseVC{ let loginBtn = CustomButton() let agreeView = AgreeView() + var type = ForgetVCType.forget + + init(type:ForgetVCType) { + self.type = type + super.init() + } + override func viewDidLoad() { super.viewDidLoad() } @@ -42,12 +54,13 @@ class ForgetVC:BaseVC{ v.yc.setCorners(withRoundedRect: CGRect(x: 0, y: 0, width: kScreenWid, height: kScreenHei - 244), roundingCorners: [.topLeft,.topRight], cornerRadii: CGSize(width: 50, height: 50)) } titleLabel.do { v in - v.text = "忘记密码" + v.text = self.type == .forget ? "忘记密码":"重置密码" v.font = .medium(18) v.textColor = .hexString("#121212") } phoneView.do { v in -// v.textField.text = "13480939445" + v.textField.placeholder = "请输入手机号码/邮箱" + } codeView.do { v in v.codeButton.addTarget(self, action: #selector(codeButtonAction), for: .touchUpInside) @@ -110,7 +123,7 @@ extension ForgetVC{ return } YLprogressHUD.showLoading() - HttpClient.request(CommomApi.sms(phone: text,type: .forget)) {[weak self] (model:ResponseBaseModel, res) in + HttpClient.request(CommomApi.sms(account: text,type: .forget)) {[weak self] (model:ResponseBaseModel, res) in if model.isSuccess{ self?.codeView.codeButton.start() } @@ -140,10 +153,10 @@ extension ForgetVC{ } var params:[String:Any] = [:] - params["phone"] = phone + params["account"] = phone params["password"] = encryptedText params["nonce"] = iv - params["smsCode"] = code + params["code"] = code let api = CommomApi.updatePwd(param: params) HttpClient.request(api) { (result:ResponseBaseModel,res) in diff --git a/ShenYin/ShenYin/UI/Mine/Login/Controller/LoginVC.swift b/ShenYin/ShenYin/UI/Mine/Login/Controller/LoginVC.swift index 6748b47..a862d0f 100644 --- a/ShenYin/ShenYin/UI/Mine/Login/Controller/LoginVC.swift +++ b/ShenYin/ShenYin/UI/Mine/Login/Controller/LoginVC.swift @@ -24,7 +24,7 @@ class LoginVC:BaseVC{ } override func setupViews(){ // self.navBar.title = "" -// navBar.isHidden = true + navBar.isHidden = true view.backgroundColor = .color(.bgColor) tipsLabel.do { v in v.numberOfLines = 0 @@ -50,6 +50,7 @@ class LoginVC:BaseVC{ } phoneView.do { v in // v.textField.text = "13480939445" + v.textField.placeholder = "请输入手机号码/邮箱" } pwdView.do { v in v.textField.placeholder = "请输入密码" diff --git a/ShenYin/ShenYin/UI/Mine/Login/Controller/RegisterVC.swift b/ShenYin/ShenYin/UI/Mine/Login/Controller/RegisterVC.swift index feca6a1..035bb69 100644 --- a/ShenYin/ShenYin/UI/Mine/Login/Controller/RegisterVC.swift +++ b/ShenYin/ShenYin/UI/Mine/Login/Controller/RegisterVC.swift @@ -113,7 +113,7 @@ class RegisterVC:BaseVC{ } } func updateLayout(){ - if regionView.region.name == "中国"{ + if regionView.region.isChinese{ phoneView.textField.placeholder = "请输入手机号码" } else{ @@ -129,7 +129,7 @@ extension RegisterVC{ return } YLprogressHUD.showLoading() - HttpClient.request(CommomApi.sms(phone: text,type: .reg)) {[weak self] (model:ResponseBaseModel, res) in + HttpClient.request(CommomApi.sms(account: text,type: .reg)) {[weak self] (model:ResponseBaseModel, res) in if model.isSuccess{ self?.codeView.codeButton.start() } @@ -167,8 +167,7 @@ extension RegisterVC{ // Logger.debug("Decrypted: \(decryptedText)") // } var params:[String:Any] = [:] - params["phone"] = phone - params["userName"] = Device.current.name + params["account"] = phone params["password"] = encryptedText params["nonce"] = iv params["smsCode"] = code diff --git a/ShenYin/ShenYin/UI/Mine/Login/Controller/SetAccountVC.swift b/ShenYin/ShenYin/UI/Mine/Login/Controller/SetAccountVC.swift deleted file mode 100644 index 046e4ed..0000000 --- a/ShenYin/ShenYin/UI/Mine/Login/Controller/SetAccountVC.swift +++ /dev/null @@ -1,75 +0,0 @@ -// -// SetAccountVC.swift -// ShenYin -// -// Created by liangshi on 2025/8/25. -// - -import UIKit - -class SetAccountVC:BaseVC{ - - let titleLabel = UILabel() - let phoneView = CodeView() - let loginBtn = CustomButton() - var phone = "+86 134****4811" - - override func viewDidLoad() { - super.viewDidLoad() - } - override func setupViews(){ - self.navBar.title = "账号设置" - view.backgroundColor = .color(.bgColor) - - titleLabel.do { v in - v.text = "请使用安全手机\(phone)获取验证码短信" - v.font = .medium(18) - v.textColor = .hexString("#121212") - v.numberOfLines = 0 - } - phoneView.do { v in - - } - loginBtn.set(title: "确定",style: .theme1, target: self, action: #selector(loginAction)) - view.addSubviews([titleLabel,phoneView,loginBtn]) - - } - override func setupLayout(){ - - titleLabel.snp.makeConstraints { make in - make.top.equalToSuperview().offset(kNavBtm + 30) - make.left.right.equalToSuperview().inset(36) - } - phoneView.snp.makeConstraints { make in - make.top.equalTo(titleLabel.snp.bottom).offset(16) - make.left.right.equalToSuperview().inset(36) - } - - loginBtn.snp.makeConstraints { make in - make.top.equalTo(phoneView.snp.bottom).offset(40) - make.left.right.equalToSuperview().inset(51) - make.height.equalTo(55) - } - - } - -} - -extension SetAccountVC{ - - @objc func loginAction(){ - guard let pwd1 = phoneView.textField.value else{ - YLprogressHUD.showAutoHiden("请输入验证码") - return - } - // YLprogressHUD.showLoading() - // LoginVM.login(phone: phone, code: code) {[weak self] result in - // if result.isSuccess{ - // YLprogressHUD.showSuccess { - // self?.view.window?.rootViewController = BaseTC() - // } - // } - // YLprogressHUD.showAutoHiden(result.msg) - // } - } -} diff --git a/ShenYin/ShenYin/UI/Mine/Login/Controller/SetEmailVC.swift b/ShenYin/ShenYin/UI/Mine/Login/Controller/SetEmailVC.swift index 1b45395..88f286d 100644 --- a/ShenYin/ShenYin/UI/Mine/Login/Controller/SetEmailVC.swift +++ b/ShenYin/ShenYin/UI/Mine/Login/Controller/SetEmailVC.swift @@ -54,20 +54,12 @@ class SetEmailVC:BaseVC{ } extension SetEmailVC{ - @objc func loginAction(){ - guard let pwd1 = phoneView.textField.value else{ + guard let text = phoneView.textField.value else{ YLprogressHUD.showAutoHiden("请输入邮箱地址") return } - // YLprogressHUD.showLoading() - // LoginVM.login(phone: phone, code: code) {[weak self] result in - // if result.isSuccess{ - // YLprogressHUD.showSuccess { - // self?.view.window?.rootViewController = BaseTC() - // } - // } - // YLprogressHUD.showAutoHiden(result.msg) - // } + + App.shared.goToPage(VerifyEmailVC(email: text)) } } diff --git a/ShenYin/ShenYin/UI/Mine/Login/Controller/SetPhoneVC.swift b/ShenYin/ShenYin/UI/Mine/Login/Controller/SetPhoneVC.swift index a86fa39..f58c79b 100644 --- a/ShenYin/ShenYin/UI/Mine/Login/Controller/SetPhoneVC.swift +++ b/ShenYin/ShenYin/UI/Mine/Login/Controller/SetPhoneVC.swift @@ -54,20 +54,11 @@ class SetPhoneVC:BaseVC{ } extension SetPhoneVC{ - @objc func loginAction(){ - guard let pwd1 = phoneView.textField.value else{ - YLprogressHUD.showAutoHiden("请输入密码") + guard let phone = phoneView.textField.value else{ + YLprogressHUD.showAutoHiden("请输入手机号码") return } - // YLprogressHUD.showLoading() - // LoginVM.login(phone: phone, code: code) {[weak self] result in - // if result.isSuccess{ - // YLprogressHUD.showSuccess { - // self?.view.window?.rootViewController = BaseTC() - // } - // } - // YLprogressHUD.showAutoHiden(result.msg) - // } + App.shared.goToPage(VerifyPhoneVC(phone: phone)) } } diff --git a/ShenYin/ShenYin/UI/Mine/Login/Controller/SmsLoginVC.swift b/ShenYin/ShenYin/UI/Mine/Login/Controller/SmsLoginVC.swift index d0068ca..4c8d5b0 100644 --- a/ShenYin/ShenYin/UI/Mine/Login/Controller/SmsLoginVC.swift +++ b/ShenYin/ShenYin/UI/Mine/Login/Controller/SmsLoginVC.swift @@ -113,7 +113,7 @@ class SmsLoginVC:BaseVC{ } } func updateLayout(){ - if regionView.region.name == "中国"{ + if regionView.region.isChinese{ phoneView.textField.placeholder = "请输入手机号码" } else{ @@ -132,7 +132,7 @@ extension SmsLoginVC{ return } YLprogressHUD.showLoading() - HttpClient.request(CommomApi.sms(phone: text,type: .login)) {[weak self] (model:ResponseBaseModel, res) in + HttpClient.request(CommomApi.sms(account: text,type: .login)) {[weak self] (model:ResponseBaseModel, res) in if model.isSuccess{ self?.codeView.codeButton.start() } @@ -140,6 +140,14 @@ extension SmsLoginVC{ } } @objc func loginAction(){ + if regionView.region.isChinese { + phoneLogin() + } + else{ + emailLogin() + } + } + func phoneLogin(){ guard let phone = phoneView.textField.value else{ YLprogressHUD.showAutoHiden("请输入正确的手机号码") return @@ -155,8 +163,35 @@ extension SmsLoginVC{ params["deviceCode"] = CacheManager.uuid() params["smsCode"] = code params["countryId"] = regionView.region.id - - LoginVM.smsLogin(param: params) { result in + + LoginVM.phoneCodeLogin(param: params) { result in + if result.isSuccess{ + YLprogressHUD.showSuccess { + App.shared.didLogin() + } + } + YLprogressHUD.showAutoHiden(result.msg) + } + } + func emailLogin(){ + guard let email = phoneView.textField.value else{ + YLprogressHUD.showAutoHiden("请输入正确的邮箱") + return + } + guard let code = codeView.textField.value else{ + YLprogressHUD.showAutoHiden("请输入验证码") + return + } + YLprogressHUD.showLoading() + var params:[String:Any] = [:] + params["email"] = email + params["emailCode"] = code + + params["deviceName"] = Device.current.name + params["deviceCode"] = CacheManager.uuid() + params["countryId"] = regionView.region.id + + LoginVM.emailCodeLogin(param: params) { result in if result.isSuccess{ YLprogressHUD.showSuccess { App.shared.didLogin() diff --git a/ShenYin/ShenYin/UI/Mine/Login/Controller/VerifyCodeVC.swift b/ShenYin/ShenYin/UI/Mine/Login/Controller/VerifyCodeVC.swift new file mode 100644 index 0000000..ed16ab5 --- /dev/null +++ b/ShenYin/ShenYin/UI/Mine/Login/Controller/VerifyCodeVC.swift @@ -0,0 +1,130 @@ +// +// SetAccountVC.swift +// ShenYin +// +// Created by liangshi on 2025/8/25. +// + +import UIKit +class VerifyCodeVC:BaseVC{ + + let titleLabel = UILabel() + let codeView = CodeView() + let loginBtn = CustomButton() + + let pwd:String + let phone:String? + let email:String? + + init(password:String,phone:String?,email:String?) { + self.pwd = password + self.phone = phone + self.email = email + super.init() + } + + override func viewDidLoad() { + super.viewDidLoad() + } + override func setupViews(){ + self.navBar.title = "账号设置" + view.backgroundColor = .color(.bgColor) + + titleLabel.do { v in + + v.font = .medium(18) + v.textColor = .hexString("#121212") + v.numberOfLines = 0 + } + codeView.do { v in + v.codeButton.addTarget(self, action: #selector(codeButtonAction), for: .touchUpInside) + } + loginBtn.set(title: "确定",style: .theme1, target: self, action: #selector(loginAction)) + view.addSubviews([titleLabel,codeView,loginBtn]) + + + if CacheManager.shared.user.info.phone.isNotEmpty{ + titleLabel.text = "请使用安全手机\(CacheManager.shared.user.info.phone)获取验证码短信" + } + else{ + titleLabel.text = "请使用安全邮箱\(CacheManager.shared.user.info.email)获取验证码短信" + } + } + override func setupLayout(){ + + titleLabel.snp.makeConstraints { make in + make.top.equalToSuperview().offset(kNavBtm + 30) + make.left.right.equalToSuperview().inset(36) + } + codeView.snp.makeConstraints { make in + make.top.equalTo(titleLabel.snp.bottom).offset(16) + make.left.right.equalToSuperview().inset(36) + } + + loginBtn.snp.makeConstraints { make in + make.top.equalTo(codeView.snp.bottom).offset(40) + make.left.right.equalToSuperview().inset(51) + make.height.equalTo(55) + } + + } + +} + +extension VerifyCodeVC{ + @objc func codeButtonAction(){ + var text = "" + if let phone = self.phone { + text = phone + } + if let email = self.email { + text = email + } + YLprogressHUD.showLoading() + HttpClient.request(CommomApi.sms(account: text,type: .update)) {[weak self] (model:ResponseBaseModel, res) in + if model.isSuccess{ + self?.codeView.codeButton.start() + } + YLprogressHUD.showAutoHiden(model.msg) + } + } + @objc func loginAction(){ + guard let code = codeView.textField.value else{ + YLprogressHUD.showAutoHiden("请输入验证码") + return + } + let plainText = pwd + let key = Date().format(.full4) + let iv = AESEncryption.generateRandomString() + + Logger.debug("pwd: \(pwd)") + Logger.debug("iv: \(iv)") + Logger.debug("key: \(key)") + + guard let encryptedText = AESEncryption.encrypt(plainText, key: key, iv: iv) else { + return + } + Logger.debug("Encrypted: \(encryptedText)") + // if let decryptedText = AESEncryption.decrypt(encryptedText, key: key, iv: iv) { + // Logger.debug("Decrypted: \(decryptedText)") + // } + + var params:[String:Any] = [:] + params["phone"] = phone + params["password"] = encryptedText + params["nonce"] = iv + params["smsCode"] = code + + LoginVM.login(param: params) { result in + if result.isSuccess{ + YLprogressHUD.showSuccess { + App.shared.popPage() + } + } + else{ + YLprogressHUD.showAutoHiden(result.msg) + } + + } + } +} diff --git a/ShenYin/ShenYin/UI/Mine/Login/Controller/VerifyEmailVC.swift b/ShenYin/ShenYin/UI/Mine/Login/Controller/VerifyEmailVC.swift new file mode 100644 index 0000000..a646a6e --- /dev/null +++ b/ShenYin/ShenYin/UI/Mine/Login/Controller/VerifyEmailVC.swift @@ -0,0 +1,95 @@ +// +// Untitled.swift +// ShenYin +// +// Created by liangshi on 2025/10/15. +// + +import UIKit +class VerifyEmailVC:BaseVC{ + + let titleLabel = UILabel() + let codeView = CodeView() + let loginBtn = CustomButton() + + var email:String = "" + + init(email:String) { + self.email = email + super.init() + } + + override func viewDidLoad() { + super.viewDidLoad() + } + override func setupViews(){ + self.navBar.title = "账号设置" + view.backgroundColor = .color(.bgColor) + + titleLabel.do { v in + + v.font = .medium(18) + v.textColor = .hexString("#121212") + v.numberOfLines = 0 + } + codeView.do { v in + v.codeButton.addTarget(self, action: #selector(codeButtonAction), for: .touchUpInside) + } + loginBtn.set(title: "确定",style: .theme1, target: self, action: #selector(loginAction)) + view.addSubviews([titleLabel,codeView,loginBtn]) + + titleLabel.text = "请使用安全邮箱\(email)获取验证码短信" + } + override func setupLayout(){ + + titleLabel.snp.makeConstraints { make in + make.top.equalToSuperview().offset(kNavBtm + 30) + make.left.right.equalToSuperview().inset(36) + } + codeView.snp.makeConstraints { make in + make.top.equalTo(titleLabel.snp.bottom).offset(16) + make.left.right.equalToSuperview().inset(36) + } + + loginBtn.snp.makeConstraints { make in + make.top.equalTo(codeView.snp.bottom).offset(40) + make.left.right.equalToSuperview().inset(51) + make.height.equalTo(55) + } + } + override func setupData() { + codeButtonAction() + } +} + +extension VerifyEmailVC{ + @objc func codeButtonAction(){ + YLprogressHUD.showLoading() + HttpClient.request(CommomApi.sms(account: self.email,type: .update)) {[weak self] (model:ResponseBaseModel, res) in + if model.isSuccess{ + self?.codeView.codeButton.start() + } + YLprogressHUD.showAutoHiden(model.msg) + } + } + @objc func loginAction(){ + guard let code = codeView.textField.value else{ + YLprogressHUD.showAutoHiden("请输入验证码") + return + } + YLprogressHUD.showLoading() + var params:[String:Any] = [:] + params["email"] = email + params["emailCode"] = code + + let api = CommomApi.updateEmail(param: params) + HttpClient.request(api) { (result:ResponseBaseModel,res) in + if result.isSuccess{ + YLprogressHUD.showSuccess { + App.shared.popToPage(num: 2) + } + } + YLprogressHUD.showAutoHiden(result.msg) + } + } +} diff --git a/ShenYin/ShenYin/UI/Mine/Login/Controller/VerifyPhoneVC.swift b/ShenYin/ShenYin/UI/Mine/Login/Controller/VerifyPhoneVC.swift new file mode 100644 index 0000000..d91b52d --- /dev/null +++ b/ShenYin/ShenYin/UI/Mine/Login/Controller/VerifyPhoneVC.swift @@ -0,0 +1,95 @@ +// +// Untitled.swift +// ShenYin +// +// Created by liangshi on 2025/10/15. +// + +import UIKit +class VerifyPhoneVC:BaseVC{ + + let titleLabel = UILabel() + let codeView = CodeView() + let loginBtn = CustomButton() + + var phone:String = "" + + init(phone:String) { + self.phone = phone + super.init() + } + + override func viewDidLoad() { + super.viewDidLoad() + } + override func setupViews(){ + self.navBar.title = "账号设置" + view.backgroundColor = .color(.bgColor) + + titleLabel.do { v in + + v.font = .medium(18) + v.textColor = .hexString("#121212") + v.numberOfLines = 0 + } + codeView.do { v in + v.codeButton.addTarget(self, action: #selector(codeButtonAction), for: .touchUpInside) + } + loginBtn.set(title: "确定",style: .theme1, target: self, action: #selector(loginAction)) + view.addSubviews([titleLabel,codeView,loginBtn]) + + titleLabel.text = "请使用安全手机\(phone)获取验证码短信" + } + override func setupLayout(){ + + titleLabel.snp.makeConstraints { make in + make.top.equalToSuperview().offset(kNavBtm + 30) + make.left.right.equalToSuperview().inset(36) + } + codeView.snp.makeConstraints { make in + make.top.equalTo(titleLabel.snp.bottom).offset(16) + make.left.right.equalToSuperview().inset(36) + } + + loginBtn.snp.makeConstraints { make in + make.top.equalTo(codeView.snp.bottom).offset(40) + make.left.right.equalToSuperview().inset(51) + make.height.equalTo(55) + } + } + override func setupData() { + codeButtonAction() + } +} + +extension VerifyPhoneVC{ + @objc func codeButtonAction(){ + YLprogressHUD.showLoading() + HttpClient.request(CommomApi.sms(account: self.phone,type: .update)) {[weak self] (model:ResponseBaseModel, res) in + if model.isSuccess{ + self?.codeView.codeButton.start() + } + YLprogressHUD.showAutoHiden(model.msg) + } + } + @objc func loginAction(){ + guard let code = codeView.textField.value else{ + YLprogressHUD.showAutoHiden("请输入验证码") + return + } + YLprogressHUD.showLoading() + var params:[String:Any] = [:] + params["phone"] = phone + params["smsCode"] = code + + let api = CommomApi.updatePhone(param: params) + HttpClient.request(api) { (result:ResponseBaseModel,res) in + if result.isSuccess{ + YLprogressHUD.showSuccess { + App.shared.popToPage(num: 2) + } + } + YLprogressHUD.showAutoHiden(result.msg) + } + } +} diff --git a/ShenYin/ShenYin/UI/Mine/Login/View/AgreeView.swift b/ShenYin/ShenYin/UI/Mine/Login/View/AgreeView.swift index e3dab41..c87c2df 100644 --- a/ShenYin/ShenYin/UI/Mine/Login/View/AgreeView.swift +++ b/ShenYin/ShenYin/UI/Mine/Login/View/AgreeView.swift @@ -77,12 +77,12 @@ class AgreeView: BaseView { agreeBtn.isSelected = !agreeBtn.isSelected } @objc func agreementAction(){ - let param = BaseWebViewParams(urlStr: "https://www.baidu.com") + let param = BaseWebViewParams(urlStr: Config.privacyUrl) let vc = BaseWebViewController(initData: param) App.shared.goToPage(vc) } @objc func useAction(){ - let param = BaseWebViewParams(urlStr: "https://www.baidu.com") + let param = BaseWebViewParams(urlStr: Config.userUrl) let vc = BaseWebViewController(initData: param) App.shared.goToPage(vc) } diff --git a/ShenYin/ShenYin/UI/Mine/Login/View/OthersLoginView.swift b/ShenYin/ShenYin/UI/Mine/Login/View/OthersLoginView.swift index 3d8a59e..239f1c8 100644 --- a/ShenYin/ShenYin/UI/Mine/Login/View/OthersLoginView.swift +++ b/ShenYin/ShenYin/UI/Mine/Login/View/OthersLoginView.swift @@ -72,7 +72,7 @@ class OthersLoginView: BaseView { } } @objc func forgetAction(){ - App.shared.goToPage(ForgetVC()) + App.shared.goToPage(ForgetVC(type: .forget)) } @objc func registerAction(){ diff --git a/ShenYin/ShenYin/UI/Mine/Login/ViewModel/LoginVM.swift b/ShenYin/ShenYin/UI/Mine/Login/ViewModel/LoginVM.swift index 81bbaf8..f635cb9 100644 --- a/ShenYin/ShenYin/UI/Mine/Login/ViewModel/LoginVM.swift +++ b/ShenYin/ShenYin/UI/Mine/Login/ViewModel/LoginVM.swift @@ -44,8 +44,17 @@ class LoginVM:BaseVM{ completion(model) } } - static public func smsLogin(param:[String:Any], completion:@escaping (_ result:LoginModel) ->Void) { - let api = CommomApi.smsLogin(param: param) + static public func phoneCodeLogin(param:[String:Any], completion:@escaping (_ result:LoginModel) ->Void) { + let api = CommomApi.phoneCodeLogin(param: param) + HttpClient.request(api) { (model:LoginModel,res) in + if model.isSuccess{ + CacheManager.shared.login(token: model.data) + } + completion(model) + } + } + static public func emailCodeLogin(param:[String:Any], completion:@escaping (_ result:LoginModel) ->Void) { + let api = CommomApi.emailCodeLogin(param: param) HttpClient.request(api) { (model:LoginModel,res) in if model.isSuccess{ CacheManager.shared.login(token: model.data) @@ -53,7 +62,6 @@ class LoginVM:BaseVM{ completion(model) } } - static public func fetchCountryList(completion:@escaping (_ result:CountryModelRoot) ->Void) { HttpClient.request(CommomApi.countryList) { (model:CountryModelRoot, res) in if model.isSuccess{ diff --git a/ShenYin/ShenYin/UI/Mine/Login/ViewModel/UserInfo.swift b/ShenYin/ShenYin/UI/Mine/Login/ViewModel/UserInfo.swift index 232b13f..7782209 100644 --- a/ShenYin/ShenYin/UI/Mine/Login/ViewModel/UserInfo.swift +++ b/ShenYin/ShenYin/UI/Mine/Login/ViewModel/UserInfo.swift @@ -19,6 +19,7 @@ class UserInfo:ResponseBaseModel { var verify = false var countryName = "" var countryId = "" + var email = "" var genderText:String{ if gender == 1 { diff --git a/ShenYin/ShenYin/UI/Mine/Root/MineBannerView.swift b/ShenYin/ShenYin/UI/Mine/Root/MineBannerView.swift index 4137a3a..1b01804 100644 --- a/ShenYin/ShenYin/UI/Mine/Root/MineBannerView.swift +++ b/ShenYin/ShenYin/UI/Mine/Root/MineBannerView.swift @@ -42,7 +42,7 @@ final class MineBannerView: BaseView { pageControl.snp.makeConstraints { (m) in m.width.equalToSuperview() m.height.equalTo(25) - m.bottom.equalToSuperview().inset(5) + m.bottom.equalToSuperview() m.centerX.equalToSuperview() } } diff --git a/ShenYin/ShenYin/UI/Mine/Root/MineHeaderView.swift b/ShenYin/ShenYin/UI/Mine/Root/MineHeaderView.swift index df169bb..46918f9 100644 --- a/ShenYin/ShenYin/UI/Mine/Root/MineHeaderView.swift +++ b/ShenYin/ShenYin/UI/Mine/Root/MineHeaderView.swift @@ -75,6 +75,7 @@ class MineUserInfoView: BaseView { titleLabel.snp.makeConstraints { (m) in m.top.equalToSuperview().inset(10) m.left.equalToSuperview().inset(38) + m.right.equalTo(icon.snp.left).offset(-20) } deviceLabel.snp.makeConstraints { (m) in m.top.equalToSuperview().inset(60) @@ -89,12 +90,17 @@ class MineUserInfoView: BaseView { } } func updateUI(){ - titleLabel.text = CacheManager.shared.user.info.userName - icon.kf.setImage(with:CacheManager.shared.user.info.avatar.yc.asUrl ) + CacheManager.shared.tokenIsValid(){[weak self] in + guard let self = self else {return} + titleLabel.text = CacheManager.shared.user.info.userName + icon.kf.setImage(with:CacheManager.shared.user.info.avatar.yc.asUrl ) + } + } @objc func tapAction(){ - App.shared.goToPage(UserInfoVC()) +// App.shared.goToPage(UserInfoVC()) + App.shared.goToPage(AccountSetVC()) } @objc func deviceListAction(){ App.shared.goToPage(MyDeviceList()) diff --git a/ShenYin/ShenYin/UI/Mine/Root/MineNavBar.swift b/ShenYin/ShenYin/UI/Mine/Root/MineNavBar.swift index 4d1f2c9..10cd1fa 100644 --- a/ShenYin/ShenYin/UI/Mine/Root/MineNavBar.swift +++ b/ShenYin/ShenYin/UI/Mine/Root/MineNavBar.swift @@ -1,48 +1,48 @@ +//// +//// MineNavBar.swift +//// ShenYin +//// +//// Created by liangshi on 2025/7/30. +//// // -// MineNavBar.swift -// ShenYin -// -// Created by liangshi on 2025/7/30. -// - -import UIKit -class MineNavBar: BaseView { - let titleLabel = UILabel() - let messageBtn = UIButton() - let setBtn = UIButton() - - override func setupViews() { - backgroundColor = .color(.bgColor) - addSubviews([titleLabel,messageBtn,setBtn]) - - titleLabel.do { v in -// v.text = "我的" - v.font = .bold(16) - v.textColor = .white - } - setBtn.do { v in - v.setImage(UIImage(named: "mine_set"), for: .normal) - v.addTarget(self, action: #selector(setAction), for: .touchUpInside) - } - } - override func setupLayout() { - titleLabel.snp.makeConstraints { make in - make.left.equalToSuperview().inset(15) - make.bottom.equalToSuperview().inset(15) - } - setBtn.snp.makeConstraints { make in - make.centerY.equalTo(titleLabel) - make.right.equalToSuperview().inset(15) - make.size.equalTo(30) - } - } - - @objc func messageAction(){ - - } - @objc func setAction(){ - let vc = AccountSetVC() - let topVC = App.shared.topVC() - topVC?.navigationController?.pushViewController(vc, animated: true) - } -} +//import UIKit +//class MineNavBar: BaseView { +// let titleLabel = UILabel() +// let messageBtn = UIButton() +// let setBtn = UIButton() +// +// override func setupViews() { +// backgroundColor = .color(.bgColor) +// addSubviews([titleLabel,messageBtn,setBtn]) +// +// titleLabel.do { v in +//// v.text = "我的" +// v.font = .bold(16) +// v.textColor = .white +// } +// setBtn.do { v in +// v.setImage(UIImage(named: "mine_set"), for: .normal) +// v.addTarget(self, action: #selector(setAction), for: .touchUpInside) +// } +// } +// override func setupLayout() { +// titleLabel.snp.makeConstraints { make in +// make.left.equalToSuperview().inset(15) +// make.bottom.equalToSuperview().inset(15) +// } +// setBtn.snp.makeConstraints { make in +// make.centerY.equalTo(titleLabel) +// make.right.equalToSuperview().inset(15) +// make.size.equalTo(30) +// } +// } +// +// @objc func messageAction(){ +// +// } +// @objc func setAction(){ +// let vc = AccountSetVC() +// let topVC = App.shared.topVC() +// topVC?.navigationController?.pushViewController(vc, animated: true) +// } +//} diff --git a/ShenYin/ShenYin/UI/Mine/UserInfo/CustomCell1.swift b/ShenYin/ShenYin/UI/Mine/UserInfo/CustomCell1.swift index dca19e1..7367ea4 100644 --- a/ShenYin/ShenYin/UI/Mine/UserInfo/CustomCell1.swift +++ b/ShenYin/ShenYin/UI/Mine/UserInfo/CustomCell1.swift @@ -78,6 +78,7 @@ class CustomCell1: BaseTableViewCell { titleLabel.text = type.title valueIcon.isHidden = type != .avatar + if type == .nickName || type == .gender || type == .area { valueLabel.isHidden = false } @@ -95,6 +96,9 @@ class CustomCell1: BaseTableViewCell { else if type == .area { valueLabel.text = info.countryName } + else if type == .avatar{ + valueIcon.kf.setImage(with:CacheManager.shared.user.info.avatar.yc.asUrl ) + } } } @@ -117,12 +121,17 @@ class CustomCell1: BaseTableViewCell { v.backgroundColor = UIColor.white } titleLabel.do { (v) in - v.textColor = .rgb(0x121212) + v.textColor = .rgb(0x666666) v.font = .bold(14) v.textAlignment = .left } + valueLabel.do { v in + v.textColor = .rgb(0x121212) + v.font = .regular(14) + v.textAlignment = .right + } valueIcon.do { v in - v.yc.setCornerRadius(24) + v.yc.setCornerRadius(12) v.image = UIImage(named: "logo_1") v.isHidden = true } @@ -155,6 +164,7 @@ class CustomCell1: BaseTableViewCell { m.centerY.equalToSuperview() m.right.equalToSuperview().inset(38) m.height.equalToSuperview() + m.left.equalToSuperview().inset(90) } } diff --git a/ShenYin/ShenYin/UI/Mine/UserInfo/NickNameVC.swift b/ShenYin/ShenYin/UI/Mine/UserInfo/NickNameVC.swift index 74a2ed9..f41fe77 100644 --- a/ShenYin/ShenYin/UI/Mine/UserInfo/NickNameVC.swift +++ b/ShenYin/ShenYin/UI/Mine/UserInfo/NickNameVC.swift @@ -9,37 +9,28 @@ import UIKit class NickNameVC:BaseVC{ - let titleLabel = UILabel() let phoneView = CustomInputView() let loginBtn = CustomButton() + var callBack:((String)->Void)? override func viewDidLoad() { super.viewDidLoad() } override func setupViews(){ - self.navBar.title = "修改安全邮箱" + self.navBar.title = "昵称" view.backgroundColor = .color(.bgColor) - - titleLabel.do { v in - v.text = "请输入新的安全邮箱地址" - v.font = .medium(18) - v.textColor = .hexString("#121212") - } + phoneView.do { v in - v.textField.placeholder = "请输入邮箱地址" + v.textField.placeholder = "请输入昵称" } - loginBtn.set(title: "下一步",style: .theme1, target: self, action: #selector(loginAction)) - view.addSubviews([titleLabel,phoneView,loginBtn]) + loginBtn.set(title: "确定",style: .theme1, target: self, action: #selector(loginAction)) + view.addSubviews([phoneView,loginBtn]) } override func setupLayout(){ - - titleLabel.snp.makeConstraints { make in - make.top.equalToSuperview().offset(kNavBtm + 30) - make.left.right.equalToSuperview().inset(36) - } + phoneView.snp.makeConstraints { make in - make.top.equalTo(titleLabel.snp.bottom).offset(16) + make.top.equalTo(kNavBtm + 30) make.left.right.equalToSuperview().inset(36) } @@ -54,20 +45,12 @@ class NickNameVC:BaseVC{ } extension NickNameVC{ - @objc func loginAction(){ - guard let pwd1 = phoneView.textField.value else{ - YLprogressHUD.showAutoHiden("请输入邮箱地址") + guard let name = phoneView.textField.value else{ + YLprogressHUD.showAutoHiden("请输入昵称") return } - // YLprogressHUD.showLoading() - // LoginVM.login(phone: phone, code: code) {[weak self] result in - // if result.isSuccess{ - // YLprogressHUD.showSuccess { - // self?.view.window?.rootViewController = BaseTC() - // } - // } - // YLprogressHUD.showAutoHiden(result.msg) - // } + callBack?(name) + App.shared.popPage() } } diff --git a/ShenYin/ShenYin/UI/Mine/UserInfo/UserInfoVC.swift b/ShenYin/ShenYin/UI/Mine/UserInfo/UserInfoVC.swift index 0ea304f..897f96c 100644 --- a/ShenYin/ShenYin/UI/Mine/UserInfo/UserInfoVC.swift +++ b/ShenYin/ShenYin/UI/Mine/UserInfo/UserInfoVC.swift @@ -34,6 +34,11 @@ class UserInfoVC: BaseVC{ make.top.equalTo(kNavBtm) } } + override func viewWillAppear(_ animated: Bool) { + super.viewWillAppear(animated) + refreshUI() + } + } extension UserInfoVC:UITableViewDelegate,UITableViewDataSource { @@ -62,7 +67,7 @@ class UserInfoVC: BaseVC{ case .avatar: pickImageAction() case .nickName: - App.shared.goToPage(NickNameVC()) + nickNameAction() case .gender: genderAction() case .area: @@ -81,16 +86,21 @@ extension UserInfoVC{ vc.didSelected = {[weak self] model in guard let self = self else{return} CacheManager.shared.user.info.gender = model.value - tableView.reloadData() - var params:[String:Any] = [:] params["gender"] = CacheManager.shared.user.info.gender + uploadUserData(params) + } + App.shared.goToPage(vc) + } + func nickNameAction(){ + let vc = NickNameVC() + vc.callBack = {[weak self] name in + guard let self = self else{return} + CacheManager.shared.user.info.userName = name - HttpClient.request(.updateUserInfo(param: params)) { (model:ResponseBaseModel,res) in - if model.isSuccess{ - - } - } + var params:[String:Any] = [:] + params["username"] = CacheManager.shared.user.info.userName + uploadUserData(params) } App.shared.goToPage(vc) } @@ -100,28 +110,59 @@ extension UserInfoVC{ guard let self = self else{return} CacheManager.shared.user.info.countryName = model.name CacheManager.shared.user.info.countryId = model.id - tableView.reloadData() - var params:[String:Any] = [:] - params["countryId"] = model.id - - HttpClient.request(.updateUserInfo(param: params)) { (model:ResponseBaseModel,res) in - if model.isSuccess{ - - } - } + params["countryId"] = CacheManager.shared.user.info.countryId + uploadUserData(params) } App.shared.goToPage(vc) } - - - + func uploadUserData(_ params:[String:Any]){ + tableView.reloadData() + + HttpClient.request(.updateUserInfo(param: params)) {[weak self] (model:ResponseBaseModel,res) in + guard let self = self else {return} + if model.isSuccess{ + tableView.reloadData() + refreshUI() + } + } + } + @objc func pickImageAction() -> Void { imgPicker.showImagePicker(from: App.shared.topVC()) {[weak self] image in guard let self = self else { return } -// icon.image = image + guard let image = image,let img = UIImage.resizeImage(image: image, toWidth: 300) else { return } + + if let path = CacheManager.saveImg(img){ + let url = URL(fileURLWithPath: path) + startUploadImage(url) + } } } + func startUploadImage(_ path:URL){ + YLprogressHUD.showLoading() + var params:[String:Any] = [:] + params["type"] = "avatar" + params["fileUrl"] = path + let api = CommomApi.uploadImage(param: params) + HttpClient.uploadImage(api){[weak self] (model:ResponseBaseModel, res) in + if model.isSuccess{ + YLprogressHUD.hidden() + self?.refreshUI() + } + else{ + YLprogressHUD.showAutoHiden(model.msg) + } + } + } + func refreshUI(){ + CacheManager.shared.tokenIsValid(){[weak self] in + self?.tableView.reloadData() + } + + } } + + diff --git a/ShenYin/ShenYin/UI/Sleep/AudioPlayerVC.swift b/ShenYin/ShenYin/UI/Sleep/AudioPlayerVC.swift index 245433d..9a8abb5 100644 --- a/ShenYin/ShenYin/UI/Sleep/AudioPlayerVC.swift +++ b/ShenYin/ShenYin/UI/Sleep/AudioPlayerVC.swift @@ -80,7 +80,6 @@ class AudioPlayerVC:BaseVC{ } AudioPlayerManager.shared.progressCallback = {[weak self] current,duration in guard let self = self else {return} - Logger.debug(duration) slider.maximumValue = duration slider.setValue(current, animated: true) titleLabel.text = YLToos.formatSeconds1(Int(current)) diff --git a/ShenYin/ShenYin/UI/common/Cache/CacheManager.swift b/ShenYin/ShenYin/UI/common/Cache/CacheManager.swift index bf70458..373b507 100644 --- a/ShenYin/ShenYin/UI/common/Cache/CacheManager.swift +++ b/ShenYin/ShenYin/UI/common/Cache/CacheManager.swift @@ -19,7 +19,10 @@ class CacheManager{ init(){ user.loadCache() - tokenIsValid() + if user.isLogin{ + tokenIsValid() + } + } } @@ -34,7 +37,7 @@ extension CacheManager{ NotificationManager.post(type: .logout, objtect: nil) App.shared.goToLogin() } - func tokenIsValid(){ + func tokenIsValid(finished: (() -> Void)? = nil){ HttpClient.request(CommomApi.token) { [weak self](model:UserInfoRoot,res) in guard let self = self else{return} if model.isSuccess{ @@ -43,6 +46,7 @@ extension CacheManager{ else{ logout() } + finished?() } } } @@ -59,3 +63,36 @@ extension CacheManager{ 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 + } +} +