1. 程式人生 > >Swift3.0服務端開發(五) 記事本的開發(iOS端+服務端)

Swift3.0服務端開發(五) 記事本的開發(iOS端+服務端)

前邊以及陸陸續續的介紹了使用Swift3.0開發的服務端應用程式的Perfect框架。本篇部落格就做一個階段性的總結,做一個完整的例項,其實這個例項在《》這篇部落格中已經簡單的介紹過了,本篇部落格就來詳細的聊一下這個工程的具體實現細節。當然包括iOS端和服務端的程式碼。本篇部落格的介紹順序按照功能模組來劃分的,如登入註冊模組、記事本列表,記事本的增刪改查等功能。在每個功能模組,我們先給出服務端程式碼的實現,然後給出客戶端程式碼的實現。

本篇部落格的前幾部分主要介紹整個工程的公用模組,為工程的實現做準備,下方就是我們今天部落格要做的東西。本篇部落格iOS端的網路請求主要使用的NSURLSession來實現的,關於URLSession更詳細的介紹請參考之前釋出的部落格《》

  

一、記事本資料庫的設計

資料庫的設計以及資料庫表的建立我都使用Sequel Pro來實現的,關於Sequel Pro的使用請看上篇部落格的介紹,本篇部落格關於Sequel Pro的介紹就不做過多贅述了。首先我們先給出記事本資料庫表的設計,以備使用。我們先建立一個名為perfect_note的資料庫(步驟略),然後再建立相應的資料庫表。因為我們的記事本比較簡單,主要包括登入、註冊以及記事本的增刪改查。所以我們的資料庫結構也是比較簡單的,perfect_note資料庫中只有兩個表,一個是user表,一個是content表,下方會給出詳細的介紹過程。

1.user表的建立

首先我們來建立user表

,user表負責儲存使用者資訊,當用戶註冊和登入時都會操作這個表。註冊使用者時就是往該表中插入使用者,登入時就是查詢相應的使用者資訊。當然,為了Demo的簡潔性,我們的user表中的欄位也是比較少的。下方就是建立user表的SQL語句。其中有四個欄位,主鍵id是整型而且是自增的,是使用者的唯一表示。username欄位儲存的是使用者名稱,password儲存的就是使用者密碼。register_date儲存的是使用者註冊時間,是時間戳,並且預設值是當前時間。

