基于Django的小说销售平台设计与实现

目 录

本科生毕业论文(设计)独创性声明 - 1 -
本科生毕业论文(设计)使用授权声明 - 1 -
摘 要 1
引 言 3
1 系统概述 4
1.1 系统开发背景及意义 4
1.2 开发环境和开发工具 4
2 系统需求分析 6
2.1 系统功能分析 6
2.2 系统性能需求 6
3 系统总体设计 7
3.1 系统功能结构 7
3.2 系统业务流程 7
4 详细设计 9
4.1 数据库设计 9
4.1.1 数据库概念结构设计 9
4.1.2 数据库逻辑结构设计 9
5 具体功能实现 12
5.1 登录注册功能实现 12
5.1.1 实现原理 12
5.1.2 实现过程 12
5.1.3 测试效果 14
5.2 作者读者信息管理功能实现及测试 14
5.2.1 实现原理 14
5.2.2 实现过程 14
5.3 忘记密码、退出登录功能实现 16
5.3.1 忘记密码实现 16
5.3.2 退出登录功能实现以及测试 17
致 谢 18
参考文献 19
附录1 源程序清单 21

摘 要

为了让读者以及小说作者,可以更加方便直观的去了解小说的受众群体,以及销量等数据,去建立了这个小说销售管理平台。本系统以基于python语言开发,以MySQL作为后台数据库。运用django框架等相关技术在Windows环境下对小说销售的数据相关讯息进行专业化可视化化处理。本系统基于用户对小说销售想要更直观统计的需求,进行小说销售,小说的销量分布,小说的查重改错几个模块的划分,并对各个模块进行了准确化和具体化,让用户使用此系统更加方便简洁。本文重点阐述系统的设计实现过程以及相关功能原理,系统通过前后台代码搭建而成,经过测试与分析可以准确的运行,具有极高的实用价值。
关键词:Django;小说销售管理;Python;可视化

Abstract

In order to allow readers and novel authors to more easily and intuitively understand the novel’s audience, sales volume and other data, this novel sales management platform has been established. This system is developed based on ptthon language and uses MySQL as the back-end database. Use the diango framework and other related technologies to professionally visualize the data-related information of novel sales under the Windows environment. This system is based on the user’s demand for more intuitive statistics on novel sales. It carries out novel sales, sales distribution of novels, and the division of several modules for novelty checking and error correction. Using this system is more convenient and concise. This article focuses on the design and implementation process of the system and the related functional principles. The system is built with front-end and back-end codes. It can be run accurately after testing and analysis, and has high practical value.
Keywords: Django; novel sales management; Python; visualization

引 言

随着计算机网络技术的快速发展,人们获取信息的方式随着科技快速发展,人们工作生活出行方式愈加丰富,为了应对快速小说销售,面向全国范围内的小说读者以及作者,为他们提供准确的小说阅读量,小说销量分布以及购买情况。极大地方便了小说作者可以直观的了解读者的种类分布,越来越多的机场和物流公司开始使用自动分拣系统。
跳过漫长的传统出版时间限制,从而能够以最快的速度获得到读者对作品的意见。这样作者可以最快的修改错误为书籍的出版做好准备。
Django是Python的一个优秀的开源Web开发框架,底层基于Python应用构建,首先在值机时,行李会被工作人员固定一个RFID标签来替代条形码标签。佩戴好标签的行李在系统中通过RFID读写器对物流信息进行存储读取。读写设备可以通过无线射频信号天线读取到RFID标签并获取到标签的信息。从而避免了信息的判读失败,提高了判读准确性以及分拣效率。
通过设计一款基于Django的小说销售平台,有助于掌握软件开发和测试流程,综合运用所学知识分析问题和解决问题,从而为将来从事软件开发方面的工作打下扎实的基础,为掌握软件开发和调试积累宝贵经验。
本设计项目基于互联网大环境,面向全国范围内的小说读者以及作者,为他们提供准确的小说阅读量,小说销量分布以及购买情况。极大地方便了小说作者可以直观的了解读者的种类分布,以及进行数据的可视化管理,能够让他们及时的了解小说的读者分布,以及小说的优缺点和是否需要改进的情况。

1 系统概述

