APP下载

一种基于网状旧书湖的旧书交换系统

2020-06-10王訔杰覃海焕杨志和

上海电机学院学报 2020年2期
关键词:网状旧书书籍

王訔杰, 覃海焕, 袁 露, 杨志和, 袁 倩

(1. 上海电机学院 电子信息学院, 上海 201306; 2. 上海大学 机电工程与自动化学院, 上海 200072)

日常生活中图书使用后会闲置或当废品处理,造成资源的巨大浪费,而图书共享可有效解决此问题。目前的闲置书籍共享主要通过搭建共享平台使闲置的纸质图书得以交换和捐赠,促进资源的流动和共享,主要包括如下共享模式:

(1) 捐书换书线下活动模式。有些社区会不定期组织居民进行图书交换或捐赠活动,如“北京换书大集”邀请多家出版社提供新书免费交换,邀请多位文化名人持签名图书参与交换,市民将闲置书刊递交到首都图书馆或区县图书馆换取相应的书刊交换券进行交换[1]。此类线下活动操作简便,易于开展,但是活动范围有限,成本费用高,效果甚微。有些图书馆在馆内开辟一个区域,在固定的服务时间,依托图书馆庞大的读者群体按照设定的规则进行图书的交换和捐赠,如广东各类公共图书馆的省捐赠换书中心[2],以及东莞市图书馆、深圳图书馆、肇庆市图书馆等捐赠换书中心。

(2) 基于网络的图书交换模式。基于JSP的旧书交易系统[3]使用户通过客户端和交易平台就位置、发布物品等进行线上交流和线下交换,提高旧书籍的重复利用率,但只适用于小范围区域内的旧书交易。图书漂流网利用网络社区扩大了图书漂流的范围[4],同一本书的共同读者分享阅读感受以增加阅读乐趣,图书的漂流具有随机性和唯一性,主要在于分享阅读,无法做到多本图书的捐赠和交换。

(3) 图书收购租借模式。随着“分享型经济”的流行和近几年共享单车等成功商业模式的应用,已有不少工作尝试解决闲置图书的共享问题。例如,李国朋[5]提出的以蒲公英模式为核心的123图书馆,通过1~3折价格收购本馆会员的闲置图书,将其出租给会员,实现社会闲置图书的循环阅读推广;吴晓辉[6]提出的一种共享图书漂流模式,即“为每一本图书贴上专属二维码或配置二维码书签,通过新书销售、二手书漂流、旧书回收3个层级的应用,达到一个闭环式的共享体系”。

(4) 图书捐赠模式。现有很多公益捐书活动,如公共图书馆的捐书模式,依托固定的服务群体,目标客户明确[7]。目前,我国高校图书馆毕业生捐书管理模式[8]主要有收入馆藏、图书漂流、图书转赠、支援其他图书馆,一定程度上推进了公益的进展。

本文提出了一种自由等价交换-区域旧书湖网状系统(以下简称旧书湖网状系统),尝试通过互联网技术和第三方介入方式构建区域旧书湖网状系统,以每个城镇为一个旧书湖区域,通过物流将区域连接,每个区域内设置一个换书点负责书籍整理以及邮寄。用户可以将自己的书籍信息发布或捐赠到平台上,平台通过再包装配送到用户手中,实现有保障的等价换书、平等交易、可持续的捐赠。

1 运营模式

基于旧书湖网状系统的换换书社,其模式如图1所示。以城市为基本单位分割成多个旧书湖(通过采集数据进行大数据分析来划分旧书湖更加合理)。每个旧书湖内设置一个换书点(该换书点可与传统书店合作),通过快递进行书本运输,以此将旧书湖连成网状。用户通过平台的平等换书规则在平台内进行交换,平台负责保证书籍的质量,使用户更快更省钱换到所需书籍。

旧书籍是一个很庞大的集合,不同书籍由于价值和应用场景不同,交换存在不公平,需要进行适当的分类达到交换率的最大化以及公平交易。在

图1 换换书社换书模式

