您好,欢迎光临本网站![请登录][注册会员]  
文件名称: travelibrary-微信小程序实战-流动图书馆.zip
  所属分类: 其它
  开发工具:
  文件大小: 150kb
  下载次数: 0
  上传时间: 2019-09-23
  提 供 者: weixin_********
 详细说明: 流动图书馆是一个图书漂流和借阅工具,旨在共享闲置图书,并链接趣味相投的小伙伴。预览链接技术栈小程序MINA框架: 一个响应的数据绑定框架。分为两块视图层(View)和逻辑层(App Service)Flex:flex弹性布局Express : http服务框架websocket: 前后端消息的实时推送mongoose: 操作mongodb数据库pm2: 服务端使用pm2部署,常驻进程截图首页借阅书架发布的图书借阅的图书客户端代码结构微信小程序中每个页面会有四个文件 .js .json .wxml .wxss js文件中是页面的逻辑,json文件是页面的一些配置,wxml是小程序的页面结构,wxss为页面的样式。封装http请求const request = ( obj) => {   if(obj.header){     obj.header.sessionId = session.sessionId;   }else{     obj.header = { sessionId: session.sessionId};   }   wx.request(obj); }在请求头中手动加上sessionId,因为小程序没有cookie。websocket//连接websocket wx.connectSocket({   url: wss://liudongtushuguan.cn/socket?sessionId=\u00a0 \u00a0session.sessionId,\r\n});\r\n\r\nwx.onSocketOpen(function(res){\r\n\r\n});\r\nwx.onSocketClose(function(res){\r\n\u00a0\u00a0console.log(websocket closed); }); wx.onSocketMessage(function(res){  //收到消息的回调   let msg = JSON.parse(res.data);   let msgs = that.data.borrowMessage;   msgs.unshift(msg);   that.setData({ borrowMessage: msgs}); });//发送socket消息   let data = JSON.stringify({     targetId: bookData.ownerId,     nickName: APP.globalData.userInfo.nickName,     bookName: bookData.title,     time: new Date().toLocaleString(),     bookId: bookId,     wxNum: wxNum,     phoneNum: phoneNum,     msg: msg,   });   wx.sendSocketMessage({     data: data,   });服务端代码目录Express框架实现http服务const https = require(https); const fs = require(fs); const express = require(express) const cookieParser = require(cookie-parser); const bodyParser = require(body-parser); const app = express(); const queryString = require(querystring); const URL = require(url); const socket = require(./service/socket); const router = require(./routes/router).router; //获取认证证书 var key = fs.readFileSync(./key/2_www.liudongtushuguan.cn.key); var cert = fs.readFileSync(./key/1_www.liudongtushuguan.cn_bundle.crt); var options = { key : key, cert : cert, }; app.use(cookieParser()); app.use(bodyParser.json()); const httpsServer = https.createServer(options,app); httpsServer.listen(443,() =>{     console.log(listening 443 port); }); socket(httpsServer);  //websocket app.use(router);小程序规定必须要用https协议。websocket模块这里使用ws模块而没有选择使用socket.io,因为小程序客户端不支持socket.ioconst WebSocket = require(ws);  //使用ws模块 const queryString = require(querystring); const URL = require(url); const sessions = require(./session); module.exports = (httpServer) => { const wss = new WebSocket.Server({server : httpServer}); wss.on(connection,(ws, req) => { let sessionId = queryString.parse(URL.parse(req.url).query).sessionId; ws.id = sessionId;          ws.on(message , (msg) => {           let msgObj = JSON.parse(msg);           if(sessions[msgObj.targetId]){           wss.clients.forEach((client) => {      if(client.id === msgObj.targetId){      let data = {      time : msgObj.time,      borrower :msgObj.nickName,       book :msgObj.bookName,      borrowerId : sessions[sessionId],      bookId : msgObj.bookId,      wxNum : msgObj.wxNum,      phoneNum : msgObj.phoneNum,      msg : msgObj.msg      };      client.send(JSON.stringify(data));      }      });           }          }); }); };mongoose操作数据库db.js:const mongoose = require(mongoose); mongoose.connect(mongodb://app:12345678127.0.0.1/wxapp); const connection = mongoose.connection; connection.once(open, (err) => { if(err){ console.log(Database connection failure); }else{ console.log(Database opened); } }); connection.on(error,(err) => { console.log(Mongoose connected error   err); }); connection.on(disconnected, () => { console.log(Mongoose disconnected); }); module.exports = { connection : connection, mongoose : mongoose, };model.js:const Schema = mongoose.Schema; const UserSchema = new Schema({ onlyId : {type: String}, publishedBooks : {type: Array}, borrowedBooks : {type: Array}, borrowMessages : Array,  }); const BookSchma = new Schema({ isbn : String, title : String, press : String, author : String, rate : String, tags : String, image : String, status : {type : Boolean,default : true}, ownerId : String, owner : String, ownerImage : String, }); const userModel =  mongoose.model(user , UserSchema); const bookModel = mongoose.model(book , BookSchma); module.exports = { UserModel  : userModel, BookModel : bookModel, }获得微信用户的openId小程序前端会请求微信服务器得到一个code, 将code发送给自己的服务器,然后自己的服务器给微信服务器发送请求,得到微信用户的唯一标识openIdconst https = require(https); const queryString = require(querystring); const sessions = require(./session); module.exports = (req, res, next) => { let code = req.query.code; let otherRes = res; DATA.js_code = code; OPTION.path = PATH   queryString.stringify(DATA); let wxReq = https.request(OPTION, (res) => { if(res.statusCode == 200){ let json = ; res.on(data , (data) => { json =data; }); res.on(end , () => { json =JSON.parse(json); let openId = json.openid; sessions[openId] = openId; otherRes.type(application/json); otherRes.json({ data : {sessionId : openId}, }); otherRes.status(200); }); } }); wxReq.end(); };使用pm2部署安装pm2npm install  -g pm2启动应用pm2 start app.js总结流动图书馆小程序是由三个人的小团队设计和开发的。我主要负责前后端的开发工作。这对从来没接触过服务端和小程序开发的我来说是一个挑战当然也是一次难得的学习机会。从最初对小程序,服务端两眼一抹黑,到搭建出应用的雏形,实现基本的效果,再到最后的拆分整合代码,这期间经历了很多,也收获了很多。从数据库的设计到后台数据库操作、会话管理、http服务接口一直到前后端数据交互、小程序前端,我对程序开发的大致流程有了更进一步的了解,弥补的之前对服务端知识的缺失。三个人的小团队,因为兴趣结在一起,利用工作之余的时间完成自己喜欢的事情真的是一件令人十分有成就感的事情。有兴趣的可以看源码小程序前端小程序后端
(系统自动生成,下载前可以参看下载内容)

下载文件列表

相关说明

  • 本站资源为会员上传分享交流与学习,如有侵犯您的权益,请联系我们删除.
  • 本站是交换下载平台,提供交流渠道,下载内容来自于网络,除下载问题外,其它问题请自行百度
  • 本站已设置防盗链,请勿用迅雷、QQ旋风等多线程下载软件下载资源,下载后用WinRAR最新版进行解压.
  • 如果您发现内容无法下载,请稍后再次尝试;或者到消费记录里找到下载记录反馈给我们.
  • 下载后发现下载的内容跟说明不相乎,请到消费记录里找到下载记录反馈给我们,经确认后退回积分.
  • 如下载前有疑问,可以通过点击"提供者"的名字,查看对方的联系方式,联系对方咨询.
 相关搜索:
 输入关键字,在本站1000多万海量源码库中尽情搜索: