❤Node-购物车模块

举报
林太白 发表于 2025/04/09 17:25:22 2025/04/09
【摘要】 ❤Node-购物车模块

❤Node-购物车模块

1、购物车表的创建

接下来我们新建一个商品表 cartitems,实现商品模块部分的功能

创建一个对应的SQL数据表,该表使用InnoDB引擎,字符集为utf8mb4,排序规则为utf8mb4_0900_ai_ci

CREATE TABLE CartItems (
    cartitem_id INT AUTO_INCREMENT PRIMARY KEY,            -- 购物车项ID,主键,自增
    user_id INT,                                            -- 用户ID(外键,关联sys_user表)
    product_id INT,                                         -- 商品ID(外键,关联Products表)
    quantity INT DEFAULT 1,                                  -- 商品数量
    price DECIMAL(10, 2),                                    -- 商品价格(记录当前加入购物车时的价格)
    added_at DATETIME DEFAULT CURRENT_TIMESTAMP,             -- 加入购物车的时间
    updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,  -- 最后更新时间
    is_active BOOLEAN DEFAULT TRUE,                          -- 是否仍在购物车中(可以用来处理购物车清空等情况)
    
    -- 外键约束
    FOREIGN KEY (user_id) REFERENCES sys_user(user_id),          -- 外键:用户ID关联sys_user表
    FOREIGN KEY (product_id) REFERENCES products(product_id) -- 外键:商品ID关联Products表
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

👉 去掉外键约束

CREATE TABLE CartItems (
    cartitem_id INT AUTO_INCREMENT PRIMARY KEY,            -- 购物车项ID,主键,自增
    user_id INT,                                            -- 用户ID
    product_id INT,                                         -- 商品ID
    quantity INT DEFAULT 1,                                  -- 商品数量
    price DECIMAL(10, 2),                                    -- 商品价格(记录当前加入购物车时的价格)
    added_at DATETIME DEFAULT CURRENT_TIMESTAMP,             -- 加入购物车的时间
    updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,  -- 最后更新时间
    is_active BOOLEAN DEFAULT TRUE                           -- 是否仍在购物车中(可以用来处理购物车清空等情况)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

2、搜索接口

SELECT * FROM CartItems

接下来为商品模块写一个搜索接口,进行模糊搜索

👉 cartitemsRoutes.js

引入封装方法

const express = require('express');
const router = express.Router();

const connectionPool = require('../db'); // 引入数据库连接池模块
const {addCondition,addDateRangeCondition,addPagination,convertKeysToSnakeCase} = require('../methods.js'); // 引入封装方法
const {listApi,getApi,addApi,updateApi,delApi,changeStatusApi} = require('../apimethods.js'); 

查询列表

// 查询列表
router.get('/',(req, res) => {
    let querySql = `SELECT * FROM CartItems `;   // 查询数据库列表
    let querysqltotal = `SELECT COUNT(*) AS total FROM CartItems`;  // 查询数据库总数
     // 查询数据库并返回数据
    const { user_id, product_id, quantity, price, is_active,page_num, page_size } = convertKeysToSnakeCase(req.query);
    listApi(querySql,querysqltotal,req,res,{ user_id, product_id, quantity, price, is_active,page_num, page_size});
});

验证一下我们的查询接口 ,查询没问题

3、增加接口

添加功能

先来试试我们的数据库插入语言,看是否正确

INSERT INTO CartItems (user_id, product_id, quantity, price, is_active)
VALUES (1, 101, 2, 199.99, TRUE);

查看数据库部分,数据库之中的数据已经进行了相应的更改,接下来我们将数据库语言放入我们的语句之中

// 新增  POST
// 新增  POST
router.post('/', (req, res) => {
  const insertSql = 'INSERT INTO CartItems SET ?'; // 准备 SQL 插入语句
  const {quantity, price, is_active} = convertKeysToSnakeCase(req.body);
  const postData = {quantity, price};
  addApi(insertSql,res,postData);
});

尝试一下我们的新增接口

// 新增数据  
{
    "price": "1",
    "quantity": "1"
}

增加功能ok,并且能正确返回我们想要的东西

4、详情接口

详情,通过id然后查到对应的内容

接下来我们简单写一个详情

// 获取详情 3
router.get('/:id', (req, res) => {
  const { id } = req.params;
  const values = [id];
  let querySql = 'SELECT * FROM CartItems WHERE cartitem_id = ?';
  getApi(querySql,values,res);
}); 

简单测试一下,详情接口没问题,采用ID的方式进行获取的

5、修改接口

接下来我们完善一下我们的修改接口:

// 更新sql语句
UPDATE CartItems
SET quantity = 1, price = 179.99, is_active = FALSE
WHERE user_id = 1 AND product_id = 101;

写一下修改接口的更改

// 更新接口 PUT请求处理程序
router.put('/', (req, res) => {
  const { user_id, product_id, quantity, price, is_active,cartitem_id} = convertKeysToSnakeCase(req.body);
  const updatevalues = {user_id, product_id, quantity, price, is_active};
  let updateSql='UPDATE CartItems SET ? WHERE cartitem_id = ?';
  updateApi(updateSql,[updatevalues, cartitem_id],res);
});

测试一下修改接口,修改接口没问题

6、删除接口

删除部分我们写一个API

// 删除数据 DELETE请求处理程序  
// 删除数据 DELETE请求处理程序  
router.delete('/:id', (req, res) => {
    const id = req.params.id;
    const delsql = "DELETE FROM CartItems WHERE cartitem_id = ?";
    delApi(delsql,[id],res);
});

点击删除按钮测试一下我们的接口,删除功能ok!

7、更改状态

接下来我们写一个更改状态部分的接口,我们写一个API

//禁用和使用,用于更改状态
router.put('/status/:id', (req, res) => {
  const id = parseInt(req.params.id);
  const newState = req.body.isActive ?req.body.isActive :0;
  const query = 'UPDATE CartItems SET is_active = ? WHERE cartitem_id = ?';
  changeStatusApi(query,[newState, id],res);
});

测试一下我们的状态接口,更改状态功能ok!

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。