基于Node+Vue+Express开发实现商城系统

简介: 基于Node+Vue+Express开发实现商城系统

项目编号:BS-QD-006

前言:

2003年中国电子商城进入低谷期,在绝大多数人选择放弃电子商城的情况下,依旧有些企业仍未放弃,并苦苦坚持电子商城的发展。这使得人们不得不重新考虑如何定位新一代的电子商城。如今,现代电子商务的发展已经不可同日而语,像淘宝、京东这种大型的电子商务平台,经过十几年的坚持和发展,已经取得了巨大的成功,它们就是中国当代电子商务发展的缩影,从原来的不被人接受,到现在趋之若鹜。通过电子商城系统进行成交的数额己在国内占据相当大一部分的比例,每年达到数万亿人民币,这在原来是不可想象的。但它就是实实在在的发生了。


如今的互联网深深影响着人们的各项生活习惯,人们的各种消费好多都是通过互联网产生的。吃饭叫外卖,打车用打车软件,购物去网上商城……这一切正在悄悄的影响着每一个人的生活、工作、学习。那么如何设计一个好的商城系统,去满足人们的日常消费,就是一个值得探讨的问题。

一,项目简介


本课题基于前端技术设计并实现了一个网上商城系统[1]。采用vue技术实现前端网页的设计,使其具有更好的稳定性和安全性[2]。系统的数据采用MYSQL数据库进行存储[3],开发工具选择为IDEA工具。本商城系统具有前台购物功能和后台相应的信息管理。前台用户登陆注册后可以进行商品浏览、添加购物车、购买商品、管理订单等。后台用户登陆后台管理系统进行管理,主要进行商品管理、分类管理、订单管理、用户管理等功能操作。


本系统实现的商城系统,操作简单方便,功能模块简洁实用,数据管理灵活多变。我们可以在本商城中售卖各类人们需要的商品,它后商品类型可以灵活修改,也就是说可以根据定制产生各类垂直电商平台系统,这就是本系统设计时所进行充分考虑的结果。


本项目基于Node+Vue+Express框架开发实现了一个商城管理系统,系统用户分为前端普通用户和后台管理用户,均使用前端开发技术开发实现(订单功能未做)


普通用户的主要功能 有:

  • 注册、登录(图形验证码)
  • 定位 (腾讯地图定位功能)、自主选择所在城市
  • 商品
  • 分类
  • 简单展示商品
  • 查看商品详情
  • 商品评论
  • 分页功能
  • 购物车功能
  • 加入购物车
  • 购物车商品数量增减
  • 清空购物车
  • 商品结算
  • 多关键词模糊搜索商品 (关键词需为商品名称)
  • 用户个人中心
  • 修改用户信息 (头像、昵称、简介...)
  • 修改手机号
  • 修改密码

管理员的主要功能有:

  • 登录(固定账号密码:admin)
  • 查看所有用户
  • 查看数据库商品信息
  • 商品上架(添加商品)
  • 删除/修改商品
  • 分页功能

二,环境介绍


语言环境:Java:  jdk1.8

数据库:Mysql: mysql5.7

应用服务器:Tomcat:  tomcat8.5.31

开发工具:IDEA或eclipse

开发技术:Node+Vue+Express

三,系统展示


前端功能展示:

image.png

ce998cc21d394e43bbaf98fe86f52473.png

用户登陆

image.png

分类浏览

image.png

全文检索

image.png

添加购物车

image.png

我的购物车

image.png

个人中心

image.png

管理员操作

image.png

商品管理

image.png

商品添加

image.png

用户管理

image.png

四,核心代码展示


import express from 'express'
const router = express.Router({})
import conn from './../db/db'
import config from '../src/config'
import sms_util from './../util/sms_util'
import svgCaptcha from 'svg-captcha'
import md5 from 'blueimp-md5'
import formidable from 'formidable'
import {basename} from 'path'
const S_KEY = '@WaLQ1314?.LqFtK.Com.#'; // 盐
const users = {}; // 用户信息
let tmp_captcha = '';
/* GET home page. */
router.get('/', (req, res, next) => {
    console.log(md5(md5("admin") + S_KEY))
    res.render('index', {title: '指南针商城'});
});
/**************************************** 前台商城 ****************************************** */
/**
 * 获取首页轮播图
 */
