软件工程——设计与实现

 一、软件开发计划:

开发计划表如下所示:

“飞花令”软件开发计划表
阶段主要工作应完成的文档计划起始时间计划终止时间实际起始时间实际终止时间
系统需求归纳总结需求10.1810.2010.1810.20
论证项目可行性项目解决方案

10.21

10:00

10.21

12:00

10.21

10:00

10.21

11:30

制定项目初步计划项目初步开发计划进度表

10.21

15:00

10.21

17:00

10.21

15:00

10.21

16:30

开发计划进行评审

10.21

17:00

10.21

17:30

10.21

16:30

10.21

17:10

需求分析确定系统运行环境

10.21

19:00

10.21

20:00

10.21

19:00

10.21

20:00

建立系统逻辑模型

10.21

20:00

10.21

21:00

10.21

20:00

10.21

21:00

确定系统功能及性能要求

10.21

21:00

10.21

22:00

10.21

21:00

10.21

22:30

编写需求规格说明、用户手册概要、测试计划

10.22

10:00

10.22

12:00

10.22

10:00

10.22

11:40

确认项目开发计划

10.22

14:00

10.22

15:00

10.22

14:00

10.22

14:50

概要设计建立系统总体结构,划分功能模块

10.22

15:00

10.22

17:00

10.22

15:00

10.22

17:15

定义各功能模块接口

10.22

20:30

10.22

21:30

10.22

20:30

10.22

21:30

数据库设计10.2310.2410.2310.24
制定组装测试计划10.2510.2710.2510.27
对已完成的文档进行评审

10.27

16:00

10.27

22:00

10.27

16:00

10.27

22:00

详细设计设计各模块具体实现算法11.111.511.111.5
确定模块间详细接口

11.5

11.7

11.5

11.7

制定模块测试方案

11.8

10:00

11.9

11:00

11.8

9:50

11.9

10:40

实现编写程序源代码11.911.3011.912.1
进行模块测试和调试12.112.2

12.1

12.2

对实现过程及已完成的文档进行评审12.312.412.312.4
集成测试执行集成测试计划12.412.512.412.5
编写集成测试报告12.512.612.512.6
验收测试测试整个软件系统

12.7

17:00

12.7

21:00

12.7

16:00

12.7
22:00
编写开发总结报告开发工作总结12.812.812.812.8
上线部署上线12.712.712.712.7
维护和更新为纠正错误,完善应用而进行修改12.712.712.712.7
对修改进行配置管理12.712.712.712.7
进行功能完善和扩展12.712.712.712.7
修订用户手册12.712.712.712.7

二、软件设计

  • 在项目需求分析基础之上,设计了待开发系统

1、系统体系结构设计

  • 确定体系结构风格
            分布式架构(指将一个业务拆分成多个子业务,分布在不同的服务器节点上,共同构成的系统。这种架构风格具有分布性、对等性、并发性等特点。在分布式系统中,计算机可以分布在不同机房、不同城市,甚至不同国家。分布式系统中的计算机没有主从之分,组成分布式系统的所有节点都是对等的。同一个分布式系统的多个节点可能会并发地操作一些共享资源,诸如数据库或分布式存储)
  • 用UML工具画出系统的整体视图:
  • 系统构件及其之间的依赖关系;
    登陆注册模块
    界面跳转模块
    竞赛模块
    数据库
    查询模块

    依赖关系:
    1.登录注册模块与数据库:登录注册模块需要从数据库中读取用户信息,并存储新用户的信息。因此,登录注册模块依赖于数据库。

    2.界面跳转模块与登录注册模块:界面跳转模块根据用户的操作可能需要跳转到登录或注册页面。因此,界面跳转模块依赖于登录注册模块。

    3.竞赛模块与数据库:竞赛模块需要从数据库中读取竞赛信息,并向数据库存储竞赛结果。因此,竞赛模块依赖于数据库。

    4.竞赛模块与查询模块:查询模块需要向竞赛模块发送查询请求,获取竞赛的详细信息或结果。因此,竞赛模块依赖于查询模块。

    5.数据库与查询模块:查询模块需要向数据库发送查询请求,从数据库中获取所需的数据。因此,查询模块依赖于数据库。

