使用Go語言和Vue.js的簡單Todo專案教程
這是一個使用Go語言結合Vue.js的簡單Todos專案,可以用來學習Go與Vue.js。
使用條件:
1.使用了Echo框架. Echo是類似Slim PHP 或 Lumen.的Go微框架,透過路由處理HTTP請求。
2.使用SQLite 資料庫。
開發步驟:
1. 下載echo和SQLite:
$ go get github.com/labstack/echo
$ go get github.com/mattn/go-sqlite3
2.建立專案目錄:
$ cd $GOPATH/src
$ mkdir go-echo-vue && cd go-echo-vue
3.建立todo.go檔案:
建立main函式:
為了讓VueJS能夠和後端通訊,建立基本路由,首先建立Echo新例項,使用內建函式定義簡單路由規則。
在main函式中寫入這些規則:
啟動:
$ go build todo.go
$ ./todo
為了測試路由,使用Chrome外掛Postman.開啟Postman,指向localhost:8000,使用各種HTTP動詞測試/tasks
下面是初始化資料庫,指定檔名為storage.db:
在main函式加入:
定義建立資料庫和遷移資料表,initDB是開啟db檔案,如果不存在建立它。migrate是執行SQL建立Todo資料表。
再次啟動:
$ go build todo.go
$ ./todo
應該看到資料庫檔案存在目錄,使用SQLite管理命令列進入可檢視到資料庫。
最後我們建立處理器Handler和Model,將路由接受和資料庫連線起來。
Handler部分:
匯入庫:
用將建立的新handler設定路由:
Handler程式碼:
Model部分程式碼,包括業務模型和資料庫CRUD:
將Model插入Handler程式碼:
以上都是Go後端程式碼。待續:
使用條件:
1.使用了Echo框架. Echo是類似Slim PHP 或 Lumen.的Go微框架,透過路由處理HTTP請求。
2.使用SQLite 資料庫。
開發步驟:
1. 下載echo和SQLite:
$ go get github.com/labstack/echo
$ go get github.com/mattn/go-sqlite3
2.建立專案目錄:
$ cd $GOPATH/src
$ mkdir go-echo-vue && cd go-echo-vue
3.建立todo.go檔案:
// todo.go package main import ( "github.com/labstack/echo" "github.com/labstack/echo/engine/standard" ) <p class="indent"> |
建立main函式:
// todo.go func main() { } <p class="indent"> |
為了讓VueJS能夠和後端通訊,建立基本路由,首先建立Echo新例項,使用內建函式定義簡單路由規則。
在main函式中寫入這些規則:
// todo.go func main() { // Create a new instance of Echo e := echo.New() e.GET("/tasks", func(c echo.Context) error { return c.JSON(200, "GET Tasks") }) e.PUT("/tasks", func(c echo.Context) error { return c.JSON(200, "PUT Tasks") }) e.DELETE("/tasks/:id", func(c echo.Context) error { return c.JSON(200, "DELETE Task "+c.Param("id")) }) // Start as a web server e.Run(standard.New(":8000")) } <p class="indent"> |
啟動:
$ go build todo.go
$ ./todo
為了測試路由,使用Chrome外掛Postman.開啟Postman,指向localhost:8000,使用各種HTTP動詞測試/tasks
下面是初始化資料庫,指定檔名為storage.db:
// todo.go package main import ( "database/sql" "github.com/labstack/echo" "github.com/labstack/echo/engine/standard" _ "github.com/mattn/go-sqlite3" ) <p class="indent"> |
在main函式加入:
// todo.go func main() { db := initDB("storage.db") migrate(db) <p class="indent"> |
定義建立資料庫和遷移資料表,initDB是開啟db檔案,如果不存在建立它。migrate是執行SQL建立Todo資料表。
// todo.go func initDB(filepath string) *sql.DB { db, err := sql.Open("sqlite3", filepath) // Here we check for any db errors then exit if err != nil { panic(err) } // If we don't get any errors but somehow still don't get a db connection // we exit as well if db == nil { panic("db nil") } return db } func migrate(db *sql.DB) { sql := ` CREATE TABLE IF NOT EXISTS tasks( id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, name VARCHAR NOT NULL ); ` _, err := db.Exec(sql) // Exit if something goes wrong with our SQL statement above if err != nil { panic(err) } } <p class="indent"> |
再次啟動:
$ go build todo.go
$ ./todo
應該看到資料庫檔案存在目錄,使用SQLite管理命令列進入可檢視到資料庫。
最後我們建立處理器Handler和Model,將路由接受和資料庫連線起來。
Handler部分:
匯入庫:
package main import ( "database/sql" "go-echo-vue/handlers" "github.com/labstack/echo" "github.com/labstack/echo/engine/standard" _ "github.com/mattn/go-sqlite3" ) <p class="indent"> |
用將建立的新handler設定路由:
// todo.go e := echo.New() e.File("/", "public/index.html") e.GET("/tasks", handlers.GetTasks(db)) e.PUT("/tasks", handlers.PutTask(db)) e.DELETE("/tasks/:id", handlers.DeleteTask(db)) e.Run(standard.New(":8000")) } <p class="indent"> |
Handler程式碼:
// handlers/tasks.go package handlers import ( "database/sql" "net/http" "strconv" "github.com/labstack/echo" ) // handlers/tasks.go // GetTasks endpoint func GetTasks(db *sql.DB) echo.HandlerFunc { return func(c echo.Context) error { return c.JSON(http.StatusOK, "tasks") } } // PutTask endpoint func PutTask(db *sql.DB) echo.HandlerFunc { return func(c echo.Context) error { return c.JSON(http.StatusCreated, H{ "created": 123, } } // DeleteTask endpoint func DeleteTask(db *sql.DB) echo.HandlerFunc { return func(c echo.Context) error { id, _ := strconv.Atoi(c.Param("id")) return c.JSON(http.StatusOK, H{ "deleted": id, }) } } <p class="indent"> |
Model部分程式碼,包括業務模型和資料庫CRUD:
// models/tasks.go package models import ( "database/sql" _ "github.com/mattn/go-sqlite3" ) // models/tasks.go // Task is a struct containing Task data type Task struct { ID int `json:"id"` Name string `json:"name"` } // TaskCollection is collection of Tasks type TaskCollection struct { Tasks []Task `json:"items"` } func GetTasks(db *sql.DB) TaskCollection { sql := "SELECT * FROM tasks" rows, err := db.Query(sql) // Exit if the SQL doesn't work for some reason if err != nil { panic(err) } // make sure to cleanup when the program exits defer rows.Close() result := TaskCollection{} for rows.Next() { task := Task{} err2 := rows.Scan(&task.ID, &task.Name) // Exit if we get an error if err2 != nil { panic(err2) } result.Tasks = append(result.Tasks, task) } return result } func PutTask(db *sql.DB, name string) (int64, error) { sql := "INSERT INTO tasks(name) VALUES(?)" // Create a prepared SQL statement stmt, err := db.Prepare(sql) // Exit if we get an error if err != nil { panic(err) } // Make sure to cleanup after the program exits defer stmt.Close() // Replace the '?' in our prepared statement with 'name' result, err2 := stmt.Exec(name) // Exit if we get an error if err2 != nil { panic(err2) } return result.LastInsertId() } func DeleteTask(db *sql.DB, id int) (int64, error) { sql := "DELETE FROM tasks WHERE id = ?" // Create a prepared SQL statement stmt, err := db.Prepare(sql) // Exit if we get an error if err != nil { panic(err) } // Replace the '?' in our prepared statement with 'id' result, err2 := stmt.Exec(id) // Exit if we get an error if err2 != nil { panic(err2) } return result.RowsAffected() } <p class="indent"> |
將Model插入Handler程式碼:
// handlers/tasks.go package handlers import ( "database/sql" "net/http" "strconv" "go-echo-vue/models" "github.com/labstack/echo" ) // handlers/tasks.go // GetTasks endpoint func GetTasks(db *sql.DB) echo.HandlerFunc { return func(c echo.Context) error { // Fetch tasks using our new model return c.JSON(http.StatusOK, models.GetTasks(db)) } } // PutTask endpoint func PutTask(db *sql.DB) echo.HandlerFunc { return func(c echo.Context) error { // Instantiate a new task var task models.Task // Map imcoming JSON body to the new Task c.Bind(&task) // Add a task using our new model id, err := models.PutTask(db, task.Name) // Return a JSON response if successful if err == nil { return c.JSON(http.StatusCreated, H{ "created": id, }) // Handle any errors } else { return err } } } // DeleteTask endpoint func DeleteTask(db *sql.DB) echo.HandlerFunc { return func(c echo.Context) error { id, _ := strconv.Atoi(c.Param("id")) // Use our new model to delete a task _, err := models.DeleteTask(db, id) // Return a JSON response on success if err == nil { return c.JSON(http.StatusOK, H{ "deleted": id, }) // Handle errors } else { return err } } } <p class="indent"> |
以上都是Go後端程式碼。待續:
相關文章
- 使用 Vue.js 和 Iris 共建一個簡單的 Todo MVC 應用Vue.jsMVC
- [實戰] 使用 Vue.js 和 Iris 共建一個簡單的 Todo MVC 應用Vue.jsMVC
- 簡單的 Go 入門教程Go
- 使用Go語言實現簡單MapReduce框架Go框架
- go語言教程哪裡有?go 語言優秀開源專案彙總Go
- 使用Go語言建立簡單的CRUD增刪改查Go
- .NET CLI簡單教程和專案結構
- WebService 簡單入門教程(Java Web專案)WebJava
- Android SDK簡明教程:專案清單Android
- GraphQL-Go-onepieceAPI:用Go語言和GraphQL開發的海賊王APIGoAPI
- GO語言一個簡單的工程Go
- Mackdown簡單的使用教程Mac
- 使用Go語言和colly庫來下載指定網站圖片的程式Go網站
- go語言實戰教程:專案檔案配置和專案初始化執行Go
- go語言實戰教程:Redis實戰專案應用GoRedis
- Go和Rust都是系統語言和通用語言 - RedditGoRust
- vue.js 使用NPM建立專案Vue.jsNPM
- 簡單介紹Go 語言單例模式Go單例模式
- 從錯誤處理看 Rust 的語言和 Go 語言的設計RustGo
- butterfly簡單使用教程
- go語言實戰教程:實戰專案資源匯入和專案框架搭建Go框架
- Snow——簡單易用的 Go 語言業務框架Go框架
- Vue3專案的簡單搭建與專案結構的簡單介紹Vue
- 程式語言和編譯器書單(1)編譯
- MacDroid使用簡單教程~Mac
- 學習 Vue.js: Todo 小樣元件版Vue.js元件
- 簡單介紹Go語言常用的打log方式Go
- Go 原生 RPC 與 APRC 的簡單使用GoRPC
- 簡單的 Vue.js 入門方法Vue.js
- scrapy實戰專案(簡單的爬取知乎專案)
- 在MySQL中使用序列的簡單教程MySql
- Go 語言專案程式碼品質Go
- 使用 Go 模組建立專案(vgo)Go
- 簡單分析Go語言中陣列的這些細節Go陣列
- C語言練手專案--C 語言製作簡單計算器C語言
- vue專案中使用token的身份驗證的簡單實踐Vue
- YII 初體驗 —— 搭建一個簡單的 Todo List 系統
- 簡單使用oracle的審計語句Oracle