Hello Vapor

項(xiàng)目初始化

  1. 安裝Vapor Tools
  2. 使用Vapor Tools初始化項(xiàng)目
    注意:可以根據(jù)需求創(chuàng)建模板項(xiàng)目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進(jìn)行添加操作
      try addProvider(MySQLProvider.Provider.self)
    • 在文件夾Config下創(chuàng)建mysql.json,以json的形式設(shè)置服務(wù)地址數(shù)據(jù)庫名與密碼
      { "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轉(zhuǎn)為關(guān)系型數(shù)據(jù)庫
      • 創(chuàng)建繼承自FluentProvider中間件的ModelUser,并實(shí)現(xiàn)RowConvertible協(xié)議
      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)
          }
      }
      
      • 數(shù)據(jù)庫初始化
       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數(shù)據(jù)庫初始化
        /// 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數(shù)據(jù)操作
       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的關(guān)系


    Fluent&MySQL.png

更多Fluent點(diǎn)我查看

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市趋艘,隨后出現(xiàn)的幾起案子表箭,更是在濱河造成了極大的恐慌拭宁,老刑警劉巖聚假,帶你破解...
    沈念sama閱讀 212,816評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件碌廓,死亡現(xiàn)場離奇詭異敬锐,居然都是意外死亡背传,警方通過查閱死者的電腦和手機(jī)捆等,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,729評論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來续室,“玉大人栋烤,你說我怎么就攤上這事⊥φ” “怎么了明郭?”我有些...
    開封第一講書人閱讀 158,300評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長丰泊。 經(jīng)常有香客問我薯定,道長,這世上最難降的妖魔是什么瞳购? 我笑而不...
    開封第一講書人閱讀 56,780評論 1 285
  • 正文 為了忘掉前任话侄,我火速辦了婚禮,結(jié)果婚禮上学赛,老公的妹妹穿的比我還像新娘年堆。我一直安慰自己,他們只是感情好盏浇,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,890評論 6 385
  • 文/花漫 我一把揭開白布变丧。 她就那樣靜靜地躺著,像睡著了一般绢掰。 火紅的嫁衣襯著肌膚如雪痒蓬。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 50,084評論 1 291
  • 那天滴劲,我揣著相機(jī)與錄音攻晒,去河邊找鬼。 笑死班挖,一個(gè)胖子當(dāng)著我的面吹牛鲁捏,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播聪姿,決...
    沈念sama閱讀 39,151評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼碴萧,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了末购?” 一聲冷哼從身側(cè)響起破喻,我...
    開封第一講書人閱讀 37,912評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎盟榴,沒想到半個(gè)月后曹质,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,355評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,666評論 2 327
  • 正文 我和宋清朗相戀三年羽德,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了几莽。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,809評論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡宅静,死狀恐怖章蚣,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情姨夹,我是刑警寧澤纤垂,帶...
    沈念sama閱讀 34,504評論 4 334
  • 正文 年R本政府宣布,位于F島的核電站磷账,受9級特大地震影響峭沦,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜逃糟,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,150評論 3 317
  • 文/蒙蒙 一吼鱼、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧绰咽,春花似錦菇肃、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至矛辕,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間付魔,已是汗流浹背聊品。 一陣腳步聲響...
    開封第一講書人閱讀 32,121評論 1 267
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留几苍,地道東北人翻屈。 一個(gè)月前我還...
    沈念sama閱讀 46,628評論 2 362
  • 正文 我出身青樓,卻偏偏與公主長得像妻坝,于是被迫代替她去往敵國和親伸眶。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,724評論 2 351

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理刽宪,服務(wù)發(fā)現(xiàn)厘贼,斷路器,智...
    卡卡羅2017閱讀 134,638評論 18 139
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法圣拄,類相關(guān)的語法嘴秸,內(nèi)部類的語法,繼承相關(guān)的語法,異常的語法岳掐,線程的語...
    子非魚_t_閱讀 31,602評論 18 399
  • MySQL 數(shù)據(jù)庫常用命令 1凭疮、MySQL常用命令 create database name; 創(chuàng)建數(shù)據(jù)庫 use...
    55lover閱讀 4,781評論 1 57
  • 上一章 一年后执解,她和他就正式辦了離婚手續(xù),孩子跟她纲酗,鎮(zhèn)上的房子賣了衰腌,錢一人一半。然后耕姊,她用這點(diǎn)錢交了個(gè)首付桶唐,在市區(qū)...
    秘密花園筆記閱讀 193評論 0 0
  • 1)親子 和孩子一起泡腳4次 和孩子一周一首詩《詠華山》 孩子每天保證6:30起床,晚上22:00入睡 孩子每天早...
    放飛夢想的鴿子閱讀 368評論 0 0