终极low的vue+node+mysql的登录和注册页面

发布时间 2023-07-31 17:47:30作者: 20岁的老年人

一次失败的项目

注*本次没有写完

一,本次项目的心里历程

其实压根算不上项目,项目只有登录和注册其他的什么也没有,不过是自我安慰罢了,本项目也不是我本人自己写的,思路很多都是从网上抄袭的,算是超级缝合聚怪了。

本来要写的详细的但是后来想了想太烂了,目前来说就罢了,之后慢慢写吧。

二,本次项目大致需要的东西

前端vue webpack

后端node

数据库mysql

三,本次项目的代码

前端界面

main.js 基本的配置

import Vue from 'vue'
import App from './App.vue'
import router from './router'
import store from './store'
import ElementUI from 'element-ui';
import 'element-ui/lib/theme-chalk/index.css';


Vue.config.productionTip = false

Vue.use(ElementUI);

new Vue({
 router,
 store,
 render: h => h(App)
}).$mount('#app')

app.vue

<template>
 <div id="app">
   <router-view/>
 </div>
</template>

<style>
html,
body,
#app {
 width:100%;
 height: 100%;
}

</style>

router/index.js

import Vue from 'vue'
import VueRouter from 'vue-router'
import Index from '../views/index';
import Register from '../views/Register';
import Login from '../views/Login';
import notfond from '../views/404';
import userpage from '../views/userpage'
import community from '../views/community'
import about from '../views/about'
import usersetting from '../views/usersetting'

Vue.use(VueRouter)

const routes = [
{
   path: '/',
   redirect: '/index',
},
{
   path:'/index',
   name:'index',
   component:Index
},
{
   path:'/Register',
   name:'Register',
   component:Register
},
{
   path:'/Login',
   name:'Login',
   component:Login
},
{
   path:'*',
   name:'404',
   component:notfond
},
{
   path:'/userpage',
   component:userpage
},
{
   path:'/community',
   component:community
},
{
   path:'/about',
   component:about
},
{
   path:'/usersetting',
   component:usersetting
}


 // {
 //   path: '/about',
 //   name: 'about',
 //   // route level code-splitting
 //   // this generates a separate chunk (about.[hash].js) for this route
 //   // which is lazy-loaded when the route is visited.
 //   component: () => import(/* webpackChunkName: "about" */ '../views/AboutView.vue')
 // }
]

const router = new VueRouter({
 mode: 'history',
 base: process.env.BASE_URL,
 routes
})

export default router

views/login.vue

<template>
 <div class="box">
   <div class="loginFormbox">
     <div class="titlebox">
       <span class="title">欢迎来到登录系统</span>
     </div>
     <div class="loginForm">
       <el-form
         :model="registerUser"
         status-icon
         :rules="rules"
         ref="registerForm"
         label-width="100px"
         class="demo-ruleForm"
       >
         <el-form-item label="用户名" prop="username">
           <el-input
             type="text"
             v-model="registerUser.username"
             autocomplete="off"
             aria-placeholder="请输入用户名"
           ></el-input>
         </el-form-item>
         <el-form-item label="密码" prop="password">
           <el-input
             type="password"
             v-model="registerUser.password"
             autocomplete="off"
             aria-placeholder="请输入密码"
           ></el-input>
         </el-form-item>
         <el-form-item>
           <el-button
             type="primary"
             class="submit_btn"
             @click="submitForm('registerForm')"
             >登录</el-button
           >
         </el-form-item>
       </el-form>
     </div>
   </div>
 </div>
</template>

<script>
import axios from "axios";

