mirror of
https://gitcode.com/gh_mirrors/hy/Hydro.git
synced 2026-10-20 09:46:28 +08:00
将内置UI封包
This commit is contained in:
1 parent
9156fa3a9b
commit
88fc0606ee
5 files changed
+74
-52
No files matched your search
@@ -8,6 +8,15 @@ jobs:
|
|||||||
name: Build
|
name: Build
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
|
- run: |
|
||||||
|
cd ui
|
||||||
|
yarn
|
||||||
|
yarn build:production
|
||||||
|
cd ..
|
||||||
|
- uses: actions/upload-artifact@v1
|
||||||
|
with:
|
||||||
|
name: .uibuild
|
||||||
|
path: .uibuild
|
||||||
- uses: actions/checkout@v2
|
- uses: actions/checkout@v2
|
||||||
- uses: actions/setup-node@v1
|
- uses: actions/setup-node@v1
|
||||||
with:
|
with:
|
||||||
@@ -19,15 +28,6 @@ jobs:
|
|||||||
with:
|
with:
|
||||||
name: hydro
|
name: hydro
|
||||||
path: .build
|
path: .build
|
||||||
- run: |
|
|
||||||
cd ui
|
|
||||||
yarn
|
|
||||||
yarn build:production
|
|
||||||
cd ..
|
|
||||||
- uses: actions/upload-artifact@v1
|
|
||||||
with:
|
|
||||||
name: .uibuild
|
|
||||||
path: .uibuild
|
|
||||||
- uses: elgohr/Publish-Docker-Github-Action@master
|
- uses: elgohr/Publish-Docker-Github-Action@master
|
||||||
with:
|
with:
|
||||||
name: hydrooj/hydro:alpine
|
name: hydrooj/hydro:alpine
|
||||||
|
|||||||
@@ -14,32 +14,7 @@ Hydro 的界面基于 Vijos 二次开发。
|
|||||||
#### 直接部署:
|
#### 直接部署:
|
||||||
|
|
||||||
安装mongodb (省略)
|
安装mongodb (省略)
|
||||||
编辑 `config.yaml` :
|
下载Github Actions自动编译的 development.js 直接运行即可。
|
||||||
|
|
||||||
```yaml
|
|
||||||
db:
|
|
||||||
host: 127.0.0.1
|
|
||||||
port: 27017
|
|
||||||
name: hydro
|
|
||||||
username: hydro
|
|
||||||
password: db.drop();
|
|
||||||
listen:
|
|
||||||
host: 127.0.0.1
|
|
||||||
port: 8888
|
|
||||||
session:
|
|
||||||
domain: '*'
|
|
||||||
```
|
|
||||||
|
|
||||||
运行:
|
|
||||||
|
|
||||||
```sh
|
|
||||||
yarn
|
|
||||||
cd ui
|
|
||||||
yarn
|
|
||||||
yarn build:production
|
|
||||||
cd ..
|
|
||||||
node hydro/development.js
|
|
||||||
```
|
|
||||||
|
|
||||||
## 鸣谢
|
## 鸣谢
|
||||||
|
|
||||||
|
|||||||
+27
-3
@@ -1,10 +1,23 @@
|
|||||||
const fs = require('fs');
|
const fs = require('fs');
|
||||||
|
const path = require('path');
|
||||||
const zlib = require('zlib');
|
const zlib = require('zlib');
|
||||||
const yaml = require('js-yaml');
|
const yaml = require('js-yaml');
|
||||||
const root = require('./root');
|
const root = require('./root');
|
||||||
const template = require('./template');
|
const template = require('./template');
|
||||||
const ignoreFailure = require('./ignoreFailure');
|
const ignoreFailure = require('./ignoreFailure');
|
||||||
|
|
||||||
|
function getFiles(folder) {
|
||||||
|
const res = [];
|
||||||
|
const files = fs.readdirSync(root(folder));
|
||||||
|
for (const filename of files) {
|
||||||
|
res.push(filename);
|
||||||
|
if (fs.statSync(root(path.join(folder, filename))).isDirectory()) {
|
||||||
|
res.push(...(getFiles(path.join(folder, filename)).map((i) => path.join(filename, i))));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
async function build(type) {
|
async function build(type) {
|
||||||
if (!['development', 'production'].includes(type)) throw new Error(`Unknown type: ${type}`);
|
if (!['development', 'production'].includes(type)) throw new Error(`Unknown type: ${type}`);
|
||||||
ignoreFailure(fs.mkdirSync, root('.build'));
|
ignoreFailure(fs.mkdirSync, root('.build'));
|
||||||
@@ -20,10 +33,21 @@ async function build(type) {
|
|||||||
'partials/problem_default.md',
|
'partials/problem_default.md',
|
||||||
'bsod.html',
|
'bsod.html',
|
||||||
];
|
];
|
||||||
const builtin = {};
|
const builtin = {
|
||||||
builtin.locale = lang;
|
locale: lang,
|
||||||
builtin.template = template('templates', exclude);
|
template: template('templates', exclude),
|
||||||
|
file: {},
|
||||||
|
};
|
||||||
|
const files = getFiles('.uibuild');
|
||||||
|
for (const f of files) {
|
||||||
|
if (fs.statSync(root(`.uibuild/${f}`)).isDirectory()) {
|
||||||
|
builtin.file[f] = null;
|
||||||
|
} else {
|
||||||
|
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: 3 });
|
||||||
|
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);
|
||||||
|
|||||||
+30
-12
@@ -20,6 +20,13 @@ function ensureDir(dir) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
const active = [];
|
const active = [];
|
||||||
|
try {
|
||||||
|
const f = require('../.build/builtin.json');
|
||||||
|
const m = { ...yaml.safeLoad(zlib.gunzipSync(f.data)), id: 'builtin' };
|
||||||
|
active.push(m);
|
||||||
|
} catch (e) {
|
||||||
|
/* Ignore */
|
||||||
|
}
|
||||||
|
|
||||||
async function preload() {
|
async function preload() {
|
||||||
const files = fs.readdirSync(root('.build/module'));
|
const files = fs.readdirSync(root('.build/module'));
|
||||||
@@ -28,24 +35,35 @@ async function preload() {
|
|||||||
try {
|
try {
|
||||||
const f = fs.readFileSync(root(`.build/module/${file}`));
|
const f = fs.readFileSync(root(`.build/module/${file}`));
|
||||||
const m = { ...yaml.safeLoad(zlib.gunzipSync(f)), id: file.split('.')[0] };
|
const m = { ...yaml.safeLoad(zlib.gunzipSync(f)), id: file.split('.')[0] };
|
||||||
if (m.os) {
|
|
||||||
if (!m.os.includes(os.platform())) throw new Error('Unsupported OS');
|
|
||||||
}
|
|
||||||
if (m.file) {
|
|
||||||
m.files = {};
|
|
||||||
ensureDir(path.resolve(os.tmpdir(), 'hydro', file));
|
|
||||||
for (const n in m.file) {
|
|
||||||
const e = path.resolve(os.tmpdir(), 'hydro', file, n);
|
|
||||||
fs.writeFileSync(e, Buffer.from(m.file[n], 'base64'), { mode: 755 });
|
|
||||||
m.files[n] = e;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
active.push(m);
|
active.push(m);
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
console.error(`Module Load Fail: ${file}`);
|
console.error(`Module Load Fail: ${file}`);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
for (const i of active) {
|
||||||
|
try {
|
||||||
|
if (i.os) {
|
||||||
|
if (!i.os.includes(os.platform())) throw new Error('Unsupported OS');
|
||||||
|
}
|
||||||
|
if (i.file) {
|
||||||
|
i.files = {};
|
||||||
|
ensureDir(path.resolve(os.tmpdir(), 'hydro', i.id));
|
||||||
|
for (const n in i.file) {
|
||||||
|
if (i.file[n] === null) {
|
||||||
|
ensureDir(path.resolve(os.tmpdir(), 'hydro', i.id, n));
|
||||||
|
} else {
|
||||||
|
const e = path.resolve(os.tmpdir(), 'hydro', i.id, n);
|
||||||
|
fs.writeFileSync(e, Buffer.from(i.file[n], 'base64'), { mode: 755 });
|
||||||
|
i.files[n] = e;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch (e) {
|
||||||
|
console.error(`Module Load Fail: ${i.id}`);
|
||||||
|
console.error(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
async function handler() {
|
async function handler() {
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
const path = require('path');
|
const path = require('path');
|
||||||
|
const os = require('os');
|
||||||
const { ObjectID } = require('bson');
|
const { ObjectID } = require('bson');
|
||||||
const Koa = require('koa');
|
const Koa = require('koa');
|
||||||
const morgan = require('koa-morgan');
|
const morgan = require('koa-morgan');
|
||||||
@@ -28,7 +29,7 @@ async function prepare() {
|
|||||||
const useHttps = await system.get('listen.https');
|
const useHttps = await system.get('listen.https');
|
||||||
server = (useHttps ? https : http).createServer(app.callback());
|
server = (useHttps ? https : http).createServer(app.callback());
|
||||||
app.keys = await system.get('session.keys');
|
app.keys = await system.get('session.keys');
|
||||||
app.use(cache(path.join(process.cwd(), '.uibuild'), {
|
app.use(cache(path.join(os.tmpdir(), 'hydro', 'builtin'), {
|
||||||
maxAge: 365 * 24 * 60 * 60,
|
maxAge: 365 * 24 * 60 * 60,
|
||||||
}));
|
}));
|
||||||
app.use(Body({
|
app.use(Body({
|
||||||
@@ -395,6 +396,10 @@ function Connection(prefix, RouteConnHandler) {
|
|||||||
sock.installHandlers(server);
|
sock.installHandlers(server);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function Middleware(middleware) {
|
||||||
|
app.use(middleware);
|
||||||
|
}
|
||||||
|
|
||||||
async function start() {
|
async function start() {
|
||||||
app.use(morgan(':method :url :status :res[content-length] - :response-time ms'));
|
app.use(morgan(':method :url :status :res[content-length] - :response-time ms'));
|
||||||
app.use(router.routes()).use(router.allowedMethods());
|
app.use(router.routes()).use(router.allowedMethods());
|
||||||
@@ -404,5 +409,5 @@ async function start() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
global.Hydro.service.server = module.exports = {
|
global.Hydro.service.server = module.exports = {
|
||||||
Handler, ConnectionHandler, Route, Connection, prepare, start,
|
Handler, ConnectionHandler, Route, Connection, Middleware, prepare, start,
|
||||||
};
|
};
|
||||||
Reference in new issue
Block a user