登录页面:jwt的使用,数据库的使用,服务端全局拦截的运用,跨域的解决

本文介绍了如何在Node.js项目中使用jsonwebtoken进行API登录验证,包括生成和验证token,同时展示了如何封装mysql数据库操作,提供增删改查的接口,确保了应用程序的安全性和数据交互的便捷性。
摘要由CSDN通过智能技术生成

这一篇文章是用来解决登录的验证,以及没有登录的情况下直接访问后面页面的拦截。

一、下载jwt

npm install jsonwebtoken

注意:在下载相关的插件时,要先ctrl + c 退出,在下载

二、jwt相关文件的创建

在服务端文件创建util,专门用来存放需要用到相关插件代码

jwtutils.js

// 安全拦截器
const jwt = require("jsonwebtoken");

/**
 * 验证权限
 * @param token
 * @param secretkey 秘钥
 * @param success
 * @param error
 */
function verify(token, secretkey) {
    console.log(token)
    return new Promise((resolve, reject) => {
        jwt.verify(token, secretkey, function (err, decode) {
            if (err) {
                console.log('[verifyErr]')
                reject(err);
            } else {
                resolve(decode);
            }
        })
    }).catch(e =>{
        console.log('[verifyCatchErr]')
        console.error(e)
        throw new Error('令牌已过期')
    })
}

/**
 * 签名
 * @param load 载荷 json对象 存储存在
 * @param secretkey 秘钥
 * @param expiresIn 过期时间 秒
 * @returns {number | PromiseLike<ArrayBuffer>}
 */
function sign(load, secretkey, expiresIn) {
    var token = jwt.sign(load, secretkey, {expiresIn: expiresIn});
    return token;
}

module.exports = {verify, sign};

三、下载数据库mysql

npm install mysql

直接在里面对sql操作进行封装,然后export,可以更加便捷的去使用。

host、user、password、port填写自己电脑相对应的信息

database是你要连接的数据库名

引入之后,可以进入对应的文件夹,编写对应代码(比如console.log(selAll('user')))在命令提示符输入 node mysqlutils.js 来测试是否成功连接。

mysqlutils.js

// 操作数据库模块
const mysql = require('mysql');
const logPrefix = '[Mysql]'

const pool = mysql.createPool({
    host: 'localhost',
    user: 'root',
    password: 'root',
    port: '3306',
    database: 'child_terrace'
});
/**
 * 增删改查 通用组件  同步写法
 *
 * @param sql 增删改查sql 含占位符
 */
let execSql = function (sql) {

    var params = [];
    if (arguments.length > 1) {
        //js中有个变量arguments,可以访问所有传入的值
        for (var i = 1, l = arguments.length; i < l; i++) {
            params.push(arguments[i]);
        }
    }

    console.log(`[mysql] 参数: ${params.join()}`)
    console.log(`[mysql] 参数: ${sql}`)

    // 返回一个 Promise

        return new Promise((resolve, reject) => {
            pool.getConnection(function (err, connection) {
                if (err) {
                    reject(err)
                } else {
                    connection.query(sql, params, (err, results) => {
//在数据库里头所有的查询都用connection.xxxx0
                        if (err) {
                            reject(err)
                        } else {
                            console.log(`${logPrefix}result : ${JSON.stringify(results)}`);
                            resolve(results)
                        }
                        // 结束会话
                        connection.release()
                    })
                }
            })
        }).catch(err=>{
            throw err
        })

}
/*
* 查询
* */
let selSql = async (table, id) => {
    let tmp = await execSql(`select * from ${table} where id= ?`, id)
    if (tmp) {
        return tmp[0]
    } else {
        return null
    }
}

/*
* 删除
* */
let delSql = (table, id) => {
    return execSql(`delete from ${table} where id = ?`, id)
}

/*
* 添加\插入
* */
let inSql = (table, params) => {
    if (params) {
        let ks = []
        let vs = []
        let is = []
        for (let k in params) {
            ks.push(k)
            vs.push('?')
            is.push(params[k])
        }
        return execSql(`insert into ${table}(${ks.join()}) value(${vs.join()})`, ...is)
    } else {
        throw new Error('参数为空!!!')
    }
}
/*
* 分页
* */
let pageSql =async (table, where = {}, pageNo, pageSize) => {
    // console.log(where)
    let ws = [];
    let vs = [];
    for (let k in where) {
        let v = where[k];
        if (!v)
            continue
        if (['string','number'].includes(typeof v)) {
            vs.push(v)
            ws.push(` and ${k} = ?`)
        }else if (v.length == 2){
            let v0 = v[0];
            let v1 = v[1];
            if (v1 == 'in'){
                vs.push(...v0);
                let ps = [];
                for (let i = 0,l = v0.length;i<l;i++){
                    ps.push('?')
                }
                ws.push(`and ${k} in (${ps.join()})`)
            } else {
                vs.push(v[0]);
                ws.push(` and ${k} ${v1} ?`)
            }
        } else if (v.length == 3){
            let v0 = v[0];
            let v1 = v[1];
            let v2 = v[2];
            if (!v0){
                continue
            }
            if (v2 == 'left'){
                ws.push(`and ${k} like '%${v0}'`)
            } else if (v2 == 'right'){
                ws.push(`and ${k} like '${v0}%'`)
            } else if(v2 == 'both'){
                ws.push(`and ${k} like '%${v0}%'`)
            }else {
                throw new Error('未知参数格式!!!')
            }
        }else {
            throw new Error('未知参数格式!!!')
        }
    }

    let limit = '';
    let ls = [];
    if (pageNo && pageSize) {
        limit = `limit ?, ?`;
        ls.push((parseInt(pageNo) - 1) * parseInt(pageSize));
        ls.push(parseInt(pageSize))
    }
    let list = await execSql(`select * from ${table} where 1 = 1 ${ws.join('')} ${limit}`, ...vs, ...ls);
    let total = await execSql(`select count(1) as count from ${table} where 1 = 1 ${ws.join('')}`, ...vs);
    total = total[0].count;
    return {
        list,total
    }
};

/*
* 修改
* */

let updateSql =async (table,params={},id)=>{
    let ks = []
    let vs = []
    for (let k in params){
        ks.push(`${k} = ?`)
        vs.push(params[k])
    }
    return await execSql(`update ${table} set ${ks.join()} where id = ?`,...vs,id)
}


/*
* 单独查询
* */
let selOne = async (table,where)=>{
    let {list} = await pageSql(table,where)

    if (list && list.length > 0){
        return list[0]
    } else {
        console.log('123')
        return null
    }
}
/*
* 查询全部
* */
let selAll = (table)=>{
    return execSql(`select * from ${table}`)

}
/*
* 批量删除
* */
let delSqlBench = (table, ids) => {
    if (!ids || ids.length == 0) {
        return
    }
    let ps = []
    for (let i = 0, l = ids.length; i < l; i++) {
        ps.push('?')
    }
    return execSql(`delete from ${table} where id in (${ps.join()})`, ...ids)
}

module.exports = {execSql,selSql,delSql,pageSql,inSql,updateSql,selOne,selAll,delSqlBench};

  • 6
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值