2、构件设计


       
1.数据库
      使用SQL Server,搭建了一个Poetry的数据库,目前存在有个表(Table),dbo.Poetry_content(存储诗词库的诗词内容),dbo.TBUS(存储用户信息)。然后通过SQLServer的数据库字符串,在Visual Studio中链接到了创建的Poetry数据库。

2.登录注册模块
       登录。使用connectionString字符串链接到数据库以后,获取textbox在登陆注册对应位置输入的文本信息,拿来和数据库的UserID和UserPassword进行比对。利用函数SqlDataReader匹配结果,并在if语句中进行判断,如果成功读出,则实例化出来的reader对象具备数据库存储的用户信息,如果没有匹配成功,则reader的值是null,紧接着我们对reader进行if判断,如果reader.row=1(有值)则登陆成功,跳转到下一个界面,如果没有,弹出提醒,用户名或密码错误,登录失败。
       注册。链接数据库内容同上。获取用户输入在文本框中的内容,并调用insert语句写入数据库,注册成功后,会在dbo.TBUS存储下来

3.界面跳转模块
       这个界面实现了一些简单的跳转。将要跳转的类进行实例化,调用ShowDialog函数打开下一界面,同时this.close关闭当前界面

4.竞赛模块
        第一部分,为了避免多次答题,上次答题的结果遗留,因此我们在每次点击开始按钮后,需要对输入框进行清除操作;
        第二部分是链接数据库,并且把数据库中存储的信息(存的信息看我前面发的表)全部读取出来,并存储在title、author等变量里(存储的目的是用来判断用户输入的是否正确,已经作为机器人的输出);
       第三部分定义了一个cnt作为一个系数,用来判断用户答对了几次,例如一首诗,包括题目、作者、第一行、第二行、第三行、第四行,一共需要答6个地方。但是由于是人机对战,因此人需要答三次。所以当cnt=3的时候,我们就判断用户全部答对了应答出的内容,然后加上对应的积分,否则,不加分。
       用for循环来执行,循环6次答题。因为每次答题的内容不一样,因此我们用i来表示答的内容,例如i=1表示答题目,i=2表示答作者名,以此类推。
       默认机器人先出题目,用户答作者,答题顺序依次类推。
       系统提醒请输入作业,并且给用户5秒的时间进行答题,如果超过5秒或者答题的内容和前面变量author存储的值不同,判断答题失败,反之答题成功

5.查询模块
       获取用户输入在文本框中的内容,链接到数据库并且把数据库中存储的相关信息(存的信息看我前面发的表)全部读取出来,并存储在title、author等变量里(作为输出)

3、数据设计



建模如下图所示:

     

E-R图如下:

 

三、代码实现

3.1 实现过程

我们目前使用的是SQL Server作为我们的数据库引擎,成功搭建了一个名为Poetry的数据库。在这个数据库中,我们创建了两个数据表,分别是dbo.Poetry_content和dbo.TBUS。

dbo.Poetry_content这个表的主要功能是存储我们的诗词库中的诗词内容。这个表的结构经过精心设计,包含了各种与诗词相关的字段,如诗词ID、诗词标题、诗词作者、创作日期等。通过这个表,我们可以轻松地存储、查询和管理我们的诗词库。dbo.TBUS这个表则是用来存储用户信息的。这个表包含了各种与用户相关的字段,如用户ID、用户名、用户密码、用户邮箱等。通过这个表,我们可以有效地管理用户的注册、登录和信息更新等操作。

为了在Visual Studio中连接到我们创建的Poetry数据库,我们使用了SQL Server的数据库字符串。这个字符串包含了连接数据库所需的所有信息,如数据库服务器地址、数据库名称、用户名和密码等。通过在Visual Studio中设置这个字符串,我们成功地建立了一个与Poetry数据库的连接,可以轻松地进行数据的查询、插入、更新和删除等操作。

