first commit
This commit is contained in:
315
start.sh
Normal file
315
start.sh
Normal file
@@ -0,0 +1,315 @@
|
||||
#!/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
|
||||
Reference in New Issue
Block a user