merge_all_simple.sh 8.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260
  1. #!/bin/bash
  2. # 一键拼接所有源代码脚本
  3. # 功能:批量执行所有源代码拼接脚本,生成完整的软著申请源代码材料
  4. #
  5. # 执行顺序:
  6. # 1. 前端源代码拼接
  7. # 2. 后端源代码拼接
  8. # 3. 数据库代码拼接
  9. # 4. 全量源代码拼接(可选)
  10. echo "🚀 开始批量拼接所有源代码..."
  11. echo "=========================================="
  12. # 设置脚本目录
  13. SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)"
  14. GENERATORS_DIR="${SCRIPT_DIR}/scripts/generators"
  15. # 统计信息
  16. SUCCESS_COUNT=0
  17. TOTAL_COUNT=0
  18. FAILED_SCRIPTS=()
  19. # 执行拼接脚本的函数
  20. run_merge_script() {
  21. local script_name="$1"
  22. local script_path="${GENERATORS_DIR}/${script_name}"
  23. local description="$2"
  24. ((TOTAL_COUNT++))
  25. echo ""
  26. echo "📋 [$TOTAL_COUNT] 执行: $description"
  27. echo "🔧 脚本: $script_name"
  28. echo "----------------------------------------"
  29. if [ -f "$script_path" ] && [ -x "$script_path" ]; then
  30. if "$script_path"; then
  31. echo "✅ $description - 完成"
  32. ((SUCCESS_COUNT++))
  33. else
  34. echo "❌ $description - 失败"
  35. FAILED_SCRIPTS+=("$script_name")
  36. fi
  37. else
  38. echo "❌ 脚本不存在或无执行权限: $script_path"
  39. FAILED_SCRIPTS+=("$script_name")
  40. fi
  41. }
  42. # 全量拼接函数(内联实现,避免依赖额外脚本)
  43. perform_full_merge() {
  44. local sourcecode_dir="${SCRIPT_DIR}/output_sourcecode"
  45. local output_dir="${SCRIPT_DIR}/output_docs"
  46. local output_file="${output_dir}/完整源代码合集.txt"
  47. # 确保目录存在
  48. mkdir -p "${output_dir}"
  49. # 检查源代码目录
  50. if [ ! -d "${sourcecode_dir}" ]; then
  51. echo "❌ 源代码目录不存在: ${sourcecode_dir}"
  52. return 1
  53. fi
  54. # 定义要拼接的文件类型
  55. local file_extensions=(
  56. "*.html" "*.css" "*.js" "*.ts" "*.mjs"
  57. "*.java" "*.jsp" "*.xml" "*.py" "*.cs" "*.csproj" "*.sln"
  58. "*.php" "*.go" "*.mod" "*.json" "*.yml" "*.yaml"
  59. "*.properties" "*.env" "*.sql" "*.md" "*.txt"
  60. )
  61. # 查找所有匹配的文件
  62. local all_files=()
  63. for ext in "${file_extensions[@]}"; do
  64. while IFS= read -r -d '' file; do
  65. all_files+=("$file")
  66. done < <(find "${sourcecode_dir}" -type f -name "$ext" -print0 | sort -z)
  67. done
  68. if [ ${#all_files[@]} -eq 0 ]; then
  69. echo "❌ 未找到源代码文件"
  70. return 1
  71. fi
  72. echo "📊 找到 ${#all_files[@]} 个源代码文件"
  73. # 清空输出文件
  74. > "${output_file}"
  75. # 拼接所有源代码文件
  76. local counter=1
  77. for file in "${all_files[@]}"; do
  78. local relative_path="${file#$sourcecode_dir/}"
  79. local filename=$(basename "$file")
  80. local extension="${filename##*.}"
  81. echo "📄 处理 ($counter/${#all_files[@]}): $relative_path"
  82. # 根据文件类型设置注释格式
  83. local comment_start comment_end
  84. case "$extension" in
  85. "html"|"css"|"js"|"ts"|"mjs") comment_start="/*" && comment_end="*/" ;;
  86. "java"|"jsp"|"cs"|"php"|"go"|"mod") comment_start="//" && comment_end="" ;;
  87. "xml"|"csproj"|"sln") comment_start="<!--" && comment_end="-->" ;;
  88. "py"|"yml"|"yaml"|"sql"|"properties"|"env") comment_start="#" && comment_end="" ;;
  89. "json") comment_start="//" && comment_end="" ;;
  90. *) comment_start="/*" && comment_end="*/" ;;
  91. esac
  92. # 写入文件分隔符和内容
  93. cat >> "${output_file}" << EOF
  94. $comment_start ==================== $relative_path ==================== $comment_end
  95. EOF
  96. if [ -r "$file" ]; then
  97. cat "$file" >> "${output_file}"
  98. else
  99. echo "<!-- 无法读取文件: $relative_path -->" >> "${output_file}"
  100. fi
  101. cat >> "${output_file}" << EOF
  102. $comment_start ==================== $relative_path 结束 ==================== $comment_end
  103. EOF
  104. ((counter++))
  105. done
  106. # 显示结果
  107. if [ -f "${output_file}" ]; then
  108. local file_size=$(wc -c < "${output_file}")
  109. local line_count=$(wc -l < "${output_file}")
  110. echo "📁 输出文件: ${output_file}"
  111. echo "📊 文件大小: $(( file_size / 1024 )) KB"
  112. echo "📋 总行数: $line_count"
  113. echo "📄 源文件数: ${#all_files[@]}"
  114. return 0
  115. else
  116. echo "❌ 生成失败"
  117. return 1
  118. fi
  119. }
  120. # 让用户选择拼接策略(避免重复处理)
  121. echo "🎯 请选择软著申请材料生成策略:"
  122. echo ""
  123. echo "📋 [1] 分类拼接 - 生成独立的模块文件"
  124. echo " ✓ 前端源代码.txt + 后端源代码.txt + 数据库代码.txt"
  125. echo " ✓ 适合:分模块提交,便于审核人员理解"
  126. echo " ✓ 文件数量:3个"
  127. echo ""
  128. echo "📦 [2] 全量拼接 - 生成统一的完整文件"
  129. echo " ✓ 完整源代码合集.txt(包含所有前端+后端+数据库代码)"
  130. echo " ✓ 适合:统一提交,单文件管理"
  131. echo " ✓ 文件数量:1个"
  132. echo ""
  133. read -p "请选择拼接策略 [1-分类/2-全量]: " -n 1 -r
  134. echo
  135. echo
  136. case $REPLY in
  137. 1)
  138. echo "📋 选择:分类拼接模式"
  139. echo "========================================"
  140. # 分类拼接:依次执行各个独立脚本
  141. run_merge_script "merge_frontend_simple.sh" "前端源代码拼接"
  142. run_merge_script "merge_backend_simple.sh" "后端源代码拼接"
  143. run_merge_script "merge_database_simple.sh" "数据库代码拼接"
  144. ;;
  145. 2)
  146. echo "📦 选择:全量拼接模式"
  147. echo "========================================"
  148. # 全量拼接:直接扫描并拼接所有源代码文件
  149. echo "📦 执行全量源代码拼接..."
  150. echo "----------------------------------------"
  151. # 执行内联的全量拼接逻辑
  152. if perform_full_merge; then
  153. echo "✅ 全量源代码拼接 - 完成"
  154. ((SUCCESS_COUNT++))
  155. else
  156. echo "❌ 全量源代码拼接 - 失败"
  157. FAILED_SCRIPTS+=("全量拼接")
  158. fi
  159. ((TOTAL_COUNT++))
  160. ;;
  161. *)
  162. echo "❌ 无效选择,默认使用分类拼接模式"
  163. echo "========================================"
  164. # 默认分类拼接
  165. run_merge_script "merge_frontend_simple.sh" "前端源代码拼接"
  166. run_merge_script "merge_backend_simple.sh" "后端源代码拼接"
  167. run_merge_script "merge_database_simple.sh" "数据库代码拼接"
  168. ;;
  169. esac
  170. # 显示执行结果汇总
  171. echo ""
  172. echo "=========================================="
  173. echo "📊 执行结果汇总"
  174. echo "=========================================="
  175. echo "✅ 成功: $SUCCESS_COUNT/$TOTAL_COUNT"
  176. if [ ${#FAILED_SCRIPTS[@]} -gt 0 ]; then
  177. echo "❌ 失败的脚本:"
  178. printf " - %s\n" "${FAILED_SCRIPTS[@]}"
  179. echo ""
  180. echo "💡 失败原因可能:"
  181. echo " 1. 源代码目录不存在(需要先生成源代码)"
  182. echo " 2. 脚本权限问题(运行 chmod +x scripts/generators/*.sh)"
  183. echo " 3. 依赖的工具未安装"
  184. fi
  185. echo ""
  186. echo "📁 生成的文件位置:"
  187. case $REPLY in
  188. 2)
  189. echo " - output_docs/完整源代码合集.txt"
  190. ;;
  191. *)
  192. echo " - output_docs/前端源代码.txt"
  193. echo " - output_docs/后端源代码.txt"
  194. echo " - output_docs/数据库代码.txt"
  195. ;;
  196. esac
  197. echo ""
  198. echo "💡 使用说明:"
  199. case $REPLY in
  200. 2)
  201. echo " ✓ 生成单一完整文件,包含所有前端+后端+数据库代码"
  202. echo " ✓ 适合统一提交,便于单文件管理"
  203. echo " ✓ 无需AI处理,避免token消耗"
  204. ;;
  205. *)
  206. echo " ✓ 生成分类文件,便于分模块提交和审核"
  207. echo " ✓ 每个模块独立,便于理解项目架构"
  208. echo " ✓ 无需AI处理,避免token消耗"
  209. ;;
  210. esac
  211. echo " - 建议检查文件内容完整性后提交"
  212. if [ $SUCCESS_COUNT -eq $TOTAL_COUNT ]; then
  213. echo ""
  214. echo "🎉 所有拼接任务执行成功!"
  215. exit 0
  216. else
  217. echo ""
  218. echo "⚠️ 部分任务执行失败,请检查上述错误信息"
  219. exit 1
  220. fi