软件工程课设实战:图书管理系统完整文档与VB6.0+SQL Server实现
简介这份资源是面向软件工程课程设计学习者与高校学生的图书管理系统完整开发文档围绕需求分析、系统设计、数据库设计、系统实现与测试等核心环节展开适合需要完成课程设计、撰写软件工程报告或学习结构化开发流程的读者参考。压缩包内共1个doc文档约535KB内容以目录、用例图、时序图、E-R图、数据表创建及登录窗体详细设计等为主覆盖从课题背景到编码实现的完整链路。文档中系统采用三层架构Presentation、Application与Data Layer分工明确数据库选用SQL Server 2000开发工具为Visual Basic 6.0并借助Rational ROSE完成建模对理解传统C/S架构图书管理系统的设计思路较有帮助。目前已有439人学习浏览可作为课程设计选题、文档模板与建模参考的实用材料。1. 图书管理系统软件工程一份能直接跑通课程设计的完整文档包如果你正在为软件工程课程设计发愁手里攥着一个“图书管理系统”的题目却不知道从哪下笔这份文档包大概率能把你从“打开 Word 就发呆”的状态里拽出来。它不是那种只给几页需求列表的敷衍模板而是从绪论、需求分析、用例图、时序图、类图一路铺到数据库建表、ADO 连接代码和 VB6.0 界面设计的完整工程文档。换句话说软件工程课程设计里该有的阶段产物它基本都覆盖了。适合谁正在做软件工程课设的本科生、需要一份规范文档参考的初级开发者以及想用 VB6.0 SQL Server 2000 这套经典组合练手的人。这套技术栈虽然老但用来理解信息管理系统的完整开发流程反而比现代框架更直白——没有太多脚手架帮你兜底每一步都得自己想清楚。2. 需求分析怎么落地从用例图到时序图的完整推演2.1 三类参与者怎么划分才不打架图书管理系统的需求分析最容易翻车的地方不是功能写不全而是参与者角色边界模糊。这份文档把参与者明确切成三类读者、图书管理员、系统管理员。读者关心的是查书、借书、续借、还书、查自己的借阅记录图书管理员的核心动作只有两个——处理借书和处理还书系统管理员则负责读者信息管理、图书信息管理和系统状态维护。这个划分看起来简单但它直接决定了后面用例图和类图的走向。我见过不少课设把“借书”同时挂在读者和图书管理员名下结果用例图里同一个功能出现两次类图里 Reader 和 Librarian 的方法也重复定义。正确的做法是读者发起借书请求图书管理员处理借书请求这是两个不同的用例前者是“请求服务”后者是“处理请求”。提示划分参与者时先问一句“谁发起谁处理”发起者和处理者永远不应该是同一个角色。2.2 用例图的三层拆解与画法文档里给出了三张用例图分别对应读者请求服务、图书管理员处理借还书、系统管理员维护系统。画用例图时常见做法是先用 Rational ROSE 建一个 Use Case Diagram把 Actor 拖进去再逐个添加 Use Case 椭圆。读者的用例包括系统登录、查询个人信息、查询图书信息、查询借阅信息、图书续借、借阅图书、图书归还。图书管理员的用例包括处理图书借阅、处理图书归还。系统管理员的用例包括增加书籍、删除或更新书籍、添加读者信息、删除或更新读者信息。这里有个细节值得注意文档在系统功能说明里混入了一段“选修课基本情况”和“学生选修模块”的描述这明显是从别的模板里复制过来没改干净。你在写自己的文档时一定要把这类残留内容清理掉否则答辩时被老师翻到解释起来很尴尬。2.3 时序图以“添加图书”为例的交互逻辑时序图按时间顺序描述系统元素之间的交互。文档以系统管理员添加图书为例画出了这样的流程系统管理员 - 维护窗口: add item() 维护窗口 - 书目: find(string) 书目 -- 维护窗口: return true 维护窗口 - 书目: create(integer, title)用文字拆解一下系统管理员在维护窗口触发“添加图书”操作窗口先调用书目类的find(string)方法检查对应书名是否已存在。如果不存在再调用create(integer, title)方法创建新书目记录。这个“先查重再创建”的逻辑是图书管理系统里最基础也最容易被忽略的一步。很多课设代码直接 INSERT结果同一本书被录入多次后面借书时读者看到一堆重复条目。文档里还列出了其他六张时序图的主题添加读者、删除或更新图书、删除或更新读者信息、处理借书要求、处理还书要求、读者查询图书信息。你在补全这些时序图时可以沿用同样的模式——先确定触发者再确定被调用的对象和方法最后确定返回值和后续动作。2.4 类图设计六个核心类的关系梳理类图是系统设计中最核心的部分。文档明确了六个重要类item书目、title书名、loan借出、reader读者、administrator系统管理员、librarian图书管理员。参与者相关的类有三个reader 类属性包括读者编号、姓名、性别、年龄、已借书数目、联系电话、地址操作包括读者信息查询、图书信息查询、借阅信息查询、借书、还书、续借。librarian 类属性包括工作 ID、姓名、地址操作包括借书处理、还书处理。administrator 类属性包括 ID、工作、姓名、地址操作包括添加信息、删除信息、更改信息。系统中用到的其他类包括图书书目类、图书名称类、已借出图书类。它们之间的关系是书目与书名是一对多一个书名可以有多个副本书目与已借出图书是一对多一本书可以被多次借出历史记录保留。写类图时我一般会先在纸上把每个类的属性和方法列出来再用 ROSE 画关联线。关联线两端的重数1、n、0..n一定要标清楚这是老师最容易挑毛病的地方。3. 数据库设计八张表的字段定义与 ADO 连接实操3.1 从 E-R 图到八张表的落地文档明确说明通过应用逻辑分析需要建立 8 个表。虽然正文里只详细列出了 7 张表的字段定义但根据系统功能描述第 8 张表很可能是“图书类别表”或“系统日志表”。你在实际建库时可以根据需求补全。先看已有的表结构书籍表bookbookname书名主键、bannercode图书编号唯一约束、kindno分类号、kindname分类名、author作者、publishing出版社、publishtime出版日期、putintime入库日期、price价格、state状态、introduction简介。借书表borrowuser_cardno证件号码主键、bannercode图书编号、borrowdate借书日期、receivedate还书日期、renew是否续借。登陆表loginuser_name用户名主键、psw密码。罚款表punishmentuser_cardnumber证件号码主键、sum_account罚款总额。读者信息表useruser_name读者姓名、user_sex性别、user_status身份、user_address地址、user_cardnumber证件号码主键、user_registerdate注册日期、user_canceldate有效日期、user_state读者状态。图书管理员表libraryerlibr_name姓名主键、libr_sex性别、libr_address地址。系统管理员表adminAdminname姓名主键、Admin_sex性别、Adminaddress地址。建表时有个血泪经验SQL Server 2000 里date类型和varchar类型的长度设置要格外小心。文档里 publishtime 和 putintime 用的是 Date 类型长度写 30这在 SQL Server 2000 里其实不太规范——Date 类型不需要指定长度。如果你用的是 SQL Server 2000建议把日期字段统一改成datetime类型避免插入时格式报错。3.2 用 SQL 语句创建核心表下面给出书籍表和借书表的建表语句你可以直接在查询分析器里执行-- 创建书籍表 CREATE TABLE book ( bookname VARCHAR(30) NOT NULL PRIMARY KEY, bannercode VARCHAR(30) UNIQUE, kindno VARCHAR(20), kindname VARCHAR(20), author VARCHAR(10), publishing VARCHAR(30), publishtime DATETIME, putintime DATETIME, price NUMERIC(10,2), state VARCHAR(4), introduction VARCHAR(50) ); -- 创建借书表 CREATE TABLE borrow ( user_cardno VARCHAR(20) NOT NULL, bannercode VARCHAR(30) NOT NULL, borrowdate DATETIME, receivedate DATETIME, renew VARCHAR(2), PRIMARY KEY (user_cardno, bannercode) );借书表的主键用了复合主键user_cardno bannercode这是合理的——同一个读者可以借多本书同一本书也可以被多个读者借过但“同一个读者借同一本书”在未归还状态下不应该重复出现。不过严格来说还应该加一个“借阅状态”字段来区分历史记录和当前借阅文档里没写你可以自己补上。3.3 ADO 连接数据库的代码实现文档给出了一个用 C# 写的 ConnectionClass虽然项目主体是 VB6.0但这段 ADO 连接代码的逻辑是通用的。核心思路是从外部文件读取连接字符串创建 SqlConnection 对象打开连接执行 SQL 命令返回 DataReader。public class ConnectionClass { string strConn; SqlDataReader reader; SqlCommand comm; SqlConnection myConn; StreamReader strFile; int result 0; public void getConnection() { // 从 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); // 后续执行命令并返回 reader } catch (Exception ex) { System.Console.WriteLine(ex.ToString()); } return reader; } }这段代码有几个关键点连接字符串放在外部文件conn.txt里而不是硬编码在代码中方便部署时修改打开连接前先判断State避免重复打开异常捕获后输出到控制台方便调试。如果你用 VB6.0 做前端连接方式会有所不同。VB6.0 里通常用 ADO 控件Adodc或者 ADO 对象模型。常见做法是Dim conn As New ADODB.Connection Dim rs As New ADODB.Recordset conn.ConnectionString ProviderSQLOLEDB;Data Source.;Initial Cataloglibrary;User IDsa;Password你的密码; conn.Open rs.Open SELECT * FROM book, conn, adOpenStatic, adLockReadOnly注意SQL Server 2000 默认的 sa 账户密码为空或很简单实际部署时一定要改掉。另外VB6.0 的 ADO 引用需要在“工程 - 引用”里勾选 Microsoft ActiveX Data Objects 2.x Library。4. 系统实现VB6.0 工程搭建与登录窗体详细设计4.1 创建工程与添加模块的步骤文档第 5 章给出了系统实现的操作流程创建工程项目、为系统添加模块、添加类模块、界面设计。这套流程在 VB6.0 里是标准动作但新手容易在“添加模块”和“添加类模块”之间搞混。模块.bas 文件存放全局变量和通用函数比如数据库连接函数、字符串处理函数。类模块.cls 文件存放类的定义比如 Reader 类、Book 类。具体操作打开 VB6.0新建“标准 EXE”工程。在“工程资源管理器”里右键选择“添加 - 模块”创建modDatabase.bas把数据库连接函数放进去。右键选择“添加 - 类模块”创建clsReader.cls、clsBook.cls分别定义属性和方法。在窗体上拖放控件设计登录界面、主界面、借书界面、还书界面。4.2 登录窗体的详细设计思路文档以登录窗体为例展示了详细设计思路。登录窗体的核心逻辑是用户输入用户名和密码系统查询 login 表如果匹配成功则进入主界面否则提示错误。Private Sub cmdLogin_Click() Dim conn As New ADODB.Connection Dim rs As New ADODB.Recordset Dim sql As String 建立连接 conn.ConnectionString ProviderSQLOLEDB;Data Source.;Initial Cataloglibrary;User IDsa;Password123456; conn.Open 查询用户 sql SELECT * FROM login WHERE user_name txtUser.Text AND psw txtPass.Text rs.Open sql, conn, adOpenStatic, adLockReadOnly If rs.EOF Then MsgBox 用户名或密码错误, vbCritical, 登录失败 Else MsgBox 登录成功, vbInformation, 欢迎 Me.Hide frmMain.Show End If rs.Close conn.Close End Sub这段代码的逻辑很直白拼接 SQL 语句查询 login 表根据 Recordset 是否为空判断登录是否成功。但这里有个经典的安全问题——SQL 注入。如果用户在用户名输入框里填 OR 11密码随便填SQL 语句就变成SELECT * FROM login WHERE user_name OR 11 AND psw...直接绕过验证。课设阶段老师一般不查这个但如果你想让代码更规范可以用参数化查询Dim cmd As New ADODB.Command cmd.ActiveConnection conn cmd.CommandText SELECT * FROM login WHERE user_name? AND psw? cmd.Parameters.Append cmd.CreateParameter(user, adVarChar, adParamInput, 20, txtUser.Text) cmd.Parameters.Append cmd.CreateParameter(pass, adVarChar, adParamInput, 15, txtPass.Text) Set rs cmd.Execute参数化查询在 VB6.0 里写起来比拼接字符串麻烦但能有效防止 SQL 注入。我一般会在课设文档里两种写法都放正文用拼接版方便理解附录里放参数化版展示安全意识。4.3 借书与还书功能的实现要点借书功能的逻辑是读者提供证件号码和图书编号系统检查读者是否已借满比如最多 5 本、图书是否在馆state 字段是否为“在馆”然后向 borrow 表插入记录同时更新 book 表的 state 字段。还书功能的逻辑是图书管理员输入图书编号系统查询 borrow 表找到对应的借阅记录计算是否超期如果超期则向 punishment 表插入罚款记录然后更新 borrow 表的 receivedate 字段和 book 表的 state 字段。这两个功能的核心是事务处理。借书时“插入借阅记录”和“更新图书状态”必须同时成功或同时失败否则会出现“书被借走了但状态还是在馆”的脏数据。VB6.0 里可以用conn.BeginTrans和conn.CommitTrans来实现conn.BeginTrans On Error GoTo Rollback 插入借阅记录 conn.Execute INSERT INTO borrow VALUES( cardno , bookno ,GETDATE(),NULL,否) 更新图书状态 conn.Execute UPDATE book SET state已借出 WHERE bannercode bookno conn.CommitTrans Exit Sub Rollback: conn.RollbackTrans MsgBox 借书失败请重试这段代码里On Error GoTo Rollback是关键。如果任何一条 SQL 执行失败就跳转到 Rollback 标签回滚事务保证数据一致性。5. 避坑与排查课设文档和代码里最容易翻车的五个地方5.1 现象用例图里同一个功能挂在两个参与者名下原因没有区分“发起者”和“处理者”。读者发起借书请求图书管理员处理借书请求这是两个不同的用例。解决画用例图前先列一张表左边写功能右边写“谁发起、谁处理”。发起者和处理者分开画用关联线连接参与者和用例。5.2 现象数据库建表时日期字段插入报错原因SQL Server 2000 对日期格式敏感Date类型在不同区域设置下解析方式不同。文档里 publishtime 和 putintime 用了 Date 类型但长度写 30不规范。解决统一用DATETIME类型插入时用GETDATE()或2024-01-15这种标准格式。VB6.0 里可以用Format(Date, yyyy-mm-dd)格式化日期字符串。5.3 现象ADO 连接打开失败提示“未找到数据源”原因连接字符串里的 Data Source 写错了或者 SQL Server 服务没启动。解决先确认 SQL Server 服务已启动在服务管理器里看 MSSQLSERVER 是否运行。连接字符串里 Data Source 可以用.表示本机或者用(local)。如果还是不行检查是否启用了 TCP/IP 协议。5.4 现象登录功能被 SQL 注入绕过原因用字符串拼接构造 SQL 语句用户输入的内容直接嵌入 SQL。解决改用参数化查询或者至少对用户输入做转义处理把单引号替换成两个单引号。课设阶段建议直接上参数化查询养成好习惯。5.5 现象借书后图书状态没更新或者更新了但借阅记录没插入原因没有用事务处理两条 SQL 语句一条成功一条失败。解决用BeginTrans/CommitTrans/RollbackTrans包裹所有相关操作。VB6.0 里记得加On Error GoTo处理异常回滚。6. 进阶技巧用 Rational ROSE 反向生成代码与文档一致性检查Rational ROSE 在课设里的价值很多人只用到画图就停了。其实它还有一个很实用的功能正向工程和反向工程。正向工程是从类图生成代码框架反向工程是从代码反向生成类图。这两个功能可以用来做文档一致性检查。具体操作在 ROSE 里画好类图后选中类右键选择“Forward Engineer”可以生成 VB 或 C# 的类框架代码。反过来如果你先写了代码可以通过“Reverse Engineer”把代码导入 ROSE自动生成类图。我一般会先用 ROSE 画类图正向生成代码框架然后在 VB6.0 里填充具体逻辑。写完之后再用反向工程导出一遍对比类图和代码是否一致。这里有个坑ROSE 的正向工程对 VB6.0 的支持并不完美生成的代码里属性定义可能不符合 VB6.0 的语法规范。常见做法是只把 ROSE 生成的代码当作参考手动在 VB6.0 里调整。另外ROSE 的版本不同菜单项位置也不一样如果找不到“Forward Engineer”可以在 Tools 菜单里找“Java/C/Visual Basic”相关的子菜单。还有一个实用技巧用 ROSE 的“Model Assistant”功能检查类之间的关系是否完整。比如 Reader 类和 Borrow 类之间应该有关联线如果漏了Model Assistant 会提示。这个功能在课设答辩前过一遍能帮你发现不少遗漏。从那以后我每次做完类图都会强制走一遍正向工程和反向工程确认文档和代码对得上。希望帮到你。本文还有配套的精品资源点击获取