From c1862d736587c9a5c10a368dabaeb72be2df4bcb Mon Sep 17 00:00:00 2001
From: 无故事王国 <841720330@qq.com>
Date: 星期二, 18 六月 2024 16:26:23 +0800
Subject: [PATCH] fix

---
 DolphinEnglishLearnStudent/Moudle/Home/Listen/VC/HomeListenSubVC.swift               |    2 
 DolphinEnglishLearnStudent/Moudle/Home/Listen/VC/HomeListenFightVC.swift             |   38 --
 DolphinEnglishLearnStudent/Moudle/Home/Listen/VC/HomeListenGame_1_VC.swift           |    4 
 DolphinEnglishLearnStudent/Config/VoicePlayer.swift                                  |  124 +++++++-
 DolphinEnglishLearnStudent/Config/LaunchImageHelper.swift                            |  253 ++++++++++++++++++
 DolphinEnglishLearnStudent/Moudle/Home/VC/HomeStudyCompleteVC.swift                  |    2 
 DolphinEnglishLearnStudent/Moudle/Home/HomeVC.xib                                    |    2 
 DolphinEnglishLearnStudent/Moudle/Home/Listen/VC/HomeListenFight_lesson_2_VC.swift   |   17 
 DolphinEnglishLearnStudent/Moudle/Home/Listen/VC/HomeListenFight_lesson_5_VC.swift   |    9 
 DolphinEnglishLearnStudent/Moudle/Home/HomeVC.swift                                  |   26 +
 DolphinEnglishLearnStudent/Services/Services.swift                                   |   18 +
 DolphinEnglishLearnStudent/Moudle/Home/Listen/CCell/ListenFight_lesson_3_CCell.swift |   12 
 DolphinEnglishLearnStudent/Moudle/Home/Listen/VC/HomeListenMenuVC.swift              |    7 
 DolphinEnglishLearnStudent/Moudle/Home/Listen/CCell/ListenFight_lesson_3_CCell.xib   |    8 
 DolphinEnglishLearnStudent/SceneDelegate.swift                                       |    3 
 DolphinEnglishLearnStudent/Moudle/Home/Listen/VC/HomeListenGame_2_VC.swift           |    3 
 DolphinEnglishLearnStudent/Moudle/Home/Listen/VC/HomeListenStory_1_VC.swift          |    3 
 DolphinEnglishLearnStudent/Info.plist                                                |    5 
 DolphinEnglishLearnStudent/Moudle/Home/Listen/VC/HomeListenVC.swift                  |    2 
 DolphinEnglishLearnStudent/Moudle/Home/Listen/VC/HomeListenFight_lesson_4_VC.swift   |    3 
 DolphinEnglishLearnStudent/Services/NetworkRequest.swift                             |   16 
 DolphinEnglishLearnStudent/Base/BaseVC.swift                                         |   19 -
 DolphinEnglishLearnStudent/Config/Config.swift                                       |    8 
 DolphinEnglishLearnStudent/Moudle/Me/VC/AddressManageHandleVC.xib                    |    2 
 DolphinEnglishLearnStudent/Moudle/Home/Listen/VC/HomeListenStory_2_VC.swift          |   25 -
 DolphinEnglishLearnStudent/Models/CommonModel.swift                                  |   17 +
 DolphinEnglishLearnStudent/Base/BaseNav.swift                                        |   83 -----
 DolphinEnglishLearnStudent.xcodeproj/project.pbxproj                                 |    4 
 DolphinEnglishLearnStudent/Moudle/Home/HomeListenFight_lesson_1_VC.swift             |   18 +
 DolphinEnglishLearnStudent/Moudle/Home/Listen/VC/HomeListenFight_lesson_3_VC.swift   |   99 ++++--
 30 files changed, 571 insertions(+), 261 deletions(-)

diff --git a/DolphinEnglishLearnStudent.xcodeproj/project.pbxproj b/DolphinEnglishLearnStudent.xcodeproj/project.pbxproj
index 18f94fb..b49925a 100644
--- a/DolphinEnglishLearnStudent.xcodeproj/project.pbxproj
+++ b/DolphinEnglishLearnStudent.xcodeproj/project.pbxproj
@@ -98,6 +98,7 @@
 		13CDF44F2C05756C00E8D4FD /* Lesson_4_AnswerView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 13CDF44E2C05756C00E8D4FD /* Lesson_4_AnswerView.swift */; };
 		13CDF4512C05757400E8D4FD /* Lesson_4_AnswerView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 13CDF4502C05757400E8D4FD /* Lesson_4_AnswerView.xib */; };
 		13E07DF12BFDF1E600B7F5FB /* ExchangeRecordHistoryVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = 13E07DF02BFDF1E600B7F5FB /* ExchangeRecordHistoryVC.swift */; };
+		13E99EFA2C1FD1A9004F52D4 /* LaunchImageHelper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 13E99EF92C1FD1A9004F52D4 /* LaunchImageHelper.swift */; };
 		13EEB8912BFED3F3002996FC /* AwardListView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 13EEB8902BFED3F3002996FC /* AwardListView.swift */; };
 		13EEB8932BFED3FA002996FC /* AwardListView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 13EEB8922BFED3FA002996FC /* AwardListView.xib */; };
 		13EEB8972BFF1531002996FC /* AwardListCCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 13EEB8952BFF1531002996FC /* AwardListCCell.swift */; };
@@ -208,6 +209,7 @@
 		13CDF44E2C05756C00E8D4FD /* Lesson_4_AnswerView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Lesson_4_AnswerView.swift; sourceTree = "<group>"; };
 		13CDF4502C05757400E8D4FD /* Lesson_4_AnswerView.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = Lesson_4_AnswerView.xib; sourceTree = "<group>"; };
 		13E07DF02BFDF1E600B7F5FB /* ExchangeRecordHistoryVC.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ExchangeRecordHistoryVC.swift; sourceTree = "<group>"; };
+		13E99EF92C1FD1A9004F52D4 /* LaunchImageHelper.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LaunchImageHelper.swift; sourceTree = "<group>"; };
 		13EEB8902BFED3F3002996FC /* AwardListView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AwardListView.swift; sourceTree = "<group>"; };
 		13EEB8922BFED3FA002996FC /* AwardListView.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = AwardListView.xib; sourceTree = "<group>"; };
 		13EEB8952BFF1531002996FC /* AwardListCCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AwardListCCell.swift; sourceTree = "<group>"; };
@@ -291,6 +293,7 @@
 		130278402BFD978900DDCE81 /* Config */ = {
 			isa = PBXGroup;
 			children = (
+				13E99EF92C1FD1A9004F52D4 /* LaunchImageHelper.swift */,
 				1302783E2BFD978900DDCE81 /* Config.swift */,
 				1302783F2BFD978900DDCE81 /* Enums.swift */,
 				13812B9B2C0F02B600905CCE /* VoicePlayer.swift */,
@@ -794,6 +797,7 @@
 				133386382C007E91002EE788 /* HomeListenFight_lesson_2_VC.swift in Sources */,
 				13812B9C2C0F02B700905CCE /* VoicePlayer.swift in Sources */,
 				1302787B2BFD9ED600DDCE81 /* MarketContentVC.swift in Sources */,
+				13E99EFA2C1FD1A9004F52D4 /* LaunchImageHelper.swift in Sources */,
 				13649E9C2C00304C001B04E2 /* ListenFight_lesson_1_CCell.swift in Sources */,
 				13EEB8A02BFF28A7002996FC /* HomeListenVC.swift in Sources */,
 				130278492BFD979200DDCE81 /* BaseTabBarVC.swift in Sources */,
diff --git a/DolphinEnglishLearnStudent/Base/BaseNav.swift b/DolphinEnglishLearnStudent/Base/BaseNav.swift
index fc3e54b..fe5cbce 100644
--- a/DolphinEnglishLearnStudent/Base/BaseNav.swift
+++ b/DolphinEnglishLearnStudent/Base/BaseNav.swift
@@ -11,7 +11,7 @@
 class BaseNav: UINavigationController,UINavigationControllerDelegate {
 
 				/// 需要透明Nav的VC
-				private var lucencyVCs = [HomeVC.self]
+				private var lucencyVCs = [HomeVC.self,LoginVC.self,CommonWebVC.self]
 
 				private let img = UIImage.jq_gradient(["#B6E0FF","#FFFFFF"],size: CGSize(width: JQ_ScreenW, height: 90),direction: GradientDirection.vertical)
 
@@ -51,17 +51,6 @@
 												navigationBar.setBackgroundImage(UIImage(), for: .default)
 												navigationBar.shadowImage = UIImage()
 								}
-
-//								let titleV = UIView()
-//								titleV.sizeToFit()
-//								let imgV = UIImageView(image: UIImage(named: "bg_logo"))
-//								imgV.contentMode = .scaleAspectFit
-//								titleV.addSubview(imgV)
-//								imgV.snp.makeConstraints { make in
-//												make.edges.equalToSuperview()
-//								}
-//
-//								navigationItem.titleView = titleV
 				}
 
 				open func navigationController(_ navigationController: UINavigationController, willShow viewController: UIViewController, animated: Bool) {
@@ -106,74 +95,4 @@
 				override var preferredStatusBarStyle: UIStatusBarStyle{
 								return .lightContent
 				}
-
-}
-
-
-class LoginNav: UINavigationController,UINavigationControllerDelegate {
-
-				private var popDelegate: UIGestureRecognizerDelegate?
-
-				open override func viewDidLoad() {
-								super.viewDidLoad()
-								self.navigationBar.barTintColor = .white
-								self.navigationBar.titleTextAttributes = [.font:UIFont.systemFont(ofSize: 18, weight: .medium), .foregroundColor:UIColor.black]
-								self.navigationBar.tintColor = UIColor.black
-								self.navigationBar.shadowImage = UIImage()
-								self.navigationBar.isTranslucent = true
-								self.delegate = self
-								self.popDelegate = self.interactivePopGestureRecognizer?.delegate
-
-
-								if #available(iOS 15.0, *) {
-
-												let scrollBar = UINavigationBarAppearance()
-												scrollBar.configureWithOpaqueBackground()
-												scrollBar.backgroundEffect = nil
-												scrollBar.shadowColor = nil
-												scrollBar.titleTextAttributes = [.foregroundColor:Config.ThemeColor,.font:Config.NavFont]
-												scrollBar.backgroundColor = UIColor.clear
-												//            scrollBar.backgroundImage = img
-
-
-												let standardBar = UINavigationBarAppearance()
-												standardBar.configureWithOpaqueBackground()
-												standardBar.backgroundEffect = nil
-												standardBar.shadowColor = nil
-												standardBar.shadowImage = nil
-												standardBar.titleTextAttributes = [.foregroundColor:Config.ThemeColor,.font:Config.NavFont]
-												standardBar.backgroundColor = UIColor.clear
-												//            standardBar.backgroundImage = img
-
-												navigationBar.scrollEdgeAppearance = scrollBar //顶部透明
-												navigationBar.standardAppearance = standardBar
-
-
-								}else {
-												navigationBar.titleTextAttributes = [.foregroundColor:Config.ThemeColor,.font:Config.NavFont]
-								}
-				}
-
-				open func navigationController(_ navigationController: UINavigationController, willShow viewController: UIViewController, animated: Bool) {
-
-
-				}
-
-				//侧滑
-				public func navigationController(_ navigationController: UINavigationController, didShow viewController: UIViewController, animated: Bool) {
-								if  viewController == self.viewControllers[0] {
-												self.interactivePopGestureRecognizer!.delegate = self.popDelegate
-								}else{
-												self.interactivePopGestureRecognizer!.delegate = nil
-								}
-				}
-
-				open override var childForStatusBarHidden: UIViewController? {
-								return self.topViewController
-				}
-
-				open override var childForStatusBarStyle: UIViewController? {
-								return self.topViewController
-				}
-
 }