1.1 系统开发背景及意义
根据近几年的观察调查和对自己以及身边人的感受,可以发现,以现阶段社会现状,网络上的小说销售变得更加重要。以及小说的在线销售情况的统计,可以说互联网方便的大多数群体对于小说的需求。在我设计本系统的初级阶段,设想的就是能够方便读者的同时,也去方便作者可以更好的去管理,以及了解自身小说的销售轨迹。这样的话,可以有利于作者去更好的了解自身的读者属于什么风格,年龄段。去了解受众的需求才能更好的写出小说。
以现阶段的情况来说,纸质传媒和网络传媒并未到可以相互取代的情况,所以在这种情况下,有一个可以将纸质传媒和网络传媒结合起来,讲数据变得可视化的管理系统变得尤为重要。
因为这样的管理系统,对于读者、作者都有着优大于劣的好处。例如,读者可以通过网络的大数据,去增加自己的喜好小说类型后,可以很方便的去找到同类的小说,而且可以通过本系统去得知该同类小说的销售情况,以及读者的分布,在读者分布这一方便,可以让读者更好的发现这部小说的真实销售情况。相对于之前需要去各大论坛或者评价去了解直观的多。
在这种情况下这种小说平台的可视化管理,便变得显得尤为重要,在互联网大数据的支撑下,可以让人们更加便利。
虽然国内外网络平台上关于此类系统实现不在少数,但是在现阶段,能将小说的可视化管理作为主要的功能的平台还在少数。我相信我可以通过这个小说销售平台的构建以及功能的实现,去达到这个目标。
1.2 开发环境和开发工具
⑴ 系统结构:小说销售是一套高度自动化的分拣系统,此类设备可以更高效快捷准确的小说。该设备最终目标是达到最大优化的高效安全、可靠、准确和易于用户维护。
⑵ 开发语言及环境:也要符合市场发展和用户的需求以及未来拓展功能,系统的通用性和可扩展性也非常重要。
⑶ 服务器:服务器使用Apache公司的Tomcat,用来实现服务端与浏览器端的信息交互。
⑷ 数据库:录入作者、读者信息时使用的数据库为MySql,以保证数据的安全和执行的高效。
⑸ 作者、读者管理:使用jdbc连接数据库,运用JavaSE中继承、多态、集合等相关知识实现信息的增删改查并展示给用户。
⑹ 前端设计:网站平面设计方面使用到了html、Css、Django等技术。

2 系统需求分析

2.1 系统功能分析
该小说销售管理系统以小说在线数据可视化为主,用户可查看查看小说的销售地点轨迹,读者的喜好分布,小说的评价、销量以及跟小说相关的数据。通过多次的研究调整,将设计实现以下几个功能。
⑴ 网站平面设计:操作界面美观、标准、专业、统一,实施方法简单便捷方便。
⑵ 系统功能:登录、注册、修改密码、退出系统等功能准确实现,确保分得清作者和读者身份。
⑶ 小说销售管理:作者对小说的销售、上下架进行管理,实现对小说单个信息的增删改查及批量的操作。读者后可看到小说的简介,详情以及销售的轨迹图等功能。
⑷ 小说信息管理:系统管理员对小说具体信息进行管理,小说信息单个信息的增删改查及批量的操作。
⑸ 每日推荐展示:系统管理员对小说进行每日推荐管理,可以通过网站管理系统的后台,推选出当日、当周的小说排行,可以让小说销售系统的数据变得可视化又便于作者和读者进行观察。
⑹ 信息查询功能:系统管理员录入相关数据到数据库,以供用户查询。用户通过条件查询,便能获得想了解的信息。(小说名称、类别、作者等都可以作为查询关键词)
2.2 系统性能需求
使小说销售的管理系统的可靠、长期、安全的运行,所以应满足以下的性能要求:
⑴ 系统的易用性
采用系统后,“小说识别准确率由之前的90%左右,提高至99%以上”。首先在值机时,设置好的RFID标签来替代条形码标签。
⑵ 系统处理的准确性和及时性
小说销售管理系统是为广大用户提供的,读写设备就可以通过无线射频信号感应到电子标签并获取到标签的信息。

3 系统总体设计

3.1 系统功能结构
根据系统的需求分析,给出小说销售管理系统的功能结构图,如图3.1所示:
在这里插入图片描述

