Explorar o código

扫描标准答案功能更新

dengshaobo hai 1 mes
pai
achega
3f878c2d73

+ 2 - 2
.env.development

@@ -1,6 +1,6 @@
 # //开发环境配置
 
 VITE_API_BASE_URL =
-VITE_RSA_PUBLIC_KEY = MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDmkP5hUxr7x3t76s9kiVrP1acGVp3JFyPsSoZzV+FvFSc78rfLSwEhj0WkUC0O+entDZ/hnvX1pSPsY8VwXtc20n5pSuo/G1HzrFSUCmFD9HWX3RRrFTHGn+G01CQswO/2JZokJQzbTsNDUnlK/w//NYQvXhxOhF9fM/S1L73CkYPIabHmIM1Rc8uik66XlTXrb9+gDQ8Uon+QZTGo3BzxWceONYYnVZZXdFQtzvaHLI5av8LSU5MLp03faX8fYlfB5FwyBL+dQZRVyTP09pbESn30487tsa0/+0pRZ1D+4Tsc2cjIpuXEg1IKGLrs0TSX78T1fROt/JcZ/lt3Tn9xAgMBAAECggEADEAD4/PgaSQuIWVWY4cQth4p46JSe86o7/L9tb8jkR1UmlDJBxoTE09jadmAq10H2rpwljI16zk88WBTqya+1IDWio2aaIPxFLtBOyRaCpxAazMp1I6puF3iRhNHYMFXfoJ88BKv3i8PHNKS8zMeDHcxcLrVUi6iSpKeG8pPkLjEqY0eccYjTUOyh2Q8YmLLwO3+lOOYrD9TcUZ1NqsZCqOI3pzLNONYatqaPprqiuZLUcloiO7D1OJ52LtTzlP2z7/jXM4fwUZK1/9U79zMYmjJifIORY9UiildkGaKzYs3G1ZAKiLKBehf7tGzorU0+tSIF99voyjhed286fMeqQKBgQDn7wH6oadnfZL5NknEaioua4GJ0LhBeZCiaLReYs116554zzBubb4Y752DTE4ka8LKsSIcnCqNbc/b6q0Kw+yThJJ5F/nFgaCzKHfhImqtslolqW5K1UVwUZ9RdFUeeqt8w+CtcnrJs/jIswv7XOnfHm6VKd0gSlpbnAPEVua75wKBgQD+farEb4PCNsOTaLQYcy0dSDh68lBskc5k+kMYmDsUloaOQel2S9ufEEYxZgy4Y2b0U9Y8nEJByFBoKZW+Mplp+hH9OWaK/QpMylh1uwoN44jUyRAKhR211kBZMXcgbIjr49PxG261OydxIyu9ntcJApVpHK30qzR+DBRD7H8+5wKBgQDGz/hQUZXgfqIoAkNFnQO/euQ1sLbhWUWEEmDar7MTq//R6zjG0EettGi/Df/F9KGrgh+NishnJ4SQLSBcJAp9gZzVNJoklbOdH8lzMT9k2Yew1QX4G81ENJNvDVuRnvG1J2tHAuUCVcWitOhGdiT732hHcPVeIp5F/Py1pxBubQKBgQDlVvJxm90tRJTzXsQN1J2vacocYgpADRXmwfF9VJLJdu1DffqadLoymkPneIO2Fz5MqNDERj0fcxmjBPbBNHA0pPtZLEVQs8B4e1FEp43j/kztFVSzZkrj93R97KniOm0Zx3LUMViPUgO1XXCprV8z63QiCYpql27yuIf6vkHduQKBgEe/BLwVHxAxmGzt/k0t9TZYn4MMQd5nx1UWlFzI+mNkNQqNC5cLGWarazeHC2YdcaYAsSMfi11NTvnVY79EbXYomxSBoN3Y63ML7W6Cj9fInVtUF6j002sdRyfey+e2BQtYiUHb9xW6A7sf4LyLZJ64LGYIh1uqWQc2iUeUsSWQ
+VITE_RSA_PUBLIC_KEY =MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDmkP5hUxr7x3t76s9kiVrP1acGVp3JFyPsSoZzV+FvFSc78rfLSwEhj0WkUC0O+entDZ/hnvX1pSPsY8VwXtc20n5pSuo/G1HzrFSUCmFD9HWX3RRrFTHGn+G01CQswO/2JZokJQzbTsNDUnlK/w//NYQvXhxOhF9fM/S1L73CkYPIabHmIM1Rc8uik66XlTXrb9+gDQ8Uon+QZTGo3BzxWceONYYnVZZXdFQtzvaHLI5av8LSU5MLp03faX8fYlfB5FwyBL+dQZRVyTP09pbESn30487tsa0/+0pRZ1D+4Tsc2cjIpuXEg1IKGLrs0TSX78T1fROt/JcZ/lt3Tn9xAgMBAAECggEADEAD4/PgaSQuIWVWY4cQth4p46JSe86o7/L9tb8jkR1UmlDJBxoTE09jadmAq10H2rpwljI16zk88WBTqya+1IDWio2aaIPxFLtBOyRaCpxAazMp1I6puF3iRhNHYMFXfoJ88BKv3i8PHNKS8zMeDHcxcLrVUi6iSpKeG8pPkLjEqY0eccYjTUOyh2Q8YmLLwO3+lOOYrD9TcUZ1NqsZCqOI3pzLNONYatqaPprqiuZLUcloiO7D1OJ52LtTzlP2z7/jXM4fwUZK1/9U79zMYmjJifIORY9UiildkGaKzYs3G1ZAKiLKBehf7tGzorU0+tSIF99voyjhed286fMeqQKBgQDn7wH6oadnfZL5NknEaioua4GJ0LhBeZCiaLReYs116554zzBubb4Y752DTE4ka8LKsSIcnCqNbc/b6q0Kw+yThJJ5F/nFgaCzKHfhImqtslolqW5K1UVwUZ9RdFUeeqt8w+CtcnrJs/jIswv7XOnfHm6VKd0gSlpbnAPEVua75wKBgQD+farEb4PCNsOTaLQYcy0dSDh68lBskc5k+kMYmDsUloaOQel2S9ufEEYxZgy4Y2b0U9Y8nEJByFBoKZW+Mplp+hH9OWaK/QpMylh1uwoN44jUyRAKhR211kBZMXcgbIjr49PxG261OydxIyu9ntcJApVpHK30qzR+DBRD7H8+5wKBgQDGz/hQUZXgfqIoAkNFnQO/euQ1sLbhWUWEEmDar7MTq//R6zjG0EettGi/Df/F9KGrgh+NishnJ4SQLSBcJAp9gZzVNJoklbOdH8lzMT9k2Yew1QX4G81ENJNvDVuRnvG1J2tHAuUCVcWitOhGdiT732hHcPVeIp5F/Py1pxBubQKBgQDlVvJxm90tRJTzXsQN1J2vacocYgpADRXmwfF9VJLJdu1DffqadLoymkPneIO2Fz5MqNDERj0fcxmjBPbBNHA0pPtZLEVQs8B4e1FEp43j/kztFVSzZkrj93R97KniOm0Zx3LUMViPUgO1XXCprV8z63QiCYpql27yuIf6vkHduQKBgEe/BLwVHxAxmGzt/k0t9TZYn4MMQd5nx1UWlFzI+mNkNQqNC5cLGWarazeHC2YdcaYAsSMfi11NTvnVY79EbXYomxSBoN3Y63ML7W6Cj9fInVtUF6j002sdRyfey+e2BQtYiUHb9xW6A7sf4LyLZJ64LGYIh1uqWQc2iUeUsSWQ
 # webSocket环境地址配置