export default {
 name: "Login",
 component: {},
 data() {
   var validatePass2 = (rule, value, callback) => {
     if (value === "") {
       callback(new Error("请再次输入密码"));
    } else if (value !== this.registerUser.password) {
       callback(new Error("两次输入密码不一致!"));
    } else {
       callback();
    }
  };
   return {
     radio: "1",
     registerUser: {
       username: "",
       password: "",
    },
     rules: {
       username: [
        {
           required: true,
           message: "用户名不能为空",
           trigger: "blur",
        },
        {
           min: 2,
           max: 10,
           message: "长度在2到10字符之间",
           trigger: "blur",
        },
      ],
       password: [
        {
           required: true,
           message: "密码不能为空",
           trigger: "blur",
        },
        {
           min: 6,
           max: 20,
           message: "长度在6到30字符之间",
           trigger: "blur",
        },
      ],
    },
  };
},
 methods: {
   submitForm(formName) {
     this.$refs[formName].validate((valid) => {
       if (valid) {
         alert("submit!");

         axios({
           method: "POST",
           url: "http://localhost:3000/api/login",
           data:this.registerUser,
        }).then((response) => {
           console.log(response);
           if(response.data.status === 0){
               this.$router.push('/community');
          }else{
               alert(response.data.message);
          }
        });
      }
    });
  },
},
};
</script>

<style scoped>



.box {
 position: relative;
 width: 100%;
 height: 100%;
 background-image: url(../assets/背景图片.jpg);
 background-position: center center;
 background-repeat: no-repeat;
 background-size: 100% 100%;
}

.loginFormbox {
   padding-right:40px ;
   padding-left:20px ;
 width: 500px;
 height: 350px;
 position: absolute;
 top: 50%;
 left: 50%;
 transform: translateX(-50%) translateY(-50%);
 background-color: rgb(255, 255, 255);
 box-shadow: 0 2px 4px rgba(0, 0, 0, 0.12), 0 0 6px rgba(0, 0, 0, 0.04);
 border-radius: 4px;
}

.loginrForm {
 width: 400px;
 position: absolute;
 top: 150px;
 left: 0px;
}

.title {
 color: black;
 font-size: 30px;
 padding-top: 25px;
}
.titlebox {
 padding-top: 60px;
 padding-bottom: 40px;
 text-align: center;
}

.submit_btn {
 width: 100%;
}
 




</style>

views/register.vue


<template>
 <div class="box">
   <div class="registerFormbox">
     <div class="titlebox">
       <span class="title">欢迎来到注册系统</span>
     </div>
     <div class="registerForm">
       <el-form
         :model="registerUser"
         status-icon
         :rules="rules"
         ref="registerForm"
         label-width="100px"
         class="demo-ruleForm"
       >
         <el-form-item label="用户名" prop="username">
           <el-input
             type="text"
             v-model="registerUser.username"
             autocomplete="off"
             aria-placeholder="请输入用户名"
           ></el-input>
         </el-form-item>
         <el-form-item label="密码" prop="password">
           <el-input
             type="password"
             v-model="registerUser.password"
             autocomplete="off"
             aria-placeholder="请输入密码"
           ></el-input>
         </el-form-item>
         <el-form-item label="确认密码" prop="repassword">
           <el-input
             type="password"
             v-model="registerUser.repassword"
             autocomplete="off"
             aria-placeholder="请确认密码"
           ></el-input>
         </el-form-item>
         <el-form-item label="邮箱" prop="email">
           <el-input
             type="email"
             v-model="registerUser.email"
             autocomplete="off"
             aria-placeholder="请输入邮箱"
           ></el-input>
         </el-form-item>
         <el-form-item label="性别" prop="sex">
           <el-radio-group v-model="registerUser.sex">
             <el-radio v-model="radio" label="1">男</el-radio>
             <el-radio v-model="radio" label="2">女</el-radio>
           </el-radio-group>
         </el-form-item>
         <el-form-item>
           <el-button
             type="primary"
             class="submit_btn"
             @click="submitForm('registerForm')"
             >注册</el-button
           >
         </el-form-item>
       </el-form>
     </div>
   </div>
 </div>
</template>

<script>
import axios from "axios";

