Node.js模拟实现登录注册

基于Node.js的模拟登录操作       在一次比较久远的课程设计中,我和小组成员做了一个本校大学生二手市场交易平台网站,其中有一个功能是学生用户注册账号之后必须经过学生身份验证才能获取发布二手商品和交易等一系列权限,否则你注册的账号只能是属于“僵尸号”,只可观看别人发布的商品信息,其他基本上什么都干不了。那时候我想到的是通过模拟登录学生信息管理系统的方式来验证学生身份,即学生用户通过输入自己的学生账号和密码,然后服务端将这些... 阅读详情

一:建文件夹,搭建目录

项目开始前先建好文件夹目录,如下图:
我2在这里插入图片描述
强调一点:是什么样的文件类型就放到什么类型的文件夹中,不要搞混,尤其是在项目当中要特别注意!!!

二:写静态页面

1./register注册页面html

<div class="box">
        <h1>用户注册</h1>
        <div class="uname">
            <span>用户名:</span><input type="text" placeholder="请输入您的用户名" id="username">
        </div>
        <div class="pwd">
            <span>密码:</span><input type="password" placeholder="请输入您的密码" id="password">
        </div>
        <div id="register">
            <input type="button" value="立即注册" id="btn">
            <a href="./login.html">前往登录</a>
            <span id="ts"></span>
        </div>
    </div>

/register注册页面css

* {
    margin: 0;
    padding: 0;
}

*::selection {
    background: none;
}

body {
    background: url(../img/register.jpg) no-repeat;
    background-size: 100%;
}

.box {
    width: 400px;
    height: 240px;
    border: 2px solid #000;
    background-color: #ccc;
    opacity: .7;
    border-radius: 8px;
    margin: 60px auto;
}

h1 {
    text-align: center;
    margin-bottom: 20px;
}

.box span {
    display: inline-block;
    width: 70px;
    height: 50px;
    margin-left: 66px;
}

.uname input,
.pwd input {
    width: 200px;
    height: 24px;
}

#register {
    text-align: center;
}

#register span {
    display: block;
    margin: 10px auto;
    width: 100%;
    height: 20px;
    font-size: 14px;
}

#register input {
    width: 200px;
    height: 30px;
    background-color: #ff3040;
    outline: none;
    border: none;
    cursor: pointer;
}

#register a {
    text-decoration: none;
}

2./login登录页面html

 <div class="box">
        <form action="">
            <p>欢迎登录</p>
            <div class="uname">
                <span>用户名:</span><input type="text" placeholder="请输入您的用户名" id="username">
            </div>
            <div class="pwd">
                <span>密码:</span><input type="password" placeholder="请输入您的密码" id="password">
            </div>
            <div class="login">
                <button>立即登录</button>
                <span id="wz"></span>
            </div>
            <div class="footer">
                <a href="register.html" class="left" target="_blank">新用户注册</a>
                <a href="register.html" class="right" target="_blank">忘记密码?</a>
            </div>
        </form>
    </div>

/login登录页面css

* {
    margin: 0;
    padding: 0;
}

*::selection {
    background: none;
}

body {
    background: url(../img/login.jpg);
}

.box {
    width: 400px;
    height: 220px;
    border: 2px solid #000;
    margin: 200px auto;
    text-align: center;
    border-radius: 8px;
}

.box p {
    font-size: 26px;
    font-weight: 700;
    color: rgb(0, 0, 0);
    margin-bottom: 20px;
}

.uname,
.pwd {
    padding-right: 44px;
}

.uname span,
.pwd span {
    display: inline-block;
    width: 60px;
    text-align: right;
}

.uname input,
.pwd input {
    width: 200px;
    height: 20px;
    margin-left: 8px;
    margin-bottom: 10px;
}

.login button {
    width: 100px;
    height: 30px;
    background-color: orangered;
    border: none;
    outline: none;
    border-radius: 8px;
    cursor: pointer;
}

