feat: 手动充值、邀请码注册与后台管理增强

新增玩家手动充值全流程(收款方式配置、充值下单/审核、钱包上分),
支持邀请码注册、邀请历史与专属返水率;完善后台代理/玩家管理与响应式操作栏,
并补充前台注册、充值页及多语言错误码。

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
2026-06-11 12:20:11 +08:00
parent 618fb49511
commit 10485ecfaf
98 changed files with 7908 additions and 856 deletions

View File

@@ -349,6 +349,46 @@ export const API_ERROR_MESSAGES = {
'en-US': 'Username already taken',
'ms-MY': 'Nama pengguna sudah digunakan',
},
INVITE_CODE_REQUIRED: {
'zh-CN': '请填写邀请码',
'en-US': 'Invitation code is required',
'ms-MY': 'Kod jemputan diperlukan',
},
INVITE_CODE_INVALID: {
'zh-CN': '邀请码无效或已失效',
'en-US': 'Invalid or inactive invitation code',
'ms-MY': 'Kod jemputan tidak sah atau tidak aktif',
},
INVITE_CODE_NOT_AVAILABLE: {
'zh-CN': '该邀请码暂不可用于注册',
'en-US': 'This invitation code is not available for registration',
'ms-MY': 'Kod jemputan ini tidak tersedia untuk pendaftaran',
},
INVITE_NOT_FOUND: {
'zh-CN': '邀请码记录不存在',
'en-US': 'Invitation record not found',
'ms-MY': 'Rekod jemputan tidak dijumpai',
},
INVITE_MUST_REVOKE_FIRST: {
'zh-CN': '请先作废该邀请码后再删除',
'en-US': 'Revoke the invitation code before deleting',
'ms-MY': 'Batalkan kod jemputan dahulu sebelum padam',
},
INVITE_CODE_ALREADY_USED: {
'zh-CN': '该邀请码已被使用,每个邀请码仅可注册一名玩家',
'en-US': 'This invitation code has already been used; each code allows one registration only',
'ms-MY': 'Kod jemputan ini telah digunakan; setiap kod hanya untuk satu pendaftaran',
},
INVITE_CANNOT_DELETE_USED: {
'zh-CN': '已使用的邀请码不可删除',
'en-US': 'Used invitation codes cannot be deleted',
'ms-MY': 'Kod jemputan yang telah digunakan tidak boleh dipadam',
},
INVITE_CASHBACK_RATE_INVALID: {
'zh-CN': '返水比例无效,请输入非负数',
'en-US': 'Invalid cashback rate; must be a non-negative number',
'ms-MY': 'Kadar rebat tidak sah; mesti nombor bukan negatif',
},
USERNAME_FORMAT_INVALID: {
'zh-CN': '玩家用户名仅可使用英文字母和数字332 位),不可含中文或特殊符号',
'en-US': 'Username must be 332 letters or digits only',
@@ -699,6 +739,51 @@ export const API_ERROR_MESSAGES = {
'en-US': 'ACTIVE ticker requires body in at least one locale',
'ms-MY': 'Ticker aktif memerlukan kandungan',
},
INVALID_METHOD_TYPE: {
'zh-CN': '无效的收款方式类型',
'en-US': 'Invalid payment method type',
'ms-MY': 'Jenis kaedah pembayaran tidak sah',
},
PAYMENT_METHOD_NOT_FOUND: {
'zh-CN': '收款方式不存在或已停用',
'en-US': 'Payment method not found or inactive',
'ms-MY': 'Kaedah pembayaran tidak dijumpai atau tidak aktif',
},
ORDER_NOT_FOUND: {
'zh-CN': '充值订单不存在',
'en-US': 'Deposit order not found',
'ms-MY': 'Pesanan deposit tidak dijumpai',
},
ORDER_NOT_PENDING: {
'zh-CN': '订单已被审核或不是待审核状态',
'en-US': 'Order is not in pending status',
'ms-MY': 'Pesanan bukan dalam status menunggu',
},
REASON_REQUIRED: {
'zh-CN': '请填写拒绝原因',
'en-US': 'Rejection reason is required',
'ms-MY': 'Sebab penolakan diperlukan',
},
SCREENSHOT_REQUIRED: {
'zh-CN': '请上传转账截图',
'en-US': 'Screenshot is required',
'ms-MY': 'Screenshot diperlukan',
},
FILE_MUST_BE_IMAGE: {
'zh-CN': '请上传图片文件',
'en-US': 'File must be an image',
'ms-MY': 'Fail mesti imej',
},
INVALID_AMOUNT: {
'zh-CN': '金额无效',
'en-US': 'Invalid amount',
'ms-MY': 'Jumlah tidak sah',
},
PAYMENT_METHOD_REQUIRED: {
'zh-CN': '请选择收款方式',
'en-US': 'Payment method is required',
'ms-MY': 'Kaedah pembayaran diperlukan',
},
} as const satisfies Record<string, Record<Locale, string>>;
export type ApiErrorCode = keyof typeof API_ERROR_MESSAGES;