diff --git a/DolphinEnglishLearnStudent/Base/BaseVC.swift b/DolphinEnglishLearnStudent/Base/BaseVC.swift
index 2de1e45..a87805d 100644
--- a/DolphinEnglishLearnStudent/Base/BaseVC.swift
+++ b/DolphinEnglishLearnStudent/Base/BaseVC.swift
@@ -33,15 +33,6 @@
 				override func viewDidLoad() {
 								super.viewDidLoad()
 
-//								let bgGradientImg = UIImageView(image: UIImage.jq_gradient(["#B6E0FF","#FFFFFF"],size: CGSize(width: JQ_ScreenW, height: JQ_ScreenH), direction: .vertical))
-//
-//								view.addSubview(bgGradientImg)
-//								bgGradientImg.snp.makeConstraints { make in
-//												make.top.left.right.equalToSuperview()
-//												make.height.equalTo(JQ_ScreenW * 0.46)
-//								}
-//								view.sendSubviewToBack(bgGradientImg)
-//								view.backgroundColor = .white
 
 								disposeBag = DisposeBag()
 								setUI()
@@ -60,9 +51,9 @@
 												navigationItem.leftBarButtonItem = UIBarButtonItem(customView: backButton)
 								}
 
-								if !self.isKind(of: HomeVC.self) && !self.isKind(of: HomeListenSubVC.self) && !self.isKind(of: HomeListenFight_lesson_1_VC.self) && !self.isKind(of: HomeListenFight_lesson_2_VC.self) && !self.isKind(of: HomeListenFight_lesson_3_VC.self) && !self.isKind(of: HomeListenFight_lesson_4_VC.self) && !self.isKind(of: HomeListenFight_lesson_5_VC.self) && !self.isKind(of: HomeListenGame_1_VC.self) && !self.isKind(of: HomeListenGame_2_VC.self) && !self.isKind(of: HomeListenStory_1_VC.self) && !self.isKind(of: HomeListenStory_2_VC.self){
+								if !self.isKind(of: HomeVC.self) && !self.isKind(of: HomeListenSubVC.self) && !self.isKind(of: HomeListenFight_lesson_1_VC.self) && !self.isKind(of: HomeListenFight_lesson_2_VC.self) && !self.isKind(of: HomeListenFight_lesson_3_VC.self) && !self.isKind(of: HomeListenFight_lesson_4_VC.self) && !self.isKind(of: HomeListenFight_lesson_5_VC.self) && !self.isKind(of: HomeListenGame_1_VC.self) && !self.isKind(of: HomeListenGame_2_VC.self) && !self.isKind(of: HomeListenStory_1_VC.self) && !self.isKind(of: HomeListenStory_2_VC.self) && !self.isKind(of: LoginVC.self){
 												let titleV = UIView()
-												titleV.bounds = CGRect(x: 0, y: 0, width: 156, height: 63)
+//												titleV.bounds = CGRect(x: 0, y: 0, width: 156, height: 24)
 												titleV.sizeToFit()
 												let imgV = UIImageView(image: UIImage(named: "bg_logo"))
 												imgV.contentMode = .scaleAspectFit
@@ -73,15 +64,11 @@
 
 												view.addSubview(titleV)
 												titleV.snp.makeConstraints { make in
-																make.top.equalToSuperview().offset(18)
-																make.centerX.equalToSuperview()
+																make.center.equalToSuperview()
 												}
 
 												navigationItem.titleView = titleV
-
 								}
-
-
 				}
 
 				func setRx(){
diff --git a/DolphinEnglishLearnStudent/Config/Config.swift b/DolphinEnglishLearnStudent/Config/Config.swift
index f37c501..11177b3 100644
--- a/DolphinEnglishLearnStudent/Config/Config.swift
+++ b/DolphinEnglishLearnStudent/Config/Config.swift
@@ -118,11 +118,9 @@
 																				self.isUserInteractionEnabled = true
 																});
 												}else {
-																DispatchQueue.main.async(execute: {
-																				self.setTitle("\(time)s", for: .normal)
-																				self.setTitleColor(unenableColor, for: .normal)
-																				self.isUserInteractionEnabled = false
-																});
+																self.setTitle("\(time)s", for: .normal)
+																self.setTitleColor(unenableColor, for: .normal)
+																self.isUserInteractionEnabled = false
 												}
 												time -= 1
 								});