-VITE_WEB_SOCKET_URL= wss://dev3.k12100.net/teaching/api/v1/teaching/websocket/
+VITE_WEB_SOCKET_URL=wss://index.k12100.net/teaching/api/v1/teaching/websocket/

+ 18 - 0
src/api/exam.ts

@@ -448,4 +448,22 @@ export const getExamClassList= (data:any):Promise<ApiResponse> => {
     method: 'get',
     params: data
   })
+}
+
+// 49. 扫描答案  前获取标识 
+export const getScanSetCertificate= (data:any):Promise<ApiResponse> => {
+  return request({
+    url: '/api/v1/ai_exam_scan/obtain_scan_set_certificate',
+    method: 'get',
+    params: data
+  })
+}
+
+// 50. 扫描答案  获取扫描答案状态
+export const getScanAnswerStates= (data:any):Promise<ApiResponse> => {
+  return request({
+    url: '/api/v1/ai_exam_scan/find_ai_answer_recognize_result',
+    method: 'get',
+    params: data
+  })
 }

+ 196 - 41
src/views/exam/question.vue

@@ -2,8 +2,8 @@
   <div class="detail_main">
     <div class="question_header">
         <div class="item_title">
-            <!-- <div class="item_step">1</div>
-            扫描标准答案:<el-button type="primary"  @click="GotoScan()" :loading="scanLoading" style="width: 88px;">{{scanText}}</el-button>   -->
+            <div class="item_step">1</div>
+            扫描标准答案:<el-button type="primary"  @click="GotoScan()" :loading="scanLoading" style="width: 88px;">{{scanText}}</el-button>  
             <!-- <span class="preview_btn">预览</span> -->
             <!-- <el-button style="margin-left: 10px;width: 116px;">引用试题结构</el-button> -->
         </div>
