想写个小网站,听说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::: 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/// 调用 ObjectController 中的 Blog 方法,参数如下:map[: : :]

首先修改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"}

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/  trust
host all all 192.168.3.0/ 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. -E UTF- 

参考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/            md5

再重启服务:

pg_ctl -D "E:\Program Files\PostgreSQL\11\data" restart

根据runpsql.bat内容,知远程连接命令为(-d表示数据库名,-U不写的话默认为Administraotr):

psql -h 192.168.0.238 -p  -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 = 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", , "/") // 设置cookie
c.Ctx.WriteString("请打开chrome,按Ctrl+Shift+J,找到Application ,Cookies ,应看到有value为chen的cookie")
//c.StopRun()
} func main() {
beego.BConfig.Listen.HTTPPort =
beego.Router("/", &Mcontroller{}) beego.Run()
}

另,参考https://studygolang.com/topics/344

(1)、在写入cookies之前不能有其他输出
(2)、启用enablexsrf,在表单中应插入对应的值

12、session也是不可或缺的

package main

import (
"strconv" "github.com/astaxie/beego"
) type Mcontroller struct {
beego.Controller
} func (c *Mcontroller) Get() { v := c.GetSession("asta")
v1 :=
if v == nil {
c.SetSession("asta", int())
c.Data["num"] =
} else {
c.SetSession("asta", v.(int)+)
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 =
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 :=
if v == nil {
c.SetSession("asta", int())
c.Data["num"] =
} else {
c.SetSession("asta", v.(int)+)
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", "")
} func main() {
beego.BConfig.Listen.HTTPPort =
beego.BConfig.WebConfig.Session.SessionOn = true
beego.InsertFilter("/", beego.BeforeStatic, FilterNoCache)
beego.Router("/", &Mcontroller{})
beego.Run()
}

golang web实战之一(beego,mvc postgresql)的更多相关文章

  1. golang web实战之二(iris)

    之前写了一篇为:golang web实战之一(beego,mvc postgresql) 听说iris更好: 1.  iris hello world package main import &quo ...

  2. golang web实战之三(基于iris框架的 web小应用,数据库采用 sqlite3 )

    一.效果:一个图片应用 1.可上传图片到uploads目录. 2.可浏览和评论图片(用富文本编辑器输入) 二.梳理一下相关知识: 1.iris框架(模板输出,session) 2.富文本编辑器.sql ...

  3. golang学习笔记9 beego nginx 部署 nginx 反向代理 golang web

    golang学习笔记9 beego nginx 部署 nginx 反向代理 golang web Nginx 部署 - beego: 简约 & 强大并存的 Go 应用框架https://bee ...

  4. 实战 ASP.NET MVC Web API

    实战 ASP.NET MVC Web API Web API 框架基于 ASP.NET MVC 框架开发,是一个面向 Http 协议的通信框架.相对于 WCF 而言,Web API 只面向于 Http ...

  5. golang学习笔记16 beego orm 数据库操作

    golang学习笔记16 beego orm 数据库操作 beego ORM 是一个强大的 Go 语言 ORM 框架.她的灵感主要来自 Django ORM 和 SQLAlchemy. 目前该框架仍处 ...

  6. golang学习笔记10 beego api 用jwt验证auth2 token 获取解码信息

    golang学习笔记10 beego api 用jwt验证auth2 token 获取解码信息 Json web token (JWT), 是为了在网络应用环境间传递声明而执行的一种基于JSON的开放 ...

  7. golang学习笔记8 beego参数配置 打包linux命令

    golang学习笔记8 beego参数配置 打包linux命令 参数配置 - beego: 简约 & 强大并存的 Go 应用框架https://beego.me/docs/mvc/contro ...

  8. golang web 方案

    概要 开发 web 框架 数据库 认证 日志 配置 静态文件服务 上传/下载 发布 docker 打包 部署中遇到的问题 时区问题 概要 轻量的基于 golang 的 web 开发实践. golang ...

  9. golang web框架设计7:整合框架

    把前面写好的路由器,控制器,日志,都整合在一起 全局变量和初始化 定义一些框架的全局变量 var ( BeeApp *App AppName string AppPath string StaticD ...

随机推荐

  1. Linux内核使用浮点运算问题

    上一篇博文中 电池温度检测原理和示例代码 ,由于驱动要使用对数函数而从网上参看一个实现 double ln(double a) { ; int k,nk; double x,xx,y; x = (a- ...

  2. PE知识复习之PE的绑定导入表

    PE知识复习之PE的绑定导入表 一丶简介 根据前几讲,我们已经熟悉了导入表结构.但是如果大家尝试过打印导入表的结构. INT IAT的时候. 会出现问题. PE在加载前 INT IAT表都指向一个名称 ...

  3. [解决方案]SystemError: Parent module '' not loaded, cannot perform relative import的解决方案

    缺陷:__mian__不能使用相对导入 PEP 328 Relative Imports and __name__ 中说明: Relative imports use a module's __nam ...

  4. Perl系列文章

    0.Perl书籍推荐 Perl书籍下载 密码:kkqx 下面是一些我学习Perl过程中读过完整的或部分章节的觉得好的书. 入门级别1:<Perl语言入门>即小骆驼 入门级别2:<In ...

  5. 杭电ACM2009--求数列的和

    求数列的和 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submi ...

  6. Python判断相等

    判断相等方法有好几个:== .is . isinstance .issubclass .operator 模块. == :两个对象内容是否相等. >>> a = [22,44]> ...

  7. c# API接收Base64转图片

    /// <summary> /// API接收Base64转图片 /// </summary> /// <param name="Img">图片 ...

  8. chrome设置网页编码

    新版的 chrome 没有这个设置选项,可以借助插件 charset 插件实现,到 web store 搜索安装即可.

  9. Fundebug前端JavaScript插件更新至1.7.1,拆分录屏代码,还原部分Script error.

    摘要: BUG监控插件压缩至18K. 1.7.1拆分了录屏代码,BUG监控插件压缩至18K,另外我们还原了部分Script error,帮助用户更方便地Debug.请大家及时更新哈~ 拆分录屏代码 从 ...

  10. paas saas iaas 区别

    最近在公司里面经常听到一些paas saas iaas云服务的名词,把我自己都听蒙圈啦,所以就各种找资料终于对这三个名词有了一定的了解 首先上一张图如下: IAAS(nfrastructure as ...