Files
wechat_backend/config.py
王宏豪 3f1a13936d feat(api): 重构图片地址管理与上传机制
- 替换开发环境API基础URL为本地服务地址
- 实现签名URL本地缓存机制,解决微信按URL缓存图片导致重复下载问题
- 添加缓存清理功能,包括过期清理和按需删除特定缓存项
- 集成阿里云OSS上传功能,支持直传减少服务器带宽占用
- 优化头像地址处理逻辑,统一使用签名缓存避免地址频繁变化
- 移除过时的OSS上传示例文件oss-upload.js
- 更新课程页面实现跳转第三方小程序功能
- 调整打卡记录图片地址获取方式,统一使用新的签名缓存逻辑
- 优化图片上传流程,增加压缩处理和批量上传支持
- 完善认证模块中的缓存清理逻辑,切换账号时清除相关图片缓存
- 添加后端环境变量配置模板和代理文档说明
2026-09-23 17:46:42 +08:00

63 lines
3.2 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import os
from pathlib import Path
from dotenv import load_dotenv
load_dotenv(Path(__file__).parent / ".env", override=True)
def _env(name, default=""):
return os.environ.get(name, default)
WECHAT_APPID = _env("WECHAT_APPID")
WECHAT_SECRET = _env("WECHAT_SECRET")
JWT_SECRET = _env("JWT_SECRET")
JWT_ALGORITHM = "HS256"
JWT_TTL_SECONDS = int(_env("JWT_TTL_SECONDS", str(90 * 24 * 3600)))
ADMIN_KEY = _env("ADMIN_KEY")
MYSQL_HOST = _env("MYSQL_HOST", "localhost")
MYSQL_PORT = int(_env("MYSQL_PORT", "3306"))
MYSQL_USER = _env("MYSQL_USER", "root")
MYSQL_PASSWORD = _env("MYSQL_PASSWORD")
MYSQL_DB = _env("MYSQL_DB", "mys_info_v3")
SURVEY_DB = _env("SURVEY_DB", "myxhxc")
PHONE_HMAC_KEY = _env("PHONE_HMAC_KEY", "MingYuan2026AuthKey")
H5_BASE_URL = _env("H5_BASE_URL", "http://127.0.0.1:8001").rstrip("/")
FEEDBACK_DIR = _env("FEEDBACK_DIR", "/home/introduction/feedback")
COURSE_VOTES_FILE = _env("COURSE_VOTES_FILE", "/home/introduction/test/course_votes.json")
# ── 阿里云 OSS:打卡附件 / 头像的对象存储(2026-09-22 新增)─────────────
# **图片的唯一存储**。2026-09-22 收口后已无本地磁盘兜底:`PLAN_ATTACH_DIR` /
# `AVATAR_DIR` / `STATIC_ROOT` 三个磁盘路径配置项随磁盘读路径一起删掉了。
# 未配置时 oss_store.is_enabled() 为 False:上传接口返回 503、读接口的
# attachment_urls 全为空串(前端干脆不显示图),**不会**退化成读写磁盘。
# 注意反馈模块(FEEDBACK_DIR)的截图仍走磁盘,它不在本次 OSS 化范围内。
# AK/SK 只从环境变量取,**不写进仓库**(.env 历史上有被 git 跟踪过,务必配 .gitignore)。
OSS_ACCESS_KEY_ID = _env("OSS_ACCESS_KEY_ID")
OSS_ACCESS_KEY_SECRET = _env("OSS_ACCESS_KEY_SECRET")
OSS_ENDPOINT = _env("OSS_ENDPOINT", "oss-cn-shanghai.aliyuncs.com")
OSS_BUCKET = _env("OSS_BUCKET", "mingyuan-oss")
# 绑了自定义域名就填这里(例:https://oss.muguaclub.cn)。
# 为什么必要:小程序 <image> 只能加载「downloadFile 合法域名」里的域名,
# *.aliyuncs.com 加不进白名单;且 OSS 默认域名访问图片会强制下载、浏览器无法直接预览。
# 签名 URL 会用这个 host 计算签名(V4 的签名包含 Host),所以它必须和实际访问的域名一致。
OSS_PUBLIC_ENDPOINT = _env("OSS_PUBLIC_ENDPOINT")
# 签名 URL 有效期(秒)。OSS 硬上限 604800(7 天),超了报 0002-00000232。
# 默认 5 天(432000):小程序端会把这个 URL 缓存在本地,**URL 稳定**才能让微信
# `<image>` 的「按 URL 缓存图片」命中 —— 后端每次现签的话 Expires 每次都不同,
# 微信会当作新图**反复重新下载整个文件**。
# ⚠️ 代价是泄漏窗口变长:拿到 URL 的人在有效期内都能看图,而这个桶里是学员打卡照。
# 若敏感度优先于省流量,把它调小即可 —— 前端缓存会随签名有效期自然失效,不必改代码。
OSS_URL_EXPIRE = int(_env("OSS_URL_EXPIRE", "432000"))
# PostObject 表单直传签名的有效期(秒)。默认 10 分钟 —— 从「取到签名」到「传完」
# 通常只要几秒,窗口开太长等于把可写时间放大。
OSS_POST_EXPIRE = int(_env("OSS_POST_EXPIRE", "600"))