app.ts 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  1. import Koa from 'koa';
  2. import cors from '@koa/cors';
  3. import Router from '@koa/router';
  4. import bodyParser from '@koa/bodyparser';
  5. import koaBody from 'koa-body';
  6. import serve from 'koa-static';
  7. import mount from 'koa-mount';
  8. import path from 'path';
  9. import { config } from './config';
  10. import { connectDatabase } from './models';
  11. import { errorHandler } from './middleware/errorHandler';
  12. import authRoutes from './modules/auth/auth.controller';
  13. import ttsRoutes from './modules/tts/tts.controller';
  14. import memberRoutes from './modules/member/member.controller';
  15. import shareRoutes from './modules/share/share.controller';
  16. import playerRoutes from './modules/player/player.controller';
  17. import favoritesRoutes from './modules/favorites/favorites.controller';
  18. import preferencesRoutes from './modules/preferences/preferences.controller';
  19. import searchRoutes from './modules/search/search.controller';
  20. import categoriesRoutes from './modules/categories/categories.controller';
  21. import commentsRoutes from './modules/comments/comments.controller';
  22. import notificationsRoutes from './modules/notifications/notifications.controller';
  23. import bgmRoutes from './modules/bgm/bgm.controller';
  24. import audioEditRoutes from './modules/audioedit/audioedit.controller';
  25. import langGraphRoutes from './modules/book-generator/langgraph-controller';
  26. import aiGenerateRoutes from './modules/book-generator/ai-generate-controller';
  27. import albumRoutes from './modules/book-generator/album-controller';
  28. import albumManagementRoutes from './modules/book-generator/album-management.controller';
  29. import playlistRoutes from './modules/player/playlist.controller';
  30. import draftsRoutes from './modules/drafts/drafts.controller';
  31. import videoGeneratorRoutes from './modules/video-generator/video-generator.controller';
  32. import publishRoutes from './modules/publish/publish.controller';
  33. import signRoutes from './modules/sign/sign.controller';
  34. import subscriptionRoutes from './modules/subscription/subscription.controller';
  35. import paymentRoutes from './modules/payment/payment.controller';
  36. import historyRoutes from './modules/history/history.controller';
  37. import historyBatchRoutes from './modules/history/history-batch.controller';
  38. import { initializePlans } from './modules/subscription/subscription.service';
  39. const app = new Koa();
  40. const router = new Router();
  41. // 中间件
  42. app.use(errorHandler);
  43. app.use(cors({
  44. origin: '*',
  45. allowMethods: ['GET', 'POST', 'PUT', 'DELETE', 'OPTIONS'],
  46. allowHeaders: ['Content-Type', 'Authorization'],
  47. }));
  48. app.use(koaBody({
  49. multipart: true,
  50. formidable: {
  51. uploadDir: path.join(process.cwd(), 'uploads', 'materials'),
  52. keepExtensions: true,
  53. maxFileSize: 100 * 1024 * 1024, // 100MB
  54. },
  55. }));
  56. // 静态文件服务 - 音频文件
  57. app.use(mount('/uploads', serve(config.upload.dir)));
  58. // 静态文件服务 - 视频文件
  59. app.use(mount('/videos', serve(path.join(process.cwd(), 'public', 'videos'))));
  60. // 健康检查
  61. router.get('/health', (ctx) => {
  62. ctx.body = { code: 0, message: 'ok', data: { status: 'healthy' } };
  63. });
  64. // 注册路由
  65. router.use('/api/auth', authRoutes.routes());
  66. router.use('/api/tts', ttsRoutes.routes());
  67. router.use('/api/member', memberRoutes.routes());
  68. router.use('/api/share', shareRoutes.routes());
  69. router.use('/api/player', playerRoutes.routes());
  70. router.use('/api/favorites', favoritesRoutes.routes());
  71. router.use('/api/user/preferences', preferencesRoutes.routes());
  72. router.use('/api/search', searchRoutes.routes());
  73. router.use('/api/categories', categoriesRoutes.routes());
  74. router.use('/api/comments', commentsRoutes.routes());
  75. router.use('/api/notifications', notificationsRoutes.routes());
  76. router.use('/api/bgm', bgmRoutes.routes());
  77. router.use('/api/audio', audioEditRoutes.routes());
  78. router.use('/api/book-generator/langgraph', langGraphRoutes.routes());
  79. router.use('/api/book-generator', aiGenerateRoutes.routes());
  80. router.use('/api/book-generator', albumRoutes.routes());
  81. router.use('/api/book-generator/album', albumManagementRoutes.routes());
  82. router.use('/api/playlists', playlistRoutes.routes());
  83. router.use('/api/drafts', draftsRoutes.routes());
  84. router.use('/api/history', historyRoutes.routes());
  85. router.use('/api/history', historyBatchRoutes.routes());
  86. router.use('/api/video', videoGeneratorRoutes.routes());
  87. router.use('/api/sign', signRoutes.routes());
  88. router.use('/api/subscription', subscriptionRoutes.routes());
  89. router.use('/api/payment', paymentRoutes.routes());
  90. router.use('/api/publish', publishRoutes.routes());
  91. app.use(router.routes()).use(router.allowedMethods());
  92. // 启动服务
  93. async function start() {
  94. try {
  95. await connectDatabase();
  96. console.log('✅ MySQL 连接成功');
  97. // 初始化订阅套餐数据
  98. await initializePlans();
  99. app.listen(config.port, () => {
  100. console.log(`🚀 服务启动成功: http://localhost:${config.port}`);
  101. console.log(`📁 上传目录: ${config.upload.dir}`);
  102. });
  103. } catch (error) {
  104. console.error('❌ 服务启动失败:', error);
  105. process.exit(1);
  106. }
  107. }
  108. start();