From 0304cd808f333e418b7407cfb920bf357751829a Mon Sep 17 00:00:00 2001 From: undefined Date: Tue, 19 May 2020 19:13:15 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B5=8B=E8=AF=95=EF=BC=9A=E7=B3=BB=E7=BB=9F?= =?UTF-8?q?=E8=AE=BE=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build/index.js | 20 ++++++++-- build/webpack.js | 4 +- hydro/handler/home.js | 17 ++++----- hydro/handler/manage.js | 25 +++++++++++++ hydro/handler/user.js | 4 +- hydro/loader.js | 10 +++-- hydro/model/setting.js | 17 +++++++-- module/migrate-vijos/script.js | 1 + templates/home_settings.html | 65 +-------------------------------- templates/manage_base.html | 1 + templates/manage_settings.html | 7 ++++ templates/partials/setting.html | 64 ++++++++++++++++++++++++++++++++ 12 files changed, 147 insertions(+), 88 deletions(-) create mode 100644 templates/manage_settings.html create mode 100644 templates/partials/setting.html diff --git a/build/index.js b/build/index.js index 61f11c517..7fed8eaa5 100644 --- a/build/index.js +++ b/build/index.js @@ -45,8 +45,7 @@ async function build(type) { builtin.file[f] = fs.readFileSync(root(`.uibuild/${f}`)).toString('base64'); } } - const data = zlib.gzipSync(Buffer.from(yaml.safeDump(builtin)), { level: 3 }); - fs.writeFileSync(root('.build/builtin.json'), JSON.stringify({ data: data.toString('base64') })); + const data = zlib.gzipSync(Buffer.from(yaml.safeDump(builtin)), { level: -1 }); fs.writeFileSync(root('.build/module/builtin.hydro'), data); await require('./buildModule')(type); await require('./webpack')(type); @@ -54,7 +53,22 @@ async function build(type) { for (const f of t) { if (fs.statSync(root(`.build/module/${f}`)).isDirectory()) rmdir(root(`.build/module/${f}`)); } - fs.unlinkSync(root('.build/builtin.json')); + const modules = [ + 'builtin', 'contest-rule-homework', 'judger', 'migrate-vijos', 'module-pastebin', + 'problem-import-syzoj', 'wiki', + ]; + const j = {}; + for (const m of modules) { + try { + const d = fs.readFileSync(root(`.build/module/${m}.hydro`)); + j[m] = d.toString('base64'); + } catch (e) { + console.error(`Module pack failed: ${m}`); + } + } + fs.writeFileSync(root('.build/module.json'), JSON.stringify(j)); + await require('./webpack')(type, '-full'); + // fs.unlinkSync(root('.build/module.json')); } module.exports = build; diff --git a/build/webpack.js b/build/webpack.js index 684f1b1c7..e07e315b3 100644 --- a/build/webpack.js +++ b/build/webpack.js @@ -4,7 +4,7 @@ const webpack = require('webpack'); const FriendlyErrorsPlugin = require('friendly-errors-webpack-plugin'); const { root } = require('./utils'); -const build = async (type) => { +const build = async (type, tag = '') => { function hackNodeModuleFormidable() { const tasks = ['incoming_form', 'file', 'json_parser', 'querystring_parser']; for (const task of tasks) { @@ -25,7 +25,7 @@ const build = async (type) => { development: root('hydro/development.js'), }, output: { - filename: '[name].js', + filename: `[name]${tag}.js`, path: root('.build'), }, target: 'node', diff --git a/hydro/handler/home.js b/hydro/handler/home.js index 3c9841510..4ce253bbc 100644 --- a/hydro/handler/home.js +++ b/hydro/handler/home.js @@ -139,18 +139,15 @@ class HomeSettingsHandler extends Handler { async get({ category }) { this.response.template = 'home_settings.html'; + this.response.body = { + category, + page_name: `home_${category}`, + current: this.user, + }; if (category === 'preference') { - this.response.body = { - category, - page_name: `home_${category}`, - settings: setting.PREFERENCE_SETTINGS, - }; + this.response.body.settings = setting.PREFERENCE_SETTINGS; } else if (category === 'account') { - this.response.body = { - category, - page_name: `home_${category}`, - settings: setting.ACCOUNT_SETTINGS, - }; + this.response.body.settings = setting.ACCOUNT_SETTINGS; } else throw new NotFoundError(); } diff --git a/hydro/handler/manage.js b/hydro/handler/manage.js index 1f71136cd..8e0e89b02 100644 --- a/hydro/handler/manage.js +++ b/hydro/handler/manage.js @@ -1,4 +1,6 @@ const user = require('../model/user'); +const system = require('../model/system'); +const setting = require('../model/setting'); const { Route, Handler } = require('../service/server'); const { PERM_MANAGE } = require('../permission'); const hpm = require('../lib/hpm'); @@ -136,6 +138,27 @@ class ManageModuleHandler extends ManageHandler { } } +class ManageSettingHandler extends ManageHandler { + async get() { + this.response.template = 'manage_settings.html'; + const current = {}; + const settings = setting.SYSTEM_SETTINGS; + for (const s of settings) { + current[s.key] = await system.get(s.key); + } + this.response.body = { + current, settings, + }; + } + + async post(args) { + for (const key in args) { + await system.set(key, args[key]); + } + this.back(); + } +} + async function apply() { Route('/manage', module.exports.ManageMainHandler); Route('/manage/dashboard', module.exports.ManageDashboardHandler); @@ -144,6 +167,7 @@ async function apply() { Route('/manage/permission', module.exports.ManagePermissionHandler); Route('/manage/role', module.exports.ManageRoleHandler); Route('/manage/module', module.exports.ManageModuleHandler); + Route('/manage/setting', module.exports.ManageSettingHandler); } global.Hydro.handler.manage = module.exports = { @@ -154,5 +178,6 @@ global.Hydro.handler.manage = module.exports = { ManagePermissionHandler, ManageRoleHandler, ManageModuleHandler, + ManageSettingHandler, apply, }; diff --git a/hydro/handler/user.js b/hydro/handler/user.js index cf082a41d..9adc33c9b 100644 --- a/hydro/handler/user.js +++ b/hydro/handler/user.js @@ -39,7 +39,7 @@ class UserLogoutHandler extends Handler { } async post() { - this.session = { uid: 1 }; + this.session.uid = 1; } } @@ -61,7 +61,7 @@ class UserRegisterHandler extends Handler { { mail }, ); if (await system.get('smtp.user')) { - const m = await this.renderHTML('user_register_mail', { url: `/register/${t}` }); + const m = await this.renderHTML('user_register_mail', { url: `/register/${t[0]}` }); await sendMail(mail, 'Sign Up', 'user_register_mail', m); this.response.template = 'user_register_mail_sent.html'; } else { diff --git a/hydro/loader.js b/hydro/loader.js index 6e62ab19d..a69b7bc3d 100644 --- a/hydro/loader.js +++ b/hydro/loader.js @@ -21,12 +21,16 @@ function ensureDir(dir) { const active = []; const fail = []; + try { // Let webpack pack builtin module together. // eslint-disable-next-line import/no-unresolved - const f = require('../.build/builtin.json'); - const m = { ...yaml.safeLoad(zlib.gunzipSync(f.data)), id: 'builtin' }; - active.push(m); + const f = require('../.build/module.json'); + for (const filename in f) { + const m = { ...yaml.safeLoad(zlib.gunzipSync(f[filename])), filename }; + active.push(m); + console.log(filename); + } } catch (e) { // Builtin module is in the module directory } diff --git a/hydro/model/setting.js b/hydro/model/setting.js index 5af46ca43..6dec2a938 100644 --- a/hydro/model/setting.js +++ b/hydro/model/setting.js @@ -24,10 +24,10 @@ const PREFERENCE_SETTINGS = [ const ACCOUNT_SETTINGS = [ Setting('setting_info', 'gravatar', null, - null, null, 'Gravatar Email', + null, 'text', 'Gravatar Email', 'We use Gravatar to present your avatar icon.'), Setting('setting_info', 'qq', null, - null, null, 'QQ'), + null, 'text', 'QQ'), Setting('setting_info', 'gender', builtin.USER_GENDER_RANGE, null, 'select', 'Gender'), Setting('setting_info', 'bio', null, @@ -43,6 +43,15 @@ const SETTINGS_BY_KEY = {}; for (const setting in SETTINGS) SETTINGS_BY_KEY[setting.key] = setting; -module.exports = { - PREFERENCE_SETTINGS, ACCOUNT_SETTINGS, SETTINGS, SETTINGS_BY_KEY, +const SYSTEM_SETTINGS = [ + Setting('setting_smtp', 'smtp.user', null, null, 'text', 'SMTP Username'), + Setting('setting_smtp', 'smtp.pass', null, null, 'password', 'SMTP Password'), + Setting('setting_smtp', 'smtp.host', null, null, 'text', 'SMTP Server Host'), + Setting('setting_smtp', 'smtp.port', null, null, 'text', 'SMTP Server Port'), + Setting('setting_smtp', 'smtp.from', null, null, 'text', 'Mail From'), + Setting('setting_smtp', 'smtp.secure', null, null, 'checkbox', 'SSL'), +]; + +global.Hydro.model.setting = module.exports = { + Setting, PREFERENCE_SETTINGS, ACCOUNT_SETTINGS, SETTINGS, SETTINGS_BY_KEY, SYSTEM_SETTINGS, }; diff --git a/module/migrate-vijos/script.js b/module/migrate-vijos/script.js index d85327844..2a7062d89 100644 --- a/module/migrate-vijos/script.js +++ b/module/migrate-vijos/script.js @@ -57,6 +57,7 @@ const tasks = { nSubmit: doc.num_submit, nAccept: doc.num_accept, hidden: doc.hidden || false, + difficulty: doc.difficulty_admin, }); } return problems; diff --git a/templates/home_settings.html b/templates/home_settings.html index 4f4801e2f..7cffae76f 100644 --- a/templates/home_settings.html +++ b/templates/home_settings.html @@ -1,69 +1,6 @@ {% extends "layout/home_base.html" %} {% block home_content %}
-
- {% for family, family_settings in settings|groupby('family') %} -
-

{{ _(family) }}

-
-
- {% for setting in family_settings %} - {% if setting.ui == 'text' or setting.ui == 'password' %} - {{ form.form_text({ - type:setting.ui, - label:setting.name, - help_text:setting.desc, - name:setting.key, - value:handler.user[setting.key] or setting.value - }) }} - {% elif setting.ui == 'select' %} - {{ form.form_select({ - options:setting.range, - label:setting.name, - help_text:setting.desc, - name:setting.key, - value:handler.user[setting.key] or setting.value - }) }} - {% elif setting.ui == 'radio' %} - {{ form.form_radio({ - options:setting.range, - label:setting.name, - help_text:setting.desc, - name:setting.key, - value:handler.user[setting.key] or setting.value - }) }} - {% elif setting.ui == 'image_radio' %} - {{ form.form_image_radio({ - options:setting.range, - image_class:setting.image_class, - label:setting.name, - help_text:setting.desc, - name:setting.key, - value:handler.user[setting.key] or setting.value - }) }} - {% elif setting.ui == 'textarea' %} - {{ form.form_textarea({ - label:setting.name, - help_text:setting.desc, - name:setting.key, - value:handler.user[setting.key] or setting.value - }) }} - {% elif setting.ui == 'markdown' %} - {{ form.form_textarea({ - label:setting.name, - help_text:setting.desc, - name:setting.key, - value:handler.user[setting.key] or setting.value, - markdown:true - }) }} - {% endif %} - {% endfor %} -
- {% endfor %} -
- - -
-
+ {% include "partials/setting.html" %}
{% endblock %} diff --git a/templates/manage_base.html b/templates/manage_base.html index fcb09316c..153313ee4 100644 --- a/templates/manage_base.html +++ b/templates/manage_base.html @@ -15,6 +15,7 @@ {{ sidemenu.render_item(null, 'manage_dashboard', '/manage/dashboard') }} {{ sidemenu.render_item(null, 'manage_edit', '/manage/edit') }} {{ sidemenu.render_item(null, 'manage_module', '/manage/module') }} + {{ sidemenu.render_item(null, 'manage_setting', '/manage/setting') }}