图3.1 功能模块图
3.2 系统业务流程
根据系统的需求分析,经过反复研究后得出系统的业务流程。对于读者来来说,他要想登录本系统,首先要注册一个账号,注册成功后使用此账号进行登录,登录成功后可根据自己的需求及喜好浏览相关的小说、作者、小说推荐等相关信息。管理员对读者以及作者信息进行管理,并将数据录入到数据库,并实现对作者、读者、小说信息的管理(增删改查),方便作者以及读者可以浏览到实时准确的信息。系统流程图如图3.2所示。
在这里插入图片描述

图3.2 系统流程图

4 详细设计

4.1 数据库设计
4.1.1 数据库概念结构设计
数据结构表如表4.1所示。
表4.1 数据结构表
数据结构名 数据结构含义 组成
作者读者信息表 表示作者读者的详细信息 PlayerId,Season,TeamName,Age,Height,Weight,Nationality,Ys,DateTime,Number
作者读者数据表 表示作者读者数据 PlayerName,Point,Assist,Rebound,BlockShot,Turnover,Foul,FT,TP
信息表 表示详细信息 MatchId,TeamName,DateTime,Opponent,Result,Scores,Site
数据流表如表4.2所示。
表4.2 数据流表
数据流名称 操作 数据流来源 数据类型去向 数据流组成
作者读者数据 增删改查作者读者数据 管理员操作 作者读者数据表 同表中相关属性
小说信息 增删改查小说信息 管理员操作 小说信息表 同表中相关属性
赛程信息 增删改查赛 管理员操作 赛程信息表 同表中相关属性
4.1.2 数据库逻辑结构设计
作者读者信息表如表4.3所示。
表4.3 作者读者信息表
列名 空/非空 约束
PlayerId NOT NULL PRIMARY KEY
Name NOT NULL
Season NOT NULL
TeamName NOT NULL
Age NOT NULL
Height NOT NULL
Weight NOT NULL
Nationality NOT NULL
Ys NOT NULL
DateTime NOT NULL
Number NOT NULL
作者读者数据表如表4.4所示。
表4.4 作者读者信息表
列名 空/非空 约束
PlayerId NOT NULL PRIMARY KEY
PlayerName NOT NULL
Point NOT NULL
Assist NOT NULL
Rebound NOT NULL
BlockShot NOT NULL
Turnover NOT NULL
Foul NOT NULL
FT NOT NULL
TP NOT NULL
球队表如表4.5所示。
表4.5 球队表
列名 空/非空 约束
TeamId NOT NULL PRIMARY KEY
TeamName NOT NULL
Coach NOT NULL
Location NOT NULL
Arena NOT NULL
PPG NOT NULL
APG NOT NULL
RPG NOT NULL
SPG NOT NULL
BPG NOT NULL
AFG NOT NULL
AFT NOT NULL
ATP NOT NULL
赛程表如表4.6所示。

表4.6 赛程表
列名 空/非空 约束
MatchId NOT NULL PRIMARY KEY
TeamName NOT NULL
DateTime NOT NULL
Opponent NOT NULL
Result NOT NULL
Scores NOT NULL
Site NOT NULL

5 具体功能实现

5.1 登录注册功能实现
5.1.1 实现原理
读者和作者要在登录小说销售管理系统时,注册时要对用户输入的用户名、密码、电子邮箱的格式进行判断是否合法。不合法时提示给用户错误信息,只有全部信息均符合要求且不重复时才可以通过注册,注册到用来登录的用户名以及密码。同样进行格式验证以及用户身份的辨别,改登录信息输入错误的时候提示错误信息。当用户名密码均正确时可通过验证。
5.1.2 实现过程
前端在register.jsp中创建四个文本框用来让用户输入用户名、密码、确认密码、电子邮箱四项信息,在每个文本框下加一个span标签用来显示提示的输入信息格式错误的信息。用JavaScript对用户输入的注册信息进行验证。登录页面如图5.1所示。
在这里插入图片描述

