yuanjiajun commited on
Commit
ec10306
·
1 Parent(s): d35af55

feat: 情感文章添加风格和结局设定

Browse files
src/const/article.ts CHANGED
@@ -80,8 +80,6 @@ const familyTopic = [
80
  '家庭成员一起为家庭的墙壁绘制壁画',
81
  ];
82
 
83
-
84
-
85
  const householdTopic = [
86
  '家族内不同家庭间经济差距导致的心理落差',
87
  '家族内因某个成员发达后态度变化问题',
@@ -295,3 +293,168 @@ const socialTopic = [
295
  ];
296
 
297
  export const emotionalStoryTopic = [...familyTopic, ...householdTopic, ...socialTopic];
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
80
  '家庭成员一起为家庭的墙壁绘制壁画',
81
  ];
82
 
 
 
83
  const householdTopic = [
84
  '家族内不同家庭间经济差距导致的心理落差',
85
  '家族内因某个成员发达后态度变化问题',
 
293
  ];
294
 
295
  export const emotionalStoryTopic = [...familyTopic, ...householdTopic, ...socialTopic];
296
+
297
+ export const emotionalStoryStyle = [
298
+ '用日常用语表达',
299
+ '像聊天一样说话',
300
+ '使用俗语或口头禅',
301
+ '模仿朋友间对话的语气',
302
+ '加入语气助词(呢、嘛、啦等)',
303
+ '以讲故事的口吻叙述',
304
+ '描述具体的颜色、形状、声音',
305
+ '提及当时的天气状况',
306
+ '讲讲周围人的反应',
307
+ '回忆自己的内心想法',
308
+ '说出身体的具体感受(累、兴奋、紧张等)',
309
+ '分享一个小插曲或意外事件',
310
+ '提到具体的时间点和地点',
311
+ '描述物品的质感',
312
+ '谈谈闻到的气味',
313
+ '讲讲尝到的味道',
314
+ '把 [X] 比作熟悉的事物',
315
+ '让 [Y] 像人一样行动',
316
+ '用排比强调 [具体内容]',
317
+ '夸张地形容 [某特点]',
318
+ '用反问增强语气',
319
+ '以设问引出话题',
320
+ '不要用生僻词汇',
321
+ '去掉过于正式的表达',
322
+ '避免大段理论阐述',
323
+ '杜绝专业术语堆砌',
324
+ '不使用复杂的长句',
325
+ '减少抽象概念的出现',
326
+ '别用格式化的开头结尾',
327
+ '去除模板化的语句结构',
328
+ '对话口语化表达',
329
+ '对话聊天式语气',
330
+ '讲故事口吻',
331
+ '真实感受分享',
332
+ '小插曲和意外',
333
+ '周围人反应',
334
+ '别那么正式',
335
+ '轻松点表达',
336
+ '非正式一点',
337
+ '摆脱官方语气',
338
+ '别像写报告一样',
339
+ '来点随意的表达',
340
+ '别长篇大论讲道理',
341
+ '少点理论阐述',
342
+ '不搞学术范儿',
343
+ '远离理论说教',
344
+ '拒绝枯燥理论',
345
+ '别太理论化',
346
+ '别用专业词汇',
347
+ '远离行话',
348
+ '普通人能懂的话',
349
+ '非专业人士也能明白',
350
+ '不用术语装高深',
351
+ '避开专业说法',
352
+ '采用轻松的表述',
353
+ '以诙谐的方式表达',
354
+ '运用幽默的语言',
355
+ '像朋友聊天那样说话',
356
+ '使用亲切的语气',
357
+ '保持简洁的表达',
358
+ '让语言通俗易懂',
359
+ '来点俏皮的说法',
360
+ '用随性的语言风格',
361
+ '打造活泼的氛围',
362
+ '巧妙运用比喻修辞',
363
+ '适时使用拟人手法',
364
+ '恰当进行夸张表达',
365
+ '合理运用排比增强气势',
366
+ '以反问引发思考',
367
+ '用设问吸引读者',
368
+ '借助对偶增添文采',
369
+ '善用借代丰富表达',
370
+ '通过对比突出特点',
371
+ '避免过于严肃的表达',
372
+ '杜绝生硬的语言',
373
+ '不要千篇一律的表述',
374
+ '去除模板化的痕迹',
375
+ '摆脱平淡无奇的语言',
376
+ '防止空洞无物的内容',
377
+ '舍弃华而不实的词藻',
378
+ '远离晦涩难懂的语句',
379
+ '拒绝机械呆板的风格',
380
+ ];
381
+
382
+ export const emotionalStoryEnding = [
383
+ '结局要有意外的转折,让读者感到惊喜和意外。',
384
+ '结局要充满希望,给读者带来积极的感受。',
385
+ '结局可以是悲伤的,引发读者的深思。',
386
+ '结局要有温暖的情感,让人感到治愈。',
387
+ '结局可以带有一丝遗憾,增加故事的回味。',
388
+ '结局要充满悬念,让读者自行想象后续发展。',
389
+ '结局要有强烈的情感冲突,让读者的心被紧紧抓住。',
390
+ '结局可以是幽默的,给读者带来轻松的感觉。',
391
+ '结局要有一个意想不到的人物出现,改变故事的走向。',
392
+ '结局可以让主角做出一个与之前性格完全不同的决定。',
393
+ '结局可以引入一个新的事件,使故事更加复杂。',
394
+ '结局可以让之前的某个伏笔得到意想不到的揭示。',
395
+ '结局可以让主角面临一个全新的挑战。',
396
+ '结局可以有一个戏剧性的反转,颠覆读者的预期。',
397
+ '结局可以让主角在最后一刻发现自己的错误并改正。',
398
+ '结局可以让故事中的矛盾以一种独特的方式解决。',
399
+ '结局要深化故事的主题,让读者对主题有更深刻的理解。',
400
+ '结局可以通过主角的经历传达一个重要的人生道理。',
401
+ '结局要让读者对故事中的某个社会问题进行思考。',
402
+ '结局可以让主角在经历一系列事件后实现自我成长。',
403
+ '结局可以强调故事中的人性光辉或黑暗面。',
404
+ '结局要让读者对故事中的价值观进行反思。',
405
+ '结局可以以一种隐喻的方式表达故事的主题。',
406
+ '结局可以让主角的命运与故事的主题紧密相连。',
407
+ '结局可以受到外部环境的影响,如天气、自然灾害等。',
408
+ '结局可以让故事中的地点发生重大变化,影响主角的命运。',
409
+ '结局可以让主角适应或改变周围的环境。',
410
+ '结局可以让环境成为主角解决问题的关键因素。',
411
+ '结局可以让主角在特定的环境中找到新的机遇或挑战。',
412
+ '结局可以通过环境的描写营造出特定的氛围。',
413
+ '结局可以让环境与主角的内心世界相互呼应。',
414
+ '结局可以让环境的变化推动故事的发展。',
415
+ '结局充满喜悦,所有角色都实现了自己的梦想',
416
+ '结局带有淡淡的忧伤,主角不得不放弃一些重要的东西',
417
+ '结局是释然,主角放下了过去的执念',
418
+ '结局充满愤怒,主角被不公平的对待激发了反抗精神',
419
+ '结局有深深的愧疚,主角意识到自己的错误却无法弥补',
420
+ '结局是惊喜,主角获得了意想不到的财富或荣誉',
421
+ '结局是恐惧,新的威胁出现让主角陷入困境',
422
+ '结局是安心,危险过去,生活恢复了平静',
423
+ '结局是感动,一个温暖的举动让主角泪流满面',
424
+ '结局是孤独,主角独自面对未来',
425
+ '结局是兴奋,主角迎来了新的冒险',
426
+ '结局是绝望,所有的希望都破灭了',
427
+ '结局是满足,主角实现了一个小目标',
428
+ '结局是困惑,主角对未来感到迷茫',
429
+ '结局是骄傲,主角的成就得到了广泛认可',
430
+ '结局是焦虑,新的问题让主角坐立不安',
431
+ '结局是期待,未来充满了可能性',
432
+ '结局是沮丧,主角遭遇了重大挫折',
433
+ '结局是幸福,主角找到了真爱',
434
+ '结局是平静,主角内心达到了一种和谐状态',
435
+ '结局是主角发现了一个隐藏的秘密,改变了一切',
436
+ '结局有一个神秘人物出现,帮助主角解决了难题',
437
+ '结局主角发现自己一直被欺骗',
438
+ '结局主角必须在两个艰难的选择中做出决定',
439
+ '结局强调了友谊的力量,主角和朋友们一起克服了困难',
440
+ '结局探讨了人性的善恶,主角在困境中做出了艰难的选择',
441
+ '结局突出了家庭的重要性,主角回归家庭,找到了温暖',
442
+ '结局思考了人生的意义,主角开始重新审视自己的生活',
443
+ '结局揭示了社会的不公,主角决定为改变世界而努力',
444
+ '结局表达了对自然的敬畏,主角学会了与自然和谐相处',
445
+ '结局展现了科技的两面性,主角在科技的影响下做出了选择',
446
+ '结局传递了爱的力量,主角用爱化解了一切矛盾',
447
+ '结局反映了成长的痛苦,主角在经历挫折后变得更加坚强',
448
+ '结局探讨了梦想与现实的差距,主角在两者之间找到了平衡',
449
+ '结局强调了勇气的价值,主角勇敢地面对自己的恐惧',
450
+ '结局思考了时间的意义,主角学会了珍惜当下',
451
+ '结局揭示了命运的无常,主角在命运的捉弄下努力抗争',
452
+ '结局表达了对希望的坚持,主角在黑暗中找到了一丝光明',
453
+ '结局探讨了责任的重要性,主角承担起了自己的责任',
454
+ '结局展现了宽容的力量,主角学会了原谅他人',
455
+ '结局反映了文化的差异,主角在不同文化的碰撞中成长',
456
+ '结局思考了死亡的意义,主角在面对死亡时找到了生命的价值',
457
+ '结局强调了知识的力量,主角通过学习改变了自己的命运',
458
+ '结局探讨了自由的含义,主角为了追求自由付出了巨大的代价',
459
+ '结局是一个开放式的,让读者自己想象后续发展',
460
+ ];
src/controllers/article-controller.ts CHANGED
@@ -2,17 +2,15 @@ import { Context } from 'koa';
2
  import Router from 'koa-router';
