Procházet zdrojové kódy

局域网——下载学生端配置信息

XW před 2 měsíci
rodič
revize
355b6327c9

+ 2 - 1
TEAMModelOS.Extension/IES.Exam/IES.ExamViews/src/api/http.js

@@ -11,6 +11,7 @@ const NO_ACCESS_API = [
     '/index/bind-school',
     '/index/bind-school',
     '/student/get-activate-evaluation',
     '/student/get-activate-evaluation',
     '/student/login',
     '/student/login',
+    '/index/modify-hosts'
 ]
 ]
 
 
 // 需要携带access_token 不需要auth-token
 // 需要携带access_token 不需要auth-token
@@ -202,7 +203,7 @@ function handleHeader(config) {
     if (!auth_token) {
     if (!auth_token) {
         console.log('auth_token失败', config)
         console.log('auth_token失败', config)
         loginOut()
         loginOut()
-        sessionStorage.setItem('loginOut', 'localStorage没有auth_token:auth_token失败,重新登录')
+        sessionStorage.setItem('loginOut', `localStorage没有auth_token:auth_token失败,重新登录${identity}`)
         return
         return
     }
     }
 
 

+ 8 - 0
TEAMModelOS.Extension/IES.Exam/IES.ExamViews/src/api/index.js

@@ -50,6 +50,14 @@ export default {
     stuLogin: function(data) {
     stuLogin: function(data) {
         return post('/student/login', data)
         return post('/student/login', data)
     },
     },
+    /**
+     * 
+     * @param {String} ip 
+     * @returns 
+     */
+    modifyHost: function(data) {
+        return fetch('/index/modify-hosts', data)
+    },
 
 
     // 管理页面
     // 管理页面
     /**
     /**

+ 88 - 6
TEAMModelOS.Extension/IES.Exam/IES.ExamViews/src/view/login/Admin.vue

@@ -65,7 +65,7 @@
             <a class="footer-info-item">蜀ICP备18027363号</a>
             <a class="footer-info-item">蜀ICP备18027363号</a>
             <span class="footer-info-item">© 2021 HABOOK Group 醍摩豆</span>
             <span class="footer-info-item">© 2021 HABOOK Group 醍摩豆</span>
         </div>
         </div>
-        <el-drawer title="服务端信息" :visible.sync="isDeviceDrawer">
+        <el-drawer title="服务端信息" :visible.sync="isDeviceDrawer" size="35%">
             <el-form ref="form" label-width="120px" v-if="deviceInfo" style="margin-right: 10px;">
             <el-form ref="form" label-width="120px" v-if="deviceInfo" style="margin-right: 10px;">
                 <el-form-item label="登录用户:">
                 <el-form-item label="登录用户:">
                     <span>{{ deviceInfo.server.userName }}</span>
                     <span>{{ deviceInfo.server.userName }}</span>
@@ -98,9 +98,14 @@
                     <span>{{ deviceInfo.centerUrl }}</span>
                     <span>{{ deviceInfo.centerUrl }}</span>
                 </el-form-item>
                 </el-form-item>
                 <el-form-item label="服务端地址:">
                 <el-form-item label="服务端地址:">
+                    <!-- 展示哪一个是主服务器,有下载学生端配置功能,切换主服务器后需重新下载 -->
                     <span v-for="(item, index) in deviceInfo.server.host" :key="index" style="display: block;">
                     <span v-for="(item, index) in deviceInfo.server.host" :key="index" style="display: block;">
-                        {{ item }}
-                        <i class="el-icon-copy-document" @click="copyUrl(item)" style="cursor: pointer; margin-left: 5px;"></i>
+                        {{ item.url }}
+                        <i class="el-icon-copy-document" @click="copyUrl(item.url)" style="cursor: pointer; margin-left: 5px;"></i>
+                        <span style="margin-left: 15px;">
+                            <el-button size="mini" v-show="item.primary" @click="uploadStu()">下载学生端配置</el-button>
+                            <i class="el-icon-qiehuan" @click="checkHost(item)" :title="`切换主站${item.physical ? ',建议设置为主站' : ''}`" v-show="!item.primary" :style="[{'cursor': 'pointer'}, {'font-size': '18px'}, {'color': item.physical ? '#f5912f' : ''}]"></i>
+                        </span>
                     </span>
                     </span>
                 </el-form-item>
                 </el-form-item>
             </el-form>
             </el-form>
@@ -162,7 +167,8 @@ export default {
             signalR: null,
             signalR: null,
             qrCodeToken: undefined,
             qrCodeToken: undefined,
             ttlTimeOut: undefined,
             ttlTimeOut: undefined,
-            ttlChange: 0
+            ttlChange: 0,
+            stuUrl: '',
         }
         }
     },
     },
     mounted() {
     mounted() {
@@ -181,7 +187,13 @@ export default {
                     res.data.server.networks.forEach(network => {
                     res.data.server.networks.forEach(network => {
                         // https://192.168.8.140:5001/login/student
                         // https://192.168.8.140:5001/login/student
                         let url = `${item.protocol}://${network.ip}:${item.port}/login/student`
                         let url = `${item.protocol}://${network.ip}:${item.port}/login/student`
-                        res.data.server.host.push(url)
+                        if(network.primary) this.stuUrl = network?.batscriptZip
+                        res.data.server.host.push({
+                            url,
+                            primary: network.primary,
+                            physical: item.physical,
+                            ip: network.ip
+                        })
                     })
                     })
                 })
                 })
                 res.data.server.showRam = (res.data.server.ram / 1024 / 1024 / 1024).toFixed(1)
                 res.data.server.showRam = (res.data.server.ram / 1024 / 1024 / 1024).toFixed(1)
@@ -305,7 +317,12 @@ export default {
                         res.data.server.networks.forEach(network => {
                         res.data.server.networks.forEach(network => {
                             // https://192.168.8.140:5001/login/student
                             // https://192.168.8.140:5001/login/student
                             let url = `${item.protocol}://${network.ip}:${item.port}/login/student`
                             let url = `${item.protocol}://${network.ip}:${item.port}/login/student`
-                            res.data.server.host.push(url)
+                            res.data.server.host.push({
+                                url,
+                                primary: network.primary,
+                                physical: item.physical,
+                                ip: network.ip
+                            })
                         })
                         })
                     })
                     })
                     res.data.server.showRam = (res.data.server.ram / 1024 / 1024 / 1024).toFixed(1)
                     res.data.server.showRam = (res.data.server.ram / 1024 / 1024 / 1024).toFixed(1)
@@ -350,6 +367,71 @@ export default {
                 }
                 }
             })
             })
         },
         },
+        checkHost(data) {
+            this.$api.modifyHost({ip: data.ip}).then(res => {
+                if(res.code === 200) {
+                    this.viewNetworkInfo()
+                    this.$message({
+                        message: '设置成功,请重新下载学生端配置信息',
+                        type: 'success'
+                    });
+                } else {
+                    this.$message({
+                        message: res.msg,
+                        type: 'warning'
+                    });
+                }
+            })
+        },
+        async uploadStu() {
+            let url = `/${this.stuUrl}`
+            try {
+                let data = await this.getFile(url)
+                let objectUrl = window.URL.createObjectURL(new Blob([data], {type: 'application/zip'}));
+                let a = document.createElement('a');
+                a.href = objectUrl;
+                a.download = '学生端配置信息.zip'
+                a.click()
+                a.remove();
+            } catch(e) {
+                this.$message({
+                    message: '下载失败',
+                    type: 'warning'
+                });
+            }
+        },
+        getFile(url) {
+            return new Promise((resolve, reject) => {
+                var xhr = new XMLHttpRequest();
+                var formData = new FormData();
+                xhr.open('get', url); //url填写后台的接口地址,如果是post,在formData append参数(参考原文地址)
+                xhr.responseType = 'blob';
+                xhr.headers = {
+                    'Content-Type': 'application/json; application/octet-stream'
+                }
+                xhr.onload = function (e) {
+                    switch (e.currentTarget.status) {
+                        case 200:
+                            resolve(e.currentTarget.response)
+                            break;
+                        case 404:
+                            // Message.error('有资源丢失')
+                            reject(404)
+                            break;
+                        case 403:
+                            /* app.$message({
+                                type: 'error',
+                                message: '授权过期或授权异常,请稍后重试!'
+                            }) */
+                            reject(403)
+                            break;
+                        default:
+                            break;
+                    }
+                };
+                xhr.send(formData);
+            })
+        },
     },
     },
     computed: {
     computed: {
         bindSchoolType() {
         bindSchoolType() {