鸿蒙Electron藏头诗生成器技术实现深度测评
最近我独立用纯前端技术打造了一款AI藏头诗生成器,实际运行效果流畅,下面把整体设计思路和关键代码拆解出来分享。
功能演示
一、项目背景与设计理念
1.1 藏头诗的文化价值
藏头诗作为中国古典诗歌的特殊形式(亦称“藏头格”),核心在于将隐含语义藏于每句诗的首字。这种文体兼具文学趣味与情感表达,古人常借此传递隐秘祝福或寄托情思。
传统藏头诗的关键特征:
- 各句首字连读后构成完整词汇或短句
- 在确保藏头语义完整的同时,需维持诗歌的韵律与意境
- 多用于含蓄表达情感或赠言祝福
明代唐伯虎的《我画蓝江水悠悠》即为经典范例:
该诗每句首字串联成“我画蓝江”,构思精妙,画面感极强。
1.2 为什么需要AI藏头诗生成器
进入数字时代,借助技术手段降低藏头诗创作门槛成为可行方向:
- 降低创作门槛:传统创作要求深厚的文学素养且耗时较长
- 即时生成:用户仅需输入藏头字,AI可在数秒内输出合规诗歌
- 多样化选择:支持多种体裁与风格,适配节日贺卡、社交分享等不同场景
- 文化传承:用现代技术激活古典诗词,让传统文化融入日常生活
1.3 技术选型
我们最终选用纯前端方案,核心考量如下:
| 技术方案 | 优势 | 劣势 | 适用性 |
|---|---|---|---|
| 纯前端JavaScript | 无需后端、响应快、部署简单 | 生成能力受限于规则 | 适合规则驱动的生成场景 |
| 后端AI模型 | 生成质量高、内容灵活 | 需服务器、成本高 | 适合复杂生成任务 |
| 混合方案 | 兼顾质量与性能 | 架构复杂 | 大型应用 |
由于藏头诗具有明确的规则约束(藏头字固定、格律要求),纯前端方案完全胜任。我们通过精心设计的规则引擎与素材库,实现了高质量且稳定的诗歌生成。
二、系统架构设计
2.1 整体架构
系统采用经典的三层架构组织:
┌─────────────────────────────────────────────────────────────┐
│表现层 (UI Layer) │
│┌─────────────┐┌─────────────┐┌─────────────────────┐ │
││ 输入面板 ││ 展示面板 ││ 历史记录面板 │ │
│└─────────────┘└─────────────┘└─────────────────────┘ │
└─────────────────────────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────┐
│业务逻辑层 (Service Layer) │
│┌─────────────┐┌─────────────┐┌─────────────────────┐ │
││ 诗歌生成器 ││ 主题切换器 ││ 工具函数 │ │
│└─────────────┘└─────────────┘└─────────────────────┘ │
└─────────────────────────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────┐
│数据层 (Data Layer) │
│┌─────────────────────────┐┌────────────────────────────┐ │
││ 诗词素材数据库 ││ 本地存储 (LocalStorage) │ │
││ poemThemes / poemTypes ││ poemHistory / poemStats │ │
│└─────────────────────────┘└────────────────────────────┘ │
└─────────────────────────────────────────────────────────────┘
2.2 核心模块划分
2.2.1 配置模块 (config.js)
负责静态数据的存储与管理,核心包含:
- poemThemes:六大主题素材库,每个主题下收录关键字与诗句模板
- poemTypes:诗歌体裁配置,定义各体裁的句数和每句字数
- 韵脚分组:用于押韵判断的韵脚字典
- 工具函数:随机抽取、数组打乱等辅助方法
2.2.2 AI模块 (ai.js)
核心生成逻辑,包含下列函数:
- generateAcrostic():主生成函数,协调各子模块
- generateLine():单句诗生成
- buildLineFromTemplate():基于模板构建诗句
- fillTemplate():模板填充逻辑
- renderPoemDisplay():诗歌渲染函数
- 历史记录管理:增删改查功能
2.2.3 控制器 (battle.js)
用户交互与事件处理:
- initApp():应用初始化入口
- generatePoem():生成按钮点击事件
- copyPoem():复制功能
- readPoem():语音朗读功能
- 主题切换:主题切换系统
- 事件绑定:各类交互事件
2.3 数据流设计
用户输入藏头文字
│
▼
输入验证 (长度检查:2-10字)
│
▼
获取用户配置 (体裁、风格、押韵等)
│
▼
调用 generateAcrostic() 生成诗歌
│
├─→ 遍历每个藏头字
│ │
│ ▼
│ 生成对应诗句
│ │
│ ▼
│ 检查素材库是否有现成诗句
│ ├─→ 有 → 直接使用
│ └─→ 无 → 模板填充
│
▼
构建诗歌对象
│
▼
保存到历史记录 (LocalStorage)
│
▼
渲染展示 (高亮藏头字)
三、核心代码详解
3.1 诗歌生成核心逻辑
3.1.1 主生成函数
function generateAcrostic(hiddenWords, options = {}) {
const {
theme = 'romantic',
type = 'qijue',
useRhyme = true,
usePingze = false
} = options;
// 验证输入
if (!hiddenWords || hiddenWords.length < 2) {
throw new Error('请输入至少2个字的藏头文字');
}
if (hiddenWords.length > 10) {
throw new Error('藏头文字最多10个字');
}
// 获取主题素材
const themeData = poemThemes[theme] || poemThemes.romantic;
const config = poemTypes[type] || poemTypes.qijue;
// 生成诗句
const lines = [];
for (let i = 0; i < hiddenWords.length; i++) {
const hiddenWord = hiddenWords[i];
const line = generateLine(hiddenWord, themeData, config, i);
lines.push(line);
}
// 构建诗歌对象
const poem = {
id: Date.now(),
title: generateTitle(hiddenWords),
hiddenWords: hiddenWords,
lines: lines,
theme: theme,
type: type,
useRhyme: useRhyme,
usePingze: usePingze,
createdAt: new Date().toISOString()
};
return poem;
}
设计重点:
- 参数解构与默认值:利用ES6解构赋值预设合理参数,用户只需关注输入内容
- 输入验证:双重检查确保数据有效性
- 核心循环:逐字遍历藏头文字,依次生成对应诗句
- 对象封装:将结果封装为标准对象,方便后续处理与存储
3.1.2 单句生成函数
function generateLine(hiddenWord, themeData, config, index) {
const patterns = [
`${hiddenWord}XXXXXXX`, // 七言
`${hiddenWord}XXXXX`, // 五言
`${hiddenWord}XXXXXXX`, // 通用
`${hiddenWord}XXXXXX` // 词
];
// 选择合适的模板
let pattern;
if (config.syllables === 7) {
pattern = patterns[0];
} else if (config.syllables === 5) {
pattern = patterns[1];
} else if (config.type === 'ci') {
pattern = patterns[3];
} else {
pattern = patterns[2];
}
// 从主题库中选择或生成句子
const suitableLines = themeData.lines.filter(line => line.startsWith(hiddenWord));
if (suitableLines.length > 0) {
// 找到以藏头字开头的诗句
return randomChoice(suitableLines);
} else {
// 生成新句子
return buildLineFromTemplate(hiddenWord, themeData, config, index);
}
}
设计要点:
- 优先级策略:优先从素材库选取现成诗句,保证质量
- 模式匹配:根据体裁选择对应的字符长度模板
- 智能拼接:藏头字结合主题相关字词,确保意境连贯
- 降级方案:素材库无匹配时,调用模板填充生成
3.2 主题素材数据库
3.2.1 数据结构设计
const poemThemes = {
romantic: {
name: '浪漫抒情',
words: ['花', '月', '情', '思', '梦', '缘', '爱', '恋', ...],
lines: [
'花开四季香满庭',
'月照西楼影自怜',
'情意绵绵似水流',
'思念悠悠如云烟',
...
]
},
heroic: {
name: '豪迈壮阔',
words: ['天', '地', '山', '河', '剑', '酒', '风', '云', ...],
lines: [
'天高地阔任我行',
'地势坤厚载物情',
'山高路远志不移',
'河水滔滔向东流',
...
]
},
// ... 其他主题
};
数据结构字段说明:
| 字段 | 类型 | 说明 |
|---|---|---|
| name | string | 主题显示名称 |
| words | array | 主题相关关键字,用于动态填充 |
| lines | array | 预置诗句,每句以关键字开头 |
3.2.2 体裁配置
const poemTypes = {
qijue: { name: '七言绝句', lines: 4, syllables: 7 },
wujue: { name: '五言绝句', lines: 4, syllables: 5 },
qilv: { name: '七言律诗', lines: 8, syllables: 7 },
wulv: { name: '五言律诗', lines: 8, syllables: 5 },
ci: { name: '词·长短句', lines: 6, syllables: 7 },
free: { name: '自由体', lines: 0, syllables: 0 }
};
体裁参数详解:
| 体裁 | 句数 | 每句字数 | 特点 |
|---|---|---|---|
| 七言绝句 | 4 | 7 | 短小精悍,最常见格式 |
| 五言绝句 | 4 | 5 | 简洁含蓄,古风浓厚 |
| 七言律诗 | 8 | 7 | 气势恢宏,格律严格 |
| 五言律诗 | 8 | 5 | 工整对仗,意境深远 |
| 词 | 6 | 7 | 长短句结合,音乐性强 |
| 自由体 | 自定 | 自定 | 灵活自由,无严格限制 |
3.3 模板填充算法
function fillTemplate(template, hiddenWord, themeData) {
let result = hiddenWord;
let templateIndex = 1;
while (result.length < 7 && templateIndex < template.length) {
const char = template[templateIndex];
if (char === 'X') {
result += randomChoice(themeData.words);
} else if (char !== 'X') {
result += char;
}
templateIndex++;
}
// 补充到完整长度
while (result.length < 7) {
result += randomChoice(themeData.words);
}
return result;
}
算法流程:
开始
│
▼
result = 藏头字, templateIndex = 1
│
▼
┌─────────────────────────────┐
│result.length < 7 且 │◀────────┐
│templateIndex < 模板长度 │ │
└─────────────────────────────┘ │
│ │
├─ 是 ──→ 获取模板字符 │
│ │ │
│ ▼ │
│ ┌──────────────┐ │
│ │ 字符是 'X'? │ │
│ └──────────────┘ │
│ │ │ │
│ ├─ 是 ──→ 随机选择主题词填充│
│ │ │
│ └─ 否 ──→ 直接追加字符 │
│ │ │
│ ▼ │
│ templateIndex++ ───────────────┘
│
▼
┌──────────────────┐
│ result.length < 7 │◀────────┐
└──────────────────┘ │
│ │
└─ 是 ──→ 随机填充 ────┘
│
▼
返回结果
3.4 渲染与展示
输入藏头文字,点击生成按钮 AI将为您创作一首优美的藏头诗function renderPoemDisplay(poem) {
const display = document.getElementById('poemDisplay');
if (!poem) {
display.innerHTML = `${poem.title}
渲染策略:
- 空状态处理:未生成诗歌时展示引导界面
- 藏头字高亮:通过专用CSS样式突出显示藏头字
- 元信息展示:显示体裁、风格、押韵等标签
- 模板字符串:采用ES6模板字符串简化HTML构建
四、主题切换系统实现
4.1 CSS变量系统
我们使用CSS Custom Properties(CSS变量)实现主题切换:
/* 科技感主题(默认) */
[data-theme="tech"] {
--primary: #00d9ff;
--primary-light: #66e5ff;
--primary-dark: #00a8cc;
--accent: #7b2cbf;
--accent-light: #9f46d4;
--gold: #ffd700;
--gold-light: #ffe066;
--bg-paper: #0a0a0f;
--bg-panel: #121218;
--bg-card: #1e1e2a;
--border: #2a2a3a;
--border-dark: #3a3a4a;
--text-primary: #e0e0e0;
--text-secondary: #a0a0a0;
--text-muted: #707070;
--shadow: 0 0 20px rgba(0, 217, 255, 0.15);
--shadow-hover: 0 0 40px rgba(0, 217, 255, 0.25);
}
/* 古典雅致主题 */
[data-theme="classical"] {
--primary: #2c3e50;
--primary-light: #34495e;
--primary-dark: #1a252f;
--accent: #c0392b;
--accent-light: #d64541;
--gold: #c9a227;
--gold-light: #e6c84a;
--bg-paper: #f5f0e6;
--bg-panel: #fffef5;
--bg-card: #ffffff;
--border: #d4c4a8;
--border-dark: #b8a88a;
--text-primary: #2c3e50;
--text-secondary: #5d6d7e;
--text-muted: #95a5a6;
--shadow: 0 4px 12px rgba(44, 62, 80, 0.1);
--shadow-hover: 0 8px 24px rgba(44, 62, 80, 0.15);
}
变量分组说明:
| 变量组 | 变量示例 | 用途 |
|---|---|---|
| 主色调 | –primary, --primary-light, --primary-dark | 标题、重要元素 |
| 强调色 | –accent, --accent-light | 按钮、链接、高亮 |
| 点缀色 | –gold, --gold-light | 装饰、金色元素 |
| 背景色 | –bg-paper, --bg-panel, --bg-card | 各层级背景 |
| 边框色 | –border, --border-dark | 分隔线、边框 |
| 文字色 | –text-primary, --text-secondary, --text-muted | 不同层级文字 |
| 阴影 | –shadow, --shadow-hover | 卡片阴影效果 |
4.2 主题切换逻辑
function changeTheme(themeName) {
// 设置主题属性
document.body.setAttribute('data-theme', themeName);
// 保存到本地存储
localStorage.setItem('poemAppTheme', themeName);
// 根据主题调整水墨背景
adjustBackgroundForTheme(themeName);
}
function loadTheme() {
// 从本地存储读取主题
const savedTheme = localStorage.getItem('poemAppTheme');
if (savedTheme) {
// 应用保存的主题
document.body.setAttribute('data-theme', savedTheme);
// 同步下拉选择框
const themeSelect = document.getElementById('themeSelect');
if (themeSelect) {
themeSelect.value = savedTheme;
}
// 调整背景
adjustBackgroundForTheme(savedTheme);
}
}
持久化策略:
- LocalStorage存储:用户选择的主题存入浏览器本地
- 页面加载恢复:应用启动时自动还原上次主题
- 选择框同步:下拉菜单反映当前激活的主题
4.3 六大主题特色
4.3.1 科技感主题
[data-theme="tech"] {
--primary: #00d9ff; /* 青色 */
--accent: #7b2cbf; /* 紫色 */
--bg-paper: #0a0a0f; /* 深黑背景 */
--text-primary: #e0e0e0; /* 亮白文字 */
--shadow: 0 0 20px rgba(0, 217, 255, 0.15); /* 发光效果 */
}
特点:
- 深色背景搭配青色与紫色辉光
- 赛博朋克风格,适合夜间使用
- 粒子动画强化科技氛围
4.3.2 古典雅致主题
[data-theme="classical"] {
--primary: #2c3e50; /* 墨色 */
--accent: #c0392b; /* 朱砂红 */
--gold: #c9a227; /* 金色 */
--bg-paper: #f5f0e6; /* 宣纸色 */
--text-primary: #2c3e50;
}
特点:
- 暖色宣纸背景
- 传统朱砂红点缀
- 水墨纹理效果
- 古典书香氛围
五、高级功能实现
5.1 历史记录管理
// 历史记录存储
function saveHistory() {
localStorage.setItem('poemHistory', JSON.stringify(poemHistory));
localStorage.setItem('poemStats', JSON.stringify(stats));
}
// 更新历史列表
function updateHistory() {
const historyList = document.getElementById('historyList');
historyList.innerHTML = poemHistory.map(poem => {
const date = new Date(poem.createdAt).toLocaleString('zh-CN');
const preview = poem.lines.slice(0, 2).join(',');
return `
功能特性:
| 功能 | 说明 |
|---|---|
| 本地持久化 | LocalStorage存储,刷新不丢失 |
| 容量限制 | 最多保存50条历史记录 |
| 快速加载 | 点击历史项即可查看详情 |
| 预览展示 | 显示藏头字与时间戳 |
5.2 语音朗读功能
function readPoem() {
if (!currentPoem) {
alert('请先生成一首诗歌!');
return;
}
if (!window.speechSynthesis) {
alert('您的浏览器不支持语音朗读功能!');
return;
}
// 停止之前的朗读
window.speechSynthesis.cancel();
// 构建朗读文本
const text = `${currentPoem.title}。${currentPoem.lines.join(',')}。`;
const utterance = new SpeechSynthesisUtterance(text);
utterance.lang = 'zh-CN';
utterance.rate = 0.8; // 稍慢的语速
utterance.pitch = 1;
window.speechSynthesis.speak(utterance);
}
朗读优化:
- 语速调节:设为0.8,适合诗词朗读节奏
- 中文支持:明确指定zh-CN语言
- 防重播:朗读前自动停止之前的会话
- 浏览器兼容:检测API可用性,提供友好提示
5.3 复制与分享
function copyPoem() {
if (!currentPoem) {
alert('请先生成一首诗歌!');
return;
}
const text = currentPoem.title + '\\n' + currentPoem.lines.join('\\n');
if (navigator.clipboard && navigator.clipboard.writeText) {
navigator.clipboard.writeText(text).then(() => {
alert('已复制到剪贴板!');
}).catch(() => {
fallbackCopy(text);
});
} else {
fallbackCopy(text);
}
}
// 降级方案
function fallbackCopy(text) {
const textarea = document.createElement('textarea');
textarea.value = text;
textarea.style.position = 'fixed';
document.body.appendChild(textarea);
textarea.select();
try {
document.execCommand('copy');
alert('已复制到剪贴板!');
} catch (e) {
alert('复制失败,请手动复制');
}
document.body.removeChild(textarea);
}
兼容性处理:
| 方案 | 适用场景 | API |
|---|---|---|
| 现代API | 支持Clipboard API的现代浏览器 | navigator.clipboard.writeText() |
| 降级方案 | 老旧浏览器 | document.execCommand('copy') |
六、性能优化策略
6.1 事件处理优化
// 使用事件委托,减少事件监听器数量
document.addEventListener('click', function(event) {
// 根据点击目标判断执行的操作
if (event.target.matches('.style-btn')) {
// 处理风格按钮点击
} else if (event.target.matches('.history-item')) {
// 处理历史记录点击
}
});
// 避免重复绑定
function bindEvents() {
// 使用标志位防止重复绑定
if (window.eventsBound) return;
window.eventsBound = true;
// 绑定事件...
}
6.2 渲染优化
// 使用DocumentFragment减少重排重绘
const fragment = document.createDocumentFragment();
poemHistory.forEach(poem => {
const div = createHistoryItem(poem);
fragment.appendChild(div);
});
historyList.appendChild(fragment);
// 懒加载历史记录
function updateHistory() {
// 只渲染可见区域的内容
const visibleItems = poemHistory.slice(0, 10);
// ...
}
6.3 存储优化
// 分页存储,避免单次数据过大
function saveHistory() {
// 分批保存,每批10条
for (let i = 0; i < poemHistory.length; i += 10) {
const batch = poemHistory.slice(i, i + 10);
localStorage.setItem(`poemHistory_${i / 10}`, JSON.stringify(batch));
}
}
七、用户交互设计
7.1 输入验证流程
用户输入藏头文字
│
▼
┌─────────────────────────┐
│ 检查是否为空 │──否──→ 提示"请输入藏头文字"
└─────────────────────────┘
│是
▼
┌─────────────────────────┐
│ 检查长度是否≥2 │──否──→ 提示"至少输入2个字"
└─────────────────────────┘
│是
▼
┌─────────────────────────┐
│ 检查长度是否≤10 │──否──→ 提示"最多10个字"
└─────────────────────────┘
│是
▼
通过验证
7.2 生成状态反馈
function generatePoem() {
const statusDiv = document.getElementById('generatorStatus');
// 显示加载状态
statusDiv.classList.add('generating');
statusDiv.textContent = 'AI正在构思中...';
// 模拟处理延迟
setTimeout(() => {
try {
// 生成诗歌
const poem = generateAcrostic(hiddenWords, options);
// 显示结果
renderPoemDisplay(poem);
// 显示成功提示
statusDiv.classList.remove('generating');
statusDiv.textContent = '生成成功!';
// 3秒后清除提示
setTimeout(() => {
statusDiv.textContent = '';
}, 3000);
} catch (error) {
// 错误处理
statusDiv.classList.remove('generating');
statusDiv.textContent = error.message;
}
}, 600);
}
7.3 响应式布局
/* 桌面端 - 三栏布局 */
@media (min-width: 1200px) {
.main-container {
grid-template-columns: 380px 1fr 320px;
}
}
/* 平板端 - 两栏布局 */
@media (min-width: 768px) and (max-width: 1199px) {
.main-container {
grid-template-columns: 1fr 1fr;
}
.right-panel {
grid-column: span 2;
}
}
/* 移动端 - 单栏布局 */
@media (max-width: 767px) {
.main-container {
grid-template-columns: 1fr;
}
.left-panel,
.center-panel,
.right-panel {
min-height: 300px;
}
}
八、代码质量保证
8.1 错误处理机制
function generateAcrostic(hiddenWords, options) {
try {
// 输入验证
if (!hiddenWords) {
throw new Error('藏头文字不能为空');
}
if (hiddenWords.length < 2) {
throw new Error('藏头文字至少需要2个字');
}
if (hiddenWords.length > 10) {
throw new Error('藏头文字最多10个字');
}
// 生成逻辑...
} catch (error) {
console.error('生成诗歌时出错:', error);
throw error; // 重新抛出,让调用者处理
}
}
8.2 代码规范
// 命名规范
const poemThemes = {}; // 常量:名词复数形式
let currentPoem = null; // 变量:驼峰命名
function generatePoem() {} // 函数:动词+名词
// 注释规范
/**
* 生成藏头诗
* @param {string} hiddenWords - 藏头文字
* @param {Object} options - 生成选项
* @returns {Object} 生成的诗歌对象
*/
function generateAcrostic(hiddenWords, options) {
// 函数实现...
}
8.3 浏览器兼容性
| 功能 | Chrome | Firefox | Safari | Edge |
|---|---|---|---|---|
| CSS变量 | 49+ | 31+ | 9.1+ | 15+ |
| ES6解构 | 49+ | 44+ | 10+ | 14+ |
| 模板字符串 | 41+ | 45+ | 9+ | 13+ |
| LocalStorage | 4+ | 3.5+ | 4+ | 12+ |
| Clipboard API | 66+ | 63+ | 13.1+ | 79+ |
九、总结与展望
9.1 技术成就
通过本项目,我们实现了一个功能完善的AI藏头诗生成器:
| 模块 | 技术亮点 |
|---|---|
| 诗歌生成 | 规则引擎 + 素材库 + 模板填充 |
| 主题系统 | CSS变量 + data属性 + LocalStorage |
| 用户体验 | 实时反馈 + 加载状态 + 错误处理 |
| 性能优化 | 事件委托 + DocumentFragment |
| 响应式设计 | 媒体查询 + 弹性布局 |
9.2 功能扩展方向
- 更多体裁支持:加入楚辞、赋等古典文体
- 押韵检测:实现智能押韵判断与自动调整
- 平仄协调:加入平仄规则校验
- 机器学习:引入神经网络模型提升生成质量
- 多语言支持:支持英文藏头诗等
- 社交分享:一键分享到主流社交平台
9.3 优化方向
- 生成质量:扩充素材库,收录更多经典诗句
- 性能提升:使用Web Worker处理生成逻辑
- 可访问性:完善ARIA标签,支持键盘导航
- 离线支持:利用Service Worker实现PWA



