Ver código fonte

支持文件或者文件夹发送

zhuizhu 10 meses atrás
pai
commit
a4f60611d4
9 arquivos alterados com 323 adições e 215 exclusões
  1. 1 5
      api/tapi.cpp
  2. 23 1
      examquestionpage.cpp
  3. 3 0
      examquestionpage.h
  4. 32 1
      settingspage.cpp
  5. 9 4
      studentpage.cpp
  6. 1 1
      studentpage.h
  7. 20 3
      tcontroller.cpp
  8. 3 2
      teacherServer.pro
  9. 231 198
      teacherServer_zh_CN.ts

+ 1 - 5
api/tapi.cpp

@@ -230,11 +230,7 @@ QNetworkReply *NetworkAccessManager::createRequest(Operation op,
     }
 
     //这里考虑处理 JWT 数据
-    const QString &token = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9."
-                           "eyJkZXB0SWQiOjEsImV4cCI6MTc0ODU5NDg2MCwiaWF0IjoxNzQ4MzM1NjYwLCJyb2xlSWQ"
-                           "iOiIwMDEiLCJ1c2VySWQiOiIwMTk2ZWRjZi05NjgwLTdlNTgtYjIxZC0wMmYyYmVhNmY0Zm"
-                           "IifQ.lc9M-47c1C4-A0mvED39tra_TzhuyKStDE_3uQ4Q5Qg";
-    AppEvent::instance()->jwtToken();
+    const QString &token = AppEvent::instance()->jwtToken();
     // 加个事件校验 防止token 失效导致异常
     if (!token.isEmpty()) {
         req.setRawHeader("Authorization", "Bearer " + token.toUtf8());

+ 23 - 1
examquestionpage.cpp

@@ -11,6 +11,7 @@
 #include <QCheckBox>
 #include <QComboBox>
 #include <QDialog>
+#include <QFileDialog>
 #include <QHeaderView>
 #include <QLabel>
 #include <QLineEdit>
@@ -107,7 +108,9 @@ ExamsQuestionPage::ExamsQuestionPage(QWidget *parent)
                                  br,
                                  tr("file dir"),
                                  fileDirLineEdit,
-                                 PushButton{text(tr("open dir"))},
+                                 PushButton{text(tr("open dir")), onClicked([this]() { getDir(); })},
+                                 PushButton{text(tr("open file")),
+                                            onClicked([this]() { getFile(); })},
                                  br,
                                  tr("select"),
                                  selectCheckBox,
@@ -275,3 +278,22 @@ void ExamsQuestionPage::save()
         examsView->setCurrentIndex(index);
     }
 }
+
+void ExamsQuestionPage::getDir()
+{
+    const QString dir = QFileDialog::getExistingDirectory(this,
+                                                          QObject::tr("选择目录"),
+                                                          "./",
+                                                          QFileDialog::ShowDirsOnly
+                                                              | QFileDialog::DontResolveSymlinks);
+    fileDirLineEdit->setText(dir);
+}
+
+void ExamsQuestionPage::getFile()
+{
+    const QString file = QFileDialog::getOpenFileName(this,
+                                                      QObject::tr("选择文件"),
+                                                      "./",
+                                                      QObject::tr("所有文件 (*)"));
+    fileDirLineEdit->setText(file);
+}

+ 3 - 0
examquestionpage.h

@@ -26,6 +26,9 @@ public:
     void setDefault();
     void removeExamsQuestion();
     void save();
+
+    void getDir();
+    void getFile();
 signals:
 
 private:

+ 32 - 1
settingspage.cpp

@@ -14,6 +14,7 @@
 #include <QCheckBox>
 #include <QComboBox>
 #include <QDialog>
+#include <QFileDialog>
 #include <QHeaderView>
 #include <QLabel>
 #include <QLineEdit>
@@ -58,6 +59,15 @@ SettingsPage::SettingsPage(QWidget *parent)
     auto student = Group{title(tr("student configuration")),
                          Form{tr("exam content dir:"),
                               examContentDirLineEdit,
+                              PushButton{text(tr("open dir")), onClicked([this]() {
+                                             const QString dir = QFileDialog::getExistingDirectory(
+                                                 this,
+                                                 QObject::tr("选择目录"),
+                                                 "./",
+                                                 QFileDialog::ShowDirsOnly
+                                                     | QFileDialog::DontResolveSymlinks);
+                                             examContentDirLineEdit->setText(dir);
+                                         })},
                               br,
                               tr("window x:"),
                               windowXSpinBox,
@@ -67,12 +77,33 @@ SettingsPage::SettingsPage(QWidget *parent)
                               br,
                               tr("exam answer dir:"),
                               examAnswerDirLineEdit,
+                              PushButton{text(tr("open dir")), onClicked([this]() {
+                                             const QString dir = QFileDialog::getExistingDirectory(
+                                                 this,
+                                                 QObject::tr("选择目录"),
+                                                 "./",
+                                                 QFileDialog::ShowDirsOnly
+                                                     | QFileDialog::DontResolveSymlinks);
+                                             examAnswerDirLineEdit->setText(dir);
+                                         })},
                               br,
                               tr("lock max time"),
                               lockMaxTimeSpinBox,
                               tr("s")}};
     auto teacher = Group{title(tr("teacher configuration")),
-                         Form{tr("answer dir:"), answerDirLineEdit}};
+                         Form{
+                             tr("answer dir:"),
+                             answerDirLineEdit,
+                             PushButton{text(tr("open dir")), onClicked([this]() {
+                                            const QString dir = QFileDialog::getExistingDirectory(
+                                                this,
+                                                QObject::tr("选择目录"),
+                                                "./",
+                                                QFileDialog::ShowDirsOnly
+                                                    | QFileDialog::DontResolveSymlinks);
+                                            answerDirLineEdit->setText(dir);
+                                        })},
+                         }};
 
     Column{student, teacher}.attachTo(this);
 