上述图中代码是实现的登录功能,使用connectionString字符串链接到数据库以后,获取textbox在登陆注册对应位置输入的文本信息,拿来和数据库的UserID和UserPassword进行比对。利用函数SqlDataReader匹配结果,并在if语句中进行判断,如果成功读出,则实例化出来的reader对象具备数据库存储的用户信息,如果没有匹配成功,则reader的值是null,紧接着我们对reader进行if判断,如果reader.row=1(有值)则登陆成功,跳转到下一个界面,如果没有,弹出提醒,用户名或密码错误,登录失败。

上述代码详细地描绘了一个用户注册界面,其功能主要是收集用户输入的信息并将其存储到数据库中。这个界面不仅与数据库建立了连接,而且还实现了将用户在文本框中输入的内容获取并处理的功能。在用户填写完注册信息并提交后,程序会调用insert语句将用户信息写入数据库。一旦注册成功,这些信息就会存储在dbo.TBUS这个数据库表中,以供后续查询和使用。

上述这段代码是描述登陆成功后跳转到的下一个界面。这个界面实现的功能相对简单,主要是进行界面跳转。具体来说,它会将要跳转的类进行实例化,并调用该类的ShowDialog函数来打开下一个界面。同时,为了确保当前界面不被重复打开,它会通过调用this.close函数来关闭当前界面。这样的设计使得程序在逻辑上更加清晰,也有利于提高用户体验。

上图为登录后对应的前端界面,如果用户点击了竞赛按钮,他们将会被跳转到竞赛界面。在这个界面上,他们可以观看到与机器人进行对战的实时动态。而当他们点击开始按钮后,就会启动人机对战的功能。

上图代码:为了避免多次答题,上次答题的结果遗留,因此我们在每次点击开始按钮后,需要对那几个输入框进行清除操作。

上图代码:链接数据库,并且把数据库中存储的信息(存的信息看我前面发的表)全部读取出来,并存储在title、author等变量里(存储的目的是用来判断用户输入的是否正确,已经作为机器人的输出)。然后我们定义了一个cnt作为一个系数,用来判断用户答对了几次,例如一首诗,包括题目、作者、第一行、第二行、第三行、第四行,一个需要答6个地方对吧,但是由于是人机对战,因此人需要答三次。所以当cnt=3的时候,我们就判断用户全部答对了应答出的内容,然后加上对应的积分,否则,不加分。

上述代码是答题过程的具体实现,因为我们已知整个答题只需要答6次,因此我们用for循环来执行,循环6次答题。因为每次答题的内容不一样,因此我们用i来表示答的内容,例如i=1表示答题目,i=2表示答作者名,以此类推。我们默认机器人先出题目,用户答作者,答题顺序依次类推。

上述图中代码:系统会发出提醒,要求用户输入作业内容。同时,系统会给予用户5秒钟的时间进行回答。如果用户在5秒钟内成功回答了问题,并且答案与前面变量author所存储的值相同,那么答题将被判定为成功。否则,如果超过5秒钟用户仍未回答问题或回答的内容与变量author的值不同,系统将判定答题失败。这样的机制旨在保证答题的及时性和准确性,同时对用户的回答进行有效的验证和判断。

上述图中代码:把积分写入存储用户信息的表中,通常需要经过一系列的操作。首先,需要确定要写入积分的用户信息,这可以通过查询数据库或使用现有的用户信息表来实现。

上述图像处理代码的主要功能是获取图片的存储路径,并在夜间模式下更换为深色背景。然而,实现这一功能并不简单。其中难点在于处理图像布局的问题。由于窗口大小与图片大小往往不一致,因此需要系统能够自动调整图像分辨率,以适应不同窗口尺寸。

这段代码实现了查询功能,可以将诗词的信息查询出来。通过使用数据库查询语句,可以从数据库表中检索出与输入的查询条件匹配的诗词记录。用户可以通过输入关键词或选择特定的查询条件来搜索诗词,并获得相关的信息,如诗词标题、作者、创作年代等。查询结果将以列表的形式呈现,方便用户浏览和选择。这种查询功能可以大大提高用户查找诗词的效率和准确性,从而更好地满足用户的需求。

