feat: WWJCloud 企业级全栈框架 v0.3.5 完整更新

🚀 核心更新:
-  完善 NestJS 企业级架构设计
-  优化配置中心和基础设施层
-  增强第三方服务集成能力
-  完善多租户架构支持
- 🎯 对标 Java Spring Boot 和 PHP ThinkPHP

📦 新增文件:
- wwjcloud-nest 完整框架结构
- Docker 容器化配置
- 管理后台界面
- 数据库迁移脚本

🔑 Key: ebb38b43ec39f355f071294fd1cf9c42
This commit is contained in:
wanwu
2025-10-13 01:27:37 +08:00
parent 16892939a6
commit 2285206b3f
1695 changed files with 260750 additions and 19 deletions

25
docker/Dockerfile Normal file
View File

@@ -0,0 +1,25 @@
FROM node:20-alpine AS builder
WORKDIR /app
# Install dependencies
COPY package*.json ./
RUN npm ci --omit=dev
# Copy source
COPY . .
# Build (if needed)
RUN npm run build || true
FROM node:20-alpine
WORKDIR /app
ENV NODE_ENV=production
COPY --from=builder /app /app
EXPOSE 3000
CMD ["node", "dist/main.js"]

106
docker/auto-test.sh Executable file
View File

@@ -0,0 +1,106 @@
#!/bin/bash
# WWJCloud Docker 自动测试脚本
# ========================================
# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color
# 日志函数
log_info() { echo -e "${BLUE}[INFO]${NC} $1"; }
log_success() { echo -e "${GREEN}[SUCCESS]${NC} $1"; }
log_warning() { echo -e "${YELLOW}[WARNING]${NC} $1"; }
log_error() { echo -e "${RED}[ERROR]${NC} $1"; }
# 测试计数器
TESTS_PASSED=0
TESTS_FAILED=0
TOTAL_TESTS=0
# 测试函数
run_test() {
local test_name="$1"
local test_command="$2"
TOTAL_TESTS=$((TOTAL_TESTS + 1))
log_info "测试 $TOTAL_TESTS: $test_name"
if eval "$test_command" >/dev/null 2>&1; then
log_success "$test_name - 通过"
TESTS_PASSED=$((TESTS_PASSED + 1))
return 0
else
log_error "$test_name - 失败"
TESTS_FAILED=$((TESTS_FAILED + 1))
return 1
fi
}
# 主测试函数
main() {
echo "🚀 WWJCloud Docker 自动测试开始..."
echo "========================================"
# 1. 检查容器状态
log_info "检查容器运行状态..."
run_test "MySQL 容器运行" "docker ps | grep wwjcloud-mysql | grep Up"
run_test "Redis 容器运行" "docker ps | grep wwjcloud-redis | grep Up"
# 2. 等待服务就绪
log_info "等待服务完全启动..."
sleep 10
# 3. 测试 MySQL 连接
log_info "测试 MySQL 数据库连接..."
run_test "MySQL Root 用户连接" "docker exec wwjcloud-mysql mysql -u root -pwwjcloud -e 'SELECT 1;'"
run_test "MySQL wwjcloud 用户连接" "docker exec wwjcloud-mysql mysql -u wwjcloud -pwwjcloud -e 'SELECT 1;'"
run_test "MySQL 数据库存在" "docker exec wwjcloud-mysql mysql -u wwjcloud -pwwjcloud -e 'USE wwjcloud; SHOW TABLES;'"
# 4. 测试 Redis 连接
log_info "测试 Redis 缓存连接..."
run_test "Redis 连接测试" "docker exec wwjcloud-redis redis-cli -a redis123456 ping"
run_test "Redis 读写测试" "docker exec wwjcloud-redis redis-cli -a redis123456 set test_key 'test_value' && docker exec wwjcloud-redis redis-cli -a redis123456 get test_key"
# 5. 测试网络连通性
log_info "测试网络连通性..."
run_test "MySQL 端口访问" "nc -z localhost 3306"
run_test "Redis 端口访问" "nc -z localhost 6379"
# 6. 测试健康检查
log_info "测试服务健康状态..."
run_test "MySQL 健康检查" "docker exec wwjcloud-mysql mysqladmin ping -h localhost -u root -pwwjcloud"
run_test "Redis 健康检查" "docker exec wwjcloud-redis redis-cli -a redis123456 ping"
# 7. 测试数据持久化
log_info "测试数据持久化..."
run_test "MySQL 数据写入" "docker exec wwjcloud-mysql mysql -u wwjcloud -pwwjcloud -e 'USE wwjcloud; CREATE TABLE IF NOT EXISTS test_table (id INT PRIMARY KEY, name VARCHAR(50));'"
run_test "MySQL 数据读取" "docker exec wwjcloud-mysql mysql -u wwjcloud -pwwjcloud -e 'USE wwjcloud; INSERT INTO test_table VALUES (2, \"test2\") ON DUPLICATE KEY UPDATE name=\"test2\"; SELECT * FROM test_table;'"
# 输出测试结果
echo ""
echo "========================================"
echo "📊 测试结果汇总"
echo "========================================"
echo "总测试数: $TOTAL_TESTS"
echo "通过: $TESTS_PASSED"
echo "失败: $TESTS_FAILED"
if [ $TESTS_FAILED -eq 0 ]; then
log_success "🎉 所有测试通过WWJCloud Docker 环境运行正常"
echo ""
echo "🌐 访问信息:"
echo "MySQL: localhost:3306 (用户: wwjcloud, 密码: wwjcloud, 数据库: wwjcloud)"
echo "Redis: localhost:6379 (密码: redis123456)"
exit 0
else
log_error "❌ 有 $TESTS_FAILED 个测试失败,请检查服务状态"
exit 1
fi
}
# 运行主函数
main "$@"

