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

本文涉及的产品
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
简介: 基于Node+Vue+Express开发实现商城系统

作者主页:编程千纸鹤

作者简介:Java、前端、Pythone开发多年,做过高程,项目经理,架构师

主要内容:Java项目开发、毕业设计开发、面试技术整理、最新技术分享

项目编号:BS-GX-042

一,项目简介

本项目主要实现一下为学校各学科举办的竞赛进行信息化管理,通过springboot来实现后台管理系统的开发,通过Node+Vue+ElementUI实现前端页面的开发和交互,并提供了小程序端供参赛者使用查看相关的比赛信息。系统的整个业务流程十分完整,功能也比较完整,适合做毕业设计使用。

系统共涉及四个角色的使用人员:学校管理员、院系管理员、老师、学生

系统采用前后端分离开发模式开发设计,并使用三层架构和MVC设计模式。

学校管理员登陆系统:

  1. 查看公告
  2. 管理竞赛:发布竞赛,审核各院系的竞赛申请,查看参赛项目等
  3. 项目管理:主要查看各院系上报的参赛项目信息
  4. 竞赛申请管理:主要管理各院系自己添加的竞赛申请,进行审批查看等
  5. 公告管理:发布和管理学校公告信息
  6. 通知管理:查看和阅读各种系统通知信息
  7. 信息统计:以图形报表方式来展示各处参赛信息

院系管理员登陆系统:

  1. 查看公告
  2. 项目管理:管理本院各老师申报的项目并进行审批
  3. 作品管理:对各参栋队伍上传的作品进行打分
  4. 竞赛列表:查看学校发布的各种竞赛信息并进和申报
  5. 信息管理
  6. 信息统计

老师登陆系统:

  1. 个人中心:查看个人参加的比赛并管理个人信息
  2. 查看公告
  3. 项目管理:查看和申报本院申请的参赛项目,并可以加入各项目团队
  4. 竞赛列表:查看本院申请的比赛,可以带队申请比赛
  5. 我的申请管理:主要查看和审批老师申请的学校项目,学生加入我的项目的申请,我加入的别的老师的项目申请审核状态
  6. 信息管理

学生登陆系统:

  1. 查看公告
  2. 项目列表:查看学院发布的各种比赛项目,可以申请加入团队
  3. 作品管理:上传和管理自己的作品
  4. 竞赛列表:查看各类竞赛信息
  5. 我的申请管理:主要是查看学生申请的项目加入审批情况
  6. 信息管理

微信小程序端:

  1. 查看所有竞赛信息
  2. 查看院系的项目、我参与的项目、我的竞赛申请审批情况
  3. 个人中心:查看个人的参栋总数、积分情况、参赛历史情况等

二,环境介绍

语言环境:Java:  jdk1.8

数据库:Mysql: mysql5.7

应用服务器:Tomcat:  tomcat8.5.31

开发工具:IDEA或eclipse

语言环境:Java:  jdk1.8

数据库:Mysql: mysql5.7

应用服务器:Tomcat+Nodejs

开发工具:IDEA、VSCODE、微信小程序

开发技术:

 后台开发:springboot

 前端开发:Nodejs+vue+ElementUI+微信小程序

三,系统展示

后台管理人员登陆

管理员登陆

查看系统公告

竞赛管理

项目查看

竞赛申请与审报审核结果

公告管理

通知管理

信息统计

各院系管理员登陆系统

个人中心

项目管理

作品管理

竞赛列表

学院端申请管理

信息统计

学生登陆系统

个人中心

项目列表

作品管理

竞赛列表

我的申请管理

信息通知管理

老师登陆系统

个人中心

项目管理

竞赛列表:

我的申请管理

学生申请

老师申请

学生登陆小程序端

个人中心

四,核心代码展示

