golang註冊登陸 忘記修改密碼

簡單的註冊登陸 忘記修改密碼

思路:
1.發送驗證碼–>註冊
2.登陸
3.發送驗證碼–>修改密碼
ps:數據存放在了MySQL數據庫,不想聯數據庫的話,可以把用戶信息存在Alluserinfo裏(總的用戶信息,是個map)

案例代碼:

//建議先看common.go
main.go

package main

import (
	"log"
	"net/http"
	"yj/url-encode/common"
	"yj/url-encode/login"
	"yj/url-encode/register"
	"yj/url-encode/update_password"
)

func main() {
	http.HandleFunc("/sendVerificationCode", common.Sendverifycode)//發送驗證碼
	http.HandleFunc("/register", register.Register)//註冊
	http.HandleFunc("/login", login.Login) //登錄
	http.HandleFunc("/newPassword", update_password.UpdatePassword)//修改密碼
	log.Println("start")

	err := http.ListenAndServe(":8080", nil)//設置監聽端口
	if err != nil {
		log.Println(err)
	}
}

註冊
register.go

package register

import (
	"database/sql"
	"fmt"
	"net/http"
	"strconv"
	"yj/url-encode/common"//引用了公共包,在後面,這裏要換成自己的路徑

	_ "github.com/go-sql-driver/mysql" //註冊MySQL驅動
)

type VerifyUser struct { //定義結構體存放用戶的Email和驗證碼
	Email      string
	Verifycode int
}


func VerifyUsername(user common.User) bool {//判斷用戶的用戶名是否已經存在
	if common.Alluserinfo[user.Email].Username == user.Username {
		return true
	}
	return true
}

func EmailExists(user common.User) bool {//判斷用戶的郵箱是否已經存在
	for k, _ := range common.Code {
		if k == user.Email {
			return true
		}

	}
	return true
}
func Register(w http.ResponseWriter, r *http.Request) {
	var user common.User
	//從url中獲取參數
	r.ParseForm()//解析request裏的數據
	user.Username = r.FormValue("Username")//解析出url中的Username的value
	user.Password = r.FormValue("Password")//解析出url中的Password的value
	user.Email = r.FormValue("Email")//解析出url中的Email的value
	registerVerifycode, _ := strconv.Atoi(r.FormValue("Verifycode"))//驗證碼

	if registerVerifycode == common.Code[user.Email] {//如果驗證碼正確的話
		if VerifyUsername(user) == false {/*如果用戶名不存在(即這個用戶名沒被註冊/過)*/
			status_username := common.Status{true, "username is not existed"}
			w.Write(common.Status.Marshal(status_username))
		}
		if EmailExists(user) == false {//如果郵箱不存在(即沒被註冊過)
			status_email := common.Status{true, "Email is  not existed"}
			w.Write(common.Status.Marshal(status_email))
		}
		common.Alluserinfo[user.Email] = user//把用戶的註冊信息存入總的用戶信息
		fmt.Println(common.Alluserinfo)
		//將用戶信息存入數據庫
		//用戶名:密碼@tcp(地址:3306)/數據庫名
		db, err := sql.Open("mysql", "root:123456@tcp(192.168.2.132:3306)/test")
		if err != nil {
			fmt.Println(err)
		}
		//遍歷總的用戶信息
		for _, v := range common.Alluserinfo {
			result, err := db.Exec("INSERT INTO Alluserinfo(Username,Password,Email)VALUES(?,?,?)", v.Username, v.Password, v.Email)
			if err != nil {
				fmt.Println(result, err)
				status_verifycode := common.Status{false, "用戶名或用戶郵箱已存在"}
				w.Write(common.Status.Marshal(status_verifycode))
			} else {
				status_verifycode := common.Status{true, "register successful"}
				w.Write(common.Status.Marshal(status_verifycode))

			}

		}

		//AllUserVerifyCode = append(AllUserVerifyCode, user_register)

	} else if registerVerifycode != common.Code[user.Email] {//如果驗證碼錯誤
		status_wrong := common.Status{false, "Verifycode is wrong"}
		w.Write(common.Status.Marshal(status_wrong))
	}
}