图5.1 登录页面
即在文本框输入信息鼠标移出文本框时显示提示信息(是否合法)。接着获取用户名文本框的value值loginName,使用trim()方法去除前后空白后,用if语句进行条件判断,如果loginName为空字符串提示用户名不能为空,如果loginName的长度小于6大于14提示用户名的长度必须在6-14之间。用正则表达式设定用户名格式(只能由字母或数字组成),如不符合要求,则提示出错信息“用户名格式错误”,验证条件均设置好后,为用户名文本框对象绑定获取焦点事件(鼠标回到文本框时,内容清空)。
接着获取密码、确认密码文本框对象及span对象,进行非空、长度是否合法的判断。绑定失去焦点事件,获取密码、确认密码文本框的属性值,如果二者的属性值不相等,提示错误信息“密码不一致”。以便用户判断自己输入的信息符合要求。
获取电子邮箱文本框对象和span对象,用正则表达式判断邮箱格式,为文本框对象绑定失去焦点和获得焦点事件,当邮箱格式错误时提示出错原因信息。
最后为提交按钮绑定鼠标单击事件,当所有表单均合法时才可以进行提交。注册页面如图5.2所示。
在这里插入图片描述

图5.2 注册页面
在login.jsp中创建用户名、密码两个文本框,通过JavaScript进行表单验证(同register.jsp),并为两个文本框绑定失去焦点、和获得焦点事件,两个文本框中的内容均合法时即可进行提交。
后端首先创建一个用户类LoginBean,声明loginId,loginName,password,email四个成员变量,对其进行Getters and Setters、创建构造方法以及重写toString方法。其次创建一个LoginDao用来对用户信息进行操作,在LoginDao中创建一个insert()方法用来对用户的信息进行插入操作,使用JDBC进行数据库之间的连接,通过执行SQL语句完成用户信息的插入。创建findAll()方法,在findAll()方法中声明一个集合,用来存储所有的用户信息。接着创建RegisterServlet,在RegisterServlet中设置字符编码,获取loginName,password,email三个参数。新建LoginBean对象,调用insert()方法将LoginBean对象传入,方法体执行成功提示注册成功并获取loginName,password两个参数,将finaAll()方法查询出的结果放到一个list集合中,遍历list集合,将前台获取的loginName、password参数和list集合中的进行对比,如果相同则登录成功跳转到主页面,如果不相同提示用户名密码错误。
5.1.3 测试效果
本系统以基于python语言开发,以MySQL作为后台数据库。运用django框架等相关技术在Windows环境下对小说销售的数据相关讯息进行专业化可视化化处理。本系统基于用户对小说销售想要更直观统计的需求,进行小说销售,小说的销量分布,小说的查重改错几个模块的划分,并对各个模块进行了准确化和具体化,让用户使用此系统更加方便简洁。本文重点阐述系统的设计实现过程以及相关功能原理,系统通过前后台代码搭建而成,经过测试与分析可以准确的运行,具有极高的实用价值。
5.2 作者读者信息管理功能实现及测试
5.2.1 实现原理
通过点击主页中的作者读者信息管理,进入作者读者信息管理页面,对数据库中的所有作者读者信息进行展示,并可执行添加、删除、修改、批量删除操作。
5.2.2 实现过程
⑴ 作者读者信息分页展示
创建一个作者读者类PlayerBean和一个分页类PageBean,作者读者类中包括playerId,season,age,height等成员变量。分页类中包括totalCount,totalPage,currentPage,rows等成员变量。在PlayerDao中创建两个方法,findTotalCount()(查看总记录条数)方法和findByPage()(查询总页数)方法。通过连接数据库执行SQL语句完成功能的实现。在PlayerServiceImp中创建findPlayerByPage方法,在方法中创建一个空的PageBean对象,将查询结果存放到list集合中,计算总页码数。创建FindPlayerByPageServlet,在其中设置字符编码,获取参数(current、rows),调用PlayerServiceImpl中的findPlayerByPage方法进行查询,将查询结果存到pageBean的对象中,将PageBean存入到request,将请求转发到manageplayer.jsp中。在manageplayer.jsp使用EL表达式接受作者读者的相关数据以及分页的总记录条数和总页数。
⑵ 添加作者读者信息
在PlayerDao中创建一个insert()方法,获取参数存入到一个map集合中,封装PlayerBean对象,调用PlayerDao中的insert()方法进行保存,最后跳转到FindPlayerByPageServlet,完成数据的添加。在addPlayer.jsp中创建playerName、age、height等文本框,用来输入想要添加的作者读者信息,并对文本框进行表单验证,所有作者读者信息均合法时提交表单信息到AddPlayerServlet,完成信息的添加操作。
⑶ 删除作者读者信息
PlayerDao中创建一个delete()方法,DelPlayerServlet中设置编码,根据PlayerId进行删除,传递参数PlayerId,调用PlayerDao中的delete()方法,调用结束后跳转到FindPlayerByPageServlet完成数据的刷新。点击作者读者列表每行末尾的删除按钮,利用JavaScript生成提示,点击按钮时提示“确定要删除吗?”,点击确定后执行DelPlayerServlet,完成删除操作。
⑷ 批量删除作者读者信息
选中所要删除的信息,点击删除选中,使用JavaScript进行提示“确定删除吗”,点击确定跳转到DelSelectServlet,在DelSelectServlet中将选中信息的ID放到数组中,调用PlayerDao中的delSelectPlayer()方法进行删除,在此方法中遍历数组,执行SQL语句逐个删除。
⑸ 修改作者读者信息
PlayerDao中创建update()方法,通过JDBC连接数据库、执行sql语句完成数据的修改,在UpdatePlayerServlet中调用update()方法,执行结束后跳转到FindPlayerByPageServlet,完成数据的修改。在update.jsp(作者读者修改页面)中通过EL表达式,使得在点击修改按钮时根据PlayerID查询到该名作者读者的全部信息,跳转到作者读者修改页面后完成数据的回显,修改想要变更的信息后点击保存,完成修改操作。
⑹ 查询作者读者信息
在前端将作者读者姓名,作为查询条件。在PlayerDao中使用字符串拼接的方式连接查询条件。图书详情页面如图5.3所示。
在这里插入图片描述

