资源描述
______________________________________________________________________________________________________________
J2EE课程设计
基于MVC设计模式的图书管理系统
专业:计算机科学与技术
班级:
姓名:
学号:
精品资料
目 录
引 言 2
1 系统概述 4
1.1 系统功能 4
1.2 系统特点 4
1.3 开发运行环境 4
1.4 可行性分析 5
1.4.1技术可行性 5
1.4.2经济可行性 6
1.4.3操作可行性 6
1.4.4社会效益可行性 6
2 技术选择 7
2.1 数据库技术 7
2.2 JAVA 简介 7
2.3 MVC概述 8
2.4 Struts概述 9
3 系统总体设计 11
3.1 项目规划 11
3.2 系统功能结构 12
4 系统详细设计 13
4.1 数据库设计 13
4.2 数据库概念结构设计 13
4.3 数据库物理结构设计 13
5 系统功能具体实现 15
5.1 数据库连接 15
5.2 用户管理模块的实现 16
5.2.1功能说明 16
5.2.2类、方法设计 16
5.3 图书管理模块的实现 17
5.3.1功能说明 17
5.3.2类、方法设计 17
5.4 图书查询模块的实现 18
5.4.1功能说明 18
5.4.2类、方法设计 19
结 论 20
摘 要
本系统是典型的信息管理系统,其开发主要包括后台数据库的建立和维护以及前端应用程序的开发两个方面。本文对后台数据库设计采用MySQL语言开发,要求建立数据的一致性和完整性,并对此数据库技术进行了较深入的学习和应用;而对前端应用程序的设计则要求应用程序功能的完备,易用等的特点,采用当今最流行的也是最有前途的面向对象语言Java开发,严格遵循MVC设计模式。
本系统界面设计友好、美观,数据存储安全、可靠,操作简单、不受平台约束,而且采用B/S结构,只需装有IE浏览器就可运行,十分节省资源。在管理上做到数据的信息化、快速化和智能化。稳定的系统性能,给用户和管理员时刻带来流畅舒适的体验,在信息化日益普及的今天,中小型图书馆中必备的管理工具。
本系统首先介绍的是开发环境及所用到的基础知识。主要完成对图书馆管理系统的需求分析、功能模块划分、数据库模式分析,并由此设计了数据库结构和应用程序。最后介绍了图书馆的馆藏资源数字化,管理和服务计算机化和网络化。
关键词:
图书管理; MySQL数据库; Java; MVC设计模式
引 言
图书作为一种信息资源,用户阅读的资料繁多,包含很多的信息数据的管理,现今,有很多的图书管理都是手工的,尚未使用计算机进行管理。根据调查得知,他们以前对图书管理的主要方式是基于文本、表格等纸介质的手工处理,对于图书信息和借出书情况(如书籍信息、读者信息、借出的书的数量等)的统计和核实等往往采用对书号的人工检查进行,对读者的权限等用人工计算、手抄进行。数据信息处理工作量大,容易出错;由于数据繁多,容易丢失,且不易查找。总的来说,缺乏规范的系统管理手段。尽管有的商店、企业有计算机,但是尚未用于管理,没有发挥它的效力,资源闲置比较突出,这就是图书管理系统的开发的基本环境[1]。
由于图书管理在数据处理上是手工操作,工作量大,出错率高,出错后不易更改。图书管理采取手工方式对图书情况进行人工管理,由于信息比较多,图书信息的管理工作混乱而又复杂,一般借阅情况是记录在借书证上,图书的数目和内容记录在文件中,管理员也只是当时对它比较清楚,时间一长,如再要进行查询,就得在众多的资料中翻阅、查找了,造成查询费时、费力,如要对很长时间以前的图书进行更改就更加困难了。
基于这些问题,我认为有必要建立一个图书管理系统,使图书管理工作规范化,系统化,程序化,避免图书管理的随意性,提高信息处理的速度和准确性,能够及时、准确、有效的查询和修改图书情况。随着网络化学校管理区域的发展,学校的建设管理在我国得到越来越迅猛的发展,在读者管理制度上便有更高的要求,如何制定一套能够适合大多数图书管理的应用平台是现在读者管理人员亟待解决的问题,本课题研究从实际需求情况出发,根据院校现有的硬件设施,改变以往固定的管理模式,做到跟读者无距离的交流、登记,为他们提供更为方便、直接的服务,对院校的管理工作进行了科学、规范的管理,调动读者管理以及工作人员的积极性,提高他们的工作效率,对读者的服务和智能化管理工作是一个推动。而调动全民工作积极性,也便于领导实施监督管理,提高图书管理工作的业务素质。同时也可以加强与读者的交流,便于读者对院校的硬件设施以及环境做更详细的了解,实现无距离接触,无距离登记,真正建设成适应新形势下要求的图书信息管理系统,为院校读者的管理系统带来不可估量的利润价值。
图书管理系统是典型的信息管理系统,其开发主要包括后台数据库的建立和维护以及前端应用程序的开发两个方面。对于前者要求建立起数据一致性和完整性强,数据安全性好的库;而对于后者则要求应用程序功能完备,易使用等特点。
经过分析如此情况,我们使用SUN公司的JAVA作为前台开发语言,它是一种跨平台、适合于分布式计算环境的面向对象编程语言,以MYSQL 作为后台数据库。这次我的毕业设计的课题是“基于MVC设计模式的图书管理系统”,目的是对学校图书信息进行全面的规划与管理,帮助学校做到:
①完善体系管理
②加强流程控制
③实现量化管理,过渡到以读者为本的管理
④科学管理读者的信息,优化分类,全面读者的情况
⑤科学管理图书的各种信息,优化分类,使读者对图书信息明确化
1 系统概述
1.1 系统功能
本图书馆管理信息中信息处理总量大,种类繁多,手段落后的现状。所涉及的处理内容包括:开发一个能够及时处理图书信息更新的管理系统;开发一个为广大读者提供信息服务的信息查询系统,功能包括图书查询、增加和删除等;开发一个系统信息管理系统,进行相关用户的增加、权限的设置等。
本图书馆信息管理的问题,目标是使图书馆信息管理系统在管理上也能做到数据的信息化、快速化和智能化。在每一模块中,必须做到良好的界面,并尽量做到在单表或多表中根据单一或复合条件进行查询及修改等功能,能够对输入的数据做智能、快速处理。
我做的这个图书馆管理系统主要包括:图书管理、用户管理、图书查询等模块。
1.2 系统特点
本系统适合于各种中小型图书馆,可以对图书馆中各种信息或者资源进行全方位多角度的管理。本系统界面友好、操作简单、不受平台约束,而且采用B/S结构,只需装有IE浏览器就可运行,十分节省资源。
数据存储安全、可靠。查询功能很强大,保证了数据查询的灵活性。为管理员提供灵活、方便的权限设置功能,明确了整个系统的管理分工。本系统还采用人机对话的操作方式,方便管理员的日常操作。
1.3 开发运行环境
硬件平台:
CPU:P41.8GHz以上;
内存:512MB以上;
磁盘空间:1G以上。
软件平台:
操作系统:Windows 2000/XP/Vista;
开发语言:Java;
开发工具:MyEclipse 6.0;
数据库:MySQL 5.1;
服务器:Tomcat 6.0或者以上版本;
浏览器:IE6.0及以上版本;
分辨率:最佳效果1024像素*768像素。
1.4 可行性分析
开发任何一个基于计算机的系统,都会受到时间和资源上的限制。因此,在接受项目之前必须根据客户可能提供的时间和资源条件进行可行性研究。它可以避免人力、物力和财力上的浪费。可行性研究与风险分析在许多方面是相互关联的。项目风险越大,开发高质量软件的可行性越小。
系统可行性分析包括:技术的可行性、经济可行性、操作可行性和社会效益可行性从这几个方面论述。
1.4.1技术可行性
本系统采用了MyEclipse开发工具和MySQL数据库进行开发,采用java作为开发语言,来实现安全的图书管理系统,并且降低开发难度。页面使用JSP作为表示层,并使用JavaScript来进行表单验证。为了使页面更加友好、流畅,还结合了Struts标签和CSS。在页面的使用技巧上,本程序采用了动态包含的方式,使得页面之间可以动态同步的显示。以及Apache Tomcat服务器的简易安装和稳定的运行对于系统的构建、运行和维护都可以轻松地完成,所以技术上是可行的[5]。
1.4.2经济可行性
在提出开发这个管理系统前,一方面是锻炼自已的能力,另一方面是了解当今比较流行的管理系统的知识,本系统具有针对性,可以有效地减少资金的投入,本系统所需运行环境都是网上免费开源的,只需下载安装即可使用没有额外的一些支出,而且后期维护阶段也不需要太多的花费,总体投入比较小,所以经济上是可行的。
1.4.3操作可行性
本系统界面友好、操作简单、不受平台约束,而且采用B/S结构,只需装有IE浏览器就可运行,十分节省资源。本系统性能稳定,即使是机器配置较低的老图书馆也可放心使用。所以能够给用户带来流畅舒适的体验,所以操作上是可行的。
1.4.4社会效益可行性
对个人的图书管理工作进行了科学、规范的管理,提高图书管理工作的效率;同时也可以加强与读者的交流,便于读者对院校的硬件设施以及环境做更详细的了解,实现无距离接触,无距离登记,真正建设成适应新形势下要求的图书信息管理系统,所以社会效益上也是可行的。
2 技术选择
2.1 数据库技术
本系统选用MySQL数据库,因为MySQL是开放源代码的,而且其速度、可靠性和适应性而备受关注。大多数人都认为在数据量不是十分庞大的情况下,MySQL是管理内容最好的选择。
MySQL是一个高性能、多线程、多用户、建立在客户—服务器结构上的关系数据库管理系统,通过在组成数据库的表中创建关系来更进一步地处理数据,专门为了速度和稳定性而设计。在过去的几年中,它已经成为线上和线下适合数据库驱动的应用程序最受欢迎的数据库管理系统之一。
MySQL始终围绕三个基本原则而设计,它们是:性能、可靠性和容易使用。严格按照这些准则产生了一个价格便宜而富有特色、适应标准而容易扩展、速度快而效率高的RDBMS,使MySQL成为开发者和管理者建立、维护和配置复杂应用程序的完美工具。
MySQL的特性:
MySQL性能显著地部分原因是它的允许多个并发数据库访问的完全多线程体系结构,这个多线程体系结构式MySQL引擎的核心,允许多个客户同时读取同一个数据库,并且提供了大量的性能增益。MySQL代码也以模块化、多层次方式构建,为连接和索引这样复杂的任务提供了最小的冗余和特殊的优化。
2.2 JAVA 简介
Java是Sun公司推出的一种跨平台的程序设计语言。随着Java Servlet的推出,Java在电子商务方面开始崭露头角,JSP(Java Server Page)技术的推出,更是让Java成为基于Web的应用程序的首选开发工具,目前的Java技术已成为所有大型电子商务项目的必然选择。Java非常适合于企业网络和Internet环境,现在已成为Internet中最受欢迎、最有影响的编程语言之一[4]。Java程序也可以获取网络上结点的图象、声音、HTML文档及文本等资源,并可以对获得的资源进行处理。Java 有许多值得称道的优点,如简单、面向对象、分布式、解释性、可靠、安全、结构中立性、可移植性、高性能、多线程、动态性等[10]。
2.3 MVC概述
MVC(Model-View-Controller)即模型层-视图层-控制器层是80年代出现的一种软件设计模式,它强制的把应用程序的输入、处理以及输出分开。MVC模式将应用程序分为3个核心部分:模型层、视图层和控制层,这3个部分负担不同的任务。
①视图层
视图(View)是应用程序中用户界面相关的部分,视图向用户显示数据,并能接收用户的输入数据,但它并不进行任何实际的业务处理。
②模型层
模型(Model)是应用程序的主体部分。模型表示业务数据和业务逻辑,一个模型可以为多个视图提供数据,提高了应用的可重用性。
③控制器层
控制器(controller)工作就是根据用户请求,调用相应的模型组件处理请求,然后调用相应的视图显示模型返回的数据。
④MVC处理过程
首先,控制层接受用户的请求并决定应该调用哪个模型来进行处理;其次,模型根据用户请求进行相应的业务逻辑处理并返回数据;最后,控制层调用相应的视图来格式化模型反回的数据并通过视图呈现给用户。
⑤MVC的优点
多个视图能共享一个模型;模型是自包含的 ;控制层提高了应用程序的灵活性和可配置性。
2.4 Struts概述
Struts框架工具是Apache基金会Jakarta 项目中推出的一个子项目。Struts在英文中是支架、支撑的意思,这也体现出Struts在开发Web应用程序过程所起到的重要作用,Struts为Web应用提供了通用的框架[9],让开发人员可以把主要精力集中在如何解决实际业务问题上,与此同时Struts框架也允许开发人员根据实际需要进行扩展和定制,从而可以更好的适应用户的需求。采用Struts可以简化遵循 MVC 设计模式的Web应用的开发工作,很好地实现代码重用,使开发人员从一些繁琐的工作中解脱出来,快速开发能够充分发挥JSP/Servlet优点、并具有强可扩展性的Web应用[8]。总之, Struts 的出现使得 Web 应用的开发过程大大简化,从而能够缩短开发周期、提高开发效率[2]。
Struts架构一经推出,即受到Java开发群体的广泛重视,并日渐成为Java创建Web应用开发的最流行的框架工具,精通Struts架构已经成为Java Web程序员必备的技能。
Struts框架优点:
Struts跟Tomcat、Turbine等诸多Apache项目一样,是开源软件,这是它的一大优点。使开发者能更深入的了解其内部实现机制。除此之外,Struts的优点主要集中体现在两个方面:Taglib和页面导航。Taglib是Struts的标记库,灵活动用,能大大提高开发效率。关于页面导航,我认为那将是今后的一个发展方向,这样可以使系统的脉络更加清晰。
Struts框架缺点:
Taglib是Struts的一大优势,但对于初学者而言,却需要一个持续学习的过程,甚至还会打乱你网页编写的习惯,但是,当你习惯了它时,你会觉得它真的很棒[6]。
Struts将MVC的Controller一分为三,在获得结构更加清晰的同时,也增加了系统的复杂度。 Struts从产生到现在还不到半年,但已逐步越来越多运用于商业软件。虽然它现在还有不少缺点,但它是一种非常优秀的J2EE MVC实现方式[7]。
3 系统总体设计
3.1 项目规划
根据个人日常图书管理工作的需求和管理流程,该系统实施后,应达到以下目标。
界面设计友好、美观,数据存储安全、可靠;基本信息设置保证的图书信息和用户信息的分类管理;实现了图书信息管理和用户信息管理;强大的查询功能,保证数据查询的灵活性;实现对图书的全部数据信息管理;提供增加的功能,保证系统应用的广泛性,并设置用户密码保证安全性;系统最大限度地实现了易维护性和易操作性;提供灵活、方便的权限设置功能,使整个系统的管理分工明确;采用人机对话的操作方式,方便管理员的日常操作。
图书管理是基础性的管理工作。系统开发的总体任务是实现各种信息的系统化、规范化和自动化。系统功能分析是在系统开发的总体任务的基础上完成。
图书管理系统是一个典型的数据库应用程序,由图书管理、用户管理、图书查询等模块组成。
用户管理:
在此区域可以输入用户名称、密码来登录本系统;用户添加。
图书管理:
主要实现增加新图书、删除图书、修改图书信息等功能。
图书查询:
主要实现查询全部图书、按条件查询图书等功能。
3.2 系统功能结构
图书管理系统的功能结构如图1所示。
图书馆管理系统
用户管理
用户添加
用户登录
增加图书
图书管理
删除图书
修改图书信息
图书查询
按条件查询图书
查询全部
图1 系统功能结构图
4 系统详细设计
4.1 数据库设计
设计数据库系统时应该首先充分了解用户各个方面的需求,包括现有的以及将来可能增加的需求。数据库设计一般包括如下几个步骤:
①数据库需要分析
②数据库概念结构设计
③数据库逻辑结构设计
④数据库需求分析
用户的需求具体体现在各种信息的提供、保存、更新和查询,这就要求数据库结构能充分满足各种信息的输出和输入,收集基本数据、数据结构以及数据处理的流程,为后而后具体设计打下基础。
4.2 数据库概念结构设计
根据各图书管理信息的总结与归纳,本系统中所包含的信息为:图书信息、用户信息。可将这些信息抽象为下列系统所需要的数据项和数据结构:
用户信息表(编号,用户名称,密码,管理者标记)
图书信息表(书号,书名,出版社,出版时间,作者,图书价格)
4.3 数据库物理结构设计
根据数据库各表的信息和关联,可以设计出2张数据表,每个表格表示在数据库中的一个表。
主要数据表的结构
①用户信息表(manager)
主要用来保存用户信息。该表中的字段为编号,用户名称,密码,管理者标记。其表结构如表1所示。
表 1 用户信息表
字段名称
数据类型
Null
主/外键
描述
userid
VARCHAR(45)
N
主键
编号
username
VARCHAR(45)
N
否
用户名称
password
VARCHAR(45)
N
否
密码
manager
VARCHAR(45)
N
否
管理者标记
②图书信息表(bookmark)
主要用来保存图书信息。该表中的字段为:书号,书名,出版社,出版时间,作者,图书价格等信息。其表结构如表2所示。
表 2 图书信息表
字段名称
数据类型
Null
主/外键
描述
bookname
VARCHAR(30)
N
主键
书名
bookid
VARCHAR(70)
Y
否
书号
press
INT(10)unsigncded
Y
否
出版社
booktime
VARCHAR(30)
Y
否
出版时间
author
VARCHAR(30)
Y
否
作者
bookprice
VARCHAR(20)
Y
否
图书价格
5 系统功能具体实现
5.1 数据库连接
数据库连接及操作类通常包括得到一个Connection对象的方法getConnection()、关闭指定的结果集的方法closeResultSet ()、关闭指定的Statement的方法closeStatement ()和关闭连接的方法closeConnection ()。
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class Process {
private static String url = "jdbc:mysql://localhost:3306/Information?useUnicode=true&characterEncoding=gb2312";
private static String user = "root";
private static String password = "root";
public static Connection getConnection() {//得到一个Connection对象
Connection conn = null;
try {Class.forName("com.mysql.jdbc.Driver");
conn = DriverManager.getConnection(url, user, password);
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e1) {
e1.printStackTrace();
}return conn;
}
public static void closeResultSet(ResultSet rs) {//关闭指定的结果集
if (rs != null) {
try {rs.close();
} catch (SQLException e) {
}
}
}
public static void closeStatement(Statement stmt) {//关闭指定的Statement
if (stmt != null) {
try {stmt.close();
} catch (SQLException e) {}
}
}
public static void closeConnection(Connection conn) {//关闭连接
if (conn != null) {
try {conn.close();
} catch (SQLException e) {}
}
}
}
5.2 用户管理模块的实现
5.2.1功能说明
本模块有一个基本类UserBean
功能:1、用户登录
2、用户添加
5.2.2类、方法设计
实现该功能模块所涉及的重要类和方法:
编号
类名
功能
1
UserBean
Dao层实体接口类,用户的基本类
2
loginServlet
用户登录Servlet
3
registerServlet
用户添加Servlet
UserBean类
属性名
数据类型
属性说明
userid
String
用户编号
username
String
用户名称
password
String
密码
manager
String
管理员标记
返回值
方法名
功能
参数说明
String
getUserid
返回用户编号
无
void
setUserid
设置用户编号
String
String
getUsername
返回用户名称
无
UserBean
getUsername
返回某个编号对应的用户名
String
void
setUsername
设置用户名称
String
String
getPassword
返回密码
无
void
setPassword
设置密码
String
String
getManager
返回管理员标记
无
void
setManager
设置管理员标记
String
void
register
注册用户信息
无
boolean
isHere
判断用户编号是否存在
String
loginServlet
返回值
方法名
功能
参数说明
void
doGet
用户登录
HttpServletRequest request;HttpServletResponse response
registerServlet
返回值
方法名
功能
参数说明
void
doGet
注册新用户
HttpServletRequest request;HttpServletResponse response
5.3 图书管理模块的实现
5.3.1功能说明
本模块有一个基本类JavaBean
功能:1、增加图书
2、删除图书
3、修改图书信息
5.3.2类、方法设计
实现该功能模块所涉及的重要类和方法:
编号
类名
功能
1
JavaBean
Dao层实体接口类,图书的基本类
2
insertServlet
增加图书Servlet
3
deleteServlet
删除图书Servlet
4
upDateServlet
修改图书信息Servlet
JavaBean类
属性名
数据类型
属性说明
bookname
String
图书名称
bookid
int
图书编号
press
String
出版社
booktime
String
出版时间
author
String
作者
bookprice
double
图书价格
返回值
方法名
功能
参数说明
String
getBookname
返回图书名称
无
void
setBookname
设置图书名称
String
int
getBookid
返回图书编号
无
void
setBookid
设置图书编号
int
String
getPress
返回出版社
无
void
setPress
设置出版社
String
String
getBooktime
返回出版时间
无
void
setBooktime
设置出版时间
String
String
getAuthor
返回作者
无
void
setAuthor
设置作者
String
double
getBookprice
返回图书价格
无
void
setBookprice
设置图书价格
double
void
insert
增加图书
无
boolean
isHere
判断图书是否存在
String
int
delete
删除图书
String
int
upDate
修改图书信息
int
Integer
getPageCount
分页处理时,获取页数
无
insertServlet
返回值
方法名
功能
参数说明
void
doGet
向数据库中增加一本图书
HttpServletRequest request;HttpServletResponse response
deleteServlet
返回值
方法名
功能
参数说明
void
doGet
从数据库中删除一本图书
HttpServletRequest request;HttpServletResponse response
upDateServlet
返回值
方法名
功能
参数说明
void
doGet
修改数据库中一本图书的信息
HttpServletRequest request;HttpServletResponse response
5.4 图书查询模块的实现
5.4.1功能说明
本模块有一个基本类JavaBean
功能:1、查询全部图书
2、按编号查询图书
3、按书名查询图书
5.4.2类、方法设计
实现该功能模块所涉及的重要类和方法:
编号
类名
功能
1
JavaBean
Dao层实体接口类,图书的基本类
2
FindServlet
查询全部图书Servlet
3
OnlyFindServlet
按编号查询图书Servlet
4
SearchServlet
按书名查询图书Servlet
JavaBean类(属性列表与4.3.2相同)
返回值
方法名
功能
参数说明
String
getBookname
返回图书名称
无
void
setBookname
设置图书名称
String
int
getBookid
返回图书编号
无
void
setBookid
设置图书编号
int
… … …
ArrayList<JavaBean>
findAll
查询全部图书
无
ArrayList<JavaBean>
Search_ByID
按编号查询图书
String; ArrayList<JavaBean>
ArrayList<JavaBean>
Search
按书名查询图书
String
FindServlet
返回值
方法名
功能
参数说明
void
doGet
查询全部图书
HttpServletRequest request;HttpServletResponse response
OnlyFindServlet
返回值
方法名
功能
参数说明
void
doGet
按编号查询图书
HttpServletRequest request;HttpServletResponse response
SearchServlet
返回值
方法名
功能
参数说明
void
doGet
按书名查询图书
HttpServletRequest request;HttpServletResponse response
结 论
通过这次课程设计让我对这学期所学的课程的一个综合体现。认真细致地对开发过程进行了规划和分析,把握整体布局,明确了系统的基本功能,做好结构图的情况下,在设计好系统各主要部分,将一些细节问题考虑周全后才开始动手进行开发,使工作得以顺利进行。
本系统基本完成了图书管理全部过程并详细的分析了本系统主要功能。技术采用面向对象语言Java,遵循MVC设计模式,后台数据库设计采用MySQL语言。界面设计友好、美观,数据库存储安全、可靠;系统提供灵活、方便的权限设置功能,使整个系统的管理分工明确;而且还采用人机对话的操作方式,方便用户的日常操作。
在测试的过程中也遇到了一些问题,比如图书的出版日期的向数据库存储问题。在管理图书信息时,图书的出版日期是date类型的数据,系统获取出版日期数据时是string类型的数据,Servlet从页面获取string类型的日期后,在后台转换为date类型的数据,再传入数据库中,实现在数据库中存储日期类型的数据。
总的来说,这次的课程设计为我提供了一次锻炼的机会。这不仅仅是一次课程设计,不仅仅是学会了一种开发技术,更重要的是在学习的过程中,所有的问题要自已去面对,有问题也只有靠自已去解决,在学习和解决这些困难的过程中提高了我学习的能力、解决问题的能力和实际工作的能力,学到了许多书本以外的知识,我相信会给我在以后的人生道路上带来很多的帮助。
Welcome To
Download !!!
欢迎您的下载,资料仅供参考!
精品资料
展开阅读全文