CREATE TABLE `user` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `username` 
varchar(30) CHARACTER SET latin1 NOT NULL DEFAULT '', `password` varchar(30) CHARACTER SET latin1 NOT NULL DEFAULT '', `register_date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=utf8;

2.content表的建立

建立完user表後,接下來就要建立我們的content表了。content表用來儲存使用者錄入的筆記,下方就是content表的建立SQL語句。從下方的SQL語句中不難看出content表的欄位包括自增的主鍵id,記錄的標題title,記錄的內容content,以及外來鍵userID和建立時間create_time

CREATE TABLE `content` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `title` varchar(30) CHARACTER SET gb2312 NOT NULL DEFAULT '',
  `content` text CHARACTER SET gb2312 NOT NULL,
  `userID` int(11) unsigned NOT NULL,
  `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`),
  KEY `USER_FOREIGN_KEY` (`userID`),
  CONSTRAINT `USER_FOREIGN_KEY` FOREIGN KEY (`userID`) REFERENCES `user` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=18 DEFAULT CHARSET=utf8;

二、iOS端基於NSURLSession網路請求類的封裝

建立完資料庫後,接下來我們來封裝iOS端網路請求的共用程式碼。也就是說,iOS端的網路請求就會呼叫本部分封裝的內容。當然本部分封裝的網路請求類是使用NSURLSession類封裝的。

1.字串常量、閉包回撥型別以及列舉的定義

首先我們先來定義一些封裝網路請求類要使用的字串常量以及列舉閉包回撥。下方程式碼段做的就是這件事情,第一個框中定義瞭解析響應資料時使用到的字串常量。“SUCCESS”表示請求成功,“FAILE”表示請求失敗等等。

第二個框中定義的是三個閉包變數,用來將請求結果回撥給呼叫者。RequestStart就是開始請求要呼叫的閉包型別,RequestSuccess則是請求成功後呼叫的閉包型別,RequestFailed則是請求失敗要呼叫的閉包型別。這三者是請求類對外交流的橋樑。

第三個框則是請求方式的列舉,主要包括GET、POST、PUT、DELETE,當然還留了CUSTOM()自定義的擴充套件型別。在該列舉中的description計算屬性負責將當前的列舉物件轉換成其對於的字串,具體如下所示:

  

2、網路請求基類的建立

接下來網路請求的基類,所有與網路請求相關的類都要繼承自此類,下方的BaseRequest就是我們網路請求的基類。該類比較簡單,主要聲明瞭上面定義的三個閉包型別的變數,然後給出了相應的構造器。具體如下所示。

  

3.網路請求類的封裝

接下來我們使用NSURLSession來封裝我們的網路請求類,下方的Request類就是我們封裝的網路請求類,該類繼承自BaseRequest。下方是Request的部分程式碼,下方每個方法對應著GET、POST、PUT等請求,可以結合者REST一起使用。在每個具體請求的方法中會呼叫sessionDataTaskRequest()方法。會給這個方法傳入不同的請求方式以及路徑和引數。稍後我們會給出sessionDataTaskRequest()方法的具體實現,sessionDataTaskRequest()方法其中就使用了NSURLSession相關的內容發起了網路請求,具體請看下方對sessionDataTaskRequest()方法的詳細介紹。

  

下方這個程式碼段就是sessionDataTaskRequest()方法的整體結構,首先我們根據函式的請求路徑和引數拼接URL字串,也就是第一個框中的部分。在該部分中的query()函式是將引數進行URL編碼轉換,這個函式是從AlamoFire框架中摘過來的。然後建立請求用的URLRequest物件。最後是建立Session物件發起DataTask任務了。當然請求的結果是在completionHandler閉包中進行處理,稍後會給出completionHandler閉包中的處理方式。

  

接著,我們給出請求成功後,對json資料的解析以及對返回結果的處理。下方就是completionHandler閉包中的程式碼片段。首先對伺服器返回的json資料進行解析,解析後將json資料轉換成對應的資料型別。然後根據響應報文的result欄位來進行相應的操作。如果報文響應正常,就呼叫success()閉包,否則呼叫failure()閉包,如下所示:

  

至此我們iOS客戶端的網路請求部分就封裝完了,其他具體業務邏輯的網路請求呼叫上述的Request類即可,稍後會用到Request

三、登入註冊模組的開發

上面的基礎工作完畢後,接下來我們就要來做我們相應的業務模組了。首先我們來進行登入註冊模組的開發工作。 首先給出服務端相應模組的程式碼,然後在給出相應模組的iOS端的實現。關於Swift3.0連線和操作MySQL的詳細內容請參考上一篇部落格《》,資料庫的連線在本部分就不做過多贅述了。

1、服務端程式碼

(1)、登入或註冊的第一步:接收使用者名稱

下方程式碼是使用者登入或者註冊的第一步,通過使用者名稱來查詢使用者資訊,從而來判斷該使用者是否註冊,如果未註冊則去註冊,如果註冊過就去登入。如果查詢成功,那麼就將查詢的使用者ID和UserName返回給客戶端。使用者登入的程式碼和下方差不多,就是通過Select語句來匹配該使用者名稱的密碼是否與使用者輸入的一致,在此就不做過多贅述了。

  

(2)、使用者註冊

下方就是使用者註冊是呼叫的介面實現,主要是插入相應的使用者資訊,具體如下所示:

  

上面這些程式碼寫完後,配置完相應的路由呼叫上述方法,我們的服務端程式碼就完成了。具體路由的配置因為篇幅有限,本篇部落格就不做過多贅述了。

2、iOS客戶端程式碼實現

接下來我們來實現iOS客戶端的登入和註冊的程式碼,下方就是登入或者註冊的相關UI。使用者輸入使用者後,點選下一步,會呼叫後臺介面判斷使用者是否註冊過,如果已註冊輸入密碼登入,如果未註冊就輸入密碼註冊和登入。右邊的UIViewController是共用的,兩個頁面,一個讓使用者輸入使用者名稱,一個則負責接收密碼。UI比較簡單,如下所示:

  

 看完UI, 我們來看一下登入或註冊的相關網路請求的程式碼。下方的UserInfoRequest類就負責所有與使用者資訊相關的網路請求,從下方的程式碼截圖中,我們可以看到UserInfoRequest的基類是BaseRequest。下方的queryUserInfo(userName)就是上面左邊的頁面所呼叫的方法,用來判斷該使用者是否是註冊過的使用者。在queryUserInfo()中對Request類進行了例項化,並且呼叫了相應的請求方法。並且對相應的事件回撥做了處理,具體如下所示。

  

在我們相應的ViewController中會呼叫上述的方法,下方就是使用者在輸入相應的使用者資訊後點擊next所呼叫的方法。通過相應的閉包事件,最終將網路請求的結果回撥到了VC中。

  

至此我們iOS客戶端的登入就實現完畢了。 其他的程式碼和上面的思路類似,在此就不做過多贅述了。

本篇部落格,就先到這兒吧,其他程式碼和上述的思路一直,按照上述的思路去實現筆記的增刪改查即可,在此就不多廢話了。完整Demo請移步github相關連結。