menu-edit.vue 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244
  1. <!-- 编辑弹窗 -->
  2. <template>
  3. <ele-modal width="720px" :visible="visible" :close-on-click-modal="false" custom-class="ele-dialog-form"
  4. :title="isUpdate ? '修改菜单' : '添加菜单'" @update:visible="updateVisible">
  5. <el-form ref="form" :model="form" :rules="rules" label-width="100px">
  6. <el-row>
  7. <el-col :span="12">
  8. <el-form-item label="上级菜单:">
  9. <ele-tree-select clearable v-model="form.parentId" :data="menuList" label-key="name" value-key="id"
  10. default-expand-all placeholder="请选择上级菜单" />
  11. </el-form-item>
  12. </el-col>
  13. <el-col :span="12">
  14. <el-form-item label="菜单名称:" prop="name">
  15. <el-input clearable v-model="form.name" placeholder="请输入菜单名称" />
  16. </el-form-item>
  17. </el-col>
  18. <el-col :span="12">
  19. <el-form-item label="路由地址:" prop="url">
  20. <el-input clearable v-model="form.url" placeholder="请输入路由地址" />
  21. </el-form-item>
  22. </el-col>
  23. <el-col :span="12">
  24. <el-form-item label="组件地址:" prop="component">
  25. <el-input clearable v-model="form.component" placeholder="请输入路由地址" />
  26. </el-form-item>
  27. </el-col>
  28. <el-col :span="12">
  29. <el-form-item label="权限编码:" prop="permissionCode">
  30. <el-input clearable v-model="form.permissionCode" placeholder="请输入路由地址" />
  31. </el-form-item>
  32. </el-col>
  33. <el-col :span="12">
  34. <el-form-item v-if="form.rootId != -1" label="菜单图标:">
  35. <ele-icon-picker v-model="form.icon" placeholder="请选择菜单图标" :disabled="form.type === 2" />
  36. </el-form-item>
  37. <el-form-item v-if="form.rootId == -1" label="菜单图标:">
  38. <el-input clearable v-model="form.icon" placeholder="请输入pda图标" />
  39. </el-form-item>
  40. </el-col>
  41. <el-col :span="12">
  42. <el-form-item label="排序号:" prop="sort">
  43. <el-input-number :min="0" v-model="form.sort" placeholder="请输入排序号" controls-position="right"
  44. class="ele-fluid ele-text-left" />
  45. </el-form-item>
  46. </el-col>
  47. <el-col :span="12">
  48. <el-form-item label="菜单类型:" prop="type">
  49. <el-radio-group v-model="form.type" @change="onMenuTypeChange">
  50. <el-radio :label="1">菜单</el-radio>
  51. <el-radio :label="2">按钮</el-radio>
  52. </el-radio-group>
  53. </el-form-item>
  54. </el-col>
  55. </el-row>
  56. <!-- <div style="margin: 6px 0 28px 0">
  57. <el-divider />
  58. </div> -->
  59. </el-form>
  60. <template v-slot:footer>
  61. <el-button @click="updateVisible(false)">取消</el-button>
  62. <el-button type="primary" :loading="loading" @click="save">
  63. 保存
  64. </el-button>
  65. </template>
  66. </ele-modal>
  67. </template>
  68. <script>
  69. import { EleIconPicker } from 'ele-admin';
  70. import { saveOrUpdate } from '@/api/system/menu';
  71. export default {
  72. components: { EleIconPicker },
  73. props: {
  74. // 弹窗是否打开
  75. visible: Boolean,
  76. // 修改回显的数据
  77. data: Object,
  78. // 上级菜单id
  79. parentId: [Number, String],
  80. // 全部菜单数据
  81. menuList: Array
  82. },
  83. data() {
  84. const defaultForm = {
  85. id: null,
  86. parentId: '',
  87. name: '',
  88. type: 1,
  89. icon: '',
  90. url: '/',
  91. component: '',
  92. sort: null,
  93. rootId: null,
  94. permissionCode: 1
  95. };
  96. return {
  97. defaultForm,
  98. // 表单数据
  99. form: { ...defaultForm },
  100. // 表单验证规则
  101. rules: {
  102. name: [
  103. { required: true, message: '请输入菜单名称', trigger: 'blur' }
  104. ],
  105. sort: [{ required: true, message: '请输入排序号', trigger: 'blur' }],
  106. url: [{ required: true, message: '请输入菜单路由', trigger: 'blur' }],
  107. type: [{ required: true, message: '请选择菜单类型', trigger: 'blur' }]
  108. },
  109. // 提交状态
  110. loading: false,
  111. // 是否是修改
  112. isUpdate: false
  113. };
  114. },
  115. computed: {
  116. // pathPlaceholder() {
  117. // return this.form.openType === 2 ? '请输入外链地址' : '请输入路由地址';
  118. // },
  119. // componentPlaceholder() {
  120. // return this.form.openType === 1 ? '请输入内链地址' : '请输入组件路径';
  121. // },
  122. // // 是否开启响应式布局
  123. // styleResponsive() {
  124. // return this.$store.state.theme.styleResponsive;
  125. // }
  126. },
  127. methods: {
  128. /* 保存编辑 */
  129. save() {
  130. this.$refs.form.validate((valid) => {
  131. if (!valid) {
  132. return false;
  133. }
  134. this.loading = true;
  135. const data = {
  136. ...this.form,
  137. // menuType 对应的值与后端不一致在前端处理
  138. // type: this.form.type === 2 ? 1 : 0,
  139. parentId: this.form.parentId || 0
  140. };
  141. // const saveOrUpdate = this.isUpdate ? updateMenu : addMenu;
  142. if (!this.isUpdate) {
  143. delete data.id;
  144. }
  145. saveOrUpdate(data)
  146. .then((res) => {
  147. this.loading = false;
  148. if (this.isUpdate) {
  149. this.$message.success('菜单编辑成功');
  150. } else {
  151. this.$message.success('菜单新增成功');
  152. }
  153. this.updateVisible(false);
  154. this.$emit('done');
  155. })
  156. .catch((e) => {
  157. this.loading = false;
  158. // this.$message.error(e.message);
  159. });
  160. });
  161. },
  162. /* 更新visible */
  163. updateVisible(value) {
  164. this.$emit('update:visible', value);
  165. },
  166. /* menuType选择改变 */
  167. onMenuTypeChange() {
  168. // if (this.form.menuType === 0) {
  169. // this.form.authority = null;
  170. // this.form.openType = 0;
  171. // this.form.component = null;
  172. // } else if (this.form.menuType === 1) {
  173. // if (this.form.openType === 2) {
  174. // this.form.authority = null;
  175. // }
  176. // } else {
  177. // this.form.openType = 0;
  178. // this.form.icon = null;
  179. // this.form.path = null;
  180. // this.form.component = null;
  181. // this.form.hide = 0;
  182. // }
  183. },
  184. /* openType选择改变 */
  185. onOpenTypeChange() {
  186. if (this.form.openType === 2) {
  187. this.form.component = null;
  188. this.form.authority = null;
  189. }
  190. }
  191. /* 判断是否是外链 */
  192. // isUrl(url) {
  193. // return !!(
  194. // url &&
  195. // (url.startsWith('http://') ||
  196. // url.startsWith('https://') ||
  197. // url.startsWith('//'))
  198. // );
  199. // },
  200. /* 判断是否是目录 */
  201. // isDirectory(d) {
  202. // return !!d.children?.length && !d.component;
  203. // }
  204. },
  205. watch: {
  206. visible(visible) {
  207. if (visible) {
  208. if (this.data) {
  209. // const isInnerLink = this.isUrl(this.data.component) ? 1 : 0;
  210. // menuType 对应的值与后端不一致在前端处理
  211. // const menuType =
  212. // this.data.type === 1
  213. // ? 2
  214. // : this.isDirectory(this.data)
  215. // ? 0
  216. // : 1;
  217. this.$util.assignObject(this.form, {
  218. ...this.data,
  219. // openType: this.isUrl(this.data.path) ? 2 : isInnerLink,
  220. parentId: this.data.parentId == 0 ? '' : this.data.parentId ?? ''
  221. });
  222. this.isUpdate = true;
  223. } else {
  224. this.form.parentId = this.parentId ?? '';
  225. this.isUpdate = false;
  226. }
  227. } else {
  228. this.$refs.form.clearValidate();
  229. this.form = { ...this.defaultForm };
  230. }
  231. }
  232. }
  233. };
  234. </script>