Przeglądaj źródła

后台接口联调

zhangguohua 1 rok temu
rodzic
commit
5eb71fcbf5

+ 4 - 4
src/api/examination.ts

@@ -1,18 +1,18 @@
 import request from '../utils/request.ts'
 // 联考学校列表
-export function getJoinExamList(data: any) {
+export function getJoinExamList(params: any) {
   return request({
     url: `/adminApi/v1/listSchoolICh`,
     method: 'get',
-    data
+    params
   })
 }
 // 单考学校列表
-export function getSingleExamList(data: any) {
+export function getSingleExamList(params: any) {
   return request({
     url: `/adminApi/v1/schoolOneAll`,
     method: 'get',
-    data
+    params
   })
 }
 // 新增学校

+ 33 - 0
src/api/manager.ts

@@ -0,0 +1,33 @@
+import request from '../utils/request.ts'
+
+// 查询运维人员详情
+export function managerDetails(id: any) {
+  return request({
+    url: `/adminApi/v1/sys/users/${id}`,
+    method: 'get'
+  })
+}
+// 新增运维人员
+export function addManager(data: any) {
+  return request({
+    url: `/adminApi/v1/sys/users`,
+    method: 'post',
+    data
+  })
+}
+// 编辑运维人员
+export function editManager(data: any) {
+  return request({
+    url: `/adminApi/v1/sys/users`,
+    method: 'put',
+    data
+  })
+}
+// 删除运维人员
+export function deleteManager(data: any) {
+  return request({
+    url: `/adminApi/v1/sys/users`,
+    method: 'delete',
+    data
+  })
+}

+ 15 - 7
src/api/school.ts

@@ -31,10 +31,11 @@ export function addUser(data: any) {
   })
 }
 // 学校管理--运维人员列表
