亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

微信小程序?qū)崿F(xiàn)運(yùn)動(dòng)步數(shù)排名與發(fā)布個(gè)人動(dòng)態(tài)&服務(wù)器部署

laoLiueizo / 1370人閱讀

摘要:項(xiàng)目規(guī)劃本項(xiàng)目為基于微信手機(jī)應(yīng)用平臺(tái)的一款運(yùn)動(dòng)互動(dòng)型小程序,實(shí)現(xiàn)了用戶即時(shí)運(yùn)動(dòng)步數(shù)群內(nèi)與個(gè)人動(dòng)態(tài)的發(fā)布,小程序前端采用原生框架,后端采用基于的框架,數(shù)據(jù)庫(kù)采用,對(duì)象存儲(chǔ)采用七牛云,服務(wù)器采用阿里,域名采用認(rèn)證。

1. 項(xiàng)目規(guī)劃

本項(xiàng)目為基于微信手機(jī)應(yīng)用平臺(tái)的一款運(yùn)動(dòng)互動(dòng)型小程序,實(shí)現(xiàn)了用戶即時(shí)運(yùn)動(dòng)步數(shù)群內(nèi)PK與個(gè)人動(dòng)態(tài)的發(fā)布小程序前端采用原生框架,后端采用基于Node的koa2框架,數(shù)據(jù)庫(kù)采用MYSQL,對(duì)象存儲(chǔ)采用七牛云,服務(wù)器采用阿里ECS,域名采用CA認(rèn)證。

運(yùn)行效果如下
http://pgwn32i53.bkt.clouddn....

2. 支撐技術(shù)點(diǎn)分析 2.1 七牛云存儲(chǔ)

在這個(gè)項(xiàng)目中,有個(gè)功能為動(dòng)態(tài)發(fā)布,允許用戶上傳圖片,動(dòng)態(tài)發(fā)布后,所有人可在動(dòng)態(tài)廣場(chǎng)看到該動(dòng)態(tài),存儲(chǔ)圖片有很多方式,例如通過(guò)表單將文件轉(zhuǎn)為為二級(jí)制發(fā)送給后端,然后存數(shù)據(jù)庫(kù)中,但是,這樣我就要多寫很多代碼,所有我決定將圖片存儲(chǔ)到圖床,我數(shù)據(jù)庫(kù)中保存圖片鏈接即可,圖床有很多,不一一描述了,我這次用的是七牛云,個(gè)人認(rèn)證成功后將獲得一定空間的免費(fèi)存儲(chǔ)空間。

建立存儲(chǔ)空間(ydonline),選定存儲(chǔ)區(qū)域(華北)。

注冊(cè)成功后,將獲得兩組秘鑰,這東西很重要,上傳文件時(shí),需要知道uptoken,uptoken是根據(jù)AK與SC生成的,七牛云開發(fā)文檔中建議后端生成uptoken值,但我嫌麻煩,直接在線生成了uptoken,也就是說(shuō)該uptoken是寫死的。

uptoken生成地址:http://pchou.qiniudn.com/qini... deadline的時(shí)間設(shè)置長(zhǎng)一些

引入官方開發(fā)文件:qiniuUploader.js

小程序端存儲(chǔ)圖片關(guān)鍵代碼:

releaseNotice.js
const qiniuUploader = require("qiniuUploader.js");

function didPressChooesImage(that) {
  initQiniu();
  // 微信 API 選文件
  wx.chooseImage({
    count: 1,
    success: function (res) {
      var filePath = res.tempFilePaths[0];
      // 交給七牛上傳
      qiniuUploader.upload(filePath, (res) => {
        let imageurl = that.data.imageurl;
        imageurl.push(getApp().data.qiniu_domain + res.key);
        that.setData({
          "imageurl": imageurl
        });
      }, (error) => {
        console.error("error: " + JSON.stringify(error));
      });
    }
  }
  )
}

