swift 4.0时代的到来,说明了swift已经趋于稳定了,已经完全可以入坑了.

下面就拿最简单的数据转模型来说说,实战一下.

接口使用:  http://116.211.167.106/api/live/aggregation?uid=133825214&interest=1

分别演示下:  1.SwiftyJSON 2.HandyJSON 3.ObjectMapper 4.swift4.0 Codable

说明:对上面几种方案使用过后1.SwiftyJSON直接对返回数据进行操作,不包含模型转换.个人不太喜欢

              2.HandyJSON阿里封装的数据转模型,朋友说这个轮子有点方

              3.ObjectMapper朋友推荐使用这个

              4.swift4.0 Codable,个人也不太喜欢

1.SwiftyJSON  

C层:

  1. //
  2. // TabOneVC.swift
  3. // myDemo
  4. //
  5. // Created by Shaoting Zhou on 2017/12/19.
  6. // Copyright © 2017年 Shaoting Zhou. All rights reserved.
  7. // SwiftyJSON -- https://github.com/SwiftyJSON/SwiftyJSON
  8.  
  9. import UIKit
  10. import Alamofire
  11. import SwiftyJSON
  12. private let oneCellIdentifier = "oneCellIdentifier"
  13.  
  14. class TabOneVC: UIViewController {
  15.  
  16. lazy var oneTableView:UITableView = {
  17. let tabView = UITableView.init(frame: UIScreen.main.bounds)
  18. tabView.delegate = self
  19. tabView.dataSource = self
  20. tabView.rowHeight = 220.0
  21. tabView.register(OneCell.self, forCellReuseIdentifier: oneCellIdentifier)
  22. view.addSubview(tabView)
  23. return tabView
  24.  
  25. }()
  26.  
  27. var ary:[JSON]! = []
  28.  
  29. override func viewDidLoad() {
  30. super.viewDidLoad()
  31.  
  32. Alamofire.request("http://116.211.167.106/api/live/aggregation?uid=133825214&interest=1").responseJSON { (response) in
  33. let data = response.result.value
  34. let j = JSON.init(data!)
  35. self.ary = j["lives"].array
  36. self.oneTableView.reloadData()
  37. }
  38. }
  39.  
  40. override func didReceiveMemoryWarning() {
  41. super.didReceiveMemoryWarning()
  42. // Dispose of any resources that can be recreated.
  43. }
  44.  
  45. }
  46. extension TabOneVC: UITableViewDelegate,UITableViewDataSource{
  47. func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
  48. return ary.count;
  49. }
  50.  
  51. func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
  52. let cell = tableView.dequeueReusableCell(withIdentifier: oneCellIdentifier, for: indexPath) as! OneCell
  53. cell.jsonObj = ary[indexPath.row]
  54.  
  55. return cell;
  56.  
  57. }
  58.  
  59. }

SwiftyJSON

cell:

  1. //
  2. // OneCell.swift
  3. // myDemo
  4. //
  5. // Created by Shaoting Zhou on 2017/12/19.
  6. // Copyright © 2017年 Shaoting Zhou. All rights reserved.
  7. //
  8.  
  9. import UIKit
  10. import SwiftyJSON
  11. import SDWebImage
  12. class OneCell: UITableViewCell {
  13. var jsonObj:JSON?{
  14. didSet{
  15. nameLabel.text = String(describing: jsonObj!["creator"]["nick"]) + "-" + String(describing: jsonObj!["city"])
  16. let str:String = String(describing: jsonObj!["creator"]["portrait"])
  17. picImgView.sd_setImage(with: URL.init(string: str), completed: nil)
  18. }
  19. }
  20.  
  21. lazy var nameLabel:UILabel = {
  22. let la = UILabel.init()
  23. return la;
  24. }()
  25.  
  26. lazy var picImgView:UIImageView = {
  27. let imgView = UIImageView.init()
  28. return imgView;
  29. }()
  30.  
  31. override init(style: UITableViewCellStyle, reuseIdentifier: String?) {
  32. super.init(style: style, reuseIdentifier: reuseIdentifier)
  33. setupUI()
  34. addCons()
  35. }
  36.  
  37. func setupUI(){
  38. contentView.addSubview(nameLabel)
  39. contentView.addSubview(picImgView)
  40.  
  41. }
  42.  
  43. func addCons(){
  44. nameLabel.snp.makeConstraints { (make) in
  45. make.leftMargin.equalTo(contentView.snp.left).offset(10)
  46. make.rightMargin.equalTo(contentView.snp.right).offset(-10)
  47. make.topMargin.equalTo(contentView.snp.top).offset(10)
  48. make.height.equalTo(50)
  49. }
  50. picImgView.snp.makeConstraints { (make) in
  51. make.leftMargin.equalTo(contentView.snp.left).offset(10)
  52. make.topMargin.equalTo(nameLabel.snp.bottom).offset(20)
  53. make.height.width.equalTo(120)
  54. }
  55.  
  56. }
  57.  
  58. required init?(coder aDecoder: NSCoder) {
  59. fatalError("init(coder:) has not been implemented")
  60. }
  61.  
  62. }

