d0db577a9c
- 删除「店铺导入测试」菜单及全部实现:admin.html 面板、admin.js 逻辑、 admin_api.py 路由/常量/权限映射、Java 默认菜单 - 「店铺数据记录」页内子 tab 移除,只保留店铺数据列表 - 「店铺管理」下新增「店铺数据重复检查」菜单(V106 导入测试菜单保留并新增 V107 清理 + 幂等插入新菜单,Java 清单同步) - 新面板:筛选/指标卡/店铺上架分布/矩阵表格/撞款详情卡片区(同 ASIN 跨店 上架明细,查看明细开抽屉,上架时间倒序) - 重复扫描结果改为 MySQL 缓存 + 每日定时扫描(start_duplicate_scan_scheduler) - 新增 test_admin_shop_data_duplicate_check.py 单元测试
60 lines
1.9 KiB
Python
60 lines
1.9 KiB
Python
"""
|
|
卖相AI - Flask 后端
|
|
按功能拆分为蓝图:认证(auth)、主页面(main)、管理员API(admin_api)、版本(version)
|
|
"""
|
|
import os
|
|
import secrets
|
|
from datetime import timedelta
|
|
|
|
from flask import Flask
|
|
from flask_cors import CORS
|
|
|
|
from utils.db import init_db
|
|
from blueprints.auth import auth
|
|
from blueprints.main import main
|
|
from blueprints.admin_api import admin_api, start_duplicate_scan_scheduler
|
|
from blueprints.version import version_bp
|
|
|
|
BASE_DIR = os.path.dirname(os.path.abspath(__file__))
|
|
app = Flask(__name__, template_folder=BASE_DIR, static_folder=BASE_DIR)
|
|
|
|
# CORS配置:限制为可信域名
|
|
CORS(app, resources={
|
|
r"/api/*": {
|
|
"origins": [
|
|
"http://localhost:*",
|
|
"http://127.0.0.1:*",
|
|
"https://*.aishufu.top",
|
|
"http://*.aishufu.top"
|
|
],
|
|
"methods": ["GET", "POST", "PUT", "DELETE", "OPTIONS"],
|
|
"allow_headers": ["Authorization", "Content-Type", "X-Requested-With", "X-Device-Id"],
|
|
"supports_credentials": True
|
|
}
|
|
})
|
|
app.secret_key = os.environ.get('SECRET_KEY', secrets.token_hex(32))
|
|
app.config['PERMANENT_SESSION_LIFETIME'] = timedelta(days=7)
|
|
# 文件上传大小限制:2GB(数字人 ZIP 包等大文件)
|
|
app.config['MAX_CONTENT_LENGTH'] = 2 * 1024 * 1024 * 1024
|
|
# 会话安全配置
|
|
app.config['SESSION_COOKIE_SECURE'] = os.environ.get('SESSION_COOKIE_SECURE', 'false').lower() == 'true'
|
|
app.config['SESSION_COOKIE_HTTPONLY'] = True
|
|
app.config['SESSION_COOKIE_SAMESITE'] = 'Lax'
|
|
|
|
# 注册蓝图
|
|
app.register_blueprint(auth)
|
|
app.register_blueprint(main)
|
|
app.register_blueprint(admin_api)
|
|
app.register_blueprint(version_bp)
|
|
|
|
|
|
def run_app(host='0.0.0.0', port=15124):
|
|
init_db()
|
|
# 每日凌晨全量扫描重复 ASIN,结果缓存 MySQL,页面读取缓存不再实时拉取 Excel
|
|
start_duplicate_scan_scheduler(app)
|
|
app.run(host=host, port=port, threaded=True, use_reloader=False)
|
|
|
|
|
|
if __name__ == '__main__':
|
|
run_app()
|