x-php-Admin/src/views/system/menu/save.vue
2023-07-28 19:02:19 +08:00

208 lines
6.6 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<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="100px" label-position="left">
<el-form-item label="显示名称" prop="meta.title">
<el-input v-model="form.meta.title" clearable placeholder="菜单显示名字"></el-input>
</el-form-item>
<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>
</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">
<x-icon-select v-model="form.meta.icon" clearable></x-icon-select>
</el-form-item>
<el-form-item label="路由地址" prop="path">
<el-input v-model="form.path" clearable placeholder="路由地址"></el-input>
</el-form-item>
<el-form-item label="重定向" prop="redirect">
<el-input v-model="form.redirect" clearable placeholder="重定向"></el-input>
</el-form-item>
<el-form-item label="菜单高亮" prop="meta.active">
<el-input v-model="form.meta.active" clearable placeholder=""></el-input>
<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="maximize" v-if="form.meta.type=='iframe'">
<el-switch v-model="form.meta.maximize" />
</el-form-item>
<el-form-item label="表单名称" prop="tablename">
<el-input v-model="form.meta.tablename" clearable placeholder="表单名称,读取配置及表头"></el-input>
</el-form-item>
<el-form-item label="表头缓存" prop="tablecache">
<el-input v-model="form.meta.tablecache" clearable placeholder="表头缓存时间,留空不缓存"></el-input>
</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>
<x-form-table v-model="form.apilist" :addTemplate="apilistAddTemplate" placeholder="暂无匹配接口权限">
<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>
</x-form-table>
</el-col>
</template>
</el-row>
</template>
<script>
import xIconSelect from '@/components/xIconSelect'
export default {
components: {
xIconSelect
},
props: {
menu: { type: Object, default: () => {} },
},
data(){
return {
form: {
id: "",
parentid: "",
name: "",
path: "",
component: "",
redirect: "",
meta:{
title: "",
icon: "",
active: "",
color: "",
type: "menu",
fullpage: false,
tag: "",
},
apilist: []
},
menuOptions: [],
menuProps: {
value: 'id',
label: 'title',
checkStrictly: true
},
predefineColors: [
'#ff4500',
'#ff8c00',
'#ffd700',
'#67C23A',
'#00ced1',
'#409EFF',
'#c71585'
],
rules: [],
apilistAddTemplate: {
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,
parentid: item.parentid,
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
let obj = Object.assign({}, this.form);
delete obj.children;
var res = await this.$http.post('menu/submit',obj)
this.loading = false
if(res.code == 200){
this.$message.success("保存成功")
}else{
this.$message.warning(res.message)
}
},
//表单注入数据
setData(data, pid){
this.form = data
this.form.apilist = data.apilist || []
this.form.parentid = pid
}
}
}
</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>