golang web实战之一(beego,mvc postgresql)
想写个小网站,听说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)的更多相关文章
- golang web实战之二(iris)
之前写了一篇为:golang web实战之一(beego,mvc postgresql) 听说iris更好: 1. iris hello world package main import &quo ...
- golang web实战之三(基于iris框架的 web小应用,数据库采用 sqlite3 )
一.效果:一个图片应用 1.可上传图片到uploads目录. 2.可浏览和评论图片(用富文本编辑器输入) 二.梳理一下相关知识: 1.iris框架(模板输出,session) 2.富文本编辑器.sql ...
- golang学习笔记9 beego nginx 部署 nginx 反向代理 golang web
golang学习笔记9 beego nginx 部署 nginx 反向代理 golang web Nginx 部署 - beego: 简约 & 强大并存的 Go 应用框架https://bee ...
- 实战 ASP.NET MVC Web API
实战 ASP.NET MVC Web API Web API 框架基于 ASP.NET MVC 框架开发,是一个面向 Http 协议的通信框架.相对于 WCF 而言,Web API 只面向于 Http ...
- golang学习笔记16 beego orm 数据库操作
golang学习笔记16 beego orm 数据库操作 beego ORM 是一个强大的 Go 语言 ORM 框架.她的灵感主要来自 Django ORM 和 SQLAlchemy. 目前该框架仍处 ...
- golang学习笔记10 beego api 用jwt验证auth2 token 获取解码信息
golang学习笔记10 beego api 用jwt验证auth2 token 获取解码信息 Json web token (JWT), 是为了在网络应用环境间传递声明而执行的一种基于JSON的开放 ...
- golang学习笔记8 beego参数配置 打包linux命令
golang学习笔记8 beego参数配置 打包linux命令 参数配置 - beego: 简约 & 强大并存的 Go 应用框架https://beego.me/docs/mvc/contro ...
- golang web 方案
概要 开发 web 框架 数据库 认证 日志 配置 静态文件服务 上传/下载 发布 docker 打包 部署中遇到的问题 时区问题 概要 轻量的基于 golang 的 web 开发实践. golang ...
- golang web框架设计7:整合框架
把前面写好的路由器,控制器,日志,都整合在一起 全局变量和初始化 定义一些框架的全局变量 var ( BeeApp *App AppName string AppPath string StaticD ...
随机推荐
- .NET应用程序管理服务AMS设计
AMS全称是Application Management Server即应用程序管理服:由于经常要写些一些应用服务,每次部署和维护都比较麻烦,首先要针对服务编写一个windows服务程序方便系统启动里 ...
- Jexus~Linux环境下的部署
Jexus 即 Jexus Web Server,简称JWS,是Linux平台上的一款ASP.NET WEB服务器,是 Linux.Unix.FreeBSD 等非Windows系统架设 ASP.NET ...
- 线段树(区间树)之区间染色和4n推导过程
前言 线段树(区间树)是什么呢?有了二叉树.二分搜索树,线段树又是干什么的呢?最经典的线段树问题:区间染色:正如它的名字而言,主要解决区间的问题 一.线段树说明 1.什么是线段树? 线段树首先是二叉树 ...
- leetcode — same-tree
import java.util.Stack; /** * Source : https://oj.leetcode.com/problems/same-tree/ * * * Given two b ...
- 设计模式总结篇系列:策略模式(Strategy)
前面的博文中分别介绍了Java设计模式中的创建型模式和结构型模式.从本文开始,将分别介绍设计模式中的第三大类,行为型模式.首先我们了解下分为此三大类的依据. 创建型模式:主要侧重于对象的创建过程: 结 ...
- 【Java并发编程】Callable、Future和FutureTask的实现
启动线程执行任务,如果需要在任务执行完毕之后得到任务执行结果,可以使用从Java 1.5开始提供的Callable和Future 下面就分析一下Callable.Future以及FutureTask的 ...
- Beanstalkd,zeromq,rabbitmq的区别
1).rabbitmq(功能强大,管理应用也完善,不过也比较重量级)2).zeromq(从rabbitmq出来的一个小而快速的队列,基本是目前最快的队列机制,自身支持多种模式,可以对各个模式进行自己组 ...
- python学习笔记(七)、异常
在实际开发中,往往不会出现一个系统编写下来,没有出现任何一个bug.为处理这种会出现错误的地方,如除数为零的除法,python提供了非常强大的机制————异常处理机制. 1 异常 python使用异常 ...
- es6 Module语法
export 命令 1.概念 export用于定义要输出的变量(let.var.const.function.class),定义的变量与值是动态绑定关系. 2.命令格式 1. export 变量定义 ...
- vue2.x 在引用插件的时候,npm run dev跑正常 ,npm run build 报错vue-cli Unexpected token: punc (() [
这是因为,引用的插件在node_modules里,并不在vue-cli的es6编译范围内,所以语法报错,修改方法: