登录注册页面的模拟

流程:

前端:
1.注册
2.登录
3.首页

后端:
1.注册
url:/register
type:post
params:{
    user:'******'(require),
    pwd:'******'(require)
}
res:{
    code:200,
    status:1,(0 注册失败,1 注册成功),
    err:'失败原因',
    info:{
        userID:1,(后台生成)
        user:'******',
        pwd:'******'
    },
    msg:"注册成功"
}

2.登录
req:
url:/login
type:post
params:{
    user:'******'(require),
    pwd:'******'(require)
}

接下来,按照上述流程写后端:

1.创建user.json

 

2.创建app.js

const http = require('http');
const { URL } = require('url');
const fs = require('fs');
const path = require('path');
// 引⼊模块
const mime = require('./mime.json')
// req:请求,后端给前端
// res:响应,前端给后端
http.createServer((req, res) => {
    // 将req.url 进⾏处理
    let myUrl = new URL('http://localhost:3000' + req.url);
    let url = myUrl.pathname; //路由
    static(req, res, myUrl); //是否读取静态⽂件
    if (url === '/register') {
        //注册
        doPost(req, (obj) => {
            doRegister(res, obj);
        });

    } else if (url === '/login') {
        //登录
        doPost(req, (obj) => {
            doLogin(res, obj);
        });
    }
}).listen(3000, () => {
    console.log('http server is running on port 3000')
})
// 读取静态⽂件
function static(req, res, myUrl) {
    if (myUrl.pathname.includes('.')) {
        // 说明这是个静态⽂件
        // 1. 确定静态⽂件的路径
        let filepath = __dirname + myUrl.pathname;
        // ⽂件后缀名
        let ext = path.extname(filepath);
        let type = mime[ext];
        // 2. 读取他
        fs.readFile(filepath, (err, data) => {
            // 3. 返回他
            // ⼀定要写响应头
            res.writeHead(200, { 'content-type': type })
            res.end(data);
        })

    }
}
// 完成post数据接收
function doPost(req, cb) {
    let data = ''; //数据
    // 分段接收数据
    req.on('data', chunk => {
        // chunk是个buffer(二进制数据流)
        data += chunk;
    })
    // 数据接受完毕
    req.on('end', () => {
        let obj = search2obj(data.toString());
        cb(obj); //调⽤回调函数
    })
}
function search2obj(string) {
    // string = 'key=value&key=value'
    let obj = {};
    // 先分离 &
    let arr = string.split('&');
    arr.forEach(str => {
        // str = 'key=value'
        // 再分离 =
        let arr2 = str.split('=');
        // arr2 = ['key', 'value']
        let key = arr2[0];
        let value = arr2[1];
        obj[key] = value;
    })
    return obj;
}
function doLogin(res, obj) {
    // let obj = {
    // user: myUrl.searchParams.get('user'),
    // pwd: myUrl.searchParams.get('pwd')
    // }
    if (!myRule(obj.user) || !myRule(obj.pwd)) {
        // 不合规
        res.end(JSON.stringify({
            code: 200,
            status: 0,
            err: '⽤户名或者密码请按规定填写!'
        }))
        return;
    }
    let users = getAllUsers();
    if (!users) {
        // 读取内容失败
        res.end(JSON.stringify({
            code: 200,
            status: 0,
            err: '系统繁忙,请稍后再试!'
        }))
        return;
    }
    users = JSON.parse(users);
    let uu = null; //⽬标⽤户
    // 判断⽤户名是否⼀样
    users.some(item => {
        if (item.user === obj.user) {
            uu = item;
            return true;
        }
        return false;
    })
    if (!uu || uu.pwd !== obj.pwd) {
        // ⽤户不存在或密码错误
        res.end(JSON.stringify({
            code: 200,
            status: 0,
            err: 'user or pwd is wrong!'
        }))
        return;
    }
    res.writeHead(200, { 'content-type': 'text/html;charset=utf-8' })
    res.end(`
<script>
alert('登录成功');
location.href = 'http://localhost:3000/ll/index.html';
</script>
`)
}
function doRegister(res, obj) {
    // console.log(req);
    //处理 searchParams to obj
    // get 提交数据在req.url⾥
    // post 提交 需要使⽤事件来接受
    // let obj = {
    // user: myUrl.searchParams.get('user'),
    // pwd: myUrl.searchParams.get('pwd')
    // }
    console.log(obj);
    // 判断 ⽤户名 密码是否合规
    if (!myRule(obj.user) || !myRule(obj.pwd)) {
        // 不合规
        res.end(JSON.stringify({
            code: 200,
            status: 0,
            err: '⽤户名或者密码请按规定填写!'
        }))
        return;
    }
    // 2. 获取 user.json 所有的数据
    let users = getAllUsers();
    if (!users) {
        // 读取内容失败
        res.end(JSON.stringify({
            code: 200,
            status: 0,
            err: '系统繁忙,请稍后再试!'
        }))
        return;
    }
    // 3. 判断 obj.user是否存在
    users = JSON.parse(users);
    if (users.some(item => item.user === obj.user)) {
        // 存在
        res.end(JSON.stringify({
            code: 200,
            status: 0,
            err: '⽤户名已存在!'
        }))
        return;
    }
    // 为obj添加⼀个id
    obj.id = users.length + 1;
    users.push(obj);
    // 将users重新写⼊ user.json
    reSetUsers(users);
    res.writeHead(200, { 'content-type': 'text/html;charset=utf-8' })
    res.end(`
<script>
alert('注册成功');
location.href = 'http://localhost:3000/ll/login.html';
</script>
`)
}
// 正则 验证
// 规则:不允许出现特殊符号, 6-20位
function myRule(string) {
    const rule = /^\w{6,20}$/;
    return rule.test(string);
}
// 获取 user.json 的数据
function getAllUsers() {
    let path = __dirname + '/db/user.json';
    return fs.readFileSync(path, 'utf8');
}
// 重新写⼊ user.json
function reSetUsers(users) {
    let path = __dirname + '/db/user.json';
    return fs.writeFileSync(path, JSON.stringify(users));
}

3.编写前端页面

创建index.html,login.html,register.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>首页</title>
</head>
<body>
    <h1>欢迎来到聊聊</h1>
</body>
</html>
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>登录</title>
    <link rel="stylesheet" href="css/public.css">
</head>
<body>
    <h1>登录</h1>
    <form action="/login" method="post">
        <div class="user">
            <input type="text" name="user" placeholder="请输入用户名" required>
        </div>
        <div class="pwd">
            <input type="password" name="pwd" placeholder="请输入密码" required>
        </div>
        <input type="submit">
    </form>
</body>
</html>

 

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>注册</title>
    <link rel="stylesheet" href="css/public.css">
</head>
<body>
    <h1>注册</h1>
    <form action="/register" method="post">
        <div class="user">
            <input type="text" name="user" placeholder="请输入用户名" required>
        </div>
        <div class="pwd">
            <input type="password" name="pwd" placeholder="请输入密码" required>
        </div>
        <input type="submit">
    </form>
</body>
</html>

终端开启:

 

服务器:

 

 

点击确定跳转到登录页面

 

 

点击确定跳转到首页

 

 看user.json中此时已经有了刚才的数据

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值