diff --git a/apps/shop-admin/locales-extra.ts b/apps/shop-admin/locales-extra.ts
index de47042..d4d4e30 100644
--- a/apps/shop-admin/locales-extra.ts
+++ b/apps/shop-admin/locales-extra.ts
@@ -7,6 +7,7 @@ export const enExtra = {
nav: {
coupons: "Coupons",
flashSales: "Flash sales",
+ groupBuying: "Group buying",
},
shop: {
dashboardTitle: "Merchant dashboard",
@@ -117,6 +118,33 @@ export const enExtra = {
flashStockInvalid: "Reserved stock cannot be negative.",
flashLimitInvalid: "Per-customer limit must be a positive integer.",
flashWindowInvalid: "End must not precede start.",
+ groupBuyingList: "Group buying",
+ newGroupActivity: "New activity",
+ editGroupActivity: "Edit activity",
+ groupNameEn: "Name (English)",
+ groupNameZh: "Name (中文)",
+ groupDescriptionEn: "Description (English)",
+ groupDescriptionZh: "Description (中文)",
+ groupSku: "SKU",
+ groupPrice: "Group price (minor units)",
+ groupRequiredMembers: "Required paid members",
+ groupLifetimeHours: "Group lifetime (hours)",
+ groupStartsAt: "Starts at",
+ groupEndsAt: "Ends at",
+ groupEnabled: "Enabled",
+ createGroupActivity: "Create activity",
+ updateGroupActivity: "Update activity",
+ groupActivitySaved: "Activity saved.",
+ groupOpenGroups: "Open groups",
+ groupNoOpenGroups: "No open groups.",
+ groupPaidMembers: "Joined",
+ groupExpiresAt: "Expires",
+ groupNameRequired: "Both language names are required.",
+ groupSkuRequired: "Choose a SKU.",
+ groupPriceInvalid: "Group price must be a positive integer.",
+ groupMembersInvalid: "At least two paid members are required.",
+ groupLifetimeInvalid: "Group lifetime must be a positive number of hours.",
+ groupWindowInvalid: "End must not precede start.",
},
} as Record
;
@@ -127,6 +155,7 @@ export const zhExtra = {
nav: {
coupons: "优惠券",
flashSales: "秒杀",
+ groupBuying: "拼团",
},
shop: {
dashboardTitle: "商家仪表盘",
@@ -237,5 +266,32 @@ export const zhExtra = {
flashStockInvalid: "活动库存不能为负数。",
flashLimitInvalid: "每人限购必须为正整数。",
flashWindowInvalid: "结束时间不能早于开始时间。",
+ groupBuyingList: "拼团活动",
+ newGroupActivity: "新建活动",
+ editGroupActivity: "编辑活动",
+ groupNameEn: "名称(英文)",
+ groupNameZh: "名称(中文)",
+ groupDescriptionEn: "描述(英文)",
+ groupDescriptionZh: "描述(中文)",
+ groupSku: "SKU",
+ groupPrice: "拼团价(最小单位)",
+ groupRequiredMembers: "成团人数",
+ groupLifetimeHours: "团有效期(小时)",
+ groupStartsAt: "开始时间",
+ groupEndsAt: "结束时间",
+ groupEnabled: "启用",
+ createGroupActivity: "创建活动",
+ updateGroupActivity: "更新活动",
+ groupActivitySaved: "活动已保存。",
+ groupOpenGroups: "进行中的团",
+ groupNoOpenGroups: "暂无进行中的团。",
+ groupPaidMembers: "已参团",
+ groupExpiresAt: "到期",
+ groupNameRequired: "中英文名称均为必填项。",
+ groupSkuRequired: "请选择 SKU。",
+ groupPriceInvalid: "拼团价必须为正整数。",
+ groupMembersInvalid: "成团人数至少为 2。",
+ groupLifetimeInvalid: "团有效期必须为正数小时。",
+ groupWindowInvalid: "结束时间不能早于开始时间。",
},
} as Record;
diff --git a/apps/shop-admin/pages/group-buying.vue b/apps/shop-admin/pages/group-buying.vue
new file mode 100644
index 0000000..6104fe9
--- /dev/null
+++ b/apps/shop-admin/pages/group-buying.vue
@@ -0,0 +1,356 @@
+
+
+
+
+
{{ $t("shop.groupBuyingList") }}
+
{{ error }}
+
{{ message }}
+
+
+
+
{{ $t("common.loading") }}
+
{{ $t("common.empty") }}
+
+
+
+
+ | {{ $t("shop.groupSku") }} |
+ {{ $t("shop.groupNameEn") }} |
+ {{ $t("shop.groupPrice") }} |
+ {{ $t("shop.groupRequiredMembers") }} |
+ {{ $t("shop.groupLifetimeHours") }} |
+ {{ $t("shop.groupStartsAt") }} |
+ {{ $t("shop.groupOpenGroups") }} |
+ {{ $t("common.status") }} |
+ {{ $t("common.actions") }} |
+
+
+
+
+ | {{ activity.sku_code }} |
+ {{ activity.name[locale] ?? activity.name.en }} |
+ {{ fmt(activity.group_price_minor, activity.currency) }} |
+ {{ activity.required_members }} |
+ {{ activity.group_lifetime_hours }} |
+ {{ activity.starts_at.slice(0, 10) }} |
+
+
+
+ {{ $t("shop.groupPaidMembers") }} {{ group.paid_member_count }}/{{ group.required_members }}
+
+
+ {{ $t("shop.groupNoOpenGroups") }}
+ |
+
+
+ {{ activity.enabled ? $t("shop.enabledOn") : $t("shop.enabledOff") }}
+
+ |
+
+
+
+ |
+
+
+
+
+
+
+
+