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

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文件

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8">
    <title>Title</title>
  </head>
  <body>
    hello {
  
  {.data}}
  </body>
</html>

3.运行项目

Goland终端中输入bee run

4.总结

c.Data["Email"] = "astaxie@gmail.com"是给视图传递数据,在视图界面里面需要用{ { }}加上.才能获取到,比如这行代码的意思就是,给视图传递,Key为Email,valueastaxie@gmail.com的数据。在视图中要通过{ {.Email}}就能获取到value值。

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

同时得出结论:

  1. 控制器(Controller)的作用
  • 能够给视图传递数据
  • 能够指定视图
  1. 视图(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

<form method="post" action="https://blog.csdn.net/">
    <input type="submit" value="提交">
</form>

全部代码:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>

<h1>hello {
  
  {.data}}</h1>

<form method="post" action="https://blog.csdn.net/">
    <input type="submit" value="提交">
</form>

</body>
</html>

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)
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值