毕业设计(论文)基于J2EE的试卷库管理系统的设计与实现_第1页
毕业设计(论文)基于J2EE的试卷库管理系统的设计与实现_第2页
毕业设计(论文)基于J2EE的试卷库管理系统的设计与实现_第3页
毕业设计(论文)基于J2EE的试卷库管理系统的设计与实现_第4页
毕业设计(论文)基于J2EE的试卷库管理系统的设计与实现_第5页
已阅读5页,还剩26页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、基于j2ee的试卷库管理系统的设计与实现理工学院 计算机科学与技术专业 050308008指导教师 副教授 【摘要】试卷库管理系统是基于为泉州师范学院提供便捷而优质的试卷库管理的背景而进行开发的。本系统采用b/s开发模式,遵循j2ee规范,结合当今流行的框架组合struts、hibernate、spring进行项目开发。该系统用户界面精美,性能稳定,为本校的试卷管理工作提供一个良好的解决方案,减轻工作人员负担。基于b/s结构的web服务,实现客户端零维护,基于网络,信息共享性好。【关键词】ajax、j2ee、struts、spring、hibernate、jacob目 录引言4第一章系统综述4

2、1.1系统简介41.2系统架构41.3 系统目标5第二章系统设计52.1 需求分析52.1.1 主要问题52.1.2 基本功能62.1.3系统用例62.2 系统数据库设计72.3 系统访问权限控制82.4 开发环境9第三章系统实现93.1 系统界面93.2 系统中文乱码的解决方案123.3 整合struts、spring、hibernate框架133.3.1 struts整合spring143.3.3 hibernate整合spring163.3.3 web系统加载spring163.4 上传试卷到数据库163.5 批量安排课程183.6 系统定时更新试卷193.7 抽卷算法设计与实现203.

3、8 jacob操作word文档243.9 批量打印试卷263.10基于角色的访问权限控制27第四章系统部署284.1 部署环境284.2 系统部署284.3 注意事项30第五章总结30致谢31参考文献31引 言近年来随着学校的不断发展扩招,各级学院的专业和生源不断发生变化,造成学校的试卷管理工作很繁琐,如果没有相应的系统,而仅仅以传统的方式进行管理,不但效率低下,而且往往得不到很好的效果。同时也给教师增加了额外的负担,不能实现试卷的重复利用。而在计算机普及的今天,人人都明白优秀的管理离不开计算机的支持,教育也不外如此。基于j2ee的试卷库管理系统就是针对此需求而开发的,这套系统可以使工作人员轻

4、松有条理的完成试卷管理的工作,而且其性能也十分稳定,实现了高校试卷管理自动化。第一章 系统综述1.1 系统简介选择j2ee构建信息化平台是一种长远的规划,对于信息化而言这是一个不断整合的过程,在未来的日子里可能会有不同的平台、不同系统的异构系统需要整合,j2ee应用提供的跨平台性、开放性及各种远程访问的技术,为异构系统的良好整合提供了保证。而轻量级j2ee应用是对经典j2ee应用的简化,在保留经典j2ee应用的架构、良好的可扩展性、可维护性的基础上,简化了j2ee应用的开发,降低了j2ee应用的部署成本。本系统是建立在互联网基础上的应用系统。客户端只需要一个有浏览器的终端就可以使本校的试卷库管

5、理不受地域和时间的限制,是基于轻量级j2ee框架进行开发的一套b/s系统。系统主要流程:1、安排课程:管理员导入excel表格批量安排每学期的课程。2、上传试卷:教师根据专业和课程添加试卷,等待试卷被管理员审核。3、审核试卷:管理员审核教师上传的试卷,只有审核通过的试卷才能参与每一门课程的抽卷,每份试卷都有一个相应的抽卷参与系数。4、手动抽卷:管理员可以对每学期的课程进行抽卷以作为期末试卷,手动抽卷程序中可以先手动修改每份试卷的参与系数大小,然后再根据参与系数的大小从已经审核通过的试卷中进行抽卷,系数大的试卷被抽到的概率比较大,反之则比较小。5、自动抽卷:管理员可以对每学期的课程进行自动抽卷,

