go+bootstrap实现简单的注册登录和管理

概述

使用,go+mysql实现了用户的登录,注册,和管理的简单功能,不同用户根据不同权限显示不同的内容

实战要求:

1、用户可以注册、登录;
2、登录后可以查看所有的注册的用户;
3、管理员操作对用户有删除和编辑权限。(不使用3方的web框架)
4、普通用户登录后可以查看所有用户,不能编辑、删除;

结构:

界面展示

在这里插入图片描述

在这里插入图片描述

go相关代码

db.go

package srcimport ("database/sql""fmt"_ "github.com/go-sql-driver/mysql""log"
)var mdb *sql.DBfunc InitDB() {var err errormdb, err = sql.Open("mysql", "root:5201314@tcp(127.0.0.1:3306)/user_management")//数据库连接账号密码if err != nil {log.Println("数据库连接失败", err)return} else {log.Println("数据库连接成功")}
}func SelectPersonal(email string) (id int, isAdmin bool) {log.Println("SelectPersonal")err := mdb.QueryRow("select id,is_admin from users where username = ?", email).Scan(&id, &isAdmin)if err != nil {log.Println("SelectPersona", err)}log.Println("SelectPersonal over")return id, isAdmin
}func SelectAll() *sql.Rows {log.Println("SelectAll")stmt, err := mdb.Prepare("select * from users")if err != nil {log.Println("预处理失败")}rows, err := stmt.Query()if err != nil {log.Println("获取结果失败")}log.Println("SelectAll over")return rows
}func SelectPassword(email string) string {log.Println("SelectPassword")var storedPassword stringerr := mdb.QueryRow("select password from users where username = ?", email).Scan(&storedPassword)if err != nil {log.Println(err)}log.Println("SelectPassword over")return storedPassword
}
func AddUser(email string, password string) bool {log.Println("AddUser")stmt, err := mdb.Prepare("insert into users values (default,?,?,false)")if err != nil {fmt.Println("预处理失败")return false}r, err := stmt.Exec(email, password)if err != nil {fmt.Println("sql执行失败")return false}count, err := r.RowsAffected()if err != nil {fmt.Println("结果获取失败")return false}if count > 0 {log.Println("AddUser over")fmt.Println("新增成功")return true} else {fmt.Println("用户创建失败")return false}
}
func IsExist(email string) bool {var emailExists boolerr := mdb.QueryRow("select exists(select 1 from users where username = ?)", email).Scan(&emailExists)if err != nil {log.Println(err)}return emailExists
}func IsAdminEmail(email string) bool {var emailExists boolerr := mdb.QueryRow("select is_admin from users where username = ?", email).Scan(&emailExists)if err != nil {log.Println(err)}return emailExists
}
func RemoveUser(id int) bool {log.Println("RemoveUser")stmt, err := mdb.Prepare("delete from users where id=?")if err != nil {fmt.Println("预处理失败")return false}r, err := stmt.Exec(id)if err != nil {fmt.Println("sql执行失败")return false}count, err := r.RowsAffected()if err != nil {fmt.Println("结果获取失败")return false}if count > 0 {log.Println("ARemoveUser over")fmt.Println("删除成功")return true} else {fmt.Println("用户删除失败")return false}
}
func IsAdminId(id int) bool {var emailExists boolerr := mdb.QueryRow("select is_admin from users where id = ?", id).Scan(&emailExists)if err != nil {log.Println(err)}return emailExists
}func Manager(id int) bool {log.Println("Manager")stmt, err := mdb.Prepare("update users set is_admin = ? where id=?")if err != nil {fmt.Println("预处理失败")return false}r, err := stmt.Exec(true, id)if err != nil {fmt.Println("sql执行失败")return false}count, err := r.RowsAffected()if err != nil {fmt.Println("结果获取失败")return false}if count > 0 {log.Println("Manager over")fmt.Println("管理员设置成功")return true} else {fmt.Println("管理员设置失败")return false}
}func RemoveManager(id int) bool {log.Println("RemoveManager")if id == 1 {return false}stmt, err := mdb.Prepare("update users set is_admin = ? where id=?")if err != nil {fmt.Println("预处理失败")return false}r, err := stmt.Exec(false, id)if err != nil {fmt.Println("sql执行失败")return false}count, err := r.RowsAffected()if err != nil {fmt.Println("结果获取失败")return false}if count > 0 {log.Println("RemoveManager over")fmt.Println("管理员移除成功")return true} else {fmt.Println("用户删除失败")return false}
}
func ChangePassword(email string, newPassword string) bool {log.Println("ChangePassword")stmt, err := mdb.Prepare("update users set password = ? where username=?")if err != nil {fmt.Println("预处理失败")return false}r, err := stmt.Exec(newPassword, email)if err != nil {fmt.Println("sql执行失败")return false}count, err := r.RowsAffected()if err != nil {fmt.Println("结果获取失败")return false}if count > 0 {log.Println("ChangePassword over")fmt.Println("密码修改成功")return true} else {fmt.Println("密码修改失败")return false}
}

