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文件
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
全部代码:
{.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)
}
}