123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562 |
- /* eslint-disable */
- <template>
- <a-modal
- title="新增菜单"
- :width="1000"
- :visible="visible"
- :confirmLoading="confirmLoading"
- @ok="handleSubmit"
- @cancel="handleCancel"
- :destroyOnClose=true
- >
- <a-spin :spinning="formLoading">
- <a-form :form="form" >
- <a-row :gutter="24">
- <a-col :md="12" :sm="24">
- <a-form-item
- label="菜单名称"
- :labelCol="labelCol"
- :wrapperCol="wrapperCol"
- hasFeedback
- >
- <a-input placeholder="请输入菜单名称" v-decorator="['name',{rules: [{required: true, min: 1, message: '请输入菜单名称!'}]}]" />
- </a-form-item>
- </a-col>
- <a-col :md="12" :sm="24">
- <a-form-item
- style="width: 100%"
- :labelCol="labelCol"
- :wrapperCol="wrapperCol"
- label="菜单编号"
- hasFeedback
- >
- <a-input placeholder="请输入菜单编号" v-decorator="['code', {rules: [{required: true, min: 1, message: '请输入菜单编号!'}]}]" />
- </a-form-item>
- </a-col>
- </a-row>
- <a-row :gutter="24">
- <a-col :md="12" :sm="24">
- <a-form-item
- :labelCol="labelCol"
- :wrapperCol="wrapperCol"
- label="所属应用"
- has-feedback
- >
- <a-select style="width: 100%" placeholder="请选择应用分类" v-decorator="['application', {rules: [{ required: true, message: '请选择应用分类!' }]}]" >
- <a-select-option v-for='(item,index) in appData' :key="index" :value="item.code" @click="changeApplication(item.code)">{{item.name}}</a-select-option>
- </a-select>
- </a-form-item>
- </a-col>
- <a-col :md="12" :sm="24">
- <a-form-item
- :labelCol="labelCol"
- :wrapperCol="wrapperCol"
- label="菜单层级"
- >
- <a-radio-group v-decorator="['type',{rules: [{ required: true, message: '请选择菜单层级!' }]}]" >
- <a-radio v-for='(item,index) in typeData' :key="index" :value="item.code" @click="meneTypeFunc(item.code)">{{item.value}}</a-radio>
- </a-radio-group>
- </a-form-item>
- </a-col>
- </a-row>
- <a-row :gutter="24">
- <a-col :md="12" :sm="24">
- <div v-show="pidShow">
- <a-form-item
- :labelCol="labelCol"
- :wrapperCol="wrapperCol"
- label="父级菜单"
- has-feedback
- >
- <a-tree-select
- v-decorator="['pid', {rules: [{ required: true, message: '请选择父级菜单!' }]}]"
- style="width: 100%"
- :dropdownStyle="{ maxHeight: '300px', overflow: 'auto' }"
- :treeData="menuTreeData"
- placeholder="请选择父级菜单"
- treeDefaultExpandAll
- >
- <span slot="title" slot-scope="{ id }">{{ id }}
- </span>
- </a-tree-select>
- </a-form-item>
- </div>
- <div v-show="redirectShow">
- <a-form-item
- :labelCol="labelCol"
- :wrapperCol="wrapperCol"
- >
- <span slot="label">
- <a-tooltip title="如需打开首页加载此目录下菜单,请填写加载菜单路由,设为首页后其他设置的主页将被替代">
- <a-icon type="question-circle-o" />
- </a-tooltip>
- 重定向
- </span>
- <a-input prop="redirect" placeholder="请输入重定向地址" v-decorator="['redirect']" />
- </a-form-item>
- </div>
- </a-col>
- <a-col :md="12" :sm="24">
- <a-form-item
- :labelCol="labelCol"
- :wrapperCol="wrapperCol"
- >
- <span slot="label">
- <a-tooltip title="按钮:无,菜单:内链、外链、组件">
- <a-icon type="question-circle-o" />
- </a-tooltip>
- 打开方式
- </span>
- <a-radio-group :disabled="openTypeDisabled" v-decorator="['openType',{rules: [{ required: true, message: '请选择打开方式!' }]}]">
- <a-radio v-for='(item,index) in openTypeData' :key="index" :value="item.code" @click="meneOpenTypeFunc(item.code)">{{item.value}}</a-radio>
- </a-radio-group>
- </a-form-item>
- </a-col>
- </a-row>
- <a-divider />
- <a-row :gutter="24" >
- <a-col :md="12" :sm="24">
- <div v-show="componentShow">
- <a-form-item
- :labelCol="labelCol"
- :wrapperCol="wrapperCol"
- hasFeedback
- >
- <span slot="label">
- <a-tooltip title="前端vue组件 views文件夹下路径,例:system/menu/index。注:目录级填写:RouteView(不带面包屑),PageView(带面包屑),菜单级内链打开http链接填写:Iframe">
- <a-icon type="question-circle-o" />
- </a-tooltip>
- 前端组件
- </span>
- <a-input placeholder="请输入前端组件" :disabled="componentDisabled" prop="component" v-decorator="['component',{rules: [{required: componentRequired, message: '请输入前端组件'}]}]"/><!-- ,{rules: [{required: componentRequired, min: 1, message: '请输入前端组件!'}]} -->
- </a-form-item>
- </div>
- </a-col>
- <a-col :md="12" :sm="24">
- <div v-show="routerShow">
- <a-form-item
- :labelCol="labelCol"
- :wrapperCol="wrapperCol"
- hasFeedback
- >
- <span slot="label">
- <a-tooltip title="浏览器显示的URL,例:/menu,对应打开页面为菜单页面">
- <a-icon type="question-circle-o" />
- </a-tooltip>
- 路由地址
- </span>
- <a-input placeholder="请输入路由" v-decorator="['router', {rules: [{required: routerRequired, message: '请输入路由!'}]}]" />
- </a-form-item>
- </div>
- <div v-show="permissionShow">
- <a-form-item
- :labelCol="labelCol"
- :wrapperCol="wrapperCol"
- label="权限标识"
- hasFeedback
- >
- <a-input placeholder="请输入权限标识" v-decorator="['permission', {rules: [{required: permissionRequired, message: '请输入权限标识!'}]}]" />
- </a-form-item>
- </div>
- </a-col>
- </a-row>
- <a-row :gutter="24">
- <a-col :md="12" :sm="24">
- <div v-show="linkShow" >
- <a-form-item
- :labelCol="labelCol"
- :wrapperCol="wrapperCol"
- hasFeedback
- >
- <span slot="label">
- <a-tooltip title="当选择了需要内链或外链打开的选项,此处输入要打开的链接地址,例:https://www.stylefeng.cn">
- <a-icon type="question-circle-o" />
- </a-tooltip>
- 内外链地址
- </span>
- <a-input placeholder="请输入内链打开地址" :disabled="linkDisabled" v-decorator="['link', {rules: [{required: linkRequired, message: '请输入权限标识!'}]}]" />
- </a-form-item>
- </div>
- </a-col>
- <a-col :md="12" :sm="24">
- <div v-show="iconShow" >
- <a-form-item
- :labelCol="labelCol"
- :wrapperCol="wrapperCol"
- label="图标"
- >
- <a-input placeholder="请选择图标" disabled="disabled" v-decorator="['icon']" >
- <a-icon slot="addonAfter" @click="openIconSele()" type="setting" />
- </a-input>
- </a-form-item>
- </div>
- </a-col>
- </a-row>
- <a-row :gutter="24">
- <a-col :md="12" :sm="24">
- <a-form-item
- :labelCol="labelCol"
- :wrapperCol="wrapperCol"
- >
- <span slot="label">
- <a-tooltip title="系统权重:菜单可分配给任何角色,业务权重:菜单对超级管理员不可见">
- <a-icon type="question-circle-o" />
- </a-tooltip>
- 权重
- </span>
- <a-radio-group v-decorator="['weight']">
- <a-radio v-for='(item,index) in weightData' :key="index" :value="item.code" >{{item.value}}</a-radio>
- </a-radio-group>
- </a-form-item>
- </a-col>
- <a-col :md="12" :sm="24">
- <a-form-item
- :labelCol="labelCol"
- :wrapperCol="wrapperCol"
- label="是否可见"
- >
- <a-switch id="visible" checkedChildren="是" unCheckedChildren="否" v-decorator="['visible', { valuePropName: 'checked' }]"/><!-- defaultChecked -->
- </a-form-item>
- </a-col>
- </a-row>
- <a-row :gutter="24">
- <a-col :md="12" :sm="24">
- <a-form-item
- :labelCol="labelCol"
- :wrapperCol="wrapperCol"
- label="排序"
- >
- <a-input-number style="width: 100%" v-decorator="['sort', { initialValue: 100 }]" :min="1" :max="1000" />
- </a-form-item>
- </a-col>
- <a-col :md="12" :sm="24">
- <a-form-item
- :labelCol="labelCol"
- :wrapperCol="wrapperCol"
- label="备注"
- hasFeedback
- >
- <a-input placeholder="请输入备注" v-decorator="['remark']"></a-input>
- </a-form-item>
- </a-col>
- </a-row>
- </a-form>
- </a-spin>
- <a-modal
- :width="850"
- :visible="visibleIcon"
- @cancel="handleCancelIcon"
- footer=""
- :mask=false
- :closable=false
- :destroyOnClose=true
- >
- <icon-selector v-model="currentSelectedIcon" @change="handleIconChange"/>
- </a-modal>
- </a-modal>
- </template>
- <script>
- import { getAppList } from '@/api/modular/system/appManage'
- import { getMenuTree ,sysMenuAdd} from '@/api/modular/system/menuManage'
- import IconSelector from '@/components/IconSelector'
- import { sysDictTypeDropDown } from '@/api/modular/system/dictManage'
- export default {
- components: {IconSelector},
- data () {
- return {
- labelCol: {
- xs: { span: 24 },
- sm: { span: 6 }
- },
- wrapperCol: {
- xs: { span: 24 },
- sm: { span: 16 }
- },
- visibleIcon:false,
- visible: false,
- confirmLoading: false,
- appData:[],
- menuTreeData:[],
- redirectShow:true,
- componentShow:true,
- componentDisabled:false,
- componentRequired:true,
- routerRequired:true,
- routerShow:true,
- iconShow:true,
- openTypeShow:true,
- pidShow:true,
- permissionShow:true,
- permissionRequired:true,
- //图标组件
- currentSelectedIcon: 'pause-circle',
- typeData:[],
- openTypeData:[],
- weightData:[],
- formLoading:true,
- linkShow:true,
- openTypeDisabled:false,
- openTypeDefault:[],
- openType:'',
- linkRequired:true,
- linkDisabled:false,
- type:'',
- form: this.$form.createForm(this),
- }
- },
- methods: {
- //打开页面初始化
- add (type) {
- this.visible = true
- //图标
- this.currentSelectedIcon = type
- //默认选中菜单项,并初始化
- this.form.getFieldDecorator('type',{valuePropName:'checked',initialValue:'1'})
- this.meneTypeFunc('1')
- //默认选中的单选框
- //this.form.getFieldDecorator('type',{valuePropName:'checked',initialValue:'1'})
- this.form.getFieldDecorator('weight',{valuePropName:'checked',initialValue:'2'})
- this.form.getFieldDecorator('visible',{initialValue:true})
- //获取系统应用列表
- this.getSysApplist();
- this.sysDictTypeDropDown()
- },
- /**
- * 获取字典数据
- */
- sysDictTypeDropDown(){
- this.formLoading=true
- //菜单类型
- sysDictTypeDropDown({code:'menu_type'}).then((res)=>{
- this.typeData=res.data
- })
- //权重
- sysDictTypeDropDown({code:'menu_weight'}).then((res)=>{
- this.weightData=res.data
- })
- //内外链
- sysDictTypeDropDown({code:'open_type'}).then((res)=>{
- this.openTypeData=res.data
- this.formLoading=false
- })
- },
- getSysApplist() {
- return getAppList().then((res) => {
- if (res.success) {
- this.appData=res.data
- } else {
- this.$message.warning(res.message)
- }
- })
- },
- changeApplication(value){
- getMenuTree({'application':value}).then((res) => {
- if (res.success) {
- this.form.resetFields(`pid`,[]);
- this.menuTreeData=[{
- "id": "-1",
- "parentId": "0",
- "title": "顶级",
- "value": "0",
- "pid": "0",
- "children":res.data
- }]
- } else {
- this.$message.warning(res.message)
- }
- })
- },
- /**
- * 选择菜单类型执行初始化表单变量
- */
- meneTypeFunc(type){
- this.type = type
- if(type=='0' || type=='1'){
- //内外链地址显示,给空值
- this.linkShow=true
- this.form.resetFields(`link`,[]);
- //图标选择显示
- this.iconShow=true
- //路由必填,设置空值,并显示
- this.routerRequired=true
- this.form.getFieldDecorator('router',{initialValue:''})
- this.routerShow=true
- //权限标识框隐藏,选填,给空值
- this.permissionShow=false
- this.permissionRequired =false
- this.form.getFieldDecorator('permission',{initialValue:''})
- //打开方式设置为组件 ,禁用选择方式
- this.openType = '1'
- this.form.getFieldDecorator('openType',{initialValue:this.openType = '1'})
- this.openTypeDisabled = false
- }
- if(type=='0'){
- //重定向展示,并给空
- this.redirectShow=true
- this.form.resetFields(`redirect`,[]);
- //组件默认为显示,设置可输入,给默认组件 PageView,验证必填
- this.componentShow=true
- this.componentDisabled=false
- this.form.getFieldDecorator('component',{initialValue:'PageView'})
- this.componentRequired=true
- //父级初始化顶级,并将其隐藏
- this.form.getFieldDecorator('pid',{initialValue:'0'})
- this.pidShow=false
- }else{
- if(type=='1'){
- //组件可以手输,取消值
- this.componentDisabled=false
- this.form.getFieldDecorator('component',{initialValue:''})
- }
- //重定向输入隐藏,并给空值
- this.redirectShow=false
- this.form.getFieldDecorator('redirect',{initialValue:''})
- //父级选择放开
- this.pidShow=true
- }
- if(type=='2'){
- //组件设置不填,不可输入,并给空(手输的跟设置的)
- this.componentRequired = false
- this.componentDisabled=true
- this.form.resetFields(`component`,[]);
- this.form.getFieldDecorator('component',{initialValue:''})
- //路由选填,设置空值,并隐藏
- this.routerRequired=true
- this.form.getFieldDecorator('router',{initialValue:''})
- this.routerShow=false
- //内外链地址隐藏,给空值
- this.linkShow=false
- this.form.getFieldDecorator('link',{initialValue:''})
- //权限标识框显示,必填,给空值
- this.permissionShow=true
- this.permissionRequired =true
- this.form.getFieldDecorator('permission',{initialValue:''})
- //图标选择隐藏,并给空
- this.iconShow=false
- this.form.getFieldDecorator('icon',{initialValue:''})
- //打开方式设置为无 ,禁用选择方式
- this.openType = '0'
- this.form.getFieldDecorator('openType',{initialValue:this.openType})
- this.openTypeDisabled = true
- //取消icon
- this.form.getFieldDecorator('icon',{initialValue:''})
- }
- this.meneOpenTypeFunc(this.openType)
- },
- /**
- * 选择打开方式执行方法
- */
- meneOpenTypeFunc(openType){
- this.form.resetFields(`openType`,openType);
- if(openType == '2' || openType == '3'){
- //点击内外链的时候保留原值,其他清空
- if(this.linkDisabled = false){
- this.form.resetFields(`link`,[]);
- }
- //设置内外链可手输,加验证
- this.linkDisabled = false
- this.linkRequired = true
- }else{
- //设置内外链不可手输,取消值,取消验证
- this.linkDisabled = true
- this.form.resetFields(`link`,[]);
- this.linkRequired = false
- }
- //另起一个分支
- if(openType == '3'){
- this.componentRequired = false
- this.componentDisabled=true
- this.form.resetFields(`component`,[]);
- this.form.getFieldDecorator('component',{initialValue:''})
- }else{
- this.componentRequired = true
- if(this.type == '1' || this.type == '2'){
- this.form.getFieldDecorator('component',{initialValue:''})
- }else{
- this.form.resetFields(`component`,[]);
- this.form.getFieldDecorator('component',{initialValue:'PageView'})
- }
- if(openType == '2'){
- //组件设置为 iframe
- this.form.resetFields(`component`,[]);
- this.form.getFieldDecorator('component',{initialValue:'Iframe'})
- }
- }
- if(this.type == '2'){
- if(openType == '0'){
- this.componentRequired = false
- this.routerRequired = false
- }
- }
- },
- openIconSele(){
- this.visibleIcon=true
- },
- handleIconChange(icon){
- this.form.getFieldDecorator('icon',{initialValue:icon})
- this.visibleIcon=false
- },
- handleCancelIcon(){
- this.visibleIcon=false
- },
- handleSubmit () {
- const { form: { validateFields } } = this
- this.confirmLoading = true
- validateFields((errors, values) => {
- if (!errors) {
- if(values.visible){
- values.visible='Y'
- }else{
- values.visible='N'
- }
- sysMenuAdd(values).then((res) => {
- this.confirmLoading = false
- if(res.success){
- this.$message.success('新增成功')
- this.$emit('ok', values)
- this.handleCancel ()
- }else{
- this.$message.error('新增失败:'+res.message)
- }
- }).finally((res) =>{
- this.confirmLoading = false
- })
- } else {
- this.confirmLoading = false
- }
- })
- },
- handleCancel () {
- this.form.resetFields();
- this.confirmLoading = false
- this.visible = false
- }
- },
- }
- </script>
|