router.get('/api/homecasual', (req, res) => {
    let sqlStr = 'SELECT * FROM homecasual';
    conn.query(sqlStr, (error, results, fields) => {
        if (error) {
            res.json({err_code: 0, message: '请求轮播图数据失败'});
            console.log(error);
        } else {
            results = JSON.parse(JSON.stringify(results));
            res.json({success_code: 200, message: results});
        }
    });
});
/**
 * 获取商品分类数
 */
router.get('/api/category', (req, res) => {
    let sqlStr = 'SELECT * FROM category';
    conn.query(sqlStr, (error, results, fields) => {
        if (error) {
            res.json({err_code: 0, message: '请求商品分类数据失败'});
            console.log(error);
        } else {
            results = JSON.parse(JSON.stringify(results));
            res.json({success_code: 200, message: results});
        }
    });
});
/**
 * 模糊搜索(商品名称)
 */
router.post('/api/searchgoods', (req, res) => {
    // 获取参数
    let keywords = req.body.keywords;
  keywords = keywords.replace(/\s+/g, ' ');
  keywords = keywords.replace(/(^\s*)|(\s*$)/g, '');
    let keyArr = keywords.split(' ');
    let sqlStr = 'SELECT * FROM recommend WHERE goods_name LIKE ';  // sql语句
    keyArr.forEach((item, index, arr)=>{
        sqlStr += "'%" + item + "%'";
        if(index != arr.length-1){
            sqlStr += " OR goods_name LIKE ";
        }
    });
    conn.query(sqlStr, (error, results, fields) => {
        results = JSON.parse(JSON.stringify(results));
        if (!error && results.length) {
            res.json({success_code: 200, message: results});
        }else{
            console.log(error);
        }
    });
});
/**
 * 获取推荐商品列表
 *  1, 3
 */
router.get('/api/recommendshoplist', (req, res) => {
    // 获取参数
  let category = req.query.category || 1
    let pageNo = req.query.pageNo || 1;
    let pageSize = req.query.count || 3;
    let sqlStr = 'SELECT * FROM recommend WHERE category = ' + category + ' LIMIT ' + (pageNo - 1) * pageSize + ',' + pageSize;
    conn.query(sqlStr, (error, results, fields) => {
        if (error) {
      console.log(error);
            res.json({err_code: 0, message: '请求商品列表数据失败'});
        } else {
            results = JSON.parse(JSON.stringify(results));
            res.json({success_code: 200, message: results});
        }
    });
});
/**
 * 获取所有商品
 */
router.get('/api/allgoods', (req, res) => {
    let sqlStr = 'SELECT * FROM recommend';
    conn.query(sqlStr, (error, results, fields) => {
        if (error) {
      console.log(error);
            res.json({err_code: 0, message: '请求商品数据失败'});
        } else {
            results = JSON.parse(JSON.stringify(results));
            res.json({success_code: 200, message: results});
        }
    });
});
/**
 * 获取首页商品列表
 */
router.get('/api/homeshoplist', (req, res) => {
    // 获取总分类
    let cateSqlStr = 'SELECT COUNT(*) FROM category';
  conn.query(cateSqlStr, (error, results, fields) => {
    if (!error) {
            let sqlStr = '';
            for(let i=0; i < results[0]['COUNT(*)']; i++){
                sqlStr += 'SELECT * FROM recommend WHERE category = ' + (i+1) + ' LIMIT 3;';
            }
            conn.query(sqlStr, (error, results, fields) => {
                if (!error) {
                    results = JSON.parse(JSON.stringify(results));
                    res.json({success_code: 200, message: results});
                }
            });
    }
  });
});
/**
 * 获取商品详细信息
 */
router.get('/api/goodsdetail', (req, res) => {
    // 获取参数
    let goodsNo = req.query.goodsNo;
  let sqlStr = 'SELECT * FROM recommend WHERE goods_id = ' + goodsNo;
  conn.query(sqlStr, (error, results, fields) => {
    if (!error) {
            results = JSON.parse(JSON.stringify(results));
      res.json({success_code: 200, message: results});
    }
  });
});
/**
 * 获取商品评价
 */
