Go语言实现一个带数据库和模板功能的网站基础结构

Go语言实现一个带数据库和模板功能的网站基础结构

本例基本实现了一个动态网站所需要的结构,包括目录基础结构,数据库连接和查询,模板解析,模板内显示和控制数据等最常用的操作,以后的文章会继续深入和细化网站实现的细节,但只在某一功能的实现上深入讨论,不再完整的列出程序结构和源代码清单,如果文章开头引用本篇,则是以本程序为基础结构的。

先建立以下目录结构和go源码文件:

main
|- sqltools
    |- connmysql.go
|- static
    |- css
        |- main.css
|- templates
    |- index.html
|- main.go

mian文件夹中是main.go文件和sqltools文件夹,sqltools文件夹中是connmysql.go文件,我们把数据库连接相关代码单独放在connmysql.go文件中,方便以后调用,main.go中调用connmysql.go中的数据库连接方法。

执行go mod命令自动生成go.mod,在命令提示行cmd进入main目录,执行以下命令:

go mod init main

从github.com下载mysql数据库的go驱动,golang连接数据库用户的驱动是:go-sql-driver

在命令提示行cmd进入main目录下,执行以下命令:

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

成功执行后会将mysql驱动写入到go.mod文件中。

在数据库golang里面新建test数据库,并写入几行数据,可运行如下SQL语句:

CREATE TABLE IF NOT EXISTS `test` (
  `id` int(8) NOT NULL,
  `content` varchar(512) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

--
-- 转存表中的数据 `test`
--

INSERT INTO `test` (`id`, `content`) VALUES
(0, '测试查询'),
(1, '欢迎光临'),
(2, '连接MySQL'),
(3, 'Go微型服务'),
(4, '这里是RGNote'),
(5, '学习GoLang');

下面是connmysql.go文件的源码内容:

package sqltools

import (
	"database/sql"
	"fmt"

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

func ConnectMySQL(dbUser, dbPassword, dbServer, dbName string) (db *sql.DB, err error) {
	//生成数据库连接字符串
	str := dbUser + ":" + dbPassword + "@(" + dbServer + ":3306)/" + dbName
	//打印生成的字符串
	fmt.Println("数据库连接字符串:" + str)
	//建立连接
	db, err = sql.Open("mysql", str)
	//测试连接是否成功
	err = db.Ping()
	//返回数据库连接
	return db, err
}

func QueryTable(db *sql.DB, tableName string) (rows *sql.Rows, err error) {
	str := "select * from " + tableName
	rows, err = db.Query(str)
	return rows, err
}

下面是main.go源代码:

package main

import (
	"fmt"
	"log"
	"main/sqltools"
	"net/http"
	"text/template"
)

//数据库连接参数
const (
	dbUser     = "root"
	dbPassword = "123456"
	dbServer   = "127.0.0.1"
	dbName     = "golang"
)

type Msg struct {
	//变量名称要大写,小写变量名只能在本程序访问,不能传值到网页页面,不会输出内容
	Id      string
	Content string
}

func main() {
	//指定相对路径./static为文件服务路径,并指定js、css、img文件目录
	staticHandle := http.FileServer(http.Dir("./static"))
	http.Handle("/js/", staticHandle)
	http.Handle("/css/", staticHandle)
	http.Handle("/img/", staticHandle)

	http.HandleFunc("/", handler)

	fmt.Println("正在启动Web服务,端口8000")
	log.Fatal(http.ListenAndServe("localhost:8000", nil))

}

func handler(w http.ResponseWriter, r *http.Request) {
	db, err := sqltools.ConnectMySQL(dbUser, dbPassword, dbServer, dbName)
	if err == nil {
		fmt.Println("数据库连接成功")

	} else {
		fmt.Println("数据库连接失败,请查询参数")
	}

	t, _ := template.ParseFiles("./templates/index.html")

	//新建空map用于存储数据库查询结果
	newsMsg := make(map[int]Msg)
	//新建msg结构用于存储查询结果内容
	var msg Msg
	//用于map Key值
	newsId := 1
	//查询数据库
	rows, rowsErr := sqltools.QueryTable(db, "test")
	if rowsErr != nil {
		fmt.Printf("查询失败")
	} else {
		//获取数据
		for rows.Next() {
			var sid string
			var content string
			rows.Scan(&sid, &content)
			msg.Content = content
			msg.Id = sid
			newsMsg[newsId] = msg
			newsId++
		}
		fmt.Println(newsMsg)
	}
	t.Execute(w, newsMsg)
}

index.html文件内容如下:

<html>
<head>
    <title>Go语言实现一个带数据库和模板的功能完整的网站</title>
    <link rel="stylesheet" href="/css/main.css" type="text/css">
</head>
<body>
    <div class="wraper">
        <div>
            <div class="sn_row datatitle" >行号</div>
            <div class="sn_row datatitle">编号</div>
            <div class="sn_row data_row datatitle">内容</div>
        </div>
        {{range $index, $user:=.}}
        <div class="databody">
            <div class="sn_row">{{$index}}</div>
            <div class="sn_row">{{$user.Id}}</div>
            <div class="sn_row data_row">{{$user.Content}}</div>
        </div>
        {{end}} 
    </div>
</body>
</html>

main.css文件内容如下:

body {
    background-color:#d0d0d0;
}

.wraper{
    width:380px;
    line-height: 30px;
    margin:0 auto;
    margin-top: 20px;
}

.databody{
    text-align: left;
    text-indent: 10px;
}

.sn_row{
    float:left;
    width:80px;
    border:1px;
    border-style:solid;
    border-color: black;
    background-color:ghostwhite;       
}

.data_row{
    width:200px;   
}

.datatitle{
    text-align: center;
    font-weight: bold;
    color:green;
    font-size:larger;
    background-color:khaki;
}

本机配置好mysql程序,并新建golang数据库,执行以下命令:

go run main.go

设置正确的数据库参数,打开浏览器,在地址栏输入http://localhost:8000,如果成功执行,则输出:

正在启动Web服务,端口8000
数据库连接字符串:root:123456@(127.0.0.1:3306)/golang
数据库连接成功
map[1:{0 测试查询} 2:{1 欢迎光临} 3:{2 连接MySQL} 4:{3 Go微型服务} 5:{4 这里是RGNote} 6:{5 学习GoLang}]

此时,浏览器显示以下页面:

Go语言实现一个带数据库和模板功能的网站基础结构

将密码改为123,则数据库连接失败,则输出:

数据库连接字符串:root:123@(127.0.0.1:3306)/golang
数据库连接失败,请检查参数

以上代码在go 1.16.3调试通过。

原创文章,作者:AukCode,如若转载,请注明出处:https://www.AukCode.Com/go-language-realizes-a-website-infrastructure-with-database-and-template-functions.html

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注

联系我们

400-800-8888

在线咨询:点击这里给我发消息

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息