export default {
 name: "Register",
 component: {},
 data() {
   var validatePass2 = (rule, value, callback) => {
     if (value === "") {
       callback(new Error("请再次输入密码"));
    } else if (value !== this.registerUser.password) {
       callback(new Error("两次输入密码不一致!"));
    } else {
       callback();
    }
  };
   return {
     radio: "1",
     registerUser: {
       username: "",
       password: "",
       repassword: "",
       email: "",
       sex: "",
    },
     rules: {
       username: [
        {
           required: true,
           message: "用户名不能为空",
           trigger: "blur",
        },
        {
           min: 2,
           max: 10,
           message: "长度在2到10字符之间",
           trigger: "blur",
        },
      ],
       password: [
        {
           required: true,
           message: "密码不能为空",
           trigger: "blur",
        },
        {
           min: 6,
           max: 20,
           message: "长度在6到30字符之间",
           trigger: "blur",
        },
      ],
       repassword: [
        {
           required: true,
           message: "密码不能为空",
           trigger: "blur",
        },
        {
           min: 6,
           max: 20,
           message: "长度在6到30字符之间",
           trigger: "blur",
        },
      ],
       email: [
        {
           type: "email",
           required: "true",
           message: "邮箱格式不正确",
           trigger: "blur",
        },
      ],
       sex: [{ required: true, message: "请选择性别", trigger: "change" }],
    },
  };
},
 methods: {
   submitForm(formName) {
     this.$refs[formName].validate((valid) => {
       if (valid) {
         alert("submit!");

         axios({
           method: "POST",
           url: "http://localhost:3000/api/register",
           data:this.registerUser,
        }).then((response) => {
           console.log(response);
        });
      } else {
         console.log("error submit!!");
         return false;
      }
    });
  },
},
};
</script>

<style scoped>

@media screen and (min-width: 500px) {

.box {
 position: relative;
 width: 100%;
 height: 100%;
 background-image: url(../assets/背景图片.jpg);
 background-position: center center;
 background-repeat: no-repeat;
 background-size: 100% 100%;
}

.registerFormbox {
 width: 500px;
 height: 600px;
 position: absolute;
 top: 50%;
 left: 50%;
 transform: translateX(-50%) translateY(-50%);
 background-color: rgb(255, 255, 255);
 box-shadow: 0 2px 4px rgba(0, 0, 0, 0.12), 0 0 6px rgba(0, 0, 0, 0.04);
 border-radius: 4px;
}

.registerForm {
 width: 400px;
 position: absolute;
 top: 150px;
 left: 10px;
}

.title {
 color: black;
 font-size: 30px;
 padding-top: 25px;
}
.titlebox {
 padding-top: 60px;
 text-align: center;
}

.submit_btn {
 width: 100%;
}
 
}



</style>

登陆注册只看这两个页面就够了

后端

index.js

// 导入express模块
const express = require('express');
// 实例化express对象
const app = new express();
// 导入mysql模块
const mysql = require('mysql')
// 创建服务器端口
const port = 3000;




//配置解析表单中间件
// parse application/x-www-form-urlencoded
app.use(express.urlencoded({ extended: false }))
// parse application/json
app.use(express.json())


//解决跨域的问题
app.all('*', function (req, res, next) {
   // 设置允许跨域的域名,*代表允许任意域名跨域
   res.header('Access-Control-Allow-Origin', '*');
   // 允许的header类型
   res.header('Access-Control-Allow-Headers', 'content-type');
   // 解决node.js返回中文出现乱码的问题
   res.setHeader('Content-Type', 'text/html; charset=utf-8')
   // 跨域允许的请求方式
   res.header('Access-Control-Allow-Methods', 'DELETE,PUT,POST,GET,OPTIONS');
   if (req.method.toLowerCase() === 'options') {
       res.sendStatus(200);
  } else {
     next();
  }
});

 

//导入路由模块
const users = require('./router/users')


// 连接数据库
const db = require('./database/mysqlcon')




app.use('/api',users)


// 监听端口
app.listen(port,()=>{
   console.log("项目已经启动");
})

前面还一本正经的写注释,写着写着就放弃了

/router/user.js

