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

273 lines
7.7 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="短信平台" name="type">
<a-radio-group v-model:value="form.type">
<a-radio :value="1">阿里云</a-radio>
<a-radio :value="2">腾讯云</a-radio>
<a-radio :value="3">七牛元</a-radio>
</a-radio-group>
</a-form-item>
<a-form-item label="AccessKeyId" name="accessKeyId">
<a-input
allow-clear
:maxlength="20"
placeholder="请输入AccessKeyId"
v-model:value="form.accessKeyId"
/>
</a-form-item>
<a-form-item label="AccessKeySecret" name="accessKeySecret">
<a-input
allow-clear
:maxlength="20"
placeholder="请输入AccessKeySecret"
v-model:value="form.accessKeySecret"
/>
</a-form-item>
<a-form-item label="短信签名" name="sign">
<a-input
allow-clear
:maxlength="20"
placeholder="请输入短信签名"
v-model:value="form.sign"
/>
</a-form-item>
<div style="margin-bottom: 22px; width: 750px;">
<a-divider>短信验证码 (通知用户)</a-divider>
</div>
<a-form-item label="是否开启" name="isOpenNotice">
<a-radio-group v-model:value="form.isNoticeUser">
<a-radio value="1">开启</a-radio>
<a-radio value="0">关闭</a-radio>
</a-radio-group>
</a-form-item>
<a-form-item label="模板内容" name="isContent">
验证码${code}您正在进行身份验证打死不要告诉别人哦
</a-form-item>
<a-form-item label="模板ID" name="userTemplateId">
<a-input
allow-clear
:maxlength="20"
placeholder="请输入模板ID"
v-model:value="form.userTemplateId"
/>
</a-form-item>
<div style="margin-bottom: 22px; width: 750px;">
<a-divider>新付款订单 (通知商家)</a-divider>
</div>
<a-form-item label="是否开启" name="isNoticeMerchant">
<a-radio-group v-model:value="form.isNoticeMerchant">
<a-radio value="1">开启</a-radio>
<a-radio value="0">关闭</a-radio>
</a-radio-group>
</a-form-item>
<a-form-item label="模板内容" name="isContent">
验证码${code}您正在进行身份验证打死不要告诉别人哦
</a-form-item>
<a-form-item label="模板ID" name="merchantTemplateId">
<a-input
allow-clear
:maxlength="20"
placeholder="请输入模板ID"
v-model:value="form.merchantTemplateId"
/>
</a-form-item>
<a-form-item label="接收手机号" name="mobile">
<a-input
allow-clear
:maxlength="20"
placeholder="请输入接收手机号"
v-model:value="form.merchantMobiles"
/>
<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 { 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, listSetting, 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";
const props = defineProps<{
// 当前选项卡
value?: string;
// 修改回显的数据
data?: Setting | null;
}>();
const emit = defineEmits<{
(e: 'done', value): void;
}>();
// 保存字段信息(设定好key和描述,content里的字段是随意加的会自动转为json保存到数据库)
const settingId = ref<number>();
const settingKey = ref('sms');
// 是否开启响应式布局
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,
type: 1,
accessKeyId: '',
accessKeySecret: '',
sign: '',
isNoticeUser: '1',
userTemplateId: '',
merchantTemplateId: '',
isNoticeMerchant: '1',
merchantMobiles: '',
tenantId: localStorage.getItem('TenantId')
});
// 表单验证规则
const rules = reactive({
accessKeyId: [
{
required: true,
message: '请输入accessKeyId',
type: 'string',
trigger: 'blur'
}
],
accessKeySecret: [
{
required: true,
message: '请输入accessKeySecret',
type: 'string',
trigger: 'blur'
}
],
sign: [
{
required: true,
message: '请输入短信签名',
type: 'string',
trigger: 'blur'
}
]
});
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;
// Keep key stable; parent `props.value` is the active tab key and may change.
form.settingKey = settingKey.value;
const appForm = {
...form,
content: JSON.stringify(form)
};
// `getByKey` may not include `settingId`; update by key is safer here.
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>