足力健前端,vue版本

addOrEditMenu.vue 7.4KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226
  1. <template>
  2. <div v-loading="loading">
  3. <el-form ref="ruleForm" :model="ruleForm" :rules="rules" label-width="150px" class="">
  4. <el-form-item label="父级分类" prop="parentids">
  5. <el-cascader
  6. v-model="parentids"
  7. :options="menuDropDatas"
  8. :props="props"
  9. :placeholder="classificationReminder"
  10. clearable
  11. filterable
  12. change-on-select
  13. :disabled="judgmentAddEdit"
  14. style="width: 100%;"/>
  15. </el-form-item>
  16. <el-form-item label="菜单名称" prop="name">
  17. <el-input v-model="ruleForm.name" placeholder="请输入菜单名称"/>
  18. </el-form-item>
  19. <el-form-item label="菜单代码" prop="code">
  20. <el-input v-model="ruleForm.code" placeholder="请输入菜单代码"/>
  21. </el-form-item>
  22. <el-form-item label="菜单链接地址" prop="url">
  23. <el-input v-model="ruleForm.url" placeholder="请输入菜单链接地址"/>
  24. </el-form-item>
  25. <el-form-item label="排序编号" prop="sort">
  26. <el-input v-model="ruleForm.sort" placeholder="请输入排序编号"/>
  27. </el-form-item>
  28. <el-form-item label="菜单类型" prop="target">
  29. <el-radio-group v-model="ruleForm.target">
  30. <el-radio label="iframe">框架页</el-radio>
  31. <el-radio label="expand">无页面</el-radio>
  32. <el-radio label="open">弹出页</el-radio>
  33. <el-radio label="blank">新窗口</el-radio>
  34. </el-radio-group>
  35. </el-form-item>
  36. <el-form-item label="菜单图标" prop="imgUrl">
  37. <el-select v-model="ruleForm.imgUrl" filterable clearable placeholder="请选择菜单图标">
  38. <el-option v-for="item in iconDatas" :key="item.value" :label="item.label" :value="item.value">
  39. <svg-icon :icon-class="item.value" style="color: #409eff; margin-right: 5px;" />
  40. <span style="color: #8492a6; font-size: 13px">{{ item.label }}</span>
  41. </el-option>
  42. </el-select>
  43. </el-form-item>
  44. <el-form-item label="是否启用" prop="flag">
  45. <el-switch v-model="ruleForm.flag" active-value="1" inactive-value="0"/>
  46. </el-form-item>
  47. <el-form-item label="菜单介绍" prop="remark">
  48. <el-input v-model="ruleForm.remark" type="textarea" autosize placeholder="请输入菜单介绍"/>
  49. </el-form-item>
  50. <el-form-item>
  51. <el-button type="primary" @click="submitForm">保存</el-button>
  52. <el-button @click="resetForm">重置</el-button>
  53. </el-form-item>
  54. </el-form>
  55. </div>
  56. </template>
  57. <script>
  58. import { getMenuDrop, addMenu, getMenu, editMenu } from '@/api/systemSetup/roleSetting/menuSetup'
  59. import { iconDatas } from '../iconDatas.js'
  60. import { validateSort } from '@/utils/validate'
  61. import { filterContent } from '@/utils'
  62. const validateSortRule = (rule, value, callback) => {
  63. if (!validateSort(value)) {
  64. callback(new Error('请输入有效的排序编号(正整数、负整数、0)'))
  65. } else {
  66. callback()
  67. }
  68. }
  69. export default {
  70. name: 'AddOrEditMenu',
  71. props: {
  72. rowid: {
  73. type: String,
  74. default: ''
  75. },
  76. parentidArr: {
  77. type: Array,
  78. default: () => ['000000000000000000000000'] // 父级ID,无父级ID为'000000000000000000000000'
  79. },
  80. layerid: {
  81. type: String,
  82. default: ''
  83. }
  84. },
  85. data() {
  86. return {
  87. ruleForm: {
  88. id: '', // 当前选择节点ID
  89. parentid: '', // 父级ID,无父级ID为'000000000000000000000000'
  90. name: '', // 菜单名称
  91. code: '', // 编码
  92. url: '', // 链接地址
  93. target: 'iframe', // 菜单类型
  94. flag: '1', // 1为启用,0不启用
  95. sort: '0', // 排列序号
  96. imgUrl: 'shouye', // icon
  97. remark: '' // 备注信息
  98. },
  99. rules: {
  100. name: [{
  101. required: true,
  102. message: '请输入菜单名称',
  103. trigger: 'blur'
  104. }],
  105. code: [{
  106. required: true,
  107. message: '请输入菜单代码',
  108. trigger: 'blur'
  109. }],
  110. url: [{
  111. required: true,
  112. message: '请输入菜单链接',
  113. trigger: 'blur'
  114. }],
  115. sort: [{
  116. required: true,
  117. trigger: 'blur',
  118. validator: validateSortRule
  119. }]
  120. },
  121. // 菜单下拉绑定的值
  122. parentids: [], // 父级ID,无父级ID为'000000000000000000000000'
  123. // 菜单下拉数据
  124. menuDropDatas: [],
  125. // 自定义菜单下拉数据的key值
  126. props: {
  127. value: 'id',
  128. label: 'text'
  129. },
  130. iconDatas,
  131. loading: false,
  132. judgmentAddEdit: false,
  133. classificationReminder: '请选择父级分类,默认是顶级分类',
  134. }
  135. },
  136. created() {
  137. this.getMenuDrop().then(() => {
  138. this.parentids = this.parentidArr
  139. if (this.rowid) {
  140. this.ruleForm.id = this.rowid
  141. this.getMenuDetail(this.rowid)
  142. this.judgmentAddEdit = true
  143. }
  144. })
  145. },
  146. methods: {
  147. submitForm() {
  148. this.$refs.ruleForm.validate((valid) => {
  149. if (valid) {
  150. this.ruleForm.parentid = this.parentids[this.parentids.length - 1]
  151. this.ruleForm.remark = filterContent.delHtmlTag(this.ruleForm.remark)
  152. this.loading = true
  153. // 添加
  154. if (!this.rowid) {
  155. addMenu(this.ruleForm).then(response => {
  156. this.loading = false
  157. if (response.state.toLowerCase() === 'success') {
  158. this.$parent.$layer.close(this.layerid)
  159. this.$parent.getDatas() // 重新加载父级数据
  160. this.$message.success('恭喜你,菜单信息添加成功!')
  161. }
  162. }).catch(() => {
  163. this.loading = false
  164. })
  165. return
  166. }
  167. // 编辑
  168. editMenu(this.ruleForm).then(response => {
  169. this.loading = false
  170. if (response.state.toLowerCase() === 'success') {
  171. this.$parent.$layer.close(this.layerid)
  172. this.$parent.getDatas() // 重新加载父级数据
  173. this.$message.success('恭喜你,菜单信息编辑成功!')
  174. }
  175. }).catch(() => {
  176. this.loading = false
  177. })
  178. } else {
  179. this.$message.error('请输入有效的必填项信息!')
  180. return false
  181. }
  182. })
  183. },
  184. resetForm() {
  185. this.parentids = []
  186. this.$refs.ruleForm.resetFields()
  187. },
  188. // 获取菜单详情
  189. getMenuDetail(rid) {
  190. getMenu(rid).then(response => {
  191. if (response.state.toLowerCase() === 'success') {
  192. const res = response.data
  193. this.ruleForm.name = res.name // 菜单名称
  194. this.ruleForm.code = res.code // 编码
  195. this.ruleForm.url = res.url // 链接地址
  196. this.ruleForm.target = res.target // 菜单类型
  197. this.ruleForm.flag = res.enable.toString() // 1为启用,0不启用
  198. this.ruleForm.sort = res.sort // 排列序号
  199. this.ruleForm.imgUrl = res.imgUrl // icon
  200. this.ruleForm.remark = res.remark // 备注信息
  201. this.classificationReminder = res.name //父级分类名称
  202. }
  203. })
  204. },
  205. // 获取菜单下拉
  206. getMenuDrop() {
  207. return new Promise(resolve => {
  208. getMenuDrop().then(response => {
  209. if (response.state.toLowerCase() === 'success') {
  210. this.menuDropDatas = response.data
  211. }
  212. })
  213. resolve()
  214. })
  215. }
  216. }
  217. }
  218. </script>
  219. <style rel="stylesheet/scss" lang="scss" scoped>
  220. </style>