旧书湖网状系统的基础上提出了3种换书形式,分别是课本交换、课外书交换、爱心捐书。课本交换主要针对大学生,用户可在软件上下单进行估价获得虚拟币,采用虚拟币在软件中选取所需书籍进行交换。课外书交换不仅仅针对大学生,用户在书籍发布时将其信息暂保存到换书点,由平台通过机器图片识别和人工复查后,对书籍进行估价支付虚拟币。用户在软件中查询所需书籍,根据实际情况支付等价的换换币(部分跨区域支付一定运费)。爱心捐书采用有偿捐书形式,用户通过平台软件将自己的爱心书籍捐献换取虚拟币,并以虚拟币在软件内换取奖励和证书。这样既能捐献自己的爱心,又能使用户得到物质上的奖励。

2 数据模型及搜索排序算法

为保证用户能够方便快速地搜索到所需书籍,该系统保存旧书湖的信息、书籍信息以及各旧书湖之间的物流运费(见图2)。用户进行搜索时,通过分割模糊匹配搜索算法获取相关数据集,由GPS定位和逆地址分析获取用户所在旧书湖,使用Dijkstra算法求解弧权重非负的单源最短路问题[9]和高效的快速二分排序[10]得到最终结果。

图2 区域换书湖网状系统

该系统结构是个三元组为

regionLakeNetSystem(regionLakes,relationships,Books)

具体用法和参数意义如下:

(1) regionLakes是一个五元组(id, city, locationX, locationY, exchangePoints(id, bookLists, status))。依据城市划分的区域旧书湖集合,每个元组为一个旧书湖,以圆表示。元组中的元素:id为旧书湖编号;city为旧书湖所在城市;locationX为旧书湖中心坐标的经度;locationY为旧书湖中心坐标的纬度;exchangePoints为换书湖分站点。每个换书点由编号(id)、书籍列表(bookLists)和状态(status)组成,其中bookLists的每个元组用于描述具体的二手书籍信息,status描述换书点的状态,可能的状态包括:正在营业、暂停营业、歇业。×代表该区域湖内没有书籍。

(2) relationships是一个三元组(regionLake1, regionLake2, freight)表示区域旧书湖间的连线集合,且regionLake1(旧书湖1的id)和regionLake2(旧书湖2的id)之间有物流沟通,其物流运费为freight;若没有运费,则值freight为NULL。

(3) Books是一个五元组(id, name, description, price, lake),每一个元组表示一本书,以矩形表示。元组中的元素:id为书籍编号;name为书籍的名称;description为书籍的描述;price为书籍的价格;lake为书籍所在旧书湖的id。

2.1 数据筛选

设searchText为用户输入字符串,通过sql的模糊查询和联表查询返回满足条件的结果。程序代码表示为

Select book.*regionLakes.*from book, regionLakes where book.lake=regionLakes.id and book.name LIKE ‘%searchText%

2.2 数据排序

根据用户地址在旧书湖网状系统中搜索用户所需书籍,且换书点距离用户较近、花费低,搜索算法为SearchBook。为提高用户搜索交换书籍的效率,在该算法中采用Dijkstra算法思想对搜索排序进行优化。

通过数据筛选获得searchLists进行SearchBook(搜索算法)得到最终的结果distanceOrder。

首先获取当前searchLists集合中所有的不重复的旧书湖id,通过查询relationships,生成MapPrice(i,j),i表示旧书湖id为i,j表示旧书湖id为j,MapPrice[i][j]表示i与j之间的物流费用,d[i]表示i到搜索点的物流费用。伪代码如下所示:

Algorithm SearchBook

Input:searchLists

Output:distanceOrder

Begin:

/*初始化数组d*/

foreachi∈n

d[i]=(i==0 ? 0:INF)

end for

foreachi∈n

intx,m=INF;

/*3.如果y没有被加入集合,且d[y]是最小的,则把y加入集合且x=y*/

foreachy∈n

if(!v[y] &&d[y] <=m)

m=d[y],x=y;

end for

/*新的点加入集合(这是更新之后的新x)*/

v[x]=1;

/*更新x相邻的点的d[i],实际上这里更新的是所有点,但是与x未相邻的MapPrice[x][y]值是无穷大,不可能被更新*/

foreachy∈n

d[y]=min(d[y],d[x]+MapPrice[x][y]);

end for

end for

returnd

end

