为了更进一步清晰地了解前台数据向后台提交的过程,更好地加强巩固前端开发学习,整理了基础的【前后台用户登录注册功能】实现代码。后台通过node.js开发,数据存储在sqlite中,前台vue+element完成开发,首先功能实现效果展示如下:

 

             

 

一、后台node.js

安装express、body-parser 【npm install express body-parser 】,关于express介绍,见https://blog.csdn.net/maidu_xbd/article/details/86632618  body-parser用于处理post请求

全局安装sqlite3【npm install sqlite3 -g】sqlite使用说明详细见https://blog.csdn.net/maidu_xbd/article/details/99977786

server.js完整代码:

const express = require("express")
const bodyParser = require("body-parser")

const sqlite3 = require("sqlite3").verbose()
const app = express()
// sqlites数据库地址
let sqliteDbPath = "C:\\Users\\lenovo\\Desktop\\Demo.db"
// 打开sqlites数据库
var db = new sqlite3.Database(sqliteDbPath)
app.use(bodyParser.json()) // for parsing application/json
// app.get('/', (req, res) => res.send('Hello World!'))

// 登录请求处理
app.post("/submitLogin", function(req, res) {
    var username = req.body.name
    var password = req.body.password
    db.all(`select * from user where username=?`, username, function(err, row) {
        if (err) throw err
        else {
            // console.log(row)
            if (row == "") {
                // 如果查找数据库用户名为空,则无此用户
                res.send({ status: 500, msg: "此用户不存在" })
            } else {
                // console.log(row[0].password)
                if (row[0].password != password) {
                    // 检验密码是否一致
                    res.send({ status: 500, msg: "密码错误" })
                } else {
                    res.send({ status: 200, msg: "登录成功" })
                }
            }
        }
    })
})

// 注册请求处理
app.post("/submitRegister", (req, res) => {
    var username = req.body.name
    var email = req.body.email
    var password = req.body.password
    console.log(username)
    db.all("select * from user where username=?", username, function(err, row) {
        if (err) throw err
        else {
            // console.log(row)
            if (row == "") {
                // 如果查找数据库用户名为空,则无此用户,在数据库中存储用户名,密码和邮箱信息
                // var sql_add = db.prepare(`insert into user (username, password, email) values('buding1', '1111', '221@sdsd.com')`)
                var sql_add = db.prepare(`insert into user (username, password, email) values(?,?,?)`)
                sql_add.run(username, password, email)
                res.send({ status: 200, msg: "恭喜你,注册成功!" })
            } else {
                res.send({ status: 500, msg: "用户名已注册,请更换用户名" })



            }
        }
    })
})


app.listen(9999, () => console.log("Example app listening on port 9999!"))

注意:接口文件 

  1. 用户登录验证

前台将用户输入的用户名和密码传入到后台验证

url

/submitLogin

method

POST

request

{name:userName,password:password}

response

后台验证成功:{status:200,msg:”登录成功}

后台密码验证失败:{status:500,msg:”密码错误}

后台用户不存在验证失败:{status:500,msg:”此用户不存在}

 

2. 用户注册验证

前台将用户输入的用户名、邮箱和密码传入到后台验证

url

/submitRegister

method

POST

request

{name:userName, "email":email, password:password}

response

后台验证成功:{status:200,msg:”恭喜你,注册成功}

后台验证失败:{status:500,msg:”用户名已注册,请更换用户名}

二、前台vue+element

安装element-ui 【npm i element-ui -S】

安装axios:【npm install axios --save-dev】

详细见https://blog.csdn.net/maidu_xbd/article/details/88566665

Login.vue完整代码如下:

