iT邦幫忙

2018 iT 邦幫忙鐵人賽
DAY 12
0
Modern Web

Go!從無到打造最佳行動網站系列 第 12

Day12 古法私釀、糞扣 Go (BeeGo Framework 練習一)

  • 分享至 

  • xImage
  •  

終於要來寫一些Code了好興奮阿!
其實這個Code改了許多次,可能歸類為幾個原因

  1. 對Go語言不熟悉
  2. 對Beego Framework不熟悉
    這不是再說廢話嗎?其實真正的要了解一個語言的特性,需要一段時間的培養,畢竟你懂程式該怎麼寫,但是你只不過欠缺表達,不過如此常常寫常常做你就會越來越熟悉了!話不多說,趕緊利用一些時間把他寫完。

在實作時我們調整了目錄結構

前情提要

露天廢物創立了一所學校,目前學校只有一班,因為名聲很好,所以一班裡面目前有17個學生,未來希望招生更多的學生...

因為學生越來越多,不能在用紙本資料來做管理了,黑絲工程師想了個辦法,就寫一個API,方便給其他工程師使用,使用了beego Framework,他研究很久的一段時間,寫了些程式碼,他的目錄結構是下面這個樣子

目錄結構

ironSchool
├── conf
│   └── app.conf
├── controllers
│   └── student.go
├── main.go
├── models
│   └── student.go
├── routers
│   └── router.go
└── tests
    └── default_test.go

花了很久的時間查了查看了看,他的router方法真的很多種,我選了一種最簡單的方法來寫

routers/router.go

package routers

import (
  "Board/controllers"

  "github.com/astaxie/beego"
)

func init() {
beego.Router("/", &controllers.StudentController{},"*:GetAll")
beego.Router("/:studentId", &controllers.StudentController{},"*:Get")
}

在執行router.go的時候,會去抓init()這個func來處理,這次我們將設定

  • 如果一進去沒有帶參數會顯示所有的student
  • 如果在URL後面(/)輸入學生編號可以取得學生的資料

controllers/student.go

package controllers

import (
  "ironSchool/models"

  "github.com/astaxie/beego"
)

type StudentController struct {
  beego.Controller
}

func (s *StudentController) Get() {
  StudentId := s.Ctx.Input.Param(":studentId")
  if StudentId != "" {
    st, err := models.GetStudent(StudentId)
    if err != nil {
      s.Data["json"] = err.Error()
    } else {
      s.Data["json"] = st
    }
  }
  s.ServeJSON()
}

func (s *StudentController) GetAll() {
  sts := models.GetAllStudents()
  s.Data["json"] = sts
  s.ServeJSON()
}

在Controller定義兩個方法一個是Get()用來取得單個學生資料,GetAll()來取得所有學生的資料
我們會在程式碼看到s.Data["json"]主要是將資料轉成json格式

models/student.go

package models

import (
  "errors"
)

var (
  StudentList map[string]*Student
  SerialNo    int64
)

type Student struct {
  StudentId   string
  StudentName string
  ClassName   string
}

func init() {
  StudentList = make(map[string]*Student)
  StudentList["s201700001"] = &Student{"s201700001", "Sharon", "apple"}
  StudentList["s201700002"] = &Student{"s201700002", "Summer", "apple"}

  // ...
  // 因篇幅太大故省略

  SerialNo = 201700018
}

func GetStudent(studentId string) (student *Student, err error) {
  if v, ok := StudentList[studentId]; ok {
    return v, nil
  }
  return nil, errors.New("studentId Not Exist")
}

func GetAllStudents() map[string]*Student {
  return StudentList
}

我們再來看一下在model的部分,這邊要注意的部分在開發中比較常遇到,盡量不要將方法的名稱取相同的名字,因為很容易出錯摟,

每天會將code push到Github上,歡迎有興趣的人可以去看看喔!

最後我們在cmder下

$ bee run ironSchool

在瀏覽器打上 localhost:8080
pic


上一篇
Day11 純、手工系列 Go (BeeGo Routing 使用篇)
下一篇
Day13 古法私釀、糞扣 Go (BeeGo Framework 練習二)
系列文
Go!從無到打造最佳行動網站30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言