function initQiniu() {
  //配置詳解 https://github.com/gpake/qiniu-wxapp-sdk/blob/master/README.md
  var options = {
    region: "NCN", // 華東區(qū) 根據(jù)存儲(chǔ)區(qū)域填寫
    //uptokenURL: "UpTokenURL.com/uptoken",//// 從指定 url 通過(guò) HTTP GET 獲取 uptoken,返回的格式必須是 json 且包含 uptoken 字段,例如: {"uptoken": "0MLvWPnyy..."}
    uptoken: getApp().data.qiniu_uptoken,
    domain: getApp().data.qiniu_domain
  };
  qiniuUploader.init(options);
}


---------------------------------------------------------------------------------------  
app.js

App({
  data: {
    qiniu_domain: "http://pgwn32i53.bkt.clouddn.com/",//七牛圖片外鏈域名
    qiniu_uptoken: "uxQXOgxXDtF-1uM_V15KQSIky5Xkdww0GhoAksLF:LWUt0HMVbICEDaSOMnMF3YLoUH4=:eyJzY29wZSI6Inlkb25saW5lIiwiZGVhZGxpbmUiOjE4NTU2NzA0MDF9"

  },
})

上傳文件到指定的存儲(chǔ)空間,七牛會(huì)返回文件的key值,加上七牛給你的外鏈域名,這樣,你就可以顯示文件了。

2.2 服務(wù)器與域名

我買過(guò)兩次服務(wù)器,第一次是阿里的,另外一次也是阿里的。但這次,我買的是windows版云ECS ,首先,明確需求。

遠(yuǎn)程連接部署項(xiàng)目(安裝環(huán)境,運(yùn)行后臺(tái),域名解析,外網(wǎng)訪問(wèn))

進(jìn)行域名CA認(rèn)證, 小程序的請(qǐng)求必須得是HTTPS。

在windows 服務(wù)器上部署項(xiàng)目 簡(jiǎn)單, 遠(yuǎn)程鏈接時(shí),選擇共享本地某個(gè)硬盤的資料,連接成功后,把本地的環(huán)境軟件全部安裝上去,本次需要在服務(wù)器上安裝 node.js、git、mysql這三個(gè)軟件。

購(gòu)買SSL證書

https://yundunnext.console.al...

阿里有對(duì)單域名免費(fèi)的證書,時(shí)間為1年,于是我為該項(xiàng)目的域名購(gòu)買了https。

點(diǎn)擊下載 =>選擇 其他

解壓后,里面有兩個(gè)文件,一個(gè)是crt,一個(gè)是key,將這兩個(gè)文件發(fā)在后臺(tái)文件夾下/ssl包下 (可隨便命名)

后臺(tái)加載這兩個(gè)文件。

app.js 關(guān)鍵代碼
var app = require("koa"),
    https = require("https");
app=new app();

var options = {
  key: fs.readFileSync("./ssl/key.key"),  //ssl文件路徑
  cert: fs.readFileSync("./ssl/crt.crt")  //ssl文件路徑
};

// start the server
https.createServer(options, app.callback()).listen(443);

這樣,后臺(tái)就跑在htpps下了。

在服務(wù)器上運(yùn)行后臺(tái):

然后你用自己的電腦打開該域名,你會(huì)發(fā)現(xiàn)根本連接不上。

那么,這是什么鬼?

原來(lái) 阿里的windows 服務(wù)器 防火墻做了限制,且服務(wù)器安全組也做了限制。

打開防火墻=>高級(jí)設(shè)置=>入站規(guī)則=>新建規(guī)則。

選擇端口 =>填寫端口

本次需要填寫三個(gè)端口號(hào), 后臺(tái)的80(http) 443(https) 3306(mysql)

在阿里云控制器那里配置安全組,如下圖所示。

填寫 那三個(gè)端口號(hào), 授權(quán)對(duì)象那里 填寫 0.0.0.0/0

做完這一步,大功告成了,你的域名可以被訪問(wèn)了。

3. 數(shù)據(jù)庫(kù)設(shè)計(jì)

數(shù)據(jù)表有兩張,分為動(dòng)態(tài)表與運(yùn)動(dòng)數(shù)據(jù)表,如下圖所示。

4. 前端設(shè)計(jì)與開發(fā) 4.1 首頁(yè)