6、试卷参与系数大小取默认值。6、重新抽卷:管理员查看已经被抽取的试卷的历史记录,不满意则可以重新抽卷。7、批量打印试卷:打印员查询已经抽卷完毕的课程,然后批量打印该课程的试卷。8、自动打包试卷:管理员根据学年、学期、学院打包下载期末试卷,然后送往教务科存档。1.2 系统架构表示层struts-mvcstrutsaction、actionform、jsp 、struts-config.xml业务层spring事务transactionshibernate session管理业务逻辑类business services持久层datasource连接池sql语句hibernate serviceshi

7、bernatemysqldomain model business objects数据库数据存储daoservicesql图1.1系统架构图l 表示层:管理用户的请求,做出相应的响应提供一个控制器,委派调用业务逻辑和其它上层处理异常,抛给struts action,为显示提供一个模型;l 业务层:一个典型web应用的中间部分是业务层或者服务层,这层容易与程序代码紧密偶合而使用spring可以很好的解偶;l 持久层:利用hibernate 为java提供的or持久化机制和查询服务,其对象是基于pojo和java collections;l 域模型层:hibernate允许你将数据库中的信息存入由

8、实际需求中的业务组成的对象,也可以将对象中的信息存入数据库中;l 数据库:在本系统中采用mysql作为数据存储服务器。1.3 系统目标基于b/s模式的试卷库管理系统可以使用户在网上随时对试卷库进行管理。管理员能在网上对本校的试卷库和各部门信息进行管理,无时间和地域限制。教师可以及时添加试卷作为期末考试抽卷使用。打印员可以轻松地批量打印试卷。本项目的设计与实现,可以实现自动化管理试卷库。希望它能够在本校的试卷管理中发挥高效、便捷的作用,把老师、管理人员从繁重的工作中解放出来。第二章 系统设计2.1 需求分析2.1.1 主要问题(1)用户身份级别要求即根据身份的不同对系统的使用权限有所不同。从权限

9、大小大致可以分为:管理员、教师、打印员。系统提供灵活的角色设定和权限的分配功能。l 管理员:是权限最大的管理员,拥有本系统的所有权限,主要负责管理学院、专业、班级、课程以及用户,具有审核试卷的权限,可以针对课程进行抽卷操作等。l 教师:查询课程表信息,选择专业和课程添加试卷,并可以对自己的试卷进行管理。l 打印员:主要负责打印试卷,其中批量打印试卷对此项工作非常重要。(2)上传试卷要求在高校考试中,试卷的保密性是必须的,在普通的文件上传下载中,通常是把试卷直接放在服务器目录下面,这样导致试卷泄露率会比较大。为了更好的实现对试卷的保密措施,要求将试卷word文档直接转换成二进制流存入mysql数

10、据库的blob字段中,这样就确保了只有获取了系统的相应权限后才能对试卷进行查看。(3)抽取试卷算法要求抽卷算法对于如何合理的在一套试卷库中抽取试卷,在以往的考试中,都是从a、b、c三份试卷中随机抽取一份作为期末考试用。现在为了实现试卷的重用性,往年的试卷也可以参与抽卷,这样就有多份试卷参与抽卷,需要设计一个算法按每份试卷的概率大小进行抽卷。(4)系统定时更改试卷参与系数在抽卷过程中,如果某份试卷被抽到作为考试用,则把该份试卷的参与系数设置成最小。但是为了更好的确保试卷的重用性,确保在以后的抽卷过程中,也能够抽到它,要求系统定时增加每份试卷的参与系数大小,这样就确保了试卷库中每份试卷的重用性。2

11、.1.2 基本功能我们主要构建一个基于b/s模式的试卷库管理系统,为本校的试卷库管理提供一个良好的解决方案。系统的主要功能包括:(1)根据登录者的身份提供不同的服务。(2)教师:管理个人信息、添加试卷及管理个人试卷、查询用户、查询课程;(3)打印员:管理个人信息、查询用户、查询课程、打印试卷管理(批量打印);(4)管理员: 管理个人信息、专业配置、班级配置、课程配置、审核试卷、查看试卷、删除试卷、手动抽卷、自动抽卷、管理用户、打包下载试卷。2.1.3系统用例图1.2 系统用例图2.2 系统数据库设计该系统使用mysql数据库,数据库名称是sjgl,以下是各个数据表的结构表及说明。(1) 教师信

