Web编程大作业(二)用户注册&登录系统(express+MySQL)

1. 注册&登录系统逻辑图

在这里插入图片描述

2. 效果演示

(啊对,因为只是演示,所以几乎没有加任何样式和美化,css样式等整个项目完成度比较高了再考虑弄)

初次访问网站时,后端没有检查到cookie,于是自动跳转至登录页面
在这里插入图片描述
点击“注册账号”后跳转至注册页面
在这里插入图片描述
在这里插入图片描述
身份选择为教师时会多出验证码一项。(此处验证码暂时是固定的)

如果输入的信息有误,会根据错误信息进行对应的提示。
在这里插入图片描述
在这里插入图片描述
如果注册信息无误则会显示注册成功,并有一个返回首页的按钮
在这里插入图片描述
返回首页后回到登陆页面,正确输入账号密码,即显示登陆成功(否则也会进行错误提示)

在这里插入图片描述

再点击返回首页,由于登陆时创建了cookie,首页不再跳转至登录页面,而是根据cookie信息显示了当前的用户名和身份。

在这里插入图片描述

点击“注销账号”后,后端清除cookie并再次访问首页,于是又跳转到了登陆页面。
在这里插入图片描述

3. 代码实现

代码上主要由三个路由和对应的三个ejs模板页面实现。
在这里插入图片描述
很明显,index,login和register分别对应了首页、登陆页面和注册页面,路由(js)实现后端逻辑,ejs实现前端页面。

1. 首页(index)

index.js,根据有无cookie产生不同的响应,并处理“注销账号”的请求,具体看代码

var express = require('express');
var router = express.Router();

//捕获到get请求(即访问127.0.0.1:3000)
router.get('/', function(req, res, next) {
  let coo=req.cookies;
  //检查是否存在cookie,若没有则跳转至登陆页面
  if (coo.username==undefined)
  {
    res.redirect('/login');
  }
  //若有,则将cookie信息作为参数传递给index.ejs进行渲染
  else
  {
    //cookie中身份信息存放的是'0'和'1',转化为'学生'和'教师'
    var loginType='';
    if (coo.loginType=='0') loginType="学生";
    else loginType="教师"
    res.render('index',{username:coo.username,loginType:loginType});
  }
});
//捕获到post请求
router.post('/',function(req,res,next){
  let bod=req.body;
  //“注销账号”按钮被点击时
  if (bod.refresh=='1'){
    //清除所有cookie
    res.clearCookie('username');
    res.clearCookie('loginType');
    //重新跳转至首页
    res.redirect('/');
  }
})
module.exports = router;

index.ejs,username和loginType是两个参数,用来显示用户信息

<!DOCTYPE html>
<html>
  <head>
  </head>
  <body>
    <h1>首页</h1>
    <p>当前的账号为:<%= username%></p>
    <p>身份:<%= loginType%></p>
    <form method="post">
      <button type="submit" name="refresh" value="1">注销账号
    </form>
  </body>
</html>

2. 登陆页面(login)

login.js通过MySQL验证登录是否有效,若有效则创建cookie,跳转至欢迎页面

var express = require('express');
var router = express.Router();
var mysql=require('../mysql.js')

//初次访问
router.get('/login',function(req,res){
    //不显示错误
    res.render('login',{fail:0});
})
router.post('/login',function(req,res){
    var info=req.body;
    //MySQL检查账号密码正确性
    var fetchSql="SELECT username,passwords,loginType from login where username='"+info.username
    +"' and passwords='"+info.passwords+"';";
    mysql.query(fetchSql,function(err,results,fields){
        //账号不存在,返回错误
        if (results.length==0){
            res.render('login',{fail:1});
        }
        //账号存在
        else{
            //创建账号信息cookie,results[0]指向当前用户信息
            let now=results[0];
            res.cookie('username',now.username);
            res.cookie('loginType',now.loginType);
            //根据用户身份,跳转至不同的欢迎界面
            if (now.loginType=='0')
            {
                res.sendfile('public/studentLoginSuccess.html');
            }
            if (now.loginType=='1')
            {
                res.sendfile('public/teacherLoginSuccess.html');
            }
        }
    })
})
module.exports=router;

login.ejs fail参数用于决定是否提示错误

<body>
    <h1>登陆页面</h1>
    <form method="post">
        <div>
            <label>用户名:</label>
            <input name="username" type="text">
        </div>
        <div>
            <label>密码:</label>
            <input name="passwords" type="password">
        </div>
        <br>
        <button name="login" type="submit">登陆</button>
    </form>
    <a href='../register'>注册账号</a>
    <!-- 做一个空div,用来添加错误信息-->
    <div id="show"></div>
    <script>
        //显示错误信息
        var fail=<%= fail %>;
        if (fail) document.getElementById("show").innerText="账号密码有误~";
    </script>
