基于jsp(java)网络教学平台系统的设计和开发(含源文件)


获取项目源文件,联系Q:1225467431,可指导毕设,课设
摘 要
远程教育作为现代教育技术的形式,给教育思想与技术带来了革命性的变革,己经成为现代教育的必然要求。远程教育要得以顺利、高效的实施,必然离不开高效的管理与支撑平台环境。构建基于Java技术的网络教学管理系统是进行远程教学的迫切需要.本文首先介绍了远程教育的发展状况,面向对象的系统开发平台以及对Web应用系统的支持,对象建模语言UML的基本知识。然后主要介绍了以UML为建模语言,开发基于JSP/Servlet的网络教学管理系统的过程使用用例图,顺序图和活动图来寻找用户需求,明确用例中对象之间的关系,从而建立系统的用例模型;分析类,确定了系统中的对象抽象成类:这样完成了系统分析。在系统设计过程中,首先设计系统构架,划分功能模块,并给出功能设计。在功能设计中,构建设计类,运用设计类顺序图,类图来实现了系统的设计模型。数据库设计给出数据库模型和数据库中各个表的字段结构。最后一章对系统关键实现做了探讨,分别实现了用户身份鉴别,会话跟踪,数据库连接池和数据优化并对系统安全作出说明。本文对如何运用面向对象的方法来快速高效的开发一个复用性良好的安全的网络应用程序提供了一个良好的思路。
关键词:远程教育,教学管理,UML,网络教学
Abstract
As a representation of contemporary education, remote education, which has brought the traditional education revolutionary ideas and technologies and optimized the educational resources, has been the trend of the contemporary education. Remote education cant run well without an efficient management platform. To architect a teaching management system through internet based on JSP/Servlet becomes very important.
The paper first introduces the development of remote education, the object-oriented development platform JSP and the brief knowledge of UML. Then a detailed introduction is given on the development process of a teaching management system through internet based on JSP with UML as modeling language. Constructing use case model through using use case diagram, sequence diagram and activity diagram to make clear users requirement and the relation between objects in use case. Through analysing classes to confirm the objects in system and abstract them to classes. So the analysis of system is completed. Among the design process of system, designing the system architecture, partitioning the system to several subsystem and function models according to use cases and giving the function design of one subsystem. The function design includes the classes design and the following sequence diagram and class diagram. Database design involves a database logic model and the structure of all labels. In the end,I implement some key technologies of system such as users identity ,session track, database pool ,data process optimizing and system security. To ensure security, a reliable and practical security policy, in which container based declarative security is dominant and programmatic security is complementary, is given respectively to the web tier, EJI tier and data tier of the system according to the system framework .This article also supplies a good idea on how to develope reusable and safe web application quickly with object-oriented methodology.
Key words:remote education, leaching management, JSP, UML
目 录
TOC 1-3 1 引言 1
1.1 网络教学系统的技术 1
1.2 本系统的特点和意义 2
2 系统核心技术特点 2
2.1 web系统应用研究 2
2.1.1 N层体系结构 2
2.1.2 基于组件开发 3
2.2 JSP/Servlet对web应用系统的支持 3
3 系统分析 4
3.1 用例分析 4
3.2 用例建模 5
3.2.1 标识参与者 6
3.2.2 用例图 6
3.2.3 顺序图 7
3.2.4 活动图 8
3.3 分析类 10
3.3.1 边界类 10
3.3.2 实体类 10
3.3.3 控制类 11
4 系统设计 12
4.1 体系结构设计 12
4.2 系统功能设计 13
4.2.1 功能模块划分 13
4.2.2 功能实现设计 15
4.2.3 用例设计 18
4.3 数据库设计 19
4.3.1 数据库设计原则 19
4.3.2 系统数据库设计 20
5 关键技术及实现 22
5.1 用户身份鉴别 22
5.2 对会话的跟踪和处理 23
5.3 数据库连接池的实现 24
5.4 数据访问优化实现 26
5.5 系统安全实现 27
5.5.1 网络层安全 27
5.5.2 数据层安全 28
6 结束语 28
参考文献 29
1 引言
1.1 网络教学系统的技术
基于Internet的网络教学系统是现代远程教育的方向,支持网上教学的教学管理系统在其中扮演着重要角色。网络教学的目标是培养合格的人才,完成既定的教学任务和实现国家规定的教学目标。教学管理居于一个至关里要的地位,它起着调配教学资源、组织教学活动、总结教学数据等重要作用。教学管理系统使得教学能够顺利实施,也可实现整个教学管理过程的现代化和管理的规范化,另外还能及时、准确地反映教学现状,分析教学效果。建立一个通过Internet实现教学信息发布和师生交流、网上选课。并能实现教师授课和课酬管理的基于网络的教学管理系统,是十分必要的,也是切实可行的。我们的思路正是构建一种如图1-1所示的基于 Web的开放式网络教学管理系统。
图1-1系统实例图
基于上述的分析,为了实现这样一个开放式的网络教学管理系统,我们采用了这样的一个技术体系:
本系统是依照J2EE(Java 2Enterprise Edition)标准,综合采用JSPIServlet, , JDBC等Java相关技术开发的大型网络应用软件。系统的开发建立在 Web服务器(Web Server)、应用服务器(ApplicationServer)和数据库服务器的多层架构之上。这种多层结构可将数据处理的业务逻辑、用户界面、内容显示等部分分开,从而使系统的业务逻辑集中于Application层次:利用JavaBean服务器组件的可重用性和跨平台性,可以快速开发和二次开发出复杂的大型平台应用程序,以适应多种用户的不同需求。因此,该平台具有极佳的可靠性、可管理性和可扩展性。
1.2 本系统的特点和意义
本系统具有通用性,可适用于各类学校、成人教育,职业培训和技术培训等机构在远程教育平台上进行教学管理,是对传统教育管理模式的改革和创新,其推广使用对于教学管理的改革,实现开放式教育管理,扩大受教育面。有限的师资发挥更大的作用等方面具有重要的意义。
本系统具有以下主要特点:
(1) 通用性强。能适用于各种机构的网络教学管理。
(2) 实现时间和空间的分布性。在教学管理方面,节约大量的人力物力,提高了效率。
(3) 资源库的标准化,使得在 Intemet上可以比较容易的和使用其他平台的机构之间共享资源,从而做到互通有无,真正实现系统的开放性。
总的来说,笔者经历了本课题的系统分析、设计、实现的开发周期,构建起一个开放性的网络教学管理系统,基本上完成了课题研究的目标。在课题研发期间,独立完成了本系统的业务需求分析,建立了用例模型,并对对象模型进行了详细设计以及对数据库的设计。在下面几章中,将会详细介绍本课题的设计与分析过程,以及系统关键技术的实现。
2 系统核心技术特点
2.1 web系统应用研究
2.1.1 N层体系结构
90年代初,传统的企业信息系统(EIS)供应商为满足用户要求从二层的C/S应用模型转向更为灵活的三层或N层(n-tier)应用模型。N层 (n-tier )结构可以取得更好的整体平衡,它将表示逻辑与业务逻辑从底层数据中分离开来。不断增长的Intranet企业应用也积极倡导轻量级,便于部署的客户端。
需要注意的是,N层中的每一层并不意味着就是软件中单独的一个部分,虽然也可能是这样的层,首先与软件中分离方法有关。软件内的不同的层在逻辑上也有区别,但可以共存于一台机器上,或者跨越多台机器进行分布。
下面是使用N层结构的特点:
(1)加快开发过程,降低开发成本:通过重用现有、预先测试过的业务组件和数据访问组件,可以更快的开发新的应用程序。
(2)隔离了由于改变带来的影响:只要接口保持不变,一个层上的改变不会影响其它层上的组件。
(3)更容易管理改变:例如,一个业务组件驻留在业务层(该业务组件位于一个或多个专用服务器上),那么我们可以很容易地用它的新版本替换旧版本,而不用替换不同城市甚至全球范围内的上百或上千的客户端应用程序了。
2.1.2 基于组件开发
组件提供了比单纯的类更祖粒度的问题封装方法。接口封装了组件提供的服务,隐藏了实现细节的可见性。因此组件间耦合更为松散。由于组件表示一个或多个较细粒度类的逻辑集合,且被定义在较高级别,具有较粗粒度级,所以一个组件可以直接封装一个己经划分的问题,该问题更直接地产生于分析和设计模型。
组件通过组件模型定义实现互换性和兼容性。组件模型的接口定义了其它代码和组件之间的关系。其它代码实体可以是容器、应用程序代码、其它组件、其它组件模型以及一些专门服务提供商。近年来,人们开发了各种不同的组件模型,例如,Microsoft的ActiveX、后来的COM, Sun Microsystems的applet和 JavaBean。
组件为企业开发提供了许多方便。建立在面向对象软件和开发概念之上的组件提供了一个更高级的开发模型,并且能加速企业应用程序的建立。而且,系统质量也会被加强,因为这会促使商业组件的生产商集中于提高组件的质量并提供有很好文档的接口,这样就不要求内部人员具有很好的特定底层实现技术的知识和与实现服务相关的知识。
2.2 JSP/Servlet对web应用系统的支持
JSP对web应用系统提供了以下功能的支持:
用户交互:基于Web的Java小应用程序(Applet)和桌面应用客户程序能够使用基于Java的GUI技术创建,并能驻留在独立的J2 SE环境或J2EE环境中。传统的非面向Java的Web浏览应用程序能够与基于J2EE的 Web服务器一起使用。除此以外,非基于 Java的客户程序也可以使用分布式通信技术,如CORBA,DCOM及TCP/IP与服务器组件进行通信。
数据使能:Java数据库连接(JDBC)方法用于与数据库通信。J2EE, Web, EJB应用程序,以及应用程序客户程序都使用JDBC API.运行于J2 EE环境之外独立的Java企业应用程序都可以使用JDBC API。
系统保证:各种系统保证属性,如可靠性、可用性、可维护性、保护性和安全性是系统重要的特性,基于Java的企业环境封装了许多具有不同API的安全服务,CORBA也在 CORBA安全服务规范中定义了安全服务,对于在应用环境中的安全互操作特别有用。
Web使能:虽然HTML己经是最典型的创建Web页面的格式,但XML却是用于描述Web页面内所需要的数据和控制更灵活的、更可扩展的机制。Java ServIet和JavaServerPages是接收基于Web的请求和产生基于HTML或基于XML响应的标准J2EE机制。Web使能应用程序也可利用各种全局服务用于分布通信、通信服务以及保证服务。
应用程序使能:XML也能用于使系统应用能与外部系统的其它应用程序通信。各种各样的应用集成技术也是应用程序使能的一部分。通过上述机制,我们会得到如下应用需求原则:
(1) 将应用程序划分为多层(tier),以构建可伸缩的大型企业级应用。
(2) 将系统分解为相对的粗粒度组件,以便于快速开发。因此,可以用层(tier)+组件十服务”来描述JSP/Servlet对 web应用系统的支持。
3 系统分析
系统分析是软件工程的重要阶段,是所有开发的依据。在系统分析阶段,通过对系统的综合研究,对问题域进行抽象,准确的理解系统需求和系统内部运行机制,有助于准确的掌握系统的需求,从而正确的定义问题域,确定软件开发的具体内容。
对系统的分析过程采用面向对象分析(OOA),应用可视化面向对象建模技术UML(统一建模语言,Unified Modeling Language)建立系统模型。
3.1 用例分析
用例是从用户和业务的角度来描述系统提供需要执行的功能。下面列出了本系统主要的用例:
(1) 教师信息查询
学生和管理员为了解教师情况而查看教师信息.
(2) 教师信息录入与维护
由教师本人录入自己的基本信息,包括教育背景、研究方向、科研成果以及发表论文,专著和获奖等方面的情况。并由教师本人对信息进行修改和维护。
(3) 学生信息查看
教师和管理员查看学生信息,了解基本情况。
(4) 发布教学公告
管理员在网站的主页上发布教学公告信息。包括课程名称、开课时间、起止日期、主讲教师等。通过设置链接还能查看课程的详细介绍。
(5) 教学公告维护
管理员不定期的更新教学公告并对此进行维护。
(6) 课程资源浏览
学生可以查询课程内容,了解课程的章节目录等信息.
(7) 课程资源管理
任课教师录入新的课程资源信息或者修改、删除旧的课程资源。
(8) 学生选课,加入到某个选课班
学生在查看了系统发布的教学公告之后,根据自己的实际情况和兴趣选取要求学习的课程。学生在选定课程之后,未缴纳相应的费用之前,可以对选课内容进行修改.
(9) 成绩查询
学生通过查询条件可随时查看自己的考试成绩。
(10) 成绩管理
教师录入学生的考试成绩,评定成绩等级,更改或删除学生成绩。学生查询成绩。
(11) 作业管理
教师对选课班进入作业任务的发布,批改,统计,查询。学生可在线做作业,提交作业,查看批改结果。
(12)在线答疑
学生在线提问,教师在线答疑。
(13)在线测试
教师利用系统生成考卷并发布出去。学生在线答卷并由系统自动评分。
(12) 消息提醒
对教师布置作业,在线答疑,在线测试进行短消息提醒。
(11)用户登录
使用本系统的用户必须登录才能进入本系统查看信息,匿名用户不具有访问权限。
(12) 用户注销
用户退出本系统。
3.2 用例建模
用例模型描述的是外部执行者(Actor)所理解的系统功能。它的建立是系统开发者和用户反复讨论的结果,表明了开发者和用户对需求规格达成的共识。在需求分析阶段,可以用用例来捕获用户需求,以描述对系统感兴趣的外部角色及其对系统(用例)的功能要求。
3.2.1 标识参与者
参与者是指系统的分类用户,分别代表一个唯一的角色。对本系统来说,存在相互联系如下3类用户:
管理员:通过系统管理学生档案,维护学生选课内容,发布教学公告,成绩管理,以及数据备份恢复工作等等。管理员是系统中权限最大的用户,业务范围几乎涉及所有方面。
教师:通过系统管理自己的基本信息,查看课程资源,查看选课情况。业务范围为与自己和教学相关的信息。
学生:通过系统查看教学公告、教师信息和课程资源信息,查看成绩。业务范围为与教学相关的信息
3.2.2 用例图
用例图(Use Case)是参与者(系统外部用户)所能观察到的系统功能的模型图,它描述参与者与系统提供的用例之间的某种联系。用例图就是从参与者的角度描述出系统中的用例和参与者,以及用例与参与者之间的关系(哪个参与者参与了哪个用便的执行).根据上面的用例分析,得到系统的用例图如下面3张图所示:
图3-1超级管理员用例图
图3-2教师用例图
图3-3学生用例图
所有用户都包括用户登录和注销这两个用例,图中未画出。
3.2.3 顺序图
为进一步说明系统需求,可以通过顺序图、协作图和活动图来描述用例之间或用例内部的动态关系。这里我使用了顺序图和活动图,将陆续介绍。
用例是一种真正的文本描述,主要用于解释。顺序图用于更准确地、以技术语表达用例。按照参与者与系统的交互关系来描述用例就可以做到这一点。顺序图(Sequence Diagram)是UML中一种重要的动态视图,它是以时间顺序显示对象交互的图,它显示了参与交互的对象和所交换消息的顺序,是一种交互关系, 并强调了交互发生的时间顺序。这里我给出的例子是学生选课顺序图。
图3-4学生加入选课班顺序图
3.2.4 活动图
活动图的主要作用是表示系统的业务工作流和并发处理过程。它能够更容易显示参与者的决定和系统异常所要执行的多条路径,而这用顺序图是难以表达的。
活动图在概念上与流程图相似,用它来为工作流程建模,以及用来图解用例的动态行为和操作的详细设计是很有用的。一旦一个活动完成,执行就转到由活动的有效转移所确定的下一种状态。在活动图中,泳道可用于在一个活动图中显示多个对象,以及它们如何在一起完成整个用例。
根据需求分析为系统的核心业务绘制活动图,明确在业务工作流中参与者与系统各用例之间以及系统用例之间可能的交互。用例可以认为是获得对参与者有用的东西,而需执行的步骤,顺序图和活动图对精确标识和理解用例行为都是有用的。
图3-5学生流程活动图
图3-6教师流程活动图
3.3 分析类
根据用例模型,我们抽象出系统中的对象和类。系统中存在三种类:边界类、控制类和实体类,每一种类在系统模型中执行一定的作用口。
3.3.1 边界类
在系统模型中,边界类表示系统内部工作方式与其周围环境之间的各种交互作用。包括:通过图形化用户界面与用户交互,与其他参与者交互(如代表其他系统的参与者),与设备通信等。使用边界类的优点之一是:它们可以把系统的其余部分与外界环境隔离和屏蔽起来(见表3.1)。
表3.1系统边界类
边界类名称 边界类职责
主页面 显示最新教学公告和其他相关信息链接
登录页面 允许用户输入有效的帐号和密码,检验用户身份
注销页面 允许用户退出系统
教师信息列表页面 允许学生查看教师信息,管理员可删除信息
教师信息输入页面 允许教师输入个人信息
教师信息编辑页面 允许教师对个人信息进行编辑、修改
教师信息查询页面 允许所有用户查询教师信息
教师信息查询结果页面 显示查询结果
课程资源列表页面 允许教师和学生查看课程信息,管理员可删除信息
课程资源输入页面 允许管理员输入课程信息
课程资源编辑页面 允许管理员对课程信息进行编辑、修改
课程资源查询页面 允许所有用户查询课程资源
课程资源查询结果页面 显示查询结果
学生信息查看页面 允许管理员和教师查看学生信息
教学公告发布页面 允许管理员设置开课信息并发布
开课信息列表页面 允许学生和教师查看开课的详细信息,管理员可删除信息
开课信息编辑页面 允许管理员更改开课信息
选课页面 允许学生选课
选课信息查看页面 允许学生查看自己的选课内容并对此修改
成绩查询页面 允许学生查询自己的考试成绩
成绩查询结果页面 显示查询结果
成绩录入页面 允许管理员输入学生的考试成绩
成绩修改页面 允许管理员修改学生的成绩
信息发布页面 允许管理员发布教学信息
3.3.2 实体类
实体对象表示对系统的重要信息。它们通常是持久的,并能在一个延续的时期内存在。它们的主要的目的是表示和管理系统内的信息。实体类通常表示为一种逻辑的数据结构(见表3.2)。
表3.2系统实体类
实体类名称 实体类属性
用户基本信息 用户名、编号、用户类别、登录密码
教师基本信息 姓名、编号、性别、出生年月、身份证号、学历、职称、原属学校、电子邮件、从教时间、研究方向、主讲课程教师业绩 成果名称、获奖等级、获奖时间、著作名称、出版社、出版时间、论文名称
课程资源信息 课程名称、课程编号、教材名称、所属学科、学时数、培训类型、课件介绍信息、视频文件名、章节目录
选课信息 选课名称、课程编号、选课学生姓名、选课时间
开课信息 开课名称、课程编号、授课时间、主讲教师、信息发布时间
成绩单 课程名称、课程编号、学生姓名、学生编号、考试成绩、成绩等级
3.3.3 控制类
控制类用于系统内的模型行为,用于对某一个具体的用例相关的控制或者其他业务逻辑建模。通常将协调、排序等事物处理或者涉及多个对象的复杂事务逻辑隔离在一个或多个控制类中(见表3.3)。
表3.3系统控制类
控制类名称 控制类职责
用户登录 响应用户登录请求,检验用户身份的合法性
用户注销 用户退出系统
教师信息查看 对学生提出的教师信息查询请求进行处理
增加教师信息 对教师提出的增加个人信息请求进行处理
编辑教师信息 对教师提出的编辑个人信息请求进行处理
教师信息列表 对显示教师信息列表请求进行处理
删除教师信息 对删除教师信息请求进行处理
课程资源查看 对学生提出的课程信息查询请求进行处理
增加课程资源 对管理员提出的增加课程信息请求进行处理
编辑课程资源 对管理员提出的编辑课程信息请求进行处理
课程资源列表 对显示课程资源列表请求进行处理
删除课程资源 对删除课程资源请求进行处理
学生信息查看 对教师和管理员提出的学生信息查询请求进行处理
教学公告发布 对管理员提出的新增开课信息请求进行处理
开课信息查看 对学生和教师提出的开课信息查看请求进行处理
编辑开课信息 对管理员提出的编辑开课信息请求进行处理
选课 对学生提出的选课请求进行处理
选课内容查看 对学生提出的查看自己的选课内容请求进行处理
成绩查询 对学生提出的成绩查询请求进行处理
成绩录入 对管理员提出的新增成绩请求进行处理
成绩修改 对管理员提出的修改成绩请求进行处理
4 系统设计
4.1 体系结构设计
一个体系就是各部分一起定义整个系统的蓝图:结构,接口和通信技术。使用体系结构有这样一些意义:
(1) 软件分解成更小的块,有助于理解、管理、开发和维护软件;
(2) 软件体系结构可以帮助基于组件开发;
(3) 使用被验证的体系结构,便于管理软件的性能和保证质量;
(4) 通过正确的体系结构可以更好地实现重用性;
(5) 正式的体系结构会使系统很脆弱,难以升级和实现收缩,等等。
本系统采用MVC(Modet-View-Control)[2]的模式来设计系统结构并利用JSP/Servlet的技术来实现。本着业务逻辑和表现逻辑分离,对系统资源进行合理有效管理,优化系统性能的指导思想,设计总体框架如图4-1所示。
图4-1采用MVC设计模式的J2EE框架
系统的各组成部分如下:
(1) 客户层:在本系统中主要是Web浏览器。
(2) web层:所有的用户界面的开发和简单的业务逻辑都在这层得到实现。考虑到JSP能够嵌人HTML中,开发容易和产生的用户界面灵活等优点,故本系统采用 JSP实现用户界面,而简单的业务逻辑一般都由Servlet来开发,响应用户的查询等请求并调用业务逻辑层的JavaBean组件来实现复杂的业务逻辑。
(3) 业务逻辑层:这一层主要由EJB组件的开发来实现。会话Bean的主要任务是处理商务逻辑,客户端交互,返回给它计算结果等:而实体Bean的主要任务是表达数据库中的数据,用来完成据库的访问。实体Bean是通过JDBC访问数据库,完成记录插入、查找和删除等操作。
(4) 数据层:负责数据的存储管理、安全性管理和完整性管理等各种数据库服务,存放系统中的持久性的数据信息。
系统采用浏览器服务器模型(Browser/Server)。一般的,客户通过浏览器发送HTTP请求给服务器端Web服务器,Web服务器接收该请求并且进行相应处理,然后将处理后的结果返回到客户的浏览器中。在客户端,浏览器中呈现的正是该系统的视图部分。
系统将很好地结合使用JSP与Servlet,由JSP把用户提出的httpRequest送达Servlet, Servlet根据请求的类型不同分别进行不同的处理,选择不同的操作模块,具体地说比如说对数据库的读写更新查询操作等,Servlet处理完这些比较复杂的请求之后,选定JSP页面把最后的结果回应给使用者,此时的JSP就只是起到了视图的作用,并不做逻辑上运算只是将控制器方面传过来的资料展示给用户而己。
系统中的业务层中主要是JavaBean组件,它们负责接收由servlet传来的请求并对此进行处理,比如连接数据库执行查询等操作,JavaBean组件称为系统的模型 (Model)。
4.2 系统功能设计
4.2.1 功能模块划分
网络教学系统是一个综合性的教学管理应用系统,它包含一个教育系统的很多方面,这些方面不是孤立的而是相互联系的。本网络教学系统作为网络教学的一个重要支撑平台,从功能上来看,分为网络课程管理系统、系统管理和信息交流管理三个子系统。课程管理子系统包括学生选课管理、课程资源管理、教学公告管理等功能。整个系统的功能结构如图4-2所示。
图4-2系统功能结构图
对各子系统功能模块的详细描述如下:
(1)网络教学管理
学生选课管理:学生根据自己的实际情况选取要求学习的课程的选课班级。管理员对学生选课的内容进行维护,教师可以查看,审核自己所教课程的选课情况。
课程资源管理:课程资源信息包括课程名称、课程类别、在线备课,在线浏览课件。所有注册登录的用户都可以浏览和查询该信息,管理员和教师执行对课程信息的维护功能。
教学公告发布:管理员发布某门课程的教学公告。教学公告的详细信息包括课程名称、开课时间、起止日期、主讲教师等。通过设置链接还能查看课程的详细介绍。管理员对教学公告进行维护。
学生成绩管理:包括成绩录入、修改、成绩统计与查询。成绩统计是对各门课程平均成绩的计算以及各分数段人数的统计;成绩查询则可以检索和查看任何一位学生的成绩。学生只能查询自己的考试成绩,其他功能由管理员执行。
(2)个人信息管理
教师档案管理:包括教师信息的录入、更新、查询、删除等功能。这里的教师信息主要包括教师的教育背景、研究方向、科研成果以及发表论文,专著和获奖等方面的情况。只有教师本人才能对自己的信息进行修改。管理员可执行删除功能。
学生档案查看:提供教师和管理员对学生信息的查看功能。
(3)系统管理
用户登录和用户注销。下面给出系统的详细功能设计。
4.2.2 功能实现设计
(1)类设计
①边界类
边界类设计为ISP页面,主要有以下边界类,如表4.1所示:
表4.1边界类设计
功能模块 页面
课程管理 学生选课管理 Choosecourse.jsp(选课页面)Viewchoosecourse.jsp(查看选课内容页面)ChoosecourseEdit.jsp(选课修改页面)
课程资源管理 Course.jsp(课程资源列表页面)Addcoursejsp(新增课程资源页面)Editcourse.jsp(编辑课程资源页面)CourseSeek.jsp(课程查询页面)Courseseekresult.jsp(课程查询结果页面)
教学公告管理 Addteachcourse.jsp(发布教学公告页面)TeachcourseList.jsp(开课信息列表页面)TeachcourseSeek.jsp(查询页面)TeachcourseSeekresult.jsp(查询结果页面)Editteachcourse.jsp(编辑开课信息页面)
成绩管理 Marklnput.jsp(成绩录入页面)MarkSeekjsp(成绩查询页面)MarkEdit jsp(成绩修改页面)MarkSeekResult.jsp(查询结果页面)
教师档案管理 个人信息管理 Teacherlnfolnput.jsp(教师信息输入页面)TeacherlnfoEdit.jsp(教师信息修改页面)TeacherlnfoList.jsp(教师信息列表页面)TeacherlnfoSeek.jsp(教师信息查询页面)TeacherlnfoSeekResult.jsp(查询结果页面)
学生档案查看 StulnfoListjsp(学生信息列表页面)StulnfoSeekjSP(学生信息查询页面)StulnfoSeekResult.jsp(查询结果页面)
用户登录注销 用户登录 Login.jsp(登录页面)Main.jsp(主页面)
用户注销 Logoutjsp(注销页面)
②实体类
实体类设计为实体Bean,实体组件是存储在关系型数据库中的数据模型,代表了数据库中业务数据的对象视图,并提供了访问和操作数据的对象封装。实体组件具有持久性[1],支持多用户的共享访问。
使用实体组件作为业务数据的对象视图,客户端可以通过实体组件提供的接口间接地实现对数据库业务数据的访问与操作。
③控制类
我们使用实体组件封装了业务数据,用处理特定业务功能的会话组件来封装与该业务操作相关的实体组件。由特定的会话组件控制和协调各实体组件之间的交互,把数据查询、更新和新增的业务操作迁移到业务功能层来处理。从而向客户端提供了一个简单的功能接口,减少了通过网络和跨越服务层之间的远程通讯,同时也避免了把实体组件对象直接暴露给远程的客户端,降低了两层之间的耦合程度。因此在本子系统中设计了下面这些控制类如表4.3:
表4.3控制类设计
功能模块 控制类名称 操作
课程资源管理 CourseUstSevlet 显示课程资源列表
CourseSeekSevlet 查询课程资源
CourseAddSevlet 增加课程资源
CourseEditSevlet 编辑课程资源
CourseDeleteSevlet 删除课程资源
CourseControlSevlet 前端请求总控制器
CourseBean 封装所有对课程资源的操作
教学公告管理 TeachCourseListSevlet 显示开课信息列表
TeachCourseSeekSevlet 查询开课信息
TeachCourseAddSevlet 增加开课信息并提交发布
TeachCourseEditSevlet 编辑开课信息
TeachCourseDeleteSeviet 删除开课信息
TeachCourseControlSevlet 前端请求总控制器
TeachCourseBean 封装所有对开课信息的操作
学生选课管理 ChooseCourseServlet 学生选课提交
ChooseCourseViewServlet 查看选课内容
ChooseCourseEditServlet 修改选课内容
ChooseCourseControlServlet 前端请求总控制器
ChooseCourseBean 封装所有对选课信息的操作
成绩管理 MarkAddServlet 添加成绩
MarkSeekServlet 查询成绩
MarkEditServlet 修改成绩
MarkDeleteServiel 删除成绩
MarkControlServlet 前端请求总控制器
MarkBean 封装所有对成绩的操作
教师信息管理 TeacherEditServlet 修改教师信息
TeacherSeekServlet 查询教师信息
TeacherDeleteSeNlet 删除教师信息
TeacherListServlet 显示教师信息列表
TeacherControlServlet 前端请求总控制器
TeacherBean 封装所有对教师信息的操作
学生信息查看 StuListServlet 学生信息列表显示
StuSeekServlet 学生信息查询
系统管理 LoginServlet 用户登录控制
UserBean 身份验证
LogoutServlet 用户注销
①显示开课信息列表
入口参数:无
返回结果:结果集
②查询开课信息
入口参数:无
查询条件 类型:字符串
返回结果:结果集
③增加开课信息
入口参数:
开课名称 类型:字符串
开课日期 类型:日期型
主讲教师 类型:字符串
收费数目 类型:整型
返回结果:布尔型
如果添加成功,返回TRUE,否则返回FALSE.
④编辑开课信息
入口参数:
开课名称 类型:字符串
开课日期 类型:日期型
主讲教师 类型:字符串
收费数目 类型:整型
返回结果:布尔型
如果修改成功,返回TRUE,否则返回FALSE.
⑤删除开课信息
入口参数:
课程编号 类型:字符串
返回结果:布尔型
如果删除成功,返回TRUE,否则返回FALSE.
4.2.3 用例设计
设计用例是为了识别类或者子系统,其实例去执行用例的事件流。定义对设计对象或子系统及其接口的操作需求,为用例捕获实现性需求。
UML提供了版类(stereotype)这个扩展机制来区分不同类型的类。UML的创始人Jacobson定义了三种类型的版类对象类(stereotype object types):边界对象(boundary object)、实体对象(entity object)和控制对象(control object)。在ROSE中,可以设置类的stereotyp。域为<>和<>;这个阶段我们得到系统的类图和详细的顺序图。对JSP以及JavaBean组件我们现在都可以用类为它们建模,方便类图和序列图中的表示,对于系统中的用例,可以根据设计类来进一步细化其顺序图,下面显示了发布教学公告和学生选课用例的细化顺序图。
图4-3学生选课细化顺序图
在类图中我们可以看到在用例实现的过程中所涉及到的类以及它们之间的关系,这些类之间的关系是这些类产生代码的基础。同一JSP网页被分解成两个部分:客户页和服务器页其中后者和前者的关系是构建和被构建的关系(即图4-7中的Build的关系)。当网页中的表单中的内容需要提交到Servlet时,表单和它们的关系是提交的关系,调用Servlet的doPost()或doGet()方法。在UML的语法中类之间的关系主要分为以下儿种:协作、依赖、泛化、实现、积聚。协作关系在Java语法中表现为一个类对另一个类的引用,如图4-4所示。
图4-4发布教学公告类图
4.3 数据库设计
4.3.1 数据库设计原则
(1)一致性原则
对信息进行统一、系统的分析与设计,协调好各数据源,做到数出一门”、算法统一”、度量一致”。保证系统数据的一致性和有效性。
(2)完整性原则
数据库的完整性是指数据的正确性和相容性。要防止合法用户使用数据库时向数据库加入不合语义的数据。对输入到数据库中的数据要有审核和约束机制。
(3)安全性原则
数据库的安全性是指保护数据,防止非法用户使用数据库或合法用户非法使用数据库造成数据泄露、更改或破坏.要有认证和授权机制。
(4)可伸缩性原则
数据库结构的设计应充分考虑发展的需要、移植的孺要,具有良好的扩展性、伸缩性和适度冗余。
(5)规范化
数据库的设计应遵循规范化理论,规范化程度过低的关系,可能会存在插入、删除异常、修改复杂、数据冗余等问题,解决的方法就是对关系模式进行分解或合并(A范化),转换成高级范式。规范化一共有六个级别:1NF, 2NF, 3NF. BCNF, 4NF, 5NF。但也应当注意到,并不是规范化程度越高的关系就越好,在具体应用时,到底规范化进行到什么程度需要权衡利弊。一般而言,做到第三范式(3NF)就足够了。
4.3.2 系统数据库设计
网络教学管理系统数据库的设计遵循以上原则,数据库中的表包括用户信息、教师基本信息、课程资源信息、选课信息、开课信息、学期信息、课件信息、作业信息等,设计各表的数据结构如下:
表5-1:教师学生信息表
字段名 类型 说明
id int(11) 自动增加,主键
userID varchar(50) 用户登录ID
password varchar(50) 登录密码
userName varchar(50) 真实姓名
deptBH varchar(50) 用户所在部门编号(外键)
userLevel tinyint(3) 用户类型
roleBH varchar(50) 用户所属角色编号(外键)
isLocked tinyint(1) 用户审核标识
表5-2:系统机构表
字段名 类型 说明
DeptBH varchar(50) 部门编号
Depname varchar(50) 部门名称
表5-3:学期信息表
字段名 类型 说明
id int(11) 自动增加,主键
termName varchar(50) 学期名称
startTime date 开始时间
endTime date 结束时间
表5-4:课程信息表
字段名 类型 说明
id int(11) 自动增加,主键
courseName varchar(30) 课程名称
isUsed tinyint(1) 是否可用,0:不可用,1可用
intro text 课程介绍
表5-5:选课班级信息表
字段名 类型 说明
id int(11) 自动增加,主键
className varchar(30) 班级名称
teacher varchar(30) 任课教师
courseid smallint(6) 讲授课程
term tinyint(3) 上课学期
personCount tinyint(3) 班级人数
period varchar(50) 每周上课时间
表5-6:选课班级-学生信息表
字段名 类型 说明
id int(11) 自动增加,主键
Classid Int(11) 选课班级
Studid Int(11) 学生ID
表5-7:布置作业信息表
字段名 类型 说明
id int(11) 自动增加,主键
title varchar(200) 作业标题
teacher varchar(50) 布置作业教师
classid smallint(6) 交作业班级
subtime date 发布作业时间
deadLineTime date 最后交作业时间
intro text, 作业内容
attach varchar(100) 作业附件
表5-8:学生提交作业及教师批发信息表
字段名 类型 说明
id int(11) 自动增加,主键
hwid mediumint(9) 需交作业ID
stu_id varchar(50) 交作业学生
title varchar(100) 作业标题
intro text 作业内容
subtime date 提交时间
attach varchar(100) 作业附件
comment text 教师评语
score tinyint(3) 教师成绩
5 关键技术及实现
5.1 用户身份鉴别
身份鉴别通常包括用户提交的一个用户名和口令,你可以只使用用户名或口令对用户进行鉴别,也可以选择通过IP地址来鉴别。通过IP地址来鉴别只有当用户拥有静态IP时才起作用,所以并不常用。在此我采用基于表单的身份鉴别。
在基于表单的鉴别中,提示用户名和口令的Web页面由服务器来提供,而不是依靠浏览器显示对话框,这样,在需要用户登录时就可以给用户提交额外的信息和选项了。需要注意的是,虽然输入口令时显示为星号,但是浏览器还是以纯文本传送口令本身:非加密、不进行Base64编码,只是纯文本。如果采用GET方法将表单数据提交给服务器,用户浏览器将在URL中明显地显示出口令,而且浏览器还会将它保存在最近浏览地页面列表中。因此,在笔者实现基于表单的身份验证时,使用的是POST方法提交表单数据给服务器。
当用户登录认证的表单请求后,表单采用POST方法提交到LoginServlet. LoginServlet将获得的参数传给Userbean(是一个JavaBean),如果通过验证就进入系统的功能区,否则就返回登录界面。
下面介绍用户bean (Usecjava),它定义了一组属性,包括
(1) userlD,这是一个只读属性,标示登录会员的会员编号,这个编号对于使用系统的所有用户(包括教师、学生和管理员)来说是唯一的:
(2) userName,这是一个可读写属性,标示登录会员的用户名;
(3) passWord,是一个可读写属性,标示登录会员的口令;
(4) userType,也是一个可读写属性,标示登录会员的身份类型;该属性与userName,password都是用户通过login.jsp页面提交到checked.jsp,然后由checked.jsp将参数赋值给这三个属性。
(5) login,这是一个boolean属性,用来判断当前的访问是否是登录会员的访问。
(6) Userbean实现了如下两个公共方法用来检查用户是否是会员登录。
(7) checkUser:用来检查用户登录信息。它主要是通过JDBC访问数据库,通过检查用户名、口令、身份类型是否正确或者匹配,如果正确则置login为true,并从数据库中读取相应字段给属性UserlD赋值 。
(8) isLogin:获取login值,检查是否是登录会员的访问。
(9) isStudent, isTeacher, isAdm:获取登录会员的身份类型。
Userbean在本系统的许多程序中都要用到,它是作为session范围的bean定义的。
5.2 对会话的跟踪和处理
HTTP (Hypertext Transfer Protocol)是一个基于请求/响应模式的应用层协议。其最新版本为1.1,在RFC 2068中最先提出,并在RFC 2616中进行了修正。HTTP对浏览器进行请求、服务器提供响应的规则进行了定义。
一个客户机与服务器建立连接后,发送一个请求给服务器,请求方的格式为:请求方法,请求URI,协议版本号,后边是0个或多个头标以及可能的请求数据。服务器接到请求后,给予相应的响应信息,其格式为一个状态行,包括信息的协议版本号、一个成功或错误的代码,后边是0个或多个响应头标,一个空行指明头标的结束,最后是组成响应的数据。
HTTP最初的设计意图是在WWW 上发布文档和图像,因此,它使用了一个相当简单的通信模型。客户端对文档进行请求,服务器响应以文档或错误代码,最终事务处理完成。服务器不会保留请求的任何信息:下一次客户端进行请求时,服务器没有方法可以将它与其他客户端区别开来。这就是 HTTP的协议无状态性。
本系统采用JSP/Servlet会话 API来对会话进行跟踪和管理。其机制是要求服务器保持所有会话数据,并对其设置一个会话ID,客户端凭借该会话ID通知服务器将自己置于指定的会话环境中。一旦服务器初始化了一个会话对象并且客户端接受了它,服务器就可以构建复杂的、有效的对象并保存大量的属于该会话的数扼。为维持会话,服务器和客户端之间需要传输的仅仅是一个会话 ID。
Javax.servlet.http包中提供了一个HttpSession类。该类提供了一个像HashTable一样的接口,让应用程序开发者能够根据名字存储和检索对象。会话 Session本质上是服务器端的一个对象。该对象在被创建后将被保留直至超时或,被参与一个会话的Servlet关闭。客户端用于标识一个 Session的是一个会话 ID如果一个JSP/Servlet允许会话,任何时候,客户端向服务器请求一个JSP/Servlet页面时,服务器将检查该 HTTP请求的头标中是否包括一个会话 ID。如果客户端的 HTTP请求中包括一个有效的会话ID,服务器返回该会话ID所标识的一个HttpSession对象,并将该次请求/响应置于该会话环境。
如果客户端的 HTTP请求中不包括一个会话 ID,或是包括的会话 ID 无效,服务器将创建一个HttpSession对象,并将其引用返回到一个Session变量。随后,服务器将在返回给客户端的Http响应中的Set-cookie头标中加入一个名称为JSESSIONID,取值为当前会话 ID的cookie。此cookie被送往客户端,且在客户端的后续的请求中将被返回给服务器。
5.3 数据库连接池的实现
系统中的大量数据都是通过数据库系统来进行存储和管理的,所以系统在使用过程中需要频繁的访问数据库。在进行数据库操作之前,需要与数据库建立连接。常规的办法是使用数据库的时候创建连接,使用完以后关闭连接,但是对于这种需要很频繁的访问数据库的系统而言,频繁的创建、关闭连接会极大的降低系统的性能,成为系统的瓶颈。
为了有效地解决这个问题,我们引入了连接池的概念。连接池是数据访问中的重要技术,在某些情况下对访问数据库的性能有巨大的提高。它的核心思想是连接复用,通过建立一个数据库连接池以及一套连接使用、分配、管理策略,使得一个数据库连接可以得到高效、安全的复用,避免了数据库连接频繁建立、关闭的开销。连接池对JDBC中的原始连接进行了封装,从而方便了数据库应用对于连接的使用,提高了开发效率,也正是因为这个封装层的存在,隔离了应用的本身的处理逻辑和具体数据库访问逻辑,使应用本身的复用成为可能。
一个完整的连接池应用应包括功能:从连接池获取(或创建)连接、将连接返回给连接池、系统关闭时关闭所有连接释放所有资源;装载JDBC驱动、根据属性文件中定义的属性创建 DBConnectionPool、跟踪应用程序对连接池的引用等;应用程序对连接池的使用。本文只介绍连接池的核心实现算法:DBConnectionPool类。
类 DBConnectionPool提供以下功能:
(1) 从连接池获取(或创建)可用连接。
(2) 把连接返回给连接池。
(3) 在系统关闭时释放所有资源,关闭所有连接。
(4) 数据库连接池的自管理。包括根据连接使用次数,连接空闲时间等来对连接进行管理。以及连接池中连接个数的控制,如保证总连接数不低于设定的下限,不高于上限。必要时关闭连接。
DBConnectionPool的基本属性如下:
m ConnectionPoolMin:连接池中连接数量下限;
m ConnectionPoolMax:连接池中连接数量上限;
m ConnectionUseCount:一个连接的最大使用次数:
m ConnectionTimeout:一个连接的最长空闲时间:
m timer:定时器。
类DBConnectionPool通过实现TimerListene:接口来响应Time:事件,从而实现其自管理功能。类DBConnectionPool同时实现了下列方法:
public boolean initializes //连接池初始化
public void destroy0 //连接池的销毁
public synchronized java.sgl.Connection getConnection0 //取一个连接
public synchronized void freeConnection(Connection con) //释放一个连接
public synchronized void close0 //关闭一个连接
private synchronized void removeFromPoolo //把一个连接从连接池中删除
private synchronized void fiHPoolO//维护连接池大小
类DBCnnnectionPool的自管理流程图如图5-1所示。
5-1使用数据库连接池
将数据库连接池的实现应用于系统很容易实现。只需在需要数据库连接对象时不直接创建其实例,而是从连接池中取得一个可用的连接对象即可。对应于第4章的系统设计,只需在bean类的方法里调用DBConnectonPool.getlnstanceo初始化静态的连接池管理对象,然后就可以调用相应方法取得连接对象。在连接对象使用完毕后,不是直接关闭它,而是将其释放回连接池。
5.4 数据访问优化实现
网络教学管理系统中的业务数据使用相应的实体组件作为对象视图,客户端可以通过组件提供的属性读写方法。完成对业务数据地读写操作。通常,客户端需要多次调用实体组件的getter方法才能得到所有的属性值。但使用多个只返回单个属性值的getter方法调用来从特定的实体组件获取数据的效率将非常低下。随着调用次数的逐渐增加,系统的性能会明显下降。
为了提高数据访问效率,在设计上运用值对象的设计思想。值对象是普通的Java对象,封装了实体组件的所有属性。值对象的设计思想是由在客户端提出检索请求时由实体组件构造一个新的值对象实例,把检索的属性值拷贝到该对象中,然后把一该值对象实例传递给客户端。客户端可以通过检索一该值对象获取单个的属性值。值对象是按照值传递的方式传给客户端的,对值对象的所有调用都是本地调用,加快了实体组件客户端的访问速度,从而提高了系统的数据处理性能。
网络教学管理系统的用户不仅可以检索数据,还能对特定的数据进行修改。所有的这些业务处理过程都要用到值对象。因此,在值对象的设计上采用了可更新值对象的策略,也就是说,不仅可以把来自实体组件的值传递到客户端,而且可以把客户端更新的数据传递回实体组件对象。为了保持值对象的状态,值对象必须是可序列化的。
以用户信息实体组件为例,对可更新的值对象进行简略的说明。
(1) 定义值对象类Cls_ TeacherInfo_ ValucObject
public class Cls_ TeacherInfo_ ValueObject implements Serializable{
private java.lang.String name;
private java.lang.String sex;
public void setName6ava.lang.String Teachemame) {name=Teachername;j
public java.lang.String getNameo{return name;}
}
(2) 修改用户信息实体组件本地接口,在本地接口中添加值对象读写方法
getDatalnfo( )/setDatalnfo( )
(3) 在用户信息实体组件类内实现值对象的读写方法
//修改值对象,相应的实现对数据库数据的修改
public void setDataInfo(Cls_Teacherlnfoes Value0bject updateData){
setName(updateData,getName());
}//查询值对象
public Cls_ Teacherlnfo_ ValueObject getDatalnfoo {
Cls_ Teacherlnfo_ValucObject obj=new Cls_ Teacherrnfo_Value0bject (}:
Obj.setDrugName(getNameo);
return obj;
}
通过使用值对象,减少了从实体组件获取属性值的网络调用次数,提高数据访问效率。
5.5 系统安全实现
5.5.1 网络层安全
我们可以通过设定安全约束来保护网络资源,这个安全约束决定何人被授权访问那些由一系列的URL地址和HTTP协议描述的受保护的网络资源。安全约束是很容易来通过JDK中的deploytool工具来设定。当一个未认证的用户试图访问受保护的网络资源时,系统进行身份认证,并且只有当你是具有访问这些资源的资格的用户时才能进行访问。
为了满足企业中的不同安全级别和客户对系统的需求,JSP/Servlet提供了三种基于web客户端的验证方式:
(1)HTTP基本验证(HTTP Basic Authentication)
HTTP基本验证是HT P协议所支持的验证机制。这种验证机制利用用户名和密码作为验证信息。
Web客户端从用户获取用户名和密码,然后传递给web服务器,web服务器在指定的区域(realm)中验证用户。但需要注意的是,这种验证方法是不够安全的。因为这种验证方法并不对用户密码进行加密,而只是对密码进行基本的baseb4的编码。而且目标web服务器对用户来说也是非验证的。不能保证用户访问到的 web服务器就是用户希望访问的。可以采用一些安全措施来克服这个弱点。例如在传输层上应用SSL或者在网络层上使用IPSEC或VPN技术。
基于表单的验证(Fonn-Based Authentication)
基于表单的验证使系统开发者可以自定义用户的登录页面和报错页面。这种验证方法与基本HTTP的验证方法的唯一区别就在于它可以根据用户的要求制定登录和出错页面.基于表单的验证方法同样具有与基本HTIP验证类似的不安全的弱点。用户在表单中填写用户名和密码,而后密码以明文形式在网路中传递,如果在网路的某一节点将此验证请求截获,再经过反编码很容易就可以获取用户的密码。因此在使用基本HTTP的验证方式和基于表单的验证方法时,要确定这两种方式的弱点对你的应用是可接受的,为了消除明文传输的确定,我们可以将基于表单的验证建立在SSL层上。
(2)基于客户端证书的验证(Client-Certificate Authentication)
基于客户端证书的验证方式要比上面两种方式更安全。它通过HTTPS(HTIP over SSL)来保证验证的安全性。安全套接层((Secure Sockets Layer)为验证过程提供了数据加密,服务器端认证,信息真实性等方面的安全保证。在此验证方式中,客户端必须提供一个公钥证书,你可以把这个公钥证书看作是你的数字护照。公钥证书也称数字证书,它是被称作证书授权机构(CA)一一个被信任的组织颁发的。这个数字证书必须符合X509公钥体系结构(PKI)的标准。如果确定这种验证方式,Web服务器将使用客户端提供的数字证书来验证用户的身份。
正如上面所述,本系统采用的是基于表单的验证。
在网络层使用可编程性安全方法。当仅使用声明性安全方法不能完全满足应用程序的安全要求时,利用可编程安全方法来满足之。在HttpServletRequest接口中有以下几种方法用于安全编程。
(1) getRemoteUser:获得认证用户的用户名
(2) isUserInRole:确定用户是否是属于特定的安全角色
(3) getUserPrincipal:返回一个Java.security.Principal对象
5.5.2 数据层安全
在数据层,应用组件总是请求连接到一个数据库资源,作为这个连接的一部分,数据库可能需要组件登录才能提供有关资源。应用组件提供了组件管理登录和容器管理登录两种方法来设计数据库登录。在组件管理登录的方法中,组件代码中包含处理登录数据库功能的代码。在容器管理的登录的方法中,组件让容器来承担配置和管理数据库登录的责任。容器通过用户名和密码来建立一个和数据库实例的连接。
教学平台网络教学平台
系统设置管理子系统
网络教学管理子系统
信息交流子系统
系统机构设置
系统用户管理息
角色,权限管理
系统日志管理
数据库操作
学期管理
课程管理
在线短消息
成绩查询
班级管理
教学信息发布
网络教学
教学论坛
获取项目源文件,联系Q:1225467431,可指导其它毕设,课设;+entity>

  • 4
    点赞
  • 1
    评论
  • 41
    收藏
  • 打赏
    打赏
  • 扫一扫,分享海报

评论1
请先登录 后发表评论~
©️2021 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页

打赏作者

longlong888666

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值