@@ -15,7 +15,7 @@
     <div class="page_jg_20"></div>
     <div class="page_module">
         <div class="item_title">
-            <!-- <div class="item_step">2</div> -->
+            <div class="item_step">2</div>
             设置试题结构:
             <div class="item_search">
                 <div class="search_name">题目从</div>
@@ -52,7 +52,7 @@
         </div>
         <div class="page_jg_16"></div>
         <div class="table_42">
-            <el-table :data="tableData" style="width: 100%" :height="tableHeight">
+            <el-table :data="tableData" v-loading="tableLoading" element-loading-text="加载中……" element-loading-spinner="el-icon-loading" element-loading-background="#ffffff" style="width: 100%" :height="tableHeight">
                 <el-table-column prop="questionName" label="题目名称" width="100">
                 </el-table-column>
                 <!-- 题目类型 questionType 1 单校  2多选 -->
@@ -170,14 +170,17 @@ import ChooseTemplate from './components/chooseTemplate.vue';
 import EditorQuestion from './components/EditorQuestion.vue';
 
 import { ElMessageBox,ElMessage } from 'element-plus' 
-import { getSmartQuestionList,getTemplateInfo,setQuestion,saveQuestion,deleteAllQuestion,deleteSingleQuestion,getExamProcess} from '@/api/exam'
+import { getScanSetCertificate,getScanAnswerStates,getSmartQuestionList,getTemplateInfo,setQuestion,saveQuestion,deleteAllQuestion,deleteSingleQuestion,getExamProcess} from '@/api/exam'
 import scanCommon from '@/utils/scanCommon.ts'
 import { useThrottleFn } from '@vueuse/core';
-
+import { useUserStore } from '@/store/user'
 // 实例化 Store
 const examStore = useExamStore()
 const router = useRouter()
+const userStore = useUserStore()
 
