This commit is contained in:
孟帅
2023-05-10 23:54:50 +08:00
parent bbe655a4d8
commit 49a96750bf
314 changed files with 15138 additions and 6244 deletions

View File

@@ -22,6 +22,7 @@
:actionColumn="actionColumn"
@update:checked-row-keys="onCheckedRow"
:scroll-x="1090"
:resizeHeightOffset="-10000"
>
<template #tableTitle>
<n-button type="primary" @click="addTable">

View File

@@ -0,0 +1,94 @@
<template>
<div>
<n-spin :show="show" description="请稍候...">
<n-form :label-width="100" :model="formValue" :rules="rules" ref="formRef">
<n-form-item label="申请提现开关" path="cashSwitch">
<n-radio-group v-model:value="formValue.cashSwitch" name="cashSwitch">
<n-space>
<n-radio :value="1">开启</n-radio>
<n-radio :value="2">关闭</n-radio>
</n-space>
</n-radio-group>
</n-form-item>
<n-form-item label="提现最低手续费(元)" path="cashMinFee">
<n-input placeholder="" v-model:value="formValue.cashMinFee" />
</n-form-item>
<n-form-item label="提现最低手续费比率" path="cashMinFeeRatio">
<n-input placeholder="" v-model:value="formValue.cashMinFeeRatio" />
</n-form-item>
<n-form-item label="提现最低金额" path="cashMinMoney">
<n-input placeholder="" v-model:value="formValue.cashMinMoney" />
</n-form-item>
<n-form-item label="提现提示信息" path="cashTips">
<Editor style="height: 320px" v-model:value="formValue.cashTips" />
</n-form-item>
<div>
<n-space>
<n-button type="primary" @click="formSubmit">保存更新</n-button>
</n-space>
</div>
</n-form>
</n-spin>
</div>
</template>
<script lang="ts" setup>
import { onMounted, ref } from 'vue';
import { useMessage } from 'naive-ui';
import { getConfig, updateConfig } from '@/api/sys/config';
import Editor from '@/components/Editor/editor.vue';
const group = ref('cash');
const show = ref(false);
const rules = {};
const formRef: any = ref(null);
const message = useMessage();
const formValue = ref({
cashSwitch: '',
cashMinFee: '',
cashMinFeeRatio: '',
cashMinMoney: 0,
cashTips: '',
});
function formSubmit() {
formRef.value.validate((errors) => {
if (!errors) {
updateConfig({ group: group.value, list: formValue.value })
.then((_res) => {
message.success('更新成功');
load();
})
.catch((error) => {
message.error(error.toString());
});
} else {
message.error('验证失败,请填写完整信息');
}
});
}
onMounted(() => {
load();
});
function load() {
show.value = true;
new Promise((_resolve, _reject) => {
getConfig({ group: group.value })
.then((res) => {
show.value = false;
formValue.value = res.list;
})
.catch((error) => {
show.value = false;
message.error(error.toString());
});
});
}
</script>

View File

