feat(admin): 码牌管理支持 H5/小程序类型

列表筛选与展示、批量创建必选、编辑只读展示 programType,全语种 i18n 同步。
This commit is contained in:
DaxPay Dev
2026-07-15 16:48:12 +08:00
parent 9ac5855770
commit 8ca2edc3d0
14 changed files with 139 additions and 21 deletions

View File

@@ -72,7 +72,7 @@ export const DeviceQrCodeApi = {
},
/**
* 获取码牌扫码链接(完整 H5 地址)
* 获取码牌扫码链接(完整地址, 按 programType 分流 /h 或 /m)
*/
getCodeLink(code: string): Promise<Result<string>> {
return defHttp.get({ url: '/admin/device/qrcode/get-code-link', params: { code } });
@@ -89,6 +89,8 @@ export interface DeviceQrCodeQuery {
batchNo?: string;
/** 商户号 */
mchNo?: string;
/** 落地程序类型 h5/mini_app */
programType?: string;
/** 金额类型 random/fixed */
amountType?: string;
/** 状态 enabled/disabled */
@@ -121,6 +123,8 @@ export interface DeviceQrCodeBatchParam {
count?: number;
/** 码牌名称 */
name?: string;
/** 落地程序类型 h5/mini_app, 创建后不可改 */
programType?: string;
/** 金额类型 random/fixed */
amountType?: string;
/** 固定金额(分) */
@@ -155,6 +159,8 @@ export interface DeviceQrCodeResult extends BaseEntity {
mchName?: string;
/** 关联应用号(空=商户默认应用) */
appId?: string;
/** 落地程序类型 h5/mini_app */
programType?: string;
/** 金额类型 random/fixed */
amountType?: string;
/** 固定金额(分) */

View File

@@ -13,7 +13,8 @@
"fixedAmount": "Fixed Amount",
"status": "Status",
"remark": "Remark",
"createTime": "Create Time"
"createTime": "Create Time",
"programType": "Code type"
},
"status": {
"enabled": "Enabled",
@@ -54,5 +55,10 @@
"qrCodeTip": "Scan to enter the payment page",
"copyLink": "Copy Link",
"download": "Download QR Code",
"amountLabel": "Amount"
"amountLabel": "Amount",
"programType": {
"h5": "H5",
"mini_app": "Mini program"
},
"validateProgramType": "Please select code type"
}

View File

@@ -13,7 +13,8 @@
"fixedAmount": "Jumlah Tetap",
"status": "Status",
"remark": "Komentar",
"createTime": "Ciptakan Waktu"
"createTime": "Ciptakan Waktu",
"programType": "Tipe kode"
},
"status": {
"enabled": "Diaktifkan",
@@ -54,5 +55,10 @@
"qrCodeTip": "Pindai untuk masuk ke halaman pembayaran",
"copyLink": "Salin Tautan",
"download": "Unduh Kode QR",
"amountLabel": "Jumlah"
"amountLabel": "Jumlah",
"programType": {
"h5": "H5",
"mini_app": "Mini program"
},
"validateProgramType": "Pilih tipe kode"
}

View File

@@ -13,7 +13,8 @@
"fixedAmount": "定額",
"status": "状態",
"remark": "述べる",
"createTime": "時間を作る"
"createTime": "時間を作る",
"programType": "コード種別"
},
"status": {
"enabled": "有効",
@@ -54,5 +55,10 @@
"qrCodeTip": "スキャンして支払いページに入ります",
"copyLink": "リンクをコピー",
"download": "QRコードをダウンロード",
"amountLabel": "額"
"amountLabel": "額",
"programType": {
"h5": "H5",
"mini_app": "ミニプログラム"
},
"validateProgramType": "コード種別を選択してください"
}

View File

@@ -13,7 +13,8 @@
"fixedAmount": "정액",
"status": "상태",
"remark": "주목",
"createTime": "시간 만들기"
"createTime": "시간 만들기",
"programType": "코드 유형"
},
"status": {
"enabled": "활성화됨",
@@ -54,5 +55,10 @@
"qrCodeTip": "결제 페이지로 들어가려면 스캔하세요",
"copyLink": "링크 복사",
"download": "QR 코드 다운로드",
"amountLabel": "양"
"amountLabel": "양",
"programType": {
"h5": "H5",
"mini_app": "미니프로그램"
},
"validateProgramType": "코드 유형을 선택하세요"
}

View File

