From 3461c02560a59733a3192c171c9792e44be9dd69 Mon Sep 17 00:00:00 2001 From: yml2213 Date: Sat, 25 Jul 2026 16:31:42 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=94=B9=E6=9C=AC=E5=9C=B0dev?= =?UTF-8?q?=E5=B8=B8=E8=A7=81=E7=AB=AF=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 8 ++--- backend/.env.example | 8 ++--- backend/internal/config/config.go | 8 ++--- deploy/docker-compose.dev.yml | 8 ++--- docs/cf临时穿透.md | 8 ++--- frontend/vite.config.ts | 9 ++++-- scripts/dev.sh | 50 ++++++++++++++++++++++++------- 7 files changed, 66 insertions(+), 33 deletions(-) diff --git a/README.md b/README.md index 2fde578..d61f644 100644 --- a/README.md +++ b/README.md @@ -18,9 +18,9 @@ 脚本会自动启动 MySQL、Redis、MinIO,首次初始化数据库结构,并同时启动后端和前端。 -前端地址:`http://localhost:5173` +前端地址:`http://localhost:5189` -后台地址默认:`http://localhost:5173/admin/login`。可通过 `VITE_ADMIN_BASE_PATH` 调整后台页面入口。 +后台地址默认:`http://localhost:5189/admin/login`。可通过 `VITE_ADMIN_BASE_PATH` 调整后台页面入口。 如需拆分调试,可手动执行: @@ -31,7 +31,7 @@ cd backend cp .env.example .env go run github.com/pressly/goose/v3/cmd/goose@v3.27.1 \ -dir migrations \ - mysql 'hfb:secret@tcp(127.0.0.1:3306)/hfb_sys?charset=utf8mb4&parseTime=True&loc=Local&multiStatements=true' \ + mysql 'hfb:secret@tcp(127.0.0.1:13306)/hfb_sys?charset=utf8mb4&parseTime=True&loc=Local&multiStatements=true' \ up go run ./cmd/api @@ -63,7 +63,7 @@ npm run dev - 归还流程已支持租客提交归还、号主确认归还,完成后账号重新上架。 - 后端已接入开发态订单超时扫描任务,会按系统配置处理交接超时、确认收号超时、逾期未归还和确认归还超时。 - 文件上传已接入 MinIO,发布账号资产截图和申诉证据可上传 JPG、PNG、WebP 或 PDF。 -- 如果本机有代理工具占用 `127.0.0.1:9000`,MinIO 开发地址使用 `http://localhost:9000`。 +- MinIO 开发地址默认使用 `http://localhost:19090`,控制台默认使用 `http://localhost:19091`。 - 钱包账务当前为开发态模拟流水,可通过 `GET /api/wallet/balance` 和 `GET /api/wallet/ledger` 查看。 - 后台资金流水已接入,支持按用户、订单和业务类型查询。 - 站内信已支持订单关键节点自动写入,可通过 `GET /api/notifications` 查看。 diff --git a/backend/.env.example b/backend/.env.example index d5b1f03..e1d2a33 100644 --- a/backend/.env.example +++ b/backend/.env.example @@ -1,14 +1,14 @@ APP_ENV=development -APP_ADDR=:8080 +APP_ADDR=:18088 # MySQL 容器初始化变量,同时供后端 DSN 使用。 MYSQL_ROOT_PASSWORD=rootsecret MYSQL_DATABASE=hfb_sys MYSQL_USER=hfb MYSQL_PASSWORD=secret -MYSQL_DSN=hfb:secret@tcp(127.0.0.1:3306)/hfb_sys?charset=utf8mb4&parseTime=True&loc=Local +MYSQL_DSN=hfb:secret@tcp(127.0.0.1:13306)/hfb_sys?charset=utf8mb4&parseTime=True&loc=Local -REDIS_ADDR=127.0.0.1:6379 +REDIS_ADDR=127.0.0.1:16379 REDIS_PASSWORD= REDIS_DB=0 @@ -35,7 +35,7 @@ LOG_ENABLE_FILE=true # MinIO 容器初始化变量,同时供后端对象存储使用。 MINIO_ROOT_USER=minioadmin MINIO_ROOT_PASSWORD=minioadmin -STORAGE_ENDPOINT=http://localhost:9000 +STORAGE_ENDPOINT=http://localhost:19090 STORAGE_BUCKET=hfb-sys STORAGE_ACCESS_KEY_ID=minioadmin STORAGE_SECRET_ACCESS_KEY=minioadmin diff --git a/backend/internal/config/config.go b/backend/internal/config/config.go index f2af0ac..b3bc8fc 100644 --- a/backend/internal/config/config.go +++ b/backend/internal/config/config.go @@ -69,9 +69,9 @@ type RateLimitConfig struct { func Load() Config { return Config{ AppEnv: getEnv("APP_ENV", "development"), - AppAddr: getEnv("APP_ADDR", ":8080"), - MySQLDSN: getEnv("MYSQL_DSN", "hfb:secret@tcp(127.0.0.1:3306)/hfb_sys?charset=utf8mb4&parseTime=True&loc=Local"), - RedisAddr: getEnv("REDIS_ADDR", "127.0.0.1:6379"), + AppAddr: getEnv("APP_ADDR", ":18088"), + MySQLDSN: getEnv("MYSQL_DSN", "hfb:secret@tcp(127.0.0.1:13306)/hfb_sys?charset=utf8mb4&parseTime=True&loc=Local"), + RedisAddr: getEnv("REDIS_ADDR", "127.0.0.1:16379"), RedisPassword: getEnv("REDIS_PASSWORD", ""), RedisDB: getEnvInt("REDIS_DB", 0), JWTSecret: getEnv("JWT_SECRET", "change-me"), @@ -87,7 +87,7 @@ func Load() Config { BootstrapAdminPassword: getEnv("ADMIN_BOOTSTRAP_PASSWORD", ""), BootstrapAdminNickname: getEnv("ADMIN_BOOTSTRAP_NICKNAME", "超级管理员"), Storage: StorageConfig{ - Endpoint: getEnv("STORAGE_ENDPOINT", "http://localhost:9000"), + Endpoint: getEnv("STORAGE_ENDPOINT", "http://localhost:19090"), Bucket: getEnv("STORAGE_BUCKET", "hfb-sys"), AccessKeyID: getEnv("STORAGE_ACCESS_KEY_ID", "minioadmin"), SecretAccessKey: getEnv("STORAGE_SECRET_ACCESS_KEY", "minioadmin"), diff --git a/deploy/docker-compose.dev.yml b/deploy/docker-compose.dev.yml index cfd0845..e249a6b 100644 --- a/deploy/docker-compose.dev.yml +++ b/deploy/docker-compose.dev.yml @@ -10,7 +10,7 @@ services: MYSQL_PASSWORD: secret TZ: Asia/Shanghai ports: - - "3306:3306" + - "${DEV_MYSQL_PORT:-13306}:3306" volumes: - mysql_data:/var/lib/mysql healthcheck: @@ -24,7 +24,7 @@ services: container_name: hfb-redis restart: unless-stopped ports: - - "6379:6379" + - "${DEV_REDIS_PORT:-16379}:6379" volumes: - redis_data:/data healthcheck: @@ -43,8 +43,8 @@ services: MINIO_ROOT_PASSWORD: minioadmin TZ: Asia/Shanghai ports: - - "9000:9000" - - "9001:9001" + - "${DEV_MINIO_API_PORT:-19090}:9000" + - "${DEV_MINIO_CONSOLE_PORT:-19091}:9001" volumes: - minio_data:/data healthcheck: diff --git a/docs/cf临时穿透.md b/docs/cf临时穿透.md index 91007f2..dfb9b6e 100644 --- a/docs/cf临时穿透.md +++ b/docs/cf临时穿透.md @@ -1,6 +1,6 @@ -你这样配置,直接运行 `cloudflared tunnel run` 是**不能**成功把 `5173` 转发出去的。 +你这样配置,直接运行 `cloudflared tunnel run` 是**不能**成功把 `5189` 转发出去的。 虽然你用第一条命令把域名 `221329.cc.cd` 绑定到了你的隧道上,但第二条命令在执行时,**`--url` 参数会被直接忽略掉**。 @@ -11,7 +11,7 @@ `cloudflared` 的设计逻辑是: 当你使用 **命名隧道(Named Tunnel,即你创建的 `mac-mini-tunnel`)** 时,它**强制要求**使用本地的 `config.yml` 配置文件来管理转发规则(Ingress Rules),或者通过 Cloudflare 网页后台(Zero Trust Dashboard)来配置。 -你在命令行里强行拼凑的 `--url http://localhost:5173` 只有在运行临时隧道(Quick Tunnels,不指定隧道名的那种)时才会生效。 +你在命令行里强行拼凑的 `--url http://localhost:5189` 只有在运行临时隧道(Quick Tunnels,不指定隧道名的那种)时才会生效。 --- @@ -28,7 +28,7 @@ credentials-file: /Users/你的用户名/.cloudflared/你的隧道ID.json ingress: - hostname: 221329.cc.cd - service: http://localhost:5173 + service: http://localhost:5189 - service: http_status:404 ``` @@ -44,4 +44,4 @@ cloudflared tunnel run mac-mini-tunnel cloudflared tunnel route dns mac-mini-tunnel 221329.cc.cd -cloudflared tunnel run --url http://localhost:5173 mac-mini-tunnel +cloudflared tunnel run --url http://localhost:5189 mac-mini-tunnel diff --git a/frontend/vite.config.ts b/frontend/vite.config.ts index b9a4ad8..b82c12b 100644 --- a/frontend/vite.config.ts +++ b/frontend/vite.config.ts @@ -51,6 +51,10 @@ function stripVantRemoteIconFont() { } } +const frontendPort = Number(process.env.DEV_FRONTEND_PORT || process.env.PORT || 5189) +const backendPort = Number(process.env.DEV_BACKEND_PORT || 18088) +const apiProxyTarget = process.env.VITE_API_PROXY_TARGET || `http://127.0.0.1:${backendPort}` + export default defineConfig({ // 禁止 vite 清屏,避免把后端启动日志(GIN 路由、迁移等)从终端滚动缓冲里抹掉 clearScreen: false, @@ -74,9 +78,10 @@ export default defineConfig({ }, }, server: { - port: 5173, + port: frontendPort, + strictPort: true, proxy: { - '/api': 'http://127.0.0.1:8080', + '/api': apiProxyTarget, }, allowedHosts: [ '221329.cc.cd', diff --git a/scripts/dev.sh b/scripts/dev.sh index 6a2e66e..d79349a 100755 --- a/scripts/dev.sh +++ b/scripts/dev.sh @@ -12,8 +12,12 @@ FRONTEND_NODE_MODULES="${FRONTEND_DIR}/node_modules" FRONTEND_NODE_MODULES_LOCK="${FRONTEND_NODE_MODULES}/.package-lock.json" MIGRATIONS_DIR="${ROOT_DIR}/backend/migrations" MYSQL_DATABASE="${DEV_MYSQL_DATABASE:-hfb_sys}" -BACKEND_PORT="${DEV_BACKEND_PORT:-8080}" -FRONTEND_PORT="${DEV_FRONTEND_PORT:-5173}" +BACKEND_PORT="${DEV_BACKEND_PORT:-18088}" +FRONTEND_PORT="${DEV_FRONTEND_PORT:-5189}" +MYSQL_PORT="${DEV_MYSQL_PORT:-13306}" +REDIS_PORT="${DEV_REDIS_PORT:-16379}" +MINIO_API_PORT="${DEV_MINIO_API_PORT:-19090}" +MINIO_CONSOLE_PORT="${DEV_MINIO_CONSOLE_PORT:-19091}" BACKEND_HEALTH_URL="${DEV_BACKEND_HEALTH_URL:-http://127.0.0.1:${BACKEND_PORT}/health}" FRONTEND_HEALTH_URL="${DEV_FRONTEND_HEALTH_URL:-http://127.0.0.1:${FRONTEND_PORT}/}" HTTP_READY_TIMEOUT="${DEV_HTTP_READY_TIMEOUT:-120}" @@ -71,13 +75,21 @@ show_help() { DEV_RESET_DB=1 等同于 --reset-db DEV_MYSQL_DATABASE=hfb_sys 开发数据库名 - DEV_BACKEND_PORT=8080 + DEV_BACKEND_PORT=18088 后端启动端口 - DEV_FRONTEND_PORT=5173 + DEV_FRONTEND_PORT=5189 前端启动端口 - DEV_BACKEND_HEALTH_URL=http://127.0.0.1:8080/health + DEV_MYSQL_PORT=13306 + MySQL 宿主机映射端口 + DEV_REDIS_PORT=16379 + Redis 宿主机映射端口 + DEV_MINIO_API_PORT=19090 + MinIO API 宿主机映射端口 + DEV_MINIO_CONSOLE_PORT=19091 + MinIO 控制台宿主机映射端口 + DEV_BACKEND_HEALTH_URL=http://127.0.0.1:18088/health 后端健康检查地址 - DEV_FRONTEND_HEALTH_URL=http://127.0.0.1:5173/ + DEV_FRONTEND_HEALTH_URL=http://127.0.0.1:5189/ 前端健康检查地址 DEV_HTTP_READY_TIMEOUT=120 HTTP 服务就绪等待秒数 @@ -422,7 +434,7 @@ goose_dsn() { } dev_goose_dsn() { - goose_dsn "hfb:secret@tcp(127.0.0.1:3306)/${MYSQL_DATABASE}?charset=utf8mb4&parseTime=True&loc=Local" + goose_dsn "hfb:secret@tcp(127.0.0.1:${MYSQL_PORT})/${MYSQL_DATABASE}?charset=utf8mb4&parseTime=True&loc=Local" } goose_cmd() { @@ -458,10 +470,14 @@ start_backend() { cp "${BACKEND_ENV_EXAMPLE}" "${BACKEND_ENV}" fi - log "启动后端:http://localhost:8080" + log "启动后端:http://localhost:${BACKEND_PORT}" ( cd "${ROOT_DIR}/backend" load_env_file "${BACKEND_ENV}" + export APP_ADDR=":${BACKEND_PORT}" + export MYSQL_DSN="hfb:secret@tcp(127.0.0.1:${MYSQL_PORT})/${MYSQL_DATABASE}?charset=utf8mb4&parseTime=True&loc=Local" + export REDIS_ADDR="127.0.0.1:${REDIS_PORT}" + export STORAGE_ENDPOINT="http://localhost:${MINIO_API_PORT}" go run ./cmd/api ) & BACKEND_PID="$!" @@ -513,9 +529,12 @@ ensure_frontend_dependencies() { start_frontend() { ensure_frontend_dependencies - log "启动前端:http://localhost:5173" + log "启动前端:http://localhost:${FRONTEND_PORT}" ( cd "${FRONTEND_DIR}" + export DEV_FRONTEND_PORT="${FRONTEND_PORT}" + export DEV_BACKEND_PORT="${BACKEND_PORT}" + export VITE_API_PROXY_TARGET="${VITE_API_PROXY_TARGET:-http://127.0.0.1:${BACKEND_PORT}}" npm run dev ) & FRONTEND_PID="$!" @@ -558,7 +577,16 @@ main() { exit 1 fi + ensure_port_free "${MYSQL_PORT}" "MySQL" hfb-mysql + ensure_port_free "${REDIS_PORT}" "Redis" hfb-redis + ensure_port_free "${MINIO_API_PORT}" "MinIO API" hfb-minio + ensure_port_free "${MINIO_CONSOLE_PORT}" "MinIO 控制台" hfb-minio + log "启动开发依赖:MySQL、Redis、MinIO" + export DEV_MYSQL_PORT="${MYSQL_PORT}" + export DEV_REDIS_PORT="${REDIS_PORT}" + export DEV_MINIO_API_PORT="${MINIO_API_PORT}" + export DEV_MINIO_CONSOLE_PORT="${MINIO_CONSOLE_PORT}" docker compose -f "${COMPOSE_FILE}" up -d wait_container_healthy hfb-mysql "MySQL" @@ -588,8 +616,8 @@ main() { log_success "开发环境已启动" if [[ "${NO_FRONTEND}" == "0" ]]; then local admin_base_path="${VITE_ADMIN_BASE_PATH:-/admin}" - log "前台:http://localhost:5173" - log "后台:http://localhost:5173${admin_base_path%/}/login" + log "前台:http://localhost:${FRONTEND_PORT}" + log "后台:http://localhost:${FRONTEND_PORT}${admin_base_path%/}/login" fi log "按 Ctrl+C 停止前后端;Docker 依赖会保留运行"