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');
|
builtin.file[f] = fs.readFileSync(root(`.uibuild/${f}`)).toString('base64');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
const data = zlib.gzipSync(Buffer.from(yaml.safeDump(builtin)), { level: 3 });
|
const data = zlib.gzipSync(Buffer.from(yaml.safeDump(builtin)), { level: -1 });
|
||||||
fs.writeFileSync(root('.build/builtin.json'), JSON.stringify({ data: data.toString('base64') }));
|
|
||||||
fs.writeFileSync(root('.build/module/builtin.hydro'), data);
|
fs.writeFileSync(root('.build/module/builtin.hydro'), data);
|
||||||
await require('./buildModule')(type);
|
await require('./buildModule')(type);
|
||||||
await require('./webpack')(type);
|
await require('./webpack')(type);
|
||||||
@@ -54,7 +53,22 @@ async function build(type) {
|
|||||||
for (const f of t) {
|
for (const f of t) {
|
||||||
if (fs.statSync(root(`.build/module/${f}`)).isDirectory()) rmdir(root(`.build/module/${f}`));
|
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;
|
module.exports = build;
|
||||||
|
|||||||
+2
-2
@@ -4,7 +4,7 @@ const webpack = require('webpack');
|
|||||||
const FriendlyErrorsPlugin = require('friendly-errors-webpack-plugin');
|
const FriendlyErrorsPlugin = require('friendly-errors-webpack-plugin');
|
||||||
const { root } = require('./utils');
|
const { root } = require('./utils');
|
||||||
|
|
||||||
const build = async (type) => {
|
const build = async (type, tag = '') => {
|
||||||
function hackNodeModuleFormidable() {
|
function hackNodeModuleFormidable() {
|
||||||
const tasks = ['incoming_form', 'file', 'json_parser', 'querystring_parser'];
|
const tasks = ['incoming_form', 'file', 'json_parser', 'querystring_parser'];
|
||||||
for (const task of tasks) {
|
for (const task of tasks) {
|
||||||
@@ -25,7 +25,7 @@ const build = async (type) => {
|
|||||||
development: root('hydro/development.js'),
|
development: root('hydro/development.js'),
|
||||||
},
|
},
|
||||||
output: {
|
output: {
|
||||||
filename: '[name].js',
|
filename: `[name]${tag}.js`,
|
||||||
path: root('.build'),
|
path: root('.build'),
|
||||||
},
|
},
|
||||||
target: 'node',
|
target: 'node',
|
||||||
|
|||||||
+7
-10
@@ -139,18 +139,15 @@ class HomeSettingsHandler extends Handler {
|
|||||||
|
|
||||||
async get({ category }) {
|
async get({ category }) {
|
||||||
this.response.template = 'home_settings.html';
|
this.response.template = 'home_settings.html';
|
||||||
|
this.response.body = {
|
||||||
|
category,
|
||||||
|
page_name: `home_${category}`,
|
||||||
|
current: this.user,
|
||||||
|
};
|
||||||
if (category === 'preference') {
|
if (category === 'preference') {
|
||||||
this.response.body = {
|
this.response.body.settings = setting.PREFERENCE_SETTINGS;
|
||||||
category,
|
|
||||||
page_name: `home_${category}`,
|
|
||||||
settings: setting.PREFERENCE_SETTINGS,
|
|
||||||
};
|
|
||||||
} else if (category === 'account') {
|
} else if (category === 'account') {
|
||||||
this.response.body = {
|
this.response.body.settings = setting.ACCOUNT_SETTINGS;
|
||||||
category,
|
|
||||||
page_name: `home_${category}`,
|
|
||||||
settings: setting.ACCOUNT_SETTINGS,
|
|
||||||
};
|
|
||||||
} else throw new NotFoundError();
|
} else throw new NotFoundError();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,6 @@
|
|||||||
const user = require('../model/user');
|
const user = require('../model/user');
|
||||||
|
const system = require('../model/system');
|
||||||
|
const setting = require('../model/setting');
|
||||||
const { Route, Handler } = require('../service/server');
|
const { Route, Handler } = require('../service/server');
|
||||||
const { PERM_MANAGE } = require('../permission');
|
const { PERM_MANAGE } = require('../permission');
|
||||||
const hpm = require('../lib/hpm');
|
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() {
|
async function apply() {
|
||||||
Route('/manage', module.exports.ManageMainHandler);
|
Route('/manage', module.exports.ManageMainHandler);
|
||||||
Route('/manage/dashboard', module.exports.ManageDashboardHandler);
|
Route('/manage/dashboard', module.exports.ManageDashboardHandler);
|
||||||
@@ -144,6 +167,7 @@ async function apply() {
|
|||||||
Route('/manage/permission', module.exports.ManagePermissionHandler);
|
Route('/manage/permission', module.exports.ManagePermissionHandler);
|
||||||
Route('/manage/role', module.exports.ManageRoleHandler);
|
Route('/manage/role', module.exports.ManageRoleHandler);
|
||||||
Route('/manage/module', module.exports.ManageModuleHandler);
|
Route('/manage/module', module.exports.ManageModuleHandler);
|
||||||
|
Route('/manage/setting', module.exports.ManageSettingHandler);
|
||||||
}
|
}
|
||||||
|
|
||||||
global.Hydro.handler.manage = module.exports = {
|
global.Hydro.handler.manage = module.exports = {
|
||||||
@@ -154,5 +178,6 @@ global.Hydro.handler.manage = module.exports = {
|
|||||||
ManagePermissionHandler,
|
ManagePermissionHandler,
|
||||||
ManageRoleHandler,
|
ManageRoleHandler,
|
||||||
ManageModuleHandler,
|
ManageModuleHandler,
|
||||||
|
ManageSettingHandler,
|
||||||
apply,
|
apply,
|
||||||
};
|
};
|
||||||
@@ -39,7 +39,7 @@ class UserLogoutHandler extends Handler {
|
|||||||
}
|
}
|
||||||
|
|
||||||
async post() {
|
async post() {
|
||||||
this.session = { uid: 1 };
|
this.session.uid = 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -61,7 +61,7 @@ class UserRegisterHandler extends Handler {
|
|||||||
{ mail },
|
{ mail },
|
||||||
);
|
);
|
||||||
if (await system.get('smtp.user')) {
|
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);
|
await sendMail(mail, 'Sign Up', 'user_register_mail', m);
|
||||||
this.response.template = 'user_register_mail_sent.html';
|
this.response.template = 'user_register_mail_sent.html';
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
+7
-3
@@ -21,12 +21,16 @@ function ensureDir(dir) {
|
|||||||
|
|
||||||
const active = [];
|
const active = [];
|
||||||
const fail = [];
|
const fail = [];
|
||||||
|
|
||||||
try {
|
try {
|
||||||
// Let webpack pack builtin module together.
|
// Let webpack pack builtin module together.
|
||||||
// eslint-disable-next-line import/no-unresolved
|
// eslint-disable-next-line import/no-unresolved
|
||||||
const f = require('../.build/builtin.json');
|
const f = require('../.build/module.json');
|
||||||
const m = { ...yaml.safeLoad(zlib.gunzipSync(f.data)), id: 'builtin' };
|
for (const filename in f) {
|
||||||
active.push(m);
|
const m = { ...yaml.safeLoad(zlib.gunzipSync(f[filename])), filename };
|
||||||
|
active.push(m);
|
||||||
|
console.log(filename);
|
||||||
|
}
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
// Builtin module is in the module directory
|
// Builtin module is in the module directory
|
||||||
}
|
}
|
||||||
|
|||||||
+13
-4
@@ -24,10 +24,10 @@ const PREFERENCE_SETTINGS = [
|
|||||||
|
|
||||||
const ACCOUNT_SETTINGS = [
|
const ACCOUNT_SETTINGS = [
|
||||||
Setting('setting_info', 'gravatar', null,
|
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.'),
|
'We use <a href="https://en.gravatar.com/" target="_blank">Gravatar</a> to present your avatar icon.'),
|
||||||
Setting('setting_info', 'qq', null,
|
Setting('setting_info', 'qq', null,
|
||||||
null, null, 'QQ'),
|
null, 'text', 'QQ'),
|
||||||
Setting('setting_info', 'gender', builtin.USER_GENDER_RANGE,
|
Setting('setting_info', 'gender', builtin.USER_GENDER_RANGE,
|
||||||
null, 'select', 'Gender'),
|
null, 'select', 'Gender'),
|
||||||
Setting('setting_info', 'bio', null,
|
Setting('setting_info', 'bio', null,
|
||||||
@@ -43,6 +43,15 @@ const SETTINGS_BY_KEY = {};
|
|||||||
|
|
||||||
for (const setting in SETTINGS) SETTINGS_BY_KEY[setting.key] = setting;
|
for (const setting in SETTINGS) SETTINGS_BY_KEY[setting.key] = setting;
|
||||||
|
|
||||||
module.exports = {
|
const SYSTEM_SETTINGS = [
|
||||||
PREFERENCE_SETTINGS, ACCOUNT_SETTINGS, SETTINGS, SETTINGS_BY_KEY,
|
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,
|
nSubmit: doc.num_submit,
|
||||||
nAccept: doc.num_accept,
|
nAccept: doc.num_accept,
|
||||||
hidden: doc.hidden || false,
|
hidden: doc.hidden || false,
|
||||||
|
difficulty: doc.difficulty_admin,
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
return problems;
|
return problems;
|
||||||
|
|||||||
@@ -1,69 +1,6 @@
|
|||||||
{% extends "layout/home_base.html" %}
|
{% extends "layout/home_base.html" %}
|
||||||
{% block home_content %}
|
{% block home_content %}
|
||||||
<div class="section" data-heading-extract-to="#menu-item-home_{{ category }}">
|
<div class="section" data-heading-extract-to="#menu-item-home_{{ category }}">
|
||||||
<form method="post">
|
{% include "partials/setting.html" %}
|
||||||
{% 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>
|
|
||||||
</div>
|
</div>
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
@@ -15,6 +15,7 @@
|
|||||||
{{ sidemenu.render_item(null, 'manage_dashboard', '/manage/dashboard') }}
|
{{ sidemenu.render_item(null, 'manage_dashboard', '/manage/dashboard') }}
|
||||||
{{ sidemenu.render_item(null, 'manage_edit', '/manage/edit') }}
|
{{ sidemenu.render_item(null, 'manage_edit', '/manage/edit') }}
|
||||||
{{ sidemenu.render_item(null, 'manage_module', '/manage/module') }}
|
{{ sidemenu.render_item(null, 'manage_module', '/manage/module') }}
|
||||||
|
{{ sidemenu.render_item(null, 'manage_setting', '/manage/setting') }}
|
||||||
</ol>
|
</ol>
|
||||||
</li>
|
</li>
|
||||||
<li class="menu__item">
|
<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