SwiftyJSON

2.HandyJSON

C层:

  1. //
  2. // TabTwoVC.swift
  3. // myDemo
  4. //
  5. // Created by Shaoting Zhou on 2017/12/19.
  6. // Copyright © 2017年 Shaoting Zhou. All rights reserved.
  7. // HandyJSON -- https://github.com/alibaba/HandyJSON
  8.  
  9. import UIKit
  10. import Alamofire
  11. import HandyJSON
  12.  
  13. private let twoCellIdentifier = "twoCellIdentifier"
  14. class TabTwoVC: UIViewController {
  15.  
  16. lazy var twoTableView:UITableView = {
  17. let tabView = UITableView.init(frame: UIScreen.main.bounds)
  18. tabView.delegate = self
  19. tabView.dataSource = self
  20. tabView.rowHeight = 220.0
  21. tabView.register(TwoCell.self, forCellReuseIdentifier: twoCellIdentifier)
  22. view.addSubview(tabView)
  23.  
  24. return tabView
  25. }()
  26.  
  27. var ary:[Dictionary<String, Any>] = []
  28.  
  29. override func viewDidLoad() {
  30. super.viewDidLoad()
  31.  
  32. Alamofire.request("http://116.211.167.106/api/live/aggregation?uid=133825214&interest=1").responseJSON { (response) in
  33. let data:Dictionary<String,Any> = response.result.value as! Dictionary
  34. self.ary = data["lives"] as! [Dictionary<String, Any>]
  35. self.twoTableView.reloadData()
  36. }
  37.  
  38. }
  39.  
  40. override func didReceiveMemoryWarning() {
  41. super.didReceiveMemoryWarning()
  42. // Dispose of any resources that can be recreated.
  43. }
  44.  
  45. }
  46.  
  47. extension TabTwoVC: UITableViewDelegate,UITableViewDataSource{
  48. func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
  49. return ary.count;
  50. }
  51.  
  52. func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
  53. let cell = tableView.dequeueReusableCell(withIdentifier: twoCellIdentifier, for: indexPath) as! TwoCell
  54. cell.model = JSONDeserializer.deserializeFrom(dict: ary[indexPath.row])
  55. return cell;
  56.  
  57. }
  58.  
  59. }

HandyJSON

cell:

  1. //
  2. // TwoCell.swift
  3. // myDemo
  4. //
  5. // Created by Shaoting Zhou on 2017/12/19.
  6. // Copyright © 2017年 Shaoting Zhou. All rights reserved.
  7. //
  8.  
  9. import UIKit
  10. import SnapKit
  11. import SDWebImage
  12. class TwoCell: UITableViewCell {
  13.  
  14. var model:TwoModel!{
  15. didSet{
  16. nameLabel.text = model.creator.nick + "-" + model.city
  17. let str = model.creator.portrait
  18. picImgView.sd_setImage(with: URL.init(string: str!), completed: nil)
  19.  
  20. }
  21. }
  22.  
  23. lazy var nameLabel:UILabel = {
  24. let la = UILabel.init()
  25. return la;
  26. }()
  27.  
  28. lazy var picImgView:UIImageView = {
  29. let imgView = UIImageView.init()
  30. return imgView;
  31. }()
  32.  
  33. override init(style: UITableViewCellStyle, reuseIdentifier: String?) {
  34. super.init(style: style, reuseIdentifier: reuseIdentifier)
  35. setupUI()
  36. addCons()
  37. }
  38.  
  39. func setupUI(){
  40. contentView.addSubview(nameLabel)
  41. contentView.addSubview(picImgView)
  42.  
  43. }
  44.  
  45. func addCons(){
  46. nameLabel.snp.makeConstraints { (make) in
  47. make.leftMargin.equalTo(contentView.snp.left).offset(10)
  48. make.rightMargin.equalTo(contentView.snp.right).offset(-10)
  49. make.topMargin.equalTo(contentView.snp.top).offset(10)
  50. make.height.equalTo(50)
  51. }
  52. picImgView.snp.makeConstraints { (make) in
  53. make.rightMargin.equalTo(contentView.snp.right).offset(-10)
  54. make.topMargin.equalTo(nameLabel.snp.bottom).offset(20)
  55. make.height.width.equalTo(120)
  56. }
  57.  
  58. }
  59.  
  60. required init?(coder aDecoder: NSCoder) {
  61. fatalError("init(coder:) has not been implemented")
  62. }
  63. }