</body>

3. 注册页面(register)

register.js 逐条验证注册信息是否有效,有效则将数据插入MySQL数据库中,否则返回相应的错误信息

var express = require('express');
var router = express.Router();
var mysql=require('../mysql.js')

router.get('/register',function(req,res){
    //5个tip分别对应五种错误信息,初次访问时错误信息都为空
    res.render('register',{tip1:'',tip2:'',tip3:'',tip4:'',tip5:''});
});
router.post('/register',function(req,res){
    var info=req.body;
    //正则表达式,检验字符串是否只由数字、字母和下划线组成
    var exp=/^\w+$/;
    var tip1='',tip2='',tip3='',tip4='',tip5='';
    //检验用户名合法性
    if (!exp.test(info.username) || info.username.length>15 || info.username.length<6) tip1="请输入正确的用户名~";
    //检验密码合法性
    if (!exp.test(info.passwords) || info.passwords.length>18 || info.passwords.length<6) tip2="请输入正确的密码~";
    //检验两次密码是否一致
    if (info.passwords!=info.passwordsChecker) tip3="两次密码不一致~";
    //若身份为教师,验证码是否正确
    if (info.loginType=='1' && info.identify!="lyflyf") tip4="验证码有误~";
    //检验该用户名是否已被注册
    var fetchSql="SELECT id FROM login WHERE username='"+info.username+"';"
    mysql.query(fetchSql,function(err,results,fields){
        if (results.length!=0) tip5="该用户名已被注册~";
        //注册信息至少有一项存在错误,返回注册页面并提示错误
        if (tip1 || tip2 || tip3 || tip4 ||tip5)
            res.render('register',{tip1:tip1,tip2:tip2,tip3:tip3,tip4:tip4,tip5:tip5});
        else
        //没有错误
        {
            //将数据写入MySQL
            var insertSql="INSERT INTO login(username,passwords,loginType)"+
            "VALUES('"+info.username+"','"+info.passwords+"',"+info.loginType+");";
            mysql.query(insertSql,function(err,results,fields){
                if (err) console.log("插入失败~");
                else
                //注册成功,跳转至成功页面
                    res.sendfile("public/registerSuccess.html");
            })
        }
    })
    
})
module.exports = router;

register.ejs 参数tip1至tip5,分别对应五种错误信息,若无误则tip为’’

<head>
<style>
    .tip{
        display:inline;
        color:red;
    };
</style>
<script src="https://cdn.bootcss.com/jquery/3.4.1/jquery.js"></script>
<script>
    //控制“验证码”一行的可见性
    function invisible(){
        $('#identifier').attr('style','display:none');
    };
    function visible(){
        $('#identifier').attr('style','display:inline');
    };
</script>
</head>
<body>
    <h1>注册页面</h1>
    <form method="post">
        <div>
            <label>输入账号:</label>
            <input name="username" type="text">(由6-15位字母,数字和下划线组成)
            <br><p class="tip"><%= tip1%></p><br>
        </div>
        <div>
            <label>输入密码:</label>
            <input name="passwords" type="password">(由6-18位字母,数字和下划线组成)
            <br><p class="tip"><%= tip2%></p><br>
        </div>
        <div>
            <label>确认密码:</label>
            <input name="passwordsChecker" type="password">
            <br><p class="tip"><%= tip3%></p><br>
        </div>
        <div>
            <label>选择身份:</label>
            <!--点击“学生”选项时隐藏验证码,点击“教师”选项时显示验证码 -->
            学生<input type="radio" name="loginType" id="student" value="0" onclick="invisible()">
            教师<input type="radio" name="loginType" id="teacher" value="1" onclick="visible()">
            <br><br>
        </div>
        <div id='identifier' style="display:none">
            <label>输入验证码:</label>
            <input name="identify" type="text">
            <br><p class="tip"><%= tip4%></p><br>
        </div>
        <button name="return" onclick="window.open('/login')">返回</button>
        <button name="register" type="submit">提交注册</button>
        <br><p class="tip"><%= tip5%></p><br>
    </form>
</body>

4. 零零散散的总结

自我总结一下,讲的会比较乱,可以暂时不看。

对于express框架一个非常基础但是非常重要的理解是:app.js是代码唯一的入口。至于为什么之前都是通过运行\bin\www来创建服务器呢,大概是因为www是一个可执行文件吧,但是我们完全可以在app.js中加上以下三行代码然后删掉\bin\www

var http = require('http');
var server = http.createServer(app);
server.listen(3000)

这样以后直接执行app.js即可创建服务器

有了以上这个认知以后,或多或少会觉得思路清楚了一些。

再去看其他几个文件夹的内容

