美文网首页
Hello Vapor

Hello Vapor

作者: HCong | 来源:发表于2017-08-21 15:39 被阅读26次

项目初始化

  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点我查看

相关文章

  • Hello Vapor

    项目初始化 安装Vapor Tools 使用Vapor Tools初始化项目注意:可以根据需求创建模板项目vapo...

  • Vapor - Hello World!

    上一节我们已经把 Vapor 环境搭建[https://www.jianshu.com/p/ce39f355881...

  • Vapor系列教程 - Hello, World

    创建 目录 生成的工程目录如下 编辑 main.swift 文件中将生成一些模版代码,编辑 main.swift ...

  • Vapor文档学习一 :Droplet

    说明:这系列文章都是基于Vapor文档的理解与翻译,仅供个人学习使用。 Hello world 关于如何安装Vap...

  • Vapor 2.0 - 使用JSON(Using JSON)

    前往 Vapor 2.0 - 文档目录 用Vapor(With Vapor) 这个包在默认情况下被Vapor包含了...

  • Vapor学习之项目创建

    创建新项目 创建一个名为Hello的新项目 创建成功后进入项目目录 生成Xcode项目 使用 Vapor Tool...

  • Vapor - 环境安装

    序言 Vapor[https://github.com/vapor/vapor]是 Swift 最流行的 Web ...

  • Vapor学习

    通过将Vapor官方文档进行梳理,了解Vapor所涉及到的知识点 Vapor英文教程Vapor中文教程官方Github

  • Vapor 2.0 - 使用节点(Using Node)

    前往 Vapor 2.0 - 文档目录 带有Vapor(With Vapor) 默认情况下,该包附件包含在Vapo...

  • Vapor 2.0 - 使用位(Using Bits)

    前往 Vapor 2.0 - 文档目录 带有Vapor(With Vapor) 默认情况下,该包附件包含在Vapo...

网友评论

      本文标题:Hello Vapor

      本文链接:https://www.haomeiwen.com/subject/ujhhrxtx.html