//实现登录和注册的路由跳转
const express = require('express')
const router = express.Router();
const router_handler = require('../router_handler/user')





// 创建测试路由
router.post('/login',router_handler.logUser)

router.post('/register',router_handler.regUser)

router.get('/home',router_handler.home)

// 暴露模块
module.exports = router;

/router_handler/user.js

const express = require('express');
const app = new express();

const db = require('../database/mysqlcon')
//导入加密模块
const bcryptjs = require('bcryptjs')
//路由函数





//注册
exports.regUser = (req,res)=>{
   // 获取注册表单信息
   let  userinfo = req.body;
   // 判断表单是否为空
   if(!userinfo.username || !userinfo.password || !userinfo.email || !userinfo.sex){
       return res.send({status:1,message:'需要填写的信息不能为空!'})
  }
   // 定义查询重名sql语句
   const sql = 'select * from users where username=? '
   // 检查是否重名
   db.query(sql,userinfo.username,(err,result)=>{
       if(err) {
           return res.send({status:1,message:err.message});
      }
       if(result.length > 0){
           return res.send({
               status:1,
               message:'用户名被占用'
          })
      }
       // 将得到的密码进行加密
       userinfo.password = bcryptjs.hashSync(userinfo.password,10);

       //判断性别
       if(userinfo.sex === '1'){
           userinfo.sex = '男'
      }else{
           userinfo.sex = '女'
      }

       // 创建添加sql语句
       const addsql = 'insert into users(username,password,email,sex) values (?,?,?,?)'
       // 创建添加方法
       db.query(addsql,[userinfo.username,userinfo.password,userinfo.email,userinfo.sex],(err,result)=>{
           if(err) return res.send({status:1,message:err.message})

           // 判断影响行数是否为1
           if(result.affectedRows !==1) return res.send({status:1,message:'注册失败,稍后重新使用'})

           return res.send({status:0,message:'注册成功'})

      })

  })
   // res.send('register OK')
}
// 登录
exports.logUser = (req,res)=>{
   //获取页面数据
   let userinfo = req.body;
   //判断获取的信息是否为空
   if(!userinfo.username || !userinfo.password){
       return res.send({status:1,message:'用户名或密码不能为空!'})
  }
//创建sql语句
   const sql1 = 'select * from users where username=? '
   、、
   db.query(sql1,userinfo.username,(err,result)=>{
       if(err){
           return res.send({status:1,message:err.message})
      }if(result.length !==1){
           return res.send({status:1,message:'当前账号不存在'})
      }else{
           console.log(result[0].password);
           const comRes = bcryptjs.compareSync(userinfo.password, result[0].password)
   if (!comRes) return res.send('登陆失败')
           res.send({status:0,message:'success'})
      }

  })


   
}
// 默认
exports.home = (req,res)=>{
   res.send('home');
}

四,心理历程续

写到这里突然想起来之前的springMVC,突然想笑。

数据库的话navicate,没有用sql代码

大致就是这么个情况本来还想利用以下vuex,发现自己还是意象天开了,就这么简单的一个东西花费了了我整整一周的时间(这段时间不包括写代码以外的其他事情,就写代码的时间加起来就一周)。

本次写的时候遇到了n多的问题,最离谱的就是axios传递数据,axios传递formdate数据的时候,node收到的数据永远都是空对象,一开始以为是node的问题,然后我就添加了node接收数据的类型,可我却漏掉了formdata类型,导致我右以为是前端的问题,整了将近一整天的时间,才发现根本的问题,当时真的哭了,太**的难了。还有就是webpack不知道怎么了,npm老是就卡住了,网上99%都是更换镜像网站,只有一个人说是要清理缓存,真的绝了。

唉,能怪谁呢,只能怪自己学的还不够多,有一个CSDN的博主说的很对,网上大部分的项目后端都是springboot,数据库是mongodb,符合要求的项目少的可怜。

真的绝了,让我发泄以下*********,本人就是一个自学前端的菜鸟,就这么着吧。