package com.sang.subjectcompetition.controller;
import com.sang.subjectcompetition.entity.Comp;
import com.sang.subjectcompetition.entity.Project;
import com.sang.subjectcompetition.entity.Teacher_Project;
import com.sang.subjectcompetition.entity.resultInfo.CompResult;
import com.sang.subjectcompetition.service.CompService;
import com.sang.subjectcompetition.service.ProjectService;
import org.apache.logging.log4j.util.PropertySource;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.Comparator;
import java.util.List;
@RestController
@RequestMapping("/comp")
public class CompController {
    @Autowired
    private CompService compService;
    @Autowired
    private ProjectService projectService;
    /**
     * 返回全部的竞赛信息
     * @return
     */
    @PostMapping("/getAllComps")
    public List<Comp> selectAllComp(){
        List<Comp> allComps = compService.getAllComps();
        allComps.sort(Comparator.naturalOrder());
        return allComps;
    }
    /**
     * 发布竞赛/更新
     * @param comp
     * @return
     */
    @PostMapping("/addComp")
    public String addComp(Comp comp){
        CompResult compResult = compService.createComp(comp);
        return compResult.getMessage();
    }
    /**
     * 多条件模糊查询
     * @return
     */
    @PostMapping("/moreSearch")
    public List<Comp> moreSearch(Comp comp){
        String compName=comp.getCompName();
        String organizer=comp.getOrganizer();
        Integer level=comp.getLevel();
        String subjectType=comp.getSubjectType();
        String place=comp.getPlace();
        Integer compState=comp.getCompState();
        return compService.getCompsBySelf(compName,organizer,level,subjectType,place,compState);
    }
    /**
     * 根据Id返回竞赛的项目
     */
    @GetMapping("/getProjectLists/{compId}")
    public List<Project> getProjectLists(@PathVariable Integer compId){
        List<Project> projectsBycompId = projectService.getProjectsBycompId(compId);
        return projectService.getProjectsBycompId(compId);
    }
}
package com.sang.subjectcompetition.controller;
import com.sang.subjectcompetition.entity.*;
import com.sang.subjectcompetition.entity.resultInfo.MessageResult;
import com.sang.subjectcompetition.respository.AdminRepository;
import com.sang.subjectcompetition.respository.CollegeRepository;
import com.sang.subjectcompetition.respository.StudentRepository;
import com.sang.subjectcompetition.respository.TeacherRepository;
import com.sang.subjectcompetition.service.MessageService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@RestController
@RequestMapping("/msg")
public class MessageController {
    @Autowired
    private MessageService messageService;
    @Autowired
    private AdminRepository adminRepository;
    @Autowired
    private StudentRepository studentRepository;
    @Autowired
    private CollegeRepository collegeRepository;
    @Autowired
    private TeacherRepository teacherRepository;
    @GetMapping("/getUnReadListPopup/{receiver}")
    public List<Message> getUnReadListPopup(@PathVariable String receiver ){
        return messageService.findUnReadMessage(receiver);
    }
    @GetMapping("/getUnReadList/{receive}")
    public List<Map<String ,Object>> getUnReadList(@PathVariable String receive){
        List<Map<String ,Object>> result=new ArrayList<>();
        List<Message> unReadMessage = messageService.findUnReadMessage(receive);
        for (Message message : unReadMessage) {
            Map<String ,Object> map=new HashMap<>();
            map.put("id",message.getId());
            map.put("date",message.getMsgDate());
            map.put("title",message.getTitle());
            map.put("content",message.getContent());
            if(message.getSenderRole()==0){
                Student student = studentRepository.findStudentByTargetId(message.getSender());
                map.put("sendUsername",student.getUsername());
                map.put("sendName",student.getNickname());
            }else if(message.getSenderRole()==1){
                Teacher teacher = teacherRepository.findTeacherByTargetId(message.getSender());
                map.put("sendUsername",teacher.getUsername());
                map.put("sendName",teacher.getNickname());
            }else if(message.getSenderRole()==2){
                College college = collegeRepository.findCollegeByTargetId(message.getSender());
                map.put("sendUsername",college.getUsername());
                map.put("sendName",college.getNickname());
            }else{
                Admin admin = adminRepository.findAdminByTargetId(message.getSender());
                map.put("sendUsername",admin.getUsername());
                map.put("sendName",admin.getNickname());
            }
            result.add(map);
        }
        return result;
    }
    @GetMapping("/getReadList/{receive}")
    public List<Map<String ,Object>> getReadList(@PathVariable String receive){
        List<Map<String ,Object>> result=new ArrayList<>();
        List<Message> readMessage = messageService.findReadMessage(receive);
        for (Message message : readMessage) {
            Map<String ,Object> map=new HashMap<>();
            map.put("id",message.getId());
            map.put("date",message.getMsgDate());
            map.put("title",message.getTitle());
            map.put("content",message.getContent());
            if(message.getSenderRole()==0){
                Student student = studentRepository.findStudentByTargetId(message.getSender());
                map.put("sendUsername",student.getUsername());
                map.put("sendName",student.getNickname());
            }else if(message.getSenderRole()==1){
                Teacher teacher = teacherRepository.findTeacherByTargetId(message.getSender());
                map.put("sendUsername",teacher.getUsername());
                map.put("sendName",teacher.getNickname());
            }else if(message.getSenderRole()==2){
                College college = collegeRepository.findCollegeByTargetId(message.getSender());
                map.put("sendUsername",college.getUsername());
                map.put("sendName",college.getNickname());
            }else{
                Admin admin = adminRepository.findAdminByTargetId(message.getSender());
                map.put("sendUsername",admin.getUsername());
                map.put("sendName",admin.getNickname());
            }
            result.add(map);
        }
        return result;
    }
    @GetMapping("/markMessage/{messageId}")
    public MessageResult markMessage(@PathVariable Integer messageId){
        return messageService.markRead(messageId);
    }
    @GetMapping("/deleteMessage/{messageId}")
    public MessageResult deleteMessage(@PathVariable Integer messageId){
        return messageService.deleteMessage(messageId);
    }
}
package com.sang.subjectcompetition.controller;
import com.sang.subjectcompetition.entity.Project;
import com.sang.subjectcompetition.entity.resultInfo.ProResult;
import com.sang.subjectcompetition.service.ProjectService;
import com.sang.subjectcompetition.service.StudentService;
import com.sang.subjectcompetition.service.TeacherService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.Comparator;
import java.util.List;
import java.util.TreeSet;
/**
 * 项目管理
 */
