|
@@ -1,5 +1,5 @@
|
|
|
<script setup lang="ts">
|
|
|
-import { httpList } from "/@/api/system/menuOperator";
|
|
|
+import { httpAdd, httpUpdate } from "/@/api/system/menuOperator";
|
|
|
import { ElMessage, FormInstance, FormRules } from "element-plus";
|
|
|
import { reactive, ref, watch } from "vue";
|
|
|
import menuType from "./types";
|
|
@@ -12,12 +12,16 @@ const ruleFormRef = ref<FormInstance>();
|
|
|
const props = defineProps({
|
|
|
itemId: {
|
|
|
type: String,
|
|
|
- default: "add"
|
|
|
+ default: ""
|
|
|
},
|
|
|
showModel: {
|
|
|
type: Boolean,
|
|
|
default: false
|
|
|
},
|
|
|
+ isDetails: {
|
|
|
+ type: String,
|
|
|
+ default: "add"
|
|
|
+ },
|
|
|
sitem: {
|
|
|
type: Object as PropType<menuType>
|
|
|
}
|
|
@@ -28,14 +32,11 @@ const emit = defineEmits<{
|
|
|
(e: "refresh"): void;
|
|
|
}>();
|
|
|
const id = ref("");
|
|
|
-
|
|
|
-const ruleForm = reactive({
|
|
|
- addtime: "",
|
|
|
- child: [],
|
|
|
+const editType = ref("add");
|
|
|
+const formModel = {
|
|
|
id: "",
|
|
|
- is_private: 0,
|
|
|
+ is_private: "0",
|
|
|
is_show: "",
|
|
|
- menu_code: "",
|
|
|
menu_img: "",
|
|
|
menu_name: "",
|
|
|
menu_route: "",
|
|
@@ -43,9 +44,12 @@ const ruleForm = reactive({
|
|
|
menu_url: "",
|
|
|
pid: "",
|
|
|
status: "",
|
|
|
- updatetime: "",
|
|
|
- weight: 0
|
|
|
-});
|
|
|
+ weight: "0"
|
|
|
+};
|
|
|
+const ruleForm = reactive<menuType>(formModel);
|
|
|
+// for (let key in formModel) {
|
|
|
+// ruleForm[key] = formModel[key];
|
|
|
+// }
|
|
|
|
|
|
const rules = reactive<FormRules>({
|
|
|
menu_name: [
|
|
@@ -106,67 +110,116 @@ const rules = reactive<FormRules>({
|
|
|
});
|
|
|
const submitForm = async (formEl: FormInstance | undefined) => {
|
|
|
if (!formEl) return;
|
|
|
- await formEl.validate((valid, fields) => {
|
|
|
+ await formEl.validate(async (valid, fields) => {
|
|
|
if (valid) {
|
|
|
- emit("refresh");
|
|
|
- console.log("submit!");
|
|
|
+ if (loading.value === true) return;
|
|
|
+ loading.value = true;
|
|
|
+ const model = Object.assign({}, ruleForm);
|
|
|
+ console.log(model);
|
|
|
+ const { code, data, message } =
|
|
|
+ titleType.value === "add"
|
|
|
+ ? await httpAdd(model)
|
|
|
+ : await httpUpdate(model);
|
|
|
+ if (code === 0) {
|
|
|
+ emit("refresh");
|
|
|
+ } else if (code > 100 && code < 140) {
|
|
|
+ logout();
|
|
|
+ } else {
|
|
|
+ ElMessage.error(message);
|
|
|
+ }
|
|
|
+ console.log(code);
|
|
|
+ console.log(data);
|
|
|
+ console.log(message);
|
|
|
+ loading.value = false;
|
|
|
+ // console.log("submit!");
|
|
|
} else {
|
|
|
console.log("error submit!", fields);
|
|
|
}
|
|
|
});
|
|
|
};
|
|
|
-
|
|
|
-const resetForm = (formEl: FormInstance | undefined) => {
|
|
|
+const resetForm = async (formEl: FormInstance | undefined) => {
|
|
|
if (!formEl) return;
|
|
|
+ formEl.clearValidate();
|
|
|
formEl.resetFields();
|
|
|
};
|
|
|
+const closeDialog = () => {
|
|
|
+ showModelThis.value = false;
|
|
|
+ emit("cancel");
|
|
|
+ resetForm(ruleFormRef.value);
|
|
|
+};
|
|
|
|
|
|
const loading = ref(true);
|
|
|
const titleType = ref("");
|
|
|
-const initForm = () => {
|
|
|
+const initForm = async (item: Object) => {
|
|
|
loading.value = true;
|
|
|
- if (id.value === "add") {
|
|
|
- titleType.value = "新建菜单";
|
|
|
- } else {
|
|
|
- titleType.value = "菜单详情";
|
|
|
+ switch (editType.value) {
|
|
|
+ case "add":
|
|
|
+ titleType.value = "新建菜单";
|
|
|
+ break;
|
|
|
+ case "edit":
|
|
|
+ titleType.value = "编辑菜单";
|
|
|
+ break;
|
|
|
+ case "view":
|
|
|
+ titleType.value = "菜单详情";
|
|
|
+ break;
|
|
|
+ default:
|
|
|
+ titleType.value = "新建菜单";
|
|
|
+ }
|
|
|
+ resetForm(ruleFormRef.value);
|
|
|
+ for (let key in ruleForm) {
|
|
|
+ ruleForm[key] = item[key];
|
|
|
}
|
|
|
|
|
|
- // resetForm(undefined);
|
|
|
- console.log(id.value, showModelThis.value);
|
|
|
+ console.log(editType.value);
|
|
|
console.log(ruleForm);
|
|
|
+
|
|
|
+ menu_type_change();
|
|
|
+ // this.$refs["activityForm"].resetFields();
|
|
|
loading.value = false;
|
|
|
};
|
|
|
const handleChange = (value: number) => {
|
|
|
- console.log(value);
|
|
|
+ // console.log(value);
|
|
|
+};
|
|
|
+const menu_type_change = () => {
|
|
|
+ const { menu_type } = ruleForm;
|
|
|
+ rules.menu_url[0].required = menu_type === "2";
|
|
|
};
|
|
|
watch(
|
|
|
() => {
|
|
|
return props.showModel;
|
|
|
},
|
|
|
() => {
|
|
|
- showModelThis.value = props.showModel;
|
|
|
-
|
|
|
+ const { showModel, itemId, isDetails, sitem } = props;
|
|
|
+ showModelThis.value = showModel;
|
|
|
if (showModelThis.value) {
|
|
|
- id.value = props.itemId;
|
|
|
- for (const key in props.sitem) {
|
|
|
- ruleForm[key] = props.sitem[key];
|
|
|
+ id.value = itemId;
|
|
|
+ editType.value = isDetails;
|
|
|
+ if (isDetails !== "add") {
|
|
|
+ initForm(sitem);
|
|
|
+ } else {
|
|
|
+ initForm(formModel);
|
|
|
}
|
|
|
-
|
|
|
- initForm();
|
|
|
- } else {
|
|
|
- emit("cancel");
|
|
|
}
|
|
|
}
|
|
|
);
|
|
|
</script>
|
|
|
|
|
|
<template>
|
|
|
- <el-dialog v-model="showModelThis" :title="titleType" v-loading="loading">
|
|
|
+ <el-dialog
|
|
|
+ :close-on-press-escape="false"
|
|
|
+ v-model="showModelThis"
|
|
|
+ append-to-body
|
|
|
+ :width="'700px'"
|
|
|
+ :title="titleType"
|
|
|
+ v-loading="loading"
|
|
|
+ @close="closeDialog"
|
|
|
+ >
|
|
|
<el-form
|
|
|
ref="ruleFormRef"
|
|
|
:model="ruleForm"
|
|
|
:rules="rules"
|
|
|
label-width="90px"
|
|
|
+ style="margin-top: -10px"
|
|
|
class="demo-ruleForm"
|
|
|
:size="formSize"
|
|
|
status-icon
|
|
@@ -176,6 +229,7 @@ watch(
|
|
|
<el-form-item label="菜单名称" prop="menu_name">
|
|
|
<el-input
|
|
|
v-model="ruleForm.menu_name"
|
|
|
+ :disabled="editType === 'view'"
|
|
|
placeholder="菜单名称"
|
|
|
/> </el-form-item
|
|
|
></el-col>
|
|
@@ -184,6 +238,8 @@ watch(
|
|
|
<el-select
|
|
|
v-model="ruleForm.menu_type"
|
|
|
style="width: 100%"
|
|
|
+ @change="menu_type_change"
|
|
|
+ :disabled="editType === 'view'"
|
|
|
placeholder="菜单类型"
|
|
|
>
|
|
|
<el-option
|
|
@@ -199,6 +255,7 @@ watch(
|
|
|
<el-select
|
|
|
v-model="ruleForm.menu_img"
|
|
|
style="width: 100%"
|
|
|
+ :disabled="editType === 'view'"
|
|
|
placeholder="菜单图标"
|
|
|
>
|
|
|
<el-option label="Zone one" value="shanghai" />
|
|
@@ -209,11 +266,15 @@ watch(
|
|
|
<el-form-item label="菜单路由" prop="menu_route">
|
|
|
<el-input
|
|
|
v-model="ruleForm.menu_route"
|
|
|
+ :disabled="editType === 'view'"
|
|
|
placeholder="菜单路由" /></el-form-item
|
|
|
></el-col>
|
|
|
<el-col :span="12">
|
|
|
<el-form-item label="状态" prop="status">
|
|
|
- <el-radio-group v-model="ruleForm.status">
|
|
|
+ <el-radio-group
|
|
|
+ v-model="ruleForm.status"
|
|
|
+ :disabled="editType === 'view'"
|
|
|
+ >
|
|
|
<el-radio
|
|
|
v-for="(si, sii) in statusList"
|
|
|
:key="si.value + sii"
|
|
@@ -224,9 +285,13 @@ watch(
|
|
|
</el-radio-group>
|
|
|
</el-form-item></el-col
|
|
|
>
|
|
|
- <el-col :span="24">
|
|
|
+ <el-col :span="24" v-show="ruleForm.menu_type === '2'">
|
|
|
<el-form-item label="页面地址" prop="menu_url">
|
|
|
- <el-input v-model="ruleForm.menu_url" placeholder="页面地址">
|
|
|
+ <el-input
|
|
|
+ v-model="ruleForm.menu_url"
|
|
|
+ placeholder="页面地址"
|
|
|
+ :disabled="editType === 'view'"
|
|
|
+ >
|
|
|
<template #prepend>views/</template>
|
|
|
<template #append>.vue</template></el-input
|
|
|
>
|
|
@@ -241,12 +306,16 @@ watch(
|
|
|
style="width: 100%"
|
|
|
:min="1"
|
|
|
:max="999"
|
|
|
+ :disabled="editType === 'view'"
|
|
|
@change="handleChange"
|
|
|
/> </el-form-item
|
|
|
></el-col>
|
|
|
<el-col :span="12">
|
|
|
<el-form-item label="页面显示" prop="is_private">
|
|
|
- <el-radio-group v-model="ruleForm.is_private">
|
|
|
+ <el-radio-group
|
|
|
+ v-model="ruleForm.is_private"
|
|
|
+ :disabled="editType === 'view'"
|
|
|
+ >
|
|
|
<el-radio
|
|
|
v-for="(si, sii) in menuPrivateList"
|
|
|
:key="si.value + sii"
|