authConfig.vue 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151
  1. <template>
  2. <el-dialog v-model="authData.showDialog" :title="`${authData.schoolName} 权限管理`" width="620px">
  3. <div>
  4. <div class="page_tag">
  5. <el-radio-group v-model="authType" @change="ChangeTab">
  6. <el-radio-button value="1">开通年级</el-radio-button>
  7. <el-radio-button value="2" disabled>开通模块</el-radio-button>
  8. </el-radio-group>
  9. </div>
  10. <div class="page_jg_20"></div>
  11. <div v-if="authType == '1'" class="grade_content">
  12. <div v-for="(grade, index) in gradeList" :key="grade.levelCode" class="grade_level">
  13. <el-checkbox v-model="checkAll[index]" :indeterminate="!checkAll[index] && selectedGrades[index]?.length > 0" :label="grade.levelName" @click="CheckAllChange(index)" />
  14. <el-checkbox-group v-model="selectedGrades[index]" @change="(val: string[]) => handleGradeChange(val, index)">
  15. <el-checkbox v-for="item in grade.gradeList" :key="item.gradeCode" :label="item.gradeName" :value="item.gradeCode" />
  16. </el-checkbox-group>
  17. <!-- <div>
  18. <el-checkbox v-model="selectedGrades[index]" :label="item.gradeName" v-for="item in grade.gradeList" :key="item.gradeCode" @change="(val) =>handleGradeChange(val, item)" />
  19. </div> -->
  20. </div>
  21. </div>
  22. </div>
  23. <template #footer>
  24. <el-button class="button_border_gray cancel" @click="authData.showDialog = false">取消</el-button>
  25. <el-button class="button_background" :loading="submitLoading" @click="SubmitForm">确定</el-button>
  26. </template>
  27. </el-dialog>
  28. </template>
  29. <script lang="ts">
  30. export default {
  31. name: 'AuthConfig'
  32. }
  33. </script>
  34. <script lang="ts" setup>
  35. import { ref, inject, onMounted } from 'vue'
  36. import { ElMessage } from 'element-plus'
  37. import { getAllGrade, addGrade } from '@/api/school'
  38. interface AuthData {
  39. showDialog: boolean
  40. schoolName: string
  41. tenantCode: string
  42. id: string
  43. }
  44. let authData = inject<AuthData>('authData', {
  45. showDialog: false,
  46. schoolName: '',
  47. tenantCode: '',
  48. id: ''
  49. })
  50. interface GradeData {
  51. gradeName: string
  52. gradeCode: string
  53. schoolId: string
  54. gradeList: any[]
  55. levelCode: string
  56. levelName: string
  57. levelNumder?: number
  58. }
  59. const gradeList = ref<GradeData[]>([])
  60. const authType = ref('1')
  61. const submitLoading = ref(false)
  62. const checkAll = ref<boolean[]>([])
  63. const selectedGrades = ref<string[][]>([])
  64. onMounted (() => {
  65. GetAllGrade()
  66. })
  67. const GetAllGrade = () => {
  68. getAllGrade(authData.id).then((res: any) => {
  69. if(res.code == 200 && res.data) {
  70. const { data } = res
  71. gradeList.value = data
  72. gradeList.value.forEach((item, index) => {
  73. checkAll.value[index] = item.gradeList.length ? item.gradeList.every(i => i.schoolGradeId) : false
  74. if(item.gradeList.length) {
  75. selectedGrades.value[index] = item.gradeList.some(i => i.schoolGradeId) ? item.gradeList.map(i => {
  76. if(i.schoolGradeId) {
  77. return i.gradeCode
  78. }
  79. }) : []
  80. } else {
  81. selectedGrades.value[index] = []
  82. }
  83. })
  84. }
  85. })
  86. }
  87. const ChangeTab = (val: any) => {
  88. console.log(val)
  89. }
  90. const CheckAllChange = (index: number) => {
  91. if(!checkAll.value[index]) {
  92. selectedGrades.value[index] = gradeList.value[index].gradeList.map(item => item.gradeCode)
  93. }else {
  94. selectedGrades.value[index] = []
  95. }
  96. }
  97. const handleGradeChange = (val: any[], index: number) => {
  98. console.log(index)
  99. console.log(val)
  100. if(gradeList.value[index].gradeList.length == val.length) {
  101. checkAll.value[index] = true
  102. } else if(val.length == 0) {
  103. checkAll.value[index] = false
  104. } else {
  105. checkAll.value[index] = false
  106. }
  107. }
  108. const SubmitForm = async () => {
  109. if(!authData) {
  110. return
  111. }
  112. try {
  113. submitLoading.value = true
  114. let arrList = gradeList.value.map((item: any, index: number) => {
  115. let arr = item.gradeList.filter((i: any) => selectedGrades.value[index].includes(i.gradeCode))
  116. return {
  117. levelCode: item.levelCode,
  118. levelName: item.levelName,
  119. levelNumder: item.levelNumder,
  120. gradeList: arr
  121. }
  122. }).filter(item => item.gradeList.length)
  123. console.log(arrList)
  124. const res = await addGrade({
  125. tenantCode: authData.tenantCode,
  126. schoolInfoId: authData.id,
  127. adminLevelInfo: arrList
  128. })
  129. if(res.code == 200) {
  130. ElMessage.success(res.msg)
  131. authData.showDialog = false
  132. } else {
  133. ElMessage.error(res.msg)
  134. }
  135. } catch {} finally {
  136. submitLoading.value = false
  137. }
  138. }
  139. </script>
  140. <style lang="scss" scoped>
  141. .page_tag {
  142. padding: 0 20px;
  143. }
  144. .grade_content {
  145. padding: 0 20px;
  146. .grade_level {
  147. margin-bottom: 10px;
  148. }
  149. }
  150. </style>