@RestController
@RequestMapping("/project")
public class ProjectController {
    @Autowired
    private ProjectService projectService;
    @Autowired
    private TeacherService teacherService;
    @Autowired
    private StudentService studentService;
    /**
     * 得到参加项目的老师
     * @param projectId
     * @return
     */
    @GetMapping("/getProjectJoinTeacher/{projectId}")
    public List getProjectJoinTeacher(@PathVariable Integer projectId){
        return projectService.getProjectJoinTeacher(projectId);
    }
    /**
     * 得到参加项目的学生
     * @param projectId
     * @return
     */
    @GetMapping("/getProjectJoinStudent/{projectId}")
    public List getProjectJoinStudent(@PathVariable Integer projectId){
        return projectService.getProjectJoinStudent(projectId);
    }
    /**
     * 根据学院id来得到模糊查询
     * @param project
     * @param collegeId
     * @return
     */
    @PostMapping("/getMoreSearchProjectByCollege")
    public List<Project> getMoreSearchProjectByCollege(Project project,Integer collegeId){
        List<Project> moreSearchProjectByCollege = projectService.getMoreSearchProjectByCollege(collegeId, project);
        moreSearchProjectByCollege.sort(Comparator.naturalOrder());
        return moreSearchProjectByCollege;
    }
    /**
     * 根据学院id来得到模糊查询
     * @param project
     * @param teacherId
     * @return
     */
    @PostMapping("/getMoreSearchProjectByTeacher")
    public List<Project> getMoreSearchProjectByTeacher(Project project,Integer teacherId){
        Integer collegeId=teacherService.getTeacherById(teacherId).getCollege().getId();
        List<Project> projects = projectService.getMoreSearchProjectByCollege(collegeId, project);
        projects.sort(Comparator.naturalOrder());
        return projects;
    }
    /**
     * 根据学院id来得到模糊查询
     * @param project
     * @param studentId
     * @return
     */
    @PostMapping("/getMoreSearchProjectByStudent")
    public List<Project> getMoreSearchProjectByStudent(Project project,Integer studentId){
        Integer collegeId=studentService.getStudentById(studentId).getCollege().getId();
        List<Project> moreSearchProjectByCollege = projectService.getMoreSearchProjectByCollege(collegeId, project);
        moreSearchProjectByCollege.sort(Comparator.naturalOrder());
        return moreSearchProjectByCollege;
    }
    /**
     * 根据学院id来得到模糊查询
     * @param project
     * @return
     */
    @PostMapping("/getMoreSearchAllProjects")
    public List<Project> getMoreSearchAllProjects(Project project){
        List<Project> moreSearchAllProject = projectService.getMoreSearchAllProject(project);
        moreSearchAllProject.sort(Comparator.naturalOrder());
        return moreSearchAllProject;
    }
    /**
     * 得到学生参与的项目集合
     * @param studentId
     * @return
     */
    @GetMapping("/getStudentProjects/{studentId}")
    public List<Project> getStudentProjects(@PathVariable Integer studentId){
        List<Project> studentProjects = projectService.getStudentProjects(studentId);
        studentProjects.sort(Comparator.naturalOrder());
        return studentProjects;
    }
    /**
     * 得到教师领队的项目
     * @param teacherId
     * @return
     */
    @GetMapping("/getTeacherJoinProjects/{teacherId}")
    public List<Project> getTeacherJoinProjects(@PathVariable Integer teacherId){
        List<Project> teacherJoinProjects = projectService.getTeacherJoinProjects(teacherId);
        teacherJoinProjects.sort(Comparator.naturalOrder());
        return teacherJoinProjects;
    }
    /**
     * 解散项目组
     * @param projectId
     * @return
     */
    @GetMapping("/invokeProject/{projectId}")
    public ProResult invokeProject(@PathVariable Integer projectId) {
        return teacherService.invokeProject(projectId);
    }
}

