HOME> 装备百科> Beego框架安装及学习(附项目案例)

Beego框架安装及学习(附项目案例)

装备百科 2025-10-15 16:02:10
1.规划 2.Beego框架快速入门 2.1beego框架了解 Beego框架是go语言开发的web框架。 那什么是框架呢?就是别人写好的代码,我们可以直接使用!这个代...

1.规划

2.Beego框架快速入门

2.1beego框架了解

Beego框架是go语言开发的web框架。

那什么是框架呢?就是别人写好的代码,我们可以直接使用!这个代码是专门针对某一个开发方向定制的,例如:我们要做一个网站,利用 beego 框架就能非常快的完成网站的开发,如果没有框架,每一个细节都需要我们处理,开发速度会大大降低。

go语言的web框架:beego,gin,echo等等,那为什么我们选择beego呢?

beego对于新手来说更易学习

2.2MVC架构

Beego是MVC架构。MVC 是一种应用非常广泛的体系架构,几乎所有的编程语言都会使用到,而且所有的程序员在工作中都会遇到!用 MVC 的方式开发程序,可以让程序的结构更加合理和清晰。 画图说明

beego具体是如何内嵌MVC呢?我们搭起环境通过代码分析。

2.3环境搭建(Ubuntu下搭建)

2.3.1安装Golang环境

1.配置DNS服务

echo "nameserver 114.114.114.114" >> /etc/resolv.conf(这里需要切换root用户sudo su)

2.下载wget和ntpdate工具

apt install ntpdate wget -y

3.date查看一下系统时间

若不是实际的实时时间就同步一下

4.创建golang的工程目录及bin目录

这里把$HOME/work/go作为了golang的project目录

mkdir -p $HOME/work/go $HOME/dev_env && cd $HOME/dev_env

5.下载对应的golang包

官方下载地址:https://go.dev/dl/

也可用命令行下载:wget https://dl.google.com/go/go1.20.5.linux-amd64.tar.gz

核实一下下载的golang包是损坏,确保与下载网页上的hash值一致

sha256sum go1.20.5.linux-amd64.tar.gz

6.下载完golang安装包后,解压安装包

tar -zxvf go1.20.5.linux-amd64.tar.gz

7.配置环境变量

vim ~/.bashrc在文件最后添加并保存

export GOROOT=$HOME/dev_env/go

export GOPATH=$HOME/work/go

export GOBIN=$GOROOT/bin

export PATH=$PATH:$GOBIN

执行source ~/.bashrc以便配置生效

8.检测安装配置是否成功

go version

9.写一个简单的程序测试一下

vi $GOPATH/hello.go

package main

import "fmt"

func main() {

fmt.Printf("Hello,world!,aust blockchain, it's for beego!\n")

}

进入GOPATH文件夹cd $GOPATH

编译刚刚写的go文件go build hello.go

2.3.2安装Beego环境

1.搭建代理方便下载依赖包

vim ~/.bashrc加入以下两句

export GO111MODULE=on

export GOPROXY="https://goproxy.cn,direct"

执行source ~/.bashrc以便配置生效

2.创建一个独立存放beego源码和bee源码的目录

mkdir -p $HOME/work/beego_dev && cd $HOME/work/beego_dev

3.使用git下载源码

虚拟机没安装git操作的先安装一下sudo apt install git

然后下beego和bee

git clone https://github.com/beego/bee.git

git clone https://github.com/beego/beego.git

然后编译出bee这个构建beego工程的工具,由于下载bee的源码里已经有了go.mod,所以在go build的时候会自动下载一些build的依赖包

cd bee

go build

go build 之后会发现会多出一个bee,生成bee之后,把bee放到环境变量里,这里把bee放到了GOBIN里,将bee放到环境变量里之后,刚才git下载的beego和bee 源码其实就可以删掉了,因为bee新建的api项目,通过go mod tidy就可以进行管理依赖包cp bee $GOBIN

4.结果验证

随便换一个工作目录,执行bee version

5.创建项目

运行bee new 项目名来创建一个项目bee new myapp

6.运行项目

进入项目目录cd myapp

输入go get 项目名同步依赖go get myapp

再输入bee run运行该项目

7.浏览器进入

在虚拟机自带浏览器中输入localhost:8080进入

在本机浏览器中进入

首先获取虚拟机ipifconfig

在本机浏览器中输入http://192.168.232.137:8080/

2.4beego的项目结构分析