router.get('/api/goodscomment', (req, res) => {
    // 获取参数
    let goodsId = req.query.goodsId;
  let sqlStr = 'SELECT user_info.id, user_info.user_name, user_info.user_nickname, comments.comment_detail, comments.comment_id, comments.comment_rating, comments.goods_id FROM user_info INNER JOIN comments ON user_info.id = comments.user_id WHERE goods_id = ' + goodsId;
  conn.query(sqlStr, (error, results, fields) => {
    if (!error) {
            results = JSON.parse(JSON.stringify(results));
      res.json({success_code: 200, message: results});
    }
  });
});
/**
  评论商品
*/
router.post('/api/postcomment', (req, res) => {
  // 获取参数
  let goods_id = req.body.goods_id;
  let comment_detail = req.body.comment_detail;
  let comment_rating = req.body.comment_rating;
  let user_id = req.body.user_id;
    const addSql = "INSERT INTO comments(goods_id, comment_detail, comment_rating, user_id) VALUES (?, ?, ?, ?)";
    const addSqlParams = [goods_id, comment_detail, comment_rating, user_id];
    conn.query(addSql, addSqlParams, (error, results, fields) => {
        results = JSON.parse(JSON.stringify(results));
        if (!error) {
          // 更新数据
          let sqlStr = "UPDATE recommend SET comments_count = comments_count + 1 WHERE goods_id = " + goods_id;
          conn.query(sqlStr, (error, results, fields) => {
            if (error) {
              console.log(error);
            } else {
              res.json({success_code: 200, message: "发布成功"});
            }
          });
        }
     });
});
/**
 一次性图形验证码
*/
router.get('/api/captcha', (req, res) => {
    // 生成随机验证码
    let captcha = svgCaptcha.create({
        color: true,
        noise: 3,
        ignoreChars: '0o1iIO',
        size: 4
    });
    // 保存
    req.session.captcha = captcha.text.toLocaleLowerCase();
  tmp_captcha = captcha.text.toLocaleLowerCase();
    // 返回客户端
    res.type('svg');
    res.send(captcha.data);
});
/**
  发送验证码短信
*/
router.get('/api/send_code', (req, res) => {
    // 获取手机号码
    let phone = req.query.phone;
    // 随机产生验证码
    let code = sms_util.randomCode(6);
    /* sms_util.sendCode(phone, code, function (success) {
        if (success) {
             users[phone] = code;
             res.json({success_code: 200, message: '验证码获取成功!'});
         } else {
             res.json({err_code: 0, message: '验证码获取失败!'});
         }
     });*/
    // 成功——模拟短信功能
    setTimeout(() => {
        users[phone] = code;
        res.json({success_code: 200, message: code});
    }, 2000);
});
/**
  手机验证码登录
*/
router.post('/api/login_code', (req, res) => {
    // 获取数据
    const phone = req.body.phone;
    const code = req.body.code;
    // 验证验证码是否正确
    if (users[phone] !== code) {
        res.json({err_code: 0, message: '验证码不正确!'});
    }
    // 查询数据
    delete  users[phone];
    let sqlStr = "SELECT * FROM user_info WHERE user_phone = '" + phone + "' LIMIT 1";
    conn.query(sqlStr, (error, results, fields) => {
        if (error) {
            res.json({err_code: 0, message: '查询失败'});
      console.log(error);
        } else {
            results = JSON.parse(JSON.stringify(results));
            if (results[0]) {  // 用户已经存在
                req.session.userId = results[0].id;
                res.json({
                    success_code: 200,
                    message: {
            id: results[0].id,
                        user_name: results[0].user_name,
                        user_nickname: results[0].user_nickname || '',
                        user_phone: results[0].user_phone,
            user_sex: results[0].user_sex,
            user_address: results[0].user_address,
            user_sign: results[0].user_sign,
                        user_birthday: results[0].user_birthday,
                        user_avatar: results[0].user_avatar
          }
                });
            } else { // 新用户
                const addSql = "INSERT INTO user_info(user_name, user_phone, user_avatar) VALUES (?, ?, ?)";
                const addSqlParams = [phone, phone, 'http://localhost:' + config.port + '/avatar_uploads/avatar_default.jpg'];  // 手机验证码注册,默认用手机号充当用户名
                conn.query(addSql, addSqlParams, (error, results, fields) => {
                    results = JSON.parse(JSON.stringify(results));
                    if (!error) {
                        req.session.userId = results.insertId;
                        let sqlStr = "SELECT * FROM user_info WHERE id = '" + results.insertId + "' LIMIT 1";
                        conn.query(sqlStr, (error, results, fields) => {
                            if (error) {
                                res.json({err_code: 0, message: '注册失败'});
                                console.log(error);
                            } else {
                                results = JSON.parse(JSON.stringify(results));
                                res.json({
                                    success_code: 200,
                                    message: {
                                        id: results[0].id,
                                        user_name: results[0].user_name,
                                        user_phone: results[0].user_phone,
                                        user_avatar: results[0].user_avatar
                                    }
                                });
                            }
                        });
                    }
                });
            }
        }
    });
});
/**
 * 用户名和密码登录
 */