3
 
4
  import { handleControllerError } from '@/middleware';
5
- import { processArticleServe, processArticleTopicServe } from '@/service';
6
 
7
  const router = new Router({ prefix: '/api' });
8
 
9
- // 获取文章主题
10
- router.get('/generate-article-topic', async (ctx: Context) => {
11
  try {
12
- const topic = await processArticleTopicServe();
13
- ctx.body = {
14
- topic,
15
- };
16
  } catch (error) {
17
  // 将捕获到的异常传递给统一的错误处理中间件
18
  await handleControllerError(ctx, error);
 
2
  import Router from 'koa-router';
3
 
4
  import { handleControllerError } from '@/middleware';
5
+ import { processArticleServe, processArticleElementServe } from '@/service';
6
 
7
  const router = new Router({ prefix: '/api' });
8
 
9
+ // 获取文章要素
10
+ router.get('/generate-article-element', async (ctx: Context) => {
11
  try {
12
+ const result = await processArticleElementServe();
13
+ ctx.body = result;
 
 
14
  } catch (error) {
15
  // 将捕获到的异常传递给统一的错误处理中间件
16
  await handleControllerError(ctx, error);
src/service/article-service.ts CHANGED
@@ -1,10 +1,9 @@
1
- import { bufferToBase64ImageSrc, delay, getFluxImageBuffer, getRandomValueFromArray, retryAsync } from '@/utils';
2
 
3
  import { requestQw, uploadFile } from '@/utils';
4
- import { emotionalStoryTopic } from '@/const';
5
  const htmlToDocx = require('html-to-docx');
6
 
7
-
8
  async function getImageBase64ByText(text: string, hfApiKey: string) {
9
  console.log(`------------ 开始获取图片,原文案:${text} ---------------`);
10
 
@@ -101,6 +100,15 @@ export const processArticleServe = async (data: { title: string; content: string
101
  };
102
  };
103
 
104
- export const processArticleTopicServe = async () => {
105
- return getRandomValueFromArray(emotionalStoryTopic);
 
 
 
 
 
 
 
 
 
106
  };
 
1
+ import { bufferToBase64ImageSrc, delay, getFluxImageBuffer, getRandomUniqueElements, retryAsync } from '@/utils';
2
 
3
  import { requestQw, uploadFile } from '@/utils';
4
+ import { emotionalStoryTopic, emotionalStoryStyle, emotionalStoryEnding } from '@/const';
5
  const htmlToDocx = require('html-to-docx');
6
 
 
7
  async function getImageBase64ByText(text: string, hfApiKey: string) {
8
  console.log(`------------ 开始获取图片,原文案:${text} ---------------`);
9
 
 
100
  };
101
  };
102
 
103
+ export const processArticleElementServe = async () => {
104
+ const topic = getRandomUniqueElements(emotionalStoryTopic, 1);
105
+ const styleList = getRandomUniqueElements(emotionalStoryStyle, 5);
106
+ const style = styleList.join(',');
107
+ const ending = getRandomUniqueElements(emotionalStoryEnding, 1);
108
+
109
+ return {
110
+ topic,
111
+ style,
112
+ ending,
113
+ };
114
  };
src/utils/common.ts CHANGED
@@ -31,18 +31,19 @@ export async function requestQw(data: any) {
31
  Authorization: `Bearer ${qwToken}`,
32
  },
33
  });
34
-
35
  return response.data.choices[0].message.content;
36
- } catch (error:any) {
37
  throw new Error(error.response.data);
38
  }
39
  }
40
 
41
- export function getRandomValueFromArray<T>(array: T[]): T {
42
- if (!Array.isArray(array) || array.length === 0) {
43
- throw new Error("输入应该是一个非空数组");
 
 
 
44
  }
45
-
46
- const randomIndex = Math.floor(Math.random() * array.length);
47
- return array[randomIndex];
48
  }
 
31
  Authorization: `Bearer ${qwToken}`,
32
  },
33
  });
34
+
35
  return response.data.choices[0].message.content;
36
+ } catch (error: any) {
37
  throw new Error(error.response.data);
38
  }
39
  }
40
 
41
+ export function getRandomUniqueElements(arr: any[], x: number): any[] {
42
+ const result: any[] = [];
43
+ const copyArr = arr.slice();
44
+ while (result.length < x && copyArr.length > 0) {
45
+ const randomIndex = Math.floor(Math.random() * copyArr.length);
46
+ result.push(copyArr.splice(randomIndex, 1)[0]);
47
  }
48
+ return result;
 
 
49
  }