feat(mini-user): configurable WeChat mini share scenes in system settings

Add HQ group for default and per-page share title/desc/image; expose via client-config and wire all mini-user share entry points.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
2026-08-06 15:45:57 +08:00
parent a2abbb6169
commit 83b1b0e5f6
12 changed files with 526 additions and 106 deletions
@@ -5,6 +5,13 @@ import {
BRAND_LOGO_URL,
BRAND_LOGO_WIDE_URL,
CUSTOMER_SERVICE_PHONE,
DEFAULT_SHARE_BENEFIT_TITLE,
DEFAULT_SHARE_DESC,
DEFAULT_SHARE_HINT,
DEFAULT_SHARE_MINE_TITLE,
DEFAULT_SHARE_ORDER_TITLE,
DEFAULT_SHARE_STORES_TITLE,
DEFAULT_SHARE_TITLE,
DEFAULT_USER_H5_URL,
MINI_USER_STATIC_OSS_BASE,
MOCK_SMS_FIXED_CODE,
@@ -17,6 +24,7 @@ export const SYSTEM_CONFIG_GROUPS: SystemConfigGroupMeta[] = [
{ key: 'sms', label: '短信' },
{ key: 'wechat', label: '微信' },
{ key: 'wechat_mini', label: '微信小程序配置' },
{ key: 'wechat_mini_share', label: '小程序分享配置' },
{ key: 'oss', label: '对象存储 OSS' },
{ key: 'app', label: '应用链接' },
{ key: 'deploy', label: '发布部署' },
@@ -29,6 +37,7 @@ const G = {
sms: 'sms',
wechat: 'wechat',
wechat_mini: 'wechat_mini',
wechat_mini_share: 'wechat_mini_share',
oss: 'oss',
app: 'app',
deploy: 'deploy',
@@ -160,7 +169,7 @@ export const SYSTEM_CONFIG_FIELDS: SystemConfigFieldMeta[] = [
group: G.wechat_mini,
type: 'image',
requiresRestart: false,
description: '分享卡片默认图、首页等品牌展示',
description: '品牌方形 Logo;分享默认图未单独配置时回退此图',
},
{
key: 'BRAND_LOGO_WIDE_URL',
@@ -214,6 +223,202 @@ export const SYSTEM_CONFIG_FIELDS: SystemConfigFieldMeta[] = [
description: '仅 MOCK_SMS 开启时生效;留空则用默认 999888',
},
// —— 小程序分享配置 ——
{
key: 'SHARE_HINT',
label: '分享引导文案',
group: G.wechat_mini_share,
type: 'string',
requiresRestart: false,
placeholder: DEFAULT_SHARE_HINT,
description: '点击分享按钮后的 Toast 提示(小程序内)',
},
{
key: 'SHARE_DEFAULT_TITLE',
label: '默认分享标题',
group: G.wechat_mini_share,
type: 'string',
requiresRestart: false,
placeholder: DEFAULT_SHARE_TITLE,
description: '各场景未单独配置标题时使用',
},
{
key: 'SHARE_DEFAULT_DESC',
label: '默认分享描述',
group: G.wechat_mini_share,
type: 'string',
requiresRestart: false,
placeholder: DEFAULT_SHARE_DESC,
description: 'H5 分享卡片描述;小程序朋友圈/好友卡片副文案回退',
},
{
key: 'SHARE_DEFAULT_IMAGE_URL',
label: '默认分享图',
group: G.wechat_mini_share,
type: 'image',
requiresRestart: false,
description: '各场景未配置图且无业务图时使用;建议接近 5:4',
},
{
key: 'SHARE_HOME_TITLE',
label: '首页 · 标题',
group: G.wechat_mini_share,
type: 'string',
requiresRestart: false,
},
{
key: 'SHARE_HOME_DESC',
label: '首页 · 描述',
group: G.wechat_mini_share,
type: 'string',
requiresRestart: false,
},
{
key: 'SHARE_HOME_IMAGE_URL',
label: '首页 · 分享图',
group: G.wechat_mini_share,
type: 'image',
requiresRestart: false,
description: '留空则优先用首页首张轮播图,再回退默认分享图',
},
{
key: 'SHARE_STORES_TITLE',
label: '门店列表 · 标题',
group: G.wechat_mini_share,
type: 'string',
requiresRestart: false,
placeholder: DEFAULT_SHARE_STORES_TITLE,
},
{
key: 'SHARE_STORES_DESC',
label: '门店列表 · 描述',
group: G.wechat_mini_share,
type: 'string',
requiresRestart: false,
},
{
key: 'SHARE_STORES_IMAGE_URL',
label: '门店列表 · 分享图',
group: G.wechat_mini_share,
type: 'image',
requiresRestart: false,
},
{
key: 'SHARE_STORE_DETAIL_TITLE',
label: '门店详情 · 标题',
group: G.wechat_mini_share,
type: 'string',
requiresRestart: false,
description: '留空则用门店名称',
},
{
key: 'SHARE_STORE_DETAIL_DESC',
label: '门店详情 · 描述',
group: G.wechat_mini_share,
type: 'string',
requiresRestart: false,
description: '留空则用门店简介/地址',
},
{
key: 'SHARE_STORE_DETAIL_IMAGE_URL',
label: '门店详情 · 分享图',
group: G.wechat_mini_share,
type: 'image',
requiresRestart: false,
description: '留空则用门头图/环境图',
},
{
key: 'SHARE_BENEFIT_TITLE',
label: '权益页 · 标题',
group: G.wechat_mini_share,
type: 'string',
requiresRestart: false,
placeholder: DEFAULT_SHARE_BENEFIT_TITLE,
},
{
key: 'SHARE_BENEFIT_DESC',
label: '权益页 · 描述',
group: G.wechat_mini_share,
type: 'string',
requiresRestart: false,
},
{
key: 'SHARE_BENEFIT_IMAGE_URL',
label: '权益页 · 分享图',
group: G.wechat_mini_share,
type: 'image',
requiresRestart: false,
},
{
key: 'SHARE_MINE_TITLE',
label: '我的 · 标题',
group: G.wechat_mini_share,
type: 'string',
requiresRestart: false,
placeholder: DEFAULT_SHARE_MINE_TITLE,
},
{
key: 'SHARE_MINE_DESC',
label: '我的 · 描述',
group: G.wechat_mini_share,
type: 'string',
requiresRestart: false,
},
{
key: 'SHARE_MINE_IMAGE_URL',
label: '我的 · 分享图',
group: G.wechat_mini_share,
type: 'image',
requiresRestart: false,
},
{
key: 'SHARE_PRODUCT_DETAIL_TITLE',
label: '商品详情 · 标题',
group: G.wechat_mini_share,
type: 'string',
requiresRestart: false,
description: '留空则用商品名称',
},
{
key: 'SHARE_PRODUCT_DETAIL_DESC',
label: '商品详情 · 描述',
group: G.wechat_mini_share,
type: 'string',
requiresRestart: false,
description: '留空则用商品副标题',
},
{
key: 'SHARE_PRODUCT_DETAIL_IMAGE_URL',
label: '商品详情 · 分享图',
group: G.wechat_mini_share,
type: 'image',
requiresRestart: false,
description: '留空则用商品主图',
},
{
key: 'SHARE_ORDER_DETAIL_TITLE',
label: '订单详情 · 标题',
group: G.wechat_mini_share,
type: 'string',
requiresRestart: false,
placeholder: DEFAULT_SHARE_ORDER_TITLE,
description: '支持 {productName} 占位符',
},
{
key: 'SHARE_ORDER_DETAIL_DESC',
label: '订单详情 · 描述',
group: G.wechat_mini_share,
type: 'string',
requiresRestart: false,
},
{
key: 'SHARE_ORDER_DETAIL_IMAGE_URL',
label: '订单详情 · 分享图',
group: G.wechat_mini_share,
type: 'image',
requiresRestart: false,
},
{ key: 'OSS_ACCESS_KEY_ID', label: 'OSS AccessKey ID', group: G.oss, type: 'password', secret: true, requiresRestart: true },
{ key: 'OSS_ACCESS_KEY_SECRET', label: 'OSS AccessKey Secret', group: G.oss, type: 'password', secret: true, requiresRestart: true },
{ key: 'OSS_BUCKET', label: 'OSS Bucket', group: G.oss, type: 'string', requiresRestart: true },
@@ -345,6 +550,20 @@ export const SYSTEM_CONFIG_DEFAULTS: Record<string, string> = {
QUALIFICATION_DISCLOSURE_URL: QUALIFICATION_DISCLOSURE_URL,
CUSTOMER_SERVICE_PHONE: CUSTOMER_SERVICE_PHONE,
MOCK_SMS_FIXED_CODE: MOCK_SMS_FIXED_CODE,
SHARE_HINT: DEFAULT_SHARE_HINT,
SHARE_DEFAULT_TITLE: DEFAULT_SHARE_TITLE,
SHARE_DEFAULT_DESC: DEFAULT_SHARE_DESC,
SHARE_DEFAULT_IMAGE_URL: BRAND_LOGO_URL,
SHARE_HOME_TITLE: DEFAULT_SHARE_TITLE,
SHARE_HOME_DESC: DEFAULT_SHARE_DESC,
SHARE_STORES_TITLE: DEFAULT_SHARE_STORES_TITLE,
SHARE_STORES_DESC: DEFAULT_SHARE_DESC,
SHARE_BENEFIT_TITLE: DEFAULT_SHARE_BENEFIT_TITLE,
SHARE_BENEFIT_DESC: DEFAULT_SHARE_DESC,
SHARE_MINE_TITLE: DEFAULT_SHARE_MINE_TITLE,
SHARE_MINE_DESC: DEFAULT_SHARE_DESC,
SHARE_ORDER_DETAIL_TITLE: DEFAULT_SHARE_ORDER_TITLE,
SHARE_ORDER_DETAIL_DESC: DEFAULT_SHARE_DESC,
};
export function getSystemConfigField(key: string): SystemConfigFieldMeta | undefined {
@@ -1,5 +1,9 @@
import { Controller, Get } from '@nestjs/common';
import { parseMiniHomeBanners, resolveClientBrandRuntime } from '@dukang/shared-types';
import {
parseMiniHomeBanners,
resolveClientBrandRuntime,
resolveMiniShareRuntime,
} from '@dukang/shared-types';
import { SystemConfigService } from '../../common/system-config/system-config.service';
@Controller('common')
@@ -13,6 +17,7 @@ export class ClientConfigController {
const footer = (env.MINI_HOME_FOOTER_URL ?? '').trim();
const minClientVersion = (env.MINI_USER_MIN_VERSION ?? '').trim() || null;
const brand = resolveClientBrandRuntime(env);
const share = resolveMiniShareRuntime(env);
return {
mockPay: cfg.mockPay,
wechatPayEnabled: cfg.wechatPayEnabled,
@@ -32,6 +37,7 @@ export class ClientConfigController {
brandLogoMarkUrl: brand.brandLogoMarkUrl,
qualificationDisclosureUrl: brand.qualificationDisclosureUrl,
customerServicePhone: brand.customerServicePhone,
share,
};
}
}