diff --git a/DolphinEnglishLearnStudent/Config/LaunchImageHelper.swift b/DolphinEnglishLearnStudent/Config/LaunchImageHelper.swift
new file mode 100644
index 0000000..e92fc06
--- /dev/null
+++ b/DolphinEnglishLearnStudent/Config/LaunchImageHelper.swift
@@ -0,0 +1,253 @@
+//
+//  LaunchImageHelper.swift
+//  WanPai
+//
+//  Created by 无故事王国 on 2023/10/19.
+//
+
+import Foundation
+
+class LaunchImageHelper {
+	static func snapshotStoryboard(sbName: String, isPortrait: Bool) -> UIImage? {
+		if sbName.isEmpty {
+			return nil
+		}
+
+		let storyboard = UIStoryboard(name: sbName, bundle: nil)
+		guard let vc = storyboard.instantiateInitialViewController() else {
+			return nil
+		}
+
+		vc.view.frame = UIScreen.main.bounds
+		if isPortrait {
+			if vc.view.frame.size.width > vc.view.frame.size.height {
+				vc.view.frame = CGRect(x: 0, y: 0, width: vc.view.frame.size.height, height: vc.view.frame.size.width)
+			}
+		} else {
+			if vc.view.frame.size.width < vc.view.frame.size.height {
+				vc.view.frame = CGRect(x: 0, y: 0, width: vc.view.frame.size.height, height: vc.view.frame.size.width)
+			}
+		}
+
+		vc.view.setNeedsLayout()
+		vc.view.layoutIfNeeded()
+
+		UIGraphicsBeginImageContextWithOptions(vc.view.frame.size, false, UIScreen.main.scale)
+		vc.view.layer.render(in: UIGraphicsGetCurrentContext()!)
+		let image = UIGraphicsGetImageFromCurrentImageContext()
+		UIGraphicsEndImageContext()
+		return image
+	}
+
+	static func snapshotStoryboardForPortrait(sbName: String) -> UIImage? {
+		return snapshotStoryboard(sbName: sbName, isPortrait: true)
+	}
+
+	static func snapshotStoryboardForLandscape(sbName: String) -> UIImage? {
+		return snapshotStoryboard(sbName: sbName, isPortrait: false)
+	}
+
+	static func changeAllLaunchImageToPortrait(_ image: UIImage?) {
+		guard let image = image else {
+			return
+		}
+			// 全部替换为竖屏启动图
+		let resizedImage = resizeImage(image, toPortraitScreenSize: true)
+		BBADynamicLaunchImage.replaceLaunchImage(resizedImage)
+	}
+
+	static func changeAllLaunchImageToLandscape(_ image: UIImage?) {
+		guard let image = image else {
+			return
+		}
+			// 全部替换为横屏启动图
+		let resizedImage = resizeImage(image, toPortraitScreenSize: false)
+		BBADynamicLaunchImage.replaceLaunchImage(resizedImage)
+	}
+
+	static func changePortraitLaunchImage(_ p: UIImage) {
+			// Implementation for this function is missing
+	}
+
+	static func resizeImage(_ image: UIImage, toPortraitScreenSize: Bool) -> UIImage {
+			// Implementation for this function is missing
+		return image
+	}
+}
+
+
+private class BBADynamicLaunchImage {
+	static func launchImageCacheDirectory() -> String? {
+		let bundleID = Bundle.main.infoDictionary?["CFBundleIdentifier"] as? String
+		let fm = FileManager.default
+
+			// iOS13之前
+		if var cachesDirectory = NSSearchPathForDirectoriesInDomains(.cachesDirectory, .userDomainMask, true).first {
+			cachesDirectory.append(contentsOf: "Snapshots")
+			cachesDirectory.append(contentsOf: bundleID!)
+			if fm.fileExists(atPath: cachesDirectory) {
+				return cachesDirectory
+			}
+		}
+
+			// iOS13
+		if let libraryDirectory = NSSearchPathForDirectoriesInDomains(.libraryDirectory, .userDomainMask, true).first {
+			let snapshotsPath = String(format: "%@/SplashBoard/Snapshots/%@ - {DEFAULT GROUP}", libraryDirectory, bundleID ?? "")
+			if fm.fileExists(atPath: snapshotsPath) {
+				return snapshotsPath
+			}
+		}
+
+		return nil
+	}
+
+	static func isSnapShotName(_ name: String) -> Bool {
+			// 新系统后缀
+		let snapshotSuffixs = ".ktx"
+		if name.hasSuffix(snapshotSuffixs) {
+			return true
+		}
+
+			// 老系统后缀
+		let snapshotSuffixs2 = ".png"
+		if name.hasSuffix(snapshotSuffixs2) {
+			return true
+		}
+
+		return false
+	}
+
+	@discardableResult
+	static func replaceLaunchImage(_ replacementImage: UIImage?) -> Bool {
+		guard let image = replacementImage else {return false}
+		return self.replaceLaunchImage(replacementImage: image, compressionQuality: 0.8, customValidation: nil)
+	}
+
+	@discardableResult
+	static func replaceLaunchImage(_ replacementImage: UIImage?, compressionQuality: CGFloat) -> Bool {
+		guard let image = replacementImage else {return false}
+		return self.replaceLaunchImage(replacementImage: image, compressionQuality: compressionQuality, customValidation: nil)
+	}
+
+	static func replaceLaunchImage(replacementImage: UIImage, compressionQuality: CGFloat, customValidation: ((UIImage,UIImage) -> Bool)?) -> Bool {
+
+		let data = replacementImage.jpegData(compressionQuality: compressionQuality)
+		if data == nil {
+			return false
+		}
+
+			//		if !checkImageMatchScreenSize(image: replacementImage) {
+			//			return false
+			//		}
+
+		guard let cacheDir = launchImageCacheDirectory() else {
+			return false
+		}
+
+		let cachesParentDir = NSSearchPathForDirectoriesInDomains(.cachesDirectory, .userDomainMask, true)[0]
+		let tmpDir = (cachesParentDir as NSString).appendingPathComponent("_tmpLaunchImageCaches")
+
+		let fm = FileManager.default
+		if fm.fileExists(atPath: tmpDir) {
+			do {
+				try fm.removeItem(atPath: tmpDir)
+			} catch {
+				return false
+			}
+		}
+
+		do {
+			try fm.moveItem(atPath: cacheDir, toPath: tmpDir)
+		} catch {
+			return false
+		}
+
+		var cacheImageNames = [String]()
+		if let contents = try? fm.contentsOfDirectory(atPath: tmpDir) {
+			for name in contents {
+				if isSnapShotName(name) {
+					cacheImageNames.append(name)
+				}
+			}
+		}
+
+		for name in cacheImageNames {
+			let filePath = (tmpDir as NSString).appendingPathComponent(name)
+			var result = true
+
+			if customValidation != nil{
+				if let cachedImageData = try? Data(contentsOf: URL(string: filePath)!),let cachedImage = imageFromData(data: cachedImageData as NSData){
+					result = customValidation!(cachedImage,replacementImage)
+				}
+			}
+
+			if result {
+				do {
+					try data?.write(to: URL(fileURLWithPath: filePath), options: .atomic)
+				} catch {
+					return false
+				}
+			}
+		}
+
+
+		try? fm.moveItem(atPath: tmpDir, toPath: cacheDir)
+		if fm.fileExists(atPath: tmpDir) {
+			do {
+				try fm.removeItem(atPath: tmpDir)
+			} catch {
+				return false
+			}
+		}
+
+		return true
+	}
+
+
+
+	static func imageFromData(data: NSData) -> UIImage? {
+		guard let source = CGImageSourceCreateWithData(data, nil) else {
+			return nil
+		}
+
+		if let imageRef = CGImageSourceCreateImageAtIndex(source, 0, nil) {
+			let originImage = UIImage(cgImage: imageRef)
+			return originImage
+		}
+
+		return nil
+	}
+
+	func getImageSize(imageData: NSData) -> CGSize {
+		guard let source = CGImageSourceCreateWithData(imageData, nil) else {
+			return CGSize.zero
+		}
+
+		if let imageRef = CGImageSourceCreateImageAtIndex(source, 0, nil) {
+			let width = CGFloat(imageRef.width)
+			let height = CGFloat(imageRef.height)
+			return CGSize(width: width, height: height)
+		}
+
+		return CGSize.zero
+	}
+
+
+		/// 检查图片大小
+	static func checkImageMatchScreenSize(image: UIImage) -> Bool {
+		let screenSize = CGSize(width: UIScreen.main.bounds.size.width * UIScreen.main.scale,
+								height: UIScreen.main.bounds.size.height * UIScreen.main.scale)
+		let imageSize = CGSize(width: image.size.width * image.scale,
+							   height: image.size.height * image.scale)
+
+		if imageSize.equalTo(screenSize) {
+			return true
+		}
+
+		if imageSize.equalTo(CGSize(width: screenSize.height, height: screenSize.width)) {
+			return true
+		}
+
+		return false
+	}
+}
diff --git a/DolphinEnglishLearnStudent/Config/VoicePlayer.swift b/DolphinEnglishLearnStudent/Config/VoicePlayer.swift
index dfea953..c64fbab 100644
--- a/DolphinEnglishLearnStudent/Config/VoicePlayer.swift
+++ b/DolphinEnglishLearnStudent/Config/VoicePlayer.swift
@@ -20,6 +20,7 @@
 				private let voiceCacheDirectory = FileManager.default.urls(for: .cachesDirectory, in: .userDomainMask).first!.appendingPathComponent("voices")
 				private static var _sharedInstance: VoicePlayer?
 				private var player:AVAudioPlayer?
+				private var tempPlayer:AVAudioPlayer?
 
 				var delegate:VoicePlayerDelegate?
 
@@ -52,27 +53,89 @@
 								guard let u = url else {return}
 								if player?.isPlaying ?? false{
 												player?.stop()
-												self.playComplete?() //先通知完成播放
 								}
+												//文件存在:直接播放缓存路径的语音
+												let fileURL = self.voiceCacheDirectory.appendingPathComponent(URL(fileURLWithPath: u).lastPathComponent).droppedScheme()
+												if FileManager.default.fileExists(atPath: fileURL!.absoluteString){
+																self.player = try? AVAudioPlayer(contentsOf: fileURL!)
+																self.player?.delegate = self
+																self.player?.play()
+																self.delegate?.playing()
+												}else{
+																//文件不存在:执行下载
+																let downloadTask = URLSession.shared.downloadTask(with: URL(string: u)!) { tempLocalUrl, response, error in
+																				if let tempLocalUrl = tempLocalUrl, error == nil {
+																								do {
+																												let finalCacheUrl = self.voiceCacheDirectory.appendingPathComponent(URL(fileURLWithPath: u).lastPathComponent)
+																												try FileManager.default.moveItem(at: tempLocalUrl, to: finalCacheUrl)
+																												self.player = try? AVAudioPlayer(contentsOf: finalCacheUrl)
+																												self.player?.delegate = self
+																												self.player?.play()
+																												self.delegate?.playing()
+																								} catch {
+																												print("视频缓存失败:catch")
+																								}
+																				} else {
+																								print("视频缓存失败:\(error?.localizedDescription ?? "")")
+																				}
+																}
+																downloadTask.resume()
+												}
+				}
 
