登录 注册
当前位置:主页 > 资源下载 > 13 > travelibrary-微信小程序实战-流动图书馆.zip下载

travelibrary-微信小程序实战-流动图书馆.zip下载

  • 更新:2024-09-01 23:26:02
  • 大小:150KB
  • 推荐:★★★★★
  • 来源:网友上传分享
  • 类别:其它 - 开发技术
  • 格式:ZIP

资源介绍

流动图书馆是一个图书漂流和借阅工具,旨在共享闲置图书,并链接趣味相投的小伙伴。预览链接技术栈小程序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:12345678@127.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服务接口一直到前后端数据交互、小程序前端,我对程序开发的大致流程有了更进一步的了解,弥补的之前对服务端知识的缺失。三个人的小团队,因为兴趣结在一起,利用工作之余的时间完成自己喜欢的事情真的是一件令人十分有成就感的事情。有兴趣的可以看源码小程序前端小程序后端