diff --git a/backend/app.py b/backend/app.py index 4189992..4eea4dd 100644 --- a/backend/app.py +++ b/backend/app.py @@ -1,9 +1,29 @@ -from flask import Flask, jsonify +from flask import Flask, jsonify, send_from_directory from flask_cors import CORS import logging import os app = Flask(__name__) + +# 配置静态文件目录为dist +# 说明:这里指向后端目录中的 dist(前端构建产物应复制或输出到此) +dist_dir = os.path.abspath(os.path.join(os.path.dirname(__file__), 'dist')) +app.static_folder = dist_dir + +# 为 SPA 提供静态文件与回退到 index.html 的路由 +@app.route('/') +def serve_index(): + # 返回构建后的前端入口文件 + return send_from_directory(app.static_folder, 'index.html') + +@app.route('/') +def serve_static_or_fallback(path): + # 如果请求的文件存在则直接返回,否则回退到 index.html(用于前端路由) + file_path = os.path.join(app.static_folder, path) + if os.path.isfile(file_path): + return send_from_directory(app.static_folder, path) + return send_from_directory(app.static_folder, 'index.html') + CORS(app) # 允许跨域访问 # 配置日志 @@ -29,6 +49,6 @@ app.register_blueprint(article_bp) if __name__ == '__main__': print("启动主程序服务...") - print("服务地址: http://localhost:5001") + print("服务地址: http://localhost:8443") - app.run(host='0.0.0.0', port=5001, debug=True) \ No newline at end of file + app.run(host='0.0.0.0', port=8443, debug=True) diff --git a/backend/routers/rank_api_routes.py b/backend/routers/rank_api_routes.py index 06c8437..18f3700 100644 --- a/backend/routers/rank_api_routes.py +++ b/backend/routers/rank_api_routes.py @@ -197,7 +197,7 @@ def format_interaction_count(count): def format_mix_item(doc, target_date=None): """格式化合集数据项 - 完全按照数据库原始字段返回""" - mix_name = doc.get("mix_name", "") + mix_name = doc.get("mix_name", "") or doc.get("title", "") # 计算总点赞数 episode_details = doc.get("episode_details", []) @@ -217,6 +217,7 @@ def format_mix_item(doc, target_date=None): "_id": str(doc.get("_id", "")), "batch_time": format_time(doc.get("batch_time")), "mix_name": mix_name, + "title": mix_name, "video_url": doc.get("video_url", ""), "playcount": doc.get("playcount", ""), "play_vv": doc.get("play_vv", 0), diff --git a/frontend/package-lock.json b/frontend/package-lock.json index 4872c7c..abdca4b 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -11,7 +11,8 @@ "axios": "^1.12.2", "bootstrap": "^5.3.0-alpha1", "bootstrap-icons": "^1.13.1", - "vue": "^3.5.22" + "vue": "^3.5.22", + "vue-router": "^4.6.3" }, "devDependencies": { "@vitejs/plugin-vue": "^6.0.1", @@ -1333,6 +1334,11 @@ "@vue/shared": "3.5.22" } }, + "node_modules/@vue/devtools-api": { + "version": "6.6.4", + "resolved": "https://registry.npmmirror.com/@vue/devtools-api/-/devtools-api-6.6.4.tgz", + "integrity": "sha512-sGhTPMuXqZ1rVOk32RylztWkfXTRhuS7vgAKv0zjqk8gbsHkJ7xfFf+jbySxt7tWObEJwyKaHMikV/WGDiQm8g==" + }, "node_modules/@vue/devtools-core": { "version": "8.0.3", "resolved": "https://registry.npmmirror.com/@vue/devtools-core/-/devtools-core-8.0.3.tgz", @@ -2643,6 +2649,20 @@ } } }, + "node_modules/vue-router": { + "version": "4.6.3", + "resolved": "https://registry.npmmirror.com/vue-router/-/vue-router-4.6.3.tgz", + "integrity": "sha512-ARBedLm9YlbvQomnmq91Os7ck6efydTSpRP3nuOKCvgJOHNrhRoJDSKtee8kcL1Vf7nz6U+PMBL+hTvR3bTVQg==", + "dependencies": { + "@vue/devtools-api": "^6.6.4" + }, + "funding": { + "url": "https://github.com/sponsors/posva" + }, + "peerDependencies": { + "vue": "^3.5.0" + } + }, "node_modules/wsl-utils": { "version": "0.1.0", "resolved": "https://registry.npmmirror.com/wsl-utils/-/wsl-utils-0.1.0.tgz", @@ -3459,6 +3479,11 @@ "@vue/shared": "3.5.22" } }, + "@vue/devtools-api": { + "version": "6.6.4", + "resolved": "https://registry.npmmirror.com/@vue/devtools-api/-/devtools-api-6.6.4.tgz", + "integrity": "sha512-sGhTPMuXqZ1rVOk32RylztWkfXTRhuS7vgAKv0zjqk8gbsHkJ7xfFf+jbySxt7tWObEJwyKaHMikV/WGDiQm8g==" + }, "@vue/devtools-core": { "version": "8.0.3", "resolved": "https://registry.npmmirror.com/@vue/devtools-core/-/devtools-core-8.0.3.tgz", @@ -4276,6 +4301,14 @@ "@vue/shared": "3.5.22" } }, + "vue-router": { + "version": "4.6.3", + "resolved": "https://registry.npmmirror.com/vue-router/-/vue-router-4.6.3.tgz", + "integrity": "sha512-ARBedLm9YlbvQomnmq91Os7ck6efydTSpRP3nuOKCvgJOHNrhRoJDSKtee8kcL1Vf7nz6U+PMBL+hTvR3bTVQg==", + "requires": { + "@vue/devtools-api": "^6.6.4" + } + }, "wsl-utils": { "version": "0.1.0", "resolved": "https://registry.npmmirror.com/wsl-utils/-/wsl-utils-0.1.0.tgz", diff --git a/frontend/package.json b/frontend/package.json index b5c65b5..bbec006 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -15,7 +15,8 @@ "axios": "^1.12.2", "bootstrap": "^5.3.0-alpha1", "bootstrap-icons": "^1.13.1", - "vue": "^3.5.22" + "vue": "^3.5.22", + "vue-router": "^4.6.3" }, "devDependencies": { "@vitejs/plugin-vue": "^6.0.1", diff --git a/frontend/src/AdminPanel.vue b/frontend/src/AdminPanel.vue index 299e774..9bd4f43 100644 --- a/frontend/src/AdminPanel.vue +++ b/frontend/src/AdminPanel.vue @@ -58,7 +58,7 @@ const initDate = () => { } // API基础URL -const API_BASE_URL = 'http://localhost:5001/api' +const API_BASE_URL = 'http://159.75.150.210:8443/api' // 获取排行榜数据 const fetchRankingData = async () => { diff --git a/frontend/src/App.vue b/frontend/src/App.vue index 1bd8464..3c11179 100644 --- a/frontend/src/App.vue +++ b/frontend/src/App.vue @@ -77,7 +77,7 @@ const fetchRankingData = async () => { params.classification_type = selectedCategory.value } - const response = await axios.get('http://localhost:5001/api/rank/videos', { + const response = await axios.get('http://159.75.150.210:8443/api/rank/videos', { params: params }) diff --git a/frontend/vite.config.js b/frontend/vite.config.js index d685998..025c8bd 100644 --- a/frontend/vite.config.js +++ b/frontend/vite.config.js @@ -17,7 +17,7 @@ export default defineConfig({ port: 5174, proxy: { '/api': { - target: 'http://localhost:5001', + target: 'http://159.75.150.210:8443', changeOrigin: true, secure: false }