接口更改

This commit is contained in:
dzl
2025-10-11 17:33:00 +08:00
parent 2a16a7fd97
commit 3abcd5e46a
4 changed files with 112 additions and 38 deletions

37
routes/category.js Normal file
View File

@@ -0,0 +1,37 @@
const express = require('express');
const { getDB } = require('../database');
const router = express.Router();
router.get('/', async (req, res) => {
try {
const db = await getDB();
const [firstCategory] = await db.query('SELECT * FROM category WHERE level = 1');
console.log(firstCategory);
for (const category of firstCategory) {
const [secondCategories] = await db.query('SELECT * FROM category WHERE parent_id = ?', [category.id]);
category.relative = secondCategories;
}
res.json({ success: true, data: firstCategory.map(category => ({
name: category.category_name,
relative: category.relative.map(secondCategory => ({
name: secondCategory.category_name,
}))
}))});
} catch (error) {
console.error('Error fetching categories:', error);
res.status(500).json({ success: false, error: 'Internal server error' });
}
});
module.exports = router;

View File

@@ -1,10 +1,9 @@
const express = require('express'); const express = require('express');
const router = express.Router(); const router = express.Router();
const { getDB } = require('../database'); const { getDB } = require('../database');
const { auth } = require('../middleware/auth');
router.get('/', auth, async (req, res) => { router.get('/', async (req, res) => {
try { try {
const db = getDB(); const db = getDB();
const query = ` const query = `
@@ -21,9 +20,10 @@ router.get('/', auth, async (req, res) => {
res.status(500).json({ error: '获取优惠券失败' }); res.status(500).json({ error: '获取优惠券失败' });
} }
}); });
router.get('/:id', auth, async (req, res) => { router.get('/:id', async (req, res) => {
try { try {
const userId = req.params.id; const userId = req.params.id;
const couponId = req.body.coupon_id;
const db = getDB(); const db = getDB();
const query = ` const query = `
SELECT * FROM coupon_products where remain > 0 SELECT * FROM coupon_products where remain > 0
@@ -34,12 +34,21 @@ router.get('/:id', auth, async (req, res) => {
return res.status(404).json({ error: '暂无优惠券' }); return res.status(404).json({ error: '暂无优惠券' });
} else { } else {
const query = [` const query = [`
update coupon_products set remain = remain - 1 where id = ? select * from coupon_use where user_id = ?
`,` `,`
insert into coupon_use (user_id, coupon_id, get_time) values (?, ?, now()) update coupon_products set remain = remain - 1 where id = ?
`,`
insert into coupon_use (user_id, coupon_id, get_time) values (?, ?, now())
`] `]
await db.query(query[0], [coupon[0].id]); const [checkUser] = await db.query(query[0], [userId]);
await db.query(query[1], [userId, coupon[0].id]); console.log("12345",checkUser)
for (const item of checkUser) {
if (item.coupon_id === coupon[0].id && item.use_time === null) {
return res.status(400).json({ error: '优惠券已领取' });
}
}
await db.query(query[1], [coupon[0].id]);
await db.query(query[2], [userId, coupon[0].id]);
} }
res.json({coupon, success: true}); res.json({coupon, success: true});

View File

@@ -13,6 +13,7 @@ router.get('/', async (req, res) => {
const pageNum = Math.max(1, parseInt(page) || 1); const pageNum = Math.max(1, parseInt(page) || 1);
const limitNum = Math.max(1, Math.min(100, parseInt(limit) || 10)); // 限制最大100条 const limitNum = Math.max(1, Math.min(100, parseInt(limit) || 10)); // 限制最大100条
const offset = Math.max(0, (pageNum - 1) * limitNum); const offset = Math.max(0, (pageNum - 1) * limitNum);
let filteredProducts = []
console.log('分页参数:', { pageNum, limitNum, offset, search, category, status }); console.log('分页参数:', { pageNum, limitNum, offset, search, category, status });
@@ -24,11 +25,6 @@ router.get('/', async (req, res) => {
params.push(`%${search}%`); params.push(`%${search}%`);
} }
if (category) {
whereClause += ' AND category = ?';
params.push(category);
}
if (status) { if (status) {
whereClause += ' AND status = ?'; whereClause += ' AND status = ?';
params.push(status); params.push(status);
@@ -43,7 +39,7 @@ router.get('/', async (req, res) => {
// 获取商品列表 // 获取商品列表
const query = ` const query = `
SELECT id, name, rongdou_price, category, points_price, stock, image_url as image, description, status, payment_methods, created_at, updated_at, sales SELECT id, name, rongdou_price, points_price, stock, image_url as image, description, status, payment_methods, created_at, updated_at, sales
FROM products FROM products
${whereClause} ${whereClause}
ORDER BY created_at DESC ORDER BY created_at DESC
@@ -54,13 +50,42 @@ router.get('/', async (req, res) => {
const queryParams = [...params]; const queryParams = [...params];
console.log('Query params:', queryParams, 'Query:', query); console.log('Query params:', queryParams, 'Query:', query);
const [products] = await getDB().execute(query, queryParams); const [products] = await getDB().execute(query, queryParams);
products.forEach(item=>{ products.forEach(item=>{
item.payment_methods = JSON.parse(item.payment_methods) item.payment_methods = JSON.parse(item.payment_methods)
}) })
if (category) {
// 先根据分类名称获取分类ID
const query = `SELECT * FROM category WHERE category_name = ?`
const [getCategory] = await getDB().execute(query, [category])
const [getSecondCategory] = await getDB().execute('SELECT * FROM category WHERE parent_id = ?', [getCategory[0].id])
const sumCategory = getCategory.concat(getSecondCategory).map(item=>item.id)
// 再根据分类ID获取商品ID
const getProductCategory = []
for (const item of sumCategory) {
const [getProductCategoryItem] = await getDB().execute('SELECT * FROM products_category WHERE category_id = ?', [item])
getProductCategory.push(...getProductCategoryItem)
}
const productIds = []
for (const item of getProductCategory) {
productIds.push(item.product_id)
}
filteredProducts = products.filter(item=>productIds.includes(item.id))
} else {
filteredProducts = products
}
res.json({ res.json({
success: true, success: true,
data: { data: {
products, products: filteredProducts,
// products: products,
pagination: { pagination: {
page: pageNum, page: pageNum,
limit: limitNum, limit: limitNum,
@@ -75,31 +100,31 @@ router.get('/', async (req, res) => {
} }
}); });
// 获取商品分类列表 // // 获取商品分类列表
router.get('/categories', async (req, res) => { // router.get('/categories', async (req, res) => {
try { // try {
const [categories] = await getDB().execute( // const [categories] = await getDB().execute(
'SELECT DISTINCT category FROM products WHERE status = "active" AND category IS NOT NULL' // 'SELECT DISTINCT category FROM products WHERE status = "active" AND category IS NOT NULL'
); // );
res.json({ // res.json({
success: true, // success: true,
data: { // data: {
categories: categories.map(item => item.category) // categories: categories.map(item => item.category)
} // }
}); // });
} catch (error) { // } catch (error) {
console.error('获取商品分类失败:', error); // console.error('获取商品分类失败:', error);
res.status(500).json({ success: false, message: '获取商品分类失败' }); // res.status(500).json({ success: false, message: '获取商品分类失败' });
} // }
}); // });
// 获取热销商品 // 获取热销商品
router.get('/hot', async (req, res) => { router.get('/hot', async (req, res) => {
try { try {
// 从活跃商品中随机获取2个商品 // 从活跃商品中随机获取2个商品
const [products] = await getDB().execute( const [products] = await getDB().execute(
`SELECT id, name, category, price, points_price, rongdou_price, stock, `SELECT id, name, price, points_price, rongdou_price, stock,
image_url, images, description, shop_name, shop_avatar, image_url, images, description, shop_name, shop_avatar,
payment_methods, sales, rating, status, created_at, updated_at payment_methods, sales, rating, status, created_at, updated_at
FROM products FROM products
@@ -168,7 +193,7 @@ router.get('/cheap', async (req, res) => {
const tempProducts = await Promise.all(products.map(async item=>{ const tempProducts = await Promise.all(products.map(async item=>{
const [product] = await getDB().execute( const [product] = await getDB().execute(
`SELECT id, name, category, price, points_price, rongdou_price, stock, `SELECT id, name, price, points_price, rongdou_price, stock,
image_url, images, description, shop_name, shop_avatar, image_url, images, description, shop_name, shop_avatar,
payment_methods, sales, rating, status, created_at, updated_at payment_methods, sales, rating, status, created_at, updated_at
FROM products FROM products
@@ -342,7 +367,7 @@ router.get('/:id', async (req, res) => {
const userId = req.user?.id; // 可选的用户ID用于检查收藏状态 const userId = req.user?.id; // 可选的用户ID用于检查收藏状态
const query = ` const query = `
SELECT id, name, category, price, points_price, rongdou_price, stock, SELECT id, name, price, points_price, rongdou_price, stock,
image_url, images, videos, description, details, shop_name, shop_avatar, image_url, images, videos, description, details, shop_name, shop_avatar,
payment_methods, sales, rating, status, created_at, updated_at payment_methods, sales, rating, status, created_at, updated_at
FROM products FROM products
@@ -531,7 +556,7 @@ router.get('/:id', async (req, res) => {
// 保持向后兼容 // 保持向后兼容
points: product.points_price, points: product.points_price,
image: product.image_url, image: product.image_url,
tags: product.category ? [product.category] : [] // tags: product.category ? [product.category] : []
}; };
res.json({ res.json({
@@ -898,10 +923,9 @@ router.get('/:id/recommended', async (req, res) => {
// 获取同类别的其他商品作为推荐 // 获取同类别的其他商品作为推荐
const query = ` const query = `
SELECT p2.id, p2.name, p2.category, p2.price, p2.points_price as points, SELECT p2.id, p2.name, p2.price, p2.points_price as points,
p2.stock, p2.image_url as image, p2.description p2.stock, p2.image_url as image, p2.description
FROM products p1 FROM products p1
JOIN products p2 ON p1.category = p2.category
WHERE p1.id = ? AND p2.id != ? AND p2.status = 'active' WHERE p1.id = ? AND p2.id != ? AND p2.status = 'active'
ORDER BY RAND() ORDER BY RAND()
LIMIT 6 LIMIT 6
@@ -914,7 +938,7 @@ router.get('/:id/recommended', async (req, res) => {
const remainingCount = 6 - recommendedProducts.length; const remainingCount = 6 - recommendedProducts.length;
if (remainingCount > 0) { if (remainingCount > 0) {
const additionalQuery = ` const additionalQuery = `
SELECT id, name, category, price, points_price as points, SELECT id, name, price, points_price as points,
stock, image_url as image, description stock, image_url as image, description
FROM products FROM products
WHERE id != ? AND status = 'active' WHERE id != ? AND status = 'active'

View File

@@ -252,6 +252,10 @@ app.use('/api/payment', require('./routes/payment'));
// 优惠券路由 // 优惠券路由
app.use('/api/coupon', require('./routes/coupon')); app.use('/api/coupon', require('./routes/coupon'));
// 分类路由
app.use('/api/category', require('./routes/category'));
// 前端路由 - 必须在最后作为fallback // 前端路由 - 必须在最后作为fallback
app.get('/', (req, res) => { app.get('/', (req, res) => {
res.removeHeader('Origin-Agent-Cluster'); res.removeHeader('Origin-Agent-Cluster');