@@ -1,4 +1,5 @@
|
||||
import { createParamDecorator, ExecutionContext } from '@nestjs/common';
|
||||
import { Prisma } from '@prisma/client';
|
||||
import { AuthUser } from '../guards/jwt-auth.guard';
|
||||
|
||||
export const CurrentUser = createParamDecorator(
|
||||
@@ -7,8 +8,29 @@ export const CurrentUser = createParamDecorator(
|
||||
},
|
||||
);
|
||||
|
||||
export function serializeBigInt<T>(value: T): T {
|
||||
return JSON.parse(
|
||||
JSON.stringify(value, (_k, v) => (typeof v === 'bigint' ? v.toString() : v)),
|
||||
);
|
||||
function isPrismaDecimal(value: unknown): value is Prisma.Decimal {
|
||||
return Prisma.Decimal.isDecimal(value);
|
||||
}
|
||||
|
||||
function convertForJson(value: unknown): unknown {
|
||||
if (typeof value === 'bigint') return value.toString();
|
||||
if (isPrismaDecimal(value)) {
|
||||
const n = Number(value.toString());
|
||||
return Number.isFinite(n) ? n : 0;
|
||||
}
|
||||
if (value instanceof Date) return value.toISOString();
|
||||
if (Array.isArray(value)) return value.map(convertForJson);
|
||||
if (value && typeof value === 'object') {
|
||||
const out: Record<string, unknown> = {};
|
||||
for (const [k, v] of Object.entries(value as Record<string, unknown>)) {
|
||||
out[k] = convertForJson(v);
|
||||
}
|
||||
return out;
|
||||
}
|
||||
return value;
|
||||
}
|
||||
|
||||
/** JSON 安全序列化:bigint → string,Prisma.Decimal → number(避免金额变成 {} 被前端显示成 0) */
|
||||
export function serializeBigInt<T>(value: T): T {
|
||||
return JSON.parse(JSON.stringify(convertForJson(value))) as T;
|
||||
}
|
||||
|
||||
@@ -245,6 +245,7 @@ export const SYSTEM_CONFIG_FIELDS: SystemConfigFieldMeta[] = [
|
||||
key: 'SHARE_HINT',
|
||||
label: '分享引导文案',
|
||||
group: G.wechat_mini_share,
|
||||
subgroup: 'global',
|
||||
type: 'string',
|
||||
requiresRestart: false,
|
||||
placeholder: DEFAULT_SHARE_HINT,
|
||||
@@ -254,6 +255,7 @@ export const SYSTEM_CONFIG_FIELDS: SystemConfigFieldMeta[] = [
|
||||
key: 'SHARE_DEFAULT_TITLE',
|
||||
label: '默认分享标题',
|
||||
group: G.wechat_mini_share,
|
||||
subgroup: 'global',
|
||||
type: 'string',
|
||||
requiresRestart: false,
|
||||
placeholder: DEFAULT_SHARE_TITLE,
|
||||
@@ -263,6 +265,7 @@ export const SYSTEM_CONFIG_FIELDS: SystemConfigFieldMeta[] = [
|
||||
key: 'SHARE_DEFAULT_DESC',
|
||||
label: '默认分享描述',
|
||||
group: G.wechat_mini_share,
|
||||
subgroup: 'global',
|
||||
type: 'string',
|
||||
requiresRestart: false,
|
||||
placeholder: DEFAULT_SHARE_DESC,
|
||||
@@ -272,150 +275,170 @@ export const SYSTEM_CONFIG_FIELDS: SystemConfigFieldMeta[] = [
|
||||
key: 'SHARE_DEFAULT_IMAGE_URL',
|
||||
label: '默认分享图',
|
||||
group: G.wechat_mini_share,
|
||||
subgroup: 'global',
|
||||
type: 'image',
|
||||
requiresRestart: false,
|
||||
description: '各场景未配置图且无业务图时使用;建议接近 5:4',
|
||||
},
|
||||
{
|
||||
key: 'SHARE_HOME_TITLE',
|
||||
label: '首页 · 标题',
|
||||
label: '标题',
|
||||
group: G.wechat_mini_share,
|
||||
subgroup: 'home',
|
||||
type: 'string',
|
||||
requiresRestart: false,
|
||||
},
|
||||
{
|
||||
key: 'SHARE_HOME_DESC',
|
||||
label: '首页 · 描述',
|
||||
label: '描述',
|
||||
group: G.wechat_mini_share,
|
||||
subgroup: 'home',
|
||||
type: 'string',
|
||||
requiresRestart: false,
|
||||
},
|
||||
{
|
||||
key: 'SHARE_HOME_IMAGE_URL',
|
||||
label: '首页 · 分享图',
|
||||
label: '分享图',
|
||||
group: G.wechat_mini_share,
|
||||
subgroup: 'home',
|
||||
type: 'image',
|
||||
requiresRestart: false,
|
||||
description: '留空则优先用首页首张轮播图,再回退默认分享图',
|
||||
},
|
||||
{
|
||||
key: 'SHARE_STORES_TITLE',
|
||||
label: '门店列表 · 标题',
|
||||
label: '标题',
|
||||
group: G.wechat_mini_share,
|
||||
subgroup: 'stores',
|
||||
type: 'string',
|
||||
requiresRestart: false,
|
||||
placeholder: DEFAULT_SHARE_STORES_TITLE,
|
||||
},
|
||||
{
|
||||
key: 'SHARE_STORES_DESC',
|
||||
label: '门店列表 · 描述',
|
||||
label: '描述',
|
||||
group: G.wechat_mini_share,
|
||||
subgroup: 'stores',
|
||||
type: 'string',
|
||||
requiresRestart: false,
|
||||
},
|
||||
{
|
||||
key: 'SHARE_STORES_IMAGE_URL',
|
||||
label: '门店列表 · 分享图',
|
||||
label: '分享图',
|
||||
group: G.wechat_mini_share,
|
||||
subgroup: 'stores',
|
||||
type: 'image',
|
||||
requiresRestart: false,
|
||||
},
|
||||
{
|
||||
key: 'SHARE_STORE_DETAIL_TITLE',
|
||||
label: '门店详情 · 标题',
|
||||
label: '标题',
|
||||
group: G.wechat_mini_share,
|
||||
subgroup: 'storeDetail',
|
||||
type: 'string',
|
||||
requiresRestart: false,
|
||||
description: '留空则用门店名称',
|
||||
description: '小程序好友/朋友圈分享固定用门店名称;本项仅作其它端回退参考,可留空',
|
||||
},
|
||||
{
|
||||
key: 'SHARE_STORE_DETAIL_DESC',
|
||||
label: '门店详情 · 描述',
|
||||
label: '描述',
|
||||
group: G.wechat_mini_share,
|
||||
subgroup: 'storeDetail',
|
||||
type: 'string',
|
||||
requiresRestart: false,
|
||||
description: '留空则用门店简介/地址',
|
||||
},
|
||||
{
|
||||
key: 'SHARE_STORE_DETAIL_IMAGE_URL',
|
||||
label: '门店详情 · 分享图',
|
||||
label: '分享图',
|
||||
group: G.wechat_mini_share,
|
||||
subgroup: 'storeDetail',
|
||||
type: 'image',
|
||||
requiresRestart: false,
|
||||
description: '留空则用门头图/环境图',
|
||||
description: '小程序分享固定用门头图/环境图;本项可留空',
|
||||
},
|
||||
{
|
||||
key: 'SHARE_BENEFIT_TITLE',
|
||||
label: '权益页 · 标题',
|
||||
label: '标题',
|
||||
group: G.wechat_mini_share,
|
||||
subgroup: 'benefit',
|
||||
type: 'string',
|
||||
requiresRestart: false,
|
||||
placeholder: DEFAULT_SHARE_BENEFIT_TITLE,
|
||||
},
|
||||
{
|
||||
key: 'SHARE_BENEFIT_DESC',
|
||||
label: '权益页 · 描述',
|
||||
label: '描述',
|
||||
group: G.wechat_mini_share,
|
||||
subgroup: 'benefit',
|
||||
type: 'string',
|
||||
requiresRestart: false,
|
||||
},
|
||||
{
|
||||
key: 'SHARE_BENEFIT_IMAGE_URL',
|
||||
label: '权益页 · 分享图',
|
||||
label: '分享图',
|
||||
group: G.wechat_mini_share,
|
||||
subgroup: 'benefit',
|
||||
type: 'image',
|
||||
requiresRestart: false,
|
||||
},
|
||||
{
|
||||
key: 'SHARE_MINE_TITLE',
|
||||
label: '我的 · 标题',
|
||||
label: '标题',
|
||||
group: G.wechat_mini_share,
|
||||
subgroup: 'mine',
|
||||
type: 'string',
|
||||
requiresRestart: false,
|
||||
placeholder: DEFAULT_SHARE_MINE_TITLE,
|
||||
},
|
||||
{
|
||||
key: 'SHARE_MINE_DESC',
|
||||
label: '我的 · 描述',
|
||||
label: '描述',
|
||||
group: G.wechat_mini_share,
|
||||
subgroup: 'mine',
|
||||
type: 'string',
|
||||
requiresRestart: false,
|
||||
},
|
||||
{
|
||||
key: 'SHARE_MINE_IMAGE_URL',
|
||||
label: '我的 · 分享图',
|
||||
label: '分享图',
|
||||
group: G.wechat_mini_share,
|
||||
subgroup: 'mine',
|
||||
type: 'image',
|
||||
requiresRestart: false,
|
||||
},
|
||||
{
|
||||
key: 'SHARE_PRODUCT_DETAIL_TITLE',
|
||||
label: '商品详情 · 标题',
|
||||
label: '标题',
|
||||
group: G.wechat_mini_share,
|
||||
subgroup: 'productDetail',
|
||||
type: 'string',
|
||||
requiresRestart: false,
|
||||
description: '留空则用商品名称',
|
||||
description: '小程序好友/朋友圈分享固定用商品名称;本项可留空',
|
||||
},
|
||||
{
|
||||
key: 'SHARE_PRODUCT_DETAIL_DESC',
|
||||
label: '商品详情 · 描述',
|
||||
label: '描述',
|
||||
group: G.wechat_mini_share,
|
||||
subgroup: 'productDetail',
|
||||
type: 'string',
|
||||
requiresRestart: false,
|
||||
description: '留空则用商品副标题',
|
||||
},
|
||||
{
|
||||
key: 'SHARE_PRODUCT_DETAIL_IMAGE_URL',
|
||||
label: '商品详情 · 分享图',
|
||||
label: '分享图',
|
||||
group: G.wechat_mini_share,
|
||||
subgroup: 'productDetail',
|
||||
type: 'image',
|
||||
requiresRestart: false,
|
||||
description: '留空则用商品主图',
|
||||
description: '小程序分享固定用商品主图;本项可留空',
|
||||
},
|
||||
{
|
||||
key: 'SHARE_ORDER_DETAIL_TITLE',
|
||||
label: '订单详情 · 标题',
|
||||
label: '标题',
|
||||
group: G.wechat_mini_share,
|
||||
subgroup: 'orderDetail',
|
||||
type: 'string',
|
||||
requiresRestart: false,
|
||||
placeholder: DEFAULT_SHARE_ORDER_TITLE,
|
||||
@@ -423,15 +446,17 @@ export const SYSTEM_CONFIG_FIELDS: SystemConfigFieldMeta[] = [
|
||||
},
|
||||
{
|
||||
key: 'SHARE_ORDER_DETAIL_DESC',
|
||||
label: '订单详情 · 描述',
|
||||
label: '描述',
|
||||
group: G.wechat_mini_share,
|
||||
subgroup: 'orderDetail',
|
||||
type: 'string',
|
||||
requiresRestart: false,
|
||||
},
|
||||
{
|
||||
key: 'SHARE_ORDER_DETAIL_IMAGE_URL',
|
||||
label: '订单详情 · 分享图',
|
||||
label: '分享图',
|
||||
group: G.wechat_mini_share,
|
||||
subgroup: 'orderDetail',
|
||||
type: 'image',
|
||||
requiresRestart: false,
|
||||
},
|
||||
|
||||
Reference in New Issue
Block a user