jinx 2 år sedan
förälder
incheckning
49a0a14477

Filskillnaden har hållts tillbaka eftersom den är för stor
+ 1644 - 0
package-lock.json


+ 2 - 1
package.json

@@ -30,7 +30,8 @@
     "vue": "^3.2.47",
     "vue-cropper": "1.0.2",
     "vue-i18n": "^9.2.2",
-    "vue-router": "4.0.3"
+    "vue-router": "4.0.3",
+    "swiper": "^8.3.0"
   },
   "devDependencies": {
     "@types/node": "^18.15.11",

Filskillnaden har hållts tillbaka eftersom den är för stor
+ 1 - 26090
server/test/a0k4xu045_202305311600080410/attach/sceneStore


+ 49 - 3
src/components/base/components/icon/iconfont/demo_index.html

@@ -55,6 +55,18 @@
           <ul class="icon_lists dib-box">
           
             <li class="dib">
+              <span class="icon iconfont">&#xe7b3;</span>
+                <div class="name">rb_y</div>
+                <div class="code-name">&amp;#xe7b3;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon iconfont">&#xe7b4;</span>
+                <div class="name">rb_n</div>
+                <div class="code-name">&amp;#xe7b4;</div>
+              </li>
+          
+            <li class="dib">
               <span class="icon iconfont">&#xe7ab;</span>
                 <div class="name">question</div>
                 <div class="code-name">&amp;#xe7ab;</div>
@@ -1014,9 +1026,9 @@
 <pre><code class="language-css"
 >@font-face {
   font-family: 'iconfont';
-  src: url('iconfont.woff2?t=1692066010344') format('woff2'),
-       url('iconfont.woff?t=1692066010344') format('woff'),
-       url('iconfont.ttf?t=1692066010344') format('truetype');
+  src: url('iconfont.woff2?t=1692587913655') format('woff2'),
+       url('iconfont.woff?t=1692587913655') format('woff'),
+       url('iconfont.ttf?t=1692587913655') format('truetype');
 }
 </code></pre>
           <h3 id="-iconfont-">第二步:定义使用 iconfont 的样式</h3>
@@ -1043,6 +1055,24 @@
         <ul class="icon_lists dib-box">
           
           <li class="dib">
+            <span class="icon iconfont icon-rb_y"></span>
+            <div class="name">
+              rb_y
+            </div>
+            <div class="code-name">.icon-rb_y
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon iconfont icon-rb_n"></span>
+            <div class="name">
+              rb_n
+            </div>
+            <div class="code-name">.icon-rb_n
+            </div>
+          </li>
+          
+          <li class="dib">
             <span class="icon iconfont icon-question"></span>
             <div class="name">
               question
@@ -2484,6 +2514,22 @@
           
             <li class="dib">
                 <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#icon-rb_y"></use>
+                </svg>
+                <div class="name">rb_y</div>
+                <div class="code-name">#icon-rb_y</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#icon-rb_n"></use>
+                </svg>
+                <div class="name">rb_n</div>
+                <div class="code-name">#icon-rb_n</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
                   <use xlink:href="#icon-question"></use>
                 </svg>
                 <div class="name">question</div>

+ 11 - 3
src/components/base/components/icon/iconfont/iconfont.css

@@ -1,8 +1,8 @@
 @font-face {
   font-family: "iconfont"; /* Project id 4084834 */
-  src: url('iconfont.woff2?t=1692066010344') format('woff2'),
-       url('iconfont.woff?t=1692066010344') format('woff'),
-       url('iconfont.ttf?t=1692066010344') format('truetype');
+  src: url('iconfont.woff2?t=1692587913655') format('woff2'),
+       url('iconfont.woff?t=1692587913655') format('woff'),
+       url('iconfont.ttf?t=1692587913655') format('truetype');
 }
 
 .iconfont {
@@ -13,6 +13,14 @@
   -moz-osx-font-smoothing: grayscale;
 }
 
+.icon-rb_y:before {
+  content: "\e7b3";
+}
+
+.icon-rb_n:before {
+  content: "\e7b4";
+}
+
 .icon-question:before {
   content: "\e7ab";
 }

Filskillnaden har hållts tillbaka eftersom den är för stor
+ 1 - 1
src/components/base/components/icon/iconfont/iconfont.js


+ 14 - 0
src/components/base/components/icon/iconfont/iconfont.json

@@ -6,6 +6,20 @@
   "description": "交通事故现场勘验系统",
   "glyphs": [
     {
+      "icon_id": "37011123",
+      "name": "rb_y",
+      "font_class": "rb_y",
+      "unicode": "e7b3",
+      "unicode_decimal": 59315
+    },
+    {
+      "icon_id": "37011122",
+      "name": "rb_n",
+      "font_class": "rb_n",
+      "unicode": "e7b4",
+      "unicode_decimal": 59316
+    },
+    {
       "icon_id": "36913105",
       "name": "question",
       "font_class": "question",

BIN
src/components/base/components/icon/iconfont/iconfont.ttf


BIN
src/components/base/components/icon/iconfont/iconfont.woff


BIN
src/components/base/components/icon/iconfont/iconfont.woff2


+ 0 - 1
src/main.ts

@@ -15,7 +15,6 @@ import { router, setupRouter } from "@/router";
 import appConfig from "./appConfig";
 import { currentApp, setCurrentApp } from "@/store/app";
 import App from "./main.vue";
-
 const app = createApp(App);
 
 setCurrentApp(appConfig);

+ 0 - 1
src/views/scene/index.vue

@@ -166,7 +166,6 @@ onMounted(() => {
 onActivated(async () => {
   await nextTick();
   let full = router.currentRoute.value.query.full;
-  console.error('active', full);
   if (full) {
     viewStatus.value = true;
   }

+ 913 - 0
src/views/tables/explorate-one.vue

@@ -0,0 +1,913 @@
+<!--  -->
+<template>
+  <!-- <MainPanel>
+    <template v-slot:header>
+      <Header title="道路交通事故现场勘查笔录" type="return">
+        <ui-button type="primary" width="96px" @click="getLayoutImage"> 完成 </ui-button>
+      </Header>
+    </template> -->
+
+  <div class="explorate" :class="{ downMode }">
+    <div ref="layoutRef">
+      <h2 class="title">道路交通事故现场勘查笔录</h2>
+
+      <div class="container">
+        <div class="wrapper">
+          <div class="header">
+            <div class="item" v-for="(i, index) in sceneTypes.options" @click="checkLevel(sceneTypes, index)">
+              <ui-icon :type="sceneTypes.check == i.id ? 'rb_y' : 'rb_n'"></ui-icon>
+              <span>{{ i.title }}</span>
+            </div>
+          </div>
+          <div class="info">
+            <div>勘查单位</div>
+            <div class="input-box" contenteditable></div>
+          </div>
+          <div class="info">
+            <div>勘查时间</div>
+            <div class="input-box" contenteditable></div>
+          </div>
+          <div class="info">
+            <div>事故时间</div>
+            <div class="input-box" contenteditable></div>
+          </div>
+          <div class="time">
+            <div class="name">事故地点</div>
+            <div class="time-one">
+              <div class="road-type">
+                <div class="road-type-name">道路类型</div>
+                <div class="type-box">
+                  <div class="type-item">
+                    <div class="type-item-name">公路</div>
+                    <div class="item-msg">
+                      <div class="item-info">
+                        <div class="item-info-name">技术等级</div>
+                        <div class="item-info-box">
+                          <div class="item" v-for="(i, index) in technicalLevel.options" @click="checkLevel(technicalLevel, index)">
+                            <ui-icon :type="technicalLevel.check == i.id ? 'rb_y' : 'rb_n'"></ui-icon>
+                            <span>{{ i.title }}</span>
+                          </div>
+                        </div>
+                      </div>
+                      <div class="item-info">
+                        <div class="item-info-name">行政等级</div>
+                        <div class="item-info-box">
+                          <div class="item" v-for="(i, index) in administrativeLevel.options" @click="checkLevel(administrativeLevel, index)">
+                            <ui-icon :type="administrativeLevel.check == i.id ? 'rb_y' : 'rb_n'"></ui-icon>
+                            <span>{{ i.title }}</span>
+                            <div class="input-box" style="flex: 1" v-if="i.id == 5">
+                              <input type="text" />
+                            </div>
+                          </div>
+                        </div>
+                      </div>
+                    </div>
+                  </div>
+                  <div class="type-item city">
+                    <div class="type-item-name">城市道路</div>
+                    <div class="item-msg">
+                      <div class="item-info">
+                        <div class="item-info-box" style="flex-flow: row wrap">
+                          <div class="item" v-for="(i, index) in cityRoadList.options" @click="checkLevel(cityRoadList, index)">
+                            <ui-icon :type="cityRoadList.check == i.id ? 'rb_y' : 'rb_n'"></ui-icon>
+                            <span>{{ i.title }}</span>
+                          </div>
+                        </div>
+                      </div>
+                    </div>
+                  </div>
+                </div>
+              </div>
+              <div class="road-type">
+                <div class="road-type-name">路口路段类型</div>
+                <div class="type-box">
+                  <div class="type-item">
+                    <div class="type-item-name">路口</div>
+                    <div class="item-msg intersection" style="min-height: 48px; flex-flow: row wrap">
+                      <div class="item" v-for="(i, index) in roadSideList.options" @click="checkLevel(roadSideList, index)">
+                        <ui-icon :type="roadSideList.check == i.id ? 'rb_y' : 'rb_n'"></ui-icon>
+                        <span>{{ i.title }}</span>
+                      </div>
+                    </div>
+                  </div>
+                  <div class="type-item">
+                    <div class="type-item-name">路段</div>
+                    <div class="item-msg intersection" style="min-height: 60px; flex-flow: row wrap">
+                      <div class="item" v-for="(i, index) in roadPartList.options" @click="checkLevel(roadPartList, index)">
+                        <ui-icon :type="roadPartList.check == i.id ? 'rb_y' : 'rb_n'"></ui-icon>
+                        <span>{{ i.title }}</span>
+                      </div>
+                    </div>
+                  </div>
+                </div>
+              </div>
+              <div class="road-info">
+                <div class="road-name">路名</div>
+                <div class="road-msg">
+                  <div class="road-name-text" contenteditable></div>
+                  <div class="road-num">路号(公路)</div>
+                  <div class="road-num-text" contenteditable></div>
+                </div>
+              </div>
+              <div class="road-pos">
+                <div class="road-pos-name">位置</div>
+                <div class="pos-box">
+                  <div class="pos-item">
+                    <div class="pos-item-name" style="height: 30px">卫星定位</div>
+                    <div class="pos-msg" style="height: 30px">
+                      <div class="longitude">
+                        <span>经度:</span>
+                        <div contenteditable></div>
+                      </div>
+                      <div class="latitude">
+                        <span>纬度:</span>
+                        <div contenteditable></div>
+                      </div>
+                    </div>
+                  </div>
+                  <div class="pos-item">
+                    <div class="pos-item-name" style="height: 54px">地点描述</div>
+                    <div class="pos-msg desc" style="height: 54px" contenteditable></div>
+                  </div>
+                </div>
+              </div>
+            </div>
+          </div>
+          <div class="weather">
+            <div class="name">天气</div>
+
+            <div style="flex-flow: row wrap">
+              <div class="item" v-for="(i, index) in weatherList.options" @click="checkLevel(weatherList, index)">
+                <ui-icon :type="weatherList.check == i.id ? 'rb_y' : 'rb_n'"></ui-icon>
+                <span>{{ i.title }}</span>
+                <div class="input-box" v-if="i.id == 10">
+                  <input type="text" />
+                </div>
+              </div>
+            </div>
+          </div>
+          <div class="environment">
+            <div>
+              <p style="margin-bottom: 18px">一、事故现场道路环境</p>
+              <div class="em-info-box">
+                <div class="info-item" v-for="(i, index) in environments">
+                  <span class="info-title">{{ i.title }}</span>
+                  <div class="check-box">
+                    <div class="check-item" v-for="(j, j_index) in i.options" @click="checkEnvironItem(j, index, j_index)">
+                      <ui-icon :type="i.check == j.id ? 'rb_y' : 'rb_n'"></ui-icon>
+                      <span>{{ j.name }}</span>
+                    </div>
+                  </div>
+                  <div class="input-box">
+                    <input type="text" />
+                  </div>
+                </div>
+              </div>
+            </div>
+          </div>
+          <div class="sign-box">
+            <div>
+              <span>现场勘查人员签名:</span>
+              <div contenteditable></div>
+            </div>
+            <div>
+              <span>记录人签名:</span>
+              <div contenteditable></div>
+            </div>
+          </div>
+          <div class="sign-box">
+            <div>
+              <span>当事人签名:</span>
+              <div contenteditable></div>
+            </div>
+            <div>
+              <span>见证人签名:</span>
+              <div contenteditable></div>
+            </div>
+          </div>
+        </div>
+      </div>
+      <div class="footer">
+        <span>共<span>肆</span>页</span>
+        <span>第<span>壹</span>页</span>
+      </div>
+    </div>
+  </div>
+  <!-- </MainPanel> -->
+</template>
+
+<script setup lang="ts">
+import { reactive, ref, toRefs, onBeforeMount, onMounted, nextTick } from 'vue';
+import html2canvas from 'html2canvas';
+import { downloadImage, uploadImage } from '@/store/sync';
+import Message from '@/components/base/components/message/message.vue';
+import Header from '@/components/photos/header.vue';
+import MainPanel from '@/components/main-panel/index.vue';
+const layoutRef = ref<HTMLDivElement>();
+const downMode = ref(false);
+const getLayoutImage = async () => {
+  downMode.value = true;
+  await nextTick();
+  console.error(layoutRef.value);
+  const canvas = await html2canvas(layoutRef.value);
+  Message.success({ msg: '已保存至相册', time: 2000 });
+  downMode.value = false;
+  const blob = await new Promise<Blob>((resolve) => canvas.toBlob(resolve, 'image/jpeg', 0.95));
+  await downloadImage(blob, '12312.jpg');
+  // return await uploadImage(blob);
+};
+const sceneTypes = ref({
+  check: 0,
+  options: [
+    { id: 1, title: '现场勘查' },
+    { id: 2, title: '补充勘查' },
+  ],
+});
+const roadPartList = ref({
+  check: 0,
+  options: [
+    { id: 1, title: '普通路段' },
+    { id: 2, title: '高架路段' },
+    { id: 3, title: '变窄路段' },
+    { id: 4, title: '窄路' },
+    { id: 5, title: '桥梁' },
+    { id: 6, title: '隧道' },
+    { id: 7, title: '路段进出处' },
+    { id: 8, title: '路侧险要路段' },
+    { id: 9, title: '其他特殊路段' },
+  ],
+});
+const roadSideList = ref({
+  check: 0,
+  options: [
+    { id: 1, title: '三枝分叉口' },
+    { id: 2, title: '四枝分叉口' },
+    { id: 3, title: '多枝分叉口' },
+    { id: 4, title: '环形交叉口' },
+    { id: 5, title: '匝道口' },
+  ],
+});
+const cityRoadList = ref({
+  check: 0,
+  options: [
+    { id: 1, title: '城市快速路' },
+    { id: 2, title: '一般城市道路' },
+    { id: 3, title: '单位小区自建路' },
+    { id: 4, title: '公共停车场' },
+    { id: 5, title: '公共广场' },
+    { id: 6, title: '其他路' },
+  ],
+});
+
+const administrativeLevel = ref({
+  check: 0,
+  options: [
+    { id: 1, title: '国道' },
+    { id: 2, title: '省道' },
+    {
+      id: 3,
+      title: '县道',
+    },
+    {
+      id: 4,
+      title: '乡村道',
+    },
+    {
+      id: 5,
+      title: '其他',
+    },
+  ],
+});
+const checkLevel = (item, index) => {
+  item.check = item.options[index].id;
+};
+const technicalLevel = ref({
+  check: 0,
+  options: [
+    { id: 1, title: '高速' },
+    { id: 2, title: '一级' },
+    {
+      id: 3,
+      title: '二级',
+    },
+    {
+      id: 4,
+      title: '三级',
+    },
+    {
+      id: 5,
+      title: '四级',
+    },
+    {
+      id: 6,
+      title: '等外',
+    },
+  ],
+});
+const weatherList = ref({
+  check: 0,
+  options: [
+    { id: 1, title: '晴' },
+    { id: 2, title: '阴' },
+    {
+      id: 3,
+      title: '多云',
+    },
+    {
+      id: 4,
+      title: '雨',
+    },
+    {
+      id: 5,
+      title: '雪',
+    },
+    {
+      id: 6,
+      title: '雾',
+    },
+    {
+      id: 7,
+      title: '冰雹',
+    },
+    {
+      id: 8,
+      title: '沙尘',
+    },
+    {
+      id: 9,
+      title: '霾',
+    },
+    {
+      id: 10,
+      title: '其他',
+    },
+  ],
+});
+
+const checkEnvironItem = (item, index, j_index) => {
+  environments.value[index].check = item.id;
+};
+const environments = ref([
+  {
+    id: 1,
+    title: '影响视线或行驶的障碍物:',
+    value: '',
+    check: 0,
+    options: [
+      { id: 1, name: '无' },
+      { id: 2, name: '有:' },
+    ],
+  },
+  {
+    id: 2,
+    title: '递路交通标志:',
+    value: '',
+    check: 0,
+    options: [
+      { id: 1, name: '无' },
+      { id: 2, name: '有:' },
+    ],
+  },
+  {
+    id: 3,
+    title: '道路交通标线:',
+    value: '',
+    check: 0,
+    options: [
+      { id: 1, name: '无' },
+      { id: 2, name: '有:' },
+    ],
+  },
+  {
+    id: 4,
+    title: '中央隔离设施:',
+    value: '',
+    check: 0,
+    options: [
+      { id: 1, name: '无' },
+      { id: 2, name: '有:' },
+    ],
+  },
+  {
+    id: 5,
+    title: '路侧防护设施:',
+    value: '',
+    check: 0,
+    options: [
+      { id: 1, name: '无' },
+      { id: 2, name: '有:' },
+    ],
+  },
+  {
+    id: 6,
+    title: '路面材料:',
+    value: '',
+    check: 0,
+    options: [
+      { id: 1, name: '沥青' },
+      { id: 2, name: '水泥' },
+      { id: 3, name: '砂石' },
+      { id: 4, name: '土路' },
+      { id: 5, name: '其他' },
+    ],
+  },
+  {
+    id: 7,
+    title: '路面状况:',
+    value: '',
+    check: 0,
+    options: [
+      { id: 1, name: '路面完好' },
+      { id: 2, name: '施工' },
+      { id: 3, name: '凹凸' },
+      { id: 4, name: '塌陷' },
+      { id: 5, name: '路障' },
+      { id: 6, name: '其他' },
+    ],
+  },
+  {
+    id: 8,
+    title: '路表状况:',
+    value: '',
+    check: 0,
+    options: [
+      { id: 1, name: '干燥' },
+      { id: 2, name: '潮湿' },
+      { id: 3, name: '积水' },
+      { id: 4, name: '漫水' },
+      { id: 5, name: '冰雪' },
+      { id: 6, name: '泥泞' },
+      { id: 7, name: '其他' },
+    ],
+  },
+  {
+    id: 9,
+    title: '照明情况:',
+    value: '',
+    check: 0,
+    options: [
+      { id: 1, name: '白天   夜间路灯照明' },
+      { id: 2, name: '有' },
+      { id: 3, name: '无' },
+    ],
+  },
+  {
+    id: 10,
+    title: '照明情况:',
+    value: '',
+    check: 0,
+    options: [],
+  },
+]);
+</script>
+<style lang="scss" scoped>
+div {
+  box-sizing: border-box;
+}
+.explorate {
+  color: #000;
+  font-size: 20px;
+  width: 100%;
+  height: 100%;
+  // display: grid;
+
+  font-family: sr, st;
+
+  // padding: 80px 0 0 0;
+  > div {
+    padding: 20px 50px 30px;
+  }
+  .title {
+    text-align: center;
+    margin-bottom: 10px;
+  }
+  .container {
+  }
+  .footer {
+    display: flex;
+    align-items: center;
+    justify-content: space-between;
+    padding: 0 60px;
+    margin-top: 10px;
+    > span {
+      > span {
+        margin: 0 24px;
+      }
+    }
+  }
+
+  &.downMode {
+    width: 1050px;
+    height: 1485px;
+    > div {
+      padding: 125px 100px 75px;
+    }
+  }
+}
+
+.wrapper {
+  margin: 0 auto;
+  width: 100%;
+  display: grid;
+  grid-template-columns: 100%;
+  grid-template-rows: repeat(8, auto);
+  border: 1px solid #000;
+  font-size: 20px;
+  .sign-box {
+    padding: 0 10px;
+    display: flex;
+    align-items: center;
+    justify-content: flex-start;
+    border-top: 1px solid #000;
+    min-height: 40px;
+    > div {
+      width: 50%;
+      height: 100%;
+      display: flex;
+      align-items: center;
+      justify-content: flex-start;
+      > div {
+        flex: 1;
+        height: 100%;
+        outline: none;
+        display: flex;
+        align-items: center;
+        justify-content: flex-start;
+        line-height: 40px;
+      }
+    }
+  }
+  .header {
+    display: flex;
+    align-items: center;
+    justify-content: center;
+    border-bottom: 1px solid #000;
+    height: 35px;
+    .item {
+      margin-right: 60px;
+      &:last-of-type {
+        margin-right: 0;
+      }
+    }
+  }
+  .info {
+    display: grid;
+    grid-template-columns: 14% 86%;
+    grid-template-rows: repeat(1, 100%);
+    height: 35px;
+    > div {
+      border-bottom: 1px solid #000;
+      border-right: 1px solid #000;
+      display: flex;
+      align-items: center;
+      justify-content: center;
+      &:last-of-type {
+        border-right: none;
+      }
+      &.input-box {
+        outline: none;
+        padding: 0 10px;
+        line-height: 35px;
+        text-align: center;
+      }
+    }
+  }
+  .environment {
+    padding: 10px;
+    .em-info-box {
+      .info-item {
+        display: flex;
+        align-items: center;
+        margin-bottom: 18px;
+        .check-box {
+          display: inline-block;
+          .check-item {
+            display: inline-block;
+            margin-right: 10px;
+            &:last-of-type {
+              margin-right: 0;
+            }
+          }
+        }
+        .input-box {
+          flex: 1;
+          display: inline-block;
+          border-bottom: 1px solid #000;
+          input {
+            width: 100%;
+            padding: 0 10px;
+          }
+        }
+      }
+    }
+  }
+  .weather {
+    display: grid;
+    grid-template-columns: 14% 86%;
+    grid-template-rows: repeat(1, 100%);
+    min-height: 35px;
+    border-bottom: 1px solid #000;
+    .name {
+      border-right: 1px solid #000;
+      display: flex;
+      align-items: center;
+      justify-content: center;
+    }
+    > div {
+      display: flex;
+      align-items: center;
+      justify-content: space-between;
+
+      padding: 5px;
+      .item {
+        display: flex;
+        align-items: center;
+        justify-content: flex-start;
+        margin-right: 10px;
+        margin-bottom: 5px;
+        .input-box {
+          input {
+            border-bottom: 1px solid #000;
+          }
+        }
+      }
+    }
+  }
+  .time {
+    display: grid;
+    grid-template-columns: 14% 86%;
+    grid-template-rows: repeat(1, auto);
+    .name {
+      display: flex;
+      align-items: center;
+      justify-content: center;
+    }
+    > div {
+      border-bottom: 1px solid #000;
+      border-right: 1px solid #000;
+
+      &:last-of-type {
+        border-right: none;
+      }
+    }
+    .time-one {
+      // display: grid;
+      // grid-auto-flow: row;
+      // grid-template-columns: 66px;
+      // grid-template-rows: repeat(4, auto);
+      .road-info {
+        display: flex;
+        align-items: center;
+        justify-content: flex-start;
+        border-bottom: 1px solid #000;
+        .road-name {
+          width: 66px;
+          box-sizing: border-box;
+          padding: 0 10px;
+        }
+        .road-msg {
+          flex: 1;
+          border-left: 1px solid #000;
+          > div {
+            min-height: 30px;
+            display: flex;
+            align-items: center;
+            justify-content: flex-start;
+          }
+          .road-name-text {
+            width: 55%;
+            flex: 1;
+            padding: 0 10px;
+            outline: none;
+            text-align: center;
+            display: flex;
+            align-items: center;
+            justify-content: center;
+          }
+          .road-num {
+            width: 23.8%;
+            padding: 0 10px;
+            border-left: 1px solid #000;
+            border-right: 1px solid #000;
+          }
+          .road-num-text {
+            width: 20%;
+            padding: 0 10px;
+            flex: 1;
+            outline: none;
+            text-align: center;
+            display: flex;
+            align-items: center;
+            justify-content: center;
+          }
+        }
+        > div {
+          min-height: 30px;
+          display: flex;
+          align-items: center;
+          justify-content: flex-start;
+        }
+      }
+      .road-pos {
+        display: flex;
+        align-items: center;
+        width: 100%;
+        .road-pos-name {
+          width: 66px;
+          padding: 0 10px;
+        }
+        .pos-box {
+          // width: 100%;
+          flex: 1;
+
+          .pos-item {
+            display: flex;
+            align-items: center;
+            justify-content: flex-start;
+            flex: 1;
+            width: 100%;
+            border-left: 1px solid #000;
+            border-bottom: 1px solid #000;
+            &:last-of-type {
+              border-bottom: none;
+            }
+
+            .pos-item-name {
+              width: 120px;
+              padding: 0 10px;
+              border-right: 1px solid #000;
+              display: flex;
+              align-items: center;
+              justify-content: center;
+            }
+            .pos-msg {
+              flex: 1;
+              display: flex;
+              align-items: center;
+              justify-content: flex-start;
+              &.desc {
+                outline: none;
+                display: flex;
+                align-items: center;
+                justify-content: flex-start;
+                padding: 0 5px;
+                line-height: 54px;
+              }
+              .longitude {
+                display: inline-block;
+                width: 50%;
+                border-right: 1px solid #000;
+                height: 100%;
+                display: flex;
+                align-items: center;
+                justify-content: flex-start;
+                padding: 0 10px;
+                > div {
+                  flex: 1;
+                  height: 30px;
+                  outline: none;
+                  display: flex;
+                  align-items: center;
+                  justify-content: flex-start;
+                }
+              }
+              .latitude {
+                display: inline-block;
+                width: 50%;
+                display: flex;
+                align-items: center;
+                justify-content: flex-start;
+                padding: 0 10px;
+                > div {
+                  flex: 1;
+                  height: 30px;
+                  outline: none;
+                  display: flex;
+                  align-items: center;
+                  justify-content: flex-start;
+                }
+              }
+            }
+          }
+        }
+      }
+      .road-type {
+        border-bottom: 1px solid #000;
+        display: flex;
+        align-items: center;
+        width: 100%;
+        .road-type-name {
+          width: 66px;
+          padding: 0 10px;
+        }
+        .type-box {
+          // width: 100%;
+          flex: 1;
+
+          .type-item {
+            display: flex;
+            align-items: center;
+            justify-content: flex-start;
+            flex: 1;
+            width: 100%;
+            border-left: 1px solid #000;
+            border-bottom: 1px solid #000;
+            &.city {
+              .type-item-name {
+                // border-right: 1px solid #000;
+              }
+              .item-info-box {
+                border-left: 1px solid #000;
+              }
+            }
+            &:last-of-type {
+              border-bottom: none;
+            }
+            .type-item-name {
+              width: 66px;
+              padding: 0 10px;
+            }
+            .item-msg {
+              flex: 1;
+              &.intersection {
+                min-height: 48px;
+                border-left: 1px solid #000;
+                display: flex;
+                align-items: center;
+                justify-content: flex-start;
+                padding: 5px;
+                .item {
+                  margin-right: 5px;
+                  margin-bottom: 5px;
+                  // flex: 1;
+                  // display: flex;
+                  // align-items: center;
+                  // justify-content: flex-start;
+                }
+              }
+            }
+            > div {
+              // width: 100%;
+              // height: 56px;
+              .item-info {
+                width: 100%;
+
+                border-bottom: 1px solid #000;
+                display: flex;
+                align-items: center;
+                justify-content: flex-start;
+                position: relative;
+                .item-info-name {
+                  width: 66px;
+                  height: 56px;
+                  // line-height: 56px;
+                  padding: 0 10px;
+                  border-right: 1px solid #000;
+                  border-left: 1px solid #000;
+                  display: flex;
+                  align-items: center;
+                  justify-content: flex-start;
+                }
+                .item-info-box {
+                  flex: 1;
+                  min-height: 56px;
+                  display: flex;
+                  align-items: center;
+                  justify-content: flex-start;
+                  padding: 5px;
+                  .item {
+                    display: flex;
+                    align-items: center;
+                    justify-content: flex-start;
+                    margin-right: 2px;
+                    margin-bottom: 5px;
+                    &:last-of-type {
+                      margin-right: 0;
+                      display: flex;
+                      align-items: center;
+                      justify-content: flex-start;
+                      flex: 1;
+                    }
+                    .input-box {
+                      width: 10%;
+                      input {
+                        width: 100%;
+                        border-bottom: 1px solid #000;
+                      }
+                    }
+                  }
+                }
+                &:last-of-type {
+                  border-bottom: none;
+                }
+              }
+            }
+          }
+        }
+      }
+    }
+  }
+}
+.wrapper div {
+}
+</style>

Filskillnaden har hållts tillbaka eftersom den är för stor
+ 214 - 904
src/views/tables/explorate.vue