导语:之前做过一个小项目,其中涉及到用户注册与登录的功能,现在把这个实现过程记录下来,以便日后查看维护。
目录
- 原理分析
- 实战案例
原理分析
用户注册简易流程图
- 输入用户名和密码
- 检查是否存在此用户
- 存在则返回提示
- 不存在注册成功
用户登录简易流程图
实战案例
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
具体使用方法,点击地址有文档介绍。
- 用户注册
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: "用户未登录!",
}
})
}
})
这次的总结就写到这里,当然,这只是最基础的注册与登录功能,但是很复杂的注册与登录也是在最基础上面进行加工复杂化的,最重要的是培养逻辑思维思考能力。如何实现一个功能,并且不断优化到最佳程度。