进入项目目录输入tree查看项目目录结构

conf/:存放应用的配置文件,如数据库连接信息。

controllers/:包含处理用户请求的控制器文件。

go.mod 和 go.sum:定义项目的依赖关系及其版本。

main.go:应用的入口文件,负责初始化并运行应用。

models/:用于存放表示应用数据结构的模型文件(本例中为空)。

routers/:定义应用的URL路由规则,将路径映射到控制器。

static/:存放CSS、JavaScript和图片等静态资源。

tests/:编写应用的单元测试文件。

views/:包含生成HTML内容的视图模板文件。

2.5Beego快速体验

2.5.1Ubuntu下安装Goland

方法一:

直接在Ubuntu软件商店进行下载安装

方法二:

1.下载压缩包:Download GoLand: A Go IDE with extended support for JavaScript, TypeScript, and databases

2.打开终端,并将压缩包复制到/usr/local下并进行解压

sudo cp goland-2024.3.tar.gz /usr/local/

3.进入/usr/local进行解压

cd /usr/local/

sudo tar -xvf goland-2024.3.tar.gz

4.启动Goland

解压完成后进入goland中的bin目录中

执行./goland.sh进行启动

5.Goland图标添加

转到/usr/share/applications路径cd /usr/share/applications

执行:sudo vim goland.desktop

注:Icon和Exec下改自己的对应路径

[Desktop Entry]

Version=1.0

Type=Application

Name=GoLand

# /usr/local/GoLand-2024.3 goland安装的路径

Icon=/usr/local/GoLand-2024.3/bin/goland.png

Exec=/usr/local/GoLand-2024.3/bin/goland.sh

Comment=The Drive to Develop

Categories=Development;IDE;

Terminal=false

StartupWMClass=jetbrains-goland

保存完成后,就可以在应用程序下看到GoLand图标了,若没有,可重启查看。

最后,右键图标添加到收藏夹,就可以显示在桌面左侧了

2.5.2项目体验

1.打开controllers目录下的default.go文件进行修改

修改后:

package controllers

import (

beego "github.com/beego/beego/v2/server/web"

)

type MainController struct {

beego.Controller

}

func (c *MainController) Get() {

c.Data["Website"] = "beego.vip"

c.Data["Email"] = "astaxie@gmail.com"

c.Data["data"] = "aust blockchain"

c.TplName = "test.html"

}

2.在views目录下新建test.html文件

Title

hello {

{.data}}

3.运行项目

Goland终端中输入bee run

4.总结

c.Data["Email"] = "astaxie@gmail.com"是给视图传递数据,在视图界面里面需要用{

{ }}加上.才能获取到,比如这行代码的意思就是,给视图传递,Key为Email,value为astaxie@gmail.com的数据。在视图中要通过{

{.Email}}就能获取到value值。

c.TplName = "index.tpl"的作用是指定视图。这里面需要注意的是,默认指定的界面是tpl结尾,但是打开这个文件分析,发现还是一个html界面。所以我们也可以用html文件当视图文件。

同时得出结论:

控制器(Controller)的作用

能够给视图传递数据

能够指定视图

视图(View)的作用

view本质就是个html。所以能在浏览器显示

能够接收控制器传递过来的数据

2.6Beego运行流程分析

浏览器发出请求

路由拿到请求,并给相应的请求指定相应的控制器

找到指定的控制器之后,控制器看是否需要查询数据库

如果需要查询数据库就找model取数据

如果不需要数据库,直接找view要视图

控制器拿到视图页面之后,把页面返回给浏览器

根据文字流程分析代码流程

从项目的入口main.go开始

找到router.go文件的Init函数

找到路由指定的控制器文件default.go的Get方法

然后找到指定视图的语法,整个项目就串起来了

2.7Post案例实现

刚才分析了beego项目的整个运行流程,最终是如何调到Get方法的呢?beego通过内部语法给不同的http请求指定了不同的方法,因为我们是从浏览器地址栏发送的请求,属于get请求,所以调用的是Get方法。接下来实现一个post请求。

2.7.1前端修改

前端代码如下:

修改刚才创建的新的视图,为了能够发送post请求,在视图中添加一个能发送post请求的控件form

全部代码:

Title

hello {

{.data}}

2.7.2后台代码修改

后台代码

设置post请求要传递的数据和要显示的视图页面

func (c *MainController) Post() {

c.Data["data"] = "AUST BLOCKCHAIN"

c.TplName = "test.html"

}