+// 修改 schoolId 计算属性,直接从 store 获取
+const selectSchoolId = computed(() => userStore.schoolId)
 // 定义题目数据的接口类型
 interface QuestionItem {
   id?: string;
@@ -205,15 +208,21 @@ const scanText=ref('开始扫描');
 const templateQuestionCount=ref(0);//模板题目总数量
 const showChooseTemplate=ref(false);// 弹出选择模板的弹窗
 const tableData = ref<QuestionItem[]>([])
+const tableLoading = ref(true)//表格loading状态
 const enterStandardEdit=ref<HTMLElement>();//标准答案编辑组件实例
 
 const tableHeight = ref(400)// 表格高度
 const answerList=['A','B','C','D','E','F','G','H','I','J','K']//答案列表
 const tflist=['T','F']//判断题列表
 
+let uploadUrl=`https://www.k12100.com/teaching/api/v1/ai_exam_scan/upload_multi_img`;//图片上传地址
+let updateCountUrl=`https://www.k12100.com/teaching/api/v1/ai_exam_scan/record_batch_scan_number`;
+
+
 //扫描答案
 const scanLoading=ref(false);//开始扫描答案
-const uploadUrl=ref('');//扫描答案的上传的图片地址
+let skipCertificateNextScan = false;//未检测到纸张后,下次点击开始扫描时跳过后端证书接口,直接下发扫描仪指令
+
 const examSubjectCode=ref('');//扫描答案的科目编号
 const showScanAnswer=ref(false);//扫描答案预览
 const imageFilesList=ref<any[]>([]);//扫描答案的图片列表
@@ -224,6 +233,8 @@ const examSubjectId = computed(() => {
   return examStore.currentExam?.id
 })//计算属性
 
+
+
 const templateId=computed(() => {
   return examStore.currentExam?.templateId
 })//计算属性
@@ -470,6 +481,27 @@ const DeleteSingle=(item:any)=>{
     })
 }
 