View File

@@ -9,22 +9,22 @@ services:
container_name: wwjcloud-mysql
restart: unless-stopped
environment:
MYSQL_ROOT_PASSWORD: root123456
MYSQL_ROOT_PASSWORD: wwjcloud
MYSQL_DATABASE: wwjcloud
MYSQL_USER: wwjcloud
MYSQL_PASSWORD: wwjcloud123
MYSQL_PASSWORD: wwjcloud
TZ: Asia/Shanghai
ports:
- "3306:3306"
volumes:
- mysql_data:/var/lib/mysql
- ./sql:/docker-entrypoint-initdb.d
- wwjcloud_mysql_data:/var/lib/mysql
- ../../sql:/docker-entrypoint-initdb.d
command:
- --character-set-server=utf8mb4
- --collation-server=utf8mb4_unicode_ci
- --default-authentication-plugin=mysql_native_password
healthcheck:
test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-u", "root", "-proot123456"]
test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-u", "root", "-pwwjcloud"]
interval: 10s
timeout: 5s
retries: 5
@@ -41,7 +41,7 @@ services:
ports:
- "6379:6379"
volumes:
- redis_data:/data
- wwjcloud_redis_data:/data
command: redis-server --appendonly yes --requirepass redis123456
healthcheck:
test: ["CMD", "redis-cli", "-a", "redis123456", "ping"]
@@ -56,8 +56,8 @@ services:
# ========================================
nestjs-backend:
build:
context: ./wwjcloud-nest
dockerfile: Dockerfile
context: ..
dockerfile: docker/Dockerfile
container_name: wwjcloud-nestjs
restart: unless-stopped
ports:
@@ -77,7 +77,7 @@ services:
DB_HOST: mysql
DB_PORT: 3306
DB_USERNAME: wwjcloud
DB_PASSWORD: wwjcloud123
DB_PASSWORD: wwjcloud
DB_DATABASE: wwjcloud
DB_SYNC: false
DB_LOGGING: false
@@ -145,7 +145,7 @@ services:
# ========================================
admin-frontend:
build:
context: ./wwjcloud-nest/admin
context: ../admin
dockerfile: Dockerfile
container_name: wwjcloud-admin
restart: unless-stopped
@@ -166,9 +166,9 @@ services:
# 数据卷
# ========================================
volumes:
mysql_data:
wwjcloud_mysql_data:
driver: local
redis_data:
wwjcloud_redis_data:
driver: local
# ========================================

View File

@@ -40,6 +40,18 @@ record_info() {
echo -e "${BLUE} 信息: $1${NC}"
}
############################################################
# 使用脚本所在目录的 docker-compose.yml
############################################################
SCRIPT_DIR=$(cd "$(dirname "$0")" && pwd)
export COMPOSE_FILE="$SCRIPT_DIR/docker-compose.yml"
record_info "使用的 Compose 文件: $COMPOSE_FILE"
# 清理旧容器与孤儿,确保干净环境
record_info "清理旧容器与孤儿..."
docker-compose down -v --remove-orphans >/dev/null 2>&1 || true
record_success "环境清理完成"
echo "📋 测试阶段1: 环境准备"
echo "=================================================="
@@ -68,7 +80,7 @@ echo "=================================================="
# 测试迁移工具
record_info "测试迁移工具..."
cd tools
cd "$SCRIPT_DIR/../../tools"
# 测试PHP文件发现工具
if node -e "const PHPFileDiscovery = require('./php-file-discovery.js'); const discovery = new PHPFileDiscovery(); discovery.run(); console.log('PHP文件发现工具测试通过');" 2>/dev/null; then
@@ -112,7 +124,7 @@ else
record_error "迁移协调器失败"
fi
cd ..
cd "$SCRIPT_DIR/../.."
echo ""
echo "📋 测试阶段3: 构建Docker镜像"

