panhui před 4 roky
rodič
revize
98975e0e16

+ 12 - 0
.jpb/persistence-units.xml

@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="PersistenceUnitSettings">
+    <persistence-units>
+      <persistence-unit name="Default">
+        <packages>
+          <package value="com.izouma.wenlvju" />
+        </packages>
+      </persistence-unit>
+    </persistence-units>
+  </component>
+</project>

+ 17 - 0
src/main/h5/src/assets/person.svg

@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg width="16px" height="16px" viewBox="0 0 16 16" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+    <title>icon_dizhi</title>
+    <g id="页面-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
+        <g id="监管列表" transform="translate(-36.000000, -260.000000)">
+            <g id="编组-3" transform="translate(16.000000, 199.000000)">
+                <g id="icon/状态" transform="translate(20.000000, 61.000000)">
+                    <g id="icon_dizhi" transform="translate(1.000000, 0.000000)">
+                        <rect id="矩形" fill="#FFE2D9" x="4" y="12" width="6" height="4" rx="1"></rect>
+                        <path d="M4.54507648,1.14730435 C4.87841403,0.820176168 5.27842352,0.558517068 5.67841087,0.394952978 C6.11173419,0.231388889 6.57841561,0.133272156 7.01173893,0.133272156 C7.47842036,0.133272156 7.94507964,0.23141061 8.34508913,0.394952978 C8.77841245,0.558517068 9.17842194,0.82019789 9.47842352,1.14730435 C9.81173893,1.47438908 10.0784045,1.86692118 10.2450844,2.29214437 C10.4117642,2.71738928 10.51175,3.17534701 10.51175,3.63328302 C10.51175,4.09121903 10.4117421,4.54915503 10.2450844,4.97437822 C10.0784045,5.39962313 9.81173893,5.79215523 9.47842352,6.11926169 C9.14506383,6.44634642 8.74507648,6.70804897 8.34508913,6.87159133 C7.91174367,7.03515542 7.44506225,7.13327216 7.01173893,7.13327216 C6.54507964,7.13327216 6.07842036,7.0351337 5.67841087,6.87159133 C5.24508755,6.70802724 4.84507806,6.44634642 4.54507648,6.11926169 C4.21173893,5.79213351 3.94507332,5.39962313 3.77841561,4.97439994 C3.61173577,4.54915503 3.51175,4.0911973 3.51175,3.63328302 C3.51175,3.14261247 3.61173577,2.68467646 3.77841561,2.29214437 C3.94509545,1.86692118 4.21173893,1.47438908 4.54507648,1.14730435 Z" id="路径" fill="#FF7348" fill-rule="nonzero"></path>
+                        <path d="M13.8680844,13.4909491 C13.7038484,13.9026963 13.3754037,14.1273127 12.923782,14.3519044 C12.5132193,14.576496 11.9384752,14.6513681 11.3225902,14.6513681 L2.70093706,14.6513681 C2.08507937,14.6513681 1.55136695,14.5390599 1.09974525,14.3144683 C0.64812355,14.0898767 0.319678841,13.7529768 0.155470119,13.3786409 C-0.00876586727,12.9668688 -0.00876586727,12.3679413 0.155470119,11.9187332 C0.237588112,11.7315777 0.278619845,11.506986 0.401796834,11.3198056 C1.63345767,9.14871189 4.13786562,7.65136814 7.01175,7.65136814 C9.10559524,7.65136814 10.9941455,8.40004001 12.3490106,9.67276729 C12.923782,10.2342588 13.252254,10.6460308 13.5806714,11.2449583 C13.7038484,11.4321387 13.8270254,11.6192943 13.8680844,11.8438859 C13.9501751,12.0684775 14.0322931,12.4053774 14.0322931,12.7048411 C14.0322931,13.0043049 13.9501751,13.2663326 13.8680844,13.4909491 Z" id="路径" fill="#FF7348" fill-rule="nonzero"></path>
+                    </g>
+                </g>
+            </g>
+        </g>
+    </g>
+</svg>

+ 18 - 0
src/main/h5/src/assets/phone.svg

