|
@@ -1,293 +0,0 @@
|
|
|
-<script setup lang="ts">
|
|
|
-import { httpAdd, httpUpdate } from "/@/api/system/menuOperator";
|
|
|
-import { ElMessage, FormInstance, FormRules } from "element-plus";
|
|
|
-import { reactive, ref, watch, nextTick } from "vue";
|
|
|
-import menuType from "./types";
|
|
|
-import { menuTypeList, menuPrivateList } from "/@/utils/status";
|
|
|
-import { useNav } from "/@/layout/hooks/nav";
|
|
|
-import { IconSelect } from "/@/components/ReIcon";
|
|
|
-const { logout } = useNav();
|
|
|
-const ruleFormRef = ref<FormInstance>();
|
|
|
-
|
|
|
-const props = defineProps({
|
|
|
- itemId: {
|
|
|
- type: String,
|
|
|
- default: ""
|
|
|
- },
|
|
|
- showModel: {
|
|
|
- type: Boolean,
|
|
|
- default: false
|
|
|
- },
|
|
|
- isDetails: {
|
|
|
- type: String,
|
|
|
- default: "add"
|
|
|
- },
|
|
|
- sitem: {
|
|
|
- type: Object as PropType<menuType>
|
|
|
- }
|
|
|
-});
|
|
|
-const showModelThis = ref(false);
|
|
|
-const emit = defineEmits<{
|
|
|
- (e: "cancel"): void;
|
|
|
- (e: "refresh"): void;
|
|
|
-}>();
|
|
|
-const id = ref("");
|
|
|
-const editType = ref("add");
|
|
|
-const formModel = {
|
|
|
- id: "",
|
|
|
- private: "0",
|
|
|
- menu_img: "eidt",
|
|
|
- menu_name: "",
|
|
|
- menu_route: "",
|
|
|
- menu_type: "",
|
|
|
- menu_url: "",
|
|
|
- pid: "",
|
|
|
- weight: 0
|
|
|
-};
|
|
|
-const ruleForm = reactive<menuType>(formModel);
|
|
|
-const rules = reactive<FormRules>({
|
|
|
- menu_name: [
|
|
|
- { required: true, message: "请输入菜单名称", trigger: "blur" },
|
|
|
- { min: 1, max: 10, message: "长度在 1 到 10 个字符", trigger: "blur" }
|
|
|
- ],
|
|
|
- menu_type: [
|
|
|
- {
|
|
|
- required: true,
|
|
|
- message: "请选择菜单类型",
|
|
|
- trigger: "change"
|
|
|
- }
|
|
|
- ],
|
|
|
- menu_img: [
|
|
|
- {
|
|
|
- required: true,
|
|
|
- message: "请选择菜单图标",
|
|
|
- trigger: "change"
|
|
|
- }
|
|
|
- ],
|
|
|
- menu_route: [
|
|
|
- {
|
|
|
- required: true,
|
|
|
- message: "请输入菜单路由",
|
|
|
- trigger: "blur"
|
|
|
- },
|
|
|
- { min: 1, max: 50, message: "长度在 1 到 50 个字符", trigger: "blur" }
|
|
|
- ],
|
|
|
-
|
|
|
- menu_url: [
|
|
|
- {
|
|
|
- required: true,
|
|
|
- message: "请输入文件地址",
|
|
|
- trigger: "blur"
|
|
|
- },
|
|
|
- { min: 1, max: 100, message: "长度在 1 到 100 个字符", trigger: "blur" }
|
|
|
- ],
|
|
|
- private: [
|
|
|
- {
|
|
|
- required: true,
|
|
|
- message: "请选择页面是否显示",
|
|
|
- trigger: "change"
|
|
|
- }
|
|
|
- ],
|
|
|
- weight: [
|
|
|
- {
|
|
|
- required: true,
|
|
|
- message: "请输入排序权重",
|
|
|
- trigger: "blur"
|
|
|
- }
|
|
|
- ]
|
|
|
-});
|
|
|
-const submitForm = async (formEl: FormInstance | undefined) => {
|
|
|
- if (!formEl) return;
|
|
|
- await formEl.validate(async (valid, fields) => {
|
|
|
- if (valid) {
|
|
|
- if (loading.value === true) return;
|
|
|
- loading.value = true;
|
|
|
- let model = Object.assign({}, ruleForm);
|
|
|
- model.menu_img = "eidt";
|
|
|
- const { code, data, message } =
|
|
|
- editType.value === "add"
|
|
|
- ? await httpAdd(model)
|
|
|
- : await httpUpdate(model);
|
|
|
- if (code === 0) {
|
|
|
- emit("refresh");
|
|
|
- } else if (code > 100 && code < 140) {
|
|
|
- logout();
|
|
|
- } else {
|
|
|
- ElMessage.error(message);
|
|
|
- }
|
|
|
- loading.value = false;
|
|
|
- closeDialog();
|
|
|
- } else {
|
|
|
- console.log("error submit!", fields);
|
|
|
- }
|
|
|
- });
|
|
|
-};
|
|
|
-
|
|
|
-const closeDialog = () => {
|
|
|
- showModelThis.value = false;
|
|
|
- emit("cancel");
|
|
|
-};
|
|
|
-
|
|
|
-const loading = ref(true);
|
|
|
-const titleType = ref("");
|
|
|
-const initForm = async () => {
|
|
|
- loading.value = true;
|
|
|
- switch (editType.value) {
|
|
|
- case "add":
|
|
|
- titleType.value = "新建菜单";
|
|
|
- break;
|
|
|
- case "edit":
|
|
|
- titleType.value = "编辑菜单";
|
|
|
- break;
|
|
|
- case "view":
|
|
|
- titleType.value = "菜单详情";
|
|
|
- break;
|
|
|
- default:
|
|
|
- titleType.value = "新建菜单";
|
|
|
- }
|
|
|
- if (id.value !== "" && editType.value === "add") {
|
|
|
- ruleForm.pid = id.value;
|
|
|
- }
|
|
|
-
|
|
|
- loading.value = false;
|
|
|
-};
|
|
|
-const handleChange = (value: number) => {
|
|
|
- // console.log(value);
|
|
|
-};
|
|
|
-const menu_type_change = () => {
|
|
|
- const { menu_type } = ruleForm;
|
|
|
- rules.menu_url[0].required = menu_type === "2";
|
|
|
-};
|
|
|
-watch(
|
|
|
- () => {
|
|
|
- return props.showModel;
|
|
|
- },
|
|
|
- () => {
|
|
|
- const { showModel, itemId, isDetails, sitem } = props;
|
|
|
- showModelThis.value = showModel;
|
|
|
-
|
|
|
- if (showModelThis.value) {
|
|
|
- console.log(props);
|
|
|
- id.value = itemId;
|
|
|
- editType.value = isDetails;
|
|
|
- Object.keys(sitem).forEach(key => {
|
|
|
- ruleForm[key] = sitem[key];
|
|
|
- });
|
|
|
- initForm();
|
|
|
- }
|
|
|
- }
|
|
|
-);
|
|
|
-</script>
|
|
|
-
|
|
|
-<template>
|
|
|
- <el-dialog
|
|
|
- :close-on-press-escape="false"
|
|
|
- v-model="showModelThis"
|
|
|
- append-to-body
|
|
|
- center
|
|
|
- :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"
|
|
|
- status-icon
|
|
|
- >
|
|
|
- <el-row>
|
|
|
- <el-col :span="24">
|
|
|
- <el-form-item label="菜单名称" prop="menu_name">
|
|
|
- <el-input
|
|
|
- v-model="ruleForm.menu_name"
|
|
|
- :disabled="editType === 'view'"
|
|
|
- placeholder="菜单名称"
|
|
|
- /> </el-form-item
|
|
|
- ></el-col>
|
|
|
- <el-col :span="12">
|
|
|
- <el-form-item label="菜单类型" prop="menu_type">
|
|
|
- <el-select
|
|
|
- v-model="ruleForm.menu_type"
|
|
|
- style="width: 100%"
|
|
|
- @change="menu_type_change"
|
|
|
- :disabled="editType === 'view'"
|
|
|
- placeholder="菜单类型"
|
|
|
- >
|
|
|
- <el-option
|
|
|
- v-for="(si, sii) in menuTypeList"
|
|
|
- :key="'type' + si.value + sii"
|
|
|
- :label="si.label"
|
|
|
- :value="si.value"
|
|
|
- />
|
|
|
- </el-select> </el-form-item
|
|
|
- ></el-col>
|
|
|
- <el-col :span="12">
|
|
|
- <el-form-item label="菜单图标" prop="menu_img">
|
|
|
- <IconSelect v-model="ruleForm.menu_img" /> </el-form-item
|
|
|
- ></el-col>
|
|
|
- <el-col :span="12">
|
|
|
- <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="private">
|
|
|
- <el-radio-group
|
|
|
- v-model="ruleForm.private"
|
|
|
- :disabled="editType === 'view'"
|
|
|
- >
|
|
|
- <el-radio
|
|
|
- v-for="(si, sii) in menuPrivateList"
|
|
|
- :key="si.value + sii"
|
|
|
- :label="si.value"
|
|
|
- :value="si.value"
|
|
|
- >{{ si.label }}</el-radio
|
|
|
- >
|
|
|
- </el-radio-group>
|
|
|
- </el-form-item></el-col
|
|
|
- >
|
|
|
-
|
|
|
- <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="页面地址"
|
|
|
- :disabled="editType === 'view'"
|
|
|
- >
|
|
|
- <template #prepend>views/</template>
|
|
|
- <template #append>.vue</template></el-input
|
|
|
- >
|
|
|
- </el-form-item></el-col
|
|
|
- >
|
|
|
-
|
|
|
- <el-col :span="12">
|
|
|
- <el-form-item label="排序权重" prop="weight">
|
|
|
- <el-input-number
|
|
|
- v-model="ruleForm.weight"
|
|
|
- :precision="0"
|
|
|
- style="width: 100%"
|
|
|
- :min="1"
|
|
|
- :max="999"
|
|
|
- :disabled="editType === 'view'"
|
|
|
- @change="handleChange"
|
|
|
- /> </el-form-item
|
|
|
- ></el-col>
|
|
|
- </el-row>
|
|
|
- <el-col :span="24" class="clear">
|
|
|
- <el-button
|
|
|
- type="primary"
|
|
|
- class="fr"
|
|
|
- style="margin: 0 0 0 16px"
|
|
|
- @click="submitForm(ruleFormRef)"
|
|
|
- >保存</el-button
|
|
|
- >
|
|
|
- </el-col>
|
|
|
- </el-form>
|
|
|
- </el-dialog>
|
|
|
-</template>
|