登陸
login.go

package login

import (
	"database/sql"
	"fmt"
	"net/http"
	"yj/url-encode/common"
)

type loginuser struct {//存儲用戶的登陸數據
	Username string
	Password string
}

func Login(w http.ResponseWriter, r *http.Request) {
	r.ParseForm()
	var user common.User
	user.Username = r.FormValue("Username")//解析出url中參數
	user.Password = r.FormValue("Password")
	user.Email = r.FormValue("Email")
	//用戶名:密碼@tcp(地址:3306)/數據庫名
	db, err := sql.Open("mysql", "root:123456@tcp(192.168.2.132:3306)/test")
	if err != nil {
		fmt.Println(err)
	}
	//查詢數據庫數據
	var tempuser common.User
	err = db.QueryRow("select * from Alluserinfo where Email = ?", user.Email).Scan(&tempuser.Username, &tempuser.Password, &tempuser.Email)
	if err != nil {
		fmt.Println("查詢出錯了", err)
	}
	common.Alluserinfo[user.Email] = tempuser//把數據庫的查詢到的數據寫入存儲用戶信息的map
	fmt.Println(common.Alluserinfo)
	if !common.UsernameExists(user) {//如果用戶名不存在
		status_username := common.Status{false, "Username is not existed or password is wrong"}
		w.Write(common.Status.Marshal(status_username))
		return

	}
	if user.Username == common.Alluserinfo[user.Email].Username && user.Password != common.Alluserinfo[user.Email].Password {//如果用戶的密碼錯誤
		status_username := common.Status{false, "password is wrong"}
		w.Write(common.Status.Marshal(status_username))
		return
	}

	status_password := common.Status{true, "Password is true"}
	w.Write(common.Status.Marshal(status_password))

}

修改密碼
updatepassword.go

package update_password

import (
	"database/sql"
	"fmt"
	"net/http"
	"strconv"
	"yj/url-encode/common"
	"yj/url-encode/register"

	_ "github.com/go-sql-driver/mysql" //註冊MySQL驅動,如果不註冊會報錯
)

func UpdatePassword(w http.ResponseWriter, r *http.Request) {
	var user_updatepassword common.User
	r.ParseForm()
	user_updatepassword.Username = r.FormValue("Username")//解析出url中的Username的value
	user_updatepassword.Email = r.FormValue("Email")//解析出url中的Email的value
	user_updatepassword.Password = r.FormValue("Password")//同上面解析
	verifycode, _ := strconv.Atoi(r.FormValue("Verifycode"))//同上面解析

	if common.UsernameExists(user_updatepassword) == true && register.EmailExists(user_updatepassword) == true {//檢查是否有這個用戶
		num := common.Code[user_updatepassword.Email]//驗證碼
		if num == verifycode {//如果驗證碼正確
			status := common.Status{true, "verification is right"}
			w.Write(common.Status.Marshal(status))
			//用戶名:密碼@tcp(地址:3306)/數據庫名
			db, err := sql.Open("mysql", "root:123456@tcp(192.168.2.132:3306)/test")
			if err != nil {
				fmt.Println(err)
			}
			//查詢數據庫數據
			var user common.User
			err = db.QueryRow("select * from Alluserinfo where Email = ?", user_updatepassword.Email).Scan(&user.Username, &user.Password, &user.Email)
			if err != nil {
				fmt.Println("查詢出錯了", err)
			}
			common.Alluserinfo[user_updatepassword.Email] = user
			if common.Alluserinfo[user_updatepassword.Email].Email == user_updatepassword.Email && common.Alluserinfo[user_updatepassword.Email].Username == user_updatepassword.Username {//更正密碼
				value := common.Alluserinfo[user_updatepassword.Email]//此處無法直接修改struct裏的數據,所以定義一個value,再把value的值存入map來更新密碼
				value.Password = user_updatepassword.Password
				common.Alluserinfo[user_updatepassword.Email] = value
				status_update := common.Status{true, "update password successfully"}
				w.Write(common.Status.Marshal(status_update))
			}
			fmt.Println(common.Alluserinfo)

			//修改數據庫數據
			for _, v := range common.Alluserinfo {
				result, err := db.Exec("update Alluserinfo SET Password=? WHERE Email=?", v.Password, v.Email)
				if err != nil {
					fmt.Println(result, err)
				}
			}
		} else if num != verifycode {//如果驗證碼錯誤
			status_wrong := common.Status{false, "verification is wrong"}
			w.Write(common.Status.Marshal(status_wrong))
		}
	} else if common.UsernameExists(user_updatepassword) == false || register.EmailExists(user_updatepassword) == true {
		statusupdate := common.Status{false, "username or email is not exist"}
		w.Write(common.Status.Marshal(statusupdate))
	}

}