全部代码

package controllers

import (

beego "github.com/beego/beego/v2/server/web"

)

type MainController struct {

beego.Controller

}

func (c *MainController) Get() {

c.Data["data"] = "aust blockchain"

c.TplName = "test.html"

}

func (c *MainController) Post() {

c.Data["data"] = "AUST BLOCKCHAIN"

c.TplName = "test.html"

}

验证

bee run进入浏览器localhost:8080查看

点击提交按钮后

2.8Beego中路由的快速体验

2.8.1路由的简单设置

路由的作用:根据不同的请求指定不同的控制器

路由函数:beego.Router("/path",&controller.MainController{})

函数参数:

先分析一下Url地址由哪几部分组成? 同一资源定位符

http://192.168.232.136:8080/index

http://地址:端口/资源路径

第一个参数:资源路径,也就是/后面的内容

第二个参数:需要指定的控制器指针

beego.Router("/", &controllers.MainController{})

beego.Router("/index", &controllers.IndexController{})

beego.Router("/login", &controllers.LoginController{})

2.8.2高级路由设置

一般在开发过程中,我们基本不使用beego提供的默认请求访问方法,都是自定义相应的方法。那我们来看一下如何来自定义请求方法。

自定义请求方法需要用到Router的第三个参数。这个参数是用来给不同的请求指定不同的方法。具体有如下几种情况。

一个请求访问一个方法(也是最常用的),请求和方法之间用 : 隔开,不同的请求用 ; 隔开:

beego.Router("/simple",&SimpleController{},"get:GetFunc;post:PostFunc")

可以多个请求,访问一个方法 ,请求之间用,隔开,请求与方法之间用:隔开:

beego.Router("/api",&RestController{},"get,post:ApiFunc")

所有的请求访问同一个方法,用*号代表所有的请求,和方法之间用:隔开:

beego.Router("/api/list",&RestController{},"*:ListFood")

如果同时存在 * 和对应的 HTTP请求,那么优先执行 HTTP请求所对应的方法,例如同时注册了如下所示的路由:

beego.Router("/simple",&SimpleController{},"*:AllFunc;post:PostFunc")

那么当遇到Post请求的时候,执行PostFunc而不是AllFunc。

如果用了自定义方法之后,默认请求将不能访问。

示例:在router.go文件中修改

代码:

package routers

import (

beego "github.com/beego/beego/v2/server/web"

"myapp/controllers"

)

func init() {

beego.Router("/", &controllers.MainController{})

//给请求指定自定义方法,一个请求指定一个方法

beego.Router("login",&controllers.LoginController{},"get:ShowLogin;post:PostFunc")

//给多个请求制定一个方法

beego.Router("index",&controllers.IndexController{},"get,post:HandleFunc")

//给所有请求制定一个方法

beego.Router("index",&controllers.IndexController{},"*:HandleFunc")

//当两种指定方法冲突的时候

beego.Router("index",&controllers.IndexController{},"*:HandleFunc;post:PostFunc")

}

2.9Go操作MySQL数据库

2.9.1Ubuntu下安装mysql

1.更新一下列表

sudo apt-get update

2.安装MySQL

sudo apt-get install mysql-server

3.启动和关闭mysql的命令如下

启动::sudo service mysql start

重启:sudo service mysql restart

关闭::sudo service mysql stop

4.修改mysql的连接方式和数据库密码

无密码登录数据库: sudo mysql -u root -p

不用输入任何密码直接回车,然后输一下命令

use mysql

#开启远程连接

update user set host='%' where user='root';

#修改了之后刷新以下权限

flush privileges;

#修改数据库密码.

ALTER USER 'root'@'%' identified with mysql_native_password BY 'wzj123456';

#修改了之后刷新以下权限

flush privileges;

#退出数据库

quit

5.再次进入数据库

mysql -u root -p然后输入刚刚设置的密码就可以正常进入mysql

6.创建测试数据库

create database test;

2.9.2Go操作Mysql数据库

1.安装go操作MySQL的驱动

go get github.com/go-sql-driver/mysql

2.创建文件

在models目录下创建model.go文件

同时在main.go文件中导包

_ "myapp/models"

2.导入数据库驱动

import (

"database/sql"

_ "github.com/go-sql-driver/mysql"

"log"

)

3.连接数据库

用sql.Open()方法,open()方法的第一个参数是驱动名称,第二个参数是用户名:密码@tcp(ip:port)/数据库名称?编码方式,返回值是连接对象和错误信息,例如:

