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

来源:http://www.cnblogs.com/ludashi/archive/2017/01/19/6179711.html
-Advertisement-
Play Games

前邊以及陸陸續續的介紹了使用Swift3.0開發的服務端應用程式的Perfect框架。本篇博客就做一個階段性的總結,做一個完整的實例,其實這個實例在《Swift3.0服務端開發(一)》這篇博客中已經簡單的介紹過了,本篇博客就來詳細的聊一下這個工程的具體實現細節。當然包括iOS端和服務端的代碼。本篇博 ...


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

本篇博客的前幾部分主要介紹整個工程的公用模塊,為工程的實現做準備,下方就是我們今天博客要做的東西。本篇博客iOS端的網路請求主要使用的NSURLSession來實現的,關於URLSession更詳細的介紹請參考之前發佈的博客《NSURLSession全家桶

  

 

一、記事本資料庫的設計

資料庫的設計以及資料庫表的創建我都使用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的詳細內容請參考上一篇博客《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相關鏈接。

github分享鏈接: https://github.com/lizelu/PerfectDemo 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 1、隱藏tomcat版本: ①執行命令:cd /usr/local/tomcat_web/lib/ && ll 我們需要對catalina.jar進行解壓(最好提前先備份一下) ②執行命令:unzip catalina.jar 這時候會多出META-INF和org兩個目錄,找到org/apache/ ...
  • 摘要 在寫這篇文章之前,自己思索了很多,也是因為一些事情觸發了自己,使得自己想寫這麼一篇文章。也算是對2016年自己的一個總結吧。 正文 先說說我自己吧!本人16年於一所二本學校畢業,考過研,夢想著上北航,結果卻因政治考的太差沒能上,說起來很慚愧。英雄都不提往事,何況我這一個失敗的狗熊呢!不,是失敗 ...
  • 第4章 類型和聲明 4.2 布爾量 按照定義,true具有值1,而false具有值0.整數可以隱式地轉換到bool值。指針也可以隱式地轉換到bool,非零指針轉為true,具有零值的指針轉為false。 4.3 字元類型 一個char類型幾乎都包含8個二進位位,這裡還提供了另一個類型wchar_t用 ...
  • 需要 prettytime-3.2.3.Final.jar 包 代碼例子 輸出結果 ...
  • 上節我們探討了通過scalaz-stream-fs2來驅動一套數據處理流程,用fs2的Pipe類型來實現對數據流的逐行操作。本篇討論準備在上節討論的基礎上對數據流的流動和元素操作進行優化完善。如數據流動中增加諸如next、skip、eof功能、內容控制中增加對行元素的append、insert、up ...
  • 偽靜態是一種可以把文件尾碼改成任何可能的一種方法,如果我想把PHP文件偽靜態成html文件,這種相當簡單的,下麵來介紹nginx 偽靜態配置方法有需要瞭解的朋友可參考。 nginx里使用偽靜態是直接在nginx.conf 中寫規則的,並不需要像apache要開啟寫模塊(mod_rewrite)才能進 ...
  • 一佛是阿裡巴巴B2B事業群高級產品經理。從事多年互聯網系統的研發和測試工作,目前主要負責雲效分層自動化測試的產品設計。因為自動化測試在實踐過程中,總是碰到各種各樣的問題,導致進入自動化測試盲區。所以,一佛就根據當下環境並結合解決案例,來講解瞭如何把握分層自動化的分層策略,如何將分層自動化融入到項目流 ...
  • 年前接到個任務,說要解決線上一些手機客戶端介面報錯率很高的問題.拿到了監控郵件,粗略一看,各種50%+的錯誤率,簡直觸目驚心.這種疑難雜症解決起來還是挺好玩的,於是擼起袖子action.最終的結果雖然報錯問題得到瞭解決,但是感覺並不是最根本的解決方案. ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...