Browse Source

银行卡绑定

Steven 3 years ago
parent
commit
e193cd1bde
100 changed files with 5885 additions and 56 deletions
  1. 286 0
      KulexiuForTeacher/KulexiuForTeacher.xcodeproj/project.pbxproj
  2. BIN
      KulexiuForTeacher/KulexiuForTeacher.xcworkspace/xcuserdata/wangzhi.xcuserdatad/UserInterfaceState.xcuserstate
  3. 7 23
      KulexiuForTeacher/KulexiuForTeacher.xcworkspace/xcuserdata/wangzhi.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist
  4. 22 0
      KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/EmptyStatus/empty_card.imageset/Contents.json
  5. BIN
      KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/EmptyStatus/empty_card.imageset/empty_card@2x.png
  6. BIN
      KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/EmptyStatus/empty_card.imageset/empty_card@3x.png
  7. 6 0
      KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/Home/Income/Contents.json
  8. 22 0
      KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/Home/Income/income_accompany.imageset/Contents.json
  9. BIN
      KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/Home/Income/income_accompany.imageset/income_accompany@2x.png
  10. BIN
      KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/Home/Income/income_accompany.imageset/income_accompany@3x.png
  11. 22 0
      KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/Home/Income/income_headImage.imageset/Contents.json
  12. BIN
      KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/Home/Income/income_headImage.imageset/income_headImage@2x.png
  13. BIN
      KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/Home/Income/income_headImage.imageset/income_headImage@3x.png
  14. 22 0
      KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/Home/Income/income_live.imageset/Contents.json
  15. BIN
      KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/Home/Income/income_live.imageset/income_live@2x.png
  16. BIN
      KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/Home/Income/income_live.imageset/income_live@3x.png
  17. 22 0
      KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/Home/Income/income_music.imageset/Contents.json
  18. BIN
      KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/Home/Income/income_music.imageset/income_music@2x.png
  19. BIN
      KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/Home/Income/income_music.imageset/income_music@3x.png
  20. 6 0
      KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/Mine/CardBind/Contents.json
  21. 22 0
      KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/Mine/CardBind/card_failed.imageset/Contents.json
  22. BIN
      KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/Mine/CardBind/card_failed.imageset/card_failed@2x.png
  23. BIN
      KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/Mine/CardBind/card_failed.imageset/card_failed@3x.png
  24. 22 0
      KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/Mine/CardBind/card_icon.imageset/Contents.json
  25. BIN
      KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/Mine/CardBind/card_icon.imageset/card_icon@2x.png
  26. BIN
      KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/Mine/CardBind/card_icon.imageset/card_icon@3x.png
  27. 22 0
      KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/Mine/CardBind/card_success.imageset/Contents.json
  28. BIN
      KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/Mine/CardBind/card_success.imageset/card_success@2x.png
  29. BIN
      KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/Mine/CardBind/card_success.imageset/card_success@3x.png
  30. 22 0
      KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/Mine/choose_arrow.imageset/Contents.json
  31. BIN
      KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/Mine/choose_arrow.imageset/choose_arrow@2x.png
  32. BIN
      KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/Mine/choose_arrow.imageset/choose_arrow@3x.png
  33. 22 0
      KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/back_button_white.imageset/Contents.json
  34. BIN
      KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/back_button_white.imageset/back_button_white@2x.png
  35. BIN
      KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/back_button_white.imageset/back_button_white@3x.png
  36. 6 6
      KulexiuForTeacher/KulexiuForTeacher/Common/Base/AuthDisplayView.xib
  37. 5 2
      KulexiuForTeacher/KulexiuForTeacher/Common/Base/KSBaseViewController.m
  38. 5 5
      KulexiuForTeacher/KulexiuForTeacher/Common/Base/KSBaseWKWebViewController.m
  39. 75 0
      KulexiuForTeacher/KulexiuForTeacher/Common/Base/KSNetworkingManager.h
  40. 123 0
      KulexiuForTeacher/KulexiuForTeacher/Common/Base/KSNetworkingManager.m
  41. 2 2
      KulexiuForTeacher/KulexiuForTeacher/Common/Tools/Custom/KSButtonStatusView.m
  42. 2 2
      KulexiuForTeacher/KulexiuForTeacher/Module/Chat/Controller/KSChatListViewController.m
  43. 6 6
      KulexiuForTeacher/KulexiuForTeacher/Module/Course/View/CourseNavView.xib
  44. 3 5
      KulexiuForTeacher/KulexiuForTeacher/Module/Home/Controller/HomeViewController.m
  45. 16 0
      KulexiuForTeacher/KulexiuForTeacher/Module/Home/Income/Controller/IncomeCountViewController.h
  46. 508 0
      KulexiuForTeacher/KulexiuForTeacher/Module/Home/Income/Controller/IncomeCountViewController.m
  47. 16 0
      KulexiuForTeacher/KulexiuForTeacher/Module/Home/Income/Controller/MyIncomeViewController.h
  48. 270 0
      KulexiuForTeacher/KulexiuForTeacher/Module/Home/Income/Controller/MyIncomeViewController.m
  49. 32 0
      KulexiuForTeacher/KulexiuForTeacher/Module/Home/Income/Model/IncomeListModel.h
  50. 183 0
      KulexiuForTeacher/KulexiuForTeacher/Module/Home/Income/Model/IncomeListModel.m
  51. 0 0
      KulexiuForTeacher/KulexiuForTeacher/Module/Home/Income/Model/echarts.min.js
  52. 33 0
      KulexiuForTeacher/KulexiuForTeacher/Module/Home/Income/Model/stacked_line_chart.html
  53. 23 0
      KulexiuForTeacher/KulexiuForTeacher/Module/Home/Income/View/IncomeCountBottomView.h
  54. 88 0
      KulexiuForTeacher/KulexiuForTeacher/Module/Home/Income/View/IncomeCountBottomView.m
  55. 208 0
      KulexiuForTeacher/KulexiuForTeacher/Module/Home/Income/View/IncomeCountBottomView.xib
  56. 34 0
      KulexiuForTeacher/KulexiuForTeacher/Module/Home/Income/View/IncomeCountTopView.h
  57. 115 0
      KulexiuForTeacher/KulexiuForTeacher/Module/Home/Income/View/IncomeCountTopView.m
  58. 274 0
      KulexiuForTeacher/KulexiuForTeacher/Module/Home/Income/View/IncomeCountTopView.xib
  59. 40 0
      KulexiuForTeacher/KulexiuForTeacher/Module/Home/Income/View/IncomeHeaderView.h
  60. 62 0
      KulexiuForTeacher/KulexiuForTeacher/Module/Home/Income/View/IncomeHeaderView.m
  61. 179 0
      KulexiuForTeacher/KulexiuForTeacher/Module/Home/Income/View/IncomeHeaderView.xib
  62. 55 0
      KulexiuForTeacher/KulexiuForTeacher/Module/Home/Income/View/KSMutilDatePicker.h
  63. 760 0
      KulexiuForTeacher/KulexiuForTeacher/Module/Home/Income/View/KSMutilDatePicker.m
  64. 23 0
      KulexiuForTeacher/KulexiuForTeacher/Module/Home/Income/View/KSSegView.h
  65. 73 0
      KulexiuForTeacher/KulexiuForTeacher/Module/Home/Income/View/KSSegView.m
  66. 57 0
      KulexiuForTeacher/KulexiuForTeacher/Module/Home/Income/View/KSSegView.xib
  67. 16 0
      KulexiuForTeacher/KulexiuForTeacher/Module/Home/Income/View/MyIncomeListCell.h
  68. 24 0
      KulexiuForTeacher/KulexiuForTeacher/Module/Home/Income/View/MyIncomeListCell.m
  69. 108 0
      KulexiuForTeacher/KulexiuForTeacher/Module/Home/Income/View/MyIncomeListCell.xib
  70. 16 0
      KulexiuForTeacher/KulexiuForTeacher/Module/Home/Income/WithDraw/Controller/CashRecordViewController.h
  71. 39 0
      KulexiuForTeacher/KulexiuForTeacher/Module/Home/Income/WithDraw/Controller/CashRecordViewController.m
  72. 16 0
      KulexiuForTeacher/KulexiuForTeacher/Module/Home/Income/WithDraw/Controller/WithdrawViewController.h
  73. 43 0
      KulexiuForTeacher/KulexiuForTeacher/Module/Home/Income/WithDraw/Controller/WithdrawViewController.m
  74. 16 0
      KulexiuForTeacher/KulexiuForTeacher/Module/Home/Income/WithDraw/View/CashRecordListCell.h
  75. 24 0
      KulexiuForTeacher/KulexiuForTeacher/Module/Home/Income/WithDraw/View/CashRecordListCell.m
  76. 21 0
      KulexiuForTeacher/KulexiuForTeacher/Module/Home/Income/WithDraw/View/CashRecordListCell.xib
  77. 1 1
      KulexiuForTeacher/KulexiuForTeacher/Module/Home/MyCourse/View/MyLessonBodyView.m
  78. 74 2
      KulexiuForTeacher/KulexiuForTeacher/Module/Home/View/HomeBodyView.xib
  79. 7 1
      KulexiuForTeacher/KulexiuForTeacher/Module/Home/View/HomeHeadView.m
  80. 4 1
      KulexiuForTeacher/KulexiuForTeacher/Module/Home/View/HomeHeadView.xib
  81. 16 0
      KulexiuForTeacher/KulexiuForTeacher/Module/Mine/BankCard/Controller/BandCardViewController.h
  82. 163 0
      KulexiuForTeacher/KulexiuForTeacher/Module/Mine/BankCard/Controller/BandCardViewController.m
  83. 26 0
      KulexiuForTeacher/KulexiuForTeacher/Module/Mine/BankCard/Controller/CardBandResultViewController.h
  84. 72 0
      KulexiuForTeacher/KulexiuForTeacher/Module/Mine/BankCard/Controller/CardBandResultViewController.m
  85. 16 0
      KulexiuForTeacher/KulexiuForTeacher/Module/Mine/BankCard/Controller/MyBankCardViewController.h
  86. 186 0
      KulexiuForTeacher/KulexiuForTeacher/Module/Mine/BankCard/Controller/MyBankCardViewController.m
  87. 22 0
      KulexiuForTeacher/KulexiuForTeacher/Module/Mine/BankCard/Controller/UnbindCardViewController.h
  88. 96 0
      KulexiuForTeacher/KulexiuForTeacher/Module/Mine/BankCard/Controller/UnbindCardViewController.m
  89. 27 0
      KulexiuForTeacher/KulexiuForTeacher/Module/Mine/BankCard/Model/BankNameModel.h
  90. 148 0
      KulexiuForTeacher/KulexiuForTeacher/Module/Mine/BankCard/Model/BankNameModel.m
  91. 30 0
      KulexiuForTeacher/KulexiuForTeacher/Module/Mine/BankCard/Model/MyCardModel.h
  92. 169 0
      KulexiuForTeacher/KulexiuForTeacher/Module/Mine/BankCard/Model/MyCardModel.m
  93. 34 0
      KulexiuForTeacher/KulexiuForTeacher/Module/Mine/BankCard/View/CardBandBodyView.h
  94. 88 0
      KulexiuForTeacher/KulexiuForTeacher/Module/Mine/BankCard/View/CardBandBodyView.m
  95. 346 0
      KulexiuForTeacher/KulexiuForTeacher/Module/Mine/BankCard/View/CardBandBodyView.xib
  96. 26 0
      KulexiuForTeacher/KulexiuForTeacher/Module/Mine/BankCard/View/CardBindResultBodyView.h
  97. 45 0
      KulexiuForTeacher/KulexiuForTeacher/Module/Mine/BankCard/View/CardBindResultBodyView.m
  98. 71 0
      KulexiuForTeacher/KulexiuForTeacher/Module/Mine/BankCard/View/CardBindResultBodyView.xib
  99. 24 0
      KulexiuForTeacher/KulexiuForTeacher/Module/Mine/BankCard/View/CardDisplayView.h
  100. 70 0
      KulexiuForTeacher/KulexiuForTeacher/Module/Mine/BankCard/View/CardDisplayView.m

+ 286 - 0
KulexiuForTeacher/KulexiuForTeacher.xcodeproj/project.pbxproj

@@ -478,6 +478,27 @@
 		BC76146A280D4F670080FD1F /* HomeworkDetailModel.m in Sources */ = {isa = PBXBuildFile; fileRef = BC761468280D4F660080FD1F /* HomeworkDetailModel.m */; };
 		BC76146D280D571B0080FD1F /* HomeworkVideoView.m in Sources */ = {isa = PBXBuildFile; fileRef = BC76146C280D571B0080FD1F /* HomeworkVideoView.m */; };
 		BC76146F280D57220080FD1F /* HomeworkVideoView.xib in Resources */ = {isa = PBXBuildFile; fileRef = BC76146E280D57220080FD1F /* HomeworkVideoView.xib */; };
+		BC7CFF9F2817CBD400CAEB21 /* WithdrawViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = BC7CFF9E2817CBD400CAEB21 /* WithdrawViewController.m */; };
+		BC7CFFA22817D72200CAEB21 /* IncomeListModel.m in Sources */ = {isa = PBXBuildFile; fileRef = BC7CFFA02817D72100CAEB21 /* IncomeListModel.m */; };
+		BC7CFFA52817E37300CAEB21 /* IncomeCountViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = BC7CFFA42817E37300CAEB21 /* IncomeCountViewController.m */; };
+		BC7CFFA92817E3BD00CAEB21 /* IncomeCountTopView.m in Sources */ = {isa = PBXBuildFile; fileRef = BC7CFFA62817E3BD00CAEB21 /* IncomeCountTopView.m */; };
+		BC7CFFAA2817E3BD00CAEB21 /* IncomeCountTopView.xib in Resources */ = {isa = PBXBuildFile; fileRef = BC7CFFA82817E3BD00CAEB21 /* IncomeCountTopView.xib */; };
+		BC7CFFAE2817E6C900CAEB21 /* IncomeCountBottomView.xib in Resources */ = {isa = PBXBuildFile; fileRef = BC7CFFAB2817E6C800CAEB21 /* IncomeCountBottomView.xib */; };
+		BC7CFFAF2817E6C900CAEB21 /* IncomeCountBottomView.m in Sources */ = {isa = PBXBuildFile; fileRef = BC7CFFAC2817E6C900CAEB21 /* IncomeCountBottomView.m */; };
+		BC7CFFB22817E6DB00CAEB21 /* KSMutilDatePicker.m in Sources */ = {isa = PBXBuildFile; fileRef = BC7CFFB12817E6DB00CAEB21 /* KSMutilDatePicker.m */; };
+		BC7CFFB62817E90700CAEB21 /* KSSegView.xib in Resources */ = {isa = PBXBuildFile; fileRef = BC7CFFB32817E90600CAEB21 /* KSSegView.xib */; };
+		BC7CFFB72817E90700CAEB21 /* KSSegView.m in Sources */ = {isa = PBXBuildFile; fileRef = BC7CFFB52817E90700CAEB21 /* KSSegView.m */; };
+		BC7CFFBA2817E9FC00CAEB21 /* echarts.min.js in Resources */ = {isa = PBXBuildFile; fileRef = BC7CFFB82817E9FC00CAEB21 /* echarts.min.js */; };
+		BC7CFFBB2817E9FC00CAEB21 /* stacked_line_chart.html in Resources */ = {isa = PBXBuildFile; fileRef = BC7CFFB92817E9FC00CAEB21 /* stacked_line_chart.html */; };
+		BC7CFFBE2817F1D200CAEB21 /* MyBankCardViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = BC7CFFBD2817F1D200CAEB21 /* MyBankCardViewController.m */; };
+		BC7CFFC52817F29800CAEB21 /* CashRecordViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = BC7CFFC42817F29800CAEB21 /* CashRecordViewController.m */; };
+		BC7CFFC92817F2FF00CAEB21 /* CashRecordListCell.m in Sources */ = {isa = PBXBuildFile; fileRef = BC7CFFC72817F2FF00CAEB21 /* CashRecordListCell.m */; };
+		BC7CFFCA2817F2FF00CAEB21 /* CashRecordListCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = BC7CFFC82817F2FF00CAEB21 /* CashRecordListCell.xib */; };
+		BC7CFFCD2817FE8C00CAEB21 /* BandCardViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = BC7CFFCC2817FE8C00CAEB21 /* BandCardViewController.m */; };
+		BC7CFFD02817FF6700CAEB21 /* CardDisplayView.m in Sources */ = {isa = PBXBuildFile; fileRef = BC7CFFCF2817FF6700CAEB21 /* CardDisplayView.m */; };
+		BC7CFFD22817FF6D00CAEB21 /* CardDisplayView.xib in Resources */ = {isa = PBXBuildFile; fileRef = BC7CFFD12817FF6D00CAEB21 /* CardDisplayView.xib */; };
+		BC7CFFD5281801A800CAEB21 /* CardBandBodyView.m in Sources */ = {isa = PBXBuildFile; fileRef = BC7CFFD4281801A800CAEB21 /* CardBandBodyView.m */; };
+		BC7CFFD7281801B700CAEB21 /* CardBandBodyView.xib in Resources */ = {isa = PBXBuildFile; fileRef = BC7CFFD6281801B700CAEB21 /* CardBandBodyView.xib */; };
 		BCA723FB2806A96000DA0D0D /* HomeworkDetailViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = BCA723FA2806A96000DA0D0D /* HomeworkDetailViewController.m */; };
 		BCA723FF2806AEA000DA0D0D /* AccompanyHomeworkCell.m in Sources */ = {isa = PBXBuildFile; fileRef = BCA723FD2806AEA000DA0D0D /* AccompanyHomeworkCell.m */; };
 		BCA724002806AEA000DA0D0D /* AccompanyHomeworkCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = BCA723FE2806AEA000DA0D0D /* AccompanyHomeworkCell.xib */; };
@@ -606,6 +627,8 @@
 		BCDB093E2805C0EF00D0BDAD /* NewClassPopCell.m in Sources */ = {isa = PBXBuildFile; fileRef = BCDB093A2805C0ED00D0BDAD /* NewClassPopCell.m */; };
 		BCDB093F2805C0EF00D0BDAD /* NewClassPopCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = BCDB093B2805C0EE00D0BDAD /* NewClassPopCell.xib */; };
 		BCDB09402805C0EF00D0BDAD /* NewClassPopView.m in Sources */ = {isa = PBXBuildFile; fileRef = BCDB093D2805C0EF00D0BDAD /* NewClassPopView.m */; };
+		BCE06F2B2818146700234817 /* KSConfirmAlertView.m in Sources */ = {isa = PBXBuildFile; fileRef = BCE06F2A2818146700234817 /* KSConfirmAlertView.m */; };
+		BCE06F2D2818147000234817 /* KSConfirmAlertView.xib in Resources */ = {isa = PBXBuildFile; fileRef = BCE06F2C2818147000234817 /* KSConfirmAlertView.xib */; };
 		BCE6A07F27F7FACA00C97704 /* UIView+SubViewExtension.m in Sources */ = {isa = PBXBuildFile; fileRef = BCE6A07E27F7FACA00C97704 /* UIView+SubViewExtension.m */; };
 		BCE6A08527F81B4200C97704 /* MinePageSubmitView.m in Sources */ = {isa = PBXBuildFile; fileRef = BCE6A08427F81B4200C97704 /* MinePageSubmitView.m */; };
 		BCE6A08727F81B4D00C97704 /* MinePageSubmitView.xib in Resources */ = {isa = PBXBuildFile; fileRef = BCE6A08627F81B4D00C97704 /* MinePageSubmitView.xib */; };
@@ -623,6 +646,14 @@
 		BCE6A0A527F8517900C97704 /* MineVideoCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = BCE6A0A327F8517900C97704 /* MineVideoCell.xib */; };
 		BCE6A0A927F852CD00C97704 /* MineFansGroupCell.m in Sources */ = {isa = PBXBuildFile; fileRef = BCE6A0A727F852CD00C97704 /* MineFansGroupCell.m */; };
 		BCE6A0AA27F852CD00C97704 /* MineFansGroupCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = BCE6A0A827F852CD00C97704 /* MineFansGroupCell.xib */; };
+		BCEA751A2818D59300886A86 /* BankNameModel.m in Sources */ = {isa = PBXBuildFile; fileRef = BCEA75192818D59300886A86 /* BankNameModel.m */; };
+		BCEA751D2818F6C900886A86 /* MyCardModel.m in Sources */ = {isa = PBXBuildFile; fileRef = BCEA751C2818F6C900886A86 /* MyCardModel.m */; };
+		BCEA752028190CEB00886A86 /* CardBandResultViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = BCEA751F28190CEB00886A86 /* CardBandResultViewController.m */; };
+		BCEA752328190D2900886A86 /* UnbindCardViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = BCEA752228190D2900886A86 /* UnbindCardViewController.m */; };
+		BCEA75262819103300886A86 /* UnbindBodyView.m in Sources */ = {isa = PBXBuildFile; fileRef = BCEA75252819103300886A86 /* UnbindBodyView.m */; };
+		BCEA75282819103B00886A86 /* UnbindBodyView.xib in Resources */ = {isa = PBXBuildFile; fileRef = BCEA75272819103B00886A86 /* UnbindBodyView.xib */; };
+		BCEA752B2819133E00886A86 /* CardBindResultBodyView.m in Sources */ = {isa = PBXBuildFile; fileRef = BCEA752A2819133E00886A86 /* CardBindResultBodyView.m */; };
+		BCEA752D2819134400886A86 /* CardBindResultBodyView.xib in Resources */ = {isa = PBXBuildFile; fileRef = BCEA752C2819134400886A86 /* CardBindResultBodyView.xib */; };
 		BCF1BA5127F5C4DD00FA36C4 /* KSLiveChatroomMemberCount.m in Sources */ = {isa = PBXBuildFile; fileRef = BCF1BA5027F5C4DD00FA36C4 /* KSLiveChatroomMemberCount.m */; };
 		BCF1BA5427F5CB5800FA36C4 /* LiveSeatApplyView.m in Sources */ = {isa = PBXBuildFile; fileRef = BCF1BA5327F5CB5800FA36C4 /* LiveSeatApplyView.m */; };
 		BCF1BA5627F5CBA100FA36C4 /* LiveSeatApplyView.xib in Resources */ = {isa = PBXBuildFile; fileRef = BCF1BA5527F5CBA100FA36C4 /* LiveSeatApplyView.xib */; };
@@ -638,6 +669,11 @@
 		BCF61BEF28042F9B0000ACFE /* InstrumentChooseBottonView.m in Sources */ = {isa = PBXBuildFile; fileRef = BCF61BEE28042F9B0000ACFE /* InstrumentChooseBottonView.m */; };
 		BCF61BF128042FA90000ACFE /* InstrumentChooseBottonView.xib in Resources */ = {isa = PBXBuildFile; fileRef = BCF61BF028042FA90000ACFE /* InstrumentChooseBottonView.xib */; };
 		BCFE540928168DFF00AD6786 /* KSButtonStatusView.m in Sources */ = {isa = PBXBuildFile; fileRef = BCFE540828168DFF00AD6786 /* KSButtonStatusView.m */; };
+		BCFE541028178FF600AD6786 /* MyIncomeViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = BCFE540F28178FF600AD6786 /* MyIncomeViewController.m */; };
+		BCFE54142817918600AD6786 /* MyIncomeListCell.m in Sources */ = {isa = PBXBuildFile; fileRef = BCFE54122817918600AD6786 /* MyIncomeListCell.m */; };
+		BCFE54152817918600AD6786 /* MyIncomeListCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = BCFE54132817918600AD6786 /* MyIncomeListCell.xib */; };
+		BCFE54182817BDFD00AD6786 /* IncomeHeaderView.m in Sources */ = {isa = PBXBuildFile; fileRef = BCFE54172817BDFD00AD6786 /* IncomeHeaderView.m */; };
+		BCFE541A2817BE0800AD6786 /* IncomeHeaderView.xib in Resources */ = {isa = PBXBuildFile; fileRef = BCFE54192817BE0800AD6786 /* IncomeHeaderView.xib */; };
 /* End PBXBuildFile section */
 
 /* Begin PBXContainerItemProxy section */
@@ -1519,6 +1555,40 @@
 		BC76146B280D571B0080FD1F /* HomeworkVideoView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = HomeworkVideoView.h; sourceTree = "<group>"; };
 		BC76146C280D571B0080FD1F /* HomeworkVideoView.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = HomeworkVideoView.m; sourceTree = "<group>"; };
 		BC76146E280D57220080FD1F /* HomeworkVideoView.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = HomeworkVideoView.xib; sourceTree = "<group>"; };
+		BC7CFF9D2817CBD400CAEB21 /* WithdrawViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = WithdrawViewController.h; sourceTree = "<group>"; };
+		BC7CFF9E2817CBD400CAEB21 /* WithdrawViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = WithdrawViewController.m; sourceTree = "<group>"; };
+		BC7CFFA02817D72100CAEB21 /* IncomeListModel.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = IncomeListModel.m; sourceTree = "<group>"; };
+		BC7CFFA12817D72200CAEB21 /* IncomeListModel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IncomeListModel.h; sourceTree = "<group>"; };
+		BC7CFFA32817E37300CAEB21 /* IncomeCountViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = IncomeCountViewController.h; sourceTree = "<group>"; };
+		BC7CFFA42817E37300CAEB21 /* IncomeCountViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = IncomeCountViewController.m; sourceTree = "<group>"; };
+		BC7CFFA62817E3BD00CAEB21 /* IncomeCountTopView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = IncomeCountTopView.m; sourceTree = "<group>"; };
+		BC7CFFA72817E3BD00CAEB21 /* IncomeCountTopView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IncomeCountTopView.h; sourceTree = "<group>"; };
+		BC7CFFA82817E3BD00CAEB21 /* IncomeCountTopView.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = IncomeCountTopView.xib; sourceTree = "<group>"; };
+		BC7CFFAB2817E6C800CAEB21 /* IncomeCountBottomView.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = IncomeCountBottomView.xib; sourceTree = "<group>"; };
+		BC7CFFAC2817E6C900CAEB21 /* IncomeCountBottomView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = IncomeCountBottomView.m; sourceTree = "<group>"; };
+		BC7CFFAD2817E6C900CAEB21 /* IncomeCountBottomView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IncomeCountBottomView.h; sourceTree = "<group>"; };
+		BC7CFFB02817E6DB00CAEB21 /* KSMutilDatePicker.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = KSMutilDatePicker.h; sourceTree = "<group>"; };
+		BC7CFFB12817E6DB00CAEB21 /* KSMutilDatePicker.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = KSMutilDatePicker.m; sourceTree = "<group>"; };
+		BC7CFFB32817E90600CAEB21 /* KSSegView.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = KSSegView.xib; sourceTree = "<group>"; };
+		BC7CFFB42817E90600CAEB21 /* KSSegView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = KSSegView.h; sourceTree = "<group>"; };
+		BC7CFFB52817E90700CAEB21 /* KSSegView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = KSSegView.m; sourceTree = "<group>"; };
+		BC7CFFB82817E9FC00CAEB21 /* echarts.min.js */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.javascript; path = echarts.min.js; sourceTree = "<group>"; };
+		BC7CFFB92817E9FC00CAEB21 /* stacked_line_chart.html */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.html; path = stacked_line_chart.html; sourceTree = "<group>"; };
+		BC7CFFBC2817F1D200CAEB21 /* MyBankCardViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MyBankCardViewController.h; sourceTree = "<group>"; };
+		BC7CFFBD2817F1D200CAEB21 /* MyBankCardViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MyBankCardViewController.m; sourceTree = "<group>"; };
+		BC7CFFC32817F29800CAEB21 /* CashRecordViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = CashRecordViewController.h; sourceTree = "<group>"; };
+		BC7CFFC42817F29800CAEB21 /* CashRecordViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = CashRecordViewController.m; sourceTree = "<group>"; };
+		BC7CFFC62817F2FF00CAEB21 /* CashRecordListCell.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = CashRecordListCell.h; sourceTree = "<group>"; };
+		BC7CFFC72817F2FF00CAEB21 /* CashRecordListCell.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = CashRecordListCell.m; sourceTree = "<group>"; };
+		BC7CFFC82817F2FF00CAEB21 /* CashRecordListCell.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = CashRecordListCell.xib; sourceTree = "<group>"; };
+		BC7CFFCB2817FE8C00CAEB21 /* BandCardViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = BandCardViewController.h; sourceTree = "<group>"; };
+		BC7CFFCC2817FE8C00CAEB21 /* BandCardViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = BandCardViewController.m; sourceTree = "<group>"; };
+		BC7CFFCE2817FF6700CAEB21 /* CardDisplayView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = CardDisplayView.h; sourceTree = "<group>"; };
+		BC7CFFCF2817FF6700CAEB21 /* CardDisplayView.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = CardDisplayView.m; sourceTree = "<group>"; };
+		BC7CFFD12817FF6D00CAEB21 /* CardDisplayView.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = CardDisplayView.xib; sourceTree = "<group>"; };
+		BC7CFFD3281801A800CAEB21 /* CardBandBodyView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = CardBandBodyView.h; sourceTree = "<group>"; };
+		BC7CFFD4281801A800CAEB21 /* CardBandBodyView.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = CardBandBodyView.m; sourceTree = "<group>"; };
+		BC7CFFD6281801B700CAEB21 /* CardBandBodyView.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = CardBandBodyView.xib; sourceTree = "<group>"; };
 		BCA723F92806A96000DA0D0D /* HomeworkDetailViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = HomeworkDetailViewController.h; sourceTree = "<group>"; };
 		BCA723FA2806A96000DA0D0D /* HomeworkDetailViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = HomeworkDetailViewController.m; sourceTree = "<group>"; };
 		BCA723FC2806AEA000DA0D0D /* AccompanyHomeworkCell.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AccompanyHomeworkCell.h; sourceTree = "<group>"; };
@@ -1760,6 +1830,9 @@
 		BCDB093B2805C0EE00D0BDAD /* NewClassPopCell.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = NewClassPopCell.xib; sourceTree = "<group>"; };
 		BCDB093C2805C0EE00D0BDAD /* NewClassPopCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NewClassPopCell.h; sourceTree = "<group>"; };
 		BCDB093D2805C0EF00D0BDAD /* NewClassPopView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = NewClassPopView.m; sourceTree = "<group>"; };
+		BCE06F292818146700234817 /* KSConfirmAlertView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = KSConfirmAlertView.h; sourceTree = "<group>"; };
+		BCE06F2A2818146700234817 /* KSConfirmAlertView.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = KSConfirmAlertView.m; sourceTree = "<group>"; };
+		BCE06F2C2818147000234817 /* KSConfirmAlertView.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = KSConfirmAlertView.xib; sourceTree = "<group>"; };
 		BCE6A07D27F7FACA00C97704 /* UIView+SubViewExtension.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "UIView+SubViewExtension.h"; sourceTree = "<group>"; };
 		BCE6A07E27F7FACA00C97704 /* UIView+SubViewExtension.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = "UIView+SubViewExtension.m"; sourceTree = "<group>"; };
 		BCE6A08327F81B4200C97704 /* MinePageSubmitView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MinePageSubmitView.h; sourceTree = "<group>"; };
@@ -1786,6 +1859,20 @@
 		BCE6A0A627F852CD00C97704 /* MineFansGroupCell.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MineFansGroupCell.h; sourceTree = "<group>"; };
 		BCE6A0A727F852CD00C97704 /* MineFansGroupCell.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MineFansGroupCell.m; sourceTree = "<group>"; };
 		BCE6A0A827F852CD00C97704 /* MineFansGroupCell.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = MineFansGroupCell.xib; sourceTree = "<group>"; };
+		BCEA75182818D59300886A86 /* BankNameModel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BankNameModel.h; sourceTree = "<group>"; };
+		BCEA75192818D59300886A86 /* BankNameModel.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BankNameModel.m; sourceTree = "<group>"; };
+		BCEA751B2818F6C900886A86 /* MyCardModel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MyCardModel.h; sourceTree = "<group>"; };
+		BCEA751C2818F6C900886A86 /* MyCardModel.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MyCardModel.m; sourceTree = "<group>"; };
+		BCEA751E28190CEB00886A86 /* CardBandResultViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = CardBandResultViewController.h; sourceTree = "<group>"; };
+		BCEA751F28190CEB00886A86 /* CardBandResultViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = CardBandResultViewController.m; sourceTree = "<group>"; };
+		BCEA752128190D2900886A86 /* UnbindCardViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = UnbindCardViewController.h; sourceTree = "<group>"; };
+		BCEA752228190D2900886A86 /* UnbindCardViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = UnbindCardViewController.m; sourceTree = "<group>"; };
+		BCEA75242819103300886A86 /* UnbindBodyView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = UnbindBodyView.h; sourceTree = "<group>"; };
+		BCEA75252819103300886A86 /* UnbindBodyView.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = UnbindBodyView.m; sourceTree = "<group>"; };
+		BCEA75272819103B00886A86 /* UnbindBodyView.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = UnbindBodyView.xib; sourceTree = "<group>"; };
+		BCEA75292819133E00886A86 /* CardBindResultBodyView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = CardBindResultBodyView.h; sourceTree = "<group>"; };
+		BCEA752A2819133E00886A86 /* CardBindResultBodyView.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = CardBindResultBodyView.m; sourceTree = "<group>"; };
+		BCEA752C2819134400886A86 /* CardBindResultBodyView.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = CardBindResultBodyView.xib; sourceTree = "<group>"; };
 		BCF1BA4F27F5C4DD00FA36C4 /* KSLiveChatroomMemberCount.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = KSLiveChatroomMemberCount.h; sourceTree = "<group>"; };
 		BCF1BA5027F5C4DD00FA36C4 /* KSLiveChatroomMemberCount.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = KSLiveChatroomMemberCount.m; sourceTree = "<group>"; };
 		BCF1BA5227F5CB5800FA36C4 /* LiveSeatApplyView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = LiveSeatApplyView.h; sourceTree = "<group>"; };
@@ -1811,6 +1898,14 @@
 		BCF61BF028042FA90000ACFE /* InstrumentChooseBottonView.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = InstrumentChooseBottonView.xib; sourceTree = "<group>"; };
 		BCFE540728168DFF00AD6786 /* KSButtonStatusView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = KSButtonStatusView.h; sourceTree = "<group>"; };
 		BCFE540828168DFF00AD6786 /* KSButtonStatusView.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = KSButtonStatusView.m; sourceTree = "<group>"; };
+		BCFE540E28178FF600AD6786 /* MyIncomeViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MyIncomeViewController.h; sourceTree = "<group>"; };
+		BCFE540F28178FF600AD6786 /* MyIncomeViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MyIncomeViewController.m; sourceTree = "<group>"; };
+		BCFE54112817918600AD6786 /* MyIncomeListCell.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MyIncomeListCell.h; sourceTree = "<group>"; };
+		BCFE54122817918600AD6786 /* MyIncomeListCell.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MyIncomeListCell.m; sourceTree = "<group>"; };
+		BCFE54132817918600AD6786 /* MyIncomeListCell.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = MyIncomeListCell.xib; sourceTree = "<group>"; };
+		BCFE54162817BDFD00AD6786 /* IncomeHeaderView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = IncomeHeaderView.h; sourceTree = "<group>"; };
+		BCFE54172817BDFD00AD6786 /* IncomeHeaderView.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = IncomeHeaderView.m; sourceTree = "<group>"; };
+		BCFE54192817BE0800AD6786 /* IncomeHeaderView.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = IncomeHeaderView.xib; sourceTree = "<group>"; };
 		CC310B10C17622ABB179BC7C /* libPods-KulexiuForTeacher.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-KulexiuForTeacher.a"; sourceTree = BUILT_PRODUCTS_DIR; };
 /* End PBXFileReference section */
 
@@ -2983,6 +3078,7 @@
 		277935FA27E32BBF0010E277 /* Home */ = {
 			isa = PBXGroup;
 			children = (
+				BCFE540A28178BD100AD6786 /* Income */,
 				BC1365BE280D44D500EB03E2 /* NotiferMessage */,
 				BC41103C28066E4100800BD9 /* EvaluateCourse */,
 				BC41103228066C0D00800BD9 /* Homework */,
@@ -3030,6 +3126,7 @@
 		277935FE27E32BBF0010E277 /* Mine */ = {
 			isa = PBXGroup;
 			children = (
+				BC7CFFBF2817F1EE00CAEB21 /* BankCard */,
 				BC5EB5AC2804016200B4A3B0 /* CreateStyle */,
 				BCA9CE1827FD5EBF00D558C6 /* LiveCourse */,
 				275FA55927F31A7400EB6240 /* MinePage */,
@@ -3842,6 +3939,102 @@
 			path = View;
 			sourceTree = "<group>";
 		};
+		BC7CFF992817CBC400CAEB21 /* WithDraw */ = {
+			isa = PBXGroup;
+			children = (
+				BC7CFF9A2817CBC400CAEB21 /* Controller */,
+				BC7CFF9B2817CBC400CAEB21 /* Model */,
+				BC7CFF9C2817CBC400CAEB21 /* View */,
+			);
+			path = WithDraw;
+			sourceTree = "<group>";
+		};
+		BC7CFF9A2817CBC400CAEB21 /* Controller */ = {
+			isa = PBXGroup;
+			children = (
+				BC7CFF9D2817CBD400CAEB21 /* WithdrawViewController.h */,
+				BC7CFF9E2817CBD400CAEB21 /* WithdrawViewController.m */,
+				BC7CFFC32817F29800CAEB21 /* CashRecordViewController.h */,
+				BC7CFFC42817F29800CAEB21 /* CashRecordViewController.m */,
+			);
+			path = Controller;
+			sourceTree = "<group>";
+		};
+		BC7CFF9B2817CBC400CAEB21 /* Model */ = {
+			isa = PBXGroup;
+			children = (
+			);
+			path = Model;
+			sourceTree = "<group>";
+		};
+		BC7CFF9C2817CBC400CAEB21 /* View */ = {
+			isa = PBXGroup;
+			children = (
+				BC7CFFC62817F2FF00CAEB21 /* CashRecordListCell.h */,
+				BC7CFFC72817F2FF00CAEB21 /* CashRecordListCell.m */,
+				BC7CFFC82817F2FF00CAEB21 /* CashRecordListCell.xib */,
+			);
+			path = View;
+			sourceTree = "<group>";
+		};
+		BC7CFFBF2817F1EE00CAEB21 /* BankCard */ = {
+			isa = PBXGroup;
+			children = (
+				BC7CFFC02817F1EE00CAEB21 /* Controller */,
+				BC7CFFC12817F1EE00CAEB21 /* Model */,
+				BC7CFFC22817F1EE00CAEB21 /* View */,
+			);
+			path = BankCard;
+			sourceTree = "<group>";
+		};
+		BC7CFFC02817F1EE00CAEB21 /* Controller */ = {
+			isa = PBXGroup;
+			children = (
+				BC7CFFBC2817F1D200CAEB21 /* MyBankCardViewController.h */,
+				BC7CFFBD2817F1D200CAEB21 /* MyBankCardViewController.m */,
+				BC7CFFCB2817FE8C00CAEB21 /* BandCardViewController.h */,
+				BC7CFFCC2817FE8C00CAEB21 /* BandCardViewController.m */,
+				BCEA752128190D2900886A86 /* UnbindCardViewController.h */,
+				BCEA752228190D2900886A86 /* UnbindCardViewController.m */,
+				BCEA751E28190CEB00886A86 /* CardBandResultViewController.h */,
+				BCEA751F28190CEB00886A86 /* CardBandResultViewController.m */,
+			);
+			path = Controller;
+			sourceTree = "<group>";
+		};
+		BC7CFFC12817F1EE00CAEB21 /* Model */ = {
+			isa = PBXGroup;
+			children = (
+				BCEA751B2818F6C900886A86 /* MyCardModel.h */,
+				BCEA751C2818F6C900886A86 /* MyCardModel.m */,
+				BCEA75182818D59300886A86 /* BankNameModel.h */,
+				BCEA75192818D59300886A86 /* BankNameModel.m */,
+			);
+			path = Model;
+			sourceTree = "<group>";
+		};
+		BC7CFFC22817F1EE00CAEB21 /* View */ = {
+			isa = PBXGroup;
+			children = (
+				BC7CFFCE2817FF6700CAEB21 /* CardDisplayView.h */,
+				BC7CFFCF2817FF6700CAEB21 /* CardDisplayView.m */,
+				BC7CFFD12817FF6D00CAEB21 /* CardDisplayView.xib */,
+				BC7CFFD3281801A800CAEB21 /* CardBandBodyView.h */,
+				BC7CFFD4281801A800CAEB21 /* CardBandBodyView.m */,
+				BC7CFFD6281801B700CAEB21 /* CardBandBodyView.xib */,
+				BCE06F292818146700234817 /* KSConfirmAlertView.h */,
+				BCE06F2A2818146700234817 /* KSConfirmAlertView.m */,
+				BCE06F2C2818147000234817 /* KSConfirmAlertView.xib */,
+				BCEA75242819103300886A86 /* UnbindBodyView.h */,
+				BCEA75252819103300886A86 /* UnbindBodyView.m */,
+				BCEA75272819103B00886A86 /* UnbindBodyView.xib */,
+				BCEA75292819133E00886A86 /* CardBindResultBodyView.h */,
+				BCEA752A2819133E00886A86 /* CardBindResultBodyView.m */,
+				BCEA752C2819134400886A86 /* CardBindResultBodyView.xib */,
+			);
+			path = View;
+			sourceTree = "<group>";
+		};
 		BCA9CE1827FD5EBF00D558C6 /* LiveCourse */ = {
 			isa = PBXGroup;
 			children = (
@@ -4436,6 +4629,63 @@
 			path = PopView;
 			sourceTree = "<group>";
 		};
+		BCFE540A28178BD100AD6786 /* Income */ = {
+			isa = PBXGroup;
+			children = (
+				BC7CFF992817CBC400CAEB21 /* WithDraw */,
+				BCFE540B28178BD100AD6786 /* Controller */,
+				BCFE540C28178BD100AD6786 /* Model */,
+				BCFE540D28178BD100AD6786 /* View */,
+			);
+			path = Income;
+			sourceTree = "<group>";
+		};
+		BCFE540B28178BD100AD6786 /* Controller */ = {
+			isa = PBXGroup;
+			children = (
+				BCFE540E28178FF600AD6786 /* MyIncomeViewController.h */,
+				BCFE540F28178FF600AD6786 /* MyIncomeViewController.m */,
+				BC7CFFA32817E37300CAEB21 /* IncomeCountViewController.h */,
+				BC7CFFA42817E37300CAEB21 /* IncomeCountViewController.m */,
+			);
+			path = Controller;
+			sourceTree = "<group>";
+		};
+		BCFE540C28178BD100AD6786 /* Model */ = {
+			isa = PBXGroup;
+			children = (
+				BC7CFFB82817E9FC00CAEB21 /* echarts.min.js */,
+				BC7CFFB92817E9FC00CAEB21 /* stacked_line_chart.html */,
+				BC7CFFA12817D72200CAEB21 /* IncomeListModel.h */,
+				BC7CFFA02817D72100CAEB21 /* IncomeListModel.m */,
+			);
+			path = Model;
+			sourceTree = "<group>";
+		};
+		BCFE540D28178BD100AD6786 /* View */ = {
+			isa = PBXGroup;
+			children = (
+				BC7CFFB42817E90600CAEB21 /* KSSegView.h */,
+				BC7CFFB52817E90700CAEB21 /* KSSegView.m */,
+				BC7CFFB32817E90600CAEB21 /* KSSegView.xib */,
+				BC7CFFB02817E6DB00CAEB21 /* KSMutilDatePicker.h */,
+				BC7CFFB12817E6DB00CAEB21 /* KSMutilDatePicker.m */,
+				BCFE54112817918600AD6786 /* MyIncomeListCell.h */,
+				BCFE54122817918600AD6786 /* MyIncomeListCell.m */,
+				BCFE54132817918600AD6786 /* MyIncomeListCell.xib */,
+				BCFE54162817BDFD00AD6786 /* IncomeHeaderView.h */,
+				BCFE54172817BDFD00AD6786 /* IncomeHeaderView.m */,
+				BCFE54192817BE0800AD6786 /* IncomeHeaderView.xib */,
+				BC7CFFA72817E3BD00CAEB21 /* IncomeCountTopView.h */,
+				BC7CFFA62817E3BD00CAEB21 /* IncomeCountTopView.m */,
+				BC7CFFA82817E3BD00CAEB21 /* IncomeCountTopView.xib */,
+				BC7CFFAD2817E6C900CAEB21 /* IncomeCountBottomView.h */,
+				BC7CFFAC2817E6C900CAEB21 /* IncomeCountBottomView.m */,
+				BC7CFFAB2817E6C800CAEB21 /* IncomeCountBottomView.xib */,
+			);
+			path = View;
+			sourceTree = "<group>";
+		};
 /* End PBXGroup section */
 
 /* Begin PBXNativeTarget section */
@@ -4562,6 +4812,7 @@
 				2779335627E316DD0010E277 /* WMPlayer.bundle in Resources */,
 				275E8A7427E18F2800DD3F6E /* Assets.xcassets in Resources */,
 				2755C06927EC71C8007D9070 /* GroupSettingBodyView.xib in Resources */,
+				BCEA752D2819134400886A86 /* CardBindResultBodyView.xib in Resources */,
 				BC1365BD280D163200EB03E2 /* MyVideoSearchView.xib in Resources */,
 				2780A06B27E823D300447CFD /* MineBodyView.xib in Resources */,
 				27F9030127E864AE00C08A19 /* NetworkBodyView.xib in Resources */,
@@ -4573,6 +4824,7 @@
 				27A54CEE27E9B986007309A3 /* ModifyNameBodyView.xib in Resources */,
 				2708565E27EDA83100EC8E72 /* GroupMemberListCell.xib in Resources */,
 				2780A06627E81E5E00447CFD /* MineNavView.xib in Resources */,
+				BC7CFFAE2817E6C900CAEB21 /* IncomeCountBottomView.xib in Resources */,
 				27A2F62A27E6C996009E2380 /* KSImageAlert.xib in Resources */,
 				BCE6A0AA27F852CD00C97704 /* MineFansGroupCell.xib in Resources */,
 				BCB399B327F94B5A00AFF376 /* LTSCalendarBottomView.xib in Resources */,
@@ -4580,17 +4832,20 @@
 				275E3DEE27F467BF0010EC30 /* LiveRoomBottomView.xib in Resources */,
 				27BC3B2B27F2DB9600D81E30 /* MusicUploadView.xib in Resources */,
 				BCE6A09B27F83E8E00C97704 /* MinePageVideoCell.xib in Resources */,
+				BCE06F2D2818147000234817 /* KSConfirmAlertView.xib in Resources */,
 				2723B68E27F1686100E0B90B /* HomeNavView.xib in Resources */,
 				BC5EB5C62804087700B4A3B0 /* MyStyleBottomView.xib in Resources */,
 				BCDB093F2805C0EF00D0BDAD /* NewClassPopCell.xib in Resources */,
 				275E3DE927F4679E0010EC30 /* LiveRoomHeadView.xib in Resources */,
 				27D83F4E27F3EC2100062476 /* CreateLiveBodyView.xib in Resources */,
+				BCEA75282819103B00886A86 /* UnbindBodyView.xib in Resources */,
 				27F9030827E86CCB00C08A19 /* DeviceCheckView.xib in Resources */,
 				2723B69327F1806500E0B90B /* HomeHeadView.xib in Resources */,
 				275B16F127EAF9DD0081FDEF /* ChatNavView.xib in Resources */,
 				2773205327EDB75B008FAECA /* GroupNoticeCell.xib in Resources */,
 				2755C08627ED5770007D9070 /* GroupApplyMemberCell.xib in Resources */,
 				27BC3B3027F2FC7200D81E30 /* VideoCourseCell.xib in Resources */,
+				BC7CFFB62817E90700CAEB21 /* KSSegView.xib in Resources */,
 				2779362227E334470010E277 /* KSUpdateAlert.xib in Resources */,
 				277D433127E9A50800107DB7 /* PhoneCheckBodyView.xib in Resources */,
 				BC5EB5C12804085500B4A3B0 /* MyStyleVideoCell.xib in Resources */,
@@ -4598,15 +4853,18 @@
 				2708565927ED961900EC8E72 /* ApplyBottomView.xib in Resources */,
 				BCB399AE27F946AA00AFF376 /* CourseNavView.xib in Resources */,
 				275B170D27EB14AC0081FDEF /* KSChatListSearchView.xib in Resources */,
+				BC7CFFCA2817F2FF00CAEB21 /* CashRecordListCell.xib in Resources */,
 				27D83F5927F4225D00062476 /* LivePreviewBodyView.xib in Resources */,
 				BC41104A2806706800800BD9 /* HomeworkListCell.xib in Resources */,
 				2779362E27E33C360010E277 /* LoginBodyView.xib in Resources */,
 				BCB399BD27F9831D00AFF376 /* CourseForLiveCell.xib in Resources */,
 				2723B68927F1643B00E0B90B /* HomeBodyView.xib in Resources */,
+				BCFE541A2817BE0800AD6786 /* IncomeHeaderView.xib in Resources */,
 				BCE6A0A527F8517900C97704 /* MineVideoCell.xib in Resources */,
 				BCC9F40727F69BD200647449 /* SealClass.strings in Resources */,
 				BC5EB5AB2803D86500B4A3B0 /* AccompanyAlertView.xib in Resources */,
 				BCE6A08C27F823A300C97704 /* AccompanyCourseCell.xib in Resources */,
+				BC7CFFBA2817E9FC00CAEB21 /* echarts.min.js in Resources */,
 				BCE6A08727F81B4D00C97704 /* MinePageSubmitView.xib in Resources */,
 				BC73A1F42809693F00FA8F6F /* EvaluateSortView.xib in Resources */,
 				27A54CF927E9BD8B007309A3 /* FeedbackBodyView.xib in Resources */,
@@ -4617,24 +4875,29 @@
 				2755C07127EC7F21007D9070 /* ChatComplainBodyView.xib in Resources */,
 				BC1365C9280D476500EB03E2 /* NotiferMessageCell.xib in Resources */,
 				BC5EB5B7280402CB00B4A3B0 /* MyStyleInstrumentCell.xib in Resources */,
+				BCFE54152817918600AD6786 /* MyIncomeListCell.xib in Resources */,
 				BCA9CE1727FD339D00D558C6 /* AuthDisplayView.xib in Resources */,
 				BCF1BA5B27F5CF3C00FA36C4 /* LiveSeatApplyCell.xib in Resources */,
 				2780C92427E4903500A95A4F /* PasswordBodyView.xib in Resources */,
 				27F902FF27E864AE00C08A19 /* KSNetworkAlert.xib in Resources */,
+				BC7CFFAA2817E3BD00CAEB21 /* IncomeCountTopView.xib in Resources */,
 				BCA9CE3A27FD93EB00D558C6 /* AccompanyStudentEvaCell.xib in Resources */,
 				BCE6A09627F823DC00C97704 /* MinePageMusicCell.xib in Resources */,
 				277D431F27E999A000107DB7 /* ModifyBodyView.xib in Resources */,
+				BC7CFFBB2817E9FC00CAEB21 /* stacked_line_chart.html in Resources */,
 				27A54CFE27E9BDC5007309A3 /* AboutUsBodyView.xib in Resources */,
 				BCA724052806AFF100DA0D0D /* AccompanyCourseInfoCell.xib in Resources */,
 				2779329827E30FEB0010E277 /* mss_browseLoading@3x.png in Resources */,
 				27BC3B2627F2B76900D81E30 /* MusicMessageCell.xib in Resources */,
 				BC2858302809451B0024697C /* EvaluateCouseCell.xib in Resources */,
 				BCA724002806AEA000DA0D0D /* AccompanyHomeworkCell.xib in Resources */,
+				BC7CFFD22817FF6D00CAEB21 /* CardDisplayView.xib in Resources */,
 				27F9CB0127EC3D42003E0FE4 /* GroupListViewCell.xib in Resources */,
 				BC1191F8280EBC8600A716F7 /* AccompanyDetailBottomView.xib in Resources */,
 				BCA9CE3027FD8A9900D558C6 /* AccompanyNavView.xib in Resources */,
 				BCA9CE3527FD93C700D558C6 /* AccompanyEvaluateCell.xib in Resources */,
 				27D5D5D227EDBA9400B4720C /* NoticeEditBodyView.xib in Resources */,
+				BC7CFFD7281801B700CAEB21 /* CardBandBodyView.xib in Resources */,
 				275E3DE327F467410010EC30 /* BaseEmoji.plist in Resources */,
 				273C75A027E9681700F7C26F /* SettingBodyView.xib in Resources */,
 				2779329A27E30FEB0010E277 /* mss_browseLoading@2x.png in Resources */,
@@ -4760,6 +5023,7 @@
 				277932B627E30FFE0010E277 /* UIView+SDExtension.m in Sources */,
 				BCC9F42227F69BD200647449 /* ToolPanelView.m in Sources */,
 				2779335C27E317CD0010E277 /* KSBaseModel.m in Sources */,
+				BC7CFFB72817E90700CAEB21 /* KSSegView.m in Sources */,
 				277935F127E32AE20010E277 /* KSWebNavView.m in Sources */,
 				2779322227E30FC30010E277 /* KSImageButton.m in Sources */,
 				2723B68727F1642B00E0B90B /* HomeBodyView.m in Sources */,
@@ -4786,6 +5050,7 @@
 				BC76146A280D4F670080FD1F /* HomeworkDetailModel.m in Sources */,
 				BCC9F40A27F69BD200647449 /* InputView.m in Sources */,
 				BC5EB5B22804027500B4A3B0 /* MyStyleViewController.m in Sources */,
+				BCFE54182817BDFD00AD6786 /* IncomeHeaderView.m in Sources */,
 				277932F227E310070010E277 /* TZGifPhotoPreviewController.m in Sources */,
 				275B16FD27EB083C0081FDEF /* ChatAddressViewController.m in Sources */,
 				BC41104228066E5500800BD9 /* EvaluateCourseListViewController.m in Sources */,
@@ -4821,6 +5086,7 @@
 				277935EB27E32A930010E277 /* KSBaseWKWebViewController.m in Sources */,
 				275B172627EB1C6C0081FDEF /* KSBaseTableViewController.m in Sources */,
 				BCC9F43D27F69BD200647449 /* InviteUpgradeMessage.m in Sources */,
+				BC7CFFCD2817FE8C00CAEB21 /* BandCardViewController.m in Sources */,
 				2779322127E30FC30010E277 /* NSString+phone.m in Sources */,
 				BCC9F44027F69BD200647449 /* MemberChangeMessage.m in Sources */,
 				BCC9F41827F69BD200647449 /* ClassroomTitleView.m in Sources */,
@@ -4846,12 +5112,15 @@
 				BC5EB5A92803D85300B4A3B0 /* AccompanyAlertView.m in Sources */,
 				2708565227ED8B8C00EC8E72 /* GroupApplyChooseAllCell.m in Sources */,
 				277932BC27E30FFE0010E277 /* TAAbstractDotView.m in Sources */,
+				BCEA752328190D2900886A86 /* UnbindCardViewController.m in Sources */,
 				277931D927E30FC20010E277 /* NSObject+AutoProperty.m in Sources */,
+				BC7CFF9F2817CBD400CAEB21 /* WithdrawViewController.m in Sources */,
 				2779324127E30FC30010E277 /* VoNetWorking.m in Sources */,
 				275E3DF127F467D80010EC30 /* SeatContentView.m in Sources */,
 				BCE6A09F27F84E4500C97704 /* MineIntroduceCell.m in Sources */,
 				BCF1BA5A27F5CF3C00FA36C4 /* LiveSeatApplyCell.m in Sources */,
 				BCC9F43527F69BD200647449 /* DisplayCommandMessage.m in Sources */,
+				BC7CFFAF2817E6C900CAEB21 /* IncomeCountBottomView.m in Sources */,
 				BCC9F43F27F69BD200647449 /* DeviceMessage.m in Sources */,
 				275E3DD127F463140010EC30 /* KSLiveChatroomSeatApply.m in Sources */,
 				2779322427E30FC30010E277 /* ShopButton.m in Sources */,
@@ -4898,6 +5167,7 @@
 				2779320E27E30FC30010E277 /* UIColor+Hex.m in Sources */,
 				2779331727E310AA0010E277 /* UIView+Animation.m in Sources */,
 				2779361527E32C0A0010E277 /* ChatViewController.m in Sources */,
+				BC7CFFD5281801A800CAEB21 /* CardBandBodyView.m in Sources */,
 				BCC9F41F27F69BD200647449 /* PersonListView.m in Sources */,
 				277932B727E30FFE0010E277 /* SDQWMaskCustomModel.m in Sources */,
 				277931FD27E30FC30010E277 /* AnimationContoller.m in Sources */,
@@ -4942,6 +5212,8 @@
 				275FA1A927E7327500CFEA2E /* KSAQRecordManager.m in Sources */,
 				277931D227E30FC20010E277 /* UIButton+Property.m in Sources */,
 				2779309927E30F480010E277 /* BaseViewController.m in Sources */,
+				BC7CFFC92817F2FF00CAEB21 /* CashRecordListCell.m in Sources */,
+				BC7CFFBE2817F1D200CAEB21 /* MyBankCardViewController.m in Sources */,
 				BCA9CE1E27FD5F9D00D558C6 /* MyLiveCourseViewController.m in Sources */,
 				27D83F4227F3EAA700062476 /* MinePageVideoView.m in Sources */,
 				BCC9F44127F69BD200647449 /* ApplySpeechResultMessage.m in Sources */,
@@ -4960,6 +5232,7 @@
 				2779361827E32C200010E277 /* ShopMallViewController.m in Sources */,
 				BCB633FE27F6A18200ACFDCF /* ClassTitleView.m in Sources */,
 				2779326927E30FD80010E277 /* FSCalendarCollectionViewLayout.m in Sources */,
+				BCFE54142817918600AD6786 /* MyIncomeListCell.m in Sources */,
 				BCC9F42527F69BD200647449 /* EmptyView.m in Sources */,
 				277931F127E30FC20010E277 /* NSString+CZHSizeExtension.m in Sources */,
 				27BC3B2127F2B70300D81E30 /* MusicMessageModel.m in Sources */,
@@ -4976,6 +5249,7 @@
 				BCC9F42827F69BD200647449 /* WhiteUtils.m in Sources */,
 				BCB635BF27F7256B00ACFDCF /* KSDocument.m in Sources */,
 				2779322D27E30FC30010E277 /* ALCalendarDate.m in Sources */,
+				BCEA75262819103300886A86 /* UnbindBodyView.m in Sources */,
 				BCB633FD27F6A18200ACFDCF /* ClassroomMainContainer.m in Sources */,
 				2779321E27E30FC30010E277 /* LifeButton.m in Sources */,
 				277931E427E30FC20010E277 /* CALayer+Color.m in Sources */,
@@ -4995,14 +5269,17 @@
 				BCB6340927F6A35700ACFDCF /* LiveroomTimeManager.m in Sources */,
 				27F9030627E86CBD00C08A19 /* DeviceCheckView.m in Sources */,
 				275B16EF27EAF9B20081FDEF /* ChatNavView.m in Sources */,
+				BCEA752028190CEB00886A86 /* CardBandResultViewController.m in Sources */,
 				BCC9F43627F69BD200647449 /* SongDownloadMessage.m in Sources */,
 				275B170527EB13420081FDEF /* KSChatListViewController.m in Sources */,
 				277931C827E30FC20010E277 /* KSVideoEditor.m in Sources */,
 				2779326B27E30FD80010E277 /* FSCalendarSeparatorDecorationView.m in Sources */,
 				277932E427E310070010E277 /* TZVideoEditedPreviewController.m in Sources */,
 				277931D327E30FC20010E277 /* UIScrollView+KSTouch.m in Sources */,
+				BC7CFFB22817E6DB00CAEB21 /* KSMutilDatePicker.m in Sources */,
 				277931FE27E30FC30010E277 /* UIImage+Addtions.m in Sources */,
 				BCC9F41727F69BD200647449 /* ChatAreaView.m in Sources */,
+				BCEA752B2819133E00886A86 /* CardBindResultBodyView.m in Sources */,
 				2779322827E30FC30010E277 /* KeyChainTools.m in Sources */,
 				BCC9F41227F69BD200647449 /* MessageBaseCell.m in Sources */,
 				2779323827E30FC30010E277 /* LLPhoto.m in Sources */,
@@ -5051,7 +5328,9 @@
 				BCB633F827F6A18200ACFDCF /* KSTipsView.m in Sources */,
 				275E3DF627F467ED0010EC30 /* KSChatroomTextCell.m in Sources */,
 				2779323D27E30FC30010E277 /* VoDiskCache.m in Sources */,
+				BC7CFFC52817F29800CAEB21 /* CashRecordViewController.m in Sources */,
 				277931D727E30FC20010E277 /* UIImage+ResizeImage.m in Sources */,
+				BC7CFFA92817E3BD00CAEB21 /* IncomeCountTopView.m in Sources */,
 				2779329927E30FEB0010E277 /* MSSBrowseActionSheetCell.m in Sources */,
 				277931C727E30FC20010E277 /* NSMutableString+KSSafe.m in Sources */,
 				BCC9F44527F69BD200647449 /* Whiteboard.m in Sources */,
@@ -5103,6 +5382,7 @@
 				277931F927E30FC20010E277 /* NSObject+ReadDocument.m in Sources */,
 				275FA55827F30AE300EB6240 /* VideoCourseModel.m in Sources */,
 				275B172927EB26920081FDEF /* ChatAddressHeaderView.m in Sources */,
+				BC7CFFA22817D72200CAEB21 /* IncomeListModel.m in Sources */,
 				2755C06C27EC7F0E007D9070 /* KSChatComplainController.m in Sources */,
 				27F9CB1127EC60D0003E0FE4 /* GroupListModel.m in Sources */,
 				27FC2F5F27F1930400FCC239 /* KSStarView.m in Sources */,
@@ -5121,6 +5401,7 @@
 				2779321827E30FC30010E277 /* SkipTextField.m in Sources */,
 				BCC9F41C27F69BD200647449 /* RecentSharedView.m in Sources */,
 				27A2F63027E70E57009E2380 /* UserInfo.m in Sources */,
+				BCEA751A2818D59300886A86 /* BankNameModel.m in Sources */,
 				277932E827E310070010E277 /* NSBundle+TZImagePicker.m in Sources */,
 				2779330E27E3105F0010E277 /* DZNSegmentedControl.m in Sources */,
 				277931D027E30FC20010E277 /* UILabel+QWTopLeftLabel.m in Sources */,
@@ -5133,6 +5414,7 @@
 				BCC9F40B27F69BD200647449 /* CREmojiCollectionCell.m in Sources */,
 				2779320927E30FC30010E277 /* KSRecordPowerAnimationView.m in Sources */,
 				27BC3B3327F2FD2D00D81E30 /* VideoListBodyView.m in Sources */,
+				BCFE541028178FF600AD6786 /* MyIncomeViewController.m in Sources */,
 				2779322527E30FC30010E277 /* NSString+MD5.m in Sources */,
 				2779320327E30FC30010E277 /* KSChoosePicker.m in Sources */,
 				BC28582F2809451B0024697C /* EvaluateCouseCell.m in Sources */,
@@ -5145,6 +5427,7 @@
 				277931CF27E30FC20010E277 /* UIView+XIBView.m in Sources */,
 				27F9CB0427EC5446003E0FE4 /* GroupSettingViewController.m in Sources */,
 				2779320F27E30FC30010E277 /* shopview.m in Sources */,
+				BC7CFFD02817FF6700CAEB21 /* CardDisplayView.m in Sources */,
 				275E3DC527F460030010EC30 /* KSLiveChatroomClose.m in Sources */,
 				277932B527E30FFE0010E277 /* SDCycleScrollView.m in Sources */,
 				2779323627E30FC30010E277 /* LLImageCache.m in Sources */,
@@ -5174,6 +5457,7 @@
 				275E3DB327F45D380010EC30 /* KSLiveChatroomDownSeat.m in Sources */,
 				BCB399AC27F946A200AFF376 /* CourseNavView.m in Sources */,
 				BCC9F41E27F69BD200647449 /* UpgradeDidApplyView.m in Sources */,
+				BCE06F2B2818146700234817 /* KSConfirmAlertView.m in Sources */,
 				275B16FA27EB08230081FDEF /* CreateFansGroupViewController.m in Sources */,
 				BCC9F43927F69BD200647449 /* WhiteboardMessage.m in Sources */,
 				277931CA27E30FC20010E277 /* KSAudioSessionManager.m in Sources */,
@@ -5183,6 +5467,7 @@
 				2779326D27E30FD80010E277 /* FSCalendarConstants.m in Sources */,
 				275E3DD427F463580010EC30 /* KSLiveChatroomSeatResponse.m in Sources */,
 				BCC9F41927F69BD200647449 /* VideoListCell.m in Sources */,
+				BCEA751D2818F6C900886A86 /* MyCardModel.m in Sources */,
 				2779327027E30FD80010E277 /* FSCalendarTransitionCoordinator.m in Sources */,
 				BCC9F42C27F69BD200647449 /* InputTextField.m in Sources */,
 				2779320727E30FC30010E277 /* KSRecordStatusView.m in Sources */,
@@ -5194,6 +5479,7 @@
 				BC3DE082280D88670027DC0E /* EvaluateListModel.m in Sources */,
 				277931EC27E30FC20010E277 /* UIColor+Extend.m in Sources */,
 				277935E827E32A450010E277 /* KSBaseViewController.m in Sources */,
+				BC7CFFA52817E37300CAEB21 /* IncomeCountViewController.m in Sources */,
 				2755C08127ED54EF007D9070 /* GroupApplyViewController.m in Sources */,
 				BCC9F42A27F69BD200647449 /* LoginHelper.m in Sources */,
 				2779329327E30FEB0010E277 /* MSSBrowseNetworkViewController.m in Sources */,

BIN
KulexiuForTeacher/KulexiuForTeacher.xcworkspace/xcuserdata/wangzhi.xcuserdatad/UserInterfaceState.xcuserstate


+ 7 - 23
KulexiuForTeacher/KulexiuForTeacher.xcworkspace/xcuserdata/wangzhi.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist

@@ -37,22 +37,6 @@
          </BreakpointContent>
       </BreakpointProxy>
       <BreakpointProxy
-         BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint">
-         <BreakpointContent
-            uuid = "3E204CD5-A9F8-4AD9-9CE8-3E284B36A205"
-            shouldBeEnabled = "No"
-            ignoreCount = "0"
-            continueAfterRunningActions = "No"
-            filePath = "KulexiuForTeacher/Module/Mine/LiveCourse/View/MyLiveCourseBodyView.m"
-            startingColumnNumber = "9223372036854775807"
-            endingColumnNumber = "9223372036854775807"
-            startingLineNumber = "144"
-            endingLineNumber = "144"
-            landmarkName = "-requestData"
-            landmarkType = "7">
-         </BreakpointContent>
-      </BreakpointProxy>
-      <BreakpointProxy
          BreakpointExtensionID = "Xcode.Breakpoint.ExceptionBreakpoint">
          <BreakpointContent
             uuid = "412DE883-A827-4418-91BA-203294F9CA16"
@@ -148,7 +132,7 @@
          BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint">
          <BreakpointContent
             uuid = "BE815144-D68B-47B8-AA5D-BA2F41E7BB3D"
-            shouldBeEnabled = "Yes"
+            shouldBeEnabled = "No"
             ignoreCount = "0"
             continueAfterRunningActions = "No"
             filePath = "KulexiuForTeacher/Module/Home/MyCourse/View/MyVideoCourseBodyView.m"
@@ -163,16 +147,16 @@
       <BreakpointProxy
          BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint">
          <BreakpointContent
-            uuid = "B6CD09E0-AEAC-4D5F-90DF-628366658FCC"
-            shouldBeEnabled = "Yes"
+            uuid = "0AC7083A-0E97-40A5-821A-015E63A3C9F8"
+            shouldBeEnabled = "No"
             ignoreCount = "0"
             continueAfterRunningActions = "No"
-            filePath = "KulexiuForTeacher/Module/Home/MyCourse/Controller/MyCourseViewController.m"
+            filePath = "KulexiuForTeacher/Module/Mine/MinePage/View/MinePageCourseView.m"
             startingColumnNumber = "9223372036854775807"
             endingColumnNumber = "9223372036854775807"
-            startingLineNumber = "157"
-            endingLineNumber = "157"
-            landmarkName = "-pagerView:initListAtIndex:"
+            startingLineNumber = "145"
+            endingLineNumber = "145"
+            landmarkName = "-requestData"
             landmarkType = "7">
          </BreakpointContent>
       </BreakpointProxy>

+ 22 - 0
KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/EmptyStatus/empty_card.imageset/Contents.json

@@ -0,0 +1,22 @@
+{
+  "images" : [
+    {
+      "idiom" : "universal",
+      "scale" : "1x"
+    },
+    {
+      "filename" : "empty_card@2x.png",
+      "idiom" : "universal",
+      "scale" : "2x"
+    },
+    {
+      "filename" : "empty_card@3x.png",
+      "idiom" : "universal",
+      "scale" : "3x"
+    }
+  ],
+  "info" : {
+    "author" : "xcode",
+    "version" : 1
+  }
+}

BIN
KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/EmptyStatus/empty_card.imageset/empty_card@2x.png


BIN
KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/EmptyStatus/empty_card.imageset/empty_card@3x.png


+ 6 - 0
KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/Home/Income/Contents.json

@@ -0,0 +1,6 @@
+{
+  "info" : {
+    "author" : "xcode",
+    "version" : 1
+  }
+}

+ 22 - 0
KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/Home/Income/income_accompany.imageset/Contents.json

@@ -0,0 +1,22 @@
+{
+  "images" : [
+    {
+      "idiom" : "universal",
+      "scale" : "1x"
+    },
+    {
+      "filename" : "income_accompany@2x.png",
+      "idiom" : "universal",
+      "scale" : "2x"
+    },
+    {
+      "filename" : "income_accompany@3x.png",
+      "idiom" : "universal",
+      "scale" : "3x"
+    }
+  ],
+  "info" : {
+    "author" : "xcode",
+    "version" : 1
+  }
+}

BIN
KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/Home/Income/income_accompany.imageset/income_accompany@2x.png


BIN
KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/Home/Income/income_accompany.imageset/income_accompany@3x.png


+ 22 - 0
KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/Home/Income/income_headImage.imageset/Contents.json

@@ -0,0 +1,22 @@
+{
+  "images" : [
+    {
+      "idiom" : "universal",
+      "scale" : "1x"
+    },
+    {
+      "filename" : "income_headImage@2x.png",
+      "idiom" : "universal",
+      "scale" : "2x"
+    },
+    {
+      "filename" : "income_headImage@3x.png",
+      "idiom" : "universal",
+      "scale" : "3x"
+    }
+  ],
+  "info" : {
+    "author" : "xcode",
+    "version" : 1
+  }
+}

BIN
KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/Home/Income/income_headImage.imageset/income_headImage@2x.png


BIN
KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/Home/Income/income_headImage.imageset/income_headImage@3x.png


+ 22 - 0
KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/Home/Income/income_live.imageset/Contents.json

@@ -0,0 +1,22 @@
+{
+  "images" : [
+    {
+      "idiom" : "universal",
+      "scale" : "1x"
+    },
+    {
+      "filename" : "income_live@2x.png",
+      "idiom" : "universal",
+      "scale" : "2x"
+    },
+    {
+      "filename" : "income_live@3x.png",
+      "idiom" : "universal",
+      "scale" : "3x"
+    }
+  ],
+  "info" : {
+    "author" : "xcode",
+    "version" : 1
+  }
+}

BIN
KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/Home/Income/income_live.imageset/income_live@2x.png


BIN
KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/Home/Income/income_live.imageset/income_live@3x.png


+ 22 - 0
KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/Home/Income/income_music.imageset/Contents.json

@@ -0,0 +1,22 @@
+{
+  "images" : [
+    {
+      "idiom" : "universal",
+      "scale" : "1x"
+    },
+    {
+      "filename" : "income_music@2x.png",
+      "idiom" : "universal",
+      "scale" : "2x"
+    },
+    {
+      "filename" : "income_music@3x.png",
+      "idiom" : "universal",
+      "scale" : "3x"
+    }
+  ],
+  "info" : {
+    "author" : "xcode",
+    "version" : 1
+  }
+}

BIN
KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/Home/Income/income_music.imageset/income_music@2x.png


BIN
KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/Home/Income/income_music.imageset/income_music@3x.png


+ 6 - 0
KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/Mine/CardBind/Contents.json

@@ -0,0 +1,6 @@
+{
+  "info" : {
+    "author" : "xcode",
+    "version" : 1
+  }
+}

+ 22 - 0
KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/Mine/CardBind/card_failed.imageset/Contents.json

@@ -0,0 +1,22 @@
+{
+  "images" : [
+    {
+      "idiom" : "universal",
+      "scale" : "1x"
+    },
+    {
+      "filename" : "card_failed@2x.png",
+      "idiom" : "universal",
+      "scale" : "2x"
+    },
+    {
+      "filename" : "card_failed@3x.png",
+      "idiom" : "universal",
+      "scale" : "3x"
+    }
+  ],
+  "info" : {
+    "author" : "xcode",
+    "version" : 1
+  }
+}

BIN
KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/Mine/CardBind/card_failed.imageset/card_failed@2x.png


BIN
KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/Mine/CardBind/card_failed.imageset/card_failed@3x.png


+ 22 - 0
KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/Mine/CardBind/card_icon.imageset/Contents.json

@@ -0,0 +1,22 @@
+{
+  "images" : [
+    {
+      "idiom" : "universal",
+      "scale" : "1x"
+    },
+    {
+      "filename" : "card_icon@2x.png",
+      "idiom" : "universal",
+      "scale" : "2x"
+    },
+    {
+      "filename" : "card_icon@3x.png",
+      "idiom" : "universal",
+      "scale" : "3x"
+    }
+  ],
+  "info" : {
+    "author" : "xcode",
+    "version" : 1
+  }
+}

BIN
KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/Mine/CardBind/card_icon.imageset/card_icon@2x.png


BIN
KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/Mine/CardBind/card_icon.imageset/card_icon@3x.png


+ 22 - 0
KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/Mine/CardBind/card_success.imageset/Contents.json

@@ -0,0 +1,22 @@
+{
+  "images" : [
+    {
+      "idiom" : "universal",
+      "scale" : "1x"
+    },
+    {
+      "filename" : "card_success@2x.png",
+      "idiom" : "universal",
+      "scale" : "2x"
+    },
+    {
+      "filename" : "card_success@3x.png",
+      "idiom" : "universal",
+      "scale" : "3x"
+    }
+  ],
+  "info" : {
+    "author" : "xcode",
+    "version" : 1
+  }
+}

BIN
KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/Mine/CardBind/card_success.imageset/card_success@2x.png


BIN
KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/Mine/CardBind/card_success.imageset/card_success@3x.png


+ 22 - 0
KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/Mine/choose_arrow.imageset/Contents.json

@@ -0,0 +1,22 @@
+{
+  "images" : [
+    {
+      "idiom" : "universal",
+      "scale" : "1x"
+    },
+    {
+      "filename" : "choose_arrow@2x.png",
+      "idiom" : "universal",
+      "scale" : "2x"
+    },
+    {
+      "filename" : "choose_arrow@3x.png",
+      "idiom" : "universal",
+      "scale" : "3x"
+    }
+  ],
+  "info" : {
+    "author" : "xcode",
+    "version" : 1
+  }
+}

BIN
KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/Mine/choose_arrow.imageset/choose_arrow@2x.png


BIN
KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/Mine/choose_arrow.imageset/choose_arrow@3x.png


+ 22 - 0
KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/back_button_white.imageset/Contents.json

@@ -0,0 +1,22 @@
+{
+  "images" : [
+    {
+      "idiom" : "universal",
+      "scale" : "1x"
+    },
+    {
+      "filename" : "back_button_white@2x.png",
+      "idiom" : "universal",
+      "scale" : "2x"
+    },
+    {
+      "filename" : "back_button_white@3x.png",
+      "idiom" : "universal",
+      "scale" : "3x"
+    }
+  ],
+  "info" : {
+    "author" : "xcode",
+    "version" : 1
+  }
+}

BIN
KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/back_button_white.imageset/back_button_white@2x.png


BIN
KulexiuForTeacher/KulexiuForTeacher/Assets.xcassets/back_button_white.imageset/back_button_white@3x.png


+ 6 - 6
KulexiuForTeacher/KulexiuForTeacher/Common/Base/AuthDisplayView.xib

@@ -14,20 +14,20 @@
             <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
             <subviews>
                 <imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="authTeacher_accompany" translatesAutoresizingMaskIntoConstraints="NO" id="3R9-37-rfJ">
-                    <rect key="frame" x="141" y="30" width="260" height="230"/>
+                    <rect key="frame" x="141" y="0.0" width="260" height="230"/>
                     <constraints>
                         <constraint firstAttribute="height" constant="230" id="62x-qr-i50"/>
                         <constraint firstAttribute="width" constant="260" id="ody-S9-lK6"/>
                     </constraints>
                 </imageView>
                 <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="您还没有完成老师认证,认证后才可设置陪练课哦~" textAlignment="center" lineBreakMode="tailTruncation" numberOfLines="0" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="ya2-qu-eeU">
-                    <rect key="frame" x="141" y="270" width="260" height="36"/>
+                    <rect key="frame" x="141" y="230" width="260" height="36"/>
                     <fontDescription key="fontDescription" type="system" pointSize="15"/>
                     <color key="textColor" red="0.59999999999999998" green="0.59999999999999998" blue="0.59999999999999998" alpha="1" colorSpace="calibratedRGB"/>
                     <nil key="highlightedColor"/>
                 </label>
                 <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="xkE-FS-h0V">
-                    <rect key="frame" x="181" y="328" width="180" height="40"/>
+                    <rect key="frame" x="181" y="276" width="180" height="40"/>
                     <color key="backgroundColor" red="0.1764705882" green="0.78039215689999997" blue="0.66666666669999997" alpha="1" colorSpace="calibratedRGB"/>
                     <constraints>
                         <constraint firstAttribute="height" constant="40" id="vcC-gf-AjX"/>
@@ -48,10 +48,10 @@
             <color key="backgroundColor" red="0.96470588235294119" green="0.97254901960784312" blue="0.97647058823529409" alpha="1" colorSpace="calibratedRGB"/>
             <constraints>
                 <constraint firstItem="xkE-FS-h0V" firstAttribute="centerX" secondItem="iN0-l3-epB" secondAttribute="centerX" id="8Ec-Ck-gjz"/>
-                <constraint firstItem="ya2-qu-eeU" firstAttribute="top" secondItem="3R9-37-rfJ" secondAttribute="bottom" constant="10" id="Aw2-xL-c14"/>
-                <constraint firstItem="3R9-37-rfJ" firstAttribute="top" secondItem="iN0-l3-epB" secondAttribute="top" constant="30" id="ED5-Ur-ULb"/>
+                <constraint firstItem="ya2-qu-eeU" firstAttribute="top" secondItem="3R9-37-rfJ" secondAttribute="bottom" id="Aw2-xL-c14"/>
+                <constraint firstItem="3R9-37-rfJ" firstAttribute="top" secondItem="iN0-l3-epB" secondAttribute="top" id="ED5-Ur-ULb"/>
                 <constraint firstItem="3R9-37-rfJ" firstAttribute="centerX" secondItem="iN0-l3-epB" secondAttribute="centerX" id="Nr2-DO-sAE"/>
-                <constraint firstItem="xkE-FS-h0V" firstAttribute="top" secondItem="ya2-qu-eeU" secondAttribute="bottom" constant="22" id="TDs-N0-4c5"/>
+                <constraint firstItem="xkE-FS-h0V" firstAttribute="top" secondItem="ya2-qu-eeU" secondAttribute="bottom" constant="10" id="TDs-N0-4c5"/>
                 <constraint firstItem="ya2-qu-eeU" firstAttribute="leading" secondItem="3R9-37-rfJ" secondAttribute="leading" id="ggR-MX-LsB"/>
                 <constraint firstItem="ya2-qu-eeU" firstAttribute="trailing" secondItem="3R9-37-rfJ" secondAttribute="trailing" id="ltA-K4-jB1"/>
             </constraints>

+ 5 - 2
KulexiuForTeacher/KulexiuForTeacher/Common/Base/KSBaseViewController.m

@@ -467,15 +467,18 @@
     }
     else {
         self.promptView = [[StateView alloc]init];
-        self.promptView.frame = view.bounds;
     }
     _promptPlaceView = view;
     //当请求不到数据时 ,自定义提示view 将会出现;
     self.promptView.imageName = imgName;
     self.promptView.alpha = 0.0f;
     [self.promptView setText:promptString];
-
     [view addSubview:self.promptView];
+    [self.promptView mas_makeConstraints:^(MASConstraintMaker *make) {
+        make.edges.mas_equalTo(view);
+        make.width.mas_equalTo(view);
+        make.height.mas_equalTo(view);
+    }];
 }
 
 // 结束刷新后调用方法

+ 5 - 5
KulexiuForTeacher/KulexiuForTeacher/Common/Base/KSBaseWKWebViewController.m

@@ -155,7 +155,7 @@ typedef NS_ENUM(NSInteger, CHOOSETYPE) {
         WeakWebViewScriptMessageDelegate *weakScriptMessageDelegate = [[WeakWebViewScriptMessageDelegate alloc] initWithDelegate:self];
         //这个类主要用来做native与JavaScript的交互管理
         WKUserContentController * wkUController = [[WKUserContentController alloc] init];
-        [wkUController addScriptMessageHandler:weakScriptMessageDelegate name:@"DAYA"];
+        [wkUController addScriptMessageHandler:weakScriptMessageDelegate name:@"COLEXIU"];
         config.userContentController = wkUController;
         
         WKPreferences *preferences = [WKPreferences new];
@@ -198,7 +198,7 @@ typedef NS_ENUM(NSInteger, CHOOSETYPE) {
     MJWeakSelf;
     [self.myWebView evaluateJavaScript:@"navigator.userAgent" completionHandler:^(id result, NSError *error) {
         NSString *oldUserAgent = result;
-        NSString *newUserAgent = [NSString stringWithFormat:@"%@ %@",oldUserAgent,@"DAYAAPPI"];
+        NSString *newUserAgent = [NSString stringWithFormat:@"%@ %@",oldUserAgent,@"COLEXIUAPPI"];
         weakSelf.myWebView.customUserAgent = newUserAgent;
         [weakSelf loadRequest];;
     }];
@@ -255,7 +255,7 @@ typedef NS_ENUM(NSInteger, CHOOSETYPE) {
 - (void)userContentController:(WKUserContentController *)userContentController
       didReceiveScriptMessage:(WKScriptMessage *)message {
 
-    if ([message.name isEqualToString:@"DAYA"]) {
+    if ([message.name isEqualToString:@"COLEXIU"]) {
         NSDictionary *parm = [self convertJsonStringToNSDictionary:message.body];
         // 回到主线程
         dispatch_async(dispatch_get_main_queue(), ^{
@@ -619,7 +619,7 @@ typedef NS_ENUM(NSInteger, CHOOSETYPE) {
     NSString *scheme = [url scheme];
     UIApplication *app = [UIApplication sharedApplication];
     NSString *urlString = url.absoluteString;
-    if (![urlString containsString:@"dayaedu.com"] && ![urlString containsString:WEBHOST]) { // 外部链接
+    if (![urlString containsString:@"colexiu.com"] && ![urlString containsString:WEBHOST]) { // 外部链接
         self.isOutLink = YES;
     }
     else {
@@ -860,7 +860,7 @@ typedef NS_ENUM(NSInteger, CHOOSETYPE) {
 }
 
 - (void)dealloc {
-    [[_myWebView configuration].userContentController removeScriptMessageHandlerForName:@"DAYA"];
+    [[_myWebView configuration].userContentController removeScriptMessageHandlerForName:@"COLEXIU"];
     [_myWebView removeObserver:self forKeyPath:@"estimatedProgress"];
     [_myWebView removeObserver:self forKeyPath:@"title"];
     [_myWebView loadHTMLString:@"" baseURL:nil];

+ 75 - 0
KulexiuForTeacher/KulexiuForTeacher/Common/Base/KSNetworkingManager.h

@@ -616,5 +616,80 @@ NS_ASSUME_NONNULL_BEGIN
 /// @param success 成功
 /// @param faliure 失败
 + (void)courseAdjustRequst:(NSString *)post courseId:(NSString *)courseId classDate:(NSString *)classDate startTime:(NSString *)startTime endTime:(NSString *)endTime success:(void(^)(NSDictionary *dic))success faliure:(void(^)(NSError *error))faliure;
+
+//  /api-teacher/userBankCard/bankCard
+// 绑卡
+
+
+///  绑定银行卡
+/// @param post post
+/// @param name 姓名
+/// @param bankCard 银行卡
+/// @param bankName 开户行
+/// @param bankCode 开户行code
+/// @param idCardNo 卡号
+/// @param phone 预留手机号
+/// @param success 成功
+/// @param faliure 失败
++ (void)bankCardRequest:(NSString *)post name:(NSString *)name bankCard:(NSString *)bankCard bankName:(NSString *)bankName bankCode:(NSString *)bankCode idCardNo:(NSString *)idCardNo phone:(NSString *)phone success:(void(^)(NSDictionary *dic))success faliure:(void(^)(NSError *error))faliure;
+
+// 获取银行列表
+// /api-teacher/userBankCard/bankList
+
+/// 获取银行
+/// @param post post
+/// @param success 成功
+/// @param faliure 失败
++ (void)queryBankList:(NSString *)post success:(void(^)(NSDictionary *dic))success faliure:(void(^)(NSError *error))faliure;
+
+// /api-teacher/userBankCard/page
+/// 获取绑定银行卡
+/// @param post post
+/// @param success 成功
+/// @param faliure 失败
++ (void)queryBankCardMessage:(NSString *)post success:(void(^)(NSDictionary *dic))success faliure:(void(^)(NSError *error))faliure;
+
+// /api-teacher/userBankCard/unBind
+
+/// 解绑卡
+/// @param post post
+/// @param cardId 卡 id
+/// @param idCardNo 卡号
+/// @param name 姓名
+/// @param success 成功
+/// @param faliure 失败
++ (void)unBindCardRequest:(NSString *)post cardId:(NSString *)cardId idCardNo:(NSString *)idCardNo name:(NSString *)name success:(void(^)(NSDictionary *dic))success faliure:(void(^)(NSError *error))faliure;
+
+#pragma mark ---- 我的收入
+// /api-teacher/userAccount/page
+
+/// 我的收入
+/// @param post post
+/// @param searchDate 查询时间 yyyy-MM
+/// @param bizType PRACTICE LIVE MUSIC
+/// @param page 分页
+/// @param rows 条数
+/// @param success 成功
+/// @param faliure 失败
++ (void)userAccountPageRequest:(NSString *)post searchDate:(NSString *)searchDate bizType:(NSString *)bizType page:(NSInteger)page rows:(NSInteger)rows success:(void(^)(NSDictionary *dic))success faliure:(void(^)(NSError *error))faliure;
+
+// /api-teacher/userAccount/accountTotal
+
+/// 收入统计
+/// @param post post
+/// @param dateTime yyyy | yyyy-MM
+/// @param timeType MONTH YEAR
+/// @param success 成功
+/// @param faliure 失败
++ (void)accountTotalRequest:(NSString *)post dateTime:(NSString *)dateTime timeType:(NSString *)timeType success:(void(^)(NSDictionary *dic))success faliure:(void(^)(NSError *error))faliure;
+
+// /api-teacher/userAccount/detail
+
+/// 获取account
+/// @param get get
+/// @param success 成功
+/// @param faliure 失败
++ (void)teacherAccountDetail:(NSString *)get success:(void(^)(NSDictionary *dic))success faliure:(void(^)(NSError *error))faliure;
+
 @end
 NS_ASSUME_NONNULL_END

+ 123 - 0
KulexiuForTeacher/KulexiuForTeacher/Common/Base/KSNetworkingManager.m

@@ -69,6 +69,7 @@
  */
 + (void)request:(NSString *)post andWithUrl:(NSString *)myUrl and:(id)parm success:(void(^)(NSDictionary *dic))success faliure:(void(^)(NSError *error))faliure {
     __block NSDictionary *dic;
+    NSLog(@"url----%@",myUrl);
 #pragma mark  ----- 签名
 //    parm = [NSString signToMD5:parm];
     NSLog(@"%@",[parm mj_JSONString]);
@@ -1264,4 +1265,126 @@
     [parm setValue:endTime forKey:@"endTime"];
     [self request:post andWithUrl:url and:parm success:success faliure:faliure];
 }
+
+//  /api-teacher/userBankCard/bankCard
+// 绑卡
+
+
+///  绑定银行卡
+/// @param post post
+/// @param name 姓名
+/// @param bankCard 银行卡
+/// @param bankName 开户行
+/// @param bankCode 开户行code
+/// @param idCardNo 卡号
+/// @param phone 预留手机号
+/// @param success 成功
+/// @param faliure 失败
++ (void)bankCardRequest:(NSString *)post name:(NSString *)name bankCard:(NSString *)bankCard bankName:(NSString *)bankName bankCode:(NSString *)bankCode idCardNo:(NSString *)idCardNo phone:(NSString *)phone success:(void(^)(NSDictionary *dic))success faliure:(void(^)(NSError *error))faliure {
+    [self configRequestMethodJSON];
+    NSString *url = [NSString stringWithFormat:@"%@%@", hostURL, @"/api-teacher/userBankCard/bankCard"];
+    NSMutableDictionary *parm = [NSMutableDictionary dictionary];
+    [parm setValue:name forKey:@"name"];
+    [parm setValue:phone forKey:@"phone"];
+    [parm setValue:idCardNo forKey:@"idCardNo"];
+    [parm setValue:bankCard forKey:@"bankCard"];
+    [parm setValue:bankName forKey:@"bankName"];
+    [parm setValue:bankCode forKey:@"bankCode"];
+    [self request:post andWithUrl:url and:parm success:success faliure:faliure];
+}
+
+// 获取银行列表
+// /api-teacher/userBankCard/bankList
+
+/// 获取银行
+/// @param post post
+/// @param success 成功
+/// @param faliure 失败
++ (void)queryBankList:(NSString *)post success:(void(^)(NSDictionary *dic))success faliure:(void(^)(NSError *error))faliure {
+    [self configRequestMethodJSON];
+    NSString *url = [NSString stringWithFormat:@"%@%@", hostURL, @"/api-teacher/userBankCard/bankList"];
+    NSMutableDictionary *parm = [NSMutableDictionary dictionary];
+    [self request:post andWithUrl:url and:parm success:success faliure:faliure];
+}
+
+// /api-teacher/userBankCard/page
+/// 获取绑定银行卡
+/// @param post post
+/// @param success 成功
+/// @param faliure 失败
++ (void)queryBankCardMessage:(NSString *)post success:(void(^)(NSDictionary *dic))success faliure:(void(^)(NSError *error))faliure {
+    [self configRequestMethodJSON];
+    NSString *url = [NSString stringWithFormat:@"%@%@", hostURL, @"/api-teacher/userBankCard/page"];
+    NSMutableDictionary *parm = [NSMutableDictionary dictionary];
+    [self request:post andWithUrl:url and:parm success:success faliure:faliure];
+}
+
+// /api-teacher/userBankCard/unBind
+
+/// 解绑卡
+/// @param post post
+/// @param cardId 卡 id
+/// @param idCardNo 卡号
+/// @param name 姓名
+/// @param success 成功
+/// @param faliure 失败
++ (void)unBindCardRequest:(NSString *)post cardId:(NSString *)cardId idCardNo:(NSString *)idCardNo name:(NSString *)name success:(void(^)(NSDictionary *dic))success faliure:(void(^)(NSError *error))faliure {
+    [self configRequestMethodJSON];
+    NSString *url = [NSString stringWithFormat:@"%@%@", hostURL, @"/api-teacher/userBankCard/unBind"];
+    NSMutableDictionary *parm = [NSMutableDictionary dictionary];
+    [parm setValue:cardId forKey:@"id"];
+    [parm setValue:idCardNo forKey:@"idCardNo"];
+    [parm setValue:name forKey:@"name"];
+    [self request:post andWithUrl:url and:parm success:success faliure:faliure];
+}
+
+#pragma mark ---- 我的收入
+// /api-teacher/userAccount/page
+
+/// 我的收入
+/// @param post post
+/// @param searchDate 查询时间 yyyy-MM
+/// @param bizType PRACTICE LIVE MUSIC
+/// @param page 分页
+/// @param rows 条数
+/// @param success 成功
+/// @param faliure 失败
++ (void)userAccountPageRequest:(NSString *)post searchDate:(NSString *)searchDate bizType:(NSString *)bizType page:(NSInteger)page rows:(NSInteger)rows success:(void(^)(NSDictionary *dic))success faliure:(void(^)(NSError *error))faliure {
+    [self configRequestMethodJSON];
+    NSString *url = [NSString stringWithFormat:@"%@%@", hostURL, @"/api-teacher/userAccount/page"];
+    NSMutableDictionary *parm = [NSMutableDictionary dictionary];
+    [parm setValue:bizType forKey:@"bizType"];
+    [parm setValue:searchDate forKey:@"searchDate"];
+    [parm setValue:@(page) forKey:@"page"];
+    [parm setValue:@(rows) forKey:@"rows"];
+    [self request:post andWithUrl:url and:parm success:success faliure:faliure];
+}
+
+// /api-teacher/userAccount/accountTotal
+
+/// 收入统计
+/// @param post post
+/// @param dateTime yyyy | yyyy-MM
+/// @param timeType MONTH YEAR
+/// @param success 成功
+/// @param faliure 失败
++ (void)accountTotalRequest:(NSString *)post dateTime:(NSString *)dateTime timeType:(NSString *)timeType success:(void(^)(NSDictionary *dic))success faliure:(void(^)(NSError *error))faliure {
+    [self configRequestMethodJSON];
+    NSString *url = [NSString stringWithFormat:@"%@%@", hostURL, @"/api-teacher/userAccount/accountTotal"];
+    NSMutableDictionary *parm = [NSMutableDictionary dictionary];
+    [parm setValue:dateTime forKey:@"dateTime"];
+    [parm setValue:timeType forKey:@"timeType"];
+    [self request:post andWithUrl:url and:parm success:success faliure:faliure];
+}
+
+// /api-teacher/userAccount/detail
+
+/// 获取account
+/// @param get get
+/// @param success 成功
+/// @param faliure 失败
++ (void)teacherAccountDetail:(NSString *)get success:(void(^)(NSDictionary *dic))success faliure:(void(^)(NSError *error))faliure {
+    NSString *url = [NSString stringWithFormat:@"%@%@", hostURL, @"/api-teacher/userAccount/detail"];
+    [self request:get andWithUrl:url and:nil success:success faliure:faliure];
+}
 @end

+ 2 - 2
KulexiuForTeacher/KulexiuForTeacher/Common/Tools/Custom/KSButtonStatusView.m

@@ -40,7 +40,7 @@
         [self addSubview:_desLabel];
         [_desLabel mas_makeConstraints:^(MASConstraintMaker *make) {
             make.centerX.mas_equalTo(self.mas_centerX);
-            make.top.mas_equalTo(_imgView.mas_bottom).offset(21);
+            make.top.mas_equalTo(_imgView.mas_bottom).offset(0);
             make.width.mas_equalTo(280);
             make.height.mas_equalTo(27);
         }];
@@ -55,7 +55,7 @@
         [self addSubview:_sureButton];
         [_sureButton mas_makeConstraints:^(MASConstraintMaker *make) {
             make.centerX.mas_equalTo(self.mas_centerX);
-            make.top.mas_equalTo(_desLabel.mas_bottom).offset(25);
+            make.top.mas_equalTo(_desLabel.mas_bottom).offset(10);
             make.width.mas_equalTo(200);
             make.height.mas_equalTo(44);
         }];

+ 2 - 2
KulexiuForTeacher/KulexiuForTeacher/Module/Chat/Controller/KSChatListViewController.m

@@ -184,12 +184,12 @@
 - (UIView *)stateView {
     if (!_stateView) {
         _stateView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 280, 240)];
-        UIImageView *imgView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 280, 176)];
+        UIImageView *imgView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 260, 230)];
         [imgView setImage:[UIImage imageNamed:@"wd_img_zwsj"]];
         
         UILabel *descLabel = [[UILabel alloc] initWithFrame:CGRectMake(0, 180, 280, 20)];
         descLabel.text = @"暂无消息";
-        descLabel.textColor = HexRGB(0xb7b7b7);
+        descLabel.textColor = HexRGB(0x999999);
         descLabel.font = [UIFont systemFontOfSize:16];
         descLabel.textAlignment = NSTextAlignmentCenter;
         [_stateView addSubview:descLabel];

+ 6 - 6
KulexiuForTeacher/KulexiuForTeacher/Module/Course/View/CourseNavView.xib

@@ -21,7 +21,7 @@
                     </constraints>
                 </view>
                 <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="2022年9月" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="GTO-1Q-b8D">
-                    <rect key="frame" x="161" y="50" width="92" height="25"/>
+                    <rect key="frame" x="161" y="60" width="92" height="25"/>
                     <constraints>
                         <constraint firstAttribute="height" constant="25" id="TrO-ED-Ma7"/>
                     </constraints>
@@ -29,15 +29,15 @@
                     <color key="textColor" red="0.20000000000000001" green="0.20000000000000001" blue="0.20000000000000001" alpha="1" colorSpace="calibratedRGB"/>
                     <nil key="highlightedColor"/>
                 </label>
-                <imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="down_arrow" translatesAutoresizingMaskIntoConstraints="NO" id="Aty-TD-8f6">
-                    <rect key="frame" x="258" y="59.5" width="8" height="6"/>
+                <imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="sort_down" translatesAutoresizingMaskIntoConstraints="NO" id="Aty-TD-8f6">
+                    <rect key="frame" x="258" y="69.5" width="8" height="6"/>
                     <constraints>
                         <constraint firstAttribute="height" constant="6" id="FGW-RQ-sze"/>
                         <constraint firstAttribute="width" constant="8" id="FOk-8J-bnb"/>
                     </constraints>
                 </imageView>
                 <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="cUO-Eu-mKa">
-                    <rect key="frame" x="161" y="42.5" width="105" height="40"/>
+                    <rect key="frame" x="161" y="52.5" width="105" height="40"/>
                     <constraints>
                         <constraint firstAttribute="height" constant="40" id="rgA-0Q-cHA"/>
                     </constraints>
@@ -52,7 +52,7 @@
                 <constraint firstAttribute="trailing" secondItem="39y-6W-6HN" secondAttribute="trailing" id="0Sc-7V-pPL"/>
                 <constraint firstItem="Aty-TD-8f6" firstAttribute="leading" secondItem="GTO-1Q-b8D" secondAttribute="trailing" constant="5" id="5aF-jm-Cpl"/>
                 <constraint firstItem="Aty-TD-8f6" firstAttribute="centerY" secondItem="GTO-1Q-b8D" secondAttribute="centerY" id="KGA-yE-Id2"/>
-                <constraint firstItem="39y-6W-6HN" firstAttribute="top" secondItem="GTO-1Q-b8D" secondAttribute="bottom" constant="20" id="Um0-5Z-VgP"/>
+                <constraint firstItem="39y-6W-6HN" firstAttribute="top" secondItem="GTO-1Q-b8D" secondAttribute="bottom" constant="10" id="Um0-5Z-VgP"/>
                 <constraint firstAttribute="bottom" secondItem="39y-6W-6HN" secondAttribute="bottom" id="Wn3-ho-ctn"/>
                 <constraint firstItem="39y-6W-6HN" firstAttribute="leading" secondItem="iN0-l3-epB" secondAttribute="leading" id="ad9-yT-IV2"/>
                 <constraint firstItem="Aty-TD-8f6" firstAttribute="trailing" secondItem="cUO-Eu-mKa" secondAttribute="trailing" id="deD-vu-Bdf"/>
@@ -71,6 +71,6 @@
         </view>
     </objects>
     <resources>
-        <image name="down_arrow" width="8" height="6"/>
+        <image name="sort_down" width="8" height="6"/>
     </resources>
 </document>

+ 3 - 5
KulexiuForTeacher/KulexiuForTeacher/Module/Home/Controller/HomeViewController.m

@@ -17,6 +17,7 @@
 #import "NotiferMessageViewController.h"
 #import "UserInfoManager.h"
 #import "TeacherInfo.h"
+#import "MyIncomeViewController.h"
 
 @interface HomeViewController ()
 
@@ -121,10 +122,6 @@
 - (void)toMessageCenter {
     NotiferMessageViewController *messageCenter = [[NotiferMessageViewController alloc] init];
     [self.navigationController pushViewController:messageCenter animated:YES];
-    
-//    NSString *url = @"alipays://platformapi/startapp?saId=10000007&qrcode=https://qr.alipay.com/bax08845x232iacmrtdc251b";
-//    NSString *url = @"alipays://platformapi/startapp?saId=10000007&qrcode=https://qr.alipay.com/bax03961j5dgt0vyjycb0014";
-//    [[UIApplication sharedApplication] openURL:[NSURL URLWithString: url]];
 }
 
 - (HomeHeadView *)headView {
@@ -188,7 +185,8 @@
             break;
         case HOMEBODYACTION_INCOME: // 我的收入
         {
-            
+            MyIncomeViewController *incomeCtrl = [[MyIncomeViewController alloc] init];
+            [self.navigationController pushViewController:incomeCtrl animated:YES];
         }
             break;
         default:

+ 16 - 0
KulexiuForTeacher/KulexiuForTeacher/Module/Home/Income/Controller/IncomeCountViewController.h

@@ -0,0 +1,16 @@
+//
+//  IncomeCountViewController.h
+//  KulexiuForTeacher
+//
+//  Created by 王智 on 2022/4/26.
+//
+
+#import "KSBaseViewController.h"
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface IncomeCountViewController : KSBaseViewController
+
+@end
+
+NS_ASSUME_NONNULL_END

+ 508 - 0
KulexiuForTeacher/KulexiuForTeacher/Module/Home/Income/Controller/IncomeCountViewController.m

@@ -0,0 +1,508 @@
+//
+//  IncomeCountViewController.m
+//  KulexiuForTeacher
+//
+//  Created by 王智 on 2022/4/26.
+//
+
+#import "IncomeCountViewController.h"
+#import "IncomeCountTopView.h"
+#import <WebKit/WebKit.h>
+#import "KSMutilDatePicker.h"
+#import "IncomeCountBottomView.h"
+
+// WKWebView 内存不释放的问题解决
+@interface KSWeakWebViewScriptMessageDelegate : NSObject<WKScriptMessageHandler>
+
+//WKScriptMessageHandler 这个协议类专门用来处理JavaScript调用原生OC的方法
+@property (nonatomic, weak) id<WKScriptMessageHandler> scriptDelegate;
+
+- (instancetype)initWithDelegate:(id<WKScriptMessageHandler>)scriptDelegate;
+
+@end
+
+@implementation KSWeakWebViewScriptMessageDelegate
+
+- (instancetype)initWithDelegate:(id<WKScriptMessageHandler>)scriptDelegate {
+    self = [super init];
+    if (self) {
+        _scriptDelegate = scriptDelegate;
+    }
+    return self;
+}
+
+#pragma mark - WKScriptMessageHandler
+//遵循WKScriptMessageHandler协议,必须实现如下方法,然后把方法向外传递
+//通过接收JS传出消息的name进行捕捉的回调方法
+- (void)userContentController:(WKUserContentController *)userContentController didReceiveScriptMessage:(WKScriptMessage *)message {
+    
+    if ([self.scriptDelegate respondsToSelector:@selector(userContentController:didReceiveScriptMessage:)]) {
+        [self.scriptDelegate userContentController:userContentController didReceiveScriptMessage:message];
+    }
+}
+
+@end
+
+@interface IncomeCountViewController ()<WKUIDelegate,WKNavigationDelegate,WKScriptMessageHandler>
+
+@property (nonatomic, strong) IncomeCountTopView *topView;
+
+@property (nonatomic, strong) UIView *bottomView;
+
+@property (nonatomic, strong) WKWebView *myWebView;
+
+@property (nonatomic, strong) IncomeCountBottomView *roundView;
+
+@property (nonatomic, strong) WKWebView *bottomWebView;;
+
+
+@property (nonatomic, strong) NSURL *fileUrl;
+
+@property (nonatomic, strong) KSMutilDatePicker *datePicker;
+
+
+@property (nonatomic, strong) NSString *chooseDate;
+
+@property (nonatomic, strong) NSString *salary;
+
+@property (nonatomic, strong) NSString *total;
+
+@property (nonatomic, assign) BOOL isYear;
+ 
+@property (nonatomic, strong) NSArray *sourceArray;
+
+@property (nonatomic, assign) BOOL hasLoad;
+
+@property (nonatomic, strong) UIView *emptyView;
+
+@property (nonatomic, assign) CGFloat totalAmount;
+
+@end
+
+@implementation IncomeCountViewController
+
+- (void)viewDidLoad {
+    [super viewDidLoad];
+    // Do any additional setup after loading the view.
+    [self allocTitle:@"收入统计"];
+    [self configUI];
+    [self requestData];
+}
+
+- (void)configUI {
+    self.scrollView.backgroundColor = [UIColor clearColor];
+    self.scrollView.frame = CGRectMake(0, 0, kScreenWidth, kScreenHeight - kNaviBarHeight- iPhoneXSafeBottomMargin);
+    [self.scrollView addSubview:self.topView];
+    [self.scrollView addSubview:self.myWebView];
+    
+    [self.scrollView addSubview:self.roundView];
+    [self.roundView.bgView addSubview:self.bottomWebView];
+    [self.bottomWebView mas_makeConstraints:^(MASConstraintMaker *make) {
+        make.right.top.bottom.left.mas_equalTo(self.roundView.bgView);
+    }];
+    [self.scrollView addSubview:self.bottomView];
+    NSDate *currentDate = [NSDate date];
+    NSDateFormatter *dateFormatter = [NSObject getDateformatter];
+    [dateFormatter setDateFormat:@"yyyy"];
+    NSString *dateStr = [dateFormatter stringFromDate:currentDate];
+    self.chooseDate = dateStr;
+    self.topView.dateLabel.text = [NSString stringWithFormat:@"%@年", dateStr];
+    self.isYear = YES;
+    
+    CGFloat height = CGRectGetMaxY(self.bottomView.frame) + 20;
+    self.scrollView.contentSize = CGSizeMake(kScreenWidth, height);
+}
+
+- (void)showEmptyView:(BOOL)isShow {
+    if (isShow) {
+        if (![self.view.subviews containsObject:self.emptyView]) {
+            [self.view addSubview:self.emptyView];
+        }
+        self.roundView.hidden = YES;
+    }
+    else {
+        if ([self.view.subviews containsObject:self.emptyView]) {
+            [self.emptyView removeFromSuperview];
+        }
+        self.roundView.hidden = NO;
+    }
+}
+
+- (void)requestData {
+    NSString *timeType = self.isYear ? @"YEAR" : @"MONTH";
+    [self showhud];
+    [KSNetworkingManager accountTotalRequest:KS_POST dateTime:self.chooseDate timeType:timeType success:^(NSDictionary * _Nonnull dic) {
+        [self removehub];
+        if ([dic integerValueForKey:@"code"] == 200 && [dic boolValueForKey:@"status"]) {
+            
+        }
+        else {
+            [self MBPShow:MESSAGEKEY];
+        }
+    } faliure:^(NSError * _Nonnull error) {
+        [self removehub];
+    }];
+}
+
+//- (void)configMessage:(NSArray *)topAmount 
+
+- (void)configMessage:(NSArray *)source {
+    NSArray *colorArray = @[@"#01C1B5",
+                            @"#5B8FF9",
+                            @"#FFD02C",];
+    // configSource:
+    NSMutableArray *keyArray = [NSMutableArray array];
+    NSMutableArray *valueArray = [NSMutableArray array];
+    NSMutableArray *descArray = [NSMutableArray array];
+    NSMutableArray *amountArray = [NSMutableArray array];
+    
+    for (NSDictionary *dic in source) {
+        float amount = [dic floatValueForKey:@"amount"];
+        [amountArray addObject:@(amount)];
+        
+        NSString *descString = [dic stringValueForKey:@"desc"];
+        [descArray addObject:descString];
+        NSArray *sourceArray = [dic arrayValueForKey:@"data"];
+        NSMutableArray *subValueArray = [NSMutableArray array];
+        for (NSDictionary *subDic in sourceArray) {
+            float amount = [subDic floatValueForKey:@"amount"];
+            [subValueArray addObject:@(amount)];
+        }
+        [valueArray addObject:subValueArray];
+    }
+    
+    NSDictionary *dataParm = source[0];
+    NSArray *sourceValue = [dataParm arrayValueForKey:@"data"];
+    for (NSDictionary *dic in sourceValue) {
+        NSString *bottomValue = @"";
+        if (_isYear) {
+            bottomValue = [NSString stringWithFormat:@"%@月",[[[dic stringValueForKey:@"dateStr"] componentsSeparatedByString:@"-"] lastObject]];
+        }
+        else {
+            bottomValue = [NSString stringWithFormat:@"%@日",[[[dic stringValueForKey:@"dateStr"] componentsSeparatedByString:@"-"] lastObject]];
+        }
+        [keyArray addObject:bottomValue];
+    }
+    
+    [self.topView configSource:descArray amountArray:amountArray];
+    
+    NSMutableDictionary *parm = [NSMutableDictionary dictionary];
+    [parm setValue:@{@"show":@(NO)} forKey:@"title"];
+    [parm setValue:@{@"trigger": @"axis"} forKey:@"tooltip"];
+    [parm setValue:@{@"show": @(NO)} forKey:@"legend"];
+    [parm setValue:@{
+        @"left": @"3%",
+        @"right": @"5%",
+        @"bottom": @"3%",
+        @"containLabel": @(YES)
+    } forKey:@"grid"];
+    [parm setValue:@{
+        @"type": @"category",
+        @"boundaryGap": @(NO),
+        @"data":keyArray,
+        @"axisLine" : @{@"lineStyle":@{@"color": @"#8C8C8C",}},
+    } forKey:@"xAxis"];
+    [parm setValue:@{@"feature": @{@"saveAsImage": @{@"show":@(NO)}}} forKey:@"toolbox"];
+    [parm setValue:@{@"type": @"value",
+                     @"splitLine":@{
+                             @"lineStyle":@{@"color": @[@"#E2E2E2"]},
+                             @"axisLine":@{@"lineStyle":@{@"color": @"#8C8C8C"}}
+                     },
+    } forKey:@"yAxis"];
+    
+    [parm setValue:@{@"lineStyle":@{ @"width": @2}} forKey:@"emphasis"];
+    [parm setValue:@[@{@"type" : @"inside",
+                       @"throttle" : keyArray.count > 15 ? @(50) : @(100),
+    }] forKey:@"dataZoom"];
+    
+    NSMutableArray *fillColorArray = [NSMutableArray array];
+    NSMutableArray *seriesArray = [NSMutableArray array];
+    for (int i = 0; i < descArray.count && i < colorArray.count; i++) {
+        NSString *fillColor = colorArray[i];
+        [fillColorArray addObject:fillColor];
+        NSArray *amountDetailArray = valueArray[i];
+        NSString *desc = descArray[i];
+        NSDictionary *serier = @{@"symbol":@"circle",
+                                 @"name": desc,
+                                 @"type": @"line",
+                                 @"data": amountDetailArray,
+                                 @"emphasis":@{@"lineStyle" : @{@"width": @1}},
+                                 @"lineStyle":@{ @"width": @1},
+        };
+        [seriesArray addObject:serier];
+    }
+    // 根据返回数据生成颜色和显示数据
+    [parm setValue:fillColorArray forKey:@"color"];
+    [parm setValue:seriesArray forKey:@"series"];
+    
+    [self postMessage:parm inWebView:self.myWebView];
+    
+    
+    NSMutableDictionary *secondParm = [NSMutableDictionary dictionary];
+    [secondParm setValue:@{@"feature":@{@"saveAsImage":@{@"show":@(NO)}}}
+                  forKey:@"toolbox"];
+    [secondParm setValue:@{@"borderWidth" : @0,
+                           @"formatter":@"{b} : {c} ({d}%)",
+                           @"padding":@3,
+                           @"position":@[@"30%",@"30%"],
+                           @"textStyle": @{@"fontSize": @12},
+                           @"trigger":@"item",
+                           }
+                  forKey:@"tooltip"];
+    NSMutableArray *bottomFillColorArray = [NSMutableArray array];
+    NSMutableArray *dataArray = [NSMutableArray array];
+    for (int i = 0; i < descArray.count && i < colorArray.count; i++) {
+        
+        NSString *fillColor = colorArray[i];
+        [bottomFillColorArray addObject:fillColor];
+        NSString *desc = descArray[i];
+        NSNumber *amount = amountArray[i];
+        NSDictionary *data = @{@"name":desc,
+                               @"value":amount,
+        };
+        [dataArray addObject:data];
+    }
+    
+    [secondParm setValue:fillColorArray forKey:@"color"];
+    [secondParm setValue:@[@{@"type":@"pie",
+                             @"radius":@[@"50%",@"80%"],
+                             @"avoidLabelOverlap" : @(NO),
+                             @"label" : @{@"show": @(NO)},
+                             @"data" :dataArray}]
+                  forKey:@"series"];
+    [self postMessage:secondParm inWebView:self.bottomWebView];
+    [self.roundView configSource:descArray amountArray:amountArray totalAmount:self.totalAmount];
+}
+
+- (void)postMessage:(NSDictionary *)parm inWebView:(WKWebView *)webView {
+    NSString *jsString = [parm mj_JSONString];
+    [webView evaluateJavaScript:[NSString stringWithFormat:@"loadEcharts('%@')", jsString] completionHandler:nil];
+ 
+}
+
+// 5 页面加载完成之后调用
+- (void)webView:(WKWebView *)webView didFinishNavigation:(WKNavigation *)navigation {
+    NSLog(@"5-------页面加载完成之后调用");
+    
+    if (_hasLoad == NO) {
+        _hasLoad = YES;
+        if (self.sourceArray != nil) {
+            [self configMessage:self.sourceArray];
+        }
+    }
+}
+
+#pragma mark - WKScriptMessageHandler
+- (void)userContentController:(WKUserContentController *)userContentController
+      didReceiveScriptMessage:(WKScriptMessage *)message {
+    
+}
+
+#pragma mark ---- lazying
+- (WKWebView *)myWebView {
+    if (!_myWebView) {
+        WKWebViewConfiguration *config = [[WKWebViewConfiguration alloc] init];
+        config.selectionGranularity = WKSelectionGranularityDynamic;
+        config.processPool = [IncomeCountViewController singleWkProcessPool];
+        config.websiteDataStore = [WKWebsiteDataStore defaultDataStore];
+        //自定义的WKScriptMessageHandler 是为了解决内存不释放的问题
+        KSWeakWebViewScriptMessageDelegate *weakScriptMessageDelegate = [[KSWeakWebViewScriptMessageDelegate alloc] initWithDelegate:self];
+        //这个类主要用来做native与JavaScript的交互管理
+        WKUserContentController * wkUController = [[WKUserContentController alloc] init];
+        [wkUController addScriptMessageHandler:weakScriptMessageDelegate name:@"DAYA"];
+        config.userContentController = wkUController;
+        
+        WKPreferences *preferences = [WKPreferences new];
+        // 是否支出javaScript
+        preferences.javaScriptEnabled = YES;
+        //不通过用户交互,是否可以打开窗口
+        preferences.javaScriptCanOpenWindowsAutomatically = YES;
+        config.preferences = preferences;
+        _myWebView = [[WKWebView alloc] initWithFrame:CGRectMake(12, 190, kScreenWidth - 24, 240) configuration:config];
+        _myWebView.UIDelegate = self;
+        _myWebView.navigationDelegate = self;
+        _myWebView.scrollView.bounces = NO;
+        [self loadSource];
+        
+    }
+    return _myWebView;
+}
+
+- (WKWebView *)bottomWebView {
+    if (!_bottomWebView) {
+        WKWebViewConfiguration *config = [[WKWebViewConfiguration alloc] init];
+        config.selectionGranularity = WKSelectionGranularityDynamic;
+        config.processPool = [IncomeCountViewController singleWkProcessPool];
+        config.websiteDataStore = [WKWebsiteDataStore defaultDataStore];
+        //自定义的WKScriptMessageHandler 是为了解决内存不释放的问题
+        KSWeakWebViewScriptMessageDelegate *weakScriptMessageDelegate = [[KSWeakWebViewScriptMessageDelegate alloc] initWithDelegate:self];
+        //这个类主要用来做native与JavaScript的交互管理
+        WKUserContentController * wkUController = [[WKUserContentController alloc] init];
+        [wkUController addScriptMessageHandler:weakScriptMessageDelegate name:@"DAYA"];
+        config.userContentController = wkUController;
+        
+        WKPreferences *preferences = [WKPreferences new];
+        // 是否支出javaScript
+        preferences.javaScriptEnabled = YES;
+        //不通过用户交互,是否可以打开窗口
+        preferences.javaScriptCanOpenWindowsAutomatically = YES;
+        config.preferences = preferences;
+        _bottomWebView = [[WKWebView alloc] initWithFrame:CGRectZero configuration:config];
+        _bottomWebView.UIDelegate = self;
+        _bottomWebView.navigationDelegate = self;
+        _bottomWebView.scrollView.bounces = NO;
+        [self loadBottomWebSource];
+        
+    }
+    return _bottomWebView;
+}
+
+
+- (UIView *)emptyView {
+    if (!_emptyView) {
+        CGFloat width = kScreenWidth - 24;
+        _emptyView = [[UIView alloc] initWithFrame:CGRectMake(12, 190, width, 240)];
+        _emptyView.backgroundColor = [UIColor whiteColor];
+        UIImageView  *emptyImage = [[UIImageView alloc] initWithFrame:CGRectMake((width - 140) / 2.0f, 30, 140, 140)];
+        [emptyImage setImage:[UIImage imageNamed:@"wd_img_zwsj"]];
+        [_emptyView addSubview:emptyImage];
+        
+        UILabel *label = [[UILabel alloc] init];
+        label.frame = CGRectMake(0, CGRectGetMaxY(emptyImage.frame)+10, width, 20);
+        label.font = [UIFont systemFontOfSize:14.0f];
+        label.textColor = HexRGB(0x999999);
+        label.textAlignment = NSTextAlignmentCenter;
+        label.numberOfLines = 1;
+        label.text = @"暂无数据";
+        [_emptyView addSubview:label];
+    }
+    return _emptyView;
+}
+
+- (void)loadSource {
+    NSString *filePath = [[NSBundle mainBundle] pathForResource:@"stacked_line_chart" ofType:@"html"];
+    [_myWebView loadFileURL:[NSURL fileURLWithPath:filePath] allowingReadAccessToURL:[NSURL fileURLWithPath:[NSBundle mainBundle].bundlePath]];
+}
+
+- (void)loadBottomWebSource {
+    NSString *filePath = [[NSBundle mainBundle] pathForResource:@"stacked_line_chart" ofType:@"html"];
+    [_bottomWebView loadFileURL:[NSURL fileURLWithPath:filePath] allowingReadAccessToURL:[NSURL fileURLWithPath:[NSBundle mainBundle].bundlePath]];
+}
+
+- (IncomeCountTopView *)topView {
+    if (!_topView) {
+        _topView = [IncomeCountTopView shareInstance];
+        _topView.frame = CGRectMake(0, 0, kScreenWidth, 220);
+        MJWeakSelf;
+        [_topView chooseDateCallback:^{
+            [weakSelf showPickerView];
+        }];
+    }
+    return _topView;
+}
+
+- (IncomeCountBottomView *)roundView {
+    if (!_roundView) {
+        _roundView = [IncomeCountBottomView shareInstance];
+        _roundView.frame = CGRectMake(12, CGRectGetMaxY(self.myWebView.frame), kScreenWidth - 24, 250);
+    }
+    return _roundView;
+}
+
+- (UIView *)bottomView {
+    if (!_bottomView) {
+        CGFloat width = kScreenWidth - 24;
+        _bottomView = [[UIView alloc] init];
+        _bottomView.frame = CGRectMake(12, CGRectGetMaxY(self.roundView.frame), width, 20);
+        _bottomView.backgroundColor = [UIColor whiteColor];
+        UIBezierPath * path = [UIBezierPath bezierPathWithRoundedRect:CGRectMake(0, 0, width, 20) byRoundingCorners:UIRectCornerBottomLeft | UIRectCornerBottomRight cornerRadii:CGSizeMake(10, 10)];
+        CAShapeLayer *maskLayer = [[CAShapeLayer alloc] init];
+        maskLayer.frame = CGRectMake(0, 0, width, 20);
+        maskLayer.path = path.CGPath;
+        _bottomView.layer.mask = maskLayer;
+    }
+    return _bottomView;
+}
+
+- (KSMutilDatePicker *)datePicker {
+    if (!_datePicker) {
+        MJWeakSelf;
+        // 最大时间 now
+        // 最小时间 2021-03
+        NSString *minLimitStr = @"2021-03";
+        NSDateFormatter *outputFormatter = [NSObject getDateformatter];
+        [outputFormatter setDateFormat:@"yyyy-MM"];
+        NSDate *minDate = [outputFormatter dateFromString:minLimitStr];
+        _datePicker = [[KSMutilDatePicker alloc] initWithTitle:@"选择时间" date:[NSDate date] maxLimitDate:[NSDate date] minLimitDate:minDate selectDateBlock:^(NSString * _Nonnull date, NSString * _Nonnull descDate) {
+            [weakSelf.topView changeArrowStatus:NO];
+            [weakSelf finishChooseDate:date disc:descDate];
+        } cancleBolck:^{
+            [weakSelf.topView changeArrowStatus:NO];
+        }];
+
+    }
+    return _datePicker;
+}
+
+- (void)finishChooseDate:(NSString *)dateStr disc:(NSString *)descStr {
+    self.topView.dateLabel.text = descStr;
+    if ([dateStr containsString:@"-"]) {
+        self.isYear = NO;
+        self.chooseDate = dateStr;
+
+    }
+    else {
+        self.isYear = YES;
+        self.chooseDate = dateStr;
+    }
+    [self requestData];
+}
+
+- (void)showPickerView {
+    [self.datePicker show];
+}
+
++ (WKProcessPool*)singleWkProcessPool {
+    static WKProcessPool *sharedPool;
+    static dispatch_once_t onceToken;
+    dispatch_once(&onceToken, ^{
+        sharedPool = [[WKProcessPool alloc] init];
+    });
+    return sharedPool;
+}
+
+- (NSDictionary *)convertJsonStringToNSDictionary:(NSString *)jsonString {
+    if (jsonString == nil) {
+        return nil;
+    }
+    NSData *jsonData = [jsonString dataUsingEncoding:NSUTF8StringEncoding];
+    NSError *error;
+    NSDictionary *json = [NSJSONSerialization JSONObjectWithData:jsonData options:NSJSONReadingMutableContainers error:&error];
+    if (error) {
+        NSLog(@"jsonString解析失败:%@", error);
+        return nil;
+    }
+    return json;
+}
+
+
+- (void)dealloc {
+    [[_myWebView configuration].userContentController removeScriptMessageHandlerForName:@"DAYA"];
+    [_myWebView loadHTMLString:@"" baseURL:nil];
+    [_myWebView removeFromSuperview];
+    _myWebView = nil;
+    [[NSURLCache sharedURLCache] removeAllCachedResponses];
+    [[NSURLCache sharedURLCache] setDiskCapacity:0];
+    [[NSURLCache sharedURLCache] setMemoryCapacity:0];
+}
+/*
+#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

+ 16 - 0
KulexiuForTeacher/KulexiuForTeacher/Module/Home/Income/Controller/MyIncomeViewController.h

@@ -0,0 +1,16 @@
+//
+//  MyIncomeViewController.h
+//  KulexiuForTeacher
+//
+//  Created by 王智 on 2022/4/26.
+//
+
+#import "KSBaseViewController.h"
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface MyIncomeViewController : KSBaseViewController
+
+@end
+
+NS_ASSUME_NONNULL_END

+ 270 - 0
KulexiuForTeacher/KulexiuForTeacher/Module/Home/Income/Controller/MyIncomeViewController.m

@@ -0,0 +1,270 @@
+//
+//  MyIncomeViewController.m
+//  KulexiuForTeacher
+//
+//  Created by 王智 on 2022/4/26.
+//
+
+#import "MyIncomeViewController.h"
+#import "MyIncomeListCell.h"
+#import "IncomeHeaderView.h"
+#import "WithdrawViewController.h"
+#import "NewClassPopView.h"
+#import "KSFullDatePicker.h"
+#import "IncomeListModel.h"
+#import "IncomeCountViewController.h"
+
+@interface MyIncomeViewController ()<UITableViewDelegate,UITableViewDataSource>
+
+@property (nonatomic, strong) NewClassPopView *popView;
+
+@property (nonatomic, strong) IncomeHeaderView *headView;
+
+@property (nonatomic, strong) NSDateFormatter *dateFormatter;
+
+@property (nonatomic, strong) NSString *searchDate;
+
+@property (nonatomic, strong) UITableView *tableView;
+
+@property (nonatomic, strong) NSString *bizType;
+
+@property (nonatomic, assign) NSInteger chooseIndex;
+
+@end
+
+@implementation MyIncomeViewController
+
+- (void)viewDidLoad {
+    [super viewDidLoad];
+    // Do any additional setup after loading the view.
+    [self allocTitle:@"我的收入"];
+    [self configUI];
+    [self setDefaultConfig];
+    [self requestAccountDetail];
+}
+
+- (void)setDefaultConfig {
+    
+    [self.dateFormatter setDateFormat:@"yyyy-MM"];
+    NSDate *date = [NSDate date];
+    self.searchDate = [self.dateFormatter stringFromDate:date];
+    [self.dateFormatter setDateFormat:@"yyyy年M月"];
+    self.headView.timeLabel.text = [self.dateFormatter stringFromDate:date];
+    self.headView.typeLabel.text = @"全部收入";
+}
+
+- (void)rightBtnClick {
+    IncomeCountViewController *countCtrl = [[IncomeCountViewController alloc] init];
+    [self.navigationController pushViewController:countCtrl animated:YES];
+}
+
+- (void)configUI {
+    [self rightButtonTitle:@"收入统计"];
+    
+    [self.scrollView removeFromSuperview];
+    [self.view addSubview:self.headView];
+    CGFloat headHeight = [IncomeHeaderView getViewHeight];
+    [self.headView mas_makeConstraints:^(MASConstraintMaker *make) {
+        make.left.right.top.mas_equalTo(self.view);
+        make.height.mas_equalTo(headHeight);
+    }];
+    [self.view addSubview:self.tableView];
+    [self.tableView mas_makeConstraints:^(MASConstraintMaker *make) {
+        make.left.right.mas_equalTo(self.view);
+        make.top.mas_equalTo(self.headView.mas_bottom);
+        make.bottom.mas_equalTo(self.view.mas_bottom).offset(-iPhoneXSafeBottomMargin);
+    }];
+    
+    MJWeakSelf;
+    self.tableView.mj_header = [KSGifRefreshHeader headerWithRefreshingBlock:^{
+        [weakSelf resetParamenter];
+        [weakSelf requestData];
+        [weakSelf requestAccountDetail];
+    }];
+    self.tableView.mj_footer = [KSGifRefreshFooter footerWithRefreshingBlock:^{
+        if (weakSelf.isLoadMore) {
+            weakSelf.pages += 1;
+            [weakSelf requestData];
+        }
+        else {
+            [weakSelf.tableView.mj_footer endRefreshingWithNoMoreData];
+        }
+    }];
+}
+
+- (void)viewWillAppear:(BOOL)animated {
+    [super viewWillAppear:animated];
+    [self refreshAndRequestData];
+}
+
+- (void)refreshAndRequestData {
+    [self resetParamenter];
+    [self requestData];
+}
+
+- (void)resetParamenter {
+    self.pages = 1;
+    self.isLoadMore = YES;
+    self.dataArray = [NSMutableArray array];
+    [self.tableView.mj_footer resetNoMoreData];
+    [self setPromptString:@"暂无数据" imageName:@"wd_img_zwsj" inView:self.tableView];
+    [self.tableView reloadData];
+}
+
+- (void)endRefresh {
+    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
+        [self.tableView.mj_header endRefreshing];
+        [self.tableView.mj_footer endRefreshing];
+    });
+}
+
+- (void)requestAccountDetail {
+    [KSNetworkingManager teacherAccountDetail:KS_GET success:^(NSDictionary * _Nonnull dic) {
+        if ([dic integerValueForKey:@"code"] == 200 && [dic boolValueForKey:@"status"]) {
+            double amount = [[dic dictionaryValueForKey:@"data"] doubleValueForKey:@"amountTotal"];
+            self.headView.moneyLabel.text = [NSString formatMoneyDoubleNum:amount];
+        }
+        else {
+            [self MBPShow:MESSAGEKEY];
+        }
+    } faliure:^(NSError * _Nonnull error) {
+        
+    }];
+}
+
+
+- (void)requestData {
+    [self showhud];
+    [KSNetworkingManager userAccountPageRequest:KS_POST searchDate:self.searchDate bizType:self.bizType page:self.pages rows:self.rows success:^(NSDictionary * _Nonnull dic) {
+        [self removehub];
+        [self endRefresh];
+        if ([dic integerValueForKey:@"code"] == 200 && [dic boolValueForKey:@"status"]) {
+            NSArray *sourceArray = [[dic dictionaryValueForKey:@"data"] arrayValueForKey:@"rows"];
+            
+            for (NSDictionary *parm in sourceArray) {
+                IncomeListModel *model = [[IncomeListModel alloc] initWithDictionary:parm];
+                [self.dataArray addObject:model];
+            }
+            if (sourceArray.count < self.rows) {
+                self.isLoadMore = NO;
+            }
+        }
+        else {
+            [self MBPShow:MESSAGEKEY];
+        }
+        [self.tableView reloadData];
+        [self changePromptLabelState];
+    } faliure:^(NSError * _Nonnull error) {
+        [self removehub];
+        [self endRefresh];
+        if (self.networkAvaiable == NO) {
+            [self setPromptString:@"暂无网络" imageName:@"no_networking" inView:self.tableView];
+        }
+        [self.dataArray removeAllObjects];
+        [self.tableView reloadData];
+    }];
+}
+
+
+#pragma mark --- table data source
+- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
+    return self.dataArray.count;
+}
+
+- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
+    
+    MyIncomeListCell *cell = [tableView dequeueReusableCellWithIdentifier:@"MyIncomeListCell"];
+    
+    return cell;
+}
+
+
+#pragma mark --- lazying
+- (NSDateFormatter *)dateFormatter {
+    if (!_dateFormatter) {
+        _dateFormatter = [NSObject getDateformatter];
+    }
+    return _dateFormatter;
+}
+
+- (UITableView *)tableView {
+    if (!_tableView) {
+        _tableView = [[UITableView alloc] initWithFrame:CGRectZero style:UITableViewStylePlain];
+        _tableView.backgroundColor = [UIColor clearColor];
+        _tableView.delegate = self;
+        _tableView.dataSource = self;
+        _tableView.separatorStyle = UITableViewCellSeparatorStyleNone;
+        [_tableView registerNib:[UINib nibWithNibName:@"MyIncomeListCell" bundle:[NSBundle mainBundle]] forCellReuseIdentifier:@"MyIncomeListCell"];
+    }
+    return _tableView;
+}
+
+- (IncomeHeaderView *)headView {
+    if (!_headView) {
+        _headView = [IncomeHeaderView shareInstance];
+        MJWeakSelf;
+        [_headView headerActionCallback:^(INCOME_ACTION action) {
+            [weakSelf sortAction:action];
+        }];
+    }
+    return _headView;
+}
+
+- (void)sortAction:(INCOME_ACTION)action {
+    switch (action) {
+        case INCOME_ACTION_TIME:
+        {
+            [self showPickerView];
+        }
+            break;
+        case INCOME_ACTION_TYPE:
+        {
+            
+        }
+            break;
+        case INCOME_ACTION_WITHDRAW:
+        {
+            WithdrawViewController *ctrl = [[WithdrawViewController alloc] init];
+            [self.navigationController pushViewController:ctrl animated:YES];
+        }
+            break;
+        default:
+            break;
+    }
+}
+
+- (void)showPickerView {
+    KSFullDatePicker *pickerView = [[KSFullDatePicker alloc] initWithTitle:@"" date:[NSDate date] pickMode:KSDATEPICKER_MODE_YEAR_MONTH selectDateBlock:^(NSString *date) {
+        self.searchDate = date;
+        NSString *displayTime = [self getTimeDisplay:date];
+        [self.headView.timeLabel setText:displayTime];
+        [self resetPickerStatus];
+        [self refreshAndRequestData];//
+    } cancleBlock:^{
+        [self resetPickerStatus];
+    }];
+    [pickerView show];
+}
+
+- (NSString *)getTimeDisplay:(NSString *)chooseMonth {
+    [self.dateFormatter setDateFormat:@"yyyy-MM"];
+    NSDate *chooseDate = [self.dateFormatter dateFromString:chooseMonth];
+    [self.dateFormatter setDateFormat:@"yyyy年M月"];
+    NSString *displayTime = [self.dateFormatter stringFromDate:chooseDate];
+    return displayTime;
+}
+
+- (void)resetPickerStatus {
+    self.headView.firstArrowUp = NO;
+}
+/*
+#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

+ 32 - 0
KulexiuForTeacher/KulexiuForTeacher/Module/Home/Income/Model/IncomeListModel.h

@@ -0,0 +1,32 @@
+//
+//  IncomeListModel.h
+//
+//  Created by Steven  on 2022/4/26
+//  Copyright (c) 2022 __MyCompanyName__. All rights reserved.
+//
+
+#import <Foundation/Foundation.h>
+
+
+
+@interface IncomeListModel : NSObject <NSCoding, NSCopying>
+
+@property (nonatomic, strong) NSString *internalBaseClassIdentifier;
+@property (nonatomic, assign) double accountBalance;
+@property (nonatomic, strong) NSString *inOrOut;
+@property (nonatomic, strong) NSString *bizId;
+@property (nonatomic, strong) NSString *orderNo;
+@property (nonatomic, assign) double accountId;
+@property (nonatomic, strong) NSString *endTime;
+@property (nonatomic, strong) NSString *timeDay;
+@property (nonatomic, assign) double transAmount;
+@property (nonatomic, strong) NSString *bizType;
+@property (nonatomic, strong) NSString *createTime;
+@property (nonatomic, strong) NSString *startTime;
+@property (nonatomic, strong) NSString *bizName;
+
++ (instancetype)modelObjectWithDictionary:(NSDictionary *)dict;
+- (instancetype)initWithDictionary:(NSDictionary *)dict;
+- (NSDictionary *)dictionaryRepresentation;
+
+@end

+ 183 - 0
KulexiuForTeacher/KulexiuForTeacher/Module/Home/Income/Model/IncomeListModel.m

@@ -0,0 +1,183 @@
+//
+//  IncomeListModel.m
+//
+//  Created by Steven  on 2022/4/26
+//  Copyright (c) 2022 __MyCompanyName__. All rights reserved.
+//
+
+#import "IncomeListModel.h"
+
+
+NSString *const kIncomeListModelId = @"id";
+NSString *const kIncomeListModelAccountBalance = @"accountBalance";
+NSString *const kIncomeListModelInOrOut = @"inOrOut";
+NSString *const kIncomeListModelBizId = @"bizId";
+NSString *const kIncomeListModelOrderNo = @"orderNo";
+NSString *const kIncomeListModelAccountId = @"accountId";
+NSString *const kIncomeListModelEndTime = @"endTime";
+NSString *const kIncomeListModelTimeDay = @"timeDay";
+NSString *const kIncomeListModelTransAmount = @"transAmount";
+NSString *const kIncomeListModelBizType = @"bizType";
+NSString *const kIncomeListModelCreateTime = @"createTime";
+NSString *const kIncomeListModelStartTime = @"startTime";
+NSString *const kIncomeListModelBizName = @"bizName";
+
+
+@interface IncomeListModel ()
+
+- (id)objectOrNilForKey:(id)aKey fromDictionary:(NSDictionary *)dict;
+
+@end
+
+@implementation IncomeListModel
+
+@synthesize internalBaseClassIdentifier = _internalBaseClassIdentifier;
+@synthesize accountBalance = _accountBalance;
+@synthesize inOrOut = _inOrOut;
+@synthesize bizId = _bizId;
+@synthesize orderNo = _orderNo;
+@synthesize accountId = _accountId;
+@synthesize endTime = _endTime;
+@synthesize timeDay = _timeDay;
+@synthesize transAmount = _transAmount;
+@synthesize bizType = _bizType;
+@synthesize createTime = _createTime;
+@synthesize startTime = _startTime;
+@synthesize bizName = _bizName;
+
+
++ (instancetype)modelObjectWithDictionary:(NSDictionary *)dict
+{
+    return [[self alloc] initWithDictionary:dict];
+}
+
+- (instancetype)initWithDictionary:(NSDictionary *)dict
+{
+    self = [super init];
+    
+    // This check serves to make sure that a non-NSDictionary object
+    // passed into the model class doesn't break the parsing.
+    if(self && [dict isKindOfClass:[NSDictionary class]]) {
+            self.internalBaseClassIdentifier = [self objectOrNilForKey:kIncomeListModelId fromDictionary:dict];
+            self.accountBalance = [[self objectOrNilForKey:kIncomeListModelAccountBalance fromDictionary:dict] doubleValue];
+            self.inOrOut = [self objectOrNilForKey:kIncomeListModelInOrOut fromDictionary:dict];
+            self.bizId = [self objectOrNilForKey:kIncomeListModelBizId fromDictionary:dict];
+            self.orderNo = [self objectOrNilForKey:kIncomeListModelOrderNo fromDictionary:dict];
+            self.accountId = [[self objectOrNilForKey:kIncomeListModelAccountId fromDictionary:dict] doubleValue];
+            self.endTime = [self objectOrNilForKey:kIncomeListModelEndTime fromDictionary:dict];
+            self.timeDay = [self objectOrNilForKey:kIncomeListModelTimeDay fromDictionary:dict];
+            self.transAmount = [[self objectOrNilForKey:kIncomeListModelTransAmount fromDictionary:dict] doubleValue];
+            self.bizType = [self objectOrNilForKey:kIncomeListModelBizType fromDictionary:dict];
+            self.createTime = [self objectOrNilForKey:kIncomeListModelCreateTime fromDictionary:dict];
+            self.startTime = [self objectOrNilForKey:kIncomeListModelStartTime fromDictionary:dict];
+            self.bizName = [self objectOrNilForKey:kIncomeListModelBizName fromDictionary:dict];
+
+    }
+    
+    return self;
+    
+}
+
+- (NSDictionary *)dictionaryRepresentation
+{
+    NSMutableDictionary *mutableDict = [NSMutableDictionary dictionary];
+    [mutableDict setValue:self.internalBaseClassIdentifier forKey:kIncomeListModelId];
+    [mutableDict setValue:[NSNumber numberWithDouble:self.accountBalance] forKey:kIncomeListModelAccountBalance];
+    [mutableDict setValue:self.inOrOut forKey:kIncomeListModelInOrOut];
+    [mutableDict setValue:self.bizId forKey:kIncomeListModelBizId];
+    [mutableDict setValue:self.orderNo forKey:kIncomeListModelOrderNo];
+    [mutableDict setValue:[NSNumber numberWithDouble:self.accountId] forKey:kIncomeListModelAccountId];
+    [mutableDict setValue:self.endTime forKey:kIncomeListModelEndTime];
+    [mutableDict setValue:self.timeDay forKey:kIncomeListModelTimeDay];
+    [mutableDict setValue:[NSNumber numberWithDouble:self.transAmount] forKey:kIncomeListModelTransAmount];
+    [mutableDict setValue:self.bizType forKey:kIncomeListModelBizType];
+    [mutableDict setValue:self.createTime forKey:kIncomeListModelCreateTime];
+    [mutableDict setValue:self.startTime forKey:kIncomeListModelStartTime];
+    [mutableDict setValue:self.bizName forKey:kIncomeListModelBizName];
+
+    return [NSDictionary dictionaryWithDictionary:mutableDict];
+}
+
+- (NSString *)description 
+{
+    return [NSString stringWithFormat:@"%@", [self dictionaryRepresentation]];
+}
+
+#pragma mark - Helper Method
+- (id)objectOrNilForKey:(id)aKey fromDictionary:(NSDictionary *)dict
+{
+    id object = [dict objectForKey:aKey];
+    if ([object isKindOfClass:[NSNumber class]]) {
+        NSNumber *number = object;
+        object = [number stringValue];
+    }
+    return [object isEqual:[NSNull null]] ? nil : object;
+}
+
+
+#pragma mark - NSCoding Methods
+
+- (id)initWithCoder:(NSCoder *)aDecoder
+{
+    self = [super init];
+
+    self.internalBaseClassIdentifier = [aDecoder decodeObjectForKey:kIncomeListModelId];
+    self.accountBalance = [aDecoder decodeDoubleForKey:kIncomeListModelAccountBalance];
+    self.inOrOut = [aDecoder decodeObjectForKey:kIncomeListModelInOrOut];
+    self.bizId = [aDecoder decodeObjectForKey:kIncomeListModelBizId];
+    self.orderNo = [aDecoder decodeObjectForKey:kIncomeListModelOrderNo];
+    self.accountId = [aDecoder decodeDoubleForKey:kIncomeListModelAccountId];
+    self.endTime = [aDecoder decodeObjectForKey:kIncomeListModelEndTime];
+    self.timeDay = [aDecoder decodeObjectForKey:kIncomeListModelTimeDay];
+    self.transAmount = [aDecoder decodeDoubleForKey:kIncomeListModelTransAmount];
+    self.bizType = [aDecoder decodeObjectForKey:kIncomeListModelBizType];
+    self.createTime = [aDecoder decodeObjectForKey:kIncomeListModelCreateTime];
+    self.startTime = [aDecoder decodeObjectForKey:kIncomeListModelStartTime];
+    self.bizName = [aDecoder decodeObjectForKey:kIncomeListModelBizName];
+    return self;
+}
+
+- (void)encodeWithCoder:(NSCoder *)aCoder
+{
+
+    [aCoder encodeObject:_internalBaseClassIdentifier forKey:kIncomeListModelId];
+    [aCoder encodeDouble:_accountBalance forKey:kIncomeListModelAccountBalance];
+    [aCoder encodeObject:_inOrOut forKey:kIncomeListModelInOrOut];
+    [aCoder encodeObject:_bizId forKey:kIncomeListModelBizId];
+    [aCoder encodeObject:_orderNo forKey:kIncomeListModelOrderNo];
+    [aCoder encodeDouble:_accountId forKey:kIncomeListModelAccountId];
+    [aCoder encodeObject:_endTime forKey:kIncomeListModelEndTime];
+    [aCoder encodeObject:_timeDay forKey:kIncomeListModelTimeDay];
+    [aCoder encodeDouble:_transAmount forKey:kIncomeListModelTransAmount];
+    [aCoder encodeObject:_bizType forKey:kIncomeListModelBizType];
+    [aCoder encodeObject:_createTime forKey:kIncomeListModelCreateTime];
+    [aCoder encodeObject:_startTime forKey:kIncomeListModelStartTime];
+    [aCoder encodeObject:_bizName forKey:kIncomeListModelBizName];
+}
+
+- (id)copyWithZone:(NSZone *)zone
+{
+    IncomeListModel *copy = [[IncomeListModel alloc] init];
+    
+    if (copy) {
+
+        copy.internalBaseClassIdentifier = [self.internalBaseClassIdentifier copyWithZone:zone];
+        copy.accountBalance = self.accountBalance;
+        copy.inOrOut = [self.inOrOut copyWithZone:zone];
+        copy.bizId = [self.bizId copyWithZone:zone];
+        copy.orderNo = [self.orderNo copyWithZone:zone];
+        copy.accountId = self.accountId;
+        copy.endTime = [self.endTime copyWithZone:zone];
+        copy.timeDay = [self.timeDay copyWithZone:zone];
+        copy.transAmount = self.transAmount;
+        copy.bizType = [self.bizType copyWithZone:zone];
+        copy.createTime = [self.createTime copyWithZone:zone];
+        copy.startTime = [self.startTime copyWithZone:zone];
+        copy.bizName = [self.bizName copyWithZone:zone];
+    }
+    
+    return copy;
+}
+
+
+@end

File diff suppressed because it is too large
+ 0 - 0
KulexiuForTeacher/KulexiuForTeacher/Module/Home/Income/Model/echarts.min.js


+ 33 - 0
KulexiuForTeacher/KulexiuForTeacher/Module/Home/Income/Model/stacked_line_chart.html

@@ -0,0 +1,33 @@
+<!DOCTYPE html>
+<html>
+    <head>
+        <meta charset="utf-8">
+            <title>ECharts</title>
+            <!-- 引入 echarts.js -->
+            <script src="echarts.min.js"></script>
+            <meta name="viewport"
+                content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">
+                <style>
+                    html,body{margin:0;padding:0}
+                    body{width: 100%;height:100vh;padding-bottom:10pt;box-sizing: border-box;}
+                    
+                    
+                    
+                    </style>
+                </head>
+    <body>
+        <!-- 为ECharts准备一个具备大小(宽高)的Dom -->
+        <div id="main" style="width: 100%;height:calc(100vh - 15pt);"></div>
+        <script type="text/javascript">
+            // 基于准备好的dom,初始化echarts实例
+            var myChart = echarts.init(document.getElementById('main'));
+            
+            function loadEcharts(echartJson){
+                var option = JSON.parse(echartJson);
+                myChart.setOption(option,true);
+            }
+        
+        
+        </script>
+    </body>
+</html>

+ 23 - 0
KulexiuForTeacher/KulexiuForTeacher/Module/Home/Income/View/IncomeCountBottomView.h

@@ -0,0 +1,23 @@
+//
+//  IncomeCountBottomView.h
+//  TeacherDaya
+//
+//  Created by Kyle on 2021/5/11.
+//  Copyright © 2021 DayaMusic. All rights reserved.
+//
+
+#import <UIKit/UIKit.h>
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface IncomeCountBottomView : UIView
+
+@property (weak, nonatomic) IBOutlet UIView *bgView;
+
++ (instancetype)shareInstance;
+
+- (void)configSource:(NSArray *)titleArray amountArray:(NSArray *)amountArray totalAmount:(CGFloat)totalAmount;
+
+@end
+
+NS_ASSUME_NONNULL_END

+ 88 - 0
KulexiuForTeacher/KulexiuForTeacher/Module/Home/Income/View/IncomeCountBottomView.m

@@ -0,0 +1,88 @@
+//
+//  IncomeCountBottomView.m
+//  TeacherDaya
+//
+//  Created by Kyle on 2021/5/11.
+//  Copyright © 2021 DayaMusic. All rights reserved.
+//
+
+#import "IncomeCountBottomView.h"
+
+@interface IncomeCountBottomView ()
+
+@property (weak, nonatomic) IBOutlet UIView *firstView;
+
+@property (weak, nonatomic) IBOutlet UILabel *firstTitle;
+
+@property (weak, nonatomic) IBOutlet UILabel *firstSalary;
+
+@property (weak, nonatomic) IBOutlet UIView *secondView;
+
+@property (weak, nonatomic) IBOutlet UILabel *secondTitle;
+
+@property (weak, nonatomic) IBOutlet UILabel *secondSalary;
+
+@property (weak, nonatomic) IBOutlet UIView *thirdView;
+
+@property (weak, nonatomic) IBOutlet UILabel *thirdTitle;
+
+@property (weak, nonatomic) IBOutlet UILabel *thirdSalary;
+
+@end
+
+@implementation IncomeCountBottomView
+
++ (instancetype)shareInstance {
+    IncomeCountBottomView *view = [[[NSBundle mainBundle] loadNibNamed:@"IncomeCountBottomView" owner:nil options:nil] firstObject];
+    return view;
+}
+
+- (void)configSource:(NSArray *)titleArray amountArray:(NSArray *)amountArray totalAmount:(CGFloat)totalAmount {
+    if (titleArray.count >= 3) {
+        self.firstView.hidden = NO;
+        self.secondView.hidden = NO;
+        self.thirdView.hidden = NO;
+    }
+    else if (titleArray.count == 2) {
+        self.firstView.hidden = NO;
+        self.secondView.hidden = NO;
+        self.thirdView.hidden = YES;
+    }
+    else if (titleArray.count == 1) {
+        self.firstView.hidden = NO;
+        self.secondView.hidden = YES;
+        self.thirdView.hidden = YES;
+    }
+    else {
+        self.firstView.hidden = NO;
+        self.secondView.hidden = YES;
+        self.thirdView.hidden = YES;
+    }
+    for (int i = 0; i < titleArray.count; i++) {
+        if (i == 0) {
+            CGFloat rate = totalAmount == 0 ? 0 : [amountArray[0] doubleValue] / totalAmount * 100;
+            self.firstTitle.text = [NSString stringWithFormat:@"%@", titleArray[0]];
+            self.firstSalary.text = [NSString stringWithFormat:@"|  %.0f%%",rate];
+        }
+        else if (i == 1) {
+            CGFloat rate = totalAmount == 0 ? 0 : [amountArray[1] doubleValue] / totalAmount * 100;
+            self.secondTitle.text = [NSString stringWithFormat:@"%@", titleArray[1]];
+            self.secondSalary.text = [NSString stringWithFormat:@"|  %.0f%%",rate];
+        }
+        else if (i == 2) {
+            CGFloat rate = totalAmount == 0 ? 0 : [amountArray[2] doubleValue] / totalAmount * 100;
+            self.thirdTitle.text = [NSString stringWithFormat:@"%@", titleArray[2]];
+            self.thirdSalary.text = [NSString stringWithFormat:@"|  %.0f%%",rate];
+        }
+    }
+}
+
+/*
+// Only override drawRect: if you perform custom drawing.
+// An empty implementation adversely affects performance during animation.
+- (void)drawRect:(CGRect)rect {
+    // Drawing code
+}
+*/
+
+@end

+ 208 - 0
KulexiuForTeacher/KulexiuForTeacher/Module/Home/Income/View/IncomeCountBottomView.xib

@@ -0,0 +1,208 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="17156" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" colorMatched="YES">
+    <device id="retina6_1" orientation="portrait" appearance="light"/>
+    <dependencies>
+        <deployment identifier="iOS"/>
+        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="17126"/>
+        <capability name="System colors in document resources" minToolsVersion="11.0"/>
+        <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
+    </dependencies>
+    <objects>
+        <placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner"/>
+        <placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/>
+        <view contentMode="scaleToFill" id="iN0-l3-epB" customClass="IncomeCountBottomView">
+            <rect key="frame" x="0.0" y="0.0" width="414" height="250"/>
+            <autoresizingMask key="autoresizingMask"/>
+            <subviews>
+                <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="9kR-PL-2k3">
+                    <rect key="frame" x="25" y="10" width="3" height="15"/>
+                    <color key="backgroundColor" red="0.0039215686274509803" green="0.75686274509803919" blue="0.70980392156862748" alpha="1" colorSpace="calibratedRGB"/>
+                    <constraints>
+                        <constraint firstAttribute="height" constant="15" id="9TK-Hw-9Fv"/>
+                        <constraint firstAttribute="width" constant="3" id="V8e-iq-qG3"/>
+                    </constraints>
+                </view>
+                <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="收入结构" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="yBd-Je-YwX">
+                    <rect key="frame" x="34" y="7.5" width="66" height="20"/>
+                    <constraints>
+                        <constraint firstAttribute="height" constant="20" id="cwC-5Y-Q9G"/>
+                    </constraints>
+                    <fontDescription key="fontDescription" type="system" pointSize="16"/>
+                    <color key="textColor" red="0.50196078431372548" green="0.50196078431372548" blue="0.50196078431372548" alpha="1" colorSpace="calibratedRGB"/>
+                    <nil key="highlightedColor"/>
+                </label>
+                <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="BxO-yt-3d0">
+                    <rect key="frame" x="190" y="67.5" width="214" height="30"/>
+                    <subviews>
+                        <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="Oeh-EG-C9A">
+                            <rect key="frame" x="0.0" y="10" width="10" height="10"/>
+                            <color key="backgroundColor" red="0.0039215686274509803" green="0.75686274509803919" blue="0.70980392156862748" alpha="1" colorSpace="calibratedRGB"/>
+                            <constraints>
+                                <constraint firstAttribute="width" constant="10" id="NN0-dG-AOp"/>
+                                <constraint firstAttribute="height" constant="10" id="hhb-Tt-EbF"/>
+                            </constraints>
+                            <userDefinedRuntimeAttributes>
+                                <userDefinedRuntimeAttribute type="number" keyPath="cornerRadius">
+                                    <real key="value" value="5"/>
+                                </userDefinedRuntimeAttribute>
+                            </userDefinedRuntimeAttributes>
+                        </view>
+                        <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="252" verticalHuggingPriority="251" text="" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="Geg-Bv-b7O">
+                            <rect key="frame" x="20" y="15" width="0.0" height="0.0"/>
+                            <fontDescription key="fontDescription" type="system" pointSize="14"/>
+                            <color key="textColor" red="0.10196078431372549" green="0.10196078431372549" blue="0.10196078431372549" alpha="1" colorSpace="calibratedRGB"/>
+                            <nil key="highlightedColor"/>
+                        </label>
+                        <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="" textAlignment="right" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="7P5-gZ-Def">
+                            <rect key="frame" x="22" y="15" width="192" height="0.0"/>
+                            <fontDescription key="fontDescription" type="system" pointSize="14"/>
+                            <color key="textColor" red="0.50196078431372548" green="0.50196078431372548" blue="0.50196078431372548" alpha="1" colorSpace="calibratedRGB"/>
+                            <nil key="highlightedColor"/>
+                        </label>
+                    </subviews>
+                    <color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
+                    <constraints>
+                        <constraint firstAttribute="height" constant="30" id="0rd-Sx-OsE"/>
+                        <constraint firstItem="Geg-Bv-b7O" firstAttribute="centerY" secondItem="BxO-yt-3d0" secondAttribute="centerY" id="542-nF-lPn"/>
+                        <constraint firstItem="Oeh-EG-C9A" firstAttribute="centerY" secondItem="BxO-yt-3d0" secondAttribute="centerY" id="5jm-rD-ueC"/>
+                        <constraint firstItem="Oeh-EG-C9A" firstAttribute="leading" secondItem="BxO-yt-3d0" secondAttribute="leading" id="Ajc-O3-zzR"/>
+                        <constraint firstItem="7P5-gZ-Def" firstAttribute="leading" secondItem="Geg-Bv-b7O" secondAttribute="trailing" constant="2" id="IDR-nA-Gfa"/>
+                        <constraint firstAttribute="trailing" secondItem="7P5-gZ-Def" secondAttribute="trailing" id="QHz-8A-4Ns"/>
+                        <constraint firstItem="Geg-Bv-b7O" firstAttribute="leading" secondItem="Oeh-EG-C9A" secondAttribute="trailing" constant="10" id="UUD-06-mD0"/>
+                        <constraint firstItem="7P5-gZ-Def" firstAttribute="centerY" secondItem="BxO-yt-3d0" secondAttribute="centerY" id="cL4-1Z-Ouk"/>
+                    </constraints>
+                </view>
+                <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="1gk-JW-mi7">
+                    <rect key="frame" x="190" y="122.5" width="214" height="30"/>
+                    <subviews>
+                        <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="252" verticalHuggingPriority="251" text="" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="0JI-LN-A03">
+                            <rect key="frame" x="20" y="6" width="0.0" height="18"/>
+                            <fontDescription key="fontDescription" type="system" pointSize="14"/>
+                            <color key="textColor" red="0.1019607843" green="0.1019607843" blue="0.1019607843" alpha="1" colorSpace="calibratedRGB"/>
+                            <nil key="highlightedColor"/>
+                        </label>
+                        <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="Vra-hB-9Mg">
+                            <rect key="frame" x="0.0" y="10" width="10" height="10"/>
+                            <color key="backgroundColor" red="0.35686274509803922" green="0.5607843137254902" blue="0.97647058823529409" alpha="1" colorSpace="calibratedRGB"/>
+                            <constraints>
+                                <constraint firstAttribute="width" constant="10" id="2J2-Dw-2bu"/>
+                                <constraint firstAttribute="height" constant="10" id="6Zj-LK-uOl"/>
+                            </constraints>
+                            <userDefinedRuntimeAttributes>
+                                <userDefinedRuntimeAttribute type="number" keyPath="cornerRadius">
+                                    <real key="value" value="5"/>
+                                </userDefinedRuntimeAttribute>
+                            </userDefinedRuntimeAttributes>
+                        </view>
+                        <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="" textAlignment="right" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="gwp-gh-dR4">
+                            <rect key="frame" x="25" y="15" width="189" height="0.0"/>
+                            <fontDescription key="fontDescription" type="system" pointSize="14"/>
+                            <color key="textColor" red="0.50196078430000002" green="0.50196078430000002" blue="0.50196078430000002" alpha="1" colorSpace="calibratedRGB"/>
+                            <nil key="highlightedColor"/>
+                        </label>
+                    </subviews>
+                    <color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
+                    <constraints>
+                        <constraint firstItem="0JI-LN-A03" firstAttribute="leading" secondItem="Vra-hB-9Mg" secondAttribute="trailing" constant="10" id="9DR-WM-OsJ"/>
+                        <constraint firstItem="0JI-LN-A03" firstAttribute="centerY" secondItem="Vra-hB-9Mg" secondAttribute="centerY" id="9Qu-00-cEQ"/>
+                        <constraint firstItem="gwp-gh-dR4" firstAttribute="leading" secondItem="0JI-LN-A03" secondAttribute="trailing" constant="5" id="Ifl-Qw-HKt"/>
+                        <constraint firstAttribute="trailing" secondItem="gwp-gh-dR4" secondAttribute="trailing" id="Mrt-4R-zyJ"/>
+                        <constraint firstItem="Vra-hB-9Mg" firstAttribute="leading" secondItem="1gk-JW-mi7" secondAttribute="leading" id="QJD-yD-Fct"/>
+                        <constraint firstItem="0JI-LN-A03" firstAttribute="top" secondItem="1gk-JW-mi7" secondAttribute="top" constant="6" id="UTA-b9-fde"/>
+                        <constraint firstItem="gwp-gh-dR4" firstAttribute="centerY" secondItem="Vra-hB-9Mg" secondAttribute="centerY" id="X5o-fH-Tfl"/>
+                        <constraint firstItem="Vra-hB-9Mg" firstAttribute="centerY" secondItem="1gk-JW-mi7" secondAttribute="centerY" id="ZFr-qt-txK"/>
+                        <constraint firstAttribute="height" constant="30" id="mBH-yf-DRz"/>
+                    </constraints>
+                </view>
+                <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="WHj-SB-cb0">
+                    <rect key="frame" x="190" y="177.5" width="214" height="30"/>
+                    <subviews>
+                        <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="s4s-Ph-dhz">
+                            <rect key="frame" x="0.0" y="10" width="10" height="10"/>
+                            <color key="backgroundColor" red="1" green="0.81568627450980391" blue="0.17254901960784313" alpha="1" colorSpace="calibratedRGB"/>
+                            <constraints>
+                                <constraint firstAttribute="width" constant="10" id="DXV-bA-oNm"/>
+                                <constraint firstAttribute="height" constant="10" id="V42-XU-wHD"/>
+                            </constraints>
+                            <userDefinedRuntimeAttributes>
+                                <userDefinedRuntimeAttribute type="number" keyPath="cornerRadius">
+                                    <real key="value" value="5"/>
+                                </userDefinedRuntimeAttribute>
+                            </userDefinedRuntimeAttributes>
+                        </view>
+                        <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="252" verticalHuggingPriority="251" text="" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="I5c-Xi-iyr">
+                            <rect key="frame" x="20" y="15" width="0.0" height="0.0"/>
+                            <fontDescription key="fontDescription" type="system" pointSize="14"/>
+                            <color key="textColor" red="0.1019607843" green="0.1019607843" blue="0.1019607843" alpha="1" colorSpace="calibratedRGB"/>
+                            <nil key="highlightedColor"/>
+                        </label>
+                        <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="" textAlignment="right" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="rPH-YS-rWH">
+                            <rect key="frame" x="25" y="15" width="189" height="0.0"/>
+                            <fontDescription key="fontDescription" type="system" pointSize="14"/>
+                            <color key="textColor" red="0.50196078430000002" green="0.50196078430000002" blue="0.50196078430000002" alpha="1" colorSpace="calibratedRGB"/>
+                            <nil key="highlightedColor"/>
+                        </label>
+                    </subviews>
+                    <color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
+                    <constraints>
+                        <constraint firstItem="s4s-Ph-dhz" firstAttribute="centerY" secondItem="I5c-Xi-iyr" secondAttribute="centerY" id="4Sz-tp-sRf"/>
+                        <constraint firstItem="rPH-YS-rWH" firstAttribute="leading" secondItem="I5c-Xi-iyr" secondAttribute="trailing" constant="5" id="H83-UB-oZa"/>
+                        <constraint firstItem="s4s-Ph-dhz" firstAttribute="centerY" secondItem="WHj-SB-cb0" secondAttribute="centerY" id="PHO-7V-Zh6"/>
+                        <constraint firstAttribute="height" constant="30" id="VyA-Yt-Xgb"/>
+                        <constraint firstItem="rPH-YS-rWH" firstAttribute="centerY" secondItem="I5c-Xi-iyr" secondAttribute="centerY" id="nec-v6-4wf"/>
+                        <constraint firstItem="s4s-Ph-dhz" firstAttribute="leading" secondItem="WHj-SB-cb0" secondAttribute="leading" id="sAD-V1-xkD"/>
+                        <constraint firstAttribute="trailing" secondItem="rPH-YS-rWH" secondAttribute="trailing" id="sYj-r3-9ql"/>
+                        <constraint firstItem="I5c-Xi-iyr" firstAttribute="leading" secondItem="s4s-Ph-dhz" secondAttribute="trailing" constant="10" id="zEn-Ix-UET"/>
+                    </constraints>
+                </view>
+                <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="lNm-k0-n1u">
+                    <rect key="frame" x="0.0" y="47.5" width="180" height="180"/>
+                    <color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
+                    <constraints>
+                        <constraint firstAttribute="width" constant="180" id="C9C-ui-1Bz"/>
+                        <constraint firstAttribute="height" constant="180" id="gUr-xh-hAB"/>
+                    </constraints>
+                </view>
+            </subviews>
+            <color key="backgroundColor" systemColor="systemBackgroundColor"/>
+            <constraints>
+                <constraint firstItem="1gk-JW-mi7" firstAttribute="centerY" secondItem="lNm-k0-n1u" secondAttribute="centerY" id="AZk-PF-XdY"/>
+                <constraint firstItem="9kR-PL-2k3" firstAttribute="top" secondItem="iN0-l3-epB" secondAttribute="top" constant="10" id="C4u-03-CVg"/>
+                <constraint firstItem="yBd-Je-YwX" firstAttribute="leading" secondItem="9kR-PL-2k3" secondAttribute="trailing" constant="6" id="EPc-yK-OBM"/>
+                <constraint firstItem="BxO-yt-3d0" firstAttribute="top" secondItem="lNm-k0-n1u" secondAttribute="top" constant="20" id="HH2-kr-0L4"/>
+                <constraint firstItem="BxO-yt-3d0" firstAttribute="leading" secondItem="lNm-k0-n1u" secondAttribute="trailing" constant="10" id="KwE-gs-L7N"/>
+                <constraint firstItem="WHj-SB-cb0" firstAttribute="bottom" secondItem="lNm-k0-n1u" secondAttribute="bottom" constant="-20" id="Lmd-UG-3ok"/>
+                <constraint firstAttribute="trailing" secondItem="BxO-yt-3d0" secondAttribute="trailing" constant="10" id="MpH-Uu-lII"/>
+                <constraint firstItem="WHj-SB-cb0" firstAttribute="trailing" secondItem="BxO-yt-3d0" secondAttribute="trailing" id="Mpf-T6-Qht"/>
+                <constraint firstItem="9kR-PL-2k3" firstAttribute="leading" secondItem="iN0-l3-epB" secondAttribute="leading" constant="25" id="V77-F5-50Z"/>
+                <constraint firstItem="yBd-Je-YwX" firstAttribute="centerY" secondItem="9kR-PL-2k3" secondAttribute="centerY" id="Wk5-3s-N4e"/>
+                <constraint firstItem="lNm-k0-n1u" firstAttribute="leading" secondItem="iN0-l3-epB" secondAttribute="leading" id="cbm-nf-AGy"/>
+                <constraint firstItem="lNm-k0-n1u" firstAttribute="top" secondItem="yBd-Je-YwX" secondAttribute="bottom" constant="20" id="rBQ-0d-lm4"/>
+                <constraint firstItem="1gk-JW-mi7" firstAttribute="trailing" secondItem="BxO-yt-3d0" secondAttribute="trailing" id="rgq-tm-43k"/>
+                <constraint firstItem="1gk-JW-mi7" firstAttribute="leading" secondItem="BxO-yt-3d0" secondAttribute="leading" id="rqc-E0-6S5"/>
+                <constraint firstItem="WHj-SB-cb0" firstAttribute="leading" secondItem="BxO-yt-3d0" secondAttribute="leading" id="ud1-El-sTu"/>
+            </constraints>
+            <nil key="simulatedTopBarMetrics"/>
+            <nil key="simulatedBottomBarMetrics"/>
+            <freeformSimulatedSizeMetrics key="simulatedDestinationMetrics"/>
+            <connections>
+                <outlet property="bgView" destination="lNm-k0-n1u" id="1j1-KI-QdW"/>
+                <outlet property="firstSalary" destination="7P5-gZ-Def" id="UjM-x4-ItC"/>
+                <outlet property="firstTitle" destination="Geg-Bv-b7O" id="ajF-Tk-vLH"/>
+                <outlet property="firstView" destination="BxO-yt-3d0" id="wfS-Pi-4U3"/>
+                <outlet property="secondSalary" destination="gwp-gh-dR4" id="6Ta-qc-zrZ"/>
+                <outlet property="secondTitle" destination="0JI-LN-A03" id="mpI-Y7-hSR"/>
+                <outlet property="secondView" destination="1gk-JW-mi7" id="zao-YB-NIA"/>
+                <outlet property="thirdSalary" destination="rPH-YS-rWH" id="A0L-j8-mUO"/>
+                <outlet property="thirdTitle" destination="I5c-Xi-iyr" id="TI3-B0-btP"/>
+                <outlet property="thirdView" destination="WHj-SB-cb0" id="0Pf-GG-8tH"/>
+            </connections>
+            <point key="canvasLocation" x="50.724637681159422" y="-162.05357142857142"/>
+        </view>
+    </objects>
+    <resources>
+        <systemColor name="systemBackgroundColor">
+            <color white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
+        </systemColor>
+    </resources>
+</document>

+ 34 - 0
KulexiuForTeacher/KulexiuForTeacher/Module/Home/Income/View/IncomeCountTopView.h

@@ -0,0 +1,34 @@
+//
+//  IncomeCountTopView.h
+//  TeacherDaya
+//
+//  Created by Kyle on 2021/4/21.
+//  Copyright © 2021 DayaMusic. All rights reserved.
+//
+
+#import <UIKit/UIKit.h>
+
+typedef void(^SalaryCountBlock)(void);
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface IncomeCountTopView : UIView
+
+@property (weak, nonatomic) IBOutlet UILabel *dateLabel;
+
+@property (weak, nonatomic) IBOutlet UILabel *totalSalary;
+
+@property (weak, nonatomic) IBOutlet UIImageView *arrowImage;
+
++ (instancetype)shareInstance;
+
+- (void)configSource:(NSArray *)titleArray amountArray:(NSArray *)amountArray;
+
+- (void)chooseDateCallback:(SalaryCountBlock)callback;
+
+- (void)changeArrowStatus:(BOOL)isShow;
+
+
+@end
+
+NS_ASSUME_NONNULL_END

+ 115 - 0
KulexiuForTeacher/KulexiuForTeacher/Module/Home/Income/View/IncomeCountTopView.m

@@ -0,0 +1,115 @@
+//
+//  IncomeCountTopView.m
+//  TeacherDaya
+//
+//  Created by Kyle on 2021/4/21.
+//  Copyright © 2021 DayaMusic. All rights reserved.
+//
+
+#import "IncomeCountTopView.h"
+
+@interface IncomeCountTopView ()
+
+@property (nonatomic, copy) SalaryCountBlock callback;
+
+@property (weak, nonatomic) IBOutlet UIView *bgView;
+
+@property (weak, nonatomic) IBOutlet UIView *firstView;
+
+@property (weak, nonatomic) IBOutlet UILabel *firstTitle;
+
+@property (weak, nonatomic) IBOutlet UILabel *firstSalary;
+
+@property (weak, nonatomic) IBOutlet UIView *secondView;
+
+@property (weak, nonatomic) IBOutlet UILabel *secondTitle;
+
+@property (weak, nonatomic) IBOutlet UILabel *secondSalary;
+
+@property (weak, nonatomic) IBOutlet UIView *thirdView;
+
+@property (weak, nonatomic) IBOutlet UILabel *thirdTitle;
+
+@property (weak, nonatomic) IBOutlet UILabel *thirdSalary;
+
+@end
+
+@implementation IncomeCountTopView
+
+- (void)awakeFromNib {
+    [super awakeFromNib];
+    UIBezierPath * path = [UIBezierPath bezierPathWithRoundedRect:CGRectMake(0, 0, kScreenWidth - 24, 180) byRoundingCorners:UIRectCornerTopLeft | UIRectCornerTopRight cornerRadii:CGSizeMake(10, 10)];
+    CAShapeLayer *maskLayer = [[CAShapeLayer alloc] init];
+    maskLayer.frame = CGRectMake(0, 0, kScreenWidth - 24, 180);
+    maskLayer.path = path.CGPath;
+    _bgView.layer.mask = maskLayer;
+}
+
++ (instancetype)shareInstance {
+    IncomeCountTopView *view = [[[NSBundle mainBundle] loadNibNamed:@"IncomeCountTopView" owner:nil options:nil] firstObject];
+    return view;
+}
+
+- (void)configSource:(NSArray *)titleArray amountArray:(NSArray *)amountArray {
+    if (titleArray.count >= 3) {
+        self.firstView.hidden = NO;
+        self.secondView.hidden = NO;
+        self.thirdView.hidden = NO;
+    }
+    else if (titleArray.count == 2) {
+        self.firstView.hidden = NO;
+        self.secondView.hidden = NO;
+        self.thirdView.hidden = YES;
+    }
+    else if (titleArray.count == 1) {
+        self.firstView.hidden = NO;
+        self.secondView.hidden = YES;
+        self.thirdView.hidden = YES;
+    }
+    else {
+        self.firstView.hidden = NO;
+        self.secondView.hidden = YES;
+        self.thirdView.hidden = YES;
+    }
+    for (int i = 0; i < titleArray.count; i++) {
+        if (i == 0) {
+            self.firstTitle.text = [NSString stringWithFormat:@"%@", titleArray[0]];
+            self.firstSalary.text = [NSString formatMoneyDoubleNum:[amountArray[0] doubleValue]];
+        }
+        else if (i == 1) {
+            self.secondTitle.text = [NSString stringWithFormat:@"%@", titleArray[1]];
+            self.secondSalary.text = [NSString formatMoneyDoubleNum:[amountArray[1] doubleValue]];
+        }
+        else if (i == 2) {
+            self.thirdTitle.text = [NSString stringWithFormat:@"%@", titleArray[2]];
+            self.thirdSalary.text = [NSString formatMoneyDoubleNum:[amountArray[2] doubleValue]];
+        }
+    }
+}
+
+- (void)chooseDateCallback:(SalaryCountBlock)callback {
+    if (callback) {
+        self.callback = callback;
+    }
+}
+
+- (IBAction)chooseDate:(id)sender {
+    if (self.callback) {
+        [self changeArrowStatus:YES];
+        self.callback();
+    }
+}
+- (void)changeArrowStatus:(BOOL)isShow; {
+    NSString *imageName = isShow ?  @"sort_up" : @"sort_down";
+    [self.arrowImage setImage:[UIImage imageNamed:imageName]];
+}
+
+/*
+// Only override drawRect: if you perform custom drawing.
+// An empty implementation adversely affects performance during animation.
+- (void)drawRect:(CGRect)rect {
+    // Drawing code
+}
+*/
+
+@end

+ 274 - 0
KulexiuForTeacher/KulexiuForTeacher/Module/Home/Income/View/IncomeCountTopView.xib

@@ -0,0 +1,274 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="20037" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" colorMatched="YES">
+    <device id="retina6_1" orientation="portrait" appearance="light"/>
+    <dependencies>
+        <deployment identifier="iOS"/>
+        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="20020"/>
+        <capability name="System colors in document resources" minToolsVersion="11.0"/>
+        <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
+    </dependencies>
+    <objects>
+        <placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner"/>
+        <placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/>
+        <view contentMode="scaleToFill" id="iN0-l3-epB" customClass="IncomeCountTopView">
+            <rect key="frame" x="0.0" y="0.0" width="414" height="190"/>
+            <autoresizingMask key="autoresizingMask"/>
+            <subviews>
+                <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="swP-Ge-Ub2">
+                    <rect key="frame" x="12" y="10" width="390" height="180"/>
+                    <subviews>
+                        <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="总收入(元)" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="K4B-4c-Kgv">
+                            <rect key="frame" x="12" y="18" width="86.5" height="28"/>
+                            <constraints>
+                                <constraint firstAttribute="height" constant="28" id="oCu-bS-jY0"/>
+                            </constraints>
+                            <fontDescription key="fontDescription" type="system" pointSize="18"/>
+                            <color key="textColor" white="0.0" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
+                            <nil key="highlightedColor"/>
+                        </label>
+                        <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="9Lz-0I-40s">
+                            <rect key="frame" x="12" y="48" width="0.0" height="34"/>
+                            <constraints>
+                                <constraint firstAttribute="height" constant="34" id="Xey-xB-RFd"/>
+                            </constraints>
+                            <fontDescription key="fontDescription" type="system" weight="medium" pointSize="26"/>
+                            <color key="textColor" red="1" green="0.30588235294117649" blue="0.098039215686274508" alpha="1" colorSpace="calibratedRGB"/>
+                            <nil key="highlightedColor"/>
+                        </label>
+                        <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="GoB-5X-m0H">
+                            <rect key="frame" x="12" y="92" width="366" height="1"/>
+                            <color key="backgroundColor" red="0.94117647058823528" green="0.94117647058823528" blue="0.94117647058823528" alpha="1" colorSpace="calibratedRGB"/>
+                            <constraints>
+                                <constraint firstAttribute="height" constant="1" id="rch-SM-Hdh"/>
+                            </constraints>
+                        </view>
+                        <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="UmP-RR-Inh">
+                            <rect key="frame" x="12" y="93" width="122" height="87"/>
+                            <subviews>
+                                <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="GgP-t5-aKS">
+                                    <rect key="frame" x="0.0" y="22.5" width="2" height="42"/>
+                                    <color key="backgroundColor" red="0.0039215686269999999" green="0.75686274509999996" blue="0.70980392160000005" alpha="1" colorSpace="calibratedRGB"/>
+                                    <constraints>
+                                        <constraint firstAttribute="height" constant="42" id="CE1-pu-5em"/>
+                                        <constraint firstAttribute="width" constant="2" id="qKU-Io-2bI"/>
+                                    </constraints>
+                                    <userDefinedRuntimeAttributes>
+                                        <userDefinedRuntimeAttribute type="number" keyPath="cornerRadius">
+                                            <real key="value" value="1"/>
+                                        </userDefinedRuntimeAttribute>
+                                    </userDefinedRuntimeAttributes>
+                                </view>
+                                <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="FrQ-cc-TDs">
+                                    <rect key="frame" x="8" y="22.5" width="0.0" height="0.0"/>
+                                    <fontDescription key="fontDescription" type="system" pointSize="14"/>
+                                    <color key="textColor" red="0.50196078430000002" green="0.50196078430000002" blue="0.50196078430000002" alpha="1" colorSpace="calibratedRGB"/>
+                                    <nil key="highlightedColor"/>
+                                </label>
+                                <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="heK-y6-eP6">
+                                    <rect key="frame" x="8" y="64.5" width="0.0" height="0.0"/>
+                                    <fontDescription key="fontDescription" type="system" weight="medium" pointSize="16"/>
+                                    <color key="textColor" white="0.0" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
+                                    <nil key="highlightedColor"/>
+                                </label>
+                                <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="nVs-pX-zDR">
+                                    <rect key="frame" x="114" y="22.5" width="1" height="42"/>
+                                    <color key="backgroundColor" red="0.94117647058823528" green="0.94117647058823528" blue="0.94117647058823528" alpha="1" colorSpace="calibratedRGB"/>
+                                    <constraints>
+                                        <constraint firstAttribute="height" constant="42" id="0BF-0B-lUU"/>
+                                        <constraint firstAttribute="width" constant="1" id="8eJ-qo-bIf"/>
+                                    </constraints>
+                                </view>
+                            </subviews>
+                            <color key="backgroundColor" systemColor="systemBackgroundColor"/>
+                            <constraints>
+                                <constraint firstItem="GgP-t5-aKS" firstAttribute="centerY" secondItem="UmP-RR-Inh" secondAttribute="centerY" id="7Z5-o0-hUQ"/>
+                                <constraint firstItem="heK-y6-eP6" firstAttribute="bottom" secondItem="GgP-t5-aKS" secondAttribute="bottom" id="Bye-r9-XpF"/>
+                                <constraint firstItem="nVs-pX-zDR" firstAttribute="centerY" secondItem="UmP-RR-Inh" secondAttribute="centerY" id="LRh-nH-Yw5"/>
+                                <constraint firstItem="FrQ-cc-TDs" firstAttribute="top" secondItem="GgP-t5-aKS" secondAttribute="top" id="PGN-2g-WHC"/>
+                                <constraint firstItem="GgP-t5-aKS" firstAttribute="leading" secondItem="UmP-RR-Inh" secondAttribute="leading" id="T0J-Bz-k6g"/>
+                                <constraint firstItem="heK-y6-eP6" firstAttribute="leading" secondItem="FrQ-cc-TDs" secondAttribute="leading" id="TwZ-Tz-u10"/>
+                                <constraint firstAttribute="trailing" secondItem="nVs-pX-zDR" secondAttribute="trailing" constant="7" id="hMT-4i-Pld"/>
+                                <constraint firstItem="FrQ-cc-TDs" firstAttribute="leading" secondItem="GgP-t5-aKS" secondAttribute="trailing" constant="6" id="k59-qV-eR4"/>
+                            </constraints>
+                        </view>
+                        <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="LUg-Pa-arv">
+                            <rect key="frame" x="134" y="93" width="122" height="87"/>
+                            <subviews>
+                                <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="7k0-1w-6hI">
+                                    <rect key="frame" x="8" y="22.5" width="0.0" height="0.0"/>
+                                    <fontDescription key="fontDescription" type="system" pointSize="14"/>
+                                    <color key="textColor" red="0.50196078430000002" green="0.50196078430000002" blue="0.50196078430000002" alpha="1" colorSpace="calibratedRGB"/>
+                                    <nil key="highlightedColor"/>
+                                </label>
+                                <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="ziD-lQ-OIJ">
+                                    <rect key="frame" x="8" y="64.5" width="0.0" height="0.0"/>
+                                    <fontDescription key="fontDescription" type="system" weight="medium" pointSize="16"/>
+                                    <color key="textColor" white="0.0" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
+                                    <nil key="highlightedColor"/>
+                                </label>
+                                <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="x6n-ok-imJ">
+                                    <rect key="frame" x="0.0" y="22.5" width="2" height="42"/>
+                                    <color key="backgroundColor" red="0.35686274509803922" green="0.5607843137254902" blue="0.97647058823529409" alpha="1" colorSpace="calibratedRGB"/>
+                                    <constraints>
+                                        <constraint firstAttribute="height" constant="42" id="CBJ-Ji-ByY"/>
+                                        <constraint firstAttribute="width" constant="2" id="p94-gy-njJ"/>
+                                    </constraints>
+                                    <userDefinedRuntimeAttributes>
+                                        <userDefinedRuntimeAttribute type="number" keyPath="cornerRadius">
+                                            <real key="value" value="1"/>
+                                        </userDefinedRuntimeAttribute>
+                                    </userDefinedRuntimeAttributes>
+                                </view>
+                                <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="8XV-Ny-tzS">
+                                    <rect key="frame" x="121" y="22.5" width="1" height="42"/>
+                                    <color key="backgroundColor" red="0.94117647059999998" green="0.94117647059999998" blue="0.94117647059999998" alpha="1" colorSpace="calibratedRGB"/>
+                                    <constraints>
+                                        <constraint firstAttribute="height" constant="42" id="YbB-CW-69O"/>
+                                        <constraint firstAttribute="width" constant="1" id="ZA7-Zd-waw"/>
+                                    </constraints>
+                                </view>
+                            </subviews>
+                            <color key="backgroundColor" systemColor="systemBackgroundColor"/>
+                            <constraints>
+                                <constraint firstItem="ziD-lQ-OIJ" firstAttribute="leading" secondItem="7k0-1w-6hI" secondAttribute="leading" id="8GP-no-xeP"/>
+                                <constraint firstItem="x6n-ok-imJ" firstAttribute="leading" secondItem="LUg-Pa-arv" secondAttribute="leading" id="Efl-74-vZM"/>
+                                <constraint firstAttribute="trailing" secondItem="8XV-Ny-tzS" secondAttribute="trailing" id="Hgz-Z3-rLP"/>
+                                <constraint firstItem="8XV-Ny-tzS" firstAttribute="centerY" secondItem="LUg-Pa-arv" secondAttribute="centerY" id="Q4E-Jg-ffW"/>
+                                <constraint firstItem="7k0-1w-6hI" firstAttribute="top" secondItem="x6n-ok-imJ" secondAttribute="top" id="Xj0-NC-Pkf"/>
+                                <constraint firstItem="x6n-ok-imJ" firstAttribute="centerY" secondItem="LUg-Pa-arv" secondAttribute="centerY" id="gLt-Bu-eiH"/>
+                                <constraint firstItem="7k0-1w-6hI" firstAttribute="leading" secondItem="x6n-ok-imJ" secondAttribute="trailing" constant="6" id="lu8-Nn-5QY"/>
+                                <constraint firstItem="ziD-lQ-OIJ" firstAttribute="bottom" secondItem="x6n-ok-imJ" secondAttribute="bottom" id="p9l-Y5-zRf"/>
+                            </constraints>
+                        </view>
+                        <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="BRE-yt-shx">
+                            <rect key="frame" x="256" y="93" width="122" height="87"/>
+                            <subviews>
+                                <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="Ayc-HX-TC5">
+                                    <rect key="frame" x="7" y="22.5" width="2" height="42"/>
+                                    <color key="backgroundColor" red="1" green="0.81568627450980391" blue="0.17254901960784313" alpha="1" colorSpace="calibratedRGB"/>
+                                    <constraints>
+                                        <constraint firstAttribute="width" constant="2" id="Csr-Vr-40n"/>
+                                        <constraint firstAttribute="height" constant="42" id="Rtf-Fg-u2C"/>
+                                    </constraints>
+                                    <userDefinedRuntimeAttributes>
+                                        <userDefinedRuntimeAttribute type="number" keyPath="cornerRadius">
+                                            <real key="value" value="1"/>
+                                        </userDefinedRuntimeAttribute>
+                                    </userDefinedRuntimeAttributes>
+                                </view>
+                                <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="uR6-Ku-io5">
+                                    <rect key="frame" x="15" y="22.5" width="0.0" height="0.0"/>
+                                    <fontDescription key="fontDescription" type="system" pointSize="14"/>
+                                    <color key="textColor" red="0.50196078430000002" green="0.50196078430000002" blue="0.50196078430000002" alpha="1" colorSpace="calibratedRGB"/>
+                                    <nil key="highlightedColor"/>
+                                </label>
+                                <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="MMc-mK-pXO">
+                                    <rect key="frame" x="15" y="64.5" width="0.0" height="0.0"/>
+                                    <fontDescription key="fontDescription" type="system" weight="medium" pointSize="16"/>
+                                    <color key="textColor" white="0.0" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
+                                    <nil key="highlightedColor"/>
+                                </label>
+                            </subviews>
+                            <color key="backgroundColor" systemColor="systemBackgroundColor"/>
+                            <constraints>
+                                <constraint firstItem="uR6-Ku-io5" firstAttribute="top" secondItem="Ayc-HX-TC5" secondAttribute="top" id="JFV-Kd-UEL"/>
+                                <constraint firstItem="MMc-mK-pXO" firstAttribute="bottom" secondItem="Ayc-HX-TC5" secondAttribute="bottom" id="bid-LC-3MT"/>
+                                <constraint firstItem="MMc-mK-pXO" firstAttribute="leading" secondItem="uR6-Ku-io5" secondAttribute="leading" id="fLQ-Ja-yc5"/>
+                                <constraint firstItem="Ayc-HX-TC5" firstAttribute="centerY" secondItem="BRE-yt-shx" secondAttribute="centerY" id="oVr-s2-z6r"/>
+                                <constraint firstItem="uR6-Ku-io5" firstAttribute="leading" secondItem="Ayc-HX-TC5" secondAttribute="trailing" constant="6" id="uLu-CE-cpS"/>
+                                <constraint firstItem="Ayc-HX-TC5" firstAttribute="leading" secondItem="BRE-yt-shx" secondAttribute="leading" constant="7" id="vBp-nC-9bA"/>
+                            </constraints>
+                        </view>
+                        <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="2021年" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="3ll-L4-iNd">
+                            <rect key="frame" x="318" y="22" width="46" height="20"/>
+                            <constraints>
+                                <constraint firstAttribute="height" constant="20" id="r8M-oS-Wh8"/>
+                            </constraints>
+                            <fontDescription key="fontDescription" type="system" pointSize="14"/>
+                            <nil key="textColor"/>
+                            <nil key="highlightedColor"/>
+                        </label>
+                        <imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="sort_down" translatesAutoresizingMaskIntoConstraints="NO" id="PDC-MZ-2mJ">
+                            <rect key="frame" x="370" y="29" width="10" height="6"/>
+                            <constraints>
+                                <constraint firstAttribute="width" constant="10" id="PxH-Fs-QmJ"/>
+                                <constraint firstAttribute="height" constant="6" id="hPe-xb-Nvy"/>
+                            </constraints>
+                        </imageView>
+                        <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="cEz-D3-A6K">
+                            <rect key="frame" x="318" y="15" width="62" height="34"/>
+                            <constraints>
+                                <constraint firstAttribute="height" constant="34" id="zUY-e0-43B"/>
+                            </constraints>
+                            <connections>
+                                <action selector="chooseDate:" destination="iN0-l3-epB" eventType="touchUpInside" id="A4v-3P-nHb"/>
+                            </connections>
+                        </button>
+                    </subviews>
+                    <color key="backgroundColor" systemColor="systemBackgroundColor"/>
+                    <constraints>
+                        <constraint firstItem="cEz-D3-A6K" firstAttribute="leading" secondItem="3ll-L4-iNd" secondAttribute="leading" id="1xg-zo-kcv"/>
+                        <constraint firstItem="BRE-yt-shx" firstAttribute="leading" secondItem="LUg-Pa-arv" secondAttribute="trailing" id="4Q1-D6-iGo"/>
+                        <constraint firstItem="GoB-5X-m0H" firstAttribute="leading" secondItem="swP-Ge-Ub2" secondAttribute="leading" constant="12" id="6uB-RR-dZf"/>
+                        <constraint firstItem="9Lz-0I-40s" firstAttribute="leading" secondItem="K4B-4c-Kgv" secondAttribute="leading" id="9BN-Uz-elV"/>
+                        <constraint firstItem="UmP-RR-Inh" firstAttribute="top" secondItem="GoB-5X-m0H" secondAttribute="bottom" id="CPh-SD-mGg"/>
+                        <constraint firstItem="K4B-4c-Kgv" firstAttribute="leading" secondItem="swP-Ge-Ub2" secondAttribute="leading" constant="12" id="CR2-jX-7J8"/>
+                        <constraint firstItem="PDC-MZ-2mJ" firstAttribute="trailing" secondItem="cEz-D3-A6K" secondAttribute="trailing" id="DPb-8x-vWx"/>
+                        <constraint firstAttribute="trailing" secondItem="BRE-yt-shx" secondAttribute="trailing" constant="12" id="Mh7-fS-96f"/>
+                        <constraint firstItem="K4B-4c-Kgv" firstAttribute="top" secondItem="swP-Ge-Ub2" secondAttribute="top" constant="18" id="Nst-Uk-Mg2"/>
+                        <constraint firstItem="LUg-Pa-arv" firstAttribute="leading" secondItem="UmP-RR-Inh" secondAttribute="trailing" id="OV8-ka-Ryy"/>
+                        <constraint firstItem="LUg-Pa-arv" firstAttribute="width" secondItem="UmP-RR-Inh" secondAttribute="width" id="Ogb-KX-rSa"/>
+                        <constraint firstItem="BRE-yt-shx" firstAttribute="top" secondItem="UmP-RR-Inh" secondAttribute="top" id="PZW-Ge-YqH"/>
+                        <constraint firstItem="BRE-yt-shx" firstAttribute="bottom" secondItem="UmP-RR-Inh" secondAttribute="bottom" id="Pqq-cC-7se"/>
+                        <constraint firstItem="GoB-5X-m0H" firstAttribute="top" secondItem="9Lz-0I-40s" secondAttribute="bottom" constant="10" id="QhX-V8-fD9"/>
+                        <constraint firstAttribute="trailing" secondItem="GoB-5X-m0H" secondAttribute="trailing" constant="12" id="RYc-eJ-WVI"/>
+                        <constraint firstItem="BRE-yt-shx" firstAttribute="width" secondItem="UmP-RR-Inh" secondAttribute="width" id="Sxi-HB-hxg"/>
+                        <constraint firstItem="LUg-Pa-arv" firstAttribute="top" secondItem="UmP-RR-Inh" secondAttribute="top" id="SzI-Wi-ZTd"/>
+                        <constraint firstItem="3ll-L4-iNd" firstAttribute="centerY" secondItem="K4B-4c-Kgv" secondAttribute="centerY" id="agE-qk-yoM"/>
+                        <constraint firstItem="LUg-Pa-arv" firstAttribute="bottom" secondItem="UmP-RR-Inh" secondAttribute="bottom" id="alq-BZ-eOS"/>
+                        <constraint firstItem="BRE-yt-shx" firstAttribute="height" secondItem="UmP-RR-Inh" secondAttribute="height" id="bSD-3r-81I"/>
+                        <constraint firstItem="UmP-RR-Inh" firstAttribute="leading" secondItem="swP-Ge-Ub2" secondAttribute="leading" constant="12" id="c8w-aK-CqY"/>
+                        <constraint firstAttribute="trailing" secondItem="PDC-MZ-2mJ" secondAttribute="trailing" constant="10" id="cvY-a7-Xop"/>
+                        <constraint firstItem="LUg-Pa-arv" firstAttribute="height" secondItem="UmP-RR-Inh" secondAttribute="height" id="d4f-P7-jav"/>
+                        <constraint firstItem="3ll-L4-iNd" firstAttribute="centerY" secondItem="cEz-D3-A6K" secondAttribute="centerY" id="mh6-70-duE"/>
+                        <constraint firstItem="9Lz-0I-40s" firstAttribute="top" secondItem="K4B-4c-Kgv" secondAttribute="bottom" constant="2" id="ocp-1G-Hvp"/>
+                        <constraint firstItem="PDC-MZ-2mJ" firstAttribute="leading" secondItem="3ll-L4-iNd" secondAttribute="trailing" constant="6" id="xBg-RT-eWk"/>
+                        <constraint firstItem="PDC-MZ-2mJ" firstAttribute="centerY" secondItem="3ll-L4-iNd" secondAttribute="centerY" id="xUD-ho-ZMM"/>
+                        <constraint firstAttribute="bottom" secondItem="UmP-RR-Inh" secondAttribute="bottom" id="xig-eV-D0T"/>
+                    </constraints>
+                </view>
+            </subviews>
+            <color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
+            <constraints>
+                <constraint firstItem="swP-Ge-Ub2" firstAttribute="top" secondItem="iN0-l3-epB" secondAttribute="top" constant="10" id="Cys-MR-RH3"/>
+                <constraint firstAttribute="trailing" secondItem="swP-Ge-Ub2" secondAttribute="trailing" constant="12" id="g7J-e3-BRn"/>
+                <constraint firstAttribute="bottom" secondItem="swP-Ge-Ub2" secondAttribute="bottom" id="lIC-uY-kLs"/>
+                <constraint firstItem="swP-Ge-Ub2" firstAttribute="leading" secondItem="iN0-l3-epB" secondAttribute="leading" constant="12" id="lfk-EZ-Uq6"/>
+            </constraints>
+            <nil key="simulatedBottomBarMetrics"/>
+            <freeformSimulatedSizeMetrics key="simulatedDestinationMetrics"/>
+            <connections>
+                <outlet property="arrowImage" destination="PDC-MZ-2mJ" id="sfU-hE-ybR"/>
+                <outlet property="bgView" destination="swP-Ge-Ub2" id="1eP-Yc-1qc"/>
+                <outlet property="dateLabel" destination="3ll-L4-iNd" id="IuX-rW-89W"/>
+                <outlet property="firstSalary" destination="heK-y6-eP6" id="17A-nD-wEg"/>
+                <outlet property="firstTitle" destination="FrQ-cc-TDs" id="3PH-cj-jKq"/>
+                <outlet property="firstView" destination="UmP-RR-Inh" id="WxT-cl-5rH"/>
+                <outlet property="secondSalary" destination="ziD-lQ-OIJ" id="ahU-zd-tar"/>
+                <outlet property="secondTitle" destination="7k0-1w-6hI" id="jN0-Vo-WGr"/>
+                <outlet property="secondView" destination="LUg-Pa-arv" id="CrK-xB-tRd"/>
+                <outlet property="thirdSalary" destination="MMc-mK-pXO" id="DBJ-z6-yA7"/>
+                <outlet property="thirdTitle" destination="uR6-Ku-io5" id="rAa-LW-rPh"/>
+                <outlet property="thirdView" destination="BRE-yt-shx" id="nPe-4o-d31"/>
+                <outlet property="totalSalary" destination="9Lz-0I-40s" id="xr2-YN-j8Y"/>
+            </connections>
+            <point key="canvasLocation" x="-170" y="-104"/>
+        </view>
+    </objects>
+    <resources>
+        <image name="sort_down" width="8" height="6"/>
+        <systemColor name="systemBackgroundColor">
+            <color white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
+        </systemColor>
+    </resources>
+</document>

+ 40 - 0
KulexiuForTeacher/KulexiuForTeacher/Module/Home/Income/View/IncomeHeaderView.h

@@ -0,0 +1,40 @@
+//
+//  IncomeHeaderView.h
+//  KulexiuForTeacher
+//
+//  Created by 王智 on 2022/4/26.
+//
+
+#import <UIKit/UIKit.h>
+
+typedef NS_ENUM(NSInteger, INCOME_ACTION) {
+    INCOME_ACTION_TIME,
+    INCOME_ACTION_TYPE,
+    INCOME_ACTION_WITHDRAW,
+};
+
+typedef void(^IncomeHeadAction)(INCOME_ACTION action);
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface IncomeHeaderView : UIView
+
+@property (weak, nonatomic) IBOutlet UILabel *moneyLabel;
+
+@property (weak, nonatomic) IBOutlet UILabel *timeLabel;
+
+@property (weak, nonatomic) IBOutlet UILabel *typeLabel;
+
+@property (nonatomic, assign) BOOL firstArrowUp;
+
+@property (nonatomic, assign) BOOL secondArrowUp;
+
++ (instancetype)shareInstance;
+
+- (void)headerActionCallback:(IncomeHeadAction)callback;
+
++ (CGFloat)getViewHeight;
+
+@end
+
+NS_ASSUME_NONNULL_END

+ 62 - 0
KulexiuForTeacher/KulexiuForTeacher/Module/Home/Income/View/IncomeHeaderView.m

@@ -0,0 +1,62 @@
+//
+//  IncomeHeaderView.m
+//  KulexiuForTeacher
+//
+//  Created by 王智 on 2022/4/26.
+//
+
+#import "IncomeHeaderView.h"
+
+@interface IncomeHeaderView ()
+
+@property (nonatomic, copy) IncomeHeadAction callback;
+
+@property (weak, nonatomic) IBOutlet UIImageView *firstArrow;
+
+
+@end
+
+@implementation IncomeHeaderView
+
++ (instancetype)shareInstance {
+    IncomeHeaderView *view = [[[NSBundle mainBundle] loadNibNamed:@"IncomeHeaderView" owner:nil options:nil] firstObject];
+    return view;
+}
+
+- (void)headerActionCallback:(IncomeHeadAction)callback {
+    if (callback) {
+        self.callback = callback;
+    }
+}
+
+- (IBAction)sortTime:(id)sender {
+    if (self.callback) {
+        self.callback(INCOME_ACTION_TIME);
+    }
+}
+
+- (IBAction)sortType:(id)sender {
+    if (self.callback) {
+        self.callback(INCOME_ACTION_TYPE);
+    }
+}
+
+- (IBAction)withdraw:(UIButton *)sender {
+    if (self.callback) {
+        self.callback(INCOME_ACTION_WITHDRAW);
+    }
+}
+
+
++ (CGFloat)getViewHeight {
+    return 210;
+}
+/*
+// Only override drawRect: if you perform custom drawing.
+// An empty implementation adversely affects performance during animation.
+- (void)drawRect:(CGRect)rect {
+    // Drawing code
+}
+*/
+
+@end

+ 179 - 0
KulexiuForTeacher/KulexiuForTeacher/Module/Home/Income/View/IncomeHeaderView.xib

@@ -0,0 +1,179 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="20037" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" colorMatched="YES">
+    <device id="retina6_1" orientation="portrait" appearance="light"/>
+    <dependencies>
+        <deployment identifier="iOS"/>
+        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="20020"/>
+        <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
+    </dependencies>
+    <objects>
+        <placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner"/>
+        <placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/>
+        <view contentMode="scaleToFill" id="iN0-l3-epB" customClass="IncomeHeaderView">
+            <rect key="frame" x="0.0" y="0.0" width="414" height="210"/>
+            <autoresizingMask key="autoresizingMask"/>
+            <subviews>
+                <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="yOX-e0-V5V">
+                    <rect key="frame" x="14" y="10" width="386" height="140"/>
+                    <subviews>
+                        <imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="income_headImage" translatesAutoresizingMaskIntoConstraints="NO" id="mHG-fq-Wy5">
+                            <rect key="frame" x="0.0" y="0.0" width="386" height="140"/>
+                            <userDefinedRuntimeAttributes>
+                                <userDefinedRuntimeAttribute type="number" keyPath="cornerRadius">
+                                    <real key="value" value="10"/>
+                                </userDefinedRuntimeAttribute>
+                            </userDefinedRuntimeAttributes>
+                        </imageView>
+                        <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="钱包余额(元)" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="A9z-Gf-azl">
+                            <rect key="frame" x="21" y="40" width="88" height="21"/>
+                            <constraints>
+                                <constraint firstAttribute="height" constant="21" id="IlA-x2-HSq"/>
+                            </constraints>
+                            <fontDescription key="fontDescription" type="system" pointSize="15"/>
+                            <color key="textColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
+                            <nil key="highlightedColor"/>
+                        </label>
+                        <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="c3Y-4p-OW4">
+                            <rect key="frame" x="21" y="64" width="0.0" height="36"/>
+                            <constraints>
+                                <constraint firstAttribute="height" constant="36" id="ZfL-MK-P9G"/>
+                            </constraints>
+                            <fontDescription key="fontDescription" type="boldSystem" pointSize="30"/>
+                            <color key="textColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
+                            <nil key="highlightedColor"/>
+                        </label>
+                        <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="309-Rv-ahg">
+                            <rect key="frame" x="284" y="54" width="80" height="32"/>
+                            <constraints>
+                                <constraint firstAttribute="width" constant="80" id="V4Z-4m-hxw"/>
+                                <constraint firstAttribute="height" constant="32" id="kVn-il-Msg"/>
+                            </constraints>
+                            <fontDescription key="fontDescription" type="system" pointSize="16"/>
+                            <inset key="imageEdgeInsets" minX="0.0" minY="0.0" maxX="2.2250738585072014e-308" maxY="0.0"/>
+                            <state key="normal" title="提现"/>
+                            <userDefinedRuntimeAttributes>
+                                <userDefinedRuntimeAttribute type="number" keyPath="cornerRadius">
+                                    <real key="value" value="16"/>
+                                </userDefinedRuntimeAttribute>
+                                <userDefinedRuntimeAttribute type="color" keyPath="borderColor">
+                                    <color key="value" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
+                                </userDefinedRuntimeAttribute>
+                                <userDefinedRuntimeAttribute type="number" keyPath="borderWidth">
+                                    <real key="value" value="1"/>
+                                </userDefinedRuntimeAttribute>
+                            </userDefinedRuntimeAttributes>
+                            <connections>
+                                <action selector="withdraw:" destination="iN0-l3-epB" eventType="touchUpInside" id="i15-DS-Yxj"/>
+                            </connections>
+                        </button>
+                    </subviews>
+                    <color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
+                    <constraints>
+                        <constraint firstItem="mHG-fq-Wy5" firstAttribute="leading" secondItem="yOX-e0-V5V" secondAttribute="leading" id="4F4-0D-3a2"/>
+                        <constraint firstAttribute="trailing" secondItem="mHG-fq-Wy5" secondAttribute="trailing" id="Elj-5R-UiH"/>
+                        <constraint firstItem="c3Y-4p-OW4" firstAttribute="top" secondItem="A9z-Gf-azl" secondAttribute="bottom" constant="3" id="Kpg-Wb-MYb"/>
+                        <constraint firstItem="A9z-Gf-azl" firstAttribute="top" secondItem="yOX-e0-V5V" secondAttribute="top" constant="40" id="TKN-7V-I7M"/>
+                        <constraint firstAttribute="bottom" secondItem="mHG-fq-Wy5" secondAttribute="bottom" id="Vox-L9-4Kr"/>
+                        <constraint firstAttribute="trailing" secondItem="309-Rv-ahg" secondAttribute="trailing" constant="22" id="WcX-9L-usi"/>
+                        <constraint firstItem="c3Y-4p-OW4" firstAttribute="leading" secondItem="A9z-Gf-azl" secondAttribute="leading" id="gPg-eD-6fz"/>
+                        <constraint firstItem="309-Rv-ahg" firstAttribute="centerY" secondItem="yOX-e0-V5V" secondAttribute="centerY" id="kPa-VT-d37"/>
+                        <constraint firstItem="A9z-Gf-azl" firstAttribute="leading" secondItem="yOX-e0-V5V" secondAttribute="leading" constant="21" id="l8I-Vs-jfQ"/>
+                        <constraint firstItem="mHG-fq-Wy5" firstAttribute="top" secondItem="yOX-e0-V5V" secondAttribute="top" id="qoF-GT-HhJ"/>
+                    </constraints>
+                </view>
+                <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="cmW-nR-OLL">
+                    <rect key="frame" x="14" y="160" width="386" height="50"/>
+                    <subviews>
+                        <imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="sort_down" translatesAutoresizingMaskIntoConstraints="NO" id="avr-eL-IPb">
+                            <rect key="frame" x="90" y="22" width="8" height="6"/>
+                            <constraints>
+                                <constraint firstAttribute="width" constant="8" id="9do-1Q-l6F"/>
+                                <constraint firstAttribute="height" constant="6" id="JKI-e6-4ay"/>
+                            </constraints>
+                        </imageView>
+                        <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="2022年9月" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="psQ-m0-LNj">
+                            <rect key="frame" x="14" y="12.5" width="71" height="25"/>
+                            <constraints>
+                                <constraint firstAttribute="height" constant="25" id="3Yg-Q4-Gth"/>
+                            </constraints>
+                            <fontDescription key="fontDescription" type="system" pointSize="14"/>
+                            <color key="textColor" red="0.20000000000000001" green="0.20000000000000001" blue="0.20000000000000001" alpha="1" colorSpace="calibratedRGB"/>
+                            <nil key="highlightedColor"/>
+                        </label>
+                        <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="GgG-JD-Cch">
+                            <rect key="frame" x="14" y="5" width="84" height="40"/>
+                            <constraints>
+                                <constraint firstAttribute="height" constant="40" id="fDX-7l-BZL"/>
+                            </constraints>
+                            <inset key="imageEdgeInsets" minX="0.0" minY="0.0" maxX="2.2250738585072014e-308" maxY="0.0"/>
+                            <connections>
+                                <action selector="sortTime:" destination="iN0-l3-epB" eventType="touchUpInside" id="jAO-DR-NUf"/>
+                            </connections>
+                        </button>
+                        <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="全部收入" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="VcX-wU-9TK">
+                            <rect key="frame" x="144" y="15" width="57.5" height="20"/>
+                            <constraints>
+                                <constraint firstAttribute="height" constant="20" id="S2h-R2-GoP"/>
+                            </constraints>
+                            <fontDescription key="fontDescription" type="system" pointSize="14"/>
+                            <color key="textColor" red="0.20000000000000001" green="0.20000000000000001" blue="0.20000000000000001" alpha="1" colorSpace="calibratedRGB"/>
+                            <nil key="highlightedColor"/>
+                        </label>
+                        <imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="sort_down" translatesAutoresizingMaskIntoConstraints="NO" id="9AQ-BX-bsj">
+                            <rect key="frame" x="207.5" y="22" width="8" height="6"/>
+                        </imageView>
+                        <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="aBX-lM-I1a">
+                            <rect key="frame" x="144" y="8" width="71.5" height="34"/>
+                            <inset key="imageEdgeInsets" minX="0.0" minY="0.0" maxX="2.2250738585072014e-308" maxY="0.0"/>
+                            <connections>
+                                <action selector="sortType:" destination="iN0-l3-epB" eventType="touchUpInside" id="v5J-Vt-mI6"/>
+                            </connections>
+                        </button>
+                    </subviews>
+                    <color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
+                    <constraints>
+                        <constraint firstItem="psQ-m0-LNj" firstAttribute="leading" secondItem="cmW-nR-OLL" secondAttribute="leading" constant="14" id="2a2-W4-lmG"/>
+                        <constraint firstItem="VcX-wU-9TK" firstAttribute="leading" secondItem="avr-eL-IPb" secondAttribute="trailing" constant="46" id="3fA-dC-xVq"/>
+                        <constraint firstItem="VcX-wU-9TK" firstAttribute="leading" secondItem="aBX-lM-I1a" secondAttribute="leading" id="DT1-xF-QPo"/>
+                        <constraint firstItem="VcX-wU-9TK" firstAttribute="centerY" secondItem="psQ-m0-LNj" secondAttribute="centerY" id="WCG-9h-Qlo"/>
+                        <constraint firstItem="9AQ-BX-bsj" firstAttribute="centerY" secondItem="VcX-wU-9TK" secondAttribute="centerY" id="aOj-tt-yFn"/>
+                        <constraint firstItem="avr-eL-IPb" firstAttribute="trailing" secondItem="GgG-JD-Cch" secondAttribute="trailing" id="adH-73-g4A"/>
+                        <constraint firstItem="9AQ-BX-bsj" firstAttribute="centerY" secondItem="aBX-lM-I1a" secondAttribute="centerY" id="cgG-5J-u7r"/>
+                        <constraint firstItem="avr-eL-IPb" firstAttribute="leading" secondItem="psQ-m0-LNj" secondAttribute="trailing" constant="5" id="h2d-Dt-zCl"/>
+                        <constraint firstItem="psQ-m0-LNj" firstAttribute="centerY" secondItem="cmW-nR-OLL" secondAttribute="centerY" id="hrU-Cn-bEm"/>
+                        <constraint firstItem="9AQ-BX-bsj" firstAttribute="leading" secondItem="VcX-wU-9TK" secondAttribute="trailing" constant="6" id="lOO-2D-4XB"/>
+                        <constraint firstItem="psQ-m0-LNj" firstAttribute="leading" secondItem="GgG-JD-Cch" secondAttribute="leading" id="mZx-ll-4ej"/>
+                        <constraint firstAttribute="height" constant="50" id="sVA-LU-ItF"/>
+                        <constraint firstItem="9AQ-BX-bsj" firstAttribute="trailing" secondItem="aBX-lM-I1a" secondAttribute="trailing" id="tgh-Om-9YB"/>
+                        <constraint firstItem="avr-eL-IPb" firstAttribute="centerY" secondItem="psQ-m0-LNj" secondAttribute="centerY" id="uzb-VW-UnQ"/>
+                        <constraint firstItem="psQ-m0-LNj" firstAttribute="centerY" secondItem="GgG-JD-Cch" secondAttribute="centerY" id="vta-PZ-AS8"/>
+                    </constraints>
+                </view>
+            </subviews>
+            <color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
+            <constraints>
+                <constraint firstAttribute="bottom" secondItem="cmW-nR-OLL" secondAttribute="bottom" id="7va-YO-akz"/>
+                <constraint firstItem="yOX-e0-V5V" firstAttribute="top" secondItem="iN0-l3-epB" secondAttribute="top" constant="10" id="Ab6-gw-gaw"/>
+                <constraint firstAttribute="trailing" secondItem="yOX-e0-V5V" secondAttribute="trailing" constant="14" id="Eru-8U-upk"/>
+                <constraint firstItem="yOX-e0-V5V" firstAttribute="leading" secondItem="iN0-l3-epB" secondAttribute="leading" constant="14" id="GqG-Y8-sNY"/>
+                <constraint firstItem="cmW-nR-OLL" firstAttribute="top" secondItem="yOX-e0-V5V" secondAttribute="bottom" constant="10" id="Pxp-hz-se9"/>
+                <constraint firstAttribute="trailing" secondItem="cmW-nR-OLL" secondAttribute="trailing" constant="14" id="Q2z-dP-9cF"/>
+                <constraint firstItem="cmW-nR-OLL" firstAttribute="leading" secondItem="iN0-l3-epB" secondAttribute="leading" constant="14" id="m5q-c0-MuA"/>
+            </constraints>
+            <nil key="simulatedTopBarMetrics"/>
+            <nil key="simulatedBottomBarMetrics"/>
+            <freeformSimulatedSizeMetrics key="simulatedDestinationMetrics"/>
+            <connections>
+                <outlet property="firstArrow" destination="avr-eL-IPb" id="zZQ-0F-8Dr"/>
+                <outlet property="moneyLabel" destination="c3Y-4p-OW4" id="CNg-r1-gFv"/>
+                <outlet property="timeLabel" destination="psQ-m0-LNj" id="k3K-yr-8Rp"/>
+                <outlet property="typeLabel" destination="VcX-wU-9TK" id="kl6-td-b9p"/>
+            </connections>
+            <point key="canvasLocation" x="131.8840579710145" y="-1.3392857142857142"/>
+        </view>
+    </objects>
+    <resources>
+        <image name="income_headImage" width="349" height="140"/>
+        <image name="sort_down" width="8" height="6"/>
+    </resources>
+</document>

+ 55 - 0
KulexiuForTeacher/KulexiuForTeacher/Module/Home/Income/View/KSMutilDatePicker.h

@@ -0,0 +1,55 @@
+//
+//  KSMutilDatePicker.h
+//  TeacherDaya
+//
+//  Created by Kyle on 2021/4/21.
+//  Copyright © 2021 DayaMusic. All rights reserved.
+//
+
+#import <UIKit/UIKit.h>
+
+typedef NS_ENUM(NSInteger, KSMUTILDATEPICKER_MODE) {
+    KSMUTILDATEPICKER_MODE_TIME = 1,       // HH:mm:ss
+    KSMUTILDATEPICKER_MODE_DAY = 2,        // yyyy-MM-dd
+    KSMUTILDATEPICKER_MODE_DAY_TIME = 3,   // yyyy-MM-dd HH:mm
+    KSMUTILDATEPICKER_MODE_FULLTIME = 4,   // yyyy/MM/dd HH:mm:ss
+    KSMUTILDATEPICKER_MODE_YEAR_MONTH = 5, // yyyy-MM
+    KSMUTILDATEPICKER_MODE_HOUR_MINUTE = 6, // HH:mm
+    KSMUTILDATEPICKER_MODE_YEAR,            // yyyy
+};
+
+NS_ASSUME_NONNULL_BEGIN
+
+typedef void(^SelectedDateBlock)(NSString *date, NSString *descDate);
+
+typedef void(^SelectedCancleBlock)(void);
+
+@interface KSMutilDatePicker : UIView
+
+// 对外可见的
+@property (nonatomic, strong) NSDate* date;       // 当前date
+
+/**
+ *  限制最大时间(默认2099)datePicker大于最大日期则滚动回最大限制日期
+ */
+@property (nonatomic, retain) NSDate *maxLimitDate;
+/**
+ *  限制最小时间(默认0) datePicker小于最小日期则滚动回最小限制日期
+ */
+@property (nonatomic, retain) NSDate *minLimitDate;
+
+
+/**
+ * 设置默认值为当前时间
+ */
+-(void)resetDateToCurrentDate;
+
+- (instancetype)initWithTitle:(NSString *)title date:(NSDate *)date maxLimitDate:(NSDate *)maxLimitDate minLimitDate:(NSDate *)minLimitDate selectDateBlock:(SelectedDateBlock)block cancleBolck:(SelectedCancleBlock)cancleBlock;
+
+- (instancetype)initWithTitle:(NSString *)title date:(NSDate *)date selectDateBlock:(SelectedDateBlock)block cancleBolck:(SelectedCancleBlock)cancleBlock;
+
+- (void)show;
+
+@end
+
+NS_ASSUME_NONNULL_END

+ 760 - 0
KulexiuForTeacher/KulexiuForTeacher/Module/Home/Income/View/KSMutilDatePicker.m

@@ -0,0 +1,760 @@
+//
+//  KSMutilDatePicker.m
+//  TeacherDaya
+//
+//  Created by Kyle on 2021/4/21.
+//  Copyright © 2021 DayaMusic. All rights reserved.
+//
+
+#import "KSMutilDatePicker.h"
+#import "NSDate+KSBaseDatePicker.h"
+#import "KSSegView.h"
+#import "NSDate+Extension.h"
+
+#define CONTENTVIEWHEIGHT (330)
+
+typedef NS_ENUM(NSInteger, PickViewTag) {
+    ePickerViewTagYear = 2012,
+    ePickerViewTagMonth,
+    ePickerViewTagDay,
+    ePickerViewTagHour,
+    ePickerViewTagMinute,
+    ePickerViewTagSecond
+};
+
+@interface KSMutilDatePicker ()<UIPickerViewDataSource,UIPickerViewDelegate,UIGestureRecognizerDelegate>
+
+@property (nonatomic, strong) UIView *timeView;
+
+@property (nonatomic, strong) UIView *backView;
+
+@property (nonatomic, strong) UIPickerView* yearPicker;     // 年
+@property (nonatomic, strong) UIPickerView* monthPicker;    // 月
+@property (nonatomic, strong) UIPickerView* dayPicker;      // 日
+@property (nonatomic, strong) UIPickerView* hourPicker;     // 时
+@property (nonatomic, strong) UIPickerView* minutePicker;   // 分
+@property (nonatomic, strong) UIPickerView* secondPicker;   // 秒
+
+@property (nonatomic, strong) NSMutableArray* yearArray;
+@property (nonatomic, strong) NSMutableArray* monthArray;
+@property (nonatomic, strong) NSMutableArray* dayArray;
+@property (nonatomic, strong) NSMutableArray* hourArray;
+@property (nonatomic, strong) NSMutableArray* minuteArray;
+@property (nonatomic, strong) NSMutableArray* secondArray;
+
+
+@property (nonatomic, assign) NSUInteger yearValue;
+@property (nonatomic, assign) NSUInteger monthValue;
+@property (nonatomic, assign) NSUInteger dayValue;
+@property (nonatomic, assign) NSUInteger hourValue;
+@property (nonatomic, assign) NSUInteger minuteValue;
+@property (nonatomic, assign) NSUInteger secondValue;
+
+@property (nonatomic, copy) SelectedDateBlock block;
+
+@property (nonatomic, strong) UIView  *contentView;
+
+@property (nonatomic, assign) KSMUTILDATEPICKER_MODE pickMode;
+
+@property (nonatomic, strong) KSSegView *segmentStrl;
+
+@property (nonatomic, copy) SelectedCancleBlock cancleBlock;
+/**
+ * create dataSource
+ */
+-(void)createDataSource;
+
+/**
+ * create month Arrays
+ */
+-(void)createMonthArrayWithYear:(NSInteger)yearInt month:(NSInteger)monthInt;
+
+@end
+
+@implementation KSMutilDatePicker
+
+
+- (KSSegView *)segmentStrl {
+    if (!_segmentStrl) {
+        _segmentStrl = [KSSegView shareInsatnce];
+        _segmentStrl.frame = CGRectMake((kScreenWidth - 170) / 2.0f, 70, 170, 28);
+        MJWeakSelf;
+        [_segmentStrl chooseCallback:^(NSInteger chooseIndex) {
+            [weakSelf changePage:chooseIndex];
+        }];
+    }
+    return _segmentStrl;
+}
+
+
+- (void)changePage:(NSInteger)chooseIndex {
+    if (chooseIndex == 0) {
+        self.pickMode = KSMUTILDATEPICKER_MODE_YEAR_MONTH;
+    }
+    else {
+        self.pickMode = KSMUTILDATEPICKER_MODE_YEAR;
+    }
+    [self initPickViews]; // 重新设置数据源
+}
+
+- (instancetype)init {
+    
+    if (self = [super init]) {
+    }
+    return self;
+}
+
+- (instancetype)initWithTitle:(NSString *)title date:(NSDate *)date maxLimitDate:(NSDate *)maxLimitDate minLimitDate:(NSDate *)minLimitDate selectDateBlock:(SelectedDateBlock)block cancleBolck:(SelectedCancleBlock)cancleBlock {
+    if (self = [super init]) {
+        [self configSourceWithTitle:title date:date maxLimitDate:maxLimitDate minLimitDate:minLimitDate selectDateBlock:block cancleBolck:cancleBlock];
+    }
+    return self;
+}
+
+- (instancetype)initWithTitle:(NSString *)title date:(NSDate *)date selectDateBlock:(SelectedDateBlock)block cancleBolck:(SelectedCancleBlock)cancleBlock {
+    if (self = [super init]) {
+        [self configSourceWithTitle:title date:date maxLimitDate:nil minLimitDate:nil selectDateBlock:block cancleBolck:cancleBlock];
+    }
+    return self;
+}
+
+- (void)configSourceWithTitle:(NSString *)title date:(NSDate *)date maxLimitDate:(NSDate *)maxLimitDate minLimitDate:(NSDate *)minLimitDate selectDateBlock:(SelectedDateBlock)block cancleBolck:(SelectedCancleBlock)cancleBlock {
+    
+    self.block = block;
+    self.cancleBlock = cancleBlock;
+    self.pickMode = KSMUTILDATEPICKER_MODE_YEAR;
+    self.frame = CGRectMake(0, 0, kScreen_Width, kScreen_Height);
+    self.backView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, kScreen_Width, kScreen_Height)];
+    self.backView.backgroundColor = HexRGBAlpha(0x363636, 0.55f);
+    
+    UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapAction:)];
+    tap.delegate = self;
+    [self.backView addGestureRecognizer:tap];
+    
+    self.timeView = [[UIView alloc] initWithFrame:CGRectMake(0, kScreen_Height, kScreen_Width, CONTENTVIEWHEIGHT)];
+    self.timeView.backgroundColor = [UIColor whiteColor];
+    self.timeView.layer.masksToBounds = YES;
+    if (@available(iOS 11.0, *)) {
+        self.timeView.layer.cornerRadius = 10;
+        self.timeView.layer.maskedCorners = kCALayerMinXMinYCorner | kCALayerMaxXMinYCorner; // 左上圆角
+    }
+    else {
+        UIBezierPath * path = [UIBezierPath bezierPathWithRoundedRect:self.timeView.bounds byRoundingCorners:UIRectCornerBottomLeft | UIRectCornerBottomRight cornerRadii:CGSizeMake(10, 10)];
+        CAShapeLayer *maskLayer = [[CAShapeLayer alloc] init];
+        maskLayer.frame = self.timeView.bounds;
+        maskLayer.path = path.CGPath;
+        self.timeView.layer.mask = maskLayer;
+    }
+    UIView *lineView = [[UIView alloc] initWithFrame:CGRectMake(0, 50, kScreenWidth, 1)];
+    lineView.backgroundColor = HexRGB(0xe5e5e5);
+    [self.timeView addSubview:lineView];
+    [self.timeView addSubview:self.segmentStrl];
+    
+    
+    /*创建显示View*/
+    _contentView = [[UIView alloc] initWithFrame:CGRectMake(0, 110, kScreen_Width, 216)];
+    _contentView.backgroundColor = [UIColor whiteColor];
+    [_timeView addSubview:_contentView];
+    
+    [self initPickViews];
+    
+    UIButton *cancelButton = [UIButton buttonWithType:UIButtonTypeRoundedRect];
+    UIButton *sureButton = [UIButton buttonWithType:UIButtonTypeRoundedRect];
+    [cancelButton setTitle:@"取消" forState:UIControlStateNormal];
+    [cancelButton setTitleColor:HexRGB(0x666666) forState:UIControlStateNormal];
+    [sureButton setTitle:@"确定" forState:UIControlStateNormal];
+    [sureButton setTitleColor:THEMECOLOR forState:UIControlStateNormal];
+    cancelButton.titleLabel.font = [UIFont systemFontOfSize:17.0f];
+    sureButton.titleLabel.font = [UIFont systemFontOfSize:17.0f];
+    
+    [cancelButton addTarget:self action:@selector(cancelButtonAction:) forControlEvents:UIControlEventTouchUpInside];
+    [sureButton addTarget:self action:@selector(doneButtonAction:) forControlEvents:UIControlEventTouchUpInside];
+    
+    
+    cancelButton.frame = CGRectMake(20, 10, 60, 30);
+    sureButton.frame = CGRectMake(kScreen_Width - 80, 10, 60, 30);
+    [self.timeView addSubview:cancelButton];
+    [self.timeView addSubview:sureButton];
+    
+    UILabel *titleLabel = [[UILabel alloc] init];
+    titleLabel.text = title;
+    titleLabel.frame = CGRectMake(CGRectGetMaxX(cancelButton.frame)+10, 10, CGRectGetMinX(sureButton.frame)-CGRectGetMaxX(cancelButton.frame)-20, 30);
+    titleLabel.textColor = HexRGB(0x333333);
+    titleLabel.font = [UIFont systemFontOfSize:15];
+    titleLabel.textAlignment = NSTextAlignmentCenter;
+    [self.timeView addSubview:titleLabel];
+    [self.backView addSubview:self.timeView];
+    [self addSubview:self.backView];
+    
+    //最大最小限制
+    if (!maxLimitDate) {
+        self.maxLimitDate = [NSDate dateWithString:@"2099-12-31 23:59" dateFormat:@"yyyy-MM-dd HH:mm"];
+    }
+    else {
+        self.maxLimitDate = maxLimitDate;
+    }
+    //最小限制
+    if (!minLimitDate) {
+        self.minLimitDate = [NSDate dateWithString:@"1970-01-01 00:00" dateFormat:@"yyyy-MM-dd HH:mm"];
+    }
+    else {
+        self.minLimitDate = minLimitDate;
+    }
+}
+
+- (void)initPickViews {
+    [self.contentView removeAllSubViews];
+    /*添加PickerView*/
+    NSMutableArray* tempArray1 = [[NSMutableArray alloc] initWithCapacity:0];
+    NSMutableArray* tempArray2 = [[NSMutableArray alloc] initWithCapacity:0];
+    NSMutableArray* tempArray3 = [[NSMutableArray alloc] initWithCapacity:0];
+    NSMutableArray* tempArray4 = [[NSMutableArray alloc] initWithCapacity:0];
+    NSMutableArray* tempArray5 = [[NSMutableArray alloc] initWithCapacity:0];
+    NSMutableArray* tempArray6 = [[NSMutableArray alloc] initWithCapacity:0];
+    
+    [self setYearArray:tempArray1];
+    [self setMonthArray:tempArray2];
+    [self setDayArray:tempArray3];
+    [self setHourArray:tempArray4];
+    [self setMinuteArray:tempArray5];
+    [self setSecondArray:tempArray6];
+    
+    // 更新数据源
+    [self createDataSource];
+    CGRect frame = _contentView.frame;
+    CGFloat height = CGRectGetHeight(frame);
+    if (_pickMode == KSMUTILDATEPICKER_MODE_TIME) {  // 时分秒
+        CGFloat width = CGRectGetWidth(frame) / 3.0f;
+        
+        UIPickerView* hourPickerTemp = [[UIPickerView alloc] initWithFrame:CGRectMake(0, 0, width, height)];
+        [self setHourPicker:hourPickerTemp];
+        [hourPickerTemp setValue:[UIColor blackColor] forKey:@"textColor"];
+        [self.hourPicker setFrame:CGRectMake(0, 0, width, height)];
+        
+        UIPickerView* minutesPickerTemp = [[UIPickerView alloc] initWithFrame:CGRectMake(width, 0, width, height)];
+        [self setMinutePicker:minutesPickerTemp];
+        [minutesPickerTemp setValue:[UIColor blackColor] forKey:@"textColor"];
+        [self.minutePicker setFrame:CGRectMake(width, 0, width, height)];
+        
+        UIPickerView* secondsPickerTemp = [[UIPickerView alloc] initWithFrame:CGRectMake(width * 2, 0, width, height)];
+        [self setSecondPicker:secondsPickerTemp];
+        [secondsPickerTemp setValue:[UIColor blackColor] forKey:@"textColor"];
+        [self.secondPicker setFrame:CGRectMake(width * 2, 0, width, height)];
+
+        [_contentView addSubview:self.hourPicker];
+        [_contentView addSubview:self.minutePicker];
+        [_contentView addSubview:self.secondPicker];
+        
+    }
+    else if (_pickMode == KSMUTILDATEPICKER_MODE_DAY) {  // 年 月 日
+        CGFloat width = CGRectGetWidth(frame) / 3.0f;
+        
+        UIPickerView* yearPickerTemp = [[UIPickerView alloc] initWithFrame:CGRectMake(0, 0, width, height)];
+        [self setYearPicker:yearPickerTemp];
+        [yearPickerTemp setValue:[UIColor blackColor] forKey:@"textColor"];
+        [self.yearPicker setFrame:CGRectMake(0, 0, width, height)];
+        
+        UIPickerView* monthPickerTemp = [[UIPickerView alloc] initWithFrame:CGRectMake(width, 0, width, height)];
+        [self setMonthPicker:monthPickerTemp];
+        [monthPickerTemp setValue:[UIColor blackColor] forKey:@"textColor"];
+        [self.monthPicker setFrame:CGRectMake(width, 0, width, height)];
+        
+        UIPickerView* dayPickerTemp = [[UIPickerView alloc] initWithFrame:CGRectMake(width * 2, 0, width, height)];
+        [self setDayPicker:dayPickerTemp];
+        [dayPickerTemp setValue:[UIColor blackColor] forKey:@"textColor"];
+        [self.dayPicker setFrame:CGRectMake(width * 2, 0, width, height)];
+        
+        [_contentView addSubview:self.yearPicker];
+        [_contentView addSubview:self.monthPicker];
+        [_contentView addSubview:self.dayPicker];
+    }
+    else if (_pickMode == KSMUTILDATEPICKER_MODE_DAY_TIME) {  // 年月日 时分
+        CGFloat width = CGRectGetWidth(frame) / 6.0f;
+        
+        UIPickerView* yearPickerTemp = [[UIPickerView alloc] initWithFrame:CGRectMake(0, 0, width * 2, height)];
+        [self setYearPicker:yearPickerTemp];
+        [yearPickerTemp setValue:[UIColor blackColor] forKey:@"textColor"];
+        [self.yearPicker setFrame:CGRectMake(0, 0, width * 2, height)];
+        
+        UIPickerView* monthPickerTemp = [[UIPickerView alloc] initWithFrame:CGRectMake(width * 2, 0, width, height)];
+        [self setMonthPicker:monthPickerTemp];
+        [monthPickerTemp setValue:[UIColor blackColor] forKey:@"textColor"];
+        [self.monthPicker setFrame:CGRectMake(width * 2, 0, width, height)];
+        
+        UIPickerView* dayPickerTemp = [[UIPickerView alloc] initWithFrame:CGRectMake(width * 3, 0, width, height)];
+        [self setDayPicker:dayPickerTemp];
+        [dayPickerTemp setValue:[UIColor blackColor] forKey:@"textColor"];
+        [self.dayPicker setFrame:CGRectMake(width * 3, 0, width, height)];
+        
+        UIPickerView* hourPickerTemp = [[UIPickerView alloc] initWithFrame:CGRectMake(width * 4, 0, width, height)];
+        [self setHourPicker:hourPickerTemp];
+        [hourPickerTemp setValue:[UIColor blackColor] forKey:@"textColor"];
+        [self.hourPicker setFrame:CGRectMake(width * 4, 0, width, height)];
+        
+        UIPickerView* minutesPickerTemp = [[UIPickerView alloc] initWithFrame:CGRectMake(width * 5, 0, width, height)];
+        [self setMinutePicker:minutesPickerTemp];
+        [minutesPickerTemp setValue:[UIColor blackColor] forKey:@"textColor"];
+        [self.minutePicker setFrame:CGRectMake(width * 5, 0, width, height)];
+        
+        [_contentView addSubview:self.yearPicker];
+        [_contentView addSubview:self.monthPicker];
+        [_contentView addSubview:self.dayPicker];
+        [_contentView addSubview:self.hourPicker];
+        [_contentView addSubview:self.minutePicker];
+    }
+    else if (_pickMode == KSMUTILDATEPICKER_MODE_FULLTIME) {  // 年月日 时分秒
+        CGFloat width = CGRectGetWidth(frame) / 7.0f;
+        
+        UIPickerView* yearPickerTemp = [[UIPickerView alloc] initWithFrame:CGRectMake(0, 0, width * 2, height)];
+        [self setYearPicker:yearPickerTemp];
+        [yearPickerTemp setValue:[UIColor blackColor] forKey:@"textColor"];
+        [self.yearPicker setFrame:CGRectMake(0, 0, width * 2, height)];
+        
+        UIPickerView* monthPickerTemp = [[UIPickerView alloc] initWithFrame:CGRectMake(width * 2, 0, width, height)];
+        [self setMonthPicker:monthPickerTemp];
+        [monthPickerTemp setValue:[UIColor blackColor] forKey:@"textColor"];
+        [self.monthPicker setFrame:CGRectMake(width * 2, 0, width, height)];
+        
+        UIPickerView* dayPickerTemp = [[UIPickerView alloc] initWithFrame:CGRectMake(width * 3, 0, width, height)];
+        [self setDayPicker:dayPickerTemp];
+        [dayPickerTemp setValue:[UIColor blackColor] forKey:@"textColor"];
+        [self.dayPicker setFrame:CGRectMake(width * 3, 0, width, height)];
+        
+        UIPickerView* hourPickerTemp = [[UIPickerView alloc] initWithFrame:CGRectMake(width * 4, 0, width, height)];
+        [self setHourPicker:hourPickerTemp];
+        [hourPickerTemp setValue:[UIColor blackColor] forKey:@"textColor"];
+        [self.hourPicker setFrame:CGRectMake(width * 4, 0, width, height)];
+        
+        UIPickerView* minutesPickerTemp = [[UIPickerView alloc] initWithFrame:CGRectMake(width * 5, 0, width, height)];
+        [self setMinutePicker:minutesPickerTemp];
+        [minutesPickerTemp setValue:[UIColor blackColor] forKey:@"textColor"];
+        [self.minutePicker setFrame:CGRectMake(width * 5, 0, width, height)];
+        
+        UIPickerView* secondsPickerTemp = [[UIPickerView alloc] initWithFrame:CGRectMake(width * 6, 0, width, height)];
+        [self setSecondPicker:secondsPickerTemp];
+        [secondsPickerTemp setValue:[UIColor blackColor] forKey:@"textColor"];
+        [self.secondPicker setFrame:CGRectMake(width * 6, 0, width, height)];
+        
+        [_contentView addSubview:self.yearPicker];
+        [_contentView addSubview:self.monthPicker];
+        [_contentView addSubview:self.dayPicker];
+        [_contentView addSubview:self.hourPicker];
+        [_contentView addSubview:self.minutePicker];
+        [_contentView addSubview:self.secondPicker];
+    }
+    else if (_pickMode == KSMUTILDATEPICKER_MODE_YEAR_MONTH) { // 年月
+        CGFloat width = CGRectGetWidth(frame) / 2.0f;
+        
+        UIPickerView* yearPickerTemp = [[UIPickerView alloc] initWithFrame:CGRectMake(0, 0, width, height)];
+        [self setYearPicker:yearPickerTemp];
+        [yearPickerTemp setValue:[UIColor blackColor] forKey:@"textColor"];
+        [self.yearPicker setFrame:CGRectMake(0, 0, width, height)];
+        
+        UIPickerView* monthPickerTemp = [[UIPickerView alloc] initWithFrame:CGRectMake(width, 0, width, height)];
+        [self setMonthPicker:monthPickerTemp];
+        [monthPickerTemp setValue:[UIColor blackColor] forKey:@"textColor"];
+        [self.monthPicker setFrame:CGRectMake(width, 0, width, height)];
+        
+        [_contentView addSubview:self.yearPicker];
+        [_contentView addSubview:self.monthPicker];
+    }
+    else if (_pickMode == KSMUTILDATEPICKER_MODE_HOUR_MINUTE) { // 时分
+        CGFloat width = CGRectGetWidth(frame) / 2.0f;
+        
+        UIPickerView* hourPickerTemp = [[UIPickerView alloc] initWithFrame:CGRectMake(0, 0, width, height)];
+        [self setHourPicker:hourPickerTemp];
+        [hourPickerTemp setValue:[UIColor blackColor] forKey:@"textColor"];
+        [self.hourPicker setFrame:CGRectMake(0, 0, width, height)];
+        
+        UIPickerView* minutesPickerTemp = [[UIPickerView alloc] initWithFrame:CGRectMake(width, 0, width, height)];
+        [self setMinutePicker:minutesPickerTemp];
+        [minutesPickerTemp setValue:[UIColor blackColor] forKey:@"textColor"];
+        [self.minutePicker setFrame:CGRectMake(width, 0, width, height)];
+
+        [_contentView addSubview:self.hourPicker];
+        [_contentView addSubview:self.minutePicker];
+    }
+    else if (_pickMode == KSMUTILDATEPICKER_MODE_YEAR) { // 年
+        CGFloat width = CGRectGetWidth(frame);
+        
+        UIPickerView* yearPickerTemp = [[UIPickerView alloc] initWithFrame:CGRectMake(0, 0, width, height)];
+        [self setYearPicker:yearPickerTemp];
+        [yearPickerTemp setValue:[UIColor blackColor] forKey:@"textColor"];
+        [self.yearPicker setFrame:CGRectMake(0, 0, width, height)];
+
+        [_contentView addSubview:self.yearPicker];
+    }
+    [self.yearPicker setDataSource:self];
+    [self.monthPicker setDataSource:self];
+    [self.dayPicker setDataSource:self];
+    [self.hourPicker setDataSource:self];
+    [self.minutePicker setDataSource:self];
+    [self.secondPicker setDataSource:self];
+    
+    [self.yearPicker setDelegate:self];
+    [self.monthPicker setDelegate:self];
+    [self.dayPicker setDelegate:self];
+    [self.hourPicker setDelegate:self];
+    [self.minutePicker setDelegate:self];
+    [self.secondPicker setDelegate:self];
+    
+    [self.yearPicker setTag:ePickerViewTagYear];
+    [self.monthPicker setTag:ePickerViewTagMonth];
+    [self.dayPicker setTag:ePickerViewTagDay];
+    [self.hourPicker setTag:ePickerViewTagHour];
+    [self.minutePicker setTag:ePickerViewTagMinute];
+    [self.secondPicker setTag:ePickerViewTagSecond];
+    
+    
+    [self.yearPicker setShowsSelectionIndicator:YES];
+    [self.monthPicker setShowsSelectionIndicator:YES];
+    [self.dayPicker setShowsSelectionIndicator:YES];
+    [self.hourPicker setShowsSelectionIndicator:YES];
+    [self.minutePicker setShowsSelectionIndicator:YES];
+    [self.secondPicker setShowsSelectionIndicator:YES];
+    
+    [self resetDateToCurrentDate];
+    
+}
+
+- (void)cancelButtonAction:(UIButton *)sender
+{
+    [UIView animateWithDuration:0.3f animations:^{
+        self.timeView.frame = CGRectMake(0, kScreen_Height,kScreen_Width, CONTENTVIEWHEIGHT);
+    } completion:^(BOOL finished) {
+        [self removeFromSuperview];
+    }];
+    if (self.cancleBlock) {
+        self.cancleBlock();
+    }
+}
+
+- (void)doneButtonAction:(UIButton *)sender {
+    
+    NSString *date;
+    NSString *desc;
+    switch (_pickMode) {
+        case KSMUTILDATEPICKER_MODE_TIME:
+        {
+            date = [NSString stringWithFormat:@"%02ld:%02ld:%02ld",_hourValue,_minuteValue,_secondValue];
+            desc = [NSString stringWithFormat:@"%02ld时%02ld分%02ld秒",_hourValue,_minuteValue,_secondValue];
+        }
+            break;
+         case KSMUTILDATEPICKER_MODE_DAY:
+        {
+            date = [NSString stringWithFormat:@"%ld-%02ld-%02ld",_yearValue,_monthValue,_dayValue];
+            desc = [NSString stringWithFormat:@"%ld年%02ld月%02ld日",_yearValue,_monthValue,_dayValue];
+        }
+            break;
+        case KSMUTILDATEPICKER_MODE_DAY_TIME:
+        {
+            date = [NSString stringWithFormat:@"%ld-%02ld-%02ld %02ld:%02ld",_yearValue,_monthValue,_dayValue,_hourValue,_minuteValue];
+            desc = [NSString stringWithFormat:@"%ld年%02ld月%02ld日 %02ld时%02ld分",_yearValue,_monthValue,_dayValue,_hourValue,_minuteValue];
+        }
+            break;
+        case KSMUTILDATEPICKER_MODE_FULLTIME:
+        {
+            date = [NSString stringWithFormat:@"%ld/%02ld/%02ld %02ld:%02ld:%02ld",_yearValue,_monthValue,_dayValue,_hourValue,_minuteValue,_secondValue];
+            desc = [NSString stringWithFormat:@"%ld年%02ld月%02ld日 %02ld时%02ld分%02ld秒",_yearValue,_monthValue,_dayValue,_hourValue,_minuteValue,_secondValue];
+        }
+            break;
+        case KSMUTILDATEPICKER_MODE_YEAR_MONTH:
+        {
+            date = [NSString stringWithFormat:@"%ld-%02ld",_yearValue,_monthValue];
+            desc = [NSString stringWithFormat:@"%ld年%02ld月",_yearValue,_monthValue];
+        }
+            break;
+        case KSMUTILDATEPICKER_MODE_HOUR_MINUTE:
+        {
+            date = [NSString stringWithFormat:@"%02ld:%02ld",_hourValue,_minuteValue];
+            desc = [NSString stringWithFormat:@"%02ld时%02ld分",_hourValue,_minuteValue];
+        }
+            break;
+        case KSMUTILDATEPICKER_MODE_YEAR:
+        {
+            date = [NSString stringWithFormat:@"%ld", _yearValue];
+            desc = [NSString stringWithFormat:@"%ld年", _yearValue];
+        }
+            break;
+        default:
+            break;
+    }
+    if (self.block) {
+        self.block(date,desc);
+    }
+    
+    
+    [UIView animateWithDuration:0.3 animations:^{
+        self.timeView.frame = CGRectMake(0, self.bounds.size.height, self.bounds.size.width, 230);
+    } completion:^(BOOL finished) {
+        [self removeFromSuperview];
+    }];
+}
+
+
+- (void)tapAction:(UITapGestureRecognizer *)tap
+{
+    if (self.cancleBlock) {
+        self.cancleBlock();
+    }
+    [UIView animateWithDuration:0.3f animations:^{
+        self.timeView.frame = CGRectMake(0, kScreen_Height,kScreen_Width, CONTENTVIEWHEIGHT);
+    } completion:^(BOOL finished) {
+        [self removeFromSuperview];
+    }];
+    
+}
+
+
+- (void)show
+{
+    UIWindow *window = [[[UIApplication sharedApplication] delegate ] window];
+    [window addSubview:self];
+    
+    [UIView animateWithDuration:0.3f animations:^{
+        self.timeView.frame = CGRectMake(0, kScreen_Height - CONTENTVIEWHEIGHT, kScreen_Width, CONTENTVIEWHEIGHT);
+    } completion:^(BOOL finished) {
+        nil;
+    }];
+    
+}
+
+#pragma mark - UIPickerViewDataSource
+- (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView{
+    return 1;
+}
+-(NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component{
+    if (ePickerViewTagYear == pickerView.tag) {
+        return [self.yearArray count];
+    }
+    
+    if (ePickerViewTagMonth == pickerView.tag) {
+        return [self.monthArray count];
+    }
+    
+    if (ePickerViewTagDay == pickerView.tag) {
+        return [self.dayArray count];
+    }
+    
+    if (ePickerViewTagHour == pickerView.tag) {
+        return [self.hourArray count];
+    }
+    
+    if (ePickerViewTagMinute == pickerView.tag) {
+        return [self.minuteArray count];
+    }
+    
+    if (ePickerViewTagSecond == pickerView.tag) {
+        return [self.secondArray count];
+    }
+    return 0;
+}
+
+#pragma makr - UIPickerViewDelegate
+- (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component{
+    if (ePickerViewTagYear == pickerView.tag) {
+        return [[self.yearArray objectAtIndex:row]stringByAppendingString:@"年"];
+    }
+    
+    if (ePickerViewTagMonth == pickerView.tag) {
+        return [[self.monthArray objectAtIndex:row] stringByAppendingString:@"月"];
+    }
+    
+    if (ePickerViewTagDay == pickerView.tag) {
+        return [[self.dayArray objectAtIndex:row] stringByAppendingString:@"日"];
+    }
+    
+    if (ePickerViewTagHour == pickerView.tag) {
+        return [[self.hourArray objectAtIndex:row] stringByAppendingString:@"时"];
+    }
+    
+    if (ePickerViewTagMinute == pickerView.tag) {
+        return [[self.minuteArray objectAtIndex:row] stringByAppendingString:@"分"];
+    }
+    
+    if (ePickerViewTagSecond == pickerView.tag) {
+        return [[self.secondArray objectAtIndex:row] stringByAppendingString:@"秒"];
+    }
+    return @"";
+}
+- (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component{
+    if (ePickerViewTagYear == pickerView.tag) {
+        self.yearValue = [[self.yearArray objectAtIndex:row] intValue];
+    } else if(ePickerViewTagMonth == pickerView.tag){
+        self.monthValue = [[self.monthArray objectAtIndex:row] intValue];
+    }else if(ePickerViewTagDay == pickerView.tag){
+        self.dayValue = [[self.dayArray objectAtIndex:row] intValue];
+    }else if(ePickerViewTagHour == pickerView.tag){
+        self.hourValue = [[self.hourArray objectAtIndex:row] intValue];
+    } else if(ePickerViewTagMinute == pickerView.tag){
+        self.minuteValue = [[self.minuteArray objectAtIndex:row] intValue];
+    } else if(ePickerViewTagSecond == pickerView.tag){
+        self.secondValue = [[self.secondArray objectAtIndex:row] intValue];
+    }
+    if (ePickerViewTagMonth == pickerView.tag || ePickerViewTagYear == pickerView.tag) {
+        [self createMonthArrayWithYear:self.yearValue month:self.monthValue];
+        [self.dayPicker reloadAllComponents];
+    }
+    // 判断是否在设置的区间中
+    NSString *chooseTime = [NSString stringWithFormat:@"%ld-%02ld-%02ld %02ld:%02ld:%02ld",_yearValue,_monthValue,_dayValue,_hourValue,_minuteValue,_secondValue];
+    
+    NSDate *chooseDate = [NSDate dateWithString:chooseTime dateFormat:@"yyyy-MM-dd HH:mm:ss"];
+    if ([chooseDate compare:self.minLimitDate] == NSOrderedAscending) {
+        chooseDate = self.minLimitDate;
+        [self resetDateToDate:chooseDate];
+    }
+    else if ([chooseDate compare:self.maxLimitDate] == NSOrderedDescending){
+        chooseDate = self.maxLimitDate;
+        [self resetDateToDate:chooseDate];
+    }
+}
+
+- (void)resetDateToDate:(NSDate *)scrollDate {
+    
+    [self.yearPicker selectRow:[self.yearArray count]-100 inComponent:0 animated:YES];
+    [self.monthPicker selectRow:[scrollDate getMonth]-1 inComponent:0 animated:YES];
+    [self.dayPicker selectRow:[scrollDate getDay]-1 inComponent:0 animated:YES];
+    
+    [self.hourPicker selectRow:[scrollDate getHours] inComponent:0 animated:YES];
+    [self.minutePicker selectRow:[scrollDate getMinutes] inComponent:0 animated:YES];
+    [self.secondPicker selectRow:[scrollDate getSeconds] inComponent:0 animated:YES];
+    
+    [self setYearValue:[scrollDate getYear]];
+    [self setMonthValue:[scrollDate getMonth]];
+    [self setDayValue:[scrollDate getDay]];
+    [self setHourValue:[scrollDate getHours]];
+    [self setMinuteValue:[scrollDate getMinutes]];
+    [self setSecondValue:[scrollDate getSeconds]];
+}
+
+
+#pragma mark - 年月日闰年=情况分析
+
+/**
+ 创建数据源
+ */
+- (void)createDataSource {
+    // 年
+    int yearInt = [[NSDate date] getYear];
+    [self.yearArray removeAllObjects];
+    for (int i = yearInt - 99; i <= yearInt + 99; i++) {
+        [self.yearArray addObject:[NSString stringWithFormat:@"%d", i]];
+    }
+    
+    // 月
+    [self.monthArray removeAllObjects];
+    for (int i = 1; i <= 12; i++) {
+        [self.monthArray addObject:[NSString stringWithFormat:@"%d", i]];
+    }
+    
+    NSInteger month = [[NSDate date] getMonth];
+    [self createMonthArrayWithYear:yearInt month:month];
+    
+    // 时
+    [self.hourArray removeAllObjects];
+    for (int i = 0; i < 24; i++) {
+        [self.hourArray addObject:[NSString stringWithFormat:@"%02d",i]];
+    }
+    // 分
+    [self.minuteArray removeAllObjects];
+    for(int i=0; i<60; i++){
+        [self.minuteArray addObject:[NSString stringWithFormat:@"%02d",i]];
+    }
+    // 秒
+    [self.secondArray removeAllObjects];
+    for(int i=0; i<60; i++){
+        [self.secondArray addObject:[NSString stringWithFormat:@"%02d",i]];
+    }
+}
+
+- (void)createMonthArrayWithYear:(NSInteger)yearInt month:(NSInteger)monthInt {
+    int endDate = 0;
+    
+    switch (monthInt) {
+        case 1:
+        case 3:
+        case 5:
+        case 7:
+        case 8:
+        case 10:
+        case 12:
+            endDate = 31;
+            break;
+        case 4:
+        case 6:
+        case 9:
+        case 11:
+            endDate = 30;
+            break;
+        case 2:
+        {   // 判断是否问闰年
+            if((yearInt % 4 == 0 && yearInt % 100 != 0) || yearInt % 400 == 0) {
+                endDate = 29;
+            }
+            else {
+                endDate = 28;
+            }
+        }
+            break;
+        default:
+            break;
+    }
+    
+    if (self.dayValue > endDate) {
+        self.dayValue = endDate;
+    }
+    
+    // 日
+    [self.dayArray removeAllObjects];
+    for (int i = 1; i <= endDate; i++) {
+        [self.dayArray addObject:[NSString stringWithFormat:@"%d",i]];
+    }
+    
+}
+
+
+#pragma mark resetDateTo current date
+- (void)resetDateToCurrentDate {
+    
+    NSDate* nowDate = [NSDate date];
+    [self.yearPicker selectRow:[self.yearArray count]-100 inComponent:0 animated:YES];
+    [self.monthPicker selectRow:[nowDate getMonth]-1 inComponent:0 animated:YES];
+    [self.dayPicker selectRow:[nowDate getDay]-1 inComponent:0 animated:YES];
+    
+    [self.hourPicker selectRow:[nowDate getHours] inComponent:0 animated:YES];
+    [self.minutePicker selectRow:[nowDate getMinutes] inComponent:0 animated:YES];
+    [self.secondPicker selectRow:[nowDate getSeconds] inComponent:0 animated:YES];
+    
+    [self setYearValue:[nowDate getYear]];
+    [self setMonthValue:[nowDate getMonth]];
+    [self setDayValue:[nowDate getDay]];
+    [self setHourValue:[nowDate getHours]];
+    [self setMinuteValue:[nowDate getMinutes]];
+    [self setSecondValue:[nowDate getSeconds]];
+}
+
+#pragma mark -pickerViewDelegate
+-(UIView *)pickerView:(UIPickerView *)pickerView viewForRow:(NSInteger)row forComponent:(NSInteger)component reusingView:(UIView *)view
+{
+    UILabel* pickerLabel = (UILabel*)view;
+    if (!pickerLabel){
+        pickerLabel = [[UILabel alloc] init];
+        pickerLabel.adjustsFontSizeToFitWidth = YES;
+        [pickerLabel setTextAlignment:NSTextAlignmentCenter];
+        [pickerLabel setBackgroundColor:[UIColor clearColor]];
+        [pickerLabel setFont:[UIFont systemFontOfSize:16]];
+        [pickerLabel setTextColor:[UIColor blackColor]];
+    }
+    // Fill the label text here
+    pickerLabel.text=[self pickerView:pickerView titleForRow:row forComponent:component];
+    return pickerLabel;
+}
+/*
+// Only override drawRect: if you perform custom drawing.
+// An empty implementation adversely affects performance during animation.
+- (void)drawRect:(CGRect)rect {
+    // Drawing code
+}
+*/
+
+@end

+ 23 - 0
KulexiuForTeacher/KulexiuForTeacher/Module/Home/Income/View/KSSegView.h

@@ -0,0 +1,23 @@
+//
+//  KSSegView.h
+//  TeacherDaya
+//
+//  Created by Kyle on 2021/4/21.
+//  Copyright © 2021 DayaMusic. All rights reserved.
+//
+
+#import <UIKit/UIKit.h>
+
+typedef void(^ChooseSegCallback)(NSInteger chooseIndex);
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface KSSegView : UIView
+
++ (instancetype)shareInsatnce;
+
+- (void)chooseCallback:(ChooseSegCallback)callback;
+
+@end
+
+NS_ASSUME_NONNULL_END

+ 73 - 0
KulexiuForTeacher/KulexiuForTeacher/Module/Home/Income/View/KSSegView.m

@@ -0,0 +1,73 @@
+//
+//  KSSegView.m
+//  TeacherDaya
+//
+//  Created by Kyle on 2021/4/21.
+//  Copyright © 2021 DayaMusic. All rights reserved.
+//
+
+#import "KSSegView.h"
+
+@interface KSSegView ()
+
+@property (weak, nonatomic) IBOutlet UIButton *firstButton;
+
+@property (weak, nonatomic) IBOutlet UIButton *secondButton;
+
+@property (nonatomic, copy) ChooseSegCallback callback;
+
+@property (nonatomic, assign) NSInteger chooseIndex;
+
+@end
+
+@implementation KSSegView
+
++ (instancetype)shareInsatnce {
+    KSSegView *view = [[[NSBundle mainBundle] loadNibNamed:@"KSSegView" owner:nil options:nil] firstObject];
+    return view;
+}
+
+- (void)chooseCallback:(ChooseSegCallback)callback {
+    if (callback) {
+        self.callback = callback;
+    }
+}
+- (IBAction)firstButtonAction:(UIButton *)sender {
+    self.chooseIndex = 0;
+    if (self.callback) {
+        self.callback(self.chooseIndex);
+    }
+}
+- (IBAction)secondButtonAction:(UIButton *)sender {
+    self.chooseIndex = 1;
+    if (self.callback) {
+        self.callback(self.chooseIndex);
+    }
+}
+
+- (void)setChooseIndex:(NSInteger)chooseIndex {
+    _chooseIndex = chooseIndex;
+    if (chooseIndex == 0) {
+        [self.firstButton setTitleColor:HexRGB(0xffffff) forState:UIControlStateNormal];
+        [self.firstButton setBackgroundColor:THEMECOLOR];
+        
+        [self.secondButton setTitleColor:THEMECOLOR forState:UIControlStateNormal];
+        [self.secondButton setBackgroundColor:HexRGB(0xffffff)];
+    }
+    else {
+        [self.firstButton setTitleColor:THEMECOLOR forState:UIControlStateNormal];
+        [self.firstButton setBackgroundColor:HexRGB(0xffffff)];
+        
+        [self.secondButton setTitleColor:HexRGB(0xffffff) forState:UIControlStateNormal];
+        [self.secondButton setBackgroundColor:THEMECOLOR];
+    }
+}
+/*
+// Only override drawRect: if you perform custom drawing.
+// An empty implementation adversely affects performance during animation.
+- (void)drawRect:(CGRect)rect {
+    // Drawing code
+}
+*/
+
+@end

+ 57 - 0
KulexiuForTeacher/KulexiuForTeacher/Module/Home/Income/View/KSSegView.xib

@@ -0,0 +1,57 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="17156" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" colorMatched="YES">
+    <device id="retina6_1" orientation="portrait" appearance="light"/>
+    <dependencies>
+        <deployment identifier="iOS"/>
+        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="17126"/>
+        <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
+    </dependencies>
+    <objects>
+        <placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner"/>
+        <placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/>
+        <view contentMode="scaleToFill" id="iN0-l3-epB" customClass="KSSegView">
+            <rect key="frame" x="0.0" y="0.0" width="414" height="52"/>
+            <autoresizingMask key="autoresizingMask"/>
+            <subviews>
+                <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="Q1u-Ux-NaI">
+                    <rect key="frame" x="1" y="1" width="206" height="50"/>
+                    <color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
+                    <fontDescription key="fontDescription" type="system" pointSize="14"/>
+                    <state key="normal" title="按月">
+                        <color key="titleColor" red="0.0039215686274509803" green="0.75686274509803919" blue="0.70980392156862748" alpha="1" colorSpace="calibratedRGB"/>
+                    </state>
+                    <connections>
+                        <action selector="firstButtonAction:" destination="iN0-l3-epB" eventType="touchUpInside" id="umk-YD-1Bk"/>
+                    </connections>
+                </button>
+                <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="cgH-gA-lwu">
+                    <rect key="frame" x="207" y="1" width="206" height="50"/>
+                    <color key="backgroundColor" red="0.0039215686269999999" green="0.75686274509999996" blue="0.70980392160000005" alpha="1" colorSpace="calibratedRGB"/>
+                    <fontDescription key="fontDescription" type="system" pointSize="14"/>
+                    <state key="normal" title="按年"/>
+                    <connections>
+                        <action selector="secondButtonAction:" destination="iN0-l3-epB" eventType="touchUpInside" id="Ttc-g9-DbL"/>
+                    </connections>
+                </button>
+            </subviews>
+            <color key="backgroundColor" red="0.0039215686269999999" green="0.75686274509999996" blue="0.70980392160000005" alpha="1" colorSpace="calibratedRGB"/>
+            <constraints>
+                <constraint firstItem="Q1u-Ux-NaI" firstAttribute="top" secondItem="iN0-l3-epB" secondAttribute="top" constant="1" id="8eJ-yu-mMD"/>
+                <constraint firstItem="cgH-gA-lwu" firstAttribute="top" secondItem="iN0-l3-epB" secondAttribute="top" constant="1" id="F5Y-sE-Dvn"/>
+                <constraint firstAttribute="bottom" secondItem="Q1u-Ux-NaI" secondAttribute="bottom" constant="1" id="HEk-GQ-2hT"/>
+                <constraint firstAttribute="trailing" secondItem="cgH-gA-lwu" secondAttribute="trailing" constant="1" id="XdH-Q5-5fU"/>
+                <constraint firstItem="Q1u-Ux-NaI" firstAttribute="leading" secondItem="iN0-l3-epB" secondAttribute="leading" constant="1" id="fqM-Rc-gBc"/>
+                <constraint firstItem="cgH-gA-lwu" firstAttribute="width" secondItem="Q1u-Ux-NaI" secondAttribute="width" id="j9d-Nn-hKh"/>
+                <constraint firstItem="cgH-gA-lwu" firstAttribute="leading" secondItem="Q1u-Ux-NaI" secondAttribute="trailing" id="pSD-ai-df5"/>
+                <constraint firstAttribute="bottom" secondItem="cgH-gA-lwu" secondAttribute="bottom" constant="1" id="xJu-IW-Zjz"/>
+            </constraints>
+            <nil key="simulatedBottomBarMetrics"/>
+            <freeformSimulatedSizeMetrics key="simulatedDestinationMetrics"/>
+            <connections>
+                <outlet property="firstButton" destination="Q1u-Ux-NaI" id="rzm-4T-zSO"/>
+                <outlet property="secondButton" destination="cgH-gA-lwu" id="XQF-2z-5BR"/>
+            </connections>
+            <point key="canvasLocation" x="121.73913043478262" y="-220.98214285714286"/>
+        </view>
+    </objects>
+</document>

+ 16 - 0
KulexiuForTeacher/KulexiuForTeacher/Module/Home/Income/View/MyIncomeListCell.h

@@ -0,0 +1,16 @@
+//
+//  MyIncomeListCell.h
+//  KulexiuForTeacher
+//
+//  Created by 王智 on 2022/4/26.
+//
+
+#import <UIKit/UIKit.h>
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface MyIncomeListCell : UITableViewCell
+
+@end
+
+NS_ASSUME_NONNULL_END

+ 24 - 0
KulexiuForTeacher/KulexiuForTeacher/Module/Home/Income/View/MyIncomeListCell.m

@@ -0,0 +1,24 @@
+//
+//  MyIncomeListCell.m
+//  KulexiuForTeacher
+//
+//  Created by 王智 on 2022/4/26.
+//
+
+#import "MyIncomeListCell.h"
+
+@implementation MyIncomeListCell
+
+- (void)awakeFromNib {
+    [super awakeFromNib];
+    // Initialization code
+    self.selectionStyle = UITableViewCellSelectionStyleNone;
+}
+
+- (void)setSelected:(BOOL)selected animated:(BOOL)animated {
+    [super setSelected:selected animated:animated];
+
+    // Configure the view for the selected state
+}
+
+@end

+ 108 - 0
KulexiuForTeacher/KulexiuForTeacher/Module/Home/Income/View/MyIncomeListCell.xib

@@ -0,0 +1,108 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="20037" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES">
+    <device id="retina6_1" orientation="portrait" appearance="light"/>
+    <dependencies>
+        <deployment identifier="iOS"/>
+        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="20020"/>
+        <capability name="Safe area layout guides" minToolsVersion="9.0"/>
+        <capability name="System colors in document resources" minToolsVersion="11.0"/>
+        <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
+    </dependencies>
+    <objects>
+        <placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner"/>
+        <placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/>
+        <tableViewCell contentMode="scaleToFill" selectionStyle="default" indentationWidth="10" rowHeight="125" id="KGk-i7-Jjw" customClass="MyIncomeListCell">
+            <rect key="frame" x="0.0" y="0.0" width="434" height="125"/>
+            <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
+            <tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" ambiguous="YES" tableViewCell="KGk-i7-Jjw" id="H2p-sc-9uM">
+                <rect key="frame" x="0.0" y="0.0" width="434" height="125"/>
+                <autoresizingMask key="autoresizingMask"/>
+                <subviews>
+                    <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="9xw-2T-8bx">
+                        <rect key="frame" x="14" y="40" width="406" height="82"/>
+                        <subviews>
+                            <imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="income_accompany" translatesAutoresizingMaskIntoConstraints="NO" id="2Jh-sq-z46">
+                                <rect key="frame" x="13" y="20" width="42" height="42"/>
+                                <constraints>
+                                    <constraint firstAttribute="height" constant="42" id="QGk-Dx-2B7"/>
+                                    <constraint firstAttribute="width" constant="42" id="d9d-VE-yZr"/>
+                                </constraints>
+                            </imageView>
+                            <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="李晓明" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="kS8-LB-QVW">
+                                <rect key="frame" x="68" y="16" width="49" height="28"/>
+                                <constraints>
+                                    <constraint firstAttribute="height" constant="28" id="Jyx-1N-Unw"/>
+                                </constraints>
+                                <fontDescription key="fontDescription" type="system" weight="medium" pointSize="16"/>
+                                <color key="textColor" red="0.10196078431372549" green="0.10196078431372549" blue="0.10196078431372549" alpha="1" colorSpace="calibratedRGB"/>
+                                <nil key="highlightedColor"/>
+                            </label>
+                            <imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="course_time" translatesAutoresizingMaskIntoConstraints="NO" id="egb-TU-4Uf">
+                                <rect key="frame" x="68" y="46" width="16" height="16"/>
+                            </imageView>
+                            <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="2021/09/17 14:00~14:25" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="WBq-ZP-ehT">
+                                <rect key="frame" x="91" y="46" width="147" height="16"/>
+                                <fontDescription key="fontDescription" type="system" pointSize="13"/>
+                                <color key="textColor" red="0.40000000000000002" green="0.40000000000000002" blue="0.40000000000000002" alpha="1" colorSpace="calibratedRGB"/>
+                                <nil key="highlightedColor"/>
+                            </label>
+                            <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" horizontalCompressionResistancePriority="751" text="¥20" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="uKk-JC-tKp">
+                                <rect key="frame" x="353" y="19" width="40" height="22"/>
+                                <fontDescription key="fontDescription" type="system" pointSize="18"/>
+                                <color key="textColor" red="1" green="0.30588235294117649" blue="0.098039215686274508" alpha="1" colorSpace="calibratedRGB"/>
+                                <nil key="highlightedColor"/>
+                            </label>
+                        </subviews>
+                        <color key="backgroundColor" systemColor="systemBackgroundColor"/>
+                        <constraints>
+                            <constraint firstItem="2Jh-sq-z46" firstAttribute="centerY" secondItem="9xw-2T-8bx" secondAttribute="centerY" id="6Vm-q3-kAN"/>
+                            <constraint firstItem="kS8-LB-QVW" firstAttribute="top" secondItem="2Jh-sq-z46" secondAttribute="top" constant="-4" id="ArD-lh-Qlr"/>
+                            <constraint firstItem="2Jh-sq-z46" firstAttribute="leading" secondItem="9xw-2T-8bx" secondAttribute="leading" constant="13" id="EM4-tu-kf9"/>
+                            <constraint firstItem="WBq-ZP-ehT" firstAttribute="centerY" secondItem="egb-TU-4Uf" secondAttribute="centerY" id="H7k-eb-q0Q"/>
+                            <constraint firstItem="uKk-JC-tKp" firstAttribute="leading" relation="greaterThanOrEqual" secondItem="kS8-LB-QVW" secondAttribute="trailing" constant="10" id="ICX-bv-cam"/>
+                            <constraint firstItem="uKk-JC-tKp" firstAttribute="centerY" secondItem="kS8-LB-QVW" secondAttribute="centerY" id="KXi-Kg-Wt4"/>
+                            <constraint firstItem="kS8-LB-QVW" firstAttribute="leading" secondItem="2Jh-sq-z46" secondAttribute="trailing" constant="13" id="Uco-ZZ-xvC"/>
+                            <constraint firstItem="egb-TU-4Uf" firstAttribute="top" secondItem="kS8-LB-QVW" secondAttribute="bottom" constant="2" id="Z6G-Yx-cU8"/>
+                            <constraint firstItem="egb-TU-4Uf" firstAttribute="leading" secondItem="2Jh-sq-z46" secondAttribute="trailing" constant="13" id="fTh-wL-C4t"/>
+                            <constraint firstItem="WBq-ZP-ehT" firstAttribute="leading" secondItem="egb-TU-4Uf" secondAttribute="trailing" constant="7" id="fhL-Ef-ut7"/>
+                            <constraint firstAttribute="height" constant="82" id="ihN-zK-wU0"/>
+                            <constraint firstAttribute="trailing" secondItem="uKk-JC-tKp" secondAttribute="trailing" constant="13" id="tLJ-oP-rzN"/>
+                        </constraints>
+                        <userDefinedRuntimeAttributes>
+                            <userDefinedRuntimeAttribute type="number" keyPath="cornerRadius">
+                                <real key="value" value="10"/>
+                            </userDefinedRuntimeAttribute>
+                        </userDefinedRuntimeAttributes>
+                    </view>
+                    <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="04-13" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="ODu-Td-Ufa">
+                        <rect key="frame" x="14" y="10" width="39" height="20"/>
+                        <constraints>
+                            <constraint firstAttribute="height" constant="20" id="h84-He-cJc"/>
+                        </constraints>
+                        <fontDescription key="fontDescription" type="system" pointSize="14"/>
+                        <color key="textColor" red="0.59999999999999998" green="0.59999999999999998" blue="0.59999999999999998" alpha="1" colorSpace="calibratedRGB"/>
+                        <nil key="highlightedColor"/>
+                    </label>
+                </subviews>
+                <constraints>
+                    <constraint firstAttribute="trailing" secondItem="9xw-2T-8bx" secondAttribute="trailing" constant="14" id="0hi-Rn-Rv2"/>
+                    <constraint firstAttribute="bottom" secondItem="9xw-2T-8bx" secondAttribute="bottom" id="Lih-ta-P9C"/>
+                    <constraint firstItem="ODu-Td-Ufa" firstAttribute="top" secondItem="H2p-sc-9uM" secondAttribute="top" constant="10" id="rBg-Wv-bKt"/>
+                    <constraint firstItem="9xw-2T-8bx" firstAttribute="leading" secondItem="H2p-sc-9uM" secondAttribute="leading" constant="14" id="sPD-21-XCZ"/>
+                    <constraint firstItem="ODu-Td-Ufa" firstAttribute="leading" secondItem="H2p-sc-9uM" secondAttribute="leading" constant="14" id="uj9-yq-Yrx"/>
+                    <constraint firstItem="9xw-2T-8bx" firstAttribute="top" secondItem="ODu-Td-Ufa" secondAttribute="bottom" constant="10" id="vn6-47-ha3"/>
+                </constraints>
+            </tableViewCellContentView>
+            <viewLayoutGuide key="safeArea" id="aW0-zy-SZf"/>
+            <color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
+            <point key="canvasLocation" x="159.42028985507247" y="100.11160714285714"/>
+        </tableViewCell>
+    </objects>
+    <resources>
+        <image name="course_time" width="16" height="16"/>
+        <image name="income_accompany" width="42" height="42"/>
+        <systemColor name="systemBackgroundColor">
+            <color white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
+        </systemColor>
+    </resources>
+</document>

+ 16 - 0
KulexiuForTeacher/KulexiuForTeacher/Module/Home/Income/WithDraw/Controller/CashRecordViewController.h

@@ -0,0 +1,16 @@
+//
+//  CashRecordViewController.h
+//  KulexiuForTeacher
+//
+//  Created by 王智 on 2022/4/26.
+//
+
+#import "KSBaseViewController.h"
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface CashRecordViewController : KSBaseViewController
+
+@end
+
+NS_ASSUME_NONNULL_END

+ 39 - 0
KulexiuForTeacher/KulexiuForTeacher/Module/Home/Income/WithDraw/Controller/CashRecordViewController.m

@@ -0,0 +1,39 @@
+//
+//  CashRecordViewController.m
+//  KulexiuForTeacher
+//
+//  Created by 王智 on 2022/4/26.
+//
+
+#import "CashRecordViewController.h"
+#import "CashRecordListCell.h"
+
+@interface CashRecordViewController ()<UITableViewDelegate,UITableViewDataSource>
+
+@property (nonatomic, strong) UITableView *tableView;
+
+@end
+
+
+
+@implementation CashRecordViewController
+
+- (void)viewDidLoad {
+    [super viewDidLoad];
+    // Do any additional setup after loading the view.
+    [self allocTitle:@"提现记录"];
+}
+
+
+
+/*
+#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

+ 16 - 0
KulexiuForTeacher/KulexiuForTeacher/Module/Home/Income/WithDraw/Controller/WithdrawViewController.h

@@ -0,0 +1,16 @@
+//
+//  WithdrawViewController.h
+//  KulexiuForTeacher
+//
+//  Created by 王智 on 2022/4/26.
+//
+
+#import "KSBaseViewController.h"
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface WithdrawViewController : KSBaseViewController
+
+@end
+
+NS_ASSUME_NONNULL_END

+ 43 - 0
KulexiuForTeacher/KulexiuForTeacher/Module/Home/Income/WithDraw/Controller/WithdrawViewController.m

@@ -0,0 +1,43 @@
+//
+//  WithdrawViewController.m
+//  KulexiuForTeacher
+//
+//  Created by 王智 on 2022/4/26.
+//
+
+#import "WithdrawViewController.h"
+#import "CashRecordViewController.h"
+
+@interface WithdrawViewController ()
+
+@end
+
+@implementation WithdrawViewController
+
+- (void)viewDidLoad {
+    [super viewDidLoad];
+    // Do any additional setup after loading the view.
+    [self allocTitle:@"提现"];
+    [self configUIDisplay];
+}
+
+- (void)configUIDisplay {
+    [self rightButtonTitle:@"提现记录"];
+}
+
+- (void)rightBtnClick {
+    CashRecordViewController *recordCtrl = [[CashRecordViewController alloc] init];
+    [self.navigationController pushViewController:recordCtrl animated:YES];
+}
+
+/*
+#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

+ 16 - 0
KulexiuForTeacher/KulexiuForTeacher/Module/Home/Income/WithDraw/View/CashRecordListCell.h

@@ -0,0 +1,16 @@
+//
+//  CashRecordListCell.h
+//  KulexiuForTeacher
+//
+//  Created by 王智 on 2022/4/26.
+//
+
+#import <UIKit/UIKit.h>
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface CashRecordListCell : UITableViewCell
+
+@end
+
+NS_ASSUME_NONNULL_END

+ 24 - 0
KulexiuForTeacher/KulexiuForTeacher/Module/Home/Income/WithDraw/View/CashRecordListCell.m

@@ -0,0 +1,24 @@
+//
+//  CashRecordListCell.m
+//  KulexiuForTeacher
+//
+//  Created by 王智 on 2022/4/26.
+//
+
+#import "CashRecordListCell.h"
+
+@implementation CashRecordListCell
+
+- (void)awakeFromNib {
+    [super awakeFromNib];
+    // Initialization code
+    self.selectionStyle = UITableViewCellSelectionStyleNone;
+}
+
+- (void)setSelected:(BOOL)selected animated:(BOOL)animated {
+    [super setSelected:selected animated:animated];
+
+    // Configure the view for the selected state
+}
+
+@end

+ 21 - 0
KulexiuForTeacher/KulexiuForTeacher/Module/Home/Income/WithDraw/View/CashRecordListCell.xib

@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="13142" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES">
+    <dependencies>
+        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="12042"/>
+        <capability name="Safe area layout guides" minToolsVersion="9.0"/>
+        <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
+    </dependencies>
+    <objects>
+        <placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner"/>
+        <placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/>
+        <tableViewCell contentMode="scaleToFill" selectionStyle="default" indentationWidth="10" id="KGk-i7-Jjw" customClass="CashRecordListCell">
+            <rect key="frame" x="0.0" y="0.0" width="320" height="44"/>
+            <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
+            <tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="KGk-i7-Jjw" id="H2p-sc-9uM">
+                <rect key="frame" x="0.0" y="0.0" width="320" height="43"/>
+                <autoresizingMask key="autoresizingMask"/>
+            </tableViewCellContentView>
+            <viewLayoutGuide key="safeArea" id="aW0-zy-SZf"/>
+        </tableViewCell>
+    </objects>
+</document>

+ 1 - 1
KulexiuForTeacher/KulexiuForTeacher/Module/Home/MyCourse/View/MyLessonBodyView.m

@@ -270,7 +270,7 @@
 - (NSString *)getTimeDisplay:(NSString *)chooseMonth {
     [self.dateFormatter setDateFormat:@"yyyy-MM"];
     NSDate *chooseDate = [self.dateFormatter dateFromString:chooseMonth];
-    [self.dateFormatter setDateFormat:@"yyyy年MM月"];
+    [self.dateFormatter setDateFormat:@"yyyy年M月"];
     NSString *displayTime = [self.dateFormatter stringFromDate:chooseDate];
     return displayTime;
 }

+ 74 - 2
KulexiuForTeacher/KulexiuForTeacher/Module/Home/View/HomeBodyView.xib

@@ -1,9 +1,9 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="19529" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" colorMatched="YES">
+<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="20037" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" colorMatched="YES">
     <device id="retina6_1" orientation="portrait" appearance="light"/>
     <dependencies>
         <deployment identifier="iOS"/>
-        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="19519"/>
+        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="20020"/>
         <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
     </dependencies>
     <objects>
@@ -68,6 +68,18 @@
                         <userDefinedRuntimeAttribute type="number" keyPath="cornerRadius">
                             <real key="value" value="10"/>
                         </userDefinedRuntimeAttribute>
+                        <userDefinedRuntimeAttribute type="size" keyPath="shadowOffset">
+                            <size key="value" width="0.0" height="2"/>
+                        </userDefinedRuntimeAttribute>
+                        <userDefinedRuntimeAttribute type="number" keyPath="shadowOpacity">
+                            <real key="value" value="1"/>
+                        </userDefinedRuntimeAttribute>
+                        <userDefinedRuntimeAttribute type="number" keyPath="shadowRadius">
+                            <real key="value" value="14"/>
+                        </userDefinedRuntimeAttribute>
+                        <userDefinedRuntimeAttribute type="color" keyPath="shadowUIColor">
+                            <color key="value" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
+                        </userDefinedRuntimeAttribute>
                     </userDefinedRuntimeAttributes>
                     <connections>
                         <outletCollection property="gestureRecognizers" destination="tvD-fE-luX" appends="YES" id="fmi-4x-0Ls"/>
@@ -127,6 +139,18 @@
                         <userDefinedRuntimeAttribute type="number" keyPath="cornerRadius">
                             <real key="value" value="10"/>
                         </userDefinedRuntimeAttribute>
+                        <userDefinedRuntimeAttribute type="size" keyPath="shadowOffset">
+                            <size key="value" width="0.0" height="2"/>
+                        </userDefinedRuntimeAttribute>
+                        <userDefinedRuntimeAttribute type="number" keyPath="shadowOpacity">
+                            <real key="value" value="1"/>
+                        </userDefinedRuntimeAttribute>
+                        <userDefinedRuntimeAttribute type="number" keyPath="shadowRadius">
+                            <real key="value" value="14"/>
+                        </userDefinedRuntimeAttribute>
+                        <userDefinedRuntimeAttribute type="color" keyPath="shadowUIColor">
+                            <color key="value" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
+                        </userDefinedRuntimeAttribute>
                     </userDefinedRuntimeAttributes>
                     <connections>
                         <outletCollection property="gestureRecognizers" destination="I8f-yB-Nwl" appends="YES" id="SfJ-sf-7qh"/>
@@ -187,6 +211,18 @@
                         <userDefinedRuntimeAttribute type="number" keyPath="cornerRadius">
                             <real key="value" value="10"/>
                         </userDefinedRuntimeAttribute>
+                        <userDefinedRuntimeAttribute type="size" keyPath="shadowOffset">
+                            <size key="value" width="0.0" height="2"/>
+                        </userDefinedRuntimeAttribute>
+                        <userDefinedRuntimeAttribute type="number" keyPath="shadowOpacity">
+                            <real key="value" value="1"/>
+                        </userDefinedRuntimeAttribute>
+                        <userDefinedRuntimeAttribute type="color" keyPath="shadowUIColor">
+                            <color key="value" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
+                        </userDefinedRuntimeAttribute>
+                        <userDefinedRuntimeAttribute type="number" keyPath="shadowRadius">
+                            <real key="value" value="14"/>
+                        </userDefinedRuntimeAttribute>
                     </userDefinedRuntimeAttributes>
                     <connections>
                         <outletCollection property="gestureRecognizers" destination="jyB-yw-R6D" appends="YES" id="lh4-Gy-BQY"/>
@@ -247,6 +283,18 @@
                         <userDefinedRuntimeAttribute type="number" keyPath="cornerRadius">
                             <real key="value" value="10"/>
                         </userDefinedRuntimeAttribute>
+                        <userDefinedRuntimeAttribute type="size" keyPath="shadowOffset">
+                            <size key="value" width="0.0" height="2"/>
+                        </userDefinedRuntimeAttribute>
+                        <userDefinedRuntimeAttribute type="number" keyPath="shadowOpacity">
+                            <real key="value" value="1"/>
+                        </userDefinedRuntimeAttribute>
+                        <userDefinedRuntimeAttribute type="number" keyPath="shadowRadius">
+                            <real key="value" value="14"/>
+                        </userDefinedRuntimeAttribute>
+                        <userDefinedRuntimeAttribute type="color" keyPath="shadowUIColor">
+                            <color key="value" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
+                        </userDefinedRuntimeAttribute>
                     </userDefinedRuntimeAttributes>
                     <connections>
                         <outletCollection property="gestureRecognizers" destination="EYk-rZ-zzc" appends="YES" id="149-8l-yhQ"/>
@@ -307,6 +355,18 @@
                         <userDefinedRuntimeAttribute type="number" keyPath="cornerRadius">
                             <real key="value" value="10"/>
                         </userDefinedRuntimeAttribute>
+                        <userDefinedRuntimeAttribute type="size" keyPath="shadowOffset">
+                            <size key="value" width="0.0" height="2"/>
+                        </userDefinedRuntimeAttribute>
+                        <userDefinedRuntimeAttribute type="number" keyPath="shadowOpacity">
+                            <real key="value" value="1"/>
+                        </userDefinedRuntimeAttribute>
+                        <userDefinedRuntimeAttribute type="color" keyPath="shadowUIColor">
+                            <color key="value" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
+                        </userDefinedRuntimeAttribute>
+                        <userDefinedRuntimeAttribute type="number" keyPath="shadowRadius">
+                            <real key="value" value="14"/>
+                        </userDefinedRuntimeAttribute>
                     </userDefinedRuntimeAttributes>
                     <connections>
                         <outletCollection property="gestureRecognizers" destination="ZXG-4s-RpH" appends="YES" id="n0n-0f-4TP"/>
@@ -367,6 +427,18 @@
                         <userDefinedRuntimeAttribute type="number" keyPath="cornerRadius">
                             <real key="value" value="10"/>
                         </userDefinedRuntimeAttribute>
+                        <userDefinedRuntimeAttribute type="size" keyPath="shadowOffset">
+                            <size key="value" width="0.0" height="2"/>
+                        </userDefinedRuntimeAttribute>
+                        <userDefinedRuntimeAttribute type="number" keyPath="shadowOpacity">
+                            <real key="value" value="1"/>
+                        </userDefinedRuntimeAttribute>
+                        <userDefinedRuntimeAttribute type="color" keyPath="shadowUIColor">
+                            <color key="value" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
+                        </userDefinedRuntimeAttribute>
+                        <userDefinedRuntimeAttribute type="number" keyPath="shadowRadius">
+                            <real key="value" value="14"/>
+                        </userDefinedRuntimeAttribute>
                     </userDefinedRuntimeAttributes>
                     <connections>
                         <outletCollection property="gestureRecognizers" destination="hGO-sJ-BbZ" appends="YES" id="QEh-Wr-3tm"/>

+ 7 - 1
KulexiuForTeacher/KulexiuForTeacher/Module/Home/View/HomeHeadView.m

@@ -73,7 +73,13 @@
     else {
         [self.userAvatal setImage:[UIImage imageNamed:USERDEFAULT_LOGO]];
     }
-    self.userName.text = [NSString returnNoNullStringWithString:infoMessage.username];
+    if ([NSString isEmptyString:infoMessage.username]) {
+        self.userName.text = [NSString stringWithFormat:@"游客%@",infoMessage.userId];
+    }
+    else {
+        self.userName.text = [NSString returnNoNullStringWithString:infoMessage.username];
+    }
+    
 }
 
 - (void)displayCount:(NSInteger)count inView:(UILabel *)descLabel {

+ 4 - 1
KulexiuForTeacher/KulexiuForTeacher/Module/Home/View/HomeHeadView.xib

@@ -224,7 +224,10 @@
                                     <color key="value" red="0.61568627450000002" green="0.61568627450000002" blue="0.61568627450000002" alpha="1" colorSpace="calibratedRGB"/>
                                 </userDefinedRuntimeAttribute>
                                 <userDefinedRuntimeAttribute type="number" keyPath="shadowOpacity">
-                                    <real key="value" value="5"/>
+                                    <real key="value" value="1"/>
+                                </userDefinedRuntimeAttribute>
+                                <userDefinedRuntimeAttribute type="number" keyPath="shadowRadius">
+                                    <real key="value" value="14"/>
                                 </userDefinedRuntimeAttribute>
                             </userDefinedRuntimeAttributes>
                             <connections>

+ 16 - 0
KulexiuForTeacher/KulexiuForTeacher/Module/Mine/BankCard/Controller/BandCardViewController.h

@@ -0,0 +1,16 @@
+//
+//  BandCardViewController.h
+//  KulexiuForTeacher
+//
+//  Created by 王智 on 2022/4/26.
+//
+
+#import "KSBaseViewController.h"
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface BandCardViewController : KSBaseViewController
+
+@end
+
+NS_ASSUME_NONNULL_END

+ 163 - 0
KulexiuForTeacher/KulexiuForTeacher/Module/Mine/BankCard/Controller/BandCardViewController.m

@@ -0,0 +1,163 @@
+//
+//  BandCardViewController.m
+//  KulexiuForTeacher
+//
+//  Created by 王智 on 2022/4/26.
+//
+
+#import "BandCardViewController.h"
+#import "CardBandBodyView.h"
+#import "BankNameModel.h"
+#import "KSChoosePicker.h"
+#import "CardBandResultViewController.h"
+
+@interface BandCardViewController ()
+
+@property (nonatomic, strong) CardBandBodyView *bodyView;
+
+@property (nonatomic, strong) NSMutableArray *bankNameArray;
+
+@property (nonatomic, assign) NSString *bankId;
+
+@end
+
+@implementation BandCardViewController
+
+- (void)viewDidLoad {
+    [super viewDidLoad];
+    // Do any additional setup after loading the view.
+    [self allocTitle:@"绑定银行卡"];
+    [self requestBankName];
+    [self configUI];
+}
+
+- (void)requestBankName {
+    [self showhud];
+    [KSNetworkingManager queryBankList:KS_POST success:^(NSDictionary * _Nonnull dic) {
+        [self removehub];
+        if ([dic integerValueForKey:@"code"] == 200 && [dic boolValueForKey:@"status"]) {
+            self.dataArray = [NSMutableArray array];
+            NSArray *sourceArray = [dic arrayValueForKey:@"data"];
+            NSMutableArray *nameArray = [NSMutableArray array];
+            for (NSDictionary *parm in sourceArray) {
+                BankNameModel *model = [[BankNameModel alloc] initWithDictionary:parm];
+                [nameArray addObject:model.paramValue];
+                [self.dataArray addObject:model];
+            }
+            self.bankNameArray = [NSMutableArray arrayWithArray:nameArray];
+        }
+        else {
+            [self MBPShow:MESSAGEKEY];
+        }
+    } faliure:^(NSError * _Nonnull error) {
+        [self removehub];
+    }];
+}
+
+- (void)configUI {
+    [self.scrollView addSubview:self.bodyView];
+    CGFloat height = [CardBandBodyView getViewHeight];
+    [self.bodyView mas_makeConstraints:^(MASConstraintMaker *make) {
+        make.top.mas_equalTo(self.scrollView.mas_top);
+        make.right.left.mas_equalTo(self.view);
+        make.height.mas_equalTo(height);
+    }];
+    if (height > KPortraitHeight - kNaviBarHeight) {
+        self.scrollView.contentSize = CGSizeMake(KPortraitWidth, height);
+        self.scrollView.scrollEnabled = YES;
+    }
+    else {
+        self.scrollView.scrollEnabled = NO;
+    }
+}
+
+
+#pragma mark ---lazying
+- (CardBandBodyView *)bodyView {
+    if (!_bodyView) {
+        _bodyView = [CardBandBodyView shareInstance];
+        MJWeakSelf;
+        [_bodyView sureCallback:^(BOOL isChooseBank) {
+            if (isChooseBank) {
+                [weakSelf chooseBank];
+            }
+            else {
+                [weakSelf sureAction];
+            }
+        }];
+    }
+    return _bodyView;
+}
+
+- (void)chooseBank {
+    if (self.dataArray.count == 0) {
+        [self MBPShow:@"无银行数据"];
+        return;
+    }
+    MJWeakSelf;
+    KSChoosePicker *picker = [[KSChoosePicker alloc] initWithTitle:@"请选择开户行" sourceData:self.bankNameArray chooseReturnWithBlock:^(NSString * _Nonnull returnValue, NSInteger chooseIndex) {
+        weakSelf.bodyView.bankNameField.text = returnValue;
+        BankNameModel *model = weakSelf.dataArray[chooseIndex];
+        weakSelf.bankId = model.internalBaseClassIdentifier;
+    }];
+    [picker showPicker];
+}
+
+
+- (void)sureAction {
+    if ([NSString isEmptyString:self.bodyView.nameField.text]) {
+        [self MBPShow:@"请输入持卡人姓名"];
+        return;
+    }
+    else if ([NSString isEmptyString:self.bodyView.idCardField.text]) {
+        [self MBPShow:@"请输入持卡人身份证号"];
+        return;
+    }
+    else if ([NSString isEmptyString:self.bankId]) {
+        [self MBPShow:@"请选择开户行"];
+        return;
+    }
+    else if ([NSString isEmptyString:self.bodyView.cardNoField.text]) {
+        [self MBPShow:@"请输入银行卡号"];
+        return;
+    }
+    else if ([NSString isEmptyString:self.bodyView.phoneField.text]) {
+        [self MBPShow:@"请输入银行预留手机号"];
+        return;
+    }
+    [self showhud];
+    [KSNetworkingManager bankCardRequest:KS_POST name:self.bodyView.nameField.text bankCard:self.bodyView.cardNoField.text bankName:self.bodyView.bankNameField.text bankCode:self.bankId idCardNo:self.bodyView.idCardField.text phone:self.bodyView.phoneField.text success:^(NSDictionary * _Nonnull dic) {
+        [self removehub];
+        if ([dic integerValueForKey:@"code"] == 200 && [dic boolValueForKey:@"status"]) {
+            [self showResultViewSuccess:YES];
+        }
+        else {
+            [self MBPShow:MESSAGEKEY];
+            [self showResultViewSuccess:NO];
+        }
+    } faliure:^(NSError * _Nonnull error) {
+        [self removehub];
+    }];
+}
+
+- (void)showResultViewSuccess:(BOOL)isSuccess {
+    CardBandResultViewController *ctrl = [[CardBandResultViewController alloc] init];
+    ctrl.isSuccess = isSuccess;
+    ctrl.displayImageName = isSuccess ? @"card_success" : @"card_failed";
+    ctrl.topTitle = isSuccess ? @"绑定成功" : @"绑定失败";
+    ctrl.descMessage = isSuccess ? @"恭喜您绑定成功!" : @"绑定失败";
+    ctrl.backControllerName = @"MyBankCardViewController";
+    [self.navigationController pushViewController:ctrl animated:YES];
+}
+
+/*
+#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

+ 26 - 0
KulexiuForTeacher/KulexiuForTeacher/Module/Mine/BankCard/Controller/CardBandResultViewController.h

@@ -0,0 +1,26 @@
+//
+//  CardBandResultViewController.h
+//  KulexiuForTeacher
+//
+//  Created by 王智 on 2022/4/27.
+//
+
+#import "KSBaseViewController.h"
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface CardBandResultViewController : KSBaseViewController
+
+@property (nonatomic, assign) BOOL isSuccess;
+
+@property (nonatomic, strong) NSString *displayImageName;
+
+@property (nonatomic, strong) NSString *topTitle;
+
+@property (nonatomic, strong) NSString *descMessage;
+
+@property (nonatomic, strong) NSString *backControllerName;
+
+@end
+
+NS_ASSUME_NONNULL_END

+ 72 - 0
KulexiuForTeacher/KulexiuForTeacher/Module/Mine/BankCard/Controller/CardBandResultViewController.m

@@ -0,0 +1,72 @@
+//
+//  CardBandResultViewController.m
+//  KulexiuForTeacher
+//
+//  Created by 王智 on 2022/4/27.
+//
+
+#import "CardBandResultViewController.h"
+#import "CardBindResultBodyView.h"
+
+@interface CardBandResultViewController ()
+
+@end
+
+@implementation CardBandResultViewController
+
+- (void)viewDidLoad {
+    [super viewDidLoad];
+    // Do any additional setup after loading the view.
+    [self allocTitle:self.topTitle];
+    [self configUI];
+}
+
+- (void)configUI {
+    [self.scrollView removeFromSuperview];
+    CardBindResultBodyView *bodyView = [CardBindResultBodyView shareIntance];
+    [bodyView.imageView setImage:[UIImage imageNamed:self.displayImageName]];
+    bodyView.descLabel.text = self.descMessage;
+    MJWeakSelf;
+    [bodyView sureCallback:^{
+        [weakSelf backAction];
+    }];
+    [self.view addSubview:bodyView];
+    [bodyView mas_makeConstraints:^(MASConstraintMaker *make) {
+        make.left.right.top.bottom.mas_equalTo(self.view);
+    }];
+}
+
+- (void)backAction {
+    if (self.isSuccess) {
+        // 返回上级页面
+        UIViewController *ctrl = nil;
+        for (UIViewController *controller in self.navigationController.viewControllers) {
+            if ([controller isKindOfClass:NSClassFromString(self.backControllerName)]) {
+                ctrl = controller;
+                break;
+            }
+        }
+        if (ctrl) {
+            [self.navigationController popToViewController:ctrl animated:YES];
+        }
+        else {
+            [self.navigationController popToRootViewControllerAnimated:YES];
+        }
+    }
+    else {
+        [self.navigationController popViewControllerAnimated:YES];
+    }
+}
+
+
+/*
+#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

+ 16 - 0
KulexiuForTeacher/KulexiuForTeacher/Module/Mine/BankCard/Controller/MyBankCardViewController.h

@@ -0,0 +1,16 @@
+//
+//  MyBankCardViewController.h
+//  KulexiuForTeacher
+//
+//  Created by 王智 on 2022/4/26.
+//
+
+#import "KSBaseViewController.h"
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface MyBankCardViewController : KSBaseViewController
+
+@end
+
+NS_ASSUME_NONNULL_END

+ 186 - 0
KulexiuForTeacher/KulexiuForTeacher/Module/Mine/BankCard/Controller/MyBankCardViewController.m

@@ -0,0 +1,186 @@
+//
+//  MyBankCardViewController.m
+//  KulexiuForTeacher
+//
+//  Created by 王智 on 2022/4/26.
+//
+
+#import "MyBankCardViewController.h"
+#import "KSButtonStatusView.h"
+#import "BandCardViewController.h"
+#import "CardDisplayView.h"
+#import "KSConfirmAlertView.h"
+#import "MyCardModel.h"
+#import "UnbindCardViewController.h"
+
+@interface MyBankCardViewController ()
+
+@property (nonatomic, assign) BOOL isEmpty;
+
+@property (nonatomic, strong) KSButtonStatusView *emptyView;
+
+@property (nonatomic, strong) CardDisplayView *cardView;
+
+@property (nonatomic, strong) MyCardModel *model;
+
+@property (nonatomic, assign) BOOL hasShowCardView;
+
+@end
+
+@implementation MyBankCardViewController
+
+- (void)viewDidLoad {
+    [super viewDidLoad];
+    // Do any additional setup after loading the view.
+    [self allocTitle:@"我的银行卡"];
+    
+}
+
+- (void)configUI {
+    self.hasShowCardView = YES;
+    [self.scrollView addSubview:self.cardView];
+    [self.cardView mas_makeConstraints:^(MASConstraintMaker *make) {
+        make.top.mas_equalTo(self.scrollView.mas_top);
+        make.right.left.mas_equalTo(self.view);
+        make.height.mas_equalTo(140);
+    }];
+}
+
+- (void)viewWillAppear:(BOOL)animated {
+    [super viewWillAppear:animated];
+    [self requestCardMessage];
+}
+
+- (void)requestCardMessage {
+    [KSNetworkingManager queryBankCardMessage:KS_POST success:^(NSDictionary * _Nonnull dic) {
+        [self removehub];
+        if ([dic integerValueForKey:@"code"] == 200 && [dic boolValueForKey:@"status"]) {
+            NSArray *sourceArray = [[dic dictionaryValueForKey:@"data"] arrayValueForKey:@"rows"];
+            if (sourceArray.count == 0) {
+                self.isEmpty = YES;
+            }
+            else {
+                NSDictionary *parm = [sourceArray firstObject];
+                self.model = [[MyCardModel alloc] initWithDictionary:parm];
+                [self.cardView configWithBankName:self.model.bankName cardNum:self.model.bankCard];
+                self.isEmpty = NO;
+            }
+            
+        }
+        else {
+            
+        }
+    } faliure:^(NSError * _Nonnull error) {
+        [self removehub];
+    }];
+}
+
+- (void)setIsEmpty:(BOOL)isEmpty {
+    _isEmpty = isEmpty;
+    if (isEmpty) {
+        [self showEmptyView];
+        self.cardView.hidden = YES;
+    }
+    else {
+        [self hideEmptyView];
+        if (self.hasShowCardView == NO) {
+            [self configUI];
+        }
+        self.cardView.hidden = NO;
+    }
+}
+
+
+- (void)showEmptyView {
+    if ([self.view.subviews containsObject:self.emptyView]) {
+        [self.view bringSubviewToFront:self.emptyView];
+    }
+    else {
+        [self.view addSubview:self.emptyView];
+        [self.emptyView mas_makeConstraints:^(MASConstraintMaker *make) {
+            make.edges.mas_equalTo(self.view);
+        }];
+    }
+    self.navigationItem.rightBarButtonItem = nil;
+}
+
+- (void)hideEmptyView {
+    if ([self.view.subviews containsObject:self.emptyView]) {
+        [self.emptyView removeFromSuperview];
+    }
+    [self rightButtonTitle:@"更换绑定卡"];
+    [self showCardView];
+}
+
+- (void)showCardView {
+    self.cardView.hidden = NO;
+}
+
+
+- (void)rightBtnClick {
+    [self cardBandAction];
+}
+
+- (KSButtonStatusView *)emptyView {
+    if (!_emptyView) {
+        _emptyView = [[KSButtonStatusView alloc] init];
+        _emptyView.imageName = @"empty_card";
+        [_emptyView setText:@"您暂未绑定银行卡绑定后可将收入提现"];
+        _emptyView.buttonTitle = @"立即绑卡";
+        MJWeakSelf;
+        [_emptyView buttonClickCallback:^{
+            [weakSelf cardBandAction];
+        }];
+    }
+    return _emptyView;
+}
+
+
+- (void)cardBandAction {
+    BandCardViewController *ctrl = [[BandCardViewController alloc] init];
+    [self.navigationController pushViewController:ctrl animated:YES];
+}
+
+#pragma mark ----- lazying
+- (CardDisplayView *)cardView {
+    if (!_cardView) {
+        _cardView = [CardDisplayView shareInstance];
+        MJWeakSelf;
+        [_cardView dismissCard:^{
+            [weakSelf dismissCardAlert];
+        }];
+    }
+    return _cardView;
+}
+
+- (void)dismissCardAlert {
+    KSConfirmAlertView *alert = [KSConfirmAlertView shareInstance];
+    alert.frame = self.view.bounds;
+    MJWeakSelf;
+    [alert opreationSure:^{
+        [weakSelf unbindCardAction];
+    } cancel:^{
+        
+    }];
+    [self.view addSubview:alert];
+}
+
+- (void)unbindCardAction {
+    UnbindCardViewController *ctrl = [[UnbindCardViewController alloc] init];
+    ctrl.bankName = self.model.bankName;
+    ctrl.cardId = [NSString stringWithFormat:@"%.0f",self.model.internalBaseClassIdentifier];
+    ctrl.cardNumber = self.model.bankCard;
+    [self.navigationController pushViewController:ctrl animated:YES];
+}
+
+/*
+#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

+ 22 - 0
KulexiuForTeacher/KulexiuForTeacher/Module/Mine/BankCard/Controller/UnbindCardViewController.h

@@ -0,0 +1,22 @@
+//
+//  UnbindCardViewController.h
+//  KulexiuForTeacher
+//
+//  Created by 王智 on 2022/4/27.
+//
+
+#import "KSBaseViewController.h"
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface UnbindCardViewController : KSBaseViewController
+
+@property (nonatomic, strong) NSString *cardId;
+
+@property (nonatomic, strong) NSString *cardNumber;
+
+@property (nonatomic, strong) NSString *bankName;
+
+@end
+
+NS_ASSUME_NONNULL_END

+ 96 - 0
KulexiuForTeacher/KulexiuForTeacher/Module/Mine/BankCard/Controller/UnbindCardViewController.m

@@ -0,0 +1,96 @@
+//
+//  UnbindCardViewController.m
+//  KulexiuForTeacher
+//
+//  Created by 王智 on 2022/4/27.
+//
+
+#import "UnbindCardViewController.h"
+#import "UnbindBodyView.h"
+#import "CardBandResultViewController.h"
+@interface UnbindCardViewController ()
+
+@property (nonatomic, copy) UnbindBodyView *bodyView;
+
+@end
+
+@implementation UnbindCardViewController
+
+- (void)viewDidLoad {
+    [super viewDidLoad];
+    // Do any additional setup after loading the view.
+    [self allocTitle:@"解绑银行卡"];
+    [self configUI];
+}
+
+- (void)configUI {
+    [self.scrollView removeFromSuperview];
+    _bodyView = [UnbindBodyView shareInstance];
+    _bodyView.cardName.text = self.bankName;
+    if (![NSString isEmptyString:self.cardNumber] && self.cardNumber.length > 4) {
+        self.bodyView.cardDesc.text = [NSString stringWithFormat:@"(%@*********%@)银行卡", [self.cardNumber substringWithRange:NSMakeRange(0, 4)], [self.cardNumber substringFromIndex:self.cardNumber.length - 4]];
+    }
+    else {
+        self.bodyView.cardDesc.text = @"银行卡";
+    }
+    
+    [self.view addSubview:_bodyView];
+    [_bodyView mas_makeConstraints:^(MASConstraintMaker *make) {
+        make.edges.mas_equalTo(self.view);
+    }];
+    MJWeakSelf;
+    [_bodyView unbindCallback:^{
+        [weakSelf judgeContent];
+    }];
+}
+
+- (void)judgeContent {
+    if ([NSString isEmptyString:self.bodyView.nameField.text]) {
+        [self MBPShow:@"请输入真实姓名"];
+        return;
+    }
+    else if ([NSString isEmptyString:self.bodyView.cardField.text]) {
+        [self MBPShow:@"请输入身份证号"];
+        return;
+    }
+    [self unbindSubmit];
+}
+
+
+- (void)unbindSubmit {
+    [self showhud];
+    [KSNetworkingManager unBindCardRequest:KS_POST cardId:self.cardId idCardNo:self.bodyView.cardField.text name:self.bodyView.nameField.text success:^(NSDictionary * _Nonnull dic) {
+        [self removehub];
+        if ([dic integerValueForKey:@"code"] == 200 && [dic boolValueForKey:@"status"]) {
+            [self showResultViewSuccess:YES];
+        }
+        else {
+            [self MBPShow:MESSAGEKEY];
+            [self showResultViewSuccess:NO];
+        }
+    } faliure:^(NSError * _Nonnull error) {
+        [self removehub];
+    }];
+}
+
+- (void)showResultViewSuccess:(BOOL)isSuccess {
+    CardBandResultViewController *ctrl = [[CardBandResultViewController alloc] init];
+    ctrl.isSuccess = isSuccess;
+    ctrl.displayImageName = isSuccess ? @"card_success" : @"card_failed";
+    ctrl.topTitle = isSuccess ? @"解绑成功" : @"解绑失败";
+    ctrl.descMessage = isSuccess ? @"解绑成功" : @"解绑失败";
+    ctrl.backControllerName = @"MyBankCardViewController";
+    [self.navigationController pushViewController:ctrl animated:YES];
+}
+
+/*
+#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

+ 27 - 0
KulexiuForTeacher/KulexiuForTeacher/Module/Mine/BankCard/Model/BankNameModel.h

@@ -0,0 +1,27 @@
+//
+//  BankNameModel.h
+//
+//  Created by Steven  on 2022/4/27
+//  Copyright (c) 2022 __MyCompanyName__. All rights reserved.
+//
+
+#import <Foundation/Foundation.h>
+
+
+
+@interface BankNameModel : NSObject <NSCoding, NSCopying>
+
+@property (nonatomic, strong) NSString *internalBaseClassDescription;
+@property (nonatomic, strong) NSString *createOn;
+@property (nonatomic, strong) NSString *internalBaseClassIdentifier;
+@property (nonatomic, assign) double modifyBy;
+@property (nonatomic, strong) NSString *group;
+@property (nonatomic, strong) NSString *paramValue;
+@property (nonatomic, strong) NSString *paramName;
+@property (nonatomic, strong) NSString *modifyOn;
+
++ (instancetype)modelObjectWithDictionary:(NSDictionary *)dict;
+- (instancetype)initWithDictionary:(NSDictionary *)dict;
+- (NSDictionary *)dictionaryRepresentation;
+
+@end

+ 148 - 0
KulexiuForTeacher/KulexiuForTeacher/Module/Mine/BankCard/Model/BankNameModel.m

@@ -0,0 +1,148 @@
+//
+//  BankNameModel.m
+//
+//  Created by Steven  on 2022/4/27
+//  Copyright (c) 2022 __MyCompanyName__. All rights reserved.
+//
+
+#import "BankNameModel.h"
+
+
+NSString *const kBankNameModelDescription = @"description";
+NSString *const kBankNameModelCreateOn = @"createOn";
+NSString *const kBankNameModelId = @"id";
+NSString *const kBankNameModelModifyBy = @"modifyBy";
+NSString *const kBankNameModelGroup = @"group";
+NSString *const kBankNameModelParamValue = @"paramValue";
+NSString *const kBankNameModelParamName = @"paramName";
+NSString *const kBankNameModelModifyOn = @"modifyOn";
+
+
+@interface BankNameModel ()
+
+- (id)objectOrNilForKey:(id)aKey fromDictionary:(NSDictionary *)dict;
+
+@end
+
+@implementation BankNameModel
+
+@synthesize internalBaseClassDescription = _internalBaseClassDescription;
+@synthesize createOn = _createOn;
+@synthesize internalBaseClassIdentifier = _internalBaseClassIdentifier;
+@synthesize modifyBy = _modifyBy;
+@synthesize group = _group;
+@synthesize paramValue = _paramValue;
+@synthesize paramName = _paramName;
+@synthesize modifyOn = _modifyOn;
+
+
++ (instancetype)modelObjectWithDictionary:(NSDictionary *)dict
+{
+    return [[self alloc] initWithDictionary:dict];
+}
+
+- (instancetype)initWithDictionary:(NSDictionary *)dict
+{
+    self = [super init];
+    
+    // This check serves to make sure that a non-NSDictionary object
+    // passed into the model class doesn't break the parsing.
+    if(self && [dict isKindOfClass:[NSDictionary class]]) {
+            self.internalBaseClassDescription = [self objectOrNilForKey:kBankNameModelDescription fromDictionary:dict];
+            self.createOn = [self objectOrNilForKey:kBankNameModelCreateOn fromDictionary:dict];
+            self.internalBaseClassIdentifier = [self objectOrNilForKey:kBankNameModelId fromDictionary:dict];
+            self.modifyBy = [[self objectOrNilForKey:kBankNameModelModifyBy fromDictionary:dict] doubleValue];
+            self.group = [self objectOrNilForKey:kBankNameModelGroup fromDictionary:dict];
+            self.paramValue = [self objectOrNilForKey:kBankNameModelParamValue fromDictionary:dict];
+            self.paramName = [self objectOrNilForKey:kBankNameModelParamName fromDictionary:dict];
+            self.modifyOn = [self objectOrNilForKey:kBankNameModelModifyOn fromDictionary:dict];
+
+    }
+    
+    return self;
+    
+}
+
+- (NSDictionary *)dictionaryRepresentation
+{
+    NSMutableDictionary *mutableDict = [NSMutableDictionary dictionary];
+    [mutableDict setValue:self.internalBaseClassDescription forKey:kBankNameModelDescription];
+    [mutableDict setValue:self.createOn forKey:kBankNameModelCreateOn];
+    [mutableDict setValue:self.internalBaseClassIdentifier forKey:kBankNameModelId];
+    [mutableDict setValue:[NSNumber numberWithDouble:self.modifyBy] forKey:kBankNameModelModifyBy];
+    [mutableDict setValue:self.group forKey:kBankNameModelGroup];
+    [mutableDict setValue:self.paramValue forKey:kBankNameModelParamValue];
+    [mutableDict setValue:self.paramName forKey:kBankNameModelParamName];
+    [mutableDict setValue:self.modifyOn forKey:kBankNameModelModifyOn];
+
+    return [NSDictionary dictionaryWithDictionary:mutableDict];
+}
+
+- (NSString *)description 
+{
+    return [NSString stringWithFormat:@"%@", [self dictionaryRepresentation]];
+}
+
+#pragma mark - Helper Method
+- (id)objectOrNilForKey:(id)aKey fromDictionary:(NSDictionary *)dict
+{
+    id object = [dict objectForKey:aKey];
+    if ([object isKindOfClass:[NSNumber class]]) {
+        NSNumber *number = object;
+        object = [number stringValue];
+    }
+    return [object isEqual:[NSNull null]] ? nil : object;
+}
+
+
+#pragma mark - NSCoding Methods
+
+- (id)initWithCoder:(NSCoder *)aDecoder
+{
+    self = [super init];
+
+    self.internalBaseClassDescription = [aDecoder decodeObjectForKey:kBankNameModelDescription];
+    self.createOn = [aDecoder decodeObjectForKey:kBankNameModelCreateOn];
+    self.internalBaseClassIdentifier = [aDecoder decodeObjectForKey:kBankNameModelId];
+    self.modifyBy = [aDecoder decodeDoubleForKey:kBankNameModelModifyBy];
+    self.group = [aDecoder decodeObjectForKey:kBankNameModelGroup];
+    self.paramValue = [aDecoder decodeObjectForKey:kBankNameModelParamValue];
+    self.paramName = [aDecoder decodeObjectForKey:kBankNameModelParamName];
+    self.modifyOn = [aDecoder decodeObjectForKey:kBankNameModelModifyOn];
+    return self;
+}
+
+- (void)encodeWithCoder:(NSCoder *)aCoder
+{
+
+    [aCoder encodeObject:_internalBaseClassDescription forKey:kBankNameModelDescription];
+    [aCoder encodeObject:_createOn forKey:kBankNameModelCreateOn];
+    [aCoder encodeObject:_internalBaseClassIdentifier forKey:kBankNameModelId];
+    [aCoder encodeDouble:_modifyBy forKey:kBankNameModelModifyBy];
+    [aCoder encodeObject:_group forKey:kBankNameModelGroup];
+    [aCoder encodeObject:_paramValue forKey:kBankNameModelParamValue];
+    [aCoder encodeObject:_paramName forKey:kBankNameModelParamName];
+    [aCoder encodeObject:_modifyOn forKey:kBankNameModelModifyOn];
+}
+
+- (id)copyWithZone:(NSZone *)zone
+{
+    BankNameModel *copy = [[BankNameModel alloc] init];
+    
+    if (copy) {
+
+        copy.internalBaseClassDescription = [self.internalBaseClassDescription copyWithZone:zone];
+        copy.createOn = [self.createOn copyWithZone:zone];
+        copy.internalBaseClassIdentifier = [self.internalBaseClassIdentifier copyWithZone:zone];
+        copy.modifyBy = self.modifyBy;
+        copy.group = [self.group copyWithZone:zone];
+        copy.paramValue = [self.paramValue copyWithZone:zone];
+        copy.paramName = [self.paramName copyWithZone:zone];
+        copy.modifyOn = [self.modifyOn copyWithZone:zone];
+    }
+    
+    return copy;
+}
+
+
+@end

+ 30 - 0
KulexiuForTeacher/KulexiuForTeacher/Module/Mine/BankCard/Model/MyCardModel.h

@@ -0,0 +1,30 @@
+//
+//  MyCardModel.h
+//
+//  Created by Steven  on 2022/4/27
+//  Copyright (c) 2022 __MyCompanyName__. All rights reserved.
+//
+
+#import <Foundation/Foundation.h>
+
+
+
+@interface MyCardModel : NSObject <NSCoding, NSCopying>
+
+@property (nonatomic, strong) NSString *userId;
+@property (nonatomic, strong) NSString *bankName;
+@property (nonatomic, assign) BOOL delFlag;
+@property (nonatomic, strong) NSString *bankCode;
+@property (nonatomic, assign) double internalBaseClassIdentifier;
+@property (nonatomic, strong) NSString *bankCard;
+@property (nonatomic, strong) NSString *phone;
+@property (nonatomic, strong) NSString *updateTime;
+@property (nonatomic, assign) BOOL defaultFlag;
+@property (nonatomic, strong) NSString *name;
+@property (nonatomic, strong) NSString *createTime;
+
++ (instancetype)modelObjectWithDictionary:(NSDictionary *)dict;
+- (instancetype)initWithDictionary:(NSDictionary *)dict;
+- (NSDictionary *)dictionaryRepresentation;
+
+@end

+ 169 - 0
KulexiuForTeacher/KulexiuForTeacher/Module/Mine/BankCard/Model/MyCardModel.m

@@ -0,0 +1,169 @@
+//
+//  MyCardModel.m
+//
+//  Created by Steven  on 2022/4/27
+//  Copyright (c) 2022 __MyCompanyName__. All rights reserved.
+//
+
+#import "MyCardModel.h"
+
+
+NSString *const kMyCardModelUserId = @"userId";
+NSString *const kMyCardModelBankName = @"bankName";
+NSString *const kMyCardModelDelFlag = @"delFlag";
+NSString *const kMyCardModelBankCode = @"bankCode";
+NSString *const kMyCardModelId = @"id";
+NSString *const kMyCardModelBankCard = @"bankCard";
+NSString *const kMyCardModelPhone = @"phone";
+NSString *const kMyCardModelUpdateTime = @"updateTime";
+NSString *const kMyCardModelDefaultFlag = @"defaultFlag";
+NSString *const kMyCardModelName = @"name";
+NSString *const kMyCardModelCreateTime = @"createTime";
+
+
+@interface MyCardModel ()
+
+- (id)objectOrNilForKey:(id)aKey fromDictionary:(NSDictionary *)dict;
+
+@end
+
+@implementation MyCardModel
+
+@synthesize userId = _userId;
+@synthesize bankName = _bankName;
+@synthesize delFlag = _delFlag;
+@synthesize bankCode = _bankCode;
+@synthesize internalBaseClassIdentifier = _internalBaseClassIdentifier;
+@synthesize bankCard = _bankCard;
+@synthesize phone = _phone;
+@synthesize updateTime = _updateTime;
+@synthesize defaultFlag = _defaultFlag;
+@synthesize name = _name;
+@synthesize createTime = _createTime;
+
+
++ (instancetype)modelObjectWithDictionary:(NSDictionary *)dict
+{
+    return [[self alloc] initWithDictionary:dict];
+}
+
+- (instancetype)initWithDictionary:(NSDictionary *)dict
+{
+    self = [super init];
+    
+    // This check serves to make sure that a non-NSDictionary object
+    // passed into the model class doesn't break the parsing.
+    if(self && [dict isKindOfClass:[NSDictionary class]]) {
+            self.userId = [self objectOrNilForKey:kMyCardModelUserId fromDictionary:dict];
+            self.bankName = [self objectOrNilForKey:kMyCardModelBankName fromDictionary:dict];
+            self.delFlag = [[self objectOrNilForKey:kMyCardModelDelFlag fromDictionary:dict] boolValue];
+            self.bankCode = [self objectOrNilForKey:kMyCardModelBankCode fromDictionary:dict];
+            self.internalBaseClassIdentifier = [[self objectOrNilForKey:kMyCardModelId fromDictionary:dict] doubleValue];
+            self.bankCard = [self objectOrNilForKey:kMyCardModelBankCard fromDictionary:dict];
+            self.phone = [self objectOrNilForKey:kMyCardModelPhone fromDictionary:dict];
+            self.updateTime = [self objectOrNilForKey:kMyCardModelUpdateTime fromDictionary:dict];
+            self.defaultFlag = [[self objectOrNilForKey:kMyCardModelDefaultFlag fromDictionary:dict] boolValue];
+            self.name = [self objectOrNilForKey:kMyCardModelName fromDictionary:dict];
+            self.createTime = [self objectOrNilForKey:kMyCardModelCreateTime fromDictionary:dict];
+
+    }
+    
+    return self;
+    
+}
+
+- (NSDictionary *)dictionaryRepresentation
+{
+    NSMutableDictionary *mutableDict = [NSMutableDictionary dictionary];
+    [mutableDict setValue:self.userId forKey:kMyCardModelUserId];
+    [mutableDict setValue:self.bankName forKey:kMyCardModelBankName];
+    [mutableDict setValue:[NSNumber numberWithBool:self.delFlag] forKey:kMyCardModelDelFlag];
+    [mutableDict setValue:self.bankCode forKey:kMyCardModelBankCode];
+    [mutableDict setValue:[NSNumber numberWithDouble:self.internalBaseClassIdentifier] forKey:kMyCardModelId];
+    [mutableDict setValue:self.bankCard forKey:kMyCardModelBankCard];
+    [mutableDict setValue:self.phone forKey:kMyCardModelPhone];
+    [mutableDict setValue:self.updateTime forKey:kMyCardModelUpdateTime];
+    [mutableDict setValue:[NSNumber numberWithBool:self.defaultFlag] forKey:kMyCardModelDefaultFlag];
+    [mutableDict setValue:self.name forKey:kMyCardModelName];
+    [mutableDict setValue:self.createTime forKey:kMyCardModelCreateTime];
+
+    return [NSDictionary dictionaryWithDictionary:mutableDict];
+}
+
+- (NSString *)description 
+{
+    return [NSString stringWithFormat:@"%@", [self dictionaryRepresentation]];
+}
+
+#pragma mark - Helper Method
+- (id)objectOrNilForKey:(id)aKey fromDictionary:(NSDictionary *)dict
+{
+    id object = [dict objectForKey:aKey];
+    if ([object isKindOfClass:[NSNumber class]]) {
+        NSNumber *number = object;
+        object = [number stringValue];
+    }
+    return [object isEqual:[NSNull null]] ? nil : object;
+}
+
+
+#pragma mark - NSCoding Methods
+
+- (id)initWithCoder:(NSCoder *)aDecoder
+{
+    self = [super init];
+
+    self.userId = [aDecoder decodeObjectForKey:kMyCardModelUserId];
+    self.bankName = [aDecoder decodeObjectForKey:kMyCardModelBankName];
+    self.delFlag = [aDecoder decodeBoolForKey:kMyCardModelDelFlag];
+    self.bankCode = [aDecoder decodeObjectForKey:kMyCardModelBankCode];
+    self.internalBaseClassIdentifier = [aDecoder decodeDoubleForKey:kMyCardModelId];
+    self.bankCard = [aDecoder decodeObjectForKey:kMyCardModelBankCard];
+    self.phone = [aDecoder decodeObjectForKey:kMyCardModelPhone];
+    self.updateTime = [aDecoder decodeObjectForKey:kMyCardModelUpdateTime];
+    self.defaultFlag = [aDecoder decodeBoolForKey:kMyCardModelDefaultFlag];
+    self.name = [aDecoder decodeObjectForKey:kMyCardModelName];
+    self.createTime = [aDecoder decodeObjectForKey:kMyCardModelCreateTime];
+    return self;
+}
+
+- (void)encodeWithCoder:(NSCoder *)aCoder
+{
+
+    [aCoder encodeObject:_userId forKey:kMyCardModelUserId];
+    [aCoder encodeObject:_bankName forKey:kMyCardModelBankName];
+    [aCoder encodeBool:_delFlag forKey:kMyCardModelDelFlag];
+    [aCoder encodeObject:_bankCode forKey:kMyCardModelBankCode];
+    [aCoder encodeDouble:_internalBaseClassIdentifier forKey:kMyCardModelId];
+    [aCoder encodeObject:_bankCard forKey:kMyCardModelBankCard];
+    [aCoder encodeObject:_phone forKey:kMyCardModelPhone];
+    [aCoder encodeObject:_updateTime forKey:kMyCardModelUpdateTime];
+    [aCoder encodeBool:_defaultFlag forKey:kMyCardModelDefaultFlag];
+    [aCoder encodeObject:_name forKey:kMyCardModelName];
+    [aCoder encodeObject:_createTime forKey:kMyCardModelCreateTime];
+}
+
+- (id)copyWithZone:(NSZone *)zone
+{
+    MyCardModel *copy = [[MyCardModel alloc] init];
+    
+    if (copy) {
+
+        copy.userId = [self.userId copyWithZone:zone];
+        copy.bankName = [self.bankName copyWithZone:zone];
+        copy.delFlag = self.delFlag;
+        copy.bankCode = [self.bankCode copyWithZone:zone];
+        copy.internalBaseClassIdentifier = self.internalBaseClassIdentifier;
+        copy.bankCard = [self.bankCard copyWithZone:zone];
+        copy.phone = [self.phone copyWithZone:zone];
+        copy.updateTime = [self.updateTime copyWithZone:zone];
+        copy.defaultFlag = self.defaultFlag;
+        copy.name = [self.name copyWithZone:zone];
+        copy.createTime = [self.createTime copyWithZone:zone];
+    }
+    
+    return copy;
+}
+
+
+@end

+ 34 - 0
KulexiuForTeacher/KulexiuForTeacher/Module/Mine/BankCard/View/CardBandBodyView.h

@@ -0,0 +1,34 @@
+//
+//  CardBandBodyView.h
+//  KulexiuForTeacher
+//
+//  Created by 王智 on 2022/4/26.
+//
+
+#import <UIKit/UIKit.h>
+
+typedef void(^BankCardSureCallback)(BOOL isChooseBank);
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface CardBandBodyView : UIView
+
+@property (weak, nonatomic) IBOutlet UITextField *nameField;
+
+@property (weak, nonatomic) IBOutlet UITextField *idCardField;
+
+@property (weak, nonatomic) IBOutlet UITextField *bankNameField;
+
+@property (weak, nonatomic) IBOutlet UITextField *cardNoField;
+
+@property (weak, nonatomic) IBOutlet UITextField *phoneField;
+
++ (instancetype)shareInstance;
+
+- (void)sureCallback:(BankCardSureCallback)callback;
+
++ (CGFloat)getViewHeight;
+
+@end
+
+NS_ASSUME_NONNULL_END

+ 88 - 0
KulexiuForTeacher/KulexiuForTeacher/Module/Mine/BankCard/View/CardBandBodyView.m

@@ -0,0 +1,88 @@
+//
+//  CardBandBodyView.m
+//  KulexiuForTeacher
+//
+//  Created by 王智 on 2022/4/26.
+//
+
+#import "CardBandBodyView.h"
+
+@interface CardBandBodyView ()<UITextFieldDelegate>
+
+@property (nonatomic, copy) BankCardSureCallback callback;
+
+@end
+
+@implementation CardBandBodyView
+
+- (void)awakeFromNib {
+    [super awakeFromNib];
+    self.nameField.delegate = self;
+    self.idCardField.delegate = self;
+    self.cardNoField.delegate = self;
+    self.phoneField.delegate = self;
+}
+
++ (instancetype)shareInstance {
+    CardBandBodyView *view = [[[NSBundle mainBundle] loadNibNamed:@"CardBandBodyView" owner:nil options:nil] firstObject];
+    return view;
+}
+
+- (void)sureCallback:(BankCardSureCallback)callback {
+    if (callback) {
+        self.callback = callback;
+    }
+}
+
+- (IBAction)chooseBank:(id)sender {
+    if (self.callback) {
+        self.callback(YES);
+    }
+}
+
+- (IBAction)sureAction:(id)sender {
+    if (self.callback) {
+        self.callback(NO);
+    }
+}
++ (CGFloat)getViewHeight {
+    return 550.0f;
+}
+
+#pragma mark ---- text field delegate
+- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {
+    if ([string isEqualToString:@"\n"]) {
+        [self endEditing:YES];
+        return YES;
+    }
+    if ([string isEqualToString:@""]) {
+        return YES;
+    }
+    // 输入控制
+    NSString *newString = [textField.text stringByReplacingCharactersInRange:range withString:string];
+    if (textField == self.idCardField) {
+        if (newString.length > 18) {
+            return NO;
+        }
+    }
+    else if (textField == self.cardNoField) {
+        if (newString.length > 16) {
+            return NO;
+        }
+    }
+    else if (textField == self.phoneField) {
+        if (newString.length > 11) {
+            return NO;
+        }
+    }
+    return YES;
+}
+/*
+// Only override drawRect: if you perform custom drawing.
+// An empty implementation adversely affects performance during animation.
+- (void)drawRect:(CGRect)rect {
+    // Drawing code
+}
+*/
+
+@end

+ 346 - 0
KulexiuForTeacher/KulexiuForTeacher/Module/Mine/BankCard/View/CardBandBodyView.xib

@@ -0,0 +1,346 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="20037" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" colorMatched="YES">
+    <device id="retina6_1" orientation="portrait" appearance="light"/>
+    <dependencies>
+        <deployment identifier="iOS"/>
+        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="20020"/>
+        <capability name="System colors in document resources" minToolsVersion="11.0"/>
+        <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
+    </dependencies>
+    <objects>
+        <placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner"/>
+        <placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/>
+        <view contentMode="scaleToFill" id="iN0-l3-epB" customClass="CardBandBodyView">
+            <rect key="frame" x="0.0" y="0.0" width="414" height="550"/>
+            <autoresizingMask key="autoresizingMask"/>
+            <subviews>
+                <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="lu4-LH-SyJ">
+                    <rect key="frame" x="14" y="10" width="386" height="452"/>
+                    <subviews>
+                        <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="cWD-mJ-KYY">
+                            <rect key="frame" x="0.0" y="25" width="386" height="70"/>
+                            <subviews>
+                                <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="*" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="olg-X6-m1I">
+                                    <rect key="frame" x="21" y="4" width="8" height="21"/>
+                                    <fontDescription key="fontDescription" type="system" weight="medium" pointSize="17"/>
+                                    <color key="textColor" red="1" green="0.30588235294117649" blue="0.098039215686274508" alpha="1" colorSpace="calibratedRGB"/>
+                                    <nil key="highlightedColor"/>
+                                </label>
+                                <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="持卡人姓名" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="1ve-P8-JDs">
+                                    <rect key="frame" x="29" y="0.0" width="87" height="24"/>
+                                    <constraints>
+                                        <constraint firstAttribute="height" constant="24" id="IYc-uN-xRw"/>
+                                    </constraints>
+                                    <fontDescription key="fontDescription" type="system" weight="medium" pointSize="17"/>
+                                    <nil key="textColor"/>
+                                    <nil key="highlightedColor"/>
+                                </label>
+                                <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="588-x8-O9b">
+                                    <rect key="frame" x="20" y="69" width="345" height="1"/>
+                                    <color key="backgroundColor" red="0.92156862745098034" green="0.92156862745098034" blue="0.92156862745098034" alpha="1" colorSpace="calibratedRGB"/>
+                                    <constraints>
+                                        <constraint firstAttribute="height" constant="1" id="9bA-NY-Ykr"/>
+                                    </constraints>
+                                </view>
+                                <textField opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="left" contentVerticalAlignment="center" placeholder="请输入您的姓名" textAlignment="natural" minimumFontSize="17" translatesAutoresizingMaskIntoConstraints="NO" id="ixt-ug-Oem">
+                                    <rect key="frame" x="21" y="30" width="345" height="39"/>
+                                    <fontDescription key="fontDescription" type="system" pointSize="16"/>
+                                    <textInputTraits key="textInputTraits" enablesReturnKeyAutomatically="YES"/>
+                                </textField>
+                            </subviews>
+                            <color key="backgroundColor" systemColor="systemBackgroundColor"/>
+                            <constraints>
+                                <constraint firstItem="ixt-ug-Oem" firstAttribute="top" secondItem="olg-X6-m1I" secondAttribute="bottom" constant="5" id="3VE-jZ-jR5"/>
+                                <constraint firstAttribute="trailing" secondItem="ixt-ug-Oem" secondAttribute="trailing" constant="20" id="Ken-fs-f4g"/>
+                                <constraint firstItem="1ve-P8-JDs" firstAttribute="leading" secondItem="olg-X6-m1I" secondAttribute="trailing" id="Tmi-PP-yau"/>
+                                <constraint firstAttribute="bottom" secondItem="588-x8-O9b" secondAttribute="bottom" id="Z8b-jw-LpY"/>
+                                <constraint firstAttribute="trailing" secondItem="588-x8-O9b" secondAttribute="trailing" constant="21" id="bnJ-3p-X2G"/>
+                                <constraint firstItem="588-x8-O9b" firstAttribute="leading" secondItem="cWD-mJ-KYY" secondAttribute="leading" constant="20" id="eBO-ns-TTJ"/>
+                                <constraint firstAttribute="height" constant="70" id="iDU-rL-UW9"/>
+                                <constraint firstItem="1ve-P8-JDs" firstAttribute="top" secondItem="cWD-mJ-KYY" secondAttribute="top" id="mNd-rF-9ZW"/>
+                                <constraint firstItem="ixt-ug-Oem" firstAttribute="leading" secondItem="cWD-mJ-KYY" secondAttribute="leading" constant="21" id="seb-1F-m4z"/>
+                                <constraint firstItem="olg-X6-m1I" firstAttribute="top" secondItem="cWD-mJ-KYY" secondAttribute="top" constant="4" id="siI-k7-m2L"/>
+                                <constraint firstItem="olg-X6-m1I" firstAttribute="leading" secondItem="cWD-mJ-KYY" secondAttribute="leading" constant="21" id="xGN-kK-EvX"/>
+                                <constraint firstItem="588-x8-O9b" firstAttribute="top" secondItem="ixt-ug-Oem" secondAttribute="bottom" id="ynv-CB-SlT"/>
+                            </constraints>
+                        </view>
+                        <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="Rs0-Em-AxD">
+                            <rect key="frame" x="0.0" y="191" width="386" height="70"/>
+                            <subviews>
+                                <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="*" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="Ld5-hX-AkC">
+                                    <rect key="frame" x="21" y="4" width="8" height="21"/>
+                                    <fontDescription key="fontDescription" type="system" weight="medium" pointSize="17"/>
+                                    <color key="textColor" red="1" green="0.30588235289999999" blue="0.098039215690000001" alpha="1" colorSpace="calibratedRGB"/>
+                                    <nil key="highlightedColor"/>
+                                </label>
+                                <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="开户行" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="t2l-Xy-4Nr">
+                                    <rect key="frame" x="29" y="0.0" width="52" height="24"/>
+                                    <constraints>
+                                        <constraint firstAttribute="height" constant="24" id="lBZ-Si-Bss"/>
+                                    </constraints>
+                                    <fontDescription key="fontDescription" type="system" weight="medium" pointSize="17"/>
+                                    <nil key="textColor"/>
+                                    <nil key="highlightedColor"/>
+                                </label>
+                                <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="TZ8-tJ-cG8">
+                                    <rect key="frame" x="20" y="69" width="345" height="1"/>
+                                    <color key="backgroundColor" red="0.92156862750000001" green="0.92156862750000001" blue="0.92156862750000001" alpha="1" colorSpace="calibratedRGB"/>
+                                    <constraints>
+                                        <constraint firstAttribute="height" constant="1" id="laZ-ss-ctT"/>
+                                    </constraints>
+                                </view>
+                                <textField opaque="NO" userInteractionEnabled="NO" contentMode="scaleToFill" contentHorizontalAlignment="left" contentVerticalAlignment="center" placeholder="请选择" textAlignment="natural" minimumFontSize="17" translatesAutoresizingMaskIntoConstraints="NO" id="UgT-1A-kbs">
+                                    <rect key="frame" x="21" y="30" width="49" height="39"/>
+                                    <fontDescription key="fontDescription" type="system" pointSize="16"/>
+                                    <textInputTraits key="textInputTraits"/>
+                                </textField>
+                                <imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="choose_arrow" translatesAutoresizingMaskIntoConstraints="NO" id="Qpu-z4-Q6Q">
+                                    <rect key="frame" x="75" y="46" width="12" height="7"/>
+                                    <constraints>
+                                        <constraint firstAttribute="height" constant="7" id="Pfb-pI-whR"/>
+                                        <constraint firstAttribute="width" constant="12" id="lRd-Sa-JyB"/>
+                                    </constraints>
+                                </imageView>
+                                <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="G92-8s-yXN">
+                                    <rect key="frame" x="21" y="30" width="66" height="39"/>
+                                    <inset key="imageEdgeInsets" minX="0.0" minY="0.0" maxX="2.2250738585072014e-308" maxY="0.0"/>
+                                    <connections>
+                                        <action selector="chooseBank:" destination="iN0-l3-epB" eventType="touchUpInside" id="5uO-dT-5Gc"/>
+                                    </connections>
+                                </button>
+                            </subviews>
+                            <color key="backgroundColor" systemColor="systemBackgroundColor"/>
+                            <constraints>
+                                <constraint firstItem="Ld5-hX-AkC" firstAttribute="leading" secondItem="Rs0-Em-AxD" secondAttribute="leading" constant="21" id="0kn-jm-ibR"/>
+                                <constraint firstItem="TZ8-tJ-cG8" firstAttribute="leading" secondItem="Rs0-Em-AxD" secondAttribute="leading" constant="20" id="3bN-HH-BVY"/>
+                                <constraint firstItem="Qpu-z4-Q6Q" firstAttribute="centerY" secondItem="UgT-1A-kbs" secondAttribute="centerY" id="3fy-xb-JvJ"/>
+                                <constraint firstItem="t2l-Xy-4Nr" firstAttribute="top" secondItem="Rs0-Em-AxD" secondAttribute="top" id="CSX-0Z-r7c"/>
+                                <constraint firstAttribute="bottom" secondItem="TZ8-tJ-cG8" secondAttribute="bottom" id="CfI-a5-kMc"/>
+                                <constraint firstAttribute="trailing" secondItem="TZ8-tJ-cG8" secondAttribute="trailing" constant="21" id="CqU-mQ-r8v"/>
+                                <constraint firstItem="G92-8s-yXN" firstAttribute="top" secondItem="UgT-1A-kbs" secondAttribute="top" id="GWR-0K-gb8"/>
+                                <constraint firstItem="G92-8s-yXN" firstAttribute="leading" secondItem="UgT-1A-kbs" secondAttribute="leading" id="IaG-dk-clP"/>
+                                <constraint firstItem="UgT-1A-kbs" firstAttribute="leading" secondItem="Rs0-Em-AxD" secondAttribute="leading" constant="21" id="PRA-5M-0Bu"/>
+                                <constraint firstItem="Ld5-hX-AkC" firstAttribute="top" secondItem="Rs0-Em-AxD" secondAttribute="top" constant="4" id="UhP-IK-9Ru"/>
+                                <constraint firstItem="t2l-Xy-4Nr" firstAttribute="leading" secondItem="Ld5-hX-AkC" secondAttribute="trailing" id="W1Y-A0-KaF"/>
+                                <constraint firstItem="Qpu-z4-Q6Q" firstAttribute="leading" secondItem="UgT-1A-kbs" secondAttribute="trailing" constant="5" id="hIW-AY-ZZg"/>
+                                <constraint firstAttribute="height" constant="70" id="ljP-bd-Aw1"/>
+                                <constraint firstItem="Qpu-z4-Q6Q" firstAttribute="trailing" secondItem="G92-8s-yXN" secondAttribute="trailing" id="qst-mM-3LR"/>
+                                <constraint firstItem="TZ8-tJ-cG8" firstAttribute="top" secondItem="UgT-1A-kbs" secondAttribute="bottom" id="xQs-hq-X00"/>
+                                <constraint firstItem="G92-8s-yXN" firstAttribute="bottom" secondItem="UgT-1A-kbs" secondAttribute="bottom" id="yEd-eR-SAR"/>
+                                <constraint firstItem="UgT-1A-kbs" firstAttribute="top" secondItem="Ld5-hX-AkC" secondAttribute="bottom" constant="5" id="zpo-FH-7tv"/>
+                            </constraints>
+                        </view>
+                        <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="jND-YO-ccR">
+                            <rect key="frame" x="0.0" y="274" width="386" height="70"/>
+                            <subviews>
+                                <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="*" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="F7E-Ds-M0y">
+                                    <rect key="frame" x="21" y="4" width="8" height="21"/>
+                                    <fontDescription key="fontDescription" type="system" weight="medium" pointSize="17"/>
+                                    <color key="textColor" red="1" green="0.30588235289999999" blue="0.098039215690000001" alpha="1" colorSpace="calibratedRGB"/>
+                                    <nil key="highlightedColor"/>
+                                </label>
+                                <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="银行卡号" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="ZCl-Fg-aqj">
+                                    <rect key="frame" x="29" y="0.0" width="69.5" height="24"/>
+                                    <constraints>
+                                        <constraint firstAttribute="height" constant="24" id="qtC-Xp-hmZ"/>
+                                    </constraints>
+                                    <fontDescription key="fontDescription" type="system" weight="medium" pointSize="17"/>
+                                    <nil key="textColor"/>
+                                    <nil key="highlightedColor"/>
+                                </label>
+                                <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="osE-Am-DAc">
+                                    <rect key="frame" x="20" y="69" width="345" height="1"/>
+                                    <color key="backgroundColor" red="0.92156862750000001" green="0.92156862750000001" blue="0.92156862750000001" alpha="1" colorSpace="calibratedRGB"/>
+                                    <constraints>
+                                        <constraint firstAttribute="height" constant="1" id="Dwo-67-xlc"/>
+                                    </constraints>
+                                </view>
+                                <textField opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="left" contentVerticalAlignment="center" placeholder="请输入银行卡号" textAlignment="natural" minimumFontSize="17" translatesAutoresizingMaskIntoConstraints="NO" id="R6V-vK-TV2">
+                                    <rect key="frame" x="21" y="30" width="345" height="39"/>
+                                    <fontDescription key="fontDescription" type="system" pointSize="16"/>
+                                    <textInputTraits key="textInputTraits" keyboardType="ASCIICapableNumberPad"/>
+                                </textField>
+                            </subviews>
+                            <color key="backgroundColor" systemColor="systemBackgroundColor"/>
+                            <constraints>
+                                <constraint firstAttribute="bottom" secondItem="osE-Am-DAc" secondAttribute="bottom" id="AdR-cn-wCV"/>
+                                <constraint firstItem="R6V-vK-TV2" firstAttribute="top" secondItem="F7E-Ds-M0y" secondAttribute="bottom" constant="5" id="HR5-8F-oJM"/>
+                                <constraint firstItem="osE-Am-DAc" firstAttribute="top" secondItem="R6V-vK-TV2" secondAttribute="bottom" id="If8-rA-rh2"/>
+                                <constraint firstItem="F7E-Ds-M0y" firstAttribute="leading" secondItem="jND-YO-ccR" secondAttribute="leading" constant="21" id="T2C-wn-1aq"/>
+                                <constraint firstAttribute="height" constant="70" id="c7P-LC-yDw"/>
+                                <constraint firstAttribute="trailing" secondItem="osE-Am-DAc" secondAttribute="trailing" constant="21" id="iKq-kw-jDO"/>
+                                <constraint firstItem="R6V-vK-TV2" firstAttribute="leading" secondItem="jND-YO-ccR" secondAttribute="leading" constant="21" id="kyt-dw-A6y"/>
+                                <constraint firstItem="F7E-Ds-M0y" firstAttribute="top" secondItem="jND-YO-ccR" secondAttribute="top" constant="4" id="m62-P5-jz2"/>
+                                <constraint firstItem="osE-Am-DAc" firstAttribute="leading" secondItem="jND-YO-ccR" secondAttribute="leading" constant="20" id="nnn-j3-Ad9"/>
+                                <constraint firstAttribute="trailing" secondItem="R6V-vK-TV2" secondAttribute="trailing" constant="20" id="od7-Az-H9G"/>
+                                <constraint firstItem="ZCl-Fg-aqj" firstAttribute="leading" secondItem="F7E-Ds-M0y" secondAttribute="trailing" id="tdc-hc-TwG"/>
+                                <constraint firstItem="ZCl-Fg-aqj" firstAttribute="top" secondItem="jND-YO-ccR" secondAttribute="top" id="zEl-XB-h84"/>
+                            </constraints>
+                        </view>
+                        <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="6ya-XW-tgL">
+                            <rect key="frame" x="0.0" y="357" width="386" height="70"/>
+                            <subviews>
+                                <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="*" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="SCE-H3-Zdc">
+                                    <rect key="frame" x="21" y="4" width="8" height="21"/>
+                                    <fontDescription key="fontDescription" type="system" weight="medium" pointSize="17"/>
+                                    <color key="textColor" red="1" green="0.30588235289999999" blue="0.098039215690000001" alpha="1" colorSpace="calibratedRGB"/>
+                                    <nil key="highlightedColor"/>
+                                </label>
+                                <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="银行卡预留手机号" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="zKo-C2-UyN">
+                                    <rect key="frame" x="29" y="0.0" width="139" height="24"/>
+                                    <constraints>
+                                        <constraint firstAttribute="height" constant="24" id="Dni-hq-fKX"/>
+                                    </constraints>
+                                    <fontDescription key="fontDescription" type="system" weight="medium" pointSize="17"/>
+                                    <nil key="textColor"/>
+                                    <nil key="highlightedColor"/>
+                                </label>
+                                <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="ipI-xj-bHq">
+                                    <rect key="frame" x="20" y="69" width="345" height="1"/>
+                                    <color key="backgroundColor" red="0.92156862750000001" green="0.92156862750000001" blue="0.92156862750000001" alpha="1" colorSpace="calibratedRGB"/>
+                                    <constraints>
+                                        <constraint firstAttribute="height" constant="1" id="mhA-Ce-o2S"/>
+                                    </constraints>
+                                </view>
+                                <textField opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="left" contentVerticalAlignment="center" placeholder="请输入手机号" textAlignment="natural" minimumFontSize="17" translatesAutoresizingMaskIntoConstraints="NO" id="dKg-NM-2L1">
+                                    <rect key="frame" x="21" y="30" width="345" height="39"/>
+                                    <fontDescription key="fontDescription" type="system" pointSize="16"/>
+                                    <textInputTraits key="textInputTraits" keyboardType="ASCIICapableNumberPad"/>
+                                </textField>
+                            </subviews>
+                            <color key="backgroundColor" systemColor="systemBackgroundColor"/>
+                            <constraints>
+                                <constraint firstAttribute="height" constant="70" id="D2B-wZ-2LG"/>
+                                <constraint firstItem="ipI-xj-bHq" firstAttribute="top" secondItem="dKg-NM-2L1" secondAttribute="bottom" id="Erq-kq-aYS"/>
+                                <constraint firstItem="zKo-C2-UyN" firstAttribute="leading" secondItem="SCE-H3-Zdc" secondAttribute="trailing" id="I2a-jf-ydx"/>
+                                <constraint firstItem="SCE-H3-Zdc" firstAttribute="top" secondItem="6ya-XW-tgL" secondAttribute="top" constant="4" id="K5y-J3-6ly"/>
+                                <constraint firstAttribute="bottom" secondItem="ipI-xj-bHq" secondAttribute="bottom" id="OsN-yd-WLa"/>
+                                <constraint firstItem="zKo-C2-UyN" firstAttribute="top" secondItem="6ya-XW-tgL" secondAttribute="top" id="P1d-ga-ANO"/>
+                                <constraint firstItem="ipI-xj-bHq" firstAttribute="leading" secondItem="6ya-XW-tgL" secondAttribute="leading" constant="20" id="gla-DI-yIH"/>
+                                <constraint firstItem="dKg-NM-2L1" firstAttribute="top" secondItem="SCE-H3-Zdc" secondAttribute="bottom" constant="5" id="i29-E9-kSX"/>
+                                <constraint firstAttribute="trailing" secondItem="ipI-xj-bHq" secondAttribute="trailing" constant="21" id="jpe-7A-bl0"/>
+                                <constraint firstItem="SCE-H3-Zdc" firstAttribute="leading" secondItem="6ya-XW-tgL" secondAttribute="leading" constant="21" id="lc1-oP-l90"/>
+                                <constraint firstItem="dKg-NM-2L1" firstAttribute="leading" secondItem="6ya-XW-tgL" secondAttribute="leading" constant="21" id="o6E-Du-bl8"/>
+                                <constraint firstAttribute="trailing" secondItem="dKg-NM-2L1" secondAttribute="trailing" constant="20" id="zMQ-oZ-dxv"/>
+                            </constraints>
+                        </view>
+                        <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="Wq5-R0-qOU">
+                            <rect key="frame" x="0.0" y="108" width="386" height="70"/>
+                            <subviews>
+                                <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="*" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="8dn-Wo-vZH">
+                                    <rect key="frame" x="21" y="4" width="8" height="21"/>
+                                    <fontDescription key="fontDescription" type="system" weight="medium" pointSize="17"/>
+                                    <color key="textColor" red="1" green="0.30588235289999999" blue="0.098039215690000001" alpha="1" colorSpace="calibratedRGB"/>
+                                    <nil key="highlightedColor"/>
+                                </label>
+                                <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="持卡人身份证号" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="03w-uJ-Iur">
+                                    <rect key="frame" x="29" y="0.0" width="121.5" height="24"/>
+                                    <constraints>
+                                        <constraint firstAttribute="height" constant="24" id="GMA-Km-r5l"/>
+                                    </constraints>
+                                    <fontDescription key="fontDescription" type="system" weight="medium" pointSize="17"/>
+                                    <nil key="textColor"/>
+                                    <nil key="highlightedColor"/>
+                                </label>
+                                <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="SZx-Gk-tCq">
+                                    <rect key="frame" x="20" y="69" width="345" height="1"/>
+                                    <color key="backgroundColor" red="0.92156862750000001" green="0.92156862750000001" blue="0.92156862750000001" alpha="1" colorSpace="calibratedRGB"/>
+                                    <constraints>
+                                        <constraint firstAttribute="height" constant="1" id="gh7-Kj-dy5"/>
+                                    </constraints>
+                                </view>
+                                <textField opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="left" contentVerticalAlignment="center" placeholder="请输入您的身份证号" textAlignment="natural" minimumFontSize="17" translatesAutoresizingMaskIntoConstraints="NO" id="t8x-ZZ-BoQ">
+                                    <rect key="frame" x="21" y="30" width="345" height="39"/>
+                                    <fontDescription key="fontDescription" type="system" pointSize="16"/>
+                                    <textInputTraits key="textInputTraits" keyboardType="alphabet"/>
+                                </textField>
+                            </subviews>
+                            <color key="backgroundColor" systemColor="systemBackgroundColor"/>
+                            <constraints>
+                                <constraint firstItem="03w-uJ-Iur" firstAttribute="top" secondItem="Wq5-R0-qOU" secondAttribute="top" id="0hv-Ly-fBs"/>
+                                <constraint firstAttribute="bottom" secondItem="SZx-Gk-tCq" secondAttribute="bottom" id="Mgj-5w-7FG"/>
+                                <constraint firstItem="03w-uJ-Iur" firstAttribute="leading" secondItem="8dn-Wo-vZH" secondAttribute="trailing" id="OZe-yN-YTf"/>
+                                <constraint firstItem="t8x-ZZ-BoQ" firstAttribute="leading" secondItem="Wq5-R0-qOU" secondAttribute="leading" constant="21" id="Pzr-ti-VtL"/>
+                                <constraint firstAttribute="trailing" secondItem="SZx-Gk-tCq" secondAttribute="trailing" constant="21" id="Rzo-sE-hLf"/>
+                                <constraint firstItem="SZx-Gk-tCq" firstAttribute="top" secondItem="t8x-ZZ-BoQ" secondAttribute="bottom" id="SpX-0C-z8l"/>
+                                <constraint firstAttribute="trailing" secondItem="t8x-ZZ-BoQ" secondAttribute="trailing" constant="20" id="Vmq-8u-Jcz"/>
+                                <constraint firstItem="8dn-Wo-vZH" firstAttribute="top" secondItem="Wq5-R0-qOU" secondAttribute="top" constant="4" id="bds-y0-GhY"/>
+                                <constraint firstAttribute="height" constant="70" id="e9a-dg-VwM"/>
+                                <constraint firstItem="t8x-ZZ-BoQ" firstAttribute="top" secondItem="8dn-Wo-vZH" secondAttribute="bottom" constant="5" id="oFf-Hr-xVP"/>
+                                <constraint firstItem="8dn-Wo-vZH" firstAttribute="leading" secondItem="Wq5-R0-qOU" secondAttribute="leading" constant="21" id="qw6-7d-HRJ"/>
+                                <constraint firstItem="SZx-Gk-tCq" firstAttribute="leading" secondItem="Wq5-R0-qOU" secondAttribute="leading" constant="20" id="urn-lN-FiJ"/>
+                            </constraints>
+                        </view>
+                    </subviews>
+                    <color key="backgroundColor" systemColor="systemBackgroundColor"/>
+                    <constraints>
+                        <constraint firstItem="6ya-XW-tgL" firstAttribute="top" secondItem="jND-YO-ccR" secondAttribute="bottom" constant="13" id="0AV-yB-M0G"/>
+                        <constraint firstAttribute="trailing" secondItem="Rs0-Em-AxD" secondAttribute="trailing" id="1th-oc-V5D"/>
+                        <constraint firstItem="cWD-mJ-KYY" firstAttribute="top" secondItem="lu4-LH-SyJ" secondAttribute="top" constant="25" id="9r5-Ig-fYF"/>
+                        <constraint firstItem="6ya-XW-tgL" firstAttribute="leading" secondItem="lu4-LH-SyJ" secondAttribute="leading" id="DLY-ay-0fz"/>
+                        <constraint firstItem="Wq5-R0-qOU" firstAttribute="top" secondItem="cWD-mJ-KYY" secondAttribute="bottom" constant="13" id="FBh-tw-x09"/>
+                        <constraint firstAttribute="trailing" secondItem="6ya-XW-tgL" secondAttribute="trailing" id="Gid-Wg-90Y"/>
+                        <constraint firstItem="jND-YO-ccR" firstAttribute="leading" secondItem="lu4-LH-SyJ" secondAttribute="leading" id="IUx-yZ-vnz"/>
+                        <constraint firstItem="Rs0-Em-AxD" firstAttribute="leading" secondItem="lu4-LH-SyJ" secondAttribute="leading" id="JRd-ON-PhH"/>
+                        <constraint firstItem="cWD-mJ-KYY" firstAttribute="leading" secondItem="lu4-LH-SyJ" secondAttribute="leading" id="Tzv-oL-Q11"/>
+                        <constraint firstItem="Wq5-R0-qOU" firstAttribute="leading" secondItem="lu4-LH-SyJ" secondAttribute="leading" id="UjP-r7-CHy"/>
+                        <constraint firstAttribute="trailing" secondItem="jND-YO-ccR" secondAttribute="trailing" id="Uk7-S2-NZp"/>
+                        <constraint firstAttribute="trailing" secondItem="cWD-mJ-KYY" secondAttribute="trailing" id="VKX-Mb-C9h"/>
+                        <constraint firstAttribute="trailing" secondItem="Wq5-R0-qOU" secondAttribute="trailing" id="Yvd-G5-OdK"/>
+                        <constraint firstItem="jND-YO-ccR" firstAttribute="top" secondItem="Rs0-Em-AxD" secondAttribute="bottom" constant="13" id="lzZ-de-BiD"/>
+                        <constraint firstItem="Rs0-Em-AxD" firstAttribute="top" secondItem="Wq5-R0-qOU" secondAttribute="bottom" constant="13" id="ne1-eg-bnD"/>
+                        <constraint firstAttribute="bottom" secondItem="6ya-XW-tgL" secondAttribute="bottom" constant="25" id="z98-2U-eaZ"/>
+                    </constraints>
+                    <userDefinedRuntimeAttributes>
+                        <userDefinedRuntimeAttribute type="number" keyPath="cornerRadius">
+                            <real key="value" value="10"/>
+                        </userDefinedRuntimeAttribute>
+                    </userDefinedRuntimeAttributes>
+                </view>
+                <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="0zx-a0-8ba">
+                    <rect key="frame" x="28" y="485" width="358" height="44"/>
+                    <color key="backgroundColor" red="0.1764705882" green="0.78039215689999997" blue="0.66666666669999997" alpha="1" colorSpace="calibratedRGB"/>
+                    <constraints>
+                        <constraint firstAttribute="height" constant="44" id="ZRF-oz-Rn0"/>
+                    </constraints>
+                    <inset key="imageEdgeInsets" minX="0.0" minY="0.0" maxX="2.2250738585072014e-308" maxY="0.0"/>
+                    <state key="normal" title="立即绑卡"/>
+                    <userDefinedRuntimeAttributes>
+                        <userDefinedRuntimeAttribute type="number" keyPath="cornerRadius">
+                            <real key="value" value="22"/>
+                        </userDefinedRuntimeAttribute>
+                    </userDefinedRuntimeAttributes>
+                    <connections>
+                        <action selector="sureAction:" destination="iN0-l3-epB" eventType="touchUpInside" id="xXd-tK-ZCp"/>
+                    </connections>
+                </button>
+            </subviews>
+            <color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
+            <constraints>
+                <constraint firstAttribute="trailing" secondItem="0zx-a0-8ba" secondAttribute="trailing" constant="28" id="7oe-qi-9Wk"/>
+                <constraint firstItem="0zx-a0-8ba" firstAttribute="top" secondItem="lu4-LH-SyJ" secondAttribute="bottom" constant="23" id="JCf-Wp-RnP"/>
+                <constraint firstItem="lu4-LH-SyJ" firstAttribute="top" secondItem="iN0-l3-epB" secondAttribute="top" constant="10" id="KhS-g5-OlD"/>
+                <constraint firstItem="lu4-LH-SyJ" firstAttribute="leading" secondItem="iN0-l3-epB" secondAttribute="leading" constant="14" id="T56-eU-oRk"/>
+                <constraint firstItem="0zx-a0-8ba" firstAttribute="leading" secondItem="iN0-l3-epB" secondAttribute="leading" constant="28" id="xwE-vX-XTd"/>
+                <constraint firstAttribute="trailing" secondItem="lu4-LH-SyJ" secondAttribute="trailing" constant="14" id="z32-1F-VYh"/>
+            </constraints>
+            <nil key="simulatedTopBarMetrics"/>
+            <nil key="simulatedBottomBarMetrics"/>
+            <freeformSimulatedSizeMetrics key="simulatedDestinationMetrics"/>
+            <connections>
+                <outlet property="bankNameField" destination="UgT-1A-kbs" id="mfQ-ow-Wfo"/>
+                <outlet property="cardNoField" destination="R6V-vK-TV2" id="fnJ-88-cpX"/>
+                <outlet property="idCardField" destination="t8x-ZZ-BoQ" id="nOX-15-U7L"/>
+                <outlet property="nameField" destination="ixt-ug-Oem" id="HVd-DS-cJf"/>
+                <outlet property="phoneField" destination="dKg-NM-2L1" id="Nbp-d7-C6t"/>
+            </connections>
+            <point key="canvasLocation" x="131.8840579710145" y="-22.767857142857142"/>
+        </view>
+    </objects>
+    <resources>
+        <image name="choose_arrow" width="12" height="7"/>
+        <systemColor name="systemBackgroundColor">
+            <color white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
+        </systemColor>
+    </resources>
+</document>

+ 26 - 0
KulexiuForTeacher/KulexiuForTeacher/Module/Mine/BankCard/View/CardBindResultBodyView.h

@@ -0,0 +1,26 @@
+//
+//  CardBindResultBodyView.h
+//  KulexiuForTeacher
+//
+//  Created by 王智 on 2022/4/27.
+//
+
+#import <UIKit/UIKit.h>
+
+typedef void(^ResultCallback)(void);
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface CardBindResultBodyView : UIView
+
+@property (weak, nonatomic) IBOutlet UIImageView *imageView;
+
+@property (weak, nonatomic) IBOutlet UILabel *descLabel;
+
++ (instancetype)shareIntance;
+
+- (void)sureCallback:(ResultCallback)callback;
+
+@end
+
+NS_ASSUME_NONNULL_END

+ 45 - 0
KulexiuForTeacher/KulexiuForTeacher/Module/Mine/BankCard/View/CardBindResultBodyView.m

@@ -0,0 +1,45 @@
+//
+//  CardBindResultBodyView.m
+//  KulexiuForTeacher
+//
+//  Created by 王智 on 2022/4/27.
+//
+
+#import "CardBindResultBodyView.h"
+
+@interface CardBindResultBodyView ()
+
+@property (nonatomic, copy) ResultCallback callback;
+
+
+@end
+
+
+@implementation CardBindResultBodyView
+
++ (instancetype)shareIntance {
+    CardBindResultBodyView *view = [[[NSBundle mainBundle] loadNibNamed:@"CardBindResultBodyView" owner:nil options:nil] firstObject];
+    return view;
+}
+
+- (void)sureCallback:(ResultCallback)callback {
+    if (callback) {
+        self.callback = callback;
+    }
+}
+
+- (IBAction)sureAction:(id)sender {
+    if (self.callback) {
+        self.callback();
+    }
+}
+
+/*
+// Only override drawRect: if you perform custom drawing.
+// An empty implementation adversely affects performance during animation.
+- (void)drawRect:(CGRect)rect {
+    // Drawing code
+}
+*/
+
+@end

+ 71 - 0
KulexiuForTeacher/KulexiuForTeacher/Module/Mine/BankCard/View/CardBindResultBodyView.xib

@@ -0,0 +1,71 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="20037" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" colorMatched="YES">
+    <device id="retina6_1" orientation="portrait" appearance="light"/>
+    <dependencies>
+        <deployment identifier="iOS"/>
+        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="20020"/>
+        <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
+    </dependencies>
+    <objects>
+        <placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner"/>
+        <placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/>
+        <view contentMode="scaleToFill" id="iN0-l3-epB" customClass="CardBindResultBodyView">
+            <rect key="frame" x="0.0" y="0.0" width="414" height="496"/>
+            <autoresizingMask key="autoresizingMask"/>
+            <subviews>
+                <imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" translatesAutoresizingMaskIntoConstraints="NO" id="9CR-3J-Btv">
+                    <rect key="frame" x="77" y="15" width="260" height="230"/>
+                    <constraints>
+                        <constraint firstAttribute="height" constant="230" id="S8s-nt-Axz"/>
+                        <constraint firstAttribute="width" constant="260" id="vvf-b9-4Oy"/>
+                    </constraints>
+                </imageView>
+                <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="" textAlignment="center" lineBreakMode="tailTruncation" numberOfLines="0" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="zKA-Td-gGZ">
+                    <rect key="frame" x="207" y="257" width="0.0" height="27"/>
+                    <constraints>
+                        <constraint firstAttribute="height" constant="27" id="Le2-Me-Wou"/>
+                    </constraints>
+                    <fontDescription key="fontDescription" type="system" pointSize="15"/>
+                    <color key="textColor" red="0.59999999999999998" green="0.59999999999999998" blue="0.59999999999999998" alpha="1" colorSpace="calibratedRGB"/>
+                    <nil key="highlightedColor"/>
+                </label>
+                <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="9bw-58-pc5">
+                    <rect key="frame" x="109" y="298" width="196" height="44"/>
+                    <color key="backgroundColor" red="0.1764705882" green="0.78039215689999997" blue="0.66666666669999997" alpha="1" colorSpace="custom" customColorSpace="calibratedRGB"/>
+                    <constraints>
+                        <constraint firstAttribute="height" constant="44" id="Fch-QD-IPS"/>
+                        <constraint firstAttribute="width" constant="196" id="Npf-lh-Dch"/>
+                    </constraints>
+                    <inset key="imageEdgeInsets" minX="0.0" minY="0.0" maxX="2.2250738585072014e-308" maxY="0.0"/>
+                    <state key="normal" title="我知道了"/>
+                    <userDefinedRuntimeAttributes>
+                        <userDefinedRuntimeAttribute type="number" keyPath="cornerRadius">
+                            <real key="value" value="22"/>
+                        </userDefinedRuntimeAttribute>
+                    </userDefinedRuntimeAttributes>
+                    <connections>
+                        <action selector="sureAction:" destination="iN0-l3-epB" eventType="touchUpInside" id="zKJ-Kc-opP"/>
+                    </connections>
+                </button>
+            </subviews>
+            <color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
+            <constraints>
+                <constraint firstItem="zKA-Td-gGZ" firstAttribute="top" secondItem="9CR-3J-Btv" secondAttribute="bottom" constant="12" id="4fG-8H-OCt"/>
+                <constraint firstItem="9CR-3J-Btv" firstAttribute="top" secondItem="iN0-l3-epB" secondAttribute="top" constant="15" id="4k4-PR-oyg"/>
+                <constraint firstItem="9CR-3J-Btv" firstAttribute="centerX" secondItem="iN0-l3-epB" secondAttribute="centerX" id="6df-U2-z8s"/>
+                <constraint firstItem="zKA-Td-gGZ" firstAttribute="leading" relation="greaterThanOrEqual" secondItem="iN0-l3-epB" secondAttribute="leading" constant="14" id="BvI-yo-TEw"/>
+                <constraint firstItem="9bw-58-pc5" firstAttribute="centerX" secondItem="iN0-l3-epB" secondAttribute="centerX" id="WNE-iz-OyQ"/>
+                <constraint firstItem="zKA-Td-gGZ" firstAttribute="centerX" secondItem="iN0-l3-epB" secondAttribute="centerX" id="Wlc-gw-FVi"/>
+                <constraint firstItem="9bw-58-pc5" firstAttribute="top" secondItem="zKA-Td-gGZ" secondAttribute="bottom" constant="14" id="ucv-NY-6GP"/>
+            </constraints>
+            <nil key="simulatedTopBarMetrics"/>
+            <nil key="simulatedBottomBarMetrics"/>
+            <freeformSimulatedSizeMetrics key="simulatedDestinationMetrics"/>
+            <connections>
+                <outlet property="descLabel" destination="zKA-Td-gGZ" id="GlD-M2-Qg1"/>
+                <outlet property="imageView" destination="9CR-3J-Btv" id="cj4-J6-LWv"/>
+            </connections>
+            <point key="canvasLocation" x="131.8840579710145" y="31.473214285714285"/>
+        </view>
+    </objects>
+</document>

+ 24 - 0
KulexiuForTeacher/KulexiuForTeacher/Module/Mine/BankCard/View/CardDisplayView.h

@@ -0,0 +1,24 @@
+//
+//  CardDisplayView.h
+//  KulexiuForTeacher
+//
+//  Created by 王智 on 2022/4/26.
+//
+
+#import <UIKit/UIKit.h>
+
+typedef void(^CardAction)(void);
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface CardDisplayView : UIView
+
++ (instancetype)shareInstance;
+
+- (void)configWithBankName:(NSString *)bankName cardNum:(NSString *)cardNo;
+
+- (void)dismissCard:(CardAction)callback;
+
+@end
+
+NS_ASSUME_NONNULL_END

+ 70 - 0
KulexiuForTeacher/KulexiuForTeacher/Module/Mine/BankCard/View/CardDisplayView.m

@@ -0,0 +1,70 @@
+//
+//  CardDisplayView.m
+//  KulexiuForTeacher
+//
+//  Created by 王智 on 2022/4/26.
+//
+
+#import "CardDisplayView.h"
+
+@interface CardDisplayView ()
+
+@property (weak, nonatomic) IBOutlet UILabel *bankName;
+
+@property (weak, nonatomic) IBOutlet UILabel *cardNo;
+
+@property (nonatomic, copy) CardAction callback;
+
+@property (weak, nonatomic) IBOutlet UIView *bgView;
+
+@end
+
+@implementation CardDisplayView
+
+- (void)awakeFromNib {
+    [super awakeFromNib];
+    CAGradientLayer * gradientLayer = [CAGradientLayer layer];
+    gradientLayer.colors = @[(__bridge id)HexRGB(0xff997b).CGColor,(__bridge id)HexRGB(0xff6253).CGColor];
+    gradientLayer.startPoint = CGPointMake(0, 0);
+    gradientLayer.endPoint = CGPointMake(0, 1);
+    gradientLayer.frame = CGRectMake(0, 0, (KPortraitWidth - 28), 97);
+    [self.bgView.layer addSublayer:gradientLayer];
+}
+
++ (instancetype)shareInstance {
+    CardDisplayView *view = [[[NSBundle mainBundle] loadNibNamed:@"CardDisplayView" owner:nil options:nil] firstObject];
+    return view;
+}
+
+- (void)configWithBankName:(NSString *)bankName cardNum:(NSString *)cardNo {
+    self.bankName.text = [NSString returnNoNullStringWithString:bankName];
+    if (![NSString isEmptyString:cardNo] && cardNo.length > 4) {
+        self.cardNo.text = [NSString stringWithFormat:@"%@*********%@", [cardNo substringWithRange:NSMakeRange(0, 4)], [cardNo substringFromIndex:cardNo.length - 4]];
+    }
+    else {
+        self.cardNo.text = @"";
+    }
+}
+
+- (void)dismissCard:(CardAction)callback {
+    if (callback) {
+        self.callback = callback;
+    }
+}
+
+- (IBAction)dismissCardAction:(id)sender {
+    if (self.callback) {
+        self.callback();
+    }
+}
+
+
+/*
+// Only override drawRect: if you perform custom drawing.
+// An empty implementation adversely affects performance during animation.
+- (void)drawRect:(CGRect)rect {
+    // Drawing code
+}
+*/
+
+@end

Some files were not shown because too many files changed in this diff