管理面板新增「自定义」面板,可按 Surge 格式书写 [Proxy]/[Rule]/ [General] 等配置片段,生成时合并进最终输出:[Proxy] 行追加到节点 之后,[Rule] 行注入到规则最顶部(优先级最高),其他段注入对应段 顶部且同名 key 覆盖模板取值(如 doh-server)。仅管理员链接生效, 游客链接不包含自定义内容。 Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
50 lines
1.7 KiB
TypeScript
50 lines
1.7 KiB
TypeScript
import { Router } from 'express';
|
|
import crypto from 'crypto';
|
|
import db from '../db.js';
|
|
import { generateSurgeConfig } from '../services/generator.js';
|
|
|
|
const router = Router();
|
|
|
|
// GET /api/config/surge-token - get current surge token
|
|
router.get('/surge-token', (_req, res) => {
|
|
const row = db.prepare("SELECT value FROM config WHERE key = 'surge_token'").get() as any;
|
|
res.json({ token: row?.value || null });
|
|
});
|
|
|
|
// POST /api/config/surge-token - regenerate surge token
|
|
router.post('/surge-token', (_req, res) => {
|
|
const token = crypto.randomUUID();
|
|
db.prepare("INSERT OR REPLACE INTO config (key, value) VALUES ('surge_token', ?)").run(token);
|
|
res.json({ token });
|
|
});
|
|
|
|
// GET /api/config/custom - get custom config snippet
|
|
router.get('/custom', (_req, res) => {
|
|
const row = db.prepare("SELECT value FROM config WHERE key = 'custom_config'").get() as any;
|
|
res.json({ content: row?.value || '' });
|
|
});
|
|
|
|
// PUT /api/config/custom - save custom config snippet
|
|
router.put('/custom', (req, res) => {
|
|
const { content } = req.body;
|
|
if (typeof content !== 'string') {
|
|
return res.status(400).json({ error: 'content must be a string' });
|
|
}
|
|
db.prepare("INSERT OR REPLACE INTO config (key, value) VALUES ('custom_config', ?)").run(content);
|
|
res.json({ ok: true });
|
|
});
|
|
|
|
// GET /api/config/preview - preview generated config
|
|
router.get('/preview', (req, res) => {
|
|
const host = req.headers.host || 'localhost:3456';
|
|
const protocol = req.secure ? 'https' : 'http';
|
|
const row = db.prepare("SELECT value FROM config WHERE key = 'surge_token'").get() as any;
|
|
const token = row?.value || '';
|
|
const hostUrl = `${protocol}://${host}/surge/${token}`;
|
|
|
|
const config = generateSurgeConfig(hostUrl);
|
|
res.json({ config });
|
|
});
|
|
|
|
export default router;
|