From b43fb9a9b1a56109fb56a42f86eeb19d2b3c307e Mon Sep 17 00:00:00 2001 From: wu736139669 Date: Wed, 25 Nov 2015 00:17:56 +0800 Subject: [PATCH] new --- Doctor.xcodeproj/project.pbxproj | 204 ++++++++++++++++++ Doctor/Config/Common.h | 66 ++++++ Doctor/Model/BaseAPIClient.h | 18 ++ Doctor/Model/BaseAPIClient.m | 34 +++ Doctor/Model/BaseEntity.h | 52 +++++ Doctor/Model/BaseEntity.m | 100 +++++++++ Doctor/Model/BaseModel.h | 17 ++ Doctor/Model/BaseModel.m | 47 ++++ Doctor/Model/BaseWLService.h | 18 ++ Doctor/Model/BaseWLService.m | 100 +++++++++ Doctor/Model/LoginModel.h | 22 ++ Doctor/Model/LoginModel.m | 61 ++++++ Doctor/Model/NSString+HXAddtions.h | 25 +++ Doctor/Model/NSString+HXAddtions.m | 125 +++++++++++ Doctor/PrefixHeader.pch | 22 ++ Doctor/Resource/about_logo@2x.png | Bin 0 -> 10284 bytes Doctor/Resource/brand.png | Bin 0 -> 4822 bytes Doctor/Resource/icon48.back.png | Bin 0 -> 370 bytes Doctor/Resource/icon48.scan.png | Bin 0 -> 261 bytes Doctor/Resource/icon48.search.png | Bin 0 -> 963 bytes Doctor/Resource/icon512.wlian.png | Bin 0 -> 34019 bytes Doctor/Resource/icon72.card.png | Bin 0 -> 482 bytes Doctor/Resource/icon72.charge@2x.png | Bin 0 -> 996 bytes Doctor/Resource/icon72.done.png | Bin 0 -> 1859 bytes Doctor/Resource/icon72.home.png | Bin 0 -> 842 bytes Doctor/Resource/icon72.logout.png | Bin 0 -> 1173 bytes Doctor/Resource/icon72.refund.png | Bin 0 -> 813 bytes Doctor/Resource/icon72.search.png | Bin 0 -> 1338 bytes Doctor/Resource/icon72.update.png | Bin 0 -> 1331 bytes Doctor/Resource/icon72.valid.png | Bin 0 -> 1633 bytes Doctor/Resource/icon72.wait.png | Bin 0 -> 2163 bytes Doctor/Resource/icon72.write.png | Bin 0 -> 944 bytes Doctor/Resource/titlebg.png | Bin 0 -> 185 bytes Doctor/Util/AWordDefault.h | 59 +++++ Doctor/Util/AWordDefault.m | 138 ++++++++++++ .../Util/MBProgressHUD/MBProgressHUD+Util.h | 24 +++ .../Util/MBProgressHUD/MBProgressHUD+Util.m | 71 ++++++ Doctor/View/LoginViewController.h | 14 ++ Doctor/View/LoginViewController.m | 106 +++++++++ Doctor/View/LoginViewController.xib | 140 ++++++++++++ Doctor/ViewModel/BaseViewModel.h | 16 ++ Doctor/ViewModel/BaseViewModel.m | 22 ++ Doctor/ViewModel/LoginViewModel.h | 23 ++ Doctor/ViewModel/LoginViewModel.m | 55 +++++ 44 files changed, 1579 insertions(+) create mode 100644 Doctor/Config/Common.h create mode 100644 Doctor/Model/BaseAPIClient.h create mode 100644 Doctor/Model/BaseAPIClient.m create mode 100644 Doctor/Model/BaseEntity.h create mode 100644 Doctor/Model/BaseEntity.m create mode 100644 Doctor/Model/BaseModel.h create mode 100644 Doctor/Model/BaseModel.m create mode 100644 Doctor/Model/BaseWLService.h create mode 100644 Doctor/Model/BaseWLService.m create mode 100644 Doctor/Model/LoginModel.h create mode 100644 Doctor/Model/LoginModel.m create mode 100644 Doctor/Model/NSString+HXAddtions.h create mode 100644 Doctor/Model/NSString+HXAddtions.m create mode 100644 Doctor/PrefixHeader.pch create mode 100644 Doctor/Resource/about_logo@2x.png create mode 100644 Doctor/Resource/brand.png create mode 100644 Doctor/Resource/icon48.back.png create mode 100644 Doctor/Resource/icon48.scan.png create mode 100644 Doctor/Resource/icon48.search.png create mode 100644 Doctor/Resource/icon512.wlian.png create mode 100644 Doctor/Resource/icon72.card.png create mode 100644 Doctor/Resource/icon72.charge@2x.png create mode 100644 Doctor/Resource/icon72.done.png create mode 100644 Doctor/Resource/icon72.home.png create mode 100644 Doctor/Resource/icon72.logout.png create mode 100644 Doctor/Resource/icon72.refund.png create mode 100644 Doctor/Resource/icon72.search.png create mode 100644 Doctor/Resource/icon72.update.png create mode 100644 Doctor/Resource/icon72.valid.png create mode 100644 Doctor/Resource/icon72.wait.png create mode 100644 Doctor/Resource/icon72.write.png create mode 100644 Doctor/Resource/titlebg.png create mode 100644 Doctor/Util/AWordDefault.h create mode 100644 Doctor/Util/AWordDefault.m create mode 100644 Doctor/Util/MBProgressHUD/MBProgressHUD+Util.h create mode 100644 Doctor/Util/MBProgressHUD/MBProgressHUD+Util.m create mode 100644 Doctor/View/LoginViewController.h create mode 100644 Doctor/View/LoginViewController.m create mode 100644 Doctor/View/LoginViewController.xib create mode 100644 Doctor/ViewModel/BaseViewModel.h create mode 100644 Doctor/ViewModel/BaseViewModel.m create mode 100644 Doctor/ViewModel/LoginViewModel.h create mode 100644 Doctor/ViewModel/LoginViewModel.m diff --git a/Doctor.xcodeproj/project.pbxproj b/Doctor.xcodeproj/project.pbxproj index 70a9254..0714527 100644 --- a/Doctor.xcodeproj/project.pbxproj +++ b/Doctor.xcodeproj/project.pbxproj @@ -14,6 +14,36 @@ A9841F2C1C04357C00FB72AA /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = A9841F2A1C04357C00FB72AA /* Main.storyboard */; }; A9841F2E1C04357C00FB72AA /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = A9841F2D1C04357C00FB72AA /* Assets.xcassets */; }; A9841F311C04357C00FB72AA /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = A9841F2F1C04357C00FB72AA /* LaunchScreen.storyboard */; }; + A986A3531C04C4DC00B55F38 /* BaseAPIClient.m in Sources */ = {isa = PBXBuildFile; fileRef = A986A3261C04C4DC00B55F38 /* BaseAPIClient.m */; }; + A986A3541C04C4DC00B55F38 /* BaseEntity.m in Sources */ = {isa = PBXBuildFile; fileRef = A986A3281C04C4DC00B55F38 /* BaseEntity.m */; }; + A986A3551C04C4DC00B55F38 /* BaseModel.m in Sources */ = {isa = PBXBuildFile; fileRef = A986A32A1C04C4DC00B55F38 /* BaseModel.m */; }; + A986A3561C04C4DC00B55F38 /* BaseWLService.m in Sources */ = {isa = PBXBuildFile; fileRef = A986A32C1C04C4DC00B55F38 /* BaseWLService.m */; }; + A986A3571C04C4DC00B55F38 /* LoginModel.m in Sources */ = {isa = PBXBuildFile; fileRef = A986A32E1C04C4DC00B55F38 /* LoginModel.m */; }; + A986A3581C04C4DC00B55F38 /* NSString+HXAddtions.m in Sources */ = {isa = PBXBuildFile; fileRef = A986A3301C04C4DC00B55F38 /* NSString+HXAddtions.m */; }; + A986A3591C04C4DC00B55F38 /* about_logo@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = A986A3321C04C4DC00B55F38 /* about_logo@2x.png */; }; + A986A35A1C04C4DC00B55F38 /* brand.png in Resources */ = {isa = PBXBuildFile; fileRef = A986A3331C04C4DC00B55F38 /* brand.png */; }; + A986A35B1C04C4DC00B55F38 /* icon48.back.png in Resources */ = {isa = PBXBuildFile; fileRef = A986A3341C04C4DC00B55F38 /* icon48.back.png */; }; + A986A35C1C04C4DC00B55F38 /* icon48.scan.png in Resources */ = {isa = PBXBuildFile; fileRef = A986A3351C04C4DC00B55F38 /* icon48.scan.png */; }; + A986A35D1C04C4DC00B55F38 /* icon48.search.png in Resources */ = {isa = PBXBuildFile; fileRef = A986A3361C04C4DC00B55F38 /* icon48.search.png */; }; + A986A35E1C04C4DC00B55F38 /* icon512.wlian.png in Resources */ = {isa = PBXBuildFile; fileRef = A986A3371C04C4DC00B55F38 /* icon512.wlian.png */; }; + A986A35F1C04C4DC00B55F38 /* icon72.card.png in Resources */ = {isa = PBXBuildFile; fileRef = A986A3381C04C4DC00B55F38 /* icon72.card.png */; }; + A986A3601C04C4DC00B55F38 /* icon72.charge@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = A986A3391C04C4DC00B55F38 /* icon72.charge@2x.png */; }; + A986A3611C04C4DC00B55F38 /* icon72.done.png in Resources */ = {isa = PBXBuildFile; fileRef = A986A33A1C04C4DC00B55F38 /* icon72.done.png */; }; + A986A3621C04C4DC00B55F38 /* icon72.home.png in Resources */ = {isa = PBXBuildFile; fileRef = A986A33B1C04C4DC00B55F38 /* icon72.home.png */; }; + A986A3631C04C4DC00B55F38 /* icon72.logout.png in Resources */ = {isa = PBXBuildFile; fileRef = A986A33C1C04C4DC00B55F38 /* icon72.logout.png */; }; + A986A3641C04C4DC00B55F38 /* icon72.refund.png in Resources */ = {isa = PBXBuildFile; fileRef = A986A33D1C04C4DC00B55F38 /* icon72.refund.png */; }; + A986A3651C04C4DC00B55F38 /* icon72.search.png in Resources */ = {isa = PBXBuildFile; fileRef = A986A33E1C04C4DC00B55F38 /* icon72.search.png */; }; + A986A3661C04C4DC00B55F38 /* icon72.update.png in Resources */ = {isa = PBXBuildFile; fileRef = A986A33F1C04C4DC00B55F38 /* icon72.update.png */; }; + A986A3671C04C4DC00B55F38 /* icon72.valid.png in Resources */ = {isa = PBXBuildFile; fileRef = A986A3401C04C4DC00B55F38 /* icon72.valid.png */; }; + A986A3681C04C4DC00B55F38 /* icon72.wait.png in Resources */ = {isa = PBXBuildFile; fileRef = A986A3411C04C4DC00B55F38 /* icon72.wait.png */; }; + A986A3691C04C4DC00B55F38 /* icon72.write.png in Resources */ = {isa = PBXBuildFile; fileRef = A986A3421C04C4DC00B55F38 /* icon72.write.png */; }; + A986A36A1C04C4DC00B55F38 /* titlebg.png in Resources */ = {isa = PBXBuildFile; fileRef = A986A3431C04C4DC00B55F38 /* titlebg.png */; }; + A986A36B1C04C4DC00B55F38 /* AWordDefault.m in Sources */ = {isa = PBXBuildFile; fileRef = A986A3461C04C4DC00B55F38 /* AWordDefault.m */; }; + A986A36C1C04C4DC00B55F38 /* MBProgressHUD+Util.m in Sources */ = {isa = PBXBuildFile; fileRef = A986A3491C04C4DC00B55F38 /* MBProgressHUD+Util.m */; }; + A986A36D1C04C4DC00B55F38 /* LoginViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = A986A34C1C04C4DC00B55F38 /* LoginViewController.m */; }; + A986A36E1C04C4DC00B55F38 /* LoginViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = A986A34D1C04C4DC00B55F38 /* LoginViewController.xib */; }; + A986A36F1C04C4DC00B55F38 /* BaseViewModel.m in Sources */ = {isa = PBXBuildFile; fileRef = A986A3501C04C4DC00B55F38 /* BaseViewModel.m */; }; + A986A3701C04C4DC00B55F38 /* LoginViewModel.m in Sources */ = {isa = PBXBuildFile; fileRef = A986A3521C04C4DC00B55F38 /* LoginViewModel.m */; }; /* End PBXBuildFile section */ /* Begin PBXFileReference section */ @@ -30,6 +60,49 @@ A9841F2D1C04357C00FB72AA /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; A9841F301C04357C00FB72AA /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; A9841F321C04357C00FB72AA /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + A986A3231C04C4DC00B55F38 /* Common.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Common.h; sourceTree = ""; }; + A986A3251C04C4DC00B55F38 /* BaseAPIClient.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BaseAPIClient.h; sourceTree = ""; }; + A986A3261C04C4DC00B55F38 /* BaseAPIClient.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BaseAPIClient.m; sourceTree = ""; }; + A986A3271C04C4DC00B55F38 /* BaseEntity.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BaseEntity.h; sourceTree = ""; }; + A986A3281C04C4DC00B55F38 /* BaseEntity.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BaseEntity.m; sourceTree = ""; }; + A986A3291C04C4DC00B55F38 /* BaseModel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BaseModel.h; sourceTree = ""; }; + A986A32A1C04C4DC00B55F38 /* BaseModel.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BaseModel.m; sourceTree = ""; }; + A986A32B1C04C4DC00B55F38 /* BaseWLService.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BaseWLService.h; sourceTree = ""; }; + A986A32C1C04C4DC00B55F38 /* BaseWLService.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BaseWLService.m; sourceTree = ""; }; + A986A32D1C04C4DC00B55F38 /* LoginModel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LoginModel.h; sourceTree = ""; }; + A986A32E1C04C4DC00B55F38 /* LoginModel.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = LoginModel.m; sourceTree = ""; }; + A986A32F1C04C4DC00B55F38 /* NSString+HXAddtions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSString+HXAddtions.h"; sourceTree = ""; }; + A986A3301C04C4DC00B55F38 /* NSString+HXAddtions.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSString+HXAddtions.m"; sourceTree = ""; }; + A986A3321C04C4DC00B55F38 /* about_logo@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "about_logo@2x.png"; sourceTree = ""; }; + A986A3331C04C4DC00B55F38 /* brand.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = brand.png; sourceTree = ""; }; + A986A3341C04C4DC00B55F38 /* icon48.back.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = icon48.back.png; sourceTree = ""; }; + A986A3351C04C4DC00B55F38 /* icon48.scan.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = icon48.scan.png; sourceTree = ""; }; + A986A3361C04C4DC00B55F38 /* icon48.search.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = icon48.search.png; sourceTree = ""; }; + A986A3371C04C4DC00B55F38 /* icon512.wlian.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = icon512.wlian.png; sourceTree = ""; }; + A986A3381C04C4DC00B55F38 /* icon72.card.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = icon72.card.png; sourceTree = ""; }; + A986A3391C04C4DC00B55F38 /* icon72.charge@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "icon72.charge@2x.png"; sourceTree = ""; }; + A986A33A1C04C4DC00B55F38 /* icon72.done.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = icon72.done.png; sourceTree = ""; }; + A986A33B1C04C4DC00B55F38 /* icon72.home.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = icon72.home.png; sourceTree = ""; }; + A986A33C1C04C4DC00B55F38 /* icon72.logout.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = icon72.logout.png; sourceTree = ""; }; + A986A33D1C04C4DC00B55F38 /* icon72.refund.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = icon72.refund.png; sourceTree = ""; }; + A986A33E1C04C4DC00B55F38 /* icon72.search.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = icon72.search.png; sourceTree = ""; }; + A986A33F1C04C4DC00B55F38 /* icon72.update.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = icon72.update.png; sourceTree = ""; }; + A986A3401C04C4DC00B55F38 /* icon72.valid.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = icon72.valid.png; sourceTree = ""; }; + A986A3411C04C4DC00B55F38 /* icon72.wait.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = icon72.wait.png; sourceTree = ""; }; + A986A3421C04C4DC00B55F38 /* icon72.write.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = icon72.write.png; sourceTree = ""; }; + A986A3431C04C4DC00B55F38 /* titlebg.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = titlebg.png; sourceTree = ""; }; + A986A3451C04C4DC00B55F38 /* AWordDefault.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AWordDefault.h; sourceTree = ""; }; + A986A3461C04C4DC00B55F38 /* AWordDefault.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AWordDefault.m; sourceTree = ""; }; + A986A3481C04C4DC00B55F38 /* MBProgressHUD+Util.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "MBProgressHUD+Util.h"; sourceTree = ""; }; + A986A3491C04C4DC00B55F38 /* MBProgressHUD+Util.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "MBProgressHUD+Util.m"; sourceTree = ""; }; + A986A34B1C04C4DC00B55F38 /* LoginViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LoginViewController.h; sourceTree = ""; }; + A986A34C1C04C4DC00B55F38 /* LoginViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = LoginViewController.m; sourceTree = ""; }; + A986A34D1C04C4DC00B55F38 /* LoginViewController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = LoginViewController.xib; sourceTree = ""; }; + A986A34F1C04C4DC00B55F38 /* BaseViewModel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BaseViewModel.h; sourceTree = ""; }; + A986A3501C04C4DC00B55F38 /* BaseViewModel.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BaseViewModel.m; sourceTree = ""; }; + A986A3511C04C4DC00B55F38 /* LoginViewModel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LoginViewModel.h; sourceTree = ""; }; + A986A3521C04C4DC00B55F38 /* LoginViewModel.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = LoginViewModel.m; sourceTree = ""; }; + A986A3711C04C4EE00B55F38 /* PrefixHeader.pch */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PrefixHeader.pch; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -73,6 +146,12 @@ A9841F201C04357C00FB72AA /* Doctor */ = { isa = PBXGroup; children = ( + A986A3221C04C4DC00B55F38 /* Config */, + A986A3241C04C4DC00B55F38 /* Model */, + A986A3311C04C4DC00B55F38 /* Resource */, + A986A3441C04C4DC00B55F38 /* Util */, + A986A34A1C04C4DC00B55F38 /* View */, + A986A34E1C04C4DC00B55F38 /* ViewModel */, A9841F241C04357C00FB72AA /* AppDelegate.h */, A9841F251C04357C00FB72AA /* AppDelegate.m */, A9841F271C04357C00FB72AA /* ViewController.h */, @@ -89,11 +168,104 @@ A9841F211C04357C00FB72AA /* Supporting Files */ = { isa = PBXGroup; children = ( + A986A3711C04C4EE00B55F38 /* PrefixHeader.pch */, A9841F221C04357C00FB72AA /* main.m */, ); name = "Supporting Files"; sourceTree = ""; }; + A986A3221C04C4DC00B55F38 /* Config */ = { + isa = PBXGroup; + children = ( + A986A3231C04C4DC00B55F38 /* Common.h */, + ); + path = Config; + sourceTree = ""; + }; + A986A3241C04C4DC00B55F38 /* Model */ = { + isa = PBXGroup; + children = ( + A986A3251C04C4DC00B55F38 /* BaseAPIClient.h */, + A986A3261C04C4DC00B55F38 /* BaseAPIClient.m */, + A986A3271C04C4DC00B55F38 /* BaseEntity.h */, + A986A3281C04C4DC00B55F38 /* BaseEntity.m */, + A986A3291C04C4DC00B55F38 /* BaseModel.h */, + A986A32A1C04C4DC00B55F38 /* BaseModel.m */, + A986A32B1C04C4DC00B55F38 /* BaseWLService.h */, + A986A32C1C04C4DC00B55F38 /* BaseWLService.m */, + A986A32D1C04C4DC00B55F38 /* LoginModel.h */, + A986A32E1C04C4DC00B55F38 /* LoginModel.m */, + A986A32F1C04C4DC00B55F38 /* NSString+HXAddtions.h */, + A986A3301C04C4DC00B55F38 /* NSString+HXAddtions.m */, + ); + path = Model; + sourceTree = ""; + }; + A986A3311C04C4DC00B55F38 /* Resource */ = { + isa = PBXGroup; + children = ( + A986A3321C04C4DC00B55F38 /* about_logo@2x.png */, + A986A3331C04C4DC00B55F38 /* brand.png */, + A986A3341C04C4DC00B55F38 /* icon48.back.png */, + A986A3351C04C4DC00B55F38 /* icon48.scan.png */, + A986A3361C04C4DC00B55F38 /* icon48.search.png */, + A986A3371C04C4DC00B55F38 /* icon512.wlian.png */, + A986A3381C04C4DC00B55F38 /* icon72.card.png */, + A986A3391C04C4DC00B55F38 /* icon72.charge@2x.png */, + A986A33A1C04C4DC00B55F38 /* icon72.done.png */, + A986A33B1C04C4DC00B55F38 /* icon72.home.png */, + A986A33C1C04C4DC00B55F38 /* icon72.logout.png */, + A986A33D1C04C4DC00B55F38 /* icon72.refund.png */, + A986A33E1C04C4DC00B55F38 /* icon72.search.png */, + A986A33F1C04C4DC00B55F38 /* icon72.update.png */, + A986A3401C04C4DC00B55F38 /* icon72.valid.png */, + A986A3411C04C4DC00B55F38 /* icon72.wait.png */, + A986A3421C04C4DC00B55F38 /* icon72.write.png */, + A986A3431C04C4DC00B55F38 /* titlebg.png */, + ); + path = Resource; + sourceTree = ""; + }; + A986A3441C04C4DC00B55F38 /* Util */ = { + isa = PBXGroup; + children = ( + A986A3451C04C4DC00B55F38 /* AWordDefault.h */, + A986A3461C04C4DC00B55F38 /* AWordDefault.m */, + A986A3471C04C4DC00B55F38 /* MBProgressHUD */, + ); + path = Util; + sourceTree = ""; + }; + A986A3471C04C4DC00B55F38 /* MBProgressHUD */ = { + isa = PBXGroup; + children = ( + A986A3481C04C4DC00B55F38 /* MBProgressHUD+Util.h */, + A986A3491C04C4DC00B55F38 /* MBProgressHUD+Util.m */, + ); + path = MBProgressHUD; + sourceTree = ""; + }; + A986A34A1C04C4DC00B55F38 /* View */ = { + isa = PBXGroup; + children = ( + A986A34B1C04C4DC00B55F38 /* LoginViewController.h */, + A986A34C1C04C4DC00B55F38 /* LoginViewController.m */, + A986A34D1C04C4DC00B55F38 /* LoginViewController.xib */, + ); + path = View; + sourceTree = ""; + }; + A986A34E1C04C4DC00B55F38 /* ViewModel */ = { + isa = PBXGroup; + children = ( + A986A34F1C04C4DC00B55F38 /* BaseViewModel.h */, + A986A3501C04C4DC00B55F38 /* BaseViewModel.m */, + A986A3511C04C4DC00B55F38 /* LoginViewModel.h */, + A986A3521C04C4DC00B55F38 /* LoginViewModel.m */, + ); + path = ViewModel; + sourceTree = ""; + }; EE0E51118CD397393147ABC3 /* Pods */ = { isa = PBXGroup; children = ( @@ -163,9 +335,28 @@ isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( + A986A35F1C04C4DC00B55F38 /* icon72.card.png in Resources */, + A986A35B1C04C4DC00B55F38 /* icon48.back.png in Resources */, + A986A36E1C04C4DC00B55F38 /* LoginViewController.xib in Resources */, + A986A3641C04C4DC00B55F38 /* icon72.refund.png in Resources */, A9841F311C04357C00FB72AA /* LaunchScreen.storyboard in Resources */, + A986A3591C04C4DC00B55F38 /* about_logo@2x.png in Resources */, + A986A36A1C04C4DC00B55F38 /* titlebg.png in Resources */, + A986A35C1C04C4DC00B55F38 /* icon48.scan.png in Resources */, + A986A3681C04C4DC00B55F38 /* icon72.wait.png in Resources */, + A986A35E1C04C4DC00B55F38 /* icon512.wlian.png in Resources */, + A986A3631C04C4DC00B55F38 /* icon72.logout.png in Resources */, + A986A3661C04C4DC00B55F38 /* icon72.update.png in Resources */, + A986A3691C04C4DC00B55F38 /* icon72.write.png in Resources */, A9841F2E1C04357C00FB72AA /* Assets.xcassets in Resources */, + A986A35D1C04C4DC00B55F38 /* icon48.search.png in Resources */, + A986A3651C04C4DC00B55F38 /* icon72.search.png in Resources */, + A986A3611C04C4DC00B55F38 /* icon72.done.png in Resources */, + A986A35A1C04C4DC00B55F38 /* brand.png in Resources */, A9841F2C1C04357C00FB72AA /* Main.storyboard in Resources */, + A986A3671C04C4DC00B55F38 /* icon72.valid.png in Resources */, + A986A3621C04C4DC00B55F38 /* icon72.home.png in Resources */, + A986A3601C04C4DC00B55F38 /* icon72.charge@2x.png in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -224,9 +415,20 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( + A986A3581C04C4DC00B55F38 /* NSString+HXAddtions.m in Sources */, + A986A3551C04C4DC00B55F38 /* BaseModel.m in Sources */, + A986A3571C04C4DC00B55F38 /* LoginModel.m in Sources */, A9841F291C04357C00FB72AA /* ViewController.m in Sources */, + A986A3701C04C4DC00B55F38 /* LoginViewModel.m in Sources */, + A986A36F1C04C4DC00B55F38 /* BaseViewModel.m in Sources */, + A986A3541C04C4DC00B55F38 /* BaseEntity.m in Sources */, + A986A36B1C04C4DC00B55F38 /* AWordDefault.m in Sources */, + A986A36C1C04C4DC00B55F38 /* MBProgressHUD+Util.m in Sources */, A9841F261C04357C00FB72AA /* AppDelegate.m in Sources */, + A986A36D1C04C4DC00B55F38 /* LoginViewController.m in Sources */, + A986A3531C04C4DC00B55F38 /* BaseAPIClient.m in Sources */, A9841F231C04357C00FB72AA /* main.m in Sources */, + A986A3561C04C4DC00B55F38 /* BaseWLService.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -337,6 +539,7 @@ baseConfigurationReference = 039B3B8DE609FF96BF1F8983 /* Pods.debug.xcconfig */; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + GCC_PREFIX_HEADER = Doctor/PrefixHeader.pch; INFOPLIST_FILE = Doctor/Info.plist; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = ash.Doctor; @@ -349,6 +552,7 @@ baseConfigurationReference = 1FF024B7A433F169D4A7C1DB /* Pods.release.xcconfig */; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + GCC_PREFIX_HEADER = Doctor/PrefixHeader.pch; INFOPLIST_FILE = Doctor/Info.plist; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = ash.Doctor; diff --git a/Doctor/Config/Common.h b/Doctor/Config/Common.h new file mode 100644 index 0000000..0af7728 --- /dev/null +++ b/Doctor/Config/Common.h @@ -0,0 +1,66 @@ +// +// Common.h +// Ash_AWord +// +// Created by xmfish on 15/3/30. +// Copyright (c) 2015年 ash. All rights reserved. +// + +#ifndef Ash_AWord_Common_h +#define Ash_AWord_Common_h + +#ifdef DEBUG +#ifndef DLog +# define DLog(fmt, ...) {NSLog((@"%s [Line %d] " fmt), __PRETTY_FUNCTION__, __LINE__, ##__VA_ARGS__);} +#endif +#ifndef ELog +# define ELog(err) {if(err) DLog(@"%@", err)} +#endif +#else +#ifndef DLog +# define DLog(...) +#endif +#ifndef ELog +# define ELog(err) +#endif +#endif + + + +/** + * 系统版本 + */ +#define iOSVersion ([[[UIDevice currentDevice] systemVersion] floatValue]) //系统版本 +#define iOS7AndLater ( [[[UIDevice currentDevice] systemVersion] compare:@"7.0"] != NSOrderedAscending ) + +#define isiPhone5 ([[UIScreen mainScreen] bounds].size.height == 568) +#define isiPhone4s ([[UIScreen mainScreen] bounds].size.height == 480) + +/** + * 获取当前window宽高 + */ +#define kScreenWidth ([[UIScreen mainScreen] bounds].size.width) +#define kScreenHeight ([[UIScreen mainScreen] bounds].size.height) + +#define kMainScreenFrame ([[UIScreen mainScreen] bounds]) + + + + +//文字标签 +#define kNetworkErrorTips @"网络连接失败" +#define kSSoErrorTips @"授权失败,请重新授权" +#define kLoginTips @"登录中" +#define kLoadingTips @"加载中。。。" +/** + * 接口地址 + */ + +#define WL_API_URL @"http://mapi.wlian.com/gateway/" +#define WL_DEV_API_URL @"http://api.dev.wliantx.com/gateway/" + + +#define DefaultUserIcon [UIImage imageNamed:@"defaultUserIcon"] + +#define DefaultPageSize 20 +#endif diff --git a/Doctor/Model/BaseAPIClient.h b/Doctor/Model/BaseAPIClient.h new file mode 100644 index 0000000..7ea1c6d --- /dev/null +++ b/Doctor/Model/BaseAPIClient.h @@ -0,0 +1,18 @@ +// +// BaseAPIClient.h +// WlianWorld +// +// Created by xmfish on 15/11/13. +// Copyright © 2015年 ash. All rights reserved. +// + +#import +#import "AFHTTPRequestOperationManager.h" + + +@interface BaseAPIClient : AFHTTPRequestOperationManager + ++ (instancetype)sharedClient; ++ (NSString *)getApiBaseString; + +@end diff --git a/Doctor/Model/BaseAPIClient.m b/Doctor/Model/BaseAPIClient.m new file mode 100644 index 0000000..9b12472 --- /dev/null +++ b/Doctor/Model/BaseAPIClient.m @@ -0,0 +1,34 @@ +// +// BaseAPIClient.m +// WlianWorld +// +// Created by xmfish on 15/11/13. +// Copyright © 2015年 ash. All rights reserved. +// + +#import "BaseAPIClient.h" + +@implementation BaseAPIClient + + ++ (instancetype)sharedClient +{ + static BaseAPIClient *_sharedClient = nil; + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + _sharedClient = [[BaseAPIClient alloc] initWithBaseURL:[NSURL URLWithString:[self getApiBaseString]]]; + _sharedClient.securityPolicy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModeNone]; + + [_sharedClient.requestSerializer setValue:@"text/html" forHTTPHeaderField:@"Content-Type"]; + _sharedClient.responseSerializer.acceptableContentTypes = [NSSet setWithObject:@"text/html"]; + + }); + + return _sharedClient; +} + ++ (NSString *)getApiBaseString +{ + return WL_DEV_API_URL; +} +@end diff --git a/Doctor/Model/BaseEntity.h b/Doctor/Model/BaseEntity.h new file mode 100644 index 0000000..9f95111 --- /dev/null +++ b/Doctor/Model/BaseEntity.h @@ -0,0 +1,52 @@ +// +// BaseEntity.h +// WlianWorld +// +// Created by xmfish on 15/11/13. +// Copyright © 2015年 ash. All rights reserved. +// + +#import + + +typedef NS_ENUM(NSUInteger, HTTPRequestType) { + HTTPRequestTypeWithGET = 0, + HTTPRequestTypeWithPOST, + HTTPRequestTypeWithPOSTDATA, +}; + +@class responesOBJ,DCParserConfiguration; + +@interface proFile : NSObject + +@property (nonatomic, strong) NSData *data; +@property (nonatomic, strong) NSString *name; //参数名称 +@property (nonatomic, strong) NSString *filePath; +//@"image/jpeg" +@property (nonatomic, strong) NSString *mimeType; + +@property (nonatomic, strong) NSArray *img; + +@end + +// +@interface BaseEntity : NSObject + +@property (nonatomic, assign) HTTPRequestType requireType; +@property (nonatomic, copy) NSString *reqURL; +@property (nonatomic, copy) NSString *callback; +@property (nonatomic, strong)NSString* cacheKey; +@property (nonatomic, strong) id pro; +@property (nonatomic, assign) Class responesOBJ; +@property (nonatomic, strong)DCParserConfiguration* config; + +@property (nonatomic, strong) proFile *pFile; +//@property (nonatomic, strong) NSArray *img; + +@property (nonatomic, assign) BOOL isCache; + +@property (nonatomic, copy) NSString *localJsonFileName; + +- (NSDictionary *)encodePro; + +@end diff --git a/Doctor/Model/BaseEntity.m b/Doctor/Model/BaseEntity.m new file mode 100644 index 0000000..2389355 --- /dev/null +++ b/Doctor/Model/BaseEntity.m @@ -0,0 +1,100 @@ +// +// BaseEntity.m +// WlianWorld +// +// Created by xmfish on 15/11/13. +// Copyright © 2015年 ash. All rights reserved. +// + +#import "BaseEntity.h" +#import "BaseModel.h" +#import "NSString+HXAddtions.h" +#import "AWordDefault.h" +@implementation proFile + +@end +static NSString* app_key = @"123456"; +static NSString* app_key_secret = @"z*~#@kR^*N"; +@implementation BaseEntity +- (NSDictionary *)encodePro +{ + + NSMutableDictionary* dic= [NSMutableDictionary dictionary];; + + + [dic setObject:_callback forKey:@"callback"]; + if(_pro) + { + [dic setObject:_pro forKey:@"params"]; + } + [dic setObject:@"1" forKey:@"devicecode"]; + + NSString* uid = [AWordDefault getUid]; + if (uid) { + [dic setObject:uid forKey:@"uid"]; + } + [dic setObject:@"shop1" forKey:@"username"]; + NSString* token = [AWordDefault getToken]; + if (token) { + [dic setObject:token forKey:@"token"]; + } + NSString* shopid = [AWordDefault getShopId]; + if (shopid) { + [dic setObject:shopid forKey:@"shopid"]; + } + NSTimeInterval timeStamp = [[NSDate date] timeIntervalSince1970]; + [dic setObject:[NSString stringWithFormat:@"%f", timeStamp] forKey:@"timestamp"]; + + [dic setObject:[self getSignWithDic:dic] forKey:@"sign"]; + + + DLog(@"参数是:%@",dic); + NSString* jsonKey = [NSString jsonStringWithDictionary:(NSDictionary*)dic]; + NSData *nsdata = [jsonKey + dataUsingEncoding:NSUTF8StringEncoding]; + NSString *baseKey = [nsdata base64EncodedStringWithOptions:0]; + NSMutableString *key = [[NSMutableString alloc]initWithString:baseKey]; + [key stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; + NSDictionary *resultDic = @{@"key":key}; + return resultDic; +} + + +-(NSString*)getSignWithDic:(NSDictionary*)dic +{ + NSString* resultStr = [self getStrWithDic:dic]; + NSString* appkey = [NSString stringWithFormat:@"%@%@",app_key,app_key_secret]; + NSString* md5Appkey = [[appkey md5] substringWithRange:NSMakeRange(8, 18)]; + resultStr = [resultStr stringByAppendingString:md5Appkey]; + resultStr = [resultStr md5]; + return resultStr; +} + +-(NSString*)getStrWithDic:(NSDictionary*)dic +{ + NSString* resultStr = @""; + + for (NSString* key in [dic allKeys]) { + NSObject* obj = [dic objectForKey:key]; + if ([obj isKindOfClass:[NSDictionary class]]) { + obj = [self getStrWithDic:(NSDictionary*)obj]; + if ([resultStr isEqualToString:@""]) { + resultStr = obj; + + }else{ + resultStr = [NSString stringWithFormat:@"%@&%@",resultStr,obj]; + + } }else{ + if ([resultStr isEqualToString:@""]) { + resultStr = [NSString stringWithFormat:@"%@=%@",key,obj]; + + }else{ + resultStr = [NSString stringWithFormat:@"%@&%@=%@",resultStr,key,obj]; + + } + } + + } + return resultStr; +} +@end diff --git a/Doctor/Model/BaseModel.h b/Doctor/Model/BaseModel.h new file mode 100644 index 0000000..dd734e8 --- /dev/null +++ b/Doctor/Model/BaseModel.h @@ -0,0 +1,17 @@ +// +// BaseModel.h +// WlianWorld +// +// Created by xmfish on 15/11/16. +// Copyright © 2015年 ash. All rights reserved. +// + +#import + +@interface BaseModel : MTLModel + +@property (nonatomic,strong)NSString* title; +@property (nonatomic,readonly)NSString* errorCode; +@property (nonatomic,readonly)NSString* errorMessage; + +@end diff --git a/Doctor/Model/BaseModel.m b/Doctor/Model/BaseModel.m new file mode 100644 index 0000000..c2b8e90 --- /dev/null +++ b/Doctor/Model/BaseModel.m @@ -0,0 +1,47 @@ +// +// BaseModel.m +// WlianWorld +// +// Created by xmfish on 15/11/16. +// Copyright © 2015年 ash. All rights reserved. +// + +#import "BaseModel.h" + +@implementation BaseModel ++ (NSDictionary *)JSONKeyPathsByPropertyKey { + return @{ + // @"errCode": @"ret", + @"errorCode": @"errorCode", + @"errorMessage": @"errorMessage", + }; +} + ++ (NSValueTransformer *)errorCodeJSONTransformer { + return [MTLValueTransformer transformerUsingForwardBlock:^id(id value,BOOL *success, NSError *__autoreleasing *error) { + + NSNumber *num = value; + + NSString *tempStr = [NSString stringWithFormat:@"%@", num]; + + return tempStr; + + } reverseBlock:^id(id value,BOOL *success, NSError *__autoreleasing *error) { + + NSString *tempStr = value; + + NSNumber *tempNum = @(tempStr.integerValue); + + return tempNum; + + }]; +} +- (instancetype)initWithDictionary:(NSDictionary *)dictionaryValue error:(NSError **)error +{ + self = [super initWithDictionary:dictionaryValue error:error]; + if (self != nil) + { + } + return self; +} +@end diff --git a/Doctor/Model/BaseWLService.h b/Doctor/Model/BaseWLService.h new file mode 100644 index 0000000..a6ded09 --- /dev/null +++ b/Doctor/Model/BaseWLService.h @@ -0,0 +1,18 @@ +// +// BaseWLService.h +// WlianWorld +// +// Created by xmfish on 15/11/13. +// Copyright © 2015年 ash. All rights reserved. +// + +#import +#import + +@class BaseEntity; + +@interface BaseWLService : NSObject + + ++ (RACSignal *)requireWithProperty:(BaseEntity *)proper; +@end diff --git a/Doctor/Model/BaseWLService.m b/Doctor/Model/BaseWLService.m new file mode 100644 index 0000000..a2cb3c2 --- /dev/null +++ b/Doctor/Model/BaseWLService.m @@ -0,0 +1,100 @@ +// +// BaseWLService.m +// WlianWorld +// +// Created by xmfish on 15/11/13. +// Copyright © 2015年 ash. All rights reserved. +// + +#import "BaseWLService.h" + +#import "BaseEntity.h" + +#import "MTLJSONAdapter.h" +#import "NSData+Godzippa.h" + +#import "EGOCache.h" +#import "BaseAPIClient.h" + +@implementation BaseWLService + ++ (void)saveCacheWithAPIKey:(NSString *)apiKey property:(BaseEntity *)proper data:(id)tweet{ + if (proper.isCache) { + SEL selector = NSSelectorFromString(@"errCode"); + IMP imp = [tweet methodForSelector:selector]; + NSString* (*func)(id, SEL) = (void *)imp; + NSString *tmpErrCode = func(tweet, selector); + DLog(@"%@", tmpErrCode); + + if (([tmpErrCode isKindOfClass:[NSString class]] && [tmpErrCode isEqualToString:@"0"] ) || ([tmpErrCode isKindOfClass:[NSNumber class]] && [tmpErrCode integerValue]==0)) { + [[EGOCache globalCache] setObject:tweet forKey:apiKey]; + + } + } +} ++ (void)responseFromCacheWithAPIKey:(NSString *)apiKey property:(BaseEntity *)proper completionBlock:(id)subscriber{ + if (proper.isCache && [[EGOCache globalCache] hasCacheForKey:apiKey]) { + [subscriber sendNext:[[EGOCache globalCache] objectForKey:apiKey]]; + [subscriber sendCompleted]; + } +} + ++(RACSignal*)requireWithProperty:(BaseEntity *)proper +{ + +// if (proper.requireType == HTTPRequestTypeWithGET) { +// return [self requireWithGetWithProperty:proper]; +// } +// return nil; + return [self requireWithGetWithProperty:proper]; +} ++(RACSignal*)requireWithGetWithProperty:(BaseEntity*)proper +{ + NSString *apiKey = proper.cacheKey; + if (proper.pro && proper.pro[@"page"]) + { + apiKey = [apiKey stringByAppendingFormat:@"%@",proper.pro[@"page"]]; + } + + + + return [[RACSignal createSignal:^RACDisposable *(id subscriber) { + [[BaseAPIClient sharedClient] GET:[proper reqURL] + parameters: [proper encodePro] + success:^(AFHTTPRequestOperation * __unused task, id json) { + DLog(@"%@", json); + + if(json) + { + NSError *error = nil; + id tweet = [MTLJSONAdapter modelOfClass:[proper.responesOBJ class] fromJSONDictionary:json error:&error]; + + + [subscriber sendNext:tweet]; + [subscriber sendCompleted]; + + [self saveCacheWithAPIKey:apiKey property:proper data:tweet]; + + } + else + { + [subscriber sendNext:nil]; + [subscriber sendCompleted]; + } + } + failure:^(AFHTTPRequestOperation *__unused task, NSError *error) { + DLog(@"%@", error.description); + + [subscriber sendError:error]; + + [self responseFromCacheWithAPIKey:apiKey property:proper completionBlock:subscriber]; + }]; + + return [RACDisposable disposableWithBlock:^{ + }]; + + }] replayLazily]; + + +} +@end diff --git a/Doctor/Model/LoginModel.h b/Doctor/Model/LoginModel.h new file mode 100644 index 0000000..92781b6 --- /dev/null +++ b/Doctor/Model/LoginModel.h @@ -0,0 +1,22 @@ +// +// LoginModel.h +// WlianWorld +// +// Created by xmfish on 15/11/16. +// Copyright © 2015年 ash. All rights reserved. +// + +#import +#import "BaseModel.h" +@interface LoginModel : BaseModel + +@property (nonatomic,readonly) NSNumber* status; +@property (nonatomic, readonly) NSString *msg; +@property (nonatomic,readonly) NSString* userid; +@property (nonatomic, readonly) NSString *username; +@property (nonatomic,readonly) NSString* shopid; +@property (nonatomic, readonly) NSString *shopname; +@property (nonatomic,readonly) NSString* token; +- (RACSignal*)loginSignalWithAccount:(NSString*)account withPassword:(NSString*)password; + +@end diff --git a/Doctor/Model/LoginModel.m b/Doctor/Model/LoginModel.m new file mode 100644 index 0000000..f97511f --- /dev/null +++ b/Doctor/Model/LoginModel.m @@ -0,0 +1,61 @@ +// +// LoginModel.m +// WlianWorld +// +// Created by xmfish on 15/11/16. +// Copyright © 2015年 ash. All rights reserved. +// + +#import "LoginModel.h" +#import "LoginViewModel.h" +@implementation LoginModel + + ++ (NSDictionary *)JSONKeyPathsByPropertyKey { + NSMutableDictionary* dic = [NSMutableDictionary dictionaryWithDictionary:[super JSONKeyPathsByPropertyKey]]; + [dic setObject:@"info.msg" forKey:@"msg"]; + [dic setObject:@"info.status" forKey:@"status"]; + [dic setObject:@"info.userinfo.userid" forKey:@"userid"]; + [dic setObject:@"info.userinfo.username" forKey:@"username"]; + [dic setObject:@"info.userinfo.shopid" forKey:@"shopid"]; + [dic setObject:@"info.userinfo.shopname" forKey:@"shopname"]; + [dic setObject:@"info.userinfo.token" forKey:@"token"]; + return dic; +} +- (instancetype)initWithDictionary:(NSDictionary *)dictionaryValue error:(NSError **)error +{ + self = [super initWithDictionary:dictionaryValue error:error]; + if (self != nil) + { + } + return self; +} +- (instancetype)init +{ + self = [super init]; + + if (self) + { + } + + return self; +} + +-(RACSignal*)loginSignalWithAccount:(NSString *)account withPassword:(NSString *)password +{ + RACSignal* singnal = [BaseWLService requireWithProperty:[self requireWithDic:[NSDictionary dictionaryWithObjectsAndKeys:account,@"username",password,@"password", nil] ]]; + + return singnal; +} +-(BaseEntity*)requireWithDic:(NSDictionary *)dic +{ + BaseEntity *pro = [[BaseEntity alloc] init]; + pro.requireType = HTTPRequestTypeWithPOST; + pro.responesOBJ = self.class; + pro.reqURL = @""; + pro.callback = @"user.login"; + pro.pro = dic; + return pro; +} + +@end diff --git a/Doctor/Model/NSString+HXAddtions.h b/Doctor/Model/NSString+HXAddtions.h new file mode 100644 index 0000000..8ffb083 --- /dev/null +++ b/Doctor/Model/NSString+HXAddtions.h @@ -0,0 +1,25 @@ +// +// NSString+HXAddtions.h +// HXWeb +// +// Created by hufeng on 12-2-13. +// Copyright (c) 2012年 __MyCompanyName__. All rights reserved. +// + +#import + +@interface NSString (HXAddtions) + ++(NSString *) jsonStringWithDictionary:(NSDictionary *)dictionary; + ++(NSString *) jsonStringWithArray:(NSArray *)array; + ++(NSString *) jsonStringWithString:(NSString *) string; + ++(NSString *) jsonStringWithObject:(id) object; + ++(NSString *) jsonStringWithRTArray:(NSArray *)array; + +- (NSString *)md5; + +@end \ No newline at end of file diff --git a/Doctor/Model/NSString+HXAddtions.m b/Doctor/Model/NSString+HXAddtions.m new file mode 100644 index 0000000..7335799 --- /dev/null +++ b/Doctor/Model/NSString+HXAddtions.m @@ -0,0 +1,125 @@ +// +// NSString+HXAddtions.m +// HXWeb +// +// Created by hufeng on 12-2-13. +// Copyright (c) 2012年 __MyCompanyName__. All rights reserved. +// + +#import "NSString+HXAddtions.h" +#import +@implementation NSString (HXAddtions) + ++(NSString *) jsonStringWithString:(NSString *) string +{ + return [NSString stringWithFormat:@"\"%@\"", + [[string stringByReplacingOccurrencesOfString:@"\n" withString:@"\\n"] stringByReplacingOccurrencesOfString:@"\"" withString:@"\\\""] + ]; +} + ++(NSString *) jsonStringWithArray:(NSArray *)array +{ + NSMutableString *reString = [NSMutableString string]; + [reString appendString:@"["]; + NSMutableArray *values = [NSMutableArray array]; + for (id valueObj in array) { + NSString *value = [NSString jsonStringWithObject:valueObj]; + if (value) { + [values addObject:[NSString stringWithFormat:@"%@",value]]; + } + } + [reString appendFormat:@"%@",[values componentsJoinedByString:@","]]; + [reString appendString:@"]"]; + return reString; +} + ++(NSString *) jsonStringWithDictionary:(NSDictionary *)dictionary +{ + NSArray *keys = [dictionary allKeys]; + NSMutableString *reString = [NSMutableString string]; + [reString appendString:@"{"]; + NSMutableArray *keyValues = [NSMutableArray array]; + for (int i=0; i<[keys count]; i++) { + NSString *name = [keys objectAtIndex:i]; + id valueObj = [dictionary objectForKey:name]; + NSString *value = [NSString jsonStringWithObject:valueObj]; + if (value) + { + [keyValues addObject:[NSString stringWithFormat:@"\"%@\":%@",name,value]]; + } + } + [reString appendFormat:@"%@",[keyValues componentsJoinedByString:@","]]; + [reString appendString:@"}"]; + return reString; +} + ++(NSString *) jsonStringWithObject:(id) object +{ + NSString *value = nil; + if (!object) + { + return value; + } + + if ([object isKindOfClass:[NSString class]]) + { + value = [NSString jsonStringWithString:object]; + } + else if([object isKindOfClass:[NSDictionary class]]) + { + value = [NSString jsonStringWithDictionary:object]; + } + else if([object isKindOfClass:[NSArray class]]) + { + value = [NSString jsonStringWithArray:object]; + } + else if([object isKindOfClass:[NSNumber class]]) + { + value = [NSString jsonStringWithString:[object stringValue]]; + } + return value; +} + ++(NSString *) jsonStringWithRTArray:(NSArray *)array +{ + NSMutableString *reString = [[NSMutableString alloc] init]; + [reString appendString:@"{"]; + NSMutableArray *values = [[NSMutableArray alloc] initWithArray:array]; + for (int i=0; i<[values count]; i++) + { + NSString *tempString = [values objectAtIndex:i]; + NSString *value = [NSString jsonStringWithString:tempString]; + if (i%2 == 0) + { + [reString appendFormat:@"%@:",value]; + } + else + { + if (i == [values count]-1) + { + [reString appendFormat:@"%@",value]; + } + else + { + [reString appendFormat:@"%@,",value]; + } + } + } + [reString appendFormat:@"}"]; + return reString; +} + +- (NSString *) md5 +{ + const char *cStr = [self UTF8String]; + unsigned char result[16]; + CC_MD5( cStr, strlen(cStr), result ); // This is the md5 call + return [NSString stringWithFormat: + @"%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x", + result[0], result[1], result[2], result[3], + result[4], result[5], result[6], result[7], + result[8], result[9], result[10], result[11], + result[12], result[13], result[14], result[15] + ]; +} +@end \ No newline at end of file diff --git a/Doctor/PrefixHeader.pch b/Doctor/PrefixHeader.pch new file mode 100644 index 0000000..09e8eb7 --- /dev/null +++ b/Doctor/PrefixHeader.pch @@ -0,0 +1,22 @@ +// +// PrefixHeader.pch +// WlianWorld +// +// Created by xmfish on 15/11/13. +// Copyright © 2015年 ash. All rights reserved. +// + +#ifndef PrefixHeader_pch +#define PrefixHeader_pch + +// Include any system framework and library headers here that should be included in all compilation units. +// You will also need to set the Prefix Header build setting of one or more of your targets to reference this file. +#import +#import +#import +#import "Common.h" +#import "BaseEntity.h" +#import "BaseWLService.h" +#import +#import "MBProgressHUD+Util.h" +#endif /* PrefixHeader_pch */ diff --git a/Doctor/Resource/about_logo@2x.png b/Doctor/Resource/about_logo@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..ef3ccb68fcd2093e1aab26a3e1707c8e5af48eea GIT binary patch literal 10284 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 literal 0 HcmV?d00001 diff --git a/Doctor/Resource/brand.png b/Doctor/Resource/brand.png new file mode 100644 index 0000000000000000000000000000000000000000..7124abd789c568dff7c8312807a6054a73d57053 GIT binary patch literal 4822 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 literal 0 HcmV?d00001 diff --git a/Doctor/Resource/icon48.back.png b/Doctor/Resource/icon48.back.png new file mode 100644 index 0000000000000000000000000000000000000000..cdfd909f956b95ba1874e3494db2b3a3ffa25709 GIT binary patch literal 370 zcmV-&0ge8NP)rm*)hil;;A}<@c!a9DrZtKUS90>g8Jjk5Ya*mpN#ZZv~voFCQqc zG9#t{V|m&PWhQzJMC(ngj^KEVsv@}l$kY&=O9>SO_hJr?kXTMb5mFl(7(#MO2|-A2 z>ctU=V--;Z>S(b>oVYHGJX)L)N6OtIU`AXyFBtqas{~)nR$`-fC2~W(!#F1%c52p;V;Z$oAoZZtTJqp zo3ExM9xzX9)hwmiKn)BGKUgcy9rj)DyR^P9{qUWjt|f-s)c!|v<^A;E`Bm%jsWWFL zGBPkk$Q~%-I=SFRix3k-gO}+m&(>)nFRvV5v3+)*&h-;2Z`ArqmM-CEU^u|UV6|f9 z%xg-6!+yjX>5ls8zE{F#MR{rZZjU-FJ|Pr>mdKI;Vst E0Hi@;7ytkO literal 0 HcmV?d00001 diff --git a/Doctor/Resource/icon48.search.png b/Doctor/Resource/icon48.search.png new file mode 100644 index 0000000000000000000000000000000000000000..ac967ba599049bf4469a24253c9aa522bff0d0b1 GIT binary patch literal 963 zcmV;!13dhRP)Yi)t0H>xAXXH`7Ng+BP_?3_KA-_BLJzhPPad>l zQCpRU8vjH7fn{lu-OS9IUSsExWlgU2V4cGGrY}DA$9E6jo^?&=P^FhNE^b|bK2G_K)ks=Pz9cX4InBJ{U~ij zXtR$#v)1-!EOmJ(3IdNjj5 zPLkM8Qjb`CO9@!SdR)`no++uvExxrbr&CFsw_D2ZtSen?Q>DeXlz{iFSGg!)wZ*rT zfVZrh6en?}8M(>gTS~xV)@?2%uX*w``<6=LF!!)6TwujCC$X3Ie%hTpvqeCxJbU@Z zf-dy`AluYqchzfWH7XWZaqeN)YixW2eZ;xhSGJrM-R1(A4Q}uZNOci5Z_>xbEHi)3 zJ2EjU_`q#Ys<82;wCSS{*PHnd`3Kb34Ep9rQnfM5xK5Le;dhj&?`prcyJ#lyB3@Ibc;jfC~fou z4@HR2+rW^n2$+j#z+t{+vH8Eut}({(JkHO9ye94uC)FLMp>l`~PDR2)5%oGFFw?nC zFUh5(M5H3&u^Wke`iUuBB-Rv)fOH~)g(Sc%;_ literal 0 HcmV?d00001 diff --git a/Doctor/Resource/icon512.wlian.png b/Doctor/Resource/icon512.wlian.png new file mode 100644 index 0000000000000000000000000000000000000000..051cb215da6cebf8beb60a0af66b8e4f2210e473 GIT binary patch literal 34019 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 FR$jY0K&7bV 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 Y05TTzZuiy4R{#J207*qoM6N<$g0@wHx&QzG literal 0 HcmV?d00001 diff --git a/Doctor/Resource/icon72.card.png b/Doctor/Resource/icon72.card.png new file mode 100644 index 0000000000000000000000000000000000000000..dddbec932b4a8c7fec2e21c2a2d9d3ff81a78536 GIT binary patch literal 482 zcmeAS@N?(olHy`uVBq!ia0vp^9w5xY1|&n@ZgvM!k|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*9U+7+XAD978H@y}51Z$K)t->|^ASs7(t$a+FC)OA9A|V|pW* z^OZ#+dC7)r+!al0b+$ibaI@0U;b6ZJaARfU{a2IMbgJ~FFd6@@KgphA6gflQ+BmUs zg^stg?m96R21XVE2QVQ5p+Icb3-ed!UbXf%d-5%&NUPIUI$Lq))R>tj_2tYdKJi5l zU!D|roxNV~Q2ef0N$HGdq*fbl`S(%pN8Cnlg)&1fh4$Nf4A1*AcTM~E%F;W`y2&KH zYa<)b*zPTQC;AOq$^E?B2dJ`vfr$e|bTDx&aAUmd*=M4D>swIvYNJcvUPndO z&s5K?W-*z_^Yx?8`}y{AX_?FC}(a>fCg6DXHcaRnU%R}c=vzZKly_DzgK7#F0C#|Q7f~OS1u|k@{^Q8t*7H<^>HT7|Wc)n~J z05#wYXr4X{sDNa&2pnaQWCH30Psa$y3TYbSNemz!%nfiqONRO}p3WoyYQX7b$x^Qj zNYMb9W>VougJeX2lY{Ne1jDgH;&JBm0jk5f1@2+#P!GnNQxB*Kr#nKxZ_#0N9sDyy zzV0xPj2Pg|fY+dB0_Hsm-VNRe{;mU(5dcmew)Z8#DOkQ20zl$$Ch_x2@FwuLkdSyi z^6~)H;oP%TE~vf=@_Rw5;l0+RZ9j*!A!IBCtWQ2VpeCHIh#loZaLFa$M=o$KIi&H2 zp4ABPbp5Yay?!A9$%E6-0T)PH!FL?sTy{8?_aU!X^FgCBNEzWvoTj-HwhypFl&$mN zgMzf%;GG_D-hh`&jOQtMJ1dtz`U7N|i(&gPLL2v^i{Sl&wDsT@n&33_47?2>ee%=9 zN{Znyyh5%C(saXNSl^Q0KB!Mo5H*|k;FaX1Md0V)We#P?RG-sGpi8g8>q6%J3|=Kj z`^ywA+KT`k25$*@Z@1579;8AXkbMQQg8PH&vHwxb{|ws>{FmU!yWm|40R3=S&X@=O z?JIXmUZ6^>Iy9flZPxk+Jm>HaT+l9nc3@{K(i8Az+rE{o{=Q;c0OF(ARhRS+g3+t! zQSJ$*=&5QPfKCU@^TkJ=<0=7BCry9|P|I}EYr&^HI%)f?jZX`Xc$AxMB|t@wVZQ8e zlUk%EMor9@_zLDB+rA|PsHqj;b2N(4Fi(Kol$77Os3jE;U$Usi45x~5B({n1CD+-Q z;LI}dl5b*0vG=V0#B#poQIapQ&dDw`LqCs0qZk1qKm>>Y5g-CYfJjdIC%^#nYq`aK SSU2+k0000h;5;ylmrSU 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 literal 0 HcmV?d00001 diff --git a/Doctor/Resource/icon72.valid.png b/Doctor/Resource/icon72.valid.png new file mode 100644 index 0000000000000000000000000000000000000000..fa197d9e4e1557574a7fb50b6a66da781a345d83 GIT binary patch literal 1633 zcmV-n2A=teP)n`f%ikph2 zxM4&P*_2x?Wnf)JP_gX-h~JQLTkw zmNiQDM~gMC+xBHnztj949UrqhZ)V<`xz64LKi-@B?!0&3@1Aq+Ip@6>%Vx92$?!79 zQQ!!21UZ5nL5?6tkRxc6N?o}pxN6sZ{-zjk9nb+>4z#c>Z21NF9M}SM@0`Cr69qxB zawBOULGyr@fQu?T(MN%Yffqqk)>ab}jrq6=G2WyWA?-_&A^j5E_9}Aw)Oiy8Palt2PtaK3%|6L2dYWqQ;?3og zmE5LCQid9K0naDe)kJO4$D4S}UK2x})9$gD=Q>PwNA~{mpe497l4b0@=M57i0-g3(dx|Bf6cf8qW)1^;uRuSU zz0ZJ43QR7I{KO*@<)M*Si%)7=_9R+q$Ri*T&alhM6}`^ z-29OF|GArtO&9TwvaOMQ9<(*p=un!Wov0Ad&ehPvuZ)Azs&CvEJBewn2M*I8dQo^I zS5psO+t)xFOl_x)sfNfQ`VQkWr(_<@Flw1k`l4v@BhyLBsv@p`KJWsxZ6QcHVk1Fo zhY1#w0sfm*{brGDc@FjrS4%DO0CTSTy^GuVz%puGhm8b5P2u}mvTl7x6~fdBjmEQP;HSAw7( zYS7&U`psiJvn@mo@leHVmUV?=xm; zWuO+eNXqj)@DZ?_nR)ekM29VtO1X)c%9W)4Eqf!)-UtAX2?f87qe z8Ii+Y!1~WJ-1Msf#w=x#Ip`aU+QcOG5I=M=lTle6?q%VuhqEcRer<&0Xvg0auz$TN z;r)TK-ciJ?NX77e{*(4bFD@cMM6WlPlw z;x}5|7Lp@n)r~f2kcd1O9I%X_M=*JVwh$zx1bNzd!V+?N!urxDEP}i=W3dVUyRc$q zGbhW~Mv!4*dYQ?6vr%c02ZU0eS_JJ0b&|qPHKdT$YTQS?qet9Zu8tr_kR!+u literal 0 HcmV?d00001 diff --git a/Doctor/Resource/icon72.wait.png b/Doctor/Resource/icon72.wait.png new file mode 100644 index 0000000000000000000000000000000000000000..0b794415a05690571e8d5f408986adff1f3c4603 GIT binary patch literal 2163 zcmV-(2#oiMP)k+niV|rm|u#xmgOb z1Z4>dQaX4Y;FobXyZx8mgrS6fgua9_LKi|2p%CYsB18!%2nPuV2>S_5gdhDR;POo$ z1xt_v$pIk~2*U||9Q;oq(4BCt;ctfsjfC|eEEZ}HvXHKX*@Vf2Qj7CW5{|%QqWG)` z=t(FxoZkm{kkCx1CoCtlWC}q&2(^TnB4m^ZogIX2gq;YT<2K`ULnu}dh7l^oxJ>-B zgvSVVgvEqkeRY4Yd61ZcnCxo8LPBS8%0Gk#!dkqZ^Qdz^VH9B!UOS4vMF>w5RuInn zF$ei|7rTzIoA8PthrQ(`Ov-l>Hv2%1!Wf$|W^Y{M6#mv3I_!o{p}5UYBkUsd$NLz* zL3aOngku5DbH{LvQe0CHhyKuMTG~R4LMsn(KSg}}C1D0(Pnyz}a>8oD0P)!x%!jQh z3o#<66TQ4|ActLha2m-`xb|S^qRSNM+9@R=26DC{r(rou7*BY_>|08)v_hBh&`m+t zt;vv-n?zW>hs006YurlM7{V%nbs7O36?A6Z^MdrCI^j8d;UUOt!YWPBF(N#vE)asq zd!~swhh29JO>kdlK)uO2-Y&vzikrJzu0wJ-r&uOFnn>jAP?;m_NfX8UWlr;?TnFTE zhP;kYpx>>CoQ*2;WTUvd6~Lwret1x|NCG*}nV-S!o%ygqPbRB95k%h81GSZ&APRr9@DRMKvF^us-jK94wK%N_faY!s^I2I}e&I`Yx-?21t=yf=pN^=K}gZhn3cr z)n&TFJcn&rh2uil>O92AE4WQMS@d%jr#ZCdp%7)+tF#7M3E?Vu1BcgdBF`D&V9dp^ zjb$=ycI-hzRlH5wK;CmKjpVT6b3~76B;k9*Iok>2#QPeDt&#>DmzssHSspM!9Iv&w z%k`p{TaqyPZ5M^@rAlkNDwH*5E!s~BM+sNB(1~puD{S8Gl%V0_8*8w*!1d_2xRos~ z2r7`@iOsnuKu|uS+Xf)uaxukGPdzHVf&kQ1oacg zJFP}0@A`>YuTOyoZ6e$Y0+tZwCh(lMM6YM9i}81w*ltQtUvYdOBqhQVN?YRL%=b~k zXiTVo@b{#&rd@ZO`>n{7oyY+b+f4~7!|O@%kmDgC=rC^Mn=ucS2|bPHjUk+IIxyQv zQNXLa#fipDlm~Ue>yeNZnmkwBptQEB@$SUUFkXHhNcbU%v5y#RxAdSQyhcMC~Nswh`*#^b3a!5qbesNsU4hX6+ zvE7uQCUHEh9S}6k#P-AlQEkHekPqQ)CBN!3UG)iR8jZPCqmi6Lzl1C-(Cp?Z;#fQpz&$N}?L3mwh+v!&LM9?G? zn{5f=SZvl=rZ6kQBMY!7LmgYBjf0@$u407ZCMvHLa`C$UceO~DL8a&dg)C$7uVe|hal}pdu=;BuB zU53xOD*p_9oHIz;ctRgysILDdJVkgxdH;Qe_oZk2L!Fqc7kE_aZ>4nw?@<^3VuzP$ z?pE5?lxLK-=r_VZ&c{kySzV<3`SHpEF@BxZvbtTngO_LZ{e82@TgrVKA$FLwqX{IBg$r3-F726k@B#L@66)OM}y@aA)j`4T&c9CJ6F|z z!TnDLkoRy0@^cm6XkJ6MEOpxtGRg|^?eV}b2B7%QgfEn~Qn4=}aujse$=T;5U9csH z80KCtZ-CTyiPn(URApdEQKjOW8qUI|^PUL;NxYSIj`(ODkyM#MTCUeuRUw^oJ`m(ILHE|c2m(pGGh?LiqypqNFDsWn6bVT3pvwjo-&@oOolmAp3>3q0J3;Hh4DeH%u6x)zsls5Bl6J27c()CT+p?W+{ p;33x5CA)ztOHh`eK;=IH1^{+XGv@B+1G)eJ002ovPDHLkV1oac4I}^n literal 0 HcmV?d00001 diff --git a/Doctor/Resource/icon72.write.png b/Doctor/Resource/icon72.write.png new file mode 100644 index 0000000000000000000000000000000000000000..80b7d9d54cc45b1a613b5be4b4d3caf4c20c7817 GIT binary patch literal 944 zcmV;h15f;kP)ITg1~GF& zIKQDA)GyDOBc=Wrs*kbPa$;p;??iK}gNK^qH&YpgjFB0`Xl| z0_PF53pxc20nB-3(i}5gdap^S%N3v|`bi~l>SGmghuI^L#@Rj|#_^0RKw(+_PzERZ zo^AuuN3#Q8lZCENSpJmmH?Ftr;yekt}{5< z2ILivc0k_YXa=MLj#fZw;AjL?790*xgIWQk4vr>3D&a&2p8qWz3|eI>@@UA6C7WF_ChNn4d@GKD>NIF*0jd8!0`p>K}nkbpdfFX@4YuHl^9q7Wn}C8Mm`1>C4bQPFDyl75k(kWz|K=*l(Kg zChMwG+-Wa^&*7jn*(KZaT<$>2u~(Ijqm|_!5RUAy|L7bLA*uYXMp#yoIe_!EBJ!2~ z=Y=YK+b5|luq&6W?n~O{qz=f28V1PB02v?yWPl8i0Wv@a$jks4ptS9;00RKT9|5Yk Sur|&B00008U}fi7AzZCsS>JilRMT978H@y_tTH_kaNhbK%s$8}-U=32af5_#E!r?ypt2 zSrZUCbIGPgx%FYQjf)@MZ`S{<(a?D@+sKFt6C literal 0 HcmV?d00001 diff --git a/Doctor/Util/AWordDefault.h b/Doctor/Util/AWordDefault.h new file mode 100644 index 0000000..72ffe0a --- /dev/null +++ b/Doctor/Util/AWordDefault.h @@ -0,0 +1,59 @@ +// +// AWordDefault.h +// Ash_AWord +// +// Created by xmfish on 15/4/1. +// Copyright (c) 2015年 ash. All rights reserved. +// + +#import +#import "LoginModel.h" + +@interface AWordDefault : NSObject + + ++(void)setShopId:(NSString *)isShopId; ++(NSString*)getShopId; + ++(void)setToken:(NSString *)isToken; ++(NSString *)getToken; + ++(void)setUserId:(NSString *)isUserId; ++(NSString *)getUserId; + + +//获取用户是否登录 ++(void)setIsLogin:(BOOL)isLogin; ++(BOOL)getIsLogin; + +//获取用户名 ++(void)setUserName:(NSString*)userName; ++(NSString*)getUserName; + +//获取uid ++(void)setUid:(NSString*)uid; ++(NSString*)getUid; + +//获取用户头像 ++(void)setUserAvatar:(NSString*)userAvatar; ++(NSString*)getUserAvatar; + +//获取用户性别 ++(void)setUserGender:(NSString*)userGender; ++(NSString*)getUserGender; + +//获取最后更新时间 ++(void)setLastUpdateTime:(NSTimeInterval)date; ++(NSTimeInterval)getLastUpdateTime; + +//设置登录方式 ++(void)setLoginType:(NSInteger)loginType; ++(NSInteger)getLoginType; + +//设置个性签名 ++(void)setSignature:(NSString*)sinagure; ++(NSString*)getSignature; +//保存背景图片 ++(BOOL)setHeadBgImg:(UIImage *)headBgImg; ++(UIImage*)getHeadBgImg; +@end diff --git a/Doctor/Util/AWordDefault.m b/Doctor/Util/AWordDefault.m new file mode 100644 index 0000000..fdca2c9 --- /dev/null +++ b/Doctor/Util/AWordDefault.m @@ -0,0 +1,138 @@ +// +// AWordDefault.m +// Ash_AWord +// +// Created by xmfish on 15/4/1. +// Copyright (c) 2015年 ash. All rights reserved. +// + +#import "AWordDefault.h" + +@implementation AWordDefault + + ++(void)setShopId:(NSString *)isShopId +{ + [[NSUserDefaults standardUserDefaults] setObject:isShopId forKey:@"shopid"]; + [[NSUserDefaults standardUserDefaults] synchronize]; +} ++(NSString*)getShopId; +{ + return [[NSUserDefaults standardUserDefaults] stringForKey:@"shopid"]; +} + ++(void)setToken:(NSString *)isToken +{ + [[NSUserDefaults standardUserDefaults] setObject:isToken forKey:@"isToken"]; + [[NSUserDefaults standardUserDefaults] synchronize]; +} ++(NSString *)getToken +{ + return [[NSUserDefaults standardUserDefaults] stringForKey:@"isToken"]; +} + ++(void)setUserId:(NSString *)isUserId +{ + [[NSUserDefaults standardUserDefaults] setObject:isUserId forKey:@"isUserId"]; + [[NSUserDefaults standardUserDefaults] synchronize]; + +} ++(NSString *)getUserId +{ + return [[NSUserDefaults standardUserDefaults] stringForKey:@"isUserId"]; +} + ++(void)setIsLogin:(BOOL)isLogin +{ + [[NSUserDefaults standardUserDefaults] setBool:isLogin forKey:@"islogin"]; + [[NSUserDefaults standardUserDefaults] synchronize]; +} ++(BOOL)getIsLogin +{ + return [[NSUserDefaults standardUserDefaults] boolForKey:@"islogin"]; +} + ++(void)setUid:(NSString *)uid +{ + [[NSUserDefaults standardUserDefaults] setObject:uid forKey:@"uid"]; + [[NSUserDefaults standardUserDefaults] synchronize]; +} ++(NSString*)getUid +{ + return [[NSUserDefaults standardUserDefaults] stringForKey:@"uid"]; +} + ++(void)setUserName:(NSString *)userName +{ + [[NSUserDefaults standardUserDefaults] setObject:userName forKey:@"username"]; + [[NSUserDefaults standardUserDefaults] synchronize]; +} ++(NSString*)getUserName +{ + return [[NSUserDefaults standardUserDefaults] stringForKey:@"username"]; +} + ++(void)setUserAvatar:(NSString *)userAvatar +{ + [[NSUserDefaults standardUserDefaults] setObject:userAvatar forKey:@"useravatar"]; + [[NSUserDefaults standardUserDefaults] synchronize]; +} ++(NSString*)getUserAvatar +{ + return [[NSUserDefaults standardUserDefaults] stringForKey:@"useravatar"]; + +} + ++(void)setUserGender:(NSString *)userGender +{ + [[NSUserDefaults standardUserDefaults] setObject:userGender forKey:@"usergender"]; + [[NSUserDefaults standardUserDefaults] synchronize]; +} ++(NSString*)getUserGender +{ + return [[NSUserDefaults standardUserDefaults] stringForKey:@"usergender"]; + +} ++(void)setLastUpdateTime:(NSTimeInterval)date +{ + [[NSUserDefaults standardUserDefaults] setObject:[NSNumber numberWithDouble:date] forKey:@"updatetime"]; + [[NSUserDefaults standardUserDefaults] synchronize]; +} ++(NSTimeInterval)getLastUpdateTime +{ + return [[NSUserDefaults standardUserDefaults] doubleForKey:@"updatetime"]; +} ++(void)setLoginType:(NSInteger)loginType +{ + [[NSUserDefaults standardUserDefaults] setObject:[NSNumber numberWithInteger:loginType] forKey:@"logintype"]; + [[NSUserDefaults standardUserDefaults] synchronize]; +} ++(NSInteger)getLoginType +{ + return [[NSUserDefaults standardUserDefaults] integerForKey:@"logintype"]; +} + ++(void)setSignature:(NSString *)sinagure +{ + [[NSUserDefaults standardUserDefaults] setObject:sinagure forKey:@"sinagure"]; + [[NSUserDefaults standardUserDefaults] synchronize]; +} ++(NSString*)getSignature +{ + return [[NSUserDefaults standardUserDefaults] stringForKey:@"sinagure"]; + +} ++(BOOL)setHeadBgImg:(UIImage *)headBgImg +{ + NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask, YES); + NSString *filePath = [[paths objectAtIndex:0] stringByAppendingPathComponent:[NSString stringWithFormat:@"headbg.png"]]; // 保存文件的名称 + return [UIImagePNGRepresentation(headBgImg)writeToFile: filePath atomically:YES]; +} ++(UIImage*)getHeadBgImg +{ + NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask, YES); + NSString *filePath = [[paths objectAtIndex:0] stringByAppendingPathComponent:[NSString stringWithFormat:@"headbg.png"]]; // 保存文件的名称 + UIImage *img = [UIImage imageWithContentsOfFile:filePath]; + return img; +} +@end diff --git a/Doctor/Util/MBProgressHUD/MBProgressHUD+Util.h b/Doctor/Util/MBProgressHUD/MBProgressHUD+Util.h new file mode 100644 index 0000000..d66c85a --- /dev/null +++ b/Doctor/Util/MBProgressHUD/MBProgressHUD+Util.h @@ -0,0 +1,24 @@ +// +// MBProgressHUD+Util.h +// ManagerDemo +// +// Created by xmfish on 14-8-12. +// Copyright (c) 2014年 ash. All rights reserved. +// + +#import "MBProgressHUD.h" + +@interface MBProgressHUD (Util) +/** + * Finds all HUD subviews and returns them. + * + * @param view The view that is going to be searched. + * @return All found HUD views (array of MBProgressHUD objects). + */ + ++ (void)hudWithView:(UIView *)view label:(NSString *)msg; + ++ (void)errorHudWithView:(UIView *)view label:(NSString *)msg hidesAfter:(NSTimeInterval)delay; + ++ (void)checkHudWithView:(UIView *)view label:(NSString *)msg hidesAfter:(NSTimeInterval)delay; +@end diff --git a/Doctor/Util/MBProgressHUD/MBProgressHUD+Util.m b/Doctor/Util/MBProgressHUD/MBProgressHUD+Util.m new file mode 100644 index 0000000..7d18173 --- /dev/null +++ b/Doctor/Util/MBProgressHUD/MBProgressHUD+Util.m @@ -0,0 +1,71 @@ + +#import "MBProgressHUD+Util.h" + +static MBProgressHUD *activityHUD = nil; +@implementation MBProgressHUD(Util) + + + + ++ (void)hudWithView:(UIView *)view label:(NSString *)msg +{ + if (view == nil) + { + view = [UIApplication sharedApplication].delegate.window; + } + + + MBProgressHUD *HUD = [[MBProgressHUD alloc] initWithView:view]; + + HUD.dimBackground = NO; + HUD.animationType = MBProgressHUDAnimationFade; + [view addSubview:HUD]; + HUD.mode = MBProgressHUDModeIndeterminate; + HUD.labelText = msg; + [HUD show:YES]; + activityHUD = HUD; +} + ++ (void)errorHudWithView:(UIView *)view label:(NSString *)msg hidesAfter:(NSTimeInterval)delay +{ + if (view == nil) + { + view = [UIApplication sharedApplication].delegate.window; + } + [MBProgressHUD hideAllHUDsForView:view animated:YES]; + MBProgressHUD *HUD = [[MBProgressHUD alloc] initWithView:view]; + HUD.dimBackground = NO; + HUD.animationType = MBProgressHUDAnimationFade; + [view addSubview:HUD]; + HUD.customView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"errormark"]]; + HUD.mode = MBProgressHUDModeCustomView; + HUD.labelText = msg; + if (msg.length > 12) { +// HUD.labelFont = [UIFont boldSystemFontOfSize:13]; + } + + + [HUD show:YES]; + [HUD hide:YES afterDelay:delay]; +} + ++ (void)checkHudWithView:(UIView *)view label:(NSString *)msg hidesAfter:(NSTimeInterval)delay +{ + if (view == nil) + { + view = [UIApplication sharedApplication].delegate.window; + } + + [MBProgressHUD hideAllHUDsForView:view animated:YES]; + MBProgressHUD *HUD = [[MBProgressHUD alloc] initWithView:view]; + + HUD.dimBackground = NO; + HUD.animationType = MBProgressHUDAnimationFade; + [view addSubview:HUD]; + HUD.customView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"checkmark"]]; + HUD.mode = MBProgressHUDModeCustomView; + HUD.labelText = msg; + [HUD show:YES]; + [HUD hide:YES afterDelay:delay]; +} +@end \ No newline at end of file diff --git a/Doctor/View/LoginViewController.h b/Doctor/View/LoginViewController.h new file mode 100644 index 0000000..3a21434 --- /dev/null +++ b/Doctor/View/LoginViewController.h @@ -0,0 +1,14 @@ +// +// LoginViewController.h +// WlianWorld +// +// Created by xmfish on 15/11/16. +// Copyright © 2015年 ash. All rights reserved. +// + +#import + +@class LoginViewModel; +@interface LoginViewController : UIViewController + +@end diff --git a/Doctor/View/LoginViewController.m b/Doctor/View/LoginViewController.m new file mode 100644 index 0000000..1d4b25b --- /dev/null +++ b/Doctor/View/LoginViewController.m @@ -0,0 +1,106 @@ +// +// LoginViewController.m +// WlianWorld +// +// Created by xmfish on 15/11/16. +// Copyright © 2015年 ash. All rights reserved. +// + +#import "LoginViewController.h" +#import "LoginViewModel.h" +#import "AWordDefault.h" +@interface LoginViewController () + +@property (weak, nonatomic) IBOutlet UIButton *sureBtn; +@property (weak, nonatomic) IBOutlet UITextField *passwordTextField; +@property (weak, nonatomic) IBOutlet UITextField *accountTextField; +@property (nonatomic,strong)LoginViewModel* viewModel; +@end + +@implementation LoginViewController + +-(id)init +{ + self = [super init]; + + if (self) + { + _viewModel = [[LoginViewModel alloc] init]; + } + + return self; +} +- (void)viewDidLoad { + [super viewDidLoad]; + // Do any additional setup after loading the view from its nib. + + [self bindViewModel]; +} + + +-(void)bindViewModel +{ + self.title = _viewModel.model.title; + RAC(self.viewModel,account) = self.accountTextField.rac_textSignal; + RAC(self.viewModel,password) = self.passwordTextField.rac_textSignal; + self.sureBtn.rac_command = self.viewModel.executeLogin; + + @weakify(self); + RAC(self.sureBtn, backgroundColor) = [self.viewModel.validLoginSignal map:^id(NSNumber* value) { + return[value boolValue] ? [UIColor redColor ]:[UIColor grayColor]; + }]; + + [self.viewModel.executeLogin.executionSignals subscribeNext:^(id result) { + @strongify(self) + [self.accountTextField resignFirstResponder]; + [self.passwordTextField resignFirstResponder]; + + }]; + [[self.sureBtn.rac_command executing] subscribeNext:^(NSNumber *executing) { + @strongify(self) + if([executing boolValue]){ + [MBProgressHUD showHUDAddedTo:self.view animated:YES].labelText = @"登陆中。。。"; + } + }]; + [self.sureBtn.rac_command.executionSignals.flatten subscribeNext:^(id x) { + @strongify(self) + if (self.viewModel.model.status.intValue == 0) { + [MBProgressHUD checkHudWithView:self.view label:self.viewModel.model.msg hidesAfter:1.0]; + //[nsde]; + }else + { + DLog(@"登陆成功,信息:%@",self.viewModel.model); + + [AWordDefault setUid:self.viewModel.model.userid]; + [AWordDefault setToken:self.viewModel.model.token]; + [AWordDefault setShopId:self.viewModel.model.shopid]; + [MBProgressHUD hideHUDForView:self.view animated:YES]; + [self dismissViewControllerAnimated:YES completion:nil]; + + + } + }]; + [self.sureBtn.rac_command.errors subscribeNext:^(id x) { + @strongify(self) + [MBProgressHUD errorHudWithView:self.view label:@"网络连接错误" hidesAfter:1.0]; + + }]; + + +} +- (void)didReceiveMemoryWarning { + [super didReceiveMemoryWarning]; + // Dispose of any resources that can be recreated. +} + +/* +#pragma mark - Navigation + +// In a storyboard-based application, you will often want to do a little preparation before navigation +- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { + // Get the new view controller using [segue destinationViewController]. + // Pass the selected object to the new view controller. +} +*/ + +@end diff --git a/Doctor/View/LoginViewController.xib b/Doctor/View/LoginViewController.xib new file mode 100644 index 0000000..1eb8032 --- /dev/null +++ b/Doctor/View/LoginViewController.xib @@ -0,0 +1,140 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Doctor/ViewModel/BaseViewModel.h b/Doctor/ViewModel/BaseViewModel.h new file mode 100644 index 0000000..962c275 --- /dev/null +++ b/Doctor/ViewModel/BaseViewModel.h @@ -0,0 +1,16 @@ +// +// BaseViewModel.h +// WlianWorld +// +// Created by xmfish on 15/11/13. +// Copyright © 2015年 ash. All rights reserved. +// + +#import + +@class BaseModel; +@interface BaseViewModel : NSObject + + + +@end diff --git a/Doctor/ViewModel/BaseViewModel.m b/Doctor/ViewModel/BaseViewModel.m new file mode 100644 index 0000000..2fc1590 --- /dev/null +++ b/Doctor/ViewModel/BaseViewModel.m @@ -0,0 +1,22 @@ +// +// BaseViewModel.m +// WlianWorld +// +// Created by xmfish on 15/11/13. +// Copyright © 2015年 ash. All rights reserved. +// + +#import "BaseViewModel.h" +#import "BaseModel.h" +@implementation BaseViewModel + ++(BaseEntity*)requireWithDic:(NSDictionary *)dic withModel:(BaseModel*)model +{ + BaseEntity *pro = [[BaseEntity alloc] init]; + pro.requireType = HTTPRequestTypeWithGET; + pro.responesOBJ = model.class; + pro.reqURL = @""; + pro.pro = dic; + return pro; +} +@end diff --git a/Doctor/ViewModel/LoginViewModel.h b/Doctor/ViewModel/LoginViewModel.h new file mode 100644 index 0000000..dea7e3e --- /dev/null +++ b/Doctor/ViewModel/LoginViewModel.h @@ -0,0 +1,23 @@ +// +// LoginViewModel.h +// WlianWorld +// +// Created by xmfish on 15/11/13. +// Copyright © 2015年 ash. All rights reserved. +// + +#import "BaseViewModel.h" +#import "LoginModel.h" +@interface LoginViewModel : BaseViewModel + +@property (nonatomic,strong) NSString* account; +@property (nonatomic,strong) NSString* password; + +@property (strong, nonatomic) RACCommand *executeLogin; +@property (strong, nonatomic)RACSignal* validLoginSignal; + +@property (nonatomic, strong)LoginModel* model; + + + +@end diff --git a/Doctor/ViewModel/LoginViewModel.m b/Doctor/ViewModel/LoginViewModel.m new file mode 100644 index 0000000..7454ec5 --- /dev/null +++ b/Doctor/ViewModel/LoginViewModel.m @@ -0,0 +1,55 @@ +// +// LoginViewModel.m +// WlianWorld +// +// Created by xmfish on 15/11/13. +// Copyright © 2015年 ash. All rights reserved. +// + +#import "LoginViewModel.h" + +@interface LoginViewModel() + +@end + +@implementation LoginViewModel + +-(id)init +{ + self = [super init]; + + if (self) + { + self.model = [[LoginModel alloc] init]; + [self initialize]; + } + + return self; +} + + +- (void)initialize +{ + + self.model.title = @"登陆"; + + self.validLoginSignal = [[RACSignal combineLatest:@[RACObserve(self, account),RACObserve(self, password)] reduce:^id(NSString* account,NSString* password){ + return @( (account.length>1) && (password.length>1) ); + }] distinctUntilChanged]; + + + self.executeLogin = [[RACCommand alloc] initWithEnabled:self.validLoginSignal + signalBlock:^RACSignal *(id input) { + return [self executeSearchSignal]; + }]; +} + + +- (RACSignal *)executeSearchSignal { + + return [[self.model loginSignalWithAccount:self.account withPassword:self.password] doNext:^(id result) { + self.model = result; + }]; +} + +@end