/** * 简化的文档生成器 * 生成HTML格式的软件说明书,避免PDF字体问题 */ const fs = require('fs-extra'); const path = require('path'); const moment = require('moment'); const chalk = require('chalk'); const { SUPPORTED_EXTENSIONS } = require('./scanner'); /** * 生成软件说明书(HTML格式) * @param {Object} projectInfo 项目信息 * @param {string} outputDir 输出目录 * @returns {Promise} 生成的文件路径 */ async function generateManualHTML(projectInfo, outputDir) { try { console.log(chalk.yellow('📝 生成HTML格式的软件说明书...')); const timestamp = moment().format('YYYYMMDD_HHMMSS'); const fileName = `软件说明书_${projectInfo.name}_${timestamp}.html`; const outputPath = path.join(outputDir, fileName); // 生成HTML内容 const htmlContent = await generateHTMLContent(projectInfo); // 写入HTML文件 await fs.writeFile(outputPath, htmlContent, 'utf8'); console.log(chalk.green(`✅ HTML软件说明书已生成: ${outputPath}`)); console.log(chalk.blue('💡 提示: 可以在浏览器中打开HTML文件,然后打印为PDF')); return outputPath; } catch (error) { throw new Error(`生成HTML软件说明书失败: ${error.message}`); } } /** * 生成HTML内容 * @param {Object} projectInfo 项目信息 * @returns {Promise} HTML内容 */ async function generateHTMLContent(projectInfo) { const timestamp = moment().format('YYYY年MM月DD日 HH:mm:ss'); // 设置CSS变量用于页眉页脚 const softwareName = getSoftwareName(projectInfo.name); const version = await getProjectVersion(projectInfo); const headerText = `${softwareName}_${version}`; const footerText = `软件著作权申请材料 | 生成时间: ${timestamp}`; return ` ${softwareName}软件使用手册
${softwareName}软件说明书
版本 ${version}
生成日期: ${timestamp}
项目名称
${projectInfo.name}
开发语言
${projectInfo.languages.join('、')}
源代码文件
${projectInfo.files.length} 个
代码行数
${projectInfo.totalLines} 行
目录
  • 1. 引言
  • 2. 软件概述
  • 3. 运行环境
  • 4. 设计思想与实现过程
  • 5. 功能模块详述
  • 6. 用户指南
  • 7. 测试与维护
1. 引言
1.1 概述

${projectInfo.name}是一款基于${projectInfo.languages.join('、')}技术开发的${getProjectTypeDescription(projectInfo.features.type)}。本项目包含${projectInfo.files.length}个源代码文件,总计${projectInfo.totalLines}行代码,体现了良好的软件工程实践和模块化设计理念。软件采用了现代化的开发技术和架构设计,具有高度的可扩展性和维护性。

1.2 编写目的

本软件说明书旨在详细描述${projectInfo.name}的功能特性、技术架构、运行环境和使用方法,为软件著作权申请提供完整的技术文档。本文档将从技术角度全面阐述软件的设计思想、实现方案和创新点,展现软件的技术价值和实用性。

1.3 开发背景

随着信息技术的快速发展和数字化转型的深入,用户对高质量软件的需求日益增长。${projectInfo.name}的开发正是为了满足${getApplicationScenario(projectInfo)}的需求。项目采用了${projectInfo.features.frameworks.length > 0 ? projectInfo.features.frameworks.join('、') : '主流'}技术框架,确保了技术的先进性和稳定性。通过深入的调研和精心的设计,本软件实现了核心功能的优化和用户体验的提升。

2. 软件概述
2.1 主要功能
    ${getMainFunctions(projectInfo).map(func => `
  • ${func}
  • `).join('')}
2.2 软件特点
    ${getSoftwareFeatures(projectInfo).map(feature => `
  • ${feature}
  • `).join('')}
2.3 性能指标
    ${getPerformanceMetrics(projectInfo).map(metric => `
  • ${metric}
  • `).join('')}
3. 运行环境
3.1 硬件要求

最低配置:

  • 处理器:双核 2.0GHz 或更高
  • 内存:4GB RAM 或更高
  • 存储空间:至少 1GB 可用空间
  • 网络:稳定的互联网连接
3.2 软件要求
  • 操作系统:Windows 10+、macOS 10.14+、Linux (Ubuntu 18.04+)
  • 运行环境:${projectInfo.languages.join('、')}
  • ${projectInfo.features.packageManagers.includes('npm') ? '
  • 包管理器:Node.js 14+ 和 npm 6+
  • ' : ''}
4. 设计思想与实现过程
4.1 系统架构

本软件采用模块化架构设计,包括表示层、业务逻辑层和数据访问层。系统采用分层设计,各层之间通过标准接口进行通信,确保系统的松耦合和高内聚。

4.2 模块划分
  1. 用户界面模块:负责用户交互和界面展示
  2. 业务逻辑模块:处理核心业务逻辑
  3. 数据访问模块:负责数据的存储和检索
  4. 系统配置模块:管理系统配置和参数设置
4.3 开发流程

软件开发遵循标准的软件工程流程,包括需求分析、系统设计、编码实现、测试验证和部署维护等阶段。项目采用敏捷开发方法,通过迭代的方式逐步完善功能。版本控制使用Git,确保代码的可追溯性和团队协作效率。

5. 功能模块详述
5.1 核心功能模块
  • 用户管理模块:实现用户注册、登录、权限管理等功能
  • 数据处理模块:负责数据的增删改查和业务逻辑处理
  • API接口模块:提供RESTful API接口供前端调用
5.2 用户界面设计

用户界面设计遵循简洁易用的原则,采用现代化的设计风格。界面布局合理,色彩搭配协调,图标和文字清晰可读。支持响应式设计,能够适配不同分辨率的设备。提供统一的交互体验,操作流程简单直观。

6. 用户指南
6.1 安装说明
  1. 环境准备:确保系统满足最低硬件和软件要求
  2. 依赖安装:安装必要的运行环境和依赖包
  3. 软件部署:将软件部署到目标环境
  4. 配置设置:根据实际需求配置系统参数
  5. 启动测试:验证软件是否正常运行
6.2 使用方法
  1. 用户登录:使用有效的用户名和密码登录系统
  2. 功能导航:通过主菜单或导航栏访问各项功能
  3. 数据操作:在相应界面中完成数据的增删改查
  4. 报表查看:通过报表功能查看统计数据和分析结果
7. 测试与维护
7.1 测试情况

本软件经过全面的测试验证,包括单元测试、集成测试和系统测试。测试覆盖了主要功能模块、边界条件和异常情况,确保软件的稳定性和可靠性。性能测试验证了系统在不同负载下的响应能力,安全测试确保了系统的安全性。

7.2 维护说明
  • 日常维护:定期检查系统运行状态,备份重要数据
  • 故障排除:及时处理系统异常和用户反馈的问题
  • 功能升级:根据用户需求和技术发展,持续改进软件功能
  • 安全维护:定期更新安全补丁,确保系统安全
`; } // 辅助函数 function getProjectTypeDescription(type) { const typeMap = { 'web': 'Web应用', 'python': 'Python应用', 'java': 'Java应用', 'javascript': 'JavaScript应用', 'unknown': '通用应用' }; return typeMap[type] || '通用应用'; } function getMainFunctions(projectInfo) { const functions = [ '用户界面管理和交互功能', '数据处理和存储功能', '系统配置和设置功能', '用户认证和权限管理功能', '日志记录和监控功能' ]; return functions; } function getApplicationScenario(projectInfo) { return '软件开发和部署场景,满足现代化的业务需求和技术要求'; } function getSoftwareFeatures(projectInfo) { const features = [ '采用模块化设计,具有良好的可扩展性', '使用现代化技术栈,确保技术的先进性', '代码结构清晰,遵循最佳实践和编码规范', '具有完整的错误处理和异常管理机制', '支持多种数据格式和协议', '具有良好的性能和响应速度' ]; if (projectInfo.features.hasTests) { features.push('包含完整的单元测试和集成测试'); } if (projectInfo.features.hasDocumentation) { features.push('提供详细的技术文档和API说明'); } return features; } function getPerformanceMetrics(projectInfo) { return [ '响应时间:主要操作响应时间小于200ms', '并发处理:支持100+并发用户访问', '数据处理:支持大量数据的高效处理', '内存使用:合理的内存占用和垃圾回收机制', '可扩展性:支持水平扩展和负载均衡' ]; } /** * 获取软件名称 * @param {string} projectName 项目名称 * @returns {string} 软件名称 */ function getSoftwareName(projectName) { // 清理项目名称,移除常见后缀 const cleanedName = projectName .replace(/[-_]app$/i, '') .replace(/[-_]project$/i, '') .replace(/[-_]system$/i, '') .replace(/ai-agent/i, 'AI智能体') .replace(/-/g, ' '); // 首字母大写 return cleanedName.charAt(0).toUpperCase() + cleanedName.slice(1); } /** * 从项目中读取版本信息 * @param {Object} projectInfo 项目信息 * @returns {Promise} 版本号 */ async function getProjectVersion(projectInfo) { try { const projectPath = projectInfo.path || process.cwd(); // 尝试从package.json读取版本 const packageJsonPath = path.join(projectPath, 'package.json'); if (await fs.pathExists(packageJsonPath)) { const packageData = await fs.readJson(packageJsonPath); if (packageData.version) { return `V${packageData.version}`; } } // 尝试从setup.py读取版本 const setupPyPath = path.join(projectPath, 'setup.py'); if (await fs.pathExists(setupPyPath)) { const setupContent = await fs.readFile(setupPyPath, 'utf8'); const versionMatch = setupContent.match(/version\s*=\s*['"]([^'"]+)['"]/); if (versionMatch) { return `V${versionMatch[1]}`; } } // 尝试从Cargo.toml读取版本 const cargoTomlPath = path.join(projectPath, 'Cargo.toml'); if (await fs.pathExists(cargoTomlPath)) { const cargoContent = await fs.readFile(cargoTomlPath, 'utf8'); const versionMatch = cargoContent.match(/^version\s*=\s*["']([^"']+)["']/m); if (versionMatch) { return `V${versionMatch[1]}`; } } // 尝试从pyproject.toml读取 const pyprojectPath = path.join(projectPath, 'pyproject.toml'); if (await fs.pathExists(pyprojectPath)) { const pyprojectContent = await fs.readFile(pyprojectPath, 'utf8'); const versionMatch = pyprojectContent.match(/version\s*=\s*["']([^"']+)["']/); if (versionMatch) { return `V${versionMatch[1]}`; } } // 尝试从README文件读取版本 const readmeFiles = ['README.md', 'README.txt', 'readme.md', 'README']; for (const readmeFile of readmeFiles) { const readmePath = path.join(projectPath, readmeFile); if (await fs.pathExists(readmePath)) { const readmeContent = await fs.readFile(readmePath, 'utf8'); // 尝试多种版本号格式 const versionPatterns = [ /(?:version|版本)[\s::]*v?(\d+\.\d+\.\d+)/i, /^#+\s*v?(\d+\.\d+\.\d+)/m, /\*\*(?:version|版本)\*\*[\s::]*v?(\d+\.\d+\.\d+)/i, /\[v?(\d+\.\d+\.\d+)\]/, ]; for (const pattern of versionPatterns) { const versionMatch = readmeContent.match(pattern); if (versionMatch) { console.log(chalk.green(`从${readmeFile}读取到版本号: ${versionMatch[1]}`)); return `V${versionMatch[1]}`; } } } } // 默认版本 return 'V1.0.0'; } catch (error) { console.warn(chalk.yellow('读取版本信息失败,使用默认版本:'), error.message); return 'V1.0.0'; } } module.exports = { generateManualHTML };