初始化提交
This commit is contained in:
173
mengyaprofile-backend/app.py
Normal file
173
mengyaprofile-backend/app.py
Normal file
@@ -0,0 +1,173 @@
|
||||
from flask import Flask, jsonify, send_from_directory, request
|
||||
from flask_cors import CORS
|
||||
import json
|
||||
import os
|
||||
import random
|
||||
|
||||
# 检测运行模式:通过环境变量控制
|
||||
RUN_MODE = os.environ.get('RUN_MODE', 'development') # development 或 production
|
||||
|
||||
# 根据运行模式配置
|
||||
if RUN_MODE == 'production':
|
||||
# 生产环境:使用构建后的前端
|
||||
FRONTEND_BUILD_PATH = os.path.join(os.path.dirname(__file__), '..', 'frontend', 'build')
|
||||
app = Flask(__name__, static_folder=FRONTEND_BUILD_PATH, static_url_path='')
|
||||
BACKGROUND_DIR = os.path.join(FRONTEND_BUILD_PATH, 'background')
|
||||
else:
|
||||
# 开发环境:不服务前端,只提供 API
|
||||
app = Flask(__name__)
|
||||
BACKGROUND_DIR = os.path.join(os.path.dirname(__file__), '..', 'mengyaprofile-frontend', 'public', 'background')
|
||||
|
||||
CORS(app) # 允许跨域请求
|
||||
|
||||
# 数据文件路径 - 支持环境变量配置
|
||||
DATA_DIR = os.environ.get('DATA_DIR', os.path.join(os.path.dirname(__file__), 'data'))
|
||||
|
||||
def load_json_file(filename):
|
||||
"""加载JSON文件"""
|
||||
try:
|
||||
with open(os.path.join(DATA_DIR, filename), 'r', encoding='utf-8') as f:
|
||||
return json.load(f)
|
||||
except FileNotFoundError:
|
||||
return None
|
||||
except Exception as e:
|
||||
print(f"Error loading {filename}: {e}")
|
||||
return None
|
||||
|
||||
@app.route('/api/profile', methods=['GET'])
|
||||
def get_profile():
|
||||
"""获取个人基本信息"""
|
||||
data = load_json_file('profile.json')
|
||||
if data:
|
||||
return jsonify(data)
|
||||
return jsonify({"error": "Profile没有找到"}), 404
|
||||
|
||||
@app.route('/api/projects', methods=['GET'])
|
||||
def get_projects():
|
||||
"""获取精选项目列表"""
|
||||
data = load_json_file('projects.json')
|
||||
if data:
|
||||
return jsonify(data)
|
||||
return jsonify({"error": "Projects没有找到"}), 404
|
||||
|
||||
@app.route('/api/contacts', methods=['GET'])
|
||||
def get_contacts():
|
||||
"""获取联系方式"""
|
||||
data = load_json_file('contacts.json')
|
||||
if data:
|
||||
return jsonify(data)
|
||||
return jsonify({"error": "Contacts没有找到"}), 404
|
||||
|
||||
@app.route('/api/techstack', methods=['GET'])
|
||||
def get_techstack():
|
||||
"""获取技术栈"""
|
||||
data = load_json_file('techstack.json')
|
||||
if data:
|
||||
return jsonify(data)
|
||||
return jsonify({"error": "Tech stack没有找到"}), 404
|
||||
|
||||
@app.route('/api/random-background', methods=['GET'])
|
||||
def get_random_background():
|
||||
"""获取随机背景图片"""
|
||||
try:
|
||||
# 获取背景图片目录中的所有图片
|
||||
if os.path.exists(BACKGROUND_DIR):
|
||||
images = [f for f in os.listdir(BACKGROUND_DIR)
|
||||
if f.lower().endswith(('.png', '.jpg', '.jpeg', '.webp', '.gif'))]
|
||||
if images:
|
||||
random_image = random.choice(images)
|
||||
return jsonify({"image": f"/background/{random_image}"})
|
||||
return jsonify({"image": None})
|
||||
except Exception as e:
|
||||
print(f"获取随机背景出错: {e}")
|
||||
return jsonify({"image": None})
|
||||
|
||||
@app.route('/api/all', methods=['GET'])
|
||||
def get_all():
|
||||
"""获取所有数据"""
|
||||
profile = load_json_file('profile.json')
|
||||
projects = load_json_file('projects.json')
|
||||
contacts = load_json_file('contacts.json')
|
||||
techstack = load_json_file('techstack.json')
|
||||
|
||||
return jsonify({
|
||||
"profile": profile,
|
||||
"techstack": techstack,
|
||||
"projects": projects,
|
||||
"contacts": contacts
|
||||
})
|
||||
|
||||
@app.route('/', methods=['GET'])
|
||||
def index():
|
||||
"""服务前端页面或API信息"""
|
||||
if RUN_MODE == 'production' and app.static_folder:
|
||||
# 生产环境,返回前端页面
|
||||
return send_from_directory(app.static_folder, 'index.html')
|
||||
else:
|
||||
# 开发环境,返回API信息
|
||||
return jsonify({
|
||||
"message": "萌芽主页 后端API - 开发模式",
|
||||
"author": "树萌芽",
|
||||
"version": "1.0.0",
|
||||
"mode": "development",
|
||||
"note": "前端开发服务器运行在 http://localhost:3000",
|
||||
"endpoints": {
|
||||
"/api/profile": "获取个人信息",
|
||||
"/api/techstack": "获取技术栈",
|
||||
"/api/projects": "获取项目列表",
|
||||
"/api/contacts": "获取联系方式",
|
||||
"/api/random-background": "获取随机背景图片",
|
||||
"/api/all": "获取所有数据"
|
||||
}
|
||||
})
|
||||
|
||||
@app.route('/admin')
|
||||
def admin():
|
||||
"""服务管理员页面(也是前端)"""
|
||||
if RUN_MODE == 'production' and app.static_folder:
|
||||
return send_from_directory(app.static_folder, 'index.html')
|
||||
else:
|
||||
return jsonify({
|
||||
"error": "开发模式",
|
||||
"note": "请访问 http://localhost:3000/admin?token=shumengya520"
|
||||
}), 404
|
||||
|
||||
@app.route('/api')
|
||||
def api_info():
|
||||
"""API信息"""
|
||||
return jsonify({
|
||||
"message": "萌芽主页 后端API",
|
||||
"author":"树萌芽",
|
||||
"version": "1.0.0",
|
||||
"endpoints": {
|
||||
"/api/profile": "获取个人信息",
|
||||
"/api/techstack": "获取技术栈",
|
||||
"/api/projects": "获取项目列表",
|
||||
"/api/contacts": "获取联系方式",
|
||||
"/api/random-background": "获取随机背景图片",
|
||||
"/api/all": "获取所有数据"
|
||||
}
|
||||
})
|
||||
|
||||
# 处理前端路由 - 所有非API请求都返回 index.html
|
||||
@app.errorhandler(404)
|
||||
def not_found(e):
|
||||
"""处理404错误"""
|
||||
# 检查是否为API请求
|
||||
if request.path.startswith('/api'):
|
||||
return jsonify({"error": "API endpoint not found"}), 404
|
||||
|
||||
# 非API请求
|
||||
if RUN_MODE == 'production' and app.static_folder:
|
||||
# 生产环境返回前端页面(支持前端路由)
|
||||
return send_from_directory(app.static_folder, 'index.html')
|
||||
|
||||
# 开发环境
|
||||
return jsonify({
|
||||
"error": "页面未找到",
|
||||
"mode": "development",
|
||||
"note": "开发环境请访问 http://localhost:3000"
|
||||
}), 404
|
||||
|
||||
if __name__ == '__main__':
|
||||
app.run(debug=True, host='0.0.0.0', port=5000)
|
||||
Reference in New Issue
Block a user