Commit 275826c16286ab80eee297d566a31f7239ecd971
1 parent
fafdc552
Exists in
parentassistant
commit
Showing
22 changed files
with
1587 additions
and
1578 deletions
Show diff stats
ParentAssistant/ParentAssistant.xcodeproj/project.pbxproj
... | ... | @@ -105,8 +105,8 @@ |
105 | 105 | BF406CDC2057C110000A6681 /* OrderDetailViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF406CDB2057C110000A6681 /* OrderDetailViewController.swift */; }; |
106 | 106 | BF406CDE2057C537000A6681 /* OrderDetailTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF406CDD2057C537000A6681 /* OrderDetailTableViewCell.swift */; }; |
107 | 107 | BF406CE02057C708000A6681 /* OrderDetailCollectionViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF406CDF2057C708000A6681 /* OrderDetailCollectionViewCell.swift */; }; |
108 | - BF5D166A204E675C00274489 /* account.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF5D1669204E675C00274489 /* account.swift */; }; | |
109 | - BF5D166C204E6A0300274489 /* network.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF5D166B204E6A0300274489 /* network.swift */; }; | |
108 | + BF5D166A204E675C00274489 /* AccountManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF5D1669204E675C00274489 /* AccountManager.swift */; }; | |
109 | + BF5D166C204E6A0300274489 /* HTTPServer.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF5D166B204E6A0300274489 /* HTTPServer.swift */; }; | |
110 | 110 | BF5D1678204F8E3300274489 /* CoreTelephony.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BF5D1677204F8E3300274489 /* CoreTelephony.framework */; }; |
111 | 111 | BF5D167A204F8E3D00274489 /* libz.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = BF5D1679204F8E3D00274489 /* libz.tbd */; }; |
112 | 112 | BF5D167C204F8E6000274489 /* SystemConfiguration.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BF5D167B204F8E6000274489 /* SystemConfiguration.framework */; }; |
... | ... | @@ -288,8 +288,8 @@ |
288 | 288 | BF406CDB2057C110000A6681 /* OrderDetailViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OrderDetailViewController.swift; sourceTree = "<group>"; }; |
289 | 289 | BF406CDD2057C537000A6681 /* OrderDetailTableViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OrderDetailTableViewCell.swift; sourceTree = "<group>"; }; |
290 | 290 | BF406CDF2057C708000A6681 /* OrderDetailCollectionViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OrderDetailCollectionViewCell.swift; sourceTree = "<group>"; }; |
291 | - BF5D1669204E675C00274489 /* account.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = account.swift; sourceTree = "<group>"; }; | |
292 | - BF5D166B204E6A0300274489 /* network.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = network.swift; sourceTree = "<group>"; }; | |
291 | + BF5D1669204E675C00274489 /* AccountManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AccountManager.swift; sourceTree = "<group>"; }; | |
292 | + BF5D166B204E6A0300274489 /* HTTPServer.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HTTPServer.swift; sourceTree = "<group>"; }; | |
293 | 293 | BF5D1677204F8E3300274489 /* CoreTelephony.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreTelephony.framework; path = System/Library/Frameworks/CoreTelephony.framework; sourceTree = SDKROOT; }; |
294 | 294 | BF5D1679204F8E3D00274489 /* libz.tbd */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.text-based-dylib-definition"; name = libz.tbd; path = usr/lib/libz.tbd; sourceTree = SDKROOT; }; |
295 | 295 | BF5D167B204F8E6000274489 /* SystemConfiguration.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SystemConfiguration.framework; path = System/Library/Frameworks/SystemConfiguration.framework; sourceTree = SDKROOT; }; |
... | ... | @@ -471,11 +471,9 @@ |
471 | 471 | 599364E0204E62E700C8B371 /* Information */ = { |
472 | 472 | isa = PBXGroup; |
473 | 473 | children = ( |
474 | + ADCDA074208B3FED004F1852 /* Controller */, | |
474 | 475 | ADCDA073208B298D004F1852 /* Model */, |
475 | - 599364E1204E62E700C8B371 /* InformationViewController.swift */, | |
476 | - 599364DD204E62E700C8B371 /* ChannelViewController.swift */, | |
477 | - 599364DE204E62E700C8B371 /* Information.storyboard */, | |
478 | - 599364F4204E648C00C8B371 /* view */, | |
476 | + 599364F4204E648C00C8B371 /* View */, | |
479 | 477 | ); |
480 | 478 | path = Information; |
481 | 479 | sourceTree = "<group>"; |
... | ... | @@ -522,8 +520,8 @@ |
522 | 520 | BFF9B7F02057A27C00F39B3E /* view */, |
523 | 521 | 590944E12057DA73004478B5 /* utils.swift */, |
524 | 522 | ADE33B302062202300BEA6E6 /* Macro.swift */, |
525 | - BF5D1669204E675C00274489 /* account.swift */, | |
526 | - BF5D166B204E6A0300274489 /* network.swift */, | |
523 | + BF5D1669204E675C00274489 /* AccountManager.swift */, | |
524 | + BF5D166B204E6A0300274489 /* HTTPServer.swift */, | |
527 | 525 | AD639F062089C3950028BE73 /* LocationManger.swift */, |
528 | 526 | BFA7446B208193D300845D30 /* MessageManager.swift */, |
529 | 527 | 599365282052553900C8B371 /* pinyin.c */, |
... | ... | @@ -532,7 +530,7 @@ |
532 | 530 | path = util; |
533 | 531 | sourceTree = "<group>"; |
534 | 532 | }; |
535 | - 599364F4204E648C00C8B371 /* view */ = { | |
533 | + 599364F4204E648C00C8B371 /* View */ = { | |
536 | 534 | isa = PBXGroup; |
537 | 535 | children = ( |
538 | 536 | 599364F5204E648C00C8B371 /* ChannelCollectionViewCell.swift */, |
... | ... | @@ -540,7 +538,7 @@ |
540 | 538 | 599364F9204E742000C8B371 /* ChannelSelectViewCollectionViewCell.swift */, |
541 | 539 | 599364FA204E742000C8B371 /* ChannelSelectViewCollectionViewCell.xib */, |
542 | 540 | ); |
543 | - path = view; | |
541 | + path = View; | |
544 | 542 | sourceTree = "<group>"; |
545 | 543 | }; |
546 | 544 | 599364FD204E941900C8B371 /* userCenter */ = { |
... | ... | @@ -655,6 +653,16 @@ |
655 | 653 | path = Model; |
656 | 654 | sourceTree = "<group>"; |
657 | 655 | }; |
656 | + ADCDA074208B3FED004F1852 /* Controller */ = { | |
657 | + isa = PBXGroup; | |
658 | + children = ( | |
659 | + 599364DD204E62E700C8B371 /* ChannelViewController.swift */, | |
660 | + 599364DE204E62E700C8B371 /* Information.storyboard */, | |
661 | + 599364E1204E62E700C8B371 /* InformationViewController.swift */, | |
662 | + ); | |
663 | + path = Controller; | |
664 | + sourceTree = "<group>"; | |
665 | + }; | |
658 | 666 | B605235D289EDBCA5C5AF2C5 /* Frameworks */ = { |
659 | 667 | isa = PBXGroup; |
660 | 668 | children = ( |
... | ... | @@ -1133,7 +1141,7 @@ |
1133 | 1141 | AD639F072089C3950028BE73 /* LocationManger.swift in Sources */, |
1134 | 1142 | 590944E22057DA73004478B5 /* utils.swift in Sources */, |
1135 | 1143 | BFEAAAC9205257460072FAAF /* NSDate+GFCalendar.m in Sources */, |
1136 | - BF5D166A204E675C00274489 /* account.swift in Sources */, | |
1144 | + BF5D166A204E675C00274489 /* AccountManager.swift in Sources */, | |
1137 | 1145 | BF406CD62057B03A000A6681 /* MessageViewController.swift in Sources */, |
1138 | 1146 | 599364F7204E648C00C8B371 /* ChannelCollectionViewCell.swift in Sources */, |
1139 | 1147 | BF7A4C36204CD55300460463 /* ViewController.swift in Sources */, |
... | ... | @@ -1157,7 +1165,7 @@ |
1157 | 1165 | BFEAAACA205257460072FAAF /* NSString+NCDate.m in Sources */, |
1158 | 1166 | BF388469205A4DE900A240EF /* StudentClassInfo.swift in Sources */, |
1159 | 1167 | 59C0A9B8205375F800A8BB5A /* SelectCityViewController.swift in Sources */, |
1160 | - BF5D166C204E6A0300274489 /* network.swift in Sources */, | |
1168 | + BF5D166C204E6A0300274489 /* HTTPServer.swift in Sources */, | |
1161 | 1169 | BF7A4C34204CD55300460463 /* AppDelegate.swift in Sources */, |
1162 | 1170 | BFEAAAD720525D620072FAAF /* UIColor+Expanded.m in Sources */, |
1163 | 1171 | BFF9B7ED2057776100F39B3E /* MyChildrenViewController.swift in Sources */, | ... | ... |
ParentAssistant/ParentAssistant.xcworkspace/xcuserdata/caoyang.xcuserdatad/UserInterfaceState.xcuserstate
No preview for this file type
ParentAssistant/ParentAssistant.xcworkspace/xcuserdata/caoyang.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist
... | ... | @@ -20,7 +20,7 @@ |
20 | 20 | ignoreCount = "0" |
21 | 21 | continueAfterRunningActions = "No" |
22 | 22 | filePath = "ParentAssistant/Classes/controllers/Grow/GrowViewController.swift" |
23 | - timestampString = "545996291.249851" | |
23 | + timestampString = "545997467.221319" | |
24 | 24 | startingColumnNumber = "9223372036854775807" |
25 | 25 | endingColumnNumber = "9223372036854775807" |
26 | 26 | startingLineNumber = "162" | ... | ... |
ParentAssistant/ParentAssistant/Classes/controllers/Information/ChannelViewController.swift
... | ... | @@ -1,261 +0,0 @@ |
1 | -// | |
2 | -// ChannelViewController.swift | |
3 | -// ParentAssistant | |
4 | -// | |
5 | -// Created by 左丞 on 2018/3/5. | |
6 | -// Copyright © 2018年 HANGZHOUTEAM. All rights reserved. | |
7 | -// | |
8 | - | |
9 | -import UIKit | |
10 | - | |
11 | -class ChannelViewController: UIViewController,UISearchBarDelegate { | |
12 | - | |
13 | - var data:ChannelDemol! | |
14 | - var topADs:[ADSModel]=[] | |
15 | - var channelId:Int=0 | |
16 | - @IBOutlet weak var collectView: UICollectionView! | |
17 | - override func viewDidLoad() { | |
18 | - super.viewDidLoad() | |
19 | - let searchView = UISearchBar(frame: CGRect(x: 0, y: 7, width: getScreenWidth()-40, height: 30)) | |
20 | - searchView.delegate = self | |
21 | - searchView.placeholder = "请输入搜索内容" | |
22 | - searchView.showsCancelButton = false | |
23 | - self.navigationItem.titleView = searchView | |
24 | - collectView.register(UINib(nibName: "ChannelCollectionViewCell", bundle: nil), forCellWithReuseIdentifier: "contentCell") | |
25 | - getData() | |
26 | - // Do any additional setup after loading the view. | |
27 | - } | |
28 | - | |
29 | - func getData(){ | |
30 | - let topADsQueue = DispatchQueue(label: "topADs") | |
31 | - topADsQueue.async { | |
32 | - HTTPServer.shared.getAds(["position":2 as AnyObject], completionHandler: { (str, error) in | |
33 | - httpJsonResule(jsonString: str, error: error, successHandler: { (json) in | |
34 | - if json["status"] == 1 && error == nil{ | |
35 | - self.topADs.removeAll() | |
36 | - for item in json.contentData().arrayValue{ | |
37 | - self.topADs.append(ADSModel(j: item)) | |
38 | - } | |
39 | - self.collectView.reloadData() | |
40 | - } | |
41 | - }, failHandler: { (error) in | |
42 | - | |
43 | - }) | |
44 | - }) | |
45 | - } | |
46 | - topADsQueue.async { | |
47 | - HTTPServer.shared.getChannelInfo([ "areaName": localAddress as AnyObject,"channel": self.channelId as AnyObject,"toFirstPage": 0 as AnyObject,"pageIndex": 1 as AnyObject,"pageSize": 20 as AnyObject], completionHandler: { (str, error) in | |
48 | - httpJsonResule(jsonString: str, error: error, successHandler: { (json) in | |
49 | - if json["status"] == 1 && error == nil{ | |
50 | - self.data = ChannelDemol(j: json.contentData()) | |
51 | - self.collectView.reloadData() | |
52 | - } | |
53 | - }, failHandler: { (error) in | |
54 | - | |
55 | - }) | |
56 | - }) | |
57 | - } | |
58 | - } | |
59 | - | |
60 | - func getList(key:String?) { | |
61 | - if key == nil{ | |
62 | - return | |
63 | - } | |
64 | - HTTPServer.shared.getInformationTopic(["keyword":key as AnyObject, "areaName": localAddress as AnyObject,"channel": self.channelId as AnyObject,"toFirstPage": 0 as AnyObject,"pageIndex": 1 as AnyObject,"pageSize": 20 as AnyObject], completionHandler: { (str, error) in | |
65 | - httpJsonResule(jsonString: str, error: error, successHandler: { (json) in | |
66 | - if json["status"] == 1 && error == nil{ | |
67 | - self.data.channelContent.removeAll() | |
68 | - for item in json.contentData()["channelList"].arrayValue{ | |
69 | - self.data.channelContent.append(ChannelContentDemol(j: item)) | |
70 | - } | |
71 | - self.collectView.reloadData() | |
72 | - } | |
73 | - }, failHandler: { (error) in | |
74 | - | |
75 | - }) | |
76 | - }) | |
77 | - } | |
78 | - | |
79 | - | |
80 | - func searchBarTextDidBeginEditing(_ searchBar: UISearchBar) { | |
81 | - searchBar.showsCancelButton = true | |
82 | - } | |
83 | - | |
84 | - func searchBarCancelButtonClicked(_ searchBar: UISearchBar) { | |
85 | - searchData(searchBar) | |
86 | - } | |
87 | - | |
88 | - func searchBarSearchButtonClicked(_ searchBar: UISearchBar) { | |
89 | - searchData(searchBar) | |
90 | - } | |
91 | - | |
92 | - //搜索资讯 | |
93 | - func searchData(_ searchBar: UISearchBar){ | |
94 | - getList(key: searchBar.text) | |
95 | - searchBar.resignFirstResponder() | |
96 | - searchBar.showsCancelButton = false | |
97 | - | |
98 | - } | |
99 | - | |
100 | - override func didReceiveMemoryWarning() { | |
101 | - super.didReceiveMemoryWarning() | |
102 | - // Dispose of any resources that can be recreated. | |
103 | - } | |
104 | - | |
105 | - | |
106 | - /* | |
107 | - // MARK: - Navigation | |
108 | - | |
109 | - // In a storyboard-based application, you will often want to do a little preparation before navigation | |
110 | - override func prepare(for segue: UIStoryboardSegue, sender: Any?) { | |
111 | - // Get the new view controller using segue.destinationViewController. | |
112 | - // Pass the selected object to the new view controller. | |
113 | - } | |
114 | - */ | |
115 | - | |
116 | -} | |
117 | -extension ChannelViewController:UICollectionViewDataSource,UICollectionViewDelegateFlowLayout,UICollectionViewDelegate{ | |
118 | - func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { | |
119 | - switch section { | |
120 | - case 0: | |
121 | - return 1 | |
122 | - case 1: | |
123 | - if data != nil && data.subchannel.count > 0{ | |
124 | - return 1 | |
125 | - } | |
126 | - return 0 | |
127 | - default: | |
128 | - return data.channelContent.count | |
129 | - } | |
130 | - | |
131 | - } | |
132 | - | |
133 | - func numberOfSections(in collectionView: UICollectionView) -> Int { | |
134 | - return 3 | |
135 | - } | |
136 | - | |
137 | - func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize { | |
138 | - switch indexPath.section { | |
139 | - case 0: | |
140 | - return CGSize(width: getScreenWidth(), height: 161) | |
141 | - case 1: | |
142 | - return CGSize(width: getScreenWidth()-20, height: 92) | |
143 | - default: | |
144 | - // if indexPath.row == 0{ | |
145 | - return CGSize(width: getScreenWidth()-20, height: 92) | |
146 | - // } | |
147 | - // return CGSize(width: getScreenWidth()-20, height: 180) | |
148 | - } | |
149 | - | |
150 | - } | |
151 | - | |
152 | - func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { | |
153 | - switch indexPath.section { | |
154 | - case 0: | |
155 | - let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "topCell", for: indexPath) as! InformationViewTopCell | |
156 | - if topADs.count > 0 { | |
157 | - var arr:[String]=[] | |
158 | - for item in topADs{ | |
159 | - arr.append(item.fileSrc) | |
160 | - } | |
161 | - cell.headerImageView.imageArray = arr | |
162 | - } | |
163 | - return cell | |
164 | - case 1: | |
165 | - | |
166 | - let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "channelSelectCell", for: indexPath) as! ChannelSelectView | |
167 | - cell.SubchannelList = data.subchannel | |
168 | - cell.superNC = self.navigationController | |
169 | - return cell | |
170 | - default: | |
171 | - /* | |
172 | - @IBOutlet weak var title: UILabel! | |
173 | - @IBOutlet weak var option: UILabel! | |
174 | - @IBOutlet weak var optionNum: UILabel! | |
175 | - @IBOutlet weak var shareNum: UILabel! | |
176 | - @IBOutlet weak var picture: UIImageView! | |
177 | - */ | |
178 | - // if indexPath.row == 0{ | |
179 | - let item = data.channelContent[indexPath.row] | |
180 | - let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "contentCell", for: indexPath) as! ChannelCollectionViewCell | |
181 | - cell.title.text = item.title | |
182 | - cell.option.text = item.content | |
183 | - cell.optionNum.text = "\(item.talkNum)" | |
184 | - cell.shareNum.text = "\(item.forwardingNum)" | |
185 | - cell.picture.sd_setImage(with: URL(string: (HOSTImage+item.image).addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed)!), placeholderImage: UIImage(named: "navigationBar_backgrounImage")) | |
186 | - return cell | |
187 | - // }else{ | |
188 | - // let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "adiouPlayerCell", for: indexPath) as! AdiouPlayerCell | |
189 | - // return cell | |
190 | - // } | |
191 | - } | |
192 | - | |
193 | - } | |
194 | - | |
195 | - func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) { | |
196 | - switch indexPath.section { | |
197 | - case 1: | |
198 | - let vc = Story.instantiateViewControllerWithIdentifier("ChannelViewControllerVC", storyName: "Information") as! ChannelViewController | |
199 | - self.navigationController?.pushViewController(vc, animated: true) | |
200 | - break | |
201 | - default: | |
202 | - let vcs = Story.instantiateViewControllerWithIdentifier("JSViewController", storyName: "JS") as! JSViewController | |
203 | - vcs.webURL = "\(HOSTWAP!)/ParentOrderCenter.aspx?userid=\(AccountManager.shared.id())" | |
204 | - self.navigationController?.present(vcs.wrapWithNavigationController(), animated: true, completion: nil) | |
205 | - } | |
206 | - } | |
207 | - | |
208 | - func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, referenceSizeForHeaderInSection section: Int) -> CGSize { | |
209 | - return CGSize(width: getScreenWidth(), height: 10) | |
210 | - } | |
211 | - | |
212 | -} | |
213 | - | |
214 | -class InformationTopCell: UICollectionViewCell { | |
215 | - | |
216 | - @IBOutlet weak var headerImageView: XRCarouselView! | |
217 | - @IBOutlet weak var title: UILabel! | |
218 | - | |
219 | -} | |
220 | - | |
221 | -class InformationADCell: UICollectionViewCell { | |
222 | - | |
223 | -} | |
224 | - | |
225 | -//频道栏 | |
226 | -class ChannelViewControllerCell: UICollectionViewCell { | |
227 | - var superNC:UINavigationController! | |
228 | - var SubchannelList:[SubchannelDemol]=[] | |
229 | - @IBOutlet weak var channelSelectCollectionView: UICollectionView! | |
230 | - override func awakeFromNib() { | |
231 | - channelSelectCollectionView.register(UINib(nibName: "ChannelSelectViewCollectionViewCell", bundle: nil), forCellWithReuseIdentifier: "channelcell") | |
232 | - } | |
233 | - | |
234 | -} | |
235 | - | |
236 | -extension ChannelViewControllerCell:UICollectionViewDataSource,UICollectionViewDelegateFlowLayout,UICollectionViewDelegate{ | |
237 | - func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { | |
238 | - return SubchannelList.count | |
239 | - } | |
240 | - | |
241 | - func numberOfSections(in collectionView: UICollectionView) -> Int { | |
242 | - return 1 | |
243 | - } | |
244 | - | |
245 | - func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize { | |
246 | - return CGSize(width: (getScreenWidth()-20)/5, height: 92) | |
247 | - } | |
248 | - | |
249 | - func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { | |
250 | - let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "channelcell", for: indexPath) as! ChannelSelectViewCollectionViewCell | |
251 | - cell.image.sd_setImage(with: URL(string: (HOSTImage+SubchannelList[indexPath.row].channelImage).addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed)!), placeholderImage: #imageLiteral(resourceName: "Information_bar_icon")) | |
252 | - cell.channelName.text = SubchannelList[indexPath.row].channelName | |
253 | - return cell | |
254 | - | |
255 | - } | |
256 | - | |
257 | - func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) { | |
258 | - let vc = Story.instantiateViewControllerWithIdentifier("ChannelViewControllerVC", storyName: "Information") as! ChannelViewController | |
259 | - superNC.pushViewController(vc, animated: true) | |
260 | - } | |
261 | -} |
ParentAssistant/ParentAssistant/Classes/controllers/Information/Controller/ChannelViewController.swift
0 → 100644
... | ... | @@ -0,0 +1,261 @@ |
1 | +// | |
2 | +// ChannelViewController.swift | |
3 | +// ParentAssistant | |
4 | +// | |
5 | +// Created by 左丞 on 2018/3/5. | |
6 | +// Copyright © 2018年 HANGZHOUTEAM. All rights reserved. | |
7 | +// | |
8 | + | |
9 | +import UIKit | |
10 | + | |
11 | +class ChannelViewController: UIViewController,UISearchBarDelegate { | |
12 | + | |
13 | + var data:ChannelDemol! | |
14 | + var topADs:[ADSModel]=[] | |
15 | + var channelId:Int=0 | |
16 | + @IBOutlet weak var collectView: UICollectionView! | |
17 | + override func viewDidLoad() { | |
18 | + super.viewDidLoad() | |
19 | + let searchView = UISearchBar(frame: CGRect(x: 0, y: 7, width: getScreenWidth()-40, height: 30)) | |
20 | + searchView.delegate = self | |
21 | + searchView.placeholder = "请输入搜索内容" | |
22 | + searchView.showsCancelButton = false | |
23 | + self.navigationItem.titleView = searchView | |
24 | + collectView.register(UINib(nibName: "ChannelCollectionViewCell", bundle: nil), forCellWithReuseIdentifier: "contentCell") | |
25 | + getData() | |
26 | + // Do any additional setup after loading the view. | |
27 | + } | |
28 | + | |
29 | + func getData(){ | |
30 | + let topADsQueue = DispatchQueue(label: "topADs") | |
31 | + topADsQueue.async { | |
32 | + HTTPServer.shared.getAds(["position":2 as AnyObject], completionHandler: { (str, error) in | |
33 | + httpJsonResule(jsonString: str, error: error, successHandler: { (json) in | |
34 | + if json["status"] == 1 && error == nil{ | |
35 | + self.topADs.removeAll() | |
36 | + for item in json.contentData().arrayValue{ | |
37 | + self.topADs.append(ADSModel(j: item)) | |
38 | + } | |
39 | + self.collectView.reloadData() | |
40 | + } | |
41 | + }, failHandler: { (error) in | |
42 | + | |
43 | + }) | |
44 | + }) | |
45 | + } | |
46 | + topADsQueue.async { | |
47 | + HTTPServer.shared.getChannelInfo([ "areaName": localAddress as AnyObject,"channel": self.channelId as AnyObject,"toFirstPage": 0 as AnyObject,"pageIndex": 1 as AnyObject,"pageSize": 20 as AnyObject], completionHandler: { (str, error) in | |
48 | + httpJsonResule(jsonString: str, error: error, successHandler: { (json) in | |
49 | + if json["status"] == 1 && error == nil{ | |
50 | + self.data = ChannelDemol(j: json.contentData()) | |
51 | + self.collectView.reloadData() | |
52 | + } | |
53 | + }, failHandler: { (error) in | |
54 | + | |
55 | + }) | |
56 | + }) | |
57 | + } | |
58 | + } | |
59 | + | |
60 | + func getList(key:String?) { | |
61 | + if key == nil{ | |
62 | + return | |
63 | + } | |
64 | + HTTPServer.shared.getInformationTopic(["keyword":key as AnyObject, "areaName": localAddress as AnyObject,"channel": self.channelId as AnyObject,"toFirstPage": 0 as AnyObject,"pageIndex": 1 as AnyObject,"pageSize": 20 as AnyObject], completionHandler: { (str, error) in | |
65 | + httpJsonResule(jsonString: str, error: error, successHandler: { (json) in | |
66 | + if json["status"] == 1 && error == nil{ | |
67 | + self.data.channelContent.removeAll() | |
68 | + for item in json.contentData()["channelList"].arrayValue{ | |
69 | + self.data.channelContent.append(ChannelContentDemol(j: item)) | |
70 | + } | |
71 | + self.collectView.reloadData() | |
72 | + } | |
73 | + }, failHandler: { (error) in | |
74 | + | |
75 | + }) | |
76 | + }) | |
77 | + } | |
78 | + | |
79 | + | |
80 | + func searchBarTextDidBeginEditing(_ searchBar: UISearchBar) { | |
81 | + searchBar.showsCancelButton = true | |
82 | + } | |
83 | + | |
84 | + func searchBarCancelButtonClicked(_ searchBar: UISearchBar) { | |
85 | + searchData(searchBar) | |
86 | + } | |
87 | + | |
88 | + func searchBarSearchButtonClicked(_ searchBar: UISearchBar) { | |
89 | + searchData(searchBar) | |
90 | + } | |
91 | + | |
92 | + //搜索资讯 | |
93 | + func searchData(_ searchBar: UISearchBar){ | |
94 | + getList(key: searchBar.text) | |
95 | + searchBar.resignFirstResponder() | |
96 | + searchBar.showsCancelButton = false | |
97 | + | |
98 | + } | |
99 | + | |
100 | + override func didReceiveMemoryWarning() { | |
101 | + super.didReceiveMemoryWarning() | |
102 | + // Dispose of any resources that can be recreated. | |
103 | + } | |
104 | + | |
105 | + | |
106 | + /* | |
107 | + // MARK: - Navigation | |
108 | + | |
109 | + // In a storyboard-based application, you will often want to do a little preparation before navigation | |
110 | + override func prepare(for segue: UIStoryboardSegue, sender: Any?) { | |
111 | + // Get the new view controller using segue.destinationViewController. | |
112 | + // Pass the selected object to the new view controller. | |
113 | + } | |
114 | + */ | |
115 | + | |
116 | +} | |
117 | +extension ChannelViewController:UICollectionViewDataSource,UICollectionViewDelegateFlowLayout,UICollectionViewDelegate{ | |
118 | + func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { | |
119 | + switch section { | |
120 | + case 0: | |
121 | + return 1 | |
122 | + case 1: | |
123 | + if data != nil && data.subchannel.count > 0{ | |
124 | + return 1 | |
125 | + } | |
126 | + return 0 | |
127 | + default: | |
128 | + return data.channelContent.count | |
129 | + } | |
130 | + | |
131 | + } | |
132 | + | |
133 | + func numberOfSections(in collectionView: UICollectionView) -> Int { | |
134 | + return 3 | |
135 | + } | |
136 | + | |
137 | + func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize { | |
138 | + switch indexPath.section { | |
139 | + case 0: | |
140 | + return CGSize(width: getScreenWidth(), height: 161) | |
141 | + case 1: | |
142 | + return CGSize(width: getScreenWidth()-20, height: 92) | |
143 | + default: | |
144 | + // if indexPath.row == 0{ | |
145 | + return CGSize(width: getScreenWidth()-20, height: 92) | |
146 | + // } | |
147 | + // return CGSize(width: getScreenWidth()-20, height: 180) | |
148 | + } | |
149 | + | |
150 | + } | |
151 | + | |
152 | + func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { | |
153 | + switch indexPath.section { | |
154 | + case 0: | |
155 | + let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "topCell", for: indexPath) as! InformationViewTopCell | |
156 | + if topADs.count > 0 { | |
157 | + var arr:[String]=[] | |
158 | + for item in topADs{ | |
159 | + arr.append(item.fileSrc) | |
160 | + } | |
161 | + cell.headerImageView.imageArray = arr | |
162 | + } | |
163 | + return cell | |
164 | + case 1: | |
165 | + | |
166 | + let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "channelSelectCell", for: indexPath) as! ChannelSelectView | |
167 | + cell.SubchannelList = data.subchannel | |
168 | + cell.superNC = self.navigationController | |
169 | + return cell | |
170 | + default: | |
171 | + /* | |
172 | + @IBOutlet weak var title: UILabel! | |
173 | + @IBOutlet weak var option: UILabel! | |
174 | + @IBOutlet weak var optionNum: UILabel! | |
175 | + @IBOutlet weak var shareNum: UILabel! | |
176 | + @IBOutlet weak var picture: UIImageView! | |
177 | + */ | |
178 | + // if indexPath.row == 0{ | |
179 | + let item = data.channelContent[indexPath.row] | |
180 | + let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "contentCell", for: indexPath) as! ChannelCollectionViewCell | |
181 | + cell.title.text = item.title | |
182 | + cell.option.text = item.content | |
183 | + cell.optionNum.text = "\(item.talkNum)" | |
184 | + cell.shareNum.text = "\(item.forwardingNum)" | |
185 | + cell.picture.sd_setImage(with: URL(string: (HOSTImage+item.image).addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed)!), placeholderImage: UIImage(named: "navigationBar_backgrounImage")) | |
186 | + return cell | |
187 | + // }else{ | |
188 | + // let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "adiouPlayerCell", for: indexPath) as! AdiouPlayerCell | |
189 | + // return cell | |
190 | + // } | |
191 | + } | |
192 | + | |
193 | + } | |
194 | + | |
195 | + func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) { | |
196 | + switch indexPath.section { | |
197 | + case 1: | |
198 | + let vc = Story.instantiateViewControllerWithIdentifier("ChannelViewControllerVC", storyName: "Information") as! ChannelViewController | |
199 | + self.navigationController?.pushViewController(vc, animated: true) | |
200 | + break | |
201 | + default: | |
202 | + let vcs = Story.instantiateViewControllerWithIdentifier("JSViewController", storyName: "JS") as! JSViewController | |
203 | + vcs.webURL = "\(HOSTWAP!)/ParentOrderCenter.aspx?userid=\(AccountManager.shared.id())" | |
204 | + self.navigationController?.present(vcs.wrapWithNavigationController(), animated: true, completion: nil) | |
205 | + } | |
206 | + } | |
207 | + | |
208 | + func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, referenceSizeForHeaderInSection section: Int) -> CGSize { | |
209 | + return CGSize(width: getScreenWidth(), height: 10) | |
210 | + } | |
211 | + | |
212 | +} | |
213 | + | |
214 | +class InformationTopCell: UICollectionViewCell { | |
215 | + | |
216 | + @IBOutlet weak var headerImageView: XRCarouselView! | |
217 | + @IBOutlet weak var title: UILabel! | |
218 | + | |
219 | +} | |
220 | + | |
221 | +class InformationADCell: UICollectionViewCell { | |
222 | + | |
223 | +} | |
224 | + | |
225 | +//频道栏 | |
226 | +class ChannelViewControllerCell: UICollectionViewCell { | |
227 | + var superNC:UINavigationController! | |
228 | + var SubchannelList:[SubchannelDemol]=[] | |
229 | + @IBOutlet weak var channelSelectCollectionView: UICollectionView! | |
230 | + override func awakeFromNib() { | |
231 | + channelSelectCollectionView.register(UINib(nibName: "ChannelSelectViewCollectionViewCell", bundle: nil), forCellWithReuseIdentifier: "channelcell") | |
232 | + } | |
233 | + | |
234 | +} | |
235 | + | |
236 | +extension ChannelViewControllerCell:UICollectionViewDataSource,UICollectionViewDelegateFlowLayout,UICollectionViewDelegate{ | |
237 | + func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { | |
238 | + return SubchannelList.count | |
239 | + } | |
240 | + | |
241 | + func numberOfSections(in collectionView: UICollectionView) -> Int { | |
242 | + return 1 | |
243 | + } | |
244 | + | |
245 | + func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize { | |
246 | + return CGSize(width: (getScreenWidth()-20)/5, height: 92) | |
247 | + } | |
248 | + | |
249 | + func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { | |
250 | + let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "channelcell", for: indexPath) as! ChannelSelectViewCollectionViewCell | |
251 | + cell.image.sd_setImage(with: URL(string: (HOSTImage+SubchannelList[indexPath.row].channelImage).addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed)!), placeholderImage: #imageLiteral(resourceName: "Information_bar_icon")) | |
252 | + cell.channelName.text = SubchannelList[indexPath.row].channelName | |
253 | + return cell | |
254 | + | |
255 | + } | |
256 | + | |
257 | + func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) { | |
258 | + let vc = Story.instantiateViewControllerWithIdentifier("ChannelViewControllerVC", storyName: "Information") as! ChannelViewController | |
259 | + superNC.pushViewController(vc, animated: true) | |
260 | + } | |
261 | +} | ... | ... |
ParentAssistant/ParentAssistant/Classes/controllers/Information/Controller/Information.storyboard
0 → 100644
... | ... | @@ -0,0 +1,140 @@ |
1 | +<?xml version="1.0" encoding="UTF-8"?> | |
2 | +<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="14109" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES"> | |
3 | + <device id="retina4_7" orientation="portrait"> | |
4 | + <adaptation id="fullscreen"/> | |
5 | + </device> | |
6 | + <dependencies> | |
7 | + <deployment identifier="iOS"/> | |
8 | + <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="14088"/> | |
9 | + <capability name="Safe area layout guides" minToolsVersion="9.0"/> | |
10 | + <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/> | |
11 | + </dependencies> | |
12 | + <scenes> | |
13 | + <!--Channel View Controller--> | |
14 | + <scene sceneID="ABm-lX-clu"> | |
15 | + <objects> | |
16 | + <viewController storyboardIdentifier="ChannelViewControllerVC" id="bVx-8B-9mN" customClass="ChannelViewController" customModule="ParentAssistant" customModuleProvider="target" sceneMemberID="viewController"> | |
17 | + <view key="view" contentMode="scaleToFill" id="Tna-Gl-4Ek"> | |
18 | + <rect key="frame" x="0.0" y="0.0" width="375" height="667"/> | |
19 | + <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/> | |
20 | + <subviews> | |
21 | + <collectionView clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="scaleToFill" dataMode="prototypes" translatesAutoresizingMaskIntoConstraints="NO" id="JCs-3l-84a"> | |
22 | + <rect key="frame" x="0.0" y="64" width="375" height="603"/> | |
23 | + <color key="backgroundColor" red="0.91372549020000005" green="0.91764705879999997" blue="0.92156862750000001" alpha="1" colorSpace="custom" customColorSpace="sRGB"/> | |
24 | + <collectionViewFlowLayout key="collectionViewLayout" minimumLineSpacing="10" minimumInteritemSpacing="10" id="EZR-lc-xvu"> | |
25 | + <size key="itemSize" width="335" height="161"/> | |
26 | + <size key="headerReferenceSize" width="0.0" height="0.0"/> | |
27 | + <size key="footerReferenceSize" width="0.0" height="0.0"/> | |
28 | + <inset key="sectionInset" minX="0.0" minY="0.0" maxX="0.0" maxY="0.0"/> | |
29 | + </collectionViewFlowLayout> | |
30 | + <cells> | |
31 | + <collectionViewCell opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" reuseIdentifier="topCell" id="C9Z-rg-SZk" customClass="InformationTopCell" customModule="ParentAssistant" customModuleProvider="target"> | |
32 | + <rect key="frame" x="0.5" y="0.0" width="374" height="161"/> | |
33 | + <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/> | |
34 | + <view key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" insetsLayoutMarginsFromSafeArea="NO"> | |
35 | + <rect key="frame" x="0.0" y="0.0" width="374" height="161"/> | |
36 | + <autoresizingMask key="autoresizingMask"/> | |
37 | + <subviews> | |
38 | + <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="mlR-FH-5Nu" customClass="XRCarouselView"> | |
39 | + <rect key="frame" x="0.0" y="0.0" width="374" height="161"/> | |
40 | + <color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/> | |
41 | + </view> | |
42 | + <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="CtD-5W-zwV"> | |
43 | + <rect key="frame" x="0.0" y="141" width="374" height="20"/> | |
44 | + <color key="backgroundColor" white="0.0" alpha="0.23335255872483221" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/> | |
45 | + <constraints> | |
46 | + <constraint firstAttribute="height" constant="20" id="tlk-t1-rt0"/> | |
47 | + </constraints> | |
48 | + <fontDescription key="fontDescription" type="system" pointSize="13"/> | |
49 | + <color key="textColor" white="1" alpha="1" colorSpace="calibratedWhite"/> | |
50 | + <nil key="highlightedColor"/> | |
51 | + </label> | |
52 | + </subviews> | |
53 | + </view> | |
54 | + <constraints> | |
55 | + <constraint firstAttribute="bottom" secondItem="CtD-5W-zwV" secondAttribute="bottom" id="BKJ-uT-MBo"/> | |
56 | + <constraint firstAttribute="trailing" secondItem="CtD-5W-zwV" secondAttribute="trailing" id="CfU-o0-rKa"/> | |
57 | + <constraint firstItem="mlR-FH-5Nu" firstAttribute="top" secondItem="C9Z-rg-SZk" secondAttribute="top" id="GzZ-7c-SJQ"/> | |
58 | + <constraint firstItem="CtD-5W-zwV" firstAttribute="leading" secondItem="C9Z-rg-SZk" secondAttribute="leading" id="LTu-nA-Cao"/> | |
59 | + <constraint firstItem="mlR-FH-5Nu" firstAttribute="leading" secondItem="C9Z-rg-SZk" secondAttribute="leading" id="Nb7-pB-Ghp"/> | |
60 | + <constraint firstAttribute="trailing" secondItem="mlR-FH-5Nu" secondAttribute="trailing" id="SxQ-N0-Y0N"/> | |
61 | + <constraint firstAttribute="bottom" secondItem="mlR-FH-5Nu" secondAttribute="bottom" id="tMq-AF-wX6"/> | |
62 | + </constraints> | |
63 | + <size key="customSize" width="374" height="161"/> | |
64 | + <connections> | |
65 | + <outlet property="headerImageView" destination="mlR-FH-5Nu" id="xSr-kh-gxk"/> | |
66 | + <outlet property="title" destination="CtD-5W-zwV" id="01f-Fi-QTy"/> | |
67 | + </connections> | |
68 | + </collectionViewCell> | |
69 | + <collectionViewCell opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" reuseIdentifier="ADCell" id="MF6-Kw-UCV" customClass="InformationADCell" customModule="ParentAssistant" customModuleProvider="target"> | |
70 | + <rect key="frame" x="13.5" y="171" width="348" height="112"/> | |
71 | + <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/> | |
72 | + <view key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" insetsLayoutMarginsFromSafeArea="NO"> | |
73 | + <rect key="frame" x="0.0" y="0.0" width="348" height="112"/> | |
74 | + <autoresizingMask key="autoresizingMask"/> | |
75 | + </view> | |
76 | + <color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/> | |
77 | + <size key="customSize" width="348" height="112"/> | |
78 | + </collectionViewCell> | |
79 | + <collectionViewCell opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" reuseIdentifier="cell1" id="cWU-ha-KKs" customClass="ChannelViewControllerCell" customModule="ParentAssistant" customModuleProvider="target"> | |
80 | + <rect key="frame" x="13.5" y="293" width="348" height="132"/> | |
81 | + <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/> | |
82 | + <view key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" insetsLayoutMarginsFromSafeArea="NO"> | |
83 | + <rect key="frame" x="0.0" y="0.0" width="348" height="132"/> | |
84 | + <autoresizingMask key="autoresizingMask"/> | |
85 | + <subviews> | |
86 | + <collectionView clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="scaleToFill" showsVerticalScrollIndicator="NO" dataMode="prototypes" translatesAutoresizingMaskIntoConstraints="NO" id="UVy-LN-rIh"> | |
87 | + <rect key="frame" x="0.0" y="0.0" width="348" height="132"/> | |
88 | + <color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/> | |
89 | + <collectionViewFlowLayout key="collectionViewLayout" scrollDirection="horizontal" minimumLineSpacing="0.0" minimumInteritemSpacing="0.0" id="N6m-Dl-7w9"> | |
90 | + <size key="itemSize" width="50" height="50"/> | |
91 | + <size key="headerReferenceSize" width="0.0" height="0.0"/> | |
92 | + <size key="footerReferenceSize" width="0.0" height="0.0"/> | |
93 | + <inset key="sectionInset" minX="0.0" minY="0.0" maxX="0.0" maxY="0.0"/> | |
94 | + </collectionViewFlowLayout> | |
95 | + <cells/> | |
96 | + <connections> | |
97 | + <outlet property="dataSource" destination="cWU-ha-KKs" id="ZxT-TP-u6g"/> | |
98 | + <outlet property="delegate" destination="cWU-ha-KKs" id="M8p-FM-wb0"/> | |
99 | + </connections> | |
100 | + </collectionView> | |
101 | + </subviews> | |
102 | + </view> | |
103 | + <constraints> | |
104 | + <constraint firstItem="UVy-LN-rIh" firstAttribute="leading" secondItem="cWU-ha-KKs" secondAttribute="leading" id="6jP-NG-yGT"/> | |
105 | + <constraint firstAttribute="bottom" secondItem="UVy-LN-rIh" secondAttribute="bottom" id="HLY-bl-LbB"/> | |
106 | + <constraint firstAttribute="trailing" secondItem="UVy-LN-rIh" secondAttribute="trailing" id="NIK-YL-djb"/> | |
107 | + <constraint firstItem="UVy-LN-rIh" firstAttribute="top" secondItem="cWU-ha-KKs" secondAttribute="top" id="i6X-zn-Awk"/> | |
108 | + </constraints> | |
109 | + <size key="customSize" width="348" height="132"/> | |
110 | + <connections> | |
111 | + <outlet property="channelSelectCollectionView" destination="UVy-LN-rIh" id="loe-wl-4L8"/> | |
112 | + </connections> | |
113 | + </collectionViewCell> | |
114 | + </cells> | |
115 | + <connections> | |
116 | + <outlet property="dataSource" destination="bVx-8B-9mN" id="KcK-UP-0pg"/> | |
117 | + <outlet property="delegate" destination="bVx-8B-9mN" id="Owl-6U-OK1"/> | |
118 | + </connections> | |
119 | + </collectionView> | |
120 | + </subviews> | |
121 | + <color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/> | |
122 | + <constraints> | |
123 | + <constraint firstItem="JCs-3l-84a" firstAttribute="trailing" secondItem="BIT-6f-Ard" secondAttribute="trailing" id="7OD-37-Wfz"/> | |
124 | + <constraint firstItem="JCs-3l-84a" firstAttribute="bottom" secondItem="BIT-6f-Ard" secondAttribute="bottom" id="A2F-z2-cUs"/> | |
125 | + <constraint firstItem="JCs-3l-84a" firstAttribute="leading" secondItem="BIT-6f-Ard" secondAttribute="leading" id="jio-Jz-czF"/> | |
126 | + <constraint firstItem="JCs-3l-84a" firstAttribute="top" secondItem="BIT-6f-Ard" secondAttribute="top" id="rxj-M1-acl"/> | |
127 | + </constraints> | |
128 | + <viewLayoutGuide key="safeArea" id="BIT-6f-Ard"/> | |
129 | + </view> | |
130 | + <simulatedNavigationBarMetrics key="simulatedTopBarMetrics" prompted="NO"/> | |
131 | + <connections> | |
132 | + <outlet property="collectView" destination="JCs-3l-84a" id="rTr-7z-SHG"/> | |
133 | + </connections> | |
134 | + </viewController> | |
135 | + <placeholder placeholderIdentifier="IBFirstResponder" id="a4a-xX-AnY" userLabel="First Responder" sceneMemberID="firstResponder"/> | |
136 | + </objects> | |
137 | + <point key="canvasLocation" x="-41" y="179"/> | |
138 | + </scene> | |
139 | + </scenes> | |
140 | +</document> | ... | ... |
ParentAssistant/ParentAssistant/Classes/controllers/Information/Controller/InformationViewController.swift
0 → 100644
... | ... | @@ -0,0 +1,377 @@ |
1 | +// | |
2 | +// InformationViewController.swift | |
3 | +// ParentAssistant | |
4 | +// | |
5 | +// Created by 葛建军 on 2018/3/5. | |
6 | +// Copyright © 2018年 HANGZHOUTEAM. All rights reserved. | |
7 | +// | |
8 | + | |
9 | +import UIKit | |
10 | +class InformationViewController: UIViewController,UISearchBarDelegate { | |
11 | + @IBOutlet weak var collectView: UICollectionView! | |
12 | + var leftLabel:UILabel! | |
13 | + var data:ChannelDemol! | |
14 | + var topADs:[ADSModel]=[] | |
15 | + var isFirstviewController:Bool=true | |
16 | + var channel:Int=0 | |
17 | + | |
18 | + //导航栏左侧按钮 | |
19 | + lazy var leftCityView = {()-> UIView in | |
20 | + //左按钮 | |
21 | + let leftView = UIButton.init(frame: CGRect.init(x: 0, y: 0, width: 70, height: 44)) | |
22 | + let titleLab = UILabel.init(frame: CGRect.init(x: 0, y: 0, width: 60, height: 44)) | |
23 | + | |
24 | + titleLab.font = UIFont.systemFont(ofSize: 15) | |
25 | + titleLab.numberOfLines = 0 | |
26 | + titleLab.adjustsFontSizeToFitWidth = true | |
27 | + titleLab.textAlignment = .center | |
28 | + titleLab.textColor = .white | |
29 | + titleLab.text = localAddress | |
30 | + self.leftLabel = titleLab | |
31 | + leftView.addSubview(titleLab) | |
32 | + | |
33 | + let imageView = UIImageView.init(frame: CGRect.init(x: 60, y: 11, width: 10, height: 22)) | |
34 | + imageView.image = UIImage.init(named: "report_white_pull") | |
35 | + imageView.contentMode = .scaleAspectFit | |
36 | + leftView.addSubview(imageView) | |
37 | + | |
38 | + leftView.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(EvaluationViewController.getAddreess(tap:)))) | |
39 | + return leftView | |
40 | + }() | |
41 | + | |
42 | + override func viewDidLoad() { | |
43 | + super.viewDidLoad() | |
44 | + | |
45 | + let item = UIBarButtonItem.init(title: "返回", style: .plain, target: self, action: nil) | |
46 | + self.navigationItem.backBarButtonItem = item | |
47 | + | |
48 | + drawTopUI() | |
49 | + | |
50 | + } | |
51 | + override func viewWillAppear(_ animated: Bool) { | |
52 | + super.viewWillAppear(animated) | |
53 | + | |
54 | + if isFirstviewController{ | |
55 | + let leftBtn = UIBarButtonItem.init(customView: self.leftCityView) | |
56 | + self.navigationItem.leftBarButtonItem = leftBtn | |
57 | + if localAddress == "未知" { | |
58 | + LocationManger.shared.block = { str in | |
59 | + localAddress = str | |
60 | + self.leftLabel.text = localAddress | |
61 | + self.getDataFromNet() | |
62 | + } | |
63 | + } | |
64 | + } | |
65 | + self.getDataFromNet() | |
66 | + } | |
67 | + func drawTopUI(){ | |
68 | + | |
69 | + self.configTheme() | |
70 | + //搜索框 | |
71 | + let searchView = SearchBarView.init(frame: CGRect.init(x: 0, y: 0, width: screenWidth-100, height: navigationBarHeight!)) | |
72 | + //MARK:搜索框搜索回调 | |
73 | + searchView.block = { str,type in | |
74 | + DebugLog(str) | |
75 | + switch type { | |
76 | + case .SearchType: | |
77 | + self.getList(key: str) | |
78 | + case .CancelType: | |
79 | + self.getDataFromNet() | |
80 | + } | |
81 | + } | |
82 | + self.navigationItem.titleView = searchView | |
83 | + } | |
84 | + override func viewWillDisappear(_ animated: Bool) { | |
85 | + super.viewWillDisappear(animated) | |
86 | + SVProgressHUD.dismiss() | |
87 | + } | |
88 | + //MARK: - 获取该城市下的数据 | |
89 | + private func getDataFromNet(){ | |
90 | + //position 广告位置0-首次广告位1-开屏广告位2-资讯首页3-频道首页4-频道内容5-文章内容页 | |
91 | + SVProgressHUD.show() | |
92 | + let group = DispatchGroup() | |
93 | + var position:Int = 2 | |
94 | + if !self.isFirstviewController { | |
95 | + position = 3 | |
96 | + } | |
97 | + group.enter() | |
98 | + HTTPServer.shared.getAds(["position":position as AnyObject,"areaName":localAddress as AnyObject], completionHandler: { (str, error) in//getPercentEncodingString(str: localAddress) | |
99 | + httpJsonResule(jsonString: str, error: error, successHandler: { (json) in | |
100 | + if json["status"] == 1 && error == nil{ | |
101 | + self.topADs.removeAll() | |
102 | + for item in json.contentData().arrayValue{ | |
103 | + self.topADs.append(ADSModel(j: item)) | |
104 | + } | |
105 | + } | |
106 | + }, failHandler: { (error) in | |
107 | + | |
108 | + }) | |
109 | + group.leave() | |
110 | + }) | |
111 | + group.enter() | |
112 | + let dic = self.getListDic() | |
113 | + HTTPServer.shared.getChannelInfo(dic, completionHandler: { (str, error) in | |
114 | + httpJsonResule(jsonString: str, error: error, successHandler: { (json) in | |
115 | + if json["status"] == 1 && error == nil{ | |
116 | + self.data = ChannelDemol(j: json.contentData()) | |
117 | + } | |
118 | + }, failHandler: { (error) in | |
119 | + | |
120 | + }) | |
121 | + group.leave() | |
122 | + }) | |
123 | + group.notify(queue: DispatchQueue.main) { | |
124 | + SVProgressHUD.dismiss() | |
125 | + self.collectView.reloadData() | |
126 | + } | |
127 | + } | |
128 | + //MARK: - 地址选择回调 | |
129 | + @objc func getAddreess(tap:UITapGestureRecognizer){ | |
130 | + tap.view?.isUserInteractionEnabled = false | |
131 | + LZCityPickerController.showPicker(in: self | |
132 | + , select: { (address, province, city, area, isSelect) in | |
133 | + if isSelect{ | |
134 | + tap.view?.isUserInteractionEnabled = true | |
135 | + self.leftLabel.text = area! | |
136 | + localAddress = area! | |
137 | + self.getDataFromNet() | |
138 | + } | |
139 | + }) { | |
140 | + tap.view?.isUserInteractionEnabled = true | |
141 | + } | |
142 | + } | |
143 | + | |
144 | + //MARK: - 搜索框搜索咨询 | |
145 | + func getList(key:String?) { | |
146 | + if key == nil{ | |
147 | + return | |
148 | + } | |
149 | + var dic = getListDic() | |
150 | + dic.updateValue(key as AnyObject, forKey: "keyword") | |
151 | + | |
152 | + HTTPServer.shared.getInformationTopic(dic, completionHandler: { (str, error) in | |
153 | + httpJsonResule(jsonString: str, error: error, successHandler: { (json) in | |
154 | + if json["status"] == 1 && error == nil{ | |
155 | + self.data.channelContent.removeAll() | |
156 | + for item in json.contentData()["channelList"].arrayValue{ | |
157 | + self.data.channelContent.append(ChannelContentDemol(j: item)) | |
158 | + } | |
159 | + self.collectView.reloadData() | |
160 | + } | |
161 | + }, failHandler: { (error) in | |
162 | + | |
163 | + }) | |
164 | + }) | |
165 | + } | |
166 | + | |
167 | + //获得请求参数 | |
168 | + func getListDic()->[String:AnyObject]{ | |
169 | + var dic = [ "areaName": localAddress as AnyObject,"pageIndex": 1 as AnyObject,"pageSize": 20 as AnyObject] | |
170 | + var toFirstPage:Int = 1 | |
171 | + var ch:Int = 0 | |
172 | + if !isFirstviewController{ | |
173 | + toFirstPage = 0 | |
174 | + ch = channel | |
175 | + } | |
176 | + dic.updateValue(ch as AnyObject, forKey: "channel") | |
177 | + dic.updateValue(toFirstPage as AnyObject, forKey: "toFirstPage") | |
178 | + return dic | |
179 | + } | |
180 | + | |
181 | + | |
182 | + override func didReceiveMemoryWarning() { | |
183 | + super.didReceiveMemoryWarning() | |
184 | + // Dispose of any resources that can be recreated. | |
185 | + } | |
186 | + | |
187 | + //点击资讯进入详情 | |
188 | + func pushToInfoView(index:Int){ | |
189 | + let vcs = Story.instantiateViewControllerWithIdentifier("JSViewController", storyName: "JS") as! JSViewController | |
190 | + if data.channelContent[index].url != "" { | |
191 | + vcs.webURL = data.channelContent[index].url | |
192 | + }else{ | |
193 | + vcs.webURL = (HOSTWAP+"/InformationDetail.aspx?id="+"\(data.channelContent[index].id)"+"&areaname="+localAddress).addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed)! | |
194 | + } | |
195 | + self.navigationController?.present(vcs.wrapWithNavigationController(), animated: true, completion: nil) | |
196 | + } | |
197 | + | |
198 | +} | |
199 | + | |
200 | +extension InformationViewController:XRCarouselViewDelegate{ | |
201 | + func carouselView(_ carouselView: XRCarouselView!, clickImageAt index: Int) { | |
202 | + pushToInfoView(index: index) | |
203 | + } | |
204 | +} | |
205 | + | |
206 | +//整体分三个部分1.轮播图,2频道栏,3列表 | |
207 | +extension InformationViewController:UICollectionViewDataSource,UICollectionViewDelegateFlowLayout,UICollectionViewDelegate{ | |
208 | + func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { | |
209 | + switch section { | |
210 | + case 0: | |
211 | + return 1 | |
212 | + case 1: | |
213 | + if data != nil && data.subchannel.count > 0{ | |
214 | + return 1 | |
215 | + } | |
216 | + return 0 | |
217 | + default: | |
218 | + return data != nil ? data.channelContent.count : 0 | |
219 | + } | |
220 | + } | |
221 | + | |
222 | + func numberOfSections(in collectionView: UICollectionView) -> Int { | |
223 | + return 3 | |
224 | + } | |
225 | + | |
226 | + func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize { | |
227 | + switch indexPath.section { | |
228 | + case 0: | |
229 | + return CGSize(width: getScreenWidth(), height: getScreenWidth()/375*200) | |
230 | + case 1: | |
231 | + return CGSize(width: getScreenWidth()-20, height: 92) | |
232 | + default: | |
233 | +// if indexPath.row == 0{ | |
234 | + return CGSize(width: getScreenWidth()-20, height: 92) | |
235 | +// } | |
236 | +// return CGSize(width: getScreenWidth()-20, height: 180) | |
237 | + } | |
238 | + } | |
239 | + | |
240 | + func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, referenceSizeForHeaderInSection section: Int) -> CGSize { | |
241 | + if section == 2{ | |
242 | + return CGSize(width: getScreenWidth()-20, height: 40) | |
243 | + }else{ | |
244 | + return CGSize(width: getScreenWidth(), height: 10) | |
245 | + } | |
246 | + } | |
247 | + | |
248 | + func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { | |
249 | + collectionView.register(UINib(nibName: "ChannelCollectionViewCell", bundle: nil), forCellWithReuseIdentifier: "contentCell") | |
250 | + switch indexPath.section { | |
251 | + case 0: | |
252 | + let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "topCell", for: indexPath) as! InformationViewTopCell | |
253 | + if topADs.count > 0 { | |
254 | + var arr:[String]=[] | |
255 | + for item in topADs{ | |
256 | + arr.append(HOSTImage+item.fileSrc) | |
257 | + } | |
258 | + cell.headerImageView.imageArray = arr | |
259 | + } | |
260 | + return cell | |
261 | + case 1: | |
262 | + | |
263 | + let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "channelSelectCell", for: indexPath) as! ChannelSelectView | |
264 | + cell.SubchannelList = data.subchannel | |
265 | + cell.superNC = self.navigationController | |
266 | + return cell | |
267 | + default: | |
268 | +// if indexPath.row == 0{ | |
269 | + let item = data.channelContent[indexPath.row] | |
270 | + let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "contentCell", for: indexPath) as! ChannelCollectionViewCell | |
271 | + cell.title.text = item.title | |
272 | + cell.option.text = item.content | |
273 | + cell.optionNum.text = "\(item.lookNum)" | |
274 | + cell.shareNum.text = "\(item.forwardingNum)" | |
275 | + cell.picture.sd_setImage(with: URL(string: (HOSTImage+item.image).addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed)!), placeholderImage: UIImage(named: "navigationBar_backgrounImage")) | |
276 | + return cell | |
277 | +// }else{ | |
278 | +// let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "adiouPlayerCell", for: indexPath) as! AdiouPlayerCell | |
279 | +// return cell | |
280 | +// } | |
281 | + } | |
282 | + } | |
283 | + | |
284 | + func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) { | |
285 | + switch indexPath.section { | |
286 | + case 1: | |
287 | + let vc = Story.instantiateViewControllerWithIdentifier("InformationViewControllerVC", storyName: "Main") as! InformationViewController | |
288 | + vc.channel = data.subchannel[indexPath.row].id | |
289 | + vc.isFirstviewController = false | |
290 | + self.navigationController?.pushViewController(vc, animated: true) | |
291 | + break | |
292 | + default: | |
293 | + let vcs = Story.instantiateViewControllerWithIdentifier("JSViewController", storyName: "JS") as! JSViewController | |
294 | + if data.channelContent[indexPath.row].url != "" { | |
295 | + vcs.webURL = data.channelContent[indexPath.row].url | |
296 | + }else{ | |
297 | + vcs.webURL = (HOSTWAP+"/InformationDetail.aspx?id="+"\(data.channelContent[indexPath.row].id)"+"&areaname="+localAddress).addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed)! | |
298 | + } | |
299 | + self.navigationController?.present(vcs.wrapWithNavigationController(), animated: true, completion: nil) | |
300 | + | |
301 | +// pushToInfoView(index: indexPath.row) | |
302 | + } | |
303 | + } | |
304 | + | |
305 | + func collectionView(_ collectionView: UICollectionView, viewForSupplementaryElementOfKind kind: String, at indexPath: IndexPath) -> UICollectionReusableView { | |
306 | + var reusableview:UICollectionReusableView? | |
307 | + if kind == UICollectionElementKindSectionHeader{ | |
308 | + let headerView = collectionView.dequeueReusableSupplementaryView(ofKind: UICollectionElementKindSectionHeader, withReuseIdentifier: "headerView", for: indexPath) as! InformationSectionHeader | |
309 | + headerView.title.text = "咨讯话题" | |
310 | + reusableview = headerView | |
311 | + } | |
312 | + if indexPath.section == 2{ | |
313 | + reusableview?.isHidden = false | |
314 | + }else{ | |
315 | + reusableview?.isHidden = true | |
316 | + } | |
317 | + return reusableview! | |
318 | + } | |
319 | +} | |
320 | + | |
321 | + | |
322 | +class InformationSectionHeader: UICollectionReusableView { | |
323 | + @IBOutlet weak var title: UILabel! | |
324 | + | |
325 | +} | |
326 | + | |
327 | +//首页的轮播图所在的cell | |
328 | +class InformationViewTopCell: UICollectionViewCell { | |
329 | + | |
330 | + @IBOutlet weak var headerImageView: XRCarouselView! | |
331 | + | |
332 | +} | |
333 | + | |
334 | +//视频cell | |
335 | +class AdiouPlayerCell: UICollectionViewCell { | |
336 | + | |
337 | +} | |
338 | + | |
339 | +//频道栏 | |
340 | +class ChannelSelectView: UICollectionViewCell { | |
341 | + var superNC:UINavigationController! | |
342 | + var SubchannelList:[SubchannelDemol]=[] | |
343 | + @IBOutlet weak var channelSelectCollectionView: UICollectionView! | |
344 | + override func awakeFromNib() { | |
345 | + channelSelectCollectionView.register(UINib(nibName: "ChannelSelectViewCollectionViewCell", bundle: nil), forCellWithReuseIdentifier: "channelcell") | |
346 | + } | |
347 | +} | |
348 | + | |
349 | +extension ChannelSelectView:UICollectionViewDataSource,UICollectionViewDelegateFlowLayout,UICollectionViewDelegate{ | |
350 | + func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { | |
351 | + return SubchannelList.count | |
352 | + } | |
353 | + | |
354 | + func numberOfSections(in collectionView: UICollectionView) -> Int { | |
355 | + return 1 | |
356 | + } | |
357 | + | |
358 | + func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize { | |
359 | + return CGSize(width: (getScreenWidth()-20)/4, height: 92) | |
360 | + } | |
361 | + | |
362 | + func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { | |
363 | + let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "channelcell", for: indexPath) as! ChannelSelectViewCollectionViewCell | |
364 | + cell.image.sd_setImage(with: URL(string: (HOSTImage+SubchannelList[indexPath.row].channelImage).addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed)!), placeholderImage: UIImage(named: "evaluation_icon_highSchoolEnter")) | |
365 | + cell.channelName.text = SubchannelList[indexPath.row].channelName | |
366 | + return cell | |
367 | + } | |
368 | + | |
369 | + func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) { | |
370 | + let vc = Story.instantiateViewControllerWithIdentifier("InformationViewControllerVC", storyName: "Main") as! InformationViewController | |
371 | + vc.channel = SubchannelList[indexPath.row].id | |
372 | + vc.isFirstviewController = false | |
373 | + superNC.pushViewController(vc, animated: true) | |
374 | + } | |
375 | +} | |
376 | + | |
377 | + | ... | ... |
ParentAssistant/ParentAssistant/Classes/controllers/Information/Information.storyboard
... | ... | @@ -1,140 +0,0 @@ |
1 | -<?xml version="1.0" encoding="UTF-8"?> | |
2 | -<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="14109" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES"> | |
3 | - <device id="retina4_7" orientation="portrait"> | |
4 | - <adaptation id="fullscreen"/> | |
5 | - </device> | |
6 | - <dependencies> | |
7 | - <deployment identifier="iOS"/> | |
8 | - <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="14088"/> | |
9 | - <capability name="Safe area layout guides" minToolsVersion="9.0"/> | |
10 | - <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/> | |
11 | - </dependencies> | |
12 | - <scenes> | |
13 | - <!--Channel View Controller--> | |
14 | - <scene sceneID="ABm-lX-clu"> | |
15 | - <objects> | |
16 | - <viewController storyboardIdentifier="ChannelViewControllerVC" id="bVx-8B-9mN" customClass="ChannelViewController" customModule="ParentAssistant" customModuleProvider="target" sceneMemberID="viewController"> | |
17 | - <view key="view" contentMode="scaleToFill" id="Tna-Gl-4Ek"> | |
18 | - <rect key="frame" x="0.0" y="0.0" width="375" height="667"/> | |
19 | - <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/> | |
20 | - <subviews> | |
21 | - <collectionView clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="scaleToFill" dataMode="prototypes" translatesAutoresizingMaskIntoConstraints="NO" id="JCs-3l-84a"> | |
22 | - <rect key="frame" x="0.0" y="64" width="375" height="603"/> | |
23 | - <color key="backgroundColor" red="0.91372549020000005" green="0.91764705879999997" blue="0.92156862750000001" alpha="1" colorSpace="custom" customColorSpace="sRGB"/> | |
24 | - <collectionViewFlowLayout key="collectionViewLayout" minimumLineSpacing="10" minimumInteritemSpacing="10" id="EZR-lc-xvu"> | |
25 | - <size key="itemSize" width="335" height="161"/> | |
26 | - <size key="headerReferenceSize" width="0.0" height="0.0"/> | |
27 | - <size key="footerReferenceSize" width="0.0" height="0.0"/> | |
28 | - <inset key="sectionInset" minX="0.0" minY="0.0" maxX="0.0" maxY="0.0"/> | |
29 | - </collectionViewFlowLayout> | |
30 | - <cells> | |
31 | - <collectionViewCell opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" reuseIdentifier="topCell" id="C9Z-rg-SZk" customClass="InformationTopCell" customModule="ParentAssistant" customModuleProvider="target"> | |
32 | - <rect key="frame" x="0.5" y="0.0" width="374" height="161"/> | |
33 | - <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/> | |
34 | - <view key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" insetsLayoutMarginsFromSafeArea="NO"> | |
35 | - <rect key="frame" x="0.0" y="0.0" width="374" height="161"/> | |
36 | - <autoresizingMask key="autoresizingMask"/> | |
37 | - <subviews> | |
38 | - <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="mlR-FH-5Nu" customClass="XRCarouselView"> | |
39 | - <rect key="frame" x="0.0" y="0.0" width="374" height="161"/> | |
40 | - <color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/> | |
41 | - </view> | |
42 | - <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="CtD-5W-zwV"> | |
43 | - <rect key="frame" x="0.0" y="141" width="374" height="20"/> | |
44 | - <color key="backgroundColor" white="0.0" alpha="0.23335255872483221" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/> | |
45 | - <constraints> | |
46 | - <constraint firstAttribute="height" constant="20" id="tlk-t1-rt0"/> | |
47 | - </constraints> | |
48 | - <fontDescription key="fontDescription" type="system" pointSize="13"/> | |
49 | - <color key="textColor" white="1" alpha="1" colorSpace="calibratedWhite"/> | |
50 | - <nil key="highlightedColor"/> | |
51 | - </label> | |
52 | - </subviews> | |
53 | - </view> | |
54 | - <constraints> | |
55 | - <constraint firstAttribute="bottom" secondItem="CtD-5W-zwV" secondAttribute="bottom" id="BKJ-uT-MBo"/> | |
56 | - <constraint firstAttribute="trailing" secondItem="CtD-5W-zwV" secondAttribute="trailing" id="CfU-o0-rKa"/> | |
57 | - <constraint firstItem="mlR-FH-5Nu" firstAttribute="top" secondItem="C9Z-rg-SZk" secondAttribute="top" id="GzZ-7c-SJQ"/> | |
58 | - <constraint firstItem="CtD-5W-zwV" firstAttribute="leading" secondItem="C9Z-rg-SZk" secondAttribute="leading" id="LTu-nA-Cao"/> | |
59 | - <constraint firstItem="mlR-FH-5Nu" firstAttribute="leading" secondItem="C9Z-rg-SZk" secondAttribute="leading" id="Nb7-pB-Ghp"/> | |
60 | - <constraint firstAttribute="trailing" secondItem="mlR-FH-5Nu" secondAttribute="trailing" id="SxQ-N0-Y0N"/> | |
61 | - <constraint firstAttribute="bottom" secondItem="mlR-FH-5Nu" secondAttribute="bottom" id="tMq-AF-wX6"/> | |
62 | - </constraints> | |
63 | - <size key="customSize" width="374" height="161"/> | |
64 | - <connections> | |
65 | - <outlet property="headerImageView" destination="mlR-FH-5Nu" id="xSr-kh-gxk"/> | |
66 | - <outlet property="title" destination="CtD-5W-zwV" id="01f-Fi-QTy"/> | |
67 | - </connections> | |
68 | - </collectionViewCell> | |
69 | - <collectionViewCell opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" reuseIdentifier="ADCell" id="MF6-Kw-UCV" customClass="InformationADCell" customModule="ParentAssistant" customModuleProvider="target"> | |
70 | - <rect key="frame" x="13.5" y="171" width="348" height="112"/> | |
71 | - <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/> | |
72 | - <view key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" insetsLayoutMarginsFromSafeArea="NO"> | |
73 | - <rect key="frame" x="0.0" y="0.0" width="348" height="112"/> | |
74 | - <autoresizingMask key="autoresizingMask"/> | |
75 | - </view> | |
76 | - <color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/> | |
77 | - <size key="customSize" width="348" height="112"/> | |
78 | - </collectionViewCell> | |
79 | - <collectionViewCell opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" reuseIdentifier="cell1" id="cWU-ha-KKs" customClass="ChannelViewControllerCell" customModule="ParentAssistant" customModuleProvider="target"> | |
80 | - <rect key="frame" x="13.5" y="293" width="348" height="132"/> | |
81 | - <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/> | |
82 | - <view key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" insetsLayoutMarginsFromSafeArea="NO"> | |
83 | - <rect key="frame" x="0.0" y="0.0" width="348" height="132"/> | |
84 | - <autoresizingMask key="autoresizingMask"/> | |
85 | - <subviews> | |
86 | - <collectionView clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="scaleToFill" showsVerticalScrollIndicator="NO" dataMode="prototypes" translatesAutoresizingMaskIntoConstraints="NO" id="UVy-LN-rIh"> | |
87 | - <rect key="frame" x="0.0" y="0.0" width="348" height="132"/> | |
88 | - <color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/> | |
89 | - <collectionViewFlowLayout key="collectionViewLayout" scrollDirection="horizontal" minimumLineSpacing="0.0" minimumInteritemSpacing="0.0" id="N6m-Dl-7w9"> | |
90 | - <size key="itemSize" width="50" height="50"/> | |
91 | - <size key="headerReferenceSize" width="0.0" height="0.0"/> | |
92 | - <size key="footerReferenceSize" width="0.0" height="0.0"/> | |
93 | - <inset key="sectionInset" minX="0.0" minY="0.0" maxX="0.0" maxY="0.0"/> | |
94 | - </collectionViewFlowLayout> | |
95 | - <cells/> | |
96 | - <connections> | |
97 | - <outlet property="dataSource" destination="cWU-ha-KKs" id="ZxT-TP-u6g"/> | |
98 | - <outlet property="delegate" destination="cWU-ha-KKs" id="M8p-FM-wb0"/> | |
99 | - </connections> | |
100 | - </collectionView> | |
101 | - </subviews> | |
102 | - </view> | |
103 | - <constraints> | |
104 | - <constraint firstItem="UVy-LN-rIh" firstAttribute="leading" secondItem="cWU-ha-KKs" secondAttribute="leading" id="6jP-NG-yGT"/> | |
105 | - <constraint firstAttribute="bottom" secondItem="UVy-LN-rIh" secondAttribute="bottom" id="HLY-bl-LbB"/> | |
106 | - <constraint firstAttribute="trailing" secondItem="UVy-LN-rIh" secondAttribute="trailing" id="NIK-YL-djb"/> | |
107 | - <constraint firstItem="UVy-LN-rIh" firstAttribute="top" secondItem="cWU-ha-KKs" secondAttribute="top" id="i6X-zn-Awk"/> | |
108 | - </constraints> | |
109 | - <size key="customSize" width="348" height="132"/> | |
110 | - <connections> | |
111 | - <outlet property="channelSelectCollectionView" destination="UVy-LN-rIh" id="loe-wl-4L8"/> | |
112 | - </connections> | |
113 | - </collectionViewCell> | |
114 | - </cells> | |
115 | - <connections> | |
116 | - <outlet property="dataSource" destination="bVx-8B-9mN" id="KcK-UP-0pg"/> | |
117 | - <outlet property="delegate" destination="bVx-8B-9mN" id="Owl-6U-OK1"/> | |
118 | - </connections> | |
119 | - </collectionView> | |
120 | - </subviews> | |
121 | - <color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/> | |
122 | - <constraints> | |
123 | - <constraint firstItem="JCs-3l-84a" firstAttribute="trailing" secondItem="BIT-6f-Ard" secondAttribute="trailing" id="7OD-37-Wfz"/> | |
124 | - <constraint firstItem="JCs-3l-84a" firstAttribute="bottom" secondItem="BIT-6f-Ard" secondAttribute="bottom" id="A2F-z2-cUs"/> | |
125 | - <constraint firstItem="JCs-3l-84a" firstAttribute="leading" secondItem="BIT-6f-Ard" secondAttribute="leading" id="jio-Jz-czF"/> | |
126 | - <constraint firstItem="JCs-3l-84a" firstAttribute="top" secondItem="BIT-6f-Ard" secondAttribute="top" id="rxj-M1-acl"/> | |
127 | - </constraints> | |
128 | - <viewLayoutGuide key="safeArea" id="BIT-6f-Ard"/> | |
129 | - </view> | |
130 | - <simulatedNavigationBarMetrics key="simulatedTopBarMetrics" prompted="NO"/> | |
131 | - <connections> | |
132 | - <outlet property="collectView" destination="JCs-3l-84a" id="rTr-7z-SHG"/> | |
133 | - </connections> | |
134 | - </viewController> | |
135 | - <placeholder placeholderIdentifier="IBFirstResponder" id="a4a-xX-AnY" userLabel="First Responder" sceneMemberID="firstResponder"/> | |
136 | - </objects> | |
137 | - <point key="canvasLocation" x="-41" y="179"/> | |
138 | - </scene> | |
139 | - </scenes> | |
140 | -</document> |
ParentAssistant/ParentAssistant/Classes/controllers/Information/InformationViewController.swift
... | ... | @@ -1,377 +0,0 @@ |
1 | -// | |
2 | -// InformationViewController.swift | |
3 | -// ParentAssistant | |
4 | -// | |
5 | -// Created by 葛建军 on 2018/3/5. | |
6 | -// Copyright © 2018年 HANGZHOUTEAM. All rights reserved. | |
7 | -// | |
8 | - | |
9 | -import UIKit | |
10 | -class InformationViewController: UIViewController,UISearchBarDelegate { | |
11 | - @IBOutlet weak var collectView: UICollectionView! | |
12 | - var leftLabel:UILabel! | |
13 | - var data:ChannelDemol! | |
14 | - var topADs:[ADSModel]=[] | |
15 | - var isFirstviewController:Bool=true | |
16 | - var channel:Int=0 | |
17 | - | |
18 | - //导航栏左侧按钮 | |
19 | - lazy var leftCityView = {()-> UIView in | |
20 | - //左按钮 | |
21 | - let leftView = UIButton.init(frame: CGRect.init(x: 0, y: 0, width: 70, height: 44)) | |
22 | - let titleLab = UILabel.init(frame: CGRect.init(x: 0, y: 0, width: 60, height: 44)) | |
23 | - | |
24 | - titleLab.font = UIFont.systemFont(ofSize: 15) | |
25 | - titleLab.numberOfLines = 0 | |
26 | - titleLab.adjustsFontSizeToFitWidth = true | |
27 | - titleLab.textAlignment = .center | |
28 | - titleLab.textColor = .white | |
29 | - titleLab.text = localAddress | |
30 | - self.leftLabel = titleLab | |
31 | - leftView.addSubview(titleLab) | |
32 | - | |
33 | - let imageView = UIImageView.init(frame: CGRect.init(x: 60, y: 11, width: 10, height: 22)) | |
34 | - imageView.image = UIImage.init(named: "report_white_pull") | |
35 | - imageView.contentMode = .scaleAspectFit | |
36 | - leftView.addSubview(imageView) | |
37 | - | |
38 | - leftView.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(EvaluationViewController.getAddreess(tap:)))) | |
39 | - return leftView | |
40 | - }() | |
41 | - | |
42 | - override func viewDidLoad() { | |
43 | - super.viewDidLoad() | |
44 | - | |
45 | - let item = UIBarButtonItem.init(title: "返回", style: .plain, target: self, action: nil) | |
46 | - self.navigationItem.backBarButtonItem = item | |
47 | - | |
48 | - drawTopUI() | |
49 | - | |
50 | - } | |
51 | - override func viewWillAppear(_ animated: Bool) { | |
52 | - super.viewWillAppear(animated) | |
53 | - | |
54 | - if isFirstviewController{ | |
55 | - let leftBtn = UIBarButtonItem.init(customView: self.leftCityView) | |
56 | - self.navigationItem.leftBarButtonItem = leftBtn | |
57 | - if localAddress == "未知" { | |
58 | - LocationManger.shared.block = { str in | |
59 | - localAddress = str | |
60 | - self.leftLabel.text = localAddress | |
61 | - self.getDataFromNet() | |
62 | - } | |
63 | - } | |
64 | - } | |
65 | - self.getDataFromNet() | |
66 | - } | |
67 | - func drawTopUI(){ | |
68 | - | |
69 | - self.configTheme() | |
70 | - //搜索框 | |
71 | - let searchView = SearchBarView.init(frame: CGRect.init(x: 0, y: 0, width: screenWidth-100, height: navigationBarHeight!)) | |
72 | - //MARK:搜索框搜索回调 | |
73 | - searchView.block = { str,type in | |
74 | - DebugLog(str) | |
75 | - switch type { | |
76 | - case .SearchType: | |
77 | - self.getList(key: str) | |
78 | - case .CancelType: | |
79 | - self.getDataFromNet() | |
80 | - } | |
81 | - } | |
82 | - self.navigationItem.titleView = searchView | |
83 | - } | |
84 | - override func viewWillDisappear(_ animated: Bool) { | |
85 | - super.viewWillDisappear(animated) | |
86 | - SVProgressHUD.dismiss() | |
87 | - } | |
88 | - //MARK: - 获取该城市下的数据 | |
89 | - private func getDataFromNet(){ | |
90 | - //position 广告位置0-首次广告位1-开屏广告位2-资讯首页3-频道首页4-频道内容5-文章内容页 | |
91 | - SVProgressHUD.show() | |
92 | - let group = DispatchGroup() | |
93 | - var position:Int = 2 | |
94 | - if !self.isFirstviewController { | |
95 | - position = 3 | |
96 | - } | |
97 | - group.enter() | |
98 | - HTTPServer.shared.getAds(["position":position as AnyObject,"areaName":localAddress as AnyObject], completionHandler: { (str, error) in//getPercentEncodingString(str: localAddress) | |
99 | - httpJsonResule(jsonString: str, error: error, successHandler: { (json) in | |
100 | - if json["status"] == 1 && error == nil{ | |
101 | - self.topADs.removeAll() | |
102 | - for item in json.contentData().arrayValue{ | |
103 | - self.topADs.append(ADSModel(j: item)) | |
104 | - } | |
105 | - } | |
106 | - }, failHandler: { (error) in | |
107 | - | |
108 | - }) | |
109 | - group.leave() | |
110 | - }) | |
111 | - group.enter() | |
112 | - let dic = self.getListDic() | |
113 | - HTTPServer.shared.getChannelInfo(dic, completionHandler: { (str, error) in | |
114 | - httpJsonResule(jsonString: str, error: error, successHandler: { (json) in | |
115 | - if json["status"] == 1 && error == nil{ | |
116 | - self.data = ChannelDemol(j: json.contentData()) | |
117 | - } | |
118 | - }, failHandler: { (error) in | |
119 | - | |
120 | - }) | |
121 | - group.leave() | |
122 | - }) | |
123 | - group.notify(queue: DispatchQueue.main) { | |
124 | - SVProgressHUD.dismiss() | |
125 | - self.collectView.reloadData() | |
126 | - } | |
127 | - } | |
128 | - //MARK: - 地址选择回调 | |
129 | - @objc func getAddreess(tap:UITapGestureRecognizer){ | |
130 | - tap.view?.isUserInteractionEnabled = false | |
131 | - LZCityPickerController.showPicker(in: self | |
132 | - , select: { (address, province, city, area, isSelect) in | |
133 | - if isSelect{ | |
134 | - tap.view?.isUserInteractionEnabled = true | |
135 | - self.leftLabel.text = area! | |
136 | - localAddress = area! | |
137 | - self.getDataFromNet() | |
138 | - } | |
139 | - }) { | |
140 | - tap.view?.isUserInteractionEnabled = true | |
141 | - } | |
142 | - } | |
143 | - | |
144 | - //MARK: - 搜索框搜索咨询 | |
145 | - func getList(key:String?) { | |
146 | - if key == nil{ | |
147 | - return | |
148 | - } | |
149 | - var dic = getListDic() | |
150 | - dic.updateValue(key as AnyObject, forKey: "keyword") | |
151 | - | |
152 | - HTTPServer.shared.getInformationTopic(dic, completionHandler: { (str, error) in | |
153 | - httpJsonResule(jsonString: str, error: error, successHandler: { (json) in | |
154 | - if json["status"] == 1 && error == nil{ | |
155 | - self.data.channelContent.removeAll() | |
156 | - for item in json.contentData()["channelList"].arrayValue{ | |
157 | - self.data.channelContent.append(ChannelContentDemol(j: item)) | |
158 | - } | |
159 | - self.collectView.reloadData() | |
160 | - } | |
161 | - }, failHandler: { (error) in | |
162 | - | |
163 | - }) | |
164 | - }) | |
165 | - } | |
166 | - | |
167 | - //获得请求参数 | |
168 | - func getListDic()->[String:AnyObject]{ | |
169 | - var dic = [ "areaName": localAddress as AnyObject,"pageIndex": 1 as AnyObject,"pageSize": 20 as AnyObject] | |
170 | - var toFirstPage:Int = 1 | |
171 | - var ch:Int = 0 | |
172 | - if !isFirstviewController{ | |
173 | - toFirstPage = 0 | |
174 | - ch = channel | |
175 | - } | |
176 | - dic.updateValue(ch as AnyObject, forKey: "channel") | |
177 | - dic.updateValue(toFirstPage as AnyObject, forKey: "toFirstPage") | |
178 | - return dic | |
179 | - } | |
180 | - | |
181 | - | |
182 | - override func didReceiveMemoryWarning() { | |
183 | - super.didReceiveMemoryWarning() | |
184 | - // Dispose of any resources that can be recreated. | |
185 | - } | |
186 | - | |
187 | - //点击资讯进入详情 | |
188 | - func pushToInfoView(index:Int){ | |
189 | - let vcs = Story.instantiateViewControllerWithIdentifier("JSViewController", storyName: "JS") as! JSViewController | |
190 | - if data.channelContent[index].url != "" { | |
191 | - vcs.webURL = data.channelContent[index].url | |
192 | - }else{ | |
193 | - vcs.webURL = (HOSTWAP+"/InformationDetail.aspx?id="+"\(data.channelContent[index].id)"+"&areaname="+localAddress).addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed)! | |
194 | - } | |
195 | - self.navigationController?.present(vcs.wrapWithNavigationController(), animated: true, completion: nil) | |
196 | - } | |
197 | - | |
198 | -} | |
199 | - | |
200 | -extension InformationViewController:XRCarouselViewDelegate{ | |
201 | - func carouselView(_ carouselView: XRCarouselView!, clickImageAt index: Int) { | |
202 | - pushToInfoView(index: index) | |
203 | - } | |
204 | -} | |
205 | - | |
206 | -//整体分三个部分1.轮播图,2频道栏,3列表 | |
207 | -extension InformationViewController:UICollectionViewDataSource,UICollectionViewDelegateFlowLayout,UICollectionViewDelegate{ | |
208 | - func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { | |
209 | - switch section { | |
210 | - case 0: | |
211 | - return 1 | |
212 | - case 1: | |
213 | - if data != nil && data.subchannel.count > 0{ | |
214 | - return 1 | |
215 | - } | |
216 | - return 0 | |
217 | - default: | |
218 | - return data != nil ? data.channelContent.count : 0 | |
219 | - } | |
220 | - } | |
221 | - | |
222 | - func numberOfSections(in collectionView: UICollectionView) -> Int { | |
223 | - return 3 | |
224 | - } | |
225 | - | |
226 | - func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize { | |
227 | - switch indexPath.section { | |
228 | - case 0: | |
229 | - return CGSize(width: getScreenWidth(), height: getScreenWidth()/375*200) | |
230 | - case 1: | |
231 | - return CGSize(width: getScreenWidth()-20, height: 92) | |
232 | - default: | |
233 | -// if indexPath.row == 0{ | |
234 | - return CGSize(width: getScreenWidth()-20, height: 92) | |
235 | -// } | |
236 | -// return CGSize(width: getScreenWidth()-20, height: 180) | |
237 | - } | |
238 | - } | |
239 | - | |
240 | - func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, referenceSizeForHeaderInSection section: Int) -> CGSize { | |
241 | - if section == 2{ | |
242 | - return CGSize(width: getScreenWidth()-20, height: 40) | |
243 | - }else{ | |
244 | - return CGSize(width: getScreenWidth(), height: 10) | |
245 | - } | |
246 | - } | |
247 | - | |
248 | - func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { | |
249 | - collectionView.register(UINib(nibName: "ChannelCollectionViewCell", bundle: nil), forCellWithReuseIdentifier: "contentCell") | |
250 | - switch indexPath.section { | |
251 | - case 0: | |
252 | - let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "topCell", for: indexPath) as! InformationViewTopCell | |
253 | - if topADs.count > 0 { | |
254 | - var arr:[String]=[] | |
255 | - for item in topADs{ | |
256 | - arr.append(HOSTImage+item.fileSrc) | |
257 | - } | |
258 | - cell.headerImageView.imageArray = arr | |
259 | - } | |
260 | - return cell | |
261 | - case 1: | |
262 | - | |
263 | - let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "channelSelectCell", for: indexPath) as! ChannelSelectView | |
264 | - cell.SubchannelList = data.subchannel | |
265 | - cell.superNC = self.navigationController | |
266 | - return cell | |
267 | - default: | |
268 | -// if indexPath.row == 0{ | |
269 | - let item = data.channelContent[indexPath.row] | |
270 | - let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "contentCell", for: indexPath) as! ChannelCollectionViewCell | |
271 | - cell.title.text = item.title | |
272 | - cell.option.text = item.content | |
273 | - cell.optionNum.text = "\(item.lookNum)" | |
274 | - cell.shareNum.text = "\(item.forwardingNum)" | |
275 | - cell.picture.sd_setImage(with: URL(string: (HOSTImage+item.image).addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed)!), placeholderImage: UIImage(named: "navigationBar_backgrounImage")) | |
276 | - return cell | |
277 | -// }else{ | |
278 | -// let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "adiouPlayerCell", for: indexPath) as! AdiouPlayerCell | |
279 | -// return cell | |
280 | -// } | |
281 | - } | |
282 | - } | |
283 | - | |
284 | - func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) { | |
285 | - switch indexPath.section { | |
286 | - case 1: | |
287 | - let vc = Story.instantiateViewControllerWithIdentifier("InformationViewControllerVC", storyName: "Main") as! InformationViewController | |
288 | - vc.channel = data.subchannel[indexPath.row].id | |
289 | - vc.isFirstviewController = false | |
290 | - self.navigationController?.pushViewController(vc, animated: true) | |
291 | - break | |
292 | - default: | |
293 | - let vcs = Story.instantiateViewControllerWithIdentifier("JSViewController", storyName: "JS") as! JSViewController | |
294 | - if data.channelContent[indexPath.row].url != "" { | |
295 | - vcs.webURL = data.channelContent[indexPath.row].url | |
296 | - }else{ | |
297 | - vcs.webURL = (HOSTWAP+"/InformationDetail.aspx?id="+"\(data.channelContent[indexPath.row].id)"+"&areaname="+localAddress).addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed)! | |
298 | - } | |
299 | - self.navigationController?.present(vcs.wrapWithNavigationController(), animated: true, completion: nil) | |
300 | - | |
301 | -// pushToInfoView(index: indexPath.row) | |
302 | - } | |
303 | - } | |
304 | - | |
305 | - func collectionView(_ collectionView: UICollectionView, viewForSupplementaryElementOfKind kind: String, at indexPath: IndexPath) -> UICollectionReusableView { | |
306 | - var reusableview:UICollectionReusableView? | |
307 | - if kind == UICollectionElementKindSectionHeader{ | |
308 | - let headerView = collectionView.dequeueReusableSupplementaryView(ofKind: UICollectionElementKindSectionHeader, withReuseIdentifier: "headerView", for: indexPath) as! InformationSectionHeader | |
309 | - headerView.title.text = "咨讯话题" | |
310 | - reusableview = headerView | |
311 | - } | |
312 | - if indexPath.section == 2{ | |
313 | - reusableview?.isHidden = false | |
314 | - }else{ | |
315 | - reusableview?.isHidden = true | |
316 | - } | |
317 | - return reusableview! | |
318 | - } | |
319 | -} | |
320 | - | |
321 | - | |
322 | -class InformationSectionHeader: UICollectionReusableView { | |
323 | - @IBOutlet weak var title: UILabel! | |
324 | - | |
325 | -} | |
326 | - | |
327 | -//首页的轮播图所在的cell | |
328 | -class InformationViewTopCell: UICollectionViewCell { | |
329 | - | |
330 | - @IBOutlet weak var headerImageView: XRCarouselView! | |
331 | - | |
332 | -} | |
333 | - | |
334 | -//视频cell | |
335 | -class AdiouPlayerCell: UICollectionViewCell { | |
336 | - | |
337 | -} | |
338 | - | |
339 | -//频道栏 | |
340 | -class ChannelSelectView: UICollectionViewCell { | |
341 | - var superNC:UINavigationController! | |
342 | - var SubchannelList:[SubchannelDemol]=[] | |
343 | - @IBOutlet weak var channelSelectCollectionView: UICollectionView! | |
344 | - override func awakeFromNib() { | |
345 | - channelSelectCollectionView.register(UINib(nibName: "ChannelSelectViewCollectionViewCell", bundle: nil), forCellWithReuseIdentifier: "channelcell") | |
346 | - } | |
347 | -} | |
348 | - | |
349 | -extension ChannelSelectView:UICollectionViewDataSource,UICollectionViewDelegateFlowLayout,UICollectionViewDelegate{ | |
350 | - func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { | |
351 | - return SubchannelList.count | |
352 | - } | |
353 | - | |
354 | - func numberOfSections(in collectionView: UICollectionView) -> Int { | |
355 | - return 1 | |
356 | - } | |
357 | - | |
358 | - func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize { | |
359 | - return CGSize(width: (getScreenWidth()-20)/4, height: 92) | |
360 | - } | |
361 | - | |
362 | - func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { | |
363 | - let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "channelcell", for: indexPath) as! ChannelSelectViewCollectionViewCell | |
364 | - cell.image.sd_setImage(with: URL(string: (HOSTImage+SubchannelList[indexPath.row].channelImage).addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed)!), placeholderImage: UIImage(named: "evaluation_icon_highSchoolEnter")) | |
365 | - cell.channelName.text = SubchannelList[indexPath.row].channelName | |
366 | - return cell | |
367 | - } | |
368 | - | |
369 | - func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) { | |
370 | - let vc = Story.instantiateViewControllerWithIdentifier("InformationViewControllerVC", storyName: "Main") as! InformationViewController | |
371 | - vc.channel = SubchannelList[indexPath.row].id | |
372 | - vc.isFirstviewController = false | |
373 | - superNC.pushViewController(vc, animated: true) | |
374 | - } | |
375 | -} | |
376 | - | |
377 | - |
ParentAssistant/ParentAssistant/Classes/controllers/Information/View/ChannelCollectionViewCell.swift
0 → 100644
... | ... | @@ -0,0 +1,24 @@ |
1 | +// | |
2 | +// ChannelCollectionViewCell.swift | |
3 | +// ParentAssistant | |
4 | +// | |
5 | +// Created by 左丞 on 2018/3/6. | |
6 | +// Copyright © 2018年 HANGZHOUTEAM. All rights reserved. | |
7 | +// | |
8 | + | |
9 | +import UIKit | |
10 | + | |
11 | +class ChannelCollectionViewCell: UICollectionViewCell { | |
12 | + | |
13 | + @IBOutlet weak var title: UILabel! | |
14 | + @IBOutlet weak var option: UILabel! | |
15 | + @IBOutlet weak var optionNum: UILabel! | |
16 | + @IBOutlet weak var shareNum: UILabel! | |
17 | + @IBOutlet weak var picture: UIImageView! | |
18 | + | |
19 | + override func awakeFromNib() { | |
20 | + super.awakeFromNib() | |
21 | + // Initialization code | |
22 | + } | |
23 | + | |
24 | +} | ... | ... |
ParentAssistant/ParentAssistant/Classes/controllers/Information/View/ChannelCollectionViewCell.xib
0 → 100644
... | ... | @@ -0,0 +1,102 @@ |
1 | +<?xml version="1.0" encoding="UTF-8"?> | |
2 | +<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="13771" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES"> | |
3 | + <device id="retina4_7" orientation="portrait"> | |
4 | + <adaptation id="fullscreen"/> | |
5 | + </device> | |
6 | + <dependencies> | |
7 | + <deployment identifier="iOS"/> | |
8 | + <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="13772"/> | |
9 | + <capability name="Aspect ratio constraints" minToolsVersion="5.1"/> | |
10 | + <capability name="Safe area layout guides" minToolsVersion="9.0"/> | |
11 | + <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/> | |
12 | + </dependencies> | |
13 | + <objects> | |
14 | + <placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner"/> | |
15 | + <placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/> | |
16 | + <collectionViewCell opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" reuseIdentifier="contentCell" id="gTV-IL-0wX" customClass="ChannelCollectionViewCell" customModule="ParentAssistant" customModuleProvider="target"> | |
17 | + <rect key="frame" x="0.0" y="0.0" width="356" height="92"/> | |
18 | + <autoresizingMask key="autoresizingMask"/> | |
19 | + <view key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center"> | |
20 | + <rect key="frame" x="0.0" y="0.0" width="356" height="92"/> | |
21 | + <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/> | |
22 | + <subviews> | |
23 | + <imageView userInteractionEnabled="NO" contentMode="scaleToFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="evaluation_bar_icon_select" translatesAutoresizingMaskIntoConstraints="NO" id="eQ3-Og-YNl"> | |
24 | + <rect key="frame" x="233.5" y="0.0" width="122.5" height="92"/> | |
25 | + <constraints> | |
26 | + <constraint firstAttribute="width" secondItem="eQ3-Og-YNl" secondAttribute="height" multiplier="4:3" id="tCt-vK-QBF"/> | |
27 | + </constraints> | |
28 | + </imageView> | |
29 | + <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="学校初一段家长统一测试使用家长会得到良好反馈评论" textAlignment="natural" lineBreakMode="tailTruncation" numberOfLines="2" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="OQ2-lU-wfc"> | |
30 | + <rect key="frame" x="8" y="8" width="212.5" height="31.5"/> | |
31 | + <fontDescription key="fontDescription" type="system" pointSize="13"/> | |
32 | + <nil key="textColor"/> | |
33 | + <nil key="highlightedColor"/> | |
34 | + </label> | |
35 | + <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="家长表示对孩子学习情况更加了解" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="rCP-jW-BhO"> | |
36 | + <rect key="frame" x="8" y="47.5" width="199" height="16"/> | |
37 | + <fontDescription key="fontDescription" type="system" pointSize="13"/> | |
38 | + <color key="textColor" red="0.27503338459999999" green="0.50970917940000005" blue="0.90092128520000003" alpha="1" colorSpace="custom" customColorSpace="sRGB"/> | |
39 | + <nil key="highlightedColor"/> | |
40 | + </label> | |
41 | + <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="浏览量:" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="Lvp-kr-OuU"> | |
42 | + <rect key="frame" x="8" y="72" width="34" height="12"/> | |
43 | + <fontDescription key="fontDescription" type="system" pointSize="10"/> | |
44 | + <color key="textColor" white="0.33333333333333331" alpha="1" colorSpace="calibratedWhite"/> | |
45 | + <nil key="highlightedColor"/> | |
46 | + </label> | |
47 | + <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="30" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="3KK-be-Vix"> | |
48 | + <rect key="frame" x="50" y="72" width="13" height="12"/> | |
49 | + <fontDescription key="fontDescription" type="system" pointSize="10"/> | |
50 | + <color key="textColor" white="0.33333333333333331" alpha="1" colorSpace="calibratedWhite"/> | |
51 | + <nil key="highlightedColor"/> | |
52 | + </label> | |
53 | + <label hidden="YES" opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="转发:" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="wMQ-5O-LNi"> | |
54 | + <rect key="frame" x="182" y="72" width="24" height="12"/> | |
55 | + <fontDescription key="fontDescription" type="system" pointSize="10"/> | |
56 | + <color key="textColor" white="0.33333333333333331" alpha="1" colorSpace="calibratedWhite"/> | |
57 | + <nil key="highlightedColor"/> | |
58 | + </label> | |
59 | + <label hidden="YES" opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="15" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="Dfn-o9-z6k"> | |
60 | + <rect key="frame" x="214" y="72" width="11.5" height="12"/> | |
61 | + <fontDescription key="fontDescription" type="system" pointSize="10"/> | |
62 | + <color key="textColor" white="0.33333333333333331" alpha="1" colorSpace="calibratedWhite"/> | |
63 | + <nil key="highlightedColor"/> | |
64 | + </label> | |
65 | + </subviews> | |
66 | + </view> | |
67 | + <color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/> | |
68 | + <constraints> | |
69 | + <constraint firstAttribute="bottom" secondItem="Lvp-kr-OuU" secondAttribute="bottom" constant="8" id="Byp-df-Jy7"/> | |
70 | + <constraint firstItem="Lvp-kr-OuU" firstAttribute="leading" secondItem="gTV-IL-0wX" secondAttribute="leading" constant="8" id="Fk1-Tk-asI"/> | |
71 | + <constraint firstItem="Dfn-o9-z6k" firstAttribute="leading" secondItem="wMQ-5O-LNi" secondAttribute="trailing" constant="8" id="Gc2-EO-NVm"/> | |
72 | + <constraint firstAttribute="bottom" secondItem="eQ3-Og-YNl" secondAttribute="bottom" id="I4I-3J-xap"/> | |
73 | + <constraint firstItem="Dfn-o9-z6k" firstAttribute="centerY" secondItem="Lvp-kr-OuU" secondAttribute="centerY" id="Jef-4L-wjV"/> | |
74 | + <constraint firstItem="rCP-jW-BhO" firstAttribute="top" secondItem="OQ2-lU-wfc" secondAttribute="bottom" constant="8" id="Mrr-we-WzT"/> | |
75 | + <constraint firstItem="OQ2-lU-wfc" firstAttribute="leading" secondItem="gTV-IL-0wX" secondAttribute="leading" constant="8" id="Nb3-bA-CI7"/> | |
76 | + <constraint firstItem="eQ3-Og-YNl" firstAttribute="leading" relation="greaterThanOrEqual" secondItem="OQ2-lU-wfc" secondAttribute="trailing" constant="8" id="SHC-MY-WAd"/> | |
77 | + <constraint firstAttribute="trailing" secondItem="eQ3-Og-YNl" secondAttribute="trailing" id="VIw-Gd-Dvd"/> | |
78 | + <constraint firstItem="OQ2-lU-wfc" firstAttribute="top" secondItem="gTV-IL-0wX" secondAttribute="top" constant="8" id="Z2B-aQ-k1m"/> | |
79 | + <constraint firstItem="3KK-be-Vix" firstAttribute="leading" secondItem="Lvp-kr-OuU" secondAttribute="trailing" constant="8" id="ZrX-iC-mgd"/> | |
80 | + <constraint firstItem="wMQ-5O-LNi" firstAttribute="centerY" secondItem="Lvp-kr-OuU" secondAttribute="centerY" id="afZ-7s-EpS"/> | |
81 | + <constraint firstItem="eQ3-Og-YNl" firstAttribute="top" secondItem="gTV-IL-0wX" secondAttribute="top" id="hk0-np-mNK"/> | |
82 | + <constraint firstItem="eQ3-Og-YNl" firstAttribute="leading" secondItem="Dfn-o9-z6k" secondAttribute="trailing" constant="8" id="loX-Pj-ebX"/> | |
83 | + <constraint firstItem="rCP-jW-BhO" firstAttribute="leading" secondItem="gTV-IL-0wX" secondAttribute="leading" constant="8" id="qbH-za-saN"/> | |
84 | + <constraint firstItem="eQ3-Og-YNl" firstAttribute="leading" relation="greaterThanOrEqual" secondItem="rCP-jW-BhO" secondAttribute="trailing" constant="8" id="xYy-wE-zrW"/> | |
85 | + <constraint firstItem="3KK-be-Vix" firstAttribute="centerY" secondItem="Lvp-kr-OuU" secondAttribute="centerY" id="yji-Eb-5jx"/> | |
86 | + </constraints> | |
87 | + <viewLayoutGuide key="safeArea" id="ZTg-uK-7eu"/> | |
88 | + <size key="customSize" width="402" height="109"/> | |
89 | + <connections> | |
90 | + <outlet property="option" destination="rCP-jW-BhO" id="ct6-xZ-Y3V"/> | |
91 | + <outlet property="optionNum" destination="3KK-be-Vix" id="5Cz-Ly-1tm"/> | |
92 | + <outlet property="picture" destination="eQ3-Og-YNl" id="JUz-7i-ANc"/> | |
93 | + <outlet property="shareNum" destination="Dfn-o9-z6k" id="h2t-eK-3a8"/> | |
94 | + <outlet property="title" destination="OQ2-lU-wfc" id="sJJ-Eb-zWE"/> | |
95 | + </connections> | |
96 | + <point key="canvasLocation" x="12" y="85.5"/> | |
97 | + </collectionViewCell> | |
98 | + </objects> | |
99 | + <resources> | |
100 | + <image name="evaluation_bar_icon_select" width="22" height="21"/> | |
101 | + </resources> | |
102 | +</document> | ... | ... |
ParentAssistant/ParentAssistant/Classes/controllers/Information/View/ChannelSelectViewCollectionViewCell.swift
0 → 100644
... | ... | @@ -0,0 +1,21 @@ |
1 | +// | |
2 | +// ChannelSelectViewCollectionViewCell.swift | |
3 | +// ParentAssistant | |
4 | +// | |
5 | +// Created by 左丞 on 2018/3/6. | |
6 | +// Copyright © 2018年 HANGZHOUTEAM. All rights reserved. | |
7 | +// | |
8 | + | |
9 | +import UIKit | |
10 | + | |
11 | +class ChannelSelectViewCollectionViewCell: UICollectionViewCell { | |
12 | + | |
13 | + @IBOutlet weak var image: UIImageView! | |
14 | + @IBOutlet weak var channelName: UILabel! | |
15 | + | |
16 | + override func awakeFromNib() { | |
17 | + super.awakeFromNib() | |
18 | + // Initialization code | |
19 | + } | |
20 | + | |
21 | +} | ... | ... |
ParentAssistant/ParentAssistant/Classes/controllers/Information/View/ChannelSelectViewCollectionViewCell.xib
0 → 100644
... | ... | @@ -0,0 +1,65 @@ |
1 | +<?xml version="1.0" encoding="UTF-8"?> | |
2 | +<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="13771" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES"> | |
3 | + <device id="retina4_7" orientation="portrait"> | |
4 | + <adaptation id="fullscreen"/> | |
5 | + </device> | |
6 | + <dependencies> | |
7 | + <deployment identifier="iOS"/> | |
8 | + <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="13772"/> | |
9 | + <capability name="Aspect ratio constraints" minToolsVersion="5.1"/> | |
10 | + <capability name="Safe area layout guides" minToolsVersion="9.0"/> | |
11 | + <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/> | |
12 | + </dependencies> | |
13 | + <objects> | |
14 | + <placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner"/> | |
15 | + <placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/> | |
16 | + <collectionViewCell opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" reuseIdentifier="channelcell" id="gTV-IL-0wX" customClass="ChannelSelectViewCollectionViewCell" customModule="ParentAssistant" customModuleProvider="target"> | |
17 | + <rect key="frame" x="0.0" y="0.0" width="89" height="92"/> | |
18 | + <autoresizingMask key="autoresizingMask"/> | |
19 | + <view key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center"> | |
20 | + <rect key="frame" x="0.0" y="0.0" width="89" height="92"/> | |
21 | + <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/> | |
22 | + <subviews> | |
23 | + <imageView userInteractionEnabled="NO" contentMode="scaleToFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="evaluation_icon_highSchoolEnter" translatesAutoresizingMaskIntoConstraints="NO" id="Eco-Nm-1SK"> | |
24 | + <rect key="frame" x="18.5" y="8" width="52" height="52"/> | |
25 | + <constraints> | |
26 | + <constraint firstAttribute="width" secondItem="Eco-Nm-1SK" secondAttribute="height" multiplier="1:1" id="8K9-ZW-Cxu"/> | |
27 | + </constraints> | |
28 | + <userDefinedRuntimeAttributes> | |
29 | + <userDefinedRuntimeAttribute type="boolean" keyPath="layer.masksToBounds" value="YES"/> | |
30 | + <userDefinedRuntimeAttribute type="number" keyPath="layer.cornerRadius"> | |
31 | + <integer key="value" value="0"/> | |
32 | + </userDefinedRuntimeAttribute> | |
33 | + </userDefinedRuntimeAttributes> | |
34 | + </imageView> | |
35 | + <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Label" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="c3X-8c-2EH"> | |
36 | + <rect key="frame" x="28" y="68" width="33" height="16"/> | |
37 | + <constraints> | |
38 | + <constraint firstAttribute="height" constant="16" id="Zvs-7M-0pT"/> | |
39 | + </constraints> | |
40 | + <fontDescription key="fontDescription" type="system" pointSize="13"/> | |
41 | + <color key="textColor" red="0.27450980390000002" green="0.50980392159999999" blue="0.90196078430000004" alpha="1" colorSpace="custom" customColorSpace="sRGB"/> | |
42 | + <nil key="highlightedColor"/> | |
43 | + </label> | |
44 | + </subviews> | |
45 | + </view> | |
46 | + <constraints> | |
47 | + <constraint firstAttribute="bottom" secondItem="c3X-8c-2EH" secondAttribute="bottom" constant="8" id="LNs-qC-rfU"/> | |
48 | + <constraint firstItem="c3X-8c-2EH" firstAttribute="top" secondItem="Eco-Nm-1SK" secondAttribute="bottom" constant="8" id="Z84-pm-JFu"/> | |
49 | + <constraint firstItem="Eco-Nm-1SK" firstAttribute="centerX" secondItem="gTV-IL-0wX" secondAttribute="centerX" id="elr-rq-5kH"/> | |
50 | + <constraint firstItem="Eco-Nm-1SK" firstAttribute="top" secondItem="gTV-IL-0wX" secondAttribute="top" constant="8" id="oPj-M0-Aap"/> | |
51 | + <constraint firstItem="c3X-8c-2EH" firstAttribute="centerX" secondItem="gTV-IL-0wX" secondAttribute="centerX" id="wIz-FB-ESA"/> | |
52 | + </constraints> | |
53 | + <viewLayoutGuide key="safeArea" id="ZTg-uK-7eu"/> | |
54 | + <size key="customSize" width="96" height="108"/> | |
55 | + <connections> | |
56 | + <outlet property="channelName" destination="c3X-8c-2EH" id="trZ-23-1dk"/> | |
57 | + <outlet property="image" destination="Eco-Nm-1SK" id="jsu-CI-9Ti"/> | |
58 | + </connections> | |
59 | + <point key="canvasLocation" x="48" y="63"/> | |
60 | + </collectionViewCell> | |
61 | + </objects> | |
62 | + <resources> | |
63 | + <image name="evaluation_icon_highSchoolEnter" width="44" height="44"/> | |
64 | + </resources> | |
65 | +</document> | ... | ... |
ParentAssistant/ParentAssistant/Classes/controllers/Information/view/ChannelCollectionViewCell.swift
... | ... | @@ -1,24 +0,0 @@ |
1 | -// | |
2 | -// ChannelCollectionViewCell.swift | |
3 | -// ParentAssistant | |
4 | -// | |
5 | -// Created by 左丞 on 2018/3/6. | |
6 | -// Copyright © 2018年 HANGZHOUTEAM. All rights reserved. | |
7 | -// | |
8 | - | |
9 | -import UIKit | |
10 | - | |
11 | -class ChannelCollectionViewCell: UICollectionViewCell { | |
12 | - | |
13 | - @IBOutlet weak var title: UILabel! | |
14 | - @IBOutlet weak var option: UILabel! | |
15 | - @IBOutlet weak var optionNum: UILabel! | |
16 | - @IBOutlet weak var shareNum: UILabel! | |
17 | - @IBOutlet weak var picture: UIImageView! | |
18 | - | |
19 | - override func awakeFromNib() { | |
20 | - super.awakeFromNib() | |
21 | - // Initialization code | |
22 | - } | |
23 | - | |
24 | -} |
ParentAssistant/ParentAssistant/Classes/controllers/Information/view/ChannelCollectionViewCell.xib
... | ... | @@ -1,102 +0,0 @@ |
1 | -<?xml version="1.0" encoding="UTF-8"?> | |
2 | -<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="13771" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES"> | |
3 | - <device id="retina4_7" orientation="portrait"> | |
4 | - <adaptation id="fullscreen"/> | |
5 | - </device> | |
6 | - <dependencies> | |
7 | - <deployment identifier="iOS"/> | |
8 | - <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="13772"/> | |
9 | - <capability name="Aspect ratio constraints" minToolsVersion="5.1"/> | |
10 | - <capability name="Safe area layout guides" minToolsVersion="9.0"/> | |
11 | - <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/> | |
12 | - </dependencies> | |
13 | - <objects> | |
14 | - <placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner"/> | |
15 | - <placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/> | |
16 | - <collectionViewCell opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" reuseIdentifier="contentCell" id="gTV-IL-0wX" customClass="ChannelCollectionViewCell" customModule="ParentAssistant" customModuleProvider="target"> | |
17 | - <rect key="frame" x="0.0" y="0.0" width="356" height="92"/> | |
18 | - <autoresizingMask key="autoresizingMask"/> | |
19 | - <view key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center"> | |
20 | - <rect key="frame" x="0.0" y="0.0" width="356" height="92"/> | |
21 | - <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/> | |
22 | - <subviews> | |
23 | - <imageView userInteractionEnabled="NO" contentMode="scaleToFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="evaluation_bar_icon_select" translatesAutoresizingMaskIntoConstraints="NO" id="eQ3-Og-YNl"> | |
24 | - <rect key="frame" x="233.5" y="0.0" width="122.5" height="92"/> | |
25 | - <constraints> | |
26 | - <constraint firstAttribute="width" secondItem="eQ3-Og-YNl" secondAttribute="height" multiplier="4:3" id="tCt-vK-QBF"/> | |
27 | - </constraints> | |
28 | - </imageView> | |
29 | - <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="学校初一段家长统一测试使用家长会得到良好反馈评论" textAlignment="natural" lineBreakMode="tailTruncation" numberOfLines="2" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="OQ2-lU-wfc"> | |
30 | - <rect key="frame" x="8" y="8" width="212.5" height="31.5"/> | |
31 | - <fontDescription key="fontDescription" type="system" pointSize="13"/> | |
32 | - <nil key="textColor"/> | |
33 | - <nil key="highlightedColor"/> | |
34 | - </label> | |
35 | - <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="家长表示对孩子学习情况更加了解" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="rCP-jW-BhO"> | |
36 | - <rect key="frame" x="8" y="47.5" width="199" height="16"/> | |
37 | - <fontDescription key="fontDescription" type="system" pointSize="13"/> | |
38 | - <color key="textColor" red="0.27503338459999999" green="0.50970917940000005" blue="0.90092128520000003" alpha="1" colorSpace="custom" customColorSpace="sRGB"/> | |
39 | - <nil key="highlightedColor"/> | |
40 | - </label> | |
41 | - <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="浏览量:" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="Lvp-kr-OuU"> | |
42 | - <rect key="frame" x="8" y="72" width="34" height="12"/> | |
43 | - <fontDescription key="fontDescription" type="system" pointSize="10"/> | |
44 | - <color key="textColor" white="0.33333333333333331" alpha="1" colorSpace="calibratedWhite"/> | |
45 | - <nil key="highlightedColor"/> | |
46 | - </label> | |
47 | - <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="30" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="3KK-be-Vix"> | |
48 | - <rect key="frame" x="50" y="72" width="13" height="12"/> | |
49 | - <fontDescription key="fontDescription" type="system" pointSize="10"/> | |
50 | - <color key="textColor" white="0.33333333333333331" alpha="1" colorSpace="calibratedWhite"/> | |
51 | - <nil key="highlightedColor"/> | |
52 | - </label> | |
53 | - <label hidden="YES" opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="转发:" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="wMQ-5O-LNi"> | |
54 | - <rect key="frame" x="182" y="72" width="24" height="12"/> | |
55 | - <fontDescription key="fontDescription" type="system" pointSize="10"/> | |
56 | - <color key="textColor" white="0.33333333333333331" alpha="1" colorSpace="calibratedWhite"/> | |
57 | - <nil key="highlightedColor"/> | |
58 | - </label> | |
59 | - <label hidden="YES" opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="15" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="Dfn-o9-z6k"> | |
60 | - <rect key="frame" x="214" y="72" width="11.5" height="12"/> | |
61 | - <fontDescription key="fontDescription" type="system" pointSize="10"/> | |
62 | - <color key="textColor" white="0.33333333333333331" alpha="1" colorSpace="calibratedWhite"/> | |
63 | - <nil key="highlightedColor"/> | |
64 | - </label> | |
65 | - </subviews> | |
66 | - </view> | |
67 | - <color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/> | |
68 | - <constraints> | |
69 | - <constraint firstAttribute="bottom" secondItem="Lvp-kr-OuU" secondAttribute="bottom" constant="8" id="Byp-df-Jy7"/> | |
70 | - <constraint firstItem="Lvp-kr-OuU" firstAttribute="leading" secondItem="gTV-IL-0wX" secondAttribute="leading" constant="8" id="Fk1-Tk-asI"/> | |
71 | - <constraint firstItem="Dfn-o9-z6k" firstAttribute="leading" secondItem="wMQ-5O-LNi" secondAttribute="trailing" constant="8" id="Gc2-EO-NVm"/> | |
72 | - <constraint firstAttribute="bottom" secondItem="eQ3-Og-YNl" secondAttribute="bottom" id="I4I-3J-xap"/> | |
73 | - <constraint firstItem="Dfn-o9-z6k" firstAttribute="centerY" secondItem="Lvp-kr-OuU" secondAttribute="centerY" id="Jef-4L-wjV"/> | |
74 | - <constraint firstItem="rCP-jW-BhO" firstAttribute="top" secondItem="OQ2-lU-wfc" secondAttribute="bottom" constant="8" id="Mrr-we-WzT"/> | |
75 | - <constraint firstItem="OQ2-lU-wfc" firstAttribute="leading" secondItem="gTV-IL-0wX" secondAttribute="leading" constant="8" id="Nb3-bA-CI7"/> | |
76 | - <constraint firstItem="eQ3-Og-YNl" firstAttribute="leading" relation="greaterThanOrEqual" secondItem="OQ2-lU-wfc" secondAttribute="trailing" constant="8" id="SHC-MY-WAd"/> | |
77 | - <constraint firstAttribute="trailing" secondItem="eQ3-Og-YNl" secondAttribute="trailing" id="VIw-Gd-Dvd"/> | |
78 | - <constraint firstItem="OQ2-lU-wfc" firstAttribute="top" secondItem="gTV-IL-0wX" secondAttribute="top" constant="8" id="Z2B-aQ-k1m"/> | |
79 | - <constraint firstItem="3KK-be-Vix" firstAttribute="leading" secondItem="Lvp-kr-OuU" secondAttribute="trailing" constant="8" id="ZrX-iC-mgd"/> | |
80 | - <constraint firstItem="wMQ-5O-LNi" firstAttribute="centerY" secondItem="Lvp-kr-OuU" secondAttribute="centerY" id="afZ-7s-EpS"/> | |
81 | - <constraint firstItem="eQ3-Og-YNl" firstAttribute="top" secondItem="gTV-IL-0wX" secondAttribute="top" id="hk0-np-mNK"/> | |
82 | - <constraint firstItem="eQ3-Og-YNl" firstAttribute="leading" secondItem="Dfn-o9-z6k" secondAttribute="trailing" constant="8" id="loX-Pj-ebX"/> | |
83 | - <constraint firstItem="rCP-jW-BhO" firstAttribute="leading" secondItem="gTV-IL-0wX" secondAttribute="leading" constant="8" id="qbH-za-saN"/> | |
84 | - <constraint firstItem="eQ3-Og-YNl" firstAttribute="leading" relation="greaterThanOrEqual" secondItem="rCP-jW-BhO" secondAttribute="trailing" constant="8" id="xYy-wE-zrW"/> | |
85 | - <constraint firstItem="3KK-be-Vix" firstAttribute="centerY" secondItem="Lvp-kr-OuU" secondAttribute="centerY" id="yji-Eb-5jx"/> | |
86 | - </constraints> | |
87 | - <viewLayoutGuide key="safeArea" id="ZTg-uK-7eu"/> | |
88 | - <size key="customSize" width="402" height="109"/> | |
89 | - <connections> | |
90 | - <outlet property="option" destination="rCP-jW-BhO" id="ct6-xZ-Y3V"/> | |
91 | - <outlet property="optionNum" destination="3KK-be-Vix" id="5Cz-Ly-1tm"/> | |
92 | - <outlet property="picture" destination="eQ3-Og-YNl" id="JUz-7i-ANc"/> | |
93 | - <outlet property="shareNum" destination="Dfn-o9-z6k" id="h2t-eK-3a8"/> | |
94 | - <outlet property="title" destination="OQ2-lU-wfc" id="sJJ-Eb-zWE"/> | |
95 | - </connections> | |
96 | - <point key="canvasLocation" x="12" y="85.5"/> | |
97 | - </collectionViewCell> | |
98 | - </objects> | |
99 | - <resources> | |
100 | - <image name="evaluation_bar_icon_select" width="22" height="21"/> | |
101 | - </resources> | |
102 | -</document> |
ParentAssistant/ParentAssistant/Classes/controllers/Information/view/ChannelSelectViewCollectionViewCell.swift
... | ... | @@ -1,21 +0,0 @@ |
1 | -// | |
2 | -// ChannelSelectViewCollectionViewCell.swift | |
3 | -// ParentAssistant | |
4 | -// | |
5 | -// Created by 左丞 on 2018/3/6. | |
6 | -// Copyright © 2018年 HANGZHOUTEAM. All rights reserved. | |
7 | -// | |
8 | - | |
9 | -import UIKit | |
10 | - | |
11 | -class ChannelSelectViewCollectionViewCell: UICollectionViewCell { | |
12 | - | |
13 | - @IBOutlet weak var image: UIImageView! | |
14 | - @IBOutlet weak var channelName: UILabel! | |
15 | - | |
16 | - override func awakeFromNib() { | |
17 | - super.awakeFromNib() | |
18 | - // Initialization code | |
19 | - } | |
20 | - | |
21 | -} |
ParentAssistant/ParentAssistant/Classes/controllers/Information/view/ChannelSelectViewCollectionViewCell.xib
... | ... | @@ -1,65 +0,0 @@ |
1 | -<?xml version="1.0" encoding="UTF-8"?> | |
2 | -<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="13771" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES"> | |
3 | - <device id="retina4_7" orientation="portrait"> | |
4 | - <adaptation id="fullscreen"/> | |
5 | - </device> | |
6 | - <dependencies> | |
7 | - <deployment identifier="iOS"/> | |
8 | - <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="13772"/> | |
9 | - <capability name="Aspect ratio constraints" minToolsVersion="5.1"/> | |
10 | - <capability name="Safe area layout guides" minToolsVersion="9.0"/> | |
11 | - <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/> | |
12 | - </dependencies> | |
13 | - <objects> | |
14 | - <placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner"/> | |
15 | - <placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/> | |
16 | - <collectionViewCell opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" reuseIdentifier="channelcell" id="gTV-IL-0wX" customClass="ChannelSelectViewCollectionViewCell" customModule="ParentAssistant" customModuleProvider="target"> | |
17 | - <rect key="frame" x="0.0" y="0.0" width="89" height="92"/> | |
18 | - <autoresizingMask key="autoresizingMask"/> | |
19 | - <view key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center"> | |
20 | - <rect key="frame" x="0.0" y="0.0" width="89" height="92"/> | |
21 | - <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/> | |
22 | - <subviews> | |
23 | - <imageView userInteractionEnabled="NO" contentMode="scaleToFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="evaluation_icon_highSchoolEnter" translatesAutoresizingMaskIntoConstraints="NO" id="Eco-Nm-1SK"> | |
24 | - <rect key="frame" x="18.5" y="8" width="52" height="52"/> | |
25 | - <constraints> | |
26 | - <constraint firstAttribute="width" secondItem="Eco-Nm-1SK" secondAttribute="height" multiplier="1:1" id="8K9-ZW-Cxu"/> | |
27 | - </constraints> | |
28 | - <userDefinedRuntimeAttributes> | |
29 | - <userDefinedRuntimeAttribute type="boolean" keyPath="layer.masksToBounds" value="YES"/> | |
30 | - <userDefinedRuntimeAttribute type="number" keyPath="layer.cornerRadius"> | |
31 | - <integer key="value" value="0"/> | |
32 | - </userDefinedRuntimeAttribute> | |
33 | - </userDefinedRuntimeAttributes> | |
34 | - </imageView> | |
35 | - <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Label" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="c3X-8c-2EH"> | |
36 | - <rect key="frame" x="28" y="68" width="33" height="16"/> | |
37 | - <constraints> | |
38 | - <constraint firstAttribute="height" constant="16" id="Zvs-7M-0pT"/> | |
39 | - </constraints> | |
40 | - <fontDescription key="fontDescription" type="system" pointSize="13"/> | |
41 | - <color key="textColor" red="0.27450980390000002" green="0.50980392159999999" blue="0.90196078430000004" alpha="1" colorSpace="custom" customColorSpace="sRGB"/> | |
42 | - <nil key="highlightedColor"/> | |
43 | - </label> | |
44 | - </subviews> | |
45 | - </view> | |
46 | - <constraints> | |
47 | - <constraint firstAttribute="bottom" secondItem="c3X-8c-2EH" secondAttribute="bottom" constant="8" id="LNs-qC-rfU"/> | |
48 | - <constraint firstItem="c3X-8c-2EH" firstAttribute="top" secondItem="Eco-Nm-1SK" secondAttribute="bottom" constant="8" id="Z84-pm-JFu"/> | |
49 | - <constraint firstItem="Eco-Nm-1SK" firstAttribute="centerX" secondItem="gTV-IL-0wX" secondAttribute="centerX" id="elr-rq-5kH"/> | |
50 | - <constraint firstItem="Eco-Nm-1SK" firstAttribute="top" secondItem="gTV-IL-0wX" secondAttribute="top" constant="8" id="oPj-M0-Aap"/> | |
51 | - <constraint firstItem="c3X-8c-2EH" firstAttribute="centerX" secondItem="gTV-IL-0wX" secondAttribute="centerX" id="wIz-FB-ESA"/> | |
52 | - </constraints> | |
53 | - <viewLayoutGuide key="safeArea" id="ZTg-uK-7eu"/> | |
54 | - <size key="customSize" width="96" height="108"/> | |
55 | - <connections> | |
56 | - <outlet property="channelName" destination="c3X-8c-2EH" id="trZ-23-1dk"/> | |
57 | - <outlet property="image" destination="Eco-Nm-1SK" id="jsu-CI-9Ti"/> | |
58 | - </connections> | |
59 | - <point key="canvasLocation" x="48" y="63"/> | |
60 | - </collectionViewCell> | |
61 | - </objects> | |
62 | - <resources> | |
63 | - <image name="evaluation_icon_highSchoolEnter" width="44" height="44"/> | |
64 | - </resources> | |
65 | -</document> |
ParentAssistant/ParentAssistant/Classes/util/AccountManager.swift
0 → 100644
... | ... | @@ -0,0 +1,257 @@ |
1 | +// | |
2 | +// account.swift | |
3 | +// ParentAssistant | |
4 | +// | |
5 | +// Created by 葛建军 on 2018/3/6. | |
6 | +// Copyright © 2018年 HANGZHOUTEAM. All rights reserved. | |
7 | +// | |
8 | + | |
9 | +import Foundation | |
10 | +class AccountManager: NSObject { | |
11 | + var rawUserInfo:JSON? | |
12 | + var userid:String="" | |
13 | + var token:String? | |
14 | + var refreshToken:String="" | |
15 | +// var address:String = "未知" | |
16 | + | |
17 | + | |
18 | + //单例 | |
19 | + static let shared = AccountManager() | |
20 | + | |
21 | + override init(){ | |
22 | + rawUserInfo=Setting.getUserInfo() | |
23 | + if let info=rawUserInfo{ | |
24 | + userid=info.contentData()["userid"].stringValue | |
25 | + } | |
26 | + } | |
27 | + | |
28 | + //MARK: - 获取个人信息 | |
29 | + /// 获取用户信息 | |
30 | + /// | |
31 | + /// - Returns: 返回 UserInfoModel | |
32 | + func getUserInfo() -> UserInfoModel { | |
33 | + | |
34 | + var model = UserInfoModel() | |
35 | + if let dic = Setting.getUserInfo()?.dictionary { | |
36 | + let data = dic["data"]?.dictionary | |
37 | + if let value = data { | |
38 | + model = UserInfoModel.deserialize(from: value)! | |
39 | + } | |
40 | + } | |
41 | + return model | |
42 | + } | |
43 | + //MARK: 获取孩子信息 | |
44 | + /// 获取用户孩子信息 | |
45 | + /// | |
46 | + /// - Returns: 返回 StudentClassInfoModel | |
47 | + func getChildClassInfo()-> Array<StudentClassInfoModel> { | |
48 | + var array = Array<StudentClassInfoModel>() | |
49 | + if let dic = Setting.getUserInfo()?.dictionary { | |
50 | + let data = dic["data"]?.dictionary | |
51 | + let studentArr = data!["studentClass"]?.arrayValue | |
52 | + for i in 0..<studentArr!.count { | |
53 | + let studentDic = studentArr![i].dictionary | |
54 | + if let value = studentDic { | |
55 | + let model = StudentClassInfoModel.deserialize(from: value) | |
56 | + array.append(model!) | |
57 | + } | |
58 | + } | |
59 | + } | |
60 | + return array | |
61 | + } | |
62 | + | |
63 | + | |
64 | + func setTokenInfo(tokenInfo:JSON?){ | |
65 | + if let info=tokenInfo{ | |
66 | + token="Bearer "+info["access_token"].stringValue | |
67 | + refreshToken=info["refresh_token"].stringValue | |
68 | + }else{ | |
69 | + token="" | |
70 | + } | |
71 | + } | |
72 | + func loadToken()->JSON?{ | |
73 | + if let token=Setting.getJson("_token"){ | |
74 | + return token | |
75 | + } | |
76 | + return nil | |
77 | + } | |
78 | + func saveToken(tokenInfo:JSON){ | |
79 | + _=Setting.saveJson(tokenInfo, forKey: "_token") | |
80 | + } | |
81 | + //是否登录 | |
82 | + func isOnline() -> Bool { | |
83 | + if id() != "" { | |
84 | + return true | |
85 | + }else{ | |
86 | + return false | |
87 | + } | |
88 | + } | |
89 | + func id()->String{ | |
90 | + if let info=rawUserInfo{ | |
91 | + return info.contentData()["userid"].stringValue | |
92 | + } | |
93 | + return "" | |
94 | + } | |
95 | + func name()->String{ | |
96 | + if let info=rawUserInfo{ | |
97 | + return info.contentData()["name"].stringValue | |
98 | + } | |
99 | + return "" | |
100 | + } | |
101 | + func photo()->String{ | |
102 | + if let info=rawUserInfo{ | |
103 | + return info.contentData()["image"].stringValue | |
104 | + } | |
105 | + return "defphoto" | |
106 | + } | |
107 | + func phone()->String{ | |
108 | + if let info=rawUserInfo{ | |
109 | + return info.contentData()["mobile"].stringValue | |
110 | + } | |
111 | + return "" | |
112 | + } | |
113 | + func sex()->Int{ | |
114 | + if let info=rawUserInfo{ | |
115 | + return info.contentData()["sex"].intValue | |
116 | + } | |
117 | + return 0 | |
118 | + } | |
119 | + | |
120 | + func parentId()->Int{ | |
121 | + if let info=rawUserInfo{ | |
122 | + return info.contentData()["parentId"].intValue | |
123 | + } | |
124 | + return 0 | |
125 | + } | |
126 | + | |
127 | + func studentClass()->[JSON]{ | |
128 | + if let info=rawUserInfo{ | |
129 | + return info.contentData()["studentClass"].arrayValue | |
130 | + } | |
131 | + return [] | |
132 | + } | |
133 | + | |
134 | + func isNew()->Int{ | |
135 | + if let info=rawUserInfo{ | |
136 | + return info.contentData()["isNew"].intValue | |
137 | + } | |
138 | + return 0 | |
139 | + } | |
140 | + | |
141 | + func isHeaderTeacher()->Bool{ | |
142 | + if let info=rawUserInfo{ | |
143 | + return info.contentData()["f_Identity"].intValue == 2 ? true : false | |
144 | + } | |
145 | + return false | |
146 | + } | |
147 | + func logOut(auto:Bool? = false){ | |
148 | + //退出登录 | |
149 | + cleanUserInfoAndPoptoRootVC(auto: auto) | |
150 | + } | |
151 | + func cleanUserInfoAndPoptoRootVC(auto:Bool? = false){ | |
152 | + rawUserInfo=nil | |
153 | + userid="" | |
154 | + _=Setting.saveUserInfo("") | |
155 | + UserDefaults.standard.removeObject(forKey: "_token") | |
156 | + refreshToken = "" | |
157 | + token = "" | |
158 | + if auto! { | |
159 | + if self.appRootViewController().classForCoder==TabBarController.classForCoder(){ | |
160 | + ((self.appRootViewController() as! TabBarController).selectedViewController! as! UINavigationController).popToRootViewController(animated: true) | |
161 | + }else{ | |
162 | + self.appRootViewController().dismiss(animated: false, completion: { | |
163 | + (self.appRootViewController() as! UINavigationController).popToRootViewController(animated: true) | |
164 | + }) | |
165 | + } | |
166 | + } | |
167 | + NotificationCenter.default.post(name: NSNotification.Name(rawValue: "loginOutSuccess"), object: nil) | |
168 | + //取消之前注册的所有本地推送通知 | |
169 | +// UIApplication.shared.cancelAllLocalNotifications() | |
170 | + //发出刷新首页通知 | |
171 | +// NotificationCenter.default.post(name: NSNotification.Name(rawValue: "refreshFirstVC"), object: nil) | |
172 | + } | |
173 | + func appRootViewController()->UIViewController { | |
174 | + let appRootVC=UIApplication.shared.keyWindow?.rootViewController | |
175 | + var topVC=appRootVC | |
176 | + while topVC!.presentedViewController != nil { | |
177 | + topVC=topVC!.presentedViewController | |
178 | + } | |
179 | + return topVC! | |
180 | + } | |
181 | + func refreshUserInfo(_ mobile:String,completionHandler:((Bool) -> Void)?){ | |
182 | + HTTPServer.shared.getParentInfo(["mobile":mobile as AnyObject], completionHandler: { (str, error) -> Void in | |
183 | + if error == nil { | |
184 | + if JSON.fromString(str)!["status"].intValue==4 { | |
185 | + HTTPServer.shared.refreshToken(completionHandler: { (str, error) in | |
186 | + if error == nil && JSON.fromString(str)!["status"].intValue==1 { | |
187 | + self.setTokenInfo(tokenInfo: JSON.fromString(str)) | |
188 | + if let call=completionHandler{ | |
189 | + call(true) | |
190 | + } | |
191 | + }else{ | |
192 | + self.logOut() | |
193 | + appDelegate.window!.makeToast("登录信息已过期,请重新登录", duration: 2, position: CSToastPositionBottom) | |
194 | + if let call=completionHandler{ | |
195 | + call(false) | |
196 | + } | |
197 | + } | |
198 | + }, token: self.refreshToken) | |
199 | + }else{ | |
200 | + httpJsonResule(jsonString: str, error: error, successHandler: { (json) -> Void in | |
201 | + _=Setting.saveUserInfo(str) | |
202 | + self.rawUserInfo=json | |
203 | + self.userid=json.contentData()["userid"].stringValue | |
204 | + if let call=completionHandler{ | |
205 | + call(true) | |
206 | + } | |
207 | + }, failHandler: { (error) -> Void in | |
208 | + if let call=completionHandler{ | |
209 | + call(false) | |
210 | + } | |
211 | + }) | |
212 | + } | |
213 | + }else{ | |
214 | + if let call=completionHandler{ | |
215 | + call(false) | |
216 | + } | |
217 | + } | |
218 | + }) | |
219 | + } | |
220 | +} | |
221 | + | |
222 | +import HandyJSON | |
223 | +class UserInfoModel: HandyJSON { | |
224 | + var parentId = Int() | |
225 | + var name = String() | |
226 | + var bindSchoolFlag = Bool() | |
227 | + var mobile = String() | |
228 | + var image = String() | |
229 | + var userid = String() | |
230 | + var sex = Int() | |
231 | + required init(){} | |
232 | +} | |
233 | +class StudentClassInfoModel: HandyJSON { | |
234 | + | |
235 | + var photo = String() | |
236 | + var cityName = String() | |
237 | + var cardNumber = String() | |
238 | + var classId = Int() | |
239 | + var grade = Int() | |
240 | + var studentName = String() | |
241 | + var studentCode = String() | |
242 | + var parentId = Int() | |
243 | + var className = String() | |
244 | + var areaName = String() | |
245 | + var gradename = String() | |
246 | + var count = Int() | |
247 | + var schollId = Int() | |
248 | + var schoolName = String() | |
249 | + var studentUserId = String() | |
250 | + var studentId = Int() | |
251 | + var parentMobile = Int() | |
252 | + var sex = Int() | |
253 | + | |
254 | + required init(){} | |
255 | +} | |
256 | + | |
257 | + | ... | ... |
ParentAssistant/ParentAssistant/Classes/util/HTTPServer.swift
0 → 100644
... | ... | @@ -0,0 +1,315 @@ |
1 | +// | |
2 | +// network.swift | |
3 | +// ParentAssistant | |
4 | +// | |
5 | +// Created by 葛建军 on 2018/3/6. | |
6 | +// Copyright © 2018年 HANGZHOUTEAM. All rights reserved. | |
7 | +// | |
8 | + | |
9 | +import Foundation | |
10 | +import Alamofire | |
11 | +import AlamofireImage | |
12 | +//http工具 | |
13 | +final class KHttp{ | |
14 | + private static func http(method:HTTPMethod,url:String,parameters: [String: AnyObject]? = nil,encoding: ParameterEncoding = URLEncoding.default,headers:[String: String]?=nil,completionHandler: @escaping (String?, NSError?) -> ()){ | |
15 | + //认证相关设置 | |
16 | + // let manager = Manager.sharedInstance | |
17 | + // manager.delegate.sessionDidReceiveChallenge = { session, challenge in | |
18 | + // //认证服务器证书 | |
19 | + // if challenge.protectionSpace.authenticationMethod == NSURLAuthenticationMethodServerTrust { | |
20 | + // let serverTrust:SecTrustRef = challenge.protectionSpace.serverTrust! | |
21 | + // let certificate = SecTrustGetCertificateAtIndex(serverTrust, 0)! | |
22 | + // let remoteCertificateData = CFBridgingRetain(SecCertificateCopyData(certificate))! | |
23 | + // let cerPath = NSBundle.mainBundle().pathForResource("pub",ofType: "cer")! | |
24 | + // let localCertificateData = NSData(contentsOfFile:cerPath)! | |
25 | + // if (remoteCertificateData.isEqualToData(localCertificateData) == true) { | |
26 | + // let credential = NSURLCredential(forTrust: serverTrust) | |
27 | + // challenge.sender?.useCredential(credential, | |
28 | + // forAuthenticationChallenge: challenge) | |
29 | + // return (NSURLSessionAuthChallengeDisposition.UseCredential, | |
30 | + // NSURLCredential(forTrust: challenge.protectionSpace.serverTrust!)) | |
31 | + // }else{ | |
32 | + // return (.CancelAuthenticationChallenge, nil) | |
33 | + // } | |
34 | + // }else{ | |
35 | + // return (.CancelAuthenticationChallenge, nil) | |
36 | + // } | |
37 | + // } | |
38 | + | |
39 | + let requestUrl = HOST + url | |
40 | + request(requestUrl, method: method, parameters: parameters, encoding: encoding, headers: headers).responseString { (response) -> Void in | |
41 | + let error=response.result.error | |
42 | + let str=response.result.value | |
43 | + if let er=error{ | |
44 | + if (er as NSError).code==NSURLErrorNotConnectedToInternet{ | |
45 | + appDelegate.window!.makeToast("网络连接不可用", duration: 1, position: CSToastPositionBottom) | |
46 | + }else if (er as NSError).code==NSURLErrorCannotConnectToHost{ | |
47 | + appDelegate.window!.makeToast("未能连接到服务器", duration: 1, position: CSToastPositionBottom) | |
48 | + }else{ | |
49 | + appDelegate.window!.makeToast("加载失败:\(er.localizedDescription)", duration: 1, position: CSToastPositionBottom) | |
50 | + } | |
51 | + NSLog("ERROR: url:\(requestUrl),error:\(er)") | |
52 | + } | |
53 | + completionHandler(str,error as NSError?) | |
54 | + } | |
55 | + } | |
56 | + | |
57 | + static func POST(url:String,parameters: [String: AnyObject]? = nil,encoding: ParameterEncoding = URLEncoding.default,headers:[String: String]?=nil,completionHandler: @escaping (String?, NSError?) -> ()){ | |
58 | + var header:[String: String] | |
59 | + if let hd=headers { | |
60 | + header=hd | |
61 | + header.updateValue(getSign(), forKey: "sign") | |
62 | + }else{ | |
63 | + header=["sign":getSign()] | |
64 | + } | |
65 | + KHttp.http(method: .post, url: url, parameters: parameters,encoding:encoding,headers:header,completionHandler:completionHandler) | |
66 | + } | |
67 | + static func GET(url:String,parameters: [String: AnyObject]? = nil,headers:[String: String]?=nil,completionHandler: @escaping (String?, NSError?) -> Void){ | |
68 | + var header:[String: String] | |
69 | + if let hd=headers { | |
70 | + header=hd | |
71 | + header.updateValue(getSign(), forKey: "sign") | |
72 | + }else{ | |
73 | + header=["sign":getSign()] | |
74 | + } | |
75 | + KHttp.http(method: .get, url: url, parameters: parameters,headers:header,completionHandler:completionHandler) | |
76 | + } | |
77 | + static func getSign()->String{ | |
78 | + let timeFormatter=DateFormatter() | |
79 | + timeFormatter.dateFormat="yyyy-MM-dd-HH:mm:ss:sss" | |
80 | + let time=timeFormatter.string(from: Date())+"\(arc4random()%10000)"// let appKey="1e5b32490ad2e41ecc817849ea1310c6" | |
81 | + let appSecret="5d744518ac1c" | |
82 | + return (time.md5()+"/"+time.md5()+appSecret).md5().data(using: .ascii)?.base64EncodedString(options: []) ?? "" | |
83 | + } | |
84 | +} | |
85 | +final class HTTPServer{ | |
86 | + | |
87 | + //单例 | |
88 | + static let shared = HTTPServer() | |
89 | + init() {} | |
90 | + | |
91 | + var token:String?{ | |
92 | + return AccountManager.shared.token | |
93 | + } | |
94 | + | |
95 | + //上传图片 | |
96 | + func uploadFile(file:NSURL,progress:((Int64, Int64, Int64) -> Void)? = nil,completionHandler: @escaping (String?, NSError?) -> Void){ | |
97 | + upload(multipartFormData: { (multipartFormData) in | |
98 | + multipartFormData.append(file as URL, withName: "file") | |
99 | + }, usingThreshold: SessionManager.multipartFormDataEncodingMemoryThreshold, to: URL_UPLOAD_FILE, method: .post, headers: nil) { (encodingResult) in | |
100 | + switch encodingResult { | |
101 | + case .success(let upload, _, _): | |
102 | + upload.responseString(completionHandler: { (response) in | |
103 | + completionHandler(response.result.value,response.result.error as NSError?) | |
104 | + }) | |
105 | + case .failure(let encodingError): | |
106 | + completionHandler(nil,encodingError as NSError?) | |
107 | + } | |
108 | + } | |
109 | + } | |
110 | + //MARK:-User个人信息有关 | |
111 | + //登录 | |
112 | + func login(completionHandler:@escaping (String?, NSError?) -> (),phone:String, password:String){ | |
113 | + let timeFormatter=DateFormatter() | |
114 | + timeFormatter.dateFormat="yyyy-MM-dd-HH:mm:ss:sss" | |
115 | + let time=timeFormatter.string(from: Date())+"\(arc4random()%10000)" | |
116 | + let appSecret="5d744518ac1c" | |
117 | + let authorization=(time.md5()+":"+(time.md5()+appSecret).md5()).data(using: String.Encoding.ascii)?.base64EncodedString(options: Data.Base64EncodingOptions(rawValue: 0)) ?? "" | |
118 | + KHttp.POST(url: URL_OAUTH_TOKEN,parameters: ["grant_type":"password" as AnyObject,"username":phone as AnyObject,"password":password as AnyObject], encoding: URLEncoding.default,headers:["Authorization":"Basic "+authorization], completionHandler: completionHandler) | |
119 | + } | |
120 | + //更新token | |
121 | + func refreshToken(completionHandler:@escaping (String?, NSError?) -> Void,token refresh_token:String){ | |
122 | + let timeFormatter=DateFormatter() | |
123 | + timeFormatter.dateFormat="yyyy-MM-dd-HH:mm:ss:sss" | |
124 | + let time=timeFormatter.string(from: Date())+"\(arc4random()%10000)" | |
125 | + let appSecret="5d744518ac1c" | |
126 | + let authorization=(time.md5()+":"+(time.md5()+appSecret).md5()).data(using: String.Encoding.ascii)?.base64EncodedString(options: Data.Base64EncodingOptions(rawValue: 0)) ?? "" | |
127 | + KHttp.POST(url: URL_OAUTH_TOKEN, parameters:["grant_type":"refresh_token" as AnyObject,"refresh_token":refresh_token as AnyObject], headers:["Authorization":"Basic "+authorization],completionHandler: completionHandler) | |
128 | + } | |
129 | + //获取开屏广告URL | |
130 | + func getOpenAds(completionHandler:@escaping (String?, NSError?) -> ()){ | |
131 | + KHttp.GET(url: URL_GETOPENADS,headers:["Authorization":token!], completionHandler: completionHandler) | |
132 | + } | |
133 | + //我的课程提醒 | |
134 | + func getMyLiveRemind(completionHandler:@escaping (String?, NSError?) -> ()){ | |
135 | + KHttp.GET(url: URL_USER_MYLIVEREMIND, headers:["Authorization":token!], completionHandler: completionHandler) | |
136 | + } | |
137 | + //更新本地个人信息 | |
138 | + func uplocalUserInfo(completionHandler:@escaping (String?, NSError?) -> ()){ | |
139 | + KHttp.GET(url: URL_USER_USERINFO, headers:["Authorization":token!], completionHandler: completionHandler) | |
140 | + } | |
141 | + //修改密码 | |
142 | + func updatePassword(parameters: [String : AnyObject]?,completionHandler:@escaping (String?, NSError?) -> ()){ | |
143 | + KHttp.POST(url: URL_USER_UPDATEPASSWORD, parameters: parameters,headers:["Authorization":token!], completionHandler: completionHandler) | |
144 | + } | |
145 | + | |
146 | + | |
147 | + | |
148 | + //家长注册 | |
149 | + func parentRegister(parameters: [String : AnyObject]?,completionHandler:@escaping (String?, NSError?) -> ()){ | |
150 | + KHttp.POST(url: URL_PARENTREGISTER, parameters: parameters,headers:["Authorization":token!], completionHandler: completionHandler) | |
151 | + } | |
152 | + //获取注册验证码 | |
153 | + func getCaptcha(_ mobile:String,completionHandler:@escaping (String?, NSError?) -> Void){ | |
154 | + KHttp.GET(url: URL_CAPTCHA,parameters:["mobile":mobile as AnyObject],headers:["Authorization":token!], completionHandler: completionHandler) | |
155 | + } | |
156 | + //找回密码 | |
157 | + func resetPassWord(_ mobile:String,pw:String?=nil,code:String,completionHandler:@escaping (String?, NSError?) -> Void){ | |
158 | + var p:[String:String]! | |
159 | + if let pass=pw{ | |
160 | + p=["captcha":code,"Mobile":mobile,"pass":pass] | |
161 | + }else{ | |
162 | + p=["captcha":code,"Mobile":mobile,"pass":"Empty"] | |
163 | + } | |
164 | + //,headers:["Authorization":anonymousToken ?? ""] | |
165 | + | |
166 | + KHttp.GET(url: URL_RESTPW,parameters:p! as [String : AnyObject], completionHandler: completionHandler) | |
167 | + } | |
168 | + //登录获取家长信息(包括关联的孩子信息区分绑定状态 | |
169 | + func getParentInfo(_ parameters:[String:AnyObject],completionHandler:@escaping (String?, NSError?) -> ()){ | |
170 | + KHttp.POST(url: URL_GETPARENTINFO,parameters:parameters, headers:["Authorization":token!], completionHandler: completionHandler) | |
171 | + } | |
172 | + //更新姓名和性别 | |
173 | + func updateParentInfo(parameters: [String : AnyObject]?,completionHandler:@escaping (String?, NSError?) -> ()){ | |
174 | + KHttp.POST(url: URL_UPDATEPARENTINFO, parameters: parameters,headers:["Authorization":token!], completionHandler: completionHandler) | |
175 | + } | |
176 | + //获取我的短信包列表 | |
177 | + func getOrderList(_ parameters:[String:AnyObject],completionHandler:@escaping (String?, NSError?) -> ()){ | |
178 | + KHttp.GET(url: URL_GETORDERLIST,parameters:parameters,headers:["Authorization":token!], completionHandler: completionHandler) | |
179 | + } | |
180 | + //解绑孩子 | |
181 | + func getUnBindStudent(_ parameters:[String:AnyObject],completionHandler:@escaping (String?, NSError?) -> ()){ | |
182 | + KHttp.GET(url: URL_UNBINDSTUDENT,parameters:parameters,headers:["Authorization":token!], completionHandler: completionHandler) | |
183 | + } | |
184 | + | |
185 | + //根据选择的市获取该地区的学校或者根据关键字搜索学校 | |
186 | + func getAreaSchool(parameters: [String : AnyObject]?,completionHandler:@escaping (String?, NSError?) -> ()){ | |
187 | + // var urlStr = URL_GETAREASCHOOL+"?AreaName=\(getPercentEncodingString(str: parameters["AreaName"]! as! String))" | |
188 | + // if let str = parameters["Keyword"]{ | |
189 | + // urlStr = urlStr + "&Keyword=\(getPercentEncodingString(str: str as! String))" | |
190 | + // } | |
191 | + | |
192 | + KHttp.POST(url: URL_GETAREASCHOOL, parameters: parameters,headers:["Authorization":token!], completionHandler: completionHandler) | |
193 | + } | |
194 | + | |
195 | + //获取该学校的年级或班级 | |
196 | + func getClassOrGrade(_ parameters:[String:AnyObject],completionHandler:@escaping (String?, NSError?) -> ()){ | |
197 | + KHttp.GET(url: URL_GETCLASSORGRADE,parameters:parameters,headers:["Authorization":token!], completionHandler: completionHandler) | |
198 | + } | |
199 | + //MARK: ---- ParentService ----- | |
200 | + //获取工具入口和活动 | |
201 | + func getActivityTool(_ parameters:[String:AnyObject],completionHandler:@escaping (String?, NSError?) -> ()){ | |
202 | + KHttp.GET(url: URL_PARENTSERVICE_GETACTIVITYTOOL,parameters:parameters,headers:["Authorization":token!], completionHandler: completionHandler) | |
203 | + } | |
204 | + //绑定孩子信息(合作学校绑定返回null,非合作学校返回“汇作业”账号和密码) | |
205 | + func bindlingChildren(parameters: [String : AnyObject],completionHandler:@escaping (String?, NSError?) -> ()){ | |
206 | + KHttp.POST(url: URL_BINDLINGCHILDREN, parameters: parameters,headers:["Authorization":token!], completionHandler: completionHandler) | |
207 | + } | |
208 | + | |
209 | + | |
210 | + //获取频道资讯 | |
211 | + func getChannelInfo(_ parameters:[String:AnyObject],completionHandler:@escaping (String?, NSError?) -> ()){ | |
212 | + KHttp.POST(url: URL_PARENTSERVICE_GETCHANNELINFO,parameters:parameters,headers:["Authorization":token!], completionHandler: completionHandler) | |
213 | + } | |
214 | + | |
215 | + //获取首页资讯话题/搜索资讯 | |
216 | + func getInformationTopic(_ parameters:[String:AnyObject],completionHandler:@escaping (String?, NSError?) -> ()){ | |
217 | + KHttp.POST(url: URL_PARENTSERVICE_GETINFORMATIONTOPIC,parameters:parameters,headers:["Authorization":token!], completionHandler: completionHandler) | |
218 | + } | |
219 | + | |
220 | + //获取订购的报告或科目 | |
221 | + func getOrderSubject(_ parameters:[String:AnyObject],completionHandler:@escaping (String?, NSError?) -> ()){ | |
222 | + KHttp.GET(url: URL_PARENTSERVICE_GETORDERSUBJECT,parameters:parameters,headers:["Authorization":token!], completionHandler: completionHandler) | |
223 | + } | |
224 | + | |
225 | + //获取报告列表 | |
226 | + func workReport(parameters: [String : AnyObject]?,completionHandler:@escaping (String?, NSError?) -> ()){ | |
227 | + KHttp.POST(url: URL_PARENTSERVICE_WORKREPORT, parameters: parameters,headers:["Authorization":token!], completionHandler: completionHandler) | |
228 | + } | |
229 | + | |
230 | + //MARK: - 成长 | |
231 | + //MARK: 应用 | |
232 | + ///补卡 | |
233 | + func postStudentMendCard(parameters: [String : AnyObject]?,completionHandler:@escaping (String?, NSError?) -> ()){ | |
234 | + KHttp.POST(url: URL_POST_MEND_CARD, parameters: parameters,headers:["Authorization":token!], completionHandler: completionHandler) | |
235 | + } | |
236 | + ///考勤 | |
237 | + func getStudentCheckList(parameters: [String : AnyObject]?,completionHandler:@escaping (String?, NSError?) -> ()){ | |
238 | + KHttp.GET(url: URL_GET_ATTENDANCE_LIST, parameters: parameters,headers:["Authorization":token!], completionHandler: completionHandler) | |
239 | + } | |
240 | + //MARK:量规评价 | |
241 | + //获取报告详情 | |
242 | + func workReportDetails(parameters: [String : AnyObject]?,completionHandler:@escaping (String?, NSError?) -> ()){ | |
243 | + KHttp.POST(url: URL_PARENTSERVICE_WORKREPORTDETAILS, parameters: parameters,headers:["Authorization":token!], completionHandler: completionHandler) | |
244 | + } | |
245 | + //获取德育报告-总体详情 | |
246 | + func getEvaluationSceneAnalysis(parameters:[String:AnyObject]?,completionHandler:@escaping (String?,NSError?)->()){ | |
247 | + KHttp.POST(url: URL_POST_EVALUATION_ANALYSIS, parameters: parameters, headers: ["Authorization":token!], completionHandler: completionHandler) | |
248 | + } | |
249 | + //获取德育报告-场景详情 | |
250 | + func getEvaluationSceneAnalysisDetails(parameters:[String:AnyObject]?,completionHandler:@escaping (String?,NSError?)->()){ | |
251 | + KHttp.POST(url: URL_POST_EVALUATION_ANALYSIS_DETAILS, parameters: parameters, headers: ["Authorization":token!], completionHandler: completionHandler) | |
252 | + } | |
253 | + //订购信息 | |
254 | + func orderCenter(parameters: [String : AnyObject]?,completionHandler:@escaping (String?, NSError?) -> ()){ | |
255 | + KHttp.POST(url: URL_PARENTSERVICE_ORDERCENTER, parameters: parameters,headers:["Authorization":token!], completionHandler: completionHandler) | |
256 | + } | |
257 | + | |
258 | + //查看订购详情 | |
259 | + func orderServiceDetails(_ parameters:[String:AnyObject],completionHandler:@escaping (String?, NSError?) -> ()){ | |
260 | + KHttp.GET(url: URL_PARENTSERVICE_ORDERSERVICEDETAILS,parameters:parameters,headers:["Authorization":token!], completionHandler: completionHandler) | |
261 | + } | |
262 | + | |
263 | + //获取广告位信息 | |
264 | + func getAds(_ parameters:[String:AnyObject],completionHandler:@escaping (String?, NSError?) -> ()){ | |
265 | + KHttp.GET(url: URL_PARENTSERVICE_GETADS,parameters:parameters,headers:["Authorization":token!], completionHandler: completionHandler) | |
266 | + } | |
267 | + | |
268 | + | |
269 | +} | |
270 | +let SERVER_MESSAGE=393939 | |
271 | +func httpJsonResule(jsonString:String?,error:NSError?,successHandler:(JSON)->Void,failHandler:(NSError)->Void){ | |
272 | + let json=JSON.fromString(jsonString) | |
273 | + if let info=json{ | |
274 | + if info.isSuccess(){ | |
275 | + successHandler(info) | |
276 | + }else{ | |
277 | + failHandler(NSError(domain: "shunzhi.net", | |
278 | + code: SERVER_MESSAGE, | |
279 | + userInfo: [NSLocalizedDescriptionKey:info["message"].stringValue])) | |
280 | + } | |
281 | + }else{ | |
282 | + if let e=error{ | |
283 | + failHandler(e) | |
284 | + }else{ | |
285 | + failHandler(NSError(domain: "shunzhi.net", | |
286 | + code: 0, | |
287 | + userInfo: [NSLocalizedDescriptionKey:"not a json!!"])) | |
288 | + } | |
289 | + } | |
290 | +} | |
291 | + | |
292 | +// MARK: - 对UIImageView的网络加载图片扩展 | |
293 | +extension UIImageView { | |
294 | + | |
295 | + /// 网络加载图片 | |
296 | + /// | |
297 | + /// - Parameters: | |
298 | + /// - urlStr: 图片网络地址字符串 | |
299 | + /// - placeholder: 默认替代图片 | |
300 | + func setImageWithUrl(urlStr:String,placeholder:String?) { | |
301 | + if !(urlStr.isEmpty){ | |
302 | + let imageUrl = URL.init(string: urlStr) | |
303 | + if placeholder == nil { | |
304 | + self.af_setImage(withURL: imageUrl!) | |
305 | + }else{ | |
306 | + self.af_setImage(withURL: imageUrl!, placeholderImage: UIImage.init(named: placeholder!)) | |
307 | + } | |
308 | + }else{ | |
309 | + if let image = placeholder { | |
310 | + self.image = UIImage.init(named: image) | |
311 | + } | |
312 | + } | |
313 | + } | |
314 | +} | |
315 | + | ... | ... |
ParentAssistant/ParentAssistant/Classes/util/account.swift
... | ... | @@ -1,257 +0,0 @@ |
1 | -// | |
2 | -// account.swift | |
3 | -// ParentAssistant | |
4 | -// | |
5 | -// Created by 葛建军 on 2018/3/6. | |
6 | -// Copyright © 2018年 HANGZHOUTEAM. All rights reserved. | |
7 | -// | |
8 | - | |
9 | -import Foundation | |
10 | -class AccountManager: NSObject { | |
11 | - var rawUserInfo:JSON? | |
12 | - var userid:String="" | |
13 | - var token:String? | |
14 | - var refreshToken:String="" | |
15 | -// var address:String = "未知" | |
16 | - | |
17 | - | |
18 | - //单例 | |
19 | - static let shared = AccountManager() | |
20 | - | |
21 | - override init(){ | |
22 | - rawUserInfo=Setting.getUserInfo() | |
23 | - if let info=rawUserInfo{ | |
24 | - userid=info.contentData()["userid"].stringValue | |
25 | - } | |
26 | - } | |
27 | - | |
28 | - //MARK: - 获取个人信息 | |
29 | - /// 获取用户信息 | |
30 | - /// | |
31 | - /// - Returns: 返回 UserInfoModel | |
32 | - func getUserInfo() -> UserInfoModel { | |
33 | - | |
34 | - var model = UserInfoModel() | |
35 | - if let dic = Setting.getUserInfo()?.dictionary { | |
36 | - let data = dic["data"]?.dictionary | |
37 | - if let value = data { | |
38 | - model = UserInfoModel.deserialize(from: value)! | |
39 | - } | |
40 | - } | |
41 | - return model | |
42 | - } | |
43 | - //MARK: 获取孩子信息 | |
44 | - /// 获取用户孩子信息 | |
45 | - /// | |
46 | - /// - Returns: 返回 StudentClassInfoModel | |
47 | - func getChildClassInfo()-> Array<StudentClassInfoModel> { | |
48 | - var array = Array<StudentClassInfoModel>() | |
49 | - if let dic = Setting.getUserInfo()?.dictionary { | |
50 | - let data = dic["data"]?.dictionary | |
51 | - let studentArr = data!["studentClass"]?.arrayValue | |
52 | - for i in 0..<studentArr!.count { | |
53 | - let studentDic = studentArr![i].dictionary | |
54 | - if let value = studentDic { | |
55 | - let model = StudentClassInfoModel.deserialize(from: value) | |
56 | - array.append(model!) | |
57 | - } | |
58 | - } | |
59 | - } | |
60 | - return array | |
61 | - } | |
62 | - | |
63 | - | |
64 | - func setTokenInfo(tokenInfo:JSON?){ | |
65 | - if let info=tokenInfo{ | |
66 | - token="Bearer "+info["access_token"].stringValue | |
67 | - refreshToken=info["refresh_token"].stringValue | |
68 | - }else{ | |
69 | - token="" | |
70 | - } | |
71 | - } | |
72 | - func loadToken()->JSON?{ | |
73 | - if let token=Setting.getJson("_token"){ | |
74 | - return token | |
75 | - } | |
76 | - return nil | |
77 | - } | |
78 | - func saveToken(tokenInfo:JSON){ | |
79 | - _=Setting.saveJson(tokenInfo, forKey: "_token") | |
80 | - } | |
81 | - //是否登录 | |
82 | - func isOnline() -> Bool { | |
83 | - if id() != "" { | |
84 | - return true | |
85 | - }else{ | |
86 | - return false | |
87 | - } | |
88 | - } | |
89 | - func id()->String{ | |
90 | - if let info=rawUserInfo{ | |
91 | - return info.contentData()["userid"].stringValue | |
92 | - } | |
93 | - return "" | |
94 | - } | |
95 | - func name()->String{ | |
96 | - if let info=rawUserInfo{ | |
97 | - return info.contentData()["name"].stringValue | |
98 | - } | |
99 | - return "" | |
100 | - } | |
101 | - func photo()->String{ | |
102 | - if let info=rawUserInfo{ | |
103 | - return info.contentData()["image"].stringValue | |
104 | - } | |
105 | - return "defphoto" | |
106 | - } | |
107 | - func phone()->String{ | |
108 | - if let info=rawUserInfo{ | |
109 | - return info.contentData()["mobile"].stringValue | |
110 | - } | |
111 | - return "" | |
112 | - } | |
113 | - func sex()->Int{ | |
114 | - if let info=rawUserInfo{ | |
115 | - return info.contentData()["sex"].intValue | |
116 | - } | |
117 | - return 0 | |
118 | - } | |
119 | - | |
120 | - func parentId()->Int{ | |
121 | - if let info=rawUserInfo{ | |
122 | - return info.contentData()["parentId"].intValue | |
123 | - } | |
124 | - return 0 | |
125 | - } | |
126 | - | |
127 | - func studentClass()->[JSON]{ | |
128 | - if let info=rawUserInfo{ | |
129 | - return info.contentData()["studentClass"].arrayValue | |
130 | - } | |
131 | - return [] | |
132 | - } | |
133 | - | |
134 | - func isNew()->Int{ | |
135 | - if let info=rawUserInfo{ | |
136 | - return info.contentData()["isNew"].intValue | |
137 | - } | |
138 | - return 0 | |
139 | - } | |
140 | - | |
141 | - func isHeaderTeacher()->Bool{ | |
142 | - if let info=rawUserInfo{ | |
143 | - return info.contentData()["f_Identity"].intValue == 2 ? true : false | |
144 | - } | |
145 | - return false | |
146 | - } | |
147 | - func logOut(auto:Bool? = false){ | |
148 | - //退出登录 | |
149 | - cleanUserInfoAndPoptoRootVC(auto: auto) | |
150 | - } | |
151 | - func cleanUserInfoAndPoptoRootVC(auto:Bool? = false){ | |
152 | - rawUserInfo=nil | |
153 | - userid="" | |
154 | - _=Setting.saveUserInfo("") | |
155 | - UserDefaults.standard.removeObject(forKey: "_token") | |
156 | - refreshToken = "" | |
157 | - token = "" | |
158 | - if auto! { | |
159 | - if self.appRootViewController().classForCoder==TabBarController.classForCoder(){ | |
160 | - ((self.appRootViewController() as! TabBarController).selectedViewController! as! UINavigationController).popToRootViewController(animated: true) | |
161 | - }else{ | |
162 | - self.appRootViewController().dismiss(animated: false, completion: { | |
163 | - (self.appRootViewController() as! UINavigationController).popToRootViewController(animated: true) | |
164 | - }) | |
165 | - } | |
166 | - } | |
167 | - NotificationCenter.default.post(name: NSNotification.Name(rawValue: "loginOutSuccess"), object: nil) | |
168 | - //取消之前注册的所有本地推送通知 | |
169 | -// UIApplication.shared.cancelAllLocalNotifications() | |
170 | - //发出刷新首页通知 | |
171 | -// NotificationCenter.default.post(name: NSNotification.Name(rawValue: "refreshFirstVC"), object: nil) | |
172 | - } | |
173 | - func appRootViewController()->UIViewController { | |
174 | - let appRootVC=UIApplication.shared.keyWindow?.rootViewController | |
175 | - var topVC=appRootVC | |
176 | - while topVC!.presentedViewController != nil { | |
177 | - topVC=topVC!.presentedViewController | |
178 | - } | |
179 | - return topVC! | |
180 | - } | |
181 | - func refreshUserInfo(_ mobile:String,completionHandler:((Bool) -> Void)?){ | |
182 | - HTTPServer.shared.getParentInfo(["mobile":mobile as AnyObject], completionHandler: { (str, error) -> Void in | |
183 | - if error == nil { | |
184 | - if JSON.fromString(str)!["status"].intValue==4 { | |
185 | - HTTPServer.shared.refreshToken(completionHandler: { (str, error) in | |
186 | - if error == nil && JSON.fromString(str)!["status"].intValue==1 { | |
187 | - self.setTokenInfo(tokenInfo: JSON.fromString(str)) | |
188 | - if let call=completionHandler{ | |
189 | - call(true) | |
190 | - } | |
191 | - }else{ | |
192 | - self.logOut() | |
193 | - appDelegate.window!.makeToast("登录信息已过期,请重新登录", duration: 2, position: CSToastPositionBottom) | |
194 | - if let call=completionHandler{ | |
195 | - call(false) | |
196 | - } | |
197 | - } | |
198 | - }, token: self.refreshToken) | |
199 | - }else{ | |
200 | - httpJsonResule(jsonString: str, error: error, successHandler: { (json) -> Void in | |
201 | - _=Setting.saveUserInfo(str) | |
202 | - self.rawUserInfo=json | |
203 | - self.userid=json.contentData()["userid"].stringValue | |
204 | - if let call=completionHandler{ | |
205 | - call(true) | |
206 | - } | |
207 | - }, failHandler: { (error) -> Void in | |
208 | - if let call=completionHandler{ | |
209 | - call(false) | |
210 | - } | |
211 | - }) | |
212 | - } | |
213 | - }else{ | |
214 | - if let call=completionHandler{ | |
215 | - call(false) | |
216 | - } | |
217 | - } | |
218 | - }) | |
219 | - } | |
220 | -} | |
221 | - | |
222 | -import HandyJSON | |
223 | -class UserInfoModel: HandyJSON { | |
224 | - var parentId = Int() | |
225 | - var name = String() | |
226 | - var bindSchoolFlag = Bool() | |
227 | - var mobile = String() | |
228 | - var image = String() | |
229 | - var userid = String() | |
230 | - var sex = Int() | |
231 | - required init(){} | |
232 | -} | |
233 | -class StudentClassInfoModel: HandyJSON { | |
234 | - | |
235 | - var photo = String() | |
236 | - var cityName = String() | |
237 | - var cardNumber = String() | |
238 | - var classId = Int() | |
239 | - var grade = Int() | |
240 | - var studentName = String() | |
241 | - var studentCode = String() | |
242 | - var parentId = Int() | |
243 | - var className = String() | |
244 | - var areaName = String() | |
245 | - var gradename = String() | |
246 | - var count = Int() | |
247 | - var schollId = Int() | |
248 | - var schoolName = String() | |
249 | - var studentUserId = String() | |
250 | - var studentId = Int() | |
251 | - var parentMobile = Int() | |
252 | - var sex = Int() | |
253 | - | |
254 | - required init(){} | |
255 | -} | |
256 | - | |
257 | - |
ParentAssistant/ParentAssistant/Classes/util/network.swift
... | ... | @@ -1,315 +0,0 @@ |
1 | -// | |
2 | -// network.swift | |
3 | -// ParentAssistant | |
4 | -// | |
5 | -// Created by 葛建军 on 2018/3/6. | |
6 | -// Copyright © 2018年 HANGZHOUTEAM. All rights reserved. | |
7 | -// | |
8 | - | |
9 | -import Foundation | |
10 | -import Alamofire | |
11 | -import AlamofireImage | |
12 | -//http工具 | |
13 | -final class KHttp{ | |
14 | - private static func http(method:HTTPMethod,url:String,parameters: [String: AnyObject]? = nil,encoding: ParameterEncoding = URLEncoding.default,headers:[String: String]?=nil,completionHandler: @escaping (String?, NSError?) -> ()){ | |
15 | - //认证相关设置 | |
16 | - // let manager = Manager.sharedInstance | |
17 | - // manager.delegate.sessionDidReceiveChallenge = { session, challenge in | |
18 | - // //认证服务器证书 | |
19 | - // if challenge.protectionSpace.authenticationMethod == NSURLAuthenticationMethodServerTrust { | |
20 | - // let serverTrust:SecTrustRef = challenge.protectionSpace.serverTrust! | |
21 | - // let certificate = SecTrustGetCertificateAtIndex(serverTrust, 0)! | |
22 | - // let remoteCertificateData = CFBridgingRetain(SecCertificateCopyData(certificate))! | |
23 | - // let cerPath = NSBundle.mainBundle().pathForResource("pub",ofType: "cer")! | |
24 | - // let localCertificateData = NSData(contentsOfFile:cerPath)! | |
25 | - // if (remoteCertificateData.isEqualToData(localCertificateData) == true) { | |
26 | - // let credential = NSURLCredential(forTrust: serverTrust) | |
27 | - // challenge.sender?.useCredential(credential, | |
28 | - // forAuthenticationChallenge: challenge) | |
29 | - // return (NSURLSessionAuthChallengeDisposition.UseCredential, | |
30 | - // NSURLCredential(forTrust: challenge.protectionSpace.serverTrust!)) | |
31 | - // }else{ | |
32 | - // return (.CancelAuthenticationChallenge, nil) | |
33 | - // } | |
34 | - // }else{ | |
35 | - // return (.CancelAuthenticationChallenge, nil) | |
36 | - // } | |
37 | - // } | |
38 | - | |
39 | - let requestUrl = HOST + url | |
40 | - request(requestUrl, method: method, parameters: parameters, encoding: encoding, headers: headers).responseString { (response) -> Void in | |
41 | - let error=response.result.error | |
42 | - let str=response.result.value | |
43 | - if let er=error{ | |
44 | - if (er as NSError).code==NSURLErrorNotConnectedToInternet{ | |
45 | - appDelegate.window!.makeToast("网络连接不可用", duration: 1, position: CSToastPositionBottom) | |
46 | - }else if (er as NSError).code==NSURLErrorCannotConnectToHost{ | |
47 | - appDelegate.window!.makeToast("未能连接到服务器", duration: 1, position: CSToastPositionBottom) | |
48 | - }else{ | |
49 | - appDelegate.window!.makeToast("加载失败:\(er.localizedDescription)", duration: 1, position: CSToastPositionBottom) | |
50 | - } | |
51 | - NSLog("ERROR: url:\(requestUrl),error:\(er)") | |
52 | - } | |
53 | - completionHandler(str,error as NSError?) | |
54 | - } | |
55 | - } | |
56 | - | |
57 | - static func POST(url:String,parameters: [String: AnyObject]? = nil,encoding: ParameterEncoding = URLEncoding.default,headers:[String: String]?=nil,completionHandler: @escaping (String?, NSError?) -> ()){ | |
58 | - var header:[String: String] | |
59 | - if let hd=headers { | |
60 | - header=hd | |
61 | - header.updateValue(getSign(), forKey: "sign") | |
62 | - }else{ | |
63 | - header=["sign":getSign()] | |
64 | - } | |
65 | - KHttp.http(method: .post, url: url, parameters: parameters,encoding:encoding,headers:header,completionHandler:completionHandler) | |
66 | - } | |
67 | - static func GET(url:String,parameters: [String: AnyObject]? = nil,headers:[String: String]?=nil,completionHandler: @escaping (String?, NSError?) -> Void){ | |
68 | - var header:[String: String] | |
69 | - if let hd=headers { | |
70 | - header=hd | |
71 | - header.updateValue(getSign(), forKey: "sign") | |
72 | - }else{ | |
73 | - header=["sign":getSign()] | |
74 | - } | |
75 | - KHttp.http(method: .get, url: url, parameters: parameters,headers:header,completionHandler:completionHandler) | |
76 | - } | |
77 | - static func getSign()->String{ | |
78 | - let timeFormatter=DateFormatter() | |
79 | - timeFormatter.dateFormat="yyyy-MM-dd-HH:mm:ss:sss" | |
80 | - let time=timeFormatter.string(from: Date())+"\(arc4random()%10000)"// let appKey="1e5b32490ad2e41ecc817849ea1310c6" | |
81 | - let appSecret="5d744518ac1c" | |
82 | - return (time.md5()+"/"+time.md5()+appSecret).md5().data(using: .ascii)?.base64EncodedString(options: []) ?? "" | |
83 | - } | |
84 | -} | |
85 | -final class HTTPServer{ | |
86 | - | |
87 | - //单例 | |
88 | - static let shared = HTTPServer() | |
89 | - init() {} | |
90 | - | |
91 | - var token:String?{ | |
92 | - return AccountManager.shared.token | |
93 | - } | |
94 | - | |
95 | - //上传图片 | |
96 | - func uploadFile(file:NSURL,progress:((Int64, Int64, Int64) -> Void)? = nil,completionHandler: @escaping (String?, NSError?) -> Void){ | |
97 | - upload(multipartFormData: { (multipartFormData) in | |
98 | - multipartFormData.append(file as URL, withName: "file") | |
99 | - }, usingThreshold: SessionManager.multipartFormDataEncodingMemoryThreshold, to: URL_UPLOAD_FILE, method: .post, headers: nil) { (encodingResult) in | |
100 | - switch encodingResult { | |
101 | - case .success(let upload, _, _): | |
102 | - upload.responseString(completionHandler: { (response) in | |
103 | - completionHandler(response.result.value,response.result.error as NSError?) | |
104 | - }) | |
105 | - case .failure(let encodingError): | |
106 | - completionHandler(nil,encodingError as NSError?) | |
107 | - } | |
108 | - } | |
109 | - } | |
110 | - //MARK:-User个人信息有关 | |
111 | - //登录 | |
112 | - func login(completionHandler:@escaping (String?, NSError?) -> (),phone:String, password:String){ | |
113 | - let timeFormatter=DateFormatter() | |
114 | - timeFormatter.dateFormat="yyyy-MM-dd-HH:mm:ss:sss" | |
115 | - let time=timeFormatter.string(from: Date())+"\(arc4random()%10000)" | |
116 | - let appSecret="5d744518ac1c" | |
117 | - let authorization=(time.md5()+":"+(time.md5()+appSecret).md5()).data(using: String.Encoding.ascii)?.base64EncodedString(options: Data.Base64EncodingOptions(rawValue: 0)) ?? "" | |
118 | - KHttp.POST(url: URL_OAUTH_TOKEN,parameters: ["grant_type":"password" as AnyObject,"username":phone as AnyObject,"password":password as AnyObject], encoding: URLEncoding.default,headers:["Authorization":"Basic "+authorization], completionHandler: completionHandler) | |
119 | - } | |
120 | - //更新token | |
121 | - func refreshToken(completionHandler:@escaping (String?, NSError?) -> Void,token refresh_token:String){ | |
122 | - let timeFormatter=DateFormatter() | |
123 | - timeFormatter.dateFormat="yyyy-MM-dd-HH:mm:ss:sss" | |
124 | - let time=timeFormatter.string(from: Date())+"\(arc4random()%10000)" | |
125 | - let appSecret="5d744518ac1c" | |
126 | - let authorization=(time.md5()+":"+(time.md5()+appSecret).md5()).data(using: String.Encoding.ascii)?.base64EncodedString(options: Data.Base64EncodingOptions(rawValue: 0)) ?? "" | |
127 | - KHttp.POST(url: URL_OAUTH_TOKEN, parameters:["grant_type":"refresh_token" as AnyObject,"refresh_token":refresh_token as AnyObject], headers:["Authorization":"Basic "+authorization],completionHandler: completionHandler) | |
128 | - } | |
129 | - //获取开屏广告URL | |
130 | - func getOpenAds(completionHandler:@escaping (String?, NSError?) -> ()){ | |
131 | - KHttp.GET(url: URL_GETOPENADS,headers:["Authorization":token!], completionHandler: completionHandler) | |
132 | - } | |
133 | - //我的课程提醒 | |
134 | - func getMyLiveRemind(completionHandler:@escaping (String?, NSError?) -> ()){ | |
135 | - KHttp.GET(url: URL_USER_MYLIVEREMIND, headers:["Authorization":token!], completionHandler: completionHandler) | |
136 | - } | |
137 | - //更新本地个人信息 | |
138 | - func uplocalUserInfo(completionHandler:@escaping (String?, NSError?) -> ()){ | |
139 | - KHttp.GET(url: URL_USER_USERINFO, headers:["Authorization":token!], completionHandler: completionHandler) | |
140 | - } | |
141 | - //修改密码 | |
142 | - func updatePassword(parameters: [String : AnyObject]?,completionHandler:@escaping (String?, NSError?) -> ()){ | |
143 | - KHttp.POST(url: URL_USER_UPDATEPASSWORD, parameters: parameters,headers:["Authorization":token!], completionHandler: completionHandler) | |
144 | - } | |
145 | - | |
146 | - | |
147 | - | |
148 | - //家长注册 | |
149 | - func parentRegister(parameters: [String : AnyObject]?,completionHandler:@escaping (String?, NSError?) -> ()){ | |
150 | - KHttp.POST(url: URL_PARENTREGISTER, parameters: parameters,headers:["Authorization":token!], completionHandler: completionHandler) | |
151 | - } | |
152 | - //获取注册验证码 | |
153 | - func getCaptcha(_ mobile:String,completionHandler:@escaping (String?, NSError?) -> Void){ | |
154 | - KHttp.GET(url: URL_CAPTCHA,parameters:["mobile":mobile as AnyObject],headers:["Authorization":token!], completionHandler: completionHandler) | |
155 | - } | |
156 | - //找回密码 | |
157 | - func resetPassWord(_ mobile:String,pw:String?=nil,code:String,completionHandler:@escaping (String?, NSError?) -> Void){ | |
158 | - var p:[String:String]! | |
159 | - if let pass=pw{ | |
160 | - p=["captcha":code,"Mobile":mobile,"pass":pass] | |
161 | - }else{ | |
162 | - p=["captcha":code,"Mobile":mobile,"pass":"Empty"] | |
163 | - } | |
164 | - //,headers:["Authorization":anonymousToken ?? ""] | |
165 | - | |
166 | - KHttp.GET(url: URL_RESTPW,parameters:p! as [String : AnyObject], completionHandler: completionHandler) | |
167 | - } | |
168 | - //登录获取家长信息(包括关联的孩子信息区分绑定状态 | |
169 | - func getParentInfo(_ parameters:[String:AnyObject],completionHandler:@escaping (String?, NSError?) -> ()){ | |
170 | - KHttp.POST(url: URL_GETPARENTINFO,parameters:parameters, headers:["Authorization":token!], completionHandler: completionHandler) | |
171 | - } | |
172 | - //更新姓名和性别 | |
173 | - func updateParentInfo(parameters: [String : AnyObject]?,completionHandler:@escaping (String?, NSError?) -> ()){ | |
174 | - KHttp.POST(url: URL_UPDATEPARENTINFO, parameters: parameters,headers:["Authorization":token!], completionHandler: completionHandler) | |
175 | - } | |
176 | - //获取我的短信包列表 | |
177 | - func getOrderList(_ parameters:[String:AnyObject],completionHandler:@escaping (String?, NSError?) -> ()){ | |
178 | - KHttp.GET(url: URL_GETORDERLIST,parameters:parameters,headers:["Authorization":token!], completionHandler: completionHandler) | |
179 | - } | |
180 | - //解绑孩子 | |
181 | - func getUnBindStudent(_ parameters:[String:AnyObject],completionHandler:@escaping (String?, NSError?) -> ()){ | |
182 | - KHttp.GET(url: URL_UNBINDSTUDENT,parameters:parameters,headers:["Authorization":token!], completionHandler: completionHandler) | |
183 | - } | |
184 | - | |
185 | - //根据选择的市获取该地区的学校或者根据关键字搜索学校 | |
186 | - func getAreaSchool(parameters: [String : AnyObject]?,completionHandler:@escaping (String?, NSError?) -> ()){ | |
187 | - // var urlStr = URL_GETAREASCHOOL+"?AreaName=\(getPercentEncodingString(str: parameters["AreaName"]! as! String))" | |
188 | - // if let str = parameters["Keyword"]{ | |
189 | - // urlStr = urlStr + "&Keyword=\(getPercentEncodingString(str: str as! String))" | |
190 | - // } | |
191 | - | |
192 | - KHttp.POST(url: URL_GETAREASCHOOL, parameters: parameters,headers:["Authorization":token!], completionHandler: completionHandler) | |
193 | - } | |
194 | - | |
195 | - //获取该学校的年级或班级 | |
196 | - func getClassOrGrade(_ parameters:[String:AnyObject],completionHandler:@escaping (String?, NSError?) -> ()){ | |
197 | - KHttp.GET(url: URL_GETCLASSORGRADE,parameters:parameters,headers:["Authorization":token!], completionHandler: completionHandler) | |
198 | - } | |
199 | - //MARK: ---- ParentService ----- | |
200 | - //获取工具入口和活动 | |
201 | - func getActivityTool(_ parameters:[String:AnyObject],completionHandler:@escaping (String?, NSError?) -> ()){ | |
202 | - KHttp.GET(url: URL_PARENTSERVICE_GETACTIVITYTOOL,parameters:parameters,headers:["Authorization":token!], completionHandler: completionHandler) | |
203 | - } | |
204 | - //绑定孩子信息(合作学校绑定返回null,非合作学校返回“汇作业”账号和密码) | |
205 | - func bindlingChildren(parameters: [String : AnyObject],completionHandler:@escaping (String?, NSError?) -> ()){ | |
206 | - KHttp.POST(url: URL_BINDLINGCHILDREN, parameters: parameters,headers:["Authorization":token!], completionHandler: completionHandler) | |
207 | - } | |
208 | - | |
209 | - | |
210 | - //获取频道资讯 | |
211 | - func getChannelInfo(_ parameters:[String:AnyObject],completionHandler:@escaping (String?, NSError?) -> ()){ | |
212 | - KHttp.POST(url: URL_PARENTSERVICE_GETCHANNELINFO,parameters:parameters,headers:["Authorization":token!], completionHandler: completionHandler) | |
213 | - } | |
214 | - | |
215 | - //获取首页资讯话题/搜索资讯 | |
216 | - func getInformationTopic(_ parameters:[String:AnyObject],completionHandler:@escaping (String?, NSError?) -> ()){ | |
217 | - KHttp.POST(url: URL_PARENTSERVICE_GETINFORMATIONTOPIC,parameters:parameters,headers:["Authorization":token!], completionHandler: completionHandler) | |
218 | - } | |
219 | - | |
220 | - //获取订购的报告或科目 | |
221 | - func getOrderSubject(_ parameters:[String:AnyObject],completionHandler:@escaping (String?, NSError?) -> ()){ | |
222 | - KHttp.GET(url: URL_PARENTSERVICE_GETORDERSUBJECT,parameters:parameters,headers:["Authorization":token!], completionHandler: completionHandler) | |
223 | - } | |
224 | - | |
225 | - //获取报告列表 | |
226 | - func workReport(parameters: [String : AnyObject]?,completionHandler:@escaping (String?, NSError?) -> ()){ | |
227 | - KHttp.POST(url: URL_PARENTSERVICE_WORKREPORT, parameters: parameters,headers:["Authorization":token!], completionHandler: completionHandler) | |
228 | - } | |
229 | - | |
230 | - //MARK: - 成长 | |
231 | - //MARK: 应用 | |
232 | - ///补卡 | |
233 | - func postStudentMendCard(parameters: [String : AnyObject]?,completionHandler:@escaping (String?, NSError?) -> ()){ | |
234 | - KHttp.POST(url: URL_POST_MEND_CARD, parameters: parameters,headers:["Authorization":token!], completionHandler: completionHandler) | |
235 | - } | |
236 | - ///考勤 | |
237 | - func getStudentCheckList(parameters: [String : AnyObject]?,completionHandler:@escaping (String?, NSError?) -> ()){ | |
238 | - KHttp.GET(url: URL_GET_ATTENDANCE_LIST, parameters: parameters,headers:["Authorization":token!], completionHandler: completionHandler) | |
239 | - } | |
240 | - //MARK:量规评价 | |
241 | - //获取报告详情 | |
242 | - func workReportDetails(parameters: [String : AnyObject]?,completionHandler:@escaping (String?, NSError?) -> ()){ | |
243 | - KHttp.POST(url: URL_PARENTSERVICE_WORKREPORTDETAILS, parameters: parameters,headers:["Authorization":token!], completionHandler: completionHandler) | |
244 | - } | |
245 | - //获取德育报告-总体详情 | |
246 | - func getEvaluationSceneAnalysis(parameters:[String:AnyObject]?,completionHandler:@escaping (String?,NSError?)->()){ | |
247 | - KHttp.POST(url: URL_POST_EVALUATION_ANALYSIS, parameters: parameters, headers: ["Authorization":token!], completionHandler: completionHandler) | |
248 | - } | |
249 | - //获取德育报告-场景详情 | |
250 | - func getEvaluationSceneAnalysisDetails(parameters:[String:AnyObject]?,completionHandler:@escaping (String?,NSError?)->()){ | |
251 | - KHttp.POST(url: URL_POST_EVALUATION_ANALYSIS_DETAILS, parameters: parameters, headers: ["Authorization":token!], completionHandler: completionHandler) | |
252 | - } | |
253 | - //订购信息 | |
254 | - func orderCenter(parameters: [String : AnyObject]?,completionHandler:@escaping (String?, NSError?) -> ()){ | |
255 | - KHttp.POST(url: URL_PARENTSERVICE_ORDERCENTER, parameters: parameters,headers:["Authorization":token!], completionHandler: completionHandler) | |
256 | - } | |
257 | - | |
258 | - //查看订购详情 | |
259 | - func orderServiceDetails(_ parameters:[String:AnyObject],completionHandler:@escaping (String?, NSError?) -> ()){ | |
260 | - KHttp.GET(url: URL_PARENTSERVICE_ORDERSERVICEDETAILS,parameters:parameters,headers:["Authorization":token!], completionHandler: completionHandler) | |
261 | - } | |
262 | - | |
263 | - //获取广告位信息 | |
264 | - func getAds(_ parameters:[String:AnyObject],completionHandler:@escaping (String?, NSError?) -> ()){ | |
265 | - KHttp.GET(url: URL_PARENTSERVICE_GETADS,parameters:parameters,headers:["Authorization":token!], completionHandler: completionHandler) | |
266 | - } | |
267 | - | |
268 | - | |
269 | -} | |
270 | -let SERVER_MESSAGE=393939 | |
271 | -func httpJsonResule(jsonString:String?,error:NSError?,successHandler:(JSON)->Void,failHandler:(NSError)->Void){ | |
272 | - let json=JSON.fromString(jsonString) | |
273 | - if let info=json{ | |
274 | - if info.isSuccess(){ | |
275 | - successHandler(info) | |
276 | - }else{ | |
277 | - failHandler(NSError(domain: "shunzhi.net", | |
278 | - code: SERVER_MESSAGE, | |
279 | - userInfo: [NSLocalizedDescriptionKey:info["message"].stringValue])) | |
280 | - } | |
281 | - }else{ | |
282 | - if let e=error{ | |
283 | - failHandler(e) | |
284 | - }else{ | |
285 | - failHandler(NSError(domain: "shunzhi.net", | |
286 | - code: 0, | |
287 | - userInfo: [NSLocalizedDescriptionKey:"not a json!!"])) | |
288 | - } | |
289 | - } | |
290 | -} | |
291 | - | |
292 | -// MARK: - 对UIImageView的网络加载图片扩展 | |
293 | -extension UIImageView { | |
294 | - | |
295 | - /// 网络加载图片 | |
296 | - /// | |
297 | - /// - Parameters: | |
298 | - /// - urlStr: 图片网络地址字符串 | |
299 | - /// - placeholder: 默认替代图片 | |
300 | - func setImageWithUrl(urlStr:String,placeholder:String?) { | |
301 | - if !(urlStr.isEmpty){ | |
302 | - let imageUrl = URL.init(string: urlStr) | |
303 | - if placeholder == nil { | |
304 | - self.af_setImage(withURL: imageUrl!) | |
305 | - }else{ | |
306 | - self.af_setImage(withURL: imageUrl!, placeholderImage: UIImage.init(named: placeholder!)) | |
307 | - } | |
308 | - }else{ | |
309 | - if let image = placeholder { | |
310 | - self.image = UIImage.init(named: image) | |
311 | - } | |
312 | - } | |
313 | - } | |
314 | -} | |
315 | - |
ParentAssistant/ParentAssistant/Classes/util/utils.swift