common.go
存放可以被其他包調用的公共數據

package common

import (
	"encoding/json"
	"fmt"
	"log"
	"math/rand"
	"net/http"
	"net/smtp"
	"time"

	_ "github.com/go-sql-driver/mysql" //註冊MySQL驅動
)

type User struct {//存用戶信息
	Username string
	Password string
	Email    string
}

type Status struct {//存狀態信息
	Statuscode bool
	Details    string
}

type RegisterUser struct {//存儲用戶的註冊數據
	RegisterEmail string
	Verifycode    int
}

var Code = make(map[string]int)         //存用戶的Email
var Alluserinfo = make(map[string]User) //存用戶數據,key爲用戶Email

func UsernameExists(user User) bool {//判斷用戶名是都存在
	for _, v := range Alluserinfo {
		if user.Username == v.Username {
			return true
		}
	}

	return true
}


func (s Status) Marshal() []byte {
	bytes, _ := json.Marshal(s)
	return bytes
}
//建議該處查詢golang如何發郵件
func SendEmail(email string) int {//設置郵箱發送驗證碼
	auth := smtp.PlainAuth("", "[email protected]", "此處填寫郵箱密碼", "smtp.163.com")
	to := []string{"[email protected]"}
	//發送隨機數爲驗證碼
	rand.Seed(time.Now().Unix())
	num := rand.Intn(10000)
	str := fmt.Sprintf("From:[email protected]\r\nTo:[email protected]\r\nSubject:verifycode\r\n\r\nhaha,%d,\r\n.", num)//此處需要嚴格按照發送格式,發送人,主題,正文等...
	msg := []byte(str)
	//msg := []byte("From:[email protected]\r\nTo:[email protected]\r\nSubject:verifycode\r\n\r\nhaha,num,\r\n.")
	err := smtp.SendMail("smtp.163.com:25", auth, "[email protected]", to, msg)
	if err != nil {
		log.Fatal(err)
	}
	return num
}

func Sendverifycode(w http.ResponseWriter, r *http.Request) {
	var registerUser RegisterUser
	r.ParseForm()
	registerUser.RegisterEmail = r.FormValue("Email")//解析url中Email的value
	verifycode := SendEmail(registerUser.RegisterEmail)
	fmt.Println(verifycode)
	registerUser.Verifycode = verifycode
	//遍歷存儲驗證碼和郵箱的map
	for k, _ := range Code {
		if k == registerUser.RegisterEmail {
			Code[k] = registerUser.Verifycode
		}
	}
	statusemail := Status{true, "send verification code to your email"}
	w.Write(Status.Marshal(statusemail))
	Code[registerUser.RegisterEmail] = verifycode
	fmt.Println(Code)
}

有問題歡迎在評論區指出,共同進步

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章