Kaynağa Gözat

feat: api-学校管理

zhangjie 1 hafta önce
ebeveyn
işleme
4517739b9f

+ 25 - 3
src/api/admin.ts

@@ -4,28 +4,50 @@ import {
   SchoolListPageRes,
   SchoolUpdateParam,
   SchoolUpdateAdminParam,
+  SchoolStatusInfo,
   AuthInfo,
   AuthUpdateParams,
 } from './types/admin';
+import { CommonActionRes } from './types/common';
 
 // 学校管理
 // 学校管理列表
 export function schoolListPage(
   params: SchoolListPageParam
 ): Promise<SchoolListPageRes> {
-  return axios.post('/api/admin/school/page', params);
+  return axios.post('/api/admin/sys/school/list', params);
 }
 // 学校信息编辑
 export function updateSchool(
   datas: SchoolUpdateParam
 ): Promise<{ id: number }> {
-  return axios.post('/api/admin/school/save', datas);
+  return axios.post('/api/admin/sys/school/save', datas);
 }
 // 学校管理员信息编辑
 export function updateSchoolAdmin(
   datas: SchoolUpdateAdminParam
 ): Promise<{ id: number }> {
-  return axios.post('/api/admin/school/save', datas);
+  return axios.post('/api/admin/sys/school/admin/save', datas);
+}
+// 获取学校管理员信息
+export function getSchoolAdminInfo(
+  schoolId: number
+): Promise<SchoolUpdateAdminParam> {
+  return axios.post(
+    '/api/admin/sys/school/admin/info',
+    {},
+    { params: { schoolId } }
+  );
+}
+
+// 机构同步
+export function syncSchool(): Promise<CommonActionRes> {
+  return axios.post('/api/admin/sys/school/sync', {});
+}
+
+// 获取学校状态信息
+export function getSchoolStatusInfo(): Promise<SchoolStatusInfo> {
+  return axios.post('/api/admin/sys/school/status', {});
 }
 
 // 导出拆分科目模板

+ 14 - 3
src/api/types/admin.ts