+ 9 - 4
studentpage.cpp

@@ -3,6 +3,7 @@
 #include "appevent.h"
 
 #include "cwf/sqlquerymanager.h"
+#include "qcombobox.h"
 #include "qjsonarray.h"
 #include "qjsonvalue.h"
 #include "qnamespace.h"
@@ -105,8 +106,12 @@ StudentPage::StudentPage(QWidget *parent)
     studentSwLineEdit = new QLineEdit;
     examineeNumberLineEdit = new QLineEdit;
     checkinNumberLineEdit = new QLineEdit;
-    groupNameLineEdit = new QLineEdit;
     examsTestLineEdit = new QLineEdit;
+    groupNameComboBox = new QComboBox;
+    groupNameComboBox->addItem("小学");
+    groupNameComboBox->addItem("初中");
+    groupNameComboBox->addItem("高中");
+
     auto studentEditor = Form{tr("name"),
                               studentNameLineEdit,
                               br,
@@ -122,7 +127,7 @@ StudentPage::StudentPage(QWidget *parent)
                                    checkinNumberLineEdit,
                                    br,
                                    tr("group name"),
-                                   groupNameLineEdit,
+                                   groupNameComboBox,
                                    br,
                                    tr("exams test"),
                                    examsTestLineEdit,
@@ -171,7 +176,7 @@ StudentPage::StudentPage(QWidget *parent)
         studentSwLineEdit->setText(student.swID);
         examineeNumberLineEdit->setText(student.examineeNumber);
         checkinNumberLineEdit->setText(student.checkinNumber);
-        groupNameLineEdit->setText(student.groupName);
+        groupNameComboBox->setCurrentText(student.groupName);
         examsTestLineEdit->setText(student.examTest);
     });
 
@@ -271,7 +276,7 @@ void StudentPage::save()
     queryManager.addBindValue("0");
     queryManager.addBindValue(examineeNumberLineEdit->text());
     queryManager.addBindValue(checkinNumberLineEdit->text());
-    queryManager.addBindValue(groupNameLineEdit->text());
+    queryManager.addBindValue(groupNameComboBox->currentText());
     queryManager.addBindValue(examsTestLineEdit->text());
     queryManager.addBindValue(student.id);
     QJsonObject status = queryManager.exec();

+ 1 - 1
studentpage.h

@@ -41,7 +41,7 @@ private:
     QLineEdit *studentSwLineEdit;
     QLineEdit *examineeNumberLineEdit;
     QLineEdit *checkinNumberLineEdit; //考试组队
-    QLineEdit *groupNameLineEdit;   //组别
+    QComboBox *groupNameComboBox;     //组别
     QLineEdit *examsTestLineEdit;   // 开始内容
 };
 

+ 20 - 3
tcontroller.cpp

@@ -39,6 +39,10 @@ static QJsonObject getJwtToken(qint64 userid)
 
 static QStringList listFiles(const QString &path, const QString &basePath)
 {
+    QFileInfo info(path);
+    if (info.isFile()) {
+        return {path};
+    }
     QDir dir(path);
     QStringList fileList;
 
@@ -498,12 +502,18 @@ void ExamsFilesController::doGet(CWF::Request &request, CWF::Response &response)
         return mimeType.name();
     };
 