首頁(yè)主要由動(dòng)態(tài)廣場(chǎng)與底部的tabbar組成,動(dòng)態(tài)廣場(chǎng)顯示狀態(tài)正常(state==1)的動(dòng)態(tài),私人動(dòng)態(tài)與禁止動(dòng)態(tài)不能被他人所看見,在數(shù)據(jù)表設(shè)計(jì)中,uid其實(shí)就是openid。 用戶上傳了圖片后,數(shù)據(jù)庫(kù)中保存的是其訪問(wèn)地址,多個(gè)地址之間用逗號(hào)分隔,形成字符串, 前端拿到圖片地址后,將其轉(zhuǎn)成數(shù)組。

關(guān)鍵代碼如下:

 onShow:async function(){
    var that = this;
    let pageno = 1;
    let pagesize = this.data.pagesize;
    this.setData({ pageno:1});
    noticesource.findalllnotice(pageno, pagesize).then(function (res) {
      console.log(res);
      for (let i in res) {
        let image = res[i].photo.split(",");
        res[i].imageurl = image;
      }
      that.setData({ allnotice:  res });
    })
  },

?

動(dòng)態(tài)頁(yè)面使用分頁(yè)加載,每次下拉加載10條,內(nèi)容展示區(qū)使用 scroll-view組件,設(shè)置bindscrolltolower="upper",下拉時(shí)觸發(fā)upper方法。

關(guān)鍵代碼如下:

 upper: function () {
    var allnotice = this.data.allnotice;
    var pageno = ++this.data.pageno;
    var pagesize = this.data.pagesize;
    console.log(pageno);
    var that = this;
    this.setData({ pageno: this.data.pageno++ });
    noticesource.findalllnotice(pageno, pagesize).then(function (res) {
      console.log(res);
      for (let i in res) {
        let image = res[i].photo.split(",");
        res[i].imageurl = image;
      }
        if (res.length > 0) {
          allnotice=allnotice.concat(res);
        }
      console.log(allnotice);
      that.setData({ allnotice: Array.from(new Set(allnotice)) });
      })
    }
4.2 動(dòng)態(tài)發(fā)布頁(yè)

動(dòng)態(tài)發(fā)布頁(yè)主要有文本輸入框,圖片上傳區(qū)、發(fā)布按鈕組成。

該頁(yè)面為重要頁(yè)面,在發(fā)布前,我們需要獲取發(fā)布者的頭像、昵稱、openid,如果這三個(gè)必要條件缺一的話,我們就會(huì)阻止用戶發(fā)布動(dòng)態(tài)并且提示用戶授權(quán)登錄。

獲取openid關(guān)鍵代碼如下:

app.js 

wx.login({
      success(res) {
        console.log("code: " + res.code);
        if (res.code) {
          loginsource.login(res.code).then(function (data) {
            console.log(data);
            wx.setStorage({
              key: "openid",
              data: data.openid,
            })
            wx.setStorage({
              key: "session_key",
              data: data.session_key,
            })

          })
        } else {
          console.log("登錄失??!" + res.errMsg)
        }
      }
    });

用戶在進(jìn)入小程序時(shí),我就會(huì)讓一次后臺(tái)請(qǐng)求,根據(jù)wx.login返回的code解密生成 openid與 session_key,我將其存放在storage中,其實(shí),我不推薦將session_key放在storage中,按正常開發(fā)方式,應(yīng)該是后臺(tái)臨時(shí)存儲(chǔ)session_key,并返回一個(gè)sessionid給用戶,不應(yīng)該把session_key返回給用戶。但是,我在用koa-session時(shí),一直沒(méi)有成功,不知道什么鬼!沒(méi)辦法,我只好把session_key返回給用戶了。

上傳圖片關(guān)鍵代碼:

  didPressChooesImage: function () {
    if (this.data.imageurl.length>=4){
      wx.showToast({
        title:"不能超過(guò)4張",

      })
      return 
    }
    var that = this;
    didPressChooesImage(that); //沒(méi)有寫錯(cuò),只是同名,見2.1節(jié)
  },
      //刪除指定圖片
