图书馆管理系统ER图

发布时间:2020-04-04 13:12:30   来源:文档文库   
字号:

长沙理工大学

《程序设计实践》课程设计报告

邹松林

计通学院 计算机科学与技术

计算机03-05 27

学生姓名 邹松林 指导教师 卢曼莎

课程成绩 完成日期 2006920

图书馆管理系统数据库分析与设计

学生姓名:邹松林 指导老师:卢曼莎

摘要 图书信息管理系统主要由读者信息管理模块,图书信息管理模块,借阅信息管理模块,系统信息管理模块等组成。其中又各自分成读者注册,证件修改,用户注销,图书查询,操作记录等子模块。在设计本系统过程中,我们第一步由自顶而下的需求分析概括设计出系统总模块的数据流图,再设计个子模块的相应数据流图,列出数据流信息及数据字典;第二步概念设计在需求分析基础上用E-R图表示出数据及相互间联系,采用先作子图,再合并成初步E-R图,进行修改和重构后得到基本E-R图;第三步逻辑设计,在SQL Server的设计环境下把图书馆管理系统E-R图转化为成逻辑数据模型表示的逻辑模式,同时实现数据模型的优化和数据模式的规范化;第四步进行物理设计设计数据的内模式,确定数据的存储结构,存取路径,存储空间分配等等,具体形式为表,视图,索引的建立。

关键数据库,SQL语言,MS SQL Server,图书管理

1 需求分析

用户的需求具体体现在各种信息的提供、保存、更新和查询,这就要求数据库结构能充分满足各种信息的输入和输出。收集基本数据,数据结构以及数据处理的流程,为后面的具体设计打下基础。

在仔细分析调查有关图书馆管理信息需求的基础上,我们主要考虑以下几个方面的需求:

1) 用户需求:图书用户要求计算机系统和SQL Server所工作的范围;

2) 应用资源:数据库应用的平台包括物理平台和图书等;

3) 应用质量和可靠性要求:包括操作人员素质和系统的纠错能力等

项目名称: 图书馆信息管理系统

项目背景和内容概要

对图书馆管理信息系统进行详细地分析后,我们将系统分为以下几个模块:借阅管理模块、借书证信息管理模块、图书信息管理模块、系统管理模块。其主要功能如下:

借阅管理模块主要功能如下:

1).可以为读者办理,修改,注销借书证,输入读者借书证基本信息等,定制读者的借阅权限。

2).可以通过借书证查询图书信息、借出图书信息,借阅图书。

3).通过借书证还书,管理员可以通过对借阅信息的管理对到期还未还的书,通过查询读者的借书证信息查询读者联系方式发出催还通知。

借书证信息管理模块主要功能如下:

1).读者基本信息的输入,如:读者姓名、性别、单位等。

2).读者信息的修改、注销等功能。

3).添加新的读者及其信息等。

图书信息管理模块主要功能如下:

1).定制书籍的各种信息管理,如:书名、作者、出版信息等。

2).书籍信息的修改,新图书的入库管理和图书的注销等。

系统管理模块主要功能如下:

1).用户登录。

2).修改密码。

3).添加用户。

系统备份和数据传输模块主要功能如下:

1).备份数据库数据

2).恢复数据库数据

3).网络数据传输

13 数据流图

数据流总体图示

1-1 数据流总体图

办理借书证

1-2 输借书证流图

借书证修改

1-3 借书证修改流图

借书证注销

1-4借书证注销流图

借书系统

1-5借书系统流图

检索系统

1-6 检索系统流图

还书系统

1-7 还书系统流图

图书档案管理系统

1-8 档案管理流图

数据字典

1数据字典

2 概念结构设计

这一阶段我们将客户的应用需求抽象为信息世界的结构,即对系统的人、物、事和概念进行人为处理,抽取人们所关心的共同特性,同时把这些特性用概念精确的描述。我们首先根据需求分析的结果(数据流图、数据字典等)对现实世界的数据进行抽象,设计各个局部E-R图,然后合并成初步E-R图,再进行修改与重构。

局部E-R

图书信息管理系统主要分为以下几个局部E-R图:

1).借书证处理系统ER图:

word/media/image2.gif

2-1 借书证处理系统ER

图中各实体属性如下:

读者档案:学号,读者姓名,性别,出生日期,借书证号,职业,单位,通讯地址,邮政编码,联系电话