旧书湖网状系统随着书籍信息、业务范围的变化而不断更新。当旧书湖网状系统中旧书湖编号为i的换书点中的书籍发生改变时,如收到新的旧书籍或旧书籍被用户以换换币等价换取等,会修改相应书籍的Books,更新书籍的旧书湖信息;当业务拓展需要新增区域旧书湖时,在相应城市的区域旧书湖集合regionLakes中新增一个元组,描述该旧书湖的相关信息,将该旧书湖与现有旧书湖的物流路径和运费信息增加到区域旧书湖的连线集合relationships中。

3 系统架构与实现

3.1 系统的总体架构

换换书社系统采用了B/S构架,即Browser/Server(浏览器/服务器)结构,用户提出的服务请求和服务器响应都是通过标准的HTTP协议进行的,在服务器内部,书籍信息、订单、用户等都存放在数据库中。整个网络系统按“3层结构”(数据层、核心层和应用层)来构架(见图3)。

图3 系统架构及其功能

(1) 数据层。由于存储数据量、访问量大,要承受高并发,mysql在高并发情况下的性能下降尤其严重。因此,数据库采用MongoDB数据库[11],MongoDB是一个基于分布式文件存储的数据库,并且采用类似面向对象的查询语句,存储比较复杂的数据类型以及为Web应用提供可扩展的高性能数据存储解决方案,对于Web开发最为合适。根据可靠性原则和开放与可扩展性原则,以及统一和开发式标准化原则设计后台数据库。

(2) 核心层。NodeJS作为后端的框架,用于构建快速、可扩展的网络应用程序[12]。并且采用面向对象分析中的UML方式建模,主要包括3个服务模块:书籍提交保存服务、书籍搜索服务和书籍订单服务。由于用户浏览量大,系统采用单一的主线程,虽然只有单个线程进行业务处理(CPU运算),但是开启了其他专门线程进行I/O操作,保证响应速度快和稳定性强,同时NodeJS采用事件驱动,一旦监听到搜索服务,调用sql查询的回调函数,使非阻塞I/O模型更加轻量和高效。

(3) 应用层。本系统前端工程基于流程简化、低成本、快速开发、高性能等需求,主要选用到Vue.JS、vue-router、vuex、axios等关键组件[13],Vue.JS是支持组件化开发,能够快速完成复杂的应用程序。根据应用管理层有效的原有应用系统分类标准将实际应用系统分成两个体系:前端和后台管理。前端有4个模块,分别是:换书模块、租书模块,捐书模块,寻找书籍模块。后台管理有4个模块,分别是:书籍管理模块、订单管理模块、用户管理模块、消息管理模块。

3.2 系统的实现

本系统采用前后端分离和极限编程的开发方式,系统网页部署在apache服务器并通过axios与后端NodeJS进行通信,实现真正的前后端解耦。前端采用兼容于主流浏览器的UI开发组件—MuseUI,提供封装好的移动端界面快速调用,实现换书单的信息公布,快速搜索书籍,提交捐书书单等等。后台管理系统采用layui的通用型后台管理模板系统,达到极限编程的快速上线,后台主要是用户管理、书籍的信息管理、用户反馈消息管理以及用户换书和捐书的订单管理。

本系统采用基于bootstrap UI设计风格的APP设计,简洁UI界面带来更多的用户体验[14]。扁平化风格的主页(见图4)去掉了多余的透视、纹理,表现出软件的外在表现形式和内在展开形式[15],更加吸引用户注意,并让用户掌控APP应用软件。

图4 换书软件首页展示

4 结 语

本系统围绕日常生活与学习展开,用户操作简单便捷,引导和鼓励公众参与,并且在一定支持下能取得较好的发展,真正意义上实现服务于大众以及降低书籍成本,提高资源回收再利用性。但服务规则和简单管理无法实现自助服务,图书的质量取决于人工判断,将获取图书的封面图片,分析比对所述封面图片与数据库中的训练模型以评定所述图书的残缺等级,来实现图书质量判别以及自助服务。

猜你喜欢

网状旧书书籍
高碳铬轴承钢网状碳化物的析出规律研究
鲁迅与“书籍代购”
中国书籍享誉海外
Chinese books find an audience overseas中国书籍享誉海外
SWRH82B热轧盘条心部异常网状渗碳体组织分析及改善措施
滚筒式网状收纳器
曹文轩主编的书籍
旧书报为什么会发黄
旧书
孔夫子旧书网C2C电子商务模式研究