deleteImage: function (e) {
    let index = e.currentTarget.dataset.index;
    var that = this;
    var imagetemp = that.data.imageurl;
    imagetemp.splice(index, 1);
    that.setData({ imageurl: imagetemp });
  },
4.3 我的頁(yè)面

我的頁(yè)面包含了用戶的數(shù)據(jù)統(tǒng)計(jì)信息與小程序的推廣信息,目前有待完善,從我的頁(yè)面進(jìn)去的動(dòng)態(tài)頁(yè)面只包含用戶自己發(fā)布的。

在未登陸時(shí),頁(yè)面顯示默認(rèn)頭像,點(diǎn)擊頭像,授權(quán)個(gè)人信息,顯示微信頭像與昵稱。

4.4 群間運(yùn)動(dòng)PK

接下來(lái),重頭戲來(lái)了,運(yùn)動(dòng)數(shù)據(jù)pk為該小程序的核心功能,

功能點(diǎn):

1)獲取用戶此時(shí)的運(yùn)動(dòng)步數(shù)并展示出來(lái)

2)分享自己的運(yùn)動(dòng)步數(shù)到微信群 并在頁(yè)面上形成 pk排名區(qū)

3)其他用戶通過(guò)分享進(jìn)入小程序,系統(tǒng)獲取其群id與運(yùn)動(dòng)步數(shù) 與同一微信群的用戶進(jìn)行pk

4)每次分享或點(diǎn)擊分享鏈接,系統(tǒng)將自動(dòng)更新該用戶的運(yùn)動(dòng)步數(shù)

5) pk排名區(qū)只展示當(dāng)日的排名情況,晚上12點(diǎn)后自動(dòng)清空pk區(qū)

技術(shù)點(diǎn):

1)獲取用戶運(yùn)動(dòng)步數(shù)

2)獲取群id

3) 各群之間間運(yùn)動(dòng)數(shù)據(jù)隔離

效果如下圖所示

授權(quán)后顯示步數(shù)。

點(diǎn)擊選擇一個(gè)聊天后,將發(fā)布分享到微信群里,分享成功后,前端獲取到ShareTicket,群內(nèi)其他人通過(guò)該鏈接進(jìn)來(lái),前端也會(huì)獲取到ShareTicket,調(diào)用 wx.getShareInfo()將加密數(shù)據(jù)發(fā)送給后端解密,可獲得 openGid ,將用戶的步數(shù)與openGid等信息存儲(chǔ)起來(lái),形成了groupsport表。

保存當(dāng)日已分享的群id,獲取ShareTicket 關(guān)鍵代碼:

  
  onLoad: function (opt) {
      //在storage中創(chuàng)建用戶的當(dāng)日分享情況 也就是分享到了哪些群,將這些群id存在一個(gè)與日期掛鉤的對(duì)象中,到了第二天,清空群id.  
    var that =this;
    var nowDate = new Date();
    var year = nowDate.getFullYear();
    var month = nowDate.getMonth() + 1 < 10 ? "0" + (nowDate.getMonth() + 1)
      : nowDate.getMonth() + 1;
    var day = nowDate.getDate() < 10 ? "0" + nowDate.getDate() : nowDate
      .getDate();
    var dateStr = year + "-" + month + "-" + day;
   
      var value = wx.getStorageSync("openGidlist")
      if (value!=undefined||value!=null) {
       console.log(value);
        if (value.date != dateStr || value.Gidlist == undefined || value.Gidlist==null){
          wx.setStorageSync("openGidlist", { date: dateStr, Gidlist: [] });
        }
      }
      //設(shè)置開啟ShareTicket
  wx.showShareMenu({
      withShareTicket: true
    })
 }

獲取個(gè)人運(yùn)動(dòng)數(shù)據(jù)

onShow: function () {
wx.getWeRunData({
      success: function (res) {
        console.log(res);
        let session_key = wx.getStorageSync("session_key");
        console.log(session_key);
        sportsource.getsportdata(res, session_key).then(function (data) {
          console.log(data);
          that.setData({ todaysportcount: data.data.stepInfoList[30].step });
        })
       
      }
    })
  }

