menu.vue 9.5 KB
Newer Older
1
<template>
2 3 4
  <div>
    <div class="button-box clearflex">
      <el-button @click="addMenu('0')" type="primary">新增根菜单</el-button>
5
    </div>
Mr.奇淼('s avatar
Mr.奇淼( 已提交
6 7

    <!-- 由于此处菜单跟左侧列表一一对应所以不需要分页 pageSize默认999 -->
Mr.奇淼('s avatar
Mr.奇淼( 已提交
8
    <el-table :data="tableData" border row-key="ID" stripe>
9 10
      <el-table-column label="ID" min-width="100" prop="ID"></el-table-column>
      <el-table-column label="路由Name" min-width="160" prop="name"></el-table-column>
J
jinlan.du 已提交
11
      <el-table-column label="是否隐藏" min-width="100" prop="hidden">
Mr.奇淼('s avatar
Mr.奇淼( 已提交
12 13 14 15
        <template slot-scope="scope">
          <span>{{scope.row.hidden?"隐藏":"显示"}}</span>
        </template>
      </el-table-column>
J
jinlan.du 已提交
16
      <el-table-column label="父节点" min-width="90" prop="parentId"></el-table-column>
17
      <el-table-column label="排序" min-width="70" prop="sort"></el-table-column>
J
jinlan.du 已提交
18
      <el-table-column label="文件路径" min-width="360" prop="component"></el-table-column>
19
      <el-table-column label="展示名称" min-width="120" prop="authorityName">
20 21 22 23
        <template slot-scope="scope">
          <span>{{scope.row.meta.title}}</span>
        </template>
      </el-table-column>
24
      <el-table-column label="图标" min-width="140" prop="authorityName">
25 26 27 28
        <template slot-scope="scope">
          <span>{{scope.row.meta.icon}}</span>
        </template>
      </el-table-column>
Mr.奇淼('s avatar
Mr.奇淼( 已提交
29
      <el-table-column fixed="right" label="操作" width="300">
30
        <template slot-scope="scope">
Mr.奇淼('s avatar
Mr.奇淼( 已提交
31
          <el-button @click="deleteMenu(scope.row.ID)" size="small" type="text">删除菜单</el-button>
Mr.奇淼('s avatar
Mr.奇淼( 已提交
32
          <el-button @click="editMenu(scope.row.ID)" size="small" type="text">编辑菜单</el-button>
33 34 35 36 37
          <el-button @click="addMenu(scope.row.ID)" size="small" type="text">添加子菜单</el-button>
        </template>
      </el-table-column>
    </el-table>

38
    <el-dialog :before-close="handleClose" :visible.sync="dialogFormVisible" :title="dialogTitle">
Mr.奇淼('s avatar
Mr.奇淼( 已提交
39 40 41 42 43 44 45 46 47
      <el-form
        :inline="true"
        :model="form"
        :rules="rules"
        label-width="85px"
        ref="menuForm"
        label-position="top"
      >
        <el-form-item label="路由name" prop="path" style="width:30%">
48
          <el-input autocomplete="off" placeholder="唯一英文字符串" v-model="form.path"></el-input>
49
        </el-form-item>
Mr.奇淼('s avatar
Mr.奇淼( 已提交
50
        <el-form-item label="是否隐藏" style="width:30%">
51 52 53 54 55
          <el-select placeholder="是否在列表隐藏" v-model="form.hidden">
            <el-option :value="false" label="否"></el-option>
            <el-option :value="true" label="是"></el-option>
          </el-select>
        </el-form-item>
Mr.奇淼('s avatar
Mr.奇淼( 已提交
56 57 58 59 60 61 62 63 64
        <el-form-item label="父节点Id" style="width:30%">
          <el-cascader
            :disabled="!this.isEdit"
            v-model="form.parentId"
            :options="menuOption"
            :show-all-levels="false"
            :props="{ checkStrictly: true,label:'title',value:'ID',disabled:'disabled',emitPath:false}"
            filterable
          ></el-cascader>
65
        </el-form-item>
Mr.奇淼('s avatar
Mr.奇淼( 已提交
66
        <el-form-item label="文件路径" prop="component" style="width:30%">
67 68
          <el-input autocomplete="off" v-model="form.component"></el-input>
        </el-form-item>
Mr.奇淼('s avatar
Mr.奇淼( 已提交
69
        <el-form-item label="展示名称" prop="meta.title" style="width:30%">
70 71
          <el-input autocomplete="off" v-model="form.meta.title"></el-input>
        </el-form-item>
Mr.奇淼('s avatar
Mr.奇淼( 已提交
72
        <el-form-item label="图标" prop="meta.icon" style="width:30%">
73 74 75
          <el-input autocomplete="off" v-model="form.meta.icon">
            <template slot="prepend">el-icon-</template>
          </el-input>
76
        </el-form-item>
Mr.奇淼('s avatar
Mr.奇淼( 已提交
77
        <el-form-item label="排序标记" prop="sort" style="width:30%">
78
          <el-input autocomplete="off" v-model.number="form.sort"></el-input>
79
        </el-form-item>
Mr.奇淼('s avatar
Mr.奇淼( 已提交
80
        <el-form-item label="keepAlive" prop="meta.keepAlive" style="width:30%">
81 82 83 84 85
          <el-select placeholder="是否keepAlive缓存页面" v-model="form.meta.keepAlive">
            <el-option :value="false" label="否"></el-option>
            <el-option :value="true" label="是"></el-option>
          </el-select>
        </el-form-item>
86
      </el-form>
Mr.奇淼('s avatar
Mr.奇淼( 已提交
87
      <div class="warning">新增菜单需要在角色管理内配置权限才可使用</div>
88 89 90 91 92 93
      <div class="dialog-footer" slot="footer">
        <el-button @click="closeDialog">取 消</el-button>
        <el-button @click="enterDialog" type="primary">确 定</el-button>
      </div>
    </el-dialog>
  </div>
94 95 96
</template>

<script>
Mr.奇淼('s avatar
注释  
Mr.奇淼( 已提交
97 98
// 获取列表内容封装在mixins内部  getTableData方法 初始化已封装完成

99
import {
R
rainyan 已提交
100
  updateBaseMenu,
101 102 103 104
  getMenuList,
  addBaseMenu,
  deleteBaseMenu,
  getBaseMenuById
Mr.奇淼('s avatar
Mr.奇淼( 已提交
105 106
} from "@/api/menu";
import infoList from "@/components/mixins/infoList";
107
export default {
Mr.奇淼('s avatar
Mr.奇淼( 已提交
108
  name: "Menus",
109
  mixins: [infoList],
110 111
  data() {
    return {
112
      listApi: getMenuList,
113
      dialogFormVisible: false,
Mr.奇淼('s avatar
Mr.奇淼( 已提交
114 115
      dialogTitle: "新增菜单",
      menuOption: [
116
        {
Mr.奇淼('s avatar
Mr.奇淼( 已提交
117 118
          ID: "0",
          title: "根菜单"
119 120
        }
      ],
121
      form: {
122
        ID: 0,
Mr.奇淼('s avatar
Mr.奇淼( 已提交
123 124 125 126 127
        path: "",
        name: "",
        hidden: "",
        parentId: "",
        component: "",
128
        meta: {
Mr.奇淼('s avatar
Mr.奇淼( 已提交
129 130 131 132
          title: "",
          icon: "",
          defaultMenu: false,
          keepAlive: false
133
        }
Mr.奇淼('s avatar
Mr.奇淼( 已提交
134
      },
Mr.奇淼('s avatar
Mr.奇淼( 已提交
135
      rules: {
Mr.奇淼('s avatar
Mr.奇淼( 已提交
136
        path: [{ required: true, message: "请输入菜单name", trigger: "blur" }],
Mr.奇淼('s avatar
Mr.奇淼( 已提交
137
        component: [
Mr.奇淼('s avatar
Mr.奇淼( 已提交
138
          { required: true, message: "请输入文件路径", trigger: "blur" }
Mr.奇淼('s avatar
Mr.奇淼( 已提交
139
        ],
Mr.奇淼('s avatar
Mr.奇淼( 已提交
140 141
        "meta.title": [
          { required: true, message: "请输入菜单展示名称", trigger: "blur" }
Mr.奇淼('s avatar
Mr.奇淼( 已提交
142 143
        ]
      },
144
      isEdit: false
Mr.奇淼('s avatar
Mr.奇淼( 已提交
145
    };
146 147
  },
  methods: {
Mr.奇淼('s avatar
Mr.奇淼( 已提交
148 149 150 151 152
    setOptions() {
      this.menuOption = [
        {
          ID: "0",
          title: "根目录"
153
        }
Mr.奇淼('s avatar
Mr.奇淼( 已提交
154 155 156 157 158 159
      ];
      this.setMenuOptions(this.tableData, this.menuOption, false);
    },
    setMenuOptions(menuData, optionsData, disabled) {
      menuData &&
        menuData.map(item => {
160
          if (item.children&&item.children.length) {
Mr.奇淼('s avatar
Mr.奇淼( 已提交
161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179
            const option = {
              title: item.meta.title,
              ID: String(item.ID),
              disabled: disabled || item.ID == this.form.ID,
              children: []
            };
            this.setMenuOptions(
              item.children,
              option.children,
              disabled || item.ID == this.form.ID
            );
            optionsData.push(option);
          } else {
            const option = {
              title: item.meta.title,
              ID: String(item.ID),
              disabled: disabled || item.ID == this.form.ID
            };
            optionsData.push(option);
180
          }
Mr.奇淼('s avatar
Mr.奇淼( 已提交
181
        });
182
    },
Mr.奇淼('s avatar
Mr.奇淼( 已提交
183
    handleClose(done) {
Mr.奇淼('s avatar
Mr.奇淼( 已提交
184 185
      this.initForm();
      done();
186
    },
187 188
    // 懒加载子菜单
    load(tree, treeNode, resolve) {
Mr.奇淼('s avatar
Mr.奇淼( 已提交
189 190 191
      resolve([
        {
          id: 31,
Mr.奇淼('s avatar
Mr.奇淼( 已提交
192 193 194
          date: "2016-05-01",
          name: "王小虎",
          address: "上海市普陀区金沙江路 1519 弄"
Mr.奇淼('s avatar
Mr.奇淼( 已提交
195 196 197
        },
        {
          id: 32,
Mr.奇淼('s avatar
Mr.奇淼( 已提交
198 199 200
          date: "2016-05-01",
          name: "王小虎",
          address: "上海市普陀区金沙江路 1519 弄"
Mr.奇淼('s avatar
Mr.奇淼( 已提交
201
        }
Mr.奇淼('s avatar
Mr.奇淼( 已提交
202
      ]);
Mr.奇淼('s avatar
Mr.奇淼( 已提交
203
    },
204
    // 删除菜单
Mr.奇淼('s avatar
Mr.奇淼( 已提交
205
    deleteMenu(ID) {
Mr.奇淼('s avatar
Mr.奇淼( 已提交
206 207 208 209
      this.$confirm("此操作将永久删除所有角色下该菜单, 是否继续?", "提示", {
        confirmButtonText: "确定",
        cancelButtonText: "取消",
        type: "warning"
210 211
      })
        .then(async () => {
Mr.奇淼('s avatar
Mr.奇淼( 已提交
212
          const res = await deleteBaseMenu({ ID });
213
          if (res.code == 0) {
Mr.奇淼('s avatar
Mr.奇淼( 已提交
214
            this.$message({
Mr.奇淼('s avatar
Mr.奇淼( 已提交
215 216 217 218
              type: "success",
              message: "删除成功!"
            });
            this.getTableData();
Mr.奇淼('s avatar
Mr.奇淼( 已提交
219
          }
220 221 222
        })
        .catch(() => {
          this.$message({
Mr.奇淼('s avatar
Mr.奇淼( 已提交
223 224 225 226
            type: "info",
            message: "已取消删除"
          });
        });
227
    },
228
    // 初始化弹窗内表格方法
229
    initForm() {
Mr.奇淼('s avatar
Mr.奇淼( 已提交
230
      this.$refs.menuForm.resetFields();
Mr.奇淼('s avatar
Mr.奇淼( 已提交
231 232
      this.form = {
        ID: 0,
Mr.奇淼('s avatar
Mr.奇淼( 已提交
233 234 235 236 237
        path: "",
        name: "",
        hidden: "",
        parentId: "",
        component: "",
Mr.奇淼('s avatar
Mr.奇淼( 已提交
238
        meta: {
Mr.奇淼('s avatar
Mr.奇淼( 已提交
239 240 241 242
          title: "",
          icon: "",
          defaultMenu: false,
          keepAlive: ""
Mr.奇淼('s avatar
Mr.奇淼( 已提交
243
        }
Mr.奇淼('s avatar
Mr.奇淼( 已提交
244
      };
245
    },
246
    // 关闭弹窗
247
    closeDialog() {
Mr.奇淼('s avatar
Mr.奇淼( 已提交
248 249
      this.initForm();
      this.dialogFormVisible = false;
250
    },
251
    // 添加menu
252
    async enterDialog() {
Mr.奇淼('s avatar
Mr.奇淼( 已提交
253 254
      this.$refs.menuForm.validate(async valid => {
        if (valid) {
Mr.奇淼('s avatar
Mr.奇淼( 已提交
255 256
          let res;
          this.form.name = this.form.path;
Mr.奇淼('s avatar
Mr.奇淼( 已提交
257
          if (this.isEdit) {
Mr.奇淼('s avatar
Mr.奇淼( 已提交
258
            res = await updateBaseMenu(this.form);
Mr.奇淼('s avatar
Mr.奇淼( 已提交
259
          } else {
Mr.奇淼('s avatar
Mr.奇淼( 已提交
260
            res = await addBaseMenu(this.form);
Mr.奇淼('s avatar
Mr.奇淼( 已提交
261
          }
262
          if (res.code == 0) {
Mr.奇淼('s avatar
Mr.奇淼( 已提交
263
            this.$message({
Mr.奇淼('s avatar
Mr.奇淼( 已提交
264 265 266 267
              type: "success",
              message: this.isEdit ? "编辑成功" : "添加成功!"
            });
            this.getTableData();
Mr.奇淼('s avatar
Mr.奇淼( 已提交
268
          }
Mr.奇淼('s avatar
Mr.奇淼( 已提交
269 270
          this.initForm();
          this.dialogFormVisible = false;
Mr.奇淼('s avatar
Mr.奇淼( 已提交
271
        }
Mr.奇淼('s avatar
Mr.奇淼( 已提交
272
      });
273
    },
274
    // 添加菜单方法,id为 0则为添加根菜单
275
    addMenu(id) {
Mr.奇淼('s avatar
Mr.奇淼( 已提交
276 277 278 279 280
      this.dialogTitle = "新增菜单";
      this.form.parentId = String(id);
      this.isEdit = false;
      this.setOptions();
      this.dialogFormVisible = true;
281
    },
282
    // 修改菜单方法
283
    async editMenu(id) {
Mr.奇淼('s avatar
Mr.奇淼( 已提交
284 285 286 287 288 289 290
      this.dialogTitle = "编辑菜单";
      const res = await getBaseMenuById({ id });
      this.form = res.data.menu;
      this.isEdit = true;
      this.setOptions();
      this.dialogFormVisible = true;
    }
Mr.奇淼('s avatar
Mr.奇淼( 已提交
291
  },
Mr.奇淼('s avatar
Mr.奇淼( 已提交
292 293 294
  async created() {
    this.pageSize = 999;
    await this.getTableData();
295
  }
Mr.奇淼('s avatar
Mr.奇淼( 已提交
296
};
297
</script>
298
<style scoped lang="scss">
299 300 301 302 303 304
.button-box {
  padding: 10px 20px;
  .el-button {
    float: right;
  }
}
K
yx  
klausY 已提交
305
.warning {
Mr.奇淼('s avatar
Mr.奇淼( 已提交
306
  color: #dc143c;
K
yx  
klausY 已提交
307
}
308
</style>