后端接口書寫


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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM