HydroOJ 從入門到入土(20)已透過的題目顯示 AC 程式碼

Bowen404發表於2024-06-29

定期的程式碼彙總分析和整理是必要的。

個人皮膚裡,透過的題目,直接連結到對應的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 %}

相關文章