锐评大学时期做的项目

2022-02-27

作为ZJU软件工程的大好学子,在校期间肯定做过一大堆有趣(乱七八糟)的项目。其中大部分是课程项目,小部分是业余时间完成。此时此刻突然有感而发,想要锐评一波当年的项目,乐呵乐呵。权当欣赏(吐槽),莫上纲上线,也莫拿来做面试考察!


图书管理系统

地址:https://github.com/Elliotloststh/Library-Management

是老掉牙的管理系统,但作为本人第一个大型(算是吧)课程项目,还是有必要康一康。

这是数据库课程的期中作业(为啥数据库要做个管理系统?好吧只是为了让我们连下数据库玩玩)。当初摆在大伙面前的有两条路,一是做个web,而是做个本地软件,大二的我懵懂无知,选择了用Qt写一个本地软件,毕竟当时我只会用c++ 🤡。

进入src目录,好家伙所有资源和代码都堆一起了,可以理解,方便嘛哈哈哈哈。

所幸当时存了图片,还能看到界面的样子:

不得不说,功能还是很完善的,不仅有图书入库,搜索图书,借还书功能,特喵居然还有借书证功能。这些数据可不是我写死的,是真的本地建了几张表,然后Qt-mysql模块连的。但是我最大的印象还是这个分页,因为我一直调整不好分页的样式,之后怎么解决的我忘了,总之折磨了我几天,让我下定决心不写前端!

MiniSQL

地址:https://github.com/Elliotloststh/minisql

这位更是重量级,是数据库课程的期末作业,从名称可以看出,是做一个小型的MySQL(含金量)。先别惊讶,当然这个项目离MySQL差的不只10086个十万八千里,原理也没有那么复杂。

记得这个项目是五人小组协作的,分别对应:

  • Interpreter与API:解释器,从命令行输入到实际执行。API,根据解析的命令向下执行不同的方法
  • CategoryManager:管理表、库的元数据,包括字段属性等
  • RecordManager:负责记录的读写,向下调用BufferManager,向上对接API
  • BufferManager:负责与底层文件系统交互,提供读写文件块(block)的能力
  • IndexManager:负责索引模块,构建B+树

我负责RecordManager兼任组长,现在回想那段时间有些峥嵘岁月的意思了,大家在图书馆或咖啡馆彻夜讨论,不断尝试。也是第一次用github而不是qq群做版本管理与协作,虽然后来发现别的组都直接用github上开源的改一改,但是值得!

时间久远,具体的细节我已记不太清,RecordManager大概逻辑是:每张表是一个二进制文件。读写以块为单位,块的大小是4kb。块的第一个字节用来标记dirty的数据,也就是已经写了多少字节。一条记录包含所在块数与块内的offset位置,从而做到读写。insert是在块末尾添加数据。delete是把最后一条记录替换被删除的记录,然后把最后的记录删除。另外也要同步更新索引。

IndexManager的大致逻辑是:索引也是一个二进制文件,每次启动,都会根据其在内存构建一棵B+数,B+树存储来记录的位置与offset,然后用到索引的字段会走索引。

其他我记不太清了,Interpreter与语法树有关,CategoryManager是单纯的管理,BufferManager涉及到FILE文件系统的交互。

如果你是mac,地址中有可执行文件,可以尝试一下。

区块链溯源系统

地址:https://github.com/Elliotloststh/SupplyChain

没想到哥们还写过区块链dapp,基于truffle,用solidity语言编写的。内容大致是一个商品信息录入与查询系统,关键是信息是存到区块链上的,所以无法更改,这也是当年区块链最大的噱头,不过这么多年过去了,区块链却还是一个用来炒的东西,现在火的什么web3,我也没看懂,不知道是不是又一轮噶韭菜。

现在回想这些都不重要,我要是当年多买几个比特币,我现在就财富自由了,恨啊。

ZJU-WIKI

浙大百科(ZJUWiki)是我跟一个朋友在大二时候运营的一个网站,技术上很简单,基于MediaWiki,只需要改一些配置文件,就可以生成一个和维基百科差不多的网站,添加wiki、搜索wiki等功能都是自带的。我们租了一台阿里云服务器,运行在上面。

建立的初衷是面向浙大学生,对在浙学习生活的相关信息进行收集与解释的网站。主体目标是“向知之甚少的同学们提供对一些词汇/地点/流程的解释”。例如名词的解释,地点的解释。像很多同学刚入校不知道所谓纳米楼所谓bg是什么意思,zju-wiki会记录这些,因此它不但可以作为一个百科网站,也沉淀了浙大的很多底蕴。

当然,想法是很美好的,现实是残酷的。作为两个理工男,运营工作成为了我们面前最大的难关。虽然我觉得我们做的尽力了,但结果不尽如人意。我们自己编写了接近200个词条,后面建立了编者群,期望人多力量大(或许这就是toC吧)。