.login span {
    display: block;
    margin: 10px auto;
    width: 100%;
    height: 20px;
    font-size: 14px;
}

.footer {
    position: relative;
    margin-top: 10px;
}

.footer a {
    text-decoration: none;
    font-size: 14px;
    color: black;
}

.footer a:hover {
    color: red;
}

.footer .left {
    position: absolute;
    left: 20px;
}

.footer .right {
    position: absolute;
    right: 20px;
}

3./index首页html

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>首页</title>
    <style>
        * {
            margin: 0;
            padding: 0;
        }

        body {
            background: url(../img/index.jpg) no-repeat;
        }

        h1 {
            text-align: center;
        }
    </style>
</head>

<body>
    <h1>Welcome to my index</h1>
</body>

</html>

4./404页面html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>错误</title>
</head>
<body>
    <h1>404 Not Found Page</h1>
</body>
</html>

三:写app.js,搭建node环境

下面展示代码:

// 通过http模块创建服务器,并监听3000端口
const http = require("http")
const server = http.createServer()
const fs = require("fs")
const url = require("url")
const queryString = require("querystring")

server.on("request", (req, res) => {
    // 静态伺服
    const requrl = url.parse(req.url, true)
    // 读取register文件
    if (req.url == "/" || req.url == "/register.html" && req.method == "GET") {
        fs.readFile("./register.html", "utf8", (err, data) => {
            if (err) {
                fs.readFile("./404.html", "utf8", (err, data) => {
                    res.end(data)
                })
            } else {
                res.setHeader("Content-type", "text/html")
                res.end(data)
            }
        })
        // 读取reg.css
    } else if (req.url == "/css/register.css" && req.method == "GET") {
        fs.readFile("../css/register.css", "utf8", (err, data) => {
            if (err) {
                console.log(err)
            } else {
                res.setHeader("Content-type", "text/css")
                res.end(data)
            }
        })
        // 读取login文件
    } else if (req.url == "/login.html" && req.method == "GET") {
        fs.readFile("./login.html", "utf8", (err, data) => {
            if (err) {
                fs.readFile("./404.html", "utf8", (err, data) => {
                    res.end(data)
                })
            } else {
                res.setHeader("Content-type", "text/html")
                res.end(data)
            }
        })
        // 读取login.css
    } else if (req.url == "/css/login.css" && req.method == "GET") {
        fs.readFile("../css/login.css", "utf8", (err, data) => {
            if (err) {
                console.log(err)
            } else {
                res.setHeader("Content-type", "text/css")
                res.end(data)
            }
        })
        // 读取index文件
    } else if (req.url == "/index.html" && req.method == "GET") {
        fs.readFile("./index.html", "utf8", (err, data) => {
            if (err) {
                fs.readFile("./404.html", "utf8", (err, data) => {
                    res.end(data)
                })
            } else {
                res.setHeader("Content-type", "text/html")
                res.end(data)
            }
        })
        //读取jquery文件
    } else if (req.url == "/js/jquery-3.4.0.js" && req.method == "GET") {
        fs.readFile("../js/jquery-3.4.0.js", "utf8", (err, data) => {
            if (err) {
                console.log(err)
            } else {
                res.end(data)
            }
        })
        //读取图片
    } else if (req.url == "/img/index.jpg" && req.method == "GET") {
        fs.readFile("../img/index.jpg", (err, data) => {
            if (err) {
                console.log(err)
            } else {
                res.setHeader("Content-type", "image/jpg")
                res.end(data)
            }
        })
    } else if (req.url == "/img/login.jpg" && req.method == "GET") {
        fs.readFile("../img/login.jpg", (err, data) => {
            if (err) {
                console.log(err)
            } else {
                res.setHeader("Content-type", "image/jpg")
                res.end(data)
            }
        })
    } else if (req.url == "/img/register.jpg" && req.method == "GET") {
        fs.readFile("../img/register.jpg", (err, data) => {
            if (err) {
                console.log(err)
            } else {
                res.setHeader("Content-type", "image/jpg")
                res.end(data)
            }
        })
    }
    //注册接口/register
    else if (requrl.pathname == '/register' && req.method == 'POST') {
        let str = '';
        req.on('data', (chunk) => {
            // console.log(0)
            str += chunk;
        })
        // console.log(1)
        req.on('end', () => {
            // console.log(2)
            let dataObj = queryString.parse(str);
            console.log(dataObj) //对象
            fs.readFile('../data/person.json', 'utf8', (err, data) => {
                // console.log(3)
                // console.log(data)
                let obj = JSON.parse(data) //数组
                for (let i = 0; i < obj.length; i++) {
                    if (obj[i].username == dataObj.username) {
                        return res.end('3')
                    }
                }
                obj.push(dataObj)
                fs.writeFile('../data/person.json', JSON.stringify(obj), 'utf8', (err, result) => {
                    if (err) {
                        return res.end('2')
                    }
                    return res.end('1')
                })
            })
        })
    }
    //登录接口/login
    else if (requrl.pathname == '/login' && req.method == 'GET') {
        // console.log(requrl)
        // let userInput = queryString.parse(requrl.query)
        // console.log(userInput)
        // console.log(requrl.query);

        fs.readFile('../data/person.json', 'utf8', (err, data) => {
            console.log(data)
            if (err) {
                console.log(1);
            } else {
                let obj = JSON.parse(data)
                // console.log(obj)
                for (let i = 0; i < obj.length; i++) {
                    if (obj[i].username == requrl.query.username && obj[i].password == requrl.query.password) {
                        return res.end('1')
                    } else if (obj[i].username == requrl.query.username && obj[i].password != requrl.query.password) {
                        return res.end('3')
                    }
                }
            }
        })
    }
})

