毕业设计(论文)图书馆管理系统_第1页
毕业设计(论文)图书馆管理系统_第2页
毕业设计(论文)图书馆管理系统_第3页
毕业设计(论文)图书馆管理系统_第4页
毕业设计(论文)图书馆管理系统_第5页
已阅读5页,还剩36页未读 继续免费阅读

下载本文档

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

文档简介

1、哈尔滨理工大学学士学位论文第1章 绪论1.1 课题开发背景管理信息系统(management information system),在强调管理,强调信息的现代社会中它变得越来越普及f。mis是一门新的学科,它是oa(办公自动化系统)的一个分支阶段。跨越了若干个领域,比如管理科学、系统科学,运筹学、统计学以及计算机科学。在这些学科的基础上,形成信息收集和加工的方法,从而形成一个纵横交织的系统。本课题就是信息管理系统的一个具体实例。它为图书馆图书和学生接借还信息管理提供了一种高效的操作方式。1.2 课题研究目的与意义该项目是以sql server 2005数据库和c# 编程语言实现的,其功能在系

2、统内部由源代码直接完成。操作人员只需输入一些简单的字符、数字,经过一些简单的操作就可达到自己管理目的。对于图书馆工作人员来说,利用计算机高效率地完成日常事务,是适应学校发展要求、推动管理走向科学化、规范化的必要条件;而且图书馆管理又是一项非常烦琐的事情,数量之大,传统管理极其不便。然而计算机高效的操作方式,具有手工管理所无法比拟的优点。例如:检索迅速、查找方便、可靠性高、存储量大、保密性好、寿命长、成本低等。这些优点能够极大地提高学生与图书管理人员之间共享、交流信息的效率,从而有效地进行图书借阅和信息管理。1.3 国内外发展概况管理信息系统在初级阶段是统计系统,所研究的内容是数量数据间表面的规

3、律,它可以把数据分成较相关和较不相关的组,然后把数据转换为信息。第二阶段是数据更新系统,其典型代表是美国航空公司于20世纪50年代建成的sabre预约订票系统。它设有1008个订票点,可以存取600000个旅客记录和27000个飞行段记录。它的操作比较复杂,在任何一“点”都可以查到某一航班是否有空座位。但从概念上来讲,它只是一个数据更新系统,比如它不能告诉你以现在的售票速度何时票将售完,从而采取补救措施。因而它也是管理信息系统的低级阶段。第三阶段是状态报告系统,它可以分为生产状态报告、服务状态报告和研究状态报告等系统。比如生产状态报告系统,它的典型代表是ibm公司的生产管理系统。众所周知,ib

4、m公司是世界上最大的计算机公司,1964年它生产出中型计算机ibm360,使计算机的水平提高了一个台阶,但同时组织生产的管理工作却大大复杂化了。一台计算机有超过15000个不同的部件,每一个部件又有若干个元件,加之ibm的工厂遍及美国各地,不同的定货有不同的部件和不同的元件,必须指出什么工厂什么设备生产什么元件,因此不仅生产复杂,装配、安装和运输都十分复杂。为了保证生产以及其他环节的顺利进行,必须要有一个以计算机为基础的生产状态报告系统。因此同年ibm建立了先进管理系统aas,它能进行450个业务的操作。1968年,公司又建立了公用制造信息系统cmis,运行很成功,过去需要15周的工作,该系统