分享時(shí)獲取群id

 onShareAppMessage: function () {
      var nowDate = new Date();
      var year = nowDate.getFullYear();
      var month = nowDate.getMonth() + 1 < 10 ? "0" + (nowDate.getMonth() + 1)
        : nowDate.getMonth() + 1;
      var day = nowDate.getDate() < 10 ? "0" + nowDate.getDate() : nowDate
        .getDate();
      var dateStr = year + "-" + month + "-" + day;
      var that=this;
      return {
        title: "我已經(jīng)運(yùn)動(dòng)了" + this.data.todaysportcount+"步,你敢來(lái)PK嗎?",
        path: "pages/sportpk/sportpk",
        success: function (res) {
          var shareTickets = res.shareTickets;
          if (shareTickets.length == 0) {
            return false;
          }
          console.log("shareTickets"+shareTickets[0]);

          wx.getShareInfo({
            shareTicket: shareTickets[0],
            success: function (res) {
              var encryptedData = res.encryptedData;
              var iv = res.iv;
              console.log(res);
              let session_key = wx.getStorageSync("session_key");
              sportsource.getsportdata(res, session_key).then(function (data) {
                console.log(data);
                let openGid = data.data.openGId;
                that.setData({ openGid: openGid});
                let openid = that.data.openid;
                let todaysportcount = that.data.todaysportcount;
                let avatarUrl = that.data.userInfo.avatarUrl;
                let nickname = that.data.userInfo.nickName;
                if (todaysportcount == undefined || todaysportcount==null){
                  wx.showToast({
                    title: "請(qǐng)重新打開運(yùn)動(dòng)權(quán)限",
                    duration: 2000
                  })
                  return
                }
                if (avatarUrl == undefined || avatarUrl == null || nickname == undefined || nickname==null) {
                  wx.showToast({
                    title: "請(qǐng)先點(diǎn)擊頭像登錄",
                    duration: 2000
                  })
                  return
                }
                // let openGidlist = that.data.openGidlist;
                let openGidlist = wx.getStorageSync("openGidlist");
                openGidlist.Gidlist.push(openGid);
                openGidlist.Gidlist = [...new Set(openGidlist.Gidlist)]
                console.log("---------------------------------------");
                console.log("openGidlist.Gidlist" + openGidlist.Gidlist);
                 console.log("---------------------------------------");
                wx.setStorageSync("openGidlist", { date: dateStr, Gidlist: openGidlist.Gidlist});
                sportsource.creategroupsport({
                   openGid,
                   openid,
                   todaysportcount,
                   avatarUrl,
                   nickname
                   }).then(function(){
                     that.setData({ sharegroupdata: [] });
                     that.getfirstgroupsport();
                   })

              })

            }
          })
        },
        fail: function (res) {
          // 轉(zhuǎn)發(fā)失敗
        }
      }
    }

刷新群內(nèi)pk

 getfirstgroupsport: async function () {
    var that = this;
    let openGidlist = wx.getStorageSync("openGidlist");
    if (openGidlist.Gidlist != undefined || openGidlist.Gidlist != null) {
      if (openGidlist.Gidlist.length > 0) {
        for (let i in openGidlist.Gidlist) {
          let data = await sportsource.getgroupsport(openGidlist.Gidlist[i]);
          console.log(data);
          let sharegroupdata = that.data.sharegroupdata;
          sharegroupdata.push(data.data.rows);
          that.setData({ sharegroupdata: sharegroupdata })
        }

      }
    }
  },

點(diǎn)擊分享鏈接獲取shareTicket,通過(guò)鏈接進(jìn)入小程序的場(chǎng)景值是1044

app.js
onShow (opt){
  console.log("opt.scene" + opt.scene);
  if (opt.scene==1044){
    this.globalData.shareTicket = opt.shareTicket;
  }
},

5. 后端開發(fā)

后端采用的是koa2,通過(guò)sequelize.js實(shí)現(xiàn)與mysql的連接。

