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.body
和 this.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 %}