v0.5.4: 全面修复 — template literal URL, Cookie验证, 用户默认is_active, 默认账号路由, 空间信息, 密钥清理, promoForm修复
修复:
- quark-share.ts/storage.ts: 9处template literal ${}缺失导致fetch URL写死
- user/routes.ts: testCloudConnectionWithCookie缺await + 按cloudType分发驱动
- credential.service.ts: INSERT缺?参数 (9values/10cols)
- user/routes.ts: 用户新增网盘默认is_active=0
- admin.routes.ts: 新增PUT /admin/cloud-configs/:id/primary路由
- database.ts: is_primary列迁移
- UserDashboard.vue: 保存时传递storage_used/storage_total
- SystemConfig.vue: promoForm const重赋值bug
- config/index.ts: 移除泄露的默认密钥token
This commit is contained in:
@@ -249,6 +249,28 @@ router.post('/admin/cloud-configs/:type/test', async (req: Request, res: Respons
|
||||
// Daily Check-in
|
||||
// ═══════════════════════════════════════
|
||||
|
||||
/** PUT /api/admin/cloud-configs/:id/primary — set this config as the primary/default account for its cloud type */
|
||||
router.put('/admin/cloud-configs/:id/primary', (req: Request, res: Response) => {
|
||||
const id = Number(req.params.id);
|
||||
const { primary } = req.body;
|
||||
try {
|
||||
const db = getDb();
|
||||
const config = db.prepare('SELECT id, cloud_type FROM cloud_configs WHERE id = ?').get(id) as any;
|
||||
if (!config) { res.status(404).json({ error: '网盘配置不存在' }); return; }
|
||||
if (primary) {
|
||||
// Unset primary for all other configs of the same cloud type
|
||||
db.prepare('UPDATE cloud_configs SET is_primary = 0 WHERE cloud_type = ?').run(config.cloud_type);
|
||||
// Set this one as primary
|
||||
db.prepare('UPDATE cloud_configs SET is_primary = 1 WHERE id = ?').run(id);
|
||||
} else {
|
||||
db.prepare('UPDATE cloud_configs SET is_primary = 0 WHERE id = ?').run(id);
|
||||
}
|
||||
res.json({ success: true, is_primary: primary ? 1 : 0 });
|
||||
} catch (err: any) {
|
||||
res.status(500).json({ error: err.message || '操作失败' });
|
||||
}
|
||||
});
|
||||
|
||||
/** POST /api/admin/cloud-configs/:id/checkin */
|
||||
router.post('/admin/cloud-configs/:id/checkin', async (req: Request, res: Response) => {
|
||||
try {
|
||||
@@ -882,5 +904,70 @@ router.get('/admin/daily-report/last-run', (_req, res) => {
|
||||
}
|
||||
});
|
||||
|
||||
// ── 推广平台管理 (Promotion Platforms for Registration) ──
|
||||
|
||||
/** GET /api/promotion-platforms — public, list all platforms for registration page */
|
||||
router.get('/promotion-platforms', (_req: Request, res: Response) => {
|
||||
try {
|
||||
const db = getDb();
|
||||
const platforms = db.prepare('SELECT id, name, join_url, sort_order FROM promotion_platforms ORDER BY sort_order, id').all();
|
||||
const { getSystemConfig } = require('../admin/system-config.service');
|
||||
const qrTitle = getSystemConfig('promotion_qr_title') || '扫码加入推广团队';
|
||||
res.json({ title: qrTitle, platforms });
|
||||
} catch (e: any) { res.status(500).json({ error: e.message }); }
|
||||
});
|
||||
|
||||
/** GET /api/admin/promotion-platforms — admin list */
|
||||
router.get('/admin/promotion-platforms', (_req: Request, res: Response) => {
|
||||
try {
|
||||
const db = getDb();
|
||||
const platforms = db.prepare('SELECT id, name, join_url, sort_order, created_at FROM promotion_platforms ORDER BY sort_order, id').all();
|
||||
res.json(platforms);
|
||||
} catch (e: any) { res.status(500).json({ error: e.message }); }
|
||||
});
|
||||
|
||||
/** POST /api/admin/promotion-platforms — admin create */
|
||||
router.post('/admin/promotion-platforms', (req: Request, res: Response) => {
|
||||
try {
|
||||
const db = getDb();
|
||||
const { name, join_url, sort_order } = req.body;
|
||||
if (!name || !join_url) { res.status(400).json({ error: '平台名称和邀请链接不能为空' }); return; }
|
||||
const result = db.prepare(
|
||||
'INSERT INTO promotion_platforms (name, join_url, sort_order) VALUES (?, ?, ?)'
|
||||
).run(name, join_url, sort_order || 0);
|
||||
res.json({ id: result.lastInsertRowid, name, join_url, sort_order });
|
||||
} catch (e: any) {
|
||||
if (e.message && e.message.includes('UNIQUE')) {
|
||||
res.status(409).json({ error: '该平台名称已存在' });
|
||||
} else {
|
||||
res.status(500).json({ error: e.message || '创建失败' });
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
/** PUT /api/admin/promotion-platforms/:id — admin update */
|
||||
router.put('/admin/promotion-platforms/:id', (req: Request, res: Response) => {
|
||||
try {
|
||||
const db = getDb();
|
||||
const id = Number(req.params.id);
|
||||
const { name, join_url, sort_order } = req.body;
|
||||
const existing = db.prepare('SELECT id FROM promotion_platforms WHERE id = ?').get(id);
|
||||
if (!existing) { res.status(404).json({ error: '平台不存在' }); return; }
|
||||
db.prepare('UPDATE promotion_platforms SET name = ?, join_url = ?, sort_order = ? WHERE id = ?')
|
||||
.run(name, join_url, sort_order || 0, id);
|
||||
res.json({ success: true });
|
||||
} catch (e: any) { res.status(500).json({ error: e.message }); }
|
||||
});
|
||||
|
||||
/** DELETE /api/admin/promotion-platforms/:id — admin delete */
|
||||
router.delete('/admin/promotion-platforms/:id', (req: Request, res: Response) => {
|
||||
try {
|
||||
const db = getDb();
|
||||
const id = Number(req.params.id);
|
||||
db.prepare('DELETE FROM promotion_platforms WHERE id = ?').run(id);
|
||||
res.json({ success: true });
|
||||
} catch (e: any) { res.status(500).json({ error: e.message }); }
|
||||
});
|
||||
|
||||
export default router;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user