server.listen(3000, () => {
    console.log("服务器已启动")
})

四:Ajax请求

1./register页面

 <script src="../js/jquery-3.4.0.js"></script>
    <script>
        $('#btn').on('click', () => {
            $.ajax({
                url: '/register',
                type: 'POST',
                data: {
                    username: $('#username').val(),
                    password: $('#password').val()
                },
                success: function (res) {
                    switch (res) {
                        case '1':
                            $('#ts').text('用户注册成功');
                            $('#ts').css('color', 'green');
                            window.location.href = './login.html';
                            break;
                        case '2':
                            $('#ts').text('用户注册失败');
                            $('#ts').css('color', 'red');
                            break;
                        case '3':
                            $('#ts').text('该用户已注册').fadeOut(2000);
                            $('#ts').css('color', 'red');
                            break;
                        case '4':
                            $('#ts').text('未知错误')
                            $('#ts').css('color', 'red');
                            break;
                    }
                }
            })
        })
    </script>

2./login页面

<script src="../js/jquery-3.4.0.js"></script>
    <script>
        $('button').on('click', () => {
            $.ajax({
                url: '/login',
                type: 'GET',
                data: {
                    username: $('#username').val(),
                    password: $('#password').val()
                },
                success: function (res) {
                    switch (res) {
                        case '1':
                            $('#wz').text('登陆成功')
                            $('#wz').css('color', 'green');
                            window.location.href = './index.html'
                            break;
                        case '2':
                            $('#wz').text('登录失败');
                            $('#wz').css('color', 'red');
                            break;
                        case '3':
                            $('#wz').text('密码错误');
                            $('#wz').css('color', 'red');
                            break;
                        case '4':
                            $('#wz').text('未知错误');
                            $('#wz').css('color', 'red');
                            break;
                    }
                }
            })
        })
    </script>

五:创建json存放数据

在这里插入图片描述

六:打开node运行测试app.js文件

如果没有node的可以自行去官网下载安装包,安装步骤next->next->…(参考傻瓜式教程)
一般默认为3000端口,代码中有说明,node打开以后在网址中输入localhost:3000/就可以访问了,感兴趣的同学可以下去试一试,另外代码中还有不少需要改进的地方,希望读者能够及时指正,一起进步