// 连接数据库

dsn := "root:wzj123456@tcp(127.0.0.1:3306)/test"

conn, err := sql.Open("mysql", dsn)

if err != nil {

log.Fatalf("连接数据库失败: %v", err)

}

defer conn.Close()

4.创建表

创建表的方法也是Exec(),参数是SQL语句,返回值是结果集和错误信息:

_, err = conn.Exec("INSERT INTO user(userName, passwd) VALUES(?, ?)", "aust", "blockchain")

if err != nil {

log.Fatalf("插入数据失败: %v", err)

}

log.Println("数据插入成功")

5.增删改操作

执行增删改操作语句的是Exec(),参数是SQL语句,返回值是结果集和错误信息,通过对结果集的判断,得到执行结果的信息。以插入数据为例代码如下:

// 插入数据到user表中

_, err = conn.Exec("INSERT INTO user(userName, passwd) VALUES(?, ?)", "aust", "blockchain")

if err != nil {

// 如果插入数据失败,则记录错误信息并终止程序

log.Fatalf("插入数据失败: %v", err)

}

// 记录数据插入成功的日志

log.Println("数据插入成功")

6.查询操作

用的函数是Query(),参数是SQL语句,返回值是查询结果集和错误信息,然后循环结果集取出其中的数据。代码如下:

// 查询数据

rows, err := conn.Query("SELECT userName FROM user")

if err != nil {

log.Fatalf("查询数据失败: %v", err)

}

defer rows.Close()

var userName string

for rows.Next() {

if err := rows.Scan(&userName); err != nil {

log.Fatalf("扫描数据失败: %v", err)

}

log.Println("用户名:", userName)

}

if err := rows.Err(); err != nil {

log.Fatalf("迭代行时出错: %v", err)

}

全部代码

package models

import (

"database/sql"

_ "github.com/go-sql-driver/mysql" // 导入MySQL驱动,但不直接使用它

"log"

)

func init() {

// 数据库连接字符串,包含用户名、密码、地址、端口和数据库名

dsn := "root:wzj123456@tcp(127.0.0.1:3306)/test"

// 使用sql.Open尝试打开数据库连接,这里并不会立即进行连接,只是初始化一个连接对象

conn, err := sql.Open("mysql", dsn)

if err != nil {

// 如果初始化连接对象失败,则记录错误信息并终止程序

log.Fatalf("连接数据库失败: %v", err)

}

// 确保在main函数结束时关闭数据库连接

defer conn.Close()

// 使用Ping方法检查数据库连接是否有效

err = conn.Ping()

if err != nil {

// 如果连接无效,则记录错误信息并终止程序

log.Fatalf("数据库连接无效: %v", err)

}

// 执行SQL语句创建表,如果表已存在则不会重新创建(使用IF NOT EXISTS)

_, err = conn.Exec("CREATE TABLE IF NOT EXISTS user(userName VARCHAR(40), passwd VARCHAR(40))")

if err != nil {

// 如果创建表失败,则记录错误信息并终止程序

log.Fatalf("创建表失败: %v", err)

}

// 记录表创建成功的日志

log.Println("表创建成功")

// 插入数据到user表中

_, err = conn.Exec("INSERT INTO user(userName, passwd) VALUES(?, ?)", "aust", "blockchain")

if err != nil {

// 如果插入数据失败,则记录错误信息并终止程序

log.Fatalf("插入数据失败: %v", err)

}

// 记录数据插入成功的日志

log.Println("数据插入成功")

// 查询user表中的所有用户名

rows, err := conn.Query("SELECT userName FROM user")

if err != nil {

// 如果查询失败,则记录错误信息并终止程序

log.Fatalf("查询数据失败: %v", err)

}

// 确保在rows使用完毕后关闭它,释放资源

defer rows.Close()

// 迭代查询结果

var userName string

for rows.Next() {

// 扫描当前行的数据到userName变量中

if err := rows.Scan(&userName); err != nil {

// 如果扫描失败,则记录错误信息并终止程序

log.Fatalf("扫描数据失败: %v", err)

}

// 记录查询到的用户名

log.Println("用户名:", userName)

}

// 检查在迭代过程中是否发生了错误

if err := rows.Err(); err != nil {

// 如果迭代过程中发生错误,则记录错误信息并终止程序

log.Fatalf("迭代行时出错: %v", err)

}

}