From 3e9b074e77e194e51d8e3f6f43205d2e55cb8591 Mon Sep 17 00:00:00 2001 From: undefined Date: Tue, 5 May 2020 12:07:34 +0800 Subject: [PATCH] =?UTF-8?q?=E6=A8=A1=E5=9D=97=E7=AE=A1=E7=90=86=E5=99=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- hydro/development.js | 2 +- hydro/handler/manage.js | 28 ++++++++-- hydro/lib/hpm.js | 39 ++++++++++++++ hydro/lib/misc.js | 2 +- hydro/lib/nav.js | 2 +- hydro/loader.js | 14 ++--- locales/en.yaml | 16 +++--- locales/zh_CN.yaml | 16 +++--- locales/zh_TW.yaml | 14 ++--- templates/manage_base.html | 13 ++--- ...e_dashboard.html => manage_dashboard.html} | 4 +- ...main_manage_edit.html => manage_edit.html} | 4 +- templates/manage_module.html | 53 +++++++++++++++++++ ...permission.html => manage_permission.html} | 4 +- ...main_manage_role.html => manage_role.html} | 4 +- ...main_manage_user.html => manage_user.html} | 4 +- ui/pages/manage_module.page.styl | 21 ++++++++ ....page.styl => manage_permission.page.styl} | 2 +- ...anage_role.page.js => manage_role.page.js} | 2 +- ...e_role.page.styl => manage_role.page.styl} | 2 +- ...anage_user.page.js => manage_user.page.js} | 2 +- ...e_user.page.styl => manage_user.page.styl} | 2 +- 22 files changed, 191 insertions(+), 59 deletions(-) create mode 100644 hydro/lib/hpm.js rename templates/{domain_manage_dashboard.html => manage_dashboard.html} (89%) rename templates/{domain_manage_edit.html => manage_edit.html} (94%) create mode 100644 templates/manage_module.html rename templates/{domain_manage_permission.html => manage_permission.html} (96%) rename templates/{domain_manage_role.html => manage_role.html} (97%) rename templates/{domain_manage_user.html => manage_user.html} (98%) create mode 100644 ui/pages/manage_module.page.styl rename ui/pages/{domain_manage_permission.page.styl => manage_permission.page.styl} (90%) rename ui/pages/{domain_manage_role.page.js => manage_role.page.js} (97%) rename ui/pages/{domain_manage_role.page.styl => manage_role.page.styl} (71%) rename ui/pages/{domain_manage_user.page.js => manage_user.page.js} (98%) rename ui/pages/{domain_manage_user.page.styl => manage_user.page.styl} (78%) diff --git a/hydro/development.js b/hydro/development.js index fce3f29c4..815948057 100644 --- a/hydro/development.js +++ b/hydro/development.js @@ -9,7 +9,7 @@ process.stdin.on('data', async (input) => { } }); -require('./loader')().catch((e) => { +require('./loader').load().catch((e) => { console.error(e); process.exit(1); }); diff --git a/hydro/handler/manage.js b/hydro/handler/manage.js index fec11c00d..1f71136cd 100644 --- a/hydro/handler/manage.js +++ b/hydro/handler/manage.js @@ -1,6 +1,8 @@ const user = require('../model/user'); const { Route, Handler } = require('../service/server'); const { PERM_MANAGE } = require('../permission'); +const hpm = require('../lib/hpm'); +const loader = require('../loader'); const { RoleAlreadyExistError, ValidationError } = require('../error'); class ManageHandler extends Handler { @@ -18,14 +20,14 @@ class ManageMainHandler extends ManageHandler { class ManageDashboardHandler extends ManageHandler { async get() { - this.response.template = 'domain_manage_dashboard.html'; + this.response.template = 'manage_dashboard.html'; this.response.body = { system: this.system }; } } class ManageEditHandler extends ManageHandler { async get() { - this.response.template = 'domain_manage_edit.html'; + this.response.template = 'manage_edit.html'; this.response.body = { system: this.system }; } @@ -54,7 +56,7 @@ class ManageUserHandler extends ManageHandler { } const rolesSelect = roles.map((role) => [role._id, role._id]); const udict = await user.getList(uids); - this.response.template = 'domain_manage_user.html'; + this.response.template = 'manage_user.html'; this.response.body = { roles, rolesSelect, rudocs, udict, system, }; @@ -72,7 +74,7 @@ class ManagePermissionHandler extends ManageHandler { user.getRoles(), user.getById(0), ]); - this.response.template = 'domain_manage_permission.html'; + this.response.template = 'manage_permission.html'; this.response.body = { roles, system }; } @@ -95,7 +97,7 @@ class ManageRoleHandler extends ManageHandler { user.getRoles(), user.getById(0), ]); - this.response.template = 'domain_manage_role.html'; + this.response.template = 'manage_role.html'; this.response.body = { roles, system }; } @@ -120,6 +122,20 @@ class ManageRoleHandler extends ManageHandler { } } +class ManageModuleHandler extends ManageHandler { + async get() { + const installed = await hpm.getInstalled(); + const active = loader.active.map((module) => module.id); + this.response.body = { installed, active }; + this.response.template = 'manage_module.html'; + } + + async postDelete({ id }) { + await hpm.del(id); + this.back(); + } +} + async function apply() { Route('/manage', module.exports.ManageMainHandler); Route('/manage/dashboard', module.exports.ManageDashboardHandler); @@ -127,6 +143,7 @@ async function apply() { Route('/manage/user', module.exports.ManageUserHandler); Route('/manage/permission', module.exports.ManagePermissionHandler); Route('/manage/role', module.exports.ManageRoleHandler); + Route('/manage/module', module.exports.ManageModuleHandler); } global.Hydro.handler.manage = module.exports = { @@ -136,5 +153,6 @@ global.Hydro.handler.manage = module.exports = { ManageUserHandler, ManagePermissionHandler, ManageRoleHandler, + ManageModuleHandler, apply, }; diff --git a/hydro/lib/hpm.js b/hydro/lib/hpm.js new file mode 100644 index 000000000..8c1d60da6 --- /dev/null +++ b/hydro/lib/hpm.js @@ -0,0 +1,39 @@ +/* eslint-disable import/no-dynamic-require */ +/* eslint-disable no-await-in-loop */ +/* eslint-disable no-eval */ +const fs = require('fs'); +const zlib = require('zlib'); +const path = require('path'); +const yaml = require('js-yaml'); +const download = require('./download'); + +function root(name) { + return path.resolve(process.cwd(), name); +} + +async function getInstalled() { + const files = fs.readdirSync(root('.build/module')); + const installed = []; + for (const file of files) { + if (file.endsWith('.hydro-module')) { + const f = fs.readFileSync(root(`.build/module/${file}`)); + const s = fs.statSync(root(`.build/module/${file}`)); + installed.push({ + ...yaml.safeLoad(zlib.gunzipSync(f)), + id: file.split('.')[0], + size: s.size, + }); + } + } + return installed; +} + +async function del(id) { + fs.unlinkSync(root(`.build/module/${id}.hydro-module`)); +} + +async function install(id, url) { + await download(url, root(`module/${id}.hydro-module`)); +} + +module.exports = { getInstalled, del, install }; diff --git a/hydro/lib/misc.js b/hydro/lib/misc.js index f76e0677d..9b55a9058 100644 --- a/hydro/lib/misc.js +++ b/hydro/lib/misc.js @@ -36,7 +36,7 @@ exports.paginate = function* paginate(page, numPages) { yield ['last', numPages]; }; -exports.format_size = function formatSize(size, base = 1) { +exports.size = function formatSize(size, base = 1) { size *= base; const unit = 1024; const unitNames = ['Bytes', 'KiB', 'MiB', 'GiB', 'TiB', 'PiB', 'EiB', 'ZiB', 'YiB']; diff --git a/hydro/lib/nav.js b/hydro/lib/nav.js index a8f562ec6..d0009e0e7 100644 --- a/hydro/lib/nav.js +++ b/hydro/lib/nav.js @@ -13,6 +13,6 @@ Item('/p', 'problem_main', 'problem', permission.PERM_VIEW_PROBLEM); Item('/t', 'training_main', 'training', permission.PERM_VIEW_TRAINING); Item('/discuss', 'discussion_main', 'discussion', permission.PERM_VIEW_DISCUSSION); Item('/c', 'contest_main', 'contest', permission.PERM_VIEW_CONTEST); -Item('/manage', 'domain_manage', 'domain_manage', permission.PERM_MANAGE); +Item('/manage', 'manage', 'manage', permission.PERM_MANAGE); global.Hydro.lib.nav = module.exports = Item; diff --git a/hydro/loader.js b/hydro/loader.js index 3182d3a2c..24a7c2430 100644 --- a/hydro/loader.js +++ b/hydro/loader.js @@ -10,20 +10,20 @@ function root(name) { return path.resolve(process.cwd(), name); } -const installed = []; +const active = []; async function preload() { const files = fs.readdirSync(root('.build/module')); for (const file of files) { if (file.endsWith('.hydro-module')) { const f = fs.readFileSync(root(`.build/module/${file}`)); - installed.push({ ...yaml.safeLoad(zlib.gunzipSync(f)), id: file.split('.')[0] }); + active.push({ ...yaml.safeLoad(zlib.gunzipSync(f)), id: file.split('.')[0] }); } } } async function handler() { - for (const i of installed) { + for (const i of active) { if (i.handler) { console.time(`Handler init: ${i.id}`); const module = {}; // eslint-disable-line no-unused-vars @@ -35,7 +35,7 @@ async function handler() { } async function locale() { - for (const i of installed) { + for (const i of active) { if (i.locale) { global.Hydro.lib.i18n(i.locale); console.log(`Locale init: ${i.id}`); @@ -44,7 +44,7 @@ async function locale() { } async function template() { - for (const i of installed) { + for (const i of active) { if (i.template) { Object.assign(global.Hydro.template, i.template); console.log(`Template init: ${i.id}`); @@ -53,7 +53,7 @@ async function template() { } async function model() { - for (const i of installed) { + for (const i of active) { if (i.model) { console.time(`Model init: ${i.id}`); const module = {}; @@ -125,4 +125,4 @@ async function load() { server.start(); } -module.exports = load; +module.exports = { load, active }; diff --git a/locales/en.yaml b/locales/en.yaml index a50778203..ffa279c77 100644 --- a/locales/en.yaml +++ b/locales/en.yaml @@ -49,14 +49,14 @@ user_lostpass: Lost Password user_register: Register home_domain_create: Create Domain domain_main: Main -domain_manage: Domain Manage -domain_manage_dashboard: Dashboard -domain_manage_discussion: Discussion Nodes -domain_manage_edit: Edit Info -domain_manage_join_applications: Join Applications -domain_manage_role: Domain Role -domain_manage_user: Domain User -domain_manage_permission: Domain Permission +manage: System Manage +manage_dashboard: Dashboard +manage_discussion: Discussion Nodes +manage_edit: Edit Info +manage_join_applications: Join Applications +manage_role: System Role +manage_user: System User +manage_permission: System Permission timeago_locale: en perm_general: General perm_problem: Problems diff --git a/locales/zh_CN.yaml b/locales/zh_CN.yaml index ad3558b3e..dce8ca9c0 100644 --- a/locales/zh_CN.yaml +++ b/locales/zh_CN.yaml @@ -307,14 +307,14 @@ Create Domain: 创建域 Properties: 属性 Access Control: 访问控制 domain_main: 首页 -domain_manage: 管理域 -domain_manage_dashboard: 概况 -domain_manage_discussion: 讨论节点 -domain_manage_edit: 编辑域资料 -domain_manage_join_applications: 加域申请 -domain_manage_role: 管理角色 -domain_manage_user: 管理用户 -domain_manage_permission: 管理权限 +manage: 管理域 +manage_dashboard: 概况 +manage_discussion: 讨论节点 +manage_edit: 编辑域资料 +manage_join_applications: 加域申请 +manage_role: 管理角色 +manage_user: 管理用户 +manage_permission: 管理权限 domain_join: 加入域 'Join {0}': '加入 {0}' You are not allowed to join the domain. The link is either invalid or expired.: 您无法加入该域,链接无效或已过期。 diff --git a/locales/zh_TW.yaml b/locales/zh_TW.yaml index cd46174c7..a03ea6455 100644 --- a/locales/zh_TW.yaml +++ b/locales/zh_TW.yaml @@ -301,13 +301,13 @@ Create Domain: 創建域 Properties: 屬性 Access Control: 訪問控制 domain_main: 首頁 -domain_manage: 管理域 -domain_manage_dashboard: 概況 -domain_manage_edit: 編輯域資料 -domain_manage_join_applications: 加域申請 -domain_manage_role: 管理角色 -domain_manage_user: 管理使用者 -domain_manage_permission: 管理許可權 +manage: 管理域 +manage_dashboard: 概況 +manage_edit: 編輯域資料 +manage_join_applications: 加域申請 +manage_role: 管理角色 +manage_user: 管理使用者 +manage_permission: 管理許可權 Update Permission: 更新許可權 Roles: 角色 Your role: 您的角色 diff --git a/templates/manage_base.html b/templates/manage_base.html index 67f6a98ac..fcb09316c 100644 --- a/templates/manage_base.html +++ b/templates/manage_base.html @@ -2,7 +2,7 @@ {% block content %}
- {% block domain_content %}{% endblock %} + {% block manage_content %}{% endblock %}
@@ -12,8 +12,9 @@ {{ _('Properties') }}
diff --git a/templates/domain_manage_dashboard.html b/templates/manage_dashboard.html similarity index 89% rename from templates/domain_manage_dashboard.html rename to templates/manage_dashboard.html index 4830ca421..ef89c2e0a 100644 --- a/templates/domain_manage_dashboard.html +++ b/templates/manage_dashboard.html @@ -1,7 +1,7 @@ -{% set page_name = "domain_manage_dashboard" %} +{% set page_name = "manage_dashboard" %} {% import "components/user.html" as user %} {% extends "manage_base.html" %} -{% block domain_content %} +{% block manage_content %} {% if system.bio %}
diff --git a/templates/domain_manage_edit.html b/templates/manage_edit.html similarity index 94% rename from templates/domain_manage_edit.html rename to templates/manage_edit.html index 3be043044..e61c61d73 100644 --- a/templates/domain_manage_edit.html +++ b/templates/manage_edit.html @@ -1,7 +1,7 @@ -{% set page_name = "domain_manage_edit" %} +{% set page_name = "manage_edit" %} {% import "components/form.html" as form with context %} {% extends "manage_base.html" %} -{% block domain_content %} +{% block manage_content %}
diff --git a/templates/manage_module.html b/templates/manage_module.html new file mode 100644 index 000000000..e92776343 --- /dev/null +++ b/templates/manage_module.html @@ -0,0 +1,53 @@ +{% set page_name = "manage_module" %} +{% extends "manage_base.html" %} +{% block manage_content %} +
+
+

{{ _('Installed Modules') }}

+ +
+
+ + + + + + + + + + + + + + + + + + + {% for module in installed %} + + + + + + + + {% endfor %} + +
{{ _('ID') }}{{ _('Description') }}{{ _('Size') }}{{ _('Version') }}{{ _('Action') }}
{{ module.id }}{{ _('(Active)') if active.includes(module.id) else '' }}{{ module.description|default(_('None')) }}{{ size(module.size) if module.size else '?' }}{{ module.version|default('?') }} + {{ _('Download') }} + + + + + + + +
+
+
+{% endblock %} diff --git a/templates/domain_manage_permission.html b/templates/manage_permission.html similarity index 96% rename from templates/domain_manage_permission.html rename to templates/manage_permission.html index 91ceccb7b..59fac505e 100644 --- a/templates/domain_manage_permission.html +++ b/templates/manage_permission.html @@ -1,6 +1,6 @@ -{% set page_name = "domain_manage_permission" %} +{% set page_name = "manage_permission" %} {% extends "manage_base.html" %} -{% block domain_content %} +{% block manage_content %}
diff --git a/templates/domain_manage_role.html b/templates/manage_role.html similarity index 97% rename from templates/domain_manage_role.html rename to templates/manage_role.html index 16e8492a0..bb8890fcd 100644 --- a/templates/domain_manage_role.html +++ b/templates/manage_role.html @@ -1,6 +1,6 @@ -{% set page_name = "domain_manage_role" %} +{% set page_name = "manage_role" %} {% extends "manage_base.html" %} -{% block domain_content %} +{% block manage_content %}