+const ConfigRequestUrlByEnv= () =>{
+    console.log("打印环境", import.meta.env.MODE);
+    if (import.meta.env.MODE === 'development') 
+    {
+        //本地开发环境:写死测试环境地址
+      
+        uploadUrl = `https://index.k12100.net/teaching/api/v1/ai_exam_scan/upload_multi_img`;//图片上传地址
+        updateCountUrl = `https://index.k12100.net/teaching/api/v1/ai_exam_scan/record_batch_scan_number`;//更新扫描数量地址
+    } 
+    else 
+    {
+        //线上环境(测试/生产):读取配置的环境变量
+       
+        uploadUrl = `${import.meta.env.VITE_API_BASE_URL_API}/api/v1/ai_exam_scan/upload_multi_img`;//图片上传地址
+        updateCountUrl = `${import.meta.env.VITE_API_BASE_URL_API}/api/v1/ai_exam_scan/record_batch_scan_number`;//更新扫描数量地址
+    }
+
+    console.log("打印上传图片地址", uploadUrl);
+    console.log("打印更新扫描数量地址", updateCountUrl);
+}
+
 //编辑单个题目
 const EditorSingle=(item:any)=>{
     console.log("打印编辑单个题目",item)
@@ -478,8 +510,7 @@ const EditorSingle=(item:any)=>{
 // 打开扫描仪器
 const GotoScan = useThrottleFn(() => {
 
-    ElMessage.warning("暂未开放,敬请期待!")
-    return;
+
 //   showSelectType.value = 'scan';
     console.log("打印打开扫描仪器",scanCommon.isClientConnected())
     if (!scanClientConnected.value) {
@@ -489,8 +520,36 @@ const GotoScan = useThrottleFn(() => {
   
     scanLoading.value = true;
     scanText.value='扫描中...';
+
+    //未检测到纸张后的重试:跳过后端证书接口,直接下发扫描仪指令并恢复轮询
+    if (skipCertificateNextScan) {
+        skipCertificateNextScan = false;
+        StartScan();
+        ScheduleScanStatePolling();
+        return;
+    }
     //   showScanAnswer.value=true;
-    StartScan();
+    //先调用后端的接口 
+    const param={
+        examSubjectId:examSubjectId.value,
+    };
+    getScanSetCertificate(param).then((res:any)=>{ 
+        console.log("打印返回结果",res);
+        if(res.code==200)
+        {
+            StartScan();
+            //启动扫描答案成功后,开启轮询获取扫描答案状态(每2秒一次)
+            ScheduleScanStatePolling();
+        }
+        else
+        {
+            //后端证书接口失败:复位按钮,允许用户重新点击开始扫描
+            scanLoading.value = false;
+            scanText.value='开始扫描';
+            ElMessage.error(res.msg);
+        }
+    })
+    
 }, 5000);
 
 // 启动扫描
@@ -498,29 +557,119 @@ const StartScan = () => {
     scanCommon.init(HandleScanResult); // 跟扫描仪插件 websocket 连接
 
     console.log("打印 VUE_APP_BASE_API", import.meta.env.VITE_APP_BASE_API); // Vue3/Vite 环境变量获取方式
-    console.log("打印上传图片地址", uploadUrl.value);
-
-    let json = {
-        "action": "scanTemplate", // scanTemplate 扫描模板指令
-        "batchNumber": 'template', // 模板信息
-        "subjectCode": examSubjectCode.value, // 科目编号
-        "paperSchema": 1, // 默认单面
-        "token": '', // token 信息
-        "dpi": 150, // dpi 参数
-        "useDriveUI": 0, // 默认不弹窗
-        "uploadUrl": '', // 图片上传地址
-        "jsonParam": '', // 后端使用的参数
+    console.log("打印上传图片地址", uploadUrl);
+
+    //开始扫描
+    let jsonParam={
+        examSubjectId:examSubjectId.value,
+        batchNumber:'9999',//批次号 固定9999  代表扫描答案
+        // sensitive: 35,//灵敏度参数 固定35
+        settingFlag:1,//设置参数 (0-正常图片 1- 设置题目 以及答案)
+        schoolId:selectSchoolId.value//学校id  联校单校都需要学校id
     };
+    let json = {
+        "action":"startScan",//交互指令参数
+        "batchNumber":'9999',//批次号  这里传给客户端的批次号需要进行处理 截取批次id后5位拼接batchNumber
+        "subjectCode":examSubjectCode.value,//科目编号
+        "paperSchema":1,//this.paperSchema,// 单双面//页面类型  1 单面  2  双面
+        "token":localStorage.getItem('token'),//token信息
+        "uploadUrl":uploadUrl, // 图片上传地址
+        "updateCountUrl":updateCountUrl,//更新扫描纸张数量接口  接口参数 批次id post 请求 id
+        "batchId":'10000',//批次号id
+
+        "dpi":150,//dpi参数 设置图片清晰度质量的
+        "isColor":1,//是否彩色图片 手阅卡扫描彩色图片 0  黑白  1 彩色
+        "useDriveUI":0,//startScan和scanTemplate增加useDriveUI参数,=1时会弹框,其他值或不写则不弹
+        "jsonParam":JSON.stringify(jsonParam),// 后端使用的参数 json字符串 后端接口固定三个参数  1:jsonParam  2:seqNumber(这个批次的图片序号:从1开始)   3:file 图片文件
+    };//正式版参数 
+    console.log("打印发送的数据",JSON.stringify(json));
+    setTimeout(() => {
+        scanCommon.send(JSON.stringify(json))
+    },100)
+};
 
-    console.log("打印参数", json);
 
-    setTimeout(() => {
-        console.log("打印发送的 send 参数", json);
-        // scanLoading.value = false;
-        scanCommon.send(JSON.stringify(json));
-    }, 2500);
+//扫描状态轮询定时器
+let scanStateTimer: ReturnType<typeof setTimeout> | null = null;
+
+//停止扫描状态轮询
+const StopScanStatePolling=()=>{
+    if(scanStateTimer){
+        clearTimeout(scanStateTimer);
+        scanStateTimer = null;
+    }
+};
+
+//继续轮询:2秒后再次调用获取扫描答案状态
+const ScheduleScanStatePolling=()=>{
+    StopScanStatePolling();//先清除已有定时器,避免重复轮询
+    scanStateTimer = setTimeout(()=>{
+        GetScanAnswerStates();
+    },2000);
 };
 
+//获取扫描答案状态
+// 轮询查询识别是否完成,每隔2S调用一次,0-表示识别完成,1-上传中 2-识别中 3-失败,其中1和2继续保持loading 0和3可以加载题目
+const GetScanAnswerStates=()=>{ 
+
+    const param={
+        examSubjectId:examSubjectId.value,
+    };
+    getScanAnswerStates(param).then((res:any)=>{ 
+        console.log("打印获取扫描答案状态",res);
+        if(res.code==200)
+        {
+            //0-表示识别完成,1-上传中 2-识别中 3-失败,其中1和2继续保持loading 0和3可以加载题目
+            if(res.data==0)
+            {
+                //识别完成:结束轮询,加载试题列表
+                StopScanStatePolling();
+                scanLoading.value = false;
+                scanText.value='扫描完成';
+                GetSmartQuestionList();//获取试题列表
+                // showScanAnswer.value = true;
+            }
+            else if(res.data==1)
+            {
+                //上传中:保持loading,2秒后继续轮询
+                scanLoading.value = true;
+                scanText.value='上传中...';
+                ScheduleScanStatePolling();
+            }
+            else if(res.data==2)
+            {
+                //识别中:保持loading,2秒后继续轮询
+                scanLoading.value = true;
+                scanText.value='识别中...';
+                ScheduleScanStatePolling();
+            }
+            else if(res.data==3)
+            {
+                //扫描失败:结束轮询,加载试题列表
+                StopScanStatePolling();
+                scanLoading.value = false;
+                scanText.value='扫描失败';
+                ElMessage.error('扫描失败');
+                GetSmartQuestionList();//获取试题列表
+            }
+        }
+        else
+        {
+            //接口异常:结束轮询,避免无限请求
+            StopScanStatePolling();
+            scanLoading.value = false;
+            ElMessage.error(res.msg);
+        }
+    })
+    .catch(()=>{
+        //请求异常:结束轮询,避免无限请求
+        StopScanStatePolling();
+        scanLoading.value = false;
+    })
+
+};
+
+
 //关闭扫描答案预览
 const CloseScanAnswer=()=>{
     showScanAnswer.value = false;
@@ -560,14 +709,18 @@ const GetSmartQuestionList=()=>{
     const params={
         examSubjectId: examSubjectId.value,
     };
+    tableLoading.value = true;//开启表格loading
     getSmartQuestionList(params).then((res) => {
         console.log("打印获取试题结构列表结果",res)
+        scanText.value='开始扫描';
         if(res.code==200)
         {
             // tableData.value=res.data;
             // 增加空值保护,确保 tableData 始终是数组
             tableData.value = Array.isArray(res.data) ? res.data : [];
         }
+    }).finally(()=>{
+        tableLoading.value = false;//关闭表格loading
     })
 }
 
@@ -601,6 +754,16 @@ const EnterSetQuestion=()=>{
 const HandleScanResult=(res:any)=>{ 
     console.log("打印扫描返回的res", res);
 
+    //未检测到纸张或卡纸(code 502):停止轮询,复位按钮,允许用户重新点击开始扫描(下次直接下发扫描仪指令,不再调后端接口)
+    if (res.code === 502) {
+        StopScanStatePolling();
+        scanLoading.value = false;
+        scanText.value='开始扫描';
+        skipCertificateNextScan = true;
+        ElMessage.error(res.msg || '未检测到纸张或卡纸');
+        return;
+    }
+
     if (res.action === 'scanTemplate') {
         const img = new Image();
         img.crossOrigin = 'Anonymous';
@@ -666,18 +829,6 @@ const HandleScanResult=(res:any)=>{
         img.src = res.url;
         
     }
-
-    if (res.action === 'startScanTemplate') {
-        if (res.code === 502) {
-            scanLoading.value = false;
-            scanText.value='开始扫描';
-            ElMessage.error(res.msg);
-        }
-
-        if (res.code === 200) {
-            ElMessage.success("扫描仪启动成功");
-        }
-    }
 }
 
 onMounted(() => {
@@ -691,7 +842,9 @@ onMounted(() => {
         scanClientConnected.value = isOnline;
         // console.log('扫描客户端连接状态:', isOnline, '版本号:', clientVersion);
     });
-    GetSmartQuestionList();
+    ConfigRequestUrlByEnv();//配置请求地址
+    GetScanAnswerStates();//获取扫描答案状态
+    
     GetTemplateInfo();
     // 初始化计算
     nextTick(() => {
@@ -705,6 +858,8 @@ onMounted(() => {
 onUnmounted(() => {
     // 移除监听,防止内存泄漏
     window.removeEventListener('resize', CalculateTableHeight)
+    // 停止扫描状态轮询,防止组件销毁后继续请求
+    StopScanStatePolling();
 })
 </script>
  

+ 21 - 4
src/views/exam/scanDetail.vue

@@ -121,14 +121,24 @@
                 </div>
             </div>
             <div class="page_pagination">
-                <el-pagination background
+                <!-- <el-pagination background
                     :page-size="pageInfo.pageSize"
                     :pager-count="11"
                     layout="prev, pager, next"
                     :total="pageInfo.total"
                     :current-page="pageInfo.pageNum" 
                     @current-change="HandlePageChange"
-                />
+                /> -->
+                <el-pagination
+                    v-model:current-page="pageInfo.pageNum"
+                    :page-sizes="[100, 200, 300, 400]"
+                    :size="size"
+                   
+                    layout="total, prev, pager, next"
+                    :total="pageInfo.total"
+                    @size-change="HandleSizeChange"
+                    @current-change="HandlePageChange"
+                    />
             </div>
         </div>
     </div>
@@ -140,7 +150,7 @@ import { useExamStore } from '@/store/exam'
 import { useRouter,useRoute  } from 'vue-router'
 import { onMounted ,ref,computed,nextTick,onUnmounted} from 'vue';
 import { ElMessageBox, ElMessage } from 'element-plus'
-
+import type { ComponentSize } from 'element-plus'
 import { getBatchDetailList,getBatchDetailImage,getTemplateDetail} from '@/api/exam'
 import PaperPreview from './components/PaperPreview.vue'
 import { Search } from '@element-plus/icons-vue'
@@ -158,7 +168,7 @@ const route = useRoute() // 2. 获取 route 实例
 const examSubjectId = computed(() => {
   return examStore.currentExam?.id
 })//计算属性
-
+const size = ref<ComponentSize>('default')
 const paramInfo=ref({
     batchNo:'all',
     statusStr:'all',//状态
@@ -356,6 +366,13 @@ const OpenViewPapers = (item:any) => {
     showPaperDialog.value=true;
 }
 
+//设置每页数量
+const HandleSizeChange=(num:number)=>
+{
+    pageInfo.value.pageSize=num;
+    LoadData();
+}
+
 //切换分页
 const HandlePageChange=(page:number)=>{
     pageInfo.value.pageNum=page;

+ 20 - 21
src/views/exam/scanList.vue

@@ -301,8 +301,8 @@ const isfilter=ref(1);//是否过滤
 const currentBatchNoId=ref('');//当前批次号id
 const loadingText=ref('');//加载文本
 const baseUrl=import.meta.env.VITE_API_BASE_URL;
-const uploadUrl=`https://www.k12100.com/teaching/api/v1/ai_exam_scan/upload_multi_img`;//图片上传地址
-const updateCountUrl=`https://www.k12100.com/teaching/api/v1/ai_exam_scan/record_batch_scan_number`;
+let uploadUrl=`https://www.k12100.com/teaching/api/v1/ai_exam_scan/upload_multi_img`;//图片上传地址
+let updateCountUrl=`https://www.k12100.com/teaching/api/v1/ai_exam_scan/record_batch_scan_number`;
 
 const webSocket=ref<InstanceType<typeof WebSocketManager> | null>(null);//websocket
 let websocketUrl=import.meta.env.VITE_WEB_SOCKET_URL;//websocket链接地址
@@ -529,22 +529,25 @@ const GetExamStatus=async ()=>{
     })
 }
 
-// 根据环境配置请求地址
+
 const ConfigRequestUrlByEnv= () =>{
     console.log("打印环境", import.meta.env.MODE);
     if (import.meta.env.MODE === 'development') 
     {
-        //开发环境
-        console.log("打印import.meta.env.VITE_API_BASE_URL", import.meta.env.VITE_WEB_SOCKET_URL);
-        websocketUrl = 'wss://www.k12100.com/teaching/api/v1/teaching/websocket/'
-        console.log("设置webSocket地址",websocketUrl);
-    } else if (import.meta.env.MODE === 'production') 
+        //本地开发环境:写死测试环境地址
+        websocketUrl = 'wss://index.k12100.net/teaching/api/v1/teaching/websocket/';
+        uploadUrl = `https://index.k12100.net/teaching/api/v1/ai_exam_scan/upload_multi_img`;//图片上传地址
+        updateCountUrl = `https://index.k12100.net/teaching/api/v1/ai_exam_scan/record_batch_scan_number`;//更新扫描数量地址
+    } 
+    else 
     {
-        websocketUrl = import.meta.env.VITE_WEB_SOCKET_URL || '';
-        console.log("打印websocket地址", websocketUrl);
-        console.log("打印上传图片地址", uploadUrl);
+        //线上环境(测试/生产):读取配置的环境变量
+        websocketUrl = import.meta.env.VITE_WEB_SOCKET_URL;//websocket链接地址
+        uploadUrl = `${import.meta.env.VITE_API_BASE_URL_API}/api/v1/ai_exam_scan/upload_multi_img`;//图片上传地址
+        updateCountUrl = `${import.meta.env.VITE_API_BASE_URL_API}/api/v1/ai_exam_scan/record_batch_scan_number`;//更新扫描数量地址
     }
-          
+    console.log("设置webSocket地址", websocketUrl);
+    console.log("打印上传图片地址", uploadUrl);
 }
 
 
@@ -615,6 +618,8 @@ const ChangeCode=()=>{
         if(res.code==200)
         {
             ElMessage.success("设置成功!")
+            examCodeEnd.value=res.data;
+            examCodeStart.value=1;
         }
         else
         {
@@ -1271,15 +1276,9 @@ onMounted(() => {
     GetScanBatchList();//获取扫描批次列表
     CalculateTableHeight();//初始化计算表格高度
     console.log("打印当前的配置",import.meta.env.VUE_APP_BASE);
-    //环境判断
-    if (import.meta.env.VUE_APP_BASE === 'https://www.k12100.com') 
-    {
-
-    }
-    else
-    {
-        ConfigRequestUrlByEnv();///连接本地时候使用
-    }
+   
+    ConfigRequestUrlByEnv();//环境配置
+    
 
     // 监听窗口大小变化
     window.addEventListener('resize', CalculateTableHeight);

+ 1 - 1
src/views/layout/components/header.vue

@@ -36,7 +36,7 @@
       <el-dialog v-model="dialogShow" title="修改密码" width="450px">
         <el-form
           :model="editPassWordData"
-          label-width="80px"
+          label-width="100px"
           :rules="editPassWordDataRules"
           ref="editPassWordForm"
         >

+ 5 - 0
tsconfig.app.json

@@ -3,6 +3,11 @@
   "compilerOptions": {
     "composite": true,
     "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.app.tsbuildinfo",
+    /* 语言与模块:moduleResolution: bundler 要求 module 为 ESNext,import.meta 也依赖此配置 */
+    "target": "ES2020",
+    "module": "ESNext",
+    "lib": ["ES2020", "DOM", "DOM.Iterable"],
+    "skipLibCheck": true,
     /* 类型声明 */
     "baseUrl": ".",
     "paths": {