menu.vue 8.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343
  1. <template>
  2. <basic-container>
  3. <avue-crud :option="option"
  4. :data="data"
  5. ref="crud"
  6. v-model="form"
  7. :permission="permissionList"
  8. :before-open="beforeOpen"
  9. @row-del="rowDel"
  10. @row-update="rowUpdate"
  11. @row-save="rowSave"
  12. @search-change="searchChange"
  13. @search-reset="searchReset"
  14. @selection-change="selectionChange"
  15. @on-load="onLoad">
  16. <template slot="menuLeft">
  17. <el-button type="danger"
  18. size="small"
  19. icon="el-icon-delete"
  20. v-if="permission.menu_delete"
  21. plain
  22. @click="handleDelete">删 除
  23. </el-button>
  24. </template>
  25. <template slot-scope="{row}"
  26. slot="roleId">
  27. <el-tag>{{row.roleName}}</el-tag>
  28. </template>
  29. <template slot-scope="{row}"
  30. slot="source">
  31. <div style="text-align:center">
  32. <i :class="row.source"></i>
  33. </div>
  34. </template>
  35. <template slot-scope="{row}"
  36. slot="deptId">
  37. <el-tag>{{row.deptName}}</el-tag>
  38. </template>
  39. </avue-crud>
  40. </basic-container>
  41. </template>
  42. <script>
  43. import {getList, remove, update, add, getMenu} from "@/api/system/menu";
  44. import {mapGetters} from "vuex";
  45. import iconList from "@/config/iconList";
  46. export default {
  47. data() {
  48. return {
  49. form: {},
  50. selectionList: [],
  51. page: {
  52. pageSize: 10,
  53. currentPage: 1,
  54. total: 0
  55. },
  56. option: {
  57. tip: false,
  58. dialogWidth: "60%",
  59. tree: true,
  60. border: true,
  61. index: true,
  62. selection: true,
  63. viewBtn: true,
  64. column: [
  65. {
  66. label: "菜单名称",
  67. prop: "name",
  68. search: true,
  69. rules: [
  70. {
  71. required: true,
  72. message: "请输入菜单名称",
  73. trigger: "blur"
  74. }
  75. ]
  76. },
  77. {
  78. label: "路由地址",
  79. prop: "path",
  80. rules: [
  81. {
  82. required: true,
  83. message: "请输入路由地址",
  84. trigger: "blur"
  85. }
  86. ]
  87. },
  88. {
  89. label: "上级菜单",
  90. prop: "parentId",
  91. type: "tree",
  92. dicUrl: "/api/blade-system/menu/tree",
  93. hide: true,
  94. props: {
  95. label: "title"
  96. },
  97. rules: [
  98. {
  99. required: false,
  100. message: "请选择上级菜单",
  101. trigger: "click"
  102. }
  103. ]
  104. },
  105. {
  106. label: "菜单图标",
  107. prop: "source",
  108. type: "icon-select",
  109. slot: true,
  110. iconList: iconList,
  111. rules: [
  112. {
  113. required: true,
  114. message: "请输入菜单图标",
  115. trigger: "click"
  116. }
  117. ]
  118. },
  119. {
  120. label: "菜单编号",
  121. prop: "code",
  122. search: true,
  123. rules: [
  124. {
  125. required: true,
  126. message: "请输入菜单编号",
  127. trigger: "blur"
  128. }
  129. ]
  130. },
  131. {
  132. label: "菜单类型",
  133. prop: "category",
  134. type: "radio",
  135. dicData: [
  136. {
  137. label: "菜单",
  138. value: 1
  139. },
  140. {
  141. label: "按钮",
  142. value: 2
  143. }
  144. ],
  145. hide: true,
  146. rules: [
  147. {
  148. required: true,
  149. message: "请选择菜单类型",
  150. trigger: "blur"
  151. }
  152. ]
  153. },
  154. {
  155. label: "菜单别名",
  156. prop: "alias",
  157. rules: [
  158. {
  159. required: true,
  160. message: "请输入菜单别名",
  161. trigger: "blur"
  162. }
  163. ]
  164. },
  165. {
  166. label: "按钮功能",
  167. prop: "action",
  168. type: "radio",
  169. dicData: [
  170. {
  171. label: "工具栏",
  172. value: 0
  173. },
  174. {
  175. label: "操作栏",
  176. value: 1
  177. },
  178. {
  179. label: "工具操作栏",
  180. value: 2
  181. }
  182. ],
  183. hide: true,
  184. rules: [
  185. {
  186. required: true,
  187. message: "请选择按钮功能",
  188. trigger: "blur"
  189. }
  190. ]
  191. },
  192. {
  193. label: "菜单排序",
  194. prop: "sort",
  195. type: "number",
  196. rules: [
  197. {
  198. required: true,
  199. message: "请输入菜单排序",
  200. trigger: "blur"
  201. }
  202. ]
  203. },
  204. {
  205. label: "新窗口",
  206. prop: "isOpen",
  207. type: "radio",
  208. dicData: [
  209. {
  210. label: "否",
  211. value: 0
  212. },
  213. {
  214. label: "是",
  215. value: 1
  216. },
  217. ],
  218. hide: true
  219. },
  220. {
  221. label: "菜单备注",
  222. prop: "remark",
  223. type: "textarea",
  224. span: 24,
  225. minRows: 6,
  226. hide: true
  227. }
  228. ]
  229. },
  230. data: []
  231. };
  232. },
  233. computed: {
  234. ...mapGetters(["permission"]),
  235. permissionList() {
  236. return {
  237. addBtn: this.permission.menu_add,
  238. viewBtn: this.permission.menu_view,
  239. delBtn: this.permission.menu_delete,
  240. editBtn: this.permission.menu_edit
  241. };
  242. },
  243. ids() {
  244. let ids = [];
  245. this.selectionList.forEach(ele => {
  246. ids.push(ele.id);
  247. });
  248. return ids.join(",");
  249. }
  250. },
  251. methods: {
  252. rowSave(row, loading) {
  253. add(row).then(() => {
  254. loading();
  255. this.onLoad(this.page);
  256. this.$message({
  257. type: "success",
  258. message: "操作成功!"
  259. });
  260. });
  261. },
  262. rowUpdate(row, index, loading) {
  263. update(row).then(() => {
  264. loading();
  265. this.onLoad(this.page);
  266. this.$message({
  267. type: "success",
  268. message: "操作成功!"
  269. });
  270. });
  271. },
  272. rowDel(row) {
  273. this.$confirm("确定将选择数据删除?", {
  274. confirmButtonText: "确定",
  275. cancelButtonText: "取消",
  276. type: "warning"
  277. })
  278. .then(() => {
  279. return remove(row.id);
  280. })
  281. .then(() => {
  282. this.onLoad(this.page);
  283. this.$message({
  284. type: "success",
  285. message: "操作成功!"
  286. });
  287. });
  288. },
  289. searchReset() {
  290. this.onLoad(this.page);
  291. },
  292. searchChange(params) {
  293. this.onLoad(this.page, params);
  294. },
  295. selectionChange(list) {
  296. this.selectionList = list;
  297. },
  298. handleDelete() {
  299. if (this.selectionList.length === 0) {
  300. this.$message.warning("请选择至少一条数据");
  301. return;
  302. }
  303. this.$confirm("确定将选择数据删除?", {
  304. confirmButtonText: "确定",
  305. cancelButtonText: "取消",
  306. type: "warning"
  307. })
  308. .then(() => {
  309. return remove(this.ids);
  310. })
  311. .then(() => {
  312. this.onLoad(this.page);
  313. this.$message({
  314. type: "success",
  315. message: "操作成功!"
  316. });
  317. this.$refs.crud.toggleSelection();
  318. });
  319. },
  320. beforeOpen(done, type) {
  321. if (["edit", "view"].includes(type)) {
  322. getMenu(this.form.id).then(res => {
  323. this.form = res.data.data;
  324. });
  325. }
  326. done();
  327. },
  328. onLoad(page, params = {}) {
  329. getList(page.currentPage, page.pageSize, params).then(res => {
  330. const data = res.data.data;
  331. this.data = data;
  332. });
  333. }
  334. }
  335. };
  336. </script>
  337. <style>
  338. </style>