@@ -13,7 +13,8 @@
"fixedAmount": "Jumlah Tetap",
"status": "Status",
"remark": "Teguran",
"createTime": "Cipta Masa"
"createTime": "Cipta Masa",
"programType": "Jenis kod"
},
"status": {
"enabled": "Didayakan",
@@ -54,5 +55,10 @@
"qrCodeTip": "Imbas untuk masuk ke halaman pembayaran",
"copyLink": "Salin Pautan",
"download": "Muat turun Kod QR",
"amountLabel": "Jumlah"
"amountLabel": "Jumlah",
"programType": {
"h5": "H5",
"mini_app": "Program mini"
},
"validateProgramType": "Sila pilih jenis kod"
}

View File

@@ -13,7 +13,8 @@
"fixedAmount": "จำนวนเงินคงที่",
"status": "สถานะ",
"remark": "หมายเหตุ",
"createTime": "สร้างเวลา"
"createTime": "สร้างเวลา",
"programType": "ประเภทโค้ด"
},
"status": {
"enabled": "เปิดใช้งานแล้ว",
@@ -54,5 +55,10 @@
"qrCodeTip": "สแกนเพื่อเข้าสู่หน้าชำระเงิน",
"copyLink": "คัดลอกลิงค์",
"download": "ดาวน์โหลดรหัส QR",
"amountLabel": "จำนวน"
"amountLabel": "จำนวน",
"programType": {
"h5": "H5",
"mini_app": "มินิโปรแกรม"
},
"validateProgramType": "โปรดเลือกประเภทโค้ด"
}

View File

@@ -13,7 +13,8 @@
"fixedAmount": "Số tiền cố định",
"status": "Trạng thái",
"remark": "Nhận xét",
"createTime": "Tạo thời gian"
"createTime": "Tạo thời gian",
"programType": "Loại mã"
},
"status": {
"enabled": "Đã bật",
@@ -54,5 +55,10 @@
"qrCodeTip": "Quét để vào trang thanh toán",
"copyLink": "Sao chép liên kết",
"download": "Tải xuống mã QR",
"amountLabel": "Số lượng"
"amountLabel": "Số lượng",
"programType": {
"h5": "H5",
"mini_app": "Mini program"
},
"validateProgramType": "Vui lòng chọn loại mã"
}

View File

@@ -13,7 +13,8 @@
"fixedAmount": "固定金额",
"status": "状态",
"remark": "备注",
"createTime": "创建时间"
"createTime": "创建时间",
"programType": "码牌类型"
},
"status": {
"enabled": "启用",
@@ -54,5 +55,10 @@
"qrCodeTip": "扫码即可进入支付页面",
"copyLink": "复制链接",
"download": "下载二维码",
"amountLabel": "金额"
"amountLabel": "金额",
"programType": {
"h5": "H5",
"mini_app": "小程序"
},
"validateProgramType": "请选择码牌类型"
}

View File

@@ -13,7 +13,8 @@
"fixedAmount": "固定金額",
"status": "狀態",
"remark": "備註",
"createTime": "創建時間"
"createTime": "創建時間",
"programType": "碼牌類型"
},
"status": {
"enabled": "啓用",
@@ -54,5 +55,10 @@
"qrCodeTip": "掃碼即可進入支付頁面",
"copyLink": "複製鏈接",
"download": "下載二維碼",
"amountLabel": "金額"
"amountLabel": "金額",
"programType": {
"h5": "H5",
"mini_app": "小程序"
},
"validateProgramType": "請選擇碼牌類型"
}

View File

@@ -13,7 +13,8 @@
"fixedAmount": "固定金額",
"status": "狀態",
"remark": "備註",
"createTime": "建立時間"
"createTime": "建立時間",
"programType": "碼牌類型"
},
"status": {
"enabled": "啟用",
@@ -54,5 +55,10 @@
"qrCodeTip": "掃碼即可進入支付頁面",
"copyLink": "複製連結",
"download": "下載二維碼",
"amountLabel": "金額"
"amountLabel": "金額",
"programType": {
"h5": "H5",
"mini_app": "小程序"
},
"validateProgramType": "請選擇碼牌類型"
}

View File