@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg width="16px" height="16px" viewBox="0 0 16 16" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+    <title>icon_dizhi</title>
+    <g id="页面-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
+        <g id="监管列表" transform="translate(-158.000000, -260.000000)">
+            <g id="编组-3" transform="translate(16.000000, 199.000000)">
+                <g id="编组-2" transform="translate(142.000000, 61.000000)">
+                    <g id="icon_dizhi" transform="translate(2.000000, 1.000000)">
+                        <path d="M4.50387103,8.3772581 L8.50387103,10.7105914 C8.81108873,10.8898018 9,11.2187033 9,11.5743703 L9,13 C9,13.5522847 8.55228475,14 8,14 L4,14 C3.44771525,14 3,13.5522847 3,13 L3,9.241037 C3,8.68875225 3.44771525,8.241037 4,8.241037 C4.17705464,8.241037 4.35093497,8.2880454 4.50387103,8.3772581 Z" id="矩形" fill="#FAEBCB"></path>
+                        <g id="编组" fill="#FFC449" fill-rule="nonzero">
+                            <path d="M9.14736842,5.57368421 C9.14736842,5.83421053 9.32105263,6 9.57368421,6 C9.82631579,6 10,5.82631579 10,5.57368421 C9.99210526,4.15263158 8.84736842,3.00789474 7.42631579,3 C7.16578947,3 7,3.17368421 7,3.42631579 C7,3.68684211 7.17368421,3.85263158 7.42631579,3.85263158 C8.37368421,3.86052632 9.13947368,4.62631579 9.14736842,5.57368421 Z M11.0954774,5.54773869 C11.0954774,5.8241206 11.279732,6 11.5477387,6 C11.8157454,6 12,5.81574539 12,5.54773869 C12,3.04355109 9.9480737,1 7.45226131,1 C7.1758794,1 7,1.18425461 7,1.45226131 C7,1.72864322 7.18425461,1.90452261 7.45226131,1.90452261 C9.45393635,1.90452261 11.0954774,3.54606365 11.0954774,5.54773869 L11.0954774,5.54773869 Z M4.94998506,4.13527335 C5.45482007,3.63078905 5.49688965,2.85724645 5.04253814,2.31072179 L3.62900011,0.519802521 C3.1746486,-0.0771705695 2.29960125,-0.169659358 1.71062707,0.292784585 C1.66855748,0.334824943 1.61807398,0.334824943 1.61807398,0.385273374 L0.381228206,1.62125991 C-0.805134069,2.80679802 0.886063217,6.01027333 3.94872895,9.07081143 C7.01139468,12.1313495 10.1666135,13.7793316 11.3529758,12.6358338 L12.5898216,11.3998473 C13.1367261,10.8533226 13.1367261,9.98729124 12.5898216,9.48280694 L12.4972685,9.39031815 L10.7135181,7.97776211 C10.1666135,7.52372624 9.39253315,7.5657666 8.88769814,8.0702509 L8.11361779,8.84379349 C7.28905394,8.33930919 6.55704317,7.79278453 5.91758549,7.15377108 C5.27812781,6.51475764 4.73122322,5.7832554 4.22638821,4.95926437 L4.94998506,4.13527335 Z" id="形状"></path>
+                        </g>
+                    </g>
+                </g>
+            </g>
+        </g>
+    </g>
+</svg>

+ 42 - 16
src/main/h5/src/router/index.js

