Node用户登录与注册功能总结

2,305 阅读3分钟

导语:之前做过一个小项目,其中涉及到用户注册与登录的功能,现在把这个实现过程记录下来,以便日后查看维护。

目录

  • 原理分析
  • 实战案例

原理分析

用户注册简易流程图

  • 输入用户名和密码
  • 检查是否存在此用户
  • 存在则返回提示
  • 不存在注册成功

在这里插入图片描述

用户登录简易流程图

在这里插入图片描述

实战案例

mysql建表

建表的有关方法在这篇《node和mysql的CURD总结》文章已经说过了,下面直接建一张用户表。

-- 创建数据表
mysql> CREATE TABLE `user` (
  `id` int(11) NOT NULL COMMENT 'id',
  `name` varchar(255) COLLATE utf8_unicode_ci NOT NULL COMMENT '用户名',
  `password` varchar(255) COLLATE utf8_unicode_ci NOT NULL COMMENT '密码',
  `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间'
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci COMMENT='用户表';

node编写

根据上面的流程图,开始进行编写程序。

在进行编写之前。先在项目中安装一个依赖包,这个可以生成mysql语句。

npm install xqsql

xqsql npm地址

具体使用方法,点击地址有文档介绍。

  • 用户注册
app.post('/reg', async (req, res) => {
    let params = req.body;
    if (params.name && params.password) {
        let getSql = xqsql.get('user', {
            type: 'one',
            key: 'name',
            ids: [params.name],
        }, 'default', 'id,name');
        let getSqlResult = await db(getSql);
        if (getSqlResult.code == 200 &&
        getSqlResult.data.list.length == 0) {
            let addParams = [
                {
                    name: params.name,
                    password: params.password,
                }
            ]
            let addFields = [
                {
                    name: '用户名',
                    value: 'name',
                    isMust: true
                },
                {
                    name: '密码',
                    value: 'password',
                    isMust: true
                },
            ]
            let addSql = xqsql.add('user', addParams, addFields);
            let addSqlResult = await db(addSql);
            if (addSqlResult.code == 200) {
                return res.json({
                    code: 200,
                    msg: 'get_succ',
                    data: {
                        info: "注册成功!",
                    }
                });
            } else {
                return res.json(addSqlResult);
            }
        } else {
            return res.json({
                code: 101,
                msg: 'get_succ',
                data: {
                    info: "用户已存在!",
                }
            })
        }
    } else {
        return res.json({
            code: 101,
            msg: 'get_succ',
            data: {
                info: "用户名和密码不能为空!",
            }
        })
    }
})
  • 用户登录

登录这部分的用户信息,这里使用session进行保存,你还可以选择jwt,这次只用session。

安装依赖包;npm install express-session cookie-parser


// 引入
const session = require('express-session');
const cookieParser = require('cookie-parser');

// 配置
app.use(cookieParser());
app.use(session({
  resave: true,
  saveUninitialized: false,
  secret: 'demo'
}))
app.post('/login', async (req, res) => {
    let params = req.body;
    if (params.name && params.password) {
        let getSql = xqsql.get('user', {
            type: 'one',
            key: 'name',
            ids: [params.name],
        }, 'default', 'id,name,password');
        let getSqlResult = await db(getSql);
        if (getSqlResult.code == 200 &&
        getSqlResult.data.list.length) {
            let userInfo = getSqlResult.data.list[0];
            if (params.name == getSqlResult.data.list[0].name && 
            params.password == getSqlResult.data.list[0].password) {
                let loginInfo = req.session.user;
                if (loginInfo && loginInfo.name == params.name) {
                    return res.json({
                        code: 101,
                        msg: 'get_fail',
                        data: {
                            info: "用户已登录!",
                        }
                    });
                } else {
                    let user = {
                        name: params.name,
                    }
                    req.session.user = user;
                    return res.json({
                        code: 200,
                        msg: 'get_succ',
                        data: {
                            info: "登录成功!",
                        }
                    });
                }
            } else {
                return res.json({
                    code: 101,
                    msg: 'get_fail',
                    data: {
                        info: "用户名或者密码错误!",
                    }
                })
            }
        } else {
            return res.json({
                code: 101,
                msg: 'get_fail',
                data: {
                    info: "用户不存在!",
                }
            })
        }
    } else {
        return res.json({
            code: 101,
            msg: 'get_succ',
            data: {
                info: "用户名和密码不能为空!",
            }
        })
    }
})
  • 退出登录

这里就很简单了,直接把用户信息改为null即可。

app.post('/logout', (req, res) => {
    let user = req.session.user;
    if (user && user.name != '') {
        req.session.user = null;
        return res.json({
            code: 200,
            msg: 'get_succ',
            data: {
                info: "退出登录成功!",
            }
        });
    } else {
        return res.json({
            code: 101,
            msg: 'get_fail',
            data: {
                info: "用户未登录!",
            }
        })
    }
})

这次的总结就写到这里,当然,这只是最基础的注册与登录功能,但是很复杂的注册与登录也是在最基础上面进行加工复杂化的,最重要的是培养逻辑思维思考能力。如何实现一个功能,并且不断优化到最佳程度。