5、只用3周就可以完成。我国的管理信息系统大发展是在80年代末90年代初,国家相继建立起了“金卡”、“金关”、金桥“工程,多数企事业单位建立了局域网和广域网管理信息系统。随着世界经济和我国经济逐步向知识经济迈进,无论是基于工业经济的管理信息系统,还是面向少数专家和管理人员的专家系统 (es)或决策支持系统 (dss),其处理对象和服务对象,自身的系统结构,处理能力,都有了进一步的发展。第2章 需求分析2.1 需求概述2.1.1 系统设计目标根据所作的需求分析可以得出,图书馆管理系统实施后,本系统需要实现以下目标:(1) 界面设计友好、美观。(2) 数据存储安全、可靠。(3) 信息分类清晰、准确。(

6、4) 强大的查询功能,保证数据查询的灵活性。(5) 实现对图书借阅和归还过程的全程数据信息跟踪。(6) 提供图书借阅排行榜,为图书馆管理员提供了真实的数据信息。(7) 提供灵活、方便的权限设置功能,使整个系统的管理分工明确。(8) 具有易维护性和易操作性。2.1.2 系统功能概述根据校园用户的实际需求,本系统功能分为以下六部分:l 系统设置l 读者信息管理l 图书信息管理l 图书借阅与归还l 图书信息查询l 更改密码2.1.3 用户特点 用户为全校老师和学生,对计算机应用有一定的了解,所以尽可能提供友好、简洁的操作界面和使用提示。2.2 需求描述2.2.1 图书馆管理系统总需求目标在计算机网络

7、,数据库和先进的开发平台上,利用现有的软件,配置一定的硬件,开发一个具有开放体系结构的、易扩充的、易维护的、具有良好人机交互界面的图书馆管理系统,实现读者信息管理,图书信息管理,图书借阅与归还,图书信息查询,高效的图书馆系统。2.2.2 数据需求(1)数据录入和处理的准确性和实时性数据的输入是否准确是数据处理的前提,错误的输入会导致系统输出的不正确和不可用,从而使系统的工作失去意义。数据的输入来源是手工输入。手工输入要通过系统界面上的安排系统具有容错性。在系统中,数据的输入往往是大量的,因此系统要有一定的处理能力,以保证迅速的处理数据。(2)数据的安全性本系统为校园图书馆管理部门设计,因此只有

8、特定的图书管理者才能对数据实现增、删、改、查等操作。未获授权人员无权限操作系统。(3)数据的备份要定期对数据库中的数据进行全部或新增部分的备份工作,以保证在硬件出现故障或人为原因导致无法运行时是可以快速及时的还原到原来的正常状态。2.2.3 功能需求概述(1) 管理员能够进行系统设置(2) 管理员管理读者信息(3) 管理员管理馆内图书信息(4) 读者实现图书借阅与归还(5) 读者实现图书信息查询(6) 用户更改登陆密码2.2.4约束(constraints)计算机操作系统:windows xp/ 2003 / vista 系统软件编写环境:visual studio 2005编程语言:c#数据

9、库系统: sql server 20052.2.5系统模型(1)用例模型用例模型(use-case model)是系统既定功能及系统环境的模型,它可以作为客户和开发人员之间的契约。用例是贯穿整个系统开发的一条主线。同一个用例模型即为需求工作流程的结果,可当作分析设计工作流程以及测试工作流程的输入使用(2)参与者汇总管理员:负责管理图书信息和用户信息相关数据用 户:进行图书信息查询和图书借还(3)用例汇总管理员:设置系统使用权限;设置图书馆信息;设置书架信息;添加图书类型;修改图书类型;删除图书类型;添加图书档案信息;修改图书档案信息;删除图书档案信息;管理图书借阅信息;管理图书归还信息;图书信

10、息查询管理;图书借阅信息管理。用 户:查询图书在馆信息;查询图书借阅信息;图书借阅;图书归还。第3章 系统的设计3.1 软件模块设计3.1.1 系统模块功能概述(1) 用户登录图书馆管理系统后,进入图书馆主界面,如图3.1所示,通过此界面可看到图书借阅排行榜和读者借阅排行榜,通过排行榜可以看出借阅图书的名称、图书类型、借阅次数及借阅读者等相关信息。图3.1图书馆主界面(2) 单击“系统设置”/“图书馆信息”命令,对图书馆信息进行设置操作。单击“系统设置”/“管理员设置”命令,对管理员信息进行添加、权限设置、浏览及删除操作。单击“系统设置”/“书架管理”命令,对书架信息进行添加、修改及删除操作。

