无故事王国
2025-08-10 510991a68acc59e22602d95582e3b1cabdd093c2
DolphinEnglishLearnStudent/Models/CommonModel.swift
@@ -10,443 +10,464 @@
import UserDefaultsStore
struct LoginModel:HandyJSON{
            var token:LoginTokenModel?
    var token:LoginTokenModel?
}
struct LoginTokenModel:HandyJSON,Identifiable,Codable{
            static let idKey = \LoginTokenModel.id
            var id: Int = 0
    static let idKey = \LoginTokenModel.id
    var id: Int = 0
            var access_token = ""
            var expires_in = 0
            var request_time = 0 //请求时间
    var access_token = ""
    var expires_in = 0
    var request_time = 0 //请求时间
            private static let userInfo = UserDefaultsStore<LoginTokenModel>(uniqueIdentifier: "LoginTokenModel")!
    private static let userInfo = UserDefaultsStore<LoginTokenModel>(uniqueIdentifier: "LoginTokenModel")!
            static func saveToken(_ model:LoginTokenModel){
                        do{
                                    try LoginTokenModel.userInfo.save(model)
                        }catch{
    static func saveToken(_ model:LoginTokenModel){
        do{
            try LoginTokenModel.userInfo.save(model)
        }catch{
                        }
            }
        }
    }
            static func isOverdue()->Bool{
                        if let token = LoginTokenModel.getToken(){
                                    //过期时间(秒)
                                    let overdueTimeval = token.expires_in * 60 + token.request_time
                                    if overdueTimeval < Int(Date().timeIntervalSince1970){
                                                return true
                                    }
                                    return false
                        }
                        return true
            }
    static func isOverdue()->Bool{
        if let token = LoginTokenModel.getToken(){
            //过期时间(秒)
            let overdueTimeval = token.expires_in * 60 + token.request_time
            static func getToken()->LoginTokenModel?{
                        return LoginTokenModel.userInfo.allObjects().first
            }
            if overdueTimeval < Int(Date().timeIntervalSince1970){
                return true
            }
            return false
        }
        return true
    }
            static func clearToken(){
                        LoginTokenModel.userInfo.deleteAll()
            }
    static func getToken()->LoginTokenModel?{
        return LoginTokenModel.userInfo.allObjects().first
    }
    static func clearToken(){
        LoginTokenModel.userInfo.deleteAll()
    }
}
struct RecommendModel:HandyJSON{
            var basicCount: Int = 0
            var coverImg: String = ""
            var createBy: String = ""
            var createTime: String = ""
            var detail: String = ""
            var detailImg: String = ""
            var disabled: Bool = false
            var id: Int = 0
            var insertTime: String = ""
            var integral: Int = 0
            var inventory: Int = 0
            var isDelete: Int = 0
            var name: String = ""
            var price: Int = 0
            var surplus: Int = 0
            var total: Int = 0
            var type: Int = 0
            var typeIds: String = ""
            var updateBy: String = ""
            var updateTime: String = ""
            var userCount: Int = 0
    var basicCount: Int = 0
    var coverImg: String = ""
    var createBy: String = ""
    var createTime: String = ""
    var detail: String = ""
    var detailImg: String = ""
    var disabled: Bool = false
    var id: Int = 0
    var insertTime: String = ""
    var integral: Int = 0
    var inventory: Int = 0
    var isDelete: Int = 0
    var name: String = ""
    var price: Int = 0
    var surplus: Int = 0
    var total: Int = 0
    var type: Int = 0
    var typeIds: String = ""
    var updateBy: String = ""
    var updateTime: String = ""
    var userCount: Int = 0
}
struct MarketModel:HandyJSON{
            var basicCount: Int = 0
            var coverImg: String = ""
            var createBy: String = ""
            var createTime: String = ""
            var detail: String = ""
            var detailImg: String = ""
            var disabled: Bool = false
            var id: Int = 0
            var integral: Int = 0
            var inventory: Int = 0
            var isDelete: Int = 0
            var name: String = ""
            var price: Double = 0
            var surplus: Int?
            var total: Int = 0
            var type: Int = 0
            var typeIds: String = ""
            var updateBy: String = ""
            var updateTime: String = ""
            var userCount: Int?
    var basicCount: Int = 0
    var coverImg: String = ""
    var createBy: String = ""
    var createTime: String = ""
    var detail: String = ""
    var detailImg: String = ""
    var disabled: Bool = false
    var id: Int = 0
    var integral: Int = 0
    var inventory: Int = 0
    var isDelete: Int = 0
    var name: String = ""
    var price: Double = 0
    var surplus: Int?
    var total: Int = 0
    var type: Int = 0
    var typeIds: String = ""
    var updateBy: String = ""
    var updateTime: String = ""
    var userCount: Int?
}
struct MarketTypeModel:HandyJSON,Hashable{
            var id = 0
            var name = ""
    var id = 0
    var name = ""
}
struct MarketDetailModel:HandyJSON{
            var exchangeNumber: Int = 0
            var good: MarketModel?
            var goodTypes = [MarketTypeModel]()
            var orderNumber: String = ""
            var residueNumber:Int?
            var recipient: MarketRecipientModel?
    var exchangeNumber: Int = 0
    var good: MarketModel?
    var goodTypes = [MarketTypeModel]()
    var orderNumber: String = ""
    var residueNumber:Int?
    var recipient: MarketRecipientModel?
}
struct MarketRecipientModel:HandyJSON,Hashable{
            var id = 0
            var name = ""
    var id = 0
    var name = ""
}
struct AddressModel:HandyJSON{
            var address: String = ""
            var city: String = ""
            var cityCode: String = ""
            var createBy: String = ""
            var createTime: String = ""
            var disabled: Bool = false
            var id: Int = 0
            var isDefault: Int = 0
            var province: String = ""
            var provinceCode: String = ""
            var recipient: String = ""
            var recipientPhone: String = ""
            var updateBy: String = ""
            var updateTime: String = ""
            var userId: Int = 0
            var orderId:Int = 0
    var address: String = ""
    var city: String = ""
    var cityCode: String = ""
    var createBy: String = ""
    var createTime: String = ""
    var disabled: Bool = false
    var id: Int = 0
    var isDefault: Int = 0
    var province: String = ""
    var provinceCode: String = ""
    var recipient: String = ""
    var recipientPhone: String = ""
    var updateBy: String = ""
    var updateTime: String = ""
    var userId: Int = 0
    var orderId:Int = 0
}
struct AddressTreeModel:HandyJSON{
            var id = 0
            var name = ""
            var code = ""
            var parentId = 0
            var children:[AddressTreeModel]?
    var id = 0
    var name = ""
    var code = ""
    var parentId = 0
    var children:[AddressTreeModel]?
}
struct IntegralModel:HandyJSON{
            var createBy: String = ""
            var createTime: String = ""
            var disabled: Bool = false
            var gameId: Int = 0
            var id: Int = 0
            var integral: String = ""
            var method: String = ""
            var storyId: Int = 0
            var type: String = ""
            var updateBy: String = ""
            var updateTime: String = ""
            var userId: Int = 0
    var createBy: String = ""
    var createTime: String = ""
    var disabled: Bool = false
    var gameId: Int = 0
    var id: Int = 0
    var integral: String = ""
    var method: String = ""
    var storyId: Int = 0
    var type: String = ""
    var updateBy: String = ""
    var updateTime: String = ""
    var userId: Int = 0
}
struct ExchangeRecordModel:HandyJSON{
            var completeTime: String = ""
            var consigneeAddress: String = ""
            var consigneeName: String = ""
            var consigneePhone: String = ""
            var count: Int = 0
            var createBy: String = ""
            var createTime: String = ""
            var disabled: Bool = false
            var express: String = ""
            var expressNumber: String = ""
            var expressTime: String = ""
            var goodsId: Int = 0
            var goodsName: String = ""
            var id: Int = 0
            var insertTime: String = ""
            var integral: Int = 0
            var orderNumber: String = ""
            var orderId:Int = 0
            var state: Int = 0 //订单状态1待发货2已发货3已完成
            var updateBy: String = ""
            var updateTime: String = ""
            var userId: Int = 0
            var goodsType = [String]()
            var coverImg:String = ""
    var completeTime: String = ""
    var consigneeAddress: String = ""
    var consigneeName: String = ""
    var consigneePhone: String = ""
    var count: Int = 0
    var createBy: String = ""
    var createTime: String = ""
    var disabled: Bool = false
    var express: String = ""
    var expressNumber: String = ""
    var expressTime: String = ""
    var goodsId: Int = 0
    var goodsName: String = ""
    var id: Int = 0
    var insertTime: String = ""
    var integral: Int = 0
    var orderNumber: String = ""
    var orderId:Int = 0
    var state: Int = 0 //订单状态1待发货2已发货3已完成
    var updateBy: String = ""
    var updateTime: String = ""
    var userId: Int = 0
    var goodsType = [String]()
    var coverImg:String = ""
}
struct StudyGamesModel:HandyJSON{
            var gameRecordList = [StudyGamesRecordModel]()
            var record:StudyDataRecordModel?
    var gameRecordList = [StudyGamesRecordModel]()
    var record:StudyDataRecordModel?
}
struct StudyGamesRecordModel:HandyJSON{
            var accuracy: Int = 0
            var createBy: String = ""
            var time = ""
//            var createTime: String = ""
            var disabled: Bool = false
            var gameDifficulty: Int = 0
            var gameId: Int = 0
            var gameName: String = ""
            var id: Int = 0
            var updateBy: String = ""
//            var updateTime: String = ""
            var userId: Int = 0
            var useTime: Int = 0
    var accuracy: Int = 0
    var createBy: String = ""
    var time = ""
    //            var createTime: String = ""
    var disabled: Bool = false
    var gameDifficulty: Int = 0
    var gameId: Int = 0
    var gameName: String = ""
    var id: Int = 0
    var updateBy: String = ""
    //            var updateTime: String = ""
    var userId: Int = 0
    var useTime: Int = 0
}
struct StudyDataRecordModel:HandyJSON{
            var answer: Int = 0
            var createBy: String = ""
            var createTime: String = ""
            var day: Int = 0
            var disabled: Bool = false
            var id: Int = 0
            var induction: Int = 0
            var listen: Int = 0
            var look: Int = 0
            var monthStudy: Int = 0
            var pair: Int = 0
            var surplus: Int = 0
            var todayStudy: Int = 0
            var totalStudy: Int = 0
            var updateBy: String = ""
            var updateTime: String = ""
            var userId: Int = 0
            var week: Int = 0
            var weekStudy: Int = 0
    var answer: Int = 0
    var createBy: String = ""
    var createTime: String = ""
    var day: Int = 0
    var disabled: Bool = false
    var id: Int = 0
    var induction: Int = 0
    var listen: Int = 0
    var look: Int = 0
    var monthStudy: Int = 0
    var pair: Int = 0
    var surplus: Int = 0
    var todayStudy: Int = 0
    var totalStudy: Int = 0
    var updateBy: String = ""
    var updateTime: String = ""
    var userId: Int = 0
    var week: Int = 0
    var weekStudy: Int = 0
}
struct ListenWeekModel:HandyJSON{
            var id = 0
            var day = 0
            var quarter = 0
            var title = ""
            var totalIntegral = 0
            var type = 0
            var week = 0
            var canStudy = 0
    var id = 0
    var day = 0
    var quarter = 0
    var title = ""
    var totalIntegral = 0
    var type = 0
    var week = 0
    var canStudy = 0
}
class ListenNewModel:HandyJSON{
            var data:ListenNewDataModel?
            var subjectList = [[Listen1SubModel]]()
    var data:ListenNewDataModel?
    var list = [ListenSubCardModel]()
    var subjectList = [[Listen1SubModel]]()
    var accuracy:Double = 0
            required init(){}
    required init(){}
}
class ListenNewDataModel:HandyJSON{
            var id:String = ""
            var integral = 0
    var id:String = ""
    var integral = 0
            required init(){}
    required init(){}
}
class Listen1Model:HandyJSON{
            var data:Listen1DataModel?
            var subjectList = [Listen1SubModel]()
            var storyList = [Listen1SubModel]()
    var data:Listen1DataModel?
    var subjectList = [Listen1SubModel]()
    var storyList = [Listen1SubModel]()
            //超级记忆专用
            var photoList = [SimpleListenDataModel]()
            var voiceList = [SimpleListenDataModel]()
    //超级记忆专用
    var photoList = [SimpleListenDataModel]()
    var voiceList = [SimpleListenDataModel]()
            required init(){}
    required init(){}
}
struct TeamScheduleModel:HandyJSON{
            var answerNumber = 0
            var correctNumber = 0
            var teamIds = [Int]() //题组ids
            var topicIds = [Int]() //已回答正确的题目Id
            var schedule = 0
    var answerNumber = 0
    var correctNumber = 0
    var teamIds = [Int]() //题组ids
    var topicIds = [Int]() //已回答正确的题目Id
    var schedule = 0
}
struct Listen1DataModel:HandyJSON{
            var createBy: String = ""
            var createTime: String = ""
            var day: Int = 0
            var disabled: Bool = false
            var id: Int = 0
            var integral: Int = 0
            var isVip: Int = 0
            var studyId: Int = 0
            var subject: String = ""
            var updateBy: String = ""
            var updateTime: String = ""
            var week: Int = 0
            var answerCount = 0
            var answerIntegral = 0
            var answerTime = 0
            var time = 0
            var count = 0
            var lookIntegral = 0
    var createBy: String = ""
    var createTime: String = ""
    var day: Int = 0
    var disabled: Bool = false
    var id: Int = 0
    var integral: Int = 0
    var isVip: Int = 0
    var studyId: Int = 0
    var subject: String = ""
    var updateBy: String = ""
    var updateTime: String = ""
    var week: Int = 0
    var answerCount = 0
    var answerIntegral = 0
    var answerTime = 0
    var time = 0
    var count = 0
    var lookIntegral = 0
            //custom
            var playNow:Bool = false //立刻播放
    //custom
    var playNow:Bool = false //立刻播放
}
class ListenSubCardModel:HandyJSON{
    var createBy: String = ""
    var createTime: String = ""
    var day: Int = 0
    var disabled: Bool = false
    var id: Int = 0
    var objectId: Int = 0
    var one: Int = 0
    var status: Int = 0
    var two: Int = 0
    var type: Int = 0
    var updateBy: String = ""
    var updateTime: String = ""
    var userId: Int = 0
    var week: Int = 0
    required init(){}
}
class Listen1SubModel:HandyJSON,Hashable{
            static func == (lhs: Listen1SubModel, rhs: Listen1SubModel) -> Bool {
                        return lhs.id == rhs.id
            }
//            var hashValue: Int{
//                        return id
//            }
    static func == (lhs: Listen1SubModel, rhs: Listen1SubModel) -> Bool {
        return lhs.id == rhs.id
    }
            func hash(into hasher: inout Hasher) {
    //            var hashValue: Int{
    //                        return id
    //            }
            }
    func hash(into hasher: inout Hasher) {
    }
            required init() {}
    required init() {}
            var correct: String = ""
            var createBy: String = ""
            var createTime: String = ""
            var disabled: Bool = false
            var english: String = ""
            var error: String = ""
            var id: Int = 0
            var img: String = ""
            var name: String = ""
            var state: Int = 0
            var type: String = ""
            var updateBy: String = ""
            var updateTime: String = ""
    var correct: String = ""
    var createBy: String = ""
    var createTime: String = ""
    var disabled: Bool = false
    var english: String = ""
    var error: String = ""
    var id: Int = 0
    var img: String = ""
    var name: String = ""
    var state: Int = 0
    var type: String = ""
    var updateBy: String = ""
    var updateTime: String = ""
            //学习类型四专用
            var isQuestion:Int = 0
    //学习类型四专用
    var isQuestion:Int = 0
            //游戏类型2专用
            var isOpen:Bool = false
    //游戏类型2专用
    var isOpen:Bool = false
            // 自主学习1,3专用 (是否已回答)
            var isAnster:Bool = false
    // 自主学习1,3专用 (是否已回答)
    var isAnster:Bool = false
}
@available(*,deprecated,message: "废弃")
struct Listen4Model:HandyJSON{
            var data = [Listen4DataModel]()
    var data = [Listen4DataModel]()
}
struct Listen4DataModel:HandyJSON{
            var answerSubject: Int = 0
            var createBy: String = ""
            var createTime: String = ""
            var day: Int = 0
            var disabled: Bool = false
            var id: Int = 0
            var integral: Int = 0
            var isAnswer: Int = 0
            var isVip: Int = 0
            var studyId: Int = 0
            var subject: Int = 0
            var subjectList = [Listen1SubModel]()
            var updateBy: String = ""
            var updateTime: String = ""
            var week: Int = 0
    var answerSubject: Int = 0
    var createBy: String = ""
    var createTime: String = ""
    var day: Int = 0
    var disabled: Bool = false
    var id: Int = 0
    var integral: Int = 0
    var isAnswer: Int = 0
    var isVip: Int = 0
    var studyId: Int = 0
    var subject: Int = 0
    var subjectList = [Listen1SubModel]()
    var updateBy: String = ""
    var updateTime: String = ""
    var week: Int = 0
}
struct StudyScheduleModel:HandyJSON,Hashable{
            init() {}
            var answer: Int = 0
            var day: Int = 0
            var computeSchedule:Int = 0
            var id: Int = 0
            var induction: Int = 0
            var listen: Int = 0
            var look: Int = 0
            var monthStudy: Int = 0
            var pair: Int = 0
            var surplus: String = ""
            var todayStudy: Int = 0
            var totalStudy: Int = 0
            var userId: Int = 0
            var week: Int = 0
            var weekStudy: Int = 0
            var gameDifficulty:Int = 0
    init() {}
            var hashValue: Int{
                        return answer+day+computeSchedule+induction+listen+look+monthStudy+pair+todayStudy+totalStudy+week+weekStudy+gameDifficulty
            }
    var answer: Int = 0
    var day: Int = 0
    var computeSchedule:Int = 0
    var id: Int = 0
    var induction: Int = 0
    var listen: Int = 0
    var look: Int = 0
    var monthStudy: Int = 0
    var pair: Int = 0
    var surplus: String = ""
    var todayStudy: Int = 0
    var totalStudy: Int = 0
    var userId: Int = 0
    var week: Int = 0
    var weekStudy: Int = 0
    var gameDifficulty:Int = 0
    var hashValue: Int{
        return answer+day+computeSchedule+induction+listen+look+monthStudy+pair+todayStudy+totalStudy+week+weekStudy+gameDifficulty
    }
}
class SimpleListenDataModel:HandyJSON,Hashable{
            required init() {}
    required init() {}
            static func == (lhs: SimpleListenDataModel, rhs: SimpleListenDataModel) -> Bool {
                        return lhs.id == rhs.id
            }
    static func == (lhs: SimpleListenDataModel, rhs: SimpleListenDataModel) -> Bool {
        return lhs.id == rhs.id
    }
            func hash(into hasher: inout Hasher) {
    func hash(into hasher: inout Hasher) {
            }
    }
            var id = 0
            var photo = ""
            var voice = ""
    var id = 0
    var photo = ""
    var voice = ""
            //游戏类型2专用
            var isOpen:Bool = false
            var type = 0 // 1:图片 2:音频
    //游戏类型2专用
    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 = ""
    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 = ""
}
struct ShareInfoModel:HandyJSON{
            var title = ""
            var phone = ""
            var img = ""
    var title = ""
    var phone = ""
    var img = ""
}
struct VIPInfoModel:HandyJSON{
            var id = 0
            var info = ""
            var isVip = 0
            var time = 0
            var amount = 0
    var id = 0
    var info = ""
    var isVip = 0
    var time = 0
    var amount = 0
}
struct PaymentInfoModel:HandyJSON{
            var id = 0
            var orderId = 0
    var id = 0
    var orderId = 0
}