作为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 | /* |
然后消息传递是一个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!