五,项目总结

本项目设计功能丰富,所使用的技术比较符合现在毕业设计的要求,使用springboot开发后台服务接口,使用Node+Vue开发前端操作界面,并使用微信小程序开发小程序端供用户使用。项目比较适合做毕业设计使用。

项目编号: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

二,环境介绍

语言环境:Java:  jdk1.8

数据库:Mysql: mysql5.7

应用服务器:Tomcat:  tomcat8.5.31

开发工具:IDEA或eclipse

开发技术:Node+Vue+Express

三,系统展示

三,系统展示

前端功能展示:

用户登陆

分类浏览

全文检索

添加购物车

我的购物车

个人中心

管理员操作

商品管理

商品添加

用户管理

四,核心代码展示

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;

五,项目总结

相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
1月前
|
开发框架 JavaScript 安全
js开发:请解释什么是Express框架,以及它在项目中的作用。
Express是Node.js的Web开发框架,简化路由管理,支持HTTP请求处理。它采用中间件系统增强功能,如日志和错误处理,集成多种模板引擎(EJS、Jade、Pug)用于HTML渲染,并提供安全中间件提升应用安全性。其可扩展性允许选用合适插件扩展功能,加速开发进程。
|
18天前
|
开发框架 JavaScript 中间件
node+express搭建服务器环境
node+express搭建服务器环境
node+express搭建服务器环境
|
3天前
|
JavaScript 前端开发 开发者
Vue的响应式原理:深入探索Vue的响应式系统与依赖追踪
【4月更文挑战第24天】Vue的响应式原理通过JavaScript getter/setter实现,当数据变化时自动更新视图。它创建Watcher对象收集依赖,并通过依赖追踪机制精确通知更新。当属性改变,setter触发更新相关Watcher,重新执行操作以反映数据最新状态。Vue的响应式系统结合依赖追踪,有效提高性能,简化复杂应用的开发,但对某些复杂数据结构需额外处理。
|
9天前
|
JavaScript 前端开发 UED
Vue工具和生态系统: Vue.js和服务器端渲染(SSR)有关系吗?请解释。
Vue.js是一个渐进式JavaScript框架,常用于开发单页面应用,但其首屏加载较慢影响用户体验和SEO。为解决此问题,Vue.js支持服务器端渲染(SSR),在服务器预生成HTML,加快首屏速度。Vue.js的SSR可手动实现或借助如Nuxt.js的第三方库简化流程。Nuxt.js是基于Vue.js的服务器端渲染框架,整合核心库并提供额外功能,帮助构建高效的应用,改善用户体验。
12 0
|
10天前
|
Web App开发 JavaScript 开发者
Vue工具和生态系统:什么是Vue DevTools?如何使用它?
Vue Devtools是Vue.js官方的浏览器扩展,用于简化应用调试和优化。可在Chrome和Firefox等浏览器上安装,集成到开发者工具中。安装步骤包括下载源码、npm安装、修改manifest.json并加载编译后的扩展。启用后,开发者能查看Vue组件树,检查属性,并在允许的情况下编辑data,提升开发效率。
13 0
|
15天前
|
开发框架 JavaScript 前端开发
【Node系列】Express 框架
Express.js 是一个基于 Node.js 平台的极简、灵活的 web 应用开发框架,提供一系列强大的特性来帮助你创建各种 web 和移动设备应用。
33 2
|
1月前
|
Web App开发 JavaScript 前端开发
js开发:请解释什么是Node.js,以及它的应用场景。
Node.js是基于V8的JavaScript运行时,用于服务器端编程。它的事件驱动、非阻塞I/O模型使其在高并发实时应用中表现出色,如Web服务器、实时聊天、API服务、微服务、工具和跨平台桌面应用(使用Electron)。适用于高性能和实时需求场景。
18 4
|
1月前
|
Web App开发 JavaScript 前端开发
使用Node.js和Express构建RESTful API
使用Node.js和Express构建RESTful API
19 0
|
3月前
|
JSON JavaScript 前端开发
超级实用!详解Node.js中的util模块和express模块
超级实用!详解Node.js中的util模块和express模块
|
4月前
|
开发框架 JSON JavaScript
Node.js教程-express框架
Node.js教程-express框架
39 1