Просмотр исходного кода

fix: 全局统一默认bookScale为1000而非130000(8处修正)

MyFramework User 3 месяцев назад
Родитель
Сommit
9a5c3a3bf0

+ 5 - 0
server/src/app.ts

@@ -54,6 +54,7 @@ import paymentRoutes from './modules/payment/payment.controller';
 import historyRoutes from './modules/history/history.controller';
 import historyRoutes from './modules/history/history.controller';
 import historyBatchRoutes from './modules/history/history-batch.controller';
 import historyBatchRoutes from './modules/history/history-batch.controller';
 import feedbackRoutes from './modules/feedback/feedback.controller';
 import feedbackRoutes from './modules/feedback/feedback.controller';
+import queueRoutes from './modules/queue/queue.controller';
 import { initializePlans } from './modules/subscription/subscription.service';
 import { initializePlans } from './modules/subscription/subscription.service';
 import { initWebSocket } from './services/websocket.service.js';
 import { initWebSocket } from './services/websocket.service.js';
 
 
@@ -94,6 +95,9 @@ app.use(mount('/videos', serve(path.join(process.cwd(), 'public', 'videos'))));
 // 静态文件服务 - 音色试听样本
 // 静态文件服务 - 音色试听样本
 app.use(mount('/tts/voices', serve(path.join(process.cwd(), '..', 'voices'))));
 app.use(mount('/tts/voices', serve(path.join(process.cwd(), '..', 'voices'))));
 
 
