《学生防疫信息管理软件》是基于C#语言开发的一款为监控和管理学生疫情信息而开发的应用型软件,开发环境为Visual Studio 2019 版,使用C#Winform窗体进行开发。是集成前端交互界面、后端数据处理和信息文件存储为一体的软件项目。
目录
Hello!大家好,我是灰小猿!
最近在做一个C#的课设开发,是一款用于学生健康防疫信息监控的软件,在这里和大家分享记录一下软件的结构和开发思路。
软件简介
《学生防疫信息管理软件》是基于C#语言开发的一款为监控和管理学生疫情信息而开发的应用型软件,开发环境为Visual Studio 2019 版,使用C#Winform窗体进行开发。集成前端交互界面、后端数据处理和信息文件存储为一体,在前端界面的设计上主要用到的技术有winform窗体的构建、panel容器的合理使用、子窗体切换效果的实现、单选框的实现及独立页面间的数据通信等;后端数据处理上主要用到的技术是:结构体、数组列表、全局变量、类的继承、构造函数、IO流文件存储、窗体的Controls函数等。前后端通过交互从而实现模块间的相互通信。同时力求降低模块耦合性、提高软件的可维护性。
关键字:Winform窗体 结构体 模块化设计
1、开发背景
随着2020年新冠疫情的全球爆发和不断蔓延,人们的社会生活受到严重的危害和损失,中国人民团结一心、顽强抗疫,在春暖花开之际终将疫情控制,尽最大的努力抑制了疫情的进一步蔓延,在最短的时间内有序的复工复产,但与此同时,中国人民的抗疫并没有就此结束,全国各地的外来输入病例仍有增长的噱头,我们在生活的每一个角落依然与疫情斗争着,因此对每一个的身体和发热情况进行实时监控是十分必然的举措。尤其对于高校来说,来自全国各地的学子返校,做好高校的疫情防控是广大高校确保学生生活安全的必要措施。
《学生防疫信息管理软件》针对广大搞笑的每一个学生,进行返校信息采集入库,甄别学生信息、确认学生是否存在发热和疫区风险,同时对学生每日体温实时记录,发现超标体温,系统及时提醒并将信息单独列出反馈。做到确保每一位学生的身体健康。有效提升校园防控力量。
2、总体设计
2.1、设计思路
《学生防疫信息管理软件》的设计通过前端交互页面录入信息,后端通过结构体和数组列表对数据进行存储,同时在前端有学生信息录入、学生信息查询、每日体温录入、学生信息修改、学生信息删除、显示所有信息和显示健康状态异常信息等模块,通过用户对相应模块的选择,在软件后端对数据尽心相应的处理,由于各个窗体之间是无法直接进行数据传输的,这时我们需要建立相应的函数,对窗口类进行实例化,通过调用相应的函数对数据进行处理和在界面实时输出。由于数据有序的存储在数组列表中,因此所有的模块化操作归根结底都是对数组列表内部相应的数据的处理。
2.2、系统流程图
编辑
2.3、软件界面设计
编辑
软件界面采用板块分离的设计思路,界面分为上下左右四部分,上部为“学生防疫信息管理软件”标题控件;左部分为panel1容器,内部存放各功能按钮,右部分为panel2容器,用来存放和显示各模块的小窗体,下部分为panel3容器,内部显示当前已录入学生人数和异常学生人数,并且可以实时的通过数据更新按钮对数据进行实时的更新。
3、详细设计
3.1、学生信息录入模块
编辑
学生信息录入窗体(formMainInput)通过子窗体在主窗体中显示,用户可以通过该窗体录入学号、姓名、专业、班级、何地返校、何时返校、是否发热、是否去过疫区等信息,在formMainInput的类中调用formMain类中的信息录入函数,将数据传入主类并且在主类中定义结构体,对相应的属性在结构体中定义,并且将数据通过结构体在数组列表中进行存储。同时系统后台还会对用户输入的学号进行分析,分析是否出现学号重复的现象,如果学号重复,则进行弹窗提醒并且不对信息给予记录。
//定义一个方法让学生信息通过窗口录入模块 public void inputStudentInfo(string num,string name, string major, string classa,string site, string time,string fever,string epidemic) { Boolean different_info = true; //设定布尔值,默认录入的信息不冲突 foreach (Student sa in studentList) { //如果录入的学号已经存在,则different_info为false if (sa.num == num) { different_info = false; MessageBox.Show("该生信息已录入!\n请重新录入!"); } } if (different_info) { Student s = new Student(); s.num = num; s.name = name; s.major = major; s.classa = classa; s.site = site; s.time = time; s.fever = fever; s.epidemic = epidemic; studentList.Add(s); //将录入的信息加入到数据列表 //打开文件对其进行写入 FileStream fs = new FileStream(path, FileMode.Append); //设定写入的字符流 StreamWriter sw = new StreamWriter(fs, Encoding.Default); sw.WriteLine(s.num + "\t" + s.name + "\t" + s.major + "\t" + s.classa + "\t" + s.site + "\t" + s.time + "\t" + s.fever + "\t" + s.epidemic); sw.Close(); fs.Close(); MessageBox.Show("添加成功!", "提示"); } }
3.2、学生信息查询模块
编辑
编辑
学生信息查询模块(formMainInqir)基于学生学号进行查询,在前端学生将学号输入并确认查询后,后台会根据用户输入的学号遍历存储信息的数组列表,如果查询到则会在以上的界面中显示学生的信息,并且由于仅仅是查询而并非是修改信息,所以信息的显示是不可编辑的状态,如果遍历数组列表后发现信息并没有相同的学号,系统则会发出提示,提示用户输入的学号不存在。
//学生信息查询模块 public void inquireStudentInfo(string num) { Boolean exist_info = false; //设定布尔值,默认该生信息不存在 foreach (Student sa in studentList) { //如果查询的学号已经存在, if (sa.num == num) { exist_info = true; //显示该生信息 FormInfo formInfo = new FormInfo(sa.num,sa.name,sa.major,sa.classa,sa.site,sa.time,sa.fever,sa.epidemic,sa.everheat); //为显示学生信息的窗体实例化 formInfo.ShowDialog(); //显示窗体 } } if (!exist_info) { MessageBox.Show("该生信息不存在!", "警告"); } }
3.3、学生每日体温录入模块
编辑
学生每日体温录入模块(formMainEver)基于学生学号对学生信息进行查询,若在属数组列表中查询到相匹配的学生信息则会调取该学生信息,并且将获取到用户输入的今日体温,记录在数组列表中,同时系统还会自动对用户输入的今日体温进行判断,如果录入的体温高于37.3度则会将该学生的信息列为异常发热信息,之后便会将该学生信息突出显示。如果未查询到该学生学号信息则会提醒用户学号输入有误!
//每日体温录入模块 public void everHeat(string num, string everheat) { Boolean exist_info = false; //设定布尔值,默认该生信息不存在 for(int i = 0;i<studentList.Count;i++) { Student sa = (Student) studentList[i]; //如果查询的学号已经存在, if (sa.num == num) { exist_info = true; //将今日体温录入 //新建一个Student类型对象,接收该学生信息 Student s = new Student(); s.num = sa.num; s.name = sa.name; s.major = sa.major; s.classa = sa.classa; s.site = sa.site; s.time = sa.time; s.fever = sa.fever; s.epidemic = sa.epidemic; s.everheat = everheat; //如果该生体温大于37.3度,则属于发热人群 if (Convert.ToDouble(s.everheat) > 37.3) { s.fever = "是"; } studentList.Remove(studentList[i]); //将之前的信息删除 studentList.Add(s); //将新录入的信息加入列表 MessageBox.Show("今日体温录入成功!","提示"); break; } } if (!exist_info) { MessageBox.Show("该生信息不存在,\n无法录入!", "警告"); } }
3.4、学生信息修改模块
编辑
编辑
学生信息修改模块(formMainAmend)同样是基于学生输入的学生学号对存储的学生信息进行查询,如果出现了与之相匹配的学号信息,则会将该学生信息在新窗口中进行显示,此时该学生的信息是可编辑的状态,用户可以根据之前录入的信息对学生的信息进行修改,同时在系统后台也会对用户修改的信息进行及时的更新,并且对新录入的信息重新打进行判断,判断信息是否是属于异常信息或则发热人群,倘若没有查询到该学号的信息,则会对用户进行相应的提示。
//修改学生信息模块 public void amendInfo(string num) { Boolean exist_info = false; //设定布尔值,默认该生信息不存在 for (int i = 0; i < studentList.Count; i++) { Student sa = (Student)studentList[i]; //将列表值强制转换成Student型 //如果修改的学号已经存在, if (sa.num == num) { exist_info = true; FormAmend formAmend = new FormAmend(sa.num, sa.name,sa.major,sa.classa,sa.site,sa.time,sa.fever,sa.epidemic,sa.everheat); studentList.Remove(studentList[i]); //将信息删除 formAmend.ShowDialog(); } } if (!exist_info) { MessageBox.Show("该生信息不存在!", "警告"); } } //将新修改的信息写入 public void amendStudentInfo(string num, string name, string major, string classa, string site, string time, string fever, string epidemic, string everHear) { Student s = new Student(); s.num = num; s.name = name; s.major = major; s.classa = classa; s.site = site; s.time = time; s.fever = fever; s.epidemic = epidemic; s.everheat = everHear; //为放置体温未录入,在这里设置异常抛出 try { //如果该生体温大于37.3度,则属于发热人群 if (Convert.ToDouble(s.everheat) > 37.3) { s.fever = "是"; } } catch { } studentList.Add(s); //将录入的信息加入到数据列表 //打开文件对其进行写入 FileStream fs = new FileStream(path, FileMode.Append); //设定写入的字符流 StreamWriter sw = new StreamWriter(fs, Encoding.Default); sw.WriteLine(s.num + "\t" + s.name + "\t" + s.major + "\t" + s.classa + "\t" + s.site + "\t" + s.time + "\t" + s.fever + "\t" + s.epidemic); sw.Close(); fs.Close(); MessageBox.Show("修改成功!", "提示"); }
3.5、学生信息删除模块
编辑
学生信息删除模块(formMainRemove)基于学生学号对学生信息进行查询,如果查询到该学生的信息,则会对用户进行二次的确认,确认用户是否真的删除该信息,如果用户选择确认删除,则会将该学生信息从存储学生信息的数组列表中进行删除,如果用户选择取消,则删除操作则会终止。并且如果学生学号未在系统中查询到,则会提醒用户输入的学号信息有误。
//删除学生信息模块 public void removeInfo(string num) { Boolean exist_info = false; //设定布尔值,默认该生信息不存在 for (int i = 0; i < studentList.Count; i++) { Student sa = (Student)studentList[i]; //将列表值强制转换成Student型 //如果删除的学号已经存在, if (sa.num == num) { exist_info = true; DialogResult result = MessageBox.Show("您确定要删除吗?", "删除提示", MessageBoxButtons.OKCancel, MessageBoxIcon.Exclamation); if (result == DialogResult.OK) { studentList.Remove(studentList[i]); //将信息删除 MessageBox.Show("删除成功!", "提示"); } } } if (!exist_info) { MessageBox.Show("该生信息不存在,\n无法删除!", "警告"); } }
3.6、显示所有学生信息模块
编辑
显示所有学生信息模块(formMainAllInfo)会在用户发出显示请求后,遍历整个存储信息的数组列表,并且将每一个学生的信息按照输入和修改的顺序依次输出,
private void allInfoBt_Click(object sender, EventArgs e) { f6.clearText(); //清除上次文本框缓存 //对列表进行遍历,将每一个学生信息写入窗体 foreach (Student sa in studentList) { f6.setAllInfo(sa.num,sa.name,sa.major,sa.fever,sa.everheat); } f6.Show(); groupBox1.Controls.Clear(); groupBox1.Controls.Add(f6); } //定义方法,将每条信息写入文本框 public void setAllInfo(string num, string name, string major, string fever, string everheat) { string studentInfo = " " + num + " " + name + " " + major + " " + fever + " " + everheat + "\r\n"; setAllInfo_text.Text += studentInfo; }
3.7、显示异常信息模块
编辑
显示异常信息模块(formMainUnus)会在用户发出查看请求后,遍历整个存放学生信息的数组列表,并且会对所有的信息进行删选,根据学生是否属于发热人群进行区分,如果学生属于发热人群则会将信息输出在窗口,同时显示学生当前的今日体温,否则不会输出信息。
private void unUsualBt_Click(object sender, EventArgs e) { f7.clearText(); //清除上次文本框缓存 //对列表进行遍历,将每一个学生信息写入窗体 foreach (Student sa in studentList) { //如果身体异常,则将信息写入窗口 if (sa.fever == "是") { f7.setUnusualInfo(sa.num, sa.name, sa.major, sa.fever, sa.everheat); } } f7.Show(); groupBox1.Controls.Clear(); groupBox1.Controls.Add(f7); } public void setUnusualInfo(string num, string name, string major, string fever, string everheat) { string studentInfo = " " + num + " " + name + " " + major + " " + fever + " " + everheat + "\r\n"; setUnusual_text.Text += studentInfo; }
3.8、数据更新模块
编辑
数据更新模块(update_button)基于已经录入的学生信息进行区分,定义异常学生人数变量,然后对整个数组列表进行遍历,如果属于发热异常体质,则会将异常学生人数变量加一,直至将整个列表遍历完毕,然后将得出的已录入的所有学生人数和异常学生人数进行输入。
//更新数据按钮 private void update_button_Click(object sender, EventArgs e) { studentCount.Text = studentList.Count.ToString(); int fevercount = 0; //记录发热人数 foreach (Student sa in studentList) { //如果该生属于发热人群,则feverCount加一 if (sa.fever == "是" ) { fevercount++; } } unUsualCount.Text = fevercount.ToString(); }
4、软件开发总结
《学生防疫信息管理软件》的开发从总体上来说是对C#winform应用的一个很好体现,同时它也属于实际应用型软件的一类,严格按照软件开发的思想,采用前后端分离、模块化设计等,在为了合理开发软件的同时,尽可能的提高程序的效率,减少代码量和提高模块内部数据的内聚性,降低模块耦合性;这样开发的目的也是为了在后期对软件进行维护的时候,可以降低软件维护的复杂性,同时在软件使用的过程中对于出现的错误和异常可以及时的修复,无需修改大量的代码。
在软件的交互界面上,为了提升用户使用的体验感,在软件开发完成后对软件的整体界面和外观进行了较为细致的优化和美观。目的是为了在提升软件实用性的同时也可以很好的提高用户端使用体验感。
好啦!关于《学生防疫信息管理软件》的开发思路就分享到这里,想要源码的小伙伴可以在这里下载“项目源码”,
觉得不错记得点赞关注哟!
大灰狼陪你一起进步!
编辑