11、如图3.2、3.3、3.3所示图3.2图书馆信息图3.3权限管理图3.4书架管理(3) 单击“读者管理”/“读者类型管理”命令,对读者类型信息进行添加、修改及删除操作。如图3.5所示图3.5读者类型管理(4) 单击“读者管理”/“读者档案管理”命令,对读者信息进行添加、修改、查看及删除操作。如图3.6所示图3.6读者档案管理(5) 单击“图书管理”/“图书类型管理”命令,对图书类型进行添加、修改及删除操作。如图3.7所示 图3.7图书类型管理 (6) 单击“图书管理”/“图书档案管理”命令,对图书信息进行添加、修改及删除操作。如图3.8所示图3.8图书档案管理(7) 单击“图书借还”/“图书借

12、阅”命令,对图书借阅信息添加操作。如图3.9所示图3.9图书借阅(8) 单击“图书借还”/“图书归还”命令,对图书归还信息进行添加操作。如图3.10所示图3.10图书归还(9) 单击“图书查询”/“图书信息查询”命令,对图书档案信息进行查询操作。如图3.11所示图3.11图书信息查询(10) 单击“图书查询”/“借阅信息查询”命令,对借阅的图书信息进行查询操作。如图3.12所示图3.12借阅信息查询(11) 单击“更改密码”按钮,对当前的用户密码进行修改操作。如图3.13所示图3.13更改密码(12) 单击“退出系统”按钮,退出当前操作系统。如图3.14所示图3.14退出系统3.1.2 系统管

13、理流程3.2 数据库设计3.2.1 数据库分析在开发应用程序时,对数据库的操作时必不可少的,一个数据库的设计优秀与否,将直接影响到软件的开发进度和性能。图书馆管理系统的需求主要包括对图书信息的管理,其中包括基本信息和存档信息;对图书的借阅和归还管理,其中包括图书借阅信息和图书归还信息;对用户档案信息的管理,其中包括基本信息和借阅信息。3.2.2 数据库概念设计数据库设计是系统设计过程中的重要组成部分,它是通过管理系统的整体需求而制定的。下面对本系统中具有代表性的数据库设计进行详细说明。在开发图书馆管理系统时,最重要的是图书信息管理和用户档案信息。在用户档案信息中又分为基本信息、借阅信息,本系统

14、提供了用户借阅信息查询功能,因此需要设计出用户档案信息的e-r图。本系统提供了图书信息查询功能,因此需要设计出图书信息的e-r图。由于信息多而复杂,这里只给出关键信息。用户档案信息表e-r图如图3.15所示;图书信息表e-r图如图3.16所示。用户信息姓 名性 别读者编号证件类型可借数量证件号码读者类型图3.15 用户档案信息表e-r图图书信息条形码图书名称图书类型出版社书架库存数量入馆时间图3.16图书信息表e-r图3.2.3 数据库逻辑结构设计数据库概念设计中已经分析了图书信息,用户信息主要数据实体对象,这些实体对象是数据表结构的基本模型,最终的数据模型都要实施到数据库中,形成整体的数据结

15、构。可以使用powerdesigner工具完成这个数据库的建模。3.3代码设计3.3.1 用户登陆功能代码实现界面如下:如图3.12所示图3.17登录系统代码如下:public partial class login : system.web.ui.page operatorclass operatorclass = new operatorclass(); adminmanage adminmanage = new adminmanage(); readermanage readermanage = new readermanage(); protected void page_load(o

16、bject sender, eventargs e) /单击登陆按钮事件 protected void btnlogin_click(object sender, eventargs e) if (txtadmin.text = string.empty) response.write("<script>alert('管理员名称不能为空!')</script>"); return; else dataset adminds = null; dataset readerds = null; adminmanage.name = txta

17、dmin.text; adminmanage.pwd = txtpwd.text; adminds = adminmanage.login(adminmanage); readermanage.id=txtpwd.text; readermanage.name=txtadmin.text; readerds=readermanage.readerlogin(readermanage); if (adminds.tables0.rows.count > 0 && txtcode.text = request.cookies"checkcode".valu

18、e) session"name" = txtadmin.text; response.redirect("index/default.aspx"); else if (readerds.tables0.rows.count > 0 && txtcode.text = request.cookies"checkcode".value) session"name" = txtadmin.text; session"readid" = txtpwd.text; session&q