-export function getUserList() {
+export function getUserList(params: any) {
   return request({
     url: '/adminApi/v1/sys/userList',
-    method: 'get'
+    method: 'get',
+    params
   })
 }
 // 学校管理--学校logo上传
@@ -78,10 +79,17 @@ export function changeStatus(data: any) {
 
 
 // 学校管理--查询所有年级
-export function getAllGrade(data: any) {
+export function getAllGrade(id: any) {
   return request({
-    url: `/adminApi/v1/admin/school/grade/pageList`,
-    method: 'get',
+    url: `/adminApi/v1/admin/school/grade/getAllList/${id}`,
+    method: 'get'
+  })
+}
+// 学校管理--添加年级
+export function addGrade(data: any) {
+  return request({
+    url: `/adminApi/v1/admin/school/grade/addSchoolGrade`,
+    method: 'post',
     data
   })
 }
@@ -89,11 +97,11 @@ export function getAllGrade(data: any) {
 
 
 // 学校管理--查询所有科目
-export function getAllSubject(data: any) {
+export function getAllSubject(params: any) {
   return request({
     url: `/adminApi/v1/admin/school/course/getAllList`,
     method: 'get',
-    data
+    params
   })
 }
 // 学校管理--新增科目

+ 63 - 0
src/components/resetPassword.vue

@@ -0,0 +1,63 @@
+<template>
+  <el-dialog v-model="dialogData.dialogShow" title="重置密码" width="450px"> 
+     <!-- :rules="editPassWordDataRules"   ref="editPassWordData"-->
+    <el-form :model="editPassWordData" label-width="90px">
+      <el-form-item :label="dialogData.label+ ':'" prop="name" >
+        <el-input :value="dialogData.name" disabled/>
+      </el-form-item>
+      <el-form-item label="重置方式:">
+        <el-radio-group v-model="editPassWordData.useDefault">
+          <el-radio value="0">使用新密码</el-radio>
+          <el-radio value="1">重置为默认密码</el-radio>
+        </el-radio-group>
+      </el-form-item>
+      <el-form-item label="新密码:" v-if="editPassWordData.useDefault=='0'">
+        <el-input v-model="editPassWordData.randomPassword" />
+      </el-form-item>
+      <el-form-item label="默认密码:" v-if="editPassWordData.useDefault=='1'">
+        <div class="default_pass">
+          <el-input value="******" disabled/>
+          <p>默认密码:{{ dialogData.remark }}</p>
+        </div>
+      </el-form-item>
+    </el-form>
+    <template #footer>
+      <el-button @click="dialogData.dialogShow = false">取 消</el-button>
+      <el-button type="primary" @click="confirmPassWord">确 定</el-button>
+    </template>
+  </el-dialog>
+</template>
+
+<script lang="ts">
+export default {
+  name: 'ResetPassword',
+}
+</script>
+<script lang="ts" setup>
+import { ref, reactive, onMounted, watch, inject } from 'vue'
+interface DialogData {
+  dialogShow: boolean
+  name: string,
+  label: string,
+  id: string
+  remark: string
+}
+const dialogData = inject<DialogData>('passwordDialog')
+interface EditPassWordData {
+  useDefault: string
+  randomPassword: string
+}
+const editPassWordData = reactive<EditPassWordData>({
+  useDefault: '1',
+  randomPassword: '',
+})
+onMounted(() => {
+  
+})
+const confirmPassWord = () => {
+
+}
+</script>  
+<style>
+
+</style>

+ 4 - 4
src/utils/request.ts

@@ -20,7 +20,7 @@ service.interceptors.request.use(
     }
     return config
   },
-  (error) => {
+  (error) => { 
     // 请求错误处理
     console.error('请求错误:', error)
     return Promise.reject(error)
@@ -34,7 +34,7 @@ service.interceptors.response.use(
 
     if (res.code !== 200) {
       ElMessage({
-        message: res.message || '请求失败',
+        message: res.msg || '请求失败',
         type: 'error',
         duration: 5 * 1000
       })
@@ -42,10 +42,10 @@ service.interceptors.response.use(
       // 特殊状态码处理,如 token 失效等
       if (res.code === 401) {
         // 跳转登录页
-        // window.location.href = '/login'
+        window.location.href = '/login'
       }
 
-      return Promise.reject(res.message || '请求失败')
+      return Promise.reject(res.msg || '请求失败')
     }
 
     return res

+ 1 - 1
src/views/examination/index.vue

@@ -149,7 +149,7 @@ const DeleteSchool = (row) => {
     cancelButtonText: '取消',
     type: 'warning'
   }).then(async () => {
-    const res = await deleteSchool({ ids: row.id })
+    const res = await deleteSchool({ ids: [row.id] })
     if(res.code == 200) {
       ElMessage.success(res.msg)
     }else {

+ 145 - 0
src/views/manager/addAdmin.vue

@@ -0,0 +1,145 @@
+<template>
+  <el-dialog v-model="dialogData.showDialog" :title="dialogData.pageType == 'add' ? '新增用户' : dialogData.pageType == 'edit' ? '编辑用户' : ''" width="560px">
+    <el-form :model="userForm" :rules="rules" ref="userFormRef">
+      <el-form-item label="姓名:" label-width="120px" prop="nickname">
+        <el-input v-model="userForm.nickname" placeholder="请输入姓名" />
+      </el-form-item>
+      <el-form-item label="账号:" label-width="120px" prop="username">
+        <el-input v-model="userForm.username" placeholder="请输入账号" />
+      </el-form-item>
+      <el-form-item label="密码:" label-width="120px" prop="passwordOfNewUser" v-if="dialogData.pageType == 'add'">
+        <el-input v-model="userForm.passwordOfNewUser" type="password" show-password placeholder="请输入密码" />
+      </el-form-item>
+      <el-form-item label="手机号:" label-width="120px" prop="phoneNo">
+        <el-input v-model="userForm.phoneNo" placeholder="请输入手机号" />
+      </el-form-item>
+      <el-form-item label="性别:" label-width="120px" prop="gender">
+        <el-radio-group v-model="userForm.gender">
+          <el-radio :value="2">男</el-radio>
+          <el-radio :value="1">女</el-radio>
+        </el-radio-group>
+      </el-form-item>
+      <el-form-item label="状态:" label-width="120px" prop="status">
+        <el-radio-group v-model="userForm.status">
+          <el-radio :value="1">正常</el-radio>
+          <el-radio :value="0">封禁</el-radio>
+        </el-radio-group>
+      </el-form-item>
+    </el-form>
+    <template #footer>
+      <el-button @click="dialogData.showDialog = false">取消</el-button>
+      <el-button type="primary" :loading="submitLoading" @click="SubmitForm(userFormRef)">确定</el-button>
+    </template>
+  </el-dialog>
+</template>
+<script lang="ts">
+export default {
+  name: 'AddAdmin',
+}
+</script>
+<script lang="ts" setup>
+import type { FormInstance, FormRules } from 'element-plus'
+import { ElMessage } from 'element-plus'
+import { ref, reactive, onMounted, inject } from 'vue'
+import { managerDetails, addManager, editManager, deleteManager } from '@/api/manager'
+interface DialogData {
+  showDialog: boolean
+  pageType: string
+  id: string
+}
+let emit = defineEmits(['update'])
+let dialogData = inject<DialogData>('dialogData')
+// 新增用户表单数据定义
+interface UserForm {
+  id: string
+  nickname: string
+  username: string
+  passwordOfNewUser: string
+  phoneNo: string
+  gender: number
+  status: number
+}
+// 新增用户表单数据初始化
+const userForm = reactive<UserForm>({
+  id: '',
+  nickname: '',
+  username: '',
+  passwordOfNewUser: '',
+  phoneNo: '',
+  gender: null,
+  status: 1,
+})
+const userFormRef = ref<FormInstance>()
+// 表单校验规则
+const rules = reactive<FormRules<UserForm>>({
+  nickname: [
+    { required: true, message: '请输入姓名', trigger: 'blur' }
+  ],
+  username: [
+    { required: true, message: '请输入账号', trigger: 'blur' }
+  ],
+  passwordOfNewUser: [
+    { required: true, message: '请输入密码', trigger: 'blur' }
+  ],
+  // phoneNo: [
+  //   { required: true, message: '请输入手机号', trigger: 'blur' }
+  // ],
+  // gender: [
+  //   { required: true, message: '请选择性别', trigger: 'change' }
+  // ],
+  // status: [
+  //   { required: true, message: '请选择状态', trigger: 'change' }
+  // ]
+})
+onMounted(() => {
+  if (dialogData.pageType == 'edit') {
+    GetManagerDetails()
+  }
+})
+const GetManagerDetails = () => {
+  managerDetails(dialogData.id).then(res => {
+    if(res.code == 200 && res.data) {
+      const { data } = res
+      userForm.id = data.id
+      userForm.nickname = data.nickname
+      userForm.username = data.username
+      userForm.passwordOfNewUser = data.passwordOfNewUser
+      userForm.phoneNo = data.phoneNo
+      userForm.gender = data.gender
+      userForm.status = data.status
+    }
+  })
+}
+const submitLoading = ref(false)
+const SubmitForm = async (formEl: FormInstance | undefined) => {
+  if (!formEl) return
+  await formEl.validate(async(valid, fields) => {
+    if (valid) {
+      submitLoading.value = true
+      try {
+        let res
+        if(dialogData.pageType == 'add') {
+          res = await addManager(userForm)
+        }else if(dialogData.pageType == 'edit') {
+          res = await editManager(userForm)
+        }
+        if (res.code == 200) {
+          ElMessage.success(res.msg)
+          userFormRef.value.resetFields()
+          emit('update', false)
+        } else {
+          ElMessage.error(res.msg)
+        }
+        submitLoading.value = false
+      }catch {
+        submitLoading.value = false
+      }
+    }
+  })
+}
+</script>
+<style lang="scss" scoped>
+.el-input {
+  width: 320px;
+}
+</style>

+ 112 - 92
src/views/manager/index.vue

@@ -11,121 +11,141 @@
         </div>
         <div class="content_right">
           <el-button>刷新</el-button>
-          <el-button type="primary" @click="AddMultiExam" >
-            新增用户
-          </el-button>
+          <el-button type="primary" @click="AddManager" >新增用户</el-button>
         </div>
       </div>
     </div>
     <div class="page_jg_20"></div>
     <div class="page_table">
-      <el-table :data="tableData" stripe  
-          :key="tableKey"
-          v-loading="tableLoading"
-          element-loading-text="拼命加载中……"
-            element-loading-spinner="el-icon-loading"
-            element-loading-background="#ffffff"
-           row-key="studentId">
-           
-            <el-table-column type="index" label="序号" :index="GetIndexNumber"   align="center" width="50"  fixed="left"></el-table-column>
-            
-            <el-table-column prop="account" label="账号" align="center"  show-overflow-tooltip>
-            </el-table-column>
-            <el-table-column prop="userName" label="姓名" align="center"  show-overflow-tooltip>
-            </el-table-column>
-            <el-table-column prop="stateName" label="状态" align="center"  show-overflow-tooltip>
-              <template #default="scope">
-                <div class="table_row_status">
-                    <!-- 需汇总 -->
-                    <div class="need_summary_icon" v-if="scope.row.state==1"></div>
-                    <!-- 汇总中 改成成绩中 -->
-                    <div class="score_look_icon" v-else-if="scope.row.state==4"></div>
-                    <!-- 已发布 -->
-                    <div class="yes_release_icon" v-else-if="scope.row.state==2"></div>
-                    <!-- 已关闭 -->
-                    <div class="ready_close_icon" v-else-if="scope.row.state==3"></div>
-                    <!-- 未发布 -->
-                    <div class="no_release_icon" v-else></div>
-                    {{ scope.row.stateName }}
-                </div>
-              </template>
-            </el-table-column>
-            <el-table-column prop="loginTime" label="最后登录时间" align="center"  show-overflow-tooltip>
-            </el-table-column>
-            <el-table-column label="操作" align="center" fixed="right" min-width="120">
-                <template #default="scope">
-                  <div class="table_row_option">
-                  
-                      <div  class="button_editor"  @click="EditorStudent(scope.row)">编辑</div>
-                    
-                      <div  class="button_delete"  @click="DeleteStudent(scope.row)">删除</div>
-                  </div>
-                </template>
-            </el-table-column>
-          </el-table>
+      <el-table :data="tableData" stripe :key="tableKey" v-loading="tableLoading" element-loading-text="拼命加载中……"
+        element-loading-spinner="el-icon-loading" element-loading-background="#ffffff" row-key="studentId">
+          <el-table-column type="index" label="序号" align="center" width="50" />
+          <el-table-column prop="username" label="账号" align="center"  show-overflow-tooltip />
+          <el-table-column prop="nickname" label="姓名" align="center"  show-overflow-tooltip />
+          <el-table-column prop="phoneNo" label="手机号" align="center"  show-overflow-tooltip />
+          <el-table-column prop="status" label="状态" align="center"  show-overflow-tooltip>
+            <template #default="scope">
+              <div class="table_row_status">
+                <!-- 正常 -->
+                <div class="yes_release_icon" v-if="scope.row.status == 1"></div>
+                <!-- 封禁 -->
+                <div class="ready_close_icon" v-else-if="scope.row.status==2"></div>
+                {{ scope.row.statusLabel }}
+              </div>
+            </template>
+          </el-table-column>
+          <el-table-column prop="lastLoginAt" label="最后登录时间" align="center"  show-overflow-tooltip />
+          <el-table-column label="操作" align="center" fixed="right" min-width="120">
+            <template #default="scope">
+              <div class="table_row_option">
+                <div class="button_editor" @click="EditManager(scope.row)">编辑</div>
+                <div class="button_editor" @click="EditPassword(scope.row)">重置密码</div>
+                <div class="button_delete" @click="DeleteManager(scope.row)">删除</div>
+              </div>
+            </template>
+          </el-table-column>
+      </el-table>
+    </div>
+
+    <div class="page_dialog">
+      <AddAdmin v-if="dialogData.showDialog" @update="RefTable" />
+      <ResetPassword v-if="passwordDialog.dialogShow" />
     </div>
   </div>
 </template>
 
-<script setup>
-import { ref ,onMounted, onBeforeUnmount} from 'vue'
+<script lang="ts" setup>
+import { ref, reactive, onMounted, onBeforeUnmount, provide} from 'vue'
 import { Search } from '@element-plus/icons-vue'
-const tableData = ref([]);//表格数据
-const tableLoading = ref(false);//表格加载loading
-const tableKey = ref(0);//用于强制刷新table
-const keyWord = ref('');//搜索关键词
-
-const GetTableData=async()=>{
+import { ElMessageBox, ElMessage } from 'element-plus'
+import { getUserList } from '@/api/school'
+import { deleteManager } from '@/api/manager'
+import AddAdmin from '@/views/manager/addAdmin.vue'
+import ResetPassword from '@/components/resetPassword.vue'
+const tableData = ref([]); // 表格数据
+const tableLoading = ref(false); //表 格加载loading
+const tableKey = ref(0); // 用于强制刷新table
+const keyWord = ref(''); // 搜索关键词
+const dialogData = reactive({
+  showDialog: false,
+  id: '',
+  pageType: ''
+}) // 添加/修改用户弹窗数据
+const passwordDialog = reactive({
+  dialogShow: false,
+  id: '',
+  name: '',
+  label: '',
+  remark: ''
+}) // 重置密码弹窗数据
+provide('dialogData', dialogData)
+provide('passwordDialog', passwordDialog)
+// 获取运维人员列表
+const GetUserList = async() => {
   try{
-      // tableLoading.value=true;
-      // const res=await fetch('/api/manager/getStudents');
-      // if(res.code===200)
-      // {
-      //   tableData.value=res.data || [];
-      // }
-      tableData.value=[
-        {
-          account: '182900',
-          userName: '杨晓正',
-          phone: '13552478041',
-          state: '0',
-          stateName: '正常',
-          loginTime: '2024-10-15',
-        },
-        {
-          account: '182900',
-          userName: '杨晓正',
-          phone: '13552478041',
-          state: '1',
-          stateName: '封禁',
-          loginTime: '2024-10-15',
-        },
-        {
-          account: '182900',
-          userName: '杨晓正',
-          phone: '13552478041',
-          state: '1',
-          stateName: '封禁',
-          loginTime: '2024-10-15',
-        }
-      ];
-  }catch(error)
-  {
+    tableLoading.value=true;
+    const res = await getUserList({
+      queryStr: keyWord.value
+    })
+    if(res.code == 200 && res.data) {
+      const { data } = res
+      tableData.value = data
+    }
+  } catch(error) {
     console.error('获取数据失败:', error)
-  }finally
-  {
+  } finally {
     tableLoading.value = false
   }
 }
+const GoSearch = () => {
+  GetUserList()
+}
 // 组件挂载时自动加载数据
 onMounted(() => {
-  GetTableData()//加载表格数据
+  GetUserList()//加载表格数据
 })
 
 // 表格相关方法
 function GetIndexNumber(index) {
   return index + 1
 }
+const AddManager = () => {
+  dialogData.showDialog = true
+  dialogData.pageType = 'add'
+}
+const EditManager = (row) => {
+  dialogData.showDialog = true
+  dialogData.pageType = 'edit'
+  dialogData.id = row.id 
+}
+const RefTable = (val) => {
+  dialogData.showDialog = val
+  GetUserList()
+}
+const DeleteManager = (row) => {
+  console.log(row)
+  ElMessageBox.confirm('确定删除该学校吗?', '提示', {
+    confirmButtonText: '确定',
+    cancelButtonText: '取消',
+    type: 'warning'
+  }).then(async () => {
+    const res = await deleteManager({ ids: [row.id] })
+    if(res.code == 200) {
+      ElMessage.success(res.msg)
+      GetUserList()
+    }else {
+      ElMessage.error(res.msg)
+    }
+  })
+}
+const EditPassword = (row) => {
+  console.log(row)
+  passwordDialog.dialogShow = true
+  passwordDialog.id = row.id
+  passwordDialog.name = row.nickname
+  passwordDialog.label = '用户姓名'
+  passwordDialog.remark = '用户账号'
+}
 
 </script>
 

+ 20 - 17
src/views/school/addUser.vue

@@ -81,8 +81,8 @@
           />
         </el-form-item>
       </el-form-item>
-      <el-form-item label="运维负责人:" :label-width="formLabelWidth" prop="selUserList">
-        <el-select v-model="userForm.selUserList" placeholder="请选择" @change="handleUserChange" style="width: 320px;" multiple collapse-tags collapse-tags-tooltip>
+      <el-form-item label="运维负责人:" :label-width="formLabelWidth" prop="sysUserId">
+        <el-select v-model="userForm.sysUserId" placeholder="请选择" @change="handleUserChange" style="width: 320px;" multiple collapse-tags collapse-tags-tooltip>
           <el-option
             v-for="item in userList"
             :key="item.id"
@@ -117,6 +117,7 @@ let dialogData = inject<DialogData>('dialogData')
 const formLabelWidth = '120px'
 // 新增用户表单数据定义
 interface UserForm {
+  id: string
   tenantName: string
   abbreviation: string
   provinceCode: string
@@ -130,11 +131,12 @@ interface UserForm {
   image: string
   startDate: string
   endDate: string
-  selUserList: string[]
-  AdminSchoolUserInsertList: Array <any>
+  // selUserList: string[]
+  sysUserId: string[]
 }
 // 新增用户表单数据初始化
 const userForm = reactive<UserForm>({
+  id: '',
   tenantName: '',
   abbreviation: '',
   provinceCode: '',
@@ -148,8 +150,8 @@ const userForm = reactive<UserForm>({
   image: '',
   startDate: '',
   endDate: '',
-  selUserList: [],
-  AdminSchoolUserInsertList: []
+  // selUserList: [],
+  sysUserId: []
 })
 const userFormRef = ref<FormInstance>()
 // 表单校验规则
@@ -157,9 +159,9 @@ const rules = reactive<FormRules<UserForm>>({
   tenantName: [
     { required: true, message: '请输入学校名称', trigger: 'blur' }
   ],
-  abbreviation: [
-    { required: true, message: '请输入学校简称', trigger: 'blur' }
-  ],
+  // abbreviation: [
+  //   { required: true, message: '请输入学校简称', trigger: 'blur' }
+  // ],
   provinceCode: [
     { required: true, message: '请选择省', trigger: 'change' }
   ],
@@ -181,9 +183,9 @@ const rules = reactive<FormRules<UserForm>>({
   endDate: [
     { required: true, message: '请选择结束时间', trigger: 'change' }
   ],
-  selUserList: [
-    { required: true, message: '请选择运维人员', trigger: 'change' }
-  ]
+  // sysUserId: [
+  //   { required: true, message: '请选择运维人员', trigger: 'change' }
+  // ]
 })
 
 // 省份列表
@@ -214,6 +216,7 @@ const GetUserDetail = () => {
       if(data.cityCode) {
         areaList.value = cityTreeList.value.find(item => item.cityCode == data.cityCode).children
       }
+      userForm.id = data.id
       userForm.tenantName = data.tenantName
       userForm.abbreviation = data.abbreviation
       userForm.provinceCode = data.provinceCode
@@ -227,14 +230,14 @@ const GetUserDetail = () => {
       userForm.image = data.image
       userForm.startDate = data.startDate
       userForm.endDate = data.endDate
-      userForm.selUserList = data.selUserList
-      userForm.AdminSchoolUserInsertList = data.AdminSchoolUserInsertList
+      // userForm.selUserList = data.selUserList
+      userForm.sysUserId = data.sysUserId
     }
   })
 }
 // 获取运维人员列表
 const GetUserList = () => {
-  getUserList().then(res => {
+  getUserList({}).then(res => {
     if(res.code == 200 && res.data) {
       const { data } = res
       userList.value = data
@@ -294,8 +297,8 @@ const handleUserChange = (val) => {
     return { id: item.id }
   })
   console.log(result)
-  userForm.selUserList = val
-  userForm.AdminSchoolUserInsertList = result
+  // userForm.selUserList = val
+  userForm.sysUserId = val
 }
 const emit = defineEmits(['AddUser'])
 // 表单提交

+ 108 - 18
src/views/school/authConfig.vue

@@ -1,15 +1,29 @@
 <template>
-  <el-dialog v-model="authData.showDialog" :title="`${authData.data.schoolName} 权限管理`">
-    <div class="page_tag">
-      <el-radio-group v-model="authType" @change="ChangeTab">
-        <el-radio-button label="1">开通年级</el-radio-button>
-        <el-radio-button label="2" disabled>开通模块</el-radio-button>
-      </el-radio-group>
+  <el-dialog v-model="authData.showDialog" :title="`${authData.schoolName} 权限管理`" width="620px">
+    <div>
+      <div class="page_tag">
+        <el-radio-group v-model="authType" @change="ChangeTab">
+          <el-radio-button value="1">开通年级</el-radio-button>
+          <el-radio-button value="2" disabled>开通模块</el-radio-button>
+        </el-radio-group>
+      </div>
+      <div class="page_jg_20"></div>
+      <div v-if="authType == '1'" class="grade_content">
+        <div v-for="(grade, index) in gradeList" :key="grade.levelCode" class="grade_level">
+          <el-checkbox v-model="checkAll[index]" :indeterminate="!checkAll[index] && selectedGrades[index]?.length > 0" :label="grade.levelName" @click="CheckAllChange(index)" />
+          <el-checkbox-group v-model="selectedGrades[index]" @change="(val) =>handleGradeChange(index, val)">
+            <el-checkbox v-for="item in grade.gradeList" :key="item.gradeCode" :label="item.gradeName" :value="item.gradeCode" />
+          </el-checkbox-group>
+          <!-- <div>
+            <el-checkbox v-model="selectedGrades[index]" :label="item.gradeName" v-for="item in grade.gradeList" :key="item.gradeCode" @change="(val) =>handleGradeChange(val, item)" />
+          </div> -->
+        </div>
+      </div>
     </div>
-    <div v-if="authType == '1'">
-      年级模块
-    </div>
-    
+    <template #footer>
+      <el-button @click="authData.showDialog = false">取消</el-button>
+      <el-button type="primary" :loading="submitLoading" @click="SubmitForm">确定</el-button>
+    </template>
   </el-dialog>
 </template>
 <script lang="ts">
@@ -19,24 +33,100 @@ export default {
 </script>
 <script lang="ts" setup>
 import { ref, inject, onMounted } from 'vue'
-import { getAllGrade } from '@/api/school'
-let authData = inject('authData')
+import { ElMessage } from 'element-plus'
+import { getAllGrade, addGrade } from '@/api/school'
+interface AuthData {
+  showDialog: boolean
+  schoolName: string
+  tenantCode: string
+  id: string
+}
+let authData = inject<AuthData>('authData')
+const gradeList = ref([])
 const authType = ref('1')
+const submitLoading = ref(false)
+const checkAll = ref([])
+const selectedGrades = ref([])
 onMounted (() => {
   GetAllGrade()
 })
 const GetAllGrade = () => {
-  getAllGrade({
-    
-  }).then(res => {
-    console.log(res)
+  getAllGrade(authData.id).then(res => {
+    if(res.code == 200 && res.data) {
+      const { data } = res
+      gradeList.value = data
+      gradeList.value.forEach((item, index) => {
+        checkAll.value[index] = item.gradeList.length ? item.gradeList.every(i => i.schoolGradeId) : false
+        if(item.gradeList.length) {
+          selectedGrades.value[index] = item.gradeList.some(i => i.schoolGradeId) ? item.gradeList.map(i => {
+            if(i.schoolGradeId) {
+              return i.gradeCode
+            }
+          }) : []
+        } else {
+          selectedGrades.value[index] = []
+        }
+      })
+    }
   })
 }
 const ChangeTab = (val) => {
   console.log(val)
 }
+const CheckAllChange = (index) => {
+  if(!checkAll.value[index]) {
+    selectedGrades.value[index] = gradeList.value[index].gradeList.map(item => item.gradeCode)
+  }else {
+    selectedGrades.value[index] = []
+  }
+}
+const handleGradeChange = (index, val) => {
+  if(gradeList.value[index].gradeList.length == val.length) {
+    checkAll.value[index] = true
+  } else if(val.length == 0) {
+    checkAll.value[index] = false
+  } else {
+    checkAll.value[index] = false
+  }
+}
+const SubmitForm = async () => {
+  try {
+    submitLoading.value = true
+    let arrList = gradeList.value.map((item, index) => {
+      let arr = item.gradeList.filter(i => selectedGrades.value[index].includes(i.gradeCode))
+      return {
+        levelCode: item.levelCode,
+        levelName: item.levelName,
+        levelNumder: item.levelNumder,
+        gradeList: arr
+      }
+    }).filter(item => item.gradeList.length)
+    console.log(arrList)
+    const res = await addGrade({
+      tenantCode: authData.tenantCode,
+      schoolInfoId: authData.id,
+      adminLevelInfo: arrList
+    })
+    if(res.code == 200) {
+      ElMessage.success(res.msg)
+      authData.showDialog = false
+    } else {
+      ElMessage.error(res.msg)
+    }
+  } catch {} finally {
+    submitLoading.value = false
+  }
+}
 </script>
 
-<style>
-
+<style lang="scss" scoped>
+.page_tag {
+  padding: 0 20px;
+}
+.grade_content {
+  padding: 0 20px;
+  .grade_level {
+    margin-bottom: 10px;
+  }
+}
 </style>

+ 6 - 2
src/views/school/index.vue

@@ -159,7 +159,9 @@ const dialogData = reactive({
 const subjectShowDialog = ref(false)
 const authData = reactive({
   showDialog: false,
-  data: {}
+  id: '',
+  schoolName: '',
+  tenantCode: ''
 })
 provide('showDialog', showDialog) // 新增用户弹窗是否展示
 provide('dialogData', dialogData) // 新增用户弹窗数据
@@ -184,7 +186,9 @@ const EditUser =  (row) => {
 }
 // 设置权限
 const OpenAuth = (row) => {
-  authData.data = row
+  authData.id = row.id
+  authData.schoolName = row.tenantName
+  authData.tenantCode = row.tenantCode
   authData.showDialog = true
 }
 // 开通科目