Web模板和Node's APIs
這里主要介紹web模板伴网。
這里先進(jìn)行介紹Leaf
- 這里我們使用web模板直接就有l(wèi)eaf
- 文件樹(shù)如下
Hello
├── Config
│ ├── app.json
│ ├── crypto.json
│ ├── droplet.json
│ ├── fluent.json
│ └── server.json
├── Package.pins
├── Package.swift
├── Public
├── README.md
├── Resources
│ ├── Views
│ │ │ └── hello.leaf
├── Public
│ ├── images (images resources)
│ ├── styles (css resources)
├── Sources
│ ├── App
│ │ ├── Config+Setup.swift
│ │ ├── Controllers
│ │ │ └── PostController.swift
│ │ ├── Droplet+Setup.swift
│ │ ├── Models
│ │ │ └── Post.swift
│ │ └── Routes.swift
│ └── Run
│ └── main.swift
├── Tests
│ ├── AppTests
│ │ ├── PostControllerTests.swift
│ │ ├── RouteTests.swift
│ │ └── Utilities.swift
│ └── LinuxMain.swift
├── circle.yml
└── license
如果是api模板需要進(jìn)行如下配置
- Package.swift添加 Leaf-provider
import PackageDescription
let package = Package(
name: "Helloapi",
products: [
.library(name: "App", targets: ["App"]),
.executable(name: "Run", targets: ["Run"])
],
dependencies: [
.package(url: "https://github.com/vapor/vapor.git", .upToNextMajor(from: "2.1.0")),
.package(url: "https://github.com/vapor/fluent-provider.git", .upToNextMajor(from: "1.2.0")),
.package(url: "https://github.com/vapor/leaf-provider.git", .upToNextMajor(from: "1.1.0")),
],
targets: [
.target(
name: "App",
dependencies: ["Vapor", "FluentProvider", "LeafProvider"],
exclude: ["Config", "Database", "Public", "Resources"]
),
.target(name: "Run", dependencies: ["App"]),
.testTarget(name: "AppTests", dependencies: ["App", "Testing"])
]
)
- Config文件夾下droplet添加
"http://": "The type of view renderer that drop.view will use",
"http://": "leaf: Pure Swift templating language created for Vapor.",
"http://": "static: Simply return the view at the supplied path",
"view": "leaf",
這里需要運(yùn)行添加 LeafProvider
Helloapi/Sources/App/Setup文件夾下Config+Setup.swift文件添加LeafProvider
import FluentProvider
import LeafProvider
extension Config {
public func setup() throws {
// allow fuzzy conversions for these types
// (add your own types here)
Node.fuzzy = [Row.self, JSON.self, Node.self]
try setupProviders()
try setupPreparations()
}
/// Configure providers
private func setupProviders() throws {
try addProvider(FluentProvider.Provider.self)
try addProvider(LeafProvider.Provider.self)
}
/// Add all models that should have their
/// schemas prepared before the app boots
private func setupPreparations() throws {
preparations.append(Post.self)
}
}
- 這里放幾組測(cè)試
- 代碼 這里web模板里的。
///
GET /hello/...
builder.resource("hello", HelloController(view))
/// GET /test/str 測(cè)試字符串
builder.get("test/str") { req in
let str = "This is test Str"
return try self.view.make("hello", ["name": str], for: req)
}
/// GET /test/array 測(cè)試數(shù)組
builder.get("test/array") { req in
let array = ["one", "two", "three"]
return try self.view.make("hello", ["array": array])
}
/// GET /test/dictionary 測(cè)試字典
builder.get("test/dictionary") { req in
let arrayModel = [["name":"tom"], ["name":"Tim"], ["name":"LiLei"]]
return try self.view.make("hello", ["arrayModel": arrayModel])
}
/// GET /test/bool 測(cè)試bool類型
builder.get("test/bool") { req in
let bool = true
return try self.view.make("hello", ["bool": bool], for: req)
}
- hello.leaf文件
#extend("base")
#export("title") { Hello, #(name)! }
#export("content") {
<h1>Hello, #(name)!</h1>
<div>
現(xiàn)在測(cè)試循環(huán)
#loop(array, "number") {
#(offset). #(number)
}
</div>
<div>
現(xiàn)在測(cè)試字典循環(huán)
#loop(arrayModel, "model") {
#(offset). #(model.name)
}
</div>
}
這里我們現(xiàn)在進(jìn)行介紹Node
我們?cè)谏厦嬉呀?jīng)可以使用Leaf了存哲、但是有時(shí)間基礎(chǔ)的字符串、數(shù)組预柒、字典已經(jīng)不能滿足我們了耸序。我們需要自定義數(shù)據(jù)類型√赐罚可是我們直接寫(xiě)是識(shí)別不了的轰异、所以這里就需要Node來(lái)讓我們leaf文件可以讀取我們自定義的model。
這里也很簡(jiǎn)單鳖擒,我們實(shí)現(xiàn)
NodeInitializable
和NodeRepresentable
協(xié)議就可以了溉浙。
struct Person: NodeInitializable {
let name: String
let age: Int
init(node: Node) throws {
name = try node.get("name")
age = try node.get("age")
}
}
extension Person: NodeRepresentable {
func makeNode(in context: Context) throws -> Node {
var node = Node(context)
try node.set("name", name)
try node.set("age", age)
return node
}
}
- 當(dāng)然這里也可以轉(zhuǎn)換json數(shù)據(jù)讓html顯示。