menu.vue 9.7 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
        <template slot-scope="scope">
Mr.奇淼('s avatar
Mr.奇淼( 已提交
26
          <i :class="`el-icon-${scope.row.meta.icon}`"></i>
27 28 29
          <span>{{scope.row.meta.icon}}</span>
        </template>
      </el-table-column>
Mr.奇淼('s avatar
Mr.奇淼( 已提交
30
      <el-table-column fixed="right" label="操作" width="300">
31
        <template slot-scope="scope">
Mr.奇淼('s avatar
Mr.奇淼( 已提交
32
          <el-button @click="deleteMenu(scope.row.ID)" size="small" type="text">删除菜单</el-button>
Mr.奇淼('s avatar
Mr.奇淼( 已提交
33
          <el-button @click="editMenu(scope.row.ID)" size="small" type="text">编辑菜单</el-button>
34 35 36 37 38
          <el-button @click="addMenu(scope.row.ID)" size="small" type="text">添加子菜单</el-button>
        </template>
      </el-table-column>
    </el-table>

39
    <el-dialog :before-close="handleClose" :visible.sync="dialogFormVisible" :title="dialogTitle">
Mr.奇淼('s avatar
Mr.奇淼( 已提交
40 41 42 43 44 45 46 47 48
      <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%">
49
          <el-input autocomplete="off" placeholder="唯一英文字符串" v-model="form.path"></el-input>
50
        </el-form-item>
Mr.奇淼('s avatar
Mr.奇淼( 已提交
51
        <el-form-item label="是否隐藏" style="width:30%">
52 53 54 55 56
          <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.奇淼( 已提交
57 58 59 60 61 62 63 64 65
        <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>
66
        </el-form-item>
Mr.奇淼('s avatar
Mr.奇淼( 已提交
67
        <el-form-item label="文件路径" prop="component" style="width:30%">
68 69
          <el-input autocomplete="off" v-model="form.component"></el-input>
        </el-form-item>
Mr.奇淼('s avatar
Mr.奇淼( 已提交
70
        <el-form-item label="展示名称" prop="meta.title" style="width:30%">
71 72
          <el-input autocomplete="off" v-model="form.meta.title"></el-input>
        </el-form-item>
Mr.奇淼('s avatar
Mr.奇淼( 已提交
73
        <el-form-item label="图标" prop="meta.icon" style="width:30%">
Mr.奇淼('s avatar
Mr.奇淼( 已提交
74
          <icon :meta="form.meta">
K
klausY 已提交
75 76
            <template slot="prepend" >el-icon-</template>
          </icon>
77
        </el-form-item>
Mr.奇淼('s avatar
Mr.奇淼( 已提交
78
        <el-form-item label="排序标记" prop="sort" style="width:30%">
79
          <el-input autocomplete="off" v-model.number="form.sort"></el-input>
80
        </el-form-item>
Mr.奇淼('s avatar
Mr.奇淼( 已提交
81
        <el-form-item label="keepAlive" prop="meta.keepAlive" style="width:30%">
82 83 84 85 86
          <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>
87
      </el-form>
Mr.奇淼('s avatar
Mr.奇淼( 已提交
88
      <div class="warning">新增菜单需要在角色管理内配置权限才可使用</div>
89 90 91 92 93 94
      <div class="dialog-footer" slot="footer">
        <el-button @click="closeDialog">取 消</el-button>
        <el-button @click="enterDialog" type="primary">确 定</el-button>
      </div>
    </el-dialog>
  </div>
95 96 97
</template>

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

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