| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142 |
- import { Router } from 'express';
- import { body } from 'express-validator';
- import { SystemService } from '../services/SystemService.js';
- import { authenticate, authorize } from '../middleware/auth.js';
- import { asyncHandler } from '../middleware/error.js';
- import { validateRequest } from '../middleware/validate.js';
- import type { Request, Response, NextFunction } from 'express';
- const router = Router();
- const systemService = new SystemService();
- function isLoopbackRequest(req: Request): boolean {
- const ip = req.ip || '';
- return ip === '127.0.0.1'
- || ip === '::1'
- || ip.startsWith('::ffff:127.');
- }
- // 本地回环请求放行,否则需任一已登录用户(不要求管理员)
- function requireAuthOrLoopback(req: Request, res: Response, next: NextFunction): void {
- if (isLoopbackRequest(req)) {
- next();
- return;
- }
- authenticate(req, res, next);
- }
- // 获取系统配置(公开)
- router.get(
- '/config',
- asyncHandler(async (_req, res) => {
- const config = await systemService.getPublicConfig();
- res.json({ success: true, data: config });
- })
- );
- // 更新系统配置(需要管理员权限)
- router.put(
- '/config',
- authenticate,
- authorize('admin'),
- [
- body('allowRegistration').optional().isBoolean(),
- body('defaultUserRole').optional().isIn(['admin', 'editor', 'operator']),
- validateRequest,
- ],
- asyncHandler(async (req, res) => {
- await systemService.updateConfig(req.body);
- res.json({ success: true, message: '配置已更新' });
- })
- );
- router.get(
- '/publish-proxy',
- authenticate,
- authorize('admin'),
- asyncHandler(async (_req, res) => {
- const config = await systemService.getPublishProxyAdminConfig();
- res.json({ success: true, data: config });
- })
- );
- router.get(
- '/publish-proxy/cities',
- authenticate,
- asyncHandler(async (_req, res) => {
- const cities = await systemService.getPublishProxyCitiesFromApi();
- res.json({ success: true, data: { cities } });
- })
- );
- router.get(
- '/publish-proxy/regions',
- authenticate,
- asyncHandler(async (_req, res) => {
- const regions = await systemService.getPublishProxyRegionsFromCsv();
- res.json({ success: true, data: { regions } });
- })
- );
- router.put(
- '/publish-proxy',
- authenticate,
- authorize('admin'),
- [
- body('productKey').optional().isString(),
- body('signature').optional().isString(),
- validateRequest,
- ],
- asyncHandler(async (req, res) => {
- await systemService.updatePublishProxyAdminConfig(req.body);
- res.json({ success: true, message: '发布代理配置已更新' });
- })
- );
- router.get(
- '/python-service',
- requireAuthOrLoopback,
- asyncHandler(async (_req, res) => {
- const config = await systemService.getPythonServiceAdminConfig();
- res.json({ success: true, data: config });
- })
- );
- router.put(
- '/python-service',
- requireAuthOrLoopback,
- [
- body('url').optional().isString(),
- validateRequest,
- ],
- asyncHandler(async (req, res) => {
- await systemService.updatePythonServiceAdminConfig(req.body);
- res.json({ success: true, message: 'Python 服务配置已更新' });
- })
- );
- router.post(
- '/python-service/check',
- requireAuthOrLoopback,
- [
- body('url').optional().isString(),
- validateRequest,
- ],
- asyncHandler(async (req, res) => {
- const result = await systemService.checkPythonService(req.body.url);
- res.json({ success: true, data: result });
- })
- );
- // 获取系统状态(需要管理员权限)
- router.get(
- '/status',
- authenticate,
- authorize('admin'),
- asyncHandler(async (_req, res) => {
- const status = await systemService.getSystemStatus();
- res.json({ success: true, data: status });
- })
- );
- export default router;
|