Kaynağa Gözat

feat: api-超管

zhangjie 1 hafta önce
ebeveyn
işleme
f144d9b5f6

+ 15 - 1
src/api/admin.ts

@@ -1,4 +1,4 @@
-import axios from 'axios';
+import axios, { AxiosResponse } from 'axios';
 import {
   SchoolListPageParam,
   SchoolListPageRes,
@@ -28,6 +28,15 @@ export function updateSchoolAdmin(
   return axios.post('/api/admin/school/save', datas);
 }
 
+// 导出拆分科目模板
+export function splitCourseTemplate(): Promise<AxiosResponse<blob>> {
+  return axios.post(
+    '/api/admin/school/exportSplitCourseTemplate',
+    {},
+    { responseType: 'blob' }
+  );
+}
+
 // 授权管理
 // 授权管理信息
 export function getAuthInfo(): Promise<AuthInfo> {
@@ -39,3 +48,8 @@ export function updateAuthInfo(
 ): Promise<{ id: number }> {
   return axios.post('/api/admin/auth/save', datas);
 }
+
+// 导出硬件信息
+export function exportHardwareInfo(): Promise<AxiosResponse<blob>> {
+  return axios.post('/api/admin/auth/export', {}, { responseType: 'blob' });
+}

+ 41 - 7
src/api/types/admin.ts

@@ -2,18 +2,31 @@ import { PageResult, PageParams } from './common';
 
 export interface SchoolItem {
   id: number;
+  // 学校名称
   name: string;
+  // 学校代码
   code: string;
-  subOrgCode: string;
-  enableDoubleTrack: boolean;
-  deleteGroupAuthCode: boolean;
+  // 子机构代码
+  subCode: string;
+  // 开启双评
+  doubleTrack: boolean;
+  // 开启删除分组警告
+  groupDeleteWarn: boolean;
+  // 省份
   province: string;
+  // 城市
   city: string;
+  // 学校地址
   address: string;
+  // 管理员登录名
   adminLoginName: string;
+  // 管理员名称
   adminName: string;
+  // 访问key
   accessKey: string;
+  // 访问secret
   accessSecret: string;
+  // 描述
   description: string;
 }
 export interface SchoolListFilter {
@@ -26,29 +39,50 @@ export type SchoolUpdateParam = Partial<SchoolItem>;
 
 export interface SchoolUpdateAdminParam {
   id: number;
+  // 管理员登录名
   adminLoginName: string;
+  // 管理员名称
   adminName: string;
+  // 密码
   password: string;
 }
 
 // set
 export interface SettingItem {
   id: string | number; // 假设配置项有唯一ID
+  // 配置项类型
   type: string;
-  detail: string | boolean | number;
+  // 配置项值
+  description: string | boolean | number;
+  // 配置项key
   key: string; // 后端可能用key来区分配置项
 }
 
 // auth
 export interface AuthInfo {
-  status: string;
+  // 是否授权
+  auth: boolean;
+  // 过期时间
   expireTime: string | null;
+  // 授权模式
   authMode: string;
+  // 是否开始双评
+  doubleTrack: boolean;
+  // 开启删除分组警告
+  groupDeleteWarn: boolean;
+  // 试评模式
+  trialMode: string;
+  // 支持客观题卡
+  yjsObjectiveEnable: boolean;
 }
 
 export interface AuthUpdateParams {
+  // 授权模式
   authMode: 'offline' | 'online' | '';
+  // 授权文件
   offlineFile: File | null;
-  onlineKey: string;
-  onlineSecret: string;
+  // 访问key
+  accessKey: string;
+  // 访问secret
+  accessSecret: string;
 }

+ 6 - 0
src/utils/download-export.ts

@@ -1,4 +1,5 @@
 import { ElMessage } from 'element-plus';
+import { splitCourseTemplate, exportHardwareInfo } from '@/api/admin';
 import {
   markerClassTemplate,
   exportUserByExam,
@@ -52,6 +53,11 @@ import useLoading from '@/hooks/loading';
 import { downloadByApi } from './download';
 
 const downloadConfig = {
+  // admin
+  // 导出拆分科目模板
+  splitCourseTemplate,
+  // 导出硬件信息
+  exportHardwareInfo,
   // user
   // 评卷员班级导入模板下载
   markerClassTemplate,

+ 25 - 13
src/views/admin/auth-manage/AuthManage.vue

@@ -4,13 +4,20 @@
       <el-tab-pane label="授权信息" name="info">
         <el-descriptions :column="1" border class="info-descriptions">
           <el-descriptions-item label="当前信息">
-            {{ authInfo.status }}
+            {{ authInfo.auth ? '已授权' : '未授权' }}
           </el-descriptions-item>
           <el-descriptions-item label="过期时间">
             {{ authInfo.expireTime || '无' }}
           </el-descriptions-item>
           <el-descriptions-item label="授权模式">
-            {{ authInfo.authMode }}
+            <span>{{ authInfo.authMode }}</span>
+            <span>:</span>
+            <span v-if="authInfo.doubleTrack">双评轨迹授权</span>
+            <span v-if="authInfo.yjsObjectiveEnable">客观题卡</span>
+            <span v-if="authInfo.groupDeleteWarn">开启删除分组警告</span>
+            <span v-if="authInfo.trialMode"
+              >试评:{{ authInfo.trialMode }}</span
+            >
           </el-descriptions-item>
         </el-descriptions>
       </el-tab-pane>
@@ -86,21 +93,27 @@
   import { getAuthInfo, updateAuthInfo } from '@/api/admin';
   import { AuthInfo, AuthUpdateParams } from '@/api/types/admin';
   import { modalConfirm } from '@/utils/ui';
+  import { downloadExport } from '@/utils/download-export';
+
   import useLoading from '@/hooks/loading';
 
   const activeTab = ref('info');
 
   const authInfo = reactive<AuthInfo>({
-    status: '未授权',
+    auth: false,
     expireTime: null,
     authMode: '离线激活',
+    doubleTrack: false,
+    groupDeleteWarn: false,
+    trialMode: '成绩汇总模式',
+    yjsObjectiveEnable: false,
   });
 
   const updateForm = reactive<AuthUpdateParams>({
     authMode: 'offline', // 默认离线激活
     offlineFile: null,
-    onlineKey: '',
-    onlineSecret: '',
+    accessKey: '',
+    accessSecret: '',
   });
 
   const formRef = ref<FormInstance>();
@@ -109,7 +122,7 @@
     offlineFile: [
       { required: true, message: '请选择授权文件', trigger: 'change' },
     ],
-    onlineKey: [
+    accessKey: [
       {
         required: true,
         message: '请输入key',
@@ -121,7 +134,7 @@
         trigger: 'change',
       },
     ],
-    onlineSecret: [
+    accessSecret: [
       {
         required: true,
         message: '请输入secret',
@@ -150,10 +163,9 @@
     authInfo.authMode = '离线激活: 双评轨迹授权 试评: 成绩汇总模式';
   });
 
-  const exportHardwareInfo = () => {
-    // TODO:实际应调用API导出硬件信息
-    ElMessage.success('硬件信息导出指令已发送,请注意查收文件。');
-    // 例如:window.location.href = '/api/auth/export-hardware';
+  // 导出授权管理信息
+  const exportHardwareInfo = async () => {
+    await downloadExport('exportHardwareInfo');
   };
 
   const beforeUpload = (file: File) => {
@@ -194,8 +206,8 @@
       } else if (updateForm.authMode === 'online') {
         params = {
           authMode: updateForm.authMode,
-          key: updateForm.onlineKey,
-          secret: updateForm.onlineSecret,
+          accessKey: updateForm.accessKey,
+          accessSecret: updateForm.accessSecret,
         };
         await updateAuthInfo(params);
       }

+ 6 - 6
src/views/admin/school-manage/ModifySchool.vue

@@ -28,11 +28,11 @@
       <el-form-item label="详细地址" prop="address">
         <el-input v-model="formModel.address" placeholder="请输入详细地址" />
       </el-form-item>
-      <el-form-item label="开启双评轨迹" prop="enableDoubleTrack">
-        <el-switch v-model="formModel.enableDoubleTrack" />
+      <el-form-item label="开启双评轨迹" prop="doubleTrack">
+        <el-switch v-model="formModel.doubleTrack" />
       </el-form-item>
-      <el-form-item label="删除分组授权码" prop="deleteGroupAuthCode">
-        <el-switch v-model="formModel.deleteGroupAuthCode" />
+      <el-form-item label="删除分组授权码" prop="groupDeleteWarn">
+        <el-switch v-model="formModel.groupDeleteWarn" />
       </el-form-item>
       <el-form-item label="描述" prop="description">
         <el-input
@@ -96,8 +96,8 @@
     province: '',
     city: '',
     address: '',
-    enableDoubleTrack: false,
-    deleteGroupAuthCode: false,
+    doubleTrack: false,
+    groupDeleteWarn: false,
     description: '',
     accessKey: '',
     accessSecret: '',

+ 5 - 12
src/views/admin/school-manage/SchoolManage.vue

@@ -21,8 +21,8 @@
     <el-table class="page-table" :data="dataList" border stripe>
       <el-table-column prop="name" label="名称" />
       <el-table-column prop="code" label="代码" />
-      <el-table-column prop="subOrgCode" label="子机构代码" width="100" />
-      <el-table-column prop="enableDoubleTrack" label="双评轨迹" width="100" />
+      <el-table-column prop="subCode" label="子机构代码" width="100" />
+      <el-table-column prop="doubleTrack" label="双评轨迹" width="100" />
       <el-table-column prop="province" label="省份" />
       <el-table-column prop="city" label="城市" />
       <el-table-column label="操作">
@@ -63,7 +63,7 @@
     title="科目拆分"
     upload-url="/api/admin/site/import"
     :format="['xls', 'xlsx']"
-    :download-handle="downloadTemplate"
+    :download-handle="() => downloadExport('splitCourseTemplate')"
     download-filename="科目拆分模板.xlsx"
     :auto-upload="false"
     :before-submit-handle="beforeSubmitHandle"
@@ -82,10 +82,11 @@
 
 <script setup lang="ts">
   import { reactive, ref } from 'vue';
+  import { ElMessage } from 'element-plus';
   import { schoolListPage } from '@/api/admin';
   import { SchoolItem, SchoolListFilter } from '@/api/types/admin';
   import useTable from '@/hooks/table';
-  import { ElMessage } from 'element-plus';
+  import { downloadExport } from '@/utils/download-export';
 
   // import useDictOption from '@/hooks/dict-option';
   // import useLoading from '@/hooks/loading';
@@ -140,14 +141,6 @@
     importDialogRef.value?.open();
   }
 
-  async function downloadTemplate() {
-    // const res = await downloadByApi(() => agentTemplate()).catch((e) => {
-    //   Message.error(e || '下载失败,请重新尝试!');
-    // });
-    // if (!res) return;
-    // Message.success('下载成功!');
-  }
-
   async function beforeSubmitHandle() {
     if (!importExamId.value) {
       ElMessage.error('请选择考试');

+ 11 - 11
src/views/admin/set-manage/SetManage.vue

@@ -2,7 +2,7 @@
   <div class="part-box">
     <el-table class="page-table" :data="tableData" border stripe>
       <el-table-column prop="type" label="类型" width="180" />
-      <el-table-column prop="detail" label="详情" />
+      <el-table-column prop="description" label="详情" />
       <el-table-column label="操作" width="100">
         <template #default="scope">
           <el-button type="primary" link @click="handleEdit(scope.row)"
@@ -25,15 +25,15 @@
       <el-form-item label="类型">
         <el-input v-model="formModel.type" readonly disabled />
       </el-form-item>
-      <el-form-item label="详情" prop="detail">
+      <el-form-item label="详情" prop="description">
         <el-input
           v-if="!isEnableDetail"
-          v-model="formModel.detail"
+          v-model="formModel.description"
           type="textarea"
           :rows="4"
           placeholder="请输入详情"
         />
-        <el-switch v-else v-model="formModel.detail" />
+        <el-switch v-else v-model="formModel.description" />
       </el-form-item>
     </el-form>
     <template #footer>
@@ -68,7 +68,7 @@
   const initialFormState: Partial<SettingItem> = {
     id: '',
     type: '',
-    detail: '',
+    description: '',
     key: '',
   };
   const formModel = reactive({ ...initialFormState });
@@ -81,7 +81,7 @@
   });
 
   const rules = reactive<FormRules>({
-    detail: [{ required: true, message: '请输入详情', trigger: 'blur' }],
+    description: [{ required: true, message: '请输入详情', trigger: 'blur' }],
   });
 
   // 模拟API调用获取数据
@@ -92,25 +92,25 @@
           {
             id: 1,
             type: '图片服务',
-            detail: 'http://192.168.10.83:9004/',
+            description: 'http://192.168.10.83:9004/',
             key: 'image_service_url',
           },
           {
             id: 2,
             type: '评阅时长',
-            detail: '60',
+            description: '60',
             key: 'review_duration_minutes',
           },
           {
             id: 3,
             type: '启动阅卷',
-            detail: false,
+            description: false,
             key: 'enable_marking_process',
           },
           {
             id: 4,
             type: '计算扫描卡张数',
-            detail: false,
+            description: false,
             key: 'calculate_scanned_cards',
           },
         ]);
@@ -149,7 +149,7 @@
       const valid = await formRef.value?.validate().catch(() => false);
       if (!valid) return;
       loading.value = true;
-      // const paramsToUpdate = { key: formModel.key, value: formModel.detail, id: formModel.id };
+      // const paramsToUpdate = { key: formModel.key, value: formModel.description, id: formModel.id };
       // await updateSystemSetting(paramsToUpdate); // 实际API调用
       console.log('保存的配置:', formModel);
       ElMessage.success('保存成功');

+ 5 - 1
src/views/user/ModifyUser.vue

@@ -44,7 +44,11 @@
         </el-select>
       </el-form-item>
       <el-form-item label="角色" prop="role">
-        <el-select v-model="formModel.role" placeholder="请选择角色">
+        <el-select
+          v-model="formModel.role"
+          :disabled="isEdit"
+          placeholder="请选择角色"
+        >
           <el-option
             v-for="(val, key) in ROLE_TYPE"
             :key="key"