<template>
  <div class="login-demo">
    <div class="login-wrap">
      <el-row type="flex" justify="center">
        <!-- 登录框 -->
        <el-form ref="loginForm" :rules="formRules" :model="user" status-icon label-width="70px">
          <el-tabs :stretch="true" v-model="activeName" @tab-click="handleClick">
            <el-tab-pane label="登录" name="login">
              <el-form-item prop="username" label="用户名">
                <el-input v-model="user.username" placeholder="请输入用户名"></el-input>
              </el-form-item>
              <el-form-item prop="password" label="密码">
                <el-input v-model="user.password" show-password placeholder="请输入密码">
                  <template slot="prepend"></template>
                </el-input>
              </el-form-item>
              <el-checkbox id="savePassword" checked="checked" @click="savePassword()">记住密码</el-checkbox>
              <router-link to="/forgetPassword">忘记密码</router-link>
              <br>
              <br>
              <el-form-item>
                <el-button type="primary" @click="doLogin('loginForm')">登 录</el-button>
              </el-form-item>
            </el-tab-pane>
            <!-- 注册框 -->
            <el-tab-pane label="注册" name="register">
              <el-form-item prop="username" label="用户名">
                <el-input v-model="user.username" placeholder="请输入用户名"></el-input>
              </el-form-item>
              <el-form-item prop="email" label="邮箱">
                <el-input v-model="user.email" placeholder="请输入邮箱"></el-input>
              </el-form-item>
              <el-form-item prop="password" label="设置密码">
                <el-input v-model="user.password" show-password placeholder="请输入密码"></el-input>
              </el-form-item>
              <el-form-item>
                <el-button type="primary" icon @click="doRegister('loginForm')">注册账号</el-button>
              </el-form-item>
            </el-tab-pane>
          </el-tabs>
        </el-form>
      </el-row>
    </div>
  </div>
</template>
<script>
import axios from "axios";
export default {
  name: "login",
  data() {
    return {
      activeName: "login",
      checked: false,
      user: {
        username: "",
        password: ""
      },
      // 通过 formRules 属性传入约定的验证规则
      formRules: {
        username: [{ required: true, message: "用户名不能为空", trigger: "blur" }],
        password: [
          { required: true, message: "密码不能为空", trigger: "blur" },
          { type: "string", min: 6, message: "密码不能小于6位", trigger: "blur" }
        ],
        // bug--由于此处登录和注册共用一个el-form,因此只能绑定一个rules,如果邮箱设置为必填,将导致无法登陆。一般情况下,将登录和注册分别放在不同的el-form中,为它们设置不同的rules
        email: [
          // { required: true, message: "请输入邮箱地址", trigger: "blur"  },
          { type: "email", message: "请输入正确的邮箱地址", trigger: ["blur", "change"] }
        ]
      }
    }
  },
  created() {},
  methods: {
    // 登录
    doLogin(form) {
      this.$refs[form].validate((valid) => {
        if (valid) {
          axios
            .post("/submitLogin/", {
              // .post("/api/login/", {
              name: this.user.username,
              password: this.user.password
            })
            .then(res => {
              //  console.log("输出response.data", res.data);
              if (res.data.status === 200) {
                this.$router.push({ path: "/welcome" });
              } else {
                this.$message.error(res.data.msg)
              }
            });
        } else {
          return false;
        }
      });
    },
    // 注册账号
    doRegister(form) {
      this.$refs[form].validate((valid) => {
        if (valid) {
          console.log(valid);
          axios
            .post("/submitRegister/", {
              name: this.user.username,
              email: this.user.email,
              password: this.user.password
            })
            .then(res => {
              // console.log("输出response.data", res.data);
              if (res.data.status === 200) {
                this.$message.success(res.data.msg)
                this.activeName = "login";
              } else {
                this.$message.error(res.data.msg);
              }
            });
        } else {
          return false;
        }
      });
    },
    handleClick(tab, event) {
      console.log(tab, event);
    },
    // 记住密码
    savePassword() {
      if (document.getElementById("savePassword").checked) {
        var username = this.user.username;
        var password = this.user.password;
        wind
        ow.sessionStorage.username = username;
        window.sessionStorage.password = password;
        localStorage.rmbPassword = true;
      } else {
        localStorage.rmbPassword = false;
      }
    }
  }
}

