mirror of
https://gitee.com/bootx/dax-pay-ui
synced 2026-08-12 15:35:39 +08:00
feat(admin): 码牌管理支持 H5/小程序类型
列表筛选与展示、批量创建必选、编辑只读展示 programType,全语种 i18n 同步。
This commit is contained in:
@@ -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;
|
||||
/** 固定金额(分) */
|
||||
|
||||
@@ -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"
|
||||
}
|
||||
|
||||
@@ -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"
|
||||
}
|
||||
|
||||
@@ -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": "コード種別を選択してください"
|
||||
}
|
||||
|
||||
@@ -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": "코드 유형을 선택하세요"
|
||||
}
|
||||
|
||||
@@ -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"
|
||||
}
|
||||
|
||||
@@ -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": "โปรดเลือกประเภทโค้ด"
|
||||
}
|
||||
|
||||
@@ -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ã"
|
||||
}
|
||||
|
||||
@@ -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": "请选择码牌类型"
|
||||
}
|
||||
|
||||
@@ -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": "請選擇碼牌類型"
|
||||
}
|
||||
|
||||
@@ -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": "請選擇碼牌類型"
|
||||
}
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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')" />
|
||||
|
||||
Reference in New Issue
Block a user