"""小程序页面静态资源(背景图/图标)— 数据库配置 + 默认值""" from django.core.cache import cache _CACHE_PREFIX = 'xcx_page_ziyuan_v1' _CACHE_TTL = 120 # 默认资源(相对 OSS 路径,不含域名) DEFAULT_ZIYUAN = { 'paihangbang.pageBg': 'beijing/paihangbang/page-bg.jpg', 'paihangbang.cardBg': 'beijing/paihangbang/list-card-bg.png', 'paihangbang.emptyIcon': 'beijing/paihangbang/empty.png', 'paihangbang.refreshIcon': 'beijing/paihangbang/icon-refresh.png', 'shangjiaduan.pageBg': 'beijing/shangjiaduan/page_bg.png', 'shangjiaduan.avatarCardBg': 'beijing/shangjiaduan/avatar_card_bg.png', 'shangjiaduan.assetCardBg': 'beijing/shangjiaduan/asset_card_bg.png', 'shangjiaduan.statCardBg': 'beijing/shangjiaduan/stat_card_bg.png', 'shangjiaduan.funcItemBg': 'beijing/shangjiaduan/func_item_bg.png', 'shangjiaduan.primaryFuncBg': 'beijing/shangjiaduan/primary_func_bg.png', 'shangjiaduan.highlightFuncBg': 'beijing/shangjiaduan/highlight_func_bg.png', 'shangjiaduan.iconRelease': 'beijing/shangjiaduan/icon_release.png', 'shangjiaduan.iconFast': 'beijing/shangjiaduan/icon_fast.png', 'shangjiaduan.iconOrders': 'beijing/shangjiaduan/icon_orders.png', 'shangjiaduan.iconService': 'beijing/shangjiaduan/icon_service.png', 'shangjiaduan.iconPunish': 'beijing/shangjiaduan/icon_punish.png', 'shangjiaduan.iconRank': 'beijing/shangjiaduan/icon_rank.png', 'shangjiaduan.iconRecharge': 'beijing/shangjiaduan/icon_recharge.png', 'shangjiaduan.iconWithdraw': 'beijing/shangjiaduan/icon_withdraw.png', 'shangjiaduan.iconRefresh': 'beijing/shangjiaduan/icon_refresh.png', 'shangjiaduan.iconCopy': 'beijing/shangjiaduan/icon_copy.png', 'shangjiaduan.avatarFrame': 'beijing/shangjiaduan/avatar_frame.png', 'guanshiduan.pageBg': 'beijing/guanshiduan/page-bg.jpg', 'guanshiduan.topDecor': 'beijing/guanshiduan/top-decor.png', 'guanshiduan.cardBg1': 'beijing/guanshiduan/card-bg1.png', 'guanshiduan.cardBg2': 'beijing/guanshiduan/card-bg2.png', 'guanshiduan.iconRefresh': 'beijing/guanshiduan/icon-refresh.png', 'guanshiduan.iconCopy': 'beijing/guanshiduan/icon-copy.png', 'guanshiduan.iconInvite': 'beijing/guanshiduan/icon-invite.png', 'guanshiduan.iconSub': 'beijing/guanshiduan/icon-sub.png', 'guanshiduan.iconRecord': 'beijing/guanshiduan/icon-record.png', 'guanshiduan.iconRank': 'beijing/guanshiduan/icon-rank.png', 'guanshiduan.iconPoster': 'beijing/guanshiduan/icon-poster.png', 'guanshiduan.iconWithdraw': 'beijing/guanshiduan/icon-withdraw.png', 'guanshiduan.iconContact': 'beijing/guanshiduan/icon-contact.png', 'guanshiduan.iconArrow': 'beijing/guanshiduan/icon-arrow.png', 'haibao.guanshiBg': 'beijing/haibaobeijing.jpg', 'haibao.zuzhangBg': 'beijing/zuzhangbeijing.jpg', } # 后台配置页展示用中文说明(键名 pageBg 等仅供程序识别) ZIYUAN_MIAOSHU = { 'paihangbang.pageBg': '排行榜 · 整页背景图', 'paihangbang.cardBg': '排行榜 · 列表卡片背景', 'paihangbang.emptyIcon': '排行榜 · 暂无数据图标', 'paihangbang.refreshIcon': '排行榜 · 刷新按钮图标', 'shangjiaduan.pageBg': '商家端 · 首页背景图', 'shangjiaduan.avatarCardBg': '商家端 · 头像区域卡片背景', 'shangjiaduan.assetCardBg': '商家端 · 余额/资产卡片背景', 'shangjiaduan.statCardBg': '商家端 · 数据统计卡片背景', 'shangjiaduan.funcItemBg': '商家端 · 普通功能入口背景', 'shangjiaduan.primaryFuncBg': '商家端 · 主要功能按钮背景', 'shangjiaduan.highlightFuncBg': '商家端 · 高亮功能按钮背景', 'shangjiaduan.iconRelease': '商家端 · 发布/派单图标', 'shangjiaduan.iconFast': '商家端 · 快捷操作图标', 'shangjiaduan.iconOrders': '商家端 · 订单列表图标', 'shangjiaduan.iconService': '商家端 · 客服/服务图标', 'shangjiaduan.iconPunish': '商家端 · 处罚相关图标', 'shangjiaduan.iconRank': '商家端 · 排行榜入口图标', 'shangjiaduan.iconRecharge': '商家端 · 充值图标', 'shangjiaduan.iconWithdraw': '商家端 · 提现图标', 'shangjiaduan.iconRefresh': '商家端 · 刷新图标', 'shangjiaduan.iconCopy': '商家端 · 复制图标', 'shangjiaduan.avatarFrame': '商家端 · 头像边框装饰', 'guanshiduan.pageBg': '管事端 · 首页背景图', 'guanshiduan.topDecor': '管事端 · 顶部装饰图', 'guanshiduan.cardBg1': '管事端 · 卡片背景(样式一)', 'guanshiduan.cardBg2': '管事端 · 卡片背景(样式二)', 'guanshiduan.iconRefresh': '管事端 · 刷新图标', 'guanshiduan.iconCopy': '管事端 · 复制图标', 'guanshiduan.iconInvite': '管事端 · 邀请打手图标', 'guanshiduan.iconSub': '管事端 · 下级/下属图标', 'guanshiduan.iconRecord': '管事端 · 记录/流水图标', 'guanshiduan.iconRank': '管事端 · 排行榜图标', 'guanshiduan.iconPoster': '管事端 · 海报/分享图标', 'guanshiduan.iconWithdraw': '管事端 · 提现图标', 'guanshiduan.iconContact': '管事端 · 联系客服图标', 'guanshiduan.iconArrow': '管事端 · 箭头/跳转图标', 'haibao.guanshiBg': '管事推广海报 · 背景图', 'haibao.zuzhangBg': '组长推广海报 · 背景图', } def get_ziyuan_miaoshu(zu: str, key: str) -> str: return ZIYUAN_MIAOSHU.get(f'{zu}.{key}', f'{zu} · {key}') def clear_page_ziyuan_cache(): cache.delete_many([ f'{_CACHE_PREFIX}:all', f'{_CACHE_PREFIX}:paihangbang', f'{_CACHE_PREFIX}:shangjiaduan', f'{_CACHE_PREFIX}:guanshiduan', f'{_CACHE_PREFIX}:haibao', ]) def _load_all_from_db(): try: from peizhi.models import XcxPageZiyuan rows = XcxPageZiyuan.objects.all() data = {} for r in rows: key = f'{r.ziyuan_zu}.{r.ziyuan_key}' if r.ziyuan_path: data[key] = r.ziyuan_path.lstrip('/') return data except Exception: return {} def get_all_ziyuan_merged(): cached = cache.get(f'{_CACHE_PREFIX}:all') if cached is not None: return cached merged = dict(DEFAULT_ZIYUAN) merged.update(_load_all_from_db()) cache.set(f'{_CACHE_PREFIX}:all', merged, _CACHE_TTL) return merged def get_ziyuan_group(zu: str) -> dict: cache_key = f'{_CACHE_PREFIX}:{zu}' cached = cache.get(cache_key) if cached is not None: return cached merged = get_all_ziyuan_merged() group = {} prefix = f'{zu}.' for k, v in merged.items(): if k.startswith(prefix): group[k[len(prefix):]] = v cache.set(cache_key, group, _CACHE_TTL) return group def build_paihang_assets_for_api(): g = get_ziyuan_group('paihangbang') return { 'pageBg': g.get('pageBg', DEFAULT_ZIYUAN['paihangbang.pageBg']), 'cardBg': g.get('cardBg', DEFAULT_ZIYUAN['paihangbang.cardBg']), 'emptyIcon': g.get('emptyIcon', DEFAULT_ZIYUAN['paihangbang.emptyIcon']), 'refreshIcon': g.get('refreshIcon', DEFAULT_ZIYUAN['paihangbang.refreshIcon']), } def build_page_assets_for_api(): return { 'shangjiaduan': get_ziyuan_group('shangjiaduan'), 'paihangbang': get_ziyuan_group('paihangbang'), 'guanshiduan': get_ziyuan_group('guanshiduan'), 'haibao': get_ziyuan_group('haibao'), }