今天上午做的web实验,学完node.js的一个小练习,写这些有啥用呢。唉,简单记录一下吧
1.实验要求
- 用户注册:
请求路径:http://localhost:8080/user/regist,
请求方法为:Post请求,
请求参数分别为:用户名,密码,重复密码,邮箱且都为字符串类型.
返回值:布尔类型,若注册成功返回true,反之false.- 用户登录:
请求路径:http://localhost:8080/user/login,
请求方法:Get请求,
请求参数:用户名,密码,都为字符串类型.(有可能为空)
返回值:用户对象.(将整个用户信息返回)- 用户修改:
请求路径:http://localhost:8080/user/update,
请求方法:Put请求,
请求参数:用户对象,
返回值:新的用户对象- 用户注销:
请求路径:http://localhost:8080/user/delete,
请求方法:Delete请求,
请求参数:用户id,
返回值:布尔类型- 条件查找:
请求路径:http://localhost:8080/user/list,
请求方法:Get请求,
请求参数:用户名称或者邮箱(模糊查询)
返回值:用户对象的列表形式- 要求:
用户名:6-18位
密码:8-18位,必须有大小写和特殊字符,密码和重复密码需要相同,
邮箱:符合邮箱格式
数据库:存储数据库时需要把密码进行加密处理,并且要有id唯一且不为空
单斜杠、单引号、双引号,需要加上转义
数据库自选(推荐mysql或mongodb)
2. 用到的第三方包
{
"dependencies": {
"express": "^4.17.1",
"mysql": "^2.18.1"
}
}
下载包:
npm i express@4.17.1
npm i mysql
3.代码实现
自己封装一个自定义的路由模块儿,进行路由请求的处理。
自定义的路由模块儿 myRouter.js
const express = require('express')
const router = express.Router()
const mysql=require("mysql");
const db=mysql.createPool({
host:'127.0.0.1',
user:'root',
password:'123456',
port:'3307',
database:'table_03'
})
// 定义正则进行校验
const reg_name = /^\w{6,18}$/;
// 密码必须由大小写字母、数字、特殊字符组成
const reg_pwd=/(?=.*[A-Z])(?=.*[a-z])(?=.*[0-9])(?=.*[\W_]).{8,18}/;
// 邮箱
const reg_email=/^[a-zA-Z0-9_-]+@[a-zA-Z0-9_-]+(\.[a-zA-Z0-9_-]+)+$/;
// 在这里挂载对应的路由
// 用户注册
router.post('/user/regist', (req, res) => {
console.log("post-成功");
// 获取参数
const body=req.body;
const name=body.name;
const pwd1=body.pwd1;
const pwd2=body.pwd2;
const email=body.email;
// 用户名,密码,邮箱不符合要求
if (!reg_name.test(name)||!reg_pwd.test(pwd1)||!reg_email.test(email)) {
res.send({
status: "403",
msg: 'false'
});
}
else if(pwd1!=pwd2) {
res.send({
status: "403",
msg: 'false'
});
} else {
const sql="insert into people(name,pwd,email) values(?,?,?)";
db.query(sql,[name,pwd1,email],(err,result)=>{
if(err){
res.send({
status: "200",
msg: 'true',
msg2:"后台注册异常!"
});
return console.log("sorry open fail !!!"+err.message);
}
if(result.affectedRows===1){
res.send({
status: "200",
msg: 'true',
msg2:"注册成功!"
});
}
})
}
})
// 定义 get 接口
// 登录
router.get('/user/login', (req, res) => {
console.log("get-成功");
// 获取参数
const body=req.query;
const name=body.name;
const pwd1=body.pwd;
// 用户名,密码,不符合要求
if (!reg_name.test(name)||!reg_pwd.test(pwd1)) {
res.send({
status: "403",
msg: 'false'
});
}else{
const sql="select * from people where name=? and pwd=?";
db.query(sql,[name,pwd1],(err,result)=>{
if(err){
res.send({
msg:"后台查询异常!"
});
return console.log("sorry open fail !!!"+err.message);
}else{
res.send({
result
});
}
})
}
})
// 定义 put 接口,更新操作是用户名,密码,邮箱均可覆盖,以id为准了
/** 请求的数据类型
{
"id":2,
"name":"zhangsan",
"pwd1":"Hyl@1234",
"pwd2":"Hyl@1234",
"email":"1111111115@qq.com"
}
*/
// 用户修改
router.put('/user/update', (req, res) => {
console.log("put-成功");
// 获取参数
const body=req.body;
const id=body.id;
const name=body.name;
const pwd1=body.pwd1;
const email=body.email;
// console.log(id+" "+name+" "+pwd1+" "+email);
// 用户名,密码,邮箱不符合要求
if (!reg_name.test(name)||!reg_pwd.test(pwd1)||!reg_email.test(email)) {
res.send({
status: "403",
msg: 'false'
});
}else{
//做更新操作
const sql="update people set name=?,pwd=?,email=? where id=? ";
db.query(sql,[name,pwd1,email,id],(err,result)=>{
if(err){
res.send({
msg: '后台更新异常'
});
return console.log("sorry open fail !!!"+err.message);
}
// res.send(result);
// 做查询操作
if(result.affectedRows===1){
const sql="select * from people where name=? and pwd=?";
db.query(sql,[name,pwd1],(err,result)=>{
if(err){
res.send({
msg:"后台查询异常!"
});
return console.log("sorry open fail !!!"+err.message);
}else{
res.send({
result
});
}
})
}else{
res.send({
msg:"更新失败!"
});
}
})
}
})
// 定义 DELETE 接口
router.delete('/user/delete', (req, res) => {
console.log("delete-成功");
// 获取参数
const body=req.body;
const id=body.id;
const sql="delete from people where id=?";
db.query(sql,[id],(err,result)=>{
if(err){
res.send({
msg:"false-后台删除异常!"
});
return console.log("sorry open fail !!!"+err.message);
}
if(result.affectedRows===1){
res.send({
msg:"true-删除成功!"
});
}else{
res.send({
msg:"false-删除失败!"
});
}
})
})
// 条件查找
router.get('/user/list', (req, res)=>{
console.log("list-成功");
const query=req.query;
const name=query.name;
const email=query.email;
let sql="select * from people ";
// 写法比较笨,不太会sql动态拼接
if(name!=undefined && email==undefined){
sql+="where name like '%"+name+"%'";
}
else if(name==undefined && email!=undefined){
sql+="where email like '%"+email+"%'";
}
else if(name!=undefined && email!=undefined){
sql+="where name like '%"+name+"%' and email like '%"+email+"%'";
}
else{
sql+="where id=0";
}
// console.log(sql);
db.query(sql,(err,result)=>{
if(err){
res.send({
msg:"false-后台查询出异常了!"
});
return console.log("sorry open fail !!!"+err.message);
}
// console.log(result);
res.send({
msg:result
});
})
})
module.exports = router
服务端启动类 Main.js
const express=require("express");
const app=express();
// 配置解析application/json格式数据的内置中间件
app.use(express.json());
//配置解析application/x-www-form-urlencoded 格式数据的内置中间件
app.use(express.urlencoded({extended:false}));
// 导入自定义路由模块
const router=require("./myRouter.js");
app.use(router);
app.listen(8080,()=>{
console.log("Running at http://localhost:8080");
})
4.总结
对第五点,模糊查询这一块儿,对自己的写法不满意,因为太死板了,参数少可以,参数多不得累死啊,还是得多了解动态sql拼接啊(本来我是想用的,但是这个过程中一直报错,实验有时间限制,所以只能这么笨啦!唉,我就是个傻蛋~~)