簡單的註冊登陸 忘記修改密碼
思路:
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)
}
有問題歡迎在評論區指出,共同進步