手把手教你用nodejs 模拟人工输入账号密码自动登录,爬取网页数据生成xlsx 网页数据抓取并导入xlsx。 xlsx数据批量录入到网页系统中。 自动登录网页,并根据某些值进行某些操作,比如点击按钮,刷新网页。 定点秒杀商品等。 情景1: 比如一个网页有一个表格,里面有很多学生信息(身高,体重,爱好等)。 这时候想把这些数据全部放在xlxs里,手动的话,得一条一条复制 就是有200条信息,你也得复制2-3小时, 但是用本程序,可以自动批量把数据导入到xlsx,只要你运行程序,数秒就把数据下载并生成xlsx文件(支持翻页数据) 情景2: 比如市场调... 阅读详情

相关推荐

js函数版ATM机

函数版ATM机,利用数组里的数据进一步实现关于有函数的ATM机 函数版ATM机简易功能有 1.登录及注册账号 2.查询余额 3.存钱 4.取钱 5.修改密码 6.转账 7.切换用户等 const readline = require("readline-sync"); //数组数据 let accArr = [ "z3", "123", 1000, "l4", "234", 2000, "qzw", "345", 3000 ]; //循环状态 let stat

Qzw799的博客 717

Node.js实现登陆注册

1.服务器端 在项目里创建一个json文件用来存储数据,通过express创建服务器对象,fs模块对文件进行读写。 运用post请求 代码如下: var express = require('express') var fs = require("fs") var app = express() app.use(express.static("www")) app.use(express.urlencoded({extended:false})) // 先获取user.json里面的数据和req.

m0_54089303的博客 4942

NodeJs模拟登陆正方教务

网上已经有很多关于模拟登陆正方教务的作品了,基于 PHP,Python,Java,.Net 加上NodeJs,这几门语言都可以实现模拟登陆,模拟登陆的技术点不是特别难,这里记录一下利用Node碰到的一些坑,以及一些解决思路。

nodejs---express框架模拟用户登录

  一、Express简介 Express 是一个简洁而灵活的 node.js Web应用框架, 提供了一系列强大特性帮助你创建各种 Web 应用,和丰富的 HTTP 工具。使用 Express 可以快速地搭建一个完整功能的网站。express保留了原生的功能,添加了一些方法(比如:send),增强原有的功能。 1.express安装 npm install express 执行以上命...

maidu_xbd的博客 1166

node.js+express+mySQL+ejs+bootstrop实现网站登录注册功能

主要介绍了node.js+express+mySQL+ejs+bootstrop实现网站登录注册功能,非常不错,具有参考借鉴价值,需要的朋友可以参考下

电子工程师必看:dB与放大倍数快速换算表(附常见误区解析)

本文为电子工程师提供了dB与放大倍数快速换算的实战指南。文章深度解析了分贝的本质与核心价值,并提供了电压/电流与功率增益的速查表及心算技巧。重点剖析了混淆电压与功率dB、-3dB带宽理解等常见误区,并结合示波器、频谱仪测量及系统级应用,帮助工程师在实际工作中高效、准确地运用这一对数工具。

weixin_29214199的博客 645

node.js初步:登录注册服务器端实现(无数据库模拟版)

2009年,node.js横空出世。v8引擎的高效渲染和基于JS异步的性能,让其“一夜之间”火爆全球。 最近刚结束了一个项目,再加上一直以来对后端有些许兴趣,于是把目光瞄向了node.js这门基于JS的后端语言! 这篇文章根据登录注册这个小demo来认识一下node,也算熟悉一下后端开发。 模块 node.js中最强的莫过于“模块化”了。各式各样的模块,诸如:http、https、fs…层出不穷,...

flying meng的菜鸟居 1159

库存预测新思路:AI架构师的图神经网络应用