@@ -0,0 +1,248 @@
<template>
<div>
<n-spin :show="show" description="请稍候...">
<n-form :label-width="100" :model="formValue" :rules="rules" ref="formRef">
<n-form-item label="开启debug" path="payDebug">
<n-switch size="large" v-model:value="formValue.payDebug" />
<template #feedback>开启后控制台会输出支付相关的日志</template>
</n-form-item>
<n-divider title-placement="left">支付宝</n-divider>
<n-alert :show-icon="false" type="info">
确保你已经申请开通过支付宝相关产品权限建议按照以下步骤进行配置
<br />1.
下载支付宝平台密钥工具下载地址https://opendocs.alipay.com/common/02kipk加签方式选择证书加密算法选择RSA2
<br />2. 生成后的私钥请在工具中转换为PKCS1格式 <br />3.
在支付宝中配置证书参考地址https://opendocs.alipay.com/common/02khjo?pathHash=5403bedd
</n-alert>
<n-form-item label="应用ID" path="payAliPayAppId">
<n-input v-model:value="formValue.payAliPayAppId" placeholder="" />
<template #feedback></template>
</n-form-item>
<n-form-item label="应用私钥路径" path="payAliPayPrivateKey">
<n-input v-model:value="formValue.payAliPayPrivateKey" placeholder="" clearable />
<template #feedback
>RSA2 加密算法默认生成格式为 PKCS8系统默认是RSA2加密切记转换为 PKCS1 格式</template
>
</n-form-item>
<n-form-item label="应用公钥" path="payAliPayAppCertPublicKey">
<n-input v-model:value="formValue.payAliPayAppCertPublicKey" placeholder="" clearable />
<template #feedback>appCertPublicKey.crt证书路径</template>
</n-form-item>
<n-form-item label="支付宝根证书路径" path="payAliPayRootCert">
<n-input v-model:value="formValue.payAliPayRootCert" placeholder="" clearable />
<template #feedback>alipayRootCert.crt证书路径"</template>
</n-form-item>
<n-form-item label="支付宝公钥证书路径" path="payAliPayCertPublicKeyRSA2">
<n-input v-model:value="formValue.payAliPayCertPublicKeyRSA2" placeholder="" clearable />
<template #feedback>alipayCertPublicKey_RSA2.crt证书路径"</template>
</n-form-item>
<n-divider title-placement="left">微信支付</n-divider>
<n-form-item label="应用ID" path="payWxPayAppId">
<n-input v-model:value="formValue.payWxPayAppId" placeholder="" />
<template #feedback>和微信配置中的微信公众号配置保持一致</template>
</n-form-item>
<n-form-item label="商户ID" path="payWxPayMchId">
<n-input v-model:value="formValue.payWxPayMchId" placeholder="" />
<template #feedback>商户ID 或者服务商模式的 sp_mchid</template>
</n-form-item>
<n-form-item label="证书序列号" path="payWxPaySerialNo">
<n-input v-model:value="formValue.payWxPaySerialNo" placeholder="" />
<template #feedback>商户证书的证书序列号</template>
</n-form-item>
<n-form-item label="APIv3Key" path="payWxPayAPIv3Key">
<n-input v-model:value="formValue.payWxPayAPIv3Key" placeholder="" clearable />
<template #feedback>商户平台获取</template>
</n-form-item>
<n-form-item label="私钥" path="payWxPayPrivateKey">
<n-input
type="textarea"
v-model:value="formValue.payWxPayPrivateKey"
placeholder=""
clearable
/>
<template #feedback>apiclient_key.pem 读取后的内容</template>
</n-form-item>
<n-divider title-placement="left">QQ支付</n-divider>
<n-form-item label="应用ID" path="payQQPayAppId">
<n-input v-model:value="formValue.payQQPayAppId" placeholder="" />
<template #feedback></template>
</n-form-item>
<n-form-item label="商户ID" path="payQQPayMchId">
<n-input v-model:value="formValue.payQQPayMchId" placeholder="" />
<template #feedback></template>
</n-form-item>
<n-form-item label="ApiKey" path="payQQPayApiKey">
<n-input
type="textarea"
v-model:value="formValue.payQQPayApiKey"
placeholder=""
clearable
/>
<template #feedback>API秘钥值</template>
</n-form-item>
<div>
<n-space>
<n-button type="primary" @click="formSubmit">保存更新</n-button>
<!-- <n-button type="default" @click="sendTest">测试支付</n-button>-->
</n-space>
</div>
</n-form>
</n-spin>
<n-modal
:block-scroll="false"
:mask-closable="false"
v-model:show="showModal"
:show-icon="false"
preset="dialog"
title="发送测试短信"
>
<n-form
:model="formParams"
:rules="rules"
ref="formTestRef"
label-placement="left"
:label-width="80"
class="py-4"
>
<n-form-item label="事件模板" path="event">
<n-select :options="options.config_sms_template" v-model:value="formParams.event" />
</n-form-item>
<n-form-item label="手机号" path="mobile">
<n-input
placeholder="请输入接收手机号"
v-model:value="formParams.mobile"
:required="true"
/>
</n-form-item>
<n-form-item label="验证码" path="code">
<n-input
placeholder="请输入要接收的验证码"
v-model:value="formParams.code"
:required="true"
/>
</n-form-item>
</n-form>
<template #action>
<n-space>
<n-button @click="() => (showModal = false)">关闭</n-button>
<n-button type="info" :loading="formBtnLoading" @click="confirmForm">发送</n-button>
</n-space>
</template>
</n-modal>
</div>
</template>
<script lang="ts" setup>
import { ref, onMounted } from 'vue';
import { useMessage } from 'naive-ui';
import { getConfig, sendTestSms, updateConfig } from '@/api/sys/config';
import { Dicts } from '@/api/dict/dict';
import { Options } from '@/utils/hotgo';
const group = ref('pay');
const show = ref(false);
const showModal = ref(false);
const formBtnLoading = ref(false);
const formParams = ref({ mobile: '', event: '', code: '1234' });
const rules = {};
const formTestRef = ref<any>();
const formRef: any = ref(null);
const message = useMessage();
const options = ref<Options>({
config_sms_template: [],
config_sms_drive: [],
});
const formValue = ref({
payDebug: true,
payAliPayAppId: '',
payAliPayPrivateKey: '',
payAliPayAppCertPublicKey: '',
payAliPayRootCert: '',
payAliPayCertPublicKeyRSA2: '',
payWxPayAppId: '',
payWxPayMchId: '',
payWxPaySerialNo: '',
payWxPayAPIv3Key: '',
payWxPayPrivateKey: '',
payQQPayAppId: '',
payQQPayMchId: '',
payQQPayApiKey: '',
});
function sendTest() {
showModal.value = true;
formBtnLoading.value = false;
}
function formSubmit() {
formRef.value.validate((errors) => {
if (!errors) {
updateConfig({ group: group.value, list: formValue.value }).then((_res) => {
message.success('更新成功');
load();
});
} else {
message.error('验证失败,请填写完整信息');
}
});
}
onMounted(() => {
load();
});
async function load() {
show.value = true;
await loadOptions();
new Promise((_resolve, _reject) => {
getConfig({ group: group.value })
.then((res) => {
formValue.value = res.list;
})
.finally(() => {
show.value = false;
});
});
}
async function loadOptions() {
options.value = await Dicts({
types: ['config_sms_template', 'config_sms_drive'],
});
}
function confirmForm(e) {
e.preventDefault();
formBtnLoading.value = true;
formTestRef.value.validate((errors) => {
if (!errors) {
sendTestSms(formParams.value).then((_res) => {
message.success('发送成功');
showModal.value = false;
});
} else {
message.error('请填写完整信息');
}
formBtnLoading.value = false;
});
}
</script>

