nodejs项目实战(带源码)

news2024/11/25 7:02:31

nodejs项目实战

    • 主要实现功能
        • 用户模块
        • 文章分类模块
        • 文章模块
        • 核心代码
      • 数据库
        • 完整代码

主要实现功能

本项只适合新手,是一个接口类的项目,主要涉及一些增删改查功能以及三方包的使用,主要包括用node实现写用户登录注册,添加删除文章,添加删除分类的接口等,完整代码在末尾

用户模块

用户登录
用户注册
查询用户信息
更新用户信息
重置用户密码
更换用户头像

文章分类模块

获取文章分类
添加分类
根据id删除分类
根据id获取分类
根据id跟新分类

文章模块

获取所有文章信息
添加文章
删除文章

核心代码

项目入口文件app.js
cors 处理跨域请求
expressJWT 验证token字符串
app.use(express.json()) 解析前端发送的json数据

app.use(expressJWT({secret:'123456'}).unless({path:[/^\/api\//]}))

这个中间件是用来解析token,并验证除/api开头以外的所有接口访问都需要token

const express = require('express')
const cors = require('cors')
const expressJWT = require("express-jwt");

const app = express()


//处理跨域请求
app.use(cors())

//解析数据
app.use(express.json())      
// app.use(express.urlencoded({extends:false}))


//解析token
app.use(expressJWT({secret:'123456'}).unless({path:[/^\/api\//]}))


//路由模块
const userRouter = require("./router/user.js")
app.use('/api',userRouter)
const userInfo = require("./router/userInfo.js")
app.use('/my',userInfo)
const artcate = require("./router/artcate.js")
app.use('/my',artcate)
const article = require("./router/article.js")
app.use('/my',article)

//错误级别中间级
app.use((err,req,res,next)=>{
    if (err) {
        console.error(err.message);
        res.status(err.status || 500).json({ error: err.message });
    }
})

app.listen(3000,()=>{
    console.log("serve is running at http://127.0.0.1:3000")    
})

数据库配置文件,重点是要记得导出module.exports = db

const mysql = require('mysql')

const db = mysql.createPool({
    host:"127.0.0.1",
    user:"root",
    password:"123456",
    database:"my_db"
})

module.exports = db

剩下的就是路由模块,以user为例其他都是类似的
user.js

const express = require('express')

//导入路由对应的处理函数
const userHandler = require("../router_handler/user.js")

const router = express.Router()


//注册
router.post('/register',userHandler.regUser)

//登录
router.post('/login',userHandler.login)

module.exports = router

路由处理函数
bcrypt 加密用户密码
jwt 生成token

const db = require("../db/index.js")

const bcrypt = require('bcryptjs')

const jwt  = require("jsonwebtoken")

const secretKey = "123456"

//用户注册处理函数
exports.regUser = (req,res)=>{
    const data = req.body

    const sql = "select*from tb_users where username = ?"
    db.query(sql,data.username,(err,result)=>{
       if(err || result.length>0){
        return res.json({
            code:400,
            msg:"用户已存在"
        })
       }

        const sqlStr = "insert into tb_users (username,password) values (?,?)"
        data.password = bcrypt.hashSync(data.password,10)
        db.query(sqlStr,[data.username,data.password],(err,result)=>{
            if(err){
                return res.json({
                    code:400,
                    msg:err.message
                })
            }
            res.json({
                code:200,
                msg:"注册成功"
            })
        })
    })
}

//用户登录处理函数userHandler.js
exports.login = (req,res)=>{
    const data = req.body
    const sql = "select password from tb_users where username=?"
    db.query(sql,data.username,(err,result)=>{
        if(err||result==0){
            return res.json({
                code:400,
                msg:"该用户不存在"
            })
        }
        const storedHash = result[0].password;  // 获取存储的哈希值reslut是一个数组
        const passwordMatch =bcrypt.compareSync(data.password, storedHash)
        if(!passwordMatch){
            return res.json({
                code:400,
                msg:"用户名密码不匹配"
            })
        }
        const payload = {
            username: data.username, // 用户名
            // 其他用户相关的信息可以在这里添加
        };
        const token = jwt.sign(payload,secretKey,{expiresIn:'10h'})    //  设置token 有效时长10h
        return res.json({
            code:200,
            msg:"登录成功",
            token:'Bearer '+token
        })
    })
}

运行项目 node app.js

数据库

一共三个数据表,字段如下,可以自己建表
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

完整代码

https://github.com/Traderxue/node-demo

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1022606.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

机器学习——聚类算法

0、前言: 机器学习聚类算法主要就是两类:K-means和DBSCAN聚类:一种无监督的学习,事先不知道类别(相当于不用给数据提前进行标注),自动将相似的对象归到同一个簇中 1、K-means: 原理…

idea项目配置三大步

场景: 使用 idea 打开一个新项目的时候,想让项目迅速跑起来, 其实只需要下面简单三步: 1. 首先,配maven 2. 其次,配置 jdk 这里配置 project 就行了,不用管Modules中的配置。 3. 最后&#…

德纳 Dana EDI 项目案例

德纳 Dana是一家总部位于美国的公司,专门从事车辆传动和密封解决方案。它设计、制造和销售各种汽车零部件,如轴、传动系统、密封件等。该公司在汽车行业中具有悠久的历史,为各种不同类型的车辆提供关键的机械和工程解决方案。 项目背景与目标…

pythonSDK安装+Visual Studio Code

安装PythonSDK 点击去下载python的SDK:https://www.python.org/ 去下载 双击 下载好的安装包 等待安装可能会很慢… 如何验证是否成功安装了python的SDK Windows电脑 打开 CMD 窗口 如何打开 CMD 窗口 键盘 按 wind R python安装编辑器 Visual Studio Code…

在华为云服务器上CentOS 7安装单机版Redis

https://redis.io/是官网地址。 点击右上角的Download。 可以进入https://redis.io/download/——Redis官网下载最新版的网址。 然后在https://redis.io/download/页面往下拉,点击下图超链接这里。 进入https://download.redis.io/releases/下载自己需要的安装…

弱监督目标检测:ALWOD: Active Learning for Weakly-Supervised Object Detection

论文作者:Yuting Wang,Velibor Ilic,Jiatong Li,Branislav Kisacanin,Vladimir Pavlovic 作者单位:Rutgers University;The Institute for Artificial Intelligence Research and Development of Serbia;Nvidia Corporation 论文链接:http:…

如何使用微信编辑器的这个功能呢?

微信编辑器是一个非常实用的公众号工具,除了能够进行文字编辑和排版外,还有一个特别实用的功能,就是可以将图片转换成PDF格式。这个功能对于需要将多张图片合并成一份文件的人来说,无疑是一个非常方便的解决方案。 那么&#xff…

docker学习1-基本概念

Docker jar包环境镜像,镜像存在docker仓库中,随用随取,无需现配环境 docker通过隔离机制,各个镜像之间互不干扰 docker比vm轻量化,每次只需运行镜像即可,镜像占内存小启动快,虚拟机启动慢&…

阿里云PAI-灵骏大模型训练工具Pai-Megatron-Patch正式开源!

作者: 李鹏,王明,施晨,黄俊 导读 随着深度学习大语言模型的不断发展,其模型结构和量级在快速演化,依托大模型技术的应用更是层出不穷。对于广大开发者来说不仅要考虑如何在复杂多变的场景下有效的将大模型…

spring_javaConfig实现配置

现在我们尝试不使用Spring的XML文件来配置了,全权交给Java来做 1 编写pojo类 这个类要被Spring接管,要被注册到容器中 添加Component注解通过Value注解来为属性注入值 package com.wq.pojo;import org.springframework.beans.factory.annotation.Value…

GitHub平台 Bookget操作

以bookget为例,熟悉github平台。 https://github.com/deweizhu/bookget 选择该界面中的“Wiki”,右侧边栏中是文章的结构大纲。 下载bookget软件。 依照说明,安装bookget环境。

面向使用者的git与gerrit相关笔记

git与gerrit相关笔记 前言一、gerrit是什么?二、一些配置1.先配置全局email 和name2.gerrit配置ssh key3.可能遇到的问题 三、提交代码和合并冲突常用Git命令三件套严格的要求 总结 前言 本文是介绍什么是gerrit和工作中git与gerrit相关的命令来避免一些提交代码的…

OpenCV之cvtColor颜色空间转换

大多数彩色图片都是RGB类型,但是在进行图像处理时,需要用到灰度图、二值图、HSV、HSI等颜色制式,opencv提供了cvtColor()函数来实现这些功能。首先看一下cvtColor函数定义: C: void cvtColor(InputArray src, OutputArray dst, in…

cloudflare配置防火墙WAF阻止或允许特定国家或地区访问

当 cloudflare 域名需要阻止或允许特定国家或地区访问时,可以在cloudflare的 WAF 里配置,官网也有 配置指南 说明,点击直达。 以下是仅允许中国区访问的配置: 安全性 --> WAF --> 创建规则,输入要创建规则的名称…

正态分布的推导笔记

本篇文章来源于知乎上一篇关于正态分布推导的文章,醍醐灌顶,因此记录下笔记 from Introduction To The Normal Distribution (Bell Curve), BySaul Mcleod, PhD, https://www.simplypsychology.org/normal-distribution.html 假设有误差概率密度函数 f …

VMwave虚拟机配置和外网联通

还原默认设置之后,参考 VMwave 虚拟机的三种上网方式_51CTO博客_虚拟机网络设置的三种 设置桥接模式 ,配置虚拟机为静态IP(网段和主机相通)。

利用prctl 函数给线程命名

头文件&#xff1a; #include <sys/prctl.h> 函数原型&#xff1a; extern int prctl (int __option, ...) 作用&#xff1a; 这个函数是为系统量身定做的&#xff0c;它的功能取决于第一个参数 option &#xff1b; 参数含义&#xff1a; option:功能选项 arg2~ar…

动画制作如何选择动作捕捉动画制作服务

近日&#xff0c;长宁ART PARK 大融城迎来了首位虚拟代言人“光艺”&#xff0c;拥有着极具感染力的笑容、数字人形象辨识度极高&#xff0c;在裸眼3D巨屏中&#xff0c;为市民带来虚实交互体验。而这种数字人动画的背后&#xff0c;大多以动作捕捉动画制作技术为主。 *素材源于…

opengl下的视锥体剔除和凸多边形剔除

预备知识 法线方程表达式的一般形式为Ax+By+Cz+D=0,其中(A,B,C)是平面的法向量,D是平面的截距。 平面上一点为P(x0,y0,z0),则点P到平面的距离为:d = |Ax0+By0+Cz0+D| / √(A+B+C) (因为法向量没有归一化,所以得到法向量上的投影要除以法向量长度) 假设n是归一化后的法向…

企业架构LNMP学习笔记50

aof默认是不开的。备份频率是更高的。 aof备份的频率&#xff1a; appendfsync always&#xff1a; 每次收到写命令就立即强制写入磁盘&#xff0c;最慢的&#xff0c;但是保证完全持久化&#xff0c;不推荐使用。 appendfsync everysec&#xff1a; 每秒强制写入磁盘一次&a…