update pay ui
This commit is contained in:
@@ -1,12 +1,12 @@
|
|||||||
# ============================================================================
|
# ============================================================================
|
||||||
# 110.42.32.207 Nginx 配置
|
# 110.42.32.207 Nginx 配置
|
||||||
# API 服务器 - 处理所有后端 API 和代理请求
|
# API 服务<EFBFBD>?- 处理所有后<EFBFBD>?API 和代理请<EFBFBD>?
|
||||||
#
|
#
|
||||||
# 部署步骤:
|
# 部署步骤<EFBFBD>?
|
||||||
# 1. 上传到服务器: scp nginx-110.42.32.207.conf ubuntu@110.42.32.207:/tmp/
|
# 1. 上传到服务器: scp nginx-110.42.32.207.conf ubuntu@110.42.32.207:/tmp/
|
||||||
# 2. 复制配置: sudo cp /tmp/nginx-110.42.32.207.conf /etc/nginx/sites-available/api.conf
|
# 2. 复制配置: sudo cp /tmp/nginx-110.42.32.207.conf /etc/nginx/sites-available/api.conf
|
||||||
# 3. 启用配置: sudo ln -s /etc/nginx/sites-available/api.conf /etc/nginx/sites-enabled/
|
# 3. 启用配置: sudo ln -s /etc/nginx/sites-available/api.conf /etc/nginx/sites-enabled/
|
||||||
# 4. 申请证书: sudo certbot --nginx -d api.valuefrontier.cn (或使用其他方式)
|
# 4. 申请证书: sudo certbot --nginx -d api.valuefrontier.cn (或使用其他方<EFBFBD>?
|
||||||
# 5. 测试重载: sudo nginx -t && sudo systemctl reload nginx
|
# 5. 测试重载: sudo nginx -t && sudo systemctl reload nginx
|
||||||
# ============================================================================
|
# ============================================================================
|
||||||
|
|
||||||
@@ -42,10 +42,10 @@ server {
|
|||||||
|
|
||||||
# SSL 证书配置
|
# SSL 证书配置
|
||||||
# 方式1: 使用 IP 证书(需要购买)
|
# 方式1: 使用 IP 证书(需要购买)
|
||||||
# 方式2: 使用自签名证书(CDN 回源可以配置为 HTTP)
|
# 方式2: 使用自签名证书(CDN 回源可以配置<EFBFBD>?HTTP<EFBFBD>?
|
||||||
# 方式3: 如果有域名指向这台服务器,用 Let's Encrypt
|
# 方式3: 如果有域名指向这台服务器,用 Let's Encrypt
|
||||||
#
|
#
|
||||||
# 临时使用自签名证书(生产环境建议使用正式证书):
|
# 临时使用自签名证书(生产环境建议使用正式证书<EFBFBD>?
|
||||||
# sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 \
|
# sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 \
|
||||||
# -keyout /etc/nginx/ssl/server.key \
|
# -keyout /etc/nginx/ssl/server.key \
|
||||||
# -out /etc/nginx/ssl/server.crt \
|
# -out /etc/nginx/ssl/server.crt \
|
||||||
@@ -60,7 +60,7 @@ server {
|
|||||||
ssl_session_timeout 1d;
|
ssl_session_timeout 1d;
|
||||||
|
|
||||||
# ============================================
|
# ============================================
|
||||||
# CORS 配置(允许 CDN 域名访问)
|
# CORS 配置(允<EFBFBD>?CDN 域名访问<EFBFBD>?
|
||||||
# ============================================
|
# ============================================
|
||||||
set $cors_origin 'https://valuefrontier.cn';
|
set $cors_origin 'https://valuefrontier.cn';
|
||||||
|
|
||||||
@@ -71,7 +71,7 @@ server {
|
|||||||
# }
|
# }
|
||||||
|
|
||||||
# ============================================
|
# ============================================
|
||||||
# Flask API 代理(本地 gunicorn)
|
# Flask API 代理(本<EFBFBD>?gunicorn<EFBFBD>?
|
||||||
# ============================================
|
# ============================================
|
||||||
location /api/ {
|
location /api/ {
|
||||||
# 处理 OPTIONS 预检请求
|
# 处理 OPTIONS 预检请求
|
||||||
@@ -84,13 +84,11 @@ server {
|
|||||||
add_header 'Content-Length' 0;
|
add_header 'Content-Length' 0;
|
||||||
return 204;
|
return 204;
|
||||||
}
|
}
|
||||||
|
proxy_hide_header Access-Control-Allow-Origin;
|
||||||
# 隐藏后端返回的 CORS 头(避免重复)
|
proxy_hide_header Access-Control-Allow-Credentials;
|
||||||
proxy_hide_header 'Access-Control-Allow-Origin';
|
proxy_hide_header Access-Control-Allow-Methods;
|
||||||
proxy_hide_header 'Access-Control-Allow-Credentials';
|
proxy_hide_header Access-Control-Allow-Headers;
|
||||||
proxy_hide_header 'Access-Control-Allow-Methods';
|
proxy_hide_header Access-Control-Expose-Headers;
|
||||||
proxy_hide_header 'Access-Control-Allow-Headers';
|
|
||||||
proxy_hide_header 'Access-Control-Expose-Headers';
|
|
||||||
|
|
||||||
proxy_pass http://127.0.0.1:5001;
|
proxy_pass http://127.0.0.1:5001;
|
||||||
proxy_http_version 1.1;
|
proxy_http_version 1.1;
|
||||||
@@ -100,7 +98,7 @@ server {
|
|||||||
proxy_set_header X-Forwarded-Proto $scheme;
|
proxy_set_header X-Forwarded-Proto $scheme;
|
||||||
proxy_set_header Connection "";
|
proxy_set_header Connection "";
|
||||||
|
|
||||||
# 统一添加 CORS 头
|
# 统一添加 CORS <EFBFBD>?
|
||||||
add_header 'Access-Control-Allow-Origin' $cors_origin always;
|
add_header 'Access-Control-Allow-Origin' $cors_origin always;
|
||||||
add_header 'Access-Control-Allow-Credentials' 'true' always;
|
add_header 'Access-Control-Allow-Credentials' 'true' always;
|
||||||
|
|
||||||
@@ -216,6 +214,13 @@ server {
|
|||||||
return 204;
|
return 204;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# 隐藏后端返回<E8BF94>?CORS 头(避免重复<E9878D>?
|
||||||
|
proxy_hide_header Access-Control-Allow-Origin;
|
||||||
|
proxy_hide_header Access-Control-Allow-Credentials;
|
||||||
|
proxy_hide_header Access-Control-Allow-Methods;
|
||||||
|
proxy_hide_header Access-Control-Allow-Headers;
|
||||||
|
proxy_hide_header Access-Control-Expose-Headers;
|
||||||
|
|
||||||
proxy_pass http://222.128.1.157:16801/;
|
proxy_pass http://222.128.1.157:16801/;
|
||||||
proxy_http_version 1.1;
|
proxy_http_version 1.1;
|
||||||
proxy_set_header Host $host;
|
proxy_set_header Host $host;
|
||||||
@@ -223,6 +228,7 @@ server {
|
|||||||
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||||||
proxy_set_header X-Forwarded-Proto $scheme;
|
proxy_set_header X-Forwarded-Proto $scheme;
|
||||||
|
|
||||||
|
# 统一添加 CORS <20>?
|
||||||
add_header 'Access-Control-Allow-Origin' $cors_origin always;
|
add_header 'Access-Control-Allow-Origin' $cors_origin always;
|
||||||
add_header 'Access-Control-Allow-Credentials' 'true' always;
|
add_header 'Access-Control-Allow-Credentials' 'true' always;
|
||||||
|
|
||||||
@@ -233,6 +239,24 @@ server {
|
|||||||
|
|
||||||
# Elasticsearch API
|
# Elasticsearch API
|
||||||
location /es-api/ {
|
location /es-api/ {
|
||||||
|
# 处理 OPTIONS 预检请求
|
||||||
|
if ($request_method = 'OPTIONS') {
|
||||||
|
add_header 'Access-Control-Allow-Origin' $cors_origin always;
|
||||||
|
add_header 'Access-Control-Allow-Methods' 'GET, POST, PUT, DELETE, OPTIONS, HEAD' always;
|
||||||
|
add_header 'Access-Control-Allow-Headers' 'DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range,Authorization' always;
|
||||||
|
add_header 'Access-Control-Allow-Credentials' 'true' always;
|
||||||
|
add_header 'Access-Control-Max-Age' 86400;
|
||||||
|
add_header 'Content-Length' 0;
|
||||||
|
return 204;
|
||||||
|
}
|
||||||
|
|
||||||
|
# 隐藏后端返回<E8BF94>?CORS 头(避免重复<E9878D>?
|
||||||
|
proxy_hide_header Access-Control-Allow-Origin;
|
||||||
|
proxy_hide_header Access-Control-Allow-Credentials;
|
||||||
|
proxy_hide_header Access-Control-Allow-Methods;
|
||||||
|
proxy_hide_header Access-Control-Allow-Headers;
|
||||||
|
proxy_hide_header Access-Control-Expose-Headers;
|
||||||
|
|
||||||
proxy_pass http://222.128.1.157:19200/;
|
proxy_pass http://222.128.1.157:19200/;
|
||||||
proxy_http_version 1.1;
|
proxy_http_version 1.1;
|
||||||
proxy_set_header Host $host;
|
proxy_set_header Host $host;
|
||||||
@@ -240,15 +264,10 @@ server {
|
|||||||
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||||||
proxy_set_header X-Forwarded-Proto $scheme;
|
proxy_set_header X-Forwarded-Proto $scheme;
|
||||||
|
|
||||||
|
# 统一添加 CORS <20>?
|
||||||
add_header 'Access-Control-Allow-Origin' $cors_origin always;
|
add_header 'Access-Control-Allow-Origin' $cors_origin always;
|
||||||
add_header 'Access-Control-Allow-Methods' 'GET, POST, PUT, DELETE, OPTIONS, HEAD' always;
|
|
||||||
add_header 'Access-Control-Allow-Headers' 'DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range,Authorization' always;
|
|
||||||
add_header 'Access-Control-Allow-Credentials' 'true' always;
|
add_header 'Access-Control-Allow-Credentials' 'true' always;
|
||||||
|
|
||||||
if ($request_method = 'OPTIONS') {
|
|
||||||
return 204;
|
|
||||||
}
|
|
||||||
|
|
||||||
proxy_connect_timeout 60s;
|
proxy_connect_timeout 60s;
|
||||||
proxy_send_timeout 60s;
|
proxy_send_timeout 60s;
|
||||||
proxy_read_timeout 60s;
|
proxy_read_timeout 60s;
|
||||||
@@ -268,6 +287,13 @@ server {
|
|||||||
return 204;
|
return 204;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# 隐藏后端返回<E8BF94>?CORS 头(避免重复<E9878D>?
|
||||||
|
proxy_hide_header Access-Control-Allow-Origin;
|
||||||
|
proxy_hide_header Access-Control-Allow-Credentials;
|
||||||
|
proxy_hide_header Access-Control-Allow-Methods;
|
||||||
|
proxy_hide_header Access-Control-Allow-Headers;
|
||||||
|
proxy_hide_header Access-Control-Expose-Headers;
|
||||||
|
|
||||||
proxy_pass http://222.128.1.157:21891/;
|
proxy_pass http://222.128.1.157:21891/;
|
||||||
proxy_http_version 1.1;
|
proxy_http_version 1.1;
|
||||||
proxy_set_header Host $host;
|
proxy_set_header Host $host;
|
||||||
@@ -275,6 +301,7 @@ server {
|
|||||||
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||||||
proxy_set_header X-Forwarded-Proto $scheme;
|
proxy_set_header X-Forwarded-Proto $scheme;
|
||||||
|
|
||||||
|
# 统一添加 CORS <20>?
|
||||||
add_header 'Access-Control-Allow-Origin' $cors_origin always;
|
add_header 'Access-Control-Allow-Origin' $cors_origin always;
|
||||||
add_header 'Access-Control-Allow-Credentials' 'true' always;
|
add_header 'Access-Control-Allow-Credentials' 'true' always;
|
||||||
|
|
||||||
@@ -296,6 +323,13 @@ server {
|
|||||||
return 204;
|
return 204;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# 隐藏后端返回<E8BF94>?CORS 头(避免重复<E9878D>?
|
||||||
|
proxy_hide_header Access-Control-Allow-Origin;
|
||||||
|
proxy_hide_header Access-Control-Allow-Credentials;
|
||||||
|
proxy_hide_header Access-Control-Allow-Methods;
|
||||||
|
proxy_hide_header Access-Control-Allow-Headers;
|
||||||
|
proxy_hide_header Access-Control-Expose-Headers;
|
||||||
|
|
||||||
proxy_pass http://222.128.1.157:8811/;
|
proxy_pass http://222.128.1.157:8811/;
|
||||||
proxy_http_version 1.1;
|
proxy_http_version 1.1;
|
||||||
proxy_set_header Host $host;
|
proxy_set_header Host $host;
|
||||||
@@ -303,6 +337,7 @@ server {
|
|||||||
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||||||
proxy_set_header X-Forwarded-Proto $scheme;
|
proxy_set_header X-Forwarded-Proto $scheme;
|
||||||
|
|
||||||
|
# 统一添加 CORS <20>?
|
||||||
add_header 'Access-Control-Allow-Origin' $cors_origin always;
|
add_header 'Access-Control-Allow-Origin' $cors_origin always;
|
||||||
add_header 'Access-Control-Allow-Credentials' 'true' always;
|
add_header 'Access-Control-Allow-Credentials' 'true' always;
|
||||||
|
|
||||||
@@ -313,6 +348,24 @@ server {
|
|||||||
|
|
||||||
# 商品分类 API
|
# 商品分类 API
|
||||||
location /category-api/ {
|
location /category-api/ {
|
||||||
|
# 处理 OPTIONS 预检请求
|
||||||
|
if ($request_method = 'OPTIONS') {
|
||||||
|
add_header 'Access-Control-Allow-Origin' $cors_origin always;
|
||||||
|
add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS' always;
|
||||||
|
add_header 'Access-Control-Allow-Headers' 'DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range,Authorization' always;
|
||||||
|
add_header 'Access-Control-Allow-Credentials' 'true' always;
|
||||||
|
add_header 'Access-Control-Max-Age' 86400;
|
||||||
|
add_header 'Content-Length' 0;
|
||||||
|
return 204;
|
||||||
|
}
|
||||||
|
|
||||||
|
# 隐藏后端返回<E8BF94>?CORS 头(避免重复<E9878D>?
|
||||||
|
proxy_hide_header Access-Control-Allow-Origin;
|
||||||
|
proxy_hide_header Access-Control-Allow-Credentials;
|
||||||
|
proxy_hide_header Access-Control-Allow-Methods;
|
||||||
|
proxy_hide_header Access-Control-Allow-Headers;
|
||||||
|
proxy_hide_header Access-Control-Expose-Headers;
|
||||||
|
|
||||||
proxy_pass http://222.128.1.157:18827/;
|
proxy_pass http://222.128.1.157:18827/;
|
||||||
proxy_http_version 1.1;
|
proxy_http_version 1.1;
|
||||||
proxy_set_header Host $host;
|
proxy_set_header Host $host;
|
||||||
@@ -320,13 +373,9 @@ server {
|
|||||||
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||||||
proxy_set_header X-Forwarded-Proto $scheme;
|
proxy_set_header X-Forwarded-Proto $scheme;
|
||||||
|
|
||||||
|
# 统一添加 CORS <20>?
|
||||||
add_header 'Access-Control-Allow-Origin' $cors_origin always;
|
add_header 'Access-Control-Allow-Origin' $cors_origin always;
|
||||||
add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS' always;
|
add_header 'Access-Control-Allow-Credentials' 'true' always;
|
||||||
add_header 'Access-Control-Allow-Headers' 'DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range' always;
|
|
||||||
|
|
||||||
if ($request_method = 'OPTIONS') {
|
|
||||||
return 204;
|
|
||||||
}
|
|
||||||
|
|
||||||
proxy_connect_timeout 120s;
|
proxy_connect_timeout 120s;
|
||||||
proxy_send_timeout 120s;
|
proxy_send_timeout 120s;
|
||||||
@@ -553,7 +602,7 @@ server {
|
|||||||
}
|
}
|
||||||
|
|
||||||
# ============================================
|
# ============================================
|
||||||
# 健康检查
|
# 健康检<EFBFBD>?
|
||||||
# ============================================
|
# ============================================
|
||||||
location /health {
|
location /health {
|
||||||
return 200 'ok';
|
return 200 'ok';
|
||||||
|
|||||||
@@ -6,6 +6,7 @@ import React, { useEffect, useRef, useState, useMemo } from 'react';
|
|||||||
import { Box, Spinner, Center, Text } from '@chakra-ui/react';
|
import { Box, Spinner, Center, Text } from '@chakra-ui/react';
|
||||||
import * as echarts from 'echarts';
|
import * as echarts from 'echarts';
|
||||||
import type { ECharts, EChartsOption } from 'echarts';
|
import type { ECharts, EChartsOption } from 'echarts';
|
||||||
|
import { getApiBase } from '@utils/apiConfig';
|
||||||
|
|
||||||
import type { MiniTimelineChartProps, TimelineDataPoint } from '../types';
|
import type { MiniTimelineChartProps, TimelineDataPoint } from '../types';
|
||||||
|
|
||||||
@@ -82,8 +83,8 @@ const MiniTimelineChart: React.FC<MiniTimelineChartProps> = ({
|
|||||||
|
|
||||||
try {
|
try {
|
||||||
const apiPath = isIndex
|
const apiPath = isIndex
|
||||||
? `/api/index/${code}/kline?type=minute`
|
? `${getApiBase()}/api/index/${code}/kline?type=minute`
|
||||||
: `/api/stock/${code}/kline?type=minute`;
|
: `${getApiBase()}/api/stock/${code}/kline?type=minute`;
|
||||||
|
|
||||||
const response = await fetch(apiPath);
|
const response = await fetch(apiPath);
|
||||||
const result: KLineApiResponse = await response.json();
|
const result: KLineApiResponse = await response.json();
|
||||||
|
|||||||
@@ -180,7 +180,7 @@ const StockOverview = () => {
|
|||||||
const fetchTopConcepts = async (date = null) => {
|
const fetchTopConcepts = async (date = null) => {
|
||||||
setLoadingConcepts(true);
|
setLoadingConcepts(true);
|
||||||
try {
|
try {
|
||||||
const url = date ? `/api/concepts/daily-top?limit=6&date=${date}` : '/api/concepts/daily-top?limit=6';
|
const url = date ? `${getApiBase()}/api/concepts/daily-top?limit=6&date=${date}` : `${getApiBase()}/api/concepts/daily-top?limit=6`;
|
||||||
const response = await fetch(url);
|
const response = await fetch(url);
|
||||||
const data = await response.json();
|
const data = await response.json();
|
||||||
|
|
||||||
@@ -223,7 +223,7 @@ const StockOverview = () => {
|
|||||||
const fetchHeatmapData = async (date = null) => {
|
const fetchHeatmapData = async (date = null) => {
|
||||||
setLoadingHeatmap(true);
|
setLoadingHeatmap(true);
|
||||||
try {
|
try {
|
||||||
const url = date ? `/api/market/heatmap?limit=500&date=${date}` : '/api/market/heatmap?limit=500';
|
const url = date ? `${getApiBase()}/api/market/heatmap?limit=500&date=${date}` : `${getApiBase()}/api/market/heatmap?limit=500`;
|
||||||
const response = await fetch(url);
|
const response = await fetch(url);
|
||||||
const data = await response.json();
|
const data = await response.json();
|
||||||
|
|
||||||
@@ -255,7 +255,7 @@ const StockOverview = () => {
|
|||||||
// 获取市场统计数据
|
// 获取市场统计数据
|
||||||
const fetchMarketStats = async (date = null) => {
|
const fetchMarketStats = async (date = null) => {
|
||||||
try {
|
try {
|
||||||
const url = date ? `/api/market/statistics?date=${date}` : '/api/market/statistics';
|
const url = date ? `${getApiBase()}/api/market/statistics?date=${date}` : `${getApiBase()}/api/market/statistics`;
|
||||||
const response = await fetch(url);
|
const response = await fetch(url);
|
||||||
const data = await response.json();
|
const data = await response.json();
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user