测试:系统设置

This commit is contained in:
undefined committed 2020-05-19 19:13:15 +08:00
1 parent 747cb1b9b5
commit 0304cd808f
12 files changed
+147 -88

No files matched your search

+17 -3
View File
@@ -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;
+2 -2
View File
@@ -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',
+7 -10
View File
@@ -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();
}
+25
View File
@@ -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,
};
+2 -2
View File
@@ -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 {
+7 -3
View File
@@ -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
}
+13 -4
View File
@@ -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 <a href="https://en.gravatar.com/" target="_blank">Gravatar</a> 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,
};
+1
View File
@@ -57,6 +57,7 @@ const tasks = {
nSubmit: doc.num_submit,
nAccept: doc.num_accept,
hidden: doc.hidden || false,
difficulty: doc.difficulty_admin,
});
}
return problems;
+1 -64
View File
@@ -1,69 +1,6 @@
{% extends "layout/home_base.html" %}
{% block home_content %}
<div class="section" data-heading-extract-to="#menu-item-home_{{ category }}">
<form method="post">
{% for family, family_settings in settings|groupby('family') %}
<div class="section__header">
<h1 class="section__title" id="{{ family }}" data-heading>{{ _(family) }}</h1>
</div>
<div class="section__body">
{% 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 %}
</div>
{% endfor %}
<div class="section__body">
<input type="hidden" name="csrfToken" value="{{ handler.csrfToken }}">
<input type="submit" class="rounded primary button" value="{{ _('Save All Changes') }}">
</div>
</form>
{% include "partials/setting.html" %}
</div>
{% endblock %}
+1
View File
@@ -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') }}
</ol>
</li>
<li class="menu__item">
+7
View File
@@ -0,0 +1,7 @@
{% set page_name = "manage_settings" %}
{% extends "manage_base.html" %}
{% block manage_content %}
<div class="section">
{% include "partials/setting.html" %}
</div>
{% endblock %}
+64
View File
@@ -0,0 +1,64 @@
<form method="post">
{% for family, family_settings in settings|groupby('family') %}
<div class="section__header">
<h1 class="section__title" id="{{ family }}" data-heading>{{ _(family) }}</h1>
</div>
<div class="section__body">
{% 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:current[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:current[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:current[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:current[setting.key] or setting.value
}) }}
{% elif setting.ui == 'textarea' %}
{{ form.form_textarea({
label:setting.name,
help_text:setting.desc,
name:setting.key,
value:current[setting.key] or setting.value
}) }}
{% elif setting.ui == 'markdown' %}
{{ form.form_textarea({
label:setting.name,
help_text:setting.desc,
name:setting.key,
value:current[setting.key] or setting.value,
markdown:true
}) }}
{% endif %}
{% endfor %}
</div>
{% endfor %}
<div class="section__body">
<input type="hidden" name="csrfToken" value="{{ handler.csrfToken }}">
<input type="submit" class="rounded primary button" value="{{ _('Save All Changes') }}">
</div>
</form>