--- /dev/null
+//
+// 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
+}
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])
/// 注销
case updatePwd(param:[String:Any])
/// 检查令牌
case token
-
+ /// 更新手机号码
+ case updatePhone(param:[String:Any])
+ /// 更新邮箱
+ case updateEmail(param:[String:Any])
/// 更新用户信息
case updateUserInfo(param:[String:Any])
/// 获取用户存储空间
case musicCategoryList(categoryId:String,page:Int)
/// 获取音乐地址
case musicUrl(filedId:String)
+ /// 上传图片
+ case uploadImage(param:[String:Any])
}
// 实现TargetType协议
/// 请求路径
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:
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:
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
// 收集参数
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):
case let .updateUserInfo(para):
params += para
break
+ case let .uploadImage(para):
+ params += para
+ break
default:
break
}
}
}
+ 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) {
--- /dev/null
+//
+// 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
+ }
+ }
+}
+
+
// }
// }
//}
+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
+ }
+}
private func getPath()->String{
- let foldPath = NSHomeDirectory() + "/Documents/MixSdk/"
+ let foldPath = NSHomeDirectory() + "/Documents"
let fileManager = FileManager.default
if !fileManager.fileExists(atPath: foldPath) {
do {
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)
}
self.tabBar.backgroundColor = .white
view.backgroundColor = .color(.bgColor)
- self.selectedIndex = 2
+ self.selectedIndex = 4
}
}
import netfox
class AppLaunch:NSObject{
@MainActor static func start(){
- NFX.sharedInstance().start()
+// NFX.sharedInstance().start()
JoySdkManager.shared.setupSdk()
setupKeyboard()
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 {
}
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{
+
+ }
}
}
v.textColor = .hexString("#666666")
v.font = .regular(14)
v.textAlignment = .left
- v.text = "当前版本:2.1.1"
+ v.text = "当前版本:\(Bundle.main.appVersion ?? "") "
}
}
}
}
+
+
+extension Bundle {
+ var appVersion: String? {
+ return infoDictionary?["CFBundleShortVersionString"] as? String
+ }
+
+ var appBuild: String? {
+ return infoDictionary?["CFBundleVersion"] as? String
+ }
+}
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]),]
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() {
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 {
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:
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)
import UIKit
+enum ForgetVCType{
+ case forget
+ case reset
+}
+
class ForgetVC:BaseVC{
let tipsLabel = UILabel()
let loginBtn = CustomButton()
let agreeView = AgreeView()
+ var type = ForgetVCType.forget
+
+ init(type:ForgetVCType) {
+ self.type = type
+ super.init()
+ }
+
override func viewDidLoad() {
super.viewDidLoad()
}
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)
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()
}
}
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
}
override func setupViews(){
// self.navBar.title = ""
-// navBar.isHidden = true
+ navBar.isHidden = true
view.backgroundColor = .color(.bgColor)
tipsLabel.do { v in
v.numberOfLines = 0
}
phoneView.do { v in
// v.textField.text = "13480939445"
+ v.textField.placeholder = "请输入手机号码/邮箱"
}
pwdView.do { v in
v.textField.placeholder = "请输入密码"
}
}
func updateLayout(){
- if regionView.region.name == "中国"{
+ if regionView.region.isChinese{
phoneView.textField.placeholder = "请输入手机号码"
}
else{
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()
}
// 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
+++ /dev/null
-//
-// 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)
- // }
- }
-}
}
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))
}
}
}
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))
}
}
}
}
func updateLayout(){
- if regionView.region.name == "中国"{
+ if regionView.region.isChinese{
phoneView.textField.placeholder = "请输入手机号码"
}
else{
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()
}
}
}
@objc func loginAction(){
+ if regionView.region.isChinese {
+ phoneLogin()
+ }
+ else{
+ emailLogin()
+ }
+ }
+ func phoneLogin(){
guard let phone = phoneView.textField.value else{
YLprogressHUD.showAutoHiden("请输入正确的手机号码")
return
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()
--- /dev/null
+//
+// 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)
+ }
+
+ }
+ }
+}
--- /dev/null
+//
+// 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)
+ }
+ }
+}
--- /dev/null
+//
+// 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)
+ }
+ }
+}
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)
}
}
}
@objc func forgetAction(){
- App.shared.goToPage(ForgetVC())
+ App.shared.goToPage(ForgetVC(type: .forget))
}
@objc func registerAction(){
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)
completion(model)
}
}
-
static public func fetchCountryList(completion:@escaping (_ result:CountryModelRoot) ->Void) {
HttpClient.request(CommomApi.countryList) { (model:CountryModelRoot, res) in
if model.isSuccess{
var verify = false
var countryName = ""
var countryId = ""
+ var email = ""
var genderText:String{
if gender == 1 {
pageControl.snp.makeConstraints { (m) in
m.width.equalToSuperview()
m.height.equalTo(25)
- m.bottom.equalToSuperview().inset(5)
+ m.bottom.equalToSuperview()
m.centerX.equalToSuperview()
}
}
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)
}
}
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())
+////
+//// 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)
+// }
+//}
titleLabel.text = type.title
valueIcon.isHidden = type != .avatar
+
if type == .nickName || type == .gender || type == .area {
valueLabel.isHidden = false
}
else if type == .area {
valueLabel.text = info.countryName
}
+ else if type == .avatar{
+ valueIcon.kf.setImage(with:CacheManager.shared.user.info.avatar.yc.asUrl )
+ }
}
}
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
}
m.centerY.equalToSuperview()
m.right.equalToSuperview().inset(38)
m.height.equalToSuperview()
+ m.left.equalToSuperview().inset(90)
}
}
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)
}
}
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()
}
}
make.top.equalTo(kNavBtm)
}
}
+ override func viewWillAppear(_ animated: Bool) {
+ super.viewWillAppear(animated)
+ refreshUI()
+ }
+
}
extension UserInfoVC:UITableViewDelegate,UITableViewDataSource {
case .avatar:
pickImageAction()
case .nickName:
- App.shared.goToPage(NickNameVC())
+ nickNameAction()
case .gender:
genderAction()
case .area:
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)
}
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()
+ }
+
+ }
}
+
+
}
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))
init(){
user.loadCache()
- tokenIsValid()
+ if user.isLogin{
+ tokenIsValid()
+ }
+
}
}
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{
else{
logout()
}
+ finished?()
}
}
}
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
+ }
+}
+