mirror of
https://gitcode.com/gh_mirrors/hy/Hydro.git
synced 2026-10-20 01:38:19 +08:00
2.0.0(preview)
This commit is contained in:
1 parent
d5929d78b1
commit
1c8b62a6d9
33 files changed
+307
-241
No files matched your search
@@ -67,8 +67,14 @@ async function build(type) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
const f = fs.readFileSync(root('.build/development.js')).toString();
|
const f = fs.readFileSync(root('.build/development.js')).toString();
|
||||||
|
const installer = fs.readFileSync(root('tool/install.js')).toString();
|
||||||
const file = `global._hydroModule=${JSON.stringify(j)};${f}`;
|
const file = `global._hydroModule=${JSON.stringify(j)};${f}`;
|
||||||
fs.writeFileSync(root('.build/full.js'), file);
|
fs.writeFileSync(root('.build/full.js'), file);
|
||||||
|
const hydro = {};
|
||||||
|
hydro.app = Buffer.from(f).toString('base64');
|
||||||
|
hydro.modules = j;
|
||||||
|
const d = zlib.gzipSync(Buffer.from(JSON.stringify(hydro)), { level: -1 }).toString('base64');
|
||||||
|
fs.writeFileSync(root('.build/install.js'), `global.Hydro="${d}"; ${installer}`);
|
||||||
}
|
}
|
||||||
|
|
||||||
module.exports = build;
|
module.exports = build;
|
||||||
|
|||||||
@@ -302,24 +302,14 @@ class ContestCreateHandler extends ContestHandler {
|
|||||||
}
|
}
|
||||||
|
|
||||||
async function apply() {
|
async function apply() {
|
||||||
Route('/c', module.exports.ContestListHandler);
|
Route('/c', ContestListHandler);
|
||||||
Route('/c/:tid', module.exports.ContestDetailHandler);
|
Route('/c/:tid', ContestDetailHandler);
|
||||||
Route('/c/:tid/edit', module.exports.ContestEditHandler);
|
Route('/c/:tid/edit', ContestEditHandler);
|
||||||
Route('/c/:tid/scoreboard', module.exports.ContestScoreboardHandler);
|
Route('/c/:tid/scoreboard', ContestScoreboardHandler);
|
||||||
Route('/c/:tid/export/:ext', module.exports.ContestScoreboardDownloadHandler);
|
Route('/c/:tid/export/:ext', ContestScoreboardDownloadHandler);
|
||||||
Route('/c/:tid/p/:pid', module.exports.ContestProblemHandler);
|
Route('/c/:tid/p/:pid', ContestProblemHandler);
|
||||||
Route('/c/:tid/p/:pid/submit', module.exports.ContestProblemSubmitHandler);
|
Route('/c/:tid/p/:pid/submit', ContestProblemSubmitHandler);
|
||||||
Route('/contest/create', module.exports.ContestCreateHandler, PERM_CREATE_CONTEST);
|
Route('/contest/create', ContestCreateHandler, PERM_CREATE_CONTEST);
|
||||||
}
|
}
|
||||||
|
|
||||||
global.Hydro.handler.contest = module.exports = {
|
global.Hydro.handler.contest = module.exports = apply;
|
||||||
ContestListHandler,
|
|
||||||
ContestDetailHandler,
|
|
||||||
ContestEditHandler,
|
|
||||||
ContestScoreboardHandler,
|
|
||||||
ContestScoreboardDownloadHandler,
|
|
||||||
ContestProblemHandler,
|
|
||||||
ContestProblemSubmitHandler,
|
|
||||||
ContestCreateHandler,
|
|
||||||
apply,
|
|
||||||
};
|
|
||||||
@@ -283,24 +283,14 @@ class DiscussionEditHandler extends DiscussionHandler {
|
|||||||
}
|
}
|
||||||
|
|
||||||
async function apply() {
|
async function apply() {
|
||||||
Route('/discuss', module.exports.DiscussionMainHandler);
|
Route('/discuss', DiscussionMainHandler);
|
||||||
Route('/discuss/:did', module.exports.DiscussionDetailHandler);
|
Route('/discuss/:did', DiscussionDetailHandler);
|
||||||
Route('/discuss/:did/edit', module.exports.DiscussionEditHandler);
|
Route('/discuss/:did/edit', DiscussionEditHandler);
|
||||||
Route('/discuss/:did/raw', module.exports.DiscussionDetailRawHandler);
|
Route('/discuss/:did/raw', DiscussionDetailRawHandler);
|
||||||
Route('/discuss/:did/:drid/raw', module.exports.DiscussionReplyRawHandler);
|
Route('/discuss/:did/:drid/raw', DiscussionReplyRawHandler);
|
||||||
Route('/discuss/:did/:drid/:drrid/raw', module.exports.DiscussionTailReplyRawHandler);
|
Route('/discuss/:did/:drid/:drrid/raw', DiscussionTailReplyRawHandler);
|
||||||
Route('/discuss/:type/:name', module.exports.DiscussionNodeHandler);
|
Route('/discuss/:type/:name', DiscussionNodeHandler);
|
||||||
Route('/discuss/:type/:name/create', module.exports.DiscussionCreateHandler);
|
Route('/discuss/:type/:name/create', DiscussionCreateHandler);
|
||||||
}
|
}
|
||||||
|
|
||||||
global.Hydro.handler.discussion = module.exports = {
|
global.Hydro.handler.discussion = module.exports = apply;
|
||||||
DiscussionMainHandler,
|
|
||||||
DiscussionDetailHandler,
|
|
||||||
DiscussionEditHandler,
|
|
||||||
DiscussionDetailRawHandler,
|
|
||||||
DiscussionReplyRawHandler,
|
|
||||||
DiscussionTailReplyRawHandler,
|
|
||||||
DiscussionNodeHandler,
|
|
||||||
DiscussionCreateHandler,
|
|
||||||
apply,
|
|
||||||
};
|
|
||||||
@@ -192,6 +192,4 @@ async function apply() {
|
|||||||
Route('/domain/role', DomainRoleHandler);
|
Route('/domain/role', DomainRoleHandler);
|
||||||
}
|
}
|
||||||
|
|
||||||
global.Hydro.handler.domain = module.exports = {
|
global.Hydro.handler.domain = module.exports = apply;
|
||||||
apply,
|
|
||||||
};
|
|
||||||
+7
-15
@@ -285,23 +285,15 @@ class HomeMessagesConnectionHandler extends ConnectionHandler {
|
|||||||
}
|
}
|
||||||
|
|
||||||
async function apply() {
|
async function apply() {
|
||||||
Route('/', module.exports.HomeHandler);
|
Route('/', HomeHandler);
|
||||||
Route('/home/security', module.exports.HomeSecurityHandler);
|
Route('/home/security', HomeSecurityHandler);
|
||||||
Route('/home/changeMail/:code', module.exports.UserChangemailWithCodeHandler);
|
Route('/home/changeMail/:code', UserChangemailWithCodeHandler);
|
||||||
Route('/home/settings/:category', module.exports.HomeSettingsHandler);
|
Route('/home/settings/:category', HomeSettingsHandler);
|
||||||
Route('/home/messages', module.exports.HomeMessagesHandler);
|
Route('/home/messages', HomeMessagesHandler);
|
||||||
Connection('/home/messages-conn', module.exports.HomeMessagesConnectionHandler);
|
Connection('/home/messages-conn', HomeMessagesConnectionHandler);
|
||||||
}
|
}
|
||||||
|
|
||||||
global.Hydro.handler.home = module.exports = {
|
global.Hydro.handler.home = module.exports = apply;
|
||||||
HomeHandler,
|
|
||||||
HomeSecurityHandler,
|
|
||||||
HomeSettingsHandler,
|
|
||||||
UserChangemailWithCodeHandler,
|
|
||||||
HomeMessagesHandler,
|
|
||||||
HomeMessagesConnectionHandler,
|
|
||||||
apply,
|
|
||||||
};
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@app.route('/home/file', 'home_file', global_route=True)
|
@app.route('/home/file', 'home_file', global_route=True)
|
||||||
|
|||||||
@@ -452,15 +452,7 @@ async function apply() {
|
|||||||
Route('/homework/:tid/edit', HomeworkEditHandler);
|
Route('/homework/:tid/edit', HomeworkEditHandler);
|
||||||
}
|
}
|
||||||
|
|
||||||
global.Hydro.handler.homework = {
|
global.Hydro.handler.homework = module.exports = apply;
|
||||||
HomeworkMainHandler,
|
|
||||||
HomeworkCreateHandler,
|
|
||||||
HomeworkDetailHandler,
|
|
||||||
HomeworkDetailProblemHandler,
|
|
||||||
HomeworkDetailProblemSubmitHandler,
|
|
||||||
HomeworkEditHandler,
|
|
||||||
apply,
|
|
||||||
};
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
||||||
|
|||||||
@@ -36,9 +36,7 @@ class ProblemImportHandler extends Handler {
|
|||||||
}
|
}
|
||||||
|
|
||||||
async function apply() {
|
async function apply() {
|
||||||
Route('/problem/import', module.exports.ProblemImportHandler);
|
Route('/problem/import', ProblemImportHandler);
|
||||||
}
|
}
|
||||||
|
|
||||||
global.Hydro.handler.import = module.exports = {
|
global.Hydro.handler.import = module.exports = apply;
|
||||||
ProblemImportHandler, apply,
|
|
||||||
};
|
|
||||||
@@ -133,10 +133,11 @@ class JudgeConnectionHandler extends ConnectionHandler {
|
|||||||
}
|
}
|
||||||
|
|
||||||
async function apply() {
|
async function apply() {
|
||||||
Route('/judge', module.exports.JudgeHandler);
|
Route('/judge', JudgeHandler);
|
||||||
Connection('/judge/conn', module.exports.JudgeConnectionHandler);
|
Connection('/judge/conn', JudgeConnectionHandler);
|
||||||
}
|
}
|
||||||
|
|
||||||
global.Hydro.handler.judge = module.exports = {
|
apply.next = next;
|
||||||
JudgeHandler, JudgeConnectionHandler, apply, next, end,
|
apply.end = end;
|
||||||
};
|
|
||||||
|
global.Hydro.handler.judge = module.exports = apply;
|
||||||
+40
-43
@@ -1,57 +1,45 @@
|
|||||||
const domain = require('../model/domain');
|
|
||||||
const setting = require('../model/setting');
|
const setting = require('../model/setting');
|
||||||
const system = require('../model/system');
|
const system = require('../model/system');
|
||||||
const { Route, Handler } = require('../service/server');
|
const { Route, Handler } = require('../service/server');
|
||||||
const { PERM_MANAGE } = require('../permission');
|
|
||||||
const hpm = require('../lib/hpm');
|
const hpm = require('../lib/hpm');
|
||||||
const loader = require('../loader');
|
const loader = require('../loader');
|
||||||
const { PermissionError } = require('../error');
|
const { PermissionError } = require('../error');
|
||||||
|
|
||||||
class ManageHandler extends Handler {
|
class SystemHandler extends Handler {
|
||||||
async prepare({ domainId }) {
|
async prepare() {
|
||||||
this.checkPerm(PERM_MANAGE);
|
if (!this.user.priv) throw new PermissionError('???');
|
||||||
this.domain = await domain.get(domainId);
|
this.body = {
|
||||||
|
path: [
|
||||||
|
['Hydro', '/'],
|
||||||
|
['manage_main', '/manage'],
|
||||||
|
],
|
||||||
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
class ManageMainHandler extends ManageHandler {
|
class SystemMainHandler extends SystemHandler {
|
||||||
async get() {
|
async get() {
|
||||||
this.response.redirect = '/manage/dashboard';
|
this.response.redirect = '/manage/dashboard';
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
class ManageDashboardHandler extends ManageHandler {
|
class SystemDashboardHandler extends SystemHandler {
|
||||||
async get() {
|
async get() {
|
||||||
const path = [
|
|
||||||
['Hydro', '/'],
|
|
||||||
['manage', '/manage'],
|
|
||||||
['manage_dashboard', null],
|
|
||||||
];
|
|
||||||
this.response.template = 'manage_dashboard.html';
|
this.response.template = 'manage_dashboard.html';
|
||||||
this.response.body = { domain: this.domain, path };
|
this.response.body.path.push(['manage_dashboard', null]);
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
class SystemHandler extends Handler {
|
|
||||||
async prepare() {
|
|
||||||
if (!this.user.priv) throw new PermissionError('???');
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
class SystemModuleHandler extends SystemHandler {
|
class SystemModuleHandler extends SystemHandler {
|
||||||
async get() {
|
async get() {
|
||||||
const installed = await hpm.getInstalled();
|
this.response.body.path.push(['manage_module', null]);
|
||||||
const path = [
|
this.response.body.installed = await hpm.getInstalled();
|
||||||
['Hydro', '/'],
|
this.response.active = loader.active;
|
||||||
['manage', '/manage'],
|
|
||||||
['manage_module', null],
|
|
||||||
];
|
|
||||||
this.response.body = { installed, active: loader.active, path };
|
|
||||||
this.response.template = 'manage_module.html';
|
this.response.template = 'manage_module.html';
|
||||||
}
|
}
|
||||||
|
|
||||||
async postInstall({ url, id }) {
|
async postInstall({ url }) {
|
||||||
await hpm.install(url, id);
|
await hpm.install(url);
|
||||||
this.back();
|
this.back();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -61,15 +49,29 @@ class SystemModuleHandler extends SystemHandler {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
class SystemScriptHandler extends SystemHandler {
|
||||||
|
async get() {
|
||||||
|
this.response.template = 'manage_script.html';
|
||||||
|
this.response.body.scripts = global.Hydro.script;
|
||||||
|
this.response.body.path.push(['manage_script', null]);
|
||||||
|
}
|
||||||
|
|
||||||
|
async post({ id, args }) {
|
||||||
|
// TODO Do not use console.log
|
||||||
|
await global.Hydro.script[id].run(args, console.log);
|
||||||
|
this.back();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
class SystemSettingHandler extends SystemHandler {
|
class SystemSettingHandler extends SystemHandler {
|
||||||
async get() {
|
async get() {
|
||||||
this.response.template = 'manage_settings.html';
|
this.response.template = 'manage_settings.html';
|
||||||
const current = {};
|
this.response.body.path.push(['manage_settings', null]);
|
||||||
const settings = setting.SYSTEM_SETTINGS;
|
this.response.body.current = {};
|
||||||
for (const s of settings) {
|
this.response.body.settings = setting.SYSTEM_SETTINGS;
|
||||||
current[s.key] = await system.get(s.key);
|
for (const s of this.response.body.settings) {
|
||||||
|
this.response.body.current[s.key] = await system.get(s.key);
|
||||||
}
|
}
|
||||||
this.response.body = { current, settings };
|
|
||||||
}
|
}
|
||||||
|
|
||||||
async post(args) {
|
async post(args) {
|
||||||
@@ -99,16 +101,11 @@ class SystemSettingHandler extends SystemHandler {
|
|||||||
}
|
}
|
||||||
|
|
||||||
async function apply() {
|
async function apply() {
|
||||||
Route('/manage', module.exports.ManageMainHandler);
|
Route('/manage', SystemMainHandler);
|
||||||
Route('/manage/dashboard', module.exports.ManageDashboardHandler);
|
Route('/manage/dashboard', SystemDashboardHandler);
|
||||||
|
Route('/manage/script', SystemScriptHandler);
|
||||||
Route('/manage/module', SystemModuleHandler);
|
Route('/manage/module', SystemModuleHandler);
|
||||||
Route('/manage/setting', SystemSettingHandler);
|
Route('/manage/setting', SystemSettingHandler);
|
||||||
}
|
}
|
||||||
|
|
||||||
global.Hydro.handler.manage = module.exports = {
|
global.Hydro.handler.manage = module.exports = apply;
|
||||||
ManageMainHandler,
|
|
||||||
ManageDashboardHandler,
|
|
||||||
SystemModuleHandler,
|
|
||||||
SystemSettingHandler,
|
|
||||||
apply,
|
|
||||||
};
|
|
||||||
+20
-7
@@ -24,7 +24,11 @@ class StatusHandler extends Handler {
|
|||||||
desc = desc || 'Online';
|
desc = desc || 'Online';
|
||||||
stats[i].status = desc;
|
stats[i].status = desc;
|
||||||
}
|
}
|
||||||
this.response.body = { stats };
|
console.log(stats);
|
||||||
|
const path = [
|
||||||
|
['Hydro', '/'],
|
||||||
|
];
|
||||||
|
this.response.body = { stats, path };
|
||||||
this.response.template = 'status.html';
|
this.response.template = 'status.html';
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -32,7 +36,12 @@ class StatusHandler extends Handler {
|
|||||||
class StatusUpdateHandler extends Handler {
|
class StatusUpdateHandler extends Handler {
|
||||||
async post(args) {
|
async post(args) {
|
||||||
this.checkPerm(PERM_JUDGE);
|
this.checkPerm(PERM_JUDGE);
|
||||||
await coll.updateOne({ _id: args._id }, { $set: { ...args, type: 'judger' } }, { upsert: true });
|
args.type = 'judger';
|
||||||
|
return coll.updateOne(
|
||||||
|
{ mid: args.mid, type: 'judger' },
|
||||||
|
{ $set: args },
|
||||||
|
{ upsert: true },
|
||||||
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -50,9 +59,13 @@ async function apply() {
|
|||||||
Route('/language/:lang', SwitchLanguageHandler);
|
Route('/language/:lang', SwitchLanguageHandler);
|
||||||
}
|
}
|
||||||
|
|
||||||
global.Hydro.handler.misc = module.exports = {
|
apply.updateStatus = function updateStatus(args) {
|
||||||
FileDownloadHandler,
|
args.type = 'judger';
|
||||||
StatusHandler,
|
return coll.updateOne(
|
||||||
StatusUpdateHandler,
|
{ mid: args.mid, type: 'judger' },
|
||||||
apply,
|
{ $set: args },
|
||||||
|
{ upsert: true },
|
||||||
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
global.Hydro.handler.misc = module.exports = apply;
|
||||||
@@ -8,12 +8,12 @@ class NotFoundHandler extends Handler {
|
|||||||
}
|
}
|
||||||
|
|
||||||
async function apply() {
|
async function apply() {
|
||||||
Route('/:param1', module.exports.NotFoundHandler);
|
Route('/:param1', NotFoundHandler);
|
||||||
Route('/:param1/:param2', module.exports.NotFoundHandler);
|
Route('/:param1/:param2', NotFoundHandler);
|
||||||
Route('/:param1/:param2/:param3', module.exports.NotFoundHandler);
|
Route('/:param1/:param2/:param3', NotFoundHandler);
|
||||||
Route('/:param1/:param2/:param3/:param4', module.exports.NotFoundHandler);
|
Route('/:param1/:param2/:param3/:param4', NotFoundHandler);
|
||||||
|
Route('/:param1/:param2/:param3/:param4/:param5', NotFoundHandler);
|
||||||
|
Route('/:param1/:param2/:param3/:param4/:param5/:param6', NotFoundHandler);
|
||||||
}
|
}
|
||||||
|
|
||||||
global.Hydro.handler.notfound = module.exports = {
|
global.Hydro.handler.notfound = module.exports = apply;
|
||||||
NotFoundHandler, apply,
|
|
||||||
};
|
|
||||||
+17
-35
@@ -443,40 +443,22 @@ class ProblemCreateHandler extends Handler {
|
|||||||
}
|
}
|
||||||
|
|
||||||
async function apply() {
|
async function apply() {
|
||||||
Route('/p', module.exports.ProblemHandler);
|
Route('/p', ProblemHandler);
|
||||||
Route('/p/category/:category', module.exports.ProblemCategoryHandler);
|
Route('/p/category/:category', ProblemCategoryHandler);
|
||||||
Route('/problem/random', module.exports.ProblemRandomHandler);
|
Route('/problem/random', ProblemRandomHandler);
|
||||||
Route('/p/:pid', module.exports.ProblemDetailHandler);
|
Route('/p/:pid', ProblemDetailHandler);
|
||||||
Route('/p/:pid/submit', module.exports.ProblemSubmitHandler);
|
Route('/p/:pid/submit', ProblemSubmitHandler);
|
||||||
Route('/p/:pid/pretest', module.exports.ProblemPretestHandler);
|
Route('/p/:pid/pretest', ProblemPretestHandler);
|
||||||
Route('/p/:pid/settings', module.exports.ProblemSettingsHandler);
|
Route('/p/:pid/settings', ProblemSettingsHandler);
|
||||||
Route('/p/:pid/statistics', module.exports.ProblemStatisticsHandler);
|
Route('/p/:pid/statistics', ProblemStatisticsHandler);
|
||||||
Route('/p/:pid/edit', module.exports.ProblemEditHandler);
|
Route('/p/:pid/edit', ProblemEditHandler);
|
||||||
Route('/p/:pid/upload', module.exports.ProblemDataUploadHandler);
|
Route('/p/:pid/upload', ProblemDataUploadHandler);
|
||||||
Route('/p/:pid/data', module.exports.ProblemDataDownloadHandler);
|
Route('/p/:pid/data', ProblemDataDownloadHandler);
|
||||||
Route('/p/:pid/solution', module.exports.ProblemSolutionHandler);
|
Route('/p/:pid/solution', ProblemSolutionHandler);
|
||||||
Route('/p/:pid/solution/:psid/raw', module.exports.ProblemSolutionRawHandler);
|
Route('/p/:pid/solution/:psid/raw', ProblemSolutionRawHandler);
|
||||||
Route('/p/:pid/solution/:psid/:psrid/raw', module.exports.ProblemSolutionReplyRawHandler);
|
Route('/p/:pid/solution/:psid/:psrid/raw', ProblemSolutionReplyRawHandler);
|
||||||
Route('/problem/create', module.exports.ProblemCreateHandler);
|
Route('/problem/create', ProblemCreateHandler);
|
||||||
Connection('/p/:pid/pretest-conn', module.exports.ProblemPretestConnectionHandler);
|
Connection('/p/:pid/pretest-conn', ProblemPretestConnectionHandler);
|
||||||
}
|
}
|
||||||
|
|
||||||
global.Hydro.handler.problem = module.exports = {
|
global.Hydro.handler.problem = module.exports = apply;
|
||||||
ProblemHandler,
|
|
||||||
ProblemCategoryHandler,
|
|
||||||
ProblemRandomHandler,
|
|
||||||
ProblemDetailHandler,
|
|
||||||
ProblemSubmitHandler,
|
|
||||||
ProblemPretestHandler,
|
|
||||||
ProblemSettingsHandler,
|
|
||||||
ProblemStatisticsHandler,
|
|
||||||
ProblemEditHandler,
|
|
||||||
ProblemDataUploadHandler,
|
|
||||||
ProblemDataDownloadHandler,
|
|
||||||
ProblemSolutionHandler,
|
|
||||||
ProblemSolutionRawHandler,
|
|
||||||
ProblemSolutionReplyRawHandler,
|
|
||||||
ProblemCreateHandler,
|
|
||||||
ProblemPretestConnectionHandler,
|
|
||||||
apply,
|
|
||||||
};
|
|
||||||
@@ -160,11 +160,4 @@ async function apply() {
|
|||||||
Connection('/record-detail-conn', RecordDetailConnectionHandler);
|
Connection('/record-detail-conn', RecordDetailConnectionHandler);
|
||||||
}
|
}
|
||||||
|
|
||||||
global.Hydro.handler.record = module.exports = {
|
global.Hydro.handler.record = module.exports = apply;
|
||||||
RecordListHandler,
|
|
||||||
RecordDetailHandler,
|
|
||||||
RecordRejudgeHandler,
|
|
||||||
RecordMainConnectionHandler,
|
|
||||||
RecordDetailConnectionHandler,
|
|
||||||
apply,
|
|
||||||
};
|
|
||||||
@@ -78,14 +78,9 @@ class SystemSettingHandler extends SystemHandler {
|
|||||||
}
|
}
|
||||||
|
|
||||||
async function apply() {
|
async function apply() {
|
||||||
Route('/system', module.exports.SystemDashboardHandler);
|
Route('/system', SystemDashboardHandler);
|
||||||
Route('/system/module', module.exports.SystemModuleHandler);
|
Route('/system/module', SystemModuleHandler);
|
||||||
Route('/system/setting', module.exports.SystemSettingHandler);
|
Route('/system/setting', SystemSettingHandler);
|
||||||
}
|
}
|
||||||
|
|
||||||
global.Hydro.handler.manage = module.exports = {
|
global.Hydro.handler.manage = module.exports = apply;
|
||||||
SystemDashboardHandler,
|
|
||||||
SystemModuleHandler,
|
|
||||||
SystemSettingHandler,
|
|
||||||
apply,
|
|
||||||
};
|
|
||||||
@@ -249,16 +249,10 @@ class TrainingEditHandler extends TrainingHandler {
|
|||||||
}
|
}
|
||||||
|
|
||||||
async function apply() {
|
async function apply() {
|
||||||
Route('/t', module.exports.TrainingMainHandler);
|
Route('/t', TrainingMainHandler);
|
||||||
Route('/t/:tid', module.exports.TrainingDetailHandler);
|
Route('/t/:tid', TrainingDetailHandler);
|
||||||
Route('/t/:tid/edit', module.exports.TrainingEditHandler);
|
Route('/t/:tid/edit', TrainingEditHandler);
|
||||||
Route('/training/create', module.exports.TrainingCreateHandler);
|
Route('/training/create', TrainingCreateHandler);
|
||||||
}
|
}
|
||||||
|
|
||||||
global.Hydro.handler.training = module.exports = {
|
global.Hydro.handler.training = module.exports = apply;
|
||||||
TrainingMainHandler,
|
|
||||||
TrainingDetailHandler,
|
|
||||||
TrainingEditHandler,
|
|
||||||
TrainingCreateHandler,
|
|
||||||
apply,
|
|
||||||
};
|
|
||||||
+9
-19
@@ -168,24 +168,14 @@ class UserSearchHandler extends Handler {
|
|||||||
}
|
}
|
||||||
|
|
||||||
async function apply() {
|
async function apply() {
|
||||||
Route('/login', module.exports.UserLoginHandler);
|
Route('/login', UserLoginHandler);
|
||||||
Route('/register', module.exports.UserRegisterHandler);
|
Route('/register', UserRegisterHandler);
|
||||||
Route('/register/:code', module.exports.UserRegisterWithCodeHandler);
|
Route('/register/:code', UserRegisterWithCodeHandler);
|
||||||
Route('/logout', module.exports.UserLogoutHandler, PERM_LOGGEDIN);
|
Route('/logout', UserLogoutHandler, PERM_LOGGEDIN);
|
||||||
Route('/lostpass', module.exports.UserLostPassHandler);
|
Route('/lostpass', UserLostPassHandler);
|
||||||
Route('/lostpass/:code', module.exports.UserLostPassWithCodeHandler);
|
Route('/lostpass/:code', UserLostPassWithCodeHandler);
|
||||||
Route('/user/search', module.exports.UserSearchHandler);
|
Route('/user/search', UserSearchHandler);
|
||||||
Route('/user/:uid', module.exports.UserDetailHandler);
|
Route('/user/:uid', UserDetailHandler);
|
||||||
}
|
}
|
||||||
|
|
||||||
global.Hydro.handler.user = module.exports = {
|
global.Hydro.handler.user = module.exports = apply;
|
||||||
UserLoginHandler,
|
|
||||||
UserRegisterHandler,
|
|
||||||
UserRegisterWithCodeHandler,
|
|
||||||
UserLogoutHandler,
|
|
||||||
UserLostPassHandler,
|
|
||||||
UserLostPassWithCodeHandler,
|
|
||||||
UserSearchHandler,
|
|
||||||
UserDetailHandler,
|
|
||||||
apply,
|
|
||||||
};
|
|
||||||
+2
-1
@@ -3,7 +3,6 @@ const permission = require('../permission');
|
|||||||
global.Hydro.ui.nav = [];
|
global.Hydro.ui.nav = [];
|
||||||
|
|
||||||
const trueChecker = () => true;
|
const trueChecker = () => true;
|
||||||
|
|
||||||
const Item = (path, name, prefix, perm, checker) => {
|
const Item = (path, name, prefix, perm, checker) => {
|
||||||
if (perm && checker) {
|
if (perm && checker) {
|
||||||
checker = ((_chk) => (handler) => _chk(handler) && handler.user.hasPerm(perm))(checker);
|
checker = ((_chk) => (handler) => _chk(handler) && handler.user.hasPerm(perm))(checker);
|
||||||
@@ -21,6 +20,8 @@ Item('/t', 'training_main', 'training', permission.PERM_VIEW_TRAINING);
|
|||||||
Item('/homework', 'homework_main', 'homework', permission.PERM_VIEW_HOMEWORK);
|
Item('/homework', 'homework_main', 'homework', permission.PERM_VIEW_HOMEWORK);
|
||||||
Item('/discuss', 'discussion_main', 'discussion', permission.PERM_VIEW_DISCUSSION);
|
Item('/discuss', 'discussion_main', 'discussion', permission.PERM_VIEW_DISCUSSION);
|
||||||
Item('/c', 'contest_main', 'contest', permission.PERM_VIEW_CONTEST);
|
Item('/c', 'contest_main', 'contest', permission.PERM_VIEW_CONTEST);
|
||||||
|
Item('/record', 'record_main', 'record');
|
||||||
|
Item('/ranking', 'domain_rank', 'domain_rank');
|
||||||
Item('/domain/dashboard', 'domain_dashboard', 'domain', permission.PERM_MANAGE);
|
Item('/domain/dashboard', 'domain_dashboard', 'domain', permission.PERM_MANAGE);
|
||||||
Item('/manage/dashboard', 'manage', 'manage', null, (handler) => handler.user.priv === 1);
|
Item('/manage/dashboard', 'manage', 'manage', null, (handler) => handler.user.priv === 1);
|
||||||
|
|
||||||
|
|||||||
@@ -21,13 +21,13 @@ async function get() {
|
|||||||
let battery;
|
let battery;
|
||||||
if (!Battery.hasbattery) battery = 'No battery';
|
if (!Battery.hasbattery) battery = 'No battery';
|
||||||
else battery = `${Battery.type} ${Battery.model} ${Battery.percent}%${Battery.ischarging ? ' Charging' : ''}`;
|
else battery = `${Battery.type} ${Battery.model} ${Battery.percent}%${Battery.ischarging ? ' Charging' : ''}`;
|
||||||
const _id = OsInfo.serial;
|
const mid = OsInfo.serial;
|
||||||
cache.cpu = cpu;
|
cache.cpu = cpu;
|
||||||
cache.osinfo = osinfo;
|
cache.osinfo = osinfo;
|
||||||
cache.flags = flags;
|
cache.flags = flags;
|
||||||
cache._id = _id;
|
cache.mid = mid;
|
||||||
return {
|
return {
|
||||||
_id, cpu, memory, osinfo, load, flags, CpuTemp, battery,
|
mid, cpu, memory, osinfo, load, flags, CpuTemp, battery,
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -39,7 +39,7 @@ async function update() {
|
|||||||
systeminformation.battery(),
|
systeminformation.battery(),
|
||||||
]);
|
]);
|
||||||
const {
|
const {
|
||||||
_id, cpu, osinfo, flags,
|
mid, cpu, osinfo, flags,
|
||||||
} = cache;
|
} = cache;
|
||||||
const memory = `${size(Memory.active)}/${size(Memory.total)}`;
|
const memory = `${size(Memory.active)}/${size(Memory.total)}`;
|
||||||
const load = `${CurrentLoad.avgload}`;
|
const load = `${CurrentLoad.avgload}`;
|
||||||
@@ -47,12 +47,12 @@ async function update() {
|
|||||||
if (!Battery.hasbattery) battery = 'No battery';
|
if (!Battery.hasbattery) battery = 'No battery';
|
||||||
else battery = `${Battery.type} ${Battery.model} ${Battery.percent}%${Battery.ischarging ? ' Charging' : ''}`;
|
else battery = `${Battery.type} ${Battery.model} ${Battery.percent}%${Battery.ischarging ? ' Charging' : ''}`;
|
||||||
return [
|
return [
|
||||||
_id,
|
mid,
|
||||||
{
|
{
|
||||||
memory, load, battery, CpuTemp,
|
memory, load, battery, CpuTemp,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
_id, cpu, memory, osinfo, load, flags, battery, CpuTemp,
|
mid, cpu, memory, osinfo, load, flags, battery, CpuTemp,
|
||||||
},
|
},
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|||||||
+2
-2
@@ -258,10 +258,10 @@ async function load() {
|
|||||||
await model();
|
await model();
|
||||||
await handler();
|
await handler();
|
||||||
for (const i in global.Hydro.handler) {
|
for (const i in global.Hydro.handler) {
|
||||||
await global.Hydro.handler[i].apply();
|
await global.Hydro.handler[i]();
|
||||||
}
|
}
|
||||||
const notfound = require('./handler/notfound');
|
const notfound = require('./handler/notfound');
|
||||||
await notfound.apply();
|
await notfound();
|
||||||
for (const i in global.Hydro.service) {
|
for (const i in global.Hydro.service) {
|
||||||
if (global.Hydro.service[i].postInit) {
|
if (global.Hydro.service[i].postInit) {
|
||||||
try {
|
try {
|
||||||
|
|||||||
@@ -190,6 +190,13 @@ async function setStatus(domainId, docType, docId, uid, args) {
|
|||||||
return res.value;
|
return res.value;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function setMultiStatus(domainId, docType, query, args) {
|
||||||
|
return collStatus.updateMany(
|
||||||
|
{ domainId, docType, ...query },
|
||||||
|
{ $set: args },
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
async function setIfNotStatus(domainId, docType, docId, uid, key, value, ifNot, args) {
|
async function setIfNotStatus(domainId, docType, docId, uid, key, value, ifNot, args) {
|
||||||
const res = await collStatus.findOneAndUpdate(
|
const res = await collStatus.findOneAndUpdate(
|
||||||
{
|
{
|
||||||
@@ -351,6 +358,7 @@ global.Hydro.model.document = module.exports = {
|
|||||||
set,
|
set,
|
||||||
setIfNotStatus,
|
setIfNotStatus,
|
||||||
setStatus,
|
setStatus,
|
||||||
|
setMultiStatus,
|
||||||
setSub,
|
setSub,
|
||||||
|
|
||||||
TYPE_DOMAIN_USER,
|
TYPE_DOMAIN_USER,
|
||||||
|
|||||||
+7
-1
@@ -44,7 +44,8 @@ class USER {
|
|||||||
}
|
}
|
||||||
|
|
||||||
async function getInDomain(domainId, udoc) {
|
async function getInDomain(domainId, udoc) {
|
||||||
const dudoc = await document.getStatus(domainId, document.TYPE_DOMAIN_USER, 0, udoc._id);
|
let dudoc = await document.getStatus(domainId, document.TYPE_DOMAIN_USER, 0, udoc._id);
|
||||||
|
dudoc = dudoc || {};
|
||||||
if (udoc._id === 1) dudoc.role = 'guest';
|
if (udoc._id === 1) dudoc.role = 'guest';
|
||||||
if (udoc.priv === 1) dudoc.role = 'admin';
|
if (udoc.priv === 1) dudoc.role = 'admin';
|
||||||
const p = await document.get(domainId, document.TYPE_DOMAIN_USER, dudoc.role || 'default');
|
const p = await document.get(domainId, document.TYPE_DOMAIN_USER, dudoc.role || 'default');
|
||||||
@@ -154,6 +155,10 @@ function setInDomain(domainId, uid, params) {
|
|||||||
return document.setStatus(domainId, document.TYPE_DOMAIN_USER, 0, uid, params);
|
return document.setStatus(domainId, document.TYPE_DOMAIN_USER, 0, uid, params);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function setMultiInDomain(domainId, query, params) {
|
||||||
|
return document.setMultiStatus(domainId, document.TYPE_DOMAIN_USER, query, params);
|
||||||
|
}
|
||||||
|
|
||||||
async function getPrefixList(prefix, limit = 50) {
|
async function getPrefixList(prefix, limit = 50) {
|
||||||
prefix = prefix.toLowerCase();
|
prefix = prefix.toLowerCase();
|
||||||
const $regex = new RegExp(`\\A\\Q${prefix.replace(/\\E/gmi, /\\E\\E\\Q/gmi)}\\E`, 'gmi');
|
const $regex = new RegExp(`\\A\\Q${prefix.replace(/\\E/gmi, /\\E\\E\\Q/gmi)}\\E`, 'gmi');
|
||||||
@@ -222,6 +227,7 @@ global.Hydro.model.user = module.exports = {
|
|||||||
setEmail,
|
setEmail,
|
||||||
setPassword,
|
setPassword,
|
||||||
setInDomain,
|
setInDomain,
|
||||||
|
setMultiInDomain,
|
||||||
getMultiInDomain,
|
getMultiInDomain,
|
||||||
getPrefixList,
|
getPrefixList,
|
||||||
setRole,
|
setRole,
|
||||||
|
|||||||
@@ -1,11 +1,22 @@
|
|||||||
/* eslint-disable no-await-in-loop */
|
/* eslint-disable no-await-in-loop */
|
||||||
|
const domain = require('../model/domain');
|
||||||
const contest = require('../model/contest');
|
const contest = require('../model/contest');
|
||||||
const user = require('../model/user');
|
const user = require('../model/user');
|
||||||
const rating = require('../lib/rating');
|
const rating = require('../lib/rating');
|
||||||
|
|
||||||
async function run({ domainId }, report) {
|
async function run({ domainId, isSub = false }, report) {
|
||||||
|
if (!domainId) {
|
||||||
|
const domains = await domain.getMulti().toArray();
|
||||||
|
await report({ total: domains.length });
|
||||||
|
for (const i in domains) {
|
||||||
|
await run({ domainId: domains[i]._id, isSub: true }, report);
|
||||||
|
await report({ current: parseInt(i) + 1 });
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
const contests = await contest.getMulti(domainId).sort('endAt', -1).toArray();
|
const contests = await contest.getMulti(domainId).sort('endAt', -1).toArray();
|
||||||
await report({ total: contests.length });
|
await report({ total: contests.length });
|
||||||
|
await user.setMultiInDomain(domainId, {}, { rating: 1500 });
|
||||||
for (const i in contests) {
|
for (const i in contests) {
|
||||||
const tdoc = contests[i];
|
const tdoc = contests[i];
|
||||||
const tsdocs = await contest.getMultiStatus(domainId, { docId: tdoc.docId })
|
const tsdocs = await contest.getMultiStatus(domainId, { docId: tdoc.docId })
|
||||||
@@ -22,8 +33,10 @@ async function run({ domainId }, report) {
|
|||||||
tasks.push(user.setInDomain(domainId, udoc.uid, { rating: udoc.new }));
|
tasks.push(user.setInDomain(domainId, udoc.uid, { rating: udoc.new }));
|
||||||
}
|
}
|
||||||
await Promise.all(tasks);
|
await Promise.all(tasks);
|
||||||
await report({ current: i + 1 });
|
if (isSub) await report({ subProgress: (i + 1) / contests.length });
|
||||||
|
else await report({ current: parseInt(i) + 1 });
|
||||||
}
|
}
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
global.Hydro.script.recalcRating = module.exports = { run };
|
global.Hydro.script.recalcRating = module.exports = { run };
|
||||||
@@ -4,9 +4,9 @@ const sysinfo = require('../lib/sysinfo');
|
|||||||
const coll = db.collection('status');
|
const coll = db.collection('status');
|
||||||
|
|
||||||
async function update() {
|
async function update() {
|
||||||
const [_id, $set] = await sysinfo.update();
|
const [mid, $set] = await sysinfo.update();
|
||||||
await coll.updateOne(
|
await coll.updateOne(
|
||||||
{ _id },
|
{ mid, type: 'server' },
|
||||||
{ $set: { ...$set, updateAt: new Date() } },
|
{ $set: { ...$set, updateAt: new Date() } },
|
||||||
{ upsert: true },
|
{ upsert: true },
|
||||||
);
|
);
|
||||||
@@ -15,7 +15,7 @@ async function update() {
|
|||||||
async function postInit() {
|
async function postInit() {
|
||||||
const info = await sysinfo.get();
|
const info = await sysinfo.get();
|
||||||
await coll.updateOne(
|
await coll.updateOne(
|
||||||
{ _id: info._id },
|
{ mid: info.mid, type: 'server' },
|
||||||
{ $set: { ...info, updateAt: new Date(), type: 'server' } },
|
{ $set: { ...info, updateAt: new Date(), type: 'server' } },
|
||||||
{ upsert: true },
|
{ upsert: true },
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -47,6 +47,4 @@ async function apply() {
|
|||||||
nav('/paste/create', 'pastebin', 'pastebin', PERM_LOGGEDIN);
|
nav('/paste/create', 'pastebin', 'pastebin', PERM_LOGGEDIN);
|
||||||
}
|
}
|
||||||
|
|
||||||
global.Hydro.handler.pastebin = module.exports = {
|
global.Hydro.handler.pastebin = module.exports = apply;
|
||||||
PasteCreateHandler, PasteShowHandler, apply,
|
|
||||||
};
|
|
||||||
@@ -23,6 +23,4 @@ async function apply() {
|
|||||||
Route('/wiki/:name', module.exports.WikiHandler);
|
Route('/wiki/:name', module.exports.WikiHandler);
|
||||||
}
|
}
|
||||||
|
|
||||||
global.Hydro.handler.wiki = module.exports = {
|
global.Hydro.handler.wiki = module.exports = apply;
|
||||||
WikiHandler, apply,
|
|
||||||
};
|
|
||||||
+1
-1
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "hydro",
|
"name": "hydro",
|
||||||
"version": "1.0.0",
|
"version": "2.0.0",
|
||||||
"main": "hydro/development.js",
|
"main": "hydro/development.js",
|
||||||
"repository": "https://github.com/hydro-dev/Hydro.git",
|
"repository": "https://github.com/hydro-dev/Hydro.git",
|
||||||
"author": "masnn",
|
"author": "masnn",
|
||||||
|
|||||||
@@ -7,7 +7,7 @@
|
|||||||
<div class="section">
|
<div class="section">
|
||||||
<div class="section__body no-padding">
|
<div class="section__body no-padding">
|
||||||
<div data-fragment-id="ranking">
|
<div data-fragment-id="ranking">
|
||||||
{% if not udocs %}
|
{% if not udocs.length %}
|
||||||
{{ nothing.render('Sorry, there is no user in this domain.') }}
|
{{ nothing.render('Sorry, there is no user in this domain.') }}
|
||||||
{% else %}
|
{% else %}
|
||||||
<table class="data-table">
|
<table class="data-table">
|
||||||
|
|||||||
@@ -13,6 +13,7 @@
|
|||||||
</div>
|
</div>
|
||||||
<ol class="menu collapsed">
|
<ol class="menu collapsed">
|
||||||
{{ sidemenu.render_item(null, 'manage_dashboard', '/manage/dashboard') }}
|
{{ sidemenu.render_item(null, 'manage_dashboard', '/manage/dashboard') }}
|
||||||
|
{{ sidemenu.render_item(null, 'manage_script', '/manage/script') }}
|
||||||
{{ sidemenu.render_item(null, 'manage_module', '/manage/module') }}
|
{{ sidemenu.render_item(null, 'manage_module', '/manage/module') }}
|
||||||
{{ sidemenu.render_item(null, 'manage_setting', '/manage/setting') }}
|
{{ sidemenu.render_item(null, 'manage_setting', '/manage/setting') }}
|
||||||
</ol>
|
</ol>
|
||||||
|
|||||||
@@ -0,0 +1,56 @@
|
|||||||
|
{% extends "manage_base.html" %}
|
||||||
|
{% block manage_content %}
|
||||||
|
<div style="display: none" class="dialog__body--run-script">
|
||||||
|
<div>
|
||||||
|
<div class="row"><div class="columns">
|
||||||
|
<h1>{{ _('Run script') }}</h1>
|
||||||
|
</div></div>
|
||||||
|
<div class="row">
|
||||||
|
<div class="medium-12 columns">
|
||||||
|
<label>
|
||||||
|
{{ _('Params') }}
|
||||||
|
<input name="args" type="text" class="textbox" autocomplete="off" data-autofocus>
|
||||||
|
</label>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="section">
|
||||||
|
<div class="section__header">
|
||||||
|
<h1 class="section__title">{{ _('Scripts') }}</h1>
|
||||||
|
<div class="section__tools">
|
||||||
|
<a class="tool-button" href="/wiki/help#script"><span class="icon icon-help"></span> {{ _("What's script?") }}</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="section__body no-padding">
|
||||||
|
{{ noscript_note.render() }}
|
||||||
|
<table class="data-table">
|
||||||
|
<colgroup>
|
||||||
|
<col class="col--id">
|
||||||
|
<col class="col--desc">
|
||||||
|
<col class="col--action">
|
||||||
|
</colgroup>
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
<th class="col--id">{{ _('ID') }}</th>
|
||||||
|
<th class="col--desc">{{ _('Description') }}</th>
|
||||||
|
<th class="col--action">{{ _('Action') }}</th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody>
|
||||||
|
{% for id, script in scripts %}
|
||||||
|
{% if not script.hidden %}
|
||||||
|
<tr>
|
||||||
|
<td class="col--id">{{ id }}</td>
|
||||||
|
<td class="col--desc">{{ _(script.description|default(_('None'))) }}</td>
|
||||||
|
<td class="col--action">
|
||||||
|
<a class="typo-a" href="javascript: window.runScript('{{ id }}')">{{ _('Run') }}</a>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
{% endif %}
|
||||||
|
{% endfor %}
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{% endblock %}
|
||||||
@@ -25,11 +25,11 @@
|
|||||||
<tbody>
|
<tbody>
|
||||||
{% for doc in stats %}
|
{% for doc in stats %}
|
||||||
<tr>
|
<tr>
|
||||||
<td class="col--id">{{ doc._id|truncate(6, True, '') }}</td>
|
<td class="col--id">{{ doc._id }}</td>
|
||||||
<td class="col--status">{{ doc.status }}</td>
|
<td class="col--status">{{ doc.status }}</td>
|
||||||
<td class="col--os">{{ doc.osinfo }}</td>
|
<td class="col--os">{{ doc.osinfo }}</td>
|
||||||
<td class="col--cpu" data-tooltip="{{ doc.flags }}">{{ doc.cpu }}</td>
|
<td class="col--cpu" data-tooltip="{{ doc.flags }}">{{ doc.cpu }}</td>
|
||||||
<td class="col--memory">{{ doc.memory }}</td>
|
<td class="col--memory"{% if doc.stack %} data-tooltip="Stack size: {{ doc.stack }}MB"{% endif %}>{{ doc.memory }}</td>
|
||||||
</tr>
|
</tr>
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
</tbody>
|
</tbody>
|
||||||
|
|||||||
@@ -0,0 +1,17 @@
|
|||||||
|
const zlib = require('zlib');
|
||||||
|
const fs = require('fs');
|
||||||
|
|
||||||
|
async function install() {
|
||||||
|
if (!global.Hydro) throw new Error('Data missing');
|
||||||
|
if (!fs.existsSync('hydro')) fs.mkdirSync('hydro');
|
||||||
|
const hydro = JSON.parse(zlib.gunzipSync(global.Hydro).toString());
|
||||||
|
fs.writeFileSync('development.js', hydro.app);
|
||||||
|
for (const i in hydro.modules) {
|
||||||
|
fs.writeFileSync(`${i}.hydro`, Buffer.from(hydro.modules[i], 'base64'));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
install().catch((e) => {
|
||||||
|
console.error(e);
|
||||||
|
process.exit(1);
|
||||||
|
});
|
||||||
@@ -18,7 +18,6 @@ const page = new NamedPage('manage_module', () => {
|
|||||||
});
|
});
|
||||||
addModuleDialog.clear = function () {
|
addModuleDialog.clear = function () {
|
||||||
this.$dom.find('[name="url"]').val('');
|
this.$dom.find('[name="url"]').val('');
|
||||||
this.$dom.find('[name="id"]').val('');
|
|
||||||
return this;
|
return this;
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -26,12 +25,10 @@ const page = new NamedPage('manage_module', () => {
|
|||||||
const action = await addModuleDialog.clear().open();
|
const action = await addModuleDialog.clear().open();
|
||||||
if (action !== 'ok') return;
|
if (action !== 'ok') return;
|
||||||
const url = addModuleDialog.$dom.find('[name="url"]').val();
|
const url = addModuleDialog.$dom.find('[name="url"]').val();
|
||||||
const id = addModuleDialog.$dom.find('[name="id"]').val();
|
|
||||||
try {
|
try {
|
||||||
await request.post('', {
|
await request.post('', {
|
||||||
operation: 'install',
|
operation: 'install',
|
||||||
url,
|
url,
|
||||||
id,
|
|
||||||
});
|
});
|
||||||
window.location.reload();
|
window.location.reload();
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
|
|||||||
@@ -0,0 +1,40 @@
|
|||||||
|
import { NamedPage } from 'vj/misc/PageLoader';
|
||||||
|
import Notification from 'vj/components/notification';
|
||||||
|
import { ActionDialog } from 'vj/components/dialog';
|
||||||
|
|
||||||
|
import request from 'vj/utils/request';
|
||||||
|
|
||||||
|
const page = new NamedPage('manage_script', () => {
|
||||||
|
const runScriptDialog = new ActionDialog({
|
||||||
|
$body: $('.dialog__body--run-script > div'),
|
||||||
|
onDispatch(action) {
|
||||||
|
const $args = runScriptDialog.$dom.find('[name="args"]');
|
||||||
|
if (action === 'ok' && $args.val() === '') {
|
||||||
|
$args.focus();
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
},
|
||||||
|
});
|
||||||
|
runScriptDialog.clear = function () {
|
||||||
|
this.$dom.find('[name="args"]').val('');
|
||||||
|
return this;
|
||||||
|
};
|
||||||
|
|
||||||
|
window.runScript = async function (id) {
|
||||||
|
const action = await runScriptDialog.clear().open();
|
||||||
|
if (action !== 'ok') return;
|
||||||
|
const args = runScriptDialog.$dom.find('[name="args"]').val();
|
||||||
|
try {
|
||||||
|
await request.post('', {
|
||||||
|
args,
|
||||||
|
id,
|
||||||
|
});
|
||||||
|
window.location.reload();
|
||||||
|
} catch (error) {
|
||||||
|
Notification.error(error.message);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
});
|
||||||
|
|
||||||
|
export default page;
|
||||||
Reference in new issue
Block a user