yuanjiajun
commited on
Commit
·
ec10306
1
Parent(s):
d35af55
feat: 情感文章添加风格和结局设定
Browse files- src/const/article.ts +165 -2
- src/controllers/article-controller.ts +5 -7
- src/service/article-service.ts +13 -5
- src/utils/common.ts +9 -8
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,
|
| 6 |
|
| 7 |
const router = new Router({ prefix: '/api' });
|
| 8 |
|
| 9 |
-
//
|
| 10 |
-
router.get('/generate-article-
|
| 11 |
try {
|
| 12 |
-
const
|
| 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,
|
| 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
|
| 105 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 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
|
| 42 |
-
|
| 43 |
-
|
|
|
|
|
|
|
|
|
|
| 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 |
}
|