上述图中代码:第一张中的任务是获取用户输入的文本数据,也就是他们希望查询的诗歌题目。通过与数据库的交互,我们在数据库中遍历查找与用户输入匹配的诗歌记录。如果找到匹配的记录,我们将获取到相关的内容,这些内容会作为查询结果返回给用户。第二张中,在获取到查询结果后,我们会在一个窗口中展示这些结果。为了更好地呈现这些结果,我们使用了Visual Studio中提供的一些封装好的数据表控件。通过创建这些控件,并将查询结果放入其中,我们能够清晰地展示每一首诗歌的相关信息,比如诗歌的标题、作者和创作年代等。除了展示查询结果,我们还实现了数据的动态更新功能。也就是说,当我们在数据库中添加或修改了新的诗歌记录后,这些变动也会立即反映到我们的数据表控件中。这种实时的数据更新功能,使用户能够随时查看到最新的诗歌信息。第三张中,为了使用户能够更加方便地浏览不同的诗歌信息,我们实现了界面跳转功能。当用户点击数据表中的某一行数据时,系统会自动跳转到另一个界面,这个界面会展示这首诗歌的详细信息。这种跳转功能的使用,使用户能够在不同的界面之间轻松地切换,更好地查看和理解每一首诗歌的内容。

上图为个人中心的UI,我们每一个界面都包含左上角还有右上角的这两个功能,能够让用户更方便操作。在个人中心界面获得登录的用户名信息。因为登录是通过用户输入的用户名、密码与数据库存储的已经注册的用户名、密码进行比对。所以在个人中心界面,就不能通过数据库的信息获取当前登录的用户名。因此我们这里在登陆界面、用户输入的文本框中声明了一个变量,当用户登录成功跳转后,该变量会带着用户输入的内传递给下一个选择模式界面,当用户点击朋友圈功能后,最终将变量传递到个人中心的textbox中,最终用户登录的账号就会显示在最上面。

上述图中:图一是登陆界面代码,图二是选择功能界面代码,图三是个人中心界面代码。

第二个功能显示积分。因为在个人中心界面,我们已经获得登录的用户名,因此可以直接通过用户名访问数据库,以获得用户的积分信息,代码如下:

当用户尝试查找积分信息时,如果找到了对应的积分数据,就会显示积分信息;如果找不到对应的数据,就会显示"User not found"的提示信息。

然后是等级界面,是根据积分信息来设置的,当用户积分score<=1时,会显示等级为new,当用户积分score>1时,会显示等级为old。只所以将等级临界值设置为1是为了方便测试新账号时,不用重复刷积分来测试等级更新的功能。在这里有一个问题是。我们显示登记信息的控件只是一个textbox,因此不具备监视器的作用来检测用户score积分变化,所以当用户进入用户中心看到等级信息时,在进行游戏加分,会出现登记信息没法同步的情况,因此在登记信息旁边引入了一个button,来更新用户的登记信息。玩了一局以后,积分加1,点击更新按钮,等级更新为old。其代码如下:

因为实际中用户可能有修改用户名的需求,因为添加了修改名称的功能,是一个button控件,点击后会出现下面界面:

当用户点击取消后,刚显示出来的textbox会将可见度设置为0(不可见)。当点击确定按钮后,程序会自动获取用户在文本框中输入的内容。并使用SQL语句在数据库语句查找当前用户的用户名信息,并自动在数据库进行更新,代码如下图所示:

修改密码的功能代码如下:

查看历史得分功能记录:

引入了c#的输入输出流,因为数据库中只记录了当前的得分信息,因此并不能直接读取数据库里的用户积分。为此,在比赛界面新增输入输出流,当用户赢得比赛后的加分,不仅写在数据库当中,还会写在txt文档中,每次写入一行(不覆盖之前内容)。当用户点击查看历史得分功能时,同样引入输入流,来读取txt文档里的内容。代码如下:

图一为更改后比赛加分界面的代码,图二为个人中心界面的代码。

效果图:

txt文件:

防沉迷功能:

引入了全局时钟,设置时钟间隔。为了方便功能测试,暂时讲防沉迷时间设置为1分钟。即一分钟后弹出提醒,退出程序。(防沉迷时间可调)。全局时钟会统计所有界面的打开时间,因为设置好了时钟间隔为1秒钟,因此定义一个关闭时间,当关闭时间 = 最大运行时间时,系统自动关闭,全局时钟关闭。