5.1 獲取用戶openid與session_key
function getOpenId(code) {
  console.log(code);
  return new Promise((resolve, reject) => {
      const id = ""; // AppID(小程序ID)
      const secret = "";// AppSecret(小程序密鑰)
      let url = `https://api.weixin.qq.com/sns/jscode2session?appid=${id}&secret=${secret}&js_code=${code}&grant_type=authorization_code`;
    axios.get(url).then(function (response) {
        console.log("response.data:"+response.data);
        resolve(response.data);
      })
      .catch(function (error) {
        console.log(error);
        reject(error);
      });

})
}
async function login(ctx) {
  const {code} = ctx.query;
  const data = await getOpenId(code);
  ctx.body = data;

}
5.2 運(yùn)動(dòng)數(shù)據(jù)與群id數(shù)據(jù)獲取

這兩個(gè)數(shù)據(jù)屬于隱私數(shù)據(jù),需要用算法解密,具體的流程,微信開發(fā)手冊(cè)上有,我就不多說(shuō)了,需要用到上一步的session_key來(lái)解密。

//WXBizDataCryptconst:微信提供的解密方法
WXBizDataCryptconst WXBizDataCrypt = require("./WXBizDataCrypt")

var appId = "";
async function getsportdata(ctx) {
  var encryptedData=ctx.query.encryptedData;
  var iv=ctx.query.iv;
  var session_key=ctx.query.session_key;
  console.log("session_key"+session_key);
  var pc = new WXBizDataCrypt(appId,session_key);

  var data = pc.decryptData(encryptedData,iv);

  console.log("解密后 data: ", data);
  ctx.body={
    success:true,
    data:data
  }
}
5.3 創(chuàng)建與讀取運(yùn)動(dòng)數(shù)據(jù)

當(dāng)用戶分享自己的運(yùn)動(dòng)數(shù)據(jù)到微信群內(nèi)時(shí)或者微信群內(nèi)其他用戶通過(guò)該鏈接進(jìn)入小程序時(shí),后端將獲創(chuàng)建或者更新該用戶的群內(nèi)運(yùn)動(dòng)數(shù)據(jù)。

const creategroupsport = async function(data){ // 給某個(gè)用戶創(chuàng)建一條群運(yùn)動(dòng)記錄
  let nowDate = new Date();
  let year = nowDate.getFullYear();
  let month = nowDate.getMonth() + 1 < 10 ? "0" + (nowDate.getMonth() + 1)
    : nowDate.getMonth() + 1;
  let day = nowDate.getDate() < 10 ? "0" + nowDate.getDate() : nowDate
    .getDate();
  let dateStr = year + "-" + month + "-" + day;
  var countdata = await Todolist.findAndCount({
    where:{openGid:data.openGid,createdate:dateStr,openid: data.openid}
  })
  var count=0;
  if(countdata!=undefined||countdata!=null) {
      count = countdata.count;
  }
  if(count==0) {
    await Todolist.create({
      openGid: data.openGid,
      openid: data.openid,
      todaysportcount: data.todaysportcount,
      createdate: dateStr,
      avatarUrl: data.avatarUrl,
      nickname: data.nickname
    })
  }
  else {
    await Todolist.update({
      todaysportcount: data.todaysportcount,
      avatarUrl: data.avatarUrl,
      nickname: data.nickname,
      openid: data.openid,
    },{
      where:{
        id:countdata.rows[0].id

      }
    })
  }
  return true
}
//讀取群內(nèi)運(yùn)動(dòng)數(shù)據(jù)
const getgroupsport = async function(openGid){
  console.log("openGid"+openGid);
  let nowDate = new Date();
  let year = nowDate.getFullYear();
  let month = nowDate.getMonth() + 1 < 10 ? "0" + (nowDate.getMonth() + 1)
    : nowDate.getMonth() + 1;
  let day = nowDate.getDate() < 10 ? "0" + nowDate.getDate() : nowDate
    .getDate();
  let dateStr = year + "-" + month + "-" + day;
  const data= await Todolist.findAndCount({
    where:{openGid:openGid,createdate:dateStr},
    order: [
      ["todaysportcount", "DESC"]
    ]
  })
  console.log(data);
  return data;
}
5.4 動(dòng)態(tài)的獲取

