Răsfoiți Sursa

扫描管理

zhangjie 1 an în urmă
părinte
comite
ef5c66409d

+ 0 - 0
src/assets/images/icon-未扫描@2x.png → src/assets/images/icon-close-grid.png


+ 0 - 0
src/assets/images/icon@2x.png → src/assets/images/icon-home.png


BIN
src/assets/images/icon-narrow-right-act.png


+ 0 - 0
src/assets/images/icon-开始扫描-off@2x.png → src/assets/images/icon-narrow-right.png


+ 0 - 0
src/assets/images/icon-机构@2x.png → src/assets/images/icon-org.png


+ 0 - 0
src/assets/images/icon-考生总数@2x.png → src/assets/images/icon-person-grid.png


+ 0 - 0
src/assets/images/icon-已扫描@2x.png → src/assets/images/icon-right-grid.png


+ 0 - 0
src/assets/images/icon-用户名@2x.png → src/assets/images/icon-user-fill.png


BIN
src/assets/images/icon-二次识别@2x.png


BIN
src/assets/images/icon-课程数量@2x.png


+ 3 - 3
src/assets/styles/base.scss

@@ -120,7 +120,7 @@ body {
 
 /* part */
 .part-box {
-  margin-bottom: 20px;
+  margin-bottom: 16px;
   background-color: #fff;
   border-radius: $--border-radius;
 
@@ -131,11 +131,11 @@ body {
     border: 1px solid $--color-border-bold;
   }
   &-pad {
-    padding: 20px;
+    padding: 16px;
   }
 
   &-filter {
-    padding: 20px 20px 5px 20px;
+    padding: 16px 16px 1px 16px;
 
     .el-form-item {
       margin-bottom: 15px;

+ 6 - 6
src/assets/styles/element-ui-costom.scss

@@ -4,7 +4,7 @@
 */
 // dialog
 .el-dialog {
-  border-radius: 8px;
+  border-radius: $--border-radius;
   overflow: hidden;
   border: 1px solid #c8c8ca;
   box-shadow: 5px 5px 4px 0px rgba(0, 0, 0, 0.1);
@@ -66,7 +66,7 @@
   overflow: hidden;
   .el-button {
     width: 100px;
-    border-radius: 8px;
+    border-radius: $--border-radius;
     float: right;
     margin-left: 10px;
   }
@@ -154,7 +154,7 @@
     }
   }
   .el-input__inner {
-    border-radius: 4px;
+    border-radius: $--border-radius;
     border-color: #ddd;
     background-color: #fff;
     padding: 0 8px;
@@ -201,7 +201,7 @@
     margin: 0 6px;
     padding-left: 8px;
     padding-right: 8px;
-    border-radius: 3px;
+    border-radius: $--border-radius;
     height: 28px;
     line-height: 28px;
 
@@ -449,7 +449,7 @@
 .el-pagination-li {
   min-width: 32px;
   height: 32px;
-  border-radius: 8px;
+  border-radius: $--border-radius;
   overflow: hidden;
   background-color: $--color-white;
   border: 1px solid #e1e3eb;
@@ -566,7 +566,7 @@
 }
 // el-date-editor
 .el-date-editor {
-  border-radius: 8px;
+  border-radius: $--border-radius;
   .el-range-separator {
     width: auto;
   }

+ 98 - 26
src/assets/styles/home.scss

@@ -28,20 +28,115 @@
   overflow: auto;
   background: $--color-background;
   z-index: 98;
-  padding-top: 30px;
+  padding-top: 56px;
   padding-bottom: 30px;
   min-width: 800px;
-  min-height: 450px;
+  min-height: 600px;
 }
 
 /* head */
 .home-head {
   position: absolute;
   width: 100%;
-  height: 30px;
+  height: 56px;
   top: 0;
   left: 0;
   z-index: 99;
+  background-color: #262626;
+  padding: 12px 24px;
+
+  .home-user {
+    ul {
+      font-size: 0;
+    }
+    li {
+      display: inline-block;
+      vertical-align: top;
+      font-size: 14px;
+      border-radius: 4px;
+      border: 1px solid #686868;
+      height: 32px;
+      line-height: 20px;
+      padding: 5px 12px;
+      color: #fff;
+      cursor: pointer;
+
+      &:not(:last-child) {
+        margin-right: 8px;
+      }
+
+      > i {
+        margin-right: 8px;
+      }
+
+      &:hover {
+        border-color: #fff;
+      }
+    }
+  }
+}
+
+// home-breadcrumb
+.home-breadcrumb {
+  font-size: 14px;
+  font-weight: 500;
+  color: #ffffff;
+
+  .breadcrumb-tips {
+    display: inline-block;
+    vertical-align: middle;
+
+    > i {
+      margin-top: -4px;
+      margin-right: 8px;
+    }
+  }
+
+  .el-breadcrumb {
+    line-height: 16px;
+    display: inline-block;
+    vertical-align: middle;
+    font-size: 14px;
+
+    .el-breadcrumb__item {
+      .el-breadcrumb__inner {
+        color: #fff;
+      }
+    }
+
+    .el-breadcrumb__separator {
+      margin: 0 5px;
+    }
+  }
+}
+
+.home-footer {
+  position: absolute;
+  left: 0;
+  bottom: 0;
+  width: 100%;
+  height: 30px;
+  z-index: 99;
+  color: #fff;
+  padding: 0 10px;
+
+  display: flex;
+  justify-content: space-between;
+  align-items: center;
+
+  &-ip {
+    letter-spacing: 1px;
+    > i {
+      margin-right: 5px;
+    }
+  }
+}
+
+// layout
+.layout {
+  .home-head {
+    background-color: transparent;
+  }
 
   .head-logo {
     position: absolute;
@@ -55,7 +150,6 @@
   }
 
   .head-actions {
-    -webkit-app-region: no-drag;
     font-size: 0;
     position: absolute;
     top: 12px;
@@ -91,25 +185,3 @@
     background-position: center;
   }
 }
-
-.home-footer {
-  position: absolute;
-  left: 0;
-  bottom: 0;
-  width: 100%;
-  height: 30px;
-  z-index: 99;
-  color: #fff;
-  padding: 0 10px;
-
-  display: flex;
-  justify-content: space-between;
-  align-items: center;
-
-  &-ip {
-    letter-spacing: 1px;
-    > i {
-      margin-right: 5px;
-    }
-  }
-}

+ 36 - 0
src/assets/styles/icons.scss

@@ -23,4 +23,40 @@
   &-rotate-right-act {
     background-image: url(../images/icon-rotate-right-act.png);
   }
+  &-org {
+    width: 20px;
+    height: 20px;
+    background-image: url(../images/icon-org.png);
+  }
+  &-user-fill {
+    background-image: url(../images/icon-user-fill.png);
+  }
+  &-logout {
+    background-image: url(../images/icon-logout.png);
+  }
+  &-home {
+    background-image: url(../images/icon-home.png);
+  }
+
+  &-narrow-right {
+    background-image: url(../images/icon-narrow-right.png);
+  }
+  &-narrow-right-act {
+    background-image: url(../images/icon-narrow-right-act.png);
+  }
+  &-person-grid {
+    width: 22px;
+    height: 22px;
+    background-image: url(../images/icon-person-grid.png);
+  }
+  &-right-grid {
+    width: 22px;
+    height: 22px;
+    background-image: url(../images/icon-right-grid.png);
+  }
+  &-close-grid {
+    width: 22px;
+    height: 22px;
+    background-image: url(../images/icon-close-grid.png);
+  }
 }

+ 113 - 1
src/assets/styles/pages.scss

@@ -1,5 +1,117 @@
 .task-manage {
-  padding: 20px;
+  padding: 16px;
+  .task-parts {
+    .part-box {
+      border-radius: 8px;
+      height: 308px;
+      display: flex;
+      flex-direction: column;
+      justify-content: space-between;
+    }
+    .task-part {
+      &-foot,
+      &-head {
+        flex-grow: 0;
+        flex-shrink: 0;
+      }
+      &-head {
+        > h3 {
+          height: 24px;
+          font-weight: bold;
+          font-size: 16px;
+          color: #262626;
+          line-height: 24px;
+        }
+      }
+      &-foot {
+        text-align: right;
+        margin: 0 -16px;
+        padding: 16px 24px 0;
+        border-top: 1px solid #f0f0f0;
+      }
+      &-body {
+        flex-grow: 2;
+        padding: 16px 0;
+      }
+    }
+  }
+  .filter-title {
+    height: 32px;
+    font-weight: bold;
+    font-size: 16px;
+    color: #262626;
+    line-height: 32px;
+    margin-right: 32px;
+  }
+
+  .task-chart {
+    width: 172px;
+    height: 172px;
+    flex-grow: 0;
+    flex-shrink: 0;
+  }
+  .task-infos {
+    flex-grow: 2;
+    font-size: 0;
+    margin-left: 24px;
+  }
+  .task-info {
+    &-item {
+      display: inline-block;
+      vertical-align: top;
+      padding: 16px;
+      font-size: 14px;
+      &:not(:last-child) {
+        margin-right: 16px;
+      }
+    }
+    &-title {
+      height: 22px;
+      font-weight: 400;
+      color: #8c8c8c;
+      line-height: 22px;
+      margin-bottom: 6px;
+      > i {
+        margin-right: 4px;
+      }
+      > span {
+        display: inline-block;
+        vertical-align: middle;
+      }
+    }
+    &-cont {
+      height: 32px;
+      font-weight: bold;
+      font-size: 24px;
+      color: #262626;
+      line-height: 32px;
+    }
+  }
+
+  .task-btn {
+    display: inline-block;
+    height: 32px;
+    line-height: 20px;
+    padding: 5px 16px;
+    border-radius: 4px;
+    font-weight: 500;
+    border: 1px solid #e8f3ff;
+    color: $--color-primary;
+    cursor: pointer;
+
+    > .icon {
+      margin-left: 8px;
+    }
+
+    &:hover {
+      border-color: $--color-primary;
+      background-color: $--color-primary;
+      color: #fff;
+      .icon-narrow-right {
+        background-image: url(../images/icon-narrow-right-act.png);
+      }
+    }
+  }
 }
 
 .scan-task-dialog {

+ 1 - 1
src/assets/styles/variables.scss

@@ -35,7 +35,7 @@ $--shadow-light: 0 0 1px rgba(0, 0, 0, 0.15) !default;
 $--font-size-base: 14px !default;
 $--font-size-medium: 16px !default;
 $--font-size-large: 18px !default;
-$--border-radius: 8px;
+$--border-radius: 4px;
 $--border-radius-large: 12px;
 $--border-radius-huge: 20px;
 // font-family

+ 61 - 199
src/modules/client/views/TaskManage.vue

@@ -1,7 +1,10 @@
 <template>
   <div class="task-manage">
-    <div class="part-box part-box-filter part-box-flex">
+    <div class="part-box part-box-filter">
       <el-form ref="FilterForm" label-position="left" label-width="85px" inline>
+        <el-form-item>
+          <h3 class="filter-title">选择考试</h3>
+        </el-form-item>
         <el-form-item label="档案:">
           <archives-select
             v-model="filter.paperArchivesId"
@@ -9,14 +12,6 @@
           >
           </archives-select>
         </el-form-item>
-        <el-form-item label="课程:">
-          <course-select
-            v-model="filter.courseCode"
-            :filter-data="filter"
-            placeholder="请选择课程"
-          >
-          </course-select>
-        </el-form-item>
         <el-form-item label-width="0px">
           <el-button type="primary" @click="search">查询</el-button>
           <el-button v-if="openBarCode" type="primary" @click="toSetOrcArea"
@@ -25,119 +20,62 @@
         </el-form-item>
       </el-form>
     </div>
+    <el-row class="task-parts" :gutter="16">
+      <el-col :span="16">
+        <div class="part-box part-box-pad">
+          <div class="task-part-head">
+            <h3>试卷扫描</h3>
+          </div>
+          <div class="task-part-body box-justify">
+            <div class="task-chart"></div>
+            <div class="task-infos">
+              <div class="task-info-item">
+                <div class="task-info-title">
+                  <i class="icon icon-person-grid"></i>
+                  <span>考生总数</span>
+                </div>
+                <div class="task-info-cont">123</div>
+              </div>
+              <div class="task-info-item">
+                <div class="task-info-title">
+                  <i class="icon icon-right-grid"></i>
+                  <span>已扫人数/张数</span>
+                </div>
+                <div class="task-info-cont">1231</div>
+              </div>
+              <div class="task-info-item">
+                <div class="task-info-title">
+                  <i class="icon icon-close-grid"></i>
+                  <span>未扫人数</span>
+                </div>
+                <div class="task-info-cont">111</div>
+              </div>
+            </div>
+          </div>
+          <div class="task-part-foot">
+            <div class="task-btn">
+              <span>开始扫描</span>
+              <i class="icon icon-narrow-right"></i>
+            </div>
+          </div>
+        </div>
+      </el-col>
+      <el-col :span="8">
+        <div class="part-box part-box-pad">
+          <div class="task-part-head">
+            <h3>其他文件扫描</h3>
+          </div>
+          <div class="task-part-body"></div>
+          <div class="task-part-foot">
+            <div class="task-btn">
+              <span>开始扫描</span>
+              <i class="icon icon-narrow-right"></i>
+            </div>
+          </div>
+        </div>
+      </el-col>
+    </el-row>
 
-    <div class="mb-4 tab-btns">
-      <el-button
-        v-for="tab in tabs"
-        :key="tab.val"
-        size="medium"
-        :type="curTab == tab.val ? 'primary' : 'default'"
-        @click="selectMenu(tab.val)"
-        >{{ tab.name }}
-      </el-button>
-    </div>
-
-    <div class="part-box part-box-pad">
-      <el-table ref="TableList" size="medium" :data="dataList">
-        <el-table-column
-          prop="id"
-          label="任务ID"
-          min-width="160"
-        ></el-table-column>
-        <el-table-column
-          prop="scanTaskName"
-          label="任务名称"
-          min-width="160"
-        ></el-table-column>
-        <el-table-column
-          prop="archivesName"
-          label="档案名称"
-          min-width="160"
-        ></el-table-column>
-        <el-table-column prop="courseName" label="课程" min-width="200">
-          <span slot-scope="scope">
-            {{ scope.row.courseName }}({{ scope.row.courseCode }})
-          </span>
-        </el-table-column>
-        <el-table-column
-          prop="studentCount"
-          label="学生数"
-          min-width="100"
-        ></el-table-column>
-        <el-table-column label="实扫/已上传(采集)" width="100" align="center">
-          <span slot-scope="scope">
-            {{ scope.row.clientScanCount }} / {{ scope.row.clientUploadCount }}
-          </span>
-        </el-table-column>
-        <el-table-column
-          prop="scanCount"
-          label="已上传(后台)"
-          width="80"
-          align="center"
-        ></el-table-column>
-        <el-table-column
-          v-if="curTab === 'my'"
-          class-name="action-column"
-          prop="enable"
-          label="状态"
-          width="80"
-          fixed="right"
-        >
-          <template slot-scope="scope">
-            <el-button
-              :class="scope.row.enable ? 'btn-danger' : 'btn-primary'"
-              type="text"
-              @click="toEnable(scope.row)"
-            >
-              {{ scope.row.enable ? "已完成" : "未完成" }}
-            </el-button>
-          </template>
-        </el-table-column>
-        <el-table-column
-          class-name="action-column"
-          label="操作"
-          width="100"
-          fixed="right"
-        >
-          <template slot-scope="scope">
-            <el-button
-              v-if="!scope.row.enable"
-              class="btn-primary"
-              type="text"
-              @click="toScan(scope.row)"
-            >
-              扫描
-            </el-button>
-            <el-button
-              v-if="!scope.row.scanCount && scope.row.clientScanCount"
-              class="btn-danger"
-              type="text"
-              @click="toClean(scope.row)"
-            >
-              清除
-            </el-button>
-          </template>
-        </el-table-column>
-      </el-table>
-      <div class="part-page">
-        <el-pagination
-          background
-          layout="total,prev, pager, next"
-          :current-page="current"
-          :total="total"
-          :page-size="size"
-          @current-change="toPage"
-        >
-        </el-pagination>
-      </div>
-    </div>
-
-    <!-- ScanTaskProcessDialog -->
-    <scan-task-process-dialog
-      ref="ScanTaskProcessDialog"
-      :task="curRow"
-      @on-close="getList"
-    ></scan-task-process-dialog>
     <!-- OcrAreaSetDialog -->
     <ocr-area-set-dialog
       v-if="openBarCode"
@@ -150,35 +88,14 @@
 
 <script>
 import db from "../../../plugins/db";
-import { taskListPage, enableScanTask } from "../api";
-import ScanTaskProcessDialog from "../components/ScanTaskProcessDialog.vue";
+import { taskListPage } from "../api";
 import OcrAreaSetDialog from "../components/OcrAreaSetDialog.vue";
-import { clearTaskOriginDir } from "../../../plugins/imageOcr";
-// import ScanTaskProcessDialog from "../components/ScanTaskDialog.vue";
 
 export default {
   name: "task-manage",
-  components: {
-    ScanTaskProcessDialog,
-    OcrAreaSetDialog,
-  },
+  components: { OcrAreaSetDialog },
   data() {
     return {
-      curTab: "all",
-      tabs: [
-        {
-          name: "全部",
-          val: "all",
-        },
-        {
-          name: "我的",
-          val: "my",
-        },
-      ],
-      cacheData: {
-        all: {},
-        my: {},
-      },
       filter: {
         paperArchivesId: "",
         courseCode: "",
@@ -189,9 +106,6 @@ export default {
       total: 0,
       dataList: [],
       curRow: {},
-      recordList: [],
-      courseList: [],
-      teachingClassList: [],
       ocrArea: null,
     };
   },
@@ -232,10 +146,6 @@ export default {
       this.total = data.total;
       this.updateTaskCount();
     },
-    toPage(page) {
-      this.current = page;
-      this.getList();
-    },
     async updateTaskCount() {
       for (let i = 0; i < this.dataList.length; i++) {
         const task = this.dataList[i];
@@ -248,24 +158,7 @@ export default {
         this.$set(task, "clientUploadCount", uploadCount);
       }
     },
-    selectMenu(curTab) {
-      this.cacheData[this.curTab] = {
-        current: this.current,
-        total: this.total,
-        dataList: this.dataList,
-      };
-
-      this.curTab = curTab;
 
-      if (this.cacheData[this.curTab].total) {
-        const { current, total, dataList } = this.cacheData[this.curTab];
-        this.current = current;
-        this.total = total;
-        this.dataList = dataList;
-      } else {
-        this.toPage(1);
-      }
-    },
     toScan(row) {
       if (row.enable) return;
       if (this.openBarCode && !this.ocrArea) {
@@ -278,37 +171,6 @@ export default {
     toSetOrcArea() {
       this.$refs.OcrAreaSetDialog.open();
     },
-    async toEnable(row) {
-      await enableScanTask({
-        paperScanTaskId: row.id,
-        enable: !row.enable,
-      });
-      row.enable = !row.enable;
-    },
-    async toClean(row) {
-      if (!(row.clientScanCount && !row.scanCount)) return;
-
-      this.$parent.$parent.stopUpload();
-
-      const res = await db.deleteScanByTaskId(row.id).catch((err) => {
-        console.error(err);
-      });
-      if (!res) {
-        this.$message.error("本地数据删除错误!");
-        this.$parent.$parent.initUploadTask();
-        return;
-      }
-
-      try {
-        clearTaskOriginDir(row.id);
-      } catch (error) {
-        console.error(error);
-        this.$message.error("本地文件删除错误!");
-      }
-      this.$parent.$parent.initUploadTask();
-
-      this.getList();
-    },
   },
 };
 </script>

+ 314 - 0
src/modules/client/views/TaskManage1.vue

@@ -0,0 +1,314 @@
+<template>
+  <div class="task-manage">
+    <div class="part-box part-box-filter part-box-flex">
+      <el-form ref="FilterForm" label-position="left" label-width="85px" inline>
+        <el-form-item label="档案:">
+          <archives-select
+            v-model="filter.paperArchivesId"
+            placeholder="请选择档案"
+          >
+          </archives-select>
+        </el-form-item>
+        <el-form-item label="课程:">
+          <course-select
+            v-model="filter.courseCode"
+            :filter-data="filter"
+            placeholder="请选择课程"
+          >
+          </course-select>
+        </el-form-item>
+        <el-form-item label-width="0px">
+          <el-button type="primary" @click="search">查询</el-button>
+          <el-button v-if="openBarCode" type="primary" @click="toSetOrcArea"
+            >设置条码识别区</el-button
+          >
+        </el-form-item>
+      </el-form>
+    </div>
+
+    <div class="mb-4 tab-btns">
+      <el-button
+        v-for="tab in tabs"
+        :key="tab.val"
+        size="medium"
+        :type="curTab == tab.val ? 'primary' : 'default'"
+        @click="selectMenu(tab.val)"
+        >{{ tab.name }}
+      </el-button>
+    </div>
+
+    <div class="part-box part-box-pad">
+      <el-table ref="TableList" size="medium" :data="dataList">
+        <el-table-column
+          prop="id"
+          label="任务ID"
+          min-width="160"
+        ></el-table-column>
+        <el-table-column
+          prop="scanTaskName"
+          label="任务名称"
+          min-width="160"
+        ></el-table-column>
+        <el-table-column
+          prop="archivesName"
+          label="档案名称"
+          min-width="160"
+        ></el-table-column>
+        <el-table-column prop="courseName" label="课程" min-width="200">
+          <span slot-scope="scope">
+            {{ scope.row.courseName }}({{ scope.row.courseCode }})
+          </span>
+        </el-table-column>
+        <el-table-column
+          prop="studentCount"
+          label="学生数"
+          min-width="100"
+        ></el-table-column>
+        <el-table-column label="实扫/已上传(采集)" width="100" align="center">
+          <span slot-scope="scope">
+            {{ scope.row.clientScanCount }} / {{ scope.row.clientUploadCount }}
+          </span>
+        </el-table-column>
+        <el-table-column
+          prop="scanCount"
+          label="已上传(后台)"
+          width="80"
+          align="center"
+        ></el-table-column>
+        <el-table-column
+          v-if="curTab === 'my'"
+          class-name="action-column"
+          prop="enable"
+          label="状态"
+          width="80"
+          fixed="right"
+        >
+          <template slot-scope="scope">
+            <el-button
+              :class="scope.row.enable ? 'btn-danger' : 'btn-primary'"
+              type="text"
+              @click="toEnable(scope.row)"
+            >
+              {{ scope.row.enable ? "已完成" : "未完成" }}
+            </el-button>
+          </template>
+        </el-table-column>
+        <el-table-column
+          class-name="action-column"
+          label="操作"
+          width="100"
+          fixed="right"
+        >
+          <template slot-scope="scope">
+            <el-button
+              v-if="!scope.row.enable"
+              class="btn-primary"
+              type="text"
+              @click="toScan(scope.row)"
+            >
+              扫描
+            </el-button>
+            <el-button
+              v-if="!scope.row.scanCount && scope.row.clientScanCount"
+              class="btn-danger"
+              type="text"
+              @click="toClean(scope.row)"
+            >
+              清除
+            </el-button>
+          </template>
+        </el-table-column>
+      </el-table>
+      <div class="part-page">
+        <el-pagination
+          background
+          layout="total,prev, pager, next"
+          :current-page="current"
+          :total="total"
+          :page-size="size"
+          @current-change="toPage"
+        >
+        </el-pagination>
+      </div>
+    </div>
+
+    <!-- ScanTaskProcessDialog -->
+    <scan-task-process-dialog
+      ref="ScanTaskProcessDialog"
+      :task="curRow"
+      @on-close="getList"
+    ></scan-task-process-dialog>
+    <!-- OcrAreaSetDialog -->
+    <ocr-area-set-dialog
+      v-if="openBarCode"
+      ref="OcrAreaSetDialog"
+      @modified="getOcrArea"
+    >
+    </ocr-area-set-dialog>
+  </div>
+</template>
+
+<script>
+import db from "../../../plugins/db";
+import { taskListPage, enableScanTask } from "../api";
+import ScanTaskProcessDialog from "../components/ScanTaskProcessDialog.vue";
+import OcrAreaSetDialog from "../components/OcrAreaSetDialog.vue";
+import { clearTaskOriginDir } from "../../../plugins/imageOcr";
+// import ScanTaskProcessDialog from "../components/ScanTaskDialog.vue";
+
+export default {
+  name: "task-manage",
+  components: {
+    ScanTaskProcessDialog,
+    OcrAreaSetDialog,
+  },
+  data() {
+    return {
+      curTab: "all",
+      tabs: [
+        {
+          name: "全部",
+          val: "all",
+        },
+        {
+          name: "我的",
+          val: "my",
+        },
+      ],
+      cacheData: {
+        all: {},
+        my: {},
+      },
+      filter: {
+        paperArchivesId: "",
+        courseCode: "",
+        isMine: false,
+      },
+      current: 1,
+      size: 10,
+      total: 0,
+      dataList: [],
+      curRow: {},
+      recordList: [],
+      courseList: [],
+      teachingClassList: [],
+      ocrArea: null,
+    };
+  },
+  computed: {
+    openBarCode() {
+      return this.$store.state.user.openBarCode;
+    },
+  },
+  mounted() {
+    this.getOcrArea();
+    this.search();
+  },
+  methods: {
+    search() {
+      this.cacheData[this.curTab] = {};
+      this.toPage(1);
+    },
+    async getOcrArea() {
+      const ocrArea = await db.getDict("ocrArea", "").catch(() => {});
+      this.ocrArea = ocrArea || null;
+      this.$store.commit(
+        "client/setOcrArea",
+        ocrArea ? JSON.parse(ocrArea) : {}
+      );
+    },
+    async getList() {
+      let datas = {
+        pageNumber: this.current,
+        pageSize: this.size,
+      };
+      if (this.curTab === "all") {
+        datas = { ...datas, ...this.filter };
+      } else {
+        datas = { ...datas, isMine: true };
+      }
+      const data = await taskListPage(datas);
+      this.dataList = data.records;
+      this.total = data.total;
+      this.updateTaskCount();
+    },
+    toPage(page) {
+      this.current = page;
+      this.getList();
+    },
+    async updateTaskCount() {
+      for (let i = 0; i < this.dataList.length; i++) {
+        const task = this.dataList[i];
+        const scanCount = await db.countScanList({ taskId: task.id });
+        this.$set(task, "clientScanCount", scanCount);
+        const uploadCount = await db.countScanList({
+          taskId: task.id,
+          isUpload: 1,
+        });
+        this.$set(task, "clientUploadCount", uploadCount);
+      }
+    },
+    selectMenu(curTab) {
+      this.cacheData[this.curTab] = {
+        current: this.current,
+        total: this.total,
+        dataList: this.dataList,
+      };
+
+      this.curTab = curTab;
+
+      if (this.cacheData[this.curTab].total) {
+        const { current, total, dataList } = this.cacheData[this.curTab];
+        this.current = current;
+        this.total = total;
+        this.dataList = dataList;
+      } else {
+        this.toPage(1);
+      }
+    },
+    toScan(row) {
+      if (row.enable) return;
+      if (this.openBarCode && !this.ocrArea) {
+        this.$message.error("请先设置条形码识别区!");
+        return;
+      }
+      this.curRow = row;
+      this.$refs.ScanTaskProcessDialog.open();
+    },
+    toSetOrcArea() {
+      this.$refs.OcrAreaSetDialog.open();
+    },
+    async toEnable(row) {
+      await enableScanTask({
+        paperScanTaskId: row.id,
+        enable: !row.enable,
+      });
+      row.enable = !row.enable;
+    },
+    async toClean(row) {
+      if (!(row.clientScanCount && !row.scanCount)) return;
+
+      this.$parent.$parent.stopUpload();
+
+      const res = await db.deleteScanByTaskId(row.id).catch((err) => {
+        console.error(err);
+      });
+      if (!res) {
+        this.$message.error("本地数据删除错误!");
+        this.$parent.$parent.initUploadTask();
+        return;
+      }
+
+      try {
+        clearTaskOriginDir(row.id);
+      } catch (error) {
+        console.error(error);
+        this.$message.error("本地文件删除错误!");
+      }
+      this.$parent.$parent.initUploadTask();
+
+      this.getList();
+    },
+  },
+};
+</script>

+ 5 - 7
src/modules/login/views/Login.vue

@@ -76,14 +76,14 @@ export default {
   data() {
     return {
       schools: [
-        { code: "test-schoo-1", name: "学校1" },
-        { code: "test-schoo-2", name: "学校2" },
+        { code: "test-school-1", name: "学校1" },
+        { code: "test-school-2", name: "学校2" },
       ],
       loginModel: {
-        schoolCode: "",
+        schoolCode: "test-school-1",
         type: "ACCOUNT",
-        loginname: "",
-        password: "",
+        loginName: "sm01",
+        password: "123456",
       },
       loginRules: {
         loginName: [
@@ -126,8 +126,6 @@ export default {
         this.$message.error("请先配置域名!");
         return;
       }
-      this.loginModel.schoolCode = this.$ls.get("schoolCode");
-
       const valid = await this.$refs.loginForm.validate().catch(() => {});
       if (!valid) return;
 

+ 40 - 3
src/views/Home.vue

@@ -1,9 +1,39 @@
 <template>
-  <layout :back-handle="toBack"> </layout>
+  <div class="home">
+    <div class="home-head box-justify">
+      <div class="home-breadcrumb">
+        <span class="breadcrumb-tips">
+          <i class="icon icon-home"></i>
+          <span>当前位置:</span>
+        </span>
+        <el-breadcrumb separator="/">
+          <el-breadcrumb-item v-for="bread in breadcrumbs" :key="bread.url">{{
+            bread.name
+          }}</el-breadcrumb-item>
+        </el-breadcrumb>
+      </div>
+      <div class="home-user">
+        <ul>
+          <li>
+            <i class="icon icon-org"></i>
+            <span>{{ schoolName }}</span>
+          </li>
+          <li>
+            <i class="icon icon-user-fill"></i>
+            <span>{{ userName }}</span>
+          </li>
+          <li>
+            <i class="icon icon-logout"></i>
+            <span>退出</span>
+          </li>
+        </ul>
+      </div>
+    </div>
+    <div class="home-body"><router-view /></div>
+  </div>
 </template>
 
 <script>
-import Layout from "./Layout.vue";
 import uploadTaskMixin from "../mixins/uploadTaskMixin";
 import setTimeMixins from "../mixins/setTimeMixins";
 import db from "../plugins/db";
@@ -11,7 +41,6 @@ import db from "../plugins/db";
 export default {
   name: "home",
   mixins: [uploadTaskMixin, setTimeMixins],
-  components: { Layout },
   data() {
     return {};
   },
@@ -19,6 +48,14 @@ export default {
     this.initUploadTask();
     this.updateUnuploadCount();
   },
+  computed: {
+    breadcrumbs() {
+      return [];
+    },
+    schoolName() {
+      return "";
+    },
+  },
   methods: {
     // unupload count
     async updateUnuploadCount() {

+ 1 - 1
src/views/Layout.vue

@@ -1,5 +1,5 @@
 <template>
-  <div class="home">
+  <div class="home layout">
     <div class="home-head">
       <div class="head-logo"></div>
       <div class="head-actions">

+ 3 - 0
vue.config.js

@@ -6,6 +6,9 @@ module.exports = defineConfig({
   // publicPath: './',
   devServer: {
     port: 8066,
+    client: {
+      overlay: false,
+    },
   },
   pluginOptions: {
     electronBuilder: {