双人对战:

要实现双人对战,首先要创建一个TcpListener对象,绑定本地主机的IP地址和电脑端口号,TcpListener对象用于监听来自客户端的请求,之后引用socket网络通信接口,并通过AcceptSocekt函数来接收客户端的链接。如果没有客户端链接,则会一直等待。比赛过程同之前写过的,去前面的文档上复制过来稍微改改。然后两个用户直接输入的信息通过网络流进行传递,具体代码实现如下:

3.2 码云平台代码/文档签入记录

四、项目过程管理与记录

4.1 项目完成情况表

预估情况现实情况
任务计划完成大部分的后端开发功能并进行测试,完成软件设计。完成了一半的后端功能,进行了跳转界面的测试,完成了软件设计。
代码量600行860行
时间16天20天
测试完成一半的功能测试进行了部分测试
代码规范代码整洁易阅读代码整洁易阅读

4.2 项目燃尽图

4.3 各成员工作情况

任务情况工作图
张涵瑞完成了部分软件开发和设计、代码编写、分配任务、博客撰写
王鼎盛完成了部分软件开发、代码修改、界面美化、博客撰写、画图
孟世栋完成了部分软件设计、代码修改、界面美化、博客撰写、画图

代码仓库:Zzzzhr947/飞花令 (gitee.com)

4.4 项目改善计划

在软件工程项目中,有时候会遇到开发进度缓慢的问题。为了促进后续开发进度,我们小组成员经过讨论后打算从流程、方法、工具等方面进行改善。以下是具体的计划:

流程方面:

1、建立明确的开发流程:制定清晰的开发流程,明确每个人的职责和任务。这可以确保开发人员遵循正确的步骤,减少不必要的返工和沟通。

2、尝试引入敏捷开发方法:采用敏捷开发方法,如Scrum或Kanban,可以更好地响应需求变化,加快开发速度。通过短周期的迭代开发,可以及时发现和解决问题,提高开发效率。

3、建立代码审查和测试流程:建立代码审查和测试流程,确保代码质量。通过定期的代码审查,可以发现潜在的问题并及早纠正。同时,严格的测试流程可以确保软件的功能和性能符合预期。

方法方面:

1、使用思维导图等工具:使用思维导图等工具,将项目拆分成多个小任务,并为每个任务分配资源和时间。这有助于项目成员更好地理解项目结构,明确自己的任务和目标。

2、引入自动化工具:引入自动化工具,如持续集成/持续部署(CI/CD)、单元测试和集成测试工具等,可以减少人工操作,提高开发效率。

3、定期召开项目会议:定期召开项目会议,让所有成员分享进度、问题和建议。这有助于加强团队沟通和协作,及时解决问题。

工具方面:

1、使用版本控制系统:使用版本控制系统,如Git,可以方便地跟踪和管理代码变更。通过分支和合并操作,可以避免冲突和错误,提高团队协作效率。

2、使用项目管理工具:使用项目管理工具,如Jira或Trello,可以方便地跟踪和管理任务进度。通过设定任务优先级和依赖关系,可以确保项目按时完成。

3、使用自动化测试工具:使用自动化测试工具,如Selenium或Appium等,可以快速、准确地测试软件功能和性能。通过自动化测试,可以节省时间和人力成本,提高测试效率和质量。

通过以上改善计划,可以从流程、方法、工具等方面促进后续开发进度。这将有助于提高团队协作效率、减少返工和沟通成本,并确保项目按时完成。

五、项目中软件工程的体现

版本控制和项目管理系统:如Gitee,用于管理代码的版本和变更。使用Gitee可以方便地进行代码的合并、分支和管理,避免冲突和错误。用于跟踪和管理任务进度。这些工具可以帮助我们更好地理解诗词项目结构、任务分配和进度安排。

图工具:如UMLVISIO,用于进行设计系统结构和关系,方便我们在诗词软件开发过程中清楚明白如何去进行开发

单元测试和集成测试工具:如JUnit或TestNG,用于进行诗词相关功能单元测试和集成测试。这些工具可以帮助项目成员发现和纠正问题,提高软件质量。

