Go/Revel教程:在瀏覽器(使用 PaizaCloud IDE)上,構建 Go web 架構 Revel 的應用程式

來源:互聯網
上載者:User
這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。![gopher](https://raw.githubusercontent.com/studygolang/gctt-images/master/go-revel/20180323134353.png)Go 語言(golang)的特性有:- 標準庫有很多功能,如網路。- 易於編寫並發程式。- 易於管理可執行檔(因為只有一個檔案)由於這些特點,Go 語言在 web 開發中也越發受到歡迎。如所示,我們可以在 Google Trends 看到 Go 受關注的程度。![From google trends](https://raw.githubusercontent.com/studygolang/gctt-images/master/go-revel/20180323105259.png)來自 [google trends](https://trends.google.com/trends/explore?date=2010-02-23%202018-03-23&q=golang)雖說 Go 本身內建著豐富的標準庫,協助我們構建 web 應用,但是使用 web 應用程式框架,我們能夠更輕鬆地開發出功能齊全的 web 應用。Go 的 web 架構有很多:Revel、Echo、Gin、Iris 等,**其中 Revel 是最受歡迎的全棧 web 應用程式框架之一**。Go 架構 Revel 的 web 開發功能有:路由、MVC、產生器。按照 Revel 的規則來構建應用,你可以輕而易舉地建立可讀性強、易擴充的 Web 應用程式。在 Revel 中,你還可以使用 OR 映射庫(如 Gorm)。然而,要在實際中開發 Revel 應用,你需要安裝和配置 Go、Revel、Gorm 和 資料庫。這些安裝和設定都很麻煩。僅僅根據安裝說明進行,常常會出錯,或者因為 OS、版本和軟體依賴等原因引起各種錯誤。同樣,如果你發布這項服務,朋友和其他人的反饋的確會讓你動力十足。但是,這項服務還需要“部署”。“部署”同樣也很難搞。所以,[PaizaCloud](https://paiza.cloud/) 這個 Cloud IDE 應運而生。這是一個基於瀏覽器的線上 web 和應用開發環境。**由於 PaizaCloud 擁有 Go/Revel 應用的開發環境,因此你可以直接在你的瀏覽器中,開始編寫你的 Go/Revel 應用程式**。**由於你可以在雲上進行開發,因此你可以在同一台機器運行並部署 Go/Revel 應用,而無需再配置一台伺服器**。現在,我們來使用 Go 和 Revel,在 PaizaCloud IDE 上開發一個任務清單(Task List)的應用。遵循下面的指示,**只需十分鐘你就能夠建立並運行 Google Home 應用程式**。## 起步:[PaizaCloud Cloud IDE](https://paiza.cloud/en/)[這裡](https://paiza.cloud/)是 [PaizaCloud Cloud IDE](https://paiza.cloud/) 的網站。![paiza cloud](https://raw.githubusercontent.com/studygolang/gctt-images/master/go-revel/20171214154059.png)可以用郵箱註冊,並在確認郵件中點選連結。你還可以用 GitHub 或 Google 賬戶來註冊。## 建立伺服器在開發工作區上,我們建立一個新的伺服器。![new server](https://raw.githubusercontent.com/studygolang/gctt-images/master/go-revel/20171214154558.png)點擊 `New Server`,會開啟一個對話方塊來設定伺服器。這裡,你可以選擇 `PHP`、`phpMyAdmin` 和 `MySQL`,並點擊 `New Server` 按鈕。![server settings](https://raw.githubusercontent.com/studygolang/gctt-images/master/go-revel/20171214154330.png)只需 3 秒鐘,你就有了一個基於瀏覽器的 Go/Revel 開發環境。你將在頁面中看到編輯器或瀏覽器視窗,目前我們可以先關閉它們。## 設定環境現在我們來設定環境。由於 PaizaCloud 已經安裝了 Go 語言和 MySQL,你可以直接運行 `go get` 命令來安裝其他的包。在 [PaizaCloud Cloud IDE](https://paiza.cloud/),你可以在瀏覽器中,使用 PaizaCloud 的應用程式 `Terminal` 來運行命令。在頁面的左邊,點擊 `Terminal` 按鈕。![terminal](https://raw.githubusercontent.com/studygolang/gctt-images/master/go-revel/20171214154805.png)現在我們啟動了 `Terminal` 程式。我們現在要在終端輸入 `go get [package name]` 命令。`[package name]` 是安裝包的名字。在這裡,我們要為 Revel 和 Gorm 安裝相應的包。我們輸入:```bash$ go get github.com/revel/revel$ go get github.com/revel/cmd/revel$ go get github.com/jinzhu/gorm$ go get github.com/go-sql-driver/mysql```![bash](https://raw.githubusercontent.com/studygolang/gctt-images/master/go-revel/20180323105536.png)現在,我們已經把包安裝在了 `~/go/bin`。## 建立一個應用接下來,我們來建立你的 Go/Revel 應用。你可以用 `revel new` 命令來建立 Go/Revel 應用。在 [PaizaCloud Cloud IDE](https://paiza.cloud/),你可以在瀏覽器中,使用 PaizaCloud 的應用程式 `Terminal `來運行命令。在頁面的左邊,點擊 `Terminal` 按鈕。![terminal](https://raw.githubusercontent.com/studygolang/gctt-images/master/go-revel/20171214154805.png)現在我們啟動了 `Terminal` 程式。我們現在要在終端輸入 `revel new [application name]` 命令。`[application name]` 是你建立的程式名稱。可以用你喜歡的名稱,如 `music-app` 或者 `game-app`。在這裡,我把程式命名為 `myapp`,用來管理工作清單。輸入:```bash$ revel new myapp```![revel new myapp](https://raw.githubusercontent.com/studygolang/gctt-images/master/go-revel/20180323111349.png)在頁面左邊的檔案管理工具視圖中,你可以看到 `go/src/myapp` 目錄。點擊檔案夾並開啟,看看裡面的內容。![file manager view](https://raw.githubusercontent.com/studygolang/gctt-images/master/go-revel/20180323110203.png)你會看到裡面有很多 Go/Revel 檔案。## 開啟 Revel 伺服器現在,你可以運行程式了。我們來啟動這個程式。輸入 `cd ~/go` 命令切換目錄後,輸入 `revel run myapp` 命令,開啟伺服器!```bash$ cd ~/go$ revel run myapp```![revel run myapp](https://raw.githubusercontent.com/studygolang/gctt-images/master/go-revel/20180323111505.png)在頁面左邊,會出現一個新的按鈕,顯示文字 `9000`。![button 9000](https://raw.githubusercontent.com/studygolang/gctt-images/master/go-revel/20180323111533.png)Revel 伺服器會在 9000 連接埠上運行。[PaizaCloud Cloud IDE](https://paiza.cloud/) 監測到了這個連接埠號碼(9000),自動添加了一個按鈕,用於在這個連接埠上開啟瀏覽器。點擊該按鈕,會出現瀏覽器程式(PaizaClound 中的瀏覽器應用程式)。現在,你可以看到 Revel 的網頁了,這就是你的應用!![your web page](https://raw.githubusercontent.com/studygolang/gctt-images/master/go-revel/20180323111629.png)(儘管 Revel 是作為 HTTP 伺服器啟動並執行,但是 PaizaCloud 會把 HTTP 轉換為 HTTPS。)## 編輯檔案你在這個應用的頁面上看到的其實是一個 HTML 檔案,即 `~/go/src/myapp/app/views/App/Index.html`。我們來試著編輯這個檔案,修改它的標題。在檔案管理工具視圖上,雙擊 `~/go/src/myapp/app/views/App/Index.html` 檔案進行編輯。![index.html](https://raw.githubusercontent.com/studygolang/gctt-images/master/go-revel/20180323111814.png)編輯標題部分,把 `It works` 替換為下面內容:`go/src/myapp/app/views/App/Index.html`:```html<h1>Hello Go and Revel!</h1>```![edit index.html](https://raw.githubusercontent.com/studygolang/gctt-images/master/go-revel/20180326143312.png)編輯完以後,點擊 `Save` 按鈕或者鍵入 `Command-S`(或 `Ctrl-S`),儲存該檔案。如果伺服器沒有運行,輸入命令開啟伺服器:```bash$ revel run myapp```接下來,在頁面的左邊,單擊有 `9000` 文字的瀏覽器表徵圖。如果你已經運行了瀏覽器,點擊重新整理按鈕。![browser](https://raw.githubusercontent.com/studygolang/gctt-images/master/go-revel/20180326143503.png)於是你可以看到剛才修改的頁面內容了!## 建立資料庫你已經有一個啟動並執行 MySQL 伺服器,因為在伺服器設定的時候你就勾選了 MySQL。但是如果沒有勾選的話,你還可以這樣手動地開啟:```bash$ sudo systemctl enable mysql$ sudo systemctl start mysql```在 [PaizaCloud Cloud IDE](https://paiza.cloud/) 上,你可以用 root 許可權安裝包。接下來,建立這個應用的資料庫。在這裡,我們使用 `mysql` 命令,建立一個資料庫 `mydb`。輸入下面命令,可以建立資料庫 `mydb`。```bash$ mysql -u rootcreate database mydb;```![create database mydb](https://raw.githubusercontent.com/studygolang/gctt-images/master/go-revel/20180216010049.png)於是你建立了一個資料庫。接下來,設定 `myapp` 使用該資料庫。在項目目錄中,資料庫配置在 `conf/app.conf` 檔案中。開發模式的配置寫在 `[dev]` 部分中。資料庫配置的寫法是 `db.info = [DB user]:[DB password]@/[DB name]?[DB options]`。在這裡,我們把 `DB user` 設為 `root`,密碼為空白,`DB name` 設為 `mydb`,以及添加一些選項。我們在 `[dev]` 部分中,編寫 `db.info` 的配置如下所示:`go/src/myapp/conf/app.conf`:```conf[dev]db.info = root:@/mydb?charset=utf8&parseTime=True```接下來我們建立一個檔案 `app/controllers/gorm.go`,編寫代碼來使用資料庫。在檔案管理工具視圖下,右擊 `go/src/myapp/app/controllers` 目錄,開啟捷徑功能表,選擇 `New File` 菜單。![New File menu](https://raw.githubusercontent.com/studygolang/gctt-images/master/go-revel/20180326143634.png)輸入檔案名稱 `gorm.go`,點擊 `Create` 按鈕,建立該檔案。![Create a file gorm.go](https://raw.githubusercontent.com/studygolang/gctt-images/master/go-revel/20180326143715.png)開啟編輯器,編寫代碼,如下所示:`go/src/myapp/app/controllers/gorm.go`:```gopackage controllersimport (_ "github.com/go-sql-driver/mysql""github.com/jinzhu/gorm""github.com/revel/revel""myapp/app/models""log")var DB *gorm.DBfunc InitDB() {dbInfo, _ := revel.Config.String("db.info")db, err := gorm.Open("mysql", dbInfo)if err != nil {log.Panicf("Failed gorm.Open: %v\n", err)}db.DB()db.AutoMigrate(&models.Post{})DB = db}```編輯完以後,點擊 `Save` 按鈕或者鍵入 `Command-S`(或 `Ctrl-S`),儲存該檔案。我們來看看代碼。在 `InitDB()` 函數中,會讀取設定檔裡 `db.info` 這一行的 DB 設定,然後使用 Gorm 庫開啟資料庫。接下來,`db.AutoMigrate()` 建立了 `Post` 模型(model)(我們會在接下來建立它)的一個表。它會把資料庫控制代碼(database handle)賦值給 `DB` 變數,讓其他檔案都可以通過 `controllers.DB` 訪問資料庫。然後,編輯 `app/init.go`,調用 `InitDB()` 函數。`go/src/myapp/app/init.go`:```gopackage appimport ( "github.com/revel/revel" "myapp/app/controllers")...func init() { ... revel.OnAppStart(controllers.InitDB)}...```我們添加了兩行代碼。第一處變化是給 `import` 添加了 `myapp/app/controllers`,第二處變化是在 `init()` 函數的最後一行添加了 `revel.OnAppStart(controllers.InitDB)`,調用了我們前面建立的 `germ.go` 中的 `InitDB()`。## 建立表、模型等接下來,我們建立一個資料庫表。通過 Gorm 庫,我們可使用 Go 結構體編寫的模型資訊,來操作資料庫。在這裡,我們使用 `Post` 模型,對 `post` 表進行操作,該表格儲存體了待辦清單(Todo list)的資訊。我們在 `app/models/post.go` 檔案建立 `Post` 模型。右擊 `go/src/myapp/app` 目錄,開啟捷徑功能表,選擇 `New directory` 菜單,建立 `models` 目錄。然後右擊 `go/src/myapp/app/models` 目錄,開啟捷徑功能表,選擇 `New File` 菜單,建立 `post.go` 檔案。然後編輯建立的 `app/models/post.go` 檔案,如下所示。`go/src/myapp/app/models/post.go`:```gopackage modelstype Post struct {Id uint64 `gorm:"primary_key" json:"id"`Body string `sql:"size:255" json:"body"`}```我們來看看代碼吧。`Post` 結構體有一個整型的欄位 `Id`,以及一個字串類型的欄位 `Body`。它們表示 `posts` 資料庫表的 `id` 列和 `body` 列。退出並重啟伺服器。```bash$ cd ~/go$ revel run myapp```在啟動應用的時候,我們執行資料庫遷移,建立了 `posts` 表。我們可以使用 `phpMyAdmin` 看到表的資料。在 PaizaCloud 中的瀏覽器上,在 URL 地區上輸入 `http://localhost/phpmyadmin/`。![phpmyadmin](https://raw.githubusercontent.com/studygolang/gctt-images/master/go-revel/20180323132256.png)我們可以看到 `posts` 表。你可以在這裡添加、編輯和刪除資料記錄。## 路由設定這個待辦清單應用共有三種動作:列出待辦事項、添加一條待辦事項或者刪除一條待辦事項。我們分別設定了 3 個路由,如下所示。Method | Path | Action---|---|---GET | /posts | List tasksPOST | /posts | Add a taskDELETE | /posts/{id} | Delete a task我們在 `routes/web.php` 檔案上設定這些路由。首先,移除該檔案裡面所有的預設路由。對於首頁 `/`,設定成重新導向到 `/tasks`(譯註:`/posts`,原文筆誤)。如下所示,編輯 `conf/routes`。`go/src/myapp/conf/routes`:```confGET / Post.RedirectToPostsGET /posts Post.IndexPOST /posts Post.CreatePOST /posts/:id/delete Post.Delete```我們來看看代碼吧。`GET /` 請求調用了 `Post` 控制器(controller)的 `RedirectToPosts` 方法。而 `GET /posts`、`POST /posts`、`POST /posts/:id/delete` 請求調用了 `Post` 控制器的 `Index`、`Create`、`Delete` 方法。控制器的方法可以把 `:id` 作為參數使用。## 控制器設定建立一個 `Post` 控制器,路由通過 `app/controllers/post.go` 來引用它。右擊 `app/controllers` 目錄,開啟捷徑功能表,選擇 `New file`,建立 `post.go` 檔案。定義 `Index()`、`Create()`、`Delete()` 方法,分別表示列出、添加和刪除待辦事項。`go/src/myapp/app/controllers/post.go`:```gopackage controllersimport ("github.com/revel/revel""myapp/app/models""errors")type Post struct {*revel.Controller}func (c Post) Index() revel.Result {posts := []models.Post{}result := DB.Order("id desc").Find(&posts);err := result.Errorif err != nil {return c.RenderError(errors.New("Record Not Found"))}return c.Render(posts)}func (c Post) Create() revel.Result {post := models.Post{Body: c.Params.Form.Get("body"),}ret := DB.Create(&post)if ret.Error != nil {return c.RenderError(errors.New("Record Create failure." + ret.Error.Error()))}return c.Redirect("/posts") }func (c Post) Delete() revel.Result {id := c.Params.Route.Get("id")posts := []models.Post{}ret := DB.Delete(&posts, id)if ret.Error != nil {return c.RenderError(errors.New("Record Delete failure." + ret.Error.Error()))}return c.Redirect("/posts") }func (c Post) RedirectToPosts() revel.Result {return c.Redirect("/posts") }```我們來研究一下代碼。首先我們把 `myapp/app/models` 添加到了 `import` 當中,因此我們可以訪問到 `Post` 模型。接著在 `type Post struct` 建立了 `Post` 控制器。**`func (c Post) Index() revel.Result`** 是 `Post` 控制器的 `Index()` 方法,它會返回待辦清單。`posts := []models.Post{}` 會建立 `posts`,即 `Post` 模型的數組。`DB.Order("id desc").Find(&posts)` 提取了所有的 `posts` 表記錄,將其儲存在 `posts` 數組中。接下來,如果沒有錯誤發生,就會調用 `Render()` 方法,建立 HTML 檔案。我們後面會建立 HTML 範本,HTML 就是通過它來建立的。通過把 `Render()` 參數設定為 `posts`,模板檔案就可以引用 `posts` 表了。**`func (c Post) Create() revel.Result`** 是 `Post` 控制器的 `Create()` 方法,它會建立一個待辦事項。`models.Post{...}` 會建立一個模型,使用 `c.Params.Form.Get()`,可以擷取提交表單的 `body` 參數,並將其賦值給模型的 `Body` 欄位。`DB.Create(&post)` 通過模型建立了一個資料庫記錄。然後,使用 `c.Redirect("/posts")` 重新導向到待辦清單頁面。**`func (c Post) Delete() revel.Result`** 是 `Post` 控制器的 `Delete()` 方法,它會刪除一個待辦事項。`c.Params.Route.Get("id")` 可以擷取到 URL `/posts/:id/delete` 的 `:id` 部分。`DB.Delete(&posts, id)` 會刪除所指定 `id` 的記錄,然後 `c.Redirect("/posts")` 會重新導向到待辦清單的頁面。**`func (c Post) RedirectToPosts() revel.Result`** 用於從首頁重新導向到待辦清單的頁面上。## 建立 HTML 範本接下來,我們給 HTML 建立模板。HTML 範本是內嵌程式碼的 HTML 檔案。建立一個 HTML 範本檔案 `app/views/Post/index.html`,它用於列出、添加和刪除待辦事項。右擊 `go/myapp/app/views` 目錄,開啟捷徑功能表,選擇 `New Directory` 菜單,建立 `Posts` 目錄。右擊 `go/myapp/app/views/Post` 目錄,開啟捷徑功能表,選擇 `New File` 目錄,建立 `index.html` 檔案。如下所示,編輯建立好的 `app/views/Post/index.html` 檔案。`go/myapp/app/views/Post/index.html`:```html{{set . "title" "Todo list"}}{{template "header.html" .}}<header class="jumbotron" style="background-color:#A9F16C"> <div class="container"><div class="row"> <h1>Todo list</h1> <p></p></div> </div></header><div class="container"> <div class="row"><div class="span6"> {{template "flash.html" .}}</div> </div></div><div class="container"><form action="/posts" method="post"><div class="form-group"><div class="row"><label for="todo" class="col-xs-2">Todo</label><input type="text" name="body" class="col-xs-8"><div class="col-xs-2"><button type="submit" class="btn btn-success"><i class="fa fa-plus"></i> Add Todo</button></div> </div></div></form><h2>Current Todos</h2><table class="table table-striped todo-table"><thead><th>Todos</th><th>&nbsp;</th></thead><tbody>{{ range .posts }}<tr><td><div>{{ .Body }}</div></td><td><form action="/posts/{{.Id}}/delete" method="post"><button class="btn btn-danger">Delete</button></form></td></tr>{{ end }}</tbody></table></div>{{template "footer.html" .}}```我們來看看這個模板檔案。在 HTML 範本裡,`{{` 和 `}}` 所包含的部分,用於描述建立 HTML 的操作。`{{set . "title" "Todo list"}}` 會將 `title` 變數設為 `Todo list`。`{{template "header.html" .}}` 通過模板檔案 `header.html`,建立 HTML 檔案。通過像這樣調用其它的 HTML 範本,我們可以在一個模板檔案中,共用多個模板檔案的公用部分。在這裡 `header.html` 有公用的 HTML 頭部。`<form action="/posts" method="post">` 用於建立一個待辦事項的表單。`<input type="text" name="body" class="col-xs-8">` 顯示一個文本輸入表單,用於輸入待辦事項。表單名設定成了 `body`,於是在所提交請求的參數 `body` 中,含有輸入的待辦事項。`posts` 數組會讀取 `{{ range .posts }}` 和 `{{ end }}` 之間的部分,並通過 HTML 範本,為每個 `post` 重複地建立 HTML。`{{ .Body }}` 顯示了每個 `post` 的 `Body` 欄位。 `{{.ID}}` 顯示每個 `post` 的 `Id` 欄位。最後,`{{template "footer.html" .}}` 通過 `footer.html` 模板顯示了 HTTP 頁尾。## 運行應用程式現在,我們已經編寫完所有的代碼。我們來看看吧。在 PaizaCloud 中,單擊瀏覽器表徵圖(9000),開啟瀏覽器。我們可以看到 `Task List` 網頁,當前還沒有任務。我們來添加和刪除任務。![Todo list](https://raw.githubusercontent.com/studygolang/gctt-images/master/go-revel/20180326144011.png)它奏效了!我們通過 Go/Revel,成功地建立了任務清單的應用程式!需要指出的是,在 `PaizaCloud` 的免費方案(free plan)中,伺服器將會被暫停。若要不間斷地運行程式,請升級到基本方案(BASIC plan)。## 總結通過 PaizaCloud Cloud IDE,我們在瀏覽器上建立了一個 Go/Revel 應用,無需安裝和設定任何開發環境。我們甚至可以直接在 PaizaCloud 上發布應用。現在,開始構建你自己的 Go/Revel 應用吧!通過 [PaizaCloud Cloud IDE](https://paiza.cloud/),只需在瀏覽器上,你就能靈活、輕鬆地開發和發布 web 應用或伺服器應用。

via: http://engineering.paiza.io/entry/paizacloud_golang_revel

作者:Tsuneo 譯者:Noluye 校對:polaris1119

本文由 GCTT 原創編譯,Go語言中文網 榮譽推出

本文由 GCTT 原創翻譯,Go語言中文網 首發。也想加入譯者行列,為開源做一些自己的貢獻嗎?歡迎加入 GCTT!
翻譯工作和譯文發表僅用於學習和交流目的,翻譯工作遵照 CC-BY-NC-SA 協議規定,如果我們的工作有侵犯到您的權益,請及時聯絡我們。
歡迎遵照 CC-BY-NC-SA 協議規定 轉載,敬請在本文中標註並保留原文/譯文連結和作者/譯者等資訊。
文章僅代表作者的知識和看法,如有不同觀點,請樓下排隊吐槽

475 次點擊  ∙  1 贊  
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.