kindergarten_java/docs/generate-docx.js
2026-02-28 16:41:39 +08:00

407 lines
21 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

const { Document, Packer, Paragraph, TextRun, ImageRun, Header, Footer, AlignmentType,
HeadingLevel, PageBreak, TableOfContents, PageNumber, Table, TableRow, TableCell,
BorderStyle, WidthType, ShadingType, VerticalAlign, LevelFormat } = require('docx');
const fs = require('fs');
const path = require('path');
// 读取截图
const screenshots = {
login: fs.readFileSync('/Users/retirado/ccProgram/docs/screenshots/01-login.png'),
adminDashboard: fs.readFileSync('/Users/retirado/ccProgram/docs/screenshots/02-admin-dashboard.png'),
adminCourses: fs.readFileSync('/Users/retirado/ccProgram/docs/screenshots/03-admin-courses.png'),
courseDetail: fs.readFileSync('/Users/retirado/ccProgram/docs/screenshots/04-course-detail.png'),
adminTenants: fs.readFileSync('/Users/retirado/ccProgram/docs/screenshots/05-admin-tenants.png'),
schoolDashboard: fs.readFileSync('/Users/retirado/ccProgram/docs/screenshots/06-school-dashboard.png'),
schoolTeachers: fs.readFileSync('/Users/retirado/ccProgram/docs/screenshots/07-school-teachers.png'),
schoolSchedule: fs.readFileSync('/Users/retirado/ccProgram/docs/screenshots/08-school-schedule.png'),
teacherCourses: fs.readFileSync('/Users/retirado/ccProgram/docs/screenshots/09-teacher-courses.png'),
teacherPrepare: fs.readFileSync('/Users/retirado/ccProgram/docs/screenshots/10-teacher-prepare.png'),
teacherLessons: fs.readFileSync('/Users/retirado/ccProgram/docs/screenshots/11-teacher-lessons.png'),
parentDashboard: fs.readFileSync('/Users/retirado/ccProgram/docs/screenshots/12-parent-dashboard.png'),
parentTasks: fs.readFileSync('/Users/retirado/ccProgram/docs/screenshots/13-parent-tasks.png'),
};
// 表格边框样式
const tableBorder = { style: BorderStyle.SINGLE, size: 1, color: "CCCCCC" };
const cellBorders = { top: tableBorder, bottom: tableBorder, left: tableBorder, right: tableBorder };
// 创建带标题的图片段落
function createImageWithCaption(imageData, caption, width = 550, height = 350) {
return [
new Paragraph({
alignment: AlignmentType.CENTER,
spacing: { before: 200, after: 100 },
children: [new ImageRun({
type: "png",
data: imageData,
transformation: { width, height },
altText: { title: caption, description: caption, name: caption }
})]
}),
new Paragraph({
alignment: AlignmentType.CENTER,
spacing: { after: 300 },
children: [new TextRun({ text: caption, italics: true, size: 20, color: "666666" })]
})
];
}
// 创建表格
function createTable(headers, rows) {
const headerCells = headers.map(h => new TableCell({
borders: cellBorders,
width: { size: Math.floor(9360 / headers.length), type: WidthType.DXA },
shading: { fill: "1E3A5F", type: ShadingType.CLEAR },
verticalAlign: VerticalAlign.CENTER,
children: [new Paragraph({
alignment: AlignmentType.CENTER,
children: [new TextRun({ text: h, bold: true, size: 22, color: "FFFFFF" })]
})]
}));
const dataRows = rows.map(row => new TableRow({
children: row.map(cell => new TableCell({
borders: cellBorders,
width: { size: Math.floor(9360 / headers.length), type: WidthType.DXA },
children: [new Paragraph({
spacing: { before: 60, after: 60 },
children: [new TextRun({ text: cell, size: 22 })]
})]
}))
}));
return new Table({
columnWidths: headers.map(() => Math.floor(9360 / headers.length)),
rows: [new TableRow({ tableHeader: true, children: headerCells }), ...dataRows]
});
}
const doc = new Document({
styles: {
default: { document: { run: { font: "Microsoft YaHei", size: 24 } } },
paragraphStyles: [
{ id: "Title", name: "Title", basedOn: "Normal",
run: { size: 72, bold: true, color: "1E3A5F", font: "Microsoft YaHei" },
paragraph: { spacing: { before: 400, after: 200 }, alignment: AlignmentType.CENTER } },
{ id: "Heading1", name: "Heading 1", basedOn: "Normal", next: "Normal", quickFormat: true,
run: { size: 36, bold: true, color: "1E3A5F", font: "Microsoft YaHei" },
paragraph: { spacing: { before: 400, after: 200 }, outlineLevel: 0 } },
{ id: "Heading2", name: "Heading 2", basedOn: "Normal", next: "Normal", quickFormat: true,
run: { size: 28, bold: true, color: "2E5A8F", font: "Microsoft YaHei" },
paragraph: { spacing: { before: 300, after: 150 }, outlineLevel: 1 } },
{ id: "Heading3", name: "Heading 3", basedOn: "Normal", next: "Normal", quickFormat: true,
run: { size: 24, bold: true, color: "3E7ABF", font: "Microsoft YaHei" },
paragraph: { spacing: { before: 200, after: 100 }, outlineLevel: 2 } }
]
},
numbering: {
config: [
{ reference: "bullet-list",
levels: [{ level: 0, format: LevelFormat.BULLET, text: "•", alignment: AlignmentType.LEFT,
style: { paragraph: { indent: { left: 720, hanging: 360 } } } }] }
]
},
sections: [{
properties: {
page: { margin: { top: 1440, right: 1440, bottom: 1440, left: 1440 } }
},
headers: {
default: new Header({ children: [new Paragraph({
alignment: AlignmentType.RIGHT,
children: [new TextRun({ text: "幼儿阅读教学服务平台 - 产品介绍", size: 20, color: "888888" })]
})] })
},
footers: {
default: new Footer({ children: [new Paragraph({
alignment: AlignmentType.CENTER,
children: [new TextRun({ text: "第 ", size: 20 }), new TextRun({ children: [PageNumber.CURRENT], size: 20 }),
new TextRun({ text: " 页 / 共 ", size: 20 }), new TextRun({ children: [PageNumber.TOTAL_PAGES], size: 20 }),
new TextRun({ text: " 页", size: 20 })]
})] })
},
children: [
// ===== 封面页 =====
new Paragraph({ spacing: { before: 2000 } }),
new Paragraph({
alignment: AlignmentType.CENTER,
children: [new TextRun({ text: "幼儿阅读教学服务平台", size: 72, bold: true, color: "1E3A5F", font: "Microsoft YaHei" })]
}),
new Paragraph({ spacing: { before: 400 } }),
new Paragraph({
alignment: AlignmentType.CENTER,
children: [new TextRun({ text: "产品介绍与功能说明", size: 40, color: "3E7ABF", font: "Microsoft YaHei" })]
}),
new Paragraph({ spacing: { before: 1500 } }),
new Paragraph({
alignment: AlignmentType.CENTER,
children: [new TextRun({ text: "版本v1.0", size: 28, color: "666666" })]
}),
new Paragraph({
alignment: AlignmentType.CENTER,
spacing: { before: 100 },
children: [new TextRun({ text: "日期2026年2月24日", size: 28, color: "666666" })]
}),
new Paragraph({ children: [new PageBreak()] }),
// ===== 目录页 =====
new Paragraph({ heading: HeadingLevel.HEADING_1, children: [new TextRun("目录")] }),
new TableOfContents("目录", { hyperlink: true, headingStyleRange: "1-3" }),
new Paragraph({ children: [new PageBreak()] }),
// ===== 第一章:产品概述 =====
new Paragraph({ heading: HeadingLevel.HEADING_1, children: [new TextRun("第一章 产品概述")] }),
new Paragraph({ heading: HeadingLevel.HEADING_2, children: [new TextRun("1.1 产品定位")] }),
new Paragraph({
spacing: { after: 200 },
children: [new TextRun({ text: "幼儿阅读教学服务平台是一款面向幼儿园的B2B2C综合性阅读教学管理系统致力于为幼儿园、教师和家长提供全方位的绘本阅读教学服务。平台采用多端协同架构打通超管、学校、教师、家长四方角色实现从课程创作、教学管理到家校互动的完整闭环。" })]
}),
new Paragraph({ heading: HeadingLevel.HEADING_2, children: [new TextRun("1.2 目标用户")] }),
createTable(
["用户角色", "使用场景", "核心需求"],
[
["平台超管", "运营管理", "课程内容管理、租户服务、平台运营"],
["学校管理员", "园所管理", "教师学生管理、课程授权、数据统计"],
["教师", "教学实施", "课程备课、课堂教学、任务布置、成长记录"],
["家长", "家校共育", "查看任务、提交反馈、了解孩子成长"]
]
),
new Paragraph({ heading: HeadingLevel.HEADING_2, spacing: { before: 300 }, children: [new TextRun("1.3 核心价值")] }),
new Paragraph({ numbering: { reference: "bullet-list", level: 0 }, children: [new TextRun("标准化教学:专业绘本课程包,标准化教学流程")] }),
new Paragraph({ numbering: { reference: "bullet-list", level: 0 }, children: [new TextRun("效率提升:备课上课一体化,教学管理智能化")] }),
new Paragraph({ numbering: { reference: "bullet-list", level: 0 }, children: [new TextRun("家校联动:任务布置与反馈,家校共育更紧密")] }),
new Paragraph({ numbering: { reference: "bullet-list", level: 0 }, children: [new TextRun("成长可视:多维度数据记录,成长轨迹清晰可见")] }),
new Paragraph({ numbering: { reference: "bullet-list", level: 0 }, children: [new TextRun("灵活管理:多租户架构,满足不同规模园所需求")] }),
// 登录界面
new Paragraph({ heading: HeadingLevel.HEADING_2, spacing: { before: 300 }, children: [new TextRun("1.4 登录界面")] }),
...createImageWithCaption(screenshots.login, "图1-1 系统登录界面 - 支持四种角色切换", 500, 400),
new Paragraph({ children: [new PageBreak()] }),
// ===== 第二章:技术架构 =====
new Paragraph({ heading: HeadingLevel.HEADING_1, children: [new TextRun("第二章 技术架构")] }),
new Paragraph({ heading: HeadingLevel.HEADING_2, children: [new TextRun("2.1 系统架构")] }),
new Paragraph({
spacing: { after: 200 },
children: [new TextRun("系统采用前后端分离架构前端使用Vue 3框架后端使用NestJS框架通过JWT进行身份认证。数据层使用Prisma ORM支持SQLite开发和PostgreSQL生产数据库。")]
}),
new Paragraph({ heading: HeadingLevel.HEADING_2, children: [new TextRun("2.2 技术选型")] }),
createTable(
["层级", "技术栈", "说明"],
[
["前端框架", "Vue 3 + Vite", "现代化前端开发框架"],
["UI组件", "Ant Design Vue 4.x", "企业级UI组件库"],
["状态管理", "Pinia", "Vue官方状态管理"],
["后端框架", "NestJS", "企业级Node.js框架"],
["ORM", "Prisma", "现代化数据库工具"],
["数据库", "SQLite / PostgreSQL", "开发/生产数据库"],
["认证", "JWT + Passport", "安全认证方案"]
]
),
new Paragraph({ children: [new PageBreak()] }),
// ===== 第三章:超管端功能 =====
new Paragraph({ heading: HeadingLevel.HEADING_1, children: [new TextRun("第三章 超管端功能")] }),
new Paragraph({
spacing: { after: 200 },
children: [new TextRun("超管端是平台的运营管理中心,负责课程内容生产、租户服务和平台运营。")]
}),
new Paragraph({ heading: HeadingLevel.HEADING_2, children: [new TextRun("3.1 数据看板")] }),
new Paragraph({
spacing: { after: 100 },
children: [new TextRun("提供平台整体运营数据的可视化展示,包括核心指标、趋势图表和快捷入口。")]
}),
...createImageWithCaption(screenshots.adminDashboard, "图3-1 超管端数据看板 - 平台运营数据一目了然"),
new Paragraph({ heading: HeadingLevel.HEADING_2, children: [new TextRun("3.2 课程包管理")] }),
new Paragraph({
spacing: { after: 100 },
children: [new TextRun("完整的课程内容生产与发布流程,支持基础信息、资源上传、教学环节、逐页脚本、延伸活动等完整内容。")]
}),
...createImageWithCaption(screenshots.adminCourses, "图3-2 课程包列表 - 管理所有课程内容"),
...createImageWithCaption(screenshots.courseDetail, "图3-3 课程详情 - 完整的教学设计展示", 500, 600),
new Paragraph({ heading: HeadingLevel.HEADING_2, children: [new TextRun("3.3 租户管理")] }),
new Paragraph({
spacing: { after: 100 },
children: [new TextRun("多租户服务的核心管理功能,包括租户列表、套餐配置、课程授权、服务管理等。")]
}),
...createImageWithCaption(screenshots.adminTenants, "图3-4 租户管理 - 管理所有签约园所"),
new Paragraph({ children: [new PageBreak()] }),
// ===== 第四章:学校端功能 =====
new Paragraph({ heading: HeadingLevel.HEADING_1, children: [new TextRun("第四章 学校端功能")] }),
new Paragraph({
spacing: { after: 200 },
children: [new TextRun("学校端是园所管理员的管理后台,负责本园的教师、学生、班级和教学管理。")]
}),
new Paragraph({ heading: HeadingLevel.HEADING_2, children: [new TextRun("4.1 数据概览")] }),
new Paragraph({
spacing: { after: 100 },
children: [new TextRun("园所运营数据一目了然,包括人员统计、教学统计和图表展示。")]
}),
...createImageWithCaption(screenshots.schoolDashboard, "图4-1 学校端数据概览 - 园所运营数据统计"),
new Paragraph({ heading: HeadingLevel.HEADING_2, children: [new TextRun("4.2 人员管理")] }),
new Paragraph({
spacing: { after: 100 },
children: [new TextRun("支持教师和学生的增删改查、批量导入、调班等功能。")]
}),
...createImageWithCaption(screenshots.schoolTeachers, "图4-2 教师管理 - 管理本园教师信息"),
new Paragraph({ heading: HeadingLevel.HEADING_2, children: [new TextRun("4.3 课程排期")] }),
new Paragraph({
spacing: { after: 100 },
children: [new TextRun("日历视图展示排课情况,支持创建、编辑、删除排课。")]
}),
...createImageWithCaption(screenshots.schoolSchedule, "图4-3 课程排期 - 日历视图管理排课"),
new Paragraph({ children: [new PageBreak()] }),
// ===== 第五章:教师端功能 =====
new Paragraph({ heading: HeadingLevel.HEADING_1, children: [new TextRun("第五章 教师端功能")] }),
new Paragraph({
spacing: { after: 200 },
children: [new TextRun("教师端是教师日常教学的核心工具,覆盖备课、上课、课后全流程。")]
}),
new Paragraph({ heading: HeadingLevel.HEADING_2, children: [new TextRun("5.1 课程中心")] }),
new Paragraph({
spacing: { after: 100 },
children: [new TextRun("浏览和使用已授权的课程,支持年级筛选、领域筛选、关键词搜索。")]
}),
...createImageWithCaption(screenshots.teacherCourses, "图5-1 课程中心 - 浏览可用课程"),
new Paragraph({ heading: HeadingLevel.HEADING_2, children: [new TextRun("5.2 备课模式")] }),
new Paragraph({
spacing: { after: 100 },
children: [new TextRun("课前准备工作,包括教学流程、教师讲稿、逐页脚本、备课笔记、教学材料等。")]
}),
...createImageWithCaption(screenshots.teacherPrepare, "图5-2 备课模式 - 完整的备课支持", 500, 500),
new Paragraph({ heading: HeadingLevel.HEADING_2, children: [new TextRun("5.3 上课记录")] }),
new Paragraph({
spacing: { after: 100 },
children: [new TextRun("历史授课记录管理,支持状态筛选、日期筛选、查看详情。")]
}),
...createImageWithCaption(screenshots.teacherLessons, "图5-3 上课记录 - 授课历史管理"),
new Paragraph({ children: [new PageBreak()] }),
// ===== 第六章:家长端功能 =====
new Paragraph({ heading: HeadingLevel.HEADING_1, children: [new TextRun("第六章 家长端功能")] }),
new Paragraph({
spacing: { after: 200 },
children: [new TextRun("家长端是家校互动的桥梁,让家长了解并参与孩子的阅读成长。")]
}),
new Paragraph({ heading: HeadingLevel.HEADING_2, children: [new TextRun("6.1 首页")] }),
new Paragraph({
spacing: { after: 100 },
children: [new TextRun("孩子信息概览,包括孩子卡片、最近任务、成长档案等。")]
}),
...createImageWithCaption(screenshots.parentDashboard, "图6-1 家长端首页 - 孩子信息概览"),
new Paragraph({ heading: HeadingLevel.HEADING_2, children: [new TextRun("6.2 阅读任务")] }),
new Paragraph({
spacing: { after: 100 },
children: [new TextRun("完成教师布置的任务,支持查看任务详情、提交反馈、查看反馈记录。")]
}),
...createImageWithCaption(screenshots.parentTasks, "图6-2 阅读任务 - 查看并完成阅读任务"),
new Paragraph({ children: [new PageBreak()] }),
// ===== 第七章:核心业务流程 =====
new Paragraph({ heading: HeadingLevel.HEADING_1, children: [new TextRun("第七章 核心业务流程")] }),
new Paragraph({ heading: HeadingLevel.HEADING_2, children: [new TextRun("7.1 课程生产流程")] }),
new Paragraph({
spacing: { after: 200 },
children: [new TextRun("超管创建课程 → 填写基础信息 → 上传资源 → 设计教学环节 → 添加延伸活动 → 提交审核 → 审核通过 → 发布课程 → 授权给租户 → 学校/教师使用")]
}),
new Paragraph({ heading: HeadingLevel.HEADING_2, children: [new TextRun("7.2 教学实施流程")] }),
new Paragraph({
spacing: { after: 200 },
children: [new TextRun("教师浏览课程 → 进入备课模式 → 记录备课笔记 → 选择班级 → 开始上课 → 按流程教学 → 课堂评价 → 结束课程 → 填写课堂记录 → 查看上课记录")]
}),
new Paragraph({ heading: HeadingLevel.HEADING_2, children: [new TextRun("7.3 家校互动流程")] }),
new Paragraph({
spacing: { after: 200 },
children: [new TextRun("教师布置任务 → 分配给学生/班级 → 家长查看任务 → 亲子完成阅读 → 家长提交反馈 → 教师查看反馈")]
}),
new Paragraph({ heading: HeadingLevel.HEADING_2, children: [new TextRun("7.4 成长记录流程")] }),
new Paragraph({
spacing: { after: 200 },
children: [new TextRun("教师观察学生 → 创建成长档案 → 选择学生 → 填写内容 → 上传图片 → 保存档案 → 家长查看")]
}),
new Paragraph({ children: [new PageBreak()] }),
// ===== 第八章:部署与运维 =====
new Paragraph({ heading: HeadingLevel.HEADING_1, children: [new TextRun("第八章 部署与运维")] }),
new Paragraph({ heading: HeadingLevel.HEADING_2, children: [new TextRun("8.1 环境配置")] }),
createTable(
["环境", "前端地址", "后端地址", "数据库"],
[
["开发", "localhost:5173", "localhost:3000", "SQLite"],
["生产", "域名/CDN", "域名/API", "PostgreSQL"]
]
),
new Paragraph({ heading: HeadingLevel.HEADING_2, spacing: { before: 300 }, children: [new TextRun("8.2 启动命令")] }),
new Paragraph({
spacing: { after: 100 },
shading: { fill: "F5F5F5", type: ShadingType.CLEAR },
children: [new TextRun({ text: "# 开发环境启动", font: "Consolas", size: 22 })]
}),
new Paragraph({
spacing: { after: 100 },
shading: { fill: "F5F5F5", type: ShadingType.CLEAR },
children: [new TextRun({ text: "./start-all.sh", font: "Consolas", size: 22 })]
}),
new Paragraph({
spacing: { after: 100 },
shading: { fill: "F5F5F5", type: ShadingType.CLEAR },
children: [new TextRun({ text: "# 停止服务", font: "Consolas", size: 22 })]
}),
new Paragraph({
spacing: { after: 200 },
shading: { fill: "F5F5F5", type: ShadingType.CLEAR },
children: [new TextRun({ text: "./stop-all.sh", font: "Consolas", size: 22 })]
}),
new Paragraph({ heading: HeadingLevel.HEADING_2, children: [new TextRun("8.3 测试账号")] }),
createTable(
["角色", "账号", "密码"],
[
["超管", "admin", "admin123"],
["学校", "school", "123456"],
["教师", "teacher1", "123456"],
["家长", "parent1", "123456"]
]
),
// 结束页
new Paragraph({ spacing: { before: 800 } }),
new Paragraph({
alignment: AlignmentType.CENTER,
children: [new TextRun({ text: "— 文档结束 —", size: 24, color: "888888", italics: true })]
})
]
}]
});
// 生成文档
Packer.toBuffer(doc).then(buffer => {
fs.writeFileSync("/Users/retirado/ccProgram/docs/幼儿阅读教学服务平台-产品介绍与功能说明.docx", buffer);
console.log("文档生成成功!");
}).catch(err => {
console.error("生成文档失败:", err);
});