用图神经网络(GNN)解决传统库存预测的“关联盲区”,让预测从“孤立商品”转向“商品网络”。传统库存预测的痛点分析;GNN的核心概念(图结构、消息传递);GNN在库存预测中的算法原理与代码实战;实际应用场景与未来趋势。背景:用超市老板的烦恼引出传统方法的问题;核心概念:用“商品朋友圈”比喻GNN的图结构和消息传递;算法原理:用数学公式和Mermaid流程图讲清楚GNN的工作流程;实战:用PyTorch Geometric写一个简单的库存预测模型;

AI Python 编程之道的博客 957

node简单模拟用户注册、登录

www目录下的内容: //(ajax.js) /** * Author:strive * Date: 2016/1/13 */ function json2url(json){ var arr=[]; for(var name in json){ arr.push(name+'='+json[name]); } return arr.joi...

归零 700

用Arduino和FS-i6X遥控器,从零开始打造你的第一只仿生扑翼蝴蝶(附完整代码解析)

本文详细介绍了如何利用Arduino和FS-i6X遥控器从零开始制作仿生扑翼蝴蝶,包括硬件准备、电路连接、代码解析和调试技巧。通过完整的代码示例和参数说明,帮助读者快速掌握仿生机器人的制作要点,实现蝴蝶的自然飞行效果。

weixin_28727975的博客 303

maya权重拷贝一对一,一对多

是不是有时候盔甲很多很碎头很大,用代理一个个拷贝很麻烦吧 用下面代码直接运行进行一对多或者一对一拷贝 第一个先选择参考物体,加选其他一堆有的没的有权重或没权重的物体执行一键拷贝,就可以啦 以下是源码送上,带走吧 ------------------------ #! -*- coding:utf -8 -*- #author:liubingdong #date:20...

weixin_30852367的博客 1528

【Node.js】模拟路由渲染页面和登录操作

Node.js模拟路由渲染页面和登录 Index.html <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Index</title> </head> &l

qq_37086980的博客 260

飞腾Ubantu22.04.3安装OpenNebula测试

因OpenneBula官方镜像源只有AMD架构的镜像包不存在ARM的镜像包,借此用源码编译进行测试。

坚持就是胜利的博客 1005

nodejs 原生js模拟注册登陆 用到模块http、url、querystring

模拟服务器端的get,post,文件请求。 利用jquery,ajax get模拟注册和登陆。 server.js const http=require('http'); const url=require('url'); const querystring=require('querystring'); const fs=require('fs'); let user={ }; h...

Dosth_Magic 352

路由工具之策略路由policy-based-routing、MQC三板斧流分类、流行为、流策略

PBR(Policy-Based Routing,策略路由)策略路由可理解为控制路由,因为PBR策略的优先级高于传统路由表的转发,所以它主要用于影响数据包转发的技术。

Hades_Ling的CSDN博客 5574

嵌入式开发板OpenClaw部署:ESP32-S3与RISC-V平台性能评估

ESP32-S3与RISC-V平台在OpenClaw部署中的性能评估 本文对比分析了ESP32-S3和RISC-V两种嵌入式平台在OpenClaw部署中的性能表现。ESP32-S3凭借240MHz双核Xtensa LX7处理器和专用AI加速器,特别适合轻量级AI推理任务;而RISC-V凭借开源架构和模块化设计,可实现更高的能效比。文章详细介绍了ESP32-S3-DevKitC-1、SiFive HiFive1等典型开发板的硬件规格,推荐了ESP-IDF和FreeRTOS等操作系统,并提供了完整的开发环

博客 1118

@restcontroller返回的是html不是json为啥_使用Node.js和JSON搭建简单的动态服务器

一、创建html页面创建4个页面,index.html、register.html、sign_in.html、home.htmlindex.html 默认主页register.html 用于注册账号sign_in.html 用于登录账号home.html 用于显示登录后的页面主要代码片段register.html 用户名: 密码: ...

weixin_36475420的博客 528

【代码版本管理】SVN(Subversion)