@@ -11,7 +11,7 @@ export interface SchoolItem {
   // 开启双评
   doubleTrack: boolean;
   // 开启删除分组警告
-  groupDeleteWarn: boolean;
+  groupDeleteCheck: boolean;
   // 省份
   province: string;
   // 城市
@@ -40,13 +40,24 @@ export type SchoolUpdateParam = Partial<SchoolItem>;
 export interface SchoolUpdateAdminParam {
   id: number;
   // 管理员登录名
-  adminLoginName: string;
+  loginName: string;
   // 管理员名称
-  adminName: string;
+  name: string;
   // 密码
   password: string;
 }
 
+export interface SchoolStatusInfo {
+  // 是否允许设置双评
+  doubleTrack: boolean;
+  // 是否允许删除分组警告
+  groupDeleteWarn: boolean;
+  // 是否正在同步
+  running: boolean;
+  // 是否能够同步
+  syncEnable: boolean;
+}
+
 // set
 export interface SettingItem {
   id: string | number; // 假设配置项有唯一ID

+ 5 - 0
src/api/types/common.ts

@@ -26,3 +26,8 @@ export interface CoverArea {
   w: number;
   h: number;
 }
+
+export interface CommonActionRes {
+  success: boolean;
+  message: string;
+}

+ 15 - 5
src/views/admin/school-manage/ModifySchool.vue

@@ -28,11 +28,19 @@
       <el-form-item label="详细地址" prop="address">
         <el-input v-model="formModel.address" placeholder="请输入详细地址" />
       </el-form-item>
-      <el-form-item label="开启双评轨迹" prop="doubleTrack">
+      <el-form-item
+        v-if="props.statusInfo?.doubleTrack"
+        label="开启双评轨迹"
+        prop="doubleTrack"
+      >
         <el-switch v-model="formModel.doubleTrack" />
       </el-form-item>
-      <el-form-item label="删除分组授权码" prop="groupDeleteWarn">
-        <el-switch v-model="formModel.groupDeleteWarn" />
+      <el-form-item
+        v-if="props.statusInfo?.groupDeleteWarn"
+        label="删除分组授权码"
+        prop="groupDeleteCheck"
+      >
+        <el-switch v-model="formModel.groupDeleteCheck" />
       </el-form-item>
       <el-form-item label="描述" prop="description">
         <el-input
@@ -64,7 +72,7 @@
   import { ref, reactive, computed } from 'vue';
   import type { FormInstance, FormRules } from 'element-plus';
   import { ElMessage } from 'element-plus';
-  import type { SchoolItem } from '@/api/types/admin';
+  import type { SchoolItem, SchoolStatusInfo } from '@/api/types/admin';
   import useModal from '@/hooks/modal';
   import useLoading from '@/hooks/loading';
   import { objAssign, objModifyAssign } from '@/utils/utils';
@@ -80,10 +88,12 @@
 
   interface Props {
     rowData: SchoolItem;
+    statusInfo: SchoolStatusInfo;
   }
 
   const props = withDefaults(defineProps<Props>(), {
     rowData: {} as SchoolItem,
+    statusInfo: {} as SchoolStatusInfo,
   });
   const emit = defineEmits(['modified']);
 
@@ -97,7 +107,7 @@
     city: '',
     address: '',
     doubleTrack: false,
-    groupDeleteWarn: false,
+    groupDeleteCheck: false,
     description: '',
     accessKey: '',
     accessSecret: '',

+ 12 - 21
src/views/admin/school-manage/ModifySchoolAdmin.vue

@@ -16,17 +16,11 @@
       :rules="rules"
       label-width="100px"
     >
-      <el-form-item label="名称" prop="adminName">
-        <el-input
-          v-model="formModel.adminName"
-          placeholder="请输入管理员名称"
-        />
+      <el-form-item label="名称" prop="name">
+        <el-input v-model="formModel.name" placeholder="请输入名称" />
       </el-form-item>
-      <el-form-item label="账号" prop="adminLoginName">
-        <el-input
-          v-model="formModel.adminLoginName"
-          placeholder="请输入登录账号"
-        />
+      <el-form-item label="账号" prop="loginName">
+        <el-input v-model="formModel.loginName" placeholder="请输入账号" />
       </el-form-item>
       <el-form-item label="密码" prop="password">
         <el-input
@@ -62,7 +56,7 @@
   import { ElMessage } from 'element-plus';
   import useModal from '@/hooks/modal';
   import useLoading from '@/hooks/loading';
-  import { updateSchoolAdmin } from '@/api/admin'; // 假设有更新学校管理员的API
+  import { updateSchoolAdmin, getSchoolAdminInfo } from '@/api/admin'; // 假设有更新学校管理员的API
   import type { SchoolItem, SchoolUpdateAdminParam } from '@/api/types/admin'; // 假设的管理员信息类型
   import { objModifyAssign } from '@/utils/utils';
 
@@ -89,8 +83,8 @@
   const initialFormState: SchoolUpdateAdminParam & { confirmPassword: string } =
     {
       id: 0,
-      adminName: '',
-      adminLoginName: '',
+      name: '',
+      loginName: '',
       password: '',
       confirmPassword: '',
     };
@@ -120,12 +114,8 @@
   };
 
   const rules = reactive<FormRules>({
-    adminName: [
-      { required: true, message: '请输入管理员名称', trigger: 'blur' },
-    ],
-    adminLoginName: [
-      { required: true, message: '请输入登录账号', trigger: 'blur' },
-    ],
+    name: [{ required: true, message: '请输入名称', trigger: 'blur' }],
+    loginName: [{ required: true, message: '请输入账号', trigger: 'blur' }],
     password: [
       { required: true, validator: validatePass, trigger: 'blur' },
       { min: 6, message: '密码长度至少为6位', trigger: 'blur' },
@@ -165,7 +155,8 @@
   }
 
   /* init modal */
-  function modalBeforeOpen() {
-    objModifyAssign(formModel, props.rowData || {});
+  async function modalBeforeOpen() {
+    const res = await getSchoolAdminInfo(props.rowData.id);
+    objModifyAssign(formModel, res || {});
   }
 </script>

+ 59 - 18
src/views/admin/school-manage/SchoolManage.vue

@@ -11,9 +11,16 @@
       </el-form-item>
       <el-form-item>
         <el-button type="primary" @click="toPage(1)">查询</el-button>
-        <el-button type="primary" status="success" @click="onAdd"
+        <el-button type="success" status="success" @click="onAdd"
           >新建</el-button
         >
+        <el-button
+          v-if="schoolStatusInfo.syncEnable"
+          :loading="loading || schoolStatusInfo.running"
+          @click="onSync"
+        >
+          机构同步
+        </el-button>
       </el-form-item>
     </el-form>
   </div>
@@ -22,10 +29,14 @@
       <el-table-column prop="name" label="名称" />
       <el-table-column prop="code" label="代码" />
       <el-table-column prop="subCode" label="子机构代码" width="100" />
-      <el-table-column prop="doubleTrack" label="双评轨迹" width="100" />
+      <el-table-column prop="doubleTrack" label="双评轨迹" width="100">
+        <template #default="scope">
+          {{ scope.row.doubleTrack ? '开启' : '关闭' }}
+        </template>
+      </el-table-column>
       <el-table-column prop="province" label="省份" />
       <el-table-column prop="city" label="城市" />
-      <el-table-column label="操作">
+      <el-table-column label="操作" width="240">
         <template #default="scope">
           <el-button size="small" link @click="onEdit(scope.row)">
             修改
@@ -53,7 +64,12 @@
   </div>
 
   <!-- 编辑学校 -->
-  <ModifySchool ref="modifySchoolRef" :row-data="curRow" @modified="getList" />
+  <ModifySchool
+    ref="modifySchoolRef"
+    :row-data="curRow"
+    :status-info="schoolStatusInfo"
+    @modified="getList"
+  />
   <!-- 编辑学校管理员 -->
   <ModifySchoolAdmin ref="modifySchoolAdminRef" :row-data="curRow" />
 
@@ -82,18 +98,19 @@
 </template>
 
 <script setup lang="ts">
-  import { computed, reactive, ref } from 'vue';
+  import { computed, reactive, ref, onMounted } from 'vue';
   import { useRoute } from 'vue-router';
   import { ElMessage } from 'element-plus';
-  import { schoolListPage } from '@/api/admin';
-  import { SchoolItem, SchoolListFilter } from '@/api/types/admin';
+  import { schoolListPage, syncSchool, getSchoolStatusInfo } from '@/api/admin';
+  import {
+    SchoolItem,
+    SchoolListFilter,
+    SchoolStatusInfo,
+  } from '@/api/types/admin';
   import useTable from '@/hooks/table';
+  import useLoading from '@/hooks/loading';
   import { downloadExport } from '@/utils/download-export';
 
-  // import useDictOption from '@/hooks/dict-option';
-  // import useLoading from '@/hooks/loading';
-  // import { useAppStore, useUserStore } from '@/store';
-
   import ModifySchool from './ModifySchool.vue';
   import ModifySchoolAdmin from './ModifySchoolAdmin.vue';
 
@@ -103,10 +120,12 @@
 
   const route = useRoute();
 
-  // const appStore = useAppStore();
-  // const userStore = useUserStore();
+  // 学校状态信息
+  const schoolStatusInfo = ref<SchoolStatusInfo>({} as SchoolStatusInfo);
+  async function getSchoolStatus() {
+    schoolStatusInfo.value = await getSchoolStatusInfo();
+  }
 
-  // const preDate = getBeforeWeek();
   const searchModel = reactive<SchoolListFilter>({
     name: '',
   });
@@ -118,7 +137,6 @@
   const curRow = ref({} as SchoolItem);
   const modifySchoolRef = ref();
   function onEdit(row: SchoolItem) {
-    console.log(row);
     curRow.value = row;
     modifySchoolRef.value?.open();
   }
@@ -129,9 +147,8 @@
 
   const modifySchoolAdminRef = ref();
   function onEditAdmin(row: SchoolItem) {
-    console.log(row);
     curRow.value = row;
-    modifySchoolRef.value?.open();
+    modifySchoolAdminRef.value?.open();
   }
   function onEditRoleAuth(row: SchoolItem) {
     route.push({
@@ -141,7 +158,27 @@
       },
     });
   }
-  // 导入
+  // 同步
+  const { loading, setLoading } = useLoading();
+  async function onSync() {
+    if (loading.value) return;
+
+    setLoading(true);
+    try {
+      const res = await syncSchool();
+      if (res.success) {
+        ElMessage.success('同步成功');
+      } else {
+        ElMessage.error(res.message);
+      }
+    } catch (error) {
+      console.log(error);
+    } finally {
+      setLoading(false);
+    }
+  }
+
+  // 科目拆分
   const importDialogRef = ref();
   const importExamId = ref(0);
   const uploadData = computed(() => {
@@ -167,4 +204,8 @@
   function importSuccess() {
     importDialogRef.value?.close();
   }
+
+  onMounted(() => {
+    getSchoolStatus();
+  });
 </script>