+// 静态文件服务 - 管理后台页面
+app.use(mount('/admin', serve(path.join(process.cwd(), 'public', 'admin'))));
+
 // 健康检查
 // 健康检查
 router.get('/health', (ctx) => {
 router.get('/health', (ctx) => {
   ctx.body = { code: 0, message: 'ok', data: { status: 'healthy' } };
   ctx.body = { code: 0, message: 'ok', data: { status: 'healthy' } };
@@ -131,6 +135,7 @@ router.use('/api/subscription', subscriptionRoutes.routes());
 router.use('/api/payment', paymentRoutes.routes());
 router.use('/api/payment', paymentRoutes.routes());
 router.use('/api/publish', publishRoutes.routes());
 router.use('/api/publish', publishRoutes.routes());
 router.use('/api/feedback', feedbackRoutes.routes());
 router.use('/api/feedback', feedbackRoutes.routes());
+router.use('/api/queue', queueRoutes.routes());
 router.use('/api', logRoutes.routes());
 router.use('/api', logRoutes.routes());
 
 
 app.use(router.routes()).use(router.allowedMethods());
 app.use(router.routes()).use(router.allowedMethods());

+ 1 - 1
server/src/modules/book-generator/book-generator.service.ts

@@ -165,7 +165,7 @@ export class BatchGenerationOrchestrator {
     const { langGraphGenerator, resolveGenLevel } = await import('./index.js');
     const { langGraphGenerator, resolveGenLevel } = await import('./index.js');
 
 
     // 异步执行生成,不阻塞
     // 异步执行生成,不阻塞
-    langGraphGenerator.generate(this.bookId, book.description, book.bookScale || '130000', resolveGenLevel(book.bookScale || '130000'))
+    langGraphGenerator.generate(this.bookId, book.description, book.bookScale || '1000', resolveGenLevel(book.bookScale || '1000'))
       .then(() => {
       .then(() => {
         console.log(`[BatchGen][${this.taskId}] 内容生成完成`);
         console.log(`[BatchGen][${this.taskId}] 内容生成完成`);
       })
       })

+ 1 - 1
server/src/modules/book-generator/book-generator.store.ts

@@ -402,7 +402,7 @@ export class BookStore {
         description: data.description,
         description: data.description,
         targetAudience: data.targetAudience || '通用',
         targetAudience: data.targetAudience || '通用',
         style: data.style || '专业严谨',
         style: data.style || '专业严谨',
-        bookScale: data.bookScale || '130000',
+        bookScale: data.bookScale || '1000',
         totalChapters: data.totalChapters ?? 10,
         totalChapters: data.totalChapters ?? 10,
         estimatedWords: data.estimatedWords ?? 0,
         estimatedWords: data.estimatedWords ?? 0,
         genStage: 'draft',
         genStage: 'draft',

+ 1 - 1
server/src/modules/book-generator/book-queue.processor.ts

@@ -64,7 +64,7 @@ export async function resumeInterruptedTasks() {
       langGraphGenerator.generate(
       langGraphGenerator.generate(
         book.id.toString(),
         book.id.toString(),
         book.description || book.title,
         book.description || book.title,
-        book.bookScale || '130000'
+        book.bookScale || '1000'
       ).then(() => {
       ).then(() => {
         console.log(`[DBQueue] 恢复完成: bookId=${book.id}`);
         console.log(`[DBQueue] 恢复完成: bookId=${book.id}`);
       }).catch(err => {
       }).catch(err => {

+ 1 - 1
server/src/modules/book-generator/fault-tolerance.ts

@@ -304,7 +304,7 @@ export async function attemptAutoRecovery(bookId: string) {
     langGraphGenerator.generate(
     langGraphGenerator.generate(
       bookId,
       bookId,
       book.description || book.title,
       book.description || book.title,
-      book.bookScale || '130000'
+      book.bookScale || '1000'
     ).then(() => {
     ).then(() => {
       console.log(`[容错] ✅ 自动恢复成功: bookId=${bookId}`);
       console.log(`[容错] ✅ 自动恢复成功: bookId=${bookId}`);
     }).catch(err => {
     }).catch(err => {

+ 1 - 1
server/src/modules/book-generator/graph.ts

@@ -35,7 +35,7 @@ export const GraphState = Annotation.Root({
   }),
   }),
   bookScale: Annotation<string>({
   bookScale: Annotation<string>({
     reducer: (_prev, update) => update ?? _prev,
     reducer: (_prev, update) => update ?? _prev,
-    default: () => '130000' as string,
+    default: () => '1000' as string,
   }),
   }),
   /**
   /**
    * 大纲层级:1=仅章,2=章→节,3=章→节→小节。
    * 大纲层级:1=仅章,2=章→节,3=章→节→小节。

+ 2 - 2
server/src/modules/book-generator/index.ts

@@ -75,7 +75,7 @@ export class LangGraphBookGenerator {
   async generate(
   async generate(
     bookId: string,
     bookId: string,
     topic: string,
     topic: string,
-    bookScale: string = '130000',
+    bookScale: string = '1000',
     genLevel?: number
     genLevel?: number
   ): Promise<void> {
   ): Promise<void> {
     const userSpecified = genLevel !== undefined; // true=用户选了层级, false=自动
     const userSpecified = genLevel !== undefined; // true=用户选了层级, false=自动
@@ -104,7 +104,7 @@ import { parseOutline } from './parsers/outline.parser';
  * 独立的大纲生成函数(供 API 预览调用,不依赖策略系统)
  * 独立的大纲生成函数(供 API 预览调用,不依赖策略系统)
  * 用于让用户在正式开始生成前预览大纲结构
  * 用于让用户在正式开始生成前预览大纲结构
  */
  */
-export async function generateOutline(bookId: string, topic: string, bookScale: string = '130000'): Promise<any> {
+export async function generateOutline(bookId: string, topic: string, bookScale: string = '1000'): Promise<any> {
   console.log('[generateOutline] 预览大纲, bookId:', bookId, 'scale:', bookScale);
   console.log('[generateOutline] 预览大纲, bookId:', bookId, 'scale:', bookScale);
 
 
   const messages = buildOutlineMessages(topic, bookScale);
   const messages = buildOutlineMessages(topic, bookScale);

+ 2 - 2
server/src/modules/book-generator/langgraph-controller.ts

@@ -1377,11 +1377,11 @@ router.post('/books/:id/outline', async (ctx: Context) => {
     }
     }
 
 
     // 获取书籍类型配置
     // 获取书籍类型配置
-    const scaleConfig = getScaleConfig(book.bookScale || '130000');
+    const scaleConfig = getScaleConfig(book.bookScale || '1000');
 
 
     // 调用AI生成大纲
     // 调用AI生成大纲
     const { generateOutline } = await import('./index.js');
     const { generateOutline } = await import('./index.js');
-    const outline = await generateOutline(bookId, book.description, book.bookScale || '130000');
+    const outline = await generateOutline(bookId, book.description, book.bookScale || '1000');
 
 
     // 更新书籍的大纲
     // 更新书籍的大纲
     await bookStore.update(bookId, { outline });
     await bookStore.update(bookId, { outline });

+ 1 - 1
server/src/modules/book-generator/nodes/plan.node.ts

@@ -172,7 +172,7 @@ export async function planBookNode(state: typeof GraphState.State): Promise<Part
     const book = await bookStore.getById(state.bookId);
     const book = await bookStore.getById(state.bookId);
     const title = book?.title || state.topic;
     const title = book?.title || state.topic;
     const description = book?.description || '';
     const description = book?.description || '';
-    const bookScale = state.bookScale || '130000';
+    const bookScale = state.bookScale || '1000';
 
 
     const prompt = buildPlanPrompt(title, description, bookScale);
     const prompt = buildPlanPrompt(title, description, bookScale);