main代码

package mainimport ("github.com/gorilla/mux""log""net/http""webTest2.0/src"
)func main() {src.InitDB()r := mux.NewRouter()r.HandleFunc("/login", src.Login).Methods("GET")r.HandleFunc("/login/{url}", src.LoginHandler).Methods("POST")r.HandleFunc("/index/{url}", src.IndexHandler).Methods("POST", "DELETE")r.HandleFunc("/", src.Index).Methods("GET")r.PathPrefix("/bootstrap5/").Handler(http.StripPrefix("/bootstrap5/", http.FileServer(http.Dir("bootstrap5"))))log.Println("Starting server on :8090")if err := http.ListenAndServe(":8090", r); err != nil {log.Fatalf("Could not start server: %v", err)}
}

index.go

package srcimport ("encoding/json""github.com/gorilla/mux""html/template""log""net/http""strconv"
)type User struct {ID      intName    stringIsAdmin bool
}
type Personal struct {ID      intName    stringIsAdmin bool
}
type UserId struct {UserID string `json:"userId"`
}
type Password struct {OldPassword stringNewPassword string
}
type MyErr struct{}func (e *MyErr) Error() string {return "logout"
}func Index(w http.ResponseWriter, r *http.Request) {log.Println("index")personal, err := CookieMessage(r)if err != nil {http.Redirect(w, r, "/login", http.StatusSeeOther)return}rows := SelectAll()users := make([]User, 0)for rows.Next() {name := ""id := 0var ignored interface{}isAdmin := falserows.Scan(&id, &name, &ignored, &isAdmin)users = append(users, User{id, name, isAdmin})}tmpl, err := template.ParseFiles("view/index.html")if err != nil {log.Println("login.html打开失败:", err)http.Error(w, "Internal Server Error", http.StatusInternalServerError)return}err = tmpl.Execute(w, map[string]interface{}{"Users":    users,"Personal": personal,})if err != nil {log.Println("模板执行失败:", err)http.Error(w, "Internal Server Error", http.StatusInternalServerError)}
}
func IndexHandler(w http.ResponseWriter, r *http.Request) {log.Println("IndexHandler")vars := mux.Vars(r)log.Println(vars)switch vars["url"] {case "delete":deleteUser(w, r)case "updateAdmin":addAdmin(w, r)case "removeAdmin":removeAdmin(w, r)case "changePassword":changePassword(w, r)case "logout":logout(w)}
}
func CookieMessage(r *http.Request) (Personal, error) {c, err := r.Cookie("email")if err != nil {// 如果获取 Cookie 失败,返回错误return Personal{}, err}if c.Value == "logout" {return Personal{}, &MyErr{}}id, isAdmin := SelectPersonal(c.Value)log.Println(id, isAdmin)personal := Personal{id,c.Value,isAdmin,}return personal, nil
}func changePassword(w http.ResponseWriter, r *http.Request) {log.Println("changePassword")response := make(map[string]string)c, err := r.Cookie("email")if err != nil {response["success"] = "false"response["message"] = "cookie获取失败"w.Header().Set("Content-Type", "application/json")json.NewEncoder(w).Encode(response)return}var password Passworderr = json.NewDecoder(r.Body).Decode(&password)if err != nil {response["success"] = "false"response["message"] = "客户端信息解析错误"w.Header().Set("Content-Type", "application/json")json.NewEncoder(w).Encode(response)http.Error(w, "Invalid request payload", http.StatusBadRequest)return}log.Println(password.NewPassword, password.OldPassword)if password.NewPassword == SelectPassword(c.Value) {response["success"] = "false"response["message"] = "新秘密与旧密码相同"w.Header().Set("Content-Type", "application/json")json.NewEncoder(w).Encode(response)return}if password.OldPassword == SelectPassword(c.Value) {if ChangePassword(c.Value, password.NewPassword) {response["success"] = "true"response["message"] = "密码修改成功"w.Header().Set("Content-Type", "application/json")json.NewEncoder(w).Encode(response)return} else {response["success"] = "false"response["message"] = "密码修改失败"w.Header().Set("Content-Type", "application/json")json.NewEncoder(w).Encode(response)return}} else {response["success"] = "false"response["message"] = "旧密码错误"w.Header().Set("Content-Type", "application/json")json.NewEncoder(w).Encode(response)}}
func deleteUser(w http.ResponseWriter, r *http.Request) {log.Println("deleteUser")response := make(map[string]string)c, err := r.Cookie("email")if err != nil {response["success"] = "false"response["message"] = "cookie获取失败"w.Header().Set("Content-Type", "application/json")json.NewEncoder(w).Encode(response)return}var Id UserIderr = json.NewDecoder(r.Body).Decode(&Id)if err != nil {http.Error(w, "Invalid request payload", http.StatusBadRequest)return}deleteId, err := strconv.Atoi(Id.UserID)king := IsAdminId(deleteId)id, isAdmin := SelectPersonal(c.Value)if isAdmin {if id == 1 {RemoveUser(deleteId)response["success"] = "true"response["message"] = "删除成功"} else if !king {RemoveUser(deleteId)response["success"] = "true"response["message"] = "删除成功"}w.Header().Set("Content-Type", "application/json")json.NewEncoder(w).Encode(response)}log.Println("deleteUser over")
}
func addAdmin(w http.ResponseWriter, r *http.Request) {log.Println("addAdmin")response := make(map[string]string)c, err := r.Cookie("email")if err != nil {response["success"] = "false"response["message"] = "cookie获取失败"w.Header().Set("Content-Type", "application/json")json.NewEncoder(w).Encode(response)return}id, _ := SelectPersonal(c.Value)log.Println(id)if id != 1 {response["success"] = "false"response["message"] = "用户权限不足"w.Header().Set("Content-Type", "application/json")json.NewEncoder(w).Encode(response)return}var Id UserIderr = json.NewDecoder(r.Body).Decode(&Id)log.Println(Id.UserID)if err != nil {log.Println(err)http.Error(w, "Invalid request payload", http.StatusBadRequest)return}updateId, err := strconv.Atoi(Id.UserID)Manager(updateId)response["success"] = "true"response["message"] = "管理员设置成功"w.Header().Set("Content-Type", "application/json")json.NewEncoder(w).Encode(response)log.Println("addAdmin over")
}func removeAdmin(w http.ResponseWriter, r *http.Request) {response := make(map[string]string)c, err := r.Cookie("email")if err != nil {response["success"] = "false"response["message"] = "cookie获取失败"w.Header().Set("Content-Type", "application/json")json.NewEncoder(w).Encode(response)return}id, _ := SelectPersonal(c.Value)if id != 1 {response["success"] = "false"response["message"] = "用户权限不足"w.Header().Set("Content-Type", "application/json")json.NewEncoder(w).Encode(response)return}var Id UserIderr = json.NewDecoder(r.Body).Decode(&Id)log.Println(Id.UserID)if err != nil {log.Println(err)http.Error(w, "Invalid request payload", http.StatusBadRequest)return}deleteId, err := strconv.Atoi(Id.UserID)RemoveManager(deleteId)response["success"] = "true"response["message"] = "管理员移除成功"w.Header().Set("Content-Type", "application/json")json.NewEncoder(w).Encode(response)
}func logout(w http.ResponseWriter) {log.Println("loginOut")http.SetCookie(w, &http.Cookie{Name:     "email",Value:    "logout",MaxAge:   5,Path:     "/",HttpOnly: true,SameSite: http.SameSiteLaxMode,})json.NewEncoder(w).Encode(map[string]interface{}{"success": true})log.Println("loginOut over")
}

login.go

package srcimport ("encoding/json""fmt""github.com/gorilla/mux""html/template""log""net/http"
)type LoginRequest struct {Email    string `json:"email"`Password string `json:"password"`
}func Login(w http.ResponseWriter, r *http.Request) {_, err := CookieMessage(r)if err == nil {http.Redirect(w, r, "/", http.StatusSeeOther)return}log.Println("Login")tmpl, err := template.ParseFiles("view/login.html")if err != nil {log.Println("login.html打开失败:", err)http.Error(w, "Internal Server Error", http.StatusInternalServerError)return}err = tmpl.Execute(w, nil)if err != nil {log.Println("模板执行失败:", err)http.Error(w, "Internal Server Error", http.StatusInternalServerError)}
}
func LoginHandler(w http.ResponseWriter, r *http.Request) {log.Println("LoginHandler")vars := mux.Vars(r)fmt.Println(vars)log.Println("loginHandler")switch vars["url"] {case "login":var req LoginRequesterr := json.NewDecoder(r.Body).Decode(&req)if err != nil {http.Error(w, "Invalid request payload", http.StatusBadRequest)return}log.Printf("Received login request: Email: %s  password: %s\n", req.Email, req.Password)emailExists := IsExist(req.Email)if !emailExists {response := map[string]string{"success": "false", "message": "用户不存在"}w.Header().Set("Content-Type", "application/json")json.NewEncoder(w).Encode(response)return}storedPassword := SelectPassword(req.Email)log.Println(storedPassword)if storedPassword != req.Password {response := map[string]string{"success": "false", "message": "密码错误"}w.Header().Set("Content-Type", "application/json")json.NewEncoder(w).Encode(response)return}c := http.Cookie{Name:     "email",Value:    req.Email,Path:     "/",HttpOnly: true,Secure:   true,MaxAge:   3600,}http.SetCookie(w, &c)response := map[string]string{"success": "true", "message": ""}w.Header().Set("Content-Type", "application/json")json.NewEncoder(w).Encode(response)case "register":var req LoginRequesterr := json.NewDecoder(r.Body).Decode(&req)if err != nil {http.Error(w, "Invalid request payload", http.StatusBadRequest)return}log.Printf("Received login request: Email: %s  password: %s\n", req.Email, req.Password)emailExists := IsExist(req.Email)if !emailExists {king := AddUser(req.Email, req.Password)response := make(map[string]string)if king {response["success"] = "true"response["message"] = "注册成功"} else {response["success"] = "false"response["message"] = "注册失败"}w.Header().Set("Content-Type", "application/json")json.NewEncoder(w).Encode(response)return} else {response := map[string]string{"success": "false", "message": "用户已存在"}w.Header().Set("Content-Type", "application/json")json.NewEncoder(w).Encode(response)return}default:http.Error(w, "Method Not Allowed", http.StatusMethodNotAllowed)}
}

html相关代码

index.html

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>用户管理系统</title><link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0-alpha1/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-GLhlTQ8iRABdZLl6O3oVMWSktQOp6b7In1Zl3/Jr59b6EGGoI1aFkw7cmDA6j6gD" crossorigin="anonymous"><script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0-alpha1/dist/js/bootstrap.bundle.min.js" integrity="sha384-/mhDoLbDldZc3qpsJHpLogda//BVZbgYuw6kof4u2FrCedxOtgRZDTHgHUhOCVim" crossorigin="anonymous"></script><style>.content-block {display: none;}.content-block:first-of-type {display: block;}</style>
</head>
<body>
<div class="container p-4"><div class="row"><div class="text-xxl-center list-group"><h1>用户管理系统</h1></div></div>
</div>
<div class="container"><div class="row"><div class="col-3"><div id="list-example" class="list-group"><a class="list-group-item list-group-item-action-active text-xxl-center list-group-item-primary" href="#list-item-1">个人</a><a class="list-group-item list-group-item-action text-xxl-center list-group-item-primary" href="#list-item-2">其他</a><a class="list-group-item list-group-item-action text-xxl-center list-group-item-primary" href="#list-item-3">设置</a></div></div><div class="col-9"><div data-bs-spy="scroll" data-bs-target="#list-example" data-bs-smooth-scroll="true" class="scrollspy-example" tabindex="0"><div id="list-item-1" class="content-block"><table class="table"><thead><tr><th scope="col">用户ID:</th><th scope="col">{{.Personal.ID}}</th></tr></thead><tbody><tr><th scope="row">用户昵称:</th><td>{{.Personal.Name}}</td></tr><tr><th scope="row">用户身份:</th>{{if and .Personal.IsAdmin (eq .Personal.ID 1)}}<td>超级管理员</td>{{else if .Personal.IsAdmin}}<td>管理员</td>{{else}}<td>普通成员</td>{{end}}</tr></tbody></table></div><div id="list-item-2" class="content-block"><table class="table"><thead><tr><th scope="col">ID</th><th scope="col">用户</th><th scope="col">身份</th>{{if and .Personal.IsAdmin (eq .Personal.ID 1)}}<th scope="col">管理</th>{{end}}{{if .Personal.IsAdmin}}<th scope="col">删除</th>{{end}}</tr></thead><tbody>{{range .Users}}<tr><th scope="row">{{.ID}}</th><td>{{.Name}}</td>{{if and .IsAdmin (eq .ID 1)}}<td>超级管理员</td>{{else if .IsAdmin}}<td>管理员</td>{{else}}<td>普通用户</td>{{end}}{{if eq $.Personal.ID 1}}{{if eq .ID 1}}{{else if .IsAdmin}}<td><button type="button" class="btn btn-primary remove-user-btn" data-id="{{.ID}}">移除管理员</button></td><td><button type="button" class="btn btn-danger delete-user-btn" data-id="{{.ID}}">删除</button></td>{{else}}<td><button type="button" class="btn btn-primary manage-user-btn" data-id="{{.ID}}">设置管理员</button></td><td><button type="button" class="btn btn-danger delete-user-btn" data-id="{{.ID}}">删除</button></td>{{end}}{{else if $.Personal.IsAdmin}}{{if not .IsAdmin}}<td><button type="button" class="btn btn-danger delete-user-btn" data-id="{{.ID}}">删除</button></td>{{end}}{{end}}</tr>{{end}}</tbody></table></div><div id="list-item-3" class="content-block"><div class="container"><div class="row"><div class="text-xxl-center col-6"><button type="button" class="btn btn-primary" id="change-password-btn">修改密码</button></div><div class="col-6"><button type="button" class="btn btn-primary" id="logout-btn">退出登录</button></div></div></div></div></div></div></div>
</div><div class="modal fade" id="changePasswordModal" tabindex="-1" aria-labelledby="changePasswordModalLabel" aria-hidden="true"><div class="modal-dialog"><div class="modal-content"><div class="modal-header"><h5 class="modal-title" id="changePasswordModalLabel">修改密码</h5><button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button></div><div class="modal-body"><form id="change-password-form"><div class="mb-3"><label for="old-password" class="form-label">旧密码</label><input type="password" class="form-control" id="old-password" required></div><div class="mb-3"><label for="new-password" class="form-label">新密码</label><input type="password" class="form-control" id="new-password" required></div><div class="mb-3"><label for="confirm-password" class="form-label">确认新密码</label><input type="password" class="form-control" id="confirm-password" required></div></form></div><div class="modal-footer"><button type="button" class="btn btn-secondary" data-bs-dismiss="modal">取消</button><button type="button" class="btn btn-primary" id="submit-change-password">确定</button></div></div></div>
</div>
<script>document.querySelectorAll('#list-example a').forEach(anchor => {anchor.addEventListener('click', function (e) {e.preventDefault();const targetId = this.getAttribute('href');document.querySelectorAll('.content-block').forEach(block => {block.style.display = 'none';});document.querySelector(targetId).style.display = 'block';});});// 管理用户document.querySelectorAll('.manage-user-btn').forEach(button => {button.addEventListener('click', function() {const userId = this.getAttribute('data-id');if (confirm('确定要设置当前用户为管理员吗?')) {fetch(`/index/updateAdmin`, {method: 'POST',headers: {'Content-Type': 'application/json'},body: JSON.stringify({ "userId":userId })}).then(response => response.json()).then(data => {if (data.success === "true") {alert('用户已成功设置成管理员!');location.reload();} else {alert('设置管理员失败:' + data.message);}});}});});document.querySelectorAll('.remove-user-btn').forEach(button => {button.addEventListener('click', function() {const userId = this.getAttribute('data-id');if (confirm('确定要取消当前用户管理员身份吗?')) {fetch(`/index/removeAdmin`, {method: 'POST',headers: {'Content-Type': 'application/json'},body: JSON.stringify({ "userId":userId })}).then(response => response.json()).then(data => {if (data.success === "true") {alert('已成功取消当前用户管理员身份!');location.reload();} else {alert('取消当前用户管理员身份失败:' + data.message);}});}});});// 删除用户document.querySelectorAll('.delete-user-btn').forEach(button => {button.addEventListener('click', function() {const userId = this.getAttribute('data-id');if (confirm('确定要删除该用户吗?')) {fetch(`/index/delete`, {method: 'DELETE',headers: {'Content-Type': 'application/json'},body: JSON.stringify({ "userId":userId }),}).then(response => response.json()).then(data => {if (data.success === "true") {alert('用户已成功删除!');location.reload();} else {alert('删除用户失败:' + data.message);}});}});});document.getElementById('logout-btn').addEventListener('click', function() {fetch('/index/logout', {method: 'POST',headers: {'Content-Type': 'application/json'},credentials: 'include'}).then(response => response.json()).then(data => {if (data.success) {alert('注销成功');window.location.href="/";} else {alert('注销失败:' + data.message);}});});document.addEventListener('DOMContentLoaded', function() {const changePasswordModal = new bootstrap.Modal(document.getElementById('changePasswordModal'));document.getElementById('change-password-btn').addEventListener('click', function () {changePasswordModal.show();});document.getElementById('submit-change-password').addEventListener('click', function () {const oldPassword = document.getElementById('old-password').value;const newPassword = document.getElementById('new-password').value;const confirmPassword = document.getElementById('confirm-password').value;if (newPassword !== confirmPassword) {alert('新密码和确认密码不一致!');return;}fetch('/index/changePassword', {method: 'POST',headers: {'Content-Type': 'application/json'},body: JSON.stringify({"oldPassword": oldPassword,"newPassword": newPassword})}).then(response => response.json()).then(data => {if (data.success === "true") {alert('密码已成功更改!');changePasswordModal.hide();} else {if (data.message === "新秘密与旧密码相同"){alert('新秘密与旧密码相同');}alert('更改密码失败:' + data.message);}});});});</script></body>
</html>

login.html

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>登录</title><link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0-alpha1/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-GLhlTQ8iRABdZLl6O3oVMWSktQOp6b7In1Zl3/Jr59b6EGGoI1aFkw7cmDA6j6gD" crossorigin="anonymous"><script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0-alpha1/dist/js/bootstrap.bundle.min.js" integrity="sha384-/mhDoLbDldZc3qpsJHpLogda//BVZbgYuw6kof4u2FrCedxOtgRZDTHgHUhOCVim" crossorigin="anonymous"></script>
</head>
<body>
<div class="container"><form id="loginForm" onsubmit="return handleSubmit(event, 'login')"><div class="col-4 mx-auto"><div class="col-md-4 mx-auto p-6"><h2>登录/注册</h2></div></div><div class="col-4 mx-auto"><label for="exampleInputEmail1" class="form-label">邮箱地址</label><input type="email" class="form-control" id="exampleInputEmail1" aria-describedby="emailHelp"></div><div class="col-4 mx-auto"><label for="exampleInputPassword1" class="form-label">密码</label><input type="password" class="form-control" id="exampleInputPassword1"></div><div class="col-4 mx-auto"><button type="submit" class="col-12 btn-outline-primary p-2">登录</button></div><div class="col-4 mx-auto"><button type="button" class="col-12 btn-outline-primary p-2" onclick="handleSubmit(event, 'register')">注册</button></div></form>
</div><script>function handleSubmit(event, action) {event.preventDefault();const email = document.getElementById('exampleInputEmail1').value;const password = document.getElementById('exampleInputPassword1').value;const url = action === 'login' ? '/login/login' : '/login/register';fetch(url, {method: 'POST',headers: {'Content-Type': 'application/json',},body: JSON.stringify({ email, password }),}).then(response => response.json()).then(data => {if (data.success === "true") {if (action === 'login') {alert('登录成功!');window.location.href = '/';} else if (action === 'register') {alert('注册成功,请登录!');}} else {if (data.message === "用户不存在") {alert('用户不存在,请先注册');} else if (data.message === "密码错误") {alert('密码错误,请重新输入');} else if (data.message === "用户已存在") {alert('用户已存在,请直接登录');} else {alert('请求失败,请稍后再试');}}}).catch((error) => {console.error('Error:', error);alert('请求错误,请稍后再试');});}
</script></body>
</html>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/452184.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Gin框架操作指南03:HTML渲染

官方文档地址&#xff08;中文&#xff09;&#xff1a;https://gin-gonic.com/zh-cn/docs/ 注&#xff1a;本教程采用工作区机制&#xff0c;所以一个项目下载了Gin框架&#xff0c;其余项目就无需重复下载&#xff0c;想了解的读者可阅读第一节&#xff1a;Gin操作指南&#…

【Petri网导论学习笔记】Petri网导论入门学习(八) —— 1.6 系统的Petri网模型

导航 1.6 系统的Petri网模型例 1.6 化学反应例 1.7 进程的通信协议例 1.8 P/V操作例 1.9 临界段互斥问题例 1.10 生产者/消费者问题例 1.11 哲学家就餐问题 1.6 系统的Petri网模型 理论的目的在于应用&#xff0c;接下来是一些关于用Petri网标识离散事件系统的例子 这里就直接…

电能表预付费系统-标准传输规范(STS)(13)

6.3 Token data elements 令牌数据元素 6.3.1 Data elements used in tokens 使用在令牌上的数据元素 The data elements given in Table 1 3 are used in tokens in various combinations and are all encoded in binary format. 表13中给出的数据元素以各种组合用于令牌中&…

DISTINCT 去重

1. 单字段去重 以表 student_course 和 表 student 链接为例&#xff1a; SELECT * FROM student_course a INNER JOIN student b ON a.student_idb.id;查询结果如下图&#xff1a; 上图查询结果中&#xff0c;若只需要学生信息&#xff0c;则需要对结果进行去重&#xff1a;…

从零开始学PHP之helloworld

前言 每一门编程语言的第一个程序就是输出hell world&#xff08;别杠&#xff0c;杠就是你对&#xff09; 开始 上一篇讲完了开发环境的安装&#xff0c;这次讲编辑器的安装&#xff0c;顺带完成上一篇的作业&#xff08;输出hello world&#xff09; 安装PHPstorm 我用的…

分布式介绍

CAP理论 CAP理论是分布式架构中提出来的一种设计思想模型&#xff0c;全称是由Consistency、Availability、Partition Tolerance三个词组成。 C(Consistency&#xff0c;一致性):总能读到最新的写操作的结果A(Availability&#xff0c;可用性):每个请求都要在合理的时间内给出…

如何将本地 Node.js 服务部署到宝塔面板:完整的部署指南

文章简介&#xff1a; 将本地开发的 Node.js 项目部署到线上服务器是开发者常见的工作流程之一。在这篇文章中&#xff0c;我将详细介绍如何将本地的 Node.js 服务通过宝塔面板&#xff08;BT 面板&#xff09;上线。宝塔面板是一个强大的服务器管理工具&#xff0c;具有简洁的…

使用 Go 语言实现 WebSocket的核心逻辑

文章目录 WebSocket 简介时序图核心逻辑Client 结构与功能创建新客户端消息读取逻辑 (ReadPump)发送消息逻辑 (Send)客户端管理器 (ClientManager)WebSocket 处理器处理心跳与长连接 总结 本文将基于 Go 语言&#xff0c;通过使用 gorilla/websocket 库来实现一个简单的聊天应用…

教电脑“看”图片

教电脑“看”图片 计算机视觉简介 上一篇&#xff1a;《自己DIY首个人工智能模型》 序言&#xff1a;人是如何“看”图片的&#xff1f;人类感知周围世界&#xff0c;主要依赖看、听、闻、触这些感官&#xff0c;而“看”是最普遍和直观的方式。计算机视觉&#xff0c;就是对…

前端html,css 样式巩固1

想做这样 一个效果 点击图片切换 当前的选中图片 我们使用 原生的js html 来开发这个 直接粘贴代码 相信大家 都能看懂的 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" …

力扣动态规划基础版(斐波那契类型)

70. 爬楼梯https://leetcode.cn/problems/climbing-stairs/ 70.爬楼梯 方法一 动态规划 考虑转移方程和边界条件&#xff1a; f&#xff08;x&#xff09; f&#xff08;x -1&#xff09; f&#xff08;x - 2&#xff09;;f&#xff08;1&#xff09; 1&#xff1b;f&…

CNN-BiLSTM回归预测 | MATLAB实现CNN-BiLSTM卷积双向长短期记忆神经网络多输入单输出回归预测

回归预测 | MATLAB实现CNN-BiLSTM(卷积双向长短期记忆神经网络)多输入单输出 目录 回归预测 | MATLAB实现CNN-BiLSTM(卷积双向长短期记忆神经网络)多输入单输出效果一览基本介绍程序设计学习总结参考资料效果一览 基本介绍 提出一种同时考虑时间与空间因素的卷积-双向长短期记…

UART协议

文章目录 UART 协议主要特点UART控制器组成部分工作流程 UART寄存器(fs4412)输入输出重定向 UART 协议 UART&#xff08;Universal Asynchronous Receiver/Transmitter&#xff0c;通用异步收发传输器&#xff09;是一种串行通信协议&#xff0c;用于在计算机或外设之间进行数…

java集合进阶篇-《Collection集合》

个人主页→VON 收录专栏→java从入门到起飞 目录 一、前言 二、Collection集合简要概述 Collection的主要实现 Collection的方法 迭代器&#xff08;Iterator&#xff09; 三、单列集合顶层接口Collection CollectionDemo01 CollectionDemo02 CollectionDemo03 Collec…

问题记录:matlab中spatial contact force模块下关于stiffness(刚度)的设定

最近在搞一阶倒立摆&#xff0c;在matlab仿真时遇到这样的问题&#xff1a;stiffness设置为10e5就会发生碰撞后穿透&#xff0c;&#xff08;四个spatial contact force模块是分别连接小车四个轮子和地面的&#xff09; 而设置成10e6就不会有问题&#xff0c; 由于本人也是第一…

微信小程序上传组件封装uploadHelper2.0使用整理

一、uploadHelper2.0使用步骤说明 uploadHelper.js ---上传代码封装库 cos-wx-sdk-v5.min.js---腾讯云&#xff0c;对象存储封装库 第一步&#xff0c;下载组件代码&#xff0c;放置到自己的小程序项目中 第二步、 创建上传对象&#xff0c;执行选择图片/视频 var _this th…

【H2O2|全栈】关于CSS(14)如何完成常规的页面布局

目录 基本布局方式 前言 准备工作 管理系统界面 APP界面 区域内的滚动条 结束语 基本布局方式 前言 通过上一次学习如何让页面适应任意屏幕的学习&#xff0c;我们就可以开始学习如何用代码“画”出基本的框架了。本期主要分享如何绘制基本的PC端管理系统和移动端APP的…

新颖的 setTimeout() 替代方案

在前端开发中&#xff0c;长时间运行的JavaScript任务一直是一个棘手的问题。它们会导致页面无响应&#xff0c;影响用户体验。传统上&#xff0c;开发者使用setTimeout()来分割长任务&#xff0c;但这种方法存在明显的缺陷。最近&#xff0c;Chrome 129引入了一种新的、更高效…

机器学习面试笔试知识点-线性回归、逻辑回归(Logistics Regression)和支持向量机(SVM)

机器学习面试笔试知识点-线性回归、逻辑回归Logistics Regression和支持向量机SVM 一、线性回归1.线性回归的假设函数2.线性回归的损失函数(Loss Function)两者区别3.简述岭回归与Lasso回归以及使用场景4.什么场景下用L1、L2正则化5.什么是ElasticNet回归6.ElasticNet回归的使…

视频云存储/音视频流媒体视频平台EasyCVR视频汇聚平台在欧拉系统中启动失败是什么原因?

视频监控/视频集中存储/磁盘阵列EasyCVR视频汇聚平台具备强大的拓展性和灵活性&#xff0c;支持多种视频流的外部分发&#xff0c;如RTMP、RTSP、HTTP-FLV、WebSocket-FLV、HLS、WebRTC、fmp4等&#xff0c;这为其在各种复杂环境下的部署提供了便利。 安防监控EasyCVR视频汇聚平…