图5.3 图书详情页面
5.3 忘记密码、退出登录功能实现
5.3.1 忘记密码实现
在用户注册过信息之后,总会有忘记密码等情况,可以通过点击忘记密码选项找回密码,通过注册时填写的信息,进行安全验证,验证通过后可以重置密码。
(1)操作流程:用户在登录界面点击“忘记密码”,跳转到安全验证界面,用户输入一个之前填写的安全验证信息,验证信息是否正确,如果填写的数据与该用户数据库中信息不符合,则提示“验证失败,请核对信息后修改密码”;如果用户填写信息这个时候就可以重置该用户名的密码,输入新密码,完成。
(2)后端方式:当用户输入Email地址后,验证这个Email,如果存在于数据库,那么取得用户的loginid,将loginid射频识别(RFID)技术是非接触式的,即RFID超高频读卡器可以在指定范围内读取标签,而无需触摸标签。因此,RFID技术在物流分拣中具有以下优点:一、扫描读写速度快。RFID标签体积非常的小,形式各式各样,便于各种物流货物挂载。射频识别卡的读取不受货物尺寸和形状的限制,也不需要与纸张的固定尺寸和打印条码信息质量相匹配才能准确读取,直接录取电子信息即可。
5.3.2 退出登录功能实现以及测试
用户点击退出登录按钮,利用JavaScript提示“确定退出?”点击确定,退出系统。

致 谢

在这次毕业设计中,所涉及的议题是和我的指导老师交流后定下的,在前期的实习积累经验,到中期的修改和讨论,及最后的反复斟酌,我希望能尽自己最大的努力,写出一篇具有现实意义的论文。但是在具体实施的过程中,我还是遇到了相当多当初没有预料的困难,也曾经令我迷茫和彷徨,论文得以顺利完成。首先要衷心地感谢我的指导老师当我对论文的思路感到迷茫时,您为我理清思路,指导我往一条比较清晰的思路上进行修改。在论文的不断修改中,我也努力做到及时积极地跟老师交流,因为我觉得这样可以使得我的论文更加完善。论文的最终完成,也是一波三折。在不断完善和修改的过程中,也让我更加懂得“一分耕耘才有一分收获”的道理。

参考文献