HandyJSON

model:

  1. //
  2. // Model.swift
  3. // myDemo
  4. //
  5. // Created by Shaoting Zhou on 2017/12/19.
  6. // Copyright © 2017年 Shaoting Zhou. All rights reserved.
  7. //
  8.  
  9. import UIKit
  10. import HandyJSON
  11. struct TwoModel: HandyJSON {
  12. var city:String!
  13. var creator:TwoCreatorModel!
  14. }
  15.  
  16. struct TwoCreatorModel: HandyJSON {
  17. var nick:String!
  18. var portrait:String!
  19. }

HandyJSON

3.ObjectMapper

C层:

  1. //
  2. // TabThreeVC.swift
  3. // myDemo
  4. //
  5. // Created by Shaoting Zhou on 2017/12/20.
  6. // Copyright © 2017年 Shaoting Zhou. All rights reserved.
  7. // ObjectMapper -- https://github.com/Hearst-DD/ObjectMapper
  8.  
  9. import UIKit
  10. import Alamofire
  11. import ObjectMapper
  12. private let threeCellIdentifier = "threeCellIdentifier"
  13.  
  14. class TabThreeVC: UIViewController {
  15.  
  16. lazy var threeTableView:UITableView = {
  17. let tabView = UITableView.init(frame: UIScreen.main.bounds)
  18. tabView.delegate = self
  19. tabView.dataSource = self
  20. tabView.rowHeight = 220.0
  21. tabView.register(ThreeCell.self, forCellReuseIdentifier: threeCellIdentifier)
  22. return tabView
  23. }()
  24. var ary:[Dictionary<String, Any>] = []
  25.  
  26. override func viewDidLoad() {
  27. super.viewDidLoad()
  28. view.addSubview(threeTableView)
  29. Alamofire.request("http://116.211.167.106/api/live/aggregation?uid=133825214&interest=1").responseJSON { (response) in
  30. let data:Dictionary<String,Any> = response.result.value as! Dictionary
  31. self.ary = data["lives"] as! [Dictionary<String, Any>]
  32. self.threeTableView.reloadData()
  33. }
  34.  
  35. }
  36.  
  37. override func didReceiveMemoryWarning() {
  38. super.didReceiveMemoryWarning()
  39. // Dispose of any resources that can be recreated.
  40. }
  41.  
  42. }
  43.  
  44. extension TabThreeVC: UITableViewDelegate,UITableViewDataSource{
  45. func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
  46. return ary.count;
  47. }
  48.  
  49. func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
  50. let cell = tableView.dequeueReusableCell(withIdentifier: threeCellIdentifier, for: indexPath) as! ThreeCell
  51. cell.model = Mapper<ThreeModel>().map(JSON: ary[indexPath.row])
  52. return cell;
  53.  
  54. }
  55.  
  56. }

ObjectMapper

