x-php-Admin/src/views/system/menu/save.vue

195 lines
6.0 KiB
Vue
Raw Normal View History

2023-06-07 10:48:30 +00:00
<template>
<el-row :gutter="40">
<el-col v-if="!form.id">
<el-empty description="请选择左侧菜单后操作" :image-size="100"></el-empty>
</el-col>
<template v-else>
<el-col :lg="12">
<h2>{{form.meta.title || "新增菜单"}}</h2>
<el-form :model="form" :rules="rules" ref="dialogForm" label-width="80px" label-position="left">
<el-form-item label="显示名称" prop="meta.title">
<el-input v-model="form.meta.title" clearable placeholder="菜单显示名字"></el-input>
</el-form-item>
2023-06-16 08:39:46 +00:00
<el-form-item label="上级菜单" prop="parentid">
<el-cascader v-model="form.parentid" :options="menuOptions" :props="menuProps" :show-all-levels="false" placeholder="顶级菜单" clearable disabled></el-cascader>
2023-06-07 10:48:30 +00:00
</el-form-item>
<el-form-item label="类型" prop="meta.type">
<el-radio-group v-model="form.meta.type">
<el-radio-button label="menu">菜单</el-radio-button>
<el-radio-button label="iframe">Iframe</el-radio-button>
<el-radio-button label="link">外链</el-radio-button>
<el-radio-button label="button">按钮</el-radio-button>
</el-radio-group>
</el-form-item>
<el-form-item label="别名" prop="name">
<el-input v-model="form.name" clearable placeholder="菜单别名"></el-input>
<div class="el-form-item-msg">系统唯一且与内置组件名一致否则导致缓存失效如类型为Iframe的菜单别名将代替源地址显示在地址栏</div>
</el-form-item>
<el-form-item label="菜单图标" prop="meta.icon">
<sc-icon-select v-model="form.meta.icon" clearable></sc-icon-select>
</el-form-item>
<el-form-item label="路由地址" prop="path">
2023-06-16 08:39:46 +00:00
<el-input v-model="form.path" clearable placeholder="路由地址"></el-input>
2023-06-07 10:48:30 +00:00
</el-form-item>
<el-form-item label="重定向" prop="redirect">
2023-06-16 08:39:46 +00:00
<el-input v-model="form.redirect" clearable placeholder="重定向"></el-input>
2023-06-07 10:48:30 +00:00
</el-form-item>
2023-06-16 08:39:46 +00:00
<el-form-item label="菜单高亮" prop="meta.active">
<el-input v-model="form.meta.active" clearable placeholder=""></el-input>
2023-06-07 10:48:30 +00:00
<div class="el-form-item-msg">子节点或详情页需要高亮的上级菜单路由地址</div>
</el-form-item>
<el-form-item label="视图" prop="component">
<el-input v-model="form.component" clearable placeholder="">
<template #prepend>views/</template>
</el-input>
<div class="el-form-item-msg">如父节点链接或Iframe等没有视图的菜单不需要填写</div>
</el-form-item>
<el-form-item label="颜色" prop="color">
<el-color-picker v-model="form.meta.color" :predefine="predefineColors"></el-color-picker>
</el-form-item>
<el-form-item label="是否隐藏" prop="meta.hidden">
<el-checkbox v-model="form.meta.hidden">隐藏菜单</el-checkbox>
<el-checkbox v-model="form.meta.hiddenBreadcrumb">隐藏面包屑</el-checkbox>
<div class="el-form-item-msg">菜单不显示在导航中但用户依然可以访问例如详情页</div>
</el-form-item>
<el-form-item label="整页路由" prop="fullpage">
<el-switch v-model="form.meta.fullpage" />
</el-form-item>
<el-form-item label="标签" prop="tag">
<el-input v-model="form.meta.tag" clearable placeholder=""></el-input>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="save" :loading="loading"> </el-button>
</el-form-item>
</el-form>
</el-col>
<el-col :lg="12" class="apilist">
<h2>接口权限</h2>
2023-06-16 08:39:46 +00:00
<sc-form-table v-model="form.apilist" :addTemplate="apilistAddTemplate" placeholder="暂无匹配接口权限">
2023-06-07 10:48:30 +00:00
<el-table-column prop="code" label="标识" width="150">
<template #default="scope">
<el-input v-model="scope.row.code" placeholder="请输入内容"></el-input>
</template>
</el-table-column>
<el-table-column prop="url" label="Api url">
<template #default="scope">
<el-input v-model="scope.row.url" placeholder="请输入内容"></el-input>
</template>
</el-table-column>
</sc-form-table>
</el-col>
</template>
</el-row>
</template>
<script>
import scIconSelect from '@/components/scIconSelect'
export default {
components: {
scIconSelect
},
props: {
menu: { type: Object, default: () => {} },
},
data(){
return {
form: {
id: "",
2023-06-16 08:39:46 +00:00
parentid: "",
2023-06-07 10:48:30 +00:00
name: "",
path: "",
component: "",
redirect: "",
meta:{
title: "",
icon: "",
active: "",
color: "",
type: "menu",
fullpage: false,
tag: "",
},
2023-06-16 08:39:46 +00:00
apilist: []
2023-06-07 10:48:30 +00:00
},
menuOptions: [],
menuProps: {
value: 'id',
label: 'title',
checkStrictly: true
},
predefineColors: [
'#ff4500',
'#ff8c00',
'#ffd700',
'#67C23A',
'#00ced1',
'#409EFF',
'#c71585'
],
rules: [],
2023-06-16 08:39:46 +00:00
apilistAddTemplate: {
2023-06-07 10:48:30 +00:00
code: "",
url: ""
},
loading: false
}
},
watch: {
menu: {
handler(){
this.menuOptions = this.treeToMap(this.menu)
},
deep: true
}
},
mounted() {
},
methods: {
//简单化菜单
treeToMap(tree){
const map = []
tree.forEach(item => {
var obj = {
id: item.id,
2023-06-16 08:39:46 +00:00
parentid: item.parentid,
2023-06-07 10:48:30 +00:00
title: item.meta.title,
children: item.children&&item.children.length>0 ? this.treeToMap(item.children) : null
}
map.push(obj)
})
return map
},
//保存
async save(){
this.loading = true
2023-06-16 08:39:46 +00:00
var res = await this.$http.post('system/menu/submit',this.form)
2023-06-07 10:48:30 +00:00
this.loading = false
if(res.code == 200){
this.$message.success("保存成功")
}else{
this.$message.warning(res.message)
}
},
//表单注入数据
setData(data, pid){
this.form = data
2023-06-16 08:39:46 +00:00
this.form.apilist = data.apilist || []
this.form.parentid = pid
2023-06-07 10:48:30 +00:00
}
}
}
</script>
<style scoped>
h2 {font-size: 17px;color: #3c4a54;padding:0 0 30px 0;}
.apilist {border-left: 1px solid #eee;}
[data-theme="dark"] h2 {color: #fff;}
[data-theme="dark"] .apilist {border-color: #434343;}
</style>