allinssl/frontend/apps/domain-management-backend/src/views/domain-details/components/DnsAnalysis/useController.tsx

329 lines
7.6 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

/**
* @fileoverview DNS分析模块 - 控制器层
* @description 连接视图层和模型层处理业务逻辑和UI状态
*/
import { ref, reactive, computed, watch, onMounted } from "vue";
import { useDnsAnalysisStore } from "./useStore";
import type { DnsRecordItem } from "@/types/domain";
import type {
// GetDnsRecordListRequest,
UpdateDnsRecordRequest,
DeleteDnsRecordRequest,
CreateDnsRecordRequest,
ToggleDnsRecordRequest,
} from "@/types/dns";
// import type { SelectOption } from "naive-ui";
import { DnsRecordForm } from "../../types";
import { useModal, useMessage, useForm, useFormHooks } from '@baota/naive-ui/hooks'
import DnsAnalysisForm from './form'
import { NButton, NSpace } from 'naive-ui'
import { useApp } from '@/components/layout/useStore'
/**
* DNS分析控制器参数接口
*/
interface DnsAnalysisControllerProps {
/** 域名ID */
domainId: number;
}
// 获取移动端状态
const { isMobile } = useApp()
/**
* DNS分析控制器
* @param props 控制器参数
* @returns 暴露的状态和方法
*/
export function useDnsAnalysisController(props: DnsAnalysisControllerProps) {
// 获取Store
const {
isLoading,
dnsRecords,
hasRecords,
pagination,
recordCount,
viewsOptions,
recordListParams,
searchKeyOptions,
recordTypesOptions,
fetchRecords,
fetchViews,
fetchRecordTypes,
createRecord,
updateRecord,
deleteRecord,
pauseRecord,
startRecord,
setCurrentDomainId,
} = useDnsAnalysisStore();
// 本地UI状态
const editingRecord = ref<DnsRecordItem | null>();
const isEditing = ref<string>("");
const isAdding = ref<boolean>(false);
// 新记录表单
const newRecord = reactive<DnsRecordForm>({
record_id: "",
record: "",
type: "A",
value: "",
mx: 1,
ttl: 600,
remark: "",
viewId: 0,
});
/**
* 取消添加
*/
const cancelAdding = (): void => {
isAdding.value = false;
};
/**
* 创建DNS记录
*/
const handleCreateRecord = async (): Promise<boolean> => {
const params: CreateDnsRecordRequest = {
domain_id: props.domainId,
record: newRecord.record,
type: newRecord.type,
value: newRecord.value,
ttl: newRecord.ttl,
mx: newRecord.mx,
remark: newRecord.remark,
viewId: newRecord.viewId,
};
try {
await createRecord(params);
isAdding.value = false;
return true;
} catch (error) {
return false;
}
};
/**
* 更新DNS记录
*/
const handleUpdateRecord = async (): Promise<boolean> => {
const params: UpdateDnsRecordRequest = {
domain_id: props.domainId,
record_id: newRecord.record_id || 0,
record: newRecord.record,
type: newRecord.type,
value: newRecord.value,
ttl: newRecord.ttl,
mx: newRecord.mx,
remark: newRecord.remark,
viewId: newRecord.viewId,
};
try {
await updateRecord(params);
isEditing.value = "";
return true;
} catch (error) {
return false;
}
};
/**
* 删除DNS记录
* @param recordId 记录ID
*/
const handlDeleteRecord = async (recordId: number | string) => {
const params: DeleteDnsRecordRequest = {
record_id: recordId,
domain_id: props.domainId,
};
await deleteRecord(params);
};
/**
* 暂停DNS解析记录
* @param recordId 记录ID
*/
const handlPauseRecord = async (recordId: number | string) => {
const params: ToggleDnsRecordRequest = {
record_id: recordId,
domain_id: props.domainId,
};
await pauseRecord(params);
};
/**
* 启用DNS解析记录
* @param recordId 记录ID
*/
const handlStartRecord = async (recordId: number | string) => {
const params: ToggleDnsRecordRequest = {
record_id: recordId,
domain_id: props.domainId,
};
await startRecord(params);
};
/**
* 切换记录状态(启用/暂停)
* @param record 记录对象
*/
const toggleRecordStatus = async (record: DnsRecordItem) => {
// 根据当前状态决定是启用还是暂停
// state: 0-启用, 1-暂停
if (record.state === 0) {
await handlPauseRecord(record.record_id);
} else {
await handlStartRecord(record.record_id);
}
};
/**
* 打开dns解析弹窗移动端支持添加/编辑
*/
function openDnsAnalysisDialog(mode: 'add' | 'edit' = 'add', record?: DnsRecordItem) {
if (!isMobile.value) return
// 组装初始数据
const initialData: Partial<DnsRecordForm & { domain_id: number }> = mode === 'edit' && record
? {
record_id: String(record.record_id || 0),
record: record.record,
type: record.type as any,
value: record.value,
ttl: Number((record as any).TTL ?? 600),
mx: Number((record as any).MX ?? 0),
remark: record.remark,
viewId: Number((record as any).viewID ?? 0),
}
: {
record_id: '',
record: '',
type: 'A',
value: '',
ttl: 600,
mx: 1,
remark: '',
viewId: 0,
}
initialData['domain_id'] = props.domainId
useModal({
title: mode === 'add' ? '新增DNS记录' : '编辑DNS记录',
area: ['100%','100%'],
component: DnsAnalysisForm,
componentProps: {
mode,
initialData,
recordTypesOptions: recordTypesOptions.value,
viewsOptions: viewsOptions.value,
refresh: fetchRecords,
},
footer: false,
})
};
// -------------------- 搜索表单useForm --------------------
const { useFormInput, useFormSelect } = useFormHooks()
const formConfig = () => [
useFormSelect(
'',
'searchKey',
searchKeyOptions.value,
{
placeholder: '请选择查询字段',
class: 'w-30',
disabled: isAdding.value || isEditing.value !== '',
},
{ showLabel: false, showFeedback: false },
),
useFormInput(
'',
'searchValue',
{
placeholder: '请输入查询的字段内容',
clearable: true,
disabled: isAdding.value || isEditing.value !== '',
},
{ showLabel: false, showFeedback: false },
),
{
type: 'custom' as const,
render: () => (
<NSpace>
<NButton type="primary" onClick={() => formFetchSearch()}>
</NButton>
</NSpace>
),
},
]
async function handleFormSearch(values: { searchKey?: string | number; searchValue?: string }) {
recordListParams.value.searchKey = values?.searchKey as any
recordListParams.value.searchValue = values?.searchValue || ''
recordListParams.value.p = 1
await fetchRecords()
}
const { component: FilterForm, fetch: formFetchSearch } = useForm({
config: formConfig(),
defaultValue: {
searchKey: recordListParams.value.searchKey,
searchValue: recordListParams.value.searchValue,
},
request: handleFormSearch,
})
// 组件挂载时获取记录
onMounted(async () => {
if (props.domainId) {
setCurrentDomainId(props.domainId);
await fetchRecords(); // 先获取记录
await fetchRecordTypes(); // 再获取记录类型
await fetchViews(); // 最后获取线路
}
});
// 返回暴露的状态和方法
return {
// 从Store获取的状态
isLoading,
dnsRecords,
hasRecords,
pagination,
recordListParams,
searchKeyOptions,
recordCount,
viewsOptions,
recordTypesOptions,
isMobile,
// 本地UI状态
newRecord,
editingRecord,
isEditing,
isAdding,
// 方法
fetchRecords,
fetchViews,
fetchRecordTypes,
handleCreateRecord,
handleUpdateRecord,
handlDeleteRecord,
handlPauseRecord,
handlStartRecord,
toggleRecordStatus,
// startAdding,
cancelAdding,
openDnsAnalysisDialog,
// 表单
FilterForm,
formFetchSearch,
}
}