feat(mall): classic B2B2C PC storefront with fixed mock API layer

- Mock adapter implementing @vmall/shared ApiClient (localStorage-persisted
  cart/orders/invoices), runtime switch via mockApi flag (default on)
- Fixed bilingual mock catalog: 3-level categories, 24 products w/ SKUs,
  stores, brands, banners, floors, seckill/collective/integral, comments,
  coupons, addresses, seeded orders/shipments/invoices
- B2B2C mall shell: top bar, logo/search/cart header, dark nav + category
  mega-menu, value-prop footer, back-to-top; 1200px grid, #ca151e theme
- UI primitives replacing element-plus: carousel, pagination, breadcrumb,
  qty stepper, rating stars, modal, tabs, step bar, product card
- Pages: home floors, search (filters/sort/paging), goods detail (SKU
  picker, store rail, review tabs), cart -> checkout -> pay -> success,
  auth pages, user center (dashboard/orders/addresses/favorites/coupons/
  invoices), stores, seckill, collective, integral
- i18n split into per-domain locale modules (en+zh)
- OpenSpec change mall-pc-storefront-replica archived; all specs green
This commit is contained in:
Chengdong Zhang
2026-09-17 19:13:29 +08:00
parent 997c312cda
commit 21e99bb52b
111 changed files with 9458 additions and 1035 deletions
+72
View File
@@ -0,0 +1,72 @@
export default {
en: {
auth: {
loginTitle: "Account sign in",
registerTitle: "Create account",
forgotTitle: "Reset password",
loginTab: "Account sign in",
registerTab: "Create account",
forgotTab: "Forgot password",
emailPlaceholder: "Enter your email",
passwordPlaceholder: "Enter your password",
newPassword: "New password",
displayNamePlaceholder: "Enter your display name",
confirmPassword: "Confirm password",
confirmPasswordPlaceholder: "Enter your password again",
smsCode: "Verification code",
smsCodePlaceholder: "Enter the code",
getCode: "Get code",
codeCountdown: "Retry in {n}s",
loginAction: "Sign in",
registerAction: "Create account",
resetAction: "Reset password",
forgotPassword: "Forgot password?",
noAccount: "Don't have an account?",
haveAccount: "Already have an account?",
registerNow: "Create one now",
loginNow: "Sign in now",
resetSuccess: "Password reset",
resetSuccessHint: "Your password has been reset. Sign in with your new password.",
validationRequired: "Please complete all required fields.",
validationEmail: "Enter a valid email address.",
validationPassword: "Password must be at least 6 characters.",
validationMismatch: "Passwords do not match.",
requestFailed: "Unable to complete this request. Please try again.",
},
},
zh: {
auth: {
loginTitle: "账号登录",
registerTitle: "注册账号",
forgotTitle: "忘记密码",
loginTab: "账号登录",
registerTab: "注册账号",
forgotTab: "忘记密码",
emailPlaceholder: "请输入邮箱",
passwordPlaceholder: "请输入密码",
newPassword: "新密码",
displayNamePlaceholder: "请输入昵称",
confirmPassword: "确认密码",
confirmPasswordPlaceholder: "请再次输入密码",
smsCode: "验证码",
smsCodePlaceholder: "请输入验证码",
getCode: "获取验证码",
codeCountdown: "{n} 秒后重试",
loginAction: "登录",
registerAction: "注册",
resetAction: "重置密码",
forgotPassword: "忘记密码?",
noAccount: "还没有账号?",
haveAccount: "已有账号?",
registerNow: "立即注册",
loginNow: "立即登录",
resetSuccess: "密码重置成功",
resetSuccessHint: "您的密码已重置,请使用新密码登录。",
validationRequired: "请填写所有必填项。",
validationEmail: "请输入有效的邮箱地址。",
validationPassword: "密码至少需要 6 位。",
validationMismatch: "两次输入的密码不一致。",
requestFailed: "操作失败,请稍后重试。",
},
},
};
+46
View File
@@ -0,0 +1,46 @@
export default {
en: {
cart: {
title: "Shopping cart",
steps: { cart: "Cart", order: "Confirm order", payment: "Payment", complete: "Complete" },
empty: "Your cart is empty",
continueShopping: "Continue shopping",
selectAll: "Select all",
selectedCount: "{n} selected",
product: "Product",
spec: "Specification",
unitPrice: "Unit price",
quantity: "Quantity",
subtotal: "Subtotal",
actions: "Actions",
remove: "Remove",
shop: "Shop",
unknownStore: "Store",
checkout: "Checkout",
loadError: "Unable to load your cart.",
updateError: "Unable to update your cart.",
},
},
zh: {
cart: {
title: "购物车",
steps: { cart: "购物车", order: "确认订单", payment: "支付", complete: "完成" },
empty: "购物车还是空的",
continueShopping: "继续购物",
selectAll: "全选",
selectedCount: "已选 {n} 件",
product: "商品",
spec: "规格",
unitPrice: "单价",
quantity: "数量",
subtotal: "小计",
actions: "操作",
remove: "移除",
shop: "店铺",
unknownStore: "店铺",
checkout: "去结算",
loadError: "购物车加载失败,请稍后重试。",
updateError: "购物车更新失败,请稍后重试。",
},
},
};
+68
View File
@@ -0,0 +1,68 @@
export default {
en: {
checkout: {
title: "Confirm order",
steps: { cart: "Cart", order: "Confirm order", payment: "Payment", complete: "Complete" },
address: "Shipping address",
defaultAddress: "Default",
orderPreview: "Order details",
shop: "Shop",
remark: "Order remark",
remarkPlaceholder: "Add a note for the seller (optional)",
total: "Order total",
submit: "Place order",
noItems: "There are no items to check out.",
backToCart: "Back to cart",
loadError: "Unable to load the order.",
submitError: "Unable to place the order.",
paymentTitle: "Choose payment",
balance: "Balance payment",
wechat: "WeChat Pay",
alipay: "Alipay",
payTitle: "Pay for your order",
orderNo: "Order no.",
grandTotal: "Total payment",
confirmPay: "Confirm payment",
noPendingOrders: "There are no orders waiting for payment.",
backHome: "Back to home",
payError: "Unable to complete payment.",
successTitle: "Payment successful",
successMessage: "Your order has been paid successfully.",
viewOrders: "View orders",
continueShopping: "Continue shopping",
},
},
zh: {
checkout: {
title: "确认订单",
steps: { cart: "购物车", order: "确认订单", payment: "支付", complete: "完成" },
address: "收货地址",
defaultAddress: "默认地址",
orderPreview: "订单商品",
shop: "店铺",
remark: "订单备注",
remarkPlaceholder: "给卖家留言(选填)",
total: "订单总额",
submit: "提交订单",
noItems: "暂无可结算的商品。",
backToCart: "返回购物车",
loadError: "订单信息加载失败,请稍后重试。",
submitError: "订单提交失败,请稍后重试。",
paymentTitle: "选择支付方式",
balance: "余额支付",
wechat: "微信支付",
alipay: "支付宝",
payTitle: "订单支付",
orderNo: "订单号",
grandTotal: "应付总额",
confirmPay: "确认支付",
noPendingOrders: "暂无待支付订单。",
backHome: "返回首页",
payError: "支付失败,请稍后重试。",
successTitle: "订单支付成功",
successMessage: "您的订单已支付成功。",
viewOrders: "查看订单",
continueShopping: "继续购物",
},
},
};
+17
View File
@@ -0,0 +1,17 @@
// Home page domain strings.
export default {
en: {
home: {
viewMore: "View more",
quickLinks: "Quick links",
hotPromo: "Featured",
},
},
zh: {
home: {
viewMore: "查看更多",
quickLinks: "快捷入口",
hotPromo: "精选活动",
},
},
};
+82
View File
@@ -0,0 +1,82 @@
export default {
en: {
marketing: {
seckillTitle: "Flash sale",
seckillBreadcrumb: "Flash sale",
currentSession: "Now",
upcoming: "Coming soon",
ended: "Ended",
countdown: "Ends in {time}",
seckillPrice: "Flash price",
originalPrice: "Original price",
progress: "Sold {n}%",
buyNow: "Grab now",
noSeckillProducts: "No flash-sale products right now.",
collectiveTitle: "Group deals",
collectiveBreadcrumb: "Group deals",
collectiveBannerAlt: "Group deal promotion",
peopleGroup: "{n} people group",
peopleJoined: "{n} people joined",
joinGroup: "View deal",
noCollectiveProducts: "No group deals right now.",
integralTitle: "Points mall",
integralBreadcrumb: "Points mall",
integralBannerAlt: "Points mall promotion",
loginPrompt: "Sign in to see your points",
pointsBalance: "My points",
customize: "Personal customization",
shipping: "Ships within 24 hours",
support: "Priority support",
recommendation: "Popular rewards",
points: "{n} points",
marketPrice: "Market price",
stock: "Stock {n}",
redeem: "Redeem now",
redeemed: "Redeemed",
mockNotice: "Demo redemption completed",
login: "Sign in",
register: "Create account",
noIntegralProducts: "No rewards available right now.",
},
},
zh: {
marketing: {
seckillTitle: "限时秒杀",
seckillBreadcrumb: "秒杀活动",
currentSession: "正在进行",
upcoming: "即将开始",
ended: "已结束",
countdown: "距结束 {time}",
seckillPrice: "秒杀价",
originalPrice: "原价",
progress: "已抢 {n}%",
buyNow: "马上抢",
noSeckillProducts: "当前暂无秒杀商品。",
collectiveTitle: "拼团购",
collectiveBreadcrumb: "拼团",
collectiveBannerAlt: "拼团活动",
peopleGroup: "{n}人团",
peopleJoined: "{n}人已拼",
joinGroup: "查看详情",
noCollectiveProducts: "当前暂无拼团商品。",
integralTitle: "积分商城",
integralBreadcrumb: "积分商城",
integralBannerAlt: "积分商城活动",
loginPrompt: "登录后查看您的积分",
pointsBalance: "我的积分",
customize: "私人定制",
shipping: "24小时发货",
support: "优先客服",
recommendation: "热门推荐",
points: "{n}积分",
marketPrice: "市场价",
stock: "库存 {n}",
redeem: "立即兑换",
redeemed: "已兑换",
mockNotice: "模拟兑换成功",
login: "登录",
register: "注册",
noIntegralProducts: "当前暂无积分商品。",
},
},
} as const;
+93
View File
@@ -0,0 +1,93 @@
// Product browse/detail domain strings (foundation-owned base keys; extend, don't remove).
export default {
en: {
product: {
salesCount: "{n} sold",
commentCount: "{n} reviews",
home: "Home",
detail: "Product details",
currentPrice: "Sale price",
marketPrice: "Market price",
stock: "In stock: {n}",
sold: "{n} sold",
coupon: "Coupon",
coupons: "Available coupons",
claim: "Claim",
choose: "Choose",
selected: "Selected",
quantity: "Quantity",
buyNow: "Buy now",
addCart: "Add to cart",
addedCart: "Added to cart",
favorite: "Favorite",
unfavorite: "Unfavorite",
noStock: "Out of stock",
unavailable: "This combination is unavailable",
store: "Store",
quality: "Product quality",
company: "Company",
region: "Region",
rates: "Store ratings",
overall: "Overall",
service: "Service",
delivery: "Delivery",
enterStore: "Visit store",
contact: "Contact seller",
salesRank: "Best sellers",
tabsDetail: "Product details",
tabsReviews: "Customer reviews",
tabsAfterSale: "After-sales service",
description: "Description",
reviewSummary: "{rate}% positive reviews ({n} total)",
reviewAll: "All reviews",
reply: "Seller reply",
expires: "Expires {date}",
productNotFound: "Product not found",
},
},
zh: {
product: {
salesCount: "已售 {n} 件",
commentCount: "{n} 条评价",
home: "首页",
detail: "商品详情",
currentPrice: "活动价",
marketPrice: "市场价",
stock: "库存 {n} 件",
sold: "已售 {n} 件",
coupon: "优惠券",
coupons: "可用优惠券",
claim: "领取",
choose: "选择",
selected: "已选",
quantity: "数量",
buyNow: "立即购买",
addCart: "加入购物车",
addedCart: "已加入购物车",
favorite: "收藏",
unfavorite: "取消收藏",
noStock: "暂时缺货",
unavailable: "该规格暂不可用",
store: "店铺",
quality: "商品质量",
company: "公司",
region: "所在地区",
rates: "店铺评分",
overall: "描述相符",
service: "服务态度",
delivery: "物流服务",
enterStore: "进入店铺",
contact: "联系客服",
salesRank: "销售排行",
tabsDetail: "商品详情",
tabsReviews: "用户评价",
tabsAfterSale: "售后服务",
description: "商品描述",
reviewSummary: "好评率 {rate}%(共 {n} 条评价)",
reviewAll: "全部评价",
reply: "商家回复",
expires: "有效期至 {date}",
productNotFound: "商品不存在",
},
},
};
+40
View File
@@ -0,0 +1,40 @@
export default {
en: {
search: {
home: "Home",
searchResults: 'Results for "{keyword}"',
productList: "Product list",
category: "Category",
all: "All",
brand: "Brand",
sort: "Sort",
defaultSort: "Default",
price: "Price",
sales: "Sales",
comments: "Reviews",
ascending: "Ascending",
descending: "Descending",
empty: "No products found",
resultCount: "{n} products",
},
},
zh: {
search: {
home: "首页",
searchResults: '搜索 “{keyword}” 结果列表',
productList: "商品列表",
category: "商品分类",
all: "全部",
brand: "品牌筛选",
sort: "筛选排序",
defaultSort: "默认",
price: "价格",
sales: "销量",
comments: "评论",
ascending: "升序",
descending: "降序",
empty: "暂无相关商品",
resultCount: "共 {n} 件商品",
},
},
};
+79
View File
@@ -0,0 +1,79 @@
// Shell chrome: top bar, header/search/nav, category menu, footer.
export default {
en: {
shell: {
officialSite: "Official Site",
mallHome: "Mall Home",
contact: "Contact Us",
about: "About Us",
login: "Sign in",
register: "Register",
welcome: "Welcome,",
userCenter: "My Account",
logout: "Sign out",
sellerJoin: "Sell on VMall",
mobile: "Mobile",
appDownload: "App",
city: "San Francisco",
searchPlaceholder: "phones, laptops, clothing",
myMall: "My VMall",
myCart: "My Cart",
allCategories: "All Categories",
nav: {
home: "Home",
stores: "Stores",
seckill: "Flash Sale",
collective: "Group Buy",
integral: "Points Mall",
help: "Help Center",
},
footer: {
v1: "Fortune-500 quality",
v2: "7-day returns, 15-day exchanges",
v3: "Free shipping over $99",
v4: "448 service centers nationwide",
copyright: "VMall Demo Mall — all content is fixed mock data.",
icp: "Mock ICP 2026-0001",
},
backToTop: "Top",
},
},
zh: {
shell: {
officialSite: "官网首页",
mallHome: "商城首页",
contact: "联系我们",
about: "关于我们",
login: "登录",
register: "注册",
welcome: "欢迎您,",
userCenter: "个人中心",
logout: "退出登录",
sellerJoin: "商家入驻",
mobile: "手机端",
appDownload: "APP下载",
city: "旧金山",
searchPlaceholder: "手机 笔记本电脑 衣服",
myMall: "我的商城",
myCart: "我的购物车",
allCategories: "全部商品分类",
nav: {
home: "首页",
stores: "店铺街",
seckill: "秒杀",
collective: "拼团",
integral: "积分商城",
help: "帮助中心",
},
footer: {
v1: "500强企业 品质保证",
v2: "7天退货 15天换货",
v3: "满99美元免运费",
v4: "448家维修网点 全国联保",
copyright: "VMall 演示商城 —— 所有内容均为固定 mock 数据。",
icp: "模拟备案号 2026-0001",
},
backToTop: "顶部",
},
},
};
+60
View File
@@ -0,0 +1,60 @@
export default {
en: {
stores: {
breadcrumbHome: "Home",
directory: "Store directory",
sortDefault: "Default",
sortDistance: "Distance",
distance: "{n} km away",
positiveRate: "Positive reviews 100%",
visitStore: "Visit store",
company: "Company",
region: "Region",
address: "Address",
storeProfile: "Store profile",
score: "Overall",
agreement: "Product",
service: "Service",
speed: "Delivery",
favorite: "Follow store",
favorited: "Following",
salesRank: "Top sellers",
storeProducts: "Store products",
sortPrice: "Price",
sortSales: "Sales",
sortComments: "Reviews",
noProducts: "This store has no products yet.",
unknownStore: "Store not found",
backToStores: "Back to stores",
},
},
zh: {
stores: {
breadcrumbHome: "首页",
directory: "店铺街",
sortDefault: "默认",
sortDistance: "距离",
distance: "距离 {n} 公里",
positiveRate: "好评率 100%",
visitStore: "进入店铺",
company: "公司",
region: "地区",
address: "地址",
storeProfile: "店铺信息",
score: "综合评分",
agreement: "商品质量",
service: "服务态度",
speed: "发货速度",
favorite: "收藏店铺",
favorited: "已收藏",
salesRank: "本店销量排行",
storeProducts: "店内商品",
sortPrice: "价格",
sortSales: "销量",
sortComments: "评论",
noProducts: "店铺暂时没有商品。",
unknownStore: "店铺不存在",
backToStores: "返回店铺街",
},
},
} as const;
+184
View File
@@ -0,0 +1,184 @@
export default {
en: {
user: {
title: "My account",
editProfile: "Edit profile",
orderCenter: "Orders",
memberCenter: "Membership",
dashboard: "Account overview",
myOrders: "My orders",
addresses: "Shipping addresses",
coupons: "My coupons",
favorites: "Favorites",
invoices: "My invoices",
statsBalance: "Balance",
statsPoints: "Points",
statsFrozen: "Frozen funds",
pendingPayment: "To pay",
pendingShipment: "To ship",
pendingReceipt: "To receive",
completed: "Completed",
afterSale: "After-sale",
recentOrders: "Recent orders",
favoriteProducts: "Favorite products",
viewAll: "View all",
noOrders: "No orders yet.",
noFavorites: "No favorites yet.",
orderNo: "Order no.",
createdAt: "Created",
shop: "Shop",
orderTotal: "Order total",
viewDetails: "View details",
payNow: "Pay now",
cancelOrder: "Cancel order",
ordersTitle: "My orders",
filterAll: "All",
filterPendingPayment: "To pay",
filterPendingShipment: "To ship",
filterPendingReceipt: "To receive",
filterCompleted: "Completed",
filterCancelled: "Cancelled",
orderDetail: "Order details",
shippingAddress: "Shipping address",
orderItems: "Order items",
total: "Total",
product: "Product",
shipments: "Shipments",
shipmentNo: "Shipment no.",
carrier: "Carrier",
trackingNo: "Tracking no.",
confirmDelivery: "Confirm delivery",
noShipments: "No shipment information yet.",
invoiceRequest: "Request invoice",
invoiceTitle: "Invoice title",
taxNo: "Tax number (optional)",
invoiceKind: "Invoice type",
personal: "Personal",
company: "Company",
submitInvoice: "Request invoice",
invoiceSuccess: "Invoice request submitted.",
addAddress: "Add address",
editAddress: "Edit address",
recipient: "Recipient",
phone: "Phone",
region: "State / Province",
city: "City",
line1: "Street address",
postalCode: "Postal code",
defaultAddress: "Default",
setDefault: "Set as default",
saveAddress: "Save address",
noAddresses: "No shipping addresses yet.",
favoritesTitle: "Favorites",
favoriteProductsTab: "Products",
favoriteStoresTab: "Stores",
removeFavorite: "Remove favorite",
enterStore: "Enter store",
noFavoriteStores: "No favorite stores yet.",
couponsTitle: "My coupons",
couponTitle: "Coupon",
amount: "Amount",
threshold: "Minimum spend",
expiresAt: "Expires",
noCoupons: "No coupons yet.",
invoicesTitle: "My invoices",
invoiceNo: "Invoice no.",
invoiceOrderNo: "Order no.",
invoiceIssuedAt: "Issued at",
noInvoices: "No invoices yet.",
validationRequired: "Please complete the required fields.",
loadFailed: "Unable to load your account data.",
},
},
zh: {
user: {
title: "我的账户",
editProfile: "编辑资料",
orderCenter: "订单中心",
memberCenter: "会员中心",
dashboard: "个人中心",
myOrders: "我的订单",
addresses: "收货地址",
coupons: "我的优惠券",
favorites: "收藏/关注",
invoices: "我的发票",
statsBalance: "账户余额",
statsPoints: "账户积分",
statsFrozen: "冻结资金",
pendingPayment: "待付款",
pendingShipment: "待发货",
pendingReceipt: "待收货",
completed: "已完成",
afterSale: "售后中",
recentOrders: "最近订单",
favoriteProducts: "收藏的宝贝",
viewAll: "查看全部",
noOrders: "暂无订单。",
noFavorites: "暂无收藏。",
orderNo: "订单号",
createdAt: "创建时间",
shop: "店铺",
orderTotal: "订单总额",
viewDetails: "查看详情",
payNow: "付款",
cancelOrder: "取消订单",
ordersTitle: "我的订单",
filterAll: "全部",
filterPendingPayment: "待付款",
filterPendingShipment: "待发货",
filterPendingReceipt: "待收货",
filterCompleted: "已完成",
filterCancelled: "已取消",
orderDetail: "订单详情",
shippingAddress: "收货地址",
orderItems: "商品信息",
total: "合计",
product: "商品",
shipments: "物流信息",
shipmentNo: "发货单号",
carrier: "承运商",
trackingNo: "物流单号",
confirmDelivery: "确认收货",
noShipments: "暂无物流信息。",
invoiceRequest: "申请发票",
invoiceTitle: "发票抬头",
taxNo: "税号(选填)",
invoiceKind: "发票类型",
personal: "个人",
company: "企业",
submitInvoice: "提交申请",
invoiceSuccess: "发票申请已提交。",
addAddress: "新增地址",
editAddress: "编辑地址",
recipient: "收货人",
phone: "联系电话",
region: "省/州",
city: "城市",
line1: "详细地址",
postalCode: "邮编",
defaultAddress: "默认",
setDefault: "设为默认",
saveAddress: "保存地址",
noAddresses: "暂无收货地址。",
favoritesTitle: "我的收藏",
favoriteProductsTab: "商品",
favoriteStoresTab: "店铺",
removeFavorite: "取消收藏",
enterStore: "进入店铺",
noFavoriteStores: "暂无关注店铺。",
couponsTitle: "我的优惠券",
couponTitle: "优惠券",
amount: "优惠金额",
threshold: "使用门槛",
expiresAt: "有效期至",
noCoupons: "暂无优惠券。",
invoicesTitle: "我的发票",
invoiceNo: "发票号",
invoiceOrderNo: "订单号",
invoiceIssuedAt: "开具时间",
noInvoices: "暂无发票。",
validationRequired: "请填写必填项。",
loadFailed: "账户数据加载失败。",
},
},
};