支付配置修改优化

This commit is contained in:
Shaw
2024-02-28 19:05:30 +08:00
parent 44e1c7c408
commit 479f2065c6
7 changed files with 42 additions and 449 deletions

2
.env
View File

@ -1,5 +1,5 @@
# 标题
VITE_APP_TITLE=意象商城管理系统
VITE_APP_TITLE=意象商城管理系统Pro版
# 项目本地运行端口号
VITE_PORT=80

View File

@ -141,6 +141,7 @@ export enum DICT_TYPE {
PAY_ORDER_REFUND_STATUS = 'pay_order_refund_status', // 商户支付订单退款状态
PAY_REFUND_ORDER_STATUS = 'pay_refund_order_status', // 退款订单状态
PAY_REFUND_ORDER_TYPE = 'pay_refund_order_type', // 退款订单类别
PAYMENT_TYPE = 'payment_type', // 支付类型
// ========== MP 模块 ==========
MP_AUTO_REPLY_REQUEST_MATCH = 'mp_auto_reply_request_match', // 自动回复请求匹配类型

View File

@ -1,214 +0,0 @@
<template>
<ContentWrap>
<!-- 搜索工作栏 -->
<el-form
class="-mb-15px"
:model="queryParams"
ref="queryFormRef"
:inline="true"
label-width="68px"
@submit.enter.prevent
>
<el-form-item label="活动名称" prop="realName">
<el-input
v-model="queryParams.realName"
placeholder="请输入用户姓名"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="状态" prop="status">
<el-select v-model="queryParams.status" placeholder="请选择状态" clearable class="!w-240px">
<el-option
v-for="dict in getIntDictOptions(DICT_TYPE.COMMON_STATUS)"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
<el-form-item label="创建时间" prop="createTime">
<el-date-picker
v-model="queryParams.createTime"
value-format="YYYY-MM-DD HH:mm:ss"
type="daterange"
start-placeholder="开始日期"
end-placeholder="结束日期"
:default-time="[new Date('1 00:00:00'), new Date('1 23:59:59')]"
class="!w-240px"
/>
</el-form-item>
<el-form-item>
<el-button @click="handleQuery"><Icon icon="ep:search" class="mr-5px" /> 搜索</el-button>
<el-button @click="resetQuery"><Icon icon="ep:refresh" class="mr-5px" /> 重置</el-button>
</el-form-item>
</el-form>
</ContentWrap>
<!-- 列表 -->
<ContentWrap>
<el-table v-loading="loading" :data="list" style="width: 100%">
<el-table-column label="序号" type="index" width="80" />
<el-table-column label="活动名称" align="center" prop="name" width="190" />
<el-table-column label="拼团商品" width="330">
<template #default="scope">
<div class="flex">
<img height="80" width="80" :src="scope.row.image" alt="" />
<p>{{ scope.row.storeName }}</p>
</div>
</template>
</el-table-column>
<el-table-column label="团长" align="center" prop="orderId" />
<el-table-column label="成团人数" align="center" prop="orderId" />
<el-table-column label="参团人数" align="center" prop="orderId" />
<el-table-column label="拼团状态" align="center">
<template #default="scope">
<span v-if="scope.row.payType=='yue'">拼团成功</span>
<span v-if="scope.row.payType=='weixin'">拼团中</span>
<span v-if="scope.row.payType=='alipay'">拼团失败</span>
</template>
</el-table-column>
<el-table-column
label="开团时间"
align="center"
prop="payTime"
:formatter="dateFormatter"
width="190"
/>
<el-table-column label="操作" align="center" fixed="right" width="60">
<template #default="scope">
<el-button
link
type="primary"
@click="showGroupDetail(scope.row.id)"
>
详情
</el-button>
</template>
</el-table-column>
</el-table>
<!-- 分页 -->
<Pagination
:total="total"
v-model:page="queryParams.pageNo"
v-model:limit="queryParams.pageSize"
@pagination="getList"
/>
</ContentWrap>
<!-- 选择商品列表-->
<el-dialog
v-model="groupVisible"
title="查看详情"
width="60%"
top="50px"
class="group-dialog"
:close-on-click-modal="false"
:modal-append-to-body="false"
:modal="false"
>
<div class="tableBox">
<el-table
ref="multipleTableRef"
:data="productList"
border
:header-cell-style="{ background: '#EEF3FF', color: '#333333' }"
style="width: 100%"
max-height="600"
>
<el-table-column prop="storeName" label="用户名称" />
<el-table-column label="用户头像">
<template #default="scope">
<img height="80" width="80" :src="scope.row.image" alt="" />
</template>
</el-table-column>
<el-table-column prop="id" label="订单编号" />
<el-table-column prop="price" label="金额" />
</el-table>
<div class="fenye">
<!-- 分页 -->
<Pagination
:total="peopleTotal"
v-model:page="queryParams.pageNo"
v-model:limit="queryParams.pageSize"
@pagination="getList"
/>
</div>
</div>
</el-dialog>
</template>
<script setup lang="ts" name="StoreOrder">
import { DICT_TYPE, getIntDictOptions } from '@/utils/dict'
import { dateFormatter } from '@/utils/formatTime'
import * as StoreOrderApi from '@/api/mall/order/storeOrder'
import {ref} from "vue";
interface QueryParams {
pageNo: number
pageSize: number
orderId: string
realName: string
createTime: Date[]
status: string
}
const loading: Ref<boolean> = ref(true);
const total: Ref<number> = ref(0);
const list = ref([]);
const peopleTotal: Ref<number> = ref(10)
const queryParams: QueryParams = reactive({
pageNo: 1,
pageSize: 10,
orderId: "",
realName: "",
createTime: [],
status: ""
})
const queryFormRef = ref() // 搜索的表单
const groupVisible = ref(false) // 拼团信息显示
/** 查询列表 */
const getList: ()=> Promise<void> = async () => {
loading.value = true
try {
const data = await StoreOrderApi.getStoreOrderPage(queryParams)
data.list.forEach((element, index) => {
element.storeOrderCartInfoDOList.forEach((e, n) => {
data.list[index].storeOrderCartInfoDOList[n].cartInfo = eval('(' + e.cartInfo + ')')
})
});
list.value = data.list
total.value = data.total
} finally {
loading.value = false
}
}
/** 搜索按钮操作 */
const handleQuery: () => void = () => {
queryParams.pageNo = 1
getList()
}
/** 重置按钮操作 */
const resetQuery: () => void = () => {
queryFormRef.value.resetFields()
handleQuery()
}
const showGroupDetail: () => void = () => {
groupVisible.value = true
}
/** 初始化 **/
onMounted(() => {
getList()
})
</script>
<style lang="scss" scoped>
.tableBox {
margin-bottom: 50px;
}
</style>

View File

@ -1,214 +0,0 @@
<template>
<ContentWrap>
<!-- 搜索工作栏 -->
<el-form
class="-mb-15px"
:model="queryParams"
ref="queryFormRef"
:inline="true"
label-width="68px"
@submit.enter.prevent
>
<el-form-item label="活动名称" prop="realName">
<el-input
v-model="queryParams.realName"
placeholder="请输入用户姓名"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="状态" prop="status">
<el-select v-model="queryParams.status" placeholder="请选择状态" clearable class="!w-240px">
<el-option
v-for="dict in getIntDictOptions(DICT_TYPE.COMMON_STATUS)"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
<el-form-item label="创建时间" prop="createTime">
<el-date-picker
v-model="queryParams.createTime"
value-format="YYYY-MM-DD HH:mm:ss"
type="daterange"
start-placeholder="开始日期"
end-placeholder="结束日期"
:default-time="[new Date('1 00:00:00'), new Date('1 23:59:59')]"
class="!w-240px"
/>
</el-form-item>
<el-form-item>
<el-button @click="handleQuery"><Icon icon="ep:search" class="mr-5px" /> 搜索</el-button>
<el-button @click="resetQuery"><Icon icon="ep:refresh" class="mr-5px" /> 重置</el-button>
</el-form-item>
</el-form>
</ContentWrap>
<!-- 列表 -->
<ContentWrap>
<el-table v-loading="loading" :data="list" style="width: 100%">
<el-table-column label="序号" type="index" width="80" />
<el-table-column label="活动名称" align="center" prop="name" width="190" />
<el-table-column label="拼团商品" width="330">
<template #default="scope">
<div class="flex">
<img height="80" width="80" :src="scope.row.image" alt="" />
<p>{{ scope.row.storeName }}</p>
</div>
</template>
</el-table-column>
<el-table-column label="团长" align="center" prop="orderId" />
<el-table-column label="成团人数" align="center" prop="orderId" />
<el-table-column label="参团人数" align="center" prop="orderId" />
<el-table-column label="拼团状态" align="center">
<template #default="scope">
<span v-if="scope.row.payType=='yue'">拼团成功</span>
<span v-if="scope.row.payType=='weixin'">拼团中</span>
<span v-if="scope.row.payType=='alipay'">拼团失败</span>
</template>
</el-table-column>
<el-table-column
label="开团时间"
align="center"
prop="payTime"
:formatter="dateFormatter"
width="190"
/>
<el-table-column label="操作" align="center" fixed="right" width="60">
<template #default="scope">
<el-button
link
type="primary"
@click="showGroupDetail(scope.row.id)"
>
详情
</el-button>
</template>
</el-table-column>
</el-table>
<!-- 分页 -->
<Pagination
:total="total"
v-model:page="queryParams.pageNo"
v-model:limit="queryParams.pageSize"
@pagination="getList"
/>
</ContentWrap>
<!-- 选择商品列表-->
<el-dialog
v-model="groupVisible"
title="查看详情"
width="60%"
top="50px"
class="group-dialog"
:close-on-click-modal="false"
:modal-append-to-body="false"
:modal="false"
>
<div class="tableBox">
<el-table
ref="multipleTableRef"
:data="productList"
border
:header-cell-style="{ background: '#EEF3FF', color: '#333333' }"
style="width: 100%"
max-height="600"
>
<el-table-column prop="storeName" label="用户名称" />
<el-table-column label="用户头像">
<template #default="scope">
<img height="80" width="80" :src="scope.row.image" alt="" />
</template>
</el-table-column>
<el-table-column prop="id" label="订单编号" />
<el-table-column prop="price" label="金额" />
</el-table>
<div class="fenye">
<!-- 分页 -->
<Pagination
:total="peopleTotal"
v-model:page="queryParams.pageNo"
v-model:limit="queryParams.pageSize"
@pagination="getList"
/>
</div>
</div>
</el-dialog>
</template>
<script setup lang="ts" name="StoreOrder">
import { DICT_TYPE, getIntDictOptions } from '@/utils/dict'
import { dateFormatter } from '@/utils/formatTime'
import * as StoreOrderApi from '@/api/mall/order/storeOrder'
import {ref} from "vue";
interface QueryParams {
pageNo: number
pageSize: number
orderId: string
realName: string
createTime: Date[]
status: string
}
const loading: Ref<boolean> = ref(true);
const total: Ref<number> = ref(0);
const list = ref([]);
const peopleTotal: Ref<number> = ref(10)
const queryParams: QueryParams = reactive({
pageNo: 1,
pageSize: 10,
orderId: "",
realName: "",
createTime: [],
status: ""
})
const queryFormRef = ref() // 搜索的表单
const groupVisible = ref(false) // 拼团信息显示
/** 查询列表 */
const getList: ()=> Promise<void> = async () => {
loading.value = true
try {
const data = await StoreOrderApi.getStoreOrderPage(queryParams)
data.list.forEach((element, index) => {
element.storeOrderCartInfoDOList.forEach((e, n) => {
data.list[index].storeOrderCartInfoDOList[n].cartInfo = eval('(' + e.cartInfo + ')')
})
});
list.value = data.list
total.value = data.total
} finally {
loading.value = false
}
}
/** 搜索按钮操作 */
const handleQuery: () => void = () => {
queryParams.pageNo = 1
getList()
}
/** 重置按钮操作 */
const resetQuery: () => void = () => {
queryFormRef.value.resetFields()
handleQuery()
}
const showGroupDetail: () => void = () => {
groupVisible.value = true
}
/** 初始化 **/
onMounted(() => {
getList()
})
</script>
<style lang="scss" scoped>
.tableBox {
margin-bottom: 50px;
}
</style>

View File

@ -9,15 +9,20 @@
>
<el-form-item label="支付类型(支付渠道)" prop="payType">
<el-select v-model="formData.payType">
<el-option label="支付宝支付" value="aliPay" />
<el-option label="微信支付" value="wxPay" />
<el-option
v-for="(dict, index) in getStrDictOptions(DICT_TYPE.PAYMENT_TYPE)"
:key="index"
:label="dict.label"
:value="dict.value"
class="!w-240px"
/>
</el-select>
</el-form-item>
<el-form-item label="支付id" prop="detailsId">
<el-input v-model="formData.detailsId" placeholder="请输入支付id" />
<el-input :disabled="disabled" v-model="formData.detailsId" placeholder="请输入支付id" />
</el-form-item>
<el-form-item label="标题" prop="detailsId">
<el-input v-model="formData.title" placeholder="请输入支付id" />
<el-input v-model="formData.title" placeholder="请输入标题" />
</el-form-item>
<el-form-item label="应用id" prop="appid">
<el-input v-model="formData.appid" placeholder="请输入应用id" />
@ -25,9 +30,9 @@
<el-form-item label="微信商户id" prop="mchId">
<el-input v-model="formData.mchId" placeholder="请输入微信商户id" />
</el-form-item>
<el-form-item label="支付宝商户id" prop="seller">
<el-input v-model="formData.seller" placeholder="请输入支付宝商户id" />
</el-form-item>
<!-- <el-form-item label="支付宝商户id" prop="seller">-->
<!-- <el-input v-model="formData.seller" placeholder="请输入支付宝商户id" />-->
<!-- </el-form-item>-->
<el-form-item label="证书存储类型" prop="certStoreType" placeholder="请选择类型">
<el-select v-model="formData.certStoreType" clearable>
<el-option label="PATH" value="PATH" />
@ -37,12 +42,12 @@
<el-option label="URL" value="URL" />
</el-select>
</el-form-item>
<el-form-item label="私钥或私钥证书" prop="keyPrivate">
<el-input v-model="formData.keyPrivate" placeholder="请输入私钥或私钥证书" />
</el-form-item>
<el-form-item label="公钥或公钥证书" prop="keyPublic">
<el-input v-model="formData.keyPublic" placeholder="请输入公钥或公钥证书" />
</el-form-item>
<!-- <el-form-item label="私钥或私钥证书" prop="keyPrivate">-->
<!-- <el-input v-model="formData.keyPrivate" placeholder="请输入私钥或私钥证书" />-->
<!-- </el-form-item>-->
<!-- <el-form-item label="公钥或公钥证书" prop="keyPublic">-->
<!-- <el-input v-model="formData.keyPublic" placeholder="请输入公钥或公钥证书" />-->
<!-- </el-form-item>-->
<el-form-item label="key证书" prop="keyCert">
<el-input v-model="formData.keyCert" placeholder="请输入key证书,附加证书使用如SSL证书或者银联根级证书方面" />
</el-form-item>
@ -50,7 +55,7 @@
<el-input v-model="formData.keyCertPwd" placeholder="请输入私钥证书或key证书的密码" />
</el-form-item>
<el-form-item label="异步回调地址" prop="notifyUrl">
<el-input v-model="formData.notifyUrl" placeholder="请输入异步回调" />
<el-input v-model="formData.notifyUrl" placeholder="请输入异步回调地址(地址是域名+/app-api/pay/wxPayNotify" />
</el-form-item>
<el-form-item label="同步回调地址" prop="returnUrl">
<el-input v-model="formData.returnUrl" placeholder="请输入同步回调地址,大部分用于付款成功后页面转跳" />
@ -83,6 +88,7 @@
</template>
<script setup lang="ts">
import * as MerchantDetailsApi from '@/api/pay/merchantDetails'
import {DICT_TYPE, getStrDictOptions} from "@/utils/dict";
const { t } = useI18n() // 国际化
const message = useMessage() // 消息弹窗
@ -111,23 +117,28 @@ const formData = ref({
inputCharset: undefined,
isTest: undefined
})
const disabled = ref(false)
const formRules = reactive({
payType: [{ required: true, message: '支付类型(支付渠道)不能为空', trigger: 'change' }],
detailsId: [{ required: true, message: '支付id不能为空', trigger: 'change' }],
appid: [{ required: true, message: '应用id不能为空', trigger: 'change' }],
title: [{ required: true, message: '商户id不能为空', trigger: 'change' }],
notifyUrl: [{ required: true, message: '异步回调地址不能为空', trigger: 'blur' }]
title: [{ required: true, message: '标题不能为空', trigger: 'change' }],
signType: [{ required: true, message: '请选择签名方式', trigger: 'change' }],
notifyUrl: [{ required: true, message: '异步回调地址不能为空', trigger: 'blur' }],
mchId: [{ required: true, message: '微信商户ID不能为空', trigger: 'blur' }]
})
const formRef = ref() // 表单 Ref
/** 打开弹窗 */
const open = async (type: string, id?: number) => {
disabled.value = false
dialogVisible.value = true
dialogTitle.value = t('action.' + type)
formType.value = type
resetForm()
// 修改时,设置数据
if (id) {
disabled.value = true
formLoading.value = true
try {
formData.value = await MerchantDetailsApi.getMerchantDetails(id)

View File

@ -26,13 +26,21 @@
<el-table v-loading="loading" :data="list">
<el-table-column label="id" align="center" prop="detailsId" />
<el-table-column label="标题" align="center" prop="title" />
<el-table-column label="支付类型" align="center" prop="payType" />
<el-table-column label="支付类型" align="center" width="200">
<template #default="scope">
<dict-tag :type="DICT_TYPE.PAYMENT_TYPE" :value="scope.row.payType" />
</template>
</el-table-column>
<el-table-column label="应用id" align="center" prop="appid" />
<el-table-column label="商户id" align="center" prop="mchId" />
<el-table-column label="异步回调地址" align="center" prop="notifyUrl" />
<el-table-column label="同步回调地址" align="center" prop="returnUrl" />
<el-table-column label="签名方式" align="center" prop="signType" />
<el-table-column label="是否为测试环境" align="center" prop="isTest" />
<el-table-column label="是否为测试环境" align="center">
<template #default="scope">
<span>{{scope.row.isTest ? '是' : '否'}}</span>
</template>
</el-table-column>
<el-table-column
label="创建时间"
align="center"
@ -78,6 +86,7 @@
import * as MerchantDetailsApi from '@/api/pay/merchantDetails'
import MerchantDetailsForm from './MerchantDetailsForm.vue'
import { dateFormatter } from '@/utils/formatTime'
import {DICT_TYPE} from "@/utils/dict";
const message = useMessage() // 消息弹窗
const { t } = useI18n() // 国际化

View File

@ -15,7 +15,7 @@
"forceConsistentCasingInFileNames": true,
"allowSyntheticDefaultImports": true,
"strictFunctionTypes": false,
"noUnusedLocals": true,
"noUnusedLocals": false,
"noUnusedParameters": true,
"experimentalDecorators": true,
"noImplicitAny": false,