node_modules存放的是安装的各种模块,无视。

public存放一些静态的html或者图片资源,直接调用即可。

重点来了,routers,中文是路由器,充当的也的确是路由器的作用。所有对于网页的请求都可以通过路由器来处理,为了代码结构的清晰,对于每一块相对独立的功能(比如这次做的首页、登录、注册三个功能),都可以创建一个各自的路由器。在路由器内部,我们再对post请求、get请求,以及包含在请求内的信息分类进行处理,并分别返回。其中各类请求包含的信息存放在req中,返回则通过res的各种方法。

举几个栗子:req.cookies获取cookies,req.body获取参数。

res.sendfile发送页面,res.download发送下载文件,res.render渲染并发送ejs,res.clearCookie清除cookie,等等等。

reference:http://www.360doc.com/content/18/0422/07/32517277_747703104.shtml

另一个重点则是ejs,可以说是一种容易理解,写起来又很方便的模板。只需要通过res.render()就可以像函数一样,将一些参数传递给前端页面。

此时再回到代码的入口,即app.js,只需要用app.use引入路由(router对象),就等同于将某个功能并入了整个网站。

就像这样子

var loginRouter = require('./routes/login');
var registerRouter = require('./routes/register');
var indexRouter = require('./routes/index');
app.use('/',loginRouter);
app.use('/',registerRouter);
app.use('/',indexRouter);

总之router和ejs使得代码的结构相当清晰。

  • 5
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
【资源说明】 该项目是个人毕设项目源码,评审分达到95分,都经过严格调试,确保可以运行!放心下载使用。 该项目资源主要针对计算机、自动化等相关专业的学生或从业者下载使用,也可作为期末课程设计、课程大作业、毕业设计等。 具有较高的学习借鉴价值!基础能力强的可以在此基础上修改调整,以实现类似其他功能。 基于vue2+Mysql+nodejs+express+element-ui的前后端分离图书管理系统 使用步骤: 本地运行方法  1.新建一个名为books_manage_system的数据库  2.将node目录下books_manage_system.sql文件导入到该数据库中,  3.在node/sql/booksystem.js文件内根据自己的数据库情况进行修改  4.运行后台  5.运行前台  6.打开提示的网址既可运行  7.如需通过ip地址访问,请在vue.config.js文件中修改配置 打包运行,及线上运行方法:  1.将根目录下books_manage_system.sql文件导入到数据库中  2.在node/sql/booksystem.js文件内根据自己的数据库情况进行修改  3.在books文件夹和node文件夹下分别执行npm install安装插件  4.注释掉books/src/network/request.js文件中的第4行代码  5.在books文件夹下执行npm run build打包前端文件,打包完成后将该目录新增的dist文件夹复制到node文件夹中  6.打包完成后将dist文件夹复制到node文件夹下  7.将node文件夹下baseURL.js文件中的ip地址,修改为自己电脑的IP,否则线上运行时,会导致部分图片无法访问  8.在node文件夹下执行node index.js  9.之后在处于同一网络中的设备下,输入ip及端口号即可访问页面
重构若依管理系统是基于Node.jsExpress框架和MySQL数据库来进行的。 Node.js是一种基于Chrome V8引擎的JavaScript运行环境,可以通过它来构建高效的网络应用程序。ExpressNode.js的一个Web应用开发框架,可以简化Node.js应用的开发过程。MySQL是一个可扩展的关系型数据库管理系统,可以用来存储和管理数据。 在进行重构时,首先需要将原有的若依管理系统的功能进行分析和拆解。根据系统的需求,设计新的数据库结构,包括建立表、定义字段和数据类型等。 然后,使用Express框架来开发新的Web应用程序。通过Express,可以方便地处理路由、中间件、请求和响应等,实现不同页面的展示和交互功能。 接下来,利用Node.js的模块化特性,将系统的功能拆分为各个独立的模块。每个模块负责处理不同的功能,例如用户管理、角色管理、菜单管理等。这样可以提高代码的可维护性和可重用性。 在开发过程中,可以使用MySQL插件来连接和操作数据库。通过配置连接参数和编写SQL语句,可以实现对数据库的增删改查等操作。 除了功能的重构,还需要考虑系统的性能和安全性。可以通过对数据库进行优化和索引的建立,来提高系统的查询和操作速度。同时,要注意对用户输入的数据进行验证和过滤,以防止安全漏洞和攻击。 最后,进行系统的测试和部署。可以使用自动化测试工具来进行单元测试和集成测试,确保系统的各个功能正常运行。部署时,可以选择合适的服务器和云服务,将系统上线。 通过以上步骤,可以完成对若依管理系统的重构。重构后的系统将具有更好的性能和安全性,同时也更容易进行功能扩展和维护。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值