chore: initialize wygj monorepo

This commit is contained in:
2026-07-03 01:25:10 +08:00
commit 62ffcb6e99
1248 changed files with 137340 additions and 0 deletions
+93
View File
@@ -0,0 +1,93 @@
#!/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}"
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/"
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 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 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_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"
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 "PASS: demo preflight"
+27
View File
@@ -0,0 +1,27 @@
#!/usr/bin/env bash
set -euo pipefail
ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
cd "$ROOT_DIR/backend"
mkdir -p "$ROOT_DIR/.data/import"
JAR="ruoyi-admin/target/ruoyi-admin.jar"
NEEDS_BUILD=false
if [[ ! -f "$JAR" ]]; then
NEEDS_BUILD=true
elif find ruoyi-admin ruoyi-common ruoyi-modules -type f \( -name '*.java' -o -name '*.xml' -o -name '*.yml' -o -name 'pom.xml' \) -newer "$JAR" -print -quit | grep -q .; then
NEEDS_BUILD=true
fi
if [[ "$NEEDS_BUILD" == true ]]; then
mvn -pl ruoyi-admin -am -DskipTests package
fi
exec java -jar "$JAR" \
"--spring.datasource.dynamic.datasource.master.url=jdbc:mysql://localhost:13306/ry-vue?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&serverTimezone=GMT%2B8&autoReconnect=true&rewriteBatchedStatements=true&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true" \
"--spring.data.redis.port=16379" \
"--spring.boot.admin.client.enabled=false" \
"--snail-job.enabled=false" \
"--aihr.import.root=$ROOT_DIR/.data/import"
+12
View File
@@ -0,0 +1,12 @@
#!/usr/bin/env bash
set -euo pipefail
ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
cd "$ROOT_DIR/frontend"
if [[ ! -d node_modules ]]; then
npm install --registry=https://registry.npmmirror.com
fi
exec npm run dev -- --host 127.0.0.1 --port 5173 --strictPort
Executable
+156
View File
@@ -0,0 +1,156 @@
#!/usr/bin/env bash
set -euo pipefail
ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
PIDS=()
usage() {
cat <<'EOF'
Usage: ./scripts/dev.sh [start|stop|restart|status|--reset]
Starts MySQL, Redis, MinIO, Qdrant, backend and frontend.
start start local demo services
stop stop backend and frontend dev processes
restart stop backend and frontend, then start again
status show local demo process status
--reset rebuild local demo database before starting services
EOF
}
cleanup() {
trap - INT TERM EXIT
for pid in "${PIDS[@]}"; do
kill "$pid" >/dev/null 2>&1 || true
done
}
ensure_docker() {
if docker info >/dev/null 2>&1; then
return
fi
if [[ "$(uname -s)" == "Darwin" ]] && [[ -d /Applications/Docker.app ]]; then
echo "Docker daemon is not running. Opening Docker Desktop..."
open -a Docker
for _ in {1..90}; do
if docker info >/dev/null 2>&1; then
echo "Docker daemon is ready."
return
fi
sleep 2
done
fi
echo "Docker daemon is not running. Start Docker Desktop, then run ./scripts/dev.sh again." >&2
exit 1
}
ensure_port_free() {
local port="$1"
if lsof -nP -iTCP:"$port" -sTCP:LISTEN >/dev/null 2>&1; then
echo "Port $port is already in use:" >&2
lsof -nP -iTCP:"$port" -sTCP:LISTEN >&2
echo "Stop the existing process, then run ./scripts/dev.sh again." >&2
exit 1
fi
}
stop_port() {
local port="$1"
local pids
pids="$(lsof -tiTCP:"$port" -sTCP:LISTEN || true)"
if [[ -z "$pids" ]]; then
echo "Port $port is not in use."
return
fi
echo "Stopping port $port: $pids"
kill $pids >/dev/null 2>&1 || true
for _ in {1..20}; do
if ! lsof -nP -iTCP:"$port" -sTCP:LISTEN >/dev/null 2>&1; then
return
fi
sleep 0.2
done
kill -9 $pids >/dev/null 2>&1 || true
}
stop_dev() {
stop_port 8080
stop_port 5173
}
status() {
docker compose -f docker-compose.dev.yml ps
lsof -nP -iTCP:8080 -sTCP:LISTEN || true
lsof -nP -iTCP:5173 -sTCP:LISTEN || true
}
if [[ "${1:-}" == "--help" || "${1:-}" == "-h" ]]; then
usage
exit 0
fi
COMMAND="${1:-start}"
RESET=false
case "$COMMAND" in
start)
;;
--reset)
COMMAND="start"
RESET=true
;;
stop)
cd "$ROOT_DIR"
stop_dev
exit 0
;;
restart)
cd "$ROOT_DIR"
stop_dev
COMMAND="start"
;;
status)
cd "$ROOT_DIR"
status
exit 0
;;
*)
usage
exit 1
;;
esac
cd "$ROOT_DIR"
ensure_docker
ensure_port_free 8080
ensure_port_free 5173
if [[ "$RESET" == true ]]; then
./scripts/reset-dev-db.sh
else
docker compose -f docker-compose.dev.yml up -d mysql redis qdrant minio minio-init
fi
trap cleanup INT TERM EXIT
./scripts/dev-backend.sh &
PIDS+=("$!")
./scripts/dev-frontend.sh &
PIDS+=("$!")
echo "Backend: http://127.0.0.1:8080/"
echo "Frontend: http://127.0.0.1:5173/"
echo "Qdrant: http://127.0.0.1:6333/"
echo "Press Ctrl+C to stop backend and frontend."
while :; do
for pid in "${PIDS[@]}"; do
if ! kill -0 "$pid" >/dev/null 2>&1; then
wait "$pid"
exit $?
fi
done
sleep 2
done
+26
View File
@@ -0,0 +1,26 @@
#!/usr/bin/env bash
set -euo pipefail
ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
cd "$ROOT_DIR"
docker compose -f docker-compose.dev.yml up -d mysql redis qdrant minio minio-init
for _ in {1..60}; do
if docker exec wygj-mysql mysqladmin ping -uroot -proot --silent >/dev/null 2>&1; then
break
fi
sleep 2
done
docker exec wygj-mysql mysql -uroot -proot --default-character-set=utf8mb4 \
-e "drop database if exists \`ry-vue\`; create database \`ry-vue\` default character set utf8mb4 collate utf8mb4_general_ci;"
docker exec -i wygj-mysql mysql -uroot -proot --default-character-set=utf8mb4 ry-vue < "$ROOT_DIR/backend/script/sql/ry_vue_5.X.sql"
docker exec -i wygj-mysql mysql -uroot -proot --default-character-set=utf8mb4 ry-vue < "$ROOT_DIR/backend/script/sql/ry_job.sql"
docker exec -i wygj-mysql mysql -uroot -proot --default-character-set=utf8mb4 ry-vue < "$ROOT_DIR/backend/script/sql/ry_workflow.sql"
docker exec -i wygj-mysql mysql -uroot -proot --default-character-set=utf8mb4 ry-vue < "$ROOT_DIR/backend/script/sql/aihr_knowledge_mysql8.sql"
docker exec -i wygj-mysql mysql -uroot -proot --default-character-set=utf8mb4 ry-vue < "$ROOT_DIR/backend/script/sql/aihr_model_mysql8.sql"
docker exec wygj-mysql mysql -uroot -proot --default-character-set=utf8mb4 ry-vue \
-e "select count(*) as tables_count from information_schema.tables where table_schema = 'ry-vue';"