-    const QString path = dir + "/" + fileName;
+    QString path = dir + "/" + fileName;
+    if (!fileName.isEmpty() && QDir::isAbsolutePath(fileName)) {
+        // 处理绝对路径
+        path = fileName;
+    }
+
     QFile file(path);
     if (file.open(QIODevice::ReadOnly)) {
+        const QString rawFileName = QFileInfo(path).fileName();
         QString extention = CWF::FileManager::fileExtention(fileName).toLower();
         response.addHeader(CWF::HTTP::CONTENT_DISPOSITION,
-                           "filename=" + QUrl::toPercentEncoding(fileName));
+                           "filename=" + QUrl::toPercentEncoding(rawFileName));
         response.addHeader(CWF::HTTP::CONTENT_TYPE, getMimeType(fileName).toUtf8());
         response.write(file.readAll());
     } else {
@@ -569,9 +579,16 @@ void UploadedFilesController::doPost(CWF::Request &request, CWF::Response &respo
 
     if (user.getId() > 0) {
         QVariant answerDir = AppEvent::instance()->configValue("answerDir");
-        const QString path = answerDir.toString();
 
+        const QString examNumber = AppEvent::instance()->examNumber();
+        const QString examRoom = AppEvent::instance()->examRoom();
+
+        QString path = QDir(answerDir.toString()).filePath(examRoom + "_" + examNumber);
+        path = QDir::cleanPath(path);
+
+        qDebug() << path;
         QDir dir = path;
+
         if (!dir.exists(path)) {
             dir.mkpath(path);
         }

+ 3 - 2
teacherServer.pro

@@ -55,8 +55,9 @@ CONFIG(debug, debug|release): {
 } else {
     DESTDIR = $$PWD/../Time/bin64out/server
 }
-
-
+win32-msvc* {
+    QMAKE_CXXFLAGS += /source-charset:utf-8 /execution-charset:utf-8
+}
 # Default rules for deployment.
 qnx: target.path = /tmp/$${TARGET}/bin
 else: unix:!android: target.path = /opt/$${TARGET}/bin

+ 231 - 198
teacherServer_zh_CN.ts

@@ -20,54 +20,54 @@
     <message>
         <location filename="examtestpage.cpp" line="44"/>
         <source>exam room</source>
-        <translation type="unfinished">考试教室</translation>
+        <translation>考试教室</translation>
     </message>
     <message>
         <location filename="examtestpage.cpp" line="46"/>
         <source>exam number</source>
-        <translation type="unfinished">考场次数</translation>
+        <translation>考场次数</translation>
     </message>
     <message>
         <location filename="examtestpage.cpp" line="51"/>
         <source>send exam text</source>
-        <translation type="unfinished">发送考题</translation>
+        <translation>发送考题</translation>
     </message>
     <message>
         <location filename="examtestpage.cpp" line="52"/>
         <source>Begin the exam</source>
-        <translation type="unfinished">开始考试</translation>
+        <translation>开始考试</translation>
     </message>
     <message>
         <location filename="examtestpage.cpp" line="53"/>
         <source>un Lock Screen</source>
-        <translation type="unfinished">解锁屏幕</translation>
+        <translation>解锁屏幕</translation>
     </message>
     <message>
         <location filename="examtestpage.cpp" line="125"/>
         <source>info</source>
-        <translation type="unfinished"></translation>
+        <translation>提示</translation>
     </message>
     <message>
         <location filename="examtestpage.cpp" line="126"/>
         <source>Please set exam questions first</source>
-        <translation type="unfinished">请先设置考试题目</translation>
+        <translation>请先设置考试题目</translation>
     </message>
     <message>
         <location filename="examtestpage.cpp" line="129"/>
         <location filename="examtestpage.cpp" line="139"/>
         <source>OK</source>
-        <translation type="unfinished">确定</translation>
+        <translation>确定</translation>
     </message>
     <message>
         <location filename="examtestpage.cpp" line="130"/>
         <location filename="examtestpage.cpp" line="140"/>
         <source>Cancel</source>
-        <translation type="unfinished">取消</translation>
+        <translation>取消</translation>
     </message>
     <message>
         <location filename="examtestpage.cpp" line="136"/>
         <source>The current exam question is:%1</source>
-        <translation type="unfinished">当前考试题目是:%1</translation>
+        <translation>当前考试题目是:%1</translation>
     </message>
 </context>
 <context>
@@ -84,54 +84,59 @@
 <context>
     <name>ExamsQuestionPage</name>
     <message>
-        <location filename="examquestionpage.cpp" line="103"/>
+        <location filename="examquestionpage.cpp" line="104"/>
         <source>Test question information</source>
-        <translation type="unfinished"></translation>
+        <translation>考题信息</translation>
     </message>
     <message>
-        <location filename="examquestionpage.cpp" line="105"/>
+        <location filename="examquestionpage.cpp" line="106"/>
         <source>exams name</source>
-        <translation type="unfinished"></translation>
+        <translation>考试名称</translation>
     </message>
     <message>
-        <location filename="examquestionpage.cpp" line="108"/>
+        <location filename="examquestionpage.cpp" line="109"/>
         <source>file dir</source>
-        <translation type="unfinished"></translation>
+        <translation>文件目录</translation>
     </message>
     <message>
-        <location filename="examquestionpage.cpp" line="110"/>
+        <location filename="examquestionpage.cpp" line="111"/>
         <source>open dir</source>
-        <translation type="unfinished">打开目录</translation>
+        <translation>打开目录</translation>
     </message>
     <message>
         <location filename="examquestionpage.cpp" line="112"/>
+        <source>open file</source>
+        <translation>打开文件</translation>
+    </message>
+    <message>
+        <location filename="examquestionpage.cpp" line="115"/>
         <source>select</source>
-        <translation type="unfinished">选择</translation>
+        <translation>选择</translation>
     </message>
     <message>
-        <location filename="examquestionpage.cpp" line="118"/>
+        <location filename="examquestionpage.cpp" line="121"/>
         <source>Add</source>
-        <translation type="unfinished">添加</translation>
+        <translation>添加</translation>
     </message>
     <message>
-        <location filename="examquestionpage.cpp" line="119"/>
+        <location filename="examquestionpage.cpp" line="122"/>
         <source>Remove</source>
-        <translation type="unfinished">删除</translation>
+        <translation>删除</translation>
     </message>
     <message>
-        <location filename="examquestionpage.cpp" line="120"/>
+        <location filename="examquestionpage.cpp" line="123"/>
         <source>Set as Default</source>
-        <translation type="unfinished">设置为默认</translation>
+        <translation>设置为默认</translation>
     </message>
     <message>
-        <location filename="examquestionpage.cpp" line="122"/>
+        <location filename="examquestionpage.cpp" line="125"/>
         <source>Save</source>
-        <translation type="unfinished">保存</translation>
+        <translation>保存</translation>
     </message>
     <message>
-        <location filename="examquestionpage.cpp" line="127"/>
+        <location filename="examquestionpage.cpp" line="130"/>
         <source>pageSize</source>
-        <translation type="unfinished">页大小</translation>
+        <translation>页大小</translation>
     </message>
 </context>
 <context>
@@ -139,17 +144,17 @@
     <message>
         <location filename="widgets/examsmodel.cpp" line="71"/>
         <source>name</source>
-        <translation type="unfinished">姓名</translation>
+        <translation>姓名</translation>
     </message>
     <message>
         <location filename="widgets/examsmodel.cpp" line="73"/>
         <source>fileDir</source>
-        <translation type="unfinished">文件目录</translation>
+        <translation>文件目录</translation>
     </message>
     <message>
         <location filename="widgets/examsmodel.cpp" line="75"/>
         <source>select</source>
-        <translation type="unfinished">选择</translation>
+        <translation>选择</translation>
     </message>
 </context>
 <context>
@@ -157,27 +162,27 @@
     <message>
         <location filename="gradespage.cpp" line="108"/>
         <source>Test question information</source>
-        <translation type="unfinished"></translation>
+        <translation>考题信息</translation>
     </message>
     <message>
         <location filename="gradespage.cpp" line="110"/>
         <source>exams name</source>
-        <translation type="unfinished"></translation>
+        <translation>考试名称</translation>
     </message>
     <message>
         <location filename="gradespage.cpp" line="113"/>
         <source>file dir</source>
-        <translation type="unfinished"></translation>
+        <translation>文件目录</translation>
     </message>
     <message>
         <location filename="gradespage.cpp" line="115"/>
         <source>open dir</source>
-        <translation type="unfinished">打开目录</translation>
+        <translation>打开目录</translation>
     </message>
     <message>
         <location filename="gradespage.cpp" line="117"/>
         <source>select</source>
-        <translation type="unfinished">选择</translation>
+        <translation>选择</translation>
     </message>
     <message>
         <source>Add</source>
@@ -199,37 +204,37 @@
     <message>
         <location filename="gradespage.cpp" line="127"/>
         <source>Export...</source>
-        <translation type="unfinished">输出...</translation>
+        <translation>输出...</translation>
     </message>
     <message>
         <location filename="gradespage.cpp" line="129"/>
         <source>Save</source>
-        <translation type="unfinished">保存</translation>
+        <translation>保存</translation>
     </message>
     <message>
         <location filename="gradespage.cpp" line="135"/>
         <source>pageSize</source>
-        <translation type="unfinished">页大小</translation>
+        <translation>页大小</translation>
     </message>
     <message>
         <location filename="gradespage.cpp" line="256"/>
         <source>This will clear up all grades information</source>
-        <translation type="unfinished">这将清理全部成绩信息</translation>
+        <translation>这将清理全部成绩信息</translation>
     </message>
     <message>
         <location filename="gradespage.cpp" line="259"/>
         <source>OK</source>
-        <translation type="unfinished">确定</translation>
+        <translation>确定</translation>
     </message>
     <message>
         <location filename="gradespage.cpp" line="260"/>
         <source>Cancel</source>
-        <translation type="unfinished">取消</translation>
+        <translation>取消</translation>
     </message>
     <message>
         <location filename="gradespage.cpp" line="272"/>
         <source>file</source>
-        <translation type="unfinished"></translation>
+        <translation>文件</translation>
     </message>
 </context>
 <context>
@@ -237,57 +242,57 @@
     <message>
         <location filename="widgets/gradsmodel.cpp" line="101"/>
         <source>name</source>
-        <translation type="unfinished">姓名</translation>
+        <translation>姓名</translation>
     </message>
     <message>
         <location filename="widgets/gradsmodel.cpp" line="103"/>
         <source>SW_ID</source>
-        <translation type="unfinished"></translation>
+        <translation>SW_ID</translation>
     </message>
     <message>
         <location filename="widgets/gradsmodel.cpp" line="105"/>
         <source>examinee number</source>
-        <translation type="unfinished">考试编号</translation>
+        <translation>赛队编号</translation>
     </message>
     <message>
         <location filename="widgets/gradsmodel.cpp" line="107"/>
         <source>answer time</source>
-        <translation type="unfinished">完成时间</translation>
+        <translation>完成时间</translation>
     </message>
     <message>
         <location filename="widgets/gradsmodel.cpp" line="109"/>
         <source>answer file name</source>
-        <translation type="unfinished">答案文件名称</translation>
+        <translation>答案文件名称</translation>
     </message>
     <message>
         <location filename="widgets/gradsmodel.cpp" line="111"/>
         <source>school</source>
-        <translation type="unfinished">学校</translation>
+        <translation>学校</translation>
     </message>
     <message>
         <location filename="widgets/gradsmodel.cpp" line="113"/>
         <source>exam name</source>
-        <translation type="unfinished">考试题目</translation>
+        <translation>考试题目</translation>
     </message>
     <message>
         <location filename="widgets/gradsmodel.cpp" line="115"/>
         <source>checkin number</source>
-        <translation type="unfinished">签到号</translation>
+        <translation>签到号(坐位号)</translation>
     </message>
     <message>
         <location filename="widgets/gradsmodel.cpp" line="117"/>
         <source>group name</source>
-        <translation type="unfinished">组别</translation>
+        <translation>组别</translation>
     </message>
     <message>
         <location filename="widgets/gradsmodel.cpp" line="119"/>
         <source>exam room</source>
-        <translation type="unfinished">考试教室</translation>
+        <translation>考试教室</translation>
     </message>
     <message>
         <location filename="widgets/gradsmodel.cpp" line="121"/>
         <source>exam number</source>
-        <translation type="unfinished">考场次数</translation>
+        <translation>考场次数</translation>
     </message>
 </context>
 <context>
@@ -299,37 +304,37 @@
     <message>
         <source>examinee number</source>
         <oldsource>examineeNumber</oldsource>
-        <translation type="obsolete">考试编号</translation>
+        <translation type="obsolete">赛队编号</translation>
     </message>
     <message>
         <location filename="mainwindow.cpp" line="41"/>
         <source>student</source>
-        <translation type="unfinished">学生</translation>
+        <translation>学生</translation>
     </message>
     <message>
         <location filename="mainwindow.cpp" line="42"/>
         <source>exam question</source>
-        <translation type="unfinished">考题</translation>
+        <translation>考题</translation>
     </message>
     <message>
         <location filename="mainwindow.cpp" line="43"/>
         <source>grades</source>
-        <translation type="unfinished">成绩</translation>
+        <translation>成绩</translation>
     </message>
     <message>
         <location filename="mainwindow.cpp" line="61"/>
         <source>current default examination questions:</source>
-        <translation type="unfinished">当前默认考试题目:</translation>
+        <translation>当前默认考试题目:</translation>
     </message>
     <message>
         <location filename="mainwindow.cpp" line="63"/>
         <source>current online number:</source>
-        <translation type="unfinished">当前在线人数:</translation>
+        <translation>当前在线人数:</translation>
     </message>
     <message>
         <location filename="mainwindow.cpp" line="64"/>
         <source>number of links:</source>
-        <translation type="unfinished">链接数量:</translation>
+        <translation>链接数量:</translation>
     </message>
     <message>
         <source>pageSize</source>
@@ -346,7 +351,7 @@
     <message>
         <location filename="mainwindow.cpp" line="44"/>
         <source>settings</source>
-        <translation type="unfinished">配置</translation>
+        <translation>配置</translation>
     </message>
 </context>
 <context>
@@ -356,154 +361,182 @@
         <location filename="widgets/pagination.cpp" line="341"/>
         <location filename="widgets/pagination.cpp" line="397"/>
         <source>Total:%1</source>
-        <translation type="unfinished">总数:%1</translation>
+        <translation>总数:%1</translation>
+    </message>
+</context>
+<context>
+    <name>QObject</name>
+    <message>
+        <location filename="examquestionpage.cpp" line="285"/>
+        <location filename="settingspage.cpp" line="65"/>
+        <location filename="settingspage.cpp" line="83"/>
+        <location filename="settingspage.cpp" line="100"/>
+        <source>选择目录</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="examquestionpage.cpp" line="295"/>
+        <source>选择文件</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="examquestionpage.cpp" line="297"/>
+        <source>所有文件 (*)</source>
+        <translation type="unfinished"></translation>
     </message>
 </context>
 <context>
     <name>SettingsPage</name>
     <message>
-        <location filename="settingspage.cpp" line="53"/>
+        <location filename="settingspage.cpp" line="54"/>
         <source>Setting to 0 means unlimited time</source>
-        <translation type="unfinished">设置为0 表示不限时</translation>
+        <translation>设置为0 表示不限时</translation>
     </message>
     <message>
-        <location filename="settingspage.cpp" line="58"/>
+        <location filename="settingspage.cpp" line="59"/>
         <source>student configuration</source>
-        <translation type="unfinished">学生端配置</translation>
+        <translation>学生端配置</translation>
     </message>
     <message>
-        <location filename="settingspage.cpp" line="59"/>
+        <location filename="settingspage.cpp" line="60"/>
         <source>exam content dir:</source>
-        <translation type="unfinished">考题存放目录:</translation>
+        <translation>考题存放目录:</translation>
     </message>
     <message>
         <location filename="settingspage.cpp" line="62"/>
+        <location filename="settingspage.cpp" line="80"/>
+        <location filename="settingspage.cpp" line="97"/>
+        <source>open dir</source>
+        <translation type="unfinished">打开目录</translation>
+    </message>
+    <message>
+        <location filename="settingspage.cpp" line="72"/>
         <source>window x:</source>
-        <translation type="unfinished">窗口x:</translation>
+        <translation>窗口x:</translation>
     </message>
     <message>
-        <location filename="settingspage.cpp" line="64"/>
+        <location filename="settingspage.cpp" line="74"/>
         <source>window y:</source>
-        <translation type="unfinished">窗口y:</translation>
+        <translation>窗口y:</translation>
     </message>
     <message>
-        <location filename="settingspage.cpp" line="68"/>
+        <location filename="settingspage.cpp" line="78"/>
         <source>exam answer dir:</source>
-        <translation type="unfinished">考试答案目录:</translation>
+        <translation>考试答案目录:</translation>
     </message>
     <message>
-        <location filename="settingspage.cpp" line="71"/>
+        <location filename="settingspage.cpp" line="90"/>
         <source>lock max time</source>
-        <translation type="unfinished">最大锁屏时间</translation>
+        <translation>最大锁屏时间</translation>
     </message>
     <message>
-        <location filename="settingspage.cpp" line="73"/>
+        <location filename="settingspage.cpp" line="92"/>
         <source>s</source>
-        <translation type="unfinished">秒</translation>
+        <translation>秒</translation>
     </message>
     <message>
-        <location filename="settingspage.cpp" line="74"/>
+        <location filename="settingspage.cpp" line="93"/>
         <source>teacher configuration</source>
-        <translation type="unfinished">教师端配置</translation>
+        <translation>教师端配置</translation>
     </message>
     <message>
-        <location filename="settingspage.cpp" line="75"/>
+        <location filename="settingspage.cpp" line="95"/>
         <source>answer dir:</source>
-        <translation type="unfinished">答案存放目录:</translation>
+        <translation>答案存放目录:</translation>
     </message>
 </context>
 <context>
     <name>StudentPage</name>
     <message>
-        <location filename="studentpage.cpp" line="110"/>
+        <location filename="studentpage.cpp" line="115"/>
         <source>name</source>
-        <translation type="unfinished">姓名</translation>
+        <translation>姓名</translation>
     </message>
     <message>
-        <location filename="studentpage.cpp" line="113"/>
+        <location filename="studentpage.cpp" line="118"/>
         <source>swID</source>
-        <translation type="unfinished">SW_ID</translation>
+        <translation>SW_ID</translation>
     </message>
     <message>
-        <location filename="studentpage.cpp" line="116"/>
+        <location filename="studentpage.cpp" line="121"/>
         <source>examinee number</source>
-        <translation type="unfinished">考试编号</translation>
+        <translation>赛队编号</translation>
     </message>
     <message>
-        <location filename="studentpage.cpp" line="121"/>
+        <location filename="studentpage.cpp" line="126"/>
         <source>checkin number</source>
-        <translation type="unfinished">签到号</translation>
+        <translation>签到号(坐位号)</translation>
     </message>
     <message>
-        <location filename="studentpage.cpp" line="124"/>
+        <location filename="studentpage.cpp" line="129"/>
         <source>group name</source>
-        <translation type="unfinished">组别</translation>
+        <translation>组别</translation>
     </message>
     <message>
-        <location filename="studentpage.cpp" line="127"/>
+        <location filename="studentpage.cpp" line="132"/>
         <source>exams test</source>
-        <translation type="unfinished">考试内容</translation>
+        <translation>考试内容</translation>
     </message>
     <message>
-        <location filename="studentpage.cpp" line="132"/>
+        <location filename="studentpage.cpp" line="137"/>
         <source>Add</source>
-        <translation type="unfinished">添加</translation>
+        <translation>添加</translation>
     </message>
     <message>
-        <location filename="studentpage.cpp" line="133"/>
+        <location filename="studentpage.cpp" line="138"/>
         <source>Remove</source>
-        <translation type="unfinished">删除</translation>
+        <translation>删除</translation>
     </message>
     <message>
-        <location filename="studentpage.cpp" line="134"/>
+        <location filename="studentpage.cpp" line="139"/>
         <source>Set as Default</source>
-        <translation type="unfinished">设置为默认</translation>
+        <translation>设置为默认</translation>
     </message>
     <message>
-        <location filename="studentpage.cpp" line="136"/>
+        <location filename="studentpage.cpp" line="141"/>
         <source>Clear...</source>
         <translation>清空...</translation>
     </message>
     <message>
-        <location filename="studentpage.cpp" line="137"/>
+        <location filename="studentpage.cpp" line="142"/>
         <source>Import...</source>
-        <translation type="unfinished">导入...</translation>
+        <translation>导入...</translation>
     </message>
     <message>
-        <location filename="studentpage.cpp" line="138"/>
+        <location filename="studentpage.cpp" line="143"/>
         <source>Export...</source>
-        <translation type="unfinished">输出...</translation>
+        <translation>输出...</translation>
     </message>
     <message>
-        <location filename="studentpage.cpp" line="140"/>
+        <location filename="studentpage.cpp" line="145"/>
         <source>Save</source>
-        <translation type="unfinished">保存</translation>
+        <translation>保存</translation>
     </message>
     <message>
-        <location filename="studentpage.cpp" line="145"/>
+        <location filename="studentpage.cpp" line="150"/>
         <source>pageSize</source>
-        <translation type="unfinished">页大小</translation>
+        <translation>页大小</translation>
     </message>
     <message>
-        <location filename="studentpage.cpp" line="288"/>
+        <location filename="studentpage.cpp" line="293"/>
         <source>This will clear up all grades and student information</source>
-        <translation type="unfinished">这将清理全部成绩和学生信息</translation>
+        <translation>这将清理全部成绩和学生信息</translation>
     </message>
     <message>
-        <location filename="studentpage.cpp" line="291"/>
+        <location filename="studentpage.cpp" line="296"/>
         <source>OK</source>
-        <translation type="unfinished">确定</translation>
+        <translation>确定</translation>
     </message>
     <message>
-        <location filename="studentpage.cpp" line="292"/>
+        <location filename="studentpage.cpp" line="297"/>
         <source>Cancel</source>
-        <translation type="unfinished">取消</translation>
+        <translation>取消</translation>
     </message>
     <message>
-        <location filename="studentpage.cpp" line="308"/>
-        <location filename="studentpage.cpp" line="424"/>
+        <location filename="studentpage.cpp" line="313"/>
+        <location filename="studentpage.cpp" line="429"/>
         <source>file</source>
-        <translation type="unfinished"></translation>
+        <translation>文件</translation>
     </message>
 </context>
 <context>
@@ -511,7 +544,7 @@
     <message>
         <location filename="widgets/studentmodel.cpp" line="102"/>
         <source>name</source>
-        <translation type="unfinished">姓名</translation>
+        <translation>姓名</translation>
     </message>
     <message>
         <source>sw ID</source>
@@ -520,52 +553,52 @@
     <message>
         <location filename="widgets/studentmodel.cpp" line="104"/>
         <source>SW_ID</source>
-        <translation type="unfinished"></translation>
+        <translation>SW_ID</translation>
     </message>
     <message>
         <location filename="widgets/studentmodel.cpp" line="106"/>
         <source>examinee number</source>
-        <translation type="unfinished">考试编号</translation>
+        <translation>赛队编号</translation>
     </message>
     <message>
         <location filename="widgets/studentmodel.cpp" line="108"/>
         <source>checkin number</source>
-        <translation type="unfinished">签到号</translation>
+        <translation>签到号(坐位号)</translation>
     </message>
     <message>
         <location filename="widgets/studentmodel.cpp" line="110"/>
         <source>group name</source>
-        <translation type="unfinished">组别</translation>
+        <translation>组别</translation>
     </message>
     <message>
         <location filename="widgets/studentmodel.cpp" line="112"/>
         <source>state</source>
-        <translation type="unfinished">状态</translation>
+        <translation>状态</translation>
     </message>
     <message>
         <location filename="widgets/studentmodel.cpp" line="114"/>
         <source>exams test</source>
-        <translation type="unfinished">考试内容</translation>
+        <translation>考试内容</translation>
     </message>
     <message>
         <location filename="widgets/studentmodel.cpp" line="116"/>
         <source>exams max time</source>
-        <translation type="unfinished">最大完成时间</translation>
+        <translation>最大完成时间</translation>
     </message>
     <message>
         <location filename="widgets/studentmodel.cpp" line="118"/>
         <source>answer time</source>
-        <translation type="unfinished">完成时间</translation>
+        <translation>完成时间</translation>
     </message>
     <message>
         <location filename="widgets/studentmodel.cpp" line="120"/>
         <source>answer file name</source>
-        <translation type="unfinished">答案文件名称</translation>
+        <translation>答案文件名称</translation>
     </message>
     <message>
         <location filename="widgets/studentmodel.cpp" line="122"/>
         <source>school</source>
-        <translation type="unfinished">学校</translation>
+        <translation>学校</translation>
     </message>
 </context>
 <context>
@@ -643,18 +676,18 @@
         <translation>验证码不能为空.</translation>
     </message>
     <message>
-        <location filename="tlogin.cpp" line="260"/>
+        <location filename="tlogin.cpp" line="261"/>
         <source>User name, password or captcha error, please try again.</source>
         <translation>用户名或密码或验证码错误, 请重新尝试登录.</translation>
     </message>
     <message>
         <source>ExamNo:</source>
-        <translation type="obsolete">考试编号:</translation>
+        <translation type="obsolete">赛队编号:</translation>
     </message>
     <message>
         <location filename="tlogin.cpp" line="67"/>
         <source>Password:</source>
-        <translation type="unfinished">密码:</translation>
+        <translation>密码:</translation>
     </message>
     <message>
         <source>link succeeded</source>
@@ -663,9 +696,9 @@
     <message>
         <location filename="tlogin.cpp" line="220"/>
         <location filename="tlogin.cpp" line="227"/>
-        <location filename="tlogin.cpp" line="259"/>
+        <location filename="tlogin.cpp" line="260"/>
         <source>Login failed</source>
-        <translation type="unfinished">登录失败</translation>
+        <translation>登录失败</translation>
     </message>
     <message>
         <source>User name or password error, please try again.</source>
@@ -677,7 +710,7 @@
     <message>
         <location filename="api/tapi.cpp" line="34"/>
         <source>OK</source>
-        <translation type="unfinished">确定</translation>
+        <translation>确定</translation>
     </message>
     <message>
         <location filename="api/tapi.cpp" line="35"/>
@@ -774,128 +807,128 @@
 <context>
     <name>TeacherServer::TeacherServer</name>
     <message>
-        <location filename="tcontroller.cpp" line="131"/>
-        <location filename="tcontroller.cpp" line="233"/>
-        <location filename="tcontroller.cpp" line="302"/>
-        <location filename="tcontroller.cpp" line="552"/>
-        <location filename="tcontroller.cpp" line="654"/>
+        <location filename="tcontroller.cpp" line="137"/>
+        <location filename="tcontroller.cpp" line="239"/>
+        <location filename="tcontroller.cpp" line="308"/>
+        <location filename="tcontroller.cpp" line="558"/>
+        <location filename="tcontroller.cpp" line="667"/>
         <source>user does not exist</source>
-        <translation type="unfinished">用户不存在</translation>
+        <translation>用户不存在</translation>
     </message>
     <message>
-        <location filename="tcontroller.cpp" line="117"/>
-        <location filename="tcontroller.cpp" line="164"/>
+        <location filename="tcontroller.cpp" line="123"/>
+        <location filename="tcontroller.cpp" line="170"/>
         <source>Login succeeded</source>
-        <translation type="unfinished">登录成功</translation>
+        <translation>登录成功</translation>
     </message>
     <message>
-        <location filename="tcontroller.cpp" line="181"/>
-        <location filename="tcontroller.cpp" line="257"/>
-        <location filename="tcontroller.cpp" line="326"/>
+        <location filename="tcontroller.cpp" line="187"/>
+        <location filename="tcontroller.cpp" line="263"/>
+        <location filename="tcontroller.cpp" line="332"/>
         <source>Login failed</source>
-        <translation type="unfinished">登录失败</translation>
+        <translation>登录失败</translation>
     </message>
     <message>
-        <location filename="tcontroller.cpp" line="192"/>
-        <location filename="tcontroller.cpp" line="267"/>
-        <location filename="tcontroller.cpp" line="518"/>
+        <location filename="tcontroller.cpp" line="198"/>
+        <location filename="tcontroller.cpp" line="273"/>
+        <location filename="tcontroller.cpp" line="524"/>
         <source>LoginOut failed, no find user</source>
-        <translation type="unfinished">退出失败, 没有发现用户</translation>
+        <translation>退出失败, 没有发现用户</translation>
     </message>
     <message>
-        <location filename="tcontroller.cpp" line="201"/>
-        <location filename="tcontroller.cpp" line="276"/>
-        <location filename="tcontroller.cpp" line="347"/>
-        <location filename="tcontroller.cpp" line="429"/>
-        <location filename="tcontroller.cpp" line="527"/>
-        <location filename="tcontroller.cpp" line="618"/>
+        <location filename="tcontroller.cpp" line="207"/>
+        <location filename="tcontroller.cpp" line="282"/>
+        <location filename="tcontroller.cpp" line="353"/>
+        <location filename="tcontroller.cpp" line="435"/>
+        <location filename="tcontroller.cpp" line="533"/>
+        <location filename="tcontroller.cpp" line="631"/>
         <source>unauthorized</source>
-        <translation type="unfinished"></translation>
+        <translation></translation>
     </message>
     <message>
-        <location filename="tcontroller.cpp" line="395"/>
-        <location filename="tcontroller.cpp" line="414"/>
-        <location filename="tcontroller.cpp" line="478"/>
+        <location filename="tcontroller.cpp" line="401"/>
+        <location filename="tcontroller.cpp" line="420"/>
+        <location filename="tcontroller.cpp" line="484"/>
         <source>Failed to obtain exam content</source>
-        <translation type="unfinished"></translation>
+        <translation></translation>
     </message>
     <message>
-        <location filename="tcontroller.cpp" line="538"/>
-        <location filename="tcontroller.cpp" line="592"/>
+        <location filename="tcontroller.cpp" line="544"/>
+        <location filename="tcontroller.cpp" line="605"/>
         <source>file uploaded successfully</source>
-        <translation type="unfinished"></translation>
+        <translation></translation>
     </message>
     <message>
-        <location filename="tcontroller.cpp" line="598"/>
+        <location filename="tcontroller.cpp" line="611"/>
         <source>Failed to uploaded files</source>
-        <translation type="unfinished"></translation>
+        <translation></translation>
     </message>
     <message>
-        <location filename="tcontroller.cpp" line="609"/>
+        <location filename="tcontroller.cpp" line="622"/>
         <source>answer Time failed, no find user login</source>
-        <translation type="unfinished"></translation>
+        <translation></translation>
     </message>
     <message>
-        <location filename="tcontroller.cpp" line="630"/>
-        <location filename="tcontroller.cpp" line="716"/>
+        <location filename="tcontroller.cpp" line="643"/>
+        <location filename="tcontroller.cpp" line="785"/>
         <source>Update Answer Time successfully</source>
-        <translation type="unfinished"></translation>
+        <translation></translation>
     </message>
     <message>
-        <location filename="tcontroller.cpp" line="723"/>
+        <location filename="tcontroller.cpp" line="792"/>
         <source>Update Answer Time Failed</source>
-        <translation type="unfinished"></translation>
+        <translation></translation>
     </message>
     <message>
-        <location filename="tcontroller.cpp" line="734"/>
+        <location filename="tcontroller.cpp" line="803"/>
         <source>json param error</source>
-        <translation type="unfinished"></translation>
+        <translation></translation>
     </message>
     <message>
-        <location filename="tcontroller.cpp" line="795"/>
+        <location filename="tcontroller.cpp" line="865"/>
         <source>Table data </source>
-        <translation type="unfinished"></translation>
+        <translation></translation>
     </message>
     <message>
-        <location filename="tcontroller.cpp" line="802"/>
+        <location filename="tcontroller.cpp" line="872"/>
         <source>Get Table Data Failed</source>
-        <translation type="unfinished"></translation>
+        <translation></translation>
     </message>
     <message>
-        <location filename="tcontroller.cpp" line="88"/>
-        <location filename="tcontroller.cpp" line="407"/>
+        <location filename="tcontroller.cpp" line="94"/>
+        <location filename="tcontroller.cpp" line="413"/>
         <source>ok</source>
-        <translation type="unfinished"></translation>
+        <translation></translation>
     </message>
     <message>
-        <location filename="tcontroller.cpp" line="218"/>
-        <location filename="tcontroller.cpp" line="249"/>
-        <location filename="tcontroller.cpp" line="287"/>
-        <location filename="tcontroller.cpp" line="318"/>
+        <location filename="tcontroller.cpp" line="224"/>
+        <location filename="tcontroller.cpp" line="255"/>
+        <location filename="tcontroller.cpp" line="293"/>
+        <location filename="tcontroller.cpp" line="324"/>
         <source>LoginOut succeeded</source>
-        <translation type="unfinished">退出成功</translation>
+        <translation>退出成功</translation>
     </message>
     <message>
-        <location filename="studentpage.cpp" line="60"/>
+        <location filename="studentpage.cpp" line="61"/>
         <source>online</source>
-        <translation type="unfinished">在线</translation>
+        <translation>在线</translation>
     </message>
     <message>
-        <location filename="studentpage.cpp" line="63"/>
+        <location filename="studentpage.cpp" line="64"/>
         <source>outline</source>
-        <translation type="unfinished">离线</translation>
+        <translation>离线</translation>
     </message>
     <message>
-        <location filename="examquestionpage.cpp" line="53"/>
+        <location filename="examquestionpage.cpp" line="54"/>
         <location filename="gradespage.cpp" line="58"/>
         <source>Select</source>
-        <translation type="unfinished">选择</translation>
+        <translation>选择</translation>
     </message>
     <message>
-        <location filename="examquestionpage.cpp" line="56"/>
+        <location filename="examquestionpage.cpp" line="57"/>
         <location filename="gradespage.cpp" line="61"/>
         <source>Not Selected</source>
-        <translation type="unfinished">未选择</translation>
+        <translation>未选择</translation>
     </message>
 </context>
 </TS>