cell:

  1. //
  2. // ThreeCell.swift
  3. // myDemo
  4. //
  5. // Created by Shaoting Zhou on 2017/12/20.
  6. // Copyright © 2017年 Shaoting Zhou. All rights reserved.
  7. //
  8.  
  9. import UIKit
  10. import SnapKit
  11. import SDWebImage
  12.  
  13. class ThreeCell: UITableViewCell {
  14.  
  15. var model:ThreeModel!{
  16. didSet{
  17. nameLabel.text = model.creator!.nick! + model.city!
  18. let str = model.creator!.portrait
  19. picImgView.sd_setImage(with: URL.init(string: str!), completed: nil)
  20.  
  21. }
  22. }
  23.  
  24. lazy var nameLabel:UILabel = {
  25. let la = UILabel.init()
  26. la.textAlignment = .center
  27. return la;
  28. }()
  29.  
  30. lazy var picImgView:UIImageView = {
  31. let imgView = UIImageView.init()
  32. return imgView;
  33. }()
  34.  
  35. override init(style: UITableViewCellStyle, reuseIdentifier: String?) {
  36. super.init(style: style, reuseIdentifier: reuseIdentifier)
  37. setupUI()
  38. addCons()
  39. }
  40.  
  41. func setupUI(){
  42. contentView.addSubview(nameLabel)
  43. contentView.addSubview(picImgView)
  44.  
  45. }
  46.  
  47. func addCons(){
  48. nameLabel.snp.makeConstraints { (make) in
  49. make.leftMargin.equalTo(contentView.snp.left).offset(10)
  50. make.rightMargin.equalTo(contentView.snp.right).offset(-10)
  51. make.topMargin.equalTo(contentView.snp.top).offset(10)
  52. make.height.equalTo(50)
  53. }
  54. picImgView.snp.makeConstraints { (make) in
  55. make.center.equalTo(contentView.snp.center)
  56. make.height.width.equalTo(120)
  57. }
  58.  
  59. }
  60.  
  61. required init?(coder aDecoder: NSCoder) {
  62. fatalError("init(coder:) has not been implemented")
  63. }
  64.  
  65. }

ObjectMapper

model:

  1. //
  2. // ThreeModel.swift
  3. // myDemo
  4. //
  5. // Created by Shaoting Zhou on 2017/12/20.
  6. // Copyright © 2017年 Shaoting Zhou. All rights reserved.
  7. //
  8.  
  9. import UIKit
  10. import ObjectMapper
  11.  
  12. struct ThreeModel: Mappable {
  13. var city:String!
  14. var creator:ThreeCreatorModel!
  15.  
  16. mutating func mapping(map: Map) {
  17. city <- map["city"]
  18. creator <- map["creator"]
  19. }
  20.  
  21. init?(map: Map) {
  22.  
  23. }
  24.  
  25. }
  26.  
  27. struct ThreeCreatorModel: Mappable {
  28. var nick:String!
  29. var portrait:String!
  30.  
  31. mutating func mapping(map: Map) {
  32. nick <- map["nick"]
  33. portrait <- map["portrait"]
  34. }
  35.  
  36. init?(map: Map) {
  37.  
  38. }
  39.  
  40. }

ObjectMapper

4.swift4.0 Codable

C层:

  1. //
  2. // TabFourVC.swift
  3. // myDemo
  4. //
  5. // Created by Shaoting Zhou on 2017/12/20.
  6. // Copyright © 2017年 Shaoting Zhou. All rights reserved.
  7. // 自家孩子 swift4.0 Codable
  8.  
  9. import UIKit
  10. import Alamofire
  11.  
  12. private let fourCellIdentifier = "fourCellIdentifier"
  13.  
  14. class TabFourVC: UIViewController {
  15.  
  16. lazy var fourTableView:UITableView = {
  17. let tabView = UITableView.init(frame: UIScreen.main.bounds)
  18. tabView.delegate = self
  19. tabView.dataSource = self
  20. tabView.rowHeight = 220.0
  21. tabView.register(FourCell.self, forCellReuseIdentifier: fourCellIdentifier)
  22. view.addSubview(tabView)
  23. return tabView
  24. }()
  25. var model:FourModel!
  26.  
  27. override func viewDidLoad() {
  28. super.viewDidLoad()
  29. Alamofire.request("http://116.211.167.106/api/live/aggregation?uid=133825214&interest=1").responseData { (data) in
  30. self.model = try! JSONDecoder().decode(FourModel.self, from: data.result.value!)
  31. self.fourTableView.reloadData()
  32. }
  33. }
  34.  
  35. override func didReceiveMemoryWarning() {
  36. super.didReceiveMemoryWarning()
  37. // Dispose of any resources that can be recreated.
  38. }
  39.  
  40. }
  41.  
  42. extension TabFourVC: UITableViewDelegate,UITableViewDataSource{
  43. func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
  44. return model.lives.count;
  45. }
  46.  
  47. func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
  48. let cell = tableView.dequeueReusableCell(withIdentifier: fourCellIdentifier, for: indexPath) as! FourCell
  49. cell.model = model.lives[indexPath.row]
  50. return cell;
  51. }
  52.  
  53. }