View File

@@ -0,0 +1,121 @@
<template>
<div>
<n-spin :show="show" description="请稍候...">
<n-form :label-width="100" :model="formValue" :rules="rules" ref="formRef">
<n-divider title-placement="left">公众号</n-divider>
<n-form-item label="AppID" path="officialAccountAppId">
<n-input v-model:value="formValue.officialAccountAppId" placeholder="" />
<template #feedback>请填写微信公众平台后台的AppId</template>
</n-form-item>
<n-form-item label="AppSecret" path="officialAccountAppSecret">
<n-input v-model:value="formValue.officialAccountAppSecret" placeholder="" clearable />
<template #feedback>请填写微信公众平台后台的AppSecret</template>
</n-form-item>
<n-form-item label="Token" path="officialAccountToken">
<n-input v-model:value="formValue.officialAccountToken" placeholder="" clearable />
<template #feedback
>与公众平台接入设置值一致必须为英文或者数字长度为3到32个字符</template
>
</n-form-item>
<n-form-item label="EncodingAESKey" path="officialAccountEncodingAESKey">
<n-input
v-model:value="formValue.officialAccountEncodingAESKey"
placeholder=""
clearable
/>
<template #feedback
>与公众平台接入设置值一致必须为英文或者数字长度为43个字符 </template
>
</n-form-item>
<n-divider title-placement="left">开放平台</n-divider>
<n-form-item label="AppID" path="openPlatformAppId">
<n-input v-model:value="formValue.openPlatformAppId" placeholder="" />
<template #feedback>请填写微信开放平台后台的AppId</template>
</n-form-item>
<n-form-item label="AppSecret" path="openPlatformAppSecret">
<n-input v-model:value="formValue.openPlatformAppSecret" placeholder="" clearable />
<template #feedback>请填写微信开放平台后台的AppSecret</template>
</n-form-item>
<n-form-item label="Token" path="openPlatformToken">
<n-input v-model:value="formValue.openPlatformToken" placeholder="" clearable />
<template #feedback
>与开放平台接入设置值一致必须为英文或者数字长度为3到32个字符</template
>
</n-form-item>
<n-form-item label="EncodingAESKey" path="openPlatformEncodingAESKey">
<n-input v-model:value="formValue.openPlatformEncodingAESKey" placeholder="" clearable />
<template #feedback
>与开放平台接入设置值一致必须为英文或者数字长度为43个字符</template
>
</n-form-item>
<!-- <n-divider title-placement="left">小程序</n-divider>-->
<div>
<n-space>
<n-button type="primary" @click="formSubmit">保存更新</n-button>
</n-space>
</div>
</n-form>
</n-spin>
</div>
</template>
<script lang="ts" setup>
import { ref, onMounted } from 'vue';
import { useMessage } from 'naive-ui';
import { getConfig, updateConfig } from '@/api/sys/config';
const group = ref('wechat');
const show = ref(false);
const rules = {};
const formRef: any = ref(null);
const message = useMessage();
const formValue = ref({
officialAccountAppId: '',
officialAccountAppSecret: '',
officialAccountToken: '',
officialAccountEncodingAESKey: '',
openPlatformAppId: '',
openPlatformAppSecret: '',
openPlatformToken: '',
openPlatformEncodingAESKey: '',
});
function formSubmit() {
formRef.value.validate((errors) => {
if (!errors) {
updateConfig({ group: group.value, list: formValue.value }).then((_res) => {
message.success('更新成功');
load();
});
} else {
message.error('验证失败,请填写完整信息');
}
});
}
onMounted(() => {
load();
});
async function load() {
show.value = true;
new Promise((_resolve, _reject) => {
getConfig({ group: group.value })
.then((res) => {
formValue.value = res.list;
})
.finally(() => {
show.value = false;
});
});
}
</script>

