315 lines
9.8 KiB
Bash
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 |