Codable

cell:

  1. //
  2. // FourCell.swift
  3. // myDemo
  4. //
  5. // Created by Shaoting Zhou on 2017/12/20.
  6. // Copyright © 2017年 Shaoting Zhou. All rights reserved.
  7. //
  8.  
  9. import UIKit
  10. import SnapKit
  11. import SDWebImage
  12.  
  13. class FourCell: UITableViewCell {
  14.  
  15. var model:FourLivesModel!{
  16. didSet{
  17. nameLabel.text = model.city + model.creator.nick
  18. let str = model.creator.portrait
  19. picImgView.sd_setImage(with: URL.init(string: str), completed: nil)
  20. }
  21. }
  22.  
  23. lazy var nameLabel:UILabel = {
  24. let la = UILabel.init()
  25. la.textAlignment = .center
  26. la.backgroundColor = UIColor.red
  27. return la;
  28. }()
  29.  
  30. lazy var picImgView:UIImageView = {
  31. let imgView = UIImageView.init()
  32. return imgView;
  33. }()
  34.  
  35. override init(style: UITableViewCellStyle, reuseIdentifier: String?) {
  36. super.init(style: style, reuseIdentifier: reuseIdentifier)
  37. setupUI()
  38. addCons()
  39. }
  40.  
  41. func setupUI(){
  42. contentView.addSubview(nameLabel)
  43. contentView.addSubview(picImgView)
  44.  
  45. }
  46.  
  47. func addCons(){
  48. picImgView.snp.makeConstraints { (make) in
  49. make.center.equalTo(contentView.snp.center)
  50. make.height.width.equalTo(120)
  51. }
  52. nameLabel.snp.makeConstraints { (make) in
  53. make.leftMargin.equalTo(contentView.snp.left).offset(10)
  54. make.rightMargin.equalTo(contentView.snp.right).offset(-10)
  55. make.topMargin.equalTo(picImgView.snp.bottom).offset(10)
  56. make.height.equalTo(50)
  57. }
  58.  
  59. }
  60.  
  61. required init?(coder aDecoder: NSCoder) {
  62. fatalError("init(coder:) has not been implemented")
  63. }
  64.  
  65. }

Codable

model:

  1. //
  2. // FourModel.swift
  3. // myDemo
  4. //
  5. // Created by Shaoting Zhou on 2017/12/20.
  6. // Copyright © 2017年 Shaoting Zhou. All rights reserved.
  7. //
  8.  
  9. import UIKit
  10.  
  11. struct FourModel: Codable {
  12. var error_msg:String
  13. var lives:[FourLivesModel]
  14.  
  15. }
  16.  
  17. struct FourLivesModel: Codable {
  18. var city:String
  19. var creator:FourCreatorModel
  20. }
  21.  
  22. struct FourCreatorModel: Codable {
  23. var nick:String
  24. var portrait:String
  25. }

Codable

基本的效果都长这样:

GitHub地址: https://github.com/pheromone/swift_study

 





