后端接口书写

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)
  })
})

原文地址:https://www.cnblogs.com/hy96/p/11761207.html