终于熬过来了!!!
大家好,我是小八,好久不见啊,我今天终于熬完了课设和汇编备考。
现在来分享一下我的战斗经历
我们课设的小组成员由 5 个人组成:周**、小八、赵.**、陈**、曹**
因为复习汇编的时间和课设的时间挤在了一起,导致我们寝室小组最近都经常肝到凌晨两三点,划重点:不建议学弟学妹们这么做!!! 属实很累。
经过是这样的,我们小组确定的课设题目是 校园助手 。
既然是校园助手,肯定得有查成绩、查课表、查地图、聊天、修改个人信息等功能,这样的话,因为我最近在学习前端,组长也在学习服务器开发,于是我们小组就一拍即合,做一个前后端分离的 demo,并且得有一个像校园助手的样子,自然就不能继续用控制台,用黑框框来展示我们的成果了,果断选择 QT 平台。
毕竟要做,就要做一个牛逼的东西!!!先给你们看看登录界面的展示效果吧。
下面的是我们客户端的图标,有没有想到湖工大考试平台的图标呢??
这个界面看似简单,但实际上,后面很多的功能实现、界面跳转、跟服务器的数据请求以及初始化数据都是在这个界面的代码块进行实现,简简单单看看代码就知道了,这个 demo 好歹也是做了大半个月呢。
截图如下:
最大瓶颈出现
而这也仅仅是主界面的一个很小的功能模块的代码块罢了,我还记得当时我们遇到的最大的一个瓶颈就是,实现两台不同设备之间的向服务器端发送请求,并且记录对方 IP,通过服务器作为中转站交互信息。我们小组一直在接触服务器开发的也就是我们的组长——周**,而我也最近才只是刚刚入门计网,我和他也只能仅仅讨论一下,解决的想法。
解决方案
遇到这个问题的时候,我和组长刚开始毫无思路,我就在一个在字节、腾讯、快手等大佬汇集的群里问一问经验和解决方案。
当时毕竟很晚了他们应该已经睡觉了,没有人回我,后来才回复了我。
过了一会,我和组长突然想到了一个办法,那就是通过每个人的固定学号绑定到每个用户的 IP,并固定 IP,就是说等我们连接到服务器之后,再分别在 cmd 里面 ipconfig /all 一下两台设备的 IP,最后改一下服务器端的代码块里面的 IP 地址,岂不是走了一波小捷径?毕竟不知道怎么获取 IP 地址,并实时更新对应用户的 IP,因为 IP 一直是会更新的,一般随着路由的分配形成一个局域网,重连一次网络 DHCP 就会重新分配一次新的 IP,而且咱也实力有限,能想到这个想法,个人觉得已经很不错了。
这虽然说是服务器端的任务,前端只需要直接从服务器获取数据就行了,但这样我对计网也有了更加深层次的了解,知道怎么在实际需求中,进行构思解决方案,并且我还发现,后端要跟着前端的需求走,前端需要什么,后端就得实时进行更新并处理数据,所以感觉后端好惨。
划重点:以后还是要转后端学习的我,先让组长替我受受苦吧,hhhhhhhh。
当然当时这个 demo 的问题还有很多,比如,修改个人信息栏如何实现换行,而不是在一行里面显示,导致显示溢出的问题,当时不知道怎么解决,我就写了一个判断语句,来控制那个信息栏输入字符长度,让个人信息就显示在一行,但不会溢出,就类似于 QQ 个性签名文字个数限制一样。
成果展示
刚刚介绍的只是我们前后端交互当时遇到的一个最大的问题,而我们前端,当时有很多功能,比如:登录,注册,修改密码,显示课程表,班级成员成绩等,都需要从后端获取相应的数据之后,在前端进行逻辑实现,并反馈给服务器。
比如:你在登录的时候,需要输入账号密码之后,将用户数据发送到服务器进行用户信息的遍历,找到是否有匹配的用户,如果没有,那么服务器就会反馈 NO 的信息给前端,自然也就登录不进去,如果有,那么反馈给前端一个 YES,则就能登入客户端,进行查看课表、查成绩等功能。
登录失败前端反馈如下图:
登录成功便进入此界面:
服务器这边的反馈信息如下:
有一说一,看到这个后端是不是觉得很牛逼,我也确实佩服我的组长,一个人能完成所有的前端发来的数据处理,在下属实佩服,不知道你们怎么觉得,反正我还很菜,目前还做不出来一个服务器。
当然还有其他的功能,我就不一一展示了,比如:注册、修改个人信息、忘记密码、展示工大地图、查询成绩等。都是其他小组成员分别负责的几个小模块。
这里科普一下:只要服务器一开,我们打开客户端的时候,对服务器就会三次握手发送连接请求(有兴趣的小伙伴可以去了解一下)。
答辩过程
昨天上午我们找到老师进行了答辩,而且我们小组因为敢于尝试 QT 平台和实现了前后端分离,小组成绩获得了所有小组中的最高分
还记得当时有挺多人来围观我们的课设,小组成员在答辩的时候附近声音属实嘈杂。
当组长答辩完他写的服务器之后,便到我进行对自己的功能模块的答辩了,首先我对老师介绍了我的功能模块,能够实现什么?能够干些什么?
我的解答就是,我的负责的模块可以分为三大块:
1、窗口(mainwidow)、对话框(dialog)、按钮(button)之间的跳转 (QT 自带的信号,槽函数进行实现)
比如这一块就是通过信号和槽来实现对数据传递,并跳转出成绩查询窗口。
代码如下:
1 | void MainWindow1::on_serch_clicked() |
2、在主窗口对服务器发送数据,接收服务器数据
比如下面的代码就是登录之后,将登录用户数据发送给服务器。
代码如下:
1 | this->clint_Login->write(user_msg); |
3、登录功能、课表的查询展示
介绍完之后,老师问了我一个问题,下面的代码是什么意思:
1 | QJsonDocument doc = QJsonDocument::fromJson(UserInfo, &json_error); |
我的回答无疑就是解释它的是怎么用的,通过定义一个QJsonDocument的 doc 对象,把 userinfo 里面的信息进行解析出来获取数据放到 doc 中。
毕竟当时是一边学 QT 一边做的,并不是很了解深层原理,也就只好这么回答了。但老师好像就是要我剖析它的深层原理,对我的答案,并不是很满意,只怪自己当初并没有花更多的时间去研究 QT 吧。
再就是问了一下我的课表是怎么实现的,实现代码在哪?
我的回答就是,其实真的很简单,就是一个插图的办法实现的,通过 new 一个课表类的对象 Class_Schedule 初始化课表,再进行窗口模糊 setModal 和窗口展示 show 进行实现。
跳转代码段如下:
1 | void MainWindow1::on_scotmtb_clicked() |
不过这有很大局限性:因为只能查到自己班的课表。嘻嘻嘻~
我的课设答辩差不多就这样结束了。
不过当时有一个学生在那里跟我们的课设指指点点,我当时就在想:能不能尊重一下我?是我在答辩,不是你!你当你能像毛主席一样指点江山?
希望关注我的小伙伴们以后不会遇到这种人。
总结
说了这么多,总结以下几点:
1、前后端分离,能改善修改代码的效率,不会因为一个小 bug,去修改一整片的代码,从而提高了功能更新的效率。
2、少熬夜,熬夜伤身。(在这里再立一个 flag,2022 年不仅要好好学习技术,还得少熬夜,跟以前一样 11 点之前就睡觉,没事多锻炼一下身体。)
3、bug 常常有,有时候一个 bug 一天都修复不了很正常,慢慢去想就行了,不要急躁,切记,敲代码务必要戒骄戒躁。
4、不知道某个瓶颈怎么解决,可以换一种思路或者方式去解决这个问题,多和同学讨论,或者像大佬请教,上百度找教程等等。(忌:ctrl c + ctrl v)
5、最近计网的知识,能够在实际应用中想到相应的解决方案,并跟组员一同分享。
6、不足就是,组员中除了我都不会用 Git,不然能更高效率实现各功能模块代码的合并,减少很多不必要的麻烦。