router.post('/api/login_pwd', (req, res) => {
  // console.log(req.session.captcha);
  // console.log(tmp_captcha);
    // 获取数据
  const user_name = req.body.name;
    const user_pwd = md5(md5(req.body.pwd) + S_KEY);
    const captcha = req.body.captcha.toLowerCase();
    // 验证图形验证码是否正确
    if (captcha !== tmp_captcha) {
        res.json({err_code: 0, message: '图形验证码不正确!'});
        return;
    }
    tmp_captcha = '';
    // 查询数据
    let sqlStr = "SELECT * FROM user_info WHERE user_name = '" + user_name + "' LIMIT 1";
    conn.query(sqlStr, (error, results, fields) => {
        if (error) {
            res.json({err_code: 0, message: '用户名不正确!'});
        } else {
            results = JSON.parse(JSON.stringify(results));
            if (results[0]) {  // 用户已经存在
                // 验证密码是否正确
                if (results[0].user_pwd !== user_pwd) {
                    res.json({err_code: 0, message: '密码不正确!'});
                } else {
                    req.session.userId = results[0].id;
                    res.json({
                        success_code: 200,
                        message: {
                            id: results[0].id,
                            user_name: results[0].user_name || '',
                            user_nickname: results[0].user_nickname || '',
                            user_phone: results[0].user_phone || '',
              user_sex: results[0].user_sex || '',
              user_address: results[0].user_address || '',
              user_sign: results[0].user_sign || '',
              user_birthday: results[0].user_birthday || '',
                            user_avatar: results[0].user_avatar || ''
                        },
                        info: '登录成功!'
                    });
                }
            } else { // 新用户
                const addSql = "INSERT INTO user_info(user_name, user_pwd, user_avatar) VALUES (?, ?, ?)";
                const addSqlParams = [user_name, user_pwd, 'http://localhost:' + config.port + '/avatar_uploads/avatar_default.jpg'];
                conn.query(addSql, addSqlParams, (error, results, fields) => {
                    results = JSON.parse(JSON.stringify(results));
                    if (!error) {
                        req.session.userId = results.insertId;
                        let sqlStr = "SELECT * FROM user_info WHERE id = '" + results.insertId + "' LIMIT 1";
                        conn.query(sqlStr, (error, results, fields) => {
                            if (error) {
                                res.json({err_code: 0, message: '注册失败'});
                            } else {
                                results = JSON.parse(JSON.stringify(results));
                                res.json({
                                    success_code: 200,
                                    message: {
                                        id: results[0].id,
                                        user_name: results[0].user_name || '',
                                        user_nickname: results[0].user_nickname || '',
                                        user_avatar: results[0].user_avatar || ''
                                    }
                                });
                            }
                        });
                    }
                });
            }
        }
    });
});
/**
*  根据session中的用户id获取用户信息
* */
router.get('/api/user_info', (req, res) => {
    // 获取参数
   let userId = req.query.user_id || req.session.userId;
    let sqlStr = "SELECT * FROM user_info WHERE id = " + userId + " LIMIT 1";
    conn.query(sqlStr, (error, results, fields) => {
        if (error) {
            res.json({err_code: 0, message: '请求用户数据失败'});
        } else {
            results = JSON.parse(JSON.stringify(results));
            if (!results[0]) {
                delete req.session.userId;
                res.json({error_code: 1, message: '请先登录'});
            } else {
                res.json({
                    success_code: 200,
                    message: {
                        id: results[0].id,
                        user_name: results[0].user_name || '',
                        user_nickname: results[0].user_nickname || '',
                        user_phone: results[0].user_phone || '',
                        user_sex: results[0].user_sex || '',
                        user_address: results[0].user_address || '',
                        user_sign: results[0].user_sign || '',
                        user_birthday: results[0].user_birthday || '',
                        user_avatar: results[0].user_avatar || ''
                    },
                });
            }
        }
    });
});
/**
 * 退出登录
 */
