swift perfect mysql_服务端写Swift体验 (Perfect框架)
Perfect
實踐Demo
簡介
Perfect是一組完整、強大的工具箱、軟件框架體系和Web應用服務器,可以在Linux、iOS和macOS (OS X)上使用。該軟件體系為Swift工程師量身定制了一整套用于開發輕量、易維護、規模可擴展的Web應用及其它REST服務的解決方案,這樣Swift工程師就可以實現同時在服務器和客戶端上采用同一種語言開發軟件項目。
Perfect性能對比
性能表現
性能表現
參考連接:不服跑個分
系統要求
Swift 3.0
如果低于3.0版本則Perfect是無法成功編譯的。
OS X系統
需要的所有內容均已預裝。
Ubuntu Linux系統
Perfect軟件框架可以在Ubuntu Linux 14.04 and 15.10環境下運行。
一、Mac搭建Perfect
Mac搭建Perfect
1.創建Swift軟件包
打開終端,新建一個PerfectDemoProject文件夾用于保存項目文件。
mkdir PerfectDemoProject
cd PerfectDemoProject
1.1.1
2.初始化git
為了加快項目進度,最簡單的方法就是把這個項目目錄轉化為git repo(代碼資源文件夾)。
git init
touch README.html
git add README.html
git commit -m "Initial commit"
1.2.1
3.創建Package.swift文件
在git repo根目錄下面創建一個Package.swift文件。這個文件是SPM(Swift軟件包管理器)編譯項目時必須要用到的文件。
touch Package.swift
1.3.1
使用Xcode打開Package.swift文件并添加如下代碼,添加所需要使用的軟件包。
//軟件包管理
import PackageDescription
let versions = Version(0,0,0)..
let urls = [
"https://github.com/PerfectlySoft/Perfect-HTTPServer.git", //HTTP服務
"https://github.com/PerfectlySoft/Perfect-MySQL.git", //MySQL服務
"https://github.com/PerfectlySoft/Perfect-Mustache.git" //Mustache
]
let package = Package(
name: "PerfectDemoProject",
targets: [],
dependencies: urls.map { .Package(url: $0, versions: versions) }
)
1.3.2
4.創建Sources文件夾
創建一個名為Sources的文件夾用于保存源程序,然后在這個源程序文件夾下面創建一個main.swift文件。
mkdir Sources
echo 'print("您好!")' >> Sources/main.swift
1.4.1
5.編譯運行項目
等待編譯成功之后運行項目控制臺輸出 "您好!"。
swift build
.build/debug/PerfectDemoProject
1.5.1
使用Xcode
1.創建成Xcode可以運行項目
Swift軟件包管理器(SPM)能夠創建一個Xcode項目,并且能夠運行PerfectTemplate模板服務器,還能為您的項目提供完全的源代碼編輯和調試。
swift package generate-xcodeproj
創建為Xcode工程
工程目錄
2.打開PerfectDemoProject.xcodeproj
在Build Settings中Library Search Paths檢索項目軟件庫中增加(不單單是編譯目標)
配置工程
注意: 若在編輯過程中無其他問題且無法運行,請刪除PerfectDemoProject.xcodeproj文件,重新使用swift package generate-xcodeproj命令創建
二、搭建HTTP服務器
HTTP服務器
1.編輯main.swift
import PerfectLib
import PerfectHTTP
import PerfectHTTPServer
//HTTP服務
let networkServer = NetworkServerManager(root: "webroot", port: 8888)
networkServer.startServer()
2.創建并編輯NetworkServerManager.swift
import PerfectLib
import PerfectHTTP
import PerfectHTTPServer
open class NetworkServerManager {
fileprivate var server: HTTPServer
internal init(root: String, port: UInt16) {
server = HTTPServer.init() //創建HTTPServer服務器
var routes = Routes.init(baseUri: "/api") //創建路由器
configure(routes: &routes) //注冊路由
server.addRoutes(routes) //路由添加進服務
server.serverPort = port //端口
server.documentRoot = root //根目錄
server.setResponseFilters([(Filter404(), .high)]) //404過濾
}
//MARK: 開啟服務
open func startServer() {
do {
print("啟動HTTP服務器")
try server.start()
} catch PerfectError.networkError(let err, let msg) {
print("網絡出現錯誤:\(err) \(msg)")
} catch {
print("網絡未知錯誤")
}
}
//MARK: 注冊路由
fileprivate func configure(routes: inout Routes) {
// 添加接口,請求方式,路徑
routes.add(method: .get, uri: "/") { (request, response) in
response.setHeader( .contentType, value: "text/html") //響應頭
let jsonDic = ["hello": "world"]
let jsonString = self.baseResponseBodyJSONData(status: 200, message: "成功", data: jsonDic)
response.setBody(string: jsonString) //響應體
response.completed() //響應
}
}
//MARK: 通用響應格式
func baseResponseBodyJSONData(status: Int, message: String, data: Any!) -> String {
var result = Dictionary()
result.updateValue(status, forKey: "status")
result.updateValue(message, forKey: "message")
if (data != nil) {
result.updateValue(data, forKey: "data")
}else{
result.updateValue("", forKey: "data")
}
guard let jsonString = try? result.jsonEncodedString() else {
return ""
}
return jsonString
}
//MARK: 404過濾
struct Filter404: HTTPResponseFilter {
func filterBody(response: HTTPResponse, callback: (HTTPResponseFilterResult) -> ()) {
callback(.continue)
}
func filterHeaders(response: HTTPResponse, callback: (HTTPResponseFilterResult) -> ()) {
if case .notFound = response.status {
response.setBody(string: "404 文件\(response.request.path)不存在。")
response.setHeader(.contentLength, value: "\(response.bodyBytes.count)")
callback(.done)
} else {
callback(.continue)
}
}
}
}
3.運行結果
2.3.1
4.訪問接口效果
2.4.1
三、搭建MySQL數據庫
MySQL數據庫
工具
(1)安裝MySQL
1.安裝Homebrew
/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
3.1.1
PASS:若要卸載Homebrew
cd `brew --prefix`
rm -rf Cellar$ brew prune
rm -rf Library .git .gitignore bin/brew README.md share/man/man1/brew
rm -rf ~/Library/Caches/Homebrew
2.使用Homebrew安裝MySQL
brew install mysql
3.1.2
PASS:若要卸載MySQL(僅供參考)
brew remove mysql
brew cleanup
launchctl unload -w ~/Library/LaunchAgents/com.mysql.mysqld.plist
rm ~/Library/LaunchAgents/com.mysql.mysqld.plist
sudo rm /usr/local/mysql
sudo rm -rf /usr/local/mysql*
sudo rm -rf /Library/StartupItems/MySQLCOM
sudo rm -rf /Library/PreferencePanes/My*
(編輯 /etc/hostconfig) sudo vi /etc/hostconfig (刪除行 MYSQLCOM=-YES)
sudo rm -rf /Library/Receipts/mysql*
sudo rm -rf /Library/Receipts/MySQL*
sudo rm -rf /var/db/receipts/com.mysql.*
(2)配置MySQL
示例配置
賬號:root
密碼:Fengxu::1226
#開啟MySQL服務
mysql.server start
#初始化MySQL配置向導
mysql_secure_installation
3.2.1
3.編輯mysqlclient.pc文件
將mysqlclient.pc文件設置為可讀寫后刪除-fno-omit-frame-pointer內容。
//文件路徑:
/usr/local/lib/pkgconfig/mysqlclient.pc
3.2.2
(3)創建數據庫和表
1.使用Navicat Premium工具,連接本地數據庫
打開Navicat Premium點擊鏈接,選擇MySQL后,輸入連接名、密碼,確定保存。
示例鏈接名:TianTianDB
3.3.1
2.創建TianProject數據庫
右鍵點擊TIanTIanDB數據庫連接,選擇新建數據庫,輸入數據庫名,確認保存。
示例數據庫名:TianProject
3.3.2
3.創建account_level表
展開TIanTIanDB數據庫,右鍵點擊表,選擇新建表,如下圖,保存名為account_level表。
示例表名:account_level
3.3.3
4.向account_level表中添加數據
示例表數據:如下圖
3.3.4
(4)編輯Perfect服務端
1.創建并編輯DataBaseManager.swift
import MySQL
//MARK: 數據庫信息
let mysql_host = "127.0.0.1"
let mysql_user = "root"
let mysql_password = "Fengxu::1226"
let mysql_database = "TianProject"
//MARK: 表信息
let table_account = "account_level" //等級
open class DataBaseManager {
fileprivate var mysql: MySQL
internal init() {
mysql = MySQL.init() //創建MySQL對象
guard connectedDataBase() else { //開啟MySQL連接
return
}
}
//MARK: 開啟連接
private func connectedDataBase() -> Bool {
let connected = mysql.connect(host: mysql_host, user: mysql_user, password: mysql_password, db: mysql_database)
guard connected else {
print("MySQL連接失敗" + mysql.errorMessage())
return false
}
print("MySQL連接成功")
return true
}
//MARK: 執行SQL語句
/// 執行SQL語句
///
/// - Parameter sql: sql語句
/// - Returns: 返回元組(success:是否成功 result:結果)
@discardableResult
func mysqlStatement(_ sql: String) -> (success: Bool, mysqlResult: MySQL.Results?, errorMsg: String) {
guard mysql.selectDatabase(named: mysql_database) else { //指定database
let msg = "未找到\(mysql_database)數據庫"
print(msg)
return (false, nil, msg)
}
let successQuery = mysql.query(statement: sql) //sql語句
guard successQuery else {
let msg = "SQL失敗: \(sql)"
print(msg)
return (false, nil, msg)
}
let msg = "SQL成功: \(sql)"
print(msg)
return (true, mysql.storeResults(), msg) //sql執行成功
}
/// 增
///
/// - Parameters:
/// - tableName: 表
/// - key: 鍵 (鍵,鍵,鍵)
/// - value: 值 ('值', '值', '值')
func insertDatabaseSQL(tableName: String, key: String, value: String) -> (success: Bool, mysqlResult: MySQL.Results?, errorMsg: String){
let SQL = "INSERT INTO \(tableName) (\(key)) VALUES (\(value))"
return mysqlStatement(SQL)
}
/// 刪
///
/// - Parameters:
/// - tableName: 表
/// - key: 鍵
/// - value: 值
func deleteDatabaseSQL(tableName: String, key: String, value: String) -> (success: Bool, mysqlResult: MySQL.Results?, errorMsg: String) {
let SQL = "DELETE FROM \(tableName) WHERE \(key) = '\(value)'"
return mysqlStatement(SQL)
}
/// 改
///
/// - Parameters:
/// - tableName: 表
/// - keyValue: 鍵值對( 鍵='值', 鍵='值', 鍵='值' )
/// - whereKey: 查找key
/// - whereValue: 查找value
func updateDatabaseSQL(tableName: String, keyValue: String, whereKey: String, whereValue: String) -> (success: Bool, mysqlResult: MySQL.Results?, errorMsg: String) {
let SQL = "UPDATE \(tableName) SET \(keyValue) WHERE \(whereKey) = '\(whereValue)'"
return mysqlStatement(SQL)
}
/// 查所有
///
/// - Parameters:
/// - tableName: 表
/// - key: 鍵
func selectAllDatabaseSQL(tableName: String) -> (success: Bool, mysqlResult: MySQL.Results?, errorMsg: String) {
let SQL = "SELECT * FROM \(tableName)"
return mysqlStatement(SQL)
}
/// 查
///
/// - Parameters:
/// - tableName: 表
/// - keyValue: 鍵值對
func selectAllDataBaseSQLwhere(tableName: String, keyValue: String) -> (success: Bool, mysqlResult: MySQL.Results?, errorMsg: String) {
let SQL = "SELECT * FROM \(tableName) WHERE \(keyValue)"
return mysqlStatement(SQL)
}
//獲取account_level表中所有數據
func mysqlGetHomeDataResult() -> [Dictionary]? {
let result = selectAllDatabaseSQL(tableName: table_level)
var resultArray = [Dictionary]()
var dic = [String:String]()
result.mysqlResult?.forEachRow(callback: { (row) in
dic["accountLevelId"] = row[0]
dic["name"] = row[1]
resultArray.append(dic)
})
return resultArray
}
}
2.NetworkServerManager.swift中添加訪問接口
//MARK: 注冊路由
fileprivate func configure(routes: inout Routes) {
routes.add(method: .get, uri: "/home") { (request, response) in
let result = DataBaseManager().mysqlGetHomeDataResult()
let jsonString = self.baseResponseBodyJSONData(status: 200, message: "成功", data: result)
response.setBody(string: jsonString)
response.completed()
}
}
(5)驗證效果
1.運行結果
3.5.1
2.訪問接口效果
3.5.2
云服務推薦:
總結
以上是生活随笔為你收集整理的swift perfect mysql_服务端写Swift体验 (Perfect框架)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python服务器搭建nginx_Ngi
- 下一篇: foreach 二维java_教你如何用