|  | @@ -0,0 +1,174 @@
 | 
	
		
			
				|  |  | +<template>
 | 
	
		
			
				|  |  | +	<el-dialog
 | 
	
		
			
				|  |  | +		class="api-edit"
 | 
	
		
			
				|  |  | +		v-model="showDialog"
 | 
	
		
			
				|  |  | +		:title="`${formData.id ? '编辑接口' : '新增接口'}`"
 | 
	
		
			
				|  |  | +		width="600px"
 | 
	
		
			
				|  |  | +		:close-on-click-modal="false"
 | 
	
		
			
				|  |  | +		:close-on-press-escape="false"
 | 
	
		
			
				|  |  | +	>
 | 
	
		
			
				|  |  | +		<el-form ref="formRef" :model="formData" :rules="ruleForm" label-width="80px" @keyup.enter="onSubmit">
 | 
	
		
			
				|  |  | +			<el-form-item label="选择类型" prop="types">
 | 
	
		
			
				|  |  | +				<el-radio-group v-model="formData.types">
 | 
	
		
			
				|  |  | +					<el-radio-button :label="2">接口</el-radio-button>
 | 
	
		
			
				|  |  | +					<el-radio-button :label="1">分类</el-radio-button>
 | 
	
		
			
				|  |  | +				</el-radio-group>
 | 
	
		
			
				|  |  | +			</el-form-item>
 | 
	
		
			
				|  |  | +			<template v-if="formData.types === 1">
 | 
	
		
			
				|  |  | +				<el-form-item label="上级分类" prop="parentId">
 | 
	
		
			
				|  |  | +					<el-cascader
 | 
	
		
			
				|  |  | +						:options="[
 | 
	
		
			
				|  |  | +							{
 | 
	
		
			
				|  |  | +								id: -1,
 | 
	
		
			
				|  |  | +								name: '根节点',
 | 
	
		
			
				|  |  | +								children: typeData,
 | 
	
		
			
				|  |  | +							},
 | 
	
		
			
				|  |  | +						]"
 | 
	
		
			
				|  |  | +						:props="{ checkStrictly: true, multiple: false, emitPath: false, value: 'id', label: 'name' }"
 | 
	
		
			
				|  |  | +						placeholder="请选择关联页面"
 | 
	
		
			
				|  |  | +						clearable
 | 
	
		
			
				|  |  | +						class="w100"
 | 
	
		
			
				|  |  | +						v-model="formData.parentId"
 | 
	
		
			
				|  |  | +					></el-cascader>
 | 
	
		
			
				|  |  | +				</el-form-item>
 | 
	
		
			
				|  |  | +				<el-form-item label="分类名称" prop="name">
 | 
	
		
			
				|  |  | +					<el-input v-model="formData.name" placeholder="输入接口名称" />
 | 
	
		
			
				|  |  | +				</el-form-item>
 | 
	
		
			
				|  |  | +			</template>
 | 
	
		
			
				|  |  | +			<template v-else>
 | 
	
		
			
				|  |  | +				<el-form-item label="上级分类" prop="parentId">
 | 
	
		
			
				|  |  | +					<el-cascader
 | 
	
		
			
				|  |  | +						:options="typeData"
 | 
	
		
			
				|  |  | +						:props="{ checkStrictly: true, multiple: false, emitPath: false, value: 'id', label: 'name' }"
 | 
	
		
			
				|  |  | +						placeholder="请选择关联页面"
 | 
	
		
			
				|  |  | +						clearable
 | 
	
		
			
				|  |  | +						class="w100"
 | 
	
		
			
				|  |  | +						v-model="formData.parentId"
 | 
	
		
			
				|  |  | +					></el-cascader>
 | 
	
		
			
				|  |  | +				</el-form-item>
 | 
	
		
			
				|  |  | +				<el-form-item label="关联页面" prop="menuIds">
 | 
	
		
			
				|  |  | +					<el-cascader
 | 
	
		
			
				|  |  | +						:options="menuData"
 | 
	
		
			
				|  |  | +						:props="{ checkStrictly: false, multiple: true, emitPath: false, value: 'id', label: 'title' }"
 | 
	
		
			
				|  |  | +						placeholder="请选择关联页面"
 | 
	
		
			
				|  |  | +						clearable
 | 
	
		
			
				|  |  | +						class="w100"
 | 
	
		
			
				|  |  | +						v-model="formData.menuIds"
 | 
	
		
			
				|  |  | +					></el-cascader>
 | 
	
		
			
				|  |  | +				</el-form-item>
 | 
	
		
			
				|  |  | +				<el-form-item label="接口名称" prop="name">
 | 
	
		
			
				|  |  | +					<el-input v-model="formData.name" placeholder="输入接口名称" />
 | 
	
		
			
				|  |  | +				</el-form-item>
 | 
	
		
			
				|  |  | +				<el-form-item label="接口地址" prop="address">
 | 
	
		
			
				|  |  | +					<el-input v-model="formData.address" placeholder="接口地址" />
 | 
	
		
			
				|  |  | +				</el-form-item>
 | 
	
		
			
				|  |  | +				<el-form-item label="访问类型" prop="method">
 | 
	
		
			
				|  |  | +					<el-select v-model="formData.method" placeholder="请选择访问类型">
 | 
	
		
			
				|  |  | +						<el-option v-for="item in methodOptions" :key="item.value" :label="item.key" :value="item.value"></el-option>
 | 
	
		
			
				|  |  | +					</el-select>
 | 
	
		
			
				|  |  | +				</el-form-item>
 | 
	
		
			
				|  |  | +				<el-form-item label="状态" prop="status">
 | 
	
		
			
				|  |  | +					<el-switch v-model="formData.status" :active-value="1" :inactive-value="0" />
 | 
	
		
			
				|  |  | +				</el-form-item>
 | 
	
		
			
				|  |  | +			</template>
 | 
	
		
			
				|  |  | +			<el-form-item label="备注" prop="remark">
 | 
	
		
			
				|  |  | +				<el-input v-model="formData.remark" type="textarea" :rows="3" />
 | 
	
		
			
				|  |  | +			</el-form-item>
 | 
	
		
			
				|  |  | +		</el-form>
 | 
	
		
			
				|  |  | +		<template #footer>
 | 
	
		
			
				|  |  | +			<div class="dialog-footer">
 | 
	
		
			
				|  |  | +				<el-button @click="showDialog = false">取消</el-button>
 | 
	
		
			
				|  |  | +				<el-button type="primary" @click="onSubmit">确定</el-button>
 | 
	
		
			
				|  |  | +			</div>
 | 
	
		
			
				|  |  | +		</template>
 | 
	
		
			
				|  |  | +	</el-dialog>
 | 
	
		
			
				|  |  | +</template>
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +<script lang="ts" setup>
 | 
	
		
			
				|  |  | +import { ref, reactive, nextTick, watch } from 'vue';
 | 
	
		
			
				|  |  | +import api from '/@/api/system';
 | 
	
		
			
				|  |  | +import { ApiRow } from '/@/api/model/system/menu';
 | 
	
		
			
				|  |  | +import { ruleRequired } from '/@/utils/validator';
 | 
	
		
			
				|  |  | +import { ElMessage } from 'element-plus';
 | 
	
		
			
				|  |  | +import apiDatahub from '/@/api/datahub';
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +const emit = defineEmits(['getList']);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +const showDialog = ref(false);
 | 
	
		
			
				|  |  | +const formRef = ref();
 | 
	
		
			
				|  |  | +const menuData = ref<any[]>([]);
 | 
	
		
			
				|  |  | +const typeData = ref<any[]>([]);
 | 
	
		
			
				|  |  | +const methodOptions = ref<any[]>([]);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +const baseForm: ApiRow = {
 | 
	
		
			
				|  |  | +	menuIds: [],
 | 
	
		
			
				|  |  | +	id: undefined,
 | 
	
		
			
				|  |  | +	parentId: undefined,
 | 
	
		
			
				|  |  | +	name: '',
 | 
	
		
			
				|  |  | +	types: 2,
 | 
	
		
			
				|  |  | +	address: '',
 | 
	
		
			
				|  |  | +	method: '',
 | 
	
		
			
				|  |  | +	remark: '',
 | 
	
		
			
				|  |  | +	status: 1,
 | 
	
		
			
				|  |  | +};
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +const formData = reactive<ApiRow>({
 | 
	
		
			
				|  |  | +	...baseForm,
 | 
	
		
			
				|  |  | +});
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +// 切换分类时清空上级分类的选择。因为接口里不能选择跟分类节点
 | 
	
		
			
				|  |  | +watch(
 | 
	
		
			
				|  |  | +	() => formData.types,
 | 
	
		
			
				|  |  | +	() => {
 | 
	
		
			
				|  |  | +		formData.parentId = undefined;
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  | +);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +const ruleForm = {
 | 
	
		
			
				|  |  | +	parentId: [ruleRequired('上级分类不能为空', 'change')],
 | 
	
		
			
				|  |  | +	menuIds: [ruleRequired('关联页面不能为空', 'change')],
 | 
	
		
			
				|  |  | +	method: [ruleRequired('请求方式不能为空', 'change')],
 | 
	
		
			
				|  |  | +	name: [ruleRequired('接口名称不能为空')],
 | 
	
		
			
				|  |  | +	address: [ruleRequired('接口地址不能为空')],
 | 
	
		
			
				|  |  | +};
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +apiDatahub.template.getDictData({ DictType: 'api_methods' }).then((res: any) => {
 | 
	
		
			
				|  |  | +	methodOptions.value = res.values;
 | 
	
		
			
				|  |  | +});
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +// 加载菜单列表
 | 
	
		
			
				|  |  | +api.menu.getList({ status: -1 }).then((res: any[]) => {
 | 
	
		
			
				|  |  | +	menuData.value = res;
 | 
	
		
			
				|  |  | +});
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +const onSubmit = async () => {
 | 
	
		
			
				|  |  | +	await formRef.value.validate();
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	const theApi = formData.id ? api.api.edit : api.api.add;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	await theApi(formData);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	ElMessage.success('操作成功');
 | 
	
		
			
				|  |  | +	resetForm();
 | 
	
		
			
				|  |  | +	showDialog.value = false;
 | 
	
		
			
				|  |  | +	emit('getList');
 | 
	
		
			
				|  |  | +};
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +const resetForm = async () => {
 | 
	
		
			
				|  |  | +	Object.assign(formData, { ...baseForm });
 | 
	
		
			
				|  |  | +	formRef.value && formRef.value.resetFields();
 | 
	
		
			
				|  |  | +};
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +const open = async (row: any) => {
 | 
	
		
			
				|  |  | +	resetForm();
 | 
	
		
			
				|  |  | +	showDialog.value = true;
 | 
	
		
			
				|  |  | +	api.api.getList({ types: 1, status: -1 }).then((res: any) => {
 | 
	
		
			
				|  |  | +		typeData.value = res.Info;
 | 
	
		
			
				|  |  | +	});
 | 
	
		
			
				|  |  | +	nextTick(() => {
 | 
	
		
			
				|  |  | +		Object.assign(formData, { method: methodOptions.value.length ? methodOptions.value[0].value : '', ...row });
 | 
	
		
			
				|  |  | +	});
 | 
	
		
			
				|  |  | +};
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +defineExpose({ open });
 | 
	
		
			
				|  |  | +</script>
 |