router.get('/api/logout', (req, res) => {
    // 清除session中userId
    delete  req.session.userId;
    res.json({
        success_code: 200,
        message: "退出登录成功"
    });
});
/**
 * 添加商品到购物车
 */
router.post('/api/add_shop_cart', (req, res) => {
    // 验证用户
    let user_id = req.body.user_id;
    if(!user_id){
        res.json({err_code:0, message:'非法用户'});
        return;
    }
    /* if(!user_id || user_id !== req.session.userId){
     console.log( req.session.userId);
         res.json({err_code:0, message:'非法用户'});
         return;
     }
  */
    // 获取客户端传过来的商品信息
    let goods_id = req.body.goods_id;
    let goods_name = req.body.goods_name;
    let thumb_url = req.body.thumb_url;
    let price = req.body.price;
    let buy_count = req.body.buy_count;
    let is_pay = 0; // 0 未购买 1购买
  let counts = req.body.counts;
    let sql_str = "SELECT * FROM cart WHERE goods_id = " + goods_id + " AND user_id=" + user_id + " LIMIT 1";
    conn.query(sql_str, (error, results, fields) => {
        if (error) {
            res.json({err_code: 0, message: '服务器内部错误!'});
        } else {
            results = JSON.parse(JSON.stringify(results));
            if (results[0]) { // 商品已经存在
                res.json({success_code: 200, message: '该商品已在购物车中'});
            } else { // 商品不存在
        let add_sql = "INSERT INTO cart(goods_id, goods_name, thumb_url, price, buy_count, is_pay, user_id, counts) VALUES (?, ?, ?, ?, ?, ?, ?, ?)";
        let sql_params = [goods_id, goods_name, thumb_url, price, buy_count, is_pay, user_id, counts];
        conn.query(add_sql, sql_params, (error, results, fields) => {
          if (error) {
                        res.json({err_code: 0, message: '加入购物车失败!'});
                        console.log(error);
          } else {
            res.json({success_code: 200, message: '加入购物车成功!'});
          }
        });
            }
        }
    });
});
/**
 * 查询购物车的商品
 */
router.get('/api/cart_goods', (req, res) => {
    // 获取参数
    let user_id = req.query.user_id;
    let sqlStr = "SELECT * FROM cart WHERE user_id =" + user_id;
    conn.query(sqlStr, (error, results, fields) => {
        if (error) {
      console.log(error);
            res.json({err_code: 0, message: '请求购物车商品数据失败'});
        } else {
            res.json({success_code: 200, message: results});
        }
    });
});
/**
 * 删除购物车单条商品
 */
router.post('/api/delete_goods', (req, res) => {
    // 获取数据
    const goods_id = req.body.goods_id;
  const user_id = req.body.user_id;
    let sqlStr = "DELETE FROM cart WHERE goods_id =" + goods_id + " AND user_id = " + user_id;
    conn.query(sqlStr, (error, results, fields) => {
        if (error) {
      console.log(error);
            res.json({err_code: 0, message: '删除失败!'});
        } else {
            res.json({success_code: 200, message: '删除成功!'});
        }
    });
});
/*********************************** 用户中心 **************************************** */
/**
 * 修改用户信息
 */
router.post('/api/change_user_msg', (req, res) => {
    // 获取客户端传过来的商品信息
  const form = new formidable.IncomingForm();
    form.uploadDir = config.uploadsAvatarPath;  // 上传图片放置的文件夹
    form.keepExtensions = true; // 保持文件的原始扩展名
    form.parse(req, (err, fields, files)=>{
        if(err){
            return next(err);
        }
    let id = fields.id;
        let user_nickname = fields.user_nickname || '';
        let user_sex = fields.user_sex || '';
        let user_address = fields.user_address || '';
        let user_birthday = fields.user_birthday || '';
        let user_sign = fields.user_sign || '';
        let user_avatar = 'http://localhost:' + config.port + '/avatar_uploads/avatar_default.jpg';
        if(files.user_avatar){
            user_avatar = 'http://localhost:' + config.port + '/avatar_uploads/' + basename(files.user_avatar.path);
        }
        // 验证
        if (!id) {
            res.json({err_code: 0, message: '修改用户信息失败!'});
        }
        // 更新数据
        let sqlStr = "UPDATE user_info SET user_nickname = ? , user_sex = ?, user_address = ?, user_birthday = ?, user_sign = ?, user_avatar = ? WHERE id = " + id;
        let strParams = [user_nickname, user_sex, user_address, user_birthday, user_sign, user_avatar];
        conn.query(sqlStr, strParams, (error, results, fields) => {
            if (error) {
                console.log(error);
                res.json({err_code: 0, message: '修改用户信息失败!'});
            } else {
                res.json({success_code: 200, message: '修改用户信息成功!'});
            }
        });
    });
});
/**
 * 修改用户密码
 */