12、息表(teacher),用来记录各系统用户的基本信息。其中字段teaid为教师信息表的关键字,系统就是使用teaid来区分判断用户权限的。表2-1 teacher结构序号字段含义字段名类型宽度是否非空关键字备注1教师工号teaidvarchar12yy2密码teapwdvarchar32y3姓名teanamevarchar20y4性别teasexvarchar12y5学院teainsvarchar30y6专业teadeptvarchar30y7邮箱teaemailvarchar50y8电话teaphonevarchar20y9职称teatitlevarchar20y10用户级别tealevel

13、varchar30y(2) 学院表(ins),用来记录各二级学院编号和名称。表2-2 ins结构序号字段含义字段名类型宽度是否非空关键字备注1学院编号ins_codevarchar12yy2学院名称ins_namevarchar50y(3) 专业表(dept),用来记录各二级学院隶属专业的编号和名称。表2-3 dept结构序号字段含义字段名类型宽度是否非空关键字备注1专业编号dept_codevarchar12yy2专业名称dept_namevarchar50y3学院编号ins_codevarchar12yins.ins_code(4) 班级表(classgrade),用来记录各专业隶属班级的

14、编号和名称以及班级人数。表2-4 classgrade结构序号字段含义字段名类型宽度是否非空关键字备注1班级编号class_codevarchar12yy2班级名称class_namevarchar50y3专业编号dept_codevarchar12ydept.dept_code4班级人数classpersonint11y默认为0(5) 课程信息表(course),记录各个专业所有课程信息。表2-5 course结构序号字段含义字段名类型宽度是否非空关键字备注1课程编号course_codevarchar12yy2课程名称course_namevarchar50y3所属专业dept_codev

15、archar12ydept.dept_code4考核方式exammethodvarchar10y5选课属性propertyvarchar4y6抽卷标志remarkvarchar8y(6) 课程表(classcourse),记录详细的课程表信息,包括班级、课程、学年、学期等等信息。表2-6 classcourse结构序号字段含义字段名类型宽度是否非空关键字备注1编号idint11yy自动增一2课程编号course_codevarchar12ycourse.course_code3班级编号class_codevarchar12yclassgrade.class_code4学年yearvarchar

16、8y5学期termvarchar4y6上课人数papercountint11y7抽卷标志remarkvarchar12n8打印标志remark2varchar12n9试卷内容papercontentlongblobn10试卷名称papernamevarchar100n11抽卷历史historytextn(7) 试卷表(paper),记录试卷详细信息,包括学院、专业、课程、上传时间、指导老师等等。表2-7 paper结构序号字段含义字段名类型宽度是否非空关键字备注1编号idint11yy自动增一2学院paperinsvarchar50y3专业paperdeptvarchar50y4课程paper

17、coursevarchar50y5试卷套数papernumint11y6上传时间papertimevarchar30y7试卷内容papercontentlongbloby8指导老师paperteavarchar20y9审核标志remarkvarchar8y10参与系数factordouble4,2y11抽卷历史historytextn12审核意见remarkideatextn2.3 系统访问权限控制系统根据用户权限进入不同的管理后台,权限控制图详细描述了这个过程。图1.3 权限控制图2.4 开发环境¨ jdk版本:1.5.0_04¨ j2ee容器:tomcat 5.0.28

18、¨ 数据库:mysql 5.1.23¨ 系统:windows xp profession¨ 开发工具:eclipse 3.2.1、myeclipse 5.1、dreamweaver8.0、fireworks8.0¨ 本系统使用的框架版本:struts1.2、spring2.0、hibernate3.0第三章 系统实现3.1 系统界面图3.1 系统登录界面图3.2 管理员界面图3.3 管理员打包下载试卷图3.4 管理员手动抽卷图3.5 教师查询个人试卷图3.6 打印员批量打印试卷3.2 系统中文乱码的解决方案java的内核和class文件是基于unicod

