menu.vue 12.6 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>
11
      <el-table-column label="路由Path" min-width="160" prop="path"></el-table-column>
J
jinlan.du 已提交
12
      <el-table-column label="是否隐藏" min-width="100" prop="hidden">
Mr.奇淼('s avatar
Mr.奇淼( 已提交
13 14 15 16
        <template slot-scope="scope">
          <span>{{scope.row.hidden?"隐藏":"显示"}}</span>
        </template>
      </el-table-column>
J
jinlan.du 已提交
17
      <el-table-column label="父节点" min-width="90" prop="parentId"></el-table-column>
18
      <el-table-column label="排序" min-width="70" prop="sort"></el-table-column>
J
jinlan.du 已提交
19
      <el-table-column label="文件路径" min-width="360" prop="component"></el-table-column>
20
      <el-table-column label="展示名称" min-width="120" prop="authorityName">
21 22 23 24
        <template slot-scope="scope">
          <span>{{scope.row.meta.title}}</span>
        </template>
      </el-table-column>
25
      <el-table-column label="图标" min-width="140" prop="authorityName">
26
        <template slot-scope="scope">
Mr.奇淼('s avatar
Mr.奇淼( 已提交
27
          <i :class="`el-icon-${scope.row.meta.icon}`"></i>
28 29 30
          <span>{{scope.row.meta.icon}}</span>
        </template>
      </el-table-column>
Mr.奇淼('s avatar
Mr.奇淼( 已提交
31
      <el-table-column fixed="right" label="操作" width="300">
32
        <template slot-scope="scope">
Mr.奇淼('s avatar
Mr.奇淼( 已提交
33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50
          <el-button
            @click="addMenu(scope.row.ID)"
            size="small"
            type="primary"
            icon="el-icon-edit"
          >添加子菜单</el-button>
          <el-button
            @click="editMenu(scope.row.ID)"
            size="small"
            type="primary"
            icon="el-icon-edit"
          >编辑</el-button>
          <el-button
            @click="deleteMenu(scope.row.ID)"
            size="small"
            type="danger"
            icon="el-icon-delete"
          >删除</el-button>
51 52 53 54
        </template>
      </el-table-column>
    </el-table>

Mr.奇淼('s avatar
Mr.奇淼( 已提交
55
    <el-dialog :before-close="handleClose" :title="dialogTitle" :visible.sync="dialogFormVisible">
Mr.奇淼('s avatar
Mr.奇淼( 已提交
56 57 58 59
      <el-form
        :inline="true"
        :model="form"
        :rules="rules"
Mr.奇淼('s avatar
Mr.奇淼( 已提交
60
        label-position="top"
Mr.奇淼('s avatar
Mr.奇淼( 已提交
61 62 63 64
        label-width="85px"
        ref="menuForm"
      >
        <el-form-item label="路由name" prop="path" style="width:30%">
Mr.奇淼('s avatar
Mr.奇淼( 已提交
65 66 67 68 69 70
          <el-input
            @change="changeName"
            autocomplete="off"
            placeholder="唯一英文字符串"
            v-model="form.name"
          ></el-input>
71
        </el-form-item>
Mr.奇淼('s avatar
Mr.奇淼( 已提交
72 73 74 75 76 77 78 79 80 81 82
        <el-form-item prop="path" style="width:30%">
          <div style="display:inline-block" slot="label">
            路由path
            <el-checkbox style="float:right;margin-left:20px;" v-model="checkFlag">添加参数</el-checkbox>
          </div>
          <el-input
            :disabled="!checkFlag"
            autocomplete="off"
            placeholder="建议只在后方拼接参数"
            v-model="form.path"
          ></el-input>
83
        </el-form-item>
Mr.奇淼('s avatar
Mr.奇淼( 已提交
84
        <el-form-item label="是否隐藏" style="width:30%">
85 86 87 88 89
          <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.奇淼( 已提交
90 91 92 93 94
        <el-form-item label="父节点Id" style="width:30%">
          <el-cascader
            :disabled="!this.isEdit"
            :options="menuOption"
            :props="{ checkStrictly: true,label:'title',value:'ID',disabled:'disabled',emitPath:false}"
Mr.奇淼('s avatar
Mr.奇淼( 已提交
95
            :show-all-levels="false"
Mr.奇淼('s avatar
Mr.奇淼( 已提交
96
            filterable
Mr.奇淼('s avatar
Mr.奇淼( 已提交
97
            v-model="form.parentId"
Mr.奇淼('s avatar
Mr.奇淼( 已提交
98
          ></el-cascader>
99
        </el-form-item>
Mr.奇淼('s avatar
Mr.奇淼( 已提交
100
        <el-form-item label="文件路径" prop="component" style="width:30%">
101 102
          <el-input autocomplete="off" v-model="form.component"></el-input>
        </el-form-item>
Mr.奇淼('s avatar
Mr.奇淼( 已提交
103
        <el-form-item label="展示名称" prop="meta.title" style="width:30%">
104 105
          <el-input autocomplete="off" v-model="form.meta.title"></el-input>
        </el-form-item>
Mr.奇淼('s avatar
Mr.奇淼( 已提交
106
        <el-form-item label="图标" prop="meta.icon" style="width:30%">
Mr.奇淼('s avatar
Mr.奇淼( 已提交
107
          <icon :meta="form.meta">
Mr.奇淼('s avatar
Mr.奇淼( 已提交
108
            <template slot="prepend">el-icon-</template>
K
klausY 已提交
109
          </icon>
110
        </el-form-item>
Mr.奇淼('s avatar
Mr.奇淼( 已提交
111
        <el-form-item label="排序标记" prop="sort" style="width:30%">
112
          <el-input autocomplete="off" v-model.number="form.sort"></el-input>
113
        </el-form-item>
Mr.奇淼('s avatar
Mr.奇淼( 已提交
114
        <el-form-item label="keepAlive" prop="meta.keepAlive" style="width:30%">
115 116 117 118 119
          <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>
120
      </el-form>
Mr.奇淼('s avatar
Mr.奇淼( 已提交
121
      <div class="warning">新增菜单需要在角色管理内配置权限才可使用</div>
Mr.奇淼('s avatar
Mr.奇淼( 已提交
122 123 124 125 126
      <div>
        <el-button
          size="small"
          type="primary"
          icon="el-icon-edit"
Mr.奇淼('s avatar
Mr.奇淼( 已提交
127
          @click="addParameter(form)"
Mr.奇淼('s avatar
Mr.奇淼( 已提交
128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165
        >新增菜单参数</el-button>
        <el-table :data="form.parameters" stripe style="width: 100%">
          <el-table-column prop="type" label="参数类型" width="180">
            <template slot-scope="scope">
              <el-select v-model="scope.row.type" placeholder="请选择">
                <el-option key="query" value="query" label="query"></el-option>
                <el-option key="params" value="params" label="params"></el-option>
              </el-select>
            </template>
          </el-table-column>
          <el-table-column prop="key" label="参数key" width="180">
            <template slot-scope="scope">
              <div>
                <el-input v-model="scope.row.key"></el-input>
              </div>
            </template>
          </el-table-column>
          <el-table-column prop="value" label="参数值">
            <template slot-scope="scope">
              <div>
                <el-input v-model="scope.row.value"></el-input>
              </div>
            </template>
          </el-table-column>
          <el-table-column>
            <template slot-scope="scope">
              <div>
                <el-button
                  type="danger"
                  size="small"
                  icon="el-icon-delete"
                  @click="deleteParameter(form.parameters,scope.$index)"
                >删除</el-button>
              </div>
            </template>
          </el-table-column>
        </el-table>
      </div>
166 167 168 169 170 171
      <div class="dialog-footer" slot="footer">
        <el-button @click="closeDialog">取 消</el-button>
        <el-button @click="enterDialog" type="primary">确 定</el-button>
      </div>
    </el-dialog>
  </div>
172 173 174
</template>

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

177
import {
R
rainyan 已提交
178
  updateBaseMenu,
179 180 181 182
  getMenuList,
  addBaseMenu,
  deleteBaseMenu,
  getBaseMenuById
Mr.奇淼('s avatar
Mr.奇淼( 已提交
183
} from "@/api/menu";
184
import infoList from "@/mixins/infoList";
Mr.奇淼('s avatar
Mr.奇淼( 已提交
185
import icon from "@/view/superAdmin/menu/icon";
186
export default {
Mr.奇淼('s avatar
Mr.奇淼( 已提交
187
  name: "Menus",
188
  mixins: [infoList],
189 190
  data() {
    return {
Mr.奇淼('s avatar
Mr.奇淼( 已提交
191
      checkFlag: false,
192
      listApi: getMenuList,
193
      dialogFormVisible: false,
Mr.奇淼('s avatar
Mr.奇淼( 已提交
194
      dialogTitle: "新增菜单",
Mr.奇淼('s avatar
Mr.奇淼( 已提交
195
      menuOption: [
196
        {
Mr.奇淼('s avatar
Mr.奇淼( 已提交
197 198
          ID: "0",
          title: "根菜单"
199 200
        }
      ],
201
      form: {
202
        ID: 0,
Mr.奇淼('s avatar
Mr.奇淼( 已提交
203 204 205 206 207
        path: "",
        name: "",
        hidden: "",
        parentId: "",
        component: "",
208
        meta: {
Mr.奇淼('s avatar
Mr.奇淼( 已提交
209 210
          title: "",
          icon: "",
Mr.奇淼('s avatar
Mr.奇淼( 已提交
211 212
          defaultMenu: false,
          keepAlive: false
Mr.奇淼('s avatar
Mr.奇淼( 已提交
213 214
        },
        parameters: []
Mr.奇淼('s avatar
Mr.奇淼( 已提交
215
      },
Mr.奇淼('s avatar
Mr.奇淼( 已提交
216
      rules: {
Mr.奇淼('s avatar
Mr.奇淼( 已提交
217
        path: [{ required: true, message: "请输入菜单name", trigger: "blur" }],
Mr.奇淼('s avatar
Mr.奇淼( 已提交
218
        component: [
Mr.奇淼('s avatar
Mr.奇淼( 已提交
219
          { required: true, message: "请输入文件路径", trigger: "blur" }
Mr.奇淼('s avatar
Mr.奇淼( 已提交
220
        ],
Mr.奇淼('s avatar
Mr.奇淼( 已提交
221 222
        "meta.title": [
          { required: true, message: "请输入菜单展示名称", trigger: "blur" }
Mr.奇淼('s avatar
Mr.奇淼( 已提交
223 224
        ]
      },
K
klausY 已提交
225
      isEdit: false,
Mr.奇淼('s avatar
Mr.奇淼( 已提交
226 227
      test: ""
    };
228
  },
Mr.奇淼('s avatar
Mr.奇淼( 已提交
229
  components: {
K
gengxin  
klausY 已提交
230 231
    icon
  },
232
  methods: {
Mr.奇淼('s avatar
Mr.奇淼( 已提交
233
    addParameter(form) {
234 235
      if (!form.parameters) {
        this.$set(form, "parameters", []);
Mr.奇淼('s avatar
Mr.奇淼( 已提交
236 237
      }
      form.parameters.push({
Mr.奇淼('s avatar
Mr.奇淼( 已提交
238 239 240 241 242 243 244 245
        type: "query",
        key: "",
        value: ""
      });
    },
    deleteParameter(parameters, index) {
      parameters.splice(index, 1);
    },
Mr.奇淼('s avatar
Mr.奇淼( 已提交
246
    changeName() {
Mr.奇淼('s avatar
Mr.奇淼( 已提交
247
      this.form.path = this.form.name;
248
    },
Mr.奇淼('s avatar
Mr.奇淼( 已提交
249 250 251
    setOptions() {
      this.menuOption = [
        {
Mr.奇淼('s avatar
Mr.奇淼( 已提交
252 253
          ID: "0",
          title: "根目录"
254
        }
Mr.奇淼('s avatar
Mr.奇淼( 已提交
255 256
      ];
      this.setMenuOptions(this.tableData, this.menuOption, false);
Mr.奇淼('s avatar
Mr.奇淼( 已提交
257 258 259 260
    },
    setMenuOptions(menuData, optionsData, disabled) {
      menuData &&
        menuData.map(item => {
Mr.奇淼('s avatar
Mr.奇淼( 已提交
261
          if (item.children && item.children.length) {
Mr.奇淼('s avatar
Mr.奇淼( 已提交
262 263 264 265 266
            const option = {
              title: item.meta.title,
              ID: String(item.ID),
              disabled: disabled || item.ID == this.form.ID,
              children: []
Mr.奇淼('s avatar
Mr.奇淼( 已提交
267
            };
Mr.奇淼('s avatar
Mr.奇淼( 已提交
268 269 270 271
            this.setMenuOptions(
              item.children,
              option.children,
              disabled || item.ID == this.form.ID
Mr.奇淼('s avatar
Mr.奇淼( 已提交
272 273
            );
            optionsData.push(option);
Mr.奇淼('s avatar
Mr.奇淼( 已提交
274 275 276 277 278
          } else {
            const option = {
              title: item.meta.title,
              ID: String(item.ID),
              disabled: disabled || item.ID == this.form.ID
Mr.奇淼('s avatar
Mr.奇淼( 已提交
279 280
            };
            optionsData.push(option);
281
          }
Mr.奇淼('s avatar
Mr.奇淼( 已提交
282
        });
283
    },
Mr.奇淼('s avatar
Mr.奇淼( 已提交
284
    handleClose(done) {
Mr.奇淼('s avatar
Mr.奇淼( 已提交
285 286
      this.initForm();
      done();
287
    },
288 289
    // 懒加载子菜单
    load(tree, treeNode, resolve) {
Mr.奇淼('s avatar
Mr.奇淼( 已提交
290 291 292
      resolve([
        {
          id: 31,
Mr.奇淼('s avatar
Mr.奇淼( 已提交
293 294 295
          date: "2016-05-01",
          name: "王小虎",
          address: "上海市普陀区金沙江路 1519 弄"
Mr.奇淼('s avatar
Mr.奇淼( 已提交
296 297 298
        },
        {
          id: 32,
Mr.奇淼('s avatar
Mr.奇淼( 已提交
299 300 301
          date: "2016-05-01",
          name: "王小虎",
          address: "上海市普陀区金沙江路 1519 弄"
Mr.奇淼('s avatar
Mr.奇淼( 已提交
302
        }
Mr.奇淼('s avatar
Mr.奇淼( 已提交
303
      ]);
Mr.奇淼('s avatar
Mr.奇淼( 已提交
304
    },
305
    // 删除菜单
Mr.奇淼('s avatar
Mr.奇淼( 已提交
306
    deleteMenu(ID) {
Mr.奇淼('s avatar
Mr.奇淼( 已提交
307 308 309 310
      this.$confirm("此操作将永久删除所有角色下该菜单, 是否继续?", "提示", {
        confirmButtonText: "确定",
        cancelButtonText: "取消",
        type: "warning"
311 312
      })
        .then(async () => {
Mr.奇淼('s avatar
Mr.奇淼( 已提交
313
          const res = await deleteBaseMenu({ ID });
314
          if (res.code == 0) {
Mr.奇淼('s avatar
Mr.奇淼( 已提交
315
            this.$message({
Mr.奇淼('s avatar
Mr.奇淼( 已提交
316 317 318
              type: "success",
              message: "删除成功!"
            });
319 320 321
            if (this.tableData.length == 1) {
              this.page--;
            }
Mr.奇淼('s avatar
Mr.奇淼( 已提交
322
            this.getTableData();
Mr.奇淼('s avatar
Mr.奇淼( 已提交
323
          }
324 325 326
        })
        .catch(() => {
          this.$message({
Mr.奇淼('s avatar
Mr.奇淼( 已提交
327 328 329 330
            type: "info",
            message: "已取消删除"
          });
        });
331
    },
332
    // 初始化弹窗内表格方法
333
    initForm() {
Mr.奇淼('s avatar
Mr.奇淼( 已提交
334 335
      this.checkFlag = false;
      this.$refs.menuForm.resetFields();
Mr.奇淼('s avatar
Mr.奇淼( 已提交
336 337
      this.form = {
        ID: 0,
Mr.奇淼('s avatar
Mr.奇淼( 已提交
338 339 340 341 342
        path: "",
        name: "",
        hidden: "",
        parentId: "",
        component: "",
Mr.奇淼('s avatar
Mr.奇淼( 已提交
343
        meta: {
Mr.奇淼('s avatar
Mr.奇淼( 已提交
344 345
          title: "",
          icon: "",
Mr.奇淼('s avatar
Mr.奇淼( 已提交
346
          defaultMenu: false,
Mr.奇淼('s avatar
Mr.奇淼( 已提交
347
          keepAlive: ""
Mr.奇淼('s avatar
Mr.奇淼( 已提交
348
        }
Mr.奇淼('s avatar
Mr.奇淼( 已提交
349
      };
350
    },
351
    // 关闭弹窗
352
    closeDialog() {
Mr.奇淼('s avatar
Mr.奇淼( 已提交
353 354
      this.initForm();
      this.dialogFormVisible = false;
355
    },
356
    // 添加menu
357
    async enterDialog() {
Mr.奇淼('s avatar
Mr.奇淼( 已提交
358 359
      this.$refs.menuForm.validate(async valid => {
        if (valid) {
Mr.奇淼('s avatar
Mr.奇淼( 已提交
360
          let res;
Mr.奇淼('s avatar
Mr.奇淼( 已提交
361
          if (this.isEdit) {
Mr.奇淼('s avatar
Mr.奇淼( 已提交
362
            res = await updateBaseMenu(this.form);
Mr.奇淼('s avatar
Mr.奇淼( 已提交
363
          } else {
Mr.奇淼('s avatar
Mr.奇淼( 已提交
364
            res = await addBaseMenu(this.form);
Mr.奇淼('s avatar
Mr.奇淼( 已提交
365
          }
366
          if (res.code == 0) {
Mr.奇淼('s avatar
Mr.奇淼( 已提交
367
            this.$message({
Mr.奇淼('s avatar
Mr.奇淼( 已提交
368 369 370 371
              type: "success",
              message: this.isEdit ? "编辑成功" : "添加成功!"
            });
            this.getTableData();
Mr.奇淼('s avatar
Mr.奇淼( 已提交
372
          }
Mr.奇淼('s avatar
Mr.奇淼( 已提交
373 374
          this.initForm();
          this.dialogFormVisible = false;
Mr.奇淼('s avatar
Mr.奇淼( 已提交
375
        }
Mr.奇淼('s avatar
Mr.奇淼( 已提交
376
      });
377
    },
378
    // 添加菜单方法,id为 0则为添加根菜单
379
    addMenu(id) {
Mr.奇淼('s avatar
Mr.奇淼( 已提交
380 381 382 383 384
      this.dialogTitle = "新增菜单";
      this.form.parentId = String(id);
      this.isEdit = false;
      this.setOptions();
      this.dialogFormVisible = true;
385
    },
386
    // 修改菜单方法
387
    async editMenu(id) {
Mr.奇淼('s avatar
Mr.奇淼( 已提交
388 389 390 391 392 393
      this.dialogTitle = "编辑菜单";
      const res = await getBaseMenuById({ id });
      this.form = res.data.menu;
      this.isEdit = true;
      this.setOptions();
      this.dialogFormVisible = true;
Mr.奇淼('s avatar
Mr.奇淼( 已提交
394
    }
Mr.奇淼('s avatar
Mr.奇淼( 已提交
395
  },
Mr.奇淼('s avatar
Mr.奇淼( 已提交
396
  async created() {
Mr.奇淼('s avatar
Mr.奇淼( 已提交
397 398
    this.pageSize = 999;
    await this.getTableData();
399
  }
Mr.奇淼('s avatar
Mr.奇淼( 已提交
400
};
401
</script>
402
<style scoped lang="scss">
403 404 405 406 407 408
.button-box {
  padding: 10px 20px;
  .el-button {
    float: right;
  }
}
K
yx  
klausY 已提交
409
.warning {
Mr.奇淼('s avatar
Mr.奇淼( 已提交
410
  color: #dc143c;
K
yx  
klausY 已提交
411
}
K
gengxin  
klausY 已提交
412
</style>