swift4.0 数据转模型的更多相关文章

  1. Thinkphp5.0 的使用模型Model删除数据

    Thinkphp5.0 的使用模型Model删除数据 一.使用destory()删除数据 //删除id为3的记录 $res = User::destroy(3); //返回影响的行数 dump($re ...

  2. Thinkphp5.0 的使用模型Model更新数据

    Thinkphp5.0 的使用模型Model更新数据 (1)使用update()方法进行更新数据 一.where条件写在更新数据中 (这种情况更新的数据,必须含主键) $res = User::upd ...

  3. Thinkphp5.0 的使用模型Model添加数据

    Thinkphp5.0 的使用模型Model添加数据 使用create()方法添加数据 $res = TestUser::create([ 'name' => 'zhao liu', 'pass ...

  4. R_针对churn数据用id3、cart、C4.5和C5.0创建决策树模型进行判断哪种模型更合适

    data(churn)导入自带的训练集churnTrain和测试集churnTest 用id3.cart.C4.5和C5.0创建决策树模型,并用交叉矩阵评估模型,针对churn数据,哪种模型更合适 决 ...

  5. pytorch入门2.0构建回归模型初体验(数据生成)

    pytorch入门2.x构建回归模型系列: pytorch入门2.0构建回归模型初体验(数据生成) pytorch入门2.1构建回归模型初体验(模型构建) pytorch入门2.2构建回归模型初体验( ...

  6. ThinkPHP 学习笔记 ( 三 ) 数据库操作之数据表模型和基础模型 ( Model )

    //TP 恶补ing... 一.定义数据表模型 1.模型映射 要测试数据库是否正常连接,最直接的办法就是在当前控制器中实例化数据表,然后使用 dump 函数输出,查看数据库的链接状态.代码: publ ...

  7. kafka 日常使用和数据副本模型的理解

    kafka 日常使用和数据副本模型的理解 在使用Kafka过程中,有时经常需要查看一些消费者的情况.Kafka健康状况.临时查看.同步一些数据,又由于Kafka只是用来做流式存储,又没有像Mysql或 ...

  8. 胖子哥的大数据之路(9)-数据仓库金融行业数据逻辑模型FS-LDM

    引言: 大数据不是海市蜃楼,万丈高楼平地起只是意淫,大数据发展还要从点滴做起,基于大数据构建国家级.行业级数据中心的项目会越来越多,大数据只是技术,而非解决方案,同样面临数据组织模式,数据逻辑模式的问 ...

  9. ThinkPHP 数据库操作之数据表模型和基础模型 ( Model )

    一.定义数据表模型 1.模型映射 要测试数据库是否正常连接,最直接的办法就是在当前控制器中实例化数据表,然后使用 dump 函数输出,查看数据库的链接状态.代码: public function te ...

随机推荐

  1. redmine

    redmine直接复制图片 https://github.com/thorin/redmine_image_clipboard_paste

  2. 记一次tomcat运行起来了但是项目没起来的问题

    解决办法是: 先是tomcat的conf文件夹下的servel.xml中这两个值改成false. 然后重新运行maven的package打包,再运行项目就行了.

  3. mac版mysql配置

    开始下载 我选择的是最后一个dmg格式的安装包,点击download,会出现让我们注册登陆的界面,点击最下面的No thanks,just take me to downloads!直接进行下载即可: ...

  4. oracle性能优化之awr分析

    oracle性能优化之awr分析 作者:bingjava 最近某证券公司系统在业务期间系统运行缓慢,初步排查怀疑是数据库存在性能问题,因此导出了oracle的awr报告进行分析,在此进行记录. 导致系 ...

  5. wait和sleep的区别

    wait是线程永久等待,只有调用notify才能进行唤醒 sleep是等待指定的时间,自动唤醒

  6. fastjson对象转为json字符串日期格式变为时间戳问题

    今天尝试将map集合转为json对象时遇到一个问题.map中的value为日期格式如"2019-03-01",在使用JSONObject.toJSON(map).toString( ...

  7. Rhino模型制作——京东狗(练习网格切割)

    我最近做了一个京东狗的模型,我先把渲染好的模型给大家看一下. 别看这个模型很复杂,其实京东狗的模型是网上找的,我只是做了一个上面的洞.不过我告诉大家Rhino的下载地址:http://www.xuex ...

  8. React 实战系列:模块化

    本系列以实战为主,通过一个 TODO 应用来学习深入 React. 学习无捷径,唯一的办法就是 coding!coding!coding! 如有不足之处,欢迎大家批评指正,共同进步! 言毕,开始撸

  9. 四、Linux的常用命令

    linux常用命令可以参考这位前辈的:https://www.cnblogs.com/gaojun/p/3359355.html 这篇博文介绍的比较详细!

  10. K2百家讲坛 | 越秀地产:K2为房企数字化转型带来更多可能

    随着数字化经济时代的到来,房地产行业逐渐形成了新的竞争和市场格局,房企要在此背景下实现稳步发展,需要由原本的粗放式管理逐渐向集团性管理.精细化管控转变,这对房企的经营发展战略和业务管理方式都提出了不小 ...