以及各种规则流程

最后编者群有了36人,也有10条左右用户编写的词条,但绝大部分时间用户都在群里水群🤣,最终我们没有钱续费服务器,zju-wiki宣告倒闭。

JHPlayer

地址:https://github.com/Elliotloststh/JHPlayer

这是Java课程作业,因为大三那年,各大音乐软件版权竞争激烈,时常有些歌网易有,qq没有,有些歌qq有,网易没有。于是我做了一个聚合qq、网易云、酷狗三大主流平台的播放器。技术上是个本地软件,UI是swing写的,mysql存储用户信息、歌曲收藏记录。可以在线搜索三大平台歌曲,收藏或下载,当然也支持播放。

媒体播放是用的一个开源库魔改的。搜索实际上类似爬虫,用关键词去调用三个平台的搜索接口,然后聚合到一起。至于拿歌曲的mp3文件也是类似,靠发现的规则去取media文件。这里面酷狗是最简单的,网易云是js加密的而且很复杂,我后面把加密的代码拷贝下来,用ScriptEngineManager在jvm跑js解密的。qq好像有反爬措施,有几率失败,好像当时也没有去管。

ZJU-ChatRoom

地址:https://github.com/Elliotloststh/ZJU-ChatRoom

为什么前缀都要带ZJU?因为这也是课程作业。用boost::asio网络库写的聊天室,包含客户端与服务端。还是本地软件,界面用qt写的(毕竟两个组员都不会写前端)。年少无知的我们,完全不知道有开源库这种东西,网络层的东西,像连接管理、协议设计都是用socket手写的,搞出的是个既像无状态服务器,又像websocket的怪东西,虽然写的略粗糙,但是能用!

协议如下,一共12个字节

1
2
3
4
5
6
7
8
9
10
11
12
13
/*
* The lay out of header is like following:
* | protocol | extra message | encoding | content type | content length| time |
* Some illustration:
* 1. protocol, specify that what the data is for.
* 2. extra message, specify whether extra message exsists. Note this solt
do not store the extra message. If extra message exsists, the value
of it is set to the length of extra messge.
* 3. encoding, specify the encoding the data uses
* 4. content type, specify the content's type, such as file, picture...
* 5. content length, specify the length of the content.
* 6. timestamp, which value represent the seconds from Jan.1, 1970 to now.
*/

然后消息传递是一个block一个block传递的,在服务端组装成完整的消息。

至于功能的话,账号管理、加好友、进聊天室、发消息收消息。细节不清楚了,记得服务端维护了client列表(ip+端口),也维护了聊天室id与在聊天室client的列表(是的,虽然有用户概念,但只用来登陆,完全靠client管理)。Qt我本地删掉已经跑不起来,看不了了,可惜。

NinjaMustDie

地址:https://github.com/Elliotloststh/NinjaMustDie

简单的不能再简单的小工具,但是因为在当时的场景很有趣所以拿出来说。

大三那年,和室友在玩一款手游,叫忍者必须死3,一款水墨风格战斗跑酷游戏。但这个游戏最大的重点是家族系统以及家族战系统,每周六周日家族之间大战,高手在众多家族成员的关注下进行1v1男人大战,也有团队战,3v3各种回合,总之家族的凝聚力因为这种模式变得无比强大。简直比现实朋友还亲近,当然后面也面基了很多人。值得一提最大成就,当时作为族长带领家族还在全国大赛拿到了第36名。

当时这游戏时不时的会放出兑换码兑换各种奖励,于是跟舍友做了一个领奖励工具,只要一个人输入兑换码,全家族的人都可以拿到奖励。后端是Spring,前端把官方的页面拷贝了下来,freemaker渲染。

时过境迁,当时1分钟99+的qq群已经没人说话,朋友们也全部弃坑,这个工具自然也不复存在,感概呀。

AR篮球

地址:https://github.com/Elliotloststh/ARBasketball

大三下,大家都在实习,结果有一门ios程序设计还要搞个大作业,大无语。我跟组员(其实是舍友),用三天时间搞出来一个AR篮球,不过这个项目还是比较有趣的。

AR篮球,顾名思义,用了苹果的AR技术,项目会调用相机,然后放一个篮筐在镜头内(就是AR了)。然后手指向前滑动,手也跟着摆动作出投篮的动作,可以扔出篮球(原理就是算物理加速度),每个player轮流仍最后比分。

吐槽的地方就是扔出去的力度和方向非常难以把控,十个能扔进一个不错了= =


其实还有不少项目,比如各种网站、一些小工具,但是本身作为校园时期的项目没什么技术含金量,也不够有趣,这里就不贴了。携来百侣曾游。忆往昔峥嵘岁月稠。恰同学少年,风华正茂;书生意气,挥斥方遒。就写到这吧,over!