role-menu.vue 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143
  1. <template>
  2. <el-dialog
  3. :visible.sync="showDialog"
  4. title="分配菜单"
  5. width="800px"
  6. :modal-append-to-body="false"
  7. style="text-align:left;"
  8. @close="closeDialog"
  9. >
  10. <div class="role-permission">
  11. <el-transfer
  12. v-model="relatedMenus"
  13. :data="menuList"
  14. v-loading="loading"
  15. filterable
  16. :filter-method="filterMethod"
  17. filter-placeholder="请输入关键字"
  18. :props="{key: 'id',label: 'description'}"
  19. :titles="['未分配菜单','已分配菜单']"
  20. ></el-transfer>
  21. </div>
  22. <span slot="footer" class="dialog-footer">
  23. <el-button @click="closeDialog">取 消</el-button>
  24. <el-button type="primary" @click="handleSubmit" :loading="submitting">确 定</el-button>
  25. </span>
  26. </el-dialog>
  27. </template>
  28. <script>
  29. import menuApi from "@/api/sys/menu";
  30. import permissionApi from "@/api/sys/permission";
  31. import roleApi from "@/api/sys/role";
  32. export default {
  33. props: ["roleId"],
  34. data() {
  35. return {
  36. menuList: [],
  37. relatedMenus: [],
  38. loading: false,
  39. showDialog: true,
  40. submitting: false
  41. };
  42. },
  43. methods: {
  44. closeDialog() {
  45. this.$emit("close",false);
  46. },
  47. handleSubmit() {
  48. var self = this;
  49. roleApi
  50. .saveRelatedMenu({
  51. roleId: this.roleId,
  52. relatedList: this.relatedMenus
  53. })
  54. .then(function(response) {
  55. var jsonData = response.data;
  56. self.submitting = false;
  57. if (jsonData.result) {
  58. self.$message({
  59. message: "保存成功!",
  60. type: "success"
  61. });
  62. self.$emit("close",true);
  63. } else {
  64. self.$message({
  65. message: jsonData.message + "",
  66. type: "warning"
  67. });
  68. self.$emit("close",false);
  69. }
  70. });
  71. },
  72. filterMethod(query, item) {
  73. return item.description.indexOf(query) > -1;
  74. },
  75. queryRelatedMenuList() {
  76. var self = this;
  77. self.loading = true;
  78. self.menuList = [];
  79. self.relatedMenus= [];
  80. var queryData = new FormData();
  81. queryData.append("limit",1000);
  82. menuApi.query(queryData)
  83. .then(response => {
  84. var jsonData = eval(response.data);
  85. self.menuList = jsonData.data.map(item => {
  86. var description = "";
  87. if(item.parentName!=null){
  88. description = item.parentName + ">";
  89. }
  90. description += item.menuName;
  91. return {
  92. id: item.id,
  93. description: description
  94. };
  95. });
  96. return roleApi.queryRelatedMenuList(self.roleId);
  97. })
  98. .then(response => {
  99. var jsonData = response.data;
  100. self.relatedMenus = jsonData.data.map(item => {
  101. return item.menuId;
  102. });
  103. self.loading = false;
  104. });
  105. }
  106. },
  107. mounted() {
  108. this.queryRelatedMenuList();
  109. }
  110. };
  111. </script>
  112. <style lang="scss">
  113. .role-permission {
  114. .el-transfer-panel {
  115. border: 1px solid #ebeef5;
  116. border-radius: 4px;
  117. overflow: hidden;
  118. background: #fff;
  119. display: inline-block;
  120. vertical-align: middle;
  121. width: 320px;
  122. -webkit-box-sizing: border-box;
  123. box-sizing: border-box;
  124. position: relative;
  125. }
  126. }
  127. </style>