feat(数据可视化技术): 添加网店运营大屏前端和后端基础结构
- 新建前端项目配置文件和样式文件 - 创建后端 Flask 应用和数据库连接管理器 - 定义多个 API 路由以获取销售数据
This commit is contained in:
122
数据可视化技术/网店运营大屏(Flask框架)/backend/app.py
Executable file
122
数据可视化技术/网店运营大屏(Flask框架)/backend/app.py
Executable file
@@ -0,0 +1,122 @@
|
||||
# 1.导入必要的库和模块
|
||||
from flask import Flask, jsonify, Blueprint
|
||||
import pymysql
|
||||
from flask_cors import CORS
|
||||
from contextlib import contextmanager
|
||||
from flask.json import JSONEncoder
|
||||
from decimal import Decimal
|
||||
|
||||
|
||||
# 2.创建 Flask 应用并配置
|
||||
app = Flask(__name__)
|
||||
app.config['JSON_AS_ASCII'] = False # 重要,让 JSON 数据按原字符编码输出,不转成 ASCII
|
||||
app.config['JSONIFY_MIMETYPE'] = 'application/json; charset=utf-8'
|
||||
CORS(app) # 解决跨域问题
|
||||
|
||||
class CustomJSONEncoder(JSONEncoder):
|
||||
def default(self, obj):
|
||||
if isinstance(obj, Decimal):
|
||||
return float(obj) # 或 str(obj)
|
||||
return super().default(obj)
|
||||
|
||||
app.json_encoder = CustomJSONEncoder
|
||||
# 3.数据库连接上下文管理器
|
||||
@contextmanager
|
||||
def get_db_connection():
|
||||
try:
|
||||
connection = pymysql.connect(
|
||||
host='hadoop102',
|
||||
user='root',
|
||||
port=3306,
|
||||
password='123456',
|
||||
database='marketing',
|
||||
charset='utf8mb4',
|
||||
cursorclass=pymysql.cursors.DictCursor
|
||||
)
|
||||
yield connection
|
||||
except Exception as e:
|
||||
print(f"Error: {e}")
|
||||
finally:
|
||||
if connection:
|
||||
connection.close()
|
||||
|
||||
# 4.创建蓝图
|
||||
data_bp = Blueprint('data', __name__)
|
||||
|
||||
# 5.定义API路由
|
||||
# sales_month的数据接口
|
||||
@data_bp.route('/api/sales_month', methods=['GET'])
|
||||
def sales_month():
|
||||
with get_db_connection() as connection:
|
||||
with connection.cursor() as cursor:
|
||||
sql = "SELECT * FROM sales_month"
|
||||
cursor.execute(sql)
|
||||
results = cursor.fetchall()
|
||||
return jsonify(results)
|
||||
|
||||
# sales_region的数据接口
|
||||
@data_bp.route('/api/sales_region', methods=['GET'])
|
||||
def sales_region():
|
||||
with get_db_connection() as connection:
|
||||
with connection.cursor() as cursor:
|
||||
sql = "SELECT * FROM sales_region"
|
||||
cursor.execute(sql)
|
||||
results = cursor.fetchall()
|
||||
return jsonify(results)
|
||||
|
||||
# sales_manager的数据接口
|
||||
@data_bp.route('/api/sales_manager', methods=['GET'])
|
||||
def sales_manager():
|
||||
with get_db_connection() as connection:
|
||||
with connection.cursor() as cursor:
|
||||
sql = "SELECT * FROM sales_manager"
|
||||
cursor.execute(sql)
|
||||
results = cursor.fetchall()
|
||||
return jsonify(results)
|
||||
|
||||
# sales_province的数据接口
|
||||
@data_bp.route('/api/sales_province', methods=['GET'])
|
||||
def sales_province():
|
||||
with get_db_connection() as connection:
|
||||
with connection.cursor() as cursor:
|
||||
sql = "SELECT * FROM sales_province"
|
||||
cursor.execute(sql)
|
||||
results = cursor.fetchall()
|
||||
return jsonify(results)
|
||||
|
||||
# sales_product的数据接口
|
||||
@data_bp.route('/api/sales_product', methods=['GET'])
|
||||
def combine_data():
|
||||
result = []
|
||||
with get_db_connection() as conn:
|
||||
cursor = conn.cursor()
|
||||
# 直接使用 JOIN 语句查询关联数据
|
||||
sql = """
|
||||
SELECT mc.name AS main_name, mc.value, sc.name AS sub_name, sc.value
|
||||
FROM main_categories mc
|
||||
JOIN sub_categories sc ON mc.id = sc.main_category_id
|
||||
"""
|
||||
cursor.execute(sql)
|
||||
rows = cursor.fetchall()
|
||||
category_dict = {}
|
||||
for row in rows:
|
||||
main_name, main_value, sub_name, sub_value = row.values()
|
||||
if main_name not in category_dict:
|
||||
category_dict[main_name] = {
|
||||
"name": main_name,
|
||||
"value": main_value,
|
||||
"children": []
|
||||
}
|
||||
category_dict[main_name]["children"].append({
|
||||
"name": sub_name,
|
||||
"value": sub_value
|
||||
})
|
||||
result = list(category_dict.values())
|
||||
|
||||
return jsonify(result)
|
||||
|
||||
# 6.注册蓝图并运行应用
|
||||
app.register_blueprint(data_bp)
|
||||
|
||||
if __name__ == '__main__':
|
||||
app.run(debug=True)
|
||||
Reference in New Issue
Block a user