Pārlūkot izejas kodu

增加配置文件 把公钥抽离到配置文件里 扫描学生 扫描批次 考场名单 接口联调

dengshaobo 3 nedēļas atpakaļ
vecāks
revīzija
8e8a8dfe97
5 mainītis faili ar 122 papildinājumiem un 16 dzēšanām
  1. 4 1
      .env.development
  2. 4 1
      .env.production
  3. 29 0
      src/api/exam.ts
  4. 6 5
      src/utils/jsencrypt.ts
  5. 79 9
      src/views/exam/scanList.vue

+ 4 - 1
.env.development

@@ -1 +1,4 @@
-VITE_API_BASE_URL = ""
+# //开发环境配置
+
+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

+ 4 - 1
.env.production

@@ -1 +1,4 @@
-VITE_API_BASE_URL = "https://admin.k12100.com/admin/"
+# 生成环境配置
+
+VITE_API_BASE_URL = https://www.k12100.com
+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

+ 29 - 0
src/api/exam.ts

@@ -180,6 +180,35 @@ export const deleteExamRoomStudent= (data:any):Promise<ApiResponse> => {
   })
 }
 
+//扫描学生 查询批次列表
+export const getBatchList= (data:any):Promise<ApiResponse> => {
+  return request({
+    url: '/api/v1/ai_exam_scan/find_scanned_batch',
+    method: 'get',
+    params: data 
+  })
+}
+
+//扫描学生  点击开始扫描获取当前批次
+export const getCurrentBatchNo= (data:any):Promise<ApiResponse> => {
+  return request({
+    url: '/api/v1/ai_exam_scan/obtain_current_batch_no',
+    method: 'get',
+    params: data 
+  })
+}
+
+//扫描学生 删除批次信息
+export const deleteBatch= (data:any):Promise<ApiResponse> => {
+  return request({
+    url: '/api/v1/ai_exam_scan/delete_batch',
+    method: 'post',
+    data
+  })
+}
+
+
+
 
 
 

+ 6 - 5
src/utils/jsencrypt.ts

@@ -1,8 +1,5 @@
 import JSEncrypt from 'jsencrypt'
 
-// 公钥字符串
-// 注意:实际项目中建议将公钥放在 .env 环境变量中,通过 import.meta.env.VITE_RSA_PUBLIC_KEY 获取,避免硬编码
-const 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`
 
 /**
  * RSA 加密方法
@@ -11,13 +8,17 @@ const PUBLIC_KEY = `MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDmkP5hUxr7
  */
 export function encryptPassword(data: string): string {
   if (!data) return ''
-  
+  // 从环境变量获取公钥
+  // import.meta.env.VITE_RSA_PUBLIC_KEY 在开发时由 Vite 注入
+  const publicKey = import.meta.env.VITE_RSA_PUBLIC_KEY
   const encryptor = new JSEncrypt()
+  console.log('打印公钥publicKey', publicKey)
   // 设置公钥
-  encryptor.setPublicKey(PUBLIC_KEY)
+  encryptor.setPublicKey(publicKey)
   
   // 执行加密
   const encrypted = encryptor.encrypt(data)
+  console.log('打印加密后的encrypted', encrypted)
   
   // encrypt 方法可能返回 false (当加密失败时),这里做一个容错处理
   return encrypted || ''

+ 79 - 9
src/views/exam/scanList.vue

@@ -77,14 +77,13 @@
                <span>
                 识别号:
                 <el-select v-model="params.batchNo" placeholder="请选择" @change="GoSearch()" style="width: 120px;">
-                    <el-option label="全部状态" value=""></el-option>
-                    <el-option v-for="item in batchList" :key="item.value" :label="item.label" :value="item.value"></el-option>
+                    <el-option v-for="item in scanIdentifyList" :key="item.value" :label="item.label" :value="item.value"></el-option>
                 </el-select>
                </span>
             </div>
             <div class="right_center">
-                <div class="scan_buttons" @click="OpenScan">
-                    <ScanButton></ScanButton>
+                <div class="scan_buttons">
+                    <ScanButton  @click="OpenScan()"></ScanButton>
                 </div>
                 <div class="scan_list">
                     <div class="list_item no_scan" >
@@ -148,9 +147,9 @@ import { useRouter } from 'vue-router'
 import { onMounted ,ref,computed,onUnmounted,nextTick } from 'vue';
 import ScanButton from './components/scanButton.vue'
 import SelectStudent from './components/selectStudent.vue'
-import { hasImportStudent, } from '@/api/exam'
+import { hasImportStudent,getBatchList } from '@/api/exam'
 import scanCommon from '@/utils/scanCommon';
-
+import { ElMessageBox, ElMessage } from 'element-plus'
 
 // 实例化 Store
 const examStore = useExamStore()
@@ -166,17 +165,73 @@ const params=ref({
     keyWord:''
 })
 
-const batchList=[];
+const batchList=ref([]);//批次列表
 const listMode=ref('list');
 const scanClientStates=ref(false);//客户端状态
 const tableData=ref([]);
 
 const tableHeight=ref(500);
-
+const scanIdentifyList=[                
+    {
+        label:'考号',
+        value:'2',
+    },
+    {
+        label:'学号',
+        value:'1',
+    }
+];//识别号列表
 
 const isImportStudent=ref(false);//是否导入了学生名单
 const showSelectStudent=ref(false);//是否显示选择学生名单弹窗
 
+//刷新
+const Refresh = () => {
+
+}
+
+//重新识别弹窗
+const OpenReIdentify=() => {
+
+}
+
+//开始扫描
+const OpenScan = () => {
+    //判断客户端是否已经连接
+    if(scanClientStates.value)
+    {
+        //一打开客户端 
+        console.log('客户端已打开,开始扫描');
+    }
+    else
+    {
+        //提示客户端未打开
+        ElMessage.warning('请先打开客户端');
+    }
+}
+
+const GotoDetail = (type: number) => {
+    //根据类型跳转到不同的详情页
+    // switch (type) {
+    //     case 0:
+    //         router.push({
+    //             path: '/exam/noScanList',
+    //             query: {
+    //                 examSubjectId: examSubjectId.value,
+    //             },
+    //         });
+    //         break;
+    //     case 1:
+    //         router.push({
+    //             path: '/exam/uploadedList',
+    //             query: {
+    //                 examSubjectId: examSubjectId.value,
+    //             },
+    //         })
+    //         break;
+    //     }
+}
+
 // 打开导入学生名单
 const OpenImportStudent = () => {
     showSelectStudent.value=true;
@@ -218,6 +273,20 @@ const HasImportStudent = async () => {
     }
 }
 
+//获取扫描批次列表
+const GetScanBatchList=async()=>{
+    const params = {
+      examSubjectId: examSubjectId.value,
+      schoolId: 0,//单校 0 
+    };
+    const res = await getBatchList(params);
+    if(res.code==200)
+    {
+        batchList.value=res.data;
+    }
+}
+
+
 
 //计算高度的函数
 const CalculateTableHeight = () => {
@@ -254,7 +323,8 @@ onMounted(() => {
         console.warn('当前没有选中的考试信息')
         // 可选:如果没有数据,可以重定向回列表页或提示用户
     }
-    HasImportStudent();
+    HasImportStudent();//查询是否导入了学生名单
+    GetScanBatchList();//获取扫描批次列表
      // 初始化计算
     CalculateTableHeight();