@@ -57,6 +57,16 @@
name: $t('payment.device.qrcode.field.name'),
placeholder: $t('common.pleaseInput'),
},
{
type: 'list',
field: 'programType',
name: $t('payment.device.qrcode.field.programType'),
placeholder: $t('common.pleaseSelect'),
selectList: [
{ label: $t('payment.device.qrcode.programType.h5'), value: 'h5' },
{ label: $t('payment.device.qrcode.programType.mini_app'), value: 'mini_app' },
],
},
{
type: 'list',
field: 'amountType',
@@ -305,6 +315,22 @@
</template>
</vxe-column>
<vxe-column field="name" :title="$t('payment.device.qrcode.field.name')" :min-width="140" />
<!-- 码牌类型: h5 /h, mini_app /m -->
<vxe-column
field="programType"
:title="$t('payment.device.qrcode.field.programType')"
:min-width="110"
align="center"
>
<template #default="{ row }">
<a-tag v-if="row.programType === 'mini_app'" color="purple">
{{ $t('payment.device.qrcode.programType.mini_app') }}
</a-tag>
<a-tag v-else color="blue">
{{ $t('payment.device.qrcode.programType.h5') }}
</a-tag>
</template>
</vxe-column>
<vxe-column field="batchNo" :title="$t('payment.device.qrcode.field.batchNo')" :min-width="140">
<template #default="{ row }">
<span v-if="row.batchNo">{{ row.batchNo }}</span>

View File

@@ -23,6 +23,8 @@
const formState = ref<DeviceQrCodeBatchParam>({
batchNo: '',
count: 10,
// 默认 H5 码牌
programType: 'h5',
amountType: 'random',
status: 'enabled',
});
@@ -33,6 +35,8 @@
const rules: Record<string, any[]> = {
batchNo: [{ required: true, message: $t('payment.device.qrcode.validateBatchNo') }],
count: [{ required: true, message: $t('payment.device.qrcode.validateCount') }],
// 落地程序类型必选
programType: [{ required: true, message: $t('payment.device.qrcode.validateProgramType') }],
amountType: [{ required: true, message: $t('payment.device.qrcode.validateAmountType') }],
status: [{ required: true, message: $t('payment.device.qrcode.validateStatus') }],
};
@@ -67,6 +71,7 @@
formState.value = {
batchNo: '',
count: 10,
programType: 'h5',
amountType: 'random',
status: 'enabled',
fixedAmount: undefined,
@@ -185,6 +190,13 @@
<a-form-item :label="$t('payment.device.qrcode.field.name')">
<a-input v-model:value="formState.name" :placeholder="$t('common.pleaseInput')" />
</a-form-item>
<!-- 码牌类型: 创建后不可改, 决定扫码 path /h /m -->
<a-form-item :label="$t('payment.device.qrcode.field.programType')" name="programType">
<a-radio-group v-model:value="formState.programType" button-style="solid">
<a-radio-button value="h5">{{ $t('payment.device.qrcode.programType.h5') }}</a-radio-button>
<a-radio-button value="mini_app">{{ $t('payment.device.qrcode.programType.mini_app') }}</a-radio-button>
</a-radio-group>
</a-form-item>
<a-form-item :label="$t('payment.device.qrcode.field.amountType')" name="amountType">
<a-radio-group v-model:value="formState.amountType" button-style="solid">
<a-radio-button value="random">{{ $t('payment.device.qrcode.amountType.random') }}</a-radio-button>

View File

@@ -18,6 +18,8 @@
// 编辑态只读展示用商户名称(不参与提交)
const editMchName = ref('');
// 落地程序类型只读(创建后不可改)
const editProgramType = ref('h5');
const formState = ref<DeviceQrCodeParam>({
name: '',
@@ -56,6 +58,7 @@
fixedAmount: undefined,
};
editMchName.value = '';
editProgramType.value = 'h5';
formRef.value?.resetFields();
}
@@ -79,6 +82,8 @@
remark: row.remark,
};
editMchName.value = row.mchName || '';
// 类型只读展示, 不参与提交
editProgramType.value = row.programType || 'h5';
} finally {
confirmLoading.value = false;
}
@@ -149,6 +154,15 @@
<a-tag v-if="formState.mchNo" color="blue">{{ formState.mchNo }}</a-tag>
<a-tag v-else color="default">{{ $t('payment.device.qrcode.unbound') }}</a-tag>
</a-form-item>
<!-- 码牌类型只读(创建后不可改) -->
<a-form-item :label="$t('payment.device.qrcode.field.programType')">
<a-tag v-if="editProgramType === 'mini_app'" color="purple">
{{ $t('payment.device.qrcode.programType.mini_app') }}
</a-tag>
<a-tag v-else color="blue">
{{ $t('payment.device.qrcode.programType.h5') }}
</a-tag>
</a-form-item>
<!-- 码牌名称 -->
<a-form-item :label="$t('payment.device.qrcode.field.name')" name="name">
<a-input v-model:value="formState.name" :placeholder="$t('common.pleaseInput')" />