menusConfigModal.vue 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164
  1. <script setup lang="ts">
  2. import BasicModal from '/@/components/Modal/src/BasicModal.vue';
  3. import { useModalInner } from '/@/components/Modal';
  4. import { ref } from 'vue';
  5. import { getMenuRoleServe } from '/@/services/apis/MenuController';
  6. import { useMessage } from '/@/hooks/web/useMessage';
  7. import { postXjrmenuquickRoleSave } from '/@/services/apis/XjrMenuQuickController';
  8. const selectIds = ref([]);
  9. const roleId = ref();
  10. const [configReg, { closeModal }] = useModalInner(async (data) => {
  11. selectIds.value = [];
  12. systemData.value = [];
  13. roleId.value = data.id;
  14. systemData.value = await getMenuRoleServe({ roleId: data.id });
  15. systemData.value.forEach((item) => {
  16. item.menuVoList.forEach((items) => {
  17. if (items.isSelect) {
  18. selectData.value.push({
  19. menuId: items.id,
  20. systemId: item.id,
  21. });
  22. selectIds.value.push(items.id);
  23. }
  24. });
  25. });
  26. });
  27. const systemData = ref();
  28. const selectData = ref<API.AddXjrMenuQuickDto[]>([]);
  29. const { createMessage } = useMessage();
  30. const handleChangeStatus = (item) => {
  31. if (selectIds.value.includes(item.id)) {
  32. selectIds.value.splice(selectIds.value.indexOf(item.id), 1);
  33. selectData.value.forEach((items, index) => {
  34. if (items.menuId === item.id) {
  35. selectData.value.splice(index, 1);
  36. }
  37. });
  38. } else {
  39. // 最多只能选择6
  40. if (selectIds.value.length >= 6) {
  41. createMessage.error('最多只能选择6个');
  42. return false;
  43. }
  44. selectIds.value.push(item.id);
  45. selectData.value.push({
  46. menuId: item.id,
  47. systemId: item.systemId,
  48. });
  49. }
  50. };
  51. const handleSummit = async () => {
  52. const data = {
  53. roleId: roleId.value,
  54. menus: selectData.value,
  55. };
  56. console.log(data);
  57. try {
  58. await postXjrmenuquickRoleSave(data);
  59. createMessage.success('保存成功');
  60. closeModal();
  61. } catch (error) {
  62. createMessage.error(error);
  63. }
  64. };
  65. const handleClose = () => {
  66. selectData.value = [];
  67. selectIds.value = [];
  68. closeModal();
  69. };
  70. </script>
  71. <template>
  72. <BasicModal
  73. @ok="handleSummit"
  74. defaultFullscreen
  75. @cancel="handleClose"
  76. v-bind="$attrs"
  77. @register="configReg"
  78. title="快捷菜单配置"
  79. helpMessage="修改后请点击确认按钮保存修改"
  80. >
  81. <div class="service-Content-body" v-if="systemData">
  82. <div class="service-Content-body-system" v-for="(item, index) in systemData" :key="index">
  83. <div>
  84. <span style="font-size: 18px; margin-left: 12px">{{ systemData[index].name }}:</span>
  85. </div>
  86. <div class="service-Content-body-system-items">
  87. <div
  88. v-for="(items, indexs) in item.menuVoList"
  89. :key="indexs"
  90. :class="selectIds.includes(items.id) ? 'active' : ''"
  91. class="service-Content-body-system-items-item"
  92. @click="handleChangeStatus(items)"
  93. >
  94. <div style="width: 100px; margin-left: 12px">
  95. <img
  96. style="width: 50px; height: 50px; object-fit: contain"
  97. :src="
  98. items.iconUrl
  99. ? items.iconUrl
  100. : 'https://zhxy.cqtlzjzx.com/minio/static/service.png'
  101. "
  102. alt=""
  103. />
  104. </div>
  105. <div class="titleContent">
  106. <span>{{ items.title }}</span>
  107. </div>
  108. </div>
  109. </div>
  110. </div>
  111. </div>
  112. </BasicModal>
  113. </template>
  114. <style scoped lang="less">
  115. .service-Content-body {
  116. display: flex;
  117. padding: 2%;
  118. flex-direction: column;
  119. &-system {
  120. display: flex;
  121. flex-direction: column;
  122. &-items {
  123. padding: 24px 0;
  124. cursor: pointer;
  125. display: flex;
  126. flex-direction: row;
  127. flex-wrap: wrap;
  128. &-item {
  129. border-radius: 4px;
  130. margin: 12px;
  131. display: flex;
  132. align-items: center;
  133. box-shadow: 0 0.3rem 0.5rem -0.2rem rgba(78, 78, 78, 0.3),
  134. 0rem 0rem 0.1rem 0rem rgba(78, 78, 78, 0.3);
  135. width: 240px;
  136. height: 90px;
  137. img {
  138. }
  139. }
  140. }
  141. }
  142. }
  143. .titleContent {
  144. width: 180px;
  145. text-align: center;
  146. //禁止换行
  147. color: #787c8e;
  148. white-space: nowrap;
  149. overflow: hidden;
  150. //超出部分用省略号显示
  151. text-overflow: ellipsis;
  152. span {
  153. //限定宽度
  154. font-size: 16px;
  155. padding: 0 24px;
  156. }
  157. }
  158. .active {
  159. background: #dce7ff;
  160. }
  161. </style>