日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

swift perfect mysql_服务端写Swift体验 (Perfect框架)

發布時間:2025/3/21 数据库 17 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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框架)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。