19、e的,这使java程序具有良好的跨平台性,但也带来了一些中文乱码问题的麻烦。主要有两方面,java和jsp文件本身编译时产生的乱码问题和java程序于其他媒介交互产生的乱码问题。首先java(包括jsp)源文件中很可能包含有中文,而java和jsp源文件的保存方式是基于字节流的,如果java和jsp编译成class文件过程中,使用的编码方式与源文件的编码不一致,就会出现乱码。对于jsp:在文件头加上<% page contenttype="text/html;charset=gbk"%>就能解决乱码问题。对于交互产生的乱码问题(例如:表单提取过程中的乱码),解决

20、步骤如下:1、对于servlet应该加上:response.setcharacterencoding("gbk");2、为系统添加一个过滤器(encodingfilter)代码如下:public class encodingfilter implements filter private string charset = null;public void destroy() public void dofilter(servletrequest req, servletresponse resp,filterchain chain) throws ioexception,

21、servletexception req.setcharacterencoding(this.charset);chain.dofilter(req, resp);public void init(filterconfig arg0) throws servletexception this.charset = arg0.getinitparameter("charset");3、在web.xml中做如下设置:<filter><filter-name>encoding</filter-name><filter-class>qz

22、tc.paper.filter.encodingfilter</filter-class><init-param><param-name>charset</param-name><param-value>gbk</param-value></init-param></filter><filter-mapping><filter-name>encoding</filter-name><url-pattern>/*</url-pattern>&

23、lt;/filter-mapping>4、对数据库进行相应设置(mysql)¨ 修改mysql数据库的my.ini配置文件中client下的设:default-character-set=gbk¨ 在建表的时候设置:engine=innodb default charset=gbk3.3 整合struts、spring、hibernate框架3.3.1 struts整合spring1、在struts配置文件struts-config.xml中主要配置:¨ 配置actionform bean¨ 配置全局转发关系¨ 配置action映射

24、68; 配置消息资源¨ 配置validator插件<?xml version="1.0" encoding="utf-8"?><!doctype struts-config public "-/apache software foundation/dtd struts configuration 1.2/en" "/dtds/struts-config_1_2.dtd"><struts-config><data-sou

25、rces /><!- 配置formbean -><form-beans><form-bean name="indexform"type="qztc.paper.struts.form.indexform" /> 略</form-beans><global-exceptions /><global-forwards /><!- 配置action -><action-mappings><action attribute="indexform&

26、quot; input="/index.jsp"name="indexform" parameter="action" path="/index" scope="request"type="qztc.paper.struts.action.indexaction"><forward name="printerindex" path="/printer/main.jsp"></forward><forw

27、ard name="adminindex" path="/admin/main.jsp"></forward><forward name="teacherindex" path="/teacher/main.jsp"></forward><forward name="reg_success" path="/reg_success.jsp"></forward></action>略</actio

28、n-mappings><!-用spring中的delegatingrequestprocessor覆盖struts中的requestprocessor -> <controllerprocessorclass="org.springframework.web.struts.delegatingrequestprocessor"></controller><!- 配置消息源 -><message-resourcesparameter="qztc.paper.struts.applicationresourc

29、es" /><!-配置struts自动验证框架validator插件-><plug-in classname="org.apache.struts.validator.validatorplugin"><set-property property="pathnames"value="/web-inf/validator-rules.xml, /web-inf/validation.xml" /></plug-in><!- 使用 spring 的 contextloa

30、derplugin 将struts集成进spring -><plug-inclassname="org.springframework.web.struts.contextloaderplugin"><set-property property="contextconfiglocation"value="/web-inf/applicationcontext.xml" /></plug-in></struts-config>2、在spring中注册动作(applicationcon

31、text.xml)<?xml version="1.0" encoding="utf-8"?><!doctype beans public "-/spring/dtd bean/en" "/dtd/spring-beans.dtd"><!-首页登陆验证 -><bean name="/index" class="qztc.paper.struts.action.indexaction&qu

32、ot;><property name="indexdao"><ref bean="indexdaoimpl" /></property></bean><!-详细配置参考源代码-></beans>3.3.2 hibernate整合spring1、配置数据源<bean id="datasource"class="org.springframework.jndi.jndiobjectfactorybean"destroy-method=&

33、quot;close"><property name="jndiname"><value>java:comp/env/jdbc/sjgl</value></property></bean>2、配置sessionfactory<bean id="sessionfactory"class="org.springframework.orm.hibernate3.localsessionfactorybean"><property name=&quo

34、t;datasource"><ref bean="datasource" /></property><!- 为处理blob类型字段的句柄声明 /-><property name="lobhandler" ref="lobhandler" /><property name="hibernateproperties"><props><prop key="hibernate.dialect">org.h

35、ibernate.dialect.mysqldialect</prop><!- 表示允许自动提交 -><prop key="hibernate.connection.autocommit">true</prop><!- 显示sql语句 -><prop key="hibernate.show_sql">true</prop></props></property><!- 配置hibernate映射文件 -><property name

36、="mappingresources"><list><value>qztc/paper/vo/classcourse.hbm.xml</value>略 </list></property></bean>3、装配dao在spring中注册dao<bean id="indexdao" class="qztc.paper.dao.indexdao"abstract="true"></bean><bean id=&q

37、uot;indexdaoimpl" class="qztc.paper.dao.impl.indexdaoimpl"parent="indexdao"><property name="hibernatetemplate"><ref bean="hibernatetemplate" /></property></bean>4、装配service层<bean name="/admin/admin"class="qztc.

38、paper.struts.action.adminaction"><property name="admindao"><ref bean="admindaoimpl" /></property></bean>3.3.3 web系统加载spring<context-param><param-name>contextconfiglocation</param-name><param-value>/web-inf/applicationcontext

39、.xml</param-value></context-param><servlet><servlet-name>context</servlet-name><servlet-class>org.springframework.web.context.contextloaderservlet</servlet-class><load-on-startup>1</load-on-startup></servlet>3.4 上传试卷到数据库本系统中为了实现试卷的保密性,需要把试卷

40、word文档转换成二进制流存在数据库blob字段中,在这里用三个框架ssh整合实现。1、在applicationcontext.xml配置文件中<!- lob字段的处理句柄配置 /-><bean id="lobhandler"class="org.springframework.jdbc.support.lob.defaultlobhandler"lazy-init="true"></bean><bean id="sessionfactory"class="org

41、.springframework.orm.hibernate3.localsessionfactorybean"><property name="datasource"><ref bean="datasource" /></property><!- 为处理blob类型字段的句柄声明 /-><property name="lobhandler" ref="lobhandler" /></bean><!-定义事务bean-&g

42、t;<bean id="transactionmanager"class="org.springframework.orm.hibernate3.hibernatetransactionmanager"><property name="sessionfactory"><ref local="sessionfactory" /></property></bean><!-定义事务拦截器bean -><bean id="transac

43、tioninterceptor"class="erceptor.transactioninterceptor"><!-事务拦截器bean需要依赖注入一个事务管理器-><property name="transactionmanager" ref="transactionmanager" /><property name="transactionattributes"><!-下面定义事务传播

44、属性-><props><prop key="save*">propagation_required</prop><prop key="write">propagation_required,readonly</prop></props></property></bean><!- 定义beannameautoproxycreator-><beanclass="org.springframework.aop.framework.a

45、utoproxy.beannameautoproxycreator"><!- 指定对满足哪些bean name的bean自动生成业务代理 -><property name="beannames"><!- 下面是所有需要自动创建事务代理的bean-><list><value>fileservice</value><!-此处可增加其他需要自动创建事务代理的bean-></list></property><!-下面定义beannameautoproxy

46、creator所需的事务拦截器-><property name="interceptornames"><list><value>transactioninterceptor</value><!- 此处可增加其他新的interceptor -></list></property></bean>2、在action中处理上传的文件/ 上传试卷public actionforward addpaper(actionmapping mapping, actionform form,h

47、ttpservletrequest request, httpservletresponse response)throws exception fileform fileform = (fileform) form;/ 保存试卷this.fileservice.save(fileform);return mapping.findforward("addpaperdo");3、调用的fileservice实现方法/ 用于将上传的文件信息保存到数据库public void save(fileform fileform) throws exception string pape

48、rcourse = fileform.getpapercourse();string paperdept = fileform.getpaperdept();string paperins = fileform.getpaperins();integer maxpapernum=this.filedao.querymaxpapernum(paperins, paperdept, papercourse);if(maxpapernum=null)maxpapernum=0;integer papernum=maxpapernum+1;paper paper=new paper();string

49、papertea = fileform.getpapertea();simpledateformat format = new simpledateformat("yyyy-mm-dd hh:mm:ss");date d = new date();string papertime = format.format(d);paper.setpapercourse(papercourse);paper.setpaperdept(paperdept);paper.setpaperins(paperins);paper.setpapertea(papertea);paper.setp

50、apertime(papertime);paper.setpapernum(papernum);paper.setremark("未审核");paper.setfactor(1.0);paper.setpapercontent(fileform.getpaperfile().getfiledata();this.filedao.save(paper);3.5 批量安排课程管理员根据每个班级能选择的课程进行安排课程,先下载课程表模板,然后填写好数据直接上传,使用poi组件实现读取excel文件的数据,并存入数据库课程表中相应的字段。核心功能代码如下:/添加课程表public

51、void saveclasscourse(fileform fileform) throws exception file file = fileform.getfile();system.out.print(file);hssfworkbook workbook = new hssfworkbook(new fileinputstream(file); / 得到excel对象hssfsheet sheet = workbook.getsheetat(0); / 得到第一个sheetint rows = sheet.getphysicalnumberofrows(); / 得到行数for (i

52、nt i = 1; i < rows; i+) hssfrow row = sheet.getrow(i);classcourse classcourse = new classcourse();classgrade classgrade = new classgrade();course course = new course();hssfcell cell = row.getcell(short) 0); / 得到列1(下标0,为第一列)string coursecode=cell.getstringcellvalue(); course=filedao.persistencecou

53、rse(coursecode);classcourse.setcourse(course);system.out.println("课程号:" + course.getdept().getdeptcode();cell = row.getcell(short) 1); / 得到列2string classcode=cell.getstringcellvalue();classgrade=filedao.persistenceclassgrade(classcode);classcourse.setclassgrade(classgrade);system.out.print

54、ln("班级号:" + classcourse.getclassgrade().getclasscode();cell = row.getcell(short) 2); / 得到列3classcourse.setyear(cell.getstringcellvalue();system.out.println("学年:" + classcourse.getyear();cell = row.getcell(short) 3);/ 得到列4classcourse.setterm(cell.getstringcellvalue();system.out.pr

55、intln("学期:" + classcourse.getterm();cell = row.getcell(short) 4);/ 得到列4double papercount=cell.getnumericcellvalue();int papercount2=(int)papercount/1;integer papercount3=integer.valueof(papercount2);system.out.print(papercount3);classcourse.setpapercount(papercount3);system.out.println(&qu

56、ot;上课人数:" + classcourse.getpapercount();classcourse.setremark("未抽卷");classcourse.setremark2("未打印");this.filedao.saveclasscourse(classcourse);3.6 系统定时更新试卷在抽卷过程中,如果某份试卷被抽到作为考试用,则把该份试卷的参与系数设置成最小。但是为了更好的确保试卷的重用性,确保在以后的抽卷过程中,也能够抽到它,要求系统定时增加每份试卷的参与系数大小,这样就确保了试卷库中每份试卷的重用性。1、 在web.x

57、ml配置文件中<?xml version="1.0" encoding="utf-8"?><web-app xmlns="xmlns:xsi="/2001/xmlschema-instance" version="2.4"xsi:schemalocation=" <listener> <listener-class>qztc.paper.util.mylistener</listener-class> </listener> 2、 系统设定开始时间和间隔时间package qztc.paper.util;import java.util.timer; import javax.

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论