Windows窗体应用一种使用.NET Framework的智能客户端组件,可以用于诗词网站显示信息、请求用户输入以及通过网络与远程计算机通信。这些窗体是向用户显示信息的可视图面,通常在Windows窗体中放置各种控件,如显示文本框、按钮、下拉框、单选按钮等,并可以开发对用户操作(如鼠标单击或按键)的响应。

SQL Server一种关系型数据库管理系统,由微软公司开发和维护。它支持结构化查询语言(SQL)和Transact-SQL(T-SQL),是一种可伸缩的数据库平台,用于处理大量数据和支持高性能数据访问。我们使用SQL Server实现了一个自建数据库并成功链接到了visual studio。然后我们实现了登录注册,并且登录的时候是检查用户信息是否在数据库里存储,如果没有存储则无法登录。并且注册功能也可以直接写到数据库。

六、其他任务

6.1 读书笔记

《梦断代码》这本书以Chandler项目为主线,展示了软件开发中遭遇的种种问题和挑战。通过阅读这本书,我深感软件开发的不易。在开发过程中,我认识到了软件开发者所面临的困难和挑战。首先,从《梦断代码》中,我认识到了软件开发的不易。软件开发者面对的问题千奇百怪,从代码到项目形态,无不充满了挑战。他们需要处理的问题包括但不限于拖而未决、超出预期的情况、改弦易辙、拦路虎、大量要修复的缺陷等。这些问题在我们的诗词网站项目中同样存在。例如,在我们的项目中,我们遇到了大量的技术问题。从设计到开发,每个环节都充满了挑战。设计上,我们要如何创建出一个能吸引人的、具有创新性的用户界面开发上,我们要如何实现复杂的需求功能,如搜索、游戏玩法等?这些问题都需要我们花费大量的时间和精力去解决。此外,《梦断代码》还让我意识到了软件开发的复杂性。为什么我们不能像造桥一样造软件?这是书中的一个问题,也是我在开发过程中时常思考的问题。造桥是一个完美的过程,从打地基到架钢架,再到逐步添砖加瓦,一切都精确、可控。然而,软件开发却无法做到这一点。在开发过程中,我们经常需要面对未知的问题,需要不断地尝试和探索。同时,《梦断代码》也让我感受到了软件开发中的艺术性。书中提到,软件开发者是工程师还是艺术家,这个问题充满了探讨意义。在开发过程中,我们不仅需要严谨的思维和逻辑,也需要创造性和想象力。我们要如何将用户的需求转化为具体的功能?我们要如何使软件变得更加美观、易用?这些都是我们需要思考和解决的问题。

总的来说,《梦断代码》让我更深入地理解了软件开发的不易和挑战。在诗词网站项目中,我们同样需要面对和解决各种问题。但我相信,只要我们不断学习、不断尝试、不断改进,我们一定能够成功地完成这个项目。同时,我也希望通过这个项目,能够让我更好地理解和掌握软件开发的知识和技能。此外,《梦断代码》还让我认识到了团队合作的重要性。在软件开发中,团队成员之间的沟通和协作是非常重要的。我们需要共同制定计划、分配任务、解决问题和评估进度。只有这样,我们才能确保项目的顺利进行和按时完成。在我们的诗词网站项目中,我们也注重团队合作。我们会定期召开会议,讨论项目的进展和遇到的问题。我们会分工合作,每个人负责不同的任务和模块,以确保项目的进度和质量。同时,我们也会注重沟通和协作的重要性,确保团队成员之间的信息共享和合作默契。

总之,《梦断代码》这本书让我对软件开发有了更深入的认识和理解。通过阅读这本书,我认识到了软件开发的不易和挑战,同时也认识到了团队合作的重要性。在我们的诗词网站项目中,我们将借鉴书中的经验教训,注重团队合作和沟通协作的重要性,以确保项目的顺利进行和成功完成。

6.2 慕课学习

张涵瑞:

王鼎盛:

孟世栋:

6.3个人课程总结

王鼎盛:http://t.csdnimg.cn/EyXkL​​​​​​

张涵瑞:软件工程结课有感-CSDN博客
孟世栋:宝剑锋从磨砺出-CSDN博客

  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值