山东大学-VirtualJudge-总结7

在过去的几天时间里面,我主要集中精力实现Contest 的的Rank以及Status功能

Rank实现代码####

###前端
<br>
<table class="table table-bordered table-hover text-center" id = "rank_table">
    <thead>
    </thead>
    <tbody>
    </tbody>
</table>

<script type="text/javascript">
    function str_pad_left(string,pad,length) {
        return (new Array(length+1).join(pad)+string).slice(-length);
    }

    function secondsToTime(secs)
    {
        var hours = Math.floor(secs / (60 * 60));

        var divisor_for_minutes = secs % (60 * 60);
        var minutes = Math.floor(divisor_for_minutes / 60);

        var divisor_for_seconds = divisor_for_minutes % 60;
        var seconds = Math.ceil(divisor_for_seconds);

        return hours + ":" + str_pad_left(minutes,'0',2)+':'+str_pad_left(seconds,'0',2);;
    }
    function refreshRankList(){
        $.ajax({
            type: "post",
            url: "/contest/" + {{ contest.id }} + "/rank/",
            dataType: "json",
            success: function(data){
                $("#rank_table tr").remove();
                thHTML = "<tr><th class=\"text-center\">Rank</th><th class=\"text-center\">ID</th><th class=\"text-center\">Solve</th><th class=\"text-center\">Penalty</th>"
                $.each(data.statsinfo, function(i, item){
                    thHTML += "<th class=\"text-center\">" + item.probid + "</th>";
                });
                thHTML += "</tr>";
                $("#rank_table thead").append(thHTML);
                rank_num = 0;
        var last_solved = -1;
        var last_penalty = -1;
        var rank_list=[];
                $.each(data, function(i, item) {
                    if (item != data.statsinfo) {
                rank_list.push(item);
            }
            });
            rank_list.sort(function(a,b){return a.solved==b.solved?a.penalty-b.penalty:b.solved-a.solved;});
                $.each(rank_list, function(i, item) {
                    if (item != data.statsinfo) {
                if(item.solved!=last_solved || item.penalty!=last_penalty)
                            rank_num += 1;
            last_solved=item.solved;
            last_penalty=item.penalty;
                        trHTML = "<tr><td style=\"align:center;\">" + rank_num +
                        "</td><td class=\"text-center\">" + item.name +
                        "</td><td>" + item.solved +
                        "</td><td>" + item.penalty + "</td>";
                        $.each(item.probs, function(i, pitem){
                            if (pitem.acNum == 0) {
                                if (pitem.failNum == 0) {
                                    trHTML += "<td></td>";
                                } else {
                                    trHTML += "<td style=\"background-color: red; color:white;\"><br><span>(-" + pitem.failNum + ")</span></td>";
                                }
                            } else {
                                if (pitem.failNum == 0) {
                                    trHTML += "<td style=\"background-color: #99FF66;\">" + secondsToTime(pitem.acTime) + "</td>";
                                } else {
                                    trHTML += "<td style=\"background-color: #99FF66;\">" + secondsToTime(pitem.acTime) + "<br><span>(-" + pitem.failNum + ")</span></td>";
                                }
                            }
                        });
                        trHTML += "</tr>"
                        $("#rank_table tbody").append(trHTML);
                    }
                });
                thHTML = "<tr><td></td><td></td><td></td><td></td>";
                $.each(data.statsinfo, function(i, item){
                    thHTML += "<td style=\"background-color: #D0D0D0;\">" + item.acNum + "/" + item.tryNum + "</td>";
                });
                thHTML += "<tr>"
                $("#rank_table tbody").append(thHTML);

            }
        });
    }




    $(document).ready(function () {
    refreshRankList();
    //setInterval(function(){refreshRankList();},10000);
    })
</script>

###后台
def contest_rank(req, cid):
    if req.is_ajax():
        contest = Contest.objects.get(id = cid)
        if contest.private:
            if req.user.is_superuser==False and req.user.info not in contest.accounts.all() :
                return JsonResponse("{}")
        rank_cache = contest.rank
        # print("rank_cache:")
        # print(rank_cache)
        status_list = Status.objects.filter(cid = cid).filter(runid__gt = contest.last_submit_id).order_by("time")
        # print("status_list")
        # print(status_list)
        rank_dict = json.loads(rank_cache)
        # print("rank_dict")
        # print(rank_dict)
        statsinfo = {}
        pos = 0
        problem_list = contest.get_problem_list()
        length = len(problem_list)

        
        if contest.last_submit_id==0:
            rank_dict["statsinfo"] = [{} for i in range(length)]
            for item in problem_list:
                rank_dict["statsinfo"][pos] = {"probid" : chr(pos + 65) ,"acNum" : 0, "tryNum" : 0}
                statsinfo[item[2].title] = {"pos" : pos}
                pos += 1
        else:
            for item in problem_list:
                statsinfo[item[2].title] = {"pos" : pos}
                pos += 1

        for item in status_list:
            if item.user.is_staff :
                continue
            name = item.user.username
            contest.last_submit_id = max(contest.last_submit_id, item.runid)
            if name not in rank_dict.keys():
                rank_dict[name] = {"name" : name, "solved":0, "penalty":0, "probs" : [{"failNum" : 0, "acNum" : 0, "acTime" : 0} for i in range(length)]}

            pos = statsinfo[item.pro.title]["pos"]

            if item.result == 3: #Waiting
                break

            if item.result == 0: #Accepted
                rank_dict["statsinfo"][pos]["acNum"] += 1
            rank_dict["statsinfo"][pos]["tryNum"] += 1

            if rank_dict[name]["probs"][pos]["acNum"] == 0:
                if item.result == 0:
                    rank_dict[name]["probs"][pos]["acNum"] += 1
                    rank_dict[name]["probs"][pos]["acTime"] = dateToInt(item.timec - contest.start_time, 1)
                    rank_dict[name]["penalty"] += 20 * rank_dict[name]["probs"][pos]["failNum"] + dateToInt(item.timec - contest.start_time, 0)
                    rank_dict[name]["solved"] += 1
                else:
                    rank_dict[name]["probs"][pos]["failNum"] += 1
        contest.rank = json.dumps(rank_dict)
        # print("contest.rank")
        # print(contest.rank)
        contest.save()
        return JsonResponse(rank_dict)

