#!/usr/bin/env bash set -euo pipefail ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" FRONTEND_URL="${FRONTEND_URL:-http://127.0.0.1:5173}" MOBILE_URL="${MOBILE_URL:-http://127.0.0.1:5174}" cd "$ROOT_DIR" fail() { echo "FAIL: $*" >&2 exit 1 } need() { command -v "$1" >/dev/null || fail "missing command: $1" } contains() { local file="$1" local text="$2" grep -Fq "$text" "$file" || fail "$file missing marker: $text" } check_url() { local name="$1" local url="$2" local code code="$(curl -sS -o /tmp/wygj-demo-check.body -w '%{http_code}' "$url")" [[ "$code" == "200" ]] || fail "$name returned HTTP $code" echo "OK: $name" } need curl check_url "frontend" "$FRONTEND_URL/" check_url "mobile" "$MOBILE_URL/h5/user" tenant_payload="$(curl -fsS "$FRONTEND_URL/dev-api/auth/tenant/list")" [[ "$tenant_payload" == *'"tenantId":"000000"'* ]] || fail "tenant list missing tenant 000000" echo "OK: tenant list" code_payload="$(curl -fsS "$FRONTEND_URL/dev-api/auth/code")" [[ "$code_payload" == *'"uuid"'* ]] || fail "captcha response missing uuid" echo "OK: captcha" contains frontend/src/router/index.ts "/recruit/interview" contains frontend/src/router/index.ts "/train/practice" contains frontend/src/router/index.ts "/knowledge/cases" contains frontend/src/router/index.ts "/knowledge/sop" contains frontend/src/router/index.ts "/system/model" contains mobile/src/App.vue "早上好,王敏" contains mobile/src/App.vue "AI结构化面试" contains mobile/src/App.vue "团队今日概况" contains mobile/src/App.vue "sendSmsCode" contains mobile/src/App.vue "/dev-api/resource/sms/code" contains mobile/src/App.vue "/dev-api/auth/mobile/sms-login" contains mobile/src/App.vue "fetchMobileHome" contains mobile/src/App.vue "/dev-api/api/aihr/mobile/home/" contains mobile/src/App.vue "startMobilePractice" contains mobile/src/App.vue "/dev-api/api/train/practice/start" contains mobile/src/App.vue "训练完成,主管端待复盘已更新" contains mobile/src/App.vue "/dev-api/api/aihr/mobile/practice/history" contains mobile/src/App.vue "competencyProfile" contains mobile/package.json "aihr-mobile" contains frontend/src/views/recruit/interview.vue "建议复试" contains frontend/src/views/train/practice.vue "导师改写" contains frontend/src/views/knowledge/cases.vue "seed入库" contains frontend/src/views/knowledge/sop.vue "训练题已生成" contains frontend/src/views/system/model/index.vue "调用优先级" contains frontend/src/api/aihr/interview.ts "/api/recruit/interview/start" contains backend/ruoyi-modules/ruoyi-aihr/src/main/java/org/dromara/aihr/controller/AihrInterviewController.java "/api/recruit/interview" contains frontend/src/api/aihr/practice.ts "/api/train/practice/start" contains backend/ruoyi-modules/ruoyi-aihr/src/main/java/org/dromara/aihr/controller/AihrPracticeController.java "/api/train/practice" contains backend/ruoyi-modules/ruoyi-aihr/src/main/java/org/dromara/aihr/service/AihrPracticeSeedService.java "mobileCompletedCount" contains backend/ruoyi-modules/ruoyi-aihr/src/main/java/org/dromara/aihr/service/AihrPracticeSeedService.java "aihr_practice_session" contains backend/ruoyi-modules/ruoyi-aihr/src/main/java/org/dromara/aihr/service/AihrMobileSeedService.java "待复盘对练" contains backend/ruoyi-modules/ruoyi-aihr/src/main/java/org/dromara/aihr/controller/AihrMobileController.java "/practice/reviews" contains backend/ruoyi-modules/ruoyi-aihr/src/main/java/org/dromara/aihr/controller/AihrMobileController.java "/practice/reviews/{id}/reviewed" contains mobile/src/App.vue "标记已复盘" contains frontend/src/api/aihr/case.ts "/api/knowledge/case/upload" contains backend/ruoyi-modules/ruoyi-aihr/src/main/java/org/dromara/aihr/controller/AihrCaseController.java "/api/knowledge/case" contains frontend/src/api/aihr/sop.ts "/api/knowledge/search" contains frontend/src/api/aihr/sop.ts "/api/knowledge/doc/upload" contains backend/ruoyi-modules/ruoyi-aihr/src/main/java/org/dromara/aihr/controller/AihrSopController.java "/api/knowledge" contains backend/ruoyi-modules/ruoyi-aihr/src/main/java/org/dromara/aihr/controller/AihrSopController.java "/doc/upload" contains backend/ruoyi-modules/ruoyi-aihr/src/main/java/org/dromara/aihr/service/AihrSopSeedService.java "仅支持 txt/md/markdown/pdf/doc/docx/xls/xlsx/ppt/pptx 文件" contains backend/ruoyi-modules/ruoyi-aihr/src/main/java/org/dromara/aihr/service/AihrSopSeedService.java "/embeddings" contains backend/script/sql/aihr_knowledge_mysql8.sql "embedding_json" contains frontend/src/views/knowledge/sop.vue "上传文档" contains frontend/src/views/knowledge/sop.vue ".pdf,.doc,.docx,.xls,.xlsx,.ppt,.pptx" contains docs/RUOYI_AI_INCREMENTAL_MIGRATION.md "ruoyi-ai" contains docs/RUOYI_AI_INCREMENTAL_MIGRATION.md "POST /api/knowledge/doc/upload" contains backend/script/sql/aihr_knowledge_mysql8.sql "aihr_knowledge_fragment" contains backend/script/sql/aihr_model_mysql8.sql "aihr_model_config" contains backend/script/sql/aihr_practice_mysql8.sql "aihr_practice_session" contains backend/script/sql/aihr_practice_mysql8.sql "dialogue_json" contains backend/script/sql/aihr_model_mysql8.sql "api_key" contains backend/ruoyi-modules/ruoyi-aihr/src/main/java/org/dromara/aihr/controller/AihrModelController.java "/api/aihr/model" contains backend/ruoyi-modules/ruoyi-aihr/src/main/java/org/dromara/aihr/controller/AihrModelController.java "/providers/{providerCode}" contains backend/ruoyi-modules/ruoyi-aihr/src/main/java/org/dromara/aihr/controller/AihrModelController.java "/configs/{id}/enabled" contains backend/ruoyi-modules/ruoyi-aihr/src/main/java/org/dromara/aihr/service/AihrModelSeedService.java "aihr_model_provider" contains frontend/src/api/aihr/model.ts "/api/aihr/model/providers" contains frontend/src/api/aihr/model.ts "/api/aihr/model/configs" contains frontend/src/views/system/model/index.vue "submitProvider" contains frontend/src/views/system/model/index.vue "submitModel" contains backend/ruoyi-admin/src/main/java/org/dromara/web/controller/AuthController.java "/mobile/sms-login" contains backend/ruoyi-admin/src/main/java/org/dromara/web/controller/CaptchaController.java "aihr.sms.login-template-id" contains backend/ruoyi-modules/ruoyi-aihr/src/main/java/org/dromara/aihr/controller/AihrMobileController.java "/api/aihr/mobile" contains backend/ruoyi-modules/ruoyi-aihr/src/main/java/org/dromara/aihr/service/AihrMobileSeedService.java "candidateHome" echo "OK: demo routes and seed markers" echo "OK: AI interview API markers" echo "OK: AI practice API markers" echo "OK: AI case API markers" echo "OK: AI SOP API markers" echo "OK: ruoyi-ai incremental migration markers" echo "OK: AI model migration markers" echo "OK: AI model config page markers" echo "OK: AI mobile role home markers" echo "PASS: demo preflight"