68
docker/start-all.sh Normal file
View File

@@ -0,0 +1,68 @@
#!/bin/bash
set -e
# Resolve compose file
SCRIPT_DIR=$(cd "$(dirname "$0")" && pwd)
COMPOSE_FILE="$SCRIPT_DIR/docker-compose.yml"
echo "📦 Using compose file: $COMPOSE_FILE"
export COMPOSE_FILE="$COMPOSE_FILE"
echo "🧹 Cleaning up any existing stack (containers, orphans)..."
docker-compose down -v --remove-orphans || true
# Remove any leftover containers with conflicting names
echo "🧹 Removing leftover named containers if exist..."
docker rm -f wwjcloud-redis >/dev/null 2>&1 || true
docker rm -f wwjcloud-mysql >/dev/null 2>&1 || true
docker rm -f wwjcloud-nestjs >/dev/null 2>&1 || true
if [ "$SKIP_BUILD" = "1" ]; then
echo "⏭️ Skipping image builds (using local images). Set SKIP_BUILD=0 to force build."
else
echo "🚀 Building images (backend, admin)..."
docker-compose build nestjs-backend admin-frontend
fi
echo "🧩 Starting MySQL and Redis..."
docker-compose up -d mysql redis
echo "⏳ Waiting for DB services to be ready..."
sleep 20
echo "🚀 Starting backend..."
if [ "$SKIP_BUILD" = "1" ]; then
docker-compose up -d --no-build nestjs-backend
else
docker-compose up -d nestjs-backend
fi
echo "⏳ Waiting for backend health..."
ATTEMPTS=0
until curl -sf http://localhost:3000/health > /dev/null 2>&1 || [ $ATTEMPTS -ge 15 ]; do
ATTEMPTS=$((ATTEMPTS+1))
sleep 4
done
echo "🚀 Starting admin frontend..."
if [ "$SKIP_BUILD" = "1" ]; then
docker-compose up -d --no-build admin-frontend
else
docker-compose up -d admin-frontend
fi
echo "⏳ Waiting for admin to be ready..."
sleep 15
echo "✅ Services are up."
echo "🌐 Admin: http://localhost"
echo "🔧 API: http://localhost:3000"
echo "📊 Status:"
docker-compose ps
echo "📦 Docker containers:"
docker ps --format "table {{.Names}}\t{{.Status}}\t{{.Ports}}"

View File

@@ -1,13 +1,17 @@
#!/bin/bash
echo "╔════════════════════════════════════════════════════════════════════════════╗"
echo "║ 🚀 启动开发环境MySQL + Redis + 本地服务) ║"
echo "║ 🚀 启动开发环境MySQL + Redis ║"
echo "╚════════════════════════════════════════════════════════════════════════════╝"
echo ""
SCRIPT_DIR=$(cd "$(dirname "$0")" && pwd)
COMPOSE_DEV="$SCRIPT_DIR/docker-compose.dev.yml"
export COMPOSE_FILE="$COMPOSE_DEV"
# 步骤1: 启动MySQL和Redis
echo "📦 步骤1: 启动MySQL和Redis容器..."
docker-compose -f docker-compose.dev.yml up -d
docker-compose up -d
# 等待服务就绪
echo "⏳ 等待MySQL和Redis就绪..."
@@ -16,7 +20,7 @@ sleep 10
# 检查服务状态
echo ""
echo "📊 服务状态:"
docker-compose -f docker-compose.dev.yml ps
docker-compose ps
echo ""
echo "✅ MySQL和Redis已启动"
@@ -26,6 +30,6 @@ echo " MySQL: localhost:3306"
echo " Redis: localhost:6379"
echo ""
echo "📋 下一步:"
echo " 1. 启动NestJS: cd wwjcloud-nest && npm run start:dev"
echo " 2. 启动Admin: cd wwjcloud-nest/admin && npm run dev"
echo " 1. 启动NestJS: cd $SCRIPT_DIR/.. && npm run start:dev"
echo " 2. 启动Admin: cd $SCRIPT_DIR/../admin && npm run dev"
echo ""

View File

@@ -5,6 +5,10 @@ echo "║ 🚀 启动生产环境完整Docker部署
echo "╚════════════════════════════════════════════════════════════════════════════╝"
echo ""
SCRIPT_DIR=$(cd "$(dirname "$0")" && pwd)
COMPOSE_FILE_PATH="$SCRIPT_DIR/docker-compose.yml"
export COMPOSE_FILE="$COMPOSE_FILE_PATH"
# 步骤1: 构建并启动所有服务
echo "📦 步骤1: 构建并启动所有服务..."
docker-compose up -d --build