19、uot;role" = "reader" response.redirect("index/default.aspx"); else response.write("<script>alert('登录名或密码不正确!')</script>"); /单击取消按钮事件 protected void btncancel_click(object sender, eventargs e) txtadmin.text = txtpwd.text = txtcode.text = string.e

20、mpty; 3.3.2查询功能代码实现代码如下:public partial class sysquery_bookquery : system.web.ui.page bookmanage bookmanage = new bookmanage(); protected void page_load(object sender, eventargs e) this.title = "图书信息查询页面" if (!ispostback) gvbind(); protected void btnquery_click(object sender, eventargs e) g

21、vbind(); protected void gvbookinfo_pageindexchanging(object sender, gridviewpageeventargs e) gvbookinfo.pageindex = e.newpageindex; gvbind(); protected void gvbind() dataset ds = null; int intcondition = ddlcondition.selectedindex; if (txtcondition.text = "") ds = bookmanage.getallbook(&qu

22、ot;tb_bookinfo"); else switch (intcondition) case 0: bookmanage.bookcode = txtcondition.text; ds = bookmanage.findbookbycode(bookmanage, "tb_bookinfo"); break; case 1: bookmanage.bookname = txtcondition.text; ds = bookmanage.findbookbyname(bookmanage, "tb_bookinfo"); break;

23、case 2: bookmanage.type = txtcondition.text; ds = bookmanage.findbookbytype(bookmanage, "tb_bookinfo"); break; case 3: bookmanage.author = txtcondition.text; ds = bookmanage.findbookbyauthor(bookmanage, "tb_bookinfo"); break; case 4: bookmanage.pubname = txtcondition.text; ds = b

24、ookmanage.findbookbypub(bookmanage, "tb_bookinfo"); break; case 5: bookmanage.bcase = txtcondition.text; ds = bookmanage.findbookbybcase(bookmanage, "tb_bookinfo"); break; gvbookinfo.datasource = ds; gvbookinfo.databind(); 3.3.3插入功能代码实现代码如下:public partial class bookmanage_addbook

25、 : system.web.ui.page validateclass validate=new validateclass(); bookcasemanage bookcasemanage = new bookcasemanage(); btypemanage btypemanage = new btypemanage(); bookmanage bookmanage = new bookmanage(); protected void page_load(object sender, eventargs e) this.title = "添加/修改图书信息页面" if

26、(!ispostback) dataset bcaseds = bookcasemanage.getallbcase("tb_bookcase"); ddlbcase.datasource = bcaseds; ddlbcase.datatextfield = "name" ddlbcase.databind(); dataset btypeds = btypemanage.getallbtype("tb_booktype"); ddlbtype.datasource = btypeds; ddlbtype.datatextfield

27、 = "typename" ddlbtype.databind(); if (request"bookcode" = null) btnadd.enabled = true; txtintime.text = datetime.now.toshortdatestring(); else btnsave.enabled = true; txtbcode.readonly = txtbname.readonly = true; txtbcode.text = request"bookcode".tostring(); bookmanage

28、.bookcode = txtbcode.text; dataset bookds = bookmanage.findbookbycode(bookmanage,"tb_bookinfo"); txtbname.text = bookds.tables0.rows01.tostring(); ddlbtype.selectedvalue = bookds.tables0.rows02.tostring(); txtauthor.text = bookds.tables0.rows03.tostring(); txttranslator.text = bookds.table

29、s0.rows04.tostring(); txtpub.text = bookds.tables0.rows05.tostring(); txtprice.text = bookds.tables0.rows06.tostring(); txtpage.text = bookds.tables0.rows07.tostring(); ddlbcase.selectedvalue = bookds.tables0.rows08.tostring(); txtstorage.text = bookds.tables0.rows09.tostring(); txtintime.text = boo

30、kds.tables0.rows010.tostring(); txtoper.text = bookds.tables0.rows011.tostring(); /单击添加按钮事件 protected void btnadd_click(object sender, eventargs e) validatefun(); bookmanage.bookcode = txtbcode.text; if (bookmanage.findbookbycode(bookmanage, "tb_bookinfo").tables0.rows.count > 0) bookma

31、nage.bookname = txtbname.text; bookmanage.type = ddlbtype.selectedvalue; bookmanage.author = txtauthor.text; bookmanage.translator = txttranslator.text; bookmanage.pubname = txtpub.text; bookmanage.price = convert.todecimal(txtprice.text); bookmanage.page = convert.toint32(txtpage.text); bookmanage.

32、bcase = ddlbcase.selectedvalue; bookmanage.storage = convert.toint32(txtstorage.text) + convert.toint32(bookmanage.findbookbycode(bookmanage, "tb_bookinfo").tables0.rows09.tostring(); bookmanage.intime = convert.todatetime(txtintime.text); bookmanage.oper = txtoper.text; bookmanage.updateb

33、ook(bookmanage); else bookmanage.bookname = txtbname.text; bookmanage.type = ddlbtype.selectedvalue; bookmanage.author = txtauthor.text; bookmanage.translator = txttranslator.text; bookmanage.pubname = txtpub.text; bookmanage.price = convert.todecimal(txtprice.text); bookmanage.page = convert.toint3

34、2(txtpage.text); bookmanage.bcase = ddlbcase.selectedvalue; bookmanage.storage = convert.toint32(txtstorage.text); bookmanage.intime = convert.todatetime(txtintime.text); bookmanage.oper = txtoper.text; bookmanage.addbook(bookmanage); response.redirect("bookmanage.aspx");/单击保存按钮事件 protecte

35、d void btnsave_click(object sender, eventargs e) validatefun(); bookmanage.bookcode = txtbcode.text; bookmanage.bookname = txtbname.text; bookmanage.type = ddlbtype.selectedvalue; bookmanage.author = txtauthor.text; bookmanage.translator = txttranslator.text; bookmanage.pubname = txtpub.text; bookma

36、nage.price = convert.todecimal(txtprice.text); bookmanage.page = convert.toint32(txtpage.text); bookmanage.bcase = ddlbcase.selectedvalue; bookmanage.storage = convert.toint32(txtstorage.text); bookmanage.intime = convert.todatetime(txtintime.text); bookmanage.oper = txtoper.text; bookmanage.updateb

37、ook(bookmanage); response.redirect("bookmanage.aspx");/单击取消按钮事件 protected void btncancel_click(object sender, eventargs e) txtintime.text = datetime.now.toshortdatestring(); txtbname.text = txtauthor.text = txttranslator.text = txtpub.text = txtprice.text = txtpage.text = txtstorage.text =

38、 txtoper.text = string.empty; response.redirect("bookmanage.aspx"); protected void validatefun() if (txtbcode.text = "") response.write("<script>alert('图书条形码不能为空!');location='javascript:history.go(-1)'</script>"); return; if (txtbname.text =

39、"") response.write("<script>alert('图书名称不能为空!');location='javascript:history.go(-1)'</script>"); return; if (!validate.validatenum(txtprice.text) response.write("<script>alert('图书价格输入有误!');location='javascript:history.go(-1)'&

40、lt;/script>"); return; if (!validate.validatenum(txtpage.text) response.write("<script>alert('图书页码输入有误!');location='javascript:history.go(-1)'</script>"); return; if (!validate.validatenum(txtstorage.text) response.write("<script>alert('图书

41、库存量输入有误!');location='javascript:history.go(-1)'</script>"); return; 3.3.4修改/删除功能代码实现代码如下:public partial class readermanage_rtypemanage : system.web.ui.page rtypemanage rtypemanage = new rtypemanage(); protected void page_load(object sender, eventargs e) this.title = "查看读者

42、类型页面" if (!ispostback) gvbind(); protected void gvrtypeinfo_pageindexchanging(object sender, gridviewpageeventargs e) gvrtypeinfo.pageindex = e.newpageindex; gvbind(); protected void gvrtypeinfo_rowediting(object sender, gridviewediteventargs e) gvrtypeinfo.editindex = e.neweditindex; gvbind();

43、 protected void gvrtypeinfo_rowupdating(object sender, gridviewupdateeventargs e) rtypemanage.id = convert.toint32(gvrtypeinfo.datakeyse.rowindex.value.tostring(); rtypemanage.name = (textbox)(gvrtypeinfo.rowse.rowindex.cells1.controls0).text; rtypemanage.number = convert.toint32(textbox)(gvrtypeinf

44、o.rowse.rowindex.cells2.controls0).text); rtypemanage.updatertype(rtypemanage); gvrtypeinfo.editindex = -1; gvbind(); protected void gvrtypeinfo_rowcancelingedit(object sender, gridviewcancelediteventargs e) gvrtypeinfo.editindex = -1; gvbind(); protected void gvrtypeinfo_rowdeleting(object sender,

45、gridviewdeleteeventargs e) rtypemanage.id = convert.toint32(gvrtypeinfo.datakeyse.rowindex.value.tostring(); rtypemanage.deletertype(rtypemanage); response.write("<script>alert('读者类型信息删除成功')</script>"); gvbind(); private void gvbind() dataset ds = rtypemanage.getallrtyp

46、e("tb_readertype"); gvrtypeinfo.datasource = ds; gvrtypeinfo.datakeynames = new string "id" ; gvrtypeinfo.databind(); 第4章 图书管理系统的实现整个系统除了用户登录外,主要有首页模块、系统设置模块、读者管理模块、图书管理模块、图书借还模块、图书查询模块、更改密码、退出系统八个模块。通过本系统,读者可以方便的对书目进行检索和阅览,轻轻松松就可尽览群书。4.1 用户登录模块的实现功能:本模块主要用于对用户身份进行鉴别。用户通过表单提供用户名和

47、密码信息,系统根据用户提供的登录信息对用户进行身份查询鉴别。如果身份合法,则将用户导向系统的主页面并记录用户的相关信息,留待以后的系统页面使用。输入:用户名、密码处理:(1) 输入用户的登录信息。在页面提供的表单出输入用户的用户名和密码信息,点击“登录”按钮提交表单信息到身份验证页面。或点击“重填”按钮,重新输入。(2) 从form表单获取输入数据。 当用户单击“登录”按钮后,登录信息由form表单提交到logon.asp进行处理。(3) 用户身份进行验证。连接数据库,打开用户数据表usertype,检验用户登录信息。以输入数据“用户名”为查询条件创建数据集查看输入用户名是否存在。如果存在,继

48、续检验输入的密码是否正确。密码和用户名都正确,则进入图书馆主页面frame.asp;如果用户名不存在或密码不正确,则给出登录失败的提示框,并返回首页重新登录。输出:图书馆主页面模块所使用的数据表本页面使用了library.mdb数据库中的用户信息表(usertype)。4.2首页模块的实现本系统的主页面使用了框架结构。使用框架(frames)结构设计的html文件,能够将整个窗口分成几个独立的小窗口,每个窗口可以分别载入不同的文件。框架的主要优点是独立显示内容,能直观的分开内容。可以在一个框架中定义链接,在另一个框架中显示内容或触发操作,而不必从重设计整个屏幕。框架不能单独存在,而要用框架组来

49、定义。框架组用<frameset>标签定义,框架用<frame>标签定义。首页frame的代码如下:public partial class login : system.web.ui.page operatorclass operatorclass = new operatorclass(); adminmanage adminmanage = new adminmanage(); readermanage readermanage = new readermanage(); protected void page_load(object sender, eventargs e)从以上代码可以看出,整个页面分为2个frame。顶部为菜单页面,下面是显示页面。在系统运行过程中,顶部菜单页面一直都是显示状态,方便用户在不同的功能模块之间切换;显示页面则根据顶部菜单显示不同的阅读内容。4.3 系统设置模块的实现功能:用户进入此页面后,所有的系统信息将会显示出来,用户可以看到系统的各种信息并加以修改,点击系统设置,就可以进一步查询与修改系统信息的具体内容。输入:点击系统设置的超链接文本处理:(1) 构造页面格式。使用表格标签构造页面表单,构造放置各个字段及字段值的表单,美化页面。(2) 连接数据库。与数据库创建链接,使用sql语言在数据库中

温馨提示

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

评论

0/150

提交评论