Node学习笔记之user用户API模块

1、获取用户的基本信息

步骤

  1. 获取登录会话存储的session中用户的id
  2. 判断是否获取到id
  3. 根据用户id查询数据库中的个人信息
  4. 检查指定 id 的用户是否存在
  5. 将密码设置为空
  6. 将数据返回给前端

// 获取用户信息数据
exports.userinfo = (req, res) => {(async function () {//    1. 获取登录会话存储的session中用户的idlet userId = req.session["id"]// 2判断是否获取到idif (!userId) {res.send({ status: 1, message: "缺少必传参数用户id" });return}//3 用户id查询数据库中的个人信息let results = await handleDB(res, "users", "find", "查询数据出错!", `id =${userId}`);// 4 检查指定 id 的用户是否存在if (results.length !== 1) return res.send({ stutus: 1, message: '用户不存在!' })// 5将密码设置为空const data = { id: results[0].id, realname: results[0].realname, username: results[0].username, avatar: results[0].avatar, email: results[0].email, age: results[0].age, }res.send({ status: 0, message: '获取个人信息成功', data: data });})();}

2、退出登录功能

删除session中用户id

//退出登录
exports.logout = (req, res) => {delete req.session["id"]res.send({ status: "0", message: "退出登录成功" })
}

3、获取所有用户模块

(async function () {// 查询数据库获取所有用户let results = await handleDB(res, "users", "find", "users数据库查询出错",);// 判断用户列表是否为空,用户为空返回用户列表为空if (results.length == 0) return res.send({ stutus: 1, message: '用户列表为空!' })res.send({ status: 0, message: '获取所有用户成功', data: results });})();

4、根据用户id删除用户信息模块

步骤

  1. 获取到的用户id
  2. 判断是否获取到id
  3. 根据id查询数据库是否存在该用户
  4. 根据用户id删除用户
  5. SQL 语句执行成功,但是影响行数不等于 1

// 根据用户id删除用户
exports.delUser = (req, res) => {(async function () {// 1.获取到的用户idlet userId = req.params.id// 2判断是否获取到idif (!userId) {res.send({ status: 1, message: "缺少必传参数用户id" });return}// 3根据id查询数据库是否存在该用户let result = await handleDB(res, "users", "find", "users数据库查询出错", `id =${userId}`);// 4 检查指定 id 的用户是否存在if (result.length !== 1) return res.send({ stutus: 1, message: '用户不存在!' })// 5根据用户id删除用户let results = await handleDB(res, "users", "delete", "users数据库查询出错", `id =${userId}`);// 6 SQL 语句执行成功,但是影响行数不等于 1if (results.affectedRows !== 1) return res.send({ status: 1, message: '删除用户失败!' })res.send({ status: 0, message: '删除用户成功', });})();
}

测试

5、根据用户id添加和更新用户信息模块

// 添加或者更新用户信息
exports.upUser = (req, res) => {(async function () {// 接收用户id// console.log(req.body);const { id, ...data } = req.body;// 判断用户id是否存在if (id) {// 存在用户修改用户数据let results = await handleDB(res, "users", "update", "users数据库查询出错", `id=${id}`, data);// SQL 语句执行成功,但是影响行数不等于 1if (results.affectedRows !== 1) return res.send({ status: 1, message: '更新用户数据失败!' })res.send({ status: 0, message: '更新用户数据成功', });} else {// 不存在用户添加用户数据// 判断数据是否合法if (!data.username || !data.password) {return res.send({ status: 1, message: '用户名或密码不能为空!' })}let result = await handleDB(res, "users", "insert", "users数据库查询出错", data);// SQL 语句执行成功,但是影响行数不等于 1if (result.affectedRows !== 1) return res.send({ status: 1, message: '更新用户数据失败!', })res.send({ status: 0, message: '添加用户数据成功', });}})();
}

6、重置密码

/ upPwd重置密码
exports.upPwd = (req, res) => {(async function () {//    1. 获取登录会话存储的session中用户的idlet userId = req.session["id"]// 2判断是否获取到idif (!userId) {res.send({ status: 1, message: "缺少必传参数用户id" });return}// 3根据id查询数据库是否存在该用户let result = await handleDB(res, "users", "find", "users数据库查询出错", `id =${userId}`);// 4 检查指定 id 的用户是否存在if (result.length !== 1) return res.send({ stutus: 1, message: '用户不存在!' })// 在头部区域导入 bcryptjs 后,// 即可使用 bcrypt.compareSync(提交的密码,数据库中的密码) 方法验证密码是否正确// compareSync() 函数的返回值为布尔值,true 表示密码正确,false 表示密码错误// 判断提交的旧密码是否正确const compareResult = bcrypt.compareSync(req.body.oldPwd, result[0].password)if (!compareResult) return res.cc('原密码错误!')// 对新密码进行 bcrypt 加密处理const newPwd = bcrypt.hashSync(req.body.newPwd, 10)let results = await handleDB(res, "users", "update", "users数据库查询出错", `id=${userId}`, { password: newPwd });// SQL 语句执行成功,但是影响行数不等于 1if (results.affectedRows !== 1) return res.send({ status: 1, message: '重置密码失败!' })res.send({ status: 0, message: '重置密码成功', });})();
}

7、更新用户头像(本地资源)

8、利用七牛云存储图片,更新用户头像 cdn

(要用到自己的服务器,腾讯云或者阿里云,不过七牛云新用户可以免费使用一个月)

我的服务器和七牛云都过期了,后面再详细介绍吧

先放代码

const qiniu_sdk = require('qiniu')
// const { qiniu } = require('')
qiniu_sdk.conf.ACCESS_KEY = 'mxmPUMJP44fUKw5ZufdpHp76zKmPCr0XD51Tq_tj';
qiniu_sdk.conf.SECRET_KEY = '6yttynCYvOt0-rUvHwMDP9sLb2By1dTZINX4nXZM';// 要上传的空间
const bucket = "02cook"// 文件前缀
const prefix = 'image/avatar/'// 生成上传文件的 token
const token = (bucket, key) => {const policy = new qiniu_sdk.rs.PutPolicy({ isPrefixalScope: 1, scope: bucket + ':' + key })return policy.uploadToken()
}const config = new qiniu_sdk.conf.Config()async function upload_file(file_name, file_path){// 保存到七牛的地址const file_save_path = prefix + file_name// 七牛上传的tokenconst up_token = token(bucket, file_save_path)const extra = new qiniu_sdk.form_up.PutExtra()const formUploader = new qiniu_sdk.form_up.FormUploader(config)// 上传文件let ret = await new Promise((resolve, reject)=>{formUploader.putFile(up_token, file_save_path, file_path, extra, (err, data) => {if (!err) {// 上传成功, 处理返回值resolve(data);} else {// 上传失败, 处理返回代码reject(data);}});    }) return ret
}// upload_file(上传后的名字,上传的图片路径)   //上传的图片相对路径, 从项目文件夹出发
// upload_file('01.jpg', './01.jpg')  module.exports = upload_file
const QINIU_URI="http://rtgs0qdlw.hn-bkt.clouddn.com/"
module.exports={QINIU_URI
}

//引入七牛文件
const  upload_file=require('../utils/qn')const constant=require('../utils/constant');
exports.Upload= (req, res) => {(async function(){// 1、接收req.file对象var file = req.file;console.log(file);// 2、上传至七牛云try{var qnObj = await upload_file(file.originalname, `${file.destination}/${file.filename}`);// console.log(qnObj);}catch(err){console.log(err);res.send({errno:"0", errmsg:"上传七牛云出错"});return }let data={ "url":constant.QINIU_URI+qnObj.key,"alt":qnObj.key, "href": constant.QINIU_URI+qnObj.key }// 图片的链接,非必须]//    console.log(114);res.send({errno:"0",data});})();}

书城商品(分类,商品信息,商品详情)API

轮播图功能API 

书城资讯功能AP

闲置书API

购物车功能API

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

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

相关文章

关于Spring和SpringBoot中对配置文件的读取

Spring读取xml文件 具体流程见网址Spring源码分析2 — spring XML配置文件的解析流程 - 知乎 (zhihu.com) 我这里只做一下总结和自己的理解: (1)通过getConfigLocations方法, 从web.xml文件中读取配置文件地址,如果web.xml中读取…

合肥中科深谷嵌入式项目实战——人工智能与机械臂(四)

订阅:新手可以订阅我的其他专栏。免费阶段订阅量1000 python项目实战 Python编程基础教程系列(零基础小白搬砖逆袭) 作者:爱吃饼干的小白鼠。Python领域优质创作者,2022年度博客新星top100入围,荣获多家平台专家称号。…

对象补充-原型和函数原型-创建对象

defineProperties可以定义多个属性描述符 var obj {// 私有属性(js里面是没有严格意义的私有属性)_age: 18,_eat: function() {} }Object.defineProperties(obj, {name: {configurable: true,enumerable: true,writable: true,value: "why"}…

Failed to prepare the device for development

👨🏻‍💻 热爱摄影的程序员 👨🏻‍🎨 喜欢编码的设计师 🧕🏻 擅长设计的剪辑师 🧑🏻‍🏫 一位高冷无情的编码爱好者 大家好,我是 DevO…

创新领航 | 竹云参编《基于区块链的数据资产评估实施指南》正式发布!

10月25日,由深圳数宝数据服务股份有限公司和深圳职业技术大学提出,中国科学院深圳先进技术研究院、中国电子技术标准化研究院、中国(天津)自由贸易试验区政策与产业创新发展局、网络空间治理与数字经济法治(长三角&…

论文阅读——ELECTRA

论文下载:https://openreview.net/pdf?idr1xMH1BtvB 另一篇分析文章:ELECTRA 详解 - 知乎 一、概述 对BERT的token mask 做了改进。结合了GAN生成对抗模型的思路,但是和GAN不同。 不是对选择的token直接用mask替代,而是替换为…

喜讯!合合信息顺利通过CMMI3级评估

近日,在擎标顾问团的咨询辅导下,上海合合信息科技股份有限公司(简称“合合信息”)顺利通过了CMMI3级评估。CMMI是国际上最流行、最实用的一种软件生产过程标准和软件企业成熟度等级认证的标准,通过该认证表明企业在开发…

【多线程面试题十四】、说一说synchronized的底层实现原理

文章底部有个人公众号:热爱技术的小郑。主要分享开发知识、学习资料、毕业设计指导等。有兴趣的可以关注一下。为何分享? 踩过的坑没必要让别人在再踩,自己复盘也能加深记忆。利己利人、所谓双赢。 面试官:说一说synchronized的底…

常见面试题-MySQL专栏(二)

了解索引扫描吗? 答: MySQL有两种方法生成有序结果: 通过排序操作按照索引顺序扫描 如果 explain 出来的 type 列值为 “index” 的话,说明是按照索引扫描了。 索引扫描本身的速度是很快的。但是如果索引不能覆盖查询所需的全…

Visual Studio Code的下载与安装

Visual Studio Code(简称 VS Code)是由 Microsoft 开发的免费、开源的文本编辑器,适用于多种操作系统,包括 Windows、macOS 和 Linux。它的设计目标是成为一款轻量级、高效的代码编辑工具,同时提供丰富的扩展和功能&am…

微软服务器数据库 Navicat Premium 连接

需要固定IP,在服务器的网络里面加上。 需要打开SSL,入下图 只用打开,不用选择秘钥,证书等

【c++|opencv】二、灰度变换和空间滤波---1.灰度变换、对数变换、伽马变换

every blog every motto: You can do more than you think. https://blog.csdn.net/weixin_39190382?typeblog 0. 前言 灰度变换、对数变换、伽马变换 1. 灰度变换 #include <iostream> #include <opencv2/opencv.hpp>using namespace std; using namespace c…

【C语言初学者周冲刺计划】1.1用筛选法求100之内的素数

目录 1解题思路&#xff1a; 2代码如下&#xff1a; 3运行代码如图所示&#xff1a; 4总结&#xff1a; (前言周冲刺计划:周一一个习题实操&#xff0c;依次类推加一&#xff0c;望各位读者可以独自实践敲代码) 1解题思路&#xff1a; 首先了解筛选法定义&#xff1a;先把…

色彩校正及OpenCV mcc模块介绍

一、术语 1.光&#xff1a;是电磁波&#xff0c;可见光是可被人眼感知的电磁波。可见光大约在400-700nm波段。光子携带的能量与波长成反比&#xff0c;400nm--700nm之间的单色光的颜色从紫色渐变成红色。 2.光谱&#xff1a;除了太阳光源外&#xff0c;LED灯、白炽灯等各种照明…

ThreadLocal 会出现内存泄漏吗?

ThreadLocal ThreadLocal 是一个用来解决线程安全性问题的工具。它相当于让每个线程都开辟一块内存空间&#xff0c;用来存储共享变量的副本。然后每个线程只需要访问和操作自己的共享变量副本即可&#xff0c;从而避免多线程竞争同一个共享资源。它的工作原理很简单&#xff0…

手机平板摄像头如何给电脑用来开视频会议

环境&#xff1a; Iriun Webcam EV虚拟摄像头 钉钉会议 问题描述&#xff1a; 手机平板摄像头如何给电脑用来开视频会议 解决方案&#xff1a; 1.下载软件 手机端和电脑端都下载这个软件&#xff0c;连接同一局域网打开软件连接好 另外一款软件Iriun 也是一样操作 2.打…

【图像分类】卷积神经网络之ResNet网络模型实现钢轨缺陷识别(附代码和数据集,PyTorch框架)

写在前面: 首先感谢兄弟们的关注和订阅,让我有创作的动力,在创作过程我会尽最大能力,保证作品的质量,如果有问题,可以私信我,让我们携手共进,共创辉煌。 本篇博文,我们将使用PyTorch深度学习框架搭建ResNet实现钢轨缺陷识别,附完整的项目代码和数据集,可以说是全网…

【Java笔试强训】Day7(WY22 Fibonacci数列、CM46 合法括号序列判断)

Fibonacci数列 链接&#xff1a;Fibonacci数列 题目&#xff1a; Fibonacci数列是这样定义的&#xff1a; F[0] 0 F[1] 1 for each i ≥ 2: F[i] F[i-1] F[i-2] 因此&#xff0c;Fibonacci数列就形如&#xff1a;0, 1, 1, 2, 3, 5, 8, 13, …&#xff0c;在Fibonacci数列…

UML—时序图是什么

目录 前言: 什么是时序图: 时序图的组成元素&#xff1a; 1. 角色(Actor) 2. 对象(Object) 3. 生命线(LifeLine) 4. 激活期(Activation) 5. 消息类型(Message) 6.组合片段(Combined fragment) 时序图的绘制规则:​ 绘制时序图的3步&#xff1a; 1.划清边界&#xf…

RabbitMQ消费者的可靠性

目录 一、消费者确认 二、失败重试机制 2.1、失败处理策略 三、业务幂等性 3.1、唯一消息ID 3.2、业务判断 3.3、兜底方案 一、消费者确认 RabbitMQ提供了消费者确认机制&#xff08;Consumer Acknowledgement&#xff09;。即&#xff1a;当消费者处理消息结束后&#x…