Files
mp-vue/src/views/system/setting/components/mp-weixin.vue
赵忠林 acec6570e1 refactor(setting): 优化系统设置组件的数据处理逻辑
- 将 updateSetting 替换为 updateSettingByKey 方法调用
- 统一设置表单中的 settingKey 字段值
- 重构 watch 数据监听逻辑,增强数据类型检查
- 改进表单初始化和数据回显流程
- 添加对 content 字段的 JSON 解析错误处理
- 标准化各设置组件的表单数据结构
- 优化数组和对象数据的查找匹配逻辑
2026-02-27 18:36:15 +08:00

243 lines
7.3 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<template>
<a-card :bordered="false">
<a-form
ref="formRef"
:model="form"
:rules="rules"
:label-col="styleResponsive ? { md: 3, sm: 5, xs: 24 } : { flex: '90px' }"
:wrapper-col="styleResponsive ? { md: 9, sm: 19, xs: 24 } : { flex: '1' }"
>
<a-form-item label="小程序 AppID" name="appId" extra="登录小程序平台,开发 - 开发管理 - 开发设置记录AppID(小程序ID)">
<a-input
allow-clear
:maxlength="20"
placeholder="请输入小程序AppID"
v-model:value="form.appId"
/>
</a-form-item>
<a-form-item label="小程序 AppSecret" name="appSecret" extra="登录小程序平台,开发 - 开发管理 - 开发设置记录AppSecret(小程序密钥)">
<a-input-password
:maxlength="50"
placeholder="请输入小程序AppSecret"
v-model:value="form.appSecret"
/>
</a-form-item>
<div style="margin-bottom: 22px; width: 750px;">
<a-divider>授权域名设置</a-divider>
</div>
<a-form-item label="request合法域名" name="request">
<a-input-group compact>
<a-input :value="`https://server.websoft.top;https://cms-api.websoft.top;`" placeholder="请输入小程序AppSecret" style="width: calc(100% - 50px)" />
<a-tooltip title="复制">
<a-button @click="onCopyText(`https://server.websoft.top;https://cms-api.websoft.top;`)">
<template #icon><CopyOutlined /></template>
</a-button>
</a-tooltip>
</a-input-group>
</a-form-item>
<a-form-item label="socket合法域名" name="socket">
<a-input-group compact>
<a-input :value="`wss://server.websoft.top`" placeholder="请输入小程序AppSecret" style="width: calc(100% - 50px)" />
<a-tooltip title="复制">
<a-button @click="onCopyText(`wss://server.websoft.top`)">
<template #icon><CopyOutlined /></template>
</a-button>
</a-tooltip>
</a-input-group>
</a-form-item>
<a-form-item label="uploadFile合法域名" name="uploadFile">
<a-input-group compact>
<a-input :value="`https://oss.wsdns.cn;`" style="width: calc(100% - 50px)" />
<a-tooltip title="复制">
<a-button @click="onCopyText(`https://oss.wsdns.cn;`)">
<template #icon><CopyOutlined /></template>
</a-button>
</a-tooltip>
</a-input-group>
</a-form-item>
<a-form-item label="downloadFile合法域名" name="downloadFile">
<a-input-group compact>
<a-input :value="`https://oss.wsdns.cn;`" style="width: calc(100% - 50px)" />
<a-tooltip title="复制">
<a-button @click="onCopyText(`https://oss.wsdns.cn;`)">
<template #icon><CopyOutlined /></template>
</a-button>
</a-tooltip>
</a-input-group>
<a-button
type="primary"
class="ele-btn-icon"
style="margin-top: 10px"
@click="save"
>
<span>保存</span>
</a-button>
</a-form-item>
</a-form>
</a-card>
</template>
<script lang="ts" setup>
import { reactive, ref, watch } from 'vue';
import { copyText } from '@/utils/common';
import { message } from 'ant-design-vue';
import { Setting } from '@/api/system/setting/model';
import { useThemeStore } from '@/store/modules/theme';
import { storeToRefs } from 'pinia';
import { FormInstance } from 'ant-design-vue/es/form';
import useFormData from '@/utils/use-form-data';
import { addSetting, updateSettingByKey } from "@/api/system/setting";
import { ItemType } from "ele-admin-pro/es/ele-image-upload/types";
import { uploadFile } from "@/api/system/file";
import { FILE_SERVER } from "@/config/setting";
import {
CopyOutlined
} from '@ant-design/icons-vue';
const props = defineProps<{
value?: string;
// 修改回显的数据
data?: Setting | null;
}>();
// 保存字段信息(设定好key和描述,content里的字段是随意加的会自动转为json保存到数据库)
const settingId = ref(undefined);
const settingKey = ref('mp-weixin');
// 是否开启响应式布局
const themeStore = useThemeStore();
const { styleResponsive } = storeToRefs(themeStore);
// 编辑器内容,双向绑定
const logo = ref<any>([]);
// 提交状态
const loading = ref(false);
// 是否是修改
const isUpdate = ref(false);
//
const formRef = ref<FormInstance | null>(null);
// 表单数据
const { form, resetFields, assignFields } = useFormData<Setting>({
settingId: undefined,
settingKey: settingKey.value,
appId: '',
appSecret: '',
tenantId: localStorage.getItem('TenantId')
});
// 表单验证规则
const rules = reactive({
appId: [
{
required: true,
message: '请输入appId',
type: 'string',
trigger: 'blur'
}
],
appSecret: [
{
required: true,
message: '请输入appSecret',
type: 'string',
trigger: 'blur'
}
]
});
const onCopyText = (text) => {
copyText(text);
}
const onUpload = (d: ItemType) => {
uploadFile(<File>d.file)
.then((result) => {
form.logo = result.path;
message.success('上传成功');
})
.catch((e) => {
message.error(e.message);
});
};
const onClose = () => {
form.logo = undefined
}
/* 保存编辑 */
const save = () => {
if (!formRef.value) {
return;
}
formRef.value
.validate()
.then(() => {
loading.value = true;
form.settingKey = settingKey.value;
const appForm = {
...form,
content: JSON.stringify(form)
};
const saveOrUpdate = isUpdate.value ? updateSettingByKey : addSetting;
saveOrUpdate(appForm)
.then((msg) => {
message.success('保存成功');
})
.catch((e) => {
message.error(e.message);
});
})
.catch(() => {});
};
watch(
() => props.data,
(data) => {
const activeMatch = props.value === settingKey.value;
if (!data || typeof data !== 'object') {
if (!activeMatch) return;
isUpdate.value = false;
resetFields();
form.settingId = undefined;
form.settingKey = settingKey.value;
return;
}
const normalized: any = Array.isArray(data)
? data.find((d) => d?.settingKey === settingKey.value) ?? data[0]
: (data as any).data && typeof (data as any).data === 'object'
? (data as any).data
: data;
let parsedContent: any | undefined;
const rawContent = (normalized as any).content;
if (rawContent) {
if (typeof rawContent === 'string') {
try {
parsedContent = JSON.parse(rawContent);
} catch {
parsedContent = undefined;
}
} else if (typeof rawContent === 'object') {
parsedContent = rawContent;
}
}
const contentOrRow = parsedContent ?? normalized;
const incomingKey = (contentOrRow as any).settingKey ?? (normalized as any).settingKey;
if (!activeMatch && incomingKey !== settingKey.value) return;
isUpdate.value = true;
assignFields(contentOrRow);
form.settingId = (normalized as any).settingId;
form.settingKey = settingKey.value;
},
{ immediate: true }
);
</script>
<style lang="less">
.small{
color: var(--text-color-secondary);
font-size: 14px;
}
</style>