router.post('/api/change_user_pwd', (req, res) => {
    // 获取数据
    let id = req.body.id;
    let oriPwd = '';
    let newPwd = md5(md5(req.body.newPwd) + S_KEY);
    if(req.body.oriPwd){
        oriPwd = md5(md5(req.body.oriPwd) + S_KEY);
    }
    let sqlStr = "SELECT * FROM user_info WHERE id = " + id;
    conn.query(sqlStr, (error, results, fields) => {
        if (error) {
      console.log(error);
            res.json({err_code: 0, message: '查询失败!'});
        } else {
            results = JSON.parse(JSON.stringify(results));
            if (results[0]) { // 用户存在
                if(!results[0].user_pwd || (results[0].user_pwd && oriPwd === results[0].user_pwd)){
                    let sqlStr = "UPDATE user_info SET user_pwd = ? WHERE id = " + id;
                    conn.query(sqlStr, [newPwd], (error, results, fields) => {
                        if(!error){
                            res.json({success_code: 200, message: '密码修改成功!'});
                        }
                    });
                }else if(oriPwd != results[0].user_pwd){
                    res.json({err_code: 0, message: '输入的原始密码错误!'});
                }
            } else {
                res.json({err_code: 0, message: '非法用户!'});
            }
        }
    });
});
/**
  修改手机
*/
router.post('/api/change_user_phone', (req, res) => {
    // 获取数据
    const id = req.body.id;
    const phone = req.body.phone;
    const code = req.body.code;
    // 验证验证码是否正确
    if (users[phone] !== code) {
        res.json({err_code: 0, message: '验证码不正确!'});
    }
    // 查询数据
    delete  users[phone];
    let sqlStr = "UPDATE user_info SET user_phone = " + phone + " WHERE id = " + id;
    conn.query(sqlStr, (error, results, fields) => {
        if (error) {
            res.json({err_code: 0, message: '修改失败'});
      console.log(error);
        } else {
            res.json({success_code: 200, message: '修改成功'});
        }
    });
});
/********************************* 后台管理系统 ********************************** */
/**
 * 管理员登录
 */
router.post('/api/admin_login', (req, res)=>{
    const account = req.body.account;
    const pwd = req.body.pwd;
    const md5Pwd = md5(md5(req.body.pwd) + S_KEY);
    if(!account || !pwd){
        res.json({error_code: 0, message: "账号和密码不得为空!"});
    }
    let sqlStr = "SELECT * FROM administrators WHERE account = '" + account + "'";
    conn.query(sqlStr, (error, results, fields) => {
        if(error){
            console.log(error);
            res.json({error_code: 0, message: "服务器内部错误!"});
        }else if(results[0]){
            let user = JSON.parse(JSON.stringify(results[0]));
            if(md5Pwd === user['pwd']){
                req.session.adminId = user['id'];
                res.json({success_code: 200, message: "登录成功!"});
            }else{
                res.json({error_code: 0, message: "密码错误!"});
            }
        }else{
            res.json({err_code: 0, message: "用户不存在!"});
        }
    });
});
/**
 * 管理员退出登录
 */
router.get('/api/admin_logout', (req, res) => {
    console.log(req.session.adminId)
    delete  req.session.adminId;
    res.json({
        success_code: 200,
        message: "退出登录成功"
    });
});
/**
 * 修改商品数量
 */
router.post('/api/change_goods_count', (req, res) => {
    // 获取数据
    const goods_id = req.body.goods_id;
    const buy_count = req.body.count;
  const user_id = req.body.user_id;
    let sqlStr = "UPDATE cart SET buy_count = ? WHERE goods_id = " + goods_id + " AND user_id = " + user_id;
    let strParams = [buy_count];
    conn.query(sqlStr, strParams, (error, results, fields) => {
        if (error) {
      console.log(error);
            res.json({err_code: 0, message: '修改商品数量失败!'});
        } else {
            res.json({success_code: 200, message: '修改商品数量成功!'});
        }
    });
});
/**
 * 获取所有用户信息
 */