@@ -7,7 +7,7 @@ Vue.use(VueRouter);
 const routes = [
   {
     path: "/",
-    redirect: "inspectorList"
+    redirect: "pageMenu"
   },
   {
     path: "/home",
@@ -24,6 +24,14 @@ const routes = [
     name: "loginHome",
     component: () => import("../views/loginHome.vue")
   },
+  {
+    path: "/pageMenu",
+    name: "pageMenu",
+    component: () => import("../views/PageMenu.vue"),
+    meta: {
+      checkLogin: true
+    }
+  },
   {
     path: "/inspectorList",
     name: "inspectorList",
@@ -71,6 +79,38 @@ const routes = [
     meta: {
       checkLogin: true
     }
+  },
+  {
+    path: "/recordList",
+    name: "recordList",
+    component: () => import("../views/record/recordList.vue"),
+    meta: {
+      checkLogin: true
+    }
+  },
+  {
+    path: "/recordDetail",
+    name: "recordDetail",
+    component: () => import("../views/record/recordDetail.vue"),
+    meta: {
+      checkLogin: true
+    }
+  },
+  {
+    path: "/recordCheck",
+    name: "recordCheck",
+    component: () => import("../views/record/recordCheck.vue"),
+    meta: {
+      checkLogin: true
+    }
+  },
+  {
+    path: "/recordAdd",
+    name: "recordAdd",
+    component: () => import("../views/record/recordAdd.vue"),
+    meta: {
+      checkLogin: true
+    }
   }
 ];
 
@@ -122,26 +162,12 @@ router.beforeEach((to, from, next) => {
     store
       .dispatch("getUserInfo")
       .then(() => {
-        if (to.name === "inspectorList") {
-          if (exportsInfo) {
-            next("/expertList");
-          } else {
-            next();
-          }
-        } else {
-          next();
-        }
+        next();
         return;
       })
       .catch(() => {
         next("/login");
       });
-  } else if (store.state.userInfo && to.name === "inspectorList") {
-    if (inspectorsInfo) {
-      next();
-    } else if (exportsInfo) {
-      next("/expertList");
-    }
   } else if (!to.matched.length) {
     next("/404");
   } else {

+ 36 - 0
src/main/h5/src/views/PageMenu.vue

@@ -0,0 +1,36 @@
+<template>
+  <div class="menus">
+    <van-button
+      type="primary"
+      block
+      @click="$router.push('/recordList')"
+      :color="$colors.prim"
+      >监察</van-button
+    >
+    <van-button
+      type="primary"
+      block
+      @click="$router.push('/expertList')"
+      :color="$colors.prim"
+      >评分</van-button
+    >
+  </div>
+</template>
+
+<script>
+export default {};
+</script>
+
+<style lang="less" scoped>
+.menus {
+  display: flex;
+  flex-direction: column;
+  min-height: 100vh;
+  padding: 0 20px;
+  justify-content: center;
+
+  .van-button + .van-button {
+    margin-top: 30px;
+  }
+}
+</style>

+ 326 - 0
src/main/h5/src/views/record/recordAdd.vue

@@ -0,0 +1,326 @@
+<template>
+  <div class="container">
+    <div class="page-title">
+      <div class="text1">添加检索记录</div>
+      <!-- <div class="text2">选择分值对各项目进行打分</div> -->
+    </div>
+
+    <div class="score-card">
+      <div class="name">
+        检查情况
+      </div>
+      <van-field
+        type="textarea"
+        class="textarea"
+        placeholder="请输入…"
+        v-model="form.content"
+        :autosize="{ maxHeight: 200, minHeight: 160 }"
+        :maxlength="150"
+      ></van-field>
+      <div class="file">
+        <van-uploader
+          :after-read="afterRead"
+          :before-read="beforeRead"
+          :before-delete="beforeDelete"
+          v-model="form.imgs"
+          class="miniImg"
+        >
+          <div class="upload-mini">
+            <img src="../../assets/icon_add.svg" alt="" />
+            <div class="text">添加佐证</div>
+          </div>
+        </van-uploader>
+        <div class="tips">
+          最多上传3张
+        </div>
+      </div>
+    </div>
+
+    <!-- <div class="page-title">
+      <div class="text1">上传图片资源</div>
+      <div class="text2">上传现场图片材料</div>
+    </div> -->
+
+    <!-- <van-uploader
+      :after-read="afterRead"
+      :before-read="beforeRead"
+      :before-delete="beforeDelete"
+      v-model="form.imgs"
+      class="bigImg"
+      name="big"
+    >
+      <div class="upload">
+        <img src="../../assets/icon_add.svg" alt="" />
+        <div class="text">点击上传</div>
+      </div>
+    </van-uploader> -->
+
+    <div class="bottom">
+      <van-button
+        class="submit"
+        @click="submit"
+        :color="$colors.prim"
+        block
+        round
+        :disabled="!canSubmit"
+        >提交</van-button
+      >
+    </div>
+  </div>
+</template>
+
+<script>
+import expert from "../../mixins/expert";
+import Compressor from "compressorjs";
+export default {
+  name: "expertAdd",
+  mixins: [expert],
+  metaInfo() {
+    return {
+      title: "上传评分"
+    };
+  },
+  data() {
+    return {
+      form: {
+        content: "",
+        file: [],
+        imgs: []
+      },
+      img: [],
+      submitList: {}
+    };
+  },
+  computed: {
+    canSubmit() {
+      return !!this.form.content;
+    }
+  },
+  mounted() {},
+  methods: {
+    afterRead(file, detail) {
+      this.$toast.loading({
+        message: "加载中...",
+        forbidClick: true
+      });
+      this.$http
+        .post("/upload/base64", {
+          base64: file.content
+        })
+        .then(res => {
+          this.$toast.clear();
+          let imgs = [...this.form.file];
+          imgs.push(res);
+          this.form.file = imgs;
+        });
+    },
+    beforeDelete(file, detail) {
+      let submitForm = { ...this.form };
+      var imgs1 = [...submitForm.file];
+      imgs1.splice(detail.index, 1);
+      var imgs2 = [...submitForm.imgs];
+      imgs2.splice(detail.index, 1);
+      this.form.file = imgs1;
+      this.form.imgs = imgs2;
+    },
+    beforeRead(file) {
+      return new Promise(resolve => {
+        // compressorjs 默认开启 checkOrientation 选项
+        // 会将图片修正为正确方向
+        new Compressor(file, {
+          success: resolve,
+          error(err) {
+            console.log(err.message);
+          }
+        });
+      });
+    },
+    submit() {
+      let form = { ...this.form };
+      this.$toast.loading({
+        message: "加载中...",
+        forbidClick: true
+      });
+      delete form.imgs;
+      form.userId = this.$store.state.userInfo.id;
+      form.recordId = this.$route.query.recordId;
+      this.$http
+        .post("/recordCheck/save", form, { body: "json" })
+        .then(() => {
+          this.saving = false;
+          this.$toast.success("成功");
+          setTimeout(() => {
+            this.$router.go(-1);
+          }, 1500);
+        })
+        .catch(e => {
+          console.log(e);
+          this.saving = false;
+          this.$message.error(e.error);
+        });
+    }
+  }
+};
+</script>
+
+<style lang="less" scoped>
+.bottom {
+  position: fixed;
+  bottom: 0;
+  left: 0;
+  right: 0;
+  padding: 6px 26px calc(env(safe-area-inset-bottom) + 6px);
+  background-color: #fff;
+  z-index: 20;
+
+  display: flex;
+
+  .preview {
+    min-width: 82px;
+    width: 82px;
+  }
+  .submit {
+    flex-grow: 1;
+    // margin-left: 13px;
+  }
+}
+.container {
+  padding: 10px 16px 100px;
+  .page-title {
+    padding: 14px 16px;
+    background-color: #fff;
+    border-radius: 12px;
+    .text1 {
+      font-size: 20px;
+      font-weight: bold;
+      color: #313233;
+      line-height: 28px;
+    }
+    .text2 {
+      font-size: 13px;
+      color: #939599;
+      line-height: 22px;
+    }
+  }
+}
+.score-card {
+  border-radius: 12px;
+  overflow: hidden;
+  background: #fff;
+  margin-top: 12px;
+  .name {
+    font-size: 16px;
+    font-weight: bold;
+    color: #313233;
+    line-height: 28px;
+    padding: 20px 16px 0;
+  }
+
+  .score-title {
+    background: #ffcf6a;
+    padding: 20px;
+    position: relative;
+
+    img {
+      position: absolute;
+      right: 30px;
+      top: 13px;
+    }
+
+    .text1 {
+      font-size: 18px;
+      font-weight: bold;
+      color: #ffffff;
+      line-height: 28px;
+    }
+
+    .text2 {
+      font-size: 14px;
+      color: #ffffff;
+      line-height: 20px;
+    }
+  }
+  .score-list {
+    padding: 0 20px;
+  }
+  .file {
+    padding: 16px 20px 20px;
+    .tips {
+      font-size: 13px;
+      color: #aaabad;
+      line-height: 18px;
+      margin-top: 17px;
+    }
+  }
+}
+
+.textarea {
+  border-radius: 12px;
+}
+.upload-mini {
+  background: #ffffff;
+  width: 72px;
+  height: 72px;
+  border-radius: 8px;
+  display: flex;
+  flex-direction: column;
+  align-items: center;
+  justify-content: center;
+  border: 1px solid #e6e7eb;
+  img {
+    width: 24px;
+    height: 24px;
+  }
+
+  .text {
+    font-size: 12px;
+    color: #c4c7cc;
+    line-height: 22px;
+  }
+
+  &:active {
+    background-color: darken(#fff, 10);
+  }
+}
+.upload {
+  background: #ffffff;
+  width: 140px;
+  height: 140px;
+  border-radius: 8px;
+  display: flex;
+  flex-direction: column;
+  align-items: center;
+  justify-content: center;
+  img {
+    width: 36px;
+    height: 36px;
+  }
+
+  .text {
+    font-size: 14px;
+    color: #c4c7cc;
+    line-height: 22px;
+  }
+
+  &:active {
+    background-color: darken(#fff, 10);
+  }
+}
+/deep/.miniImg {
+  margin-top: 10px;
+  .van-uploader__file,
+  .van-uploader__preview-image {
+    width: 72px;
+    height: 72px;
+    border-radius: 8px;
+  }
+}
+/deep/.bigImg {
+  .van-uploader__file,
+  .van-uploader__preview-image {
+    width: 140px;
+    height: 140px;
+    border-radius: 8px;
+  }
+}
+</style>

+ 154 - 0
src/main/h5/src/views/record/recordCheck.vue

@@ -0,0 +1,154 @@
+<template>
+  <div class="container">
+    <div class="page-title">
+      检索记录
+    </div>
+
+    <div class="card" v-for="item in list" :key="item.id">
+      <div class="name">
+        <div class="text1">
+          检查情况
+        </div>
+        <div class="text2">
+          {{ item.createdAt }}
+        </div>
+      </div>
+      <div class="content">
+        {{ item.content }}
+      </div>
+
+      <div class="imgs">
+        <van-image
+          :src="img"
+          v-for="(img, imgIndex) in item.file"
+          :key="imgIndex"
+          fit="contain"
+          @click="preview(imgIndex, item.file)"
+        />
+      </div>
+    </div>
+
+    <van-empty v-if="empty" description="暂无检索记录" />
+
+    <div class="btn">
+      <van-button
+        :color="$colors.prim"
+        block
+        round
+        @click="$router.push('recordAdd?recordId=' + recordId)"
+        >添加检索记录</van-button
+      >
+    </div>
+  </div>
+</template>
+
+<script>
+import { ImagePreview } from "vant";
+export default {
+  metaInfo() {
+    return {
+      title: "检索记录"
+    };
+  },
+  data() {
+    return {
+      recordId: "",
+      list: [],
+      empty: false
+    };
+  },
+  mounted() {
+    this.recordId = this.$route.query.recordId;
+    this.$http
+      .post(
+        "/recordCheck/all",
+        {
+          query: {
+            recordId: this.recordId
+          }
+        },
+        { body: "json" }
+      )
+      .then(res => {
+        this.list = res.content;
+        this.empty = res.empty;
+      });
+  },
+  methods: {
+    preview(index, imgs) {
+      ImagePreview({
+        images: imgs,
+        startPosition: index,
+        closeable: true
+      });
+    }
+  }
+};
+</script>
+
+<style lang="less" scoped>
+.btn {
+  position: fixed;
+  bottom: 0;
+  padding: 6px 47px;
+  left: 0;
+  right: 0;
+  z-index: 20;
+  background: #fff;
+}
+.container {
+  padding: 10px 20px 100px;
+}
+.page-title {
+  font-size: 20px;
+  font-weight: bold;
+  color: #313233;
+  line-height: 28px;
+  padding: 16px;
+  background: #ffffff;
+  border-radius: 12px;
+}
+
+.card {
+  background: #ffffff;
+  border-radius: 12px;
+  padding: 20px;
+  margin-top: 12px;
+
+  .name {
+    display: flex;
+    align-items: center;
+    justify-content: space-between;
+    .text1 {
+      font-size: 16px;
+      font-weight: bold;
+      color: #313233;
+      line-height: 28px;
+    }
+
+    .text2 {
+      font-size: 12px;
+      color: #969799;
+      line-height: 17px;
+    }
+  }
+
+  .content {
+    font-size: 13px;
+    color: #939599;
+    line-height: 22px;
+  }
+
+  .imgs {
+    display: flex;
+    margin-top: 16px;
+
+    .van-image {
+      width: 72px;
+      height: 72px;
+      border-radius: 8px;
+      overflow: hidden;
+    }
+  }
+}
+</style>

+ 465 - 0
src/main/h5/src/views/record/recordDetail.vue

@@ -0,0 +1,465 @@
+<template>
+  <div class="container">
+    <div class="top-box">
+      <img src="../../assets/bg_top.jpg" class="top-img" alt="" />
+      <div class="card">
+        <div class="info">
+          <div class="title">{{ recordInfo.examinationName }}</div>
+          <div class="address">
+            <div class="text">
+              南京市{{ recordInfo.district }}
+              {{ recordInfo.examinationAddress }}
+            </div>
+          </div>
+        </div>
+
+        <div class="person-list">
+          <div class="person" @click="call(recordInfo.examOwnerPhone)">
+            <div class="name">考点负责人名称</div>
+            <div class="content">
+              <div class="text1">{{ recordInfo.examOwner }}</div>
+              <div class="text1">{{ recordInfo.examOwnerPhone }}</div>
+              <img src="../../assets/icon_dianhua.svg" alt="" />
+            </div>
+          </div>
+          <div class="person" @click="call(recordInfo.securityOwnerPhone)">
+            <div class="name">安全负责人名称</div>
+            <div class="content">
+              <div class="text1">{{ recordInfo.securityOwner }}</div>
+              <div class="text1">{{ recordInfo.securityOwnerPhone }}</div>
+              <img src="../../assets/icon_dianhua.svg" alt="" />
+            </div>
+          </div>
+        </div>
+      </div>
+
+      <div class="card">
+        <img
+          class="icon left-icon"
+          src="../../assets/icon_lianjie.svg"
+          alt=""
+        />
+        <img
+          class="icon right-icon"
+          src="../../assets/icon_lianjie.svg"
+          alt=""
+        />
+        <div class="card-info">
+          <div class="name">
+            考级活动时间
+          </div>
+          <div class="time">
+            {{ recordInfo.examinationStartTime }}——{{
+              recordInfo.examinationEndTime
+            }}
+          </div>
+        </div>
+        <div class="card-list">
+          <div class="card-info">
+            <div class="name">
+              考场数量
+            </div>
+            <div class="text">{{ recordInfo.examCenterQuantity }}场</div>
+          </div>
+          <div class="card-info">
+            <div class="name">
+              考官数量
+            </div>
+            <div class="text">{{ recordInfo.examinerQuantity }}人</div>
+          </div>
+          <div class="card-info">
+            <div class="name">
+              报考人数
+            </div>
+            <div class="text">{{ recordInfo.examQuantity }}人</div>
+          </div>
+        </div>
+
+        <div class="card-info">
+          <div class="name">
+            考级机构
+          </div>
+          <div class="text">
+            {{ recordInfo.examinationAgency }}
+          </div>
+        </div>
+
+        <div class="card-info">
+          <div class="name">
+            承办单位
+          </div>
+          <div class="text">
+            {{ recordInfo.organizer }}
+          </div>
+        </div>
+
+        <div class="card-info">
+          <div class="name">
+            统一社会信用代码
+          </div>
+          <div class="text">
+            {{ recordInfo.uscc }}
+          </div>
+        </div>
+      </div>
+
+      <div class="card">
+        <img
+          class="icon left-icon"
+          src="../../assets/icon_lianjie.svg"
+          alt=""
+        />
+        <img
+          class="icon right-icon"
+          src="../../assets/icon_lianjie.svg"
+          alt=""
+        />
+        <div class="card-name">
+          考级专业
+        </div>
+        <div class="card-table">
+          <div class="tr">
+            <div class="th">
+              专业名称
+            </div>
+            <div class="th">
+              专业代码
+            </div>
+            <div class="th">
+              总级数
+            </div>
+            <div class="th">
+              考场数量
+            </div>
+            <div class="th">
+              考官人数
+            </div>
+          </div>
+          <div class="tr" v-for="item in recordSpecialtys" :key="item.id">
+            <div class="td">{{ item.name }}</div>
+            <div class="td">{{ item.code }}</div>
+            <div class="td">{{ item.level }}</div>
+            <div class="td">{{ item.numOfExam }}</div>
+            <div class="td">{{ item.examinerQuantity }}</div>
+          </div>
+        </div>
+      </div>
+    </div>
+
+    <div class="btn">
+      <van-button
+        @click="$router.go(-1)"
+        round
+        class="back"
+        :color="$colors.text2"
+        >返回</van-button
+      >
+      <van-button
+        @click="$router.push('/recordCheck?recordId=' + recordInfo.id)"
+        round
+        :color="$colors.prim"
+        >检索记录</van-button
+      >
+    </div>
+  </div>
+</template>
+
+<script>
+import dayjs from "dayjs";
+export default {
+  name: "expertdetail",
+  metaInfo() {
+    return {
+      title: "监管详情"
+    };
+  },
+  data() {
+    return {
+      recordInfo: {},
+      recordSpecialtys: []
+    };
+  },
+  mounted() {
+    this.getInfo(this.$route.query.id);
+  },
+  methods: {
+    getInfo(id) {
+      this.$toast.loading({
+        message: "加载中...",
+        forbidClick: true
+      });
+
+      this.$http
+        .get("/record/get/" + id)
+        .then(res => {
+          this.recordInfo = res;
+          return this.$http.post(
+            "/recordSpecialty/all/",
+            {
+              query: {
+                recordId: res.id
+              }
+            },
+            { body: "json" }
+          );
+        })
+        .then(res => {
+          this.recordSpecialtys = res.content;
+          this.$toast.clear();
+        });
+    },
+    call(phone) {
+      window.location.href = "tel:" + phone;
+    }
+  }
+};
+</script>
+<style lang="less" scoped>
+.container {
+  position: relative;
+  padding-bottom: 100px;
+}
+.top-box {
+  position: relative;
+  padding: 134px 16px 16px;
+  .top-img {
+    display: block;
+    width: 100%;
+    height: auto;
+    position: absolute;
+    top: 0;
+    left: 0;
+    z-index: 0;
+  }
+
+  .card {
+    position: relative;
+    background: #ffffff;
+    border-radius: 12px;
+    padding: 20px;
+    z-index: 1;
+    .info {
+      .title {
+        font-size: 22px;
+        font-weight: bold;
+        color: #000000;
+        line-height: 32px;
+      }
+    }
+    .address {
+      display: flex;
+      .text {
+        font-size: 14px;
+        font-family: PingFangSC-Regular, PingFang SC;
+        font-weight: 400;
+        color: #000000;
+        line-height: 24px;
+      }
+    }
+    .img {
+      display: flex;
+      width: 16px;
+      height: 16px;
+      flex-direction: column;
+      min-width: 24px;
+      padding-left: 12px;
+      font-size: 12px;
+      color: #2c96ff;
+      line-height: 22px;
+    }
+    hr {
+      width: 100%;
+      height: 1px;
+      background: #f5f7fa;
+      border: 0;
+      margin: 20px 0;
+    }
+    .owner {
+      .owner-item {
+        display: flex;
+        align-items: center;
+        .text1 {
+          font-size: 14px;
+          color: #939599;
+          line-height: 24px;
+        }
+
+        .text2 {
+          font-size: 16px;
+          color: #000000;
+          line-height: 24px;
+          min-width: 84px;
+        }
+        .text2 + .text2 {
+          flex-grow: 1;
+          margin-left: 5px;
+        }
+      }
+    }
+  }
+
+  .left-icon,
+  .right-icon {
+    position: absolute;
+    width: 10px;
+    height: 54px;
+    top: -30px;
+  }
+  .left-icon {
+    left: 16px;
+  }
+  .right-icon {
+    right: 16px;
+  }
+}
+.person-list {
+  .person {
+    padding: 20px 0;
+    .name {
+      font-size: 15px;
+      color: #00000020;
+      line-height: 24px;
+    }
+    .content {
+      display: flex;
+      margin-top: 2px;
+      .text1 {
+        font-size: 16px;
+        color: #000000;
+        line-height: 24px;
+        &:first-child {
+          min-width: 84px;
+        }
+        &:nth-child(2) {
+          flex-grow: 1;
+        }
+      }
+    }
+  }
+
+  .person + .person {
+    border-top: 1px solid #f5f7fa;
+  }
+}
+
+.card + .card {
+  margin-top: 20px;
+}
+
+.card {
+  .icon {
+    position: absolute;
+    top: -35px;
+
+    .left-icon {
+      left: 11px;
+    }
+
+    .right-icon {
+      right: 11px;
+    }
+  }
+}
+.card-list {
+  display: flex;
+  border-top: 1px solid #f5f7fa;
+  .card-info {
+    flex-grow: 1;
+  }
+  .card-info + .card-info {
+    border-top-width: 0;
+  }
+}
+
+.card-info {
+  padding: 20px 0;
+  .name {
+    font-size: 15px;
+    color: #00000020;
+    line-height: 24px;
+  }
+
+  .text {
+    font-size: 16px;
+    color: #000000;
+    line-height: 24px;
+    margin-top: 2px;
+  }
+
+  .time {
+    font-size: 16px;
+    color: #2c96ff;
+    line-height: 24px;
+    margin-top: 2px;
+  }
+}
+
+div + .card-info {
+  border-top: 1px solid #f5f7fa;
+}
+.card-name {
+  font-size: 16px;
+  color: #000000;
+  line-height: 24px;
+  padding-top: 17px;
+}
+.card-table {
+  display: flex;
+  flex-wrap: nowrap;
+  overflow: auto;
+  .tr {
+    flex-shrink: 0;
+    background-color: #fff;
+    div + div {
+      border-top: 1px solid #f5f7fa;
+    }
+
+    &:last-child {
+      flex-grow: 1;
+    }
+
+    &:first-child {
+      position: sticky;
+      left: 0;
+    }
+  }
+
+  .th {
+    font-size: 15px;
+    color: #00000020;
+    line-height: 24px;
+    padding: 16px 30px 16px 0;
+  }
+
+  .td {
+    font-size: 15px;
+    color: #000000;
+    line-height: 24px;
+    padding: 16px 30px 16px 0;
+  }
+}
+
+.btn {
+  position: fixed;
+  height: 60px;
+  z-index: 20;
+  background: #ffffff;
+  left: 0;
+  right: 0;
+  bottom: 0;
+  padding: 6px 26px;
+  box-sizing: border-box;
+  display: flex;
+  .van-button {
+    flex-grow: 1;
+  }
+
+  .back {
+    max-width: 82px;
+  }
+
+  .van-button + .van-button {
+    margin-left: 13px;
+  }
+}
+</style>

+ 225 - 0
src/main/h5/src/views/record/recordList.vue

@@ -0,0 +1,225 @@
+<template>
+  <div class="inspectorList">
+    <div class="header-info">
+      <van-image
+        width="63"
+        height="63"
+        :src="require('../../assets/img_touxiang.png')"
+      />
+      <div class="text">
+        <div class="name">{{ userInfo.nickname }}</div>
+        <div class="sub">市政专家</div>
+      </div>
+      <div class="btn" @click="goLogin">切换账号</div>
+    </div>
+
+    <div class="list">
+      <div class="empty" v-if="empty">
+        <img src="../../assets/img_cailiao_kong.svg" alt="" />
+        <div class="text">暂无评分列表</div>
+      </div>
+
+      <div
+        class="item"
+        v-for="item in tableData"
+        :key="item.id"
+        @click="handleEdit(item)"
+      >
+        <div class="left">
+          <div class="name">{{ item.examinationName }}</div>
+
+          <div class="info">
+            <div class="location">
+              <img src="../../assets/person.svg" alt="" />
+              <span>{{ item.examOwner }}</span>
+            </div>
+            <div class="location">
+              <img src="../../assets/phone.svg" alt="" />
+              <span>{{ item.examOwnerPhone }}</span>
+            </div>
+          </div>
+          <div class="location" v-if="item.examinationAddress">
+            <img src="../../assets/icon_dizhi.svg" alt="" />
+            <span>{{ item.examinationAddress }}</span>
+          </div>
+        </div>
+        <van-icon name="arrow" :size="16" color="#000000" />
+      </div>
+    </div>
+  </div>
+</template>
+
+<script>
+import { mapState } from "vuex";
+import dayjs from "dayjs";
+export default {
+  name: "expertList",
+  metaInfo() {
+    return {
+      title: "评分列表"
+    };
+  },
+  data() {
+    return {
+      tableData: [],
+      status: {
+        NORMAL: "正常"
+      },
+      empty: false
+    };
+  },
+  computed: {
+    ...mapState(["userInfo"])
+  },
+  methods: {
+    handleEdit(row) {
+      this.$router.push({
+        name: "recordDetail",
+        query: {
+          id: row.id
+        }
+      });
+    },
+    statusFormatter(row, column, cellValue) {
+      return this.status[cellValue] || "";
+    },
+    goLogin() {
+      localStorage.removeItem("token");
+      this.$router.push("/login");
+    }
+  },
+  mounted() {
+    this.$http
+      .post(
+        "/record/all",
+        {
+          size: 20,
+          query: {
+            examinationTime: dayjs().format("YYYY-MM-DD")
+            // status: ["SUBMIT_GRADE", "REVIEW_PENDING"],
+          },
+          sort: "examinationEndTime,desc"
+        },
+        { body: "json" }
+      )
+      .then(res => {
+        this.empty = res.empty;
+        this.tableData = res.content;
+      });
+  }
+};
+</script>
+<style lang="less" scoped>
+.inspectorList {
+  .title {
+    font-size: 36px;
+    text-align: center;
+    font-weight: 700;
+    margin: 20px;
+  }
+  .table {
+    margin-top: 50px;
+  }
+
+  background: linear-gradient(180deg, #ffffff 0%, #f5f7fa 235px);
+}
+// /deep/.el-table--scrollable-x .el-table__body-wrapper {
+//   overflow-x: hidden;
+// }
+// /deep/.el-table__body {
+//   width: 100%;
+// }
+.empty {
+  display: flex;
+  flex-direction: column;
+  align-items: center;
+  padding: 54px;
+
+  img {
+    width: 140px;
+    display: block;
+  }
+  .text {
+    font-size: 14px;
+    color: #c4c7cc;
+    line-height: 22px;
+    margin-top: 13px;
+  }
+}
+.header-info {
+  display: flex;
+  padding: 16px;
+  align-items: center;
+  .text {
+    flex-grow: 1;
+    margin-left: 12px;
+    .name {
+      font-size: 22px;
+      font-weight: bold;
+      color: #000000;
+      line-height: 30px;
+    }
+
+    .sub {
+      font-size: 14px;
+      color: #939599;
+      line-height: 20px;
+      margin-top: 2px;
+    }
+  }
+
+  .btn {
+    font-size: 14px;
+    color: #c4c7cc;
+    line-height: 20px;
+    align-self: flex-end;
+  }
+}
+
+.list {
+  padding: 20px 16px;
+  .item {
+    padding: 20px;
+    background: #ffffff;
+    border-radius: 12px;
+    display: flex;
+    align-items: center;
+
+    .left {
+      flex-grow: 1;
+    }
+
+    .name {
+      font-size: 18px;
+      font-weight: bold;
+      color: #313233;
+      line-height: 28px;
+    }
+
+    .info {
+      display: flex;
+      .location {
+        width: 50%;
+      }
+    }
+
+    .location {
+      display: flex;
+      align-items: center;
+      margin-top: 8px;
+      img {
+        margin-right: 6px;
+      }
+      span {
+        font-size: 14px;
+        color: #939599;
+        line-height: 22px;
+      }
+    }
+
+    &:not(:first-child) {
+      margin-top: 12px;
+    }
+  }
+}
+</style>