简介:这份资源是面向软件工程课程学习者和课程设计实践者的图书管理系统完整开发文档,围绕需求分析、系统设计、数据库设计与系统实现等核心环节展开,适合正在完成软件工程课设、需要参考规范开发流程与文档结构的学生使用。压缩包内共1个doc文件,约535KB,内容以课程设计报告形式组织,涵盖绪论、需求分析、系统数据库设计、系统实现等章节,并配有读者请求服务、图书管理员借还书、系统管理员维护等用例图与时序图,以及E-R图、数据表创建和数据库连接说明。文档还介绍了三层架构设计、SQL Server 2000数据库选型、Visual Basic 6.0与Rational ROSE工具的使用,并给出以登录窗体为例的详细设计思路。目前已有440人学习浏览,可帮助读者快速理解图书管理系统从需求到实现的完整软件工程脉络,对照完善自己的课程设计文档与开发方案。
1. 从一份“老派”课设文档说起:VB6 + SQL Server 2000 的图书管理系统到底还能不能用
翻到这份《图书管理系统 软件工程》文档时,我第一反应是:这技术栈也太有年代感了——Visual Basic 6.0、SQL Server 2000、Rational ROSE 画 UML,典型的瀑布模型课设配置。但仔细拆完目录和正文后,我发现它其实是一份结构相当完整的软件工程全流程样本:从需求分析、用例图、时序图、类图,到 E-R 图、八张数据表的字段定义,再到 ADO 连接数据库的代码,最后落到窗体创建和模块添加。换句话说,它不是那种只丢几段代码的“半成品”,而是一套能让你照着走完“需求→设计→建库→编码”的参考实现。
这份资源适合谁?如果你正在做软件工程课程设计、需要一份带完整 UML 建模和数据库设计的参考文档,或者想理解早期 C/S 架构下 VB 如何通过 ADO 操作 SQL Server,它很有价值。但如果你期待的是能直接跑起来的现代 Web 项目,那得先做好“考古”的心理准备——环境配置本身就是一道坎。下面我按实际复现的顺序,把这份文档拆成可操作的步骤,顺带把那些文档里没写透的坑补上。
2. 需求到模型:用例图、时序图、类图怎么从文字描述里长出来
2.1 三类参与者与用例边界划分
文档把系统参与者定为读者、图书管理员、系统管理员三类,这个划分直接决定了后面所有模型图的骨架。读者侧的核心用例是登录、查询个人信息、查询借阅信息、图书续借、借阅图书、图书归还;图书管理员侧是处理借书和处理还书;系统管理员侧是增加书籍、删除或更新书籍、添加读者信息、删除或更新读者信息。
这里有个容易被忽略的设计决策:文档把“借阅图书”和“处理图书借阅”拆成了两个用例,分别挂在读者和图书管理员名下。这不是冗余,而是体现了实际业务中的双端确认流程——读者发起借阅请求,管理员执行借出操作。如果你在画用例图时把这两个合并成一个,后面时序图里的消息传递就会对不上。
用 Rational ROSE 建用例图时,常见做法是先建三个 Actor,再用 Association 连线到各自的 Use Case,读者和管理员之间不直接连线,而是通过“借书/还书”这两个共享用例产生间接关联。文档里 2.6.1 到 2.6.3 三张图分别对应三类参与者,这个拆分方式在 ROSE 里就是三个独立的 Use Case Diagram,不要硬塞进一张图。
2.2 时序图的消息编号与函数映射
文档以“系统管理员添加图书”为例画了时序图,消息序列是:add_item() → find(string) → return true → create(integer, title)。这四步对应的是一个典型的“先查重再创建”逻辑。很多人在画时序图时只画一条 add_item 就结束了,但实际编码时如果不先 find 查重,同一本书会被重复添加,这是图书管理系统里最常见的脏数据来源。
在 ROSE 里画这张图的操作路径是:新建 Sequence Diagram → 拖入 Actor(系统管理员)→ 拖入 Boundary/Control/Entity 对象(maintenance window、title、item)→ 用 Message 箭头按时间顺序连接。注意消息编号是 ROSE 自动生成的,但函数名要手动填,填的时候和后面类图里的方法名保持一致,否则从模型到代码的映射会断掉。
文档 2.7 节列了七张时序图,但只详细展开了添加图书这一张。剩下六张(添加读者、删除更新图书、删除更新读者、处理借书、处理还书、读者查询图书)的结构类似,你可以按同样的“Actor → 界面对象 → 控制对象 → 实体对象”四层模式补全。补的时候注意借书和还书时序图里会多出一个“更新图书状态”的消息,这是和添加操作最大的区别。
2.3 类图属性与关系的落地写法
文档 2.8 节定义了六个核心类:reader、librarian、administrator、item(书目)、title(书名)、loan(借出)。其中 reader 类的属性包括读者标号、姓名、性别、年龄、已借书数目、联系电话、地址,方法有读者信息查询、图书信息查询、借阅信息查询、借书、还书、续借。librarian 和 administrator 类结构类似,但方法不同——前者是借书处理和还书处理,后者是添加、删除、更改信息。
类之间的关系在 2.8.3 节有体现:reader 和 loan 之间是 1 对 n 的关联(一个读者可以有多条借出记录),title 和 item 之间也是 1 对 n(一个书名对应多个馆藏副本)。在 ROSE 里画类图时,关联线两端要标注重数(1、n),如果是聚合关系用空心菱形,组合关系用实心菱形。文档里 reader 到 loan 用的是普通关联,这在借阅场景下是合理的——借出记录不会随读者删除而消失,需要保留历史。
提示:ROSE 2003 之后的版本对中文支持不太好,类名和属性名建议先用英文,导出报告时再对照文档里的中文说明。如果强行输中文,有时会出现乱码导致模型文件损坏。
3. 数据库落地:八张表的字段定义、E-R 图与 ADO 连接串
3.1 八张表的字段清单与主键约束
文档 3.3 节给出了八张表的详细设计,我整理成对照表方便建库时逐字段核对:
| 表名 | 主键 | 关键字段 | 说明 |
|---|---|---|---|
| book(书籍表) | bookname | bannercode、kindno、kindname、author、publishing、publishtime、putintime、price、state、introduction | 书名做主键,图书编号加唯一约束 |
| borrow(借书表) | user_cardno | bannercode、borrowdate、receivedate、renew | 证件号码做主键,记录借还日期和续借标记 |
| login(登录表) | user_name | psw | 用户名和密码,最简单的认证表 |
| punishment(罚款表) | user_cardnumber | sum_account | 罚款总额,number 类型长度 10 |
| user(读者信息表) | user_cardnumber | user_name、user_sex、user_status、user_address、user_registerdate、user_canceldate、user_state | 证件号码做主键,含注册和有效日期 |
| libraryer(图书管理员表) | libr_name | libr_sex、libr_address | 管理员姓名做主键 |
| admin(系统管理员表) | Adminname | Admin_sex、Adminaddress | 系统管理员信息 |
注意 book 表用 bookname 做主键、bannercode 做唯一约束,这个设计在实际中会有问题——同名书不同出版社的情况很常见。更合理的做法是用 bannercode 做主键,bookname 加普通索引。但既然文档这么定义了,复现时就按原样建,后面在应用层做查重处理。
建表时 SQL Server 2000 的语法和现在略有不同,varchar 和 date 类型都支持,但 date 类型在 2000 里实际是 datetime 的别名。price 字段用 number(10) 在 SQL Server 里要写成 numeric(10,2),否则小数位会丢。
3.2 E-R 图到物理表的映射检查
文档 3.2 节有 E-R 图,虽然正文里没有展开描述,但从表结构可以反推出实体关系:读者(user)和借书(borrow)是 1:n,书籍(book)和借书(borrow)也是 1:n,管理员(libraryer、admin)与书籍之间是维护关系。画 E-R 图时用矩形表示实体、椭圆表示属性、菱形表示关系,注意 borrow 表本身是一个关系实体,它连接了 user 和 book。
一个容易翻车的地方:文档里 borrow 表的主键是 user_cardno,这意味着一个读者只能有一条借阅记录。但实际业务中一个读者可以同时借多本书,正确的主键应该是 user_cardno + bannercode 的复合主键,或者加一个自增的借阅流水号。这是文档设计上的一个硬伤,复现时如果你要真正跑通借多本书的场景,必须改这里。
3.3 ADO 连接代码的逐行拆解
文档 3.4 节给了一段 C# 风格的 ADO 连接代码,虽然项目主体是 VB6,但这段代码的逻辑是通用的。核心思路是从外部文件读取连接字符串,然后打开 SqlConnection:
public void getConnection() { // 从 F://conn.txt 读取连接字符串 strFile = new StreamReader("F://conn.txt"); strConn = strFile.ReadLine(); myConn = new SqlConnection(strConn); try { if (myConn.State == ConnectionState.Closed) { myConn.Open(); } } catch (Exception ex) { System.Console.WriteLine(ex.ToString()); } } public SqlDataReader getDataReader(string sql) { try { getConnection(); comm = new SqlCommand(sql, myConn); // 后续执行查询并返回 DataReader } catch (Exception ex) { System.Console.WriteLine(ex.ToString()); } }这段代码的关键参数是 strConn,它的格式在 SQL Server 2000 下通常是:
"Provider=SQLOLEDB;Data Source=127.0.0.1;Initial Catalog=图书管理系统;User ID=sa;Password=你的密码;"Provider 用 SQLOLEDB 而不是 SQLNCLI,因为 SQL Server 2000 不支持后者。Data Source 可以写 IP 也可以写机器名,本地调试用 127.0.0.1 最稳。Initial Catalog 填数据库名,注意如果数据库名有中文,连接串里也要用中文,但建议建库时用英文名避免编码问题。
注意:把连接字符串放在 F://conn.txt 这种绝对路径下,换一台机器就找不到文件。我一般会改成从 App.config 或 ini 文件读取,路径用相对路径。如果非要用文本文件,至少把路径做成可配置的。
4. 避坑排查:从环境配置到借还逻辑的五个血泪教训
4.1 VB6 在 Win10/Win11 上安装失败
现象:双击 VB6 安装程序后卡在“正在更新系统设置”不动,或者装完后打开提示“未找到 MSVBVM50.dll”。
原因:VB6 是 1998 年的产品,安装程序对现代 Windows 的权限管理和 UAC 不兼容,而且它依赖的某些系统组件在新系统上已被移除或改名。
解决:右键安装程序 → 属性 → 兼容性 → 勾选“以兼容模式运行这个程序”并选择 Windows XP (Service Pack 3),同时勾选“以管理员身份运行”。装完后如果还缺 DLL,手动把 MSVBVM50.dll 复制到 C:\Windows\SysWOW64 下并用 regsvr32 注册。更省事的做法是用虚拟机装一个 Windows XP 或 Windows 7 32 位系统,VB6 在上面跑得最稳。
4.2 SQL Server 2000 无法远程连接
现象:VB6 程序里 ADO 连接报错“SQL Server 不存在或访问被拒绝”,但本机用查询分析器能连上。
原因:SQL Server 2000 默认只允许本地命名管道连接,TCP/IP 协议没启用,或者没打 SP4 补丁导致端口监听异常。
解决:打开“SQL Server 网络实用工具”→ 启用 TCP/IP → 确认端口是 1433 → 重启 SQL Server 服务。然后检查“客户端网络实用工具”里 TCP/IP 是否启用。如果还不行,打上 SQL Server 2000 SP4 补丁,这个补丁修复了大量连接相关的 bug。防火墙里要放行 1433 端口,或者干脆临时关闭防火墙测试。
4.3 借书时图书状态不更新
现象:读者借书后,borrow 表里插入了记录,但 book 表的 state 字段还是“在馆”,导致同一本书可以被重复借出。
原因:文档里的时序图只画了“创建借阅记录”这一步,没有画“更新图书状态”的消息。编码时如果只照着时序图实现,就会漏掉状态同步。
解决:在借书的事务里加一条 UPDATE 语句,把对应 bannercode 的 state 改为“已借出”。还书时再改回“在馆”。这两步必须放在同一个事务里,否则可能出现借阅记录插入成功但状态更新失败的不一致情况。VB6 里用 BeginTrans / CommitTrans / RollbackTrans 来控制。
4.4 中文乱码从数据库到界面一路飘红
现象:VB6 界面显示的图书名是问号或方块,数据库里查出来是正常的。
原因:VB6 的字符串默认是 Unicode,但 ADO 从 SQL Server 2000 取数据时如果字段是 varchar 类型,会按系统默认代码页转换,中文系统下一般是 GBK,但如果连接串里没指定字符集,或者控件字体不支持中文,就会乱码。
解决:连接串里加Character Set=GB2312;或者把字段类型改成 nvarchar。VB6 的 Label、TextBox 控件字体设为“宋体”或“微软雅黑”,不要用默认的 MS Sans Serif。如果还是乱码,检查 SQL Server 的排序规则是不是 Chinese_PRC_CI_AS。
4.5 续借逻辑没有次数限制
现象:读者可以无限次续借同一本书,导致图书长期不归还。
原因:文档 2.4 节只说了“图书续借”这个功能,但没有定义续借次数上限和续借条件(比如是否超期才能续借)。
解决:在 borrow 表里加一个 renew_count 字段,默认 0,每次续借 +1,超过 2 次就拒绝。同时判断当前日期是否超过 receivedate,如果已超期则不允许续借,必须先还书并缴纳罚款。这个逻辑写在应用层,数据库层加一个 CHECK 约束做兜底。
5. 从文档到可运行系统:窗体创建、模块添加与一个验证技巧
文档第 5 章“系统实现”只开了个头,讲了创建工程项目、添加模块、添加类模块、界面设计,但没有展开具体代码。我按 VB6 的标准流程补全一下,让你能把前面设计的表和类真正跑起来。
先在 VB6 里新建一个“标准 EXE”工程,然后通过“工程 → 添加模块”创建一个标准模块(.bas),在里面写数据库连接的公共函数:
' Module1.bas - 公共数据库连接模块 Public conn As ADODB.Connection Public Function OpenConn() As Boolean On Error GoTo ErrHandler Set conn = New ADODB.Connection ' 连接字符串,按实际环境修改 conn.ConnectionString = "Provider=SQLOLEDB;Data Source=127.0.0.1;" & _ "Initial Catalog=图书管理系统;User ID=sa;Password=123456;" conn.Open OpenConn = True Exit Function ErrHandler: MsgBox "数据库连接失败:" & Err.Description, vbCritical OpenConn = False End Function Public Function QuerySQL(sql As String) As ADODB.Recordset Dim rs As ADODB.Recordset Set rs = New ADODB.Recordset rs.Open sql, conn, adOpenStatic, adLockReadOnly Set QuerySQL = rs End Function然后在“工程 → 添加类模块”里创建读者类、图书类等,把 2.8 节定义的属性和方法映射成 VB6 的类代码。比如读者类:
' clsReader.cls - 读者类 Public ReaderID As String Public ReaderName As String Public ReaderSex As String Public BorrowCount As Integer Public Function BorrowBook(ByVal BookCode As String) As Boolean ' 先检查图书状态 Dim rs As ADODB.Recordset Set rs = QuerySQL("SELECT state FROM book WHERE bannercode='" & BookCode & "'") If rs.Fields("state") = "已借出" Then BorrowBook = False Exit Function End If ' 开启事务,插入借阅记录并更新图书状态 conn.BeginTrans On Error GoTo Rollback conn.Execute "INSERT INTO borrow(user_cardno,bannercode,borrowdate,renew) VALUES('" & _ ReaderID & "','" & BookCode & "','" & Date & "','否')" conn.Execute "UPDATE book SET state='已借出' WHERE bannercode='" & BookCode & "'" conn.CommitTrans BorrowBook = True Exit Function Rollback: conn.RollbackTrans BorrowBook = False End Function界面设计部分,按文档 4.2 节的思路,登录窗体放两个 TextBox(用户名、密码)和一个 CommandButton,点击后查询 login 表,匹配成功则打开主窗体。主窗体用 SSTab 控件分页,分别放图书查询、借阅管理、读者管理三个页签。图书查询页签里放一个 MSFlexGrid 控件绑定 Recordset,实现表格展示。
验证系统是否跑通,我常用的一个技巧是:先手动在 SQL Server 查询分析器里执行一遍完整的借书流程 SQL,确认数据变化正确,再回到 VB6 里点按钮操作,对比两次的数据库状态是否一致。如果手动 SQL 对但程序操作不对,问题一定在代码逻辑或事务控制上;如果手动 SQL 也不对,那就是表结构或约束的问题。这个“先手动后自动”的习惯帮我省了很多排查时间。
从那以后我每次拿到这种老技术栈的课设文档,都会先把数据库建好、手动跑一遍核心业务 SQL,确认数据层没问题了再动前端代码。希望这份拆解能帮你少走点弯路。
本文还有配套的精品资源,点击获取