-								//文件存在:直接播放缓存路径的语音
-								let fileURL = voiceCacheDirectory.appendingPathComponent(URL(fileURLWithPath: u).lastPathComponent).droppedScheme()
-								if FileManager.default.fileExists(atPath: fileURL!.absoluteString){
-												player = try? AVAudioPlayer(contentsOf: fileURL!)
-												player?.delegate = self
-												player?.play()
-												delegate?.playing()
-								}else{
+				func playerEnd(){
+								player?.stop()
+								playComplete?()
+				}
+
+				//打断播放未完全播放
+				func playerInterrupt(){
+								player?.stop()
+				}
+
+				func playEnd(course:@escaping ()->Void){
+								self.playComplete = course
+				}
+
+				func playSuccessVoice(){
+								let list = try? FileManager.default.contentsOfDirectory(atPath: voiceCacheDirectory.droppedScheme()!.absoluteString)
+								var promoteName:String?
+								for v in list ?? []{
+												if v.contains("SuccessPromote"){promoteName = v;break}
+								}
+								guard let url = promoteName else { return }
+							let promote	= self.voiceCacheDirectory.appendingPathComponent(url)
+								tempPlayer = try? AVAudioPlayer(contentsOf: promote)
+								tempPlayer?.play()
+				}
+
+				func playFailVoice(){
+								let list = try? FileManager.default.contentsOfDirectory(atPath: voiceCacheDirectory.droppedScheme()!.absoluteString)
+								var promoteName:String?
+								for v in list ?? []{
+												if v.contains("FailPromote"){promoteName = v;break}
+								}
+								guard let url = promoteName else { return }
+								let promote	= self.voiceCacheDirectory.appendingPathComponent(url)
+								tempPlayer = try? AVAudioPlayer(contentsOf: promote)
+								tempPlayer?.play()
+				}
+
+				func donwloadPromoteVoice(successVoice:String,failVoice:String,updateTime:String){
+								print("-->\(VoicePlayer.share().voiceCacheDirectory)")
+								let group = DispatchGroup()
+								let promoteQueue = DispatchQueue(label: "promoteVoice")
+								promoteQueue.async(group: group){
 												//文件不存在:执行下载
-												let downloadTask = URLSession.shared.downloadTask(with: URL(string: u)!) { tempLocalUrl, response, error in
+												let downloadTask = URLSession.shared.downloadTask(with: URL(string: successVoice)!) { tempLocalUrl, response, error in
 																if let tempLocalUrl = tempLocalUrl, error == nil {
 																				do {
-																								let finalCacheUrl = self.voiceCacheDirectory.appendingPathComponent(URL(fileURLWithPath: u).lastPathComponent)
+																								let fileType = URL(fileURLWithPath: successVoice).lastPathComponent.components(separatedBy: ".").last ?? "mp3"
+																								let finalCacheUrl = self.voiceCacheDirectory.appendingPathComponent("SuccessPromote.\(fileType)")
+																								if FileManager.default.fileExists(atPath: finalCacheUrl.droppedScheme()!.absoluteString){
+																												try? FileManager.default.removeItem(at: finalCacheUrl)
+																								}
 																								try FileManager.default.moveItem(at: tempLocalUrl, to: finalCacheUrl)
-																								self.player = try? AVAudioPlayer(contentsOf: finalCacheUrl)
-																								self.player?.delegate = self
-																								self.player?.play()
-																								self.delegate?.playing()
 																				} catch {
 																								print("视频缓存失败:catch")
 																				}
@@ -82,15 +145,32 @@
 												}
 												downloadTask.resume()
 								}
-				}
 
-				func playerEnd(){
-								player?.stop()
-								playComplete?()
-				}
+								promoteQueue.async(group: group){
+												//文件不存在:执行下载
+												let downloadTask = URLSession.shared.downloadTask(with: URL(string: failVoice)!) { tempLocalUrl, response, error in
+																if let tempLocalUrl = tempLocalUrl, error == nil {
+																				do {
+																								let fileType = URL(fileURLWithPath: successVoice).lastPathComponent.components(separatedBy: ".").last ?? "mp3"
+																								let finalCacheUrl = self.voiceCacheDirectory.appendingPathComponent("FailPromote.\(fileType)")
+																								if FileManager.default.fileExists(atPath: finalCacheUrl.droppedScheme()!.absoluteString){
+																												try? FileManager.default.removeItem(at: finalCacheUrl)
+																								}
+																								try FileManager.default.moveItem(at: tempLocalUrl, to: finalCacheUrl)
+																				} catch {
+																								print("视频缓存失败:catch")
+																				}
+																} else {
+																				print("视频缓存失败:\(error?.localizedDescription ?? "")")
+																}
+												}
+												downloadTask.resume()
+								}
 
-				func playEnd(course:@escaping ()->Void){
-								self.playComplete = course
+								group.notify(queue: .main){
+												UserDefaults.standard.setValue(updateTime, forKey: "promptVoiceDate")
+												UserDefaults.standard.synchronize()
+								}
 				}
 }
 
diff --git a/DolphinEnglishLearnStudent/Info.plist b/DolphinEnglishLearnStudent/Info.plist
index dd3c9af..c0ae0b4 100644
--- a/DolphinEnglishLearnStudent/Info.plist
+++ b/DolphinEnglishLearnStudent/Info.plist
@@ -2,6 +2,11 @@
 <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
 <plist version="1.0">
 <dict>
+	<key>NSAppTransportSecurity</key>
+	<dict>
+		<key>NSAllowsArbitraryLoads</key>
+		<true/>
+	</dict>
 	<key>UIApplicationSceneManifest</key>
 	<dict>
 		<key>UIApplicationSupportsMultipleScenes</key>
diff --git a/DolphinEnglishLearnStudent/Models/CommonModel.swift b/DolphinEnglishLearnStudent/Models/CommonModel.swift
index 3319ed7..5d57ffd 100644
--- a/DolphinEnglishLearnStudent/Models/CommonModel.swift
+++ b/DolphinEnglishLearnStudent/Models/CommonModel.swift
@@ -386,3 +386,20 @@
 				var isOpen:Bool = false
 				var type = 0 // 1:图片 2:音频
 }
+
+struct PromptVoiceModel:HandyJSON{
+				var correct: String = ""
+				var createBy: String = ""
+				var createTime: String = ""
+				var disabled: Bool = false
+				var error: String = ""
+				var id: Int = 0
+				var img: String = ""
+				var integral: String = ""
+				var integralShare: String = ""
+				var phone: String = ""
+				var time: String = ""
+				var title: String = ""
+				var updateBy: String = ""
+				var updateTime: String = ""
+}
diff --git a/DolphinEnglishLearnStudent/Moudle/Home/HomeListenFight_lesson_1_VC.swift b/DolphinEnglishLearnStudent/Moudle/Home/HomeListenFight_lesson_1_VC.swift
index 7b6fb4f..7da2182 100644
--- a/DolphinEnglishLearnStudent/Moudle/Home/HomeListenFight_lesson_1_VC.swift
+++ b/DolphinEnglishLearnStudent/Moudle/Home/HomeListenFight_lesson_1_VC.swift
@@ -77,6 +77,7 @@
 				override func viewDidDisappear(_ animated: Bool) {
 								super.viewDidDisappear(animated)
 								VoicePlayer.share().delegate = nil
+								VoicePlayer.share().playerInterrupt()
 				}
 
 
@@ -91,6 +92,7 @@
 				}
 
 				private func getNextAnswer(){
+								isListen = false
 								if isAnsterModel.count == 4{
 												print("答题答满了");return
 								}
@@ -109,6 +111,12 @@
 								viewModel.answerType.accept(.none)
 								collectionView.reloadData()
 								setUI()
+
+								//自动播放下一题语音
+								DispatchQueue.main.asyncAfter(deadline: .now()+2) {
+												VoicePlayer.share().playerAt(url: self.randomElement?.correct)
+												self.menuView?.playing()
+								}
 				}
 
 				override func setUI() {
@@ -158,13 +166,20 @@
 																var answer:Fight_lessonType = .none
 																if self?.randomElement?.id == weakSelf.listenNewModel.subjectList[weakSelf.page][index.row].id{
 																				answer = .success
+																				self?.isListen = false
 																				if self?.isAnsterComplete == false{
 																								self?.rootViewModel.correctNum += 1
 																				}
 																				self?.isAnsterComplete = true
-																				VoicePlayer.share().playerAt(url: weakSelf.listenNewModel.subjectList[weakSelf.page][index.row].correct)
+
+																				VoicePlayer.share().playSuccessVoice()
+																				DispatchQueue.main.asyncAfter(deadline: .now()+2) {
+																								VoicePlayer.share().playerAt(url: weakSelf.listenNewModel.subjectList[weakSelf.page][index.row].correct)
+																				}
 																}else{
 																				answer = .fail
+																				VoicePlayer.share().playFailVoice()
+																				self?.isListen = false
 																				if self?.isAnsterComplete == false{
 																								self?.rootViewModel.errorNum += 1
 																				}
@@ -256,6 +271,7 @@
 																weakSelf.viewModel.answerType.accept(.none)
 																weakSelf.viewModel.selectIndex.accept(nil)
 																weakSelf.rootViewModel.answerItems[weakSelf.page] = weakSelf.listenNewModel.subjectList[weakSelf.page]
+																weakSelf.isListen = false
 												}
 								}
 
diff --git a/DolphinEnglishLearnStudent/Moudle/Home/HomeVC.swift b/DolphinEnglishLearnStudent/Moudle/Home/HomeVC.swift
index 6e0ab31..c968cbf 100644
--- a/DolphinEnglishLearnStudent/Moudle/Home/HomeVC.swift
+++ b/DolphinEnglishLearnStudent/Moudle/Home/HomeVC.swift
@@ -6,19 +6,29 @@
 //
 
 import UIKit