router.get('/api/admin_allusers', (req, res) => {
    let sqlStr = 'SELECT id, user_name, user_phone, user_nickname, user_address FROM user_info';
    conn.query(sqlStr, (error, results, fields) => {
        if (error) {
      console.log(error);
            res.json({err_code: 0, message: '请求用户数据失败'});
        } else {
            results = JSON.parse(JSON.stringify(results));
            res.json({success_code: 200, message: results});
        }
    });
});
/**
 * 删除recommend单条商品
 */
router.post('/api/delete_recom_goods', (req, res) => {
    // 获取数据
    const goods_id = req.body.goods_id;
    let sqlStr = "DELETE FROM recommend WHERE goods_id =" + goods_id;
    conn.query(sqlStr, (error, results, fields) => {
        if (error) {
      console.log(error);
            res.json({err_code: 0, message: '删除失败!'});
        } else {
      let sqlStr2 = "DELETE FROM cart WHERE goods_id =" + goods_id;
      conn.query(sqlStr, (error, results, fields) => {
        if (error) {
          console.log(error);
          res.json({err_code: 0, message: '删除失败!'});
        } else {
          res.json({success_code: 200, message: '删除成功!'});
        }
      });
        }
    });
});
/**
 * 修改recommend商品信息
 */
router.post('/api/update_recom_goods', (req, res) => {
    // 获取数据
    const goods_id = req.body.goods_id;
    const goods_name = req.body.goods_name;
    const short_name = req.body.short_name;
    const price = req.body.price;
    const counts = req.body.counts;
    const category = req.body.category;
    let sqlStr = "UPDATE recommend SET goods_name = ?, short_name = ?, price = ?, counts = ?, category = ? WHERE goods_id = " + goods_id;
    let strParams = [goods_name, short_name, price, counts, category];
    conn.query(sqlStr, strParams, (error, results, fields) => {
        if (error) {
      console.log(error);
            res.json({err_code: 0, message: '修改失败!'});
        } else {
            res.json({success_code: 200, message: '修改成功!'});
        }
    });
});
/**
 * 添加商品到recommend
 */
router.post('/api/add_shop_recom', (req, res) => {
    // 获取客户端传过来的商品信息
  const form = new formidable.IncomingForm();
    form.uploadDir = config.uploadsGoodsPath;  // 上传图片放置的文件夹
    form.keepExtensions = true; // 保持文件的原始扩展名
    form.parse(req, (err, fields, files)=>{
        if(err){
            return next(err);
        }
    let goods_id = fields.goods_id;
    let goods_name = fields.goods_name;
    let short_name = fields.short_name;
    let price = fields.price;
    let normal_price = price + 300;
    let market_price = price + 500;
    let sales_tip = fields.sales_tip;
    let category = fields.category;
    let comments_count = 0;
    let counts = fields.counts;
    let thumb_url = 'http://localhost:' + config.port + '/uploads/' + basename(files.goods_img.path);
    let image_url = 'http://localhost:' + config.port + '/uploads/' + basename(files.goods_img.path);
    let hd_thumb_url = 'http://localhost:' + config.port + '/uploads/' + basename(files.goods_img.path);
    let sql_str = "SELECT * FROM recommend WHERE goods_id = " + goods_id;
    conn.query(sql_str, (error, results, fields) => {
      if (error) {
        res.json({err_code: 0, message: '服务器内部错误!'});
      } else {
        results = JSON.parse(JSON.stringify(results));
        if (results[0]) { // 商品已经存在
          res.json({success_code: 500, message: '该商品已在数据库中'});
        } else { // 商品不存在
          let add_sql = "INSERT INTO recommend(goods_id, goods_name, short_name, thumb_url, image_url, hd_thumb_url, price, normal_price, market_price, sales_tip, category, counts, comments_count) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)";
          let sql_params = [goods_id, goods_name, short_name, thumb_url, image_url, hd_thumb_url, price, normal_price, market_price, sales_tip, category, counts, comments_count];
          conn.query(add_sql, sql_params, (error, results, fields) => {
            if (error) {
              console.log(error);
              res.json({err_code: 0, message: '加入失败!'});
            } else {
              let sqlStr = "UPDATE category SET cate_counts = cate_counts + 1  WHERE cate_id = " + category;
              conn.query(sqlStr, [], (error, results, fields) => {
                if (error) {
                  console.log(error);
                } else {
                  res.json({success_code: 200, message: '加入成功!'});
                }
              });
            }
          });
        }
      }
    });
  });
});
/**
 * 删除所有商品
 */
