资源描述
课程设计报告
课程设计名称: 数据库课程设计
院系名称: 中印计算机软件学院
学生姓名: 豆浆好喝5
班 级: 15软件工程2班
学 号: 20150153020
成 绩:
指导教师:
开课时间:2017-2018 学年第一学期
目录
一、引言 3
1.1课程设计背景 3
1.2 编写目的 4
1.3 系统特色 4
二、开发环境 4
2.1开发环境简介 5
2.2开发工具选择 5
2.3数据库选择 5
三、系统分析 5
3.1 可行性分析 6
3.2需求分析 6
1. 管理员可以开启采集功能,进行小说数据采集。为采集下来的小说分类, 6
2. 读者可以阅读小说,添加书架书签。实现登陆注册等一系列功能。 6
四、系统数据库设计 6
4.1 功能结构 6
4.2 E-R模型图 7
主要表格ER图 7
数据库部分展现 8
4.3 表结构设计 8
管理员信息表 8
小说列表信息表 8
小说章节信息表 8
五、 系统详细设计与实现 9
5.1 功能设计 9
5.2 系统实现 10
5.3 读者登陆页面 10
5.4 管理员页面 11
小说分类功能展示: 12
六、系统测试 13
6.1系统测试背景 13
1. 确保系统测试的活动是按计划进行的; 13
2. 验证软件产品是否与系统需求用例不相符合或与之矛盾; 13
3. 建立完善的系统测试缺陷记录跟踪库; 13
4. 确保软件系统测试活动及其结果及时通知相关小组和个人; 13
6.2 系统功能测试 13
6.3 测试结果分析及建议 14
七、总结 14
八、附录 14
8.1 部分代码展示: 14
一、引言
1.1课程设计背景
21世纪是信息网络时代。许多新事物不断出现,或者许多旧事物以另一种或几种新的形式呈现出来。网络小说就是其中之一。它是一种以网络为基础平台的新兴的小说体裁,有风格自由、文体不限、发表阅读方式较为简单等特点。与一般的小说比起来,网络小说的语言会更加口语化,并且网络流行词汇充斥其中。另外,除了文字内容的差异外,它还利用符号图案排版等手段进行变化。因此网络小说是网络文学的主要形式。网络小说在中国发展并非一帆风顺。网络快速发展的那几年鲜有好的小说出现,主要是因为当时一些较大的网络小说的门户网站对小说的原创并不关注。随后,几大原创小说联盟的成立才使网络小说得到了发展。网络小说源于两个方面:一方面因为网络时代人们对阅读娱乐的需要和追求,另一方面有商业公司的推动。目前,中国网络小说无论在数量或者在质量上正逐步取代其他的小说类别而成为中国第一大的小说形式。在大学校园,青年学生有着丰富多彩的青春生活,对青春生活有浓厚的创作热情,是推动校园网络小说发展的不竭动力。因此应有一个他们能方便发表作品和阅读小说的平台。盗书小说网站就是这样一个平台。
当计算机网络在人们生活的各个领域迅速曼延之时,人们获取信息的方式也更加的直接迅速,网络化使信息领域变得更为广泛,在也没有了时间和空间的限制。人们获取信息大部分是通过网站的方式得到的。因此网站建设在Internet应用上的地位显而易见,而本网站的制作室为人们在精神食粮的获取上起到大大小小的作用。 在网络发表小说不管对读者还是对小说作者都是有直接好初的,对于读者来说不光在网络上迅速得到作者最新发表的小说,而对于小说读者来说把作品发表在网络上他能以最快的速度获得到读者对作品的意见。这样作者可以最快的修改错误为书籍的出版做好准备。这样便捷的交互方式,即通过先进的计算机和网络技术,克服地域的限制。作者和读者之间直接的交流。
1.2 编写目的
本系统编写目的是为了方便广大爱好阅读网络文学的书友更方便快捷的阅读自己心仪的书籍。为书友之间的交流创建一个良好的平台,便捷的交流。
1.3 系统特色
本系统具有如下特色:
1、系统分为三大模块:采集器、管理员模块、读者模块。三者息息相关。
2、统一的风格,清爽干脆的阅读界面。
3、方便易用的工具软件,便于管理及其维护。 为了更好的实现系统功能,本系统将使用Mysql作为后台的数据库管理系统,而在前台使用Web网页来访问数据库。
二、开发环境
2.1开发环境简介
开发本系统的操作系统是Windows 7,开发语言是JAVA ,开发工具采用的MyEclipse 2014专业版,数据库采用Mysql 5.5。 在应用系统开发之前,对开发数据库的基本概念应当了解,对数据库的结构、开发数据库应用程序的步骤、开发体系及方法都应当有相当清晰的了解和认识。
2.2开发工具选择
Myeclipse 是Genuitec公司推出的一款非常优秀的J2EE集成开发环境,支持代码编写、配置、测试以及除错,它的价格对于个人和企业开发人员来说都是非常有吸引力的。这是J2EE IDE市场一个重量级的选手。通过增加UML双向建模工具、WYSIWYG的JSP/Struts designer、可视化的Hibernate/ORM 工具、Spring和Web services支持,以及新的Oracle数据库开发,MyEclipse 继续为业界提供全面的产品。
2.3数据库选择
MySQL是一个小型关系型数据库管理系统,开发者为瑞典MySQL AB公司。在2008年1月16号被Sun公司收购。而2009年,SUN又被Oracle收购.对于Mysql的前途,没有任何人抱乐观的态度.目前MySQL被广泛地应用在Internet上的中小型网站中。由于其体积小、速度快、总体拥有成本低,尤其是开放源码这一特点,许多中小型网站为了降低网站总体拥有成本而选择了MySQL作为网站数据库。
利用Myeclipse卓越、快速、简便的界面开发平台,运用MVC开发模式来搭建环境,再利用Mysql,创建出具有合理的物理关系、逻辑关系的后台数据库;整合web 框架实现人机交互,最后部署和发布完成的系统。
三、系统分析
系统分析是软件生命周期的一个重要阶段。具体地说,应该分析和确定系统必须具有的功能和性能,系统要求的运行环境,并且预测系统发展的前景,必须仔细分析系统中的数据,既要分析系统中的数据流。又要分析长期使用的数据存储,通过分析应该得出用业务流图、数据字典等内容为系统的设计奠定基础。
3.1 可行性分析
技术可行性:系统的开发平台选择了当前流行的Windows操作系统,应用程序开发采用Genuitec公司的面向对象程序开发工具MyEclipse。与普通的数据库系统相比,用MYSQL作为数据库开发平台有简单、灵活、可扩充等特点,非常适合初学者快速掌握并用来开发数据库管理信息系统。数据库选择MYSQL,使用navicat图形化界面来操作数据库。它是一个功能强大的数据库管理系统和MIS系统开发工具,具有界面友好、易学易用、开发简单、接口灵活等特点[12]。当前管理信息系统的开发,大多是基于数据库技术和面向对象软件开发技术。这些技术目前已经成熟,被广泛应用于各个领域。所以,本软件的开发,在技术上是可行的。
经济可行性:是对系统投入使用后带来的经济效益进行估计,也包括对系统的投资预算。即要解决两个问题,资金可得性和经济合理性。当前办公用PC机的普及使得开发和应用管理信息系统在经济上成为可能。目前个人计算机的价格已经十分低廉,各种开发软件也可以在网上免费下载。所以,本系统在经济上是可行的。
操作可行性:本系统是为能更好的管理学院学生奖惩信息而开发的,本系统的用户对象是所有学院的教务人员、教师及学生,在本文中又给出详细使用方法,用户只需懂得简单的计算机操作方法即可自由应用本系统。所以,本系统在操作上可行。
综上所述,开发盗书网系统是可行的。
3.2需求分析
本系统开发的目标是开发出一套完整高效便捷的小说网站系统,使之能跟上时代的发展。同时通过实践来提高自己的实践能力。本系统应主要实现的功能有以下几点。
1. 管理员可以开启采集功能,进行小说数据采集。为采集下来的小说分类,
方便读者观看。修改小说章节内容,去除一些无关小说内容的字符、网址。以及删除一些“太监”的书籍。
2. 读者可以阅读小说,添加书架书签。实现登陆注册等一系列功能。
四、系统数据库设计
4.1 功能结构
“小说网站系统”可分为几个主模块:采集模块、管理员管理、读者模块。
接下来简洁的说明网站的设计理念。
就采集模块而言。本小说网站系统,数据来源与网上已存在的小说网站。采集地址为笔趣阁()。使用java开源爬虫框架webmagic。一种极其便捷的爬虫框架。只要编写好爬虫逻辑,爬虫就会不间断地运行,为你采集小说章节信息。但是设计初期,因缺乏经验,线程开大了,被对方服务器封了几天的ip地址。
管理员模块,即为小说网站的后台管理,使用了较为广泛的SSM(Spring+SpringMVC+Mybatis)框架。在权限管理方面,我整和了shiro框架。
因此,在网站安全安全方面,本系统是比较安全的。在管理员后台界面,我使用了easyui后台界面框架。
读者模块,即前台方面。我使用了HTML、CSS、JavaScript、JQuery、以及bootstrap前台框架。具体的情况,分为首页、玄幻、修真、都市、网友、惊悚、书架等页面。基本满足读者的阅读需求。因为个人设计缘故,有些功能当时未考虑到,会在后期进行整改、完善。
4.2 E-R模型图
概念模型可以看成是现实世界到机器世界的一个过渡的中间层,是整个数据库设计的关键。要对数据词典中的数据存储进行分析,得到系统的关系模型,可以采用实体-联系图(简称E-R图)的方法来进行数据结构分析,从而得出概念模型。因为采集小说网站,数据量较大(每一本小说存储为一张表,大概3000多张表)。下面仅仅列出本系统包括的部分实体以及数据库表的缩影。
主要表格ER图
数据库部分展现
4.3 表结构设计
根据分析阶段得出的结论,结合本系统对有关数据存储的需要,为了更加方便、安全的实现该管理系统的所有功能,现将本系统中的数据以数据库表的形式呈现,部分表的设计如表:
管理员信息表
小说列表信息表
小说章节信息表
五、 系统详细设计与实现
5.1 功能设计
功能模块是指数据说明、可执行语句等程序元素的集合,它是指单独命名的可通过名字来访问的过程、函数、子程序或宏调用。功能模块化是将程序划分成若干个功能模块,每个功能模块完成了一个子功能,再把这些功能模块总起来组成一个整体。以满足所要求的整个系统的功能。功能模块化的根据是,如果一个问题有多个问题组合而成,那么这个组合问题的复杂程度将大于分别考虑这个问题时的复杂程度之和。这个结论使得人们乐于利用功能模块化方法将复杂的问题分解成许多容易解决的局部问题。小说网站主要分前台和后台两个模块,前者是用户和游客使用界面,后者是管理员使用界面。通过分流的模式保证了用户界面的干净简洁,又能让网站更易于管理,同时保证了小说网站的安全性。
前台主要有:个人注册、个人登录、在线阅读、小说下载、小说评论、小说查询等模块,主要是用来提供用户和游客观看小说以及评论小说作为小说网站的主要功能项目。前台模块能满足用户对于小说阅读的基本要求,同时开放评论功能,让读者对小说进行评论和建议,使作者能更好地把握小说节奏。为了更好管理不至于出现敏感评论,游客并不能使用评论的功能。所以我们添加了个注册页面,一来可以限制游客发布一些虚假或者违法信息,方便管理员删减敏感内容,二来可以增加小说网的用户和热度。用户模块保证简洁明了方便用户上手操作,不让用户有一种走迷宫不知所措的迷茫感。
后台主要有:账号管理、会员信息管理、小说添加、小说分类、小说章节添加等模块,是管理员权限所进行操作的模块。主要是用于小说的章节更新和新的小说添加以保证小说网站的竞争力。同时要处理一些言辞不当的评论或者用户,以保证网站始终是健康积极的内容。管理员也能设置图书推荐等内容可以推出本站作者的好作品,能使网站获得一定的经济收入同时也能使平台更好地发展。管理模块的页面要能使管理员所要的基本操作集中,使管理员不至于不停地转换界面,减少管理员的工作量,同时也能提升管理员的工作效率。
主要具体功能详细描述如下:
5.2 系统实现
好的界面应美观易懂、操作简单并且具有引导功能,使用户感觉愉快、增强兴趣,从而提高使用效率。本系统基于Windows操作系统,因此在界面上遵循Windows的传统风格,由标题栏、菜单栏、快捷工具按钮、对话框等要素组成。与Windows操作系统一致的人机界面,使得用户只要具备Windows操作基础,就能很快适应本管理系统的操作使用,因此能够大大降低系统培训费用,提高系统的可推广性。为了进一步美化人机界面,使得用户在操作中更加心情舒畅,本人选用easyui 前台框架,为系统设计了简洁明快的界面图。总之本人对系统界面的整体风格,页面布局结构以及色彩搭配等进行了合理的规划和设计,在保证用户易用性、方便性的前提下,创造更简单,友好的系统界面。
5.3 读者登陆页面
用户登陆功能模块实现了用户登陆到系统的实验设备管理网站的管理界面的过程,用户输入正确的登陆账号和登陆密码和验证码,然后和数据库中存在的账号和密码进行比较,如果输入的账号和密码和数据库中的账号和密码就提示登陆成功,并把登陆信息保存到数据库中进行保存供以后在操作程序的时候使用。
用户登陆首先输入用户名和密码,如果没有输入就给出相应的提示,输入之后利用程序进行判断,如果输入的正确就登陆成功,输入错误就返回到登陆输入账号和密码的状态重新输入登陆账号和密码。
用户登录界面如图:
小说网站首页详情:
5.4 管理员页面
当管理员登陆管理地址时(localhost:8080/LC/first.action)会被拦截进行认证,记帐户登陆。登陆成功后,会显示如下图的功能。管理员可以设置读者首页推荐。可以删除小说,修改小说的基本信息和章节信息。为了方便管理员进行网站管理,设计将功能都集中在左侧,管理员点击按钮,跳转至相应的操作页面。
小说列表模块:
章节管理模块:
小说分类功能展示:
六、系统测试
6.1系统测试背景
在开发本系统时,为了使系统能够稳定运行,对本系统进行了有针对性的测试。本次测试是的主要目标是如下几点。
1. 确保系统测试的活动是按计划进行的;
2. 验证软件产品是否与系统需求用例不相符合或与之矛盾;
3. 建立完善的系统测试缺陷记录跟踪库;
4. 确保软件系统测试活动及其结果及时通知相关小组和个人;
本系统主要采用黑盒测试(功能测试),测试软件名称:学生奖惩信息管理系统;测试人员:小组成员;测试环境:Windows 7系统,内存4G(测试环境可能会影响软件运行时间、软件兼容性等)。
6.2 系统功能测试
本系统主要对如下三个方面进行测试。
1、菜单项测试:为了保证每一项下拉菜单能够正确实现系统设计的功能,将相关的基础数据,链接到本系统中,此次测试对每一个菜单项进行了反复的增加、删除、修改等操作,从而保证了菜单级功能的正确实现。
2、数据跟踪:完成菜单项测试后,对系统内的每一个数据进行了跟踪。经过实践证实,该功能完全正常。然后又对其它的功能模块也进行了类似的测试。 3.综合测试:在以上测试的基础上对系统功能进行了整体的测试,依次检验系统功能是否符合系统设计的要求
6.3 测试结果分析及建议
通过测试本系统功能完全实现,达到预定的目标,但是经过测试发现部分功能还有待完善,尤其是表5-3中的数据范围测试,应该限制输入数据长度和数据类型。 由于本系统是由一人独立开发完成,成本几乎不计,因此没有专业的测试人员,测试人员是本系学生,没有足够的测试经验,发现错误的能力有限,在此,希望提出宝贵意见!
七、总结
经过近一个月的设计与制作,本人的设计已开发完毕,整个设计基本实现了预期的功能。系统能够完成学生信息的增加、修改、删除,学生奖惩信息的增加、修改、删除,实现各种信息的多条件查询,并输出打印。由于以前对java web只是了解基础知识并不能够灵活运用,所以在设计期间进行了刻苦学习,通过查阅资料,请教指导老师,和同学进行讨论,终于可以基本掌握常用控件的用法和语句编程。也明白了如何把书本中的知识运用到设计中,正真领悟到实践与理论相结合的道理。通过撰写论文明白了治学要讲究严谨性。 由于本人初次开发系统,水平有限,时间紧迫,致使本系统设计得不够精确、完整,界面也不是很美观,系统出错处理不是很好,整个系统中的代码过于繁冗,这些都有待进一步的改善。相信随着我的经验的积累,这些问题以后一定会解决,功能会逐步完善。 在本次的课程设计中,我学到了很多的知识,为我今后的学习和工作打下坚实的基础。
八、附录
8.1 部分代码展示:
import java.util.ArrayList;
import javax.annotation.Resource;
import org.springframework.stereotype.Service;
import system.book.mapper.BookMapper;
import system.book.po.Book;
import system.book.po.BookSearch;
import system.bookcase.mapper.BookcaseMapper;
import system.bookcase.po.Bookcase;
import system.bookcase.po.BookcaseSuper;
import system.novel_list.mapper.NovelListMapper;
import system.novel_list.po.NovelList;
import system.reader.mapper.ReaderInfoMapper;
import system.recommend.po.First_new;
import systemdev.utils.DataResult;
@Service("BookcaseService")
public class BookcaseServiceImpl implements BookcaseService {
@Resource
private NovelListMapper NovelListMapper;
@Resource
private BookcaseMapper BookcaseMapper;
@Resource
private ReaderInfoMapper ReaderInfoMapper;
@Resource
private BookMapper BookMapper;
@Override
public Integer add_to_bookcase(String reader_name, String table_name,
String content_id) {
// TODO Auto-generated method stub
// 根据读者登陆名查询器id
Integer reader_id = ReaderInfoMapper.find_id_by_reader_name(reader_name
.trim());
// 根据table_id查询到书籍主键id
NovelList novel = NovelListMapper.find_id_by_chapter_table(table_name
.trim());
// 封装查询对象
Bookcase bookcase_info = new Bookcase();
bookcase_info.setBookId(novel.getId() + "");
// 查询到结构
Integer count = BookcaseMapper.find_bookcase_counts(new BookcaseSuper(
"bookcase_" + reader_id, bookcase_info));
// 将要插入的参数封装成对象,准备进行dao操作
Bookcase bookcase = new Bookcase(novel.getId() + "".trim(), novel
.getBookName().trim(), content_id.trim());
BookcaseSuper supercase = new BookcaseSuper("bookcase_" + reader_id,
bookcase);
// 数据库若无该书籍的记录,新建书签,若存在,则更新标签
if (count == 0) {
return BookcaseMapper.add_bookcase(supercase);
} else {
return BookcaseMapper.update_book_bookcase(supercase);
}
}
@Override
public ArrayList<First_new> find_all_bookcase_by_name(String reader_name) {
// TODO Auto-generated method stub
// 根据登陆账户查询器主键id
Integer id = ReaderInfoMapper
.find_id_by_reader_name(reader_name.trim());
// 封装查询参数
DataResult result = new DataResult(1, 300);
result.setTable_name("bookcase_" + id);
// 查询书签记录
ArrayList<Bookcase> bookinfo = BookcaseMapper
.find_bookcase_by_id(result);
//获取书籍基本信息
ArrayList<First_new> list= this.bookcase2novellsit(bookinfo);
//获取书签章节信息
// 返回记录
return list;
}
@Override
public ArrayList<First_new> bookcase2novellsit(ArrayList<Bookcase> bookcases) {
// TODO Auto-generated method stub
ArrayList<First_new> novels = new ArrayList<First_new>();
ArrayList<Integer> bookids = new ArrayList<Integer>();
ArrayList<Book> books=new ArrayList<Book>();
for (Bookcase bookcase : bookcases) {
// 遍历获取bookid
bookids.add(Integer.parseInt(bookcase.getBookId()));
}
//获取书签章节信息
for (Bookcase bookcase : bookcases) {
//根据book_id获取table_name
String table_name=NovelListMapper.find_table_name_by_id(bookcase.getBookId().trim());
//根据table_name和content_id获取被记录的书签的内容
BookSearch search=new BookSearch("table_"+table_name, bookcase.getReadedChapterId());
String chapter_name=BookMapper.find_one_chapter_info(search);
books.add(new Book(Integer.parseInt(bookcase.getReadedChapterId()), chapter_name));
}
// 根据bookid获取书籍基本信息
ArrayList<NovelList> novel_list = NovelListMapper
.find_bookinfo_by_book_id(bookids);
// 遍历集合获取最后章节内容,并封装返回对象
for (NovelList novelList : novel_list) {
Book book=BookMapper.get_last_chapter_name_by_table_name("table_"+novelList.getChapterTable());
//在根据book_id查询书签中的记录
novels.add(new First_new(novelList, book.getChapterName(), book.getId()+""));
}
//再次封装上面两个对象
for (int i = 0; i < novels.size(); i++) {
novels.get(i).setReaded_chapter_name(books.get(i).getChapterName());
novels.get(i).setReader_chapter_id(books.get(i).getId()+"");
}
return novels;
}
}
20 / 20
展开阅读全文