#!/bin/bash # 农业领域上市公司行情可视化监控平台启动脚本 # 作者: Agricultural Stock Platform Team echo "==========================================" echo "农业上市公司行情监控平台启动脚本" echo "==========================================" # 检查Docker和Docker Compose是否安装 check_dependencies() { echo "检查依赖..." if ! command -v docker &> /dev/null; then echo "❌ Docker 未安装,请先安装 Docker" exit 1 fi if ! command -v docker-compose &> /dev/null; then echo "❌ Docker Compose 未安装,请先安装 Docker Compose" exit 1 fi echo "✅ Docker 和 Docker Compose 已安装" } # 创建必要的目录 create_directories() { echo "创建项目目录..." mkdir -p sql mkdir -p nginx/conf.d mkdir -p data mkdir -p logs mkdir -p output echo "✅ 目录创建完成" } # 创建数据库初始化脚本 create_init_sql() { echo "创建数据库初始化脚本..." cat > sql/init.sql << 'EOF' -- 农业股票数据库初始化脚本 CREATE DATABASE IF NOT EXISTS agricultural_stock CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; USE agricultural_stock; -- 股票数据表 CREATE TABLE IF NOT EXISTS stock_data ( id BIGINT AUTO_INCREMENT PRIMARY KEY, stock_code VARCHAR(10) NOT NULL COMMENT '股票代码', stock_name VARCHAR(100) NOT NULL COMMENT '股票名称', open_price DECIMAL(10,2) COMMENT '开盘价', close_price DECIMAL(10,2) COMMENT '收盘价', high_price DECIMAL(10,2) COMMENT '最高价', low_price DECIMAL(10,2) COMMENT '最低价', volume BIGINT COMMENT '成交量', turnover DECIMAL(15,2) COMMENT '成交额', change_percent DECIMAL(5,2) COMMENT '涨跌幅(%)', change_amount DECIMAL(10,2) COMMENT '涨跌额', total_shares BIGINT COMMENT '总股本', float_shares BIGINT COMMENT '流通股本', market_cap DECIMAL(15,2) COMMENT '总市值', float_market_cap DECIMAL(15,2) COMMENT '流通市值', pe_ratio DECIMAL(8,2) COMMENT '市盈率', pb_ratio DECIMAL(8,2) COMMENT '市净率', trade_date DATETIME NOT NULL COMMENT '交易日期', create_time DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', update_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', deleted TINYINT DEFAULT 0 COMMENT '是否删除' ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='股票数据表'; -- 创建索引 CREATE INDEX idx_stock_code ON stock_data(stock_code); CREATE INDEX idx_trade_date ON stock_data(trade_date); CREATE INDEX idx_stock_trade ON stock_data(stock_code, trade_date); -- 预测数据表 CREATE TABLE IF NOT EXISTS stock_prediction ( id BIGINT AUTO_INCREMENT PRIMARY KEY, stock_code VARCHAR(10) NOT NULL COMMENT '股票代码', stock_name VARCHAR(100) NOT NULL COMMENT '股票名称', predict_date DATE NOT NULL COMMENT '预测日期', predict_price DECIMAL(10,2) COMMENT '预测价格', confidence DECIMAL(5,2) COMMENT '置信度', model_version VARCHAR(50) COMMENT '模型版本', create_time DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', update_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间' ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='股票预测数据表'; -- 创建索引 CREATE INDEX idx_prediction_stock ON stock_prediction(stock_code); CREATE INDEX idx_prediction_date ON stock_prediction(predict_date); -- 市场分析表 CREATE TABLE IF NOT EXISTS market_analysis ( id BIGINT AUTO_INCREMENT PRIMARY KEY, analysis_date DATE NOT NULL COMMENT '分析日期', up_count INT COMMENT '上涨股票数', down_count INT COMMENT '下跌股票数', flat_count INT COMMENT '平盘股票数', total_count INT COMMENT '总股票数', total_market_cap DECIMAL(15,2) COMMENT '总市值', total_volume BIGINT COMMENT '总成交量', total_turnover DECIMAL(15,2) COMMENT '总成交额', avg_change_percent DECIMAL(5,2) COMMENT '平均涨跌幅', create_time DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间' ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='市场分析表'; -- 创建索引 CREATE INDEX idx_analysis_date ON market_analysis(analysis_date); -- 插入示例数据 INSERT INTO stock_data (stock_code, stock_name, open_price, close_price, high_price, low_price, volume, turnover, change_percent, change_amount, market_cap, trade_date) VALUES ('sz000876', '新希望', 15.20, 15.45, 15.68, 15.10, 5678900, 87654321.50, 1.64, 0.25, 12500000000.00, '2024-01-15 15:00:00'), ('sz002714', '牧原股份', 52.30, 53.20, 54.50, 51.80, 3456789, 183456789.20, 1.72, 0.90, 35600000000.00, '2024-01-15 15:00:00'), ('sh600519', '贵州茅台', 1685.00, 1698.50, 1705.00, 1680.00, 1234567, 2098765432.10, 0.80, 13.50, 2135000000000.00, '2024-01-15 15:00:00'), ('sz000858', '五粮液', 138.50, 140.20, 142.00, 137.80, 2345678, 328765432.60, 1.23, 1.70, 541200000000.00, '2024-01-15 15:00:00'), ('sh600887', '伊利股份', 32.10, 32.65, 33.20, 31.95, 4567890, 149876543.20, 1.71, 0.55, 205800000000.00, '2024-01-15 15:00:00'); COMMIT; EOF echo "✅ 数据库初始化脚本创建完成" } # 创建Nginx配置 create_nginx_config() { echo "创建Nginx配置..." cat > nginx/nginx.conf << 'EOF' events { worker_connections 1024; } http { include /etc/nginx/mime.types; default_type application/octet-stream; log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; access_log /var/log/nginx/access.log main; sendfile on; keepalive_timeout 65; # Gzip压缩 gzip on; gzip_vary on; gzip_min_length 1000; gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript; include /etc/nginx/conf.d/*.conf; } EOF cat > nginx/conf.d/default.conf << 'EOF' upstream backend { server backend:8080; } upstream frontend { server frontend:80; } server { listen 80; server_name localhost; # 前端静态资源 location / { proxy_pass http://frontend; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } # 后端API location /api/ { proxy_pass http://backend; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; # WebSocket支持 proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; } # WebSocket连接 location /ws/ { proxy_pass http://backend; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } } EOF echo "✅ Nginx配置创建完成" } # 构建和启动服务 start_services() { echo "构建和启动服务..." # 停止现有服务 docker-compose down # 构建镜像 echo "构建Docker镜像..." docker-compose build # 启动服务 echo "启动服务..." docker-compose up -d echo "✅ 服务启动完成" } # 等待服务就绪 wait_for_services() { echo "等待服务启动..." # 等待MySQL就绪 echo "等待MySQL就绪..." for i in {1..30}; do if docker-compose exec -T mysql mysqladmin ping -h localhost --silent; then echo "✅ MySQL已就绪" break fi echo "等待MySQL启动... ($i/30)" sleep 2 done # 等待后端服务就绪 echo "等待后端服务就绪..." for i in {1..30}; do if curl -f http://localhost:8080/api/actuator/health > /dev/null 2>&1; then echo "✅ 后端服务已就绪" break fi echo "等待后端服务启动... ($i/30)" sleep 2 done echo "✅ 所有服务已就绪" } # 显示访问信息 show_access_info() { echo "" echo "==========================================" echo "🎉 农业上市公司行情监控平台启动成功!" echo "==========================================" echo "" echo "📊 前端访问地址:" echo " http://localhost:3000" echo "" echo "🔧 后端API地址:" echo " http://localhost:8080/api" echo "" echo "📖 API文档地址:" echo " http://localhost:8080/api/swagger-ui/" echo "" echo "💾 数据库管理:" echo " 主机: localhost:3306" echo " 用户: root" echo " 密码: 123456" echo " 数据库: agricultural_stock" echo "" echo "⚡ Spark Web UI:" echo " http://localhost:8081" echo "" echo "📓 Jupyter Notebook:" echo " http://localhost:8888" echo "" echo "🔍 查看服务状态:" echo " docker-compose ps" echo "" echo "📋 查看日志:" echo " docker-compose logs -f [service_name]" echo "" echo "🛑 停止服务:" echo " docker-compose down" echo "" echo "==========================================" } # 主函数 main() { check_dependencies create_directories create_init_sql create_nginx_config start_services wait_for_services show_access_info } # 如果直接执行脚本 if [[ "${BASH_SOURCE[0]}" == "${0}" ]]; then main "$@" fi