mirror of
https://gitee.com/likeadmin/likeadmin_java.git
synced 2026-05-13 03:45:54 +08:00
余额充值,支付
This commit is contained in:
10
admin/src/api/app/recharge.ts
Normal file
10
admin/src/api/app/recharge.ts
Normal file
@@ -0,0 +1,10 @@
|
||||
import request from '@/utils/request'
|
||||
|
||||
export function getRechargeConfig() {
|
||||
return request.get({ url: '/marketing/recharge/detail' })
|
||||
}
|
||||
|
||||
// 设置
|
||||
export function setRechargeConfig(params: any) {
|
||||
return request.post({ url: '/marketing/recharge/save', params })
|
||||
}
|
||||
31
admin/src/api/finance.ts
Normal file
31
admin/src/api/finance.ts
Normal file
@@ -0,0 +1,31 @@
|
||||
import request from '@/utils/request'
|
||||
|
||||
// 余额明细
|
||||
export function accountLog(params?: any) {
|
||||
return request.get({ url: '/finance/wallet/list', params })
|
||||
}
|
||||
|
||||
// 充值记录
|
||||
export function rechargeLists(params?: any) {
|
||||
return request.get({ url: '/finance/recharger/list', params }, { ignoreCancelToken: true })
|
||||
}
|
||||
|
||||
//退款
|
||||
export function refund(params?: any) {
|
||||
return request.post({ url: '/finance/recharger/refund', params })
|
||||
}
|
||||
|
||||
//重新退款
|
||||
export function refundAgain(params?: any) {
|
||||
return request.post({ url: '/finance/recharger/refundAgain', params })
|
||||
}
|
||||
|
||||
//退款记录
|
||||
export function refundRecord(params?: any) {
|
||||
return request.get({ url: '/finance/refund/list', params })
|
||||
}
|
||||
|
||||
//退款日志
|
||||
export function refundLog(params?: any) {
|
||||
return request.get({ url: '/finance/refund/log', params })
|
||||
}
|
||||
26
admin/src/api/setting/pay.ts
Normal file
26
admin/src/api/setting/pay.ts
Normal file
@@ -0,0 +1,26 @@
|
||||
import request from '@/utils/request'
|
||||
|
||||
// 获取支付方式
|
||||
export function getPayWay() {
|
||||
return request.get({ url: '/setting/payment/method' })
|
||||
}
|
||||
|
||||
// 设置支付方式
|
||||
export function setPayWay(params: any) {
|
||||
return request.post({ url: '/setting/payment/editMethod', params })
|
||||
}
|
||||
|
||||
// 获取支付方式
|
||||
export function getPayConfigLists() {
|
||||
return request.get({ url: '/setting/payment/list' })
|
||||
}
|
||||
|
||||
// 设置支付方式
|
||||
export function setPayConfig(params: any) {
|
||||
return request.post({ url: '/setting/payment/editConfig', params })
|
||||
}
|
||||
|
||||
// 设置支付方式
|
||||
export function getPayConfig(params: any) {
|
||||
return request.get({ url: '/setting/payment/detail', params })
|
||||
}
|
||||
@@ -92,6 +92,11 @@ const linkList = ref([
|
||||
path: '/pages/search/search',
|
||||
name: '搜索',
|
||||
type: LinkTypeEnum.SHOP_PAGES
|
||||
},
|
||||
{
|
||||
path: '/packages/pages/user_wallet/user_wallet',
|
||||
name: '我的钱包',
|
||||
type: LinkTypeEnum.SHOP_PAGES
|
||||
}
|
||||
])
|
||||
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
import { isFunction } from 'lodash'
|
||||
import { reactive, toRaw } from 'vue'
|
||||
|
||||
// 分页钩子函数
|
||||
@@ -7,10 +8,20 @@ interface Options {
|
||||
fetchFun: (_arg: any) => Promise<any>
|
||||
params?: Record<any, any>
|
||||
firstLoading?: boolean
|
||||
beforeRequest?(params: Record<any, any>): Record<any, any>
|
||||
afterRequest?(res: Record<any, any>): void
|
||||
}
|
||||
|
||||
export function usePaging(options: Options) {
|
||||
const { page = 1, size = 15, fetchFun, params = {}, firstLoading = false } = options
|
||||
const {
|
||||
page = 1,
|
||||
size = 15,
|
||||
fetchFun,
|
||||
params = {},
|
||||
firstLoading = false,
|
||||
beforeRequest,
|
||||
afterRequest
|
||||
} = options
|
||||
// 记录分页初始参数
|
||||
const paramsInit: Record<any, any> = Object.assign({}, toRaw(params))
|
||||
// 分页数据
|
||||
@@ -19,19 +30,28 @@ export function usePaging(options: Options) {
|
||||
size,
|
||||
loading: firstLoading,
|
||||
count: 0,
|
||||
lists: [] as any[]
|
||||
lists: [] as any[],
|
||||
extend: {} as Record<any, any>
|
||||
})
|
||||
// 请求分页接口
|
||||
const getLists = () => {
|
||||
pager.loading = true
|
||||
let requestParams = params
|
||||
if (isFunction(beforeRequest)) {
|
||||
requestParams = beforeRequest(params)
|
||||
}
|
||||
return fetchFun({
|
||||
pageNo: pager.page,
|
||||
pageSize: pager.size,
|
||||
...params
|
||||
...requestParams
|
||||
})
|
||||
.then((res: any) => {
|
||||
pager.count = res?.count
|
||||
pager.lists = res?.lists
|
||||
pager.extend = res?.extend
|
||||
if (isFunction(afterRequest)) {
|
||||
afterRequest(res)
|
||||
}
|
||||
return Promise.resolve(res)
|
||||
})
|
||||
.catch((err: any) => {
|
||||
|
||||
54
admin/src/views/app/recharge/index.vue
Normal file
54
admin/src/views/app/recharge/index.vue
Normal file
@@ -0,0 +1,54 @@
|
||||
<template>
|
||||
<div>
|
||||
<el-card shadow="never" class="!border-none">
|
||||
<template #header>
|
||||
<span class="font-extrabold text-lg">充值设置</span>
|
||||
</template>
|
||||
<el-form :model="formData" label-width="120px">
|
||||
<el-form-item label="状态">
|
||||
<div>
|
||||
<el-radio-group v-model="formData.openRecharge" class="ml-4">
|
||||
<el-radio :label="1">开启</el-radio>
|
||||
<el-radio :label="0">关闭</el-radio>
|
||||
</el-radio-group>
|
||||
<div class="form-tips">关闭或开启充值功能,关闭后将不显示充值入口</div>
|
||||
</div>
|
||||
</el-form-item>
|
||||
<el-form-item label="最低充值金额">
|
||||
<div>
|
||||
<el-input
|
||||
v-model="formData.minRechargeMoney"
|
||||
placeholder="请输入最低充值金额"
|
||||
clearable
|
||||
/>
|
||||
<div class="form-tips">
|
||||
最低充值金额要求,不填或填0表示不限制最低充值金额
|
||||
</div>
|
||||
</div>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
</el-card>
|
||||
<footer-btns v-perms="['marketing:recharge:save']">
|
||||
<el-button type="primary" @click="handleSubmit">保存</el-button>
|
||||
</footer-btns>
|
||||
</div>
|
||||
</template>
|
||||
<script lang="ts" setup>
|
||||
import { getRechargeConfig, setRechargeConfig } from '@/api/app/recharge'
|
||||
import feedback from '@/utils/feedback'
|
||||
const formData = reactive({
|
||||
openRecharge: 1, //功能状态 1-开启 0-关闭
|
||||
minRechargeMoney: '' //最低充值金额
|
||||
})
|
||||
|
||||
const getConfig = async () => {
|
||||
const data = await getRechargeConfig()
|
||||
Object.assign(formData, data)
|
||||
}
|
||||
const handleSubmit = async () => {
|
||||
await setRechargeConfig(formData)
|
||||
feedback.msgSuccess('操作成功')
|
||||
getConfig()
|
||||
}
|
||||
getConfig()
|
||||
</script>
|
||||
104
admin/src/views/consumer/components/account-adjust.vue
Normal file
104
admin/src/views/consumer/components/account-adjust.vue
Normal file
@@ -0,0 +1,104 @@
|
||||
<template>
|
||||
<popup
|
||||
ref="popupRef"
|
||||
title="余额调整"
|
||||
width="500px"
|
||||
@confirm="handleConfirm"
|
||||
:async="true"
|
||||
@close="popupClose"
|
||||
>
|
||||
<div class="pr-8">
|
||||
<el-form ref="formRef" :model="formData" label-width="120px" :rules="formRules">
|
||||
<el-form-item label="当前余额">¥ {{ value }} </el-form-item>
|
||||
<el-form-item label="余额增减" required prop="action">
|
||||
<el-radio-group v-model="formData.action">
|
||||
<el-radio :label="1">增加余额</el-radio>
|
||||
<el-radio :label="2">扣减余额</el-radio>
|
||||
</el-radio-group>
|
||||
</el-form-item>
|
||||
<el-form-item label="调整余额" prop="num">
|
||||
<el-input
|
||||
:model-value="formData.num"
|
||||
placeholder="请输入调整的金额"
|
||||
type="number"
|
||||
@input="numberValidate"
|
||||
/>
|
||||
</el-form-item>
|
||||
<el-form-item label="调整后余额"> ¥ {{ adjustmentMoney }} </el-form-item>
|
||||
<el-form-item label="备注" prop="remark">
|
||||
<el-input v-model="formData.remark" type="textarea" :rows="4" />
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
</div>
|
||||
</popup>
|
||||
</template>
|
||||
<script lang="ts" setup>
|
||||
import Popup from '@/components/popup/index.vue'
|
||||
import type { FormInstance, FormRules } from 'element-plus'
|
||||
import feedback from '@/utils/feedback'
|
||||
const formRef = shallowRef<FormInstance>()
|
||||
const props = defineProps({
|
||||
show: {
|
||||
type: Boolean,
|
||||
required: true
|
||||
},
|
||||
value: {
|
||||
type: [Number, String],
|
||||
required: true
|
||||
}
|
||||
})
|
||||
const emit = defineEmits<{
|
||||
(event: 'update:show', value: boolean): void
|
||||
(event: 'confirm', value: any): void
|
||||
}>()
|
||||
const formData = reactive({
|
||||
action: 1, //变动类型 1-增加 2-减少
|
||||
num: '',
|
||||
remark: ''
|
||||
})
|
||||
const popupRef = shallowRef<InstanceType<typeof Popup>>()
|
||||
|
||||
const adjustmentMoney = computed(() => {
|
||||
return Number(props.value) + Number(formData.num) * (formData.action == 1 ? 1 : -1)
|
||||
})
|
||||
|
||||
const formRules: FormRules = {
|
||||
num: [
|
||||
{
|
||||
required: true,
|
||||
message: '请输入调整的金额'
|
||||
}
|
||||
]
|
||||
}
|
||||
const numberValidate = (value: string) => {
|
||||
if (value.includes('-')) {
|
||||
return feedback.msgError('请输入正整数')
|
||||
}
|
||||
formData.num = value
|
||||
}
|
||||
const handleConfirm = async () => {
|
||||
await formRef.value?.validate()
|
||||
emit('confirm', formData)
|
||||
}
|
||||
|
||||
const popupClose = () => {
|
||||
emit('update:show', false)
|
||||
formRef.value?.resetFields()
|
||||
}
|
||||
watch(
|
||||
() => props.show,
|
||||
(val) => {
|
||||
if (val) {
|
||||
popupRef.value?.open()
|
||||
} else {
|
||||
popupRef.value?.close()
|
||||
}
|
||||
}
|
||||
)
|
||||
watch(adjustmentMoney, (val) => {
|
||||
if (val < 0) {
|
||||
feedback.msgError('调整后余额需大于0')
|
||||
formData.num = ''
|
||||
}
|
||||
})
|
||||
</script>
|
||||
@@ -5,9 +5,25 @@
|
||||
</el-card>
|
||||
<el-card class="mt-4 !border-none" header="基本资料" shadow="never">
|
||||
<el-form ref="formRef" class="ls-form" :model="formData" label-width="120px">
|
||||
<div class="bg-page py-5 pl-20 mb-10">
|
||||
<div class="mb-3 text-tx-regular">用户头像</div>
|
||||
<el-avatar :src="formData.avatar" :size="58" />
|
||||
<div class="bg-page flex py-5 mb-10 items-center">
|
||||
<div class="basis-40 flex flex-col justify-center items-center">
|
||||
<div class="mb-2 text-tx-regular">用户头像</div>
|
||||
<el-avatar :src="formData.avatar" :size="58" />
|
||||
</div>
|
||||
<div class="basis-40 flex flex-col justify-center items-center">
|
||||
<div class="text-tx-regular">账户余额</div>
|
||||
<div class="mt-2 flex items-center">
|
||||
¥{{ formData.user_money }}
|
||||
<el-button
|
||||
v-perms="['user.user/adjustMoney']"
|
||||
type="primary"
|
||||
link
|
||||
@click="handleAdjust(formData.user_money)"
|
||||
>
|
||||
调整
|
||||
</el-button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<el-form-item label="用户编号:"> {{ formData.sn }} </el-form-item>
|
||||
<el-form-item label="用户昵称:">
|
||||
@@ -80,6 +96,11 @@
|
||||
<el-form-item label="最近登录时间:"> {{ formData.lastLoginTime }} </el-form-item>
|
||||
</el-form>
|
||||
</el-card>
|
||||
<account-adjust
|
||||
v-model:show="adjustState.show"
|
||||
:value="adjustState.value"
|
||||
@confirm="handleConfirmAdjust"
|
||||
/>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
@@ -88,7 +109,7 @@ import type { FormInstance } from 'element-plus'
|
||||
import { getUserDetail, userEdit } from '@/api/consumer'
|
||||
import feedback from '@/utils/feedback'
|
||||
import { isEmpty } from '@/utils/util'
|
||||
|
||||
import AccountAdjust from '../components/account-adjust.vue'
|
||||
const route = useRoute()
|
||||
const formData = reactive({
|
||||
avatar: '',
|
||||
@@ -105,7 +126,10 @@ const formData = reactive({
|
||||
})
|
||||
|
||||
const formRef = shallowRef<FormInstance>()
|
||||
|
||||
const adjustState = reactive({
|
||||
show: false,
|
||||
value: ''
|
||||
})
|
||||
const getDetails = async () => {
|
||||
const data = await getUserDetail({
|
||||
id: route.query.id
|
||||
@@ -126,6 +150,15 @@ const handleEdit = async (value: string, field: string) => {
|
||||
feedback.msgSuccess('编辑成功')
|
||||
getDetails()
|
||||
}
|
||||
const handleAdjust = (value: string) => {
|
||||
adjustState.show = true
|
||||
adjustState.value = value
|
||||
}
|
||||
const handleConfirmAdjust = async (value: any) => {
|
||||
await adjustMoney({ user_id: route.query.id, ...value })
|
||||
adjustState.show = false
|
||||
getDetails()
|
||||
}
|
||||
|
||||
getDetails()
|
||||
</script>
|
||||
|
||||
@@ -44,7 +44,7 @@
|
||||
<el-table-column label="昵称" prop="nickname" min-width="100" />
|
||||
<el-table-column label="账号" prop="username" min-width="120" />
|
||||
<el-table-column label="手机号码" prop="mobile" min-width="100" />
|
||||
<el-table-column label="性别" prop="sex" min-width="100" />
|
||||
<!-- <el-table-column label="性别" prop="sex" min-width="100" /> -->
|
||||
<el-table-column label="注册来源" prop="channel" min-width="100" />
|
||||
<el-table-column label="注册时间" prop="createTime" min-width="120" />
|
||||
<el-table-column label="操作" width="120" fixed="right">
|
||||
|
||||
101
admin/src/views/finance/balance_details.vue
Normal file
101
admin/src/views/finance/balance_details.vue
Normal file
@@ -0,0 +1,101 @@
|
||||
<template>
|
||||
<div>
|
||||
<el-card class="!border-none" shadow="never">
|
||||
<el-alert
|
||||
type="warning"
|
||||
title="温馨提示:用户账户变动记录"
|
||||
:closable="false"
|
||||
show-icon
|
||||
></el-alert>
|
||||
<el-form ref="formRef" class="mb-[-16px] mt-[16px]" :model="queryParams" :inline="true">
|
||||
<el-form-item label="用户信息">
|
||||
<el-input
|
||||
class="w-[280px]"
|
||||
v-model="queryParams.keyword"
|
||||
placeholder="请输入用户编号/昵称/手机号"
|
||||
clearable
|
||||
@keyup.enter="resetPage"
|
||||
/>
|
||||
</el-form-item>
|
||||
<el-form-item label="变动类型">
|
||||
<el-select class="w-[280px]" v-model="queryParams.type">
|
||||
<el-option label="全部" value />
|
||||
<el-option
|
||||
v-for="(value, key) in changeType"
|
||||
:key="key"
|
||||
:label="value"
|
||||
:value="key"
|
||||
/>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item label="记录时间">
|
||||
<daterange-picker
|
||||
v-model:startTime="queryParams.startTime"
|
||||
v-model:endTime="queryParams.endTime"
|
||||
/>
|
||||
</el-form-item>
|
||||
<el-form-item>
|
||||
<el-button type="primary" @click="resetPage">查询</el-button>
|
||||
<el-button @click="resetParams">重置</el-button>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
</el-card>
|
||||
<el-card class="!border-none mt-4" shadow="never">
|
||||
<el-table size="large" v-loading="pager.loading" :data="pager.lists">
|
||||
<el-table-column label="用户编号" prop="userSn" min-width="100" />
|
||||
<el-table-column label="用户昵称" min-width="160">
|
||||
<template #default="{ row }">
|
||||
<div class="flex items-center">
|
||||
<image-contain
|
||||
class="flex-none mr-2"
|
||||
:src="row.avatar"
|
||||
:width="40"
|
||||
:height="40"
|
||||
preview-teleported
|
||||
fit="contain"
|
||||
/>
|
||||
{{ row.nickname }}
|
||||
</div>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="变动金额" prop="changeAmount" min-width="100">
|
||||
<template #default="{ row }">
|
||||
<span :class="{ 'text-error': row.action == 2 }">
|
||||
{{ row.changeAmount }}
|
||||
</span>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="剩余金额" prop="leftAmount" min-width="100" />
|
||||
<el-table-column label="变动类型" prop="changeType" min-width="120" />
|
||||
|
||||
<el-table-column label="来源单号" prop="sourceSn" min-width="100" />
|
||||
<el-table-column label="记录时间" prop="createTime" min-width="120" />
|
||||
</el-table>
|
||||
<div class="flex justify-end mt-4">
|
||||
<pagination v-model="pager" @change="getLists" />
|
||||
</div>
|
||||
</el-card>
|
||||
</div>
|
||||
</template>
|
||||
<script lang="ts" setup name="articleLists">
|
||||
import { accountLog } from '@/api/finance'
|
||||
import { usePaging } from '@/hooks/usePaging'
|
||||
const queryParams = reactive({
|
||||
keyword: '',
|
||||
type: '',
|
||||
startTime: '',
|
||||
endTime: ''
|
||||
})
|
||||
|
||||
const changeType = ref<any[]>([])
|
||||
|
||||
const { pager, getLists, resetPage, resetParams } = usePaging({
|
||||
fetchFun: accountLog,
|
||||
params: queryParams,
|
||||
afterRequest(res) {
|
||||
changeType.value = res.extend?.changeType
|
||||
}
|
||||
})
|
||||
|
||||
getLists()
|
||||
</script>
|
||||
68
admin/src/views/finance/component/refund-log.vue
Normal file
68
admin/src/views/finance/component/refund-log.vue
Normal file
@@ -0,0 +1,68 @@
|
||||
<template>
|
||||
<div class="code-preview">
|
||||
<el-dialog v-model="show" width="760px" title="退款日志">
|
||||
<el-table size="large" v-loading="loading" :data="logLists" height="500">
|
||||
<el-table-column label="流水单号" prop="sn" min-width="190" />
|
||||
<el-table-column label="退款金额" min-width="110">
|
||||
<template #default="{ row }"> ¥{{ row.refundAmount }} </template>
|
||||
</el-table-column>
|
||||
<el-table-column label="退款状态" prop="" min-width="100">
|
||||
<template #default="{ row }">
|
||||
<el-tag type="warning" v-if="row.refundStatus == 0">
|
||||
{{ row.refundStatusMsg }}
|
||||
</el-tag>
|
||||
<el-tag v-if="row.refundStatus == 1">
|
||||
{{ row.refundStatusMsg }}
|
||||
</el-tag>
|
||||
<el-tag type="danger" v-if="row.refundStatus == 2">
|
||||
{{ row.refundStatusMsg }}
|
||||
</el-tag>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="记录时间" prop="createTime" min-width="180" />
|
||||
<el-table-column label="操作人" prop="handler" min-width="120" />
|
||||
</el-table>
|
||||
</el-dialog>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script lang="ts" setup>
|
||||
import { refundLog } from '@/api/finance'
|
||||
const loading = ref(false)
|
||||
const logLists = ref([])
|
||||
const props = defineProps<{
|
||||
modelValue: boolean
|
||||
refundId: number
|
||||
}>()
|
||||
|
||||
const emit = defineEmits<{
|
||||
(event: 'update:modelValue', value: boolean): void
|
||||
}>()
|
||||
|
||||
const show = computed<boolean>({
|
||||
get() {
|
||||
return props.modelValue
|
||||
},
|
||||
set(value) {
|
||||
emit('update:modelValue', value)
|
||||
}
|
||||
})
|
||||
|
||||
const getRefundLog = async () => {
|
||||
loading.value = true
|
||||
logLists.value = []
|
||||
try {
|
||||
const res = await refundLog({
|
||||
id: props.refundId
|
||||
})
|
||||
logLists.value = res
|
||||
} catch (error) {}
|
||||
loading.value = false
|
||||
}
|
||||
|
||||
watch(show, (value) => {
|
||||
if (value) {
|
||||
getRefundLog()
|
||||
}
|
||||
})
|
||||
</script>
|
||||
141
admin/src/views/finance/recharge_record.vue
Normal file
141
admin/src/views/finance/recharge_record.vue
Normal file
@@ -0,0 +1,141 @@
|
||||
<template>
|
||||
<div>
|
||||
<el-card class="!border-none" shadow="never">
|
||||
<el-alert
|
||||
type="warning"
|
||||
title="温馨提示:用户充值记录"
|
||||
:closable="false"
|
||||
show-icon
|
||||
></el-alert>
|
||||
<el-form ref="formRef" class="mb-[-16px] mt-[16px]" :model="queryParams" :inline="true">
|
||||
<el-form-item label="充值单号">
|
||||
<el-input
|
||||
class="w-[280px]"
|
||||
v-model="queryParams.sn"
|
||||
placeholder="请输入充值单号"
|
||||
clearable
|
||||
@keyup.enter="resetPage"
|
||||
/>
|
||||
</el-form-item>
|
||||
<el-form-item label="用户信息">
|
||||
<el-input
|
||||
class="w-[280px]"
|
||||
v-model="queryParams.keyword"
|
||||
placeholder="请输入用户编号/昵称/手机号"
|
||||
clearable
|
||||
@keyup.enter="resetPage"
|
||||
/>
|
||||
</el-form-item>
|
||||
<el-form-item label="支付方式">
|
||||
<el-select class="w-[280px]" v-model="queryParams.payWay">
|
||||
<el-option label="全部" value />
|
||||
<el-option label="微信支付" :value="2" />
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item label="支付状态">
|
||||
<el-select class="w-[280px]" v-model="queryParams.payStatus">
|
||||
<el-option label="全部" value />
|
||||
<el-option label="未支付" :value="0" />
|
||||
<el-option label="已支付" :value="1" />
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item label="下单时间">
|
||||
<daterange-picker
|
||||
v-model:startTime="queryParams.startTime"
|
||||
v-model:endTime="queryParams.endTime"
|
||||
/>
|
||||
</el-form-item>
|
||||
<el-form-item>
|
||||
<el-button type="primary" @click="resetPage">查询</el-button>
|
||||
<el-button @click="resetParams">重置</el-button>
|
||||
<export-data
|
||||
class="ml-2.5"
|
||||
:fetch-fun="rechargeLists"
|
||||
:params="queryParams"
|
||||
:page-size="pager.size"
|
||||
/>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
</el-card>
|
||||
<el-card class="!border-none mt-4" shadow="never">
|
||||
<el-table size="large" v-loading="pager.loading" :data="pager.lists">
|
||||
<el-table-column label="用户信息" min-width="160">
|
||||
<template #default="{ row }">
|
||||
<div class="flex items-center">
|
||||
<image-contain
|
||||
class="flex-none mr-2"
|
||||
:src="row.avatar"
|
||||
:width="40"
|
||||
:height="40"
|
||||
preview-teleported
|
||||
fit="contain"
|
||||
/>
|
||||
{{ row.nickname }}
|
||||
</div>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="充值单号" prop="orderSn" min-width="190" />
|
||||
<el-table-column label="充值金额" prop="orderAmount" min-width="100">
|
||||
</el-table-column>
|
||||
<el-table-column label="支付方式" prop="payWay" min-width="100" />
|
||||
<el-table-column label="支付状态" prop="" min-width="100">
|
||||
<template #default="{ row }">
|
||||
<span
|
||||
:class="{
|
||||
'text-error': row.payStatus == 0
|
||||
}"
|
||||
>
|
||||
{{ row.payStatus == 0 ? '未支付' : '已支付' }}
|
||||
</span>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="提交时间" prop="createTime" min-width="180" />
|
||||
<el-table-column label="支付时间" prop="payTime" min-width="180" />
|
||||
<el-table-column label="操作" width="120" fixed="right">
|
||||
<template #default="{ row }">
|
||||
<el-button
|
||||
v-if="row.payStatus == 1"
|
||||
v-perms="['finance:recharger:refund']"
|
||||
type="primary"
|
||||
link
|
||||
@click="handleRefund(row.id)"
|
||||
>
|
||||
退款
|
||||
</el-button>
|
||||
</template>
|
||||
</el-table-column>
|
||||
</el-table>
|
||||
<div class="flex justify-end mt-4">
|
||||
<pagination v-model="pager" @change="getLists" />
|
||||
</div>
|
||||
</el-card>
|
||||
</div>
|
||||
</template>
|
||||
<script lang="ts" setup name="articleLists">
|
||||
import { rechargeLists, refund } from '@/api/finance'
|
||||
import { usePaging } from '@/hooks/usePaging'
|
||||
import feedback from '@/utils/feedback'
|
||||
const queryParams = reactive({
|
||||
sn: '',
|
||||
keyword: '',
|
||||
payStatus: '',
|
||||
payWay: '',
|
||||
startTime: '',
|
||||
endTime: ''
|
||||
})
|
||||
|
||||
const { pager, getLists, resetPage, resetParams } = usePaging({
|
||||
fetchFun: rechargeLists,
|
||||
params: queryParams
|
||||
})
|
||||
const handleRefund = async (id: number) => {
|
||||
await feedback.confirm('确认退款?')
|
||||
await refund({
|
||||
id
|
||||
})
|
||||
feedback.msgSuccess('操作成功')
|
||||
getLists()
|
||||
}
|
||||
|
||||
getLists()
|
||||
</script>
|
||||
226
admin/src/views/finance/refund_record.vue
Normal file
226
admin/src/views/finance/refund_record.vue
Normal file
@@ -0,0 +1,226 @@
|
||||
<template>
|
||||
<div>
|
||||
<el-card class="!border-none mb-4" shadow="never">
|
||||
<div class="flex flex-wrap">
|
||||
<div class="w-1/2 md:w-1/4">
|
||||
<div class="leading-10">累计退款金额 (元)</div>
|
||||
<div class="text-6xl">{{ refundData.totalRefundAmount }}</div>
|
||||
</div>
|
||||
<div class="w-1/2 md:w-1/4">
|
||||
<div class="leading-10">退款中金额 (元)</div>
|
||||
<div class="text-6xl">{{ refundData.ingRefundAmount }}</div>
|
||||
</div>
|
||||
<div class="w-1/2 md:w-1/4">
|
||||
<div class="leading-10">退款成功金额 (元)</div>
|
||||
<div class="text-6xl">{{ refundData.successRefundAmount }}</div>
|
||||
</div>
|
||||
<div class="w-1/2 md:w-1/4">
|
||||
<div class="leading-10">退款失败金额 (元)</div>
|
||||
<div class="text-6xl">{{ refundData.errorRefundAmount }}</div>
|
||||
</div>
|
||||
</div>
|
||||
</el-card>
|
||||
<el-card class="!border-none" shadow="never">
|
||||
<el-form ref="formRef" class="mb-[-16px] mt-[16px]" :model="queryParams" :inline="true">
|
||||
<el-form-item label="退款单号">
|
||||
<el-input
|
||||
class="w-[280px]"
|
||||
v-model="queryParams.sn"
|
||||
placeholder="请输入退款单号"
|
||||
clearable
|
||||
@keyup.enter="resetPage"
|
||||
/>
|
||||
</el-form-item>
|
||||
<el-form-item label="来源单号">
|
||||
<el-input
|
||||
class="w-[280px]"
|
||||
v-model="queryParams.orderSn"
|
||||
placeholder="请输入来源单号"
|
||||
clearable
|
||||
@keyup.enter="resetPage"
|
||||
/>
|
||||
</el-form-item>
|
||||
<el-form-item label="用户信息">
|
||||
<el-input
|
||||
class="w-[280px]"
|
||||
v-model="queryParams.keyword"
|
||||
placeholder="请输入用户信息"
|
||||
clearable
|
||||
@keyup.enter="resetPage"
|
||||
/>
|
||||
</el-form-item>
|
||||
<el-form-item label="退款类型">
|
||||
<el-select class="w-[280px]" v-model="queryParams.refundType">
|
||||
<el-option label="全部" value />
|
||||
<el-option label="后台退款" :value="1" />
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item label="记录时间">
|
||||
<daterange-picker
|
||||
v-model:startTime="queryParams.startTime"
|
||||
v-model:endTime="queryParams.endTime"
|
||||
/>
|
||||
</el-form-item>
|
||||
<el-form-item>
|
||||
<el-button type="primary" @click="resetPage">查询</el-button>
|
||||
<el-button @click="resetParams">重置</el-button>
|
||||
<!-- <export-data
|
||||
class="ml-2.5"
|
||||
:fetch-fun="refundRecord"
|
||||
:params="queryParams"
|
||||
:page-size="pager.size"
|
||||
/> -->
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
</el-card>
|
||||
<el-card class="!border-none mt-4" shadow="never">
|
||||
<el-tabs v-model="activeTab" @tab-change="handleTabChange">
|
||||
<el-tab-pane
|
||||
v-for="(item, index) in tabLists"
|
||||
:label="`${item.name}(${pager.extend[item.numKey] ?? 0})`"
|
||||
:name="index"
|
||||
:key="index"
|
||||
>
|
||||
<el-table size="large" v-loading="pager.loading" :data="pager.lists">
|
||||
<el-table-column label="退款单号" prop="sn" min-width="190" />
|
||||
<el-table-column label="用户信息" min-width="160">
|
||||
<template #default="{ row }">
|
||||
<div class="flex items-center">
|
||||
<image-contain
|
||||
class="flex-none mr-2"
|
||||
:src="row.avatar"
|
||||
:width="40"
|
||||
:height="40"
|
||||
preview-teleported
|
||||
fit="contain"
|
||||
/>
|
||||
{{ row.nickname }}
|
||||
</div>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="来源单号" prop="orderSn" min-width="190" />
|
||||
<el-table-column label="退款金额" min-width="100">
|
||||
<template #default="{ row }"> ¥ {{ row.refundAmount }} </template>
|
||||
</el-table-column>
|
||||
|
||||
<el-table-column label="退款类型" prop="refundTypeMsg" min-width="100" />
|
||||
<el-table-column label="退款状态" prop="" min-width="100">
|
||||
<template #default="{ row }">
|
||||
<el-tag type="warning" v-if="row.refundStatus == 0">
|
||||
{{ row.refundStatusMsg }}
|
||||
</el-tag>
|
||||
<el-tag v-if="row.refundStatus == 1">
|
||||
{{ row.refundStatusMsg }}
|
||||
</el-tag>
|
||||
<el-tag type="danger" v-if="row.refundStatus == 2">
|
||||
{{ row.refundStatusMsg }}
|
||||
</el-tag>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="记录时间" prop="createTime" min-width="180" />
|
||||
<el-table-column label="操作" width="180" fixed="right">
|
||||
<template #default="{ row }">
|
||||
<el-button
|
||||
v-perms="['finance:refund:log']"
|
||||
type="primary"
|
||||
link
|
||||
@click="handleShowRefundLog(row.id)"
|
||||
>
|
||||
退款日志
|
||||
</el-button>
|
||||
<el-button
|
||||
v-if="row.refundStatus == 2"
|
||||
v-perms="['finance:recharger:refundAgain']"
|
||||
type="primary"
|
||||
link
|
||||
@click="handleRefund(row.id)"
|
||||
>
|
||||
重新退款
|
||||
</el-button>
|
||||
</template>
|
||||
</el-table-column>
|
||||
</el-table>
|
||||
</el-tab-pane>
|
||||
</el-tabs>
|
||||
|
||||
<div class="flex justify-end mt-4">
|
||||
<pagination v-model="pager" @change="getLists" />
|
||||
</div>
|
||||
</el-card>
|
||||
<refund-log v-model="showRefundLog" :refund-id="selectRefundId" />
|
||||
</div>
|
||||
</template>
|
||||
<script lang="ts" setup name="articleLists">
|
||||
import { refundRecord, refundAgain } from '@/api/finance'
|
||||
import { usePaging } from '@/hooks/usePaging'
|
||||
import feedback from '@/utils/feedback'
|
||||
import RefundLog from './component/refund-log.vue'
|
||||
const queryParams = reactive({
|
||||
sn: '',
|
||||
orderSn: '',
|
||||
keyword: '',
|
||||
refundType: '',
|
||||
startTime: '',
|
||||
endTime: '',
|
||||
type: ''
|
||||
})
|
||||
const refundData = reactive({
|
||||
errorRefundAmount: 0,
|
||||
ingRefundAmount: 0,
|
||||
successRefundAmount: 0,
|
||||
totalRefundAmount: 0
|
||||
})
|
||||
const showRefundLog = ref(false)
|
||||
const selectRefundId = ref(0)
|
||||
const activeTab = ref(0)
|
||||
const tabLists = ref([
|
||||
{
|
||||
name: '全部',
|
||||
type: '',
|
||||
numKey: 'total'
|
||||
},
|
||||
{
|
||||
name: '退款中',
|
||||
type: 0,
|
||||
numKey: 'ing'
|
||||
},
|
||||
{
|
||||
name: '退款成功',
|
||||
type: 1,
|
||||
numKey: 'success'
|
||||
},
|
||||
{
|
||||
name: '退款失败',
|
||||
type: 2,
|
||||
numKey: 'error'
|
||||
}
|
||||
])
|
||||
|
||||
const { pager, getLists, resetPage, resetParams } = usePaging({
|
||||
fetchFun: refundRecord,
|
||||
params: queryParams,
|
||||
afterRequest(res) {
|
||||
Object.assign(refundData, res.extend.stat)
|
||||
}
|
||||
})
|
||||
|
||||
const handleRefund = async (id: number) => {
|
||||
await feedback.confirm('确认重新退款?')
|
||||
await refundAgain({
|
||||
id
|
||||
})
|
||||
feedback.msgSuccess('操作成功')
|
||||
getLists()
|
||||
}
|
||||
|
||||
const handleShowRefundLog = async (id: number) => {
|
||||
showRefundLog.value = true
|
||||
selectRefundId.value = id
|
||||
}
|
||||
const handleTabChange = (index: any) => {
|
||||
queryParams.type = tabLists.value[index].type as string
|
||||
resetPage()
|
||||
}
|
||||
|
||||
getLists()
|
||||
</script>
|
||||
279
admin/src/views/setting/pay/config/edit.vue
Normal file
279
admin/src/views/setting/pay/config/edit.vue
Normal file
@@ -0,0 +1,279 @@
|
||||
<template>
|
||||
<div class="edit-popup">
|
||||
<popup
|
||||
ref="popupRef"
|
||||
:title="popupTitle"
|
||||
:async="true"
|
||||
width="550px"
|
||||
@confirm="handleSubmit"
|
||||
@close="handleClose"
|
||||
>
|
||||
<el-form ref="formRef" :model="formData" label-width="84px" :rules="formRules">
|
||||
<el-form-item label="支付方式">
|
||||
<el-radio :label="formData.name" :model-value="formData.name" />
|
||||
</el-form-item>
|
||||
<el-form-item label="显示名称" prop="showName">
|
||||
<el-input v-model="formData.showName" placeholder="请输入显示名称" />
|
||||
</el-form-item>
|
||||
<el-form-item label="显示图标" prop="icon">
|
||||
<div>
|
||||
<material-picker :limit="1" :disabled="false" v-model="formData.icon" />
|
||||
<span class="form-tips">建议尺寸:200*200px</span>
|
||||
</div>
|
||||
</el-form-item>
|
||||
<template v-if="formData.way == PayWayEnum.WECHAT">
|
||||
<el-form-item prop="params.interface_version" label="微信支付接口版本">
|
||||
<div>
|
||||
<el-radio-group v-model="formData.params.interface_version">
|
||||
<el-radio label="v3"></el-radio>
|
||||
</el-radio-group>
|
||||
<div class="form-tips">暂时只支持V3版本</div>
|
||||
</div>
|
||||
</el-form-item>
|
||||
|
||||
<el-form-item label="商户类型" prop="params.merchant_type">
|
||||
<div>
|
||||
<el-radio-group v-model="formData.params.merchant_type">
|
||||
<el-radio label="ordinary_merchant">普通商户</el-radio>
|
||||
</el-radio-group>
|
||||
<div class="form-tips">
|
||||
暂时只支持普通商户类型,服务商户类型模式暂不支持
|
||||
</div>
|
||||
</div>
|
||||
</el-form-item>
|
||||
|
||||
<el-form-item label="微信支付商户号" prop="params.mch_id">
|
||||
<div class="flex-1">
|
||||
<el-input
|
||||
v-model="formData.params.mch_id"
|
||||
placeholder="请输入微信支付商户号"
|
||||
/>
|
||||
<div class="form-tips">微信支付商户号(MCHID)</div>
|
||||
</div>
|
||||
</el-form-item>
|
||||
|
||||
<el-form-item label="商户API密钥" prop="params.pay_sign_key">
|
||||
<el-input
|
||||
v-model="formData.params.pay_sign_key"
|
||||
placeholder="请输入微信支付商户API密钥"
|
||||
/>
|
||||
<span class="form-tips">微信支付商户API密钥(paySignKey)</span>
|
||||
</el-form-item>
|
||||
|
||||
<el-form-item label="微信支付证书" prop="params.private_cert">
|
||||
<el-input
|
||||
type="textarea"
|
||||
rows="3"
|
||||
v-model="formData.params.private_cert"
|
||||
placeholder="请输入微信支付证书"
|
||||
/>
|
||||
|
||||
<span class="form-tips">
|
||||
微信支付证书(apiclient_cert.pem),前往微信商家平台生成并黏贴至此处
|
||||
</span>
|
||||
</el-form-item>
|
||||
|
||||
<el-form-item label="微信支付证书密钥" prop="params.private_key">
|
||||
<el-input
|
||||
type="textarea"
|
||||
rows="3"
|
||||
v-model="formData.params.private_key"
|
||||
placeholder="请输入微信支付证书密钥"
|
||||
/>
|
||||
<span class="form-tips">
|
||||
微信支付证书密钥(apiclient_key.pem),前往微信商家平台生成并黏贴至此处
|
||||
</span>
|
||||
</el-form-item>
|
||||
</template>
|
||||
<!-- <template v-if="formData.way == PayWayEnum.ALIPAY">
|
||||
<el-form-item label="模式" prop="params.mode">
|
||||
<div>
|
||||
<el-radio-group v-model="formData.params.mode">
|
||||
<el-radio label="normal_mode">普通模式</el-radio>
|
||||
</el-radio-group>
|
||||
<div class="form-tips">暂时仅支持支付宝普通模式</div>
|
||||
</div>
|
||||
</el-form-item>
|
||||
|
||||
<el-form-item label="商户类型" prop="params.merchant_type">
|
||||
<div>
|
||||
<el-radio-group v-model="formData.params.merchant_type">
|
||||
<el-radio label="ordinary_merchant">普通商户</el-radio>
|
||||
</el-radio-group>
|
||||
<div class="form-tips">
|
||||
暂时只支持普通商户类型,服务商户类型模式暂不支持
|
||||
</div>
|
||||
</div>
|
||||
</el-form-item>
|
||||
|
||||
<el-form-item label="应用ID" prop="params.app_id">
|
||||
<div class="flex-1">
|
||||
<el-input
|
||||
v-model="formData.params.app_id"
|
||||
placeholder="请输入支付宝应用ID"
|
||||
/>
|
||||
<span class="form-tips"> 支付宝应用APP_ID </span>
|
||||
</div>
|
||||
</el-form-item>
|
||||
|
||||
<el-form-item label="应用私钥" prop="params.private_key">
|
||||
<div class="flex-1">
|
||||
<el-input
|
||||
type="textarea"
|
||||
rows="3"
|
||||
v-model="formData.params.private_key"
|
||||
placeholder="请输入支付宝应用私钥"
|
||||
/>
|
||||
<span class="form-tips">支付宝应用私钥(private_key) </span>
|
||||
</div>
|
||||
</el-form-item>
|
||||
|
||||
<el-form-item label="支付宝公钥" prop="params.ali_public_key">
|
||||
<div class="flex-1">
|
||||
<el-input
|
||||
type="textarea"
|
||||
rows="3"
|
||||
v-model="formData.params.ali_public_key"
|
||||
placeholder="请输入支付宝公钥"
|
||||
/>
|
||||
<span class="form-tips">支付宝公钥(ali_public_key) </span>
|
||||
</div>
|
||||
</el-form-item>
|
||||
</template> -->
|
||||
<el-form-item label="排序" prop="sort">
|
||||
<div>
|
||||
<el-input-number v-model="formData.sort" :min="0" :max="9999" />
|
||||
<div class="form-tips">默认为0, 数值越大越排前</div>
|
||||
</div>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
</popup>
|
||||
</div>
|
||||
</template>
|
||||
<script lang="ts" setup>
|
||||
import type { FormInstance, FormRules } from 'element-plus'
|
||||
import { getPayConfig, setPayConfig } from '@/api/setting/pay'
|
||||
import Popup from '@/components/popup/index.vue'
|
||||
import feedback from '@/utils/feedback'
|
||||
const emit = defineEmits(['success', 'close'])
|
||||
const formRef = shallowRef<FormInstance>()
|
||||
const popupRef = shallowRef<InstanceType<typeof Popup>>()
|
||||
enum PayWayEnum {
|
||||
BALANCE = 1,
|
||||
WECHAT = 2,
|
||||
ALIPAY = 3
|
||||
}
|
||||
const popupTitle = computed(() => {
|
||||
switch (formData.way) {
|
||||
case PayWayEnum.BALANCE:
|
||||
return '余额支付'
|
||||
case PayWayEnum.WECHAT:
|
||||
return '微信支付'
|
||||
case PayWayEnum.ALIPAY:
|
||||
return '支付宝支付'
|
||||
}
|
||||
})
|
||||
const formData = reactive({
|
||||
id: '',
|
||||
way: 0,
|
||||
name: '',
|
||||
showName: '',
|
||||
icon: '',
|
||||
sort: 0,
|
||||
remark: '',
|
||||
params: {
|
||||
interface_version: '',
|
||||
merchant_type: '',
|
||||
mch_id: '',
|
||||
pay_sign_key: '',
|
||||
private_cert: '',
|
||||
private_key: '',
|
||||
mode: '',
|
||||
app_id: '',
|
||||
ali_public_key: ''
|
||||
}
|
||||
})
|
||||
|
||||
const formRules: FormRules = {
|
||||
showName: [
|
||||
{
|
||||
required: true,
|
||||
message: '请输入显示名称'
|
||||
}
|
||||
],
|
||||
'params.mch_id': [
|
||||
{
|
||||
required: true,
|
||||
message: '请输入微信支付商户号'
|
||||
}
|
||||
],
|
||||
'params.pay_sign_key': [
|
||||
{
|
||||
required: true,
|
||||
message: '请输入微信支付商户API密钥'
|
||||
}
|
||||
],
|
||||
'params.private_cert': [
|
||||
{
|
||||
required: true,
|
||||
message: '请输入微信支付证书'
|
||||
}
|
||||
],
|
||||
'params.private_key': [
|
||||
{
|
||||
required: true,
|
||||
message: '请输入微信支付证书密钥'
|
||||
}
|
||||
],
|
||||
'params.app_id': [
|
||||
{
|
||||
required: true,
|
||||
message: '请输入支付宝应用ID'
|
||||
}
|
||||
],
|
||||
'params.ali_public_key': [
|
||||
{
|
||||
required: true,
|
||||
message: '请输入支付宝公钥'
|
||||
}
|
||||
]
|
||||
}
|
||||
|
||||
const handleSubmit = async () => {
|
||||
await formRef.value?.validate()
|
||||
await setPayConfig(formData)
|
||||
feedback.msgSuccess('操作成功')
|
||||
popupRef.value?.close()
|
||||
emit('success')
|
||||
}
|
||||
|
||||
const open = () => {
|
||||
popupRef.value?.open()
|
||||
}
|
||||
|
||||
const setFormData = (data: Record<any, any>) => {
|
||||
for (const key in formData) {
|
||||
if (data[key] != null && data[key] != undefined) {
|
||||
//@ts-ignore
|
||||
formData[key] = data[key]
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
const getDetail = async (row: Record<string, any>) => {
|
||||
const data = await getPayConfig({
|
||||
id: row.id
|
||||
})
|
||||
setFormData(data)
|
||||
}
|
||||
|
||||
const handleClose = () => {
|
||||
emit('close')
|
||||
}
|
||||
|
||||
defineExpose({
|
||||
open,
|
||||
setFormData,
|
||||
getDetail
|
||||
})
|
||||
</script>
|
||||
63
admin/src/views/setting/pay/config/index.vue
Normal file
63
admin/src/views/setting/pay/config/index.vue
Normal file
@@ -0,0 +1,63 @@
|
||||
<template>
|
||||
<div>
|
||||
<el-card class="!border-none" shadow="never">
|
||||
<el-alert
|
||||
type="warning"
|
||||
title="温馨提示:设置系统支持的支付方式"
|
||||
:closable="false"
|
||||
show-icon
|
||||
/>
|
||||
</el-card>
|
||||
<el-card shadow="never" class="mt-4 !border-none">
|
||||
<div>
|
||||
<el-table :data="payConfigList">
|
||||
<el-table-column prop="name" label="支付方式" min-width="150" />
|
||||
<el-table-column prop="showName" label="显示名称" min-width="150" />
|
||||
<el-table-column label="图标" min-width="150">
|
||||
<template #default="{ row }">
|
||||
<el-image
|
||||
:src="row.icon"
|
||||
alt="图标"
|
||||
style="width: 34px; height: 34px"
|
||||
/>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column prop="sort" label="排序" min-width="150" />
|
||||
<el-table-column label="操作" min-width="80" fixed="right">
|
||||
<!-- 操作 -->
|
||||
<template #default="{ row }">
|
||||
<el-button
|
||||
v-perms="['setting:payment:editConfig']"
|
||||
link
|
||||
type="primary"
|
||||
@click="handleEdit(row)"
|
||||
>
|
||||
配置
|
||||
</el-button>
|
||||
</template>
|
||||
</el-table-column>
|
||||
</el-table>
|
||||
</div>
|
||||
</el-card>
|
||||
<edit-popup v-if="showEdit" ref="editRef" @success="getConfig" @close="showEdit = false" />
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script lang="ts" setup>
|
||||
import { getPayConfigLists } from '@/api/setting/pay'
|
||||
import EditPopup from './edit.vue'
|
||||
const payConfigList = ref<any[]>([])
|
||||
const editRef = shallowRef<InstanceType<typeof EditPopup>>()
|
||||
const showEdit = ref(false)
|
||||
const getConfig = async () => {
|
||||
const data = await getPayConfigLists()
|
||||
payConfigList.value = data
|
||||
}
|
||||
const handleEdit = async (data: any) => {
|
||||
showEdit.value = true
|
||||
await nextTick()
|
||||
editRef.value?.open()
|
||||
editRef.value?.getDetail(data)
|
||||
}
|
||||
getConfig()
|
||||
</script>
|
||||
138
admin/src/views/setting/pay/method/index.vue
Normal file
138
admin/src/views/setting/pay/method/index.vue
Normal file
@@ -0,0 +1,138 @@
|
||||
<template>
|
||||
<div>
|
||||
<div>
|
||||
<el-button
|
||||
type="primary"
|
||||
v-perms="['setting:payment:editMethod']"
|
||||
@click="handelSetupPayWay"
|
||||
>
|
||||
设置支付方式
|
||||
</el-button>
|
||||
</div>
|
||||
|
||||
<el-card
|
||||
shadow="never"
|
||||
class="mt-4 !border-none"
|
||||
v-for="(value, scene) in payWay"
|
||||
:key="scene"
|
||||
>
|
||||
<div>
|
||||
<div class="text-lg mb-[24px]" v-if="scene == PaySceneEnum.MP_WEIXIN">
|
||||
微信小程序
|
||||
<span class="form-tips ml-[10px]">在微信小程序中付款的场景</span>
|
||||
</div>
|
||||
<div class="text-lg mb-[24px]" v-if="scene == PaySceneEnum.OA">
|
||||
微信公众号
|
||||
<span class="form-tips ml-[10px]">
|
||||
在微信公众号H5页面中付款的场景,公众号类型一般为服务号
|
||||
</span>
|
||||
</div>
|
||||
<div class="text-lg mb-[24px]" v-if="scene == PaySceneEnum.H5">
|
||||
H5支付
|
||||
<span class="form-tips ml-[10px]">在浏览器H5页面中付款的场景</span>
|
||||
</div>
|
||||
<!-- <div class="text-lg mb-[24px]" v-if="scene == PaySceneEnum.PC">
|
||||
PC支付
|
||||
<span class="form-tips ml-[10px]">在浏览器PC页面中付款的场景</span>
|
||||
</div>
|
||||
<div class="text-lg mb-[24px]" v-if="scene == PaySceneEnum.APP">
|
||||
APP支付
|
||||
<span class="form-tips ml-[10px]">在APP付款的场景</span>
|
||||
</div> -->
|
||||
<el-table v-if="value.length" :data="value" style="width: 100%">
|
||||
<el-table-column label="图标" min-width="150">
|
||||
<template #default="{ row }">
|
||||
<el-image
|
||||
:src="row.icon"
|
||||
alt="图标"
|
||||
style="width: 34px; height: 34px"
|
||||
/>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column prop="name" label="支付方式" min-width="150" />
|
||||
<el-table-column label="默认支付" min-width="150">
|
||||
<template #default="{ row, $index }">
|
||||
<div>
|
||||
<template v-if="setupPayWay">
|
||||
<el-radio
|
||||
v-model="row.isDefault"
|
||||
:label="1"
|
||||
@change="changePayDefault($index, scene)"
|
||||
>
|
||||
设为默认
|
||||
</el-radio>
|
||||
</template>
|
||||
<template v-else>
|
||||
<el-tag v-if="row.isDefault == 1">默认</el-tag>
|
||||
<span v-else>-</span>
|
||||
</template>
|
||||
</div>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="开启状态" min-width="150">
|
||||
<template #default="{ row }">
|
||||
<el-switch
|
||||
v-if="setupPayWay"
|
||||
v-model="row.status"
|
||||
:active-value="1"
|
||||
:inactive-value="0"
|
||||
/>
|
||||
<span v-else>
|
||||
{{ row.status == 1 ? '开启' : '关闭' }}
|
||||
</span>
|
||||
</template>
|
||||
</el-table-column>
|
||||
</el-table>
|
||||
</div>
|
||||
</el-card>
|
||||
<footer-btns v-if="setupPayWay">
|
||||
<el-button @click="handleCancel">取消</el-button>
|
||||
<el-button type="primary" @click="handleSubmit">保存</el-button>
|
||||
</footer-btns>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script lang="ts" setup>
|
||||
import { getPayWay, setPayWay } from '@/api/setting/pay'
|
||||
import feedback from '@/utils/feedback'
|
||||
import { cloneDeep } from 'lodash'
|
||||
enum PaySceneEnum {
|
||||
MP_WEIXIN,
|
||||
OA,
|
||||
H5
|
||||
}
|
||||
const payWay = ref<Record<number, any[]>>({})
|
||||
const setupPayWay = ref(false)
|
||||
let defaultPayWay = {}
|
||||
const getConfig = async () => {
|
||||
payWay.value = await getPayWay()
|
||||
defaultPayWay = cloneDeep(payWay.value)
|
||||
}
|
||||
|
||||
const handelSetupPayWay = () => {
|
||||
setupPayWay.value = true
|
||||
}
|
||||
|
||||
const changePayDefault = (index: number, scene: number) => {
|
||||
payWay.value[scene].forEach((item: any) => {
|
||||
item.isDefault = 0
|
||||
})
|
||||
payWay.value[scene][index].isDefault = 1
|
||||
}
|
||||
|
||||
const handleCancel = () => {
|
||||
payWay.value = cloneDeep(defaultPayWay)
|
||||
setupPayWay.value = false
|
||||
}
|
||||
|
||||
const handleSubmit = async () => {
|
||||
await setPayWay({
|
||||
data: payWay.value
|
||||
})
|
||||
setupPayWay.value = false
|
||||
feedback.msgSuccess('操作成功')
|
||||
getConfig()
|
||||
}
|
||||
|
||||
getConfig()
|
||||
</script>
|
||||
Reference in New Issue
Block a user