Skip to content

Commit 0d96645

Browse files
YunaiVgitee-org
authored andcommitted
!116 【重构】Vue3 管理后台:[支付管理 -> 应用信息][支付管理 -> 支付订单][支付管理 -> 退款订单] 使用 Element Plus 原生实现
Merge pull request !116 from 东方白/dev
2 parents a15307c + 7cb859e commit 0d96645

File tree

10 files changed

+1607
-635
lines changed

10 files changed

+1607
-635
lines changed

src/utils/constants.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -114,6 +114,10 @@ export const PayChannelEnum = {
114114
ALIPAY_QR: {
115115
code: 'alipay_qr',
116116
name: '支付宝扫码支付'
117+
},
118+
ALIPAY_BAR: {
119+
code: 'alipay_bar',
120+
name: '支付宝条码支付'
117121
}
118122
}
119123

src/views/pay/app/AppForm.vue

Lines changed: 158 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,158 @@
1+
<template>
2+
<Dialog :title="dialogTitle" v-model="dialogVisible" width="50%">
3+
<el-form
4+
ref="formRef"
5+
:model="formData"
6+
:rules="formRules"
7+
label-width="160px"
8+
v-loading="formLoading"
9+
>
10+
<el-form-item label="应用名" prop="name">
11+
<el-input v-model="formData.name" placeholder="请输入应用名" />
12+
</el-form-item>
13+
14+
<el-form-item label="所属商户" prop="merchantId">
15+
<el-select
16+
v-model="formData.merchantId"
17+
filterable
18+
remote
19+
reserve-keyword
20+
placeholder="请选择所属商户"
21+
:remote-method="handleGetMerchantListByName"
22+
:loading="formLoading"
23+
>
24+
<el-option
25+
v-for="item in merchantList"
26+
:key="item.id"
27+
:label="item.name"
28+
:value="item.id"
29+
/>
30+
</el-select>
31+
</el-form-item>
32+
<el-form-item label="开启状态" prop="status">
33+
<el-radio-group v-model="formData.status">
34+
<el-radio
35+
v-for="dict in getIntDictOptions(DICT_TYPE.COMMON_STATUS)"
36+
:key="dict.value"
37+
:label="dict.value"
38+
>
39+
{{ dict.label }}
40+
</el-radio>
41+
</el-radio-group>
42+
</el-form-item>
43+
<el-form-item label="支付结果的回调地址" prop="payNotifyUrl">
44+
<el-input v-model="formData.payNotifyUrl" placeholder="请输入支付结果的回调地址" />
45+
</el-form-item>
46+
<el-form-item label="退款结果的回调地址" prop="refundNotifyUrl">
47+
<el-input v-model="formData.refundNotifyUrl" placeholder="请输入退款结果的回调地址" />
48+
</el-form-item>
49+
<el-form-item label="备注" prop="remark">
50+
<el-input v-model="formData.remark" placeholder="请输入备注" />
51+
</el-form-item>
52+
</el-form>
53+
<template #footer>
54+
<el-button @click="submitForm" type="primary" :disabled="formLoading">确 定</el-button>
55+
<el-button @click="dialogVisible = false">取 消</el-button>
56+
</template>
57+
</Dialog>
58+
</template>
59+
<script setup lang="ts">
60+
import { DICT_TYPE, getIntDictOptions } from '@/utils/dict'
61+
import * as AppApi from '@/api/pay/app'
62+
import * as MerchantApi from '@/api/pay/merchant'
63+
import { CommonStatusEnum } from '@/utils/constants'
64+
65+
const { t } = useI18n() // 国际化
66+
const message = useMessage() // 消息弹窗
67+
const dialogVisible = ref(false) // 弹窗的是否展示
68+
const dialogTitle = ref('') // 弹窗的标题
69+
const formLoading = ref(false) // 表单的加载中:1)修改时的数据加载;2)提交的按钮禁用
70+
const formType = ref('') // 表单的类型:create - 新增;update - 修改
71+
const formData = ref({
72+
id: undefined,
73+
name: undefined,
74+
packageId: undefined,
75+
contactName: undefined,
76+
contactMobile: undefined,
77+
accountCount: undefined,
78+
expireTime: undefined,
79+
domain: undefined,
80+
status: CommonStatusEnum.ENABLE
81+
})
82+
const formRules = reactive({
83+
name: [{ required: true, message: '应用名不能为空', trigger: 'blur' }],
84+
status: [{ required: true, message: '开启状态不能为空', trigger: 'blur' }],
85+
payNotifyUrl: [{ required: true, message: '支付结果的回调地址不能为空', trigger: 'blur' }],
86+
refundNotifyUrl: [{ required: true, message: '退款结果的回调地址不能为空', trigger: 'blur' }],
87+
merchantId: [{ required: true, message: '商户编号不能为空', trigger: 'blur' }]
88+
})
89+
const formRef = ref() // 表单 Ref
90+
const merchantList = ref([]) // 商户列表
91+
92+
/** 打开弹窗 */
93+
const open = async (type: string, id?: number) => {
94+
dialogVisible.value = true
95+
dialogTitle.value = t('action.' + type)
96+
formType.value = type
97+
resetForm()
98+
// 修改时,设置数据
99+
if (id) {
100+
formLoading.value = true
101+
try {
102+
formData.value = await AppApi.getApp(id)
103+
} finally {
104+
formLoading.value = false
105+
}
106+
}
107+
await handleGetMerchantListByName(null)
108+
}
109+
defineExpose({ open }) // 提供 open 方法,用于打开弹窗
110+
111+
/** 提交表单 */
112+
const emit = defineEmits(['success']) // 定义 success 事件,用于操作成功后的回调
113+
const submitForm = async () => {
114+
// 校验表单
115+
if (!formRef) return
116+
const valid = await formRef.value.validate()
117+
if (!valid) return
118+
// 提交请求
119+
formLoading.value = true
120+
try {
121+
const data = formData.value as unknown as AppApi.AppVO
122+
if (formType.value === 'create') {
123+
await AppApi.createApp(data)
124+
message.success(t('common.createSuccess'))
125+
} else {
126+
await AppApi.updateApp(data)
127+
message.success(t('common.updateSuccess'))
128+
}
129+
dialogVisible.value = false
130+
// 发送操作成功的事件
131+
emit('success')
132+
} finally {
133+
formLoading.value = false
134+
}
135+
}
136+
137+
/**
138+
* 根据商户名称模糊匹配商户信息
139+
* @param name 商户名称
140+
*/
141+
const handleGetMerchantListByName = async (name) => {
142+
merchantList.value = await MerchantApi.getMerchantListByName(name)
143+
}
144+
145+
/** 重置表单 */
146+
const resetForm = () => {
147+
formData.value = {
148+
id: undefined,
149+
name: undefined,
150+
status: CommonStatusEnum.ENABLE,
151+
remark: undefined,
152+
payNotifyUrl: undefined,
153+
refundNotifyUrl: undefined,
154+
merchantId: undefined
155+
}
156+
formRef.value?.resetFields()
157+
}
158+
</script>

src/views/pay/app/app.data.ts

Lines changed: 0 additions & 71 deletions
This file was deleted.

0 commit comments

Comments
 (0)