chore: initialize wygj monorepo
This commit is contained in:
Executable
+93
@@ -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"
|
||||
Executable
+27
@@ -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"
|
||||
Executable
+12
@@ -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
@@ -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
|
||||
Executable
+26
@@ -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';"
|
||||
Reference in New Issue
Block a user