</script>
<!-- Add "scoped" attribute to limit CSS to this component only -->
<style scoped>
/* 公共样式 */
li {
  list-style: none;
  float: left;
}

.login-demo {
  position: fixed;
  width: 100%;
  height: 100%;
  background: url("../assets/images/bg2.png") no-repeat;
  background-size: cover;
  top: 0px;
  left: 0px;
  overflow: hidden;
}

.login-wrap {
  background: url("../assets/images/login_bg.png") no-repeat;
  width: 400px;
  height: 310px;
  margin: 175px auto;
  margin-left: 272px;
  border-radius: 6px;
  line-height: 20px;
  padding-top: 0px;
}

.el-tabs>>>.el-tabs__item {
  font-size: 18px;
  margin: 5px auto;
}

.el-tabs__nav {
  font-size: 18px;
}

a {
  text-decoration: none;
  color: #606266;
  font-size: 14px;
  float: right;
}

a:hover {
  color: coral;
}

.el-checkbox {
  text-indent: 4px;
}

>>>.el-form-item__label {
  padding: 0px 4px 0 0;
}

>>>.el-checkbox__label {
  padding-left: 0px;
}

.el-button {
  width: 118%;
  margin-left: -40px;
  background-color:
    #16696a;
  letter-spacing: 5px;
  border: 0px;
}

</style>

ForgetPassword.vue完整代码如下:
备注:发送邮件尚未做

<template>
  <div class="forget-password">
    <div id="content">
      <h3>{{message}}</h3>
      <el-form :rules="rules" label-width="40px" class="demo-ruleForm">
        <el-form-item label="邮箱" prop="pass">
          <el-input type="input" v-model="email" autocomplete="off"></el-input>
        </el-form-item>
        <el-form-item>
          <el-button type="primary" @click="sumbitForm">确定</el-button>
          <el-button type="primary" @click="cancle">取消</el-button>
        </el-form-item>
      </el-form>
    </div>
  </div>
</template>
<script>
import axios from "axios";
export default {
  name: "forget-password",
  data() {
    return {
      message: "找回密码!",
      email: "",
      rules: {
        email: [{ message: "邮箱不能为空", trigger: "blur" }]
      }
    };
  },
  methods: {
    sumbitForm() {
      if (!this.email) {
        this.$message.error("请输入邮箱!");
        return;
      } else {
        var reg = /^(?:\w+\.?)*\w+@(?:\w+\.)*\w+$/;
        if (!reg.test(this.email)) {
          this.$message.error("邮箱格式不正确,请重新输入!");
          this.email.focus();
          return false;
        } else {
          this.$message("发送邮件");
          //    axios
          //     .post("/register/", {
          //       name: this.user.username,
          //       email: this.user.email,
          //       password: this.user.password
          //     })
          //     .then(res => {
          //       // console.log("111输出response.data", res.data);
          //       // console.log("111输出response.data.status", res.data.status);
          //       if (res.data.status === 200) {
          //         this.$router.push({ path: "/" });
          //       } else {
          //         alert("您输入的用户名已存在!");
          //       }
          //     });
        }
      }
    },
    cancle() {
      this.$router.go(-1);
    }
  }
};

</script>
<!-- Add "scoped" attribute to limit CSS to this component only -->
<style scoped>
.forget-password {
  position: fixed;
  width: 100%;
  height: 100%;
  background: url("../assets/images/bg4.png") no-repeat;
  background-size: cover;
  top: 0px;
  left: 0px;
  overflow: hidden;
}

#content {
  width: 400px;
  height: 200px;
  margin: 100px auto;
  /* background: #d7e695; */
  background-color: rgba(0, 0, 0, 0.2);
  padding: 10px;
  border-radius: 6px;
}

</style>

注意:【config】下【index.js】修改配置文件

proxyTable: {
      '/': {

        target: 'http://localhost:9999',
        changeOrigin: true,
        pathRewrite: {
          '^/': ''

        }
      }
    },

 

Logo

前往低代码交流专区

更多推荐