[1]郑阿奇.MySQL实用教程[M].北京:电子工业出版社.2009:155-192
[2]王英英.MySQL 8从入门到精通[M].清华大学出版社:北京,2020:35-69
[3]李刚.疯狂Java讲义(第5版)[M].电子工业出版社:北京,2019:219-235
[4]齐伟.跟老齐学Python:Django实战[M].电子工业出版社:北京,2019:15-40
[5]罗文劼 史青宣 苗秀芬.数据结构与算法 (第四版)[M].机械工业出版社:北京,2020:145-169
[6]Roger S. Pressman.软件工程——实践者之路(第6版)[M].清华大学出版社:北京,2006:129-135
[7]刘卫国.Python程序设计教程(第2版)[M].北京邮电大学出版社:北京,2020:86-121
[8]Clifford A. Shaffer.数据结构与算法分析(C++版)(第三版)[M].电子工业出版社:北京,2013:265-271
[9]薛卫国,薛卫民.实战Python设计模式:可复用面向对象软件开发实践[M].电子工业出版社:北京,2020:210-221
[10]刘宇宙,刘艳.Python实战之数据分析与处理[M].电子工业出版社:北京,2020:224-228
[11]刘长龙.Python高效开发实战——Django、Tornado、Flask、Twisted(第2版[M].电子工业出版社:北京,2018:216-234
[12]踪程.电子商务网站设计与开发[M].电子工业出版社:北京,2012:198-204
[13]冯颖凌,廖子豪,严豪.基于Java的网上商城开发[J].电脑知识与技术,2016,12(24):57-59
[14]陶涛.B2C电子商务多店系统分析设计与实现[D].电子科技大学,2013
[15]李晓玲.电子商城系统的设计与实现[D].电子科技大学,2013
[16]Fu X,Tang Y,Wang J.Research and development of electronic commerce system - ESHOPDIY[C]//Computer Supported Cooperative Work in Design, the Sixth International Conference on.IEEE,2001:462-467
[17]Cesar Revoredo-Giha,Beata Kupiec-Teahan,Wendy Wrieden,Victoria Davis,Philip Leat. An Analysis of the Consumption of Sausages in Scotland Using Supermarket Data[J]. Food and Nutrition Sciences,2012,3(7):60-80
[18]Sally Hamilton,Cliona Ni Mhurchu,Patricia Priest. Food and nutrient availability in New Zealand: an analysis of supermarket sales data[J]. Public Health Nutrition,2007,10(12):36-60
[19]Aljaber,Maher.The impact of privacy regulations on the development of electronic commerce in Jordan and the UK[M]//Computer Vision - ECCV 2012.Workshops and Demonstrations,2012:604-608
[20]Kartika Firdausy, Samadri, Anton Yudhana. Web based Library Information System Using PHP and MYSQL[J]. TELKOMNIKA, 2008,06(2):56-60

附录1 源程序清单
public class Main {

public static void main(String[] args) throws IOException, ClassNotFoundException {
    while(true){
        System.out.println("欢迎进入小说管理系统");
        System.out.println("请选择菜单");
        System.out.println("1.上传小说");
        System.out.println("2.查看所有小说");
        System.out.println("3.删除小说");
        System.out.println("4.下载小说");
        System.out.println("5.阅读小说");
        
        //1.反序列化
        JQNovelTool.deserialize();
        String input = new Scanner(System.in).nextLine();
        if (!input.matches("\\d")){
            System.out.println("请输入对应选项");
            continue;
        }
        int sel = Integer.parseInt(input);
        switch(sel){
        case 1:{
            if(JQNovelTool.upload()){
                System.out.println("上传成功");
                //序列化
                JQNovelTool.serialize();
            }
            else
                System.out.println("上传失败");
        }
            break;
            
        case 2:{
            System.out.println("已上传的小说");
            JQNovelTool.showNovels();
        }
            break;
            
        case 3:{
            System.out.println("请输入您要删除的小说编号");
            if (JQNovelTool.remove()){
                System.out.println("删除成功");
                //序列化
                JQNovelTool.serialize();
            }else{
                System.out.println("没有对应小说编号");
            }
        }
            break;
        case 4:{
            System.out.println("请输入您要下载的小说编号");
            if(JQNovelTool.download())
                System.out.println("下载成功");
            else
                System.out.println("没有对应小说编号或目录");
        }
            break;
        case 5:{
            System.out.println("请输入您要阅读的小说编号");
            if (!JQNovelTool.read())
                System.out.println("没有对应小说编号");
        }
            break;
        default:
            System.out.println("暂时没有对应的功能,敬请期待");
            break;
        }
    }

}

}
工具类:JQNovelTool
public class JQNovelTool {

private static String savePath = "D:/novels";
private static String serializePath = "D:/novels/serialize";
private static List <Novel> novelsList = new ArrayList<Novel>();

static {
    File file = new File(savePath);
    if (!file.exists()){
        file.mkdirs();
    }
    file = new File(serializePath);
    if (!file.exists()){
        try {
            file.createNewFile();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}

/**
 * 上传小说*/
public static boolean upload() throws IOException{
    String novelName;
    String novelAuthor;
    String uploadPath;
    System.out.println("请输入上传小说名:");
    novelName = new Scanner(System.in).nextLine();
    
    System.out.println("请输入上传小说作者:");
    novelAuthor = new Scanner(System.in).nextLine();
    
    System.out.println("请输入上传小说路径:");
    uploadPath = new Scanner(System.in).nextLine();
    
    Novel novel = new Novel(novelsList.size(),novelName,novelAuthor);
    if(uploadFile(novel,uploadPath)){   
        novelsList.add(novel);
        return true;
    }
    return false;
}

/**
 * 显示所有小说信息*/
public static void showNovels(){
    getAllNovels();
}

/**
 * 删除小说*/
public static boolean remove(){
    //1.显示当前小说列表
    getAllNovels();
    //2.获取用户输入编号
    int sel = new Scanner(System.in).nextInt();
    if (sel<0 || sel>=novelsList.size())
        return false;
    //3.查找对应编号小说
    Novel novel = getNovel(sel);
    //4.删除小说
    new File(novel.getUploadPath()).delete();
    return novelsList.remove(novel);
}

/**
 * 下载小说到用户指定路径*/
public static boolean download() throws IOException{
    //1.显示当前小说列表
    getAllNovels();
    //2.获取用户输入编号
    int sel = new Scanner(System.in).nextInt();
    //3.判断是不中存在该文件
    Novel novel = getNovel(sel);
    if (novel == null)
        return false;
    //2.获取用户输入的目标路径
    System.out.println("请输入目标路径");
    String path = new Scanner(System.in).nextLine();
    return downloadFile(novel,path);
}

/**
 * 读取小说*/
public static boolean read() throws IOException{
    //1.显示当前小说列表
    getAllNovels();
    //2.获取用户输入编号
    String input = new Scanner(System.in).nextLine();
    if (!input.matches("\\d")){
        return false;
    }
    int sel = Integer.parseInt(input);
    Novel novel = getNovel(sel);
    if (novel == null)
        return false;
    read(novel);
    return true;
}

/**
 * 提供序列化*/
public static void serialize () throws IOException{
    File file = new File(serializePath);
    FileOutputStream outStream = new FileOutputStream(file);
    ObjectOutputStream objOutStream = new ObjectOutputStream(outStream);
    objOutStream.writeObject(novelsList);
    objOutStream.close();
}

/**
 * 与反序列化*/
public static void deserialize () throws IOException, ClassNotFoundException{
    File file = new File(serializePath);
    if (file.length()<=0)
        return;
    FileInputStream inStream = new FileInputStream(serializePath);
    ObjectInputStream objInStream = new ObjectInputStream(inStream);
    try{
        @SuppressWarnings (value={"unchecked"})
        List<Novel> object = (ArrayList<Novel>) objInStream.readObject();
        novelsList =  object;
    }catch(Exception e){
        e.printStackTrace();
    }
    objInStream.close();
}

/**
 * 从指定路径上传文件到数据库*/
private static boolean uploadFile(Novel novel,String oriPath) throws IOException{
    //1.判断目标路径是否存在
    File oriFile = new File(oriPath);
    if(!oriFile.exists()){
        return false;
    }
    //2.创建管道流
    File tarFile = new File(savePath+File.separator+novel.getName()+".txt");
    BufferedReader reader = new BufferedReader(new FileReader(oriFile));
    BufferedWriter writer = new BufferedWriter(new FileWriter(tarFile));
    //3.创建文件
    String line = "";
    while((line = reader.readLine())!=null){
        writer.write(line);
    }
    //4.给novel设置最终存储路径
    novel.setUploadPath(tarFile.getAbsolutePath());
    //5.关闭管道
    reader.close();
    writer.close();
    return true;
}

/**
 * 删除文件*/
private static boolean deleteFile(String path){
    File file = new File(path);
    if (file.exists()){
        file.delete();
        return true;
    }
    return false;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值