Hello Vapor

项目初始化

  1. 安装Vapor Tools
  2. 使用Vapor Tools初始化项目
    注意:可以根据需求创建模板项目vapor new <name> [--template]
Name Flag Descripiton
API --template=api JSON API with Fluent database.
Web --template=web HTML website with Leaf templates.

查看更多模板

  1. MySQL的配置
    • Package.swift文件添加文件路径:
      .Package(url: "https://github.com/vapor/mysql-provider.git", majorVersion: 2)
    • 添加到Droplet中,在文件Config+Setup.swift进行添加操作
      try addProvider(MySQLProvider.Provider.self)
    • 在文件夹Config下创建mysql.json,以json的形式设置服务地址数据库名与密码
      { "hostname" : "localhost", "user" : "root", "password" : "", "database" : "test"}
    • 在fluent.json中将"driver": "memory"改为"driver":"mysql"
  2. MySQL的使用
    • 直接使用SQL语句
    get("mysql") { req in
        let mysql = try self.mysql()
        let version = try mysql.raw("select * from users")
        let json = JSON(node:version.wrapped)
        return json
    }
    
    • 使用Fluent转为关系型数据库
      • 创建继承自FluentProvider中间件的ModelUser,并实现RowConvertible协议
      final class User: Model {
          /// General implementation should just be `let storage = Storage()`
          /// The storage property is there to allow Fluent to store extra information on your model--things like the model's database id.
          var storage: Storage = Storage()
      
      
          var number:Int
          var name:String
          var password:String
          var avatar:String
      
          static let idKey: String = "id"
          static let numberKey:String = "number"
          static let nameKey:String = "name"
          static let pwdKey:String = "password"
          static let avatarKey:String = "avatar"
          init(number:Int, name:String, password: String, avatar:String) {
              self.number = number
              self.name = name
              self.password = password
              self.avatar = avatar
          }
      
          func makeRow() throws -> Row {
              var row = Row()
              try row.set(User.numberKey, number)
              try row.set(User.nameKey, name)
              try row.set(User.pwdKey, password)
              try row.set(User.avatarKey, avatar)
              return row
          }
      
          init(row: Row) throws {
              number = try row.get(User.numberKey)
              name = try row.get(User.nameKey)
              password = try row.get(User.pwdKey)
              avatar = try row.get(User.avatarKey)
          }
      }
      
      • 数据库初始化
       extension User:Preparation {
          /// The revert method should undo any actions
          /// caused by the prepare method.
          ///
          /// If this is impossible, the `PreparationError.revertImpossible`
          /// error should be thrown.
          static func revert(_ database: Database) throws {
              try database.delete(self)
          }
      
          /// The prepare method should call any methods
          /// it needs on the database to prepare.
          static func prepare(_ database: Database) throws {
                try database.create(self) { builder in
                builder.id()
                builder.int(User.numberKey)
                builder.string(User.nameKey)
                builder.string(User.pwdKey)
                builder.string(User.avatarKey)
            }
         }
      }
      
      • 添加到Droplet中
        Config+Setup.swift文件中setupPreparations方法中添加User数据库初始化
        /// Add all models that should have their
        /// schemas prepared before the app boots
        private func setupPreparations() throws {
            preparations.append(Post.self)
            preparations.append(User.self)
        }
      
      • Fluent数据操作
       static func login(_ request: Request) -> ResponseRepresentable {
            
            do {
                guard let name = request.parameters.wrapped["username"]?.string ,let pwd = request.parameters.wrapped["password"]?.string else {
                    return Response(status: .badRequest, body: "Failed")
                }
                // 查询筛选
                guard let _ = try User.makeQuery().filter(raw: "name = \"\(name)\" and password = \"\(pwd)\"").first() else {
                    return Response(status: .notFound, body: "not exist or wrong password")
                }
                
                return Response(status: .ok, body: "ok")
                
            } catch {
                return Response(status: Status(statusCode: 555, reasonPhrase: "exception error"), body: error.localizedDescription)
            }
        }
        
        static func register(_ request: Request) -> ResponseRepresentable {
            
            do {
                
                guard let name = request.parameters.wrapped["username"]?.string ,let pwd = request.parameters.wrapped["password"]?.string ,let avatar = request.parameters.wrapped["avatar"]?.string else {
                    return Response(status: .badRequest, body: "Failed")
                }
      
                if let _ = try User.makeQuery().filter("name",name).first() {
                    return Response(status: Status(statusCode: 444, reasonPhrase: "Had exists"), body: "Had exists")
                }
                
                let date = Date()
                let number = Int(date.timeIntervalSince1970)
                let user = User(number: number, name: name, password: pwd, avatar: avatar)
                // 保存
                try user.save()
                
                return Response(status: .ok, body: "Success")
            } catch {
                return Response(status: Status(statusCode: 555, reasonPhrase: "exception error"), body: error.localizedDescription)
            }
        }
      
  3. Fluent与MySQL的关系


    Fluent&MySQL.png

更多Fluent点我查看

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,886评论 18 139
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,759评论 18 399
  • MySQL 数据库常用命令 1、MySQL常用命令 create database name; 创建数据库 use...
    55lover阅读 4,824评论 1 57
  • 上一章 一年后,她和他就正式办了离婚手续,孩子跟她,镇上的房子卖了,钱一人一半。然后,她用这点钱交了个首付,在市区...
    秘密花园笔记阅读 195评论 0 0
  • 1)亲子 和孩子一起泡脚4次 和孩子一周一首诗《咏华山》 孩子每天保证6:30起床,晚上22:00入睡 孩子每天早...
    放飞梦想的鸽子阅读 386评论 0 0