agricultural-sock-amalysis/start.sh

315 lines
9.8 KiB
Bash

#!/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