本文涉及到的开源项目Github地址:https://github.com/zhblue/hustoj
事件的起因是,计算机学院要举办一个院级的ACM比赛,然后捏… 老师给我提了一个需求,就是能不能把比赛排行榜显示的队名下标注对应的队员,并且如果能在女队(指某个队伍的参赛者都为女生)的队伍名伍名后面标注一个“女队”的标志就好了。
当然,这个事情很简单,我们改个昵称就行了。。我相信老师也是这样想的,所以把这个任务交给了我,我也确实这样干了。
然鹅,,,修改完毕后,在测试的时候发现,有的队伍的昵称没有更新,并且他们在提交答案的时候,在“状态”页并没有发现其提交记录,可以说是很多bug了。
去hustoj的F&Q里寻找答案,果然:
也就是说,如果队名足够长,就会严重影响到其他功能的正常使用。而且仅凭更改昵称实现,无法个性化定制每个部分的样式(颜色、字号、换行等),所以,最好的办法就是——修改源码。
即然要修改源码,我们第一步就是要拿到部署hustoj的那台服务器的ssh权限。(如果是分布式部署,需要拿到部署web服务的那台)。
先在本地终端试一下:
接着输入密码,连接成功:
2.1 生成队伍账号
我们拿到了本次比赛的参赛队伍名单(节选):
2.2 数据处理
2.1 中的表格被保存为:
我们拿python处理一下表格数据,方便我们之后生成其他命令。
生成的结果如下:
这样,我们就相当于整了一个以user_id为键,以信息为值的哈希表,我们只要以某种方式在竞赛排名页内提供这个json串,用javascript操作dom就可以轻松实现。
2.3 重新编码
如何存储上一个步骤我们得到的信息,并让网页能够读取到呢?
-
方案一:直接存为 文件,然后当作一种静态资源,前端可以通过异步请求拿取。
-
方案二:用一个.php文件做中转,从中获取竞赛号,然后返回对应的json字符串。前端通过异步请求拿取。
- 方案二的存储方案一:存在文件里,用读取
- 方案二的存储方案二:存在users表的闲置字段里,拿sql获取
此处,我选择 方案二的存储方案二(因为闲置字段确实比较多)。
我们查看一下 users表的模型,可以看到school字段最适合存。
但是默认长度只有20,我们可以通过修改school字段的大小来解决。或者把json字符串编码一下,缩短一下长度:
如,编码为:
如,编码为:
用Python实现:
运行结果:
编码方式确定了,剩下的就是更新数据库了。
有一种比较偷懒的方式,就是直接生成sql语句,然后复制粘贴到ssh终端里的mysql命令行,挨个执行。
Python编写update sql语句:
运行结果:
我们直接复制粘贴到mysql客户端里执行即可。
PHP是一种在服务器端执行的脚本语言,尤其适用于Web开发并可嵌入HTML中。PHP语法学习了C语言,吸纳Java和Perl多个语言的特色发展出自己的特色语法,并根据它们的长项持续改进提升自己。PHP可以与数据库交互,创建动态内容。
PHP代码不需要编译,而是直接由解释器解释执行。这样就可以在不重启服务器的情况下修改代码,并立即看到效果。这对于快速开发和调试非常方便。
基于这个前提,我们可以直接修改生产环境下的源码并看到效果(不用重启任何程序)。
稍微用点时间,可以找到存放web服务php代码的地方 。
3.1 中转php文件编写(api接口)
我们在 下新建文件夹 ,然后在里面新建一个文件。
然后在get.php填写代码(这里我已经研究完了):
如此,我们访问,就可以得到json字符串了。
3.1 找到显示排行榜信息的php文件
这里有个细节, 确实是排行榜的页面,但是查看具体的代码可以在文件末尾看到这样一行代码:
也就是说, 执行完以后,还要再继续执行,主题下的 contestrank.php。( 只进行了数据的获取,没有编写前端部分)
那么 是指什么呢?
我们可以通过查看 获取。
在该文件,你可以看到这条语句:
修改此处的变量值可以切换主题(如果你不知道,这个是一个很有用的知识),我们也得知其实就是 。
我们最终要修改的文件是:。
3.2 异步请求
直接编写好像有点不太好,最好的方式是把要新增的代码写在另一个文件里,然后在 里引用。
然后在 中的加入代码:
注意: 这条是帮助你定位用的,我们实际插入的代码只有第一条。
接下来我们编辑 。