登录注册修改密码接口修改
authorliangzhenying <867174124@qq.com>
Wed, 15 Oct 2025 09:53:21 +0000 (17:53 +0800)
committerliangzhenying <867174124@qq.com>
Wed, 15 Oct 2025 09:53:21 +0000 (17:53 +0800)
32 files changed:
ShenYin/ShenYin/Api/Config.swift [new file with mode: 0644]
ShenYin/ShenYin/Api/HttpClient2.swift
ShenYin/ShenYin/Api/LanConfig.swift [new file with mode: 0644]
ShenYin/ShenYin/Tools/Extensions/UIImage+Develop.swift
ShenYin/ShenYin/Tools/LogManager.swift
ShenYin/ShenYin/UI/Base/BaseTC.swift
ShenYin/ShenYin/UI/Launch/AppLaunch.swift
ShenYin/ShenYin/UI/Launch/AppManager.swift
ShenYin/ShenYin/UI/Mine/AboutVC.swift
ShenYin/ShenYin/UI/Mine/AccountSetVC.swift
ShenYin/ShenYin/UI/Mine/Login/Controller/ForgetVC.swift
ShenYin/ShenYin/UI/Mine/Login/Controller/LoginVC.swift
ShenYin/ShenYin/UI/Mine/Login/Controller/RegisterVC.swift
ShenYin/ShenYin/UI/Mine/Login/Controller/SetAccountVC.swift [deleted file]
ShenYin/ShenYin/UI/Mine/Login/Controller/SetEmailVC.swift
ShenYin/ShenYin/UI/Mine/Login/Controller/SetPhoneVC.swift
ShenYin/ShenYin/UI/Mine/Login/Controller/SmsLoginVC.swift
ShenYin/ShenYin/UI/Mine/Login/Controller/VerifyCodeVC.swift [new file with mode: 0644]
ShenYin/ShenYin/UI/Mine/Login/Controller/VerifyEmailVC.swift [new file with mode: 0644]
ShenYin/ShenYin/UI/Mine/Login/Controller/VerifyPhoneVC.swift [new file with mode: 0644]
ShenYin/ShenYin/UI/Mine/Login/View/AgreeView.swift
ShenYin/ShenYin/UI/Mine/Login/View/OthersLoginView.swift
ShenYin/ShenYin/UI/Mine/Login/ViewModel/LoginVM.swift
ShenYin/ShenYin/UI/Mine/Login/ViewModel/UserInfo.swift
ShenYin/ShenYin/UI/Mine/Root/MineBannerView.swift
ShenYin/ShenYin/UI/Mine/Root/MineHeaderView.swift
ShenYin/ShenYin/UI/Mine/Root/MineNavBar.swift
ShenYin/ShenYin/UI/Mine/UserInfo/CustomCell1.swift
ShenYin/ShenYin/UI/Mine/UserInfo/NickNameVC.swift
ShenYin/ShenYin/UI/Mine/UserInfo/UserInfoVC.swift
ShenYin/ShenYin/UI/Sleep/AudioPlayerVC.swift
ShenYin/ShenYin/UI/common/Cache/CacheManager.swift

diff --git a/ShenYin/ShenYin/Api/Config.swift b/ShenYin/ShenYin/Api/Config.swift
new file mode 100644 (file)
index 0000000..7172427
--- /dev/null
@@ -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
+}
index cb99eba..b1d45e5 100644 (file)
@@ -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<T: HandyJSON>(_ 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 (file)
index 0000000..904b077
--- /dev/null
@@ -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
+        }
+    }
+}
+
+
index d64deb2..d63766d 100644 (file)
@@ -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
+    }
+}
index 073bd11..5ae693a 100644 (file)
@@ -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)
         }
index 383c318..afa86ac 100644 (file)
@@ -55,6 +55,6 @@ class BaseTC:UITabBarController{
         self.tabBar.backgroundColor = .white
         view.backgroundColor = .color(.bgColor)
 
-        self.selectedIndex = 2
+        self.selectedIndex = 4
     }
 }
index de4a113..0b47d5f 100644 (file)
@@ -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()
index 500ac80..afd8487 100644 (file)
@@ -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 {
index a08c322..5d87b7a 100644 (file)
@@ -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
+    }
+}
index c4510ad..1a30692 100644 (file)
@@ -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)
index 4322ec1..75bc6b3 100644 (file)
@@ -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
index 6748b47..a862d0f 100644 (file)
@@ -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 = "请输入密码"
index feca6a1..035bb69 100644 (file)
@@ -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 (file)
index 046e4ed..0000000
+++ /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)
-        //        }
-    }
-}
index 1b45395..88f286d 100644 (file)
@@ -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))
     }
 }
index a86fa39..f58c79b 100644 (file)
@@ -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))
     }
 }
index d0068ca..4c8d5b0 100644 (file)
@@ -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 (file)
index 0000000..ed16ab5
--- /dev/null
@@ -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 (file)
index 0000000..a646a6e
--- /dev/null
@@ -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 (file)
index 0000000..d91b52d
--- /dev/null
@@ -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)
+        }
+    }
+}
index e3dab41..c87c2df 100644 (file)
@@ -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)
     }
index 3d8a59e..239f1c8 100644 (file)
@@ -72,7 +72,7 @@ class OthersLoginView: BaseView {
         }
     }
     @objc func forgetAction(){
-        App.shared.goToPage(ForgetVC())
+        App.shared.goToPage(ForgetVC(type: .forget))
     }
     
     @objc func registerAction(){
index 81bbaf8..f635cb9 100644 (file)
@@ -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{
index 232b13f..7782209 100644 (file)
@@ -19,6 +19,7 @@ class UserInfo:ResponseBaseModel {
     var verify = false
     var countryName = ""
     var countryId = ""
+    var email = ""
     
     var genderText:String{
         if gender == 1 {
index 4137a3a..1b01804 100644 (file)
@@ -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()
         }
     }
index df169bb..46918f9 100644 (file)
@@ -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())
index 4d1f2c9..10cd1fa 100644 (file)
@@ -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)
+//    }
+//}
index dca19e1..7367ea4 100644 (file)
@@ -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)
         }
     }
     
index 74a2ed9..f41fe77 100644 (file)
@@ -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()
     }
 }
index 0ea304f..897f96c 100644 (file)
@@ -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()
+        }
+        
+    }
 }
+
+
index 245433d..9a8abb5 100644 (file)
@@ -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))
index bf70458..373b507 100644 (file)
@@ -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
+    }
+}
+