router.post('/api/delete_all_goods', (req, res) => {
    // 获取数据
  const user_id = req.body.user_id;
    let sqlStr = "DELETE FROM cart WHERE user_id = " + user_id;
    conn.query(sqlStr, (error, results, fields) => {
        if (error) {
      console.log(error);
            res.json({err_code: 0, message: '删除失败!'});
        } else {
            res.json({success_code: 200, message: '删除成功!'});
        }
    });
});
export default router;

五,项目总结


相关文章
|
22天前
|
JavaScript 前端开发 中间件
探索后端技术:Node.js与Express框架的完美融合
【10月更文挑战第7天】 在当今数字化时代,Web应用已成为日常生活不可或缺的一部分。本文将深入探讨后端技术的两大重要角色——Node.js和Express框架,分析它们如何通过其独特的特性和优势,为现代Web开发提供强大支持。我们将从Node.js的非阻塞I/O和事件驱动机制,到Express框架的简洁路由和中间件特性,全面解析它们的工作原理及应用场景。此外,本文还将分享一些实际开发中的小技巧,帮助你更有效地利用这些技术构建高效、可扩展的Web应用。无论你是刚入门的新手,还是经验丰富的开发者,相信这篇文章都能为你带来新的启发和思考。
|
1天前
|
JavaScript 中间件 关系型数据库
构建高效的后端服务:Node.js 与 Express 的实践指南
在后端开发领域,Node.js 与 Express 的组合因其轻量级和高效性而广受欢迎。本文将深入探讨如何利用这一组合构建高性能的后端服务。我们将从 Node.js 的事件驱动和非阻塞 I/O 模型出发,解释其如何优化网络请求处理。接着,通过 Express 框架的简洁 API,展示如何快速搭建 RESTful API。文章还将涉及中间件的使用,以及如何结合 MySQL 数据库进行数据操作。最后,我们将讨论性能优化技巧,包括异步编程模式和缓存策略,以确保服务的稳定性和扩展性。
|
8天前
|
JavaScript 前端开发 测试技术
组件化开发:创建可重用的Vue组件
【10月更文挑战第21天】组件化开发:创建可重用的Vue组件
17 1
|
8天前
|
Web App开发 JavaScript 中间件
构建高效后端服务:Node.js与Express框架的完美结合
【10月更文挑战第21天】本文将引导你走进Node.js和Express框架的世界,探索它们如何共同打造一个高效、可扩展的后端服务。通过深入浅出的解释和实际代码示例,我们将一起理解这一组合的魅力所在,并学习如何利用它们来构建现代Web应用。
29 1
|
10天前
|
JavaScript 前端开发
vue全局公共组件自动引入并注册,开发效率直接起飞!
【10月更文挑战第14天】vue全局公共组件自动引入并注册,开发效率直接起飞!
33 1
|
12天前
|
SQL JavaScript 关系型数据库
node博客小项目:接口开发、连接mysql数据库
【10月更文挑战第14天】node博客小项目:接口开发、连接mysql数据库
|
17天前
|
存储 前端开发 中间件
vue3之vite配置vite-plugin-mock使用mock轻松创建模拟数据提高开发效率
vue3之vite配置vite-plugin-mock使用mock轻松创建模拟数据提高开发效率
125 0
|
22天前
|
Web App开发 存储 JavaScript
深入浅出Node.js后端开发
【10月更文挑战第7天】本文将带你进入Node.js的世界,从基本概念、环境搭建到实际案例,逐步深入探索Node.js在后端开发中的应用。我们将通过一个简单的在线聊天室项目,学习如何利用Node.js进行网络编程和数据处理,让你对Node.js有更全面的认识。
17 3
|
20天前
|
JavaScript 开发者
vue指令的开发看这篇文章就够了!超详细,赶快收藏!
【10月更文挑战第8天】vue指令的开发看这篇文章就够了!超详细,赶快收藏!
vue指令的开发看这篇文章就够了!超详细,赶快收藏!
|
21天前
|
JavaScript 前端开发
Vue开发必备:$nextTick方法的理解与实战场景
Vue开发必备:$nextTick方法的理解与实战场景
98 1