借书证:借书证号,姓名,性别,办证日期,借阅范围,最大借书量,照片,身份证号

管理员:管理员编号,管理员姓名,登陆密码

2).借书系统ER图:

word/media/image3.gif

2-2借书系统ER

图中各实体属性如下:

读者:身份证号,读者姓名,借书证号

借书证:借书证号,姓名,性别,办证日期(借阅范围,最大借书量,照片,身份证号)

库存信息:书号,图书编号

借出信息:图书编号,借书证号,借书日期,归还日期

3).索书系统ER

word/media/image4.gif

2-3索书系统ER

图中各实体属性如下:

读者:读者姓名,借书证号

图书档案:图书编号,书号,书名,作者,出版单位,出版日期,单价,藏书册书,类别,入库日期

4).还书系统ER图:

word/media/image5.gif

2-4 还书系统ER

图中各实体属性如下:

读者:学号,读者姓名,借书证号

借书证:借书证号,姓名,性别,办证日期

库存信息:书号,图书编号

借出信息:图书编号,借书证号,借书日期,归还日期

管理员:操作员编号,管理员姓名,登陆密码

5).图书档案管理系统ER图:

word/media/image6.gif

2-5 档案管理系统ER

图中各实体属性如下:

管理员:操作员编号,管理员姓名,登陆密码

库存信息:书号,图书编号

图书档案:图书编号,书号,书名,作者,出版单位,出版日期,单价,类别,入库日期

入库清单:入库日期,图书编号,管理员编号,书名

6). 整体E-R

word/media/image7.gif

2-6 整体ER

图中各实体属性如下:

读者档案:学号,读者姓名,性别,借书证号,单位

借书证:借书证号,姓名,性别,办证日期

管理员:操作员编号,管理员姓名,登陆密码

库存信息:书号,图书编号

借出信息:图书编号,借书证号,借书日期,归还日期

图书档案:书号,书名,作者,出版单位,出版日期,单价,类别,藏书册书,图书编号入库日期

实体描述

说明:1、由于读者的信息可以在借书证办理档案中查到所以合并为借书证办理档案

2. 将借出书库和入库清单分别合并到了借书登记表和图书信息表中

2 实体描述

关系描述 (已包含在E-R图中)

实体--关系调整 (实体描述表中已消除冗余实体和关系)

数据项定义

1).图书库的数据项定义:

3 图书库数据项定义

2).借、还书库的数据项定义:

4借、还书库数据项定义

3).借书证库的数据项定义:

5借书证库数据项定义

4).操作员库的数据项定义:

6操作员库数据项定义

数据表(库)描述

图书数据库=图书书名+图书编号+着者+出版社+单价+书号+出版时间

借书库=姓名+借书证号++教师姓名+图书名称+借书日期+还书日期

教师数据库=姓名+借书证号+单位

操作员库=操作员用户名+口令

系统功能模块图

软件功能结构图

2-7 软件功能结构

系统流程图:

2-8 系统流程图

3 逻辑结构设计

为了能够用计算机和SQL Server实现用户需求,可将概念结构转化为相应的数据模型,即是设计逻辑结构。即由ER图建立了适当的表,并按不同的范式的定义,对表进行规范化。对规范化的表,更据用户需求建立数据库结构。

确定数据依赖

数据依赖的优化与调整

3.2.1关系模式的优化

(1) 借书证信息:借书证 (借书证号,姓名,性别,单位,发证日期,已借书册书,是否容许借书) 满足 BCNF范式

(2) 管理员信息:管理员信息(管理员编号,管理员姓名,登陆密码)满足 BCNF 范式

(3) 库存信息:库存信息(图书编号,书号) 满足BCNF 范式

(4) 借书信息:借书信息(图书编号借书证号,姓名,书名,借书日期,是否归还)满足 BCNF 范式

(5) 还书信息:还书信息(姓名,图书编号,书名,借出日期,还书日期)满足 BCNF 范式

(6) 图书信息:图书档案(图书编号,书名,作者,图书类别,单价,出版社,进册书,库存量)均满足 BCNF范式

(7) 入库清单:入库清单(图书编管理员编号,书名,入库日期)满足 BCNF范式

3.2.2关系模式的调整