+import SDWebImage
 
 class HomeVC: BaseVC {
 
     override func viewDidLoad() {
         super.viewDidLoad()
-								Services.goodRecommend().subscribe(onNext: { data in
-												AwardListView.show(items: data.data ?? []) {[weak self] model in
-																let vc = MarketContentVC(goodsId: model.id)
-																self?.push(vc: vc)
-												}closeClouse: {[weak self] in
-																let listenMenuVC = HomeListenMenuVC()
-																listenMenuVC.title = "第一年学习周目选择"
-																self?.push(vc: listenMenuVC)
+
+								Services.parentPage().subscribe(onNext: {data in
+												if let img = data.data{
+																SDWebImageDownloader.shared.downloadImage(with: URL(string: img)) { image, _, _, _ in
+																				if let img = image{
+																								LaunchImageHelper.changeAllLaunchImageToLandscape(img)
+																				}
+																}
+												}
+								}).disposed(by: disposeBag)
+
+								Services.promptVoice().subscribe(onNext: {data in
+												if let model = data.data{
+																let voice = UserDefaults.standard.object(forKey: "promptVoiceDate") as? String
+																if model.updateTime != voice{
+																				VoicePlayer.share().donwloadPromoteVoice(successVoice: model.correct, failVoice: model.error,updateTime: model.updateTime)
+																}
 												}
 								}).disposed(by: disposeBag)
     }
diff --git a/DolphinEnglishLearnStudent/Moudle/Home/HomeVC.xib b/DolphinEnglishLearnStudent/Moudle/Home/HomeVC.xib
index 11cfa86..daa6c96 100644
--- a/DolphinEnglishLearnStudent/Moudle/Home/HomeVC.xib
+++ b/DolphinEnglishLearnStudent/Moudle/Home/HomeVC.xib
@@ -172,7 +172,7 @@
                                 </view>
                                 <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="听" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="rYc-7O-AJr">
                                     <rect key="frame" x="99" y="0.0" width="281" height="88"/>
-                                    <fontDescription key="fontDescription" type="system" pointSize="17"/>
+                                    <fontDescription key="fontDescription" type="system" weight="medium" pointSize="24"/>
                                     <nil key="textColor"/>
                                     <nil key="highlightedColor"/>
                                 </label>
diff --git a/DolphinEnglishLearnStudent/Moudle/Home/Listen/CCell/ListenFight_lesson_3_CCell.swift b/DolphinEnglishLearnStudent/Moudle/Home/Listen/CCell/ListenFight_lesson_3_CCell.swift
index 8815877..a075c81 100644
--- a/DolphinEnglishLearnStudent/Moudle/Home/Listen/CCell/ListenFight_lesson_3_CCell.swift
+++ b/DolphinEnglishLearnStudent/Moudle/Home/Listen/CCell/ListenFight_lesson_3_CCell.swift
@@ -14,7 +14,9 @@
 				@IBOutlet weak var view_container: UIView!
 				@IBOutlet weak var btn_play: UIButton!
 				@IBOutlet weak var btn_playing: UIButton!
-
+				@IBOutlet weak var view_playHandle: UIView!
+				@IBOutlet weak var img_playing: UIImageView!
+				
 				private var model:Listen1SubModel!
 				private var playAtClouse:((IndexPath)->Void)?
 				var indexPath:IndexPath!
@@ -28,15 +30,21 @@
 				func setModel(_ model:Listen1SubModel,isplaying:Bool){
 								self.model = model
 								self.btn_play.alpha = (isplaying ? 0:1)
+								self.btn_playing.alpha = (isplaying ? 0:1)
+								self.img_playing.alpha = (isplaying ? 1:0)
 				}
 
 				func palyVoiceAt(_ clouse:@escaping(IndexPath)->Void){
 								self.playAtClouse = clouse
 				}
 
+				func canClick(_ state:Bool){
+								btn_play.isEnabled = state
+								view_playHandle.backgroundColor = state == true ? UIColor(hexString: "#41A2EB") : .gray
+				}
+
 
 				@IBAction func playAction(_ sender: Any) {
-								VoicePlayer.share().playerAt(url: model.correct)
 								playAtClouse?(indexPath)
 				}
 }
diff --git a/DolphinEnglishLearnStudent/Moudle/Home/Listen/CCell/ListenFight_lesson_3_CCell.xib b/DolphinEnglishLearnStudent/Moudle/Home/Listen/CCell/ListenFight_lesson_3_CCell.xib
index fce015d..e73fe3f 100644
--- a/DolphinEnglishLearnStudent/Moudle/Home/Listen/CCell/ListenFight_lesson_3_CCell.xib
+++ b/DolphinEnglishLearnStudent/Moudle/Home/Listen/CCell/ListenFight_lesson_3_CCell.xib
@@ -33,15 +33,20 @@
                                 <inset key="imageEdgeInsets" minX="0.0" minY="0.0" maxX="2.2250738585072014e-308" maxY="0.0"/>
                                 <state key="normal" image="icon_play_1"/>
                             </button>
+                            <imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="icon_playing" translatesAutoresizingMaskIntoConstraints="NO" id="vMh-x4-Y7a">
+                                <rect key="frame" x="57" y="10.5" width="45" height="31"/>
+                            </imageView>
                         </subviews>
                         <color key="backgroundColor" red="0.25490196078431371" green="0.63529411764705879" blue="0.92156862745098034" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
                         <constraints>
                             <constraint firstItem="9Dc-Ns-SMP" firstAttribute="centerY" secondItem="vtr-2e-B5C" secondAttribute="centerY" id="C8e-Iq-OaB"/>
                             <constraint firstItem="7yc-PU-RgV" firstAttribute="centerY" secondItem="vtr-2e-B5C" secondAttribute="centerY" id="EUe-pu-sAP"/>
+                            <constraint firstItem="vMh-x4-Y7a" firstAttribute="centerX" secondItem="vtr-2e-B5C" secondAttribute="centerX" id="ObG-a0-OcJ"/>
                             <constraint firstAttribute="trailing" secondItem="7yc-PU-RgV" secondAttribute="trailing" constant="23" id="Rms-9S-fkG"/>
                             <constraint firstAttribute="height" constant="52" id="Y2Z-EL-K2n"/>
                             <constraint firstAttribute="width" constant="159" id="oI7-Oh-ubD"/>
                             <constraint firstItem="9Dc-Ns-SMP" firstAttribute="leading" secondItem="vtr-2e-B5C" secondAttribute="leading" constant="25" id="xRi-cc-X9V"/>
+                            <constraint firstItem="vMh-x4-Y7a" firstAttribute="centerY" secondItem="vtr-2e-B5C" secondAttribute="centerY" id="xql-kz-i8e"/>
                         </constraints>
                         <userDefinedRuntimeAttributes>
                             <userDefinedRuntimeAttribute type="boolean" keyPath="ld_maskToBoundsXIB" value="YES"/>
@@ -81,7 +86,9 @@
                 <outlet property="btn_play" destination="7yc-PU-RgV" id="b2b-5W-bGC"/>
                 <outlet property="btn_playing" destination="9Dc-Ns-SMP" id="PsY-Nd-d5z"/>
                 <outlet property="img_cover" destination="n5n-eb-5xI" id="Wk5-s2-MQj"/>
+                <outlet property="img_playing" destination="vMh-x4-Y7a" id="jWd-mt-qFI"/>
                 <outlet property="view_container" destination="qxz-6s-e5b" id="Ikx-kW-UkZ"/>
+                <outlet property="view_playHandle" destination="vtr-2e-B5C" id="I10-7z-6kl"/>
             </connections>
             <point key="canvasLocation" x="352.6829268292683" y="263.38983050847457"/>
         </collectionViewCell>
@@ -89,6 +96,7 @@
     <resources>
         <image name="icon_play" width="32" height="32"/>
         <image name="icon_play_1" width="27" height="27"/>
+        <image name="icon_playing" width="45" height="31"/>
         <systemColor name="systemBackgroundColor">
             <color white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
         </systemColor>
diff --git a/DolphinEnglishLearnStudent/Moudle/Home/Listen/VC/HomeListenFightVC.swift b/DolphinEnglishLearnStudent/Moudle/Home/Listen/VC/HomeListenFightVC.swift
index e84e90e..7e3e4a6 100644
--- a/DolphinEnglishLearnStudent/Moudle/Home/Listen/VC/HomeListenFightVC.swift
+++ b/DolphinEnglishLearnStudent/Moudle/Home/Listen/VC/HomeListenFightVC.swift
@@ -164,21 +164,6 @@
 								setPages()
 								pageVC.reloadData()
 
-//								if viewModel.listenType.value == .game1 || viewModel.listenType.value == .game2{
-//												btn_forward.isHidden = true
-//												label_pageNum.isHidden = true
-//
-//												if viewModel.listenType.value == .game1{
-//																showGameLevel()
-//												}
-//								}else if viewModel.listenType.value == .story1 || viewModel.listenType.value == .story2{
-//												let count = (data as! Listen1Model).storyList.count
-//												viewModel.maxPage.accept(count)
-//												label_pageNum.text = "已完成:\(viewModel.currentPage.value + 1)/\(viewModel.maxPage.value)"
-//								}else{
-//												pageVC.reloadData()
-//								}
-
 								timer = Timer(fire: .distantPast, interval: 1.0, repeats: true, block: {[weak self] _ in
 												self?.viewModel.times += 1
 								})
@@ -290,27 +275,6 @@
 																				weakSelf.btn_exit.setTitle("完成", for: .normal)
 																}
 												}
-
-
-												//以下无效代码
-//
-//
-//												//完成
-//												if nextPage >= weakSelf.viewModel.maxPage.value{
-//																switch weakSelf.viewModel.listenType.value {
-//																				case .game1,.game2:
-//																								if let dict = noti.object as? Dictionary<String,Any>{
-//																												weakSelf.gamesComplete(gameId: dict["gameId"] as! Int,integral: dict["gameIntegral"] as! Int)
-//																								}
-//																				case .lesson1,.lesson2,.lesson3,.lesson4,.lesson5:
-//																								weakSelf.studyComplete()
-//																				case .story1,.story2:
-//																								if let dict = noti.object as? Dictionary<String,Any>{
-//																												weakSelf.storyComplete(storyId: dict["storyId"] as! Int, integral: dict["storyIntegral"] as! Int)
-//																								}
-//																}
-//																return
-//												}
 
 												weakSelf.listenFightLine = .next
 												weakSelf.pageVC.scroll(toPage: nextPage, animation: true)
@@ -476,7 +440,7 @@
 
 				@objc func beforeAction(){
 								listenFightLine = .before
-								let beforePage = max(0, viewModel.currentPage.value - 1)
+								var beforePage = max(0, viewModel.currentPage.value - 1)
 								pageVC.scroll(toPage: beforePage, animation: true)
 								viewModel.currentPage.accept(beforePage)
 
diff --git a/DolphinEnglishLearnStudent/Moudle/Home/Listen/VC/HomeListenFight_lesson_2_VC.swift b/DolphinEnglishLearnStudent/Moudle/Home/Listen/VC/HomeListenFight_lesson_2_VC.swift
index 97029d0..2a23445 100644
--- a/DolphinEnglishLearnStudent/Moudle/Home/Listen/VC/HomeListenFight_lesson_2_VC.swift
+++ b/DolphinEnglishLearnStudent/Moudle/Home/Listen/VC/HomeListenFight_lesson_2_VC.swift
@@ -11,9 +11,7 @@
 class HomeListenFight_lesson_2_VC: BaseVC {
 
 				private var viewModel = FightAnswerViewModel()
-
 				private var listenNewModel:ListenNewModel!
-//				private var randomElement:Listen1SubModel?
 				private var page:Int!
 				var rootViewModel:HomeListenFightViewModel!
 				private var tempViews = [StudyHandleView]()
@@ -21,9 +19,6 @@
 				private var playedIndex = Set<Int>() //已经播放过的view
 				private var voicePlayer = VoicePlayer.share()
 				private var isAnsterModel = Set<Listen1SubModel>()
-
-//				private var isAnsterComplete:Bool = false //是否已经回答完成[小题]
-//				private var isAnsterDone:Bool = false //是否已经回答完成[大题]
 
 				private lazy var stackView:UIStackView = {
 								let stackView = UIStackView()
@@ -68,6 +63,7 @@
 				override func viewDidDisappear(_ animated: Bool) {
 								super.viewDidDisappear(animated)
 								VoicePlayer.share().delegate = nil
+								VoicePlayer.share().playerInterrupt()
 				}
 
 				func restore(){
@@ -160,9 +156,11 @@
 																var lessionType:Fight_lessonType = .none
 																if handleView.vioceSoundUrl == weakSelf.listenNewModel.subjectList[weakSelf.page][row].correct{
 																				lessionType = .success
-																								weakSelf.voicePlayer.playerEnd()
+																				weakSelf.voicePlayer.playSuccessVoice()
+//																								weakSelf.voicePlayer.playerInterrupt()
 																}else{
 																				lessionType = .fail
+																				weakSelf.voicePlayer.playFailVoice()
 																}
 
 																switch lessionType {
@@ -313,12 +311,5 @@
 												}
 								}
 
-//								if isAnsterComplete{
-////												getNextAnswer()
-//												if !isAnsterDone{
-//																let v = rootViewModel.answerCount.value
-//																rootViewModel.answerCount.accept(v + 1)
-//												}
-//								}
 				}
 }
diff --git a/DolphinEnglishLearnStudent/Moudle/Home/Listen/VC/HomeListenFight_lesson_3_VC.swift b/DolphinEnglishLearnStudent/Moudle/Home/Listen/VC/HomeListenFight_lesson_3_VC.swift
index 0148c28..7d0270c 100644
--- a/DolphinEnglishLearnStudent/Moudle/Home/Listen/VC/HomeListenFight_lesson_3_VC.swift
+++ b/DolphinEnglishLearnStudent/Moudle/Home/Listen/VC/HomeListenFight_lesson_3_VC.swift
@@ -36,12 +36,13 @@
 				private var answterCount:Int = 0 //回答计数,用于确定角标
 				var rootViewModel:HomeListenFightViewModel!
 				private var voicePlayer = VoicePlayer.share()
+				private var playIndex = Set<IndexPath>() //顺序播放
+				private var isPlayingIndex:IndexPath? //正在播放中
 
 				required init(page:Int,listenNewModel:ListenNewModel){
 								super.init(nibName: nil, bundle: nil)
 								self.page = page
 								self.listenNewModel = listenNewModel
-//								self.listen1Model.subjectList.shuffle()
 				}
 
 				required init?(coder: NSCoder) {
@@ -56,16 +57,14 @@
 				override func viewDidDisappear(_ animated: Bool) {
 								super.viewDidDisappear(animated)
 								voicePlayer.delegate = nil
+								VoicePlayer.share().playerInterrupt()
 				}
-
-
 
 				override func viewDidLoad() {
 								super.viewDidLoad()
 								navigationItem.titleView = UIView()
-//								viewModel.selectIndex.accept(IndexPath(row: 0, section: 0))
-
-								setAnswerStackView()
+								playIndex.insert(IndexPath(row: 0, section: 0))
+//								setAnswerStackView()
 				}
 
 				func restore(){
@@ -99,23 +98,7 @@
 				}
 
 				override func setRx() {
-								viewModel.selectIndex.subscribe(onNext: {[weak self] index in
 
-												guard let index = index else { return }
-												//判断选中是否正确逻辑
-												if let cell = self?.collectionView.dequeueReusableCell(withReuseIdentifier: "_ListenFight_lesson_3_CCell", for: index) as? ListenFight_lesson_1_CCell{
-																var answerType:Fight_lessonType = .none
-																answerType = .success
-
-																switch answerType {
-																				case .success:
-																								self?.viewModel.answerType.accept(.success)
-																				case .fail:
-																								self?.viewModel.answerType.accept(.fail)
-																				default:break
-																}
-												}
-								}).disposed(by: disposeBag)
 				}
 
 				private func setAnswerStackView(){
@@ -127,7 +110,6 @@
 								tempImageArray.append(listenNewModel.subjectList[page][2].img)
 								tempImageArray.append(listenNewModel.subjectList[page][4].img)
 								tempImageArray.append(listenNewModel.subjectList[page][5].img)
-//								tempImageArray.shuffle()
 
 								view.addSubview(stackView)
 								stackView.snp.makeConstraints { make in
@@ -135,6 +117,8 @@
 												make.centerY.equalToSuperview()
 												make.height.equalTo(52)
 								}
+
+								var tempAnswerViews = [Lesson_3_AnswerView]()
 								for i in 0...2{
 												let answerView = Lesson_3_AnswerView.jq_loadNibView()
 												answerView.alpha = 0
@@ -153,20 +137,36 @@
 												UIView.animate(withDuration: 0.05 + Double(i)) {
 																answerView.alpha = 1
 												}
-
-												stackView.insertArrangedSubview(answerView, at: 0)
+												tempAnswerViews.append(answerView)
 								}
+								tempAnswerViews.shuffle()
+								stackView.addArrangedSubviews(tempAnswerViews)
 				}
 
 				@objc private func chooseAnswerAction(btn:UIButton){
-								if viewModel.selectIndex.value == nil{alertError(msg: "请先听题");return}
 
-								let index = btn.tag - 10
+								if isPlayingIndex != nil {
+												alertError(msg: "请先听题");return
+								}
+
+								if rootViewModel.correctNum == 0 && !playIndex.contains(IndexPath(row: 2, section: 0)){
+												alertError(msg: "请先听题");return
+								}
+
+								if rootViewModel.correctNum == 1 && !playIndex.contains(IndexPath(row: 1, section: 1)){
+												alertError(msg: "请先听题");return
+								}
+
+								if rootViewModel.correctNum == 2 && !playIndex.contains(IndexPath(row: 2, section: 1)){
+												alertError(msg: "请先听题");return
+								}
 
 								var subV:Lesson_3_AnswerView?
 
-								for (i,v) in stackView.arrangedSubviews.reversed().enumerated(){
-												if index == i{subV = v as? Lesson_3_AnswerView;break}
+								for (_,v) in (stackView.arrangedSubviews as! [Lesson_3_AnswerView]).enumerated(){
+												if v.btn_choose.tag == btn.tag{
+																subV = v;break
+												}
 								}
 
 								var answerType:Fight_lessonType = .none
@@ -181,8 +181,10 @@
 
 								if subV?.imageUrl == listenNewModel.subjectList[page][valueIndex].img{
 												answerType = .success
+												voicePlayer.playSuccessVoice()
 								}else{
 												answerType = .fail
+												voicePlayer.playFailVoice()
 								}
 
 								switch answerType {
@@ -200,10 +202,12 @@
 																var ansterIndePath:IndexPath?
 																if viewModel.selectIndex.value?.section == 0{
 																				ansterIndePath = IndexPath(row: 2, section: 0)
+																				playIndex.insert(IndexPath(row: 0, section: 1)) //下一个准备播放
 																}
 
 																if viewModel.selectIndex.value?.section == 1 && (viewModel.selectIndex.value?.row == 0 || viewModel.selectIndex.value?.row == 1){
 																				ansterIndePath = IndexPath(row: 1, section: 1)
+																				playIndex.insert(IndexPath(row: 2, section: 1)) //下一个准备播放
 																}
 
 																if viewModel.selectIndex.value?.section == 1 && viewModel.selectIndex.value?.row == 2{
@@ -227,6 +231,7 @@
 																												self.viewModel.selectIndex.accept(nil)
 																												let v = self.rootViewModel.answerCount.value + 1
 																												self.rootViewModel.answerCount.accept(v)
+																												self.collectionView.reloadData()
 																								}
 																				}
 																}
@@ -272,11 +277,19 @@
 								cell.backgroundColor = .clear
 								cell.indexPath = indexPath
 								cell.contentView.backgroundColor = .clear
+								cell.canClick(playIndex.contains(indexPath))
 								cell.palyVoiceAt {[weak self] index in
-												self?.viewModel.selectIndex.accept(index)
+												guard let weakSelf = self else { return }
+												weakSelf.isPlayingIndex = index
+
+												weakSelf.voicePlayer.playerEnd()
+												weakSelf.voicePlayer.playerAt(url:  weakSelf.listenNewModel.subjectList[weakSelf.page][indexPath.row].correct)
+
+												weakSelf.viewModel.selectIndex.accept(index)
+												 //点击答案,就显示
 												if (index.section == 0 && index.row == 2) || (index.section == 1 && index.row > 0){
-																self?.viewModel.selectIndex.accept(index)
-																self?.setAnswerStackView()
+																weakSelf.viewModel.selectIndex.accept(index)
+																weakSelf.setAnswerStackView()
 												}
 
 												collectionView.reloadItems(at: [index])
@@ -289,7 +302,7 @@
 												}else{
 																cell.img_cover.image = nil
 												}
-												cell.setModel(model,isplaying: viewModel.selectIndex.value == indexPath)
+												cell.setModel(model,isplaying: isPlayingIndex == indexPath)
 								}
 
 								if indexPath.section == 1{
@@ -299,7 +312,7 @@
 												}else{
 																cell.img_cover.image = nil
 												}
-												cell.setModel(model,isplaying: viewModel.selectIndex.value == indexPath)
+												cell.setModel(model,isplaying: isPlayingIndex == indexPath)
 								}
 								return cell
 				}
@@ -321,14 +334,28 @@
 
 extension HomeListenFight_lesson_3_VC:VoicePlayerDelegate{
 				func playComplete() {
-								collectionView.reloadData()
+								isPlayingIndex =  nil
+
+								var nextRow = (viewModel.selectIndex.value?.row ?? 0) + 1
+								var section = (viewModel.selectIndex.value?.section ?? 0) + 0
+
+								if nextRow >= 3{
+												nextRow = 0;section = 1
+								}
+
 
 								if self.answterCount == 3{
 												self.rootViewModel.answerItems[self.page] = self.listenNewModel.subjectList[self.page]
 												NotificationCenter.default.post(name: NextLession_Noti, object: nil)
-												VoicePlayer.share().playerEnd()
 												return
 								}
+
+								if (viewModel.selectIndex.value?.section == 0 && viewModel.selectIndex.value?.row == 2) || (viewModel.selectIndex.value?.section == 1 && viewModel.selectIndex.value?.row == 1){
+												collectionView.reloadData()
+												return
+								}
+								playIndex.insert(IndexPath(row: nextRow, section: section)) //下一个准备播放
+								collectionView.reloadData()
 				}
 
 				func playing() {
diff --git a/DolphinEnglishLearnStudent/Moudle/Home/Listen/VC/HomeListenFight_lesson_4_VC.swift b/DolphinEnglishLearnStudent/Moudle/Home/Listen/VC/HomeListenFight_lesson_4_VC.swift
index 1f988ac..e98b8eb 100644
--- a/DolphinEnglishLearnStudent/Moudle/Home/Listen/VC/HomeListenFight_lesson_4_VC.swift
+++ b/DolphinEnglishLearnStudent/Moudle/Home/Listen/VC/HomeListenFight_lesson_4_VC.swift
@@ -83,6 +83,7 @@
 				override func viewDidDisappear(_ animated: Bool) {
 								super.viewDidDisappear(animated)
 								voicePlayer.delegate = nil
+								VoicePlayer.share().playerInterrupt()
 				}
 
 
@@ -184,12 +185,14 @@
 								var answerType:Fight_lessonType = .none
 								if tempSubV?.voiceUrl == answerModel?.correct{
 												answerType = .success
+												voicePlayer.playSuccessVoice()
 												answerCount += 1
 												rootViewModel.correctNum += 1
 												let v = rootViewModel.answerCount.value + 1
 												rootViewModel.answerCount.accept(v)
 								}else{
 												answerType = .fail
+												voicePlayer.playFailVoice()
 												rootViewModel.errorNum += 1
 								}
 								voicePlayer.playerEnd()
diff --git a/DolphinEnglishLearnStudent/Moudle/Home/Listen/VC/HomeListenFight_lesson_5_VC.swift b/DolphinEnglishLearnStudent/Moudle/Home/Listen/VC/HomeListenFight_lesson_5_VC.swift
index e4c1d55..edefa6e 100644
--- a/DolphinEnglishLearnStudent/Moudle/Home/Listen/VC/HomeListenFight_lesson_5_VC.swift
+++ b/DolphinEnglishLearnStudent/Moudle/Home/Listen/VC/HomeListenFight_lesson_5_VC.swift
@@ -17,6 +17,7 @@
 				private var playVoiceRealAt:Int? //播放声音的View -被乱序后,真实Index
 				var rootViewModel:HomeListenFightViewModel!
 				private var voicePlayer = VoicePlayer.share()
+				private var isListen:Bool = false
 
 				private lazy var collectionView:UICollectionView = {
 								let flowLayout = UICollectionViewFlowLayout()
@@ -75,6 +76,7 @@
 				override func viewDidDisappear(_ animated: Bool) {
 								super.viewDidDisappear(animated)
 								voicePlayer.delegate = nil
+								VoicePlayer.share().playerInterrupt()
 				}
 
 				override func setUI() {
@@ -196,9 +198,10 @@
 extension HomeListenFight_lesson_5_VC:UICollectionViewDelegate{
 				func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
 
-								if playVoiceAt == nil{
+								if isListen == false{
 												alertError(msg: "请先听题");return
 								}
+								isListen = false
 
 								viewModel.selectIndex.accept(indexPath)
 
@@ -206,11 +209,12 @@
 								let selectAnswer = listenNewModel.subjectList[page][indexPath.row]
 
 								var answerType:Fight_lessonType = .none
-
 								if answer.id == selectAnswer.id{
 												answerType = .success
+												voicePlayer.playSuccessVoice()
 								}else{
 												answerType = .fail
+												voicePlayer.playFailVoice()
 								}
 
 								let tempSubV = stackView.arrangedSubviews[self.playVoiceRealAt!] as! VoiceHandleView
@@ -299,6 +303,7 @@
 
 extension HomeListenFight_lesson_5_VC:VoicePlayerDelegate{
 				func playComplete() {
+								isListen = true
 								for subV in stackView.arrangedSubviews as! [VoiceHandleView]{
 												subV.resetView()
 								}
diff --git a/DolphinEnglishLearnStudent/Moudle/Home/Listen/VC/HomeListenGame_1_VC.swift b/DolphinEnglishLearnStudent/Moudle/Home/Listen/VC/HomeListenGame_1_VC.swift
index 296eef7..79b74c8 100644
--- a/DolphinEnglishLearnStudent/Moudle/Home/Listen/VC/HomeListenGame_1_VC.swift
+++ b/DolphinEnglishLearnStudent/Moudle/Home/Listen/VC/HomeListenGame_1_VC.swift
@@ -89,7 +89,7 @@
 								super.viewDidDisappear(animated)
 								timer?.invalidate()
 								voicePlayer.delegate = nil
-								voicePlayer.playerEnd()
+								voicePlayer.playerInterrupt()
 				}
 
     override func viewDidLoad() {
@@ -212,8 +212,10 @@
 
 								if currentAnswer?.id == listen1Model?.subjectList[row].id{
 												answerType = .success
+												voicePlayer.playSuccessVoice()
 								}else{
 												answerType = .fail
+												voicePlayer.playFailVoice()
 								}
 								switch answerType {
 												case .success:
diff --git a/DolphinEnglishLearnStudent/Moudle/Home/Listen/VC/HomeListenGame_2_VC.swift b/DolphinEnglishLearnStudent/Moudle/Home/Listen/VC/HomeListenGame_2_VC.swift
index c2d3e52..fcfbd10 100644
--- a/DolphinEnglishLearnStudent/Moudle/Home/Listen/VC/HomeListenGame_2_VC.swift
+++ b/DolphinEnglishLearnStudent/Moudle/Home/Listen/VC/HomeListenGame_2_VC.swift
@@ -80,6 +80,7 @@
 								super.viewDidDisappear(animated)
 								voicePlayer.delegate = nil
 								timer?.invalidate()
+								voicePlayer.playerInterrupt()
 				}
 
 				override func viewDidLoad() {
@@ -159,10 +160,12 @@
 
 								switch answerType {
 												case .success:
+																voicePlayer.playSuccessVoice()
 																viewModel.answerType.accept(.success)
 																collectionView.reloadData()
 
 												case .fail:
+																voicePlayer.playFailVoice()
 																viewModel.answerType.accept(.fail)
 																collectionView.reloadData()
 																DispatchQueue.main.asyncAfter(wallDeadline: .now()+2.5) {
diff --git a/DolphinEnglishLearnStudent/Moudle/Home/Listen/VC/HomeListenMenuVC.swift b/DolphinEnglishLearnStudent/Moudle/Home/Listen/VC/HomeListenMenuVC.swift
index 93f03ff..43ab46c 100644
--- a/DolphinEnglishLearnStudent/Moudle/Home/Listen/VC/HomeListenMenuVC.swift
+++ b/DolphinEnglishLearnStudent/Moudle/Home/Listen/VC/HomeListenMenuVC.swift
@@ -22,6 +22,13 @@
 				override func viewDidLoad() {
 								super.viewDidLoad()
 								getData()
+								Services.goodRecommend().subscribe(onNext: { data in
+												AwardListView.show(items: data.data ?? []) { _ in
+
+												}closeClouse: { () in
+
+												}
+								}).disposed(by: disposeBag)
 				}
 
 
diff --git a/DolphinEnglishLearnStudent/Moudle/Home/Listen/VC/HomeListenStory_1_VC.swift b/DolphinEnglishLearnStudent/Moudle/Home/Listen/VC/HomeListenStory_1_VC.swift
index a391dfa..d1e0594 100644
--- a/DolphinEnglishLearnStudent/Moudle/Home/Listen/VC/HomeListenStory_1_VC.swift
+++ b/DolphinEnglishLearnStudent/Moudle/Home/Listen/VC/HomeListenStory_1_VC.swift
@@ -53,6 +53,7 @@
 				override func viewDidDisappear(_ animated: Bool) {
 								super.viewDidDisappear(animated)
 								voicePlayer.delegate = nil
+								voicePlayer.playerInterrupt()
 				}
 
 				required init?(coder: NSCoder) {
@@ -106,8 +107,10 @@
 																var lessionType:Fight_lessonType = .none
 																if weakSelf.listen1Model.storyList[weakSelf.page].correct == handleView.vioceSoundUrl{
 																				lessionType = .success
+																				weakSelf.voicePlayer.playSuccessVoice()
 																}else{
 																				lessionType = .fail
+																				weakSelf.voicePlayer.playFailVoice()
 																}
 
 																switch lessionType {
diff --git a/DolphinEnglishLearnStudent/Moudle/Home/Listen/VC/HomeListenStory_2_VC.swift b/DolphinEnglishLearnStudent/Moudle/Home/Listen/VC/HomeListenStory_2_VC.swift
index 7bd884d..da55616 100644
--- a/DolphinEnglishLearnStudent/Moudle/Home/Listen/VC/HomeListenStory_2_VC.swift
+++ b/DolphinEnglishLearnStudent/Moudle/Home/Listen/VC/HomeListenStory_2_VC.swift
@@ -50,6 +50,11 @@
 
 				}
 
+				override func viewDidDisappear(_ animated: Bool) {
+								super.viewDidDisappear(animated)
+								voicePlayer.playerInterrupt()
+				}
+
 
 				override func setUI() {
 								super.setUI()
@@ -84,26 +89,6 @@
 								DispatchQueue.main.asyncAfter(wallDeadline: .now()+2){
 												handleView.playUrl = self.listen1Model.storyList[self.page].correct
 								}
-//								handleView.chooseClouse {[weak self] btn in
-////												guard let weakSelf = self else { return }
-//												var lessionType:Fight_lessonType = .none
-//												lessionType = .success
-//												switch lessionType {
-//																case .success:
-//																				handleView.btn_choose.isSelected = true
-//																				handleView.btn_state.setImage(UIImage(named: "icon_success_small"), for: .normal)
-//																				UIView.animate(withDuration: 0.5) {
-//																								handleView.btn_state.alpha = 1
-//																				}
-//																case .fail:
-//																				handleView.btn_state.setImage(UIImage(named: "icon_waring_small"), for: .normal)
-//																				UIView.animate(withDuration: 0.5) {
-//																								handleView.btn_state.alpha = 1
-//																				}
-//																default:
-//																				handleView.btn_state.setImage(nil, for: .normal)
-//												}
-//								}
 
 								handleView.snp.makeConstraints { make in
 												make.height.equalTo(52)
diff --git a/DolphinEnglishLearnStudent/Moudle/Home/Listen/VC/HomeListenSubVC.swift b/DolphinEnglishLearnStudent/Moudle/Home/Listen/VC/HomeListenSubVC.swift
index cd92118..bbc6477 100644
--- a/DolphinEnglishLearnStudent/Moudle/Home/Listen/VC/HomeListenSubVC.swift
+++ b/DolphinEnglishLearnStudent/Moudle/Home/Listen/VC/HomeListenSubVC.swift
@@ -56,7 +56,7 @@
 				}
 
 				private func getData(){
-								Services.studySchedule(week: week, day: page + 1).subscribe(onNext: {data in
+								Services.studySchedule(week: week).subscribe(onNext: {data in
 												self.studyScheduleModel = data.data
 												self.tableView.reloadData()
 								}).disposed(by: disposeBag)
diff --git a/DolphinEnglishLearnStudent/Moudle/Home/Listen/VC/HomeListenVC.swift b/DolphinEnglishLearnStudent/Moudle/Home/Listen/VC/HomeListenVC.swift
index af119d2..cfe7a1b 100644
--- a/DolphinEnglishLearnStudent/Moudle/Home/Listen/VC/HomeListenVC.swift
+++ b/DolphinEnglishLearnStudent/Moudle/Home/Listen/VC/HomeListenVC.swift
@@ -50,7 +50,7 @@
     override func viewDidLoad() {
         super.viewDidLoad()
 
-								Services.studySchedule(week: week, day: 1).subscribe(onNext: {data in
+								Services.studySchedule(week: week).subscribe(onNext: {data in
 												self.limitDay = data.data?.day ?? 0
 
 												#if DEBUG
diff --git a/DolphinEnglishLearnStudent/Moudle/Home/VC/HomeStudyCompleteVC.swift b/DolphinEnglishLearnStudent/Moudle/Home/VC/HomeStudyCompleteVC.swift
index d28f2be..9f7b9a3 100644
--- a/DolphinEnglishLearnStudent/Moudle/Home/VC/HomeStudyCompleteVC.swift
+++ b/DolphinEnglishLearnStudent/Moudle/Home/VC/HomeStudyCompleteVC.swift
@@ -53,6 +53,8 @@
 
 								stackView.isHidden = listenType == .story2
 								label_ratioNum.isHidden = listenType == .story2
+
+								NotificationCenter.default.post(name: Refresh_ListenSchedule_Noti, object: nil)
     }
 
 				override func setUI() {
diff --git a/DolphinEnglishLearnStudent/Moudle/Me/VC/AddressManageHandleVC.xib b/DolphinEnglishLearnStudent/Moudle/Me/VC/AddressManageHandleVC.xib
index b97b7a9..82c7c28 100644
--- a/DolphinEnglishLearnStudent/Moudle/Me/VC/AddressManageHandleVC.xib
+++ b/DolphinEnglishLearnStudent/Moudle/Me/VC/AddressManageHandleVC.xib
@@ -165,7 +165,7 @@
                                         <textField opaque="NO" contentMode="scaleToFill" horizontalHuggingPriority="248" contentHorizontalAlignment="left" contentVerticalAlignment="center" placeholder="请输入" textAlignment="right" minimumFontSize="17" translatesAutoresizingMaskIntoConstraints="NO" id="9Rg-uR-zdR" customClass="QMUITextField">
                                             <rect key="frame" x="90.5" y="0.0" width="778.5" height="54"/>
                                             <fontDescription key="fontDescription" type="system" weight="medium" pointSize="14"/>
-                                            <textInputTraits key="textInputTraits" keyboardType="phonePad"/>
+                                            <textInputTraits key="textInputTraits"/>
                                             <userDefinedRuntimeAttributes>
                                                 <userDefinedRuntimeAttribute type="number" keyPath="maximumTextLength">
                                                     <integer key="value" value="11"/>
diff --git a/DolphinEnglishLearnStudent/SceneDelegate.swift b/DolphinEnglishLearnStudent/SceneDelegate.swift
index c32eecd..45c8605 100644
--- a/DolphinEnglishLearnStudent/SceneDelegate.swift
+++ b/DolphinEnglishLearnStudent/SceneDelegate.swift
@@ -11,6 +11,7 @@
 class SceneDelegate: UIResponder, UIWindowSceneDelegate {
 
 				var window: UIWindow?
+				private var disposeBag = JQ_disposeBag
 
 				func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
 								guard let windowScene = (scene as? UIWindowScene) else { return }
@@ -81,6 +82,8 @@
 				func needLogin(){
 								sceneDelegate?.window?.rootViewController = BaseNav(rootViewController: LoginVC())
 								sceneDelegate?.window?.makeKeyAndVisible()
+								LoginTokenModel.clearToken()
+
 				}
 }
 
diff --git a/DolphinEnglishLearnStudent/Services/NetworkRequest.swift b/DolphinEnglishLearnStudent/Services/NetworkRequest.swift
index 03a8cf5..2a4a26f 100644
--- a/DolphinEnglishLearnStudent/Services/NetworkRequest.swift
+++ b/DolphinEnglishLearnStudent/Services/NetworkRequest.swift
@@ -231,15 +231,11 @@
 																								switch next.code{
 																												case 200:ob.onNext(next)
 																												case 504: //登录设备最大限制
-																																let attribute = AttributedStringbuilder.build().add(string:next.msg, withFont: .systemFont(ofSize: 14, weight: .medium), withColor: .black.withAlphaComponent(0.6)).mutableAttributedString
-//																																CommonAlertView.show(title: "提示", attribute: attribute, cancelStr: "关闭", completeStr: "关闭", isSingle: true, customBtnWidth: JQ_ScreenW - 170) { _ in
-//
-//																																}
+																																break
 																												case 503: //登录被冻结
-																																let attribute = AttributedStringbuilder.build().add(string:next.msg, withFont: .systemFont(ofSize: 14, weight: .medium), withColor: .black.withAlphaComponent(0.6)).mutableAttributedString
-//																																CommonAlertView.show(title: "提示", attribute: attribute, cancelStr: "关闭", completeStr: "关闭", isSingle: true, customBtnWidth: JQ_ScreenW - 170) { _ in
-//
-//																																}
+																																DispatchQueue.main.async {
+																																				alert(msg: next.msg)
+																																}
 //																												case 501:
 //																																CommonAlertView.show(title: "提示", content: next.msg,isSingle: true) { _ in
 //
@@ -252,7 +248,9 @@
 																																sceneDelegate?.needLogin()
 																												default:
 																																if !ignoreAlert{
-																																				alertError(msg: "\(next.msg)")
+																																				DispatchQueue.main.async {
+																																								alertError(msg: "\(next.msg)")
+																																				}
 																																}
 																																ob.onError(NetRequestError.Other(next.code,next.msg))
 																								}
diff --git a/DolphinEnglishLearnStudent/Services/Services.swift b/DolphinEnglishLearnStudent/Services/Services.swift
index 918b535..b804c5e 100644
--- a/DolphinEnglishLearnStudent/Services/Services.swift
+++ b/DolphinEnglishLearnStudent/Services/Services.swift
@@ -13,8 +13,9 @@
 
 #if DEBUG
 let All_Url = "http://192.168.110.237:9000"
+//let All_Url = "http://1.95.15.237:9000"
 #else
-let All_Url = "http://192.168.110.237:9000"
+let All_Url = "http://1.95.15.237:9000"
 #endif
 
 class Services: NSObject {
@@ -145,13 +146,24 @@
 								return NetworkRequest.request(params: params, method: .get, progress: true)
 				}
 
-				class func studySchedule(week:Int,day:Int)->Observable<BaseResponse<StudyScheduleModel>>{
+				class func studySchedule(week:Int)->Observable<BaseResponse<StudyScheduleModel>>{
 								let params = ParamsAppender.build(url: All_Url)
 								params.interface(url: "/study/base/study/studySchedule")
 								params.append(key: "week", value: week)
-								params.append(key: "day", value: day)
 								return NetworkRequest.request(params: params, method: .get, progress: true)
 				}
+
+				class func parentPage()->Observable<BaseResponse<String>>{
+								let params = ParamsAppender.build(url: All_Url)
+								params.interface(url: "/study/base/user/parentPage")
+								return NetworkRequest.request(params: params, method: .post, progress: false)
+				}
+
+				class func promptVoice()->Observable<BaseResponse<PromptVoiceModel>>{
+								let params = ParamsAppender.build(url: All_Url)
+								params.interface(url: "/study/base/study/promptVoice")
+								return NetworkRequest.request(params: params, method: .get, progress: false)
+				}
 }
 
 // MARK: -- 登录部分

--
Gitblit v1.7.1