golang web实战(beego,mvc)

想写个小网站,听说MVC过时了,流行MVVM,但是看了一下gin+vue+axios方式,发现还有一堆知识点要掌握,尤其是不喜欢nodejs和javascript方式的写法。算了,还是用beego来写吧。

1、首先参考https://beego.me

2、 获取Beego 和 Bee 的开发工具

$ go get -u github.com/astaxie/beego
$ go get -u github.com/beego/bee

我是用gopm get代替go get ,一开始有-u参数,但很长时间没反应。去掉-u立即下载成功。

由于我的$gopath设置的是:E:\goapp\,所以将从github下载的bee包复制到这个目录:E:\goapp\src\github.com\beego\bee

但这个目录下没有bee.exe工具。于是在这个目录下执行 go install,提示以下错误:

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\go

在windows系统环境变量一看,原来是用户的gopath环境变量%USERPROFILE%\go覆盖了我设的系统的gopath环境变量E:\goapp\,于是将用户环境变量设为E:\goapp\。 重新打开cmd,到bee目录下执行go install 。然后可以在E:\goapp\bin下找到bee.exe了

3、开始写网站,打开cmd ,转到E:\goapp\src\ 目录下,执行

bee new beego1

在E:\goapp\src\beego1下已生成了MVC网站,cmd中定位到E:\goapp\src\beego1目录下,执行

bee run

然后可以用浏览器打开http://localhost:8080/ 进行访问(若弹出防火墙提示,允许与否没关系,因为本机localhost不通过防火墙?)

4、用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,互不影响。

5、上面的main包添加了静态文件支持。即,在/main.go文件中beego.Run()之前加入了   :     beego.BConfig.WebConfig.StaticDir["/static"] = "static"     则beego1\static目录下的文档可以直接通过浏览器访问。

6、不喜欢8080端口,直接打开E:\goapp\src\beego1\conf\app.conf修改即可;也可以用beego.BConfig.Listen.HTTPPort = 8081(更多设置可参考:https://blog.csdn.net/qq_33610643/article/details/53511058)

7、显示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"] = "[email protected]"
    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"}

8、上传文件。

首先在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 上传文件

9、数据库支持。

参考: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编码一致),才不乱码。

10、用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表了。

删除表可用:drop table student;(注意分号;) 

用 select * from  student;       查询student表中的数据。

终于OK了!

等等,还没测试中文。删除 student表,将main.go中的 tom 改为 汤姆。重新编译运行,嗯,没有乱码。

猜你喜欢

转载自www.cnblogs.com/pu369/p/10369201.html