想寫個小網站,據說MVC過期了,流行MVVM,可是看了一下gin+vue+axios方式,發現還有一堆知識點要掌握,尤爲是不喜歡nodejs和javascript方式的寫法。算了,仍是用beego來寫吧。javascript
一、首先參考https://beego.mehtml
二、 獲取Beego 和 Bee 的開發工具vue
$ go get -u github.com/astaxie/beego $ go get -u github.com/beego/bee
我是用gopm get代替go get ,一開始有-u參數,但很長時間沒反應。去掉-u當即下載成功。java
因爲個人$gopath設置的是:E:\goapp\,因此將從github下載的bee包複製到這個目錄:E:\goapp\src\github.com\beego\beenode
但這個目錄下沒有bee.exe工具。因而在這個目錄下執行 go install,提示如下錯誤:mysql
E:\goapp\src\github.com\beego\bee>go install main.go:21:2: cannot find package "github.com/beego/bee/cmd" in any of: D:\Go\src\github.com\beego\bee\cmd (from $GOROOT) C:\Users\Administrator\go\src\github.com\beego\bee\cmd (from $GOPATH)
很明顯,搜索的路徑沒有包括我所設置的的$gopath,也就是E:\goapp\ 用go env 查看一下,gopath仍爲:C:\Users\Administrator\golinux
在windows系統環境變量一看,原來是用戶的gopath環境變量%USERPROFILE%\go覆蓋了我設的系統的gopath環境變量E:\goapp\,因而將用戶環境變量設爲E:\goapp\。 從新打開cmd,到bee目錄下執行go install 。而後能夠在E:\goapp\bin下找到bee.exe了ios
三、開始寫網站,打開cmd ,轉到E:\goapp\src\ 目錄下,執行git
bee new beego1
在E:\goapp\src\beego1下已生成了MVC網站,cmd中定位到E:\goapp\src\beego1目錄下,執行github
bee run
而後能夠用瀏覽器打開http://localhost:8080/ 進行訪問(若彈出防火牆提示,容許與否不要緊,由於本機localhost不經過防火牆?)
四、用liteide打開beego1目錄下的main.go,將全部內容用如下代碼替換
package main import ( _ "beego1/routers" "github.com/astaxie/beego" ) type MainController struct { beego.Controller } func (this *MainController) Get() { //this.TplName = "home/index.tpl" this.Ctx.WriteString("hello world") } func main() { beego.BConfig.WebConfig.StaticDir["/static"] = "static" beego.Router("/", &MainController{}) beego.Run() }
將routers.go的內容改成
package routers import ( "beego1/controllers" "github.com/astaxie/beego" ) func init() { //beego.Router("/", &controllers.MainController{}) beego.AutoRouter(&controllers.MainController{}) }
Ctrl-S保存,刷新http://localhost:8080/,頁面內容變成hello world ;而訪問http://localhost:8080/main/get時則顯示beego歡迎頁,AutoRouter起了做用。 (同時bee工具熱編譯,無需從新編譯執行。如需中止服務就用Ctrl-C),注意,在main包和controllers包各有一個MainController,互不影響。
五、上面的main包添加了靜態文件支持。即,在/main.go文件中beego.Run()以前加入了 : beego.BConfig.WebConfig.StaticDir["/static"] = "static" 則beego1\static目錄下的文檔能夠直接經過瀏覽器訪問。
六、不喜歡8080端口,直接打開E:\goapp\src\beego1\conf\app.conf修改便可;也能夠用beego.BConfig.Listen.HTTPPort = 8081(更多設置可參考:https://blog.csdn.net/qq_33610643/article/details/53511058)
七、顯示url參數。參數保存在 this.Ctx.Input.Params
當中,如:
/object/blog/2013/09/12 調用 ObjectController 中的 Blog 方法,參數以下:map[0:2013 1:09 2:12]
首先修改controllers目錄下的default.go以下
package controllers import ( "encoding/json" "github.com/astaxie/beego" ) type MainController struct { beego.Controller } func (c *MainController) Get() { c.Data["Website"] = "beego.me" c.Data["Email"] = "astaxie@gmail.com" c.TplName = "index.tpl" } func (c *MainController) Params() { j, _ := json.Marshal(c.Ctx.Input.Params()) v := string(j) c.Ctx.WriteString(v) }
訪問http://localhost:8080/main/params/a/b/c
顯示:{"0":"a","1":"b","2":"c",":splat":"a/b/c"}
八、上傳文件。
首先在beego1文件夾下新建upload文件夾
在controllers目錄下的default.go中增長如下代碼
func (c *MainController) UpFile() { v := `<form id="fform" method="POST" enctype="multipart/form-data" action="/main/upfile1"> <input id="myfile" name="myfile" type="file" /> <input type="submit" value="保存" /> </form>` c.Ctx.Output.Header("Content-Type", "text/html; charset=utf-8") c.Ctx.WriteString(v) } func (c *MainController) UpFile1() { _, h, _ := c.GetFile("myfile") //獲取上傳的文件 //defer f.Close() //關閉上傳的文件,否則的話會出現臨時文件不能清除的狀況 if h == nil { c.Ctx.WriteString("未選擇文件~!!!!!!!") c.StopRun() } b := path.Base(h.Filename) err := c.SaveToFile("myfile", "upload/"+b) if err != nil { c.Ctx.WriteString(fmt.Sprintf("%v", err)) } c.Ctx.WriteString("上傳成功~!!!!!!!") }
相應import "fmt" 和 "path",而後訪問:http://localhost:8080/main/upfile 上傳文件
九、數據庫支持。
參考:https://www.cnblogs.com/shanyou/p/3256906.html,決定使用postgresql數據庫
從官網https://www.postgresql.org下載,這裏有個可參考的安裝教程https://www.cnblogs.com/LLLONG/p/3164508.html 以及這裏https://blog.csdn.net/hanyoud/article/details/83294612
我在內網有個服務器是2008 sp2,在上面試試最新的11.1版本(因爲官網很慢,改用迅雷大法下載),按嚮導安裝,先是自動安裝了VC++2013 VC++2017可再發行包,選擇安裝到E:盤,設置用戶postgres的密碼爲1234 ,端口爲默認5432,其餘的一路next.
=============下面走了彎路,能夠跳過===========
安裝很順利。但多出了個相似全家桶的stack builder,試了試安裝不上,可能仍是天朝網絡影響,算了。
安裝完不會用,在目錄中找到pgadmin也用不了,度娘出來這個https://www.jb51.net/article/43061.htm,先看一下任務管理器中有了pg_ctl.exe,而後發現和別人的不同,因而手工到E:\Program Files\PostgreSQL\11\data目錄下找到了pg_hba.conf,參考:https://www.jb51.net/article/137062.htm,在pg_hba.conf配置文件最後加上如下內容(不太明白24或32的意思)
host all all 127.0.0.1/32 trust host all all 192.168.3.0/24 md5
而後看postgresql.conf中,默認就是listen_addresses = '*',不是listen_addresses=
'localhost',就不改了。
到控制面板-服務中重啓一下postgresql-x64-11,再找到E:\Program Files\PostgreSQL\11\bin\psql.exe執行後提示Administrtor密碼,試了1234不行。參照https://blog.csdn.net/vivasoft/article/details/8248715 執行
initdb -D "E:\Program Files\PostgreSQL\11\data" --locale=C --encodeing=WIN1252 --username=postgres --pwprompt=1234 pg_ctl -D "E:\Program Files\PostgreSQL\11\data" start
,包括按提示修改一些錯誤,仍不行。運行psql,甚至提示Administrator不存在。還不如剛纔了。
=============上面走了彎路,能夠跳過===========
卸掉從新安裝一次,安裝時只選擇server和command line tool,locale選擇C,安裝完成。
發現E:\Program Files\PostgreSQL\11\scripts有個runsql.bat,運行之,輸入前面設置密碼1234,終於有個像樣的命令行入口了。
參考:https://blog.csdn.net/linuxchyu/article/details/16984517 裝完刪除掉data文件夾,命令行從新生成正宗的中文數據庫:
initdb -D data --locale=chinese-simplified_china.936 -E UTF-8
參考https://blog.csdn.net/little_rabbit_baby/article/details/54928940,輸入\l 命令查看全部數據庫,輸入\conninfo顯示鏈接信息,\q退出。由於須要在局域網內個人電腦(個人電腦ip是192.168.3.3,而安裝了pg的2008 sp2的ip是192.168.0.238)上訪問,參照前面的內容的配置server上的pg_hba.conf,加上
host all all 192.168.3.0/24 md5
再重啓服務:
pg_ctl -D "E:\Program Files\PostgreSQL\11\data" restart
根據runpsql.bat內容,知遠程鏈接命令爲(-d表示數據庫名,-U不寫的話默認爲Administraotr):
psql -h 192.168.0.238 -p 5432 -d postgres -U postgres
除了locale ,還要注意server_encoding和 client_encoding參考:https://www.cnblogs.com/winkey4986/p/6279243.html 雖然PG支持客戶端和服務器端的編碼自動轉換,可是還須要聽從一個原則:本地環境的編碼和客戶端編碼需一致。
在dos環境中輸入:chcp 或在psql中輸入:\! chcp
顯示:活動代碼頁: 936 ----936爲簡體中文,GBK;
在psql中輸入: show client_encoding;(注意分號)個人電腦顯示GBK
輸入: show server_encoding;(注意分號)個人電腦顯示UTF8
能夠用 set client_encoding to 'utf8'; 修改編碼
總結(轉來的):①直接在psql執行insert或者select的時候,設置client_encoding=gbk(默認),不亂碼;(上面例子證實了)
②使用「\i sql文件.sql」(sql文件是utf8編碼)命令的時候,若是sql文件中有中文,必定要先行執行set client_encoding=utf8;(設置此以後,按照上面說的,客戶端不轉換,直接把接收的字符做爲utf8編碼傳給服務器端,而文件自己就是utf8,因此不亂碼;同理若是sql文件是ansi編碼即gbk編碼的話,確保client_encoding爲gbk;總之,sql文件與client_encoding編碼一致),纔不亂碼。
十、用beego鏈接pg,參考:https://www.cnblogs.com/hezhixiong/p/4617951.html
在$gopath\src下新建目錄postgresql ,其中main.go以下
package main import ( "fmt" "postgresql/models" "github.com/astaxie/beego" "github.com/astaxie/beego/orm" //_ "postgresql/routers" _ "github.com/lib/pq" ) func init() { // PostgreSQL 配置 //orm.RegisterDriver("postgres", orm.DR_Postgres) // 註冊驅動,// < 1.6 orm.RegisterDriver("postgres", orm.DRPostgres) //參考:https://beego.me/docs/mvc/model/orm.md#registerdriver orm.RegisterDataBase("default", "postgres", "user=postgres password=1234 dbname=postgres host=192.168.0.238 port=5432 sslmode=disable") /** * MySQL 配置 * 註冊驅動 * orm.RegisterDriver("mysql", orm.DR_MySQL) * mysql用戶:root ,root的祕密:tom , 數據庫名稱:test , 數據庫別名:default * orm.RegisterDataBase("default", "mysql", "root:tom@/test?charset=utf8") */ /** * Sqlite 配置 * 註冊驅動 * orm.RegisterDriver("sqlite", orm.DR_Sqlite) * 數據庫存放位置:./datas/test.db , 數據庫別名:default * orm.RegisterDataBase("default", "sqlite3", "./datas/test.db") */ // 自動建表 orm.RunSyncdb("default", false, true) } func main() { orm.Debug = true o := orm.NewOrm() o.Using("default") stu := new(models.Student) stu.Name = "tom" stu.Age = 25 fmt.Println(o.Insert(stu)) beego.Run() }
在postgresql目錄中建目錄models,其中,models.go以下:
package models import ( "github.com/astaxie/beego/orm" ) type Student struct { Id int64 Name string Age int } func init() { orm.RegisterModel(new(Student)) }
在liteide中Ctrl-B成功。
在psql終端中輸入 help 顯示幫助,其中sql 和psql有不一樣的幫助命令
輸入 \l 顯示有一個名爲postgres 的database
輸入 \c 顯示You are now connected to database "postgres" as user "postgres".
輸入 \d 顯示 Did not find any relations.
什麼意思?沒有表? 繼續輸入如下命令:
create database testdb owner postgres; \c testdb create schema testdb \c create table t(id int,info text); \d
終於顯示有一個名爲t的table了。
修改main.go,將dbname的值由postgres改成testdb,再Ctrl-B,這纔想到忘記運行編譯出來的程序了,尷尬!運行後,在psql中 用 \d命令,看到生成student表了。 用 \d student 命令查看錶結構。
刪除表可用:drop table student;(注意分號;)
用 select * from student; 查詢student表中的數據。
終於OK了!
等等,還沒測試中文。刪除 student表,將main.go中的 tom 改成 湯姆。從新編譯運行,嗯,沒有亂碼。
11. web網站使用cookie也很重要。代碼:
package main import ( "github.com/astaxie/beego" ) type Mcontroller struct { beego.Controller } func (c *Mcontroller) Get() { c.Ctx.SetCookie("name", "chen", 100, "/") // 設置cookie c.Ctx.WriteString("請打開chrome,按Ctrl+Shift+J,找到Application ,Cookies ,應看到有value爲chen的cookie") //c.StopRun() } func main() { beego.BConfig.Listen.HTTPPort = 8081 beego.Router("/", &Mcontroller{}) beego.Run() }
另,參考https://studygolang.com/topics/344
(1)、在寫入cookies以前不能有其餘輸出 (2)、啓用enablexsrf,在表單中應插入對應的值
十二、session也是不可或缺的
package main import ( "strconv" "github.com/astaxie/beego" ) type Mcontroller struct { beego.Controller } func (c *Mcontroller) Get() { v := c.GetSession("asta") v1 := 0 if v == nil { c.SetSession("asta", int(1)) c.Data["num"] = 0 } else { c.SetSession("asta", v.(int)+1) v1 = v.(int) } v2 := strconv.Itoa(v1) c.Ctx.WriteString("請打開chrome,按Ctrl+Shift+J,找到Application ,Cookies ,應看到有beegosessionID ; 請刷新瀏覽器看效果:服務器上session的值爲") c.Ctx.WriteString(v2) //c.StopRun() } func main() { beego.BConfig.Listen.HTTPPort = 8081 beego.BConfig.WebConfig.Session.SessionOn = true beego.Router("/", &Mcontroller{}) beego.Run() }
13.使用中間件。參考謝大神本尊的回覆 https://gocn.vip/question/37 ,惋惜謝大神沒有爲初學者講清楚還要 import "github.com/astaxie/beego/context", 折騰了半天,可參考這裏:https://blog.csdn.net/wo541075754/article/details/79488460
具體代碼以下(偷懶在上面關於session的代碼基礎上進行了修改。用chrome查看header的辦法參考:http://www.mamicode.com/info-detail-2044411.html,辦法也寫在下面的代碼中了)
package main import ( "strconv" "github.com/astaxie/beego" "github.com/astaxie/beego/context" ) type Mcontroller struct { beego.Controller } func (c *Mcontroller) Get() { v := c.GetSession("asta") v1 := 0 if v == nil { c.SetSession("asta", int(1)) c.Data["num"] = 0 } else { c.SetSession("asta", v.(int)+1) v1 = v.(int) } v2 := strconv.Itoa(v1) c.Ctx.WriteString("請在chrome後臺查看header,若是看不到,用這個方法:按ctrl+shif+c,點開network,filter圖標 all,而後F5刷新網頁後查看...") c.Ctx.WriteString(v2) //c.StopRun() } var FilterNoCache = func(ctx *context.Context) { ctx.Output.Header("Cache-Control", "no-cache, no-store, must-revalidate") ctx.Output.Header("Pragma", "no-cache") ctx.Output.Header("Expires", "123321") } func main() { beego.BConfig.Listen.HTTPPort = 8081 beego.BConfig.WebConfig.Session.SessionOn = true beego.InsertFilter("/", beego.BeforeStatic, FilterNoCache) beego.Router("/", &Mcontroller{}) beego.Run() }