目录
1 引言 2
1.1项目研究背景 4
1.2 项目研究内容 6
1.3 项目研究意义 7
2 技术选型与开发环境 9
2.1 技术选型 9
2.1.1Node.js介绍 9
2.1.2 异步编程介绍 10
2.1.3 阻塞和非阻塞介绍 11
2.1.4 MySQL数据库介绍 12
2.1.5 Nginx服务器介绍 14
2.1.6StrongLoop进程管理器介绍 14
2.1.7微信公众号平台介绍 14
3 需求分析 16
3.1 技术需求 16
3.2 功能需求 18
3.3 系统操作流程 18
3.3.1 关注微信图书借阅平台 18
3.3.2 功能菜单 18
3.3.3 扫码 19
3.3.4 确认操作 19
4.系统设计 20
4.1概要设计 20
4.2详细设计 21
4.2.1 微信公众号设置 21
4.2.2 获取图书信息 21
4.2.3 存储图书信息 22
4.2.4 展示图书信息 23
5数据库设计 25
5.1概念结构设计 25
5.2物理结构设计 25
6.图书借阅平台的实现 28
6.1配置 28
6.2主界面 28
6.2添加图书 29
6.3借阅图书 30
6.4归还图书 31
6.5浏览图书 32
参考文献 34
4.系统设计
概要设计是建立在需求分析的基础上的,概要设计的主要任务是,通过仔细分析软件规格说明,适当的对软件功能进行分解,从而把软件划分为模块,并设计出能完成预订功能的模块结构。
4.1概要设计
概要设计是软件设计具体实施阶段的第一个环节,通过给出核心功能点和设计要素的概括性描述,指导设计开发的方向。在这个阶段的主要任务一方面是概括地描述出整个软件的整体设计。另一方面是将工程概括的拆分出主要的核心模块描述各个模块大致的实现方案。
a)整体设计
1)微信公众号自定义菜单
微信公众号是用户使用该图书分享平台的入口,公众号底部的自定义菜单是引导用户进行功能操作的入口,需要设置简洁直观的入口让用户快速了解菜单对应的功能。
2)前端交互
图书分享和借阅应该是一个非常便捷的操作,不应当涉及过多的交互步骤,使得各个功能一触即达。
3)Node.js中间层
中间层的职责是前端与后端的桥梁,负责从后端获取数据并渲染出页面或进一步处理数据后传递给前端。
b)模块设计
1)借阅图书模块
图书借阅模块实现了图书的借阅操作,读者从书架上拿到图书,通过扫描图书背面的条形码确认借阅完成借书操作,取走图书。
2)归还图书模块
图书归还模块实现了图书的归还操作,当读者阅读完毕后,扫描图书条形码后确认图书归还,然后将图书归回原位。
3)添加图书模块
图书添加模块实现了图书的入库操作,读者拿出自己的图书,扫描图书条形码后确认图书归还,然后将图书放入书架。
4)浏览图书模块
浏览图书模块实现了浏览图书信息的功能,用户可以远程查看书架上的书籍信息,包括书籍名等基本信息、书籍数量、书籍可借阅数量。
4.2详细设计
用户进入微信后,关注公号进入公号界面,通过公众号主页底部的自定义菜单进入相关操作界面。点击“借阅图书”自动弹出二维码让用户扫描书籍自动借阅。点击“归还图书”自动弹出二维码让用户扫面书籍自动归还,点击“添加图书”自动弹出二维码让用户扫描书籍完成添加,点击“浏览图书”跳转到设定的网页浏览当前书库的所有书目。
4.2.1 微信公众号设置
申请个人公众订阅号和商业公众企业号的用户,首先需要首先到微信官网注册账号,个人公众订阅号用户需要提供证件申请实名认证,商业公众企业号用户需要提供商业资质证明。等待申请结果成功后,用户们便可以通过微信搜索功能搜索公众号名字,查看详情后关注该微信公众号。
在微信后台配置微信与自己的服务器之间的连接,从而打通从用户到微信服务器再到个人服务器之间的消息传递,并将处理后的结果回传给微信服务器,最终转发到用户的微信客户端上。
微信图书借阅平台通过企业公众号底部的自定义菜单栏,分别引导用户至不同的功能,与用户完成交互。菜单栏分为一级菜单和二级菜单,本平台使用借阅图书、归还图书、管理图书三个一级菜单,管理图书下有添加图书、浏览图书两个二级菜单。
4.2.2 获取图书信息
实现一个图书数据库的工作量非常庞大,设计到市面上所有已有图书的信息采集入库操作。为了便利地获取图书信息,采用豆瓣开放的公共图书API接口实现图书信息查询功能。用户首先打开微信进入公众号界面,通过公众号底部菜单中的“添加图书”菜单,点击后自动转至图书条形码扫描界面,用户扫描图书背面的条形码后,微信将识别出条形码中包含的ISBN号并回传给前端程序。本文转载自http://www.biyezuopin.vip/onews.asp?id=14549前端程序根据将ISBN回传给Node.js中间层服务器,Node.js向豆瓣开放API服务器发送RESTful请求,附带着图书的ISBN信息,取得图书信息(图书名、图书封面图片链接、图书内容摘要、作者、出版社等)。
4.2.3 存储图书信息
所有图书的信息都通过自豆瓣的开放API接口服务获得,每当采集到一本图书的信息,便会执行一次图书信息的存储任务,将图书信息存入服务器本地数据库中。这样做的原因是,一方面便于再次获取图书信息时,可以快速查询图书结果。另一方面将初次获取后的信息按照关系存入本地数据库有利于信息的统计和变更。
在取得图书信息后,用户点击确认按钮,图书的书名、ISBN号、作者、出版社、封面、摘要等信息会存储到数据库中,并附加与借阅相关的图书信息,比如图书库存量,借阅次数,当前借阅者的信息等等。
4.2.4 展示图书信息
Node.js中间层在取得图书信息后,根据预先定义的Jade模板渲染出图书界面的HTML内容。微信用户内置的Webview控件在收到HTML内容后,渲染内容,加载图书封面等静态资源,经过CSS样式表处理后渲染出图书展示界面。图书信息的展示工作完全由Node.js中间层负责,当用户在图书页面之间跳转时,均直接请求Node.js中间层服务器,交由Node.js选择指定的Jade模板渲染内容。
const express = require('express')
const fetch = require('isomorphic-fetch')
const json = require('../lib/json')
const weutils = require('../lib/weutils')
const router = express.Router()// echo 测试服务
router.get('/echo', (req, res) => {res.send({query: req.query,params: req.params,body: req.body})
})// 进行微信 auth 认证
// 参考微信示例代码:
// @url http://mp.weixin.qq.com/wiki/4/9ac2e7b1f1d22e9e57260f6553822520.html
router.get('/auth', (req, res) => {const { code, state } = req.queryif(!code) {return res.send('user not accepted!')}res.send({ code, state })
})router.get('/signature', (req, res) => {const { signature, timestamp, nonce, echostr } = req.queryweutils.checkSignature(signature, timestamp, nonce).then(data => res.send(echostr)).catch(err => res.send('signature invalid'))
})// 微信 JS-SDK 使用权限签名算法
// 参考微信示例(附录一):
// @url http://mp.weixin.qq.com/wiki/11/74ad127cc054f6b80759c40f77ec03db.html
router.get('/config', (req, res) => {const { url } = req.queryweutils.generateConfig(url).then(data => res.send(data)).catch(err => res.send({status: 500,msg: err.toString()}))
})// 豆瓣图书代理
router.get('/book/:isbn', (req, res) => {const { isbn } = req.paramsfetch(`https://api.douban.com/v2/book/isbn/${isbn}`).then(res => res.json()).then(book => {console.log('获取书籍', book)book.title = book.title || `Book not found (${isbn})`res.send(book)})
})module.exports = router