在互联网时代,随着互联网技术的不断进步和人们对信息的需求不断提高,网站和app的注册登录功能也变得越来越常见。本文将介绍如何使用golang语言来实现注册登录功能。
一、golang简介
golang是谷歌公司开发的一种编程语言,它拥有高效的并发处理、垃圾自动回收、极低的编译时间等特点,具有着天然的并发能力和适用于大规模系统的特性。这些特性使得golang成为一个非常优秀的服务器端语言。因此,使用它来实现注册登录功能是一个非常好的选择。
二、环境搭建
要使用golang实现注册登录功能,首先需要在本地环境中安装golang语言。在安装之前,需要先确定自己电脑的操作系统类型 (Windows、Linux、Mac等),并选择对应的golang版本进行下载和安装。
立即学习
“
go语言免费学习笔记(深入)
”;
安装完成后,可以在命令行中输入以下命令来检查是否安装成功:
如果显示golang的版本号,则说明安装成功。
三、注册功能实现
创建项目文件夹
创建一个名为“login”的文件夹,用来放置本次项目的文件。在该文件夹中创建两个文件夹:controller和model。其中,controller用来放置Web接口的控制器代码,model用来放置数据库操作的代码。
数据库连接和建表
在model文件夹中创建一个名为“db.go”的文件,并在其中编写如下代码来建立数据库连接:
上述代码中,使用了第三方库“go-sql-driver/mysql”来实现数据库的连接。在代码中,我们还需要设置一些数据库的基本信息,如用户名、密码、主机地址、端口号以及数据库名称等。
下一步,我们需要创建一个名为“user.sql”的文件,用来编写建立用户表的SQL语句,其中包含用户ID、用户名和密码等字段。
通过执行上述SQL语句,即可在数据库中创建用户表。
编写控制器代码
在controller文件夹中创建一个名为“register.go”的文件,用来编写注册接口的控制器代码。在该文件中,需要导入第三方库“net/http”,并编写如下代码:
上述代码中,我们首先判断请求方式是否为POST。如果是POST请求,则获取到用户名和密码,并对密码进行MD5加密,将加密后的密码和用户名存入数据库中。
在文件最后,使用ioutil.ReadFile()函数来读取一个名为“register.html”的文件,返回该文件的内容至浏览器端。这样浏览器端就可以显示出我们的注册界面。
注册界面编写
在login文件夹中创建一个名为“register.html”的文件,用来编写注册页面的代码。在该页面中,需要使用标签的action属性表示该表单的提交地址,即注册接口的URL地址,method属性表示该表单的提交方式,即使用POST方法提交。
启动服务器
在login文件夹中创建一个名为“main.go”的文件,用来启动服务器。在该文件中,需要导入第三方库“net/http”,并编写如下代码:
在上述代码中,我们使用http.HandleFunc()函数来为注册接口指定路由地址。在程序启动后,可以通过浏览器访问“http://localhost:8080/register”来打开注册界面。
四、登录功能实现
编写控制器代码
在controller文件夹中创建一个名为“login.go”的文件,用来编写登录接口的控制器代码。在该文件中,需要导入第三方库“net/http”和“database/sql”,并编写如下代码:
上述代码中,我们首先判断请求方式是否为POST。如果是POST请求,则获取到用户名和密码,并对密码进行MD5加密。然后,我们根据用户名和密码查询数据库,如果查询结果不为空则表示登录成功,否则则表示登录失败。
在文件最后,我们再读取两个名为“success.html”和“fail.html”的文件,分别用于表示登录成功和失败后的页面内容。
登录界面编写
在login文件夹中创建一个名为“login.html”的文件,用来编写登录页面的代码。该页面与注册页面类似,也需要使用 标签和标签来获取到用户名和密码信息,并将这些信息提交到后端进行处理。具体代码如下:
成功和失败页面编写
在login文件夹中创建一个名为“success.html”的文件,用来编写登录成功后的页面代码。具体代码如下:
在login文件夹中再创建一个名为“fail.html”的文件,用来编写登录失败后的页面代码。具体代码如下:
注册接口路由修改
在“main.go”文件中,将注册接口路由的地址改为“/”即可。最终代码如下:
五、总结
本文介绍了如何使用golang语言来实现注册登录功能。通过本文的学习,我们可以看到golang语言实现简洁高效、性能优越,适合用于实现服务器端开发。同时,本文也向读者展示了如何使用golang与数据库进行交互,以及如何使用golang实现Web接口的功能。希望本文能够为读者带来一些参考和启发。
go versionpackage model
import (
"database/sql"
"fmt"
_ "github.com/go-sql-driver/mysql"
)
const (
USERNAME = "root"
PASSWORD = ""
NETWORK = "tcp"
SERVER = "localhost"
PORT = 3306
DATABASE = "login_system"
)
func DbConn() (db *sql.DB) {
dbDriver := "mysql"
dbUser := USERNAME
dbPass := PASSWORD
dbName := DATABASE
db, err := sql.Open(dbDriver, dbUser+":"+dbPass+"@tcp("+SERVER+":"+strconv.Itoa(PORT)+")/"+dbName)
if err != nil {
fmt.Println("无法连接数据库:", err)
} else {
fmt.Println("成功连接数据库!")
}
return db
}CREATE TABLE `user` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`username` varchar(20) NOT NULL,
`password` varchar(40) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;package controller
import (
"crypto/md5"
"database/sql"
"encoding/hex"
"fmt"
"io/ioutil"
"net/http"
"server/model"
)
func Register(w http.ResponseWriter, r *http.Request) {
if r.Method == "POST" {
username := r.FormValue("username")
password := r.FormValue("password")
// 密码加密
h := md5.New()
h.Write([]byte(password))
password = hex.EncodeToString(h.Sum(nil))
// 数据库操作
db := model.DbConn()
defer db.Close()
stmt, err := db.Prepare("INSERT INTO user(username, password) VALUES (?, ?)")
if err != nil {
fmt.Println("SQL语句执行失败:", err)
return
}
_, err = stmt.Exec(username, password)
if err != nil {
fmt.Println("用户注册失败:", err)
return
}
fmt.Println("用户注册成功!")
}
// 返回页面内容
data, err := ioutil.ReadFile("register.html")
if err != nil {
fmt.Println("读取文件失败:", err)
return
}
w.Write([]byte(data))
}package main
import (
"net/http"
"login/controller"
)
func main() {
// 注册接口路由
http.HandleFunc("/register", controller.Register)
// 启动服务器
http.ListenAndServe(":8080", nil)
}package controller
import (
"crypto/md5"
"database/sql"
"encoding/hex"
"fmt"
"io/ioutil"
"net/http"
"server/model"
)
func Login(w http.ResponseWriter, r *http.Request) {
if r.Method == "POST" {
username := r.FormValue("username")
password := r.FormValue("password")
h := md5.New()
h.Write([]byte(password))
password = hex.EncodeToString(h.Sum(nil))
// 根据用户名和密码查询数据库
db := model.DbConn()
defer db.Close()
rows, err := db.Query("SELECT * FROM user WHERE username=? AND password=?", username, password)
if err != nil {
fmt.Println("SQL语句执行失败:", err)
return
}
defer rows.Close()
if rows.Next() {
fmt.Println("登录成功!")
// 返回登录成功页面
data, err := ioutil.ReadFile("success.html")
if err != nil {
fmt.Println("读取文件失败:", err)
return
}
w.Write([]byte(data))
} else {
fmt.Println("用户名或密码不正确!")
// 返回登录失败页面
data, err := ioutil.ReadFile("fail.html")
if err != nil {
fmt.Println("读取文件失败:", err)
return
}
w.Write([]byte(data))
}
}
// 返回登录页面
data, err := ioutil.ReadFile("login.html")
if err != nil {
fmt.Println("读取文件失败:", err)
return
}
w.Write([]byte(data))
}
登录
用户名:
密码:
登录成功
恭喜,登录成功!
登录失败
对不起,用户名或密码错误!
package main
import (
"net/http"
"login/controller"
)
func main() {
// 注册接口路由
http.HandleFunc("/", controller.Register)
// 登录接口路由
http.HandleFunc("/login", controller.Login)
// 启动服务器
http.ListenAndServe(":8080", nil)
}