From 0923d6e72bec7adade6dbe02dd8f5c9d7a03302e Mon Sep 17 00:00:00 2001 From: masnn Date: Wed, 10 Jun 2020 23:20:36 +0800 Subject: [PATCH] =?UTF-8?q?=E7=95=8C=E9=9D=A2=E8=AF=AD=E8=A8=80=E5=88=87?= =?UTF-8?q?=E6=8D=A2=E5=8A=9F=E8=83=BD=EF=BC=8C=E4=BF=AE=E5=A4=8Dnav?= =?UTF-8?q?=E5=BC=82=E5=B8=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- hydro/handler/domain.js | 4 ++-- hydro/handler/manage.js | 5 +++-- hydro/handler/misc.js | 7 +++++-- hydro/handler/user.js | 11 +++-------- hydro/lib/nav.js | 6 +++--- hydro/loader.js | 5 ++--- hydro/model/builtin.js | 8 +++----- hydro/model/user.js | 14 +++++++++++--- hydro/script/recalcRating.js | 2 +- hydro/script/register.js | 2 ++ hydro/script/setSuperadmin.js | 12 ++++++++++++ hydro/service/server.js | 7 +++---- hydro/service/setup.js | 2 +- templates/main.html | 2 +- templates/partials/footer.html | 2 +- templates/{domain_rank.html => ranking.html} | 0 16 files changed, 53 insertions(+), 36 deletions(-) create mode 100644 hydro/script/setSuperadmin.js rename templates/{domain_rank.html => ranking.html} (100%) diff --git a/hydro/handler/domain.js b/hydro/handler/domain.js index 19e1b54b2..6ff052e45 100644 --- a/hydro/handler/domain.js +++ b/hydro/handler/domain.js @@ -21,9 +21,9 @@ class DomainRankHandler extends Handler { udocs = await Promise.all(udocs); const path = [ ['Hydro', '/'], - ['domain_rank', null], + ['ranking', null], ]; - this.response.template = 'domain_rank.html'; + this.response.template = 'ranking.html'; this.response.body = { udocs, upcount, ucount, page, path, }; diff --git a/hydro/handler/manage.js b/hydro/handler/manage.js index c4607afa6..64be29ad3 100644 --- a/hydro/handler/manage.js +++ b/hydro/handler/manage.js @@ -56,9 +56,10 @@ class SystemScriptHandler extends SystemHandler { this.response.body.path.push(['manage_script', null]); } - async post({ id, args }) { + async post({ id, args = '{}' }) { + args = JSON.parse(args); // TODO Do not use console.log - await global.Hydro.script[id].run(JSON.parse(args), console.log); + await global.Hydro.script[id].run(args, console.log); this.back(); } } diff --git a/hydro/handler/misc.js b/hydro/handler/misc.js index 54f1499f7..3478cb498 100644 --- a/hydro/handler/misc.js +++ b/hydro/handler/misc.js @@ -1,6 +1,7 @@ -const { PERM_JUDGE } = require('../permission'); +const { PERM_JUDGE, PERM_LOGGEDIN } = require('../permission'); const file = require('../model/file'); +const user = require('../model/user'); const db = require('../service/db'); const { Route, Handler } = require('../service/server'); @@ -47,7 +48,9 @@ class StatusUpdateHandler extends Handler { class SwitchLanguageHandler extends Handler { async get({ lang }) { - this.session.language = lang; + if (this.user.hasPerm(PERM_LOGGEDIN)) await user.setById(this.user._id, { viewLang: lang }); + else this.session.viewLang = lang; + this.back(); } } diff --git a/hydro/handler/user.js b/hydro/handler/user.js index 52bc6575e..a54d52a47 100644 --- a/hydro/handler/user.js +++ b/hydro/handler/user.js @@ -138,8 +138,7 @@ class UserLostPassWithCodeHandler extends Handler { class UserDetailHandler extends Handler { async get({ domainId, uid }) { const isSelfProfile = this.user._id === uid; - const udoc = await user.getById(domainId, uid); - if (!udoc) throw new UserNotFoundError(uid); + const udoc = await user.getById(domainId, uid, true); const sdoc = await token.getMostRecentSessionByUid(uid); this.response.template = 'user_detail.html'; this.response.body = { isSelfProfile, udoc, sdoc }; @@ -151,12 +150,8 @@ class UserSearchHandler extends Handler { let udocs; if (exactMatch) udocs = []; else udocs = await user.getPrefixList(q, 20); - try { - const udoc = await user.getById(domainId, parseInt(q)); - if (udoc) udocs.push(udoc); - } catch (e) { - /* Ignore */ - } + const udoc = await user.getById(domainId, parseInt(q)); + if (udoc) udocs.push(udoc); for (const i in udocs) { if (udocs[i].gravatar) { udocs[i].gravatar_url = misc.gravatar(udocs[i].gravatar); diff --git a/hydro/lib/nav.js b/hydro/lib/nav.js index 174885536..6221c745d 100644 --- a/hydro/lib/nav.js +++ b/hydro/lib/nav.js @@ -8,20 +8,20 @@ const Item = (path, name, prefix, perm, checker) => { checker = ((_chk) => (handler) => _chk(handler) && handler.user.hasPerm(perm))(checker); } else if (perm) { checker = (handler) => handler.user.hasPerm(perm); - } else checker = trueChecker; + } else if (!checker) checker = trueChecker; global.Hydro.ui.nav.push({ path, name, prefix, checker, }); }; -Item('/', 'domain_main', 'domain_main'); +Item('/', 'homepage', 'homepage'); Item('/p', 'problem_main', 'problem', permission.PERM_VIEW_PROBLEM); Item('/t', 'training_main', 'training', permission.PERM_VIEW_TRAINING); Item('/homework', 'homework_main', 'homework', permission.PERM_VIEW_HOMEWORK); Item('/discuss', 'discussion_main', 'discussion', permission.PERM_VIEW_DISCUSSION); Item('/c', 'contest_main', 'contest', permission.PERM_VIEW_CONTEST); Item('/record', 'record_main', 'record'); -Item('/ranking', 'domain_rank', 'domain_rank'); +Item('/ranking', 'ranking', 'ranking'); Item('/domain/dashboard', 'domain_dashboard', 'domain', permission.PERM_MANAGE); Item('/manage/dashboard', 'manage', 'manage', null, (handler) => handler.user.priv === 1); diff --git a/hydro/loader.js b/hydro/loader.js index abb4e8bb5..0746d8e63 100644 --- a/hydro/loader.js +++ b/hydro/loader.js @@ -171,7 +171,7 @@ const builtinHandler = [ const builtinScript = [ 'install', 'uninstall', 'rating', 'recalcRating', 'register', - 'blacklist', + 'blacklist', 'setSuperadmin', ]; async function loadAsMaster() { @@ -313,6 +313,7 @@ async function load() { }; global.onDestory = []; Error.stackTraceLimit = 50; + process.on('unhandledRejection', (e) => console.error(e)); if (cluster.isMaster) { console.log(`Master ${process.pid} Starting`); process.stdin.setEncoding('utf8'); @@ -325,7 +326,6 @@ async function load() { console.warn(e); } }); - process.on('unhandledRejection', (e) => console.log(e)); process.on('SIGINT', terminate); await loadAsMaster(); cluster.on('exit', (worker, code, signal) => { @@ -340,7 +340,6 @@ async function load() { cluster.on('online', (worker) => { console.log(`Worker ${worker.process.pid} is online`); }); - // FIXME this requires lots of memory for (let i = 0; i < numCPUs; i++) { cluster.fork(); } diff --git a/hydro/model/builtin.js b/hydro/model/builtin.js index 0f46d5832..b005ec493 100644 --- a/hydro/model/builtin.js +++ b/hydro/model/builtin.js @@ -203,11 +203,10 @@ const CATEGORIES = { }; const FOOTER_EXTRA_HTMLS = []; const VIEW_LANGS = [ - { code: 'zh-CN', name: 'zh-CN' }, + { code: 'zh_CN', name: '简体中文' }, + { code: 'zh_TW', name: '正體中文' }, + { code: 'en', name: 'English' }, ]; -const LANGS = { - cc: 'cpp', -}; const LANG_TEXTS = { c: 'C', cc: 'C++', @@ -296,7 +295,6 @@ global.Hydro.model.builtin = module.exports = { CATEGORIES, VIEW_LANGS, FOOTER_EXTRA_HTMLS, - LANGS, LANG_TEXTS, LANG_HIGHLIGHT_ID, STATUS, diff --git a/hydro/model/user.js b/hydro/model/user.js index 53152cd68..099cb5a0a 100644 --- a/hydro/model/user.js +++ b/hydro/model/user.js @@ -19,7 +19,7 @@ class USER { this.salt = () => udoc.salt; this.hash = () => udoc.hash; this.priv = udoc.priv; - this.viewLang = udoc.language || 'zh_CN'; + this.viewLang = udoc.viewLang || 'zh_CN'; this.codeLang = udoc.codeLang || 'c'; this.codeTemplate = udoc.codeTemplate || ''; this.regat = udoc.regat; @@ -55,9 +55,12 @@ async function getInDomain(domainId, udoc) { return dudoc; } -async function getById(domainId, _id) { +async function getById(domainId, _id, throwError = false) { const udoc = await coll.findOne({ _id }); - if (!udoc) throw new UserNotFoundError(_id); + if (!udoc) { + if (throwError) throw new UserNotFoundError(_id); + else return null; + } const dudoc = await getInDomain(domainId, udoc); return new USER(udoc, dudoc); } @@ -224,6 +227,10 @@ function ban(uid) { ]); } +function setSuperAdmin(uid) { + return setById(uid, { priv: 1 }); +} + function ensureIndexes() { return Promise.all([ coll.createIndex('unameLower', { unique: true }), @@ -255,6 +262,7 @@ global.Hydro.model.user = module.exports = { getInDomain, addRole, deleteRoles, + setSuperAdmin, ban, ensureIndexes, }; diff --git a/hydro/script/recalcRating.js b/hydro/script/recalcRating.js index 82eb6ce4f..f7019ec5a 100644 --- a/hydro/script/recalcRating.js +++ b/hydro/script/recalcRating.js @@ -35,7 +35,7 @@ async function run({ domainId, isSub = false }, report) { } const tasks = []; for (const uid in udict) { - tasks.push(user.setInDomain(domainId, uid, { rating: udict[uid] })); + tasks.push(user.setInDomain(domainId, parseInt(uid), { rating: udict[uid] })); } await Promise.all(tasks); return true; diff --git a/hydro/script/register.js b/hydro/script/register.js index 9ee6a1daf..18dd77acc 100644 --- a/hydro/script/register.js +++ b/hydro/script/register.js @@ -5,6 +5,8 @@ async function run({ uname, password, mail, uid, }) { if (!uid) uid = await system.inc('user'); + else uid = parseInt(uid); + if (Number.isNaN(uid)) throw new Error('uid'); await user.create({ uid, uname, password, mail, regip: '127.0.0.1', }); diff --git a/hydro/script/setSuperadmin.js b/hydro/script/setSuperadmin.js new file mode 100644 index 000000000..c30042321 --- /dev/null +++ b/hydro/script/setSuperadmin.js @@ -0,0 +1,12 @@ +const user = require('../model/user'); + +async function run({ + uid, +}) { + uid = parseInt(uid); + if (Number.isNaN(uid)) throw new Error('uid'); + await user.setSuperAdmin(uid); + return uid; +} + +global.Hydro.script.setSuperadmin = module.exports = { run }; diff --git a/hydro/service/server.js b/hydro/service/server.js index 0870e7fa4..92109db89 100644 --- a/hydro/service/server.js +++ b/hydro/service/server.js @@ -130,7 +130,7 @@ class Handler { this.hasPerm = (perm) => this.user.hasPerm(perm); const res = await template.render(name, Object.assign(context, { handler: this, - _: (str) => (str ? str.toString().translate(this.user.language) : ''), + _: (str) => (str ? str.toString().translate(this.user.viewLang || this.session.viewLang) : ''), user: this.user, })); console.timeEnd(name); @@ -173,7 +173,7 @@ class Handler { } translate(str) { - return str ? str.toString().translate(this.user.language) : ''; + return str ? str.toString().translate(this.user.viewLang || this.session.viewLang) : ''; } binary(data, name) { @@ -364,11 +364,10 @@ class ConnectionHandler { } async renderHTML(name, context) { - console.time(name); this.hasPerm = (perm) => this.user.hasPerm(perm); const res = await template.render(name, Object.assign(context, { handler: this, - _: (str) => (str ? str.toString().translate(this.user.language) : ''), + _: (str) => (str ? str.toString().translate(this.user.viewLang || this.session.viewLang) : ''), user: this.user, })); return res; diff --git a/hydro/service/setup.js b/hydro/service/setup.js index 2ceece936..4bda33c58 100644 --- a/hydro/service/setup.js +++ b/hydro/service/setup.js @@ -156,7 +156,7 @@ async function setup() { else resolve(); }); }); - console.log('Done! Please restart.'); + console.log('Done! Restarting...'); } module.exports = { setup }; diff --git a/templates/main.html b/templates/main.html index ae0e92a28..a76dc1c99 100644 --- a/templates/main.html +++ b/templates/main.html @@ -1,5 +1,5 @@ {% set no_path_section = true %} -{% set page_name = "domain_main" %} +{% set page_name = "homepage" %} {% extends "layout/basic.html" %} {% import "components/contest.html" as contest with context %} {% block content %} diff --git a/templates/partials/footer.html b/templates/partials/footer.html index e6f7ec676..06d2e3f63 100644 --- a/templates/partials/footer.html +++ b/templates/partials/footer.html @@ -54,7 +54,7 @@ Language diff --git a/templates/domain_rank.html b/templates/ranking.html similarity index 100% rename from templates/domain_rank.html rename to templates/ranking.html