认知有限,望大家多多包涵,有什么问题也希望能够与大家多交流,共同成长!本文先对SVN(Subversion)代码版本管理做个简单的介绍,具体内容后续再更,其他模块可以参考去我其他文章提示:以下是本篇文章正文内容。

qq_35635374的博客 664

【Nodejs】回顾node中如何使用Express模块写接口_05

在网上查资料时,有看到比较高大上专业的说法,在nodejs中,接口是使用nodejs实现的包含方法、属性、索引器和事件作为成员对协定进行定义的引用类型,nodejs可以通过express模块来写接口。那什么是后端接口:个人认为,通俗的讲就是后端给前端提供的数据,和数据库的交互。

青春木鱼的博客 1339

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

node.js(四)小结

用之前的内容写一个简单的注册登录 const http = require('http') const urlLib = require('url') const fs = require('fs') const querystring = require('querystring') var users = {} // {"name":"password"} 模拟数据...

banxia2152的博客 272

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

小流域洪水计算器项目说明文档

管理路由 (`/api/users`, `/api/database/info`)- **2025-01-20**: 实现计算路由 (`calculations.ts`)- **2025-01-20**: 实现数据库模块 (`database.ts`)- **2025-01-20**: 实现OAuth路由 (`oauth.ts`)- **2025-01-20**: 完成主服务器文件 (`index.ts`)- **2025-01-20**: 实现认证路由 (`auth.ts`)

ltzc2019的博客 745

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

Node操作Mysql数据库

文章目录Node操作Mysql数据库安装mysql操作模块简单查询连接简单实现注册和登录模块功能 Node操作Mysql数据库 安装mysql操作模块 $ npm install mysql --save 简单查询连接 'use strict' //引入模块 const mysql = require('mysql'); //连接配置参数 let option = { host:'lo...

rufeike的博客 175

node.js实现分页和jwt鉴权机制

这段代码实现了一个简单的Node.js服务器,包括JWT鉴权和分页处理的功能。在实际应用中,你需要替换掉硬编码的用户信息和密钥,并且添加用户注册接口,以及更复杂的鉴权逻辑和数据库查询。// 解析请求体中的JSON数据。// 这里应该是用户验证的逻辑,假设用户名和密码都是'user1'// ...更多用户。// ...其他数据模型。// 用户登录API,生成JWT。// 获取用户列表的API。// 分页处理中间件。

Rverdoser的博客 685

《从零开始搭建Node.js+Vue3+ElementPlus企业级项目实战教程》第二章:登录页面开发与表单验证

本章详细介绍了使用Vue3开发登录页面的完整流程:首先安装配置VueRouter并修改App.vue加载路由;然后使用ElementPlus构建包含用户名、密码验证的登录表单;最后实现表单校验逻辑和模拟登录功能,成功登录后跳转至首页。通过具体代码示例,展示了路由配置、表单验证和页面跳转等核心功能的实现方法,为前端开发提供了完整的技术方案。

weixin_41548444的博客 435

自己虚拟服务器都用json可以吗,nodejs虚拟测试服务器`json-server`本身就是依赖express开发而来,可以进行深度定制...

app.js 部分const jsonServer = require('json-server');//在node里面使用json-server包const db = require('./db.js');//引入mockjs配置模块// const multer = reuqire('multer');const path = require('path');const Mock = requ...

weixin_33773084的博客 306

前端写的接口mock平台

思路一个接口请求包含了请求行, 请求头, 请求内容。 那我们就可以通过node解析一个请求然后对这个接口的内容进行匹配, 将符合接口请求的条件的数据返回去, 这样就像一个faker。 伪造了一个真正的接口会返回的数据, 从而达到和真正的接口一样的效果。实现实现的功能: 1. 登录注册 2. 增删项目工程 3. 增删接口 4. 接口mock 技术栈: nextjs + koa + sql...

qq_39581763的博客 569
上一篇: 函数柯里化介绍及使用
Eric_freestyle
博客等级 码龄6年 9粉丝 10原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值