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 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%">
K
gengxin  
klausY 已提交
73 74 75 76 77
          <!--<el-input autocomplete="off" v-model="form.meta.icon">

          </el-input>-->
          <template slot="prepend">el-icon-</template>
          <icon></icon>
78
        </el-form-item>
Mr.奇淼('s avatar
Mr.奇淼( 已提交
79
        <el-form-item label="排序标记" prop="sort" style="width:30%">
80
          <el-input autocomplete="off" v-model.number="form.sort"></el-input>
81
        </el-form-item>
Mr.奇淼('s avatar
Mr.奇淼( 已提交
82
        <el-form-item label="keepAlive" prop="meta.keepAlive" style="width:30%">
83 84 85 86 87
          <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>
88
      </el-form>
Mr.奇淼('s avatar
Mr.奇淼( 已提交
89
      <div class="warning">新增菜单需要在角色管理内配置权限才可使用</div>
90 91 92 93 94 95
      <div class="dialog-footer" slot="footer">
        <el-button @click="closeDialog">取 消</el-button>
        <el-button @click="enterDialog" type="primary">确 定</el-button>
      </div>
    </el-dialog>
  </div>
96 97 98
</template>

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

101
import {
R
rainyan 已提交
102
  updateBaseMenu,
103 104 105 106
  getMenuList,
  addBaseMenu,
  deleteBaseMenu,
  getBaseMenuById
Mr.奇淼('s avatar
Mr.奇淼( 已提交
107 108
} from "@/api/menu";
import infoList from "@/components/mixins/infoList";
K
gengxin  
klausY 已提交
109
import icon from '@/view/superAdmin/menu/icon';
110
export default {
Mr.奇淼('s avatar
Mr.奇淼( 已提交
111
  name: "Menus",
112
  mixins: [infoList],
113 114
  data() {
    return {
115
      listApi: getMenuList,
116
      dialogFormVisible: false,
Mr.奇淼('s avatar
Mr.奇淼( 已提交
117 118
      dialogTitle: "新增菜单",
      menuOption: [
119
        {
Mr.奇淼('s avatar
Mr.奇淼( 已提交
120 121
          ID: "0",
          title: "根菜单"
122 123
        }
      ],
124
      form: {
125
        ID: 0,
Mr.奇淼('s avatar
Mr.奇淼( 已提交
126 127 128 129 130
        path: "",
        name: "",
        hidden: "",
        parentId: "",
        component: "",
131
        meta: {
Mr.奇淼('s avatar
Mr.奇淼( 已提交
132 133 134 135
          title: "",
          icon: "",
          defaultMenu: false,
          keepAlive: false
136
        }
Mr.奇淼('s avatar
Mr.奇淼( 已提交
137
      },
Mr.奇淼('s avatar
Mr.奇淼( 已提交
138
      rules: {
Mr.奇淼('s avatar
Mr.奇淼( 已提交
139
        path: [{ required: true, message: "请输入菜单name", trigger: "blur" }],
Mr.奇淼('s avatar
Mr.奇淼( 已提交
140
        component: [
Mr.奇淼('s avatar
Mr.奇淼( 已提交
141
          { required: true, message: "请输入文件路径", trigger: "blur" }
Mr.奇淼('s avatar
Mr.奇淼( 已提交
142
        ],
Mr.奇淼('s avatar
Mr.奇淼( 已提交
143 144
        "meta.title": [
          { required: true, message: "请输入菜单展示名称", trigger: "blur" }
Mr.奇淼('s avatar
Mr.奇淼( 已提交
145 146
        ]
      },
147
      isEdit: false
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>