對(duì)用戶發(fā)布的動(dòng)態(tài),后臺(tái)目前主要有 增,改,查三類方法,我說(shuō)一下分頁(yè)查詢。

const findallnotice = async function(ctx){ // 查詢所有
    let pageno=ctx.pageno;
    let pagesize=ctx.pagesize;
    console.log(pageno,pagesize);
 const data= await Todolist.findAndCount({
            where: {state:1},
            offset:(pageno - 1) * pagesize,//開始的數(shù)據(jù)索引,比如當(dāng)page=2 時(shí)offset=10 ,而pagesize我們定義為10,則現(xiàn)在為索引為10,也就是從第11條開始返回?cái)?shù)據(jù)條目
            limit:pagesize*1//每頁(yè)限制返回的數(shù)據(jù)條數(shù)
       })
 console.log(data);
  return data;
}

const findmynotice = async function(ctx){ // 查詢自己的
  let pageno=ctx.pageno;
  let pagesize=ctx.pagesize;
  let uid=ctx.openid;
  console.log(pageno,pagesize,uid);
  const data= await Todolist.findAndCount({
    where:{uid:uid},
    offset:(pageno - 1) * pagesize,//開始的數(shù)據(jù)索引,比如當(dāng)page=2 時(shí)offset=10 ,而pagesize我們定義為10,則現(xiàn)在為索引為10,也就是從第11條開始返回?cái)?shù)據(jù)條目
    limit:pagesize*1//每頁(yè)限制返回的數(shù)據(jù)條數(shù)
  })
  console.log(data);
  return data;
}
6. 總結(jié)

我洋洋灑灑寫了幾千字,看上去舉重若輕,但是在實(shí)際開發(fā)中經(jīng)常會(huì)碰見各種各樣的問(wèn)題,該項(xiàng)目從原型設(shè)計(jì)與開發(fā)到部署都是我獨(dú)自完成的,中間也踩了一些坑,這個(gè)項(xiàng)目最終沒(méi)能上線,是因?yàn)?,個(gè)人主體賬號(hào)不能發(fā)布關(guān)于GUC的小程序。

本文首發(fā)于我的個(gè)人博客: https://www.catac.cn,轉(zhuǎn)載時(shí)請(qǐng)注明來(lái)源,

該項(xiàng)目源碼地址:https://github.com/ouminglian...

也歡迎各位與我交流,個(gè)人QQ:2541511219

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/108695.html

相關(guān)文章

  • 庫(kù)&amp;插件&amp;框架&amp;工具

    摘要:一些有用的一些有用的,包括轉(zhuǎn)換小箭頭三角形媒體查詢等中文指南是當(dāng)下最熱門的前端資源模塊化管理和打包工具。 nodejs 入門 nodejs 入門教程,大家可以在 github 上提交錯(cuò)誤 2016 年最好用的表單驗(yàn)證庫(kù) SMValidator.js 前端表單驗(yàn)證工具分享 淺談前端線上部署與運(yùn)維 說(shuō)到前端部署,可能大多數(shù)前端工程師在工作中都是使用的公司現(xiàn)成的部署系統(tǒng),與SRE對(duì)接、一起完...

    Codeing_ls 評(píng)論0 收藏0
  • 庫(kù)&amp;插件&amp;框架&amp;工具

    摘要:一些有用的一些有用的,包括轉(zhuǎn)換小箭頭三角形媒體查詢等中文指南是當(dāng)下最熱門的前端資源模塊化管理和打包工具。 nodejs 入門 nodejs 入門教程,大家可以在 github 上提交錯(cuò)誤 2016 年最好用的表單驗(yàn)證庫(kù) SMValidator.js 前端表單驗(yàn)證工具分享 淺談前端線上部署與運(yùn)維 說(shuō)到前端部署,可能大多數(shù)前端工程師在工作中都是使用的公司現(xiàn)成的部署系統(tǒng),與SRE對(duì)接、一起完...

    xiaowugui666 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

閱讀需要支付1元查看
<