menu.vue 9.0 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
      <el-form :inline="true" :model="form" :rules="rules" label-width="85px" ref="menuForm">
        <el-form-item label="路由name" prop="path">
41
          <el-input autocomplete="off" placeholder="唯一英文字符串" v-model="form.path"></el-input>
42 43 44 45 46 47 48 49
        </el-form-item>
        <el-form-item label="是否隐藏">
          <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>
        <el-form-item label="父节点Id">
50 51 52 53 54 55 56 57 58 59 60 61 62 63 64
           <el-select
            placeholder="请选择"
            v-model="form.parentId"
            :disabled="!this.isEdit"
            filterable 
          >
            <el-option
              :disabled="canSelect(item)"
              :key="item.ID"
              :label="item.title"
              :value="item.ID"
              v-for="item in menuOption"
            >
            </el-option>
          </el-select>
65
        </el-form-item>
Mr.奇淼('s avatar
Mr.奇淼( 已提交
66
        <el-form-item label="文件路径" prop="component">
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">
70 71
          <el-input autocomplete="off" v-model="form.meta.title"></el-input>
        </el-form-item>
72
        <el-form-item label="图标" prop="meta.icon">
73 74
          <el-input autocomplete="off" v-model="form.meta.icon"></el-input>
        </el-form-item>
75
        <el-form-item label="排序标记" prop="sort">
76
          <el-input autocomplete="off" v-model.number="form.sort"></el-input>
77
        </el-form-item>
78 79 80 81 82 83
        <el-form-item label="keepAlive" prop="meta.keepAlive">
          <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>
84
      </el-form>
Mr.奇淼('s avatar
Mr.奇淼( 已提交
85
      <div class="warning">新增菜单需要在角色管理内配置权限才可使用</div>
86 87 88 89 90 91
      <div class="dialog-footer" slot="footer">
        <el-button @click="closeDialog">取 消</el-button>
        <el-button @click="enterDialog" type="primary">确 定</el-button>
      </div>
    </el-dialog>
  </div>
92 93 94
</template>

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

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