Status实现代码####

###前端
</br>
<table class="table">
    <thead>
    <tr>
        <th>RunID</th>
        <th>Problem</th>
        <th>Status</th>
        <th>Language</th>
        <th>User</th>
        <th>SubmitTime</th>
    </tr>
    </thead>
    <tbody>
    {% for item in status_list %}

        <tr
                {% ifequal item.result 'Waiting' %}
                    class="info"
                {% endifequal %}
                {% ifequal item.result 'Accepted' %}
                    class="success" 
                {% else %}
                    class="danger"
                {% endifequal %}
         >
            <td>{{ item.runid }}</td>
            <td><a href="//www.greatytc.com/problem/{{ item.pro.proid}}">{{ item.pro.title }}</a></td>
            {% ifequal item.pro.isCCF True %}
                 <td>{{ item.score }}</td>
        {% else %}
            {% ifequal item.result "Compilation Error"%}
            <td><a href="/show_source?solution_id={{ item.runid }}" target="_blank">{{ item.result }}</a></td>
            {% else %}
            <td>{{ item.result }}</td>
            {% endifequal %}
            {% endifequal %}
            {% ifequal item.user.id user.id %}
                <td><a href="/show_source?solution_id={{ item.runid }}" target="_blank">{{ item.result }}</a></td>
            {% else %}
            {% ifequal user.is_staff True %}
            <td><a href="/show_source?solution_id={{ item.runid }}" target="_blank">{{ item.result }}</a></td>
            {% else %}
            <td>{{ item.lang }}</td>
            {% endifequal %}
            {% endifequal %}
            <td>{{ item.user.username }}</td>
            <td>{{ item.time | date:"Y-m-d H:i:s" }}</td>
        </tr>
    {% endfor %}
    </tbody>
</table>
<center>
<ul class="pagination">
    <script type="text/javascript">
        //$(document).ready(function () {
        function request_contest_status(pg){
            $.ajax({
                    type: 'get',
                    url: "/contest/" + {{ contest_id }} + "/status/?pg=" + pg,
                    success: function (responseData) {
                        $('#panel-status').html(responseData);
                    }
            })
        }
    </script>
    {% for id in page %}
        <li><a class="{% if pg == id %}active{% else %}disabled{% endif %}"
               href="javascript:request_contest_status({{ id }});">
            {{ id }}
            </a>
        </li>
    {% endfor %}
</ul>
</center>


###后台
def contest_status(req, cid):#has understood
    if req.is_ajax():
        contest = Contest.objects.get(id=cid)
        t = loader.get_template('contest/contest_status.html')
        status_list = Status.objects.filter(cid=cid).order_by('-time')#need change
        if contest.private:
            if req.user.is_superuser==False and req.user.info not in contest.accounts.all() :
                status_list = []
        pg = req.GET.get('pg')
        if not pg:
            pg = 1
        pg = int(pg)

        max_cnt = status_list.count() // 20 + 1
        start = max(pg - PAGE_NUMBER_EVERY_PAGE, 1)
        end = min(pg + PAGE_NUMBER_EVERY_PAGE, max_cnt)

        lst = status_list[(pg - 1) * LIST_NUMBER_EVERY_PAGE:pg * LIST_NUMBER_EVERY_PAGE]

        # content_html = t.render(Context({'status_list': lst, 'page': range(start, end + 1), 'contest_id': cid, 'user': req.user}))
        # return HttpResponse(content_html)
        return render(req,'contest/contest_status.html',{'status_list': lst, 'page': range(start, end + 1), 'contest_id': cid, 'user': req.user})
    else:
        raise Http404

功能效果截图####

contest-status
contest-rank
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,294评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,493评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,790评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,595评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,718评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,906评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,053评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,797评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,250评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,570评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,711评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,388评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,018评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,796评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,023评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,461评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,595评论 2 350

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,830评论 25 707
  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 12,066评论 4 62
  • 上一章 陆亦风和林思凡到家后,张诚和罗慧敏早已等在一边,看到二人同时进门,罗慧敏暧昧道:“小两口去哪儿约会了,这么...
    狐狸九阅读 328评论 0 4
  • 我的梦里有两队马, 一队白马上天山, 一队黑马下南疆。 一队为迎亲, 一队是赶丧。 一队在途中遇到僧侣点头含笑, ...
    唐诗远阅读 1,192评论 4 13
  • 什么是三观? 人生观、世界观、价值观。(人生观就是自己为什么活着,活着要干什么;世界观就是你对世界的认识,这个东西...
    请叫我徐老师x阅读 342评论 0 1