Liny_@NotePad

沉迷ACG中

OJClient的一些想法……

YOYO posted @ 2010年4月09日 18:30 in 【草稿】 , 2010 阅读

之前写过MFC的超简单版……直接填ID、密码、题号取代码的……而且也限制了只能操作FNOJ……

Java版的当时只进行了10%……支持多个OJ……登录后可以从列表中选择代码ID来看的……估计是没什么时间搞了……

于是贴贴思路做个纪念吧……

先说一下设想的OJClient应有的功能吧,首先是与具体OJ有关的内容:

  • 用户登录:选择要登录的OJ,输入用户名密码即可登录,程序将保存session。
  • 题库浏览:可以直接输入题目ID,也可以选择题库,程序展示该题库的题目列表,再点进去浏览题目详细内容。
  • 提交源码:输入题号,选择编码类型,放入代码即可提交,程序会自动提供你选择的题目的题号,也可以自己输入。
  • 源码查看:每次提交都有RUN-ID,输入了RUN-ID就可以显示代码及Result。这里可以通过自己输入RUN-ID,也可以根据题目(或查看所有)查看自己的历史提交列表,选择指定的RUN-ID。
  • 用户信息:可以分析用户的Total Submit、Total Accept、Problem Submit、Problem Accept及其他各种状态的值,顺便显示Rank等信息。
  • 修改密码:虽然各个OJ的用户信息是不一样的,但是肯定有修改密码项,一样的也是需要输入原来的密码……

与OJ无关的内容有四个:

  • 代码库:可以管理代码的。这个希望以后通过插件集成来做,目前就不考虑进来。
  • 调试:可以运行代码并显示结果(显示输出和运行时间,如果错误只可能出现CE/RE),也可以导入Input和Output文件来测试是否正确(此时显示的结果将加上AC/WA/PE),这又要提供一个ICompiler接口供不同编译器调用,算是最麻烦的部分 - _ -,但是只做java的话又没什么意思。
  • 题目注释:程序会内置一个数据库,你可以对题目进行标记和注释,这个数据库是可以导出的,方便携带……
  • 代码高亮:没什么想法,大概是正则解决吧。

那么现在大部分模块的实现方法是直接模拟HTTP发送POST或GET请求给OJ的WEB服务器,对返回的内容进行解析,提取出里面的代码。

不同OJ返回的内容不同,解析方式自然也不一样,因此抽象出一个IOJClient接口,提供公共方法的定义。

用户登录时通过反射查找实现了IOJClient的类,对其调用指定方法,整理成一个List来供用户选择要用哪个OJ。

界面部分内容实际上是一样的,只是对返回的数据提供辅助操作,例如复制到剪贴板和保存到文件的按钮,这些都直接操作界面元素可以获得内容,而界面元素的填充则直接使用IOJClient的返回值就可以了。

具体到接口定义,IOJClient里面的方法包括:

  • String getName():返回OJ名字
  • String getURL():返回OJ的URL
  • HashMap<String, String> getCodeType():获得编译器类型列表
  • Boolean login(String username, String password):用户登录
  • UserInfo getUserInfo(String username):获得用户信息
  • Boolean changePassword(String username, String password, String newpassword):修改密码
  • List<ProblemSet> getProblemSetList():获得题库列表
  • List<Problem> getProblemList(Integer problemSetID):获得题库的题目列表
  • Problem getProblemInfo(Integer problemID):获得题目的内容
  • List<Source> getProblemSource(Integer problemID):获得题目的历史提交列表,若pID=0,就是全部历史咯。
  • Boolean submitSource(Source source):提交代码
    Source getSourceInfo(Integer sourceID):获得提交详细信息

这里的ProblemSet、Problem和Source是定义的Bean,用来格式化存储数据。

注意返回的List不是全部数据都读了的,只是对必读项进行读取,到具体查看Info时才需要读取全部信息。

具体OJ各写个类来实现IOJClient应该就可以了,为了简化开发,可以提供NetUtils一类的辅助类。想法结束 > <

  • 无匹配

登录 *


loading captcha image...
(输入验证码)
or Ctrl+Enter