|
|
@@ -0,0 +1,479 @@
|
|
|
+<template>
|
|
|
+ <div class="receiving-account-page">
|
|
|
+ <h2 class="page-title">收款账号</h2>
|
|
|
+ <p class="page-tip">
|
|
|
+ 请选择收款方式并填写相关信息;配置微信/支付宝商户参数或绑定借记卡银行账户,带 * 为必填项。修改后请保存。
|
|
|
+ </p>
|
|
|
+
|
|
|
+ <el-card shadow="never" class="form-card">
|
|
|
+ <el-form ref="formRef" :model="form" :rules="formRules" label-width="140px" label-position="top">
|
|
|
+ <el-form-item label="账号类型" prop="accountType">
|
|
|
+ <el-radio-group v-model="form.accountType">
|
|
|
+ <el-radio value="wechat"> 微信 </el-radio>
|
|
|
+ <el-radio value="alipay"> 支付宝 </el-radio>
|
|
|
+ <el-radio value="bank"> 银行账号 </el-radio>
|
|
|
+ </el-radio-group>
|
|
|
+ </el-form-item>
|
|
|
+
|
|
|
+ <template v-if="form.accountType === 'wechat'">
|
|
|
+ <el-form-item label="appid" prop="wechatAppid">
|
|
|
+ <el-input v-model="form.wechatAppid" placeholder="请输入" clearable />
|
|
|
+ </el-form-item>
|
|
|
+ <el-form-item label="mchld" prop="wechatMchld">
|
|
|
+ <el-input v-model="form.wechatMchld" placeholder="请输入" clearable />
|
|
|
+ </el-form-item>
|
|
|
+ <el-form-item label="API证书序列号" prop="wechatApiCertSerialNo">
|
|
|
+ <el-input v-model="form.wechatApiCertSerialNo" placeholder="请输入" clearable />
|
|
|
+ </el-form-item>
|
|
|
+ <el-form-item label="APIv3 Key" prop="wechatApiV3Key">
|
|
|
+ <el-input v-model="form.wechatApiV3Key" placeholder="请输入" clearable />
|
|
|
+ </el-form-item>
|
|
|
+ <el-form-item label="支付公钥ID" prop="wechatPayPublicKeyId">
|
|
|
+ <el-input v-model="form.wechatPayPublicKeyId" placeholder="请输入" clearable />
|
|
|
+ </el-form-item>
|
|
|
+ <el-form-item label="私钥证书" prop="wechatPrivateKeyFile">
|
|
|
+ <el-upload
|
|
|
+ v-model:file-list="form.wechatPrivateKeyFile"
|
|
|
+ class="cert-upload"
|
|
|
+ drag
|
|
|
+ :auto-upload="false"
|
|
|
+ :limit="1"
|
|
|
+ accept=".pem"
|
|
|
+ :on-exceed="() => ElMessage.warning('最多上传1个文件')"
|
|
|
+ >
|
|
|
+ <div class="upload-inner">
|
|
|
+ <el-icon :size="32" color="#6c8ff8">
|
|
|
+ <UploadFilled />
|
|
|
+ </el-icon>
|
|
|
+ <p>点击或拖拽 .pem 至此处</p>
|
|
|
+ <span>不超过 2MB</span>
|
|
|
+ </div>
|
|
|
+ </el-upload>
|
|
|
+ </el-form-item>
|
|
|
+ <el-form-item label="公钥证书" prop="wechatPayPublicKeyFile">
|
|
|
+ <el-upload
|
|
|
+ v-model:file-list="form.wechatPayPublicKeyFile"
|
|
|
+ class="cert-upload"
|
|
|
+ drag
|
|
|
+ :auto-upload="false"
|
|
|
+ :limit="1"
|
|
|
+ accept=".pem"
|
|
|
+ :on-exceed="() => ElMessage.warning('最多上传1个文件')"
|
|
|
+ >
|
|
|
+ <div class="upload-inner">
|
|
|
+ <el-icon :size="32" color="#6c8ff8">
|
|
|
+ <UploadFilled />
|
|
|
+ </el-icon>
|
|
|
+ <p>点击或拖拽 .pem 至此处</p>
|
|
|
+ <span>不超过 2MB</span>
|
|
|
+ </div>
|
|
|
+ </el-upload>
|
|
|
+ </el-form-item>
|
|
|
+ </template>
|
|
|
+
|
|
|
+ <template v-else-if="form.accountType === 'alipay'">
|
|
|
+ <el-form-item label="应用ID" prop="aliAppid">
|
|
|
+ <el-input v-model="form.aliAppid" placeholder="请输入" clearable />
|
|
|
+ </el-form-item>
|
|
|
+ <el-form-item label="应用私钥" prop="aliPrivateId">
|
|
|
+ <el-input v-model="form.aliPrivateId" type="textarea" :rows="4" placeholder="请输入应用私钥" />
|
|
|
+ </el-form-item>
|
|
|
+ <el-form-item label="应用公钥证书" prop="appPublicCertFile">
|
|
|
+ <el-upload
|
|
|
+ v-model:file-list="form.appPublicCertFile"
|
|
|
+ class="cert-upload"
|
|
|
+ drag
|
|
|
+ :auto-upload="false"
|
|
|
+ :limit="1"
|
|
|
+ accept=".crt,.pem"
|
|
|
+ :on-exceed="() => ElMessage.warning('最多上传1个文件')"
|
|
|
+ >
|
|
|
+ <div class="upload-inner">
|
|
|
+ <el-icon :size="32" color="#6c8ff8">
|
|
|
+ <UploadFilled />
|
|
|
+ </el-icon>
|
|
|
+ <p>应用公钥证书</p>
|
|
|
+ </div>
|
|
|
+ </el-upload>
|
|
|
+ </el-form-item>
|
|
|
+ <el-form-item label="支付宝公钥证书" prop="alipayPublicCertFile">
|
|
|
+ <el-upload
|
|
|
+ v-model:file-list="form.alipayPublicCertFile"
|
|
|
+ class="cert-upload"
|
|
|
+ drag
|
|
|
+ :auto-upload="false"
|
|
|
+ :limit="1"
|
|
|
+ accept=".crt,.pem"
|
|
|
+ :on-exceed="() => ElMessage.warning('最多上传1个文件')"
|
|
|
+ >
|
|
|
+ <div class="upload-inner">
|
|
|
+ <el-icon :size="32" color="#6c8ff8">
|
|
|
+ <UploadFilled />
|
|
|
+ </el-icon>
|
|
|
+ <p>支付宝公钥证书</p>
|
|
|
+ </div>
|
|
|
+ </el-upload>
|
|
|
+ </el-form-item>
|
|
|
+ <el-form-item label="支付宝根证书" prop="alipayRootCertFile">
|
|
|
+ <el-upload
|
|
|
+ v-model:file-list="form.alipayRootCertFile"
|
|
|
+ class="cert-upload"
|
|
|
+ drag
|
|
|
+ :auto-upload="false"
|
|
|
+ :limit="1"
|
|
|
+ accept=".crt,.pem"
|
|
|
+ :on-exceed="() => ElMessage.warning('最多上传1个文件')"
|
|
|
+ >
|
|
|
+ <div class="upload-inner">
|
|
|
+ <el-icon :size="32" color="#6c8ff8">
|
|
|
+ <UploadFilled />
|
|
|
+ </el-icon>
|
|
|
+ <p>支付宝根证书</p>
|
|
|
+ </div>
|
|
|
+ </el-upload>
|
|
|
+ </el-form-item>
|
|
|
+ </template>
|
|
|
+
|
|
|
+ <template v-else-if="form.accountType === 'bank'">
|
|
|
+ <el-form-item label="银行名称" prop="bankName">
|
|
|
+ <el-select v-model="form.bankName" filterable clearable placeholder="请选择" style="width: 100%">
|
|
|
+ <el-option v-for="b in bankSelectOptions" :key="b.value" :label="b.label" :value="b.value" />
|
|
|
+ </el-select>
|
|
|
+ <div class="form-item-tip">请选择开户银行的全称</div>
|
|
|
+ </el-form-item>
|
|
|
+ <el-form-item label="银行账号" prop="bankAccountNo">
|
|
|
+ <el-input v-model="form.bankAccountNo" placeholder="请输入" clearable maxlength="23" />
|
|
|
+ <div class="form-item-tip">请输入完整的银行卡号,仅支持借记卡,不支持信用卡</div>
|
|
|
+ </el-form-item>
|
|
|
+ </template>
|
|
|
+
|
|
|
+ <el-form-item>
|
|
|
+ <el-button type="primary" :loading="saving" @click="submit"> 保存 </el-button>
|
|
|
+ <el-button @click="fetchPayAccountConfig"> 取消 </el-button>
|
|
|
+ </el-form-item>
|
|
|
+ </el-form>
|
|
|
+ </el-card>
|
|
|
+ </div>
|
|
|
+</template>
|
|
|
+
|
|
|
+<script setup lang="ts">
|
|
|
+import { ref, reactive, onMounted, computed, watch } from "vue";
|
|
|
+import { ElMessage } from "element-plus";
|
|
|
+import type { FormInstance, FormRules, UploadUserFile } from "element-plus";
|
|
|
+import { UploadFilled } from "@element-plus/icons-vue";
|
|
|
+import {
|
|
|
+ getDict,
|
|
|
+ getPaymentStoreUserId,
|
|
|
+ saveWechatWithFiles,
|
|
|
+ saveAlipayWithFiles,
|
|
|
+ saveBankAccountConfig
|
|
|
+} from "@/api/modules/newLoginApi";
|
|
|
+import { localGet } from "@/utils/index";
|
|
|
+
|
|
|
+/** 银行名称下拉:仅展示 getDict 返回的数据 */
|
|
|
+const bankSelectOptions = ref<{ label: string; value: string }[]>([]);
|
|
|
+
|
|
|
+const normalizeDictToOptions = (raw: unknown): { label: string; value: string }[] => {
|
|
|
+ const list = Array.isArray(raw) ? raw : ((raw as any)?.records ?? (raw as any)?.list ?? []);
|
|
|
+ if (!Array.isArray(list)) return [];
|
|
|
+ return list
|
|
|
+ .map((item: any) => {
|
|
|
+ const label = item?.dictDetail ?? item?.dictLabel ?? item?.label ?? item?.name ?? item?.text ?? item?.bankName ?? "";
|
|
|
+ const value = item?.dictValue ?? item?.value ?? item?.code ?? item?.dictDetail ?? item?.dictLabel ?? label;
|
|
|
+ return { label: String(label).trim(), value: String(value).trim() };
|
|
|
+ })
|
|
|
+ .filter((x: { label: string; value: string }) => x.label && x.value);
|
|
|
+};
|
|
|
+
|
|
|
+const loadBankNameDict = async () => {
|
|
|
+ try {
|
|
|
+ const res: any = await getDict({ dictType: "bankName" });
|
|
|
+ if (res?.code !== 200 && res?.code !== "200") {
|
|
|
+ bankSelectOptions.value = [];
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ bankSelectOptions.value = normalizeDictToOptions(res.data);
|
|
|
+ } catch {
|
|
|
+ bankSelectOptions.value = [];
|
|
|
+ }
|
|
|
+};
|
|
|
+
|
|
|
+const formRef = ref<FormInstance>();
|
|
|
+const saving = ref(false);
|
|
|
+
|
|
|
+const form = reactive({
|
|
|
+ accountType: "wechat",
|
|
|
+ wechatAppid: "",
|
|
|
+ wechatMchld: "",
|
|
|
+ wechatApiCertSerialNo: "",
|
|
|
+ wechatApiV3Key: "",
|
|
|
+ wechatPayPublicKeyId: "" as string | null,
|
|
|
+ wechatPrivateKeyFile: [] as UploadUserFile[],
|
|
|
+ wechatPayPublicKeyFile: [] as UploadUserFile[],
|
|
|
+ aliAppid: "",
|
|
|
+ aliPrivateId: "",
|
|
|
+ alipayRootCertFile: [] as UploadUserFile[],
|
|
|
+ alipayPublicCertFile: [] as UploadUserFile[],
|
|
|
+ appPublicCertFile: [] as UploadUserFile[],
|
|
|
+ bankName: "",
|
|
|
+ bankAccountNo: ""
|
|
|
+});
|
|
|
+
|
|
|
+const wechatRules: FormRules = {
|
|
|
+ accountType: [{ required: true, message: "请选择账号类型", trigger: "change" }],
|
|
|
+ wechatAppid: [{ required: true, message: "请输入appid", trigger: "blur" }],
|
|
|
+ wechatMchld: [{ required: true, message: "请输入mchId", trigger: "blur" }],
|
|
|
+ wechatApiCertSerialNo: [{ required: true, message: "请输入API证书序列号", trigger: "blur" }],
|
|
|
+ wechatApiV3Key: [{ required: true, message: "请输入APIv3 Key", trigger: "blur" }],
|
|
|
+ wechatPayPublicKeyId: [{ required: true, message: "请输入支付公钥ID", trigger: "blur" }],
|
|
|
+ wechatPrivateKeyFile: [{ required: true, type: "array", min: 1, message: "请上传私钥证书", trigger: "change" }],
|
|
|
+ wechatPayPublicKeyFile: [{ required: true, type: "array", min: 1, message: "请上传公钥证书", trigger: "change" }]
|
|
|
+};
|
|
|
+
|
|
|
+const alipayRules: FormRules = {
|
|
|
+ accountType: [{ required: true, message: "请选择账号类型", trigger: "change" }],
|
|
|
+ aliAppid: [{ required: true, message: "请输入应用ID", trigger: "blur" }],
|
|
|
+ aliPrivateId: [{ required: true, message: "请输入应用私钥", trigger: "blur" }]
|
|
|
+};
|
|
|
+
|
|
|
+const bankRules: FormRules = {
|
|
|
+ accountType: [{ required: true, message: "请选择账号类型", trigger: "change" }],
|
|
|
+ bankName: [{ required: true, message: "请选择银行名称", trigger: "change" }],
|
|
|
+ bankAccountNo: [
|
|
|
+ { required: true, message: "请输入银行账号", trigger: "blur" },
|
|
|
+ {
|
|
|
+ validator: (_rule, value, callback) => {
|
|
|
+ const s = String(value || "").replace(/\s/g, "");
|
|
|
+ if (!/^\d{16,19}$/.test(s)) {
|
|
|
+ callback(new Error("请输入16~19位数字借记卡卡号"));
|
|
|
+ } else {
|
|
|
+ callback();
|
|
|
+ }
|
|
|
+ },
|
|
|
+ trigger: "blur"
|
|
|
+ }
|
|
|
+ ]
|
|
|
+};
|
|
|
+
|
|
|
+const formRules = computed<FormRules>(() => {
|
|
|
+ if (form.accountType === "alipay") return alipayRules;
|
|
|
+ if (form.accountType === "bank") return bankRules;
|
|
|
+ return wechatRules;
|
|
|
+});
|
|
|
+
|
|
|
+watch(
|
|
|
+ () => form.accountType,
|
|
|
+ () => {
|
|
|
+ formRef.value?.clearValidate();
|
|
|
+ }
|
|
|
+);
|
|
|
+
|
|
|
+const base64ToFile = (base64Str: string, fileName: string): File => {
|
|
|
+ const bstr = atob(base64Str);
|
|
|
+ const u8arr = new Uint8Array(bstr.length);
|
|
|
+ for (let i = 0; i < bstr.length; i++) u8arr[i] = bstr.charCodeAt(i);
|
|
|
+ return new File([u8arr], fileName, { type: "application/x-pem-file" });
|
|
|
+};
|
|
|
+
|
|
|
+const fetchPayAccountConfig = async () => {
|
|
|
+ const storeUserId = localGet("geeker-user")?.userInfo?.id;
|
|
|
+ if (!storeUserId) {
|
|
|
+ ElMessage.warning("请先登录");
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ const res: any = await getPaymentStoreUserId({ storeUserId });
|
|
|
+ if (res?.code !== 200 || !res.data) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ const data = res.data;
|
|
|
+
|
|
|
+ form.wechatAppid = "";
|
|
|
+ form.wechatMchld = "";
|
|
|
+ form.wechatApiCertSerialNo = "";
|
|
|
+ form.wechatApiV3Key = "";
|
|
|
+ form.wechatPayPublicKeyId = null;
|
|
|
+ form.wechatPrivateKeyFile = [];
|
|
|
+ form.wechatPayPublicKeyFile = [];
|
|
|
+ form.aliAppid = "";
|
|
|
+ form.aliPrivateId = "";
|
|
|
+ form.appPublicCertFile = [];
|
|
|
+ form.alipayPublicCertFile = [];
|
|
|
+ form.alipayRootCertFile = [];
|
|
|
+ form.bankName = "";
|
|
|
+ form.bankAccountNo = "";
|
|
|
+
|
|
|
+ if (data.wechatAppId) {
|
|
|
+ form.accountType = "wechat";
|
|
|
+ form.wechatAppid = data.wechatAppId ?? "";
|
|
|
+ form.wechatMchld = data.wechatMchId ?? "";
|
|
|
+ form.wechatApiCertSerialNo = data.merchantSerialNumber ?? "";
|
|
|
+ form.wechatApiV3Key = data.apiV3Key ?? "";
|
|
|
+ form.wechatPayPublicKeyId = data.wechatPayPublicKeyId ?? null;
|
|
|
+ if (data.wechatPrivateKeyFile && data.wechatPrivateKeyName) {
|
|
|
+ const file = base64ToFile(data.wechatPrivateKeyFile, data.wechatPrivateKeyName);
|
|
|
+ form.wechatPrivateKeyFile = [{ name: file.name, raw: file, status: "success", uid: Date.now() } as UploadUserFile];
|
|
|
+ }
|
|
|
+ if (data.wechatPayPublicKeyFile && data.wechatPayPublicKeyFileName) {
|
|
|
+ const f = base64ToFile(data.wechatPayPublicKeyFile, data.wechatPayPublicKeyFileName);
|
|
|
+ form.wechatPayPublicKeyFile = [{ name: f.name, raw: f, status: "success", uid: Date.now() + 1 } as UploadUserFile];
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if (data.appId) {
|
|
|
+ form.aliAppid = data.appId ?? "";
|
|
|
+ form.aliPrivateId = data.appSecretCert ?? "";
|
|
|
+ if (data.appPublicCert && data.appPublicCertName) {
|
|
|
+ const file = base64ToFile(data.appPublicCert, data.appPublicCertName);
|
|
|
+ form.appPublicCertFile = [{ name: file.name, raw: file, status: "success", uid: Date.now() } as UploadUserFile];
|
|
|
+ }
|
|
|
+ if (data.alipayPublicCert && data.alipayPublicCertName) {
|
|
|
+ const file = base64ToFile(data.alipayPublicCert, data.alipayPublicCertName);
|
|
|
+ form.alipayPublicCertFile = [{ name: file.name, raw: file, status: "success", uid: Date.now() + 1 } as UploadUserFile];
|
|
|
+ }
|
|
|
+ if (data.alipayRootCert && data.alipayRootCertName) {
|
|
|
+ const file = base64ToFile(data.alipayRootCert, data.alipayRootCertName);
|
|
|
+ form.alipayRootCertFile = [{ name: file.name, raw: file, status: "success", uid: Date.now() + 2 } as UploadUserFile];
|
|
|
+ }
|
|
|
+ if (!data.wechatAppId) form.accountType = "alipay";
|
|
|
+ }
|
|
|
+
|
|
|
+ const bankNo = data.bankAccountNo ?? data.bankCardNo ?? data.settlementAccount;
|
|
|
+ const bankNm = data.bankName ?? data.openingBankName ?? data.openingBank;
|
|
|
+ if (!data.wechatAppId && !data.appId && bankNo) {
|
|
|
+ form.accountType = "bank";
|
|
|
+ form.bankAccountNo = String(bankNo).replace(/\s/g, "");
|
|
|
+ form.bankName = bankNm ? String(bankNm) : "";
|
|
|
+ }
|
|
|
+};
|
|
|
+
|
|
|
+const submit = async () => {
|
|
|
+ if (!formRef.value) return;
|
|
|
+ await formRef.value.validate(async valid => {
|
|
|
+ if (!valid) return;
|
|
|
+
|
|
|
+ const storeUserId = localGet("geeker-user")?.userInfo?.id;
|
|
|
+ if (!storeUserId) {
|
|
|
+ ElMessage.warning("请先登录");
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ saving.value = true;
|
|
|
+ try {
|
|
|
+ if (form.accountType === "bank") {
|
|
|
+ const res: any = await saveBankAccountConfig({
|
|
|
+ storeUserId,
|
|
|
+ bankName: form.bankName.trim(),
|
|
|
+ bankCardNo: form.bankAccountNo.replace(/\s/g, "")
|
|
|
+ });
|
|
|
+ if (res?.code === 200 || res?.code === "200") ElMessage.success(res?.msg || "保存成功");
|
|
|
+ else ElMessage.error(res?.msg || "保存失败");
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (form.accountType === "alipay") {
|
|
|
+ const appPublicCertFile = (form.appPublicCertFile as UploadUserFile[])[0]?.raw as File | undefined;
|
|
|
+ const alipayPublicCertFile = (form.alipayPublicCertFile as UploadUserFile[])[0]?.raw as File | undefined;
|
|
|
+ const alipayRootCertFile = (form.alipayRootCertFile as UploadUserFile[])[0]?.raw as File | undefined;
|
|
|
+
|
|
|
+ if (!appPublicCertFile || !alipayPublicCertFile || !alipayRootCertFile) {
|
|
|
+ ElMessage.warning("请上传应用公钥证书、支付宝公钥证书和支付宝根证书");
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ const res: any = await saveAlipayWithFiles(
|
|
|
+ {
|
|
|
+ storeUserId: String(storeUserId),
|
|
|
+ appId: form.aliAppid.trim(),
|
|
|
+ appSecretCert: form.aliPrivateId.trim()
|
|
|
+ },
|
|
|
+ appPublicCertFile,
|
|
|
+ alipayPublicCertFile,
|
|
|
+ alipayRootCertFile
|
|
|
+ );
|
|
|
+ if (res?.code === 200) ElMessage.success("保存成功");
|
|
|
+ else ElMessage.error(res?.msg || "保存失败");
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ const privateKeyUpload = (form.wechatPrivateKeyFile as UploadUserFile[])[0];
|
|
|
+ const publicKeyUpload = (form.wechatPayPublicKeyFile as UploadUserFile[])[0];
|
|
|
+ const privateKeyFile = privateKeyUpload?.raw as File | undefined;
|
|
|
+ const publicKeyFile = publicKeyUpload?.raw as File | undefined;
|
|
|
+
|
|
|
+ if (!privateKeyFile || !publicKeyFile) {
|
|
|
+ ElMessage.warning("请上传私钥证书和公钥证书");
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ const res: any = await saveWechatWithFiles(
|
|
|
+ {
|
|
|
+ storeUserId: String(storeUserId),
|
|
|
+ apiV3Key: form.wechatApiV3Key || "",
|
|
|
+ merchantSerialNumber: form.wechatApiCertSerialNo || "",
|
|
|
+ wechatAppId: form.wechatAppid || "",
|
|
|
+ wechatMchId: form.wechatMchld || "",
|
|
|
+ wechatMiniAppId: "",
|
|
|
+ wechatPayPublicKeyId: form.wechatPayPublicKeyId || "",
|
|
|
+ accountType: "wechat"
|
|
|
+ },
|
|
|
+ privateKeyFile,
|
|
|
+ publicKeyFile
|
|
|
+ );
|
|
|
+ if (res?.code === 200) ElMessage.success("保存成功");
|
|
|
+ else ElMessage.error(res?.msg || "保存失败");
|
|
|
+ } catch (e: any) {
|
|
|
+ ElMessage.error(e?.message || "保存失败");
|
|
|
+ } finally {
|
|
|
+ saving.value = false;
|
|
|
+ }
|
|
|
+ });
|
|
|
+};
|
|
|
+
|
|
|
+onMounted(async () => {
|
|
|
+ await loadBankNameDict();
|
|
|
+ await fetchPayAccountConfig();
|
|
|
+});
|
|
|
+</script>
|
|
|
+
|
|
|
+<style scoped lang="scss">
|
|
|
+.receiving-account-page {
|
|
|
+ min-height: 100%;
|
|
|
+ padding: 20px;
|
|
|
+ background: #ffffff;
|
|
|
+ .page-title {
|
|
|
+ margin: 0 0 8px;
|
|
|
+ font-size: 18px;
|
|
|
+ font-weight: 600;
|
|
|
+ color: #303133;
|
|
|
+ }
|
|
|
+ .page-tip {
|
|
|
+ margin: 0 0 20px;
|
|
|
+ font-size: 14px;
|
|
|
+ line-height: 1.5;
|
|
|
+ color: #909399;
|
|
|
+ }
|
|
|
+ .form-card {
|
|
|
+ max-width: 720px;
|
|
|
+ }
|
|
|
+}
|
|
|
+.form-item-tip {
|
|
|
+ margin-top: 6px;
|
|
|
+ font-size: 12px;
|
|
|
+ line-height: 1.5;
|
|
|
+ color: #909399;
|
|
|
+}
|
|
|
+.cert-upload :deep(.el-upload-dragger) {
|
|
|
+ padding: 20px;
|
|
|
+}
|
|
|
+.upload-inner {
|
|
|
+ color: var(--el-text-color-secondary);
|
|
|
+ text-align: center;
|
|
|
+ p {
|
|
|
+ margin: 8px 0 4px;
|
|
|
+ font-size: 14px;
|
|
|
+ }
|
|
|
+ span {
|
|
|
+ font-size: 12px;
|
|
|
+ }
|
|
|
+}
|
|
|
+</style>
|