想写个小网站,听说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. .NET应用程序管理服务AMS设计

    AMS全称是Application Management Server即应用程序管理服:由于经常要写些一些应用服务,每次部署和维护都比较麻烦,首先要针对服务编写一个windows服务程序方便系统启动里 ...

  2. Jexus~Linux环境下的部署

    Jexus 即 Jexus Web Server,简称JWS,是Linux平台上的一款ASP.NET WEB服务器,是 Linux.Unix.FreeBSD 等非Windows系统架设 ASP.NET ...

  3. 线段树(区间树)之区间染色和4n推导过程

    前言 线段树(区间树)是什么呢?有了二叉树.二分搜索树,线段树又是干什么的呢?最经典的线段树问题:区间染色:正如它的名字而言,主要解决区间的问题 一.线段树说明 1.什么是线段树? 线段树首先是二叉树 ...

  4. leetcode — same-tree

    import java.util.Stack; /** * Source : https://oj.leetcode.com/problems/same-tree/ * * * Given two b ...

  5. 设计模式总结篇系列:策略模式(Strategy)

    前面的博文中分别介绍了Java设计模式中的创建型模式和结构型模式.从本文开始,将分别介绍设计模式中的第三大类,行为型模式.首先我们了解下分为此三大类的依据. 创建型模式:主要侧重于对象的创建过程: 结 ...

  6. 【Java并发编程】Callable、Future和FutureTask的实现

    启动线程执行任务,如果需要在任务执行完毕之后得到任务执行结果,可以使用从Java 1.5开始提供的Callable和Future 下面就分析一下Callable.Future以及FutureTask的 ...

  7. Beanstalkd,zeromq,rabbitmq的区别

    1).rabbitmq(功能强大,管理应用也完善,不过也比较重量级)2).zeromq(从rabbitmq出来的一个小而快速的队列,基本是目前最快的队列机制,自身支持多种模式,可以对各个模式进行自己组 ...

  8. python学习笔记(七)、异常

    在实际开发中,往往不会出现一个系统编写下来,没有出现任何一个bug.为处理这种会出现错误的地方,如除数为零的除法,python提供了非常强大的机制————异常处理机制. 1 异常 python使用异常 ...

  9. es6 Module语法

    export 命令 1.概念 export用于定义要输出的变量(let.var.const.function.class),定义的变量与值是动态绑定关系. 2.命令格式 1. export 变量定义 ...

  10. vue2.x 在引用插件的时候,npm run dev跑正常 ,npm run build 报错vue-cli Unexpected token: punc (() [

    这是因为,引用的插件在node_modules里,并不在vue-cli的es6编译范围内,所以语法报错,修改方法: