228 lines
6.2 KiB
Vue
228 lines
6.2 KiB
Vue
<!-- 编辑弹窗 -->
|
||
<template>
|
||
<ele-modal
|
||
:width="isUpdate ? 880 : 500"
|
||
:visible="visible"
|
||
:maskClosable="false"
|
||
:title="isUpdate ? '域名DNS解析验证' : '添加域名'"
|
||
:body-style="{ paddingBottom: '28px' }"
|
||
@update:visible="updateVisible"
|
||
:confirmLoading="loading"
|
||
@ok="save"
|
||
>
|
||
<a-form
|
||
ref="formRef"
|
||
:model="form"
|
||
:rules="rules"
|
||
:label-col="styleResponsive ? { md: 5, sm: 7, xs: 24 } : { flex: '90px' }"
|
||
:wrapper-col="
|
||
styleResponsive ? { md: 18, sm: 19, xs: 24 } : { flex: '1' }
|
||
"
|
||
>
|
||
<a-form-item label="https://" name="domain">
|
||
<a-input
|
||
allow-clear
|
||
:maxlength="100"
|
||
placeholder="example.com"
|
||
:disabled="isUpdate"
|
||
v-model:value="form.domain"
|
||
@pressEnter="save"
|
||
/>
|
||
</a-form-item>
|
||
<a-form-item label="添加DNS解析" name="check" v-if="isUpdate">
|
||
<a-space direction="vertical">
|
||
<div class="ele-text-placeholder" style="line-height: 2.2em"
|
||
>请按以下提示,在您的域名控制台添加DNS解析配置</div
|
||
>
|
||
<table
|
||
class="ele-table ele-table-border ele-table-stripe ele-table-medium"
|
||
>
|
||
<colgroup>
|
||
<col width="180" />
|
||
<col width="120" />
|
||
<col />
|
||
</colgroup>
|
||
<thead>
|
||
<tr>
|
||
<th>主机记录</th>
|
||
<th>记录类型</th>
|
||
<th>记录值</th>
|
||
</tr>
|
||
</thead>
|
||
<tbody>
|
||
<tr>
|
||
<td>{{ form.hostName }}</td>
|
||
<td>CNAME</td>
|
||
<td>{{ form.hostValue }}</td>
|
||
</tr>
|
||
</tbody>
|
||
</table>
|
||
</a-space>
|
||
</a-form-item>
|
||
<a-form-item label="排序" name="sortNumber">
|
||
<a-input-number
|
||
:min="0"
|
||
:max="99999"
|
||
placeholder="请输入排序号"
|
||
v-model:value="form.sortNumber"
|
||
/>
|
||
</a-form-item>
|
||
<a-form-item label="操作" v-if="isUpdate && form.status == 0">
|
||
<a-button type="primary" @click="save">验证域名</a-button>
|
||
</a-form-item>
|
||
</a-form>
|
||
</ele-modal>
|
||
</template>
|
||
|
||
<script lang="ts" setup>
|
||
import { ref, reactive, watch } from 'vue';
|
||
import { message } from 'ant-design-vue';
|
||
import { addDomain, resolvable } from '@/api/cms/domain';
|
||
import { Domain } from '@/api/cms/domain/model';
|
||
import { useThemeStore } from '@/store/modules/theme';
|
||
import { storeToRefs } from 'pinia';
|
||
import { FormInstance, type Rule } from 'ant-design-vue/es/form';
|
||
import useFormData from '@/utils/use-form-data';
|
||
import { isUrl } from 'ele-admin-pro';
|
||
|
||
// 是否是修改
|
||
const isUpdate = ref(false);
|
||
// 是否开启响应式布局
|
||
const themeStore = useThemeStore();
|
||
const { styleResponsive } = storeToRefs(themeStore);
|
||
|
||
const props = defineProps<{
|
||
// 弹窗是否打开
|
||
visible: boolean;
|
||
// 修改回显的数据
|
||
data?: Domain | null;
|
||
}>();
|
||
|
||
const emit = defineEmits<{
|
||
(e: 'done'): void;
|
||
(e: 'update:visible', visible: boolean): void;
|
||
}>();
|
||
|
||
// 提交状态
|
||
const loading = ref(false);
|
||
const disabled = ref(false);
|
||
// 表格选中数据
|
||
const formRef = ref<FormInstance | null>(null);
|
||
|
||
// 表单数据
|
||
const { form, resetFields, assignFields } = useFormData<Domain>({
|
||
id: undefined,
|
||
domain: '',
|
||
hostName: '',
|
||
hostValue: '',
|
||
status: 0,
|
||
comments: '',
|
||
sortNumber: 100
|
||
});
|
||
|
||
/* 更新visible */
|
||
const updateVisible = (value: boolean) => {
|
||
emit('update:visible', value);
|
||
};
|
||
|
||
// 表单验证规则
|
||
const rules = reactive({
|
||
domain: [
|
||
{
|
||
required: true,
|
||
type: 'string',
|
||
message: '请输入合法域名',
|
||
trigger: 'blur',
|
||
validator: (_rule: Rule, value: string) => {
|
||
return new Promise<void>((resolve, reject) => {
|
||
if (!isUrl(`https://${value}`)) {
|
||
if (value.includes('http')) {
|
||
return reject('不含http开头');
|
||
}
|
||
return reject('请输入合法域名');
|
||
}
|
||
disabled.value = true;
|
||
return resolve();
|
||
});
|
||
}
|
||
}
|
||
]
|
||
});
|
||
|
||
/* 保存编辑 */
|
||
const save = () => {
|
||
if (!formRef.value) {
|
||
return;
|
||
}
|
||
formRef.value
|
||
.validate()
|
||
.then(() => {
|
||
loading.value = true;
|
||
if (form.domain) {
|
||
form.domain = form.domain.trim();
|
||
form.domain = form.domain.replace('https://', '');
|
||
form.domain = form.domain.replace('http://', '');
|
||
const split = form.domain.split('.');
|
||
if (split.length == 2) {
|
||
form.hostName = '@';
|
||
}
|
||
if (split.length > 2) {
|
||
const suffix = split[split.length - 1];
|
||
const name = split[split.length - 2];
|
||
form.hostName = form.domain.replace(`.${name}.${suffix}`, '');
|
||
}
|
||
}
|
||
const formData = {
|
||
...form
|
||
};
|
||
if (isUpdate.value) {
|
||
setTimeout(() => {
|
||
resolvable(Number(form.id))
|
||
.then((data) => {
|
||
loading.value = false;
|
||
message.success(data.message);
|
||
updateVisible(false);
|
||
emit('done');
|
||
})
|
||
.catch((res) => {
|
||
loading.value = false;
|
||
message.error(res.message);
|
||
});
|
||
}, 1000);
|
||
}
|
||
if (!isUpdate.value) {
|
||
addDomain(formData)
|
||
.then((msg) => {
|
||
loading.value = false;
|
||
message.success(msg);
|
||
updateVisible(false);
|
||
emit('done');
|
||
})
|
||
.catch((e) => {
|
||
loading.value = false;
|
||
message.error(e.message);
|
||
});
|
||
}
|
||
})
|
||
.catch(() => {});
|
||
};
|
||
|
||
watch(
|
||
() => props.visible,
|
||
(visible) => {
|
||
if (visible) {
|
||
if (props.data) {
|
||
assignFields(props.data);
|
||
isUpdate.value = true;
|
||
} else {
|
||
isUpdate.value = false;
|
||
}
|
||
} else {
|
||
resetFields();
|
||
formRef.value?.clearValidate();
|
||
}
|
||
},
|
||
{ immediate: true }
|
||
);
|
||
</script>
|