mirror of
https://gitcode.com/gh_mirrors/hy/Hydro.git
synced 2026-10-20 01:38:19 +08:00
测试:系统设置
This commit is contained in:
1 parent
747cb1b9b5
commit
0304cd808f
12 files changed
+147
-88
No files matched your search
+17
-3
@@ -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
@@ -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
@@ -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();
|
||||
}
|
||||
|
||||
|
||||
@@ -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,
|
||||
};
|
||||
@@ -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
@@ -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
@@ -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,
|
||||
};
|
||||
@@ -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,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 %}
|
||||
@@ -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">
|
||||
|
||||
@@ -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 %}
|
||||
@@ -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>
|
||||
Reference in new issue
Block a user