zoukankan      html  css  js  c++  java
  • 后端接口书写

    1、后端的接口

    express myapp --view=ejs

    cd myapp

    cnpm i

    cnpm i bcryptjs node-uuid
    mongoose@4 -S

    修改配置文件 package.json 添加dev指令

    复制 数据库相关文件,修改用户集合 (userid,username,password,tel)

    创建数据库 1908shop,修改db.js

    2、实现用户的注册接口 routes/users.js

    var User = require('./../sql/collection/users');
    var sql = require('./../sql');
    var utils = require('./../utils')
    var uuid = require('node-uuid');
    var bcrypt = require('bcryptjs');
    var salt = bcrypt.genSaltSync(10); // 加密级别
    
    // 实现注册接口 -- post提交方式
    router.post('/register', (req, res, next) => {
      // 1、先获取表单信息
      let { username, password, tel } = req.body;
      // 2、根据手机号查询 用户集合中是否有该用户,如果有,返回有该账户,如果没有注册继续
      sql.find(User, { tel }, { _id: 0 }).then(data => {
        // 2.1 判断有没有该用户
        if (data.length === 0) {
          // 2.2 没有该用户----继续完成注册操作
          // 2.2.1 生成用户的id
          let userid = 'users_' + uuid.v1();
          // 2.2.2 对密码加密
          password = bcrypt.hashSync(password, salt)
          // 2.2.3 插入数据库
          sql.insert(User, { userid, username, password, tel}).then(() => {
            res.send(utils.registersuccess)
          })
        } else {
          // 2.3 已有该用户
          res.send(utils.registered)
        }
      })
    })
    

    3、实现登陆功能 routes/users.js

    // 实现登陆功能
    router.post('/login', (req, res, next) => {
      // 1、获取表单信息
      let { tel, password } = req.body;
      // 2、依据手机号查询有没有该用户
      sql.find(User, { tel }, { _id: 0 }).then(data => {
        // 2.1 判断有么有该用户
        if (data.length === 0) {
          // 2.2 没有该用户
          res.send(utils.unregister)
        } else {
          // 2.3 有该用户,验证密码
          // 2.3.1 获取数据库中的密码
          let pwd = data[0].password;
          // 2.3.2 比较 输入的 密码和数据库中的密码
          var flag = bcrypt.compareSync(password, pwd) // 前为输入,后为数据库
          if (flag) {
            // 2.3.3 密码正确
            res.send(utils.loginsuccess)
          } else {
            // 2.3.4 密码错误
            res.send(utils.loginfail)
          }
        }
      })
    })
    

    4、编写登陆注册接口文档

    api/用户.md

    5、编写导入excel表格数据

    cnpm i node-xlsx -S

    5.1 创建产品的集合 sql/collection/pros.js

    const mongoose = require('./../db.js'); // 引入数据库连接模块
    const Schema = mongoose.Schema; // 拿到当前数据库相应的集合对象
    
    // 设计用户表的集合
    const proSchema = new Schema({ // 设计用户集合的字段以及数据类型
      proid: {type: String },
      type: { type: String },
      brand: { type: String },
      barndimg: { type: String },
      proname: { type: String },
      price: { type: Number },
      flag: { type: Number }, // 是否推荐
      proimg: { type: String },
      note: { type: String },
    })
    
    module.exports = mongoose.model('Pro', proSchema);
    
    

    5.2 添加产品的相关路由

    routes/pro.js + app.js 注册路由

    5.3 导入功能 --- 只需要一次即可

    routes/pro.js

    // 实现导入接口
    router.get('/import', (req, res, next) => {
      // 1、获取表格信息
      let obj = xlsx.parse(filestr)[0].data
      let arr = []
      // 2、遍历数据 --- 排除第一条数据
      obj.map((item, index) => {
        if (index !== 0) {
          // 3.生成一个产品的id,插入书
          arr.push({
            proid: "pro_" + uuid.v1(),
            type: item[0],
            brand: item[1],
            barndimg: item[2],
            proname: item[3],
            price: item[4],
            flag: item[5], // 是否推荐
            proimg: item[6],
            note: item[7]
          }) 
        }
      })
    
      // 4、插入数据库
      sql.insert(Pro, arr).then(() => {
        res.send(arr)
      })
      
    })
    

    6、查询产品数据

    // 查询产品 --- 分页功能
    // pageCode 页码,默认值为0
    // limitNum 每页显示个数, 默认值为10
    router.get('/', function(req, res, next) {
      // 1、获取前端的查询条件
      let { pageCode, limitNum } = req.query;
      // 2、设置页码和每页显示个数的默认值  ---- 数据类型
      pageCode = pageCode * 1 || 0;
      limitNum = limitNum * 1 || 10;
      // 3、查询数据
      sql.paging(Pro, {}, { _id: 0 }, limitNum, pageCode).then(data => {
        // 4、返回数据
        res.send({
          code: '200',
          success: '查询列表成功',
          length: data.length,
          data: data
        })
      })
    });
    

    7、查询产品的接口文档

    api/产品.md

    8、获取产品的类型接口

    8.1 封装获取类型的数据库 sql/index.js

    distinct(CollectionName, name) {
      return new Promise((resolve, reject) => {
        CollectionName.distinct(name).exec((err, data) => {
          if (err) throw err;
          resolve(data)
        })
      })
    }
    

    8.2 获取分类接口 routes/pro.js

    // 实现查询分类以及品牌的接口
    router.get('/type', (req, res, next) => {
      // 1、获取字段名 类型 type 品牌 brand,查询数据库
      let { type } = req.query
      type = type || 'type'
      sql.distinct(Pro, type).then(data => {
        res.send({
          code: '200',
          success: '获取类型成功',
          // length: data.length,
          data: data
        })
      })
    })
    

    8.3 接口文档 api/产品.md

    9、加入购物车业务逻辑

    routes/cart.js + app.js

    9.1 设计购物车的集合 sql/collection/carts.js

    9.2 加入购物车接口

    // 加入购物车 购物车数据id 产品id 用户id  产品的数量num
    router.get('/add', (req, res, next) => {
      // 1、获取数据
      let { userid, proid, num } = req.query;
      num = num * 1 || 1 // 设定默认数量
      // 2、加入购物车 
      // 如果当前用户的购物车中有这个产品,数量加1,否则加入
      sql.find(Cart, { userid, proid }, { _id: 0 }).then(data => {
        if (data.length === 0) {
          // 2.1没有改数据 --- 插入数据库操作
          sql.insert(Cart, {
            cartid: 'cart_' + uuid.v1(),
            userid,
            proid,
            num
          }).then(() => {
            res.send({
              code: '200',
              message: '加入购物车成功'
            })
          })
        } else {
          // 2.2更新数据库中购物车产品的数量
          sql.update(Cart, { userid, proid }, { $inc: { num: 1 } }).then(() => {
            res.send({
              code: '200',
              message: '加入购物车成功'
            })
          })
        }
      })
    })
    

    9.3 编写接口文档

    api/购物车.md

    10、实现查询购物车接口

    // 查询购物车数据  ---- 依据用户id获取购物车的数据,依据 产品id获取产品的信息,然后组合数据,输出数据
    router.get('/', function(req, res, next) {
      // 1、获取用户id
      let { userid } = req.query;
      // 2、依据用户id查询购物车的数据
      sql.find(Cart, { userid }, { _id: 0 }).then(data => {
        // 如果没有数据,告诉用户没有数据
        if (data.length === 0) {
          // 2.1 没有数据
          res.send(utils.cartnull)
        } else {
          // 2.2  有数据,遍历数据,获取数据的基本信息,组合数据
          let arr = []
          new Promise(resolve => { // 2.2.1内含异步操作
            data.map((item, index) => { // 2.2.2遍历数据
              // 2.2.3 依据产品的id查询数据的相关信息
              sql.find(Pro, { proid: item.proid }, { _id: 0 }).then(data1 => {
                // console.log(data1)
                // 2.2.4 组合数据
                arr.push({
                  cartid: item.cartid,
                  userid: userid,
                  proid: item.proid,
                  proname: data1[0].proname,
                  proimg: data1[0].proimg,
                  price: data1[0].price,
                  num: item.num
                })
                // 2.2.5 遍历所有的数据结束
                if (index >= data.length - 1) {
                  resolve()
                }
              })
            })
          }).then(() => {
            // 2.2.6 返回购物车数据结果
            res.send({
              code: '200',
              message: '获取购物车列表的数据',
              length: arr.length,
              data: arr
            })
          })
          
        }
      })
    });
    
    • 编写接口文档 api/购物车.md

    11、删除购物车接口

    // 删除购物车
    router.get('/delete', (req, res, next) => {
      // 1、获取删除的条件
      let { userid, proid } = req.query
      // 2、删除
      sql.delete(Cart, { userid, proid }).then(() => {
        res.send(utils.deletesuccess)
      })
    })
    
    • 接口文档

    12、更新购物车数据数量

    // 更新购物车
    router.get('/update', (req, res, next) => {
    // 1、获取更新的数据
    let { cartid, num } = req.query
    // 2、更新数据
    sql.update(Cart, { cartid }, { $set: { num: num } }).then(() => {
    res.send(utils.updatesuccess)
    })

    })

    13、获取产品详情接口

    routes/pro.js

    // 获取产品的详情
    router.get('/detail', (req, res, next) => {
      let { proid } = req.query
      sql.find(Pro, { proid }, { _id: 0 }).then(data => {
        res.send({
          code: '200',
          message: '查询该数据成功',
          data: data[0]
        })
      })
    })
    
    

    接口文档 api/产品.md

    14、轮播图接口

    • 数据库集合 sql/collection/banners.js

    • 数据库插入数据

    public/images复制相关图片,myapp/banner.js插入数据

    const sql = require('./sql')
    const Banner = require('./sql/collection/banners')
    const uuid = require('node-uuid');
    
    const arr = []
    
    for (var i = 0; i < 6; i++) {
      arr.push({
        bannerid: 'banner_' + uuid.v1(),
        type: 'home',
        img: 'images/' + (i + 1) + '.jpg',
        href: ''
      })
    }
    
    sql.insert(Banner, arr)
    
    • 编写接口

    routes/banner.js + app.js

    // 获取轮播图
    router.get('/', function(req, res, next) {
      // 依据类型查询相关的轮播图数据
      let { type } = req.query
      type = type || 'home'
      sql.find(Banner, { type }, { _id: 0 }).then(data => {
        res.send({
          code: '200',
          message: '获取轮播图数据成功',
          data: data
        })
      })
    });
    
    • 编写接口文档 api/轮播图.md

    15、评论接口

    • 设计评论 数据库集合 sql/collection/comments.js

    • routes/comment.js + app.js

    • 依据产品id 获取评论信息列表

    // 获取评论信息列表
    router.get('/', function(req, res, next) {
      let { proid } = req.query;
      // 内部包含用户的信息,通过用户id 获取到所有的用户名,对应的相关评论,拼接数据
      sql.find(Comment, { proid }, { _id: 0 }).then(data => {
        let arr = []
        new Promise(resolve => {
          data.map((item, index) => {
            sql.find(User, { userid: item.userid }, { _id: 0 }).then(data1 => {
              arr.push({
                commentid: item.commentid,
                username: data1[0].username,
                note: item.note,
                rating: item.rating
              })
              if (index >= data.length - 1) {
                resolve()
              }
            })
          })
        }).then(() => {
          res.send({
            code: '200',
            message: '查询评论列表',
            data: arr
          })
        })
      })
    });
    
    • 添加评论信息
    router.post('/add', (req, res, next) => {
      let { userid, proid, rating, note } = req.body;
      rating = rating * 1 || 5
      sql.insert(Comment, {
        commentid: 'comment_' + uuid.v1(),
        userid, proid, rating, note 
      }).then(() => {
        res.send(utils.commentsuccess)
      })
    })
    
    
  • 相关阅读:
    eclipse连接远程hadoop集群开发时0700问题解决方案
    螺旋线
    双曲抛物面
    双曲抛物面
    工业相机标定相关知识整理
    高科技 stuff
    高科技 stuff
    杜甫诗百首
    杜甫诗百首
    经典纪录片
  • 原文地址:https://www.cnblogs.com/hy96/p/11761207.html
Copyright © 2011-2022 走看看