智慧水务管理系统 - 精河县供水工程综合管理平台

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188
  1. #!/bin/bash
  2. # ============================================================
  3. # 智慧水务管理系统 - Lint 检查脚本
  4. # 用法: ./scripts/lint.sh [--fix] [--python-only] [--java-only] [--frontend-only]
  5. # ============================================================
  6. set -euo pipefail
  7. # 默认全部检查
  8. CHECK_PYTHON=true
  9. CHECK_JAVA=true
  10. CHECK_FRONTEND=true
  11. FIX_MODE=false
  12. EXIT_CODE=0
  13. # 解析参数
  14. while [[ $# -gt 0 ]]; do
  15. case $1 in
  16. --fix)
  17. FIX_MODE=true; shift ;;
  18. --python-only)
  19. CHECK_JAVA=false; CHECK_FRONTEND=false; shift ;;
  20. --java-only)
  21. CHECK_PYTHON=false; CHECK_FRONTEND=false; shift ;;
  22. --frontend-only)
  23. CHECK_PYTHON=false; CHECK_JAVA=false; shift ;;
  24. -h|--help)
  25. echo "用法: $0 [选项]"
  26. echo ""
  27. echo " --fix 自动修复可修复的问题"
  28. echo " --python-only 仅检查 Python 代码"
  29. echo " --java-only 仅检查 Java 代码"
  30. echo " --frontend-only 仅检查前端代码"
  31. exit 0
  32. ;;
  33. *)
  34. echo "❌ 未知参数: $1"
  35. exit 1
  36. ;;
  37. esac
  38. done
  39. echo "========================================="
  40. echo " 智慧水务管理系统 - 代码检查"
  41. echo "========================================="
  42. # ==================== Python Lint ====================
  43. if [ "$CHECK_PYTHON" = true ]; then
  44. echo ""
  45. echo "▶ Python 代码检查..."
  46. PY_FILES=$(find . -name "*.py" \
  47. -not -path "./.git/*" \
  48. -not -path "*/node_modules/*" \
  49. -not -path "*/__pycache__/*" \
  50. -not -path "*/venv/*" \
  51. -not -path "*/.venv/*" \
  52. 2>/dev/null || true)
  53. if [ -n "$PY_FILES" ]; then
  54. # 检查 ruff 是否安装
  55. if command -v ruff &>/dev/null; then
  56. echo " 使用 ruff 检查..."
  57. if [ "$FIX_MODE" = true ]; then
  58. ruff check . --fix --exclude node_modules --exclude .git --exclude __pycache__ || EXIT_CODE=1
  59. ruff format . --exclude node_modules --exclude .git --exclude __pycache__ || EXIT_CODE=1
  60. else
  61. ruff check . --exclude node_modules --exclude .git --exclude __pycache__ || EXIT_CODE=1
  62. ruff format --check . --exclude node_modules --exclude .git --exclude __pycache__ || EXIT_CODE=1
  63. fi
  64. echo " ✅ Python 检查完成"
  65. elif command -v flake8 &>/dev/null; then
  66. echo " 使用 flake8 检查..."
  67. flake8 . --exclude=node_modules,.git,__pycache__,venv --max-line-length=120 || EXIT_CODE=1
  68. echo " ✅ Python 检查完成"
  69. else
  70. echo " ⚠️ 未安装 ruff 或 flake8,安装方法: pip install ruff"
  71. echo " 跳过 Python lint"
  72. fi
  73. else
  74. echo " ⏭️ 未发现 Python 文件,跳过"
  75. fi
  76. fi
  77. # ==================== Java Lint ====================
  78. if [ "$CHECK_JAVA" = true ]; then
  79. echo ""
  80. echo "▶ Java 代码检查..."
  81. if [ -f "pom.xml" ]; then
  82. if command -v mvn &>/dev/null; then
  83. echo " 使用 Maven Checkstyle 检查..."
  84. mvn checkstyle:check -B 2>/dev/null || {
  85. echo " ⚠️ Checkstyle 检查未通过或未配置(非阻塞)"
  86. # 不设置 EXIT_CODE=1,因为 checkstyle 可能未配置
  87. }
  88. echo " ✅ Java 检查完成"
  89. else
  90. echo " ⚠️ 未安装 Maven,跳过 Java lint"
  91. fi
  92. else
  93. echo " ⏭️ 未发现 pom.xml,跳过"
  94. fi
  95. fi
  96. # ==================== 前端 Lint ====================
  97. if [ "$CHECK_FRONTEND" = true ]; then
  98. echo ""
  99. echo "▶ 前端代码检查..."
  100. FRONTEND_ISSUES=0
  101. # 检查 HTML 文件基本有效性
  102. echo " 检查 HTML 文件..."
  103. HTML_FILES=$(find ./frontend -name "*.html" -not -path "*/node_modules/*" 2>/dev/null || true)
  104. if [ -n "$HTML_FILES" ]; then
  105. while IFS= read -r file; do
  106. # 检查基本结构
  107. if ! grep -q '<html' "$file" 2>/dev/null; then
  108. echo " ⚠️ $file: 缺少 <html> 标签"
  109. FRONTEND_ISSUES=$((FRONTEND_ISSUES + 1))
  110. fi
  111. if ! grep -q '</html>' "$file" 2>/dev/null; then
  112. echo " ⚠️ $file: 缺少 </html> 结束标签"
  113. FRONTEND_ISSUES=$((FRONTEND_ISSUES + 1))
  114. fi
  115. done <<< "$HTML_FILES"
  116. fi
  117. # 检查 Vue 文件基本结构
  118. echo " 检查 Vue 文件..."
  119. VUE_FILES=$(find ./frontend/src -name "*.vue" -not -path "*/node_modules/*" 2>/dev/null || true)
  120. if [ -n "$VUE_FILES" ]; then
  121. while IFS= read -r file; do
  122. if ! grep -q '<template>' "$file" 2>/dev/null; then
  123. echo " ⚠️ $file: 缺少 <template> 块"
  124. FRONTEND_ISSUES=$((FRONTEND_ISSUES + 1))
  125. fi
  126. done <<< "$VUE_FILES"
  127. fi
  128. # 检查 TypeScript 配置
  129. if [ -f "frontend/tsconfig.json" ]; then
  130. echo " 检查 TypeScript 配置..."
  131. if ! python3 -c "import json; json.load(open('frontend/tsconfig.json'))" 2>/dev/null; then
  132. echo " ⚠️ tsconfig.json 不是有效的 JSON"
  133. FRONTEND_ISSUES=$((FRONTEND_ISSUES + 1))
  134. fi
  135. fi
  136. # 检查 package.json 有效性
  137. if [ -f "frontend/package.json" ]; then
  138. echo " 检查 package.json..."
  139. if ! python3 -c "import json; json.load(open('frontend/package.json'))" 2>/dev/null; then
  140. echo " ⚠️ package.json 不是有效的 JSON"
  141. FRONTEND_ISSUES=$((FRONTEND_ISSUES + 1))
  142. fi
  143. fi
  144. # 使用 ESLint(如果可用)
  145. if [ -f "frontend/node_modules/.bin/eslint" ]; then
  146. echo " 使用 ESLint 检查..."
  147. cd frontend
  148. if [ "$FIX_MODE" = true ]; then
  149. npx eslint --fix src/ 2>/dev/null || EXIT_CODE=1
  150. else
  151. npx eslint src/ 2>/dev/null || EXIT_CODE=1
  152. fi
  153. cd ..
  154. fi
  155. if [ $FRONTEND_ISSUES -gt 0 ]; then
  156. echo " ⚠️ 发现 ${FRONTEND_ISSUES} 个前端问题"
  157. else
  158. echo " ✅ 前端检查完成"
  159. fi
  160. fi
  161. # ==================== 结果汇总 ====================
  162. echo ""
  163. echo "========================================="
  164. if [ $EXIT_CODE -eq 0 ]; then
  165. echo " ✅ 所有检查通过"
  166. else
  167. echo " ❌ 检查发现问题,请修复后重新提交"
  168. fi
  169. echo "========================================="
  170. exit $EXIT_CODE