View File

@@ -22,8 +22,11 @@
<RevealSetting v-if="type === 3" />
<EmailSetting v-if="type === 4" />
<SmsSetting v-if="type === 5" />
<CashSetting v-if="type === 7" />
<UploadSetting v-if="type === 8" />
<GeoSetting v-if="type === 9" />
<PaySetting v-if="type === 10" />
<WechatSetting v-if="type === 11" />
</n-card>
</n-grid-item>
</n-grid>
@@ -35,20 +38,23 @@
import RevealSetting from './RevealSetting.vue';
import EmailSetting from './EmailSetting.vue';
import ThemeSetting from './ThemeSetting.vue';
import CashSetting from './CashSetting.vue';
import UploadSetting from './UploadSetting.vue';
import GeoSetting from './GeoSetting.vue';
import SmsSetting from './SmsSetting.vue';
import PaySetting from './PaySetting.vue';
import WechatSetting from './WechatSetting.vue';
const typeTabList = [
{
name: '基本设置',
desc: '系统常规设置',
key: 1,
},
{
name: '主题设置',
desc: '系统主题设置',
key: 2,
},
// {
// name: '主题设置',
// desc: '系统主题设置',
// key: 2,
// },
// {
// name: '显示设置',
// desc: '系统显示设置',
@@ -65,15 +71,15 @@
key: 5,
},
// {
// name: '下游配置',
// name: '管理员配置',
// desc: '默认设置和权限屏蔽',
// key: 6,
// },
// {
// name: '提现配置',
// desc: '提现规则配置',
// key: 7,
// },
{
name: '提现配置',
desc: '管理员提现规则配置',
key: 7,
},
{
name: '云存储',
desc: '配置上传文件驱动',
@@ -84,6 +90,16 @@
desc: '配置地理位置工具',
key: 9,
},
{
name: '支付配置',
desc: '支付宝/微信/QQ支付配置等',
key: 10,
},
{
name: '微信配置',
desc: '公众号/开放平台/小程序配置等',
key: 11,
},
];
export default defineComponent({
components: {
@@ -91,9 +107,12 @@
RevealSetting,
EmailSetting,
ThemeSetting,
CashSetting,
UploadSetting,
GeoSetting,
SmsSetting,
PaySetting,
WechatSetting,
},
setup() {
const state = reactive({