虽然在关系模式的优化中将各种关系满足了BCNF范式的要求,但是对某些数据库的操作却并没有简化,相反导致了数据库查询等数据库操作的效率低下。于是对‘借书证信息’,和‘图书信息’作出了以下调整。

(1) 借书证信息:借书证(借书证号,姓名,性别,办证日期,单位,已借书册数,借书许可,)(3NF

(2) 图书信息: 图书档案(图书编号书名,作者,出版单位,单价,图书类别,进册数,入库量 (2NF)

4 代码设计

图书管理系统部分源代码

[图书外借情况查询代码]

tempstr="%"+tempstr+"%"

借书证号"

select * from 借书登记表 where 借书登记表.借书证号 like tempstr into cursor tempcursor

endif

姓名"

select * from 借书登记表 where 借书登记表.姓名 like tempstr into cursor tempcursor

endif

图书编号"

select * from 借书登记表 where 借书登记表.图书编号 like tempstr into cursor tempcursor

endif

书名"

select * from 借书登记表 where 借书登记表.书名 like tempstr into cursor tempcursor

endif

是否归还"

select * from 借书登记表 where 借书登记表.是否归还 like tempstr into cursor tempcursor

endif

[图书外借和归还情况查询代码]

tempstr="%"+tempstr+"%"

借书证号"

select * from 还书登记表 where 还书登记表.借书证号 like tempstr into cursor tempcursor

endif

姓名"

select * from 还书登记表 where 还书登记表.姓名 like tempstr into cursor tempcursor

endif

图书编号"

select * from 还书登记表 where 还书登记表.图书编号 like tempstr into cursor tempcursor

endif

书名"

select * from 还书登记表 where 还书登记表.书名 like tempstr into cursor tempcursor

endif

[存储过程代码]

procedure ridelete

local llretval

llretval=.t.

if (isrlocked() and !deleted()) or !rlock()

llretval=.f.

else

if !deleted()

delete

if cursorgetprop('buffering') > 1

=tableupdate()

endif

llretval=pnerror=0

endif not already deleted

endif

unlock record (recno())

return llretval

procedure riupdate

lparameters tcfieldname,tcnewvalue,tccascadeparent

local llretval

llretval=.t.

if isrlocked() or !rlock()

llretval=.f.

else

if eval(tcfieldname)<>tcnewvalue

private pccascadeparent

pccascadeparent=upper(iif(type("tccascadeparent")<>"c","",tccascadeparent))

replace (tcfieldname) with tcnewvalue

if cursorgetprop('buffering') > 1

=tableupdate()

endif

llretval=pnerror=0

endif values don't already match

endif it's locked already, or i was able to lock it

unlock record (recno())

return llretval

procedure rierror

parameters tnerrno,tcmessage,tccode,tcprogram

local lnerrorrows,lnxx

lnerrorrows=alen(gaerrors,1)

if type('gaerrors[lnerrorrows,1]')<>"l"

dimension gaerrors[lnerrorrows+1,alen(gaerrors,2)]

lnerrorrows=lnerrorrows+1

endif

gaerrors[lnerrorrows,1]=tnerrno

gaerrors[lnerrorrows,2]=tcmessage

gaerrors[lnerrorrows,3]=tccode

gaerrors[lnerrorrows,4]=""

lnxx=1

do while !empty(program(lnxx))

gaerrors[lnerrorrows,4]=gaerrors[lnerrorrows,4]+","+;

program(lnxx)

lnxx=lnxx+1

enddo

gaerrors[lnerrorrows,5]=pcparentdbf

gaerrors[lnerrorrows,6]=pnparentrec

gaerrors[lnerrorrows,7]=pcparentid

gaerrors[lnerrorrows,8]=pcparentexpr

gaerrors[lnerrorrows,9]=pcchilddbf

gaerrors[lnerrorrows,10]=pnchildrec

gaerrors[lnerrorrows,11]=pcchildid

gaerrors[lnerrorrows,12]=pcchildexpr

return tnerrno

procedure riopen

parameters tctable,tcorder

local lccurwkarea,lcnewwkarea,lninusespot

lninusespot=atc(tctable+"*",pcricursors)

if lninusespot=0

lccurwkarea=select()

select 0

lcnewwkarea=select()

if not empty(tcorder)

use (tctable) again order (tcorder) ;

alias ("__ri"+ltrim(str(select()))) share

else

use (tctable) again alias ("__ri"+ltrim(str(select()))) share

endif

if pnerror=0

pcricursors=pcricursors+upper(tctable)+"?"+str(select(),5)

else

lcnewwkarea=0

endif something bad happened while attempting to open the file

else

lcnewwkarea=val(substr(pcricursors,lninusespot+len(tctable)+1,5))

pcricursors = strtran(pcricursors,upper(tctable)+"*"+str(lcnewwkarea,5),;

upper(tctable)+"?"+str(lcnewwkarea,5))

if not empty(tcorder)

set order to (tcorder) in (lcnewwkarea)

endif sent an order

if pnerror<>0

lcnewwkarea=0

endif something bad happened while setting order

endif

return (lcnewwkarea)

procedure riend

parameters tlsuccess

local lnxx,lnspot,lcworkarea

if tlsuccess

end transaction

else

set deleted off

rollback

set deleted on

endif

if empty(pcriolderror)

on error

else

on error &pcriolderror.

endif

for lnxx=1 to occurs("*",pcricursors)

lnspot=atc("*",pcricursors,lnxx)+1

use in (val(substr(pcricursors,lnspot,5)))

endfor

if pcoldcompat = "on"

set compatible on

endif

if pcolddele="off"

set deleted off

endif

if pcoldexact="on"

set exact on

endif

if pcoldtalk="on"

set talk on

endif

do case

case empty(pcolddbc)

set data to

case pcolddbc<>dbc()

set data to (pcolddbc)

endcase

return .t.

procedure rireuse

*

parameters tctablename,tcwkarea

pcricursors = strtran(pcricursors,upper(tctablename)+"?"+str(tcwkarea,5),;

upper(tctablename)+"*"+str(tcwkarea,5))

return .t.

********************************************************************************

** "参照完整性删除触发器" 借书证信息表

procedure __ri_delete_借书证信息表

local llretval

llretval = .t.

private pcparentdbf,pnparentrec,pcchilddbf,pnchildrec,pcparentid,pcchildid

private pcparentexpr,pcchildexpr

store "" to pcparentdbf,pcchilddbf,pcparentid,pcchildid,pcparentexpr,pcchildexpr

store 0 to pnparentrec,pnchildrec

if _triggerlevel=1

begin transaction

private pcricursors,pcriwkareas,pcriolderror,pnerror,;

pcolddele,pcoldexact,pcoldtalk,pcoldcompat,pcolddbc

pcoldtalk=set("talk")

set talk off

pcolddele=set("deleted")

pcoldexact=set("exact")

pcoldcompat=set("compatible")

set compatible off

set deleted on

set exact off

pcricursors=""

pcriwkareas=""

pcriolderror=on("error")

pnerror=0

on error pnerror=rierror(error(),message(),message(1),program())

if type('gaerrors(1)')<>"u"

release gaerrors

endif

public gaerrors(1,12)

pcolddbc=dbc()

set data to ("tsglxt")

endif first trigger

local lcparentid && parent's value to be sought in child

local lcchildwkarea && child work area handle returned by riopen

local lcparentwkarea

local lldelheaderarea

lcstartarea=select()

llretval=.t.

lcparentwkarea=select()

select (lcparentwkarea)

pcparentdbf=dbf()

pnparentrec=recno()

store 借书证号 to lcparentid,pcparentid

pcparentexpr="借书证号"

lcchildwkarea=riopen("还书登记表","借书证号")

if lcchildwkarea<=0

if _triggerlevel=1

do riend with .f.

endif at the end of the highest trigger level

return .f.

endif not able to open the child work area

pcchilddbf=dbf(lcchildwkarea)

llretval=!seek(lcparentid,lcchildwkarea)

select (lcchildwkarea)

pnchildrec=recno()

pcchildid=借书证号

pcchildexpr="借书证号"

if !llretval

do rierror with -1,"违反删除限制规则。","",""

endif

=rireuse("还书登记表",lcchildwkarea)

if not llretval

if _triggerlevel=1

do riend with llretval

endif at the end of the highest trigger level

select (lcstartarea)

return llretval

endif

if _triggerlevel=1

do riend with llretval

endif at the end of the highest trigger level

select (lcstartarea)

return llretval

** "结束参照完整性删除触发器" 借书证信息表

*********************************************************************

procedure __ri_update_借书证信息表

** "参照完整性更新触发器" 借书证信息表

local llretval

llretval = .t.

private pcparentdbf,pnparentrec,pcchilddbf,pnchildrec,pcparentid,pcchildid

private pcparentexpr,pcchildexpr

store "" to pcparentdbf,pcchilddbf,pcparentid,pcchildid,pcparentexpr,pcchildexpr

store 0 to pnparentrec,pnchildrec

if _triggerlevel=1

begin transaction

private pcricursors,pcriwkareas,pcriolderror,pnerror,;

pcolddele,pcoldexact,pcoldtalk,pcoldcompat,pcolddbc

pcoldtalk=set("talk")

set talk off

pcolddele=set("deleted")

pcoldexact=set("exact")

pcoldcompat=set("compatible")

set compatible off

set deleted on

set exact off

pcricursors=""

pcriwkareas=""

pcriolderror=on("error")

pnerror=0

on error pnerror=rierror(error(),message(),message(1),program())

if type('gaerrors(1)')<>"u"

release gaerrors

endif

public gaerrors(1,12)

pcolddbc=dbc()

set data to ("tsglxt")

endif first trigger

local lcparentid && parent's value to be sought in child

local lcoldparentid && previous parent id value

local lcchildwkarea && child work area handle returned by riopen

local lcchildid && child's value to be sought in parent

local lcoldchildid && old child id value

local lcparentwkarea && parentwork area handle returned by riopen

local lcstartarea

lcstartarea=select()

llretval=.t.

lcparentwkarea=select()

select (lcparentwkarea)

pcparentdbf=dbf()

pnparentrec=recno()

lcoldparentid=oldval("借书证号")

pcparentid=lcoldparentid

pcparentexpr="借书证号"

lcparentid=借书证号

if lcparentid<>lcoldparentid

lcchildwkarea=riopen("还书登记表")

if lcchildwkarea<=0

if _triggerlevel=1

do riend with .f.

endif at the end of the highest trigger level

select (lcstartarea)

return .f.

endif not able to open the child work area

pcchilddbf=dbf(lcchildwkarea)

select (lcchildwkarea)

scan for 借书证号=lcoldparentid

pnchildrec=recno()

pcchildid=借书证号

pcchildexpr="借书证号"

if not llretval

exit

endif && not llretval

llretval=riupdate("借书证号",lcparentid,"借书证信息表")

endscan get all of the 还书登记表 records

=rireuse("还书登记表",lcchildwkarea)

if not llretval

if _triggerlevel=1

do riend with llretval

endif at the end of the highest trigger level

select (lcstartarea)

return llretval

endif

endif this parent id changed

if _triggerlevel=1

do riend with llretval

endif at the end of the highest trigger level

select (lcstartarea)

return llretval

** "结束参照完整性更新触发器" 借书证信息表

********************************************************************************

5 数据库系统性能评价

在需求分析部分,我认真阅读了图书管理系统的功能简述,在此基础上把整个系统按处理功能分解成若干模块,进行数据分解,画出了总系统和各模块的数据流图、数据项表、数据结构表、数据流表等。得到的需求分析的主要结果,基本反映了用户的需求。

在概念结构设计时,采用自底向上的设计方法。将数据流程图中的子图抽象为E-R图,然后再合并各个分E-R图。设计出的整体概念结构内部具有一致性,不但能满足需求分析阶段确定的所有要求,而且能准确反映原来的每个子视图的结构。并且给出了各个实体的描述,对实体和关系进行了调整,消除了冗余实体和冗余关系。

在逻辑结构设计时,选择SQL Server 所支持的数据模型,适于描述和表达概念结构的。我们遵循一定原则进行实体、属性和联系的转换。优化了关系数据模型,根据具体的应用确定范式和关系模式的分解与合并。确定了外模式和数据视图。

在物理结构设计时,设计的存储结构和存储方法考虑到了用户的应用环境情况,为了缩短响应时间优化数据库的访问,建立了经常查询的属性的索引。并且对数据库表进行了存储空间分配和划分了用户角色及每个角色的权限,系统安全性提高。

最后在数据库实施设计阶段,在具体的DBMS下创建库,表,视图,建索引,授权及完整性约束。

通过不断修改完善,我们所设计的图书管理数据库系统,符合关系数据库的基本体系结构,达到关系数据库的标准。

本软件对录入的数据进行较高的数据精度限制.且本软件响应时间较稳定,能帮助用户建立稳定的工作节奏,足够满足用户的需求。

6 结束语

数据库系统评价分析

在需求分析部分,我们认真阅读了图书管理系统的功能简述,在此基础上把整个系统按处理功能分解成若干模块,进行数据分解,画出了总系统和各模块的数据流图、数据项表、数据结构表、数据流表等。我们得到的需求分析的主要结果,基本反映了用户的需求。

在概念结构设计时,我们采用自底向上的设计方法。将数据流程图中的子图抽象为E-R图,然后再合并各个分E-R图。设计出的整体概念结构内部具有一致性,不但能满足需求分析阶段确定的所有要求,而且能准确反映原来的每个子视图的结构。并且给出了各个实体的描述,对实体和关系进行了调整,消除了冗余实体和冗余关系。

在逻辑结构设计时,我们选择SQL Server 所支持的数据模型,适于描述和表达概念结构的。我们遵循一定原则进行实体、属性和联系的转换。优化了关系数据模型,根据具体的应用确定范式和关系模式的分解与合并。确定了外模式和数据视图。

在物理结构设计时,我们设计的存储结构和存储方法考虑到了用户的应用环境情况,为了缩短响应时间优化数据库的访问,建立了经常查询的属性的索引。并且对数据库表进行了存储空间分配和划分了用户角色及每个角色的权限,系统安全性提高。

最后在数据库实施设计阶段我们在具体的DBMS下创建库,表,视图,建索引,授权及完整性约束。

通过不断修改完善,我们所设计的图书管理数据库系统,符合关系数据库的基本体系结构,达到关系数据库的标准。

小结

通过这次课程设计,了解了设计一个数据库系统的复杂性和对综合知识要求较高。因此在设计阶段我们查阅了很多资料,加深了对数据库知识的认识。在设计过程中,在需求分析、数据库概念模型设计、数据库逻辑模型设计、数据库实施设计阶段和同学进行了反复的讨论、研究逐渐完善了整个图书数据库管理系统。

在需求分析阶段,我对各种各样的客户的信息需求、处理需求、安全性与完整性需求进行了分析,绘制了数据流图;建立了数据项表、数据结构表、数据流表、数据存储表和处理过程表。

在概念模型设计阶段,根据需求分析情况,设计出相应的局部E-R数据模型,根据不同的实体之间的联系,分为1:1,1:n,nm 三种情况考虑。然后将各局部E-R图集成为全局E-R图,在这过程中我充分考虑到了各种冲突。对各个实体和关系进行了描述,并且根据应用要求消除了冗余实体和冗余关系。

在数据库逻辑模型设计阶段,将全局E-R图转换成关系模式,确定各关系模式的函数依赖关系,并且对依赖关系进行了规范化处理。同时为了更好满足不同用户的应用需求进行了关系调整,优化了数据库的运用。建立了基本结构表,并且对基本表给出了主键和外键,确定了其完整化约束。并确定了外模式和数据视图。

最后在数据库实施设计阶段我们在具体的DBMS下创建库,表,视图,建索引,授权及完整性约束。

综上所述,我设计的图书馆管理数据库系统,符合关系数据库的基本体系结构,达到关系数据库的标准。

参考文献

[1]郑人杰殷人昆陶永雷.实用软件工程[M],北京:清华大学出版社,1997,1.

[2]Jiawei han,Micheline Kamber着,范明,孟小峰等译.数据挖掘概念与技术[M],北京:机械工业出版社,2001,8.

[3]史忠植.知识发现[M],北京:清华大学出版社,2002,2.

[4]Claude Seidman着,刘艺,王鲁军,蒋丹丹等译.SQL Server 2000数据挖掘技术指南[M],北京:机械工业出版社,2002,1.

[5] 卫海 《PowerBuilder课程设计案例精编》中国水利水电出版社

[6] [美]William B. Heys着《PowerBuilder 6开发指南》电子工业出版社

[7]Microsoft Corporation. Component Object Model Technologies[EB/OL].

, 2005.

本文来源:https://www.2haoxitong.net/k/doc/0b7d3383ff0a79563c1ec5da50e2524de518d0a6.html

《图书馆管理系统ER图.doc》
将本文的Word文档下载到电脑,方便收藏和打印
推荐度:
点击下载文档

文档为doc格式