ModifyMenuDialog.vue 9.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247
  1. <template>
  2. <div class="modify-menu-wrap">
  3. <el-dialog
  4. :visible.sync="isShowMenuDialog"
  5. :close-on-click-modal="false"
  6. :modal-append-to-body='false'
  7. :title="form.MenuId?'编辑菜单':'添加菜单'"
  8. @close="$emit('close')"
  9. width="820px"
  10. v-dialogDrag
  11. center
  12. >
  13. <div class="dialog-container-wrap">
  14. <el-form :model="form" :rules="rules" label-width="80px" :hide-required-asterisk="true" ref="menuForm">
  15. <el-form-item label="菜单类型" prop="MenuType">
  16. <el-radio-group v-model="form.MenuType" :disabled="form.MenuId">
  17. <el-radio :label="0" :disabled="isMenuDisabled">菜单</el-radio>
  18. <el-radio :label="1" :disabled="isbtnDisabled">按钮</el-radio>
  19. <el-radio :label="2" :disabled="isbtnDisabled">字段</el-radio>
  20. </el-radio-group>
  21. </el-form-item>
  22. <el-form-item label="上级菜单" prop="ParentId">
  23. <el-cascader v-model="form.ParentId"
  24. :options="menuList"
  25. :props="menuProps"
  26. :disabled="openType==='add'?false:!(openType!=='add'&&form.MenuType===0&&form.treeLevel===1)"
  27. >
  28. </el-cascader>
  29. </el-form-item>
  30. <el-form-item :label="nameLabel" prop="Name">
  31. <el-input v-model="form.Name"></el-input>
  32. </el-form-item>
  33. <template v-if="form.MenuType===0">
  34. <el-form-item label="菜单图标" prop="Name" v-if="form.treeLevel===0">
  35. <div class="icon-wrap">
  36. <img :src="form.IconPath" v-if="form.IconPath">
  37. <el-button @click="isShowIconDialog = true">选择图标</el-button>
  38. </div>
  39. </el-form-item>
  40. <el-form-item label="路由地址" prop="Path">
  41. <el-input v-model="form.Path"></el-input>
  42. <el-tooltip effect="dark" content="页面跳转路径" placement="right">
  43. <span class="hint-text">
  44. <i class="el-icon-warning-outline"></i>
  45. </span>
  46. </el-tooltip>
  47. </el-form-item>
  48. <el-form-item label="组件地址" prop="Component">
  49. <el-input v-model="form.Component"></el-input>
  50. <el-tooltip effect="dark" content="代码中页面地址" placement="right">
  51. <span class="hint-text">
  52. <i class="el-icon-warning-outline"></i>
  53. </span>
  54. </el-tooltip>
  55. </el-form-item>
  56. </template>
  57. <el-form-item label="按钮ID" prop="ButtonCode" v-if="form.MenuType!==0">
  58. <el-input v-model="form.ButtonCode"></el-input>
  59. </el-form-item>
  60. <el-form-item label="显示排序" prop="Sort">
  61. <el-input v-model="form.Sort" type="number" :min="0"></el-input>
  62. </el-form-item>
  63. <el-form-item label="是否隐藏" prop="Hidden">
  64. <el-radio-group v-model="form.Hidden">
  65. <el-radio :label="0">显示</el-radio>
  66. <el-radio :label="1">隐藏</el-radio>
  67. </el-radio-group>
  68. </el-form-item>
  69. </el-form>
  70. <div class="btn-wrap" style="text-align: center;margin-bottom: 25px;">
  71. <el-button type="primary" plain style="width:200px;" @click="$emit('close')">取消</el-button>
  72. <el-button type="primary" style="margin-left:50px;width:200px;" @click="saveMenu">保存</el-button>
  73. </div>
  74. </div>
  75. </el-dialog>
  76. <ChoosedIconDialog
  77. :isShowIconDialog="isShowIconDialog"
  78. @save="(e)=>{form.IconPath = e;isShowIconDialog = false}"
  79. @close="isShowIconDialog = false"
  80. />
  81. </div>
  82. </template>
  83. <script>
  84. import ChoosedIconDialog from './ChoosedIconDialog.vue';
  85. export default {
  86. props: {
  87. formData: {
  88. type: Object,
  89. default: {}
  90. },
  91. isShowMenuDialog: {
  92. type: Boolean,
  93. default: false
  94. },
  95. etaMenu: {
  96. type: Array,
  97. default: []
  98. },
  99. openType: {
  100. type: String,
  101. default: 'add'
  102. }
  103. },
  104. data() {
  105. return {
  106. form: {
  107. MenuType: 0,
  108. ParentId: 0,
  109. Name: '',
  110. IconPath: '',
  111. Path: '',
  112. Component: '',
  113. Sort: 0,
  114. Hidden: 0,
  115. ButtonCode: '',
  116. treeLevel: 0
  117. },
  118. rules: {
  119. ParentId:[{required:true,message:'请选择上级菜单'}],
  120. Name:[{required:true,message:'请输入菜单标题'}],
  121. IconPath:[{required:true,message:'请选择菜单图标'}],
  122. Path:[{required:true,message:'请输入路由地址'}],
  123. Component:[{required:true,message:'请输入组件地址'}],
  124. Sort:[{required:true,message:'请输入显示排序'}],
  125. ButtonCode:[{required:true,message:'请输入按钮ID'}]
  126. },
  127. menuList: [{
  128. MenuId: -1,
  129. Name: '无'
  130. }],
  131. menuProps: {
  132. value: 'MenuId',
  133. label: 'Name',
  134. children: 'Children',
  135. checkStrictly: true,
  136. emitPath: false,
  137. },
  138. isShowIconDialog: false,
  139. };
  140. },
  141. watch: {
  142. isShowMenuDialog(newVal) {
  143. if (newVal) {
  144. this.form = this.$options.data().form;
  145. this.menuList = this.$options.data().menuList;
  146. this.initForm();
  147. this.$nextTick(()=>{
  148. this.$refs.menuForm&&this.$refs.menuForm.clearValidate();
  149. })
  150. }
  151. },
  152. 'form.MenuType': {
  153. handler(newVal) {
  154. this.changeListLevel(newVal);
  155. },
  156. deep: true
  157. }
  158. },
  159. computed: {
  160. //菜单类型-菜单 是否禁用
  161. isMenuDisabled() {
  162. return this.form.treeLevel > 1 && this.openType !== 'add';
  163. },
  164. //菜单类型-按钮、字段 是否禁用
  165. isbtnDisabled() {
  166. return this.form.treeLevel === 1 && this.openType !== 'add';
  167. },
  168. nameLabel(){
  169. const nameMap = {
  170. 0:'菜单标题',
  171. 1:'按钮名称',
  172. 2:'字段名称'
  173. }
  174. return nameMap[this.form.MenuType]||'菜单标题'
  175. },
  176. },
  177. methods: {
  178. initForm() {
  179. this.menuList = [...this.menuList, ..._.cloneDeep(this.etaMenu)];
  180. if (this.openType === 'addNext') {
  181. this.form.ParentId = this.formData.ParentId;
  182. this.form.treeLevel = this.formData.treeLevel;
  183. }
  184. if (this.openType === 'edit') {
  185. this.form = _.cloneDeep(this.formData);
  186. }
  187. if (this.form.treeLevel > 1 && this.openType !== 'edit') {
  188. this.form.MenuType = 1;
  189. }
  190. if(this.form.treeLevel===0 && this.openType !== 'add'){
  191. this.form.ParentId = -1
  192. }
  193. },
  194. saveMenu() {
  195. //检验表单
  196. this.$refs.menuForm.validate((valid)=>{
  197. if(valid){
  198. this.$emit(this.form.MenuId ? 'edit' : 'add', this.form);
  199. }
  200. })
  201. },
  202. changeListLevel(level) {
  203. if (level === 0) {
  204. this.menuList = this.menuList.map(m => {
  205. if (m.Children) {
  206. delete m.Children;
  207. }
  208. return m;
  209. });
  210. }
  211. else {
  212. this.menuList = [...this.$options.data().menuList, ..._.cloneDeep(this.etaMenu)];
  213. }
  214. }
  215. },
  216. components: { ChoosedIconDialog }
  217. };
  218. </script>
  219. <style lang="scss">
  220. .modify-menu-wrap{
  221. .dialog-container-wrap{
  222. display: flex;
  223. flex-direction: column;
  224. .el-form{
  225. align-self: center;
  226. .el-form-item{
  227. .el-input{
  228. width: 315px;
  229. }
  230. .icon-wrap{
  231. display: flex;
  232. align-items: center;
  233. img{
  234. width:24px;
  235. height: 24px;
  236. margin-right: 15px;
  237. }
  238. }
  239. }
  240. }
  241. }
  242. }
  243. </style>