社区微信群开通啦,扫一扫抢先加入社区官方微信群
社区微信群
现在的网站可以说登录注册几乎就是首要的,所以今天就给大家来一个简约版的登录吧
先来给大家看一下效果吧
有些过分简洁,大家别见怪啊
接下来是成功的效果
我只是提供一个思路和方法至于美化,大家随意
接下来是失败的效果
接下来就是代码了
前端代码
<html>
<head><title>用户登录</title></head>
<body>
<form action="http://localhost:8080/test" method="post">
用户名:<input type="text" name="name">
密 码:<input type="text" name="pasw">
<input type="submit" value="登录">
</form>
</body>
</html>
后端代码
package main
import (
"fmt"
"io/ioutil"
"net/http"
"database/sql"
_"github.com/Go-SQL-Driver/MySQL"
"reflect"
)
func main() {
http.HandleFunc("/test", hand)
http.HandleFunc("/register",register)
err := http.ListenAndServe(":8080", nil)
if err != nil {
fmt.Println("err")
}
}
func hand(w http.ResponseWriter, r *http.Request) {
db,err := sql.Open("mysql","root:root@tcp(localhost:3306)/yttzcom?charset=utf8")
nam := r.FormValue("name")
pas := r.FormValue("pasw")
query, err := db.Query("select * from tmpdb.tmptab where name = '"+nam+"' and psw = '"+pas+"'")
checkErr(err)
v := reflect.ValueOf(query)
fmt.Println(v)
//number := printResult(query)
dates :=printResult(query)
w.Write([]byte(dates))
defer r.Body.Close()
}
func register(w http.ResponseWriter, r *http.Request){
fmt.Println("register")
w.Write([]byte("there is register!"))
defer r.Body.Close()
body, err := ioutil.ReadAll(r.Body)
if err != nil {
fmt.Println("read err")
}
fmt.Println(string(body))
}
func checkErr(errMasg error) {
if errMasg != nil {
panic(errMasg)
}
}
func printResult(query *sql.Rows) string {
column, _ := query.Columns() //读出查询出的列字段名
values := make([][]byte, len(column)) //values是每个列的值,这里获取到byte里
scans := make([]interface{}, len(column)) //因为每次查询出来的列是不定长的,用len(column)定住当次查询的长度
for i := range values { //让每一行数据都填充到[][]byte里面
scans[i] = &values[i]
}
results := make(map[int]map[string]string) //最后得到的map
i := 0
for query.Next() { //循环,让游标往下移动
if err := query.Scan(scans...); err != nil { //query.Scan查询出来的不定长值放到scans[i] = &values[i],也就是每行都放在values里
fmt.Println(err)
return "3"
}
row := make(map[string]string) //每行数据
for k, v := range values { //每行数据是放在values里面,现在把它挪到row里
key := column[k]
row[key] = string(v)
}
results[i] = row //装入结果集中
i++
}
for k, v := range results { //查询出来的数组
fmt.Println(k)
fmt.Println(v)
record :="<b>登陆成功</b>nid:"+results[k]["id"]+"n"+"用户名:"+results[k]["name"]+"n"+"密码:"+results[k]["psw"]
return record
}
return "<b>用户名或密码错误</b>"
}
是不是有人就会问,如果登录成功了怎么跳转页面呢是不?其实很简单到时只需要在登陆成功的时候加个模板,可是模板要怎么用呢,怎样修改模板里面的内容呢,下面就给大家一个简单的同样是登录的效果,到时只需将登陆成功的模板,修改成你自己的登录成功的页面即可,接下来是效果
前端代码
<html>
<head><title>用户登录</title></head>
<body>
<form action="http://localhost:8080/test" method="post">
用户名:<input type="text" name="name">
密 码:<input type="text" name="pasw">
<input type="submit" value="登录">
</form>
<p><b> {{.Stutas}}</b></P>
</body>
</html>
后端代码
package main
import (
"fmt"
"io/ioutil"
"net/http"
"html/template"
"database/sql"
_"github.com/Go-SQL-Driver/MySQL"
"reflect"
)
type stu struct{
Stutas string
}
func main() {
http.HandleFunc("/test", hand)
http.HandleFunc("/register",register)
http.HandleFunc("/",login)
err := http.ListenAndServe(":8080", nil)
if err != nil {
fmt.Println("err")
}
}
func login(w http.ResponseWriter, r *http.Request){
t, _ := template.ParseFiles("loginss.html")
t.Execute(w,"")
}
func hand(w http.ResponseWriter, r *http.Request) {
db,err := sql.Open("mysql","root:root@tcp(localhost:3306)/yttzcom?charset=utf8")
nam := r.FormValue("name")
pas := r.FormValue("pasw")
query, err := db.Query("select * from tmpdb.tmptab where name = '"+nam+"' and psw = '"+pas+"'")
checkErr(err)
v := reflect.ValueOf(query)
fmt.Println(v)
dates :=printResult(query)
data :=stu{dates}
t, _ := template.ParseFiles("loginss.html")
t.Execute(w,data)
defer r.Body.Close()
}
func register(w http.ResponseWriter, r *http.Request){
fmt.Println("register")
w.Write([]byte("there is register!"))
defer r.Body.Close()
body, err := ioutil.ReadAll(r.Body)
if err != nil {
fmt.Println("read err")
}
fmt.Println(string(body))
}
func checkErr(errMasg error) {
if errMasg != nil {
panic(errMasg)
}
}
func printResult(query *sql.Rows) string {
column, _ := query.Columns() //读出查询出的列字段名
values := make([][]byte, len(column)) //values是每个列的值,这里获取到byte里
scans := make([]interface{}, len(column)) //因为每次查询出来的列是不定长的,用len(column)定住当次查询的长度
for i := range values { //让每一行数据都填充到[][]byte里面
scans[i] = &values[i]
}
results := make(map[int]map[string]string) //最后得到的map
i := 0
for query.Next() { //循环,让游标往下移动
if err := query.Scan(scans...); err != nil { //query.Scan查询出来的不定长值放到scans[i] = &values[i],也就是每行都放在values里
fmt.Println(err)
return "3"
}
row := make(map[string]string) //每行数据
for k, v := range values { //每行数据是放在values里面,现在把它挪到row里
key := column[k]
row[key] = string(v)
}
results[i] = row //装入结果集中
i++
}
for k, v := range results { //查询出来的数组
fmt.Println(k)
fmt.Println(v)
record :="登陆成功"+"n"+"id:"+results[k]["id"]+"n"+"用户名:"+results[k]["name"]+"n"+"密码:"+results[k]["psw"]
return record
}
return "用户名或密码错误"
}
如果有不懂的地方,可以在下方评论和留言
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!