HydroOJ 从入门到入土(20)已通过的题目显示 AC 代码

定期的代码汇总分析和整理是必要的。

个人面板里,通过的题目,直接链接到对应的AC记录。用处就是可以按人汇总,便于学生自己整理,以及老师分析学生。

权限:看不了别人代码的人,依然看不了别人代码。

效果

修改后端

进入 user.ts 文件 435 行左右:

cd /usr/local/share/.config/yarn/global/node_modules/hydrooj/src/handler
vi user.ts +435

class UserDetailHandler 类中,this.response.bodythis.response.template = 'user_detail.html'; 中间加入如下代码,并在 this.response.body 中加入 psdict,

		const psdict = {};
        if (this.user.hasPriv(PRIV.PRIV_USER_PROFILE)) {
            const domainIds = Array.from(new Set(pdocs.map((i) => i.domainId)));
            await Promise.all(
                domainIds.map((did) =>
                    problem.getListStatus(
                        did, uid,
                        pdocs.filter((i) => i.domainId === did).map((i) => i.docId),
                    ).then((res) => Object.assign(psdict, res))),
            );
        }
        
        this.response.body = {
            isSelfProfile, udoc, sdoc, pdocs, tags, tdocs, psdict,
        };

修改前端

在前端插件的 templates 中,从源代码中复制一个user_detail.html,114 行左右。

cd ~/.hydro/addons/addon/templates
cp /usr/local/share/.config/yarn/global/node_modules/@hydrooj/ui-default/templates/user_detail.html user_detail.html
vi user_detail.html +114

主要修改内容:在遍历 pdocs 过程中,插入 ac 代码链接,参考题库页面的实现进行修改。

{% for pdoc in pdocs %}
                        {% set psdoc = psdict[pdoc.domainId + '#' + pdoc.docId] %}
                        <li>{{ problem.render_problem_title(pdoc, show_tags=false, small=true) }}

          {% macro render_status_td(rdoc, rid_key='_id', class='', allDomain=false, short=false) %}
    <a 
      href="{{ url('record_detail', rid=rdoc[rid_key], domainId=rdoc.domainId) if allDomain else url('record_detail', rid=rdoc[rid_key]) }}"
      class="record-status--text {{ model.builtin.STATUS_CODES[rdoc.status] }}"
    >
      {% if typeof(rdoc['score']) == 'number' %}
      <span style="color: {{ utils.status.getScoreColor(rdoc.score|default(0)) }}">code</span>
      {% endif %}
    </a>
  {% if rdoc.status == STATUS.STATUS_JUDGING %}
      <div class="col--status__progress" style="width: {{ rdoc['progress']|default(50)|int }}%"></div>
  {% endif %}
{% endmacro %}

          {% if psdoc['rid'] %}
            ({{ render_status_td(psdoc, rid_key='rid', class="edit-mode-hide", allDomain=pdoc.domainId!==handler.args.domainId) }})
          {% else %}
            ()
          {% endif %}
                        </li>
                        {% endfor %}
posted @ 2024-06-29 18:56  Bowen404  阅读(185)  评论(2编辑  收藏  举报