zhoujump 3 hónapja
szülő
commit
7a5c6f03c3

+ 1 - 1
package.json

@@ -46,7 +46,7 @@
     "vue-qr": "^4.0.9",
     "vue-router": "^3.5.2",
     "vue-splitpane": "1.0.4",
-    "vuedraggable": "2.20.0",
+    "vuedraggable": "2.24.3",
     "vuex": "3.1.0",
     "xlsx": "0.14.1"
   },

+ 11 - 0
src/App.vue

@@ -17,6 +17,17 @@ export default {
    width: 100%;
    overflow: hidden;
  }
+ .loading{
+   animation: loading 800ms infinite alternate;
+ }
+ @keyframes loading {
+   from{
+     background: #e1e1e1;
+   }
+   to{
+     background: #f1f1f1;
+   }
+ }
 *{
   box-sizing: border-box;
 }

+ 47 - 33
src/layout/index.vue

@@ -7,10 +7,24 @@
       <div class="layout-menu">
         <el-menu class="layout-menu-inner" :collapse="isCollapse" :default-active="menuActive+''">
           <template v-for="(route,index) in menuRouter">
-            <el-menu-item :index="index+''" @click="goto(route.path)" :key="route.path">
-              <i :class="[route.meta.icon,'icon']"></i>
-              <span slot="title">{{ route.meta.title }}</span>
-            </el-menu-item>
+            <template v-show="!route.meta.hidden">
+              <el-submenu :index="index+''" v-if="route.children">
+                <template slot="title">
+                  <i :class="[route.meta.icon,'icon']"></i>
+                  <span slot="title">{{ route.meta.title }}</span>
+                </template>
+                <template v-for="(item,subIndex) in route.children">
+                  <el-menu-item v-show="!item.meta.hidden" :index="index+'-'+subIndex" @click="goto(item)" :key="item.path">
+                    <i :class="[item.meta.icon,'icon']"></i>
+                    <span slot="title">{{ item.meta.title }}</span>
+                  </el-menu-item>
+                </template>
+              </el-submenu>
+              <el-menu-item v-else :index="index+''" @click="goto(route)" :key="route.path">
+                <i :class="[route.meta.icon,'icon']"></i>
+                <span slot="title">{{ route.meta.title }}</span>
+              </el-menu-item>
+            </template>
           </template>
         </el-menu>
       </div>
@@ -46,11 +60,6 @@ export default {
   data() {
     return {
       isCollapse: false,
-      collapse: {
-        minWidth: 0,
-        maxWidth: 0,
-        currentWidth: 0
-      },
       menuRouter: [],
       menuActive: 0,
       breadcrumb: [],
@@ -69,28 +78,12 @@ export default {
   methods: {
     changeCollapse() {
       this.isCollapse = !this.isCollapse
-      let layoutBody = document.getElementsByClassName('el-table')[0]
-      layoutBody.style.transitionDuration = '360ms'
-      layoutBody.style.transitionTimingFunction = 'linear'
-      if (this.isCollapse) {
-        if (this.collapse.minWidth === 0) {
-          this.collapse.minWidth = layoutBody.offsetWidth
-        }
-        if (this.collapse.maxWidth) {
-          layoutBody.style.width = this.collapse.maxWidth + 'px'
-        }
-      } else {
-        if (this.collapse.maxWidth === 0) {
-          this.collapse.maxWidth = layoutBody.offsetWidth
-        }
-        if (this.collapse.minWidth) {
-          layoutBody.style.width = this.collapse.minWidth + 'px'
-        }
-      }
     },
-    goto(path) {
-      if ('/' + path === this.$route.path) { return }
-      this.$router.push(path)
+    goto(route) {
+      if ('/' + route.path === this.$route.path) { return }
+      this.$router.push({
+        name: route.name
+      })
       this.refreshRoute()
     },
     initGuards() {
@@ -109,8 +102,22 @@ export default {
       this.menuRouter = this.$router.options.routes[0].children
       this.breadcrumb = this.$route.matched
       this.menuRouter.forEach((item, index) => {
-        if ('/' + item.path === this.$route.path) {
+        console.log(this.$route.name)
+        if (item.name === this.$route.name) {
           this.menuActive = index
+          if (item.meta.collapse !== undefined) {
+            this.isCollapse = !!item.meta.collapse
+          }
+        }
+        if (item.children) {
+          item.children.forEach((child, subIndex) => {
+            if (child.name === this.$route.name) {
+              this.menuActive = index + '-' + subIndex
+              if (child.meta.collapse !== undefined) {
+                this.isCollapse = !!child.meta.collapse
+              }
+            }
+          })
         }
       })
     }
@@ -142,11 +149,14 @@ export default {
       .layout-menu{
         .layout-menu-inner{
           border-right: unset;
-          .el-menu-item{
+          .el-menu-item,.el-submenu{
             transition-duration: 300ms;
             color: $menuText;
             position: relative;
-            border-right: 0px solid  transparent;
+            border-right: 0px solid transparent;
+            ::v-deep .el-menu{
+              background-color: unset;
+            }
             .icon{
               color: inherit;
               font-size: 22px;
@@ -156,6 +166,10 @@ export default {
               color: $menuActiveText;
               background: $menuActiveBg;
               border-right: 4px solid $menuActive;
+              &.el-submenu{
+                padding-right: 4px;
+                padding-bottom: 6px;
+              }
             }
             &.hover{
               background: $menuHover;

+ 17 - 2
src/router/index.js

@@ -55,7 +55,22 @@ export const constantRoutes = [
         path: 'preregmanage',
         component: () => import('@/views/preRegManage/index'),
         name: 'preRegManage',
-        meta: { title: '预登记表单管理', icon: 'el-icon-tickets', affix: true }
+        meta: { title: '预登记表单', icon: 'el-icon-tickets', affix: true },
+        redirect: '/preregmanage/list',
+        children: [
+          {
+            path: 'list',
+            component: () => import('@/views/preRegManage/list'),
+            name: 'list',
+            meta: { title: '预登记表单管理', icon: 'el-icon-edit', affix: true, collapse: false }
+          },
+          {
+            path: 'edit',
+            component: () => import('@/views/preRegManage/edit'),
+            name: 'edit',
+            meta: { title: '预登记表单编辑', icon: 'el-icon-edit', affix: true, hidden: true, collapse: true }
+          }
+        ]
       },
       {
         path: 'exhibitormanage',
@@ -65,7 +80,7 @@ export const constantRoutes = [
       },
       {
         path: 'invitationmanage',
-        component: () => import('@/views/audienceManage/index'),
+        component: () => import('@/views/invitationManage/index'),
         name: 'invitationManage',
         meta: { title: '邀请函模板管理', icon: 'el-icon-files', affix: true }
       },

+ 1 - 1
src/styles/variables.scss

@@ -12,7 +12,7 @@ $menuText:#4B5563;
 $menuActiveText: #2563EB;
 $subMenuActiveText: #212121; // https://github.com/ElemeFE/element/issues/12951
 $menuBg: #ffffff;
-$menuActiveBg: #E9EFFD;
+$menuActiveBg: #004dff11;
 $menuActive: #2563EB;
 $menuHover: #E9EFFD;
 $subMenuBg: #ffffff;

+ 9 - 1
src/views/audienceManage/index.vue

@@ -15,7 +15,7 @@ export default Vue.extend({
       <el-button icon="el-icon-download">导出</el-button>
     </div>
     <div class="body">
-      <el-table height="100%">
+      <el-table height="100%" class="table">
         <el-table-column
           label="姓名">
         </el-table-column>
@@ -70,6 +70,14 @@ export default Vue.extend({
     }
     .body{
       height: 100%;
+      position: relative;
+      .table{
+        width: 100%;
+        height: 100%;
+        position: absolute;
+        top: 0;
+        left: 0;
+      }
     }
     .foot{
       .el-pagination{

+ 124 - 0
src/views/invitationManage/index.vue

@@ -0,0 +1,124 @@
+<script>
+import Vue from 'vue'
+
+export default Vue.extend({
+  name: "index"
+})
+</script>
+
+<template>
+  <div class="main-box">
+    <div class="scroll-box">
+      <div class="model-cont">
+        <div class="model-box">
+          <div class="image loading">
+            <img src="" alt="">
+          </div>
+          <div class="info-box">
+            <div class="name">科技风格邀请函</div>
+            <div class="time">更新时间:2025-08-04</div>
+          </div>
+        </div>
+        <div class="model-box">
+          <div class="image loading">
+            <img src="" alt="">
+          </div>
+          <div class="info-box">
+            <div class="name">科技风格邀请函</div>
+            <div class="time">更新时间:2025-08-04</div>
+          </div>
+        </div>
+        <div class="model-box">
+          <div class="image loading">
+            <img src="" alt="">
+          </div>
+          <div class="info-box">
+            <div class="name">科技风格邀请函</div>
+            <div class="time">更新时间:2025-08-04</div>
+          </div>
+        </div>
+        <div class="model-box">
+          <div class="image loading">
+            <img src="" alt="">
+          </div>
+          <div class="info-box">
+            <div class="name">科技风格邀请函</div>
+            <div class="time">更新时间:2025-08-04</div>
+          </div>
+        </div>
+        <div class="model-box">
+          <div class="image loading">
+            <img src="" alt="">
+          </div>
+          <div class="info-box">
+            <div class="name">科技风格邀请函</div>
+            <div class="time">更新时间:2025-08-04</div>
+          </div>
+        </div>
+        <div class="model-box">
+          <div class="image loading">
+            <img src="" alt="">
+          </div>
+          <div class="info-box">
+            <div class="name">科技风格邀请函</div>
+            <div class="time">更新时间:2025-08-04</div>
+          </div>
+        </div>
+      </div>
+    </div>
+  </div>
+</template>
+
+<style scoped>
+.main-box{
+  height: 100%;
+  width: 100%;
+  .scroll-box{
+    padding: 2px;
+    position: absolute;
+    width: calc(100% - 18px);
+    height: calc(100% - 24px);
+    overflow: hidden;
+    overflow-y: auto;
+    .model-cont{
+      display: grid;
+      grid-template-columns: repeat(3, 1fr);
+      grid-gap: 24px;
+      .model-box{
+        overflow: hidden;
+        height: 500px;
+        border-radius: 8px;
+        box-shadow: 0 1px 2px 0 #00000022;
+        transition-duration: 300ms;
+        .image{
+          height: 400px;
+          width: 100%;
+          img{
+            height: 100%;
+            width: 100%;
+            object-fit: cover;
+          }
+        }
+        .info-box{
+          height: 100px;
+          width: 100%;
+          padding: 16px;
+          display: flex;
+          flex-direction: column;
+          justify-content: space-between;
+          .name{
+            font-size: 23px;
+            font-weight: bold;
+          }
+          .time{
+            color: #6B7280;
+          }
+        }
+        &:hover{
+          scale: 1.02;
+        }
+      }
+    }
+  }
+}
+</style>

+ 401 - 0
src/views/preRegManage/edit.vue

@@ -0,0 +1,401 @@
+<script lang="ts">
+import Vue from 'vue'
+import draggable from 'vuedraggable'
+export default Vue.extend({
+  name: 'Edit',
+  components: {
+    draggable
+  },
+  data() {
+    return {
+      compList: [
+        {
+          type: 'tips',
+          value: '将我拖拽至右边试试吧',
+          width: 2
+        },
+        {
+          type: 'input',
+          label: '请在下方输入内容',
+          value: '',
+          width: 2,
+          placeholder: '请输入'
+        },
+        {
+          type: 'select',
+          label: '请在下方选择内容',
+          value: '',
+          width: 1,
+          options: [
+            { label: '东坡肉', value: '1' },
+            { label: '酱肘子', value: '2' },
+            { label: '白切鸡', value: '3' }
+          ],
+          placeholder: '请选择'
+        },
+        {
+          type: 'checkbox',
+          label: '请选择一至多项内容',
+          value: '',
+          width: 1,
+          options: [
+            { label: '东坡肉', value: '1' },
+            { label: '酱肘子', value: '2' },
+            { label: '白切鸡', value: '3' }
+          ],
+          placeholder: '请选择'
+        },
+        {
+          type: 'radio',
+          label: '请选择一项内容',
+          value: '',
+          width: 1,
+          options: [
+            { label: '东坡肉', value: '1' },
+            { label: '酱肘子', value: '2' },
+            { label: '白切鸡', value: '3' }
+          ],
+          placeholder: '请选择'
+        },
+        {
+          type: 'number',
+          label: '请在下方输入数字',
+          max: 10,
+          min: 0,
+          step: 1,
+          value: 0,
+          width: 1
+        },
+        {
+          type: 'slider',
+          label: '请在下方滑动',
+          max: 10,
+          min: 0,
+          step: 1,
+          value: 0,
+          width: 1
+        },
+        {
+          type: 'textarea',
+          label: '请在下方输入内容',
+          value: '',
+          maxRows: 4,
+          minRows: 2,
+          width: 2,
+          placeholder: '请输入'
+        },
+        {
+          type: 'time',
+          label: '请在下方选择时间',
+          value: '',
+          width: 2,
+          placeholder: '请选择时间'
+        },
+        {
+          type: 'date',
+          label: '请在下方选择日期',
+          value: '',
+          width: 2,
+          placeholder: '请选择日期'
+        }
+      ],
+      formData: [],
+      isDrag: false,
+    }
+  },
+  methods: {
+    cloneItem(item) {
+      let newItem = JSON.parse(JSON.stringify(item))
+      newItem.key = newItem.type + new Date().getTime()
+      return newItem
+    },
+    hover(element) {
+      if(this.isDrag) return
+      let index = this.getIndexByKey(element.key)
+      this.$set(this.formData[index],'hover',true)
+    },
+    blur(element) {
+      let index = this.getIndexByKey(element.key)
+      this.$set(this.formData[index],'hover',false)
+    },
+    getIndexByKey(key) {
+      return this.formData.indexOf(this.formData.find(item => item.key === key))
+    },
+    handleStart(){
+      this.isDrag = true
+      this.formData.forEach(item => {
+        item.hover = false
+      })
+    },
+    handleEnd(){
+      this.isDrag = false
+    }
+  }
+})
+</script>
+
+<template>
+  <div class="main-box">
+    <div class="comp-lib">
+      <div class="title">
+        组件库
+      </div>
+      <div class="list">
+        <draggable v-model="compList" :options="{sort:false}" :group="{name:'form',put:false,pull:'clone'}" :clone="cloneItem" class="drag-list">
+          <transition-group class="drag-cont">
+            <div v-for="(element) in compList" :key="element.type">
+              <div v-if="element.type==='tips'" :class="[element.type,'form-item']">
+                <div class="tips">{{ element.value }}</div>
+              </div>
+              <div v-if="element.type==='input'" :class="[element.type,'form-item']">
+                <div class="tips">{{ element.label }}</div>
+                <el-input :value="element.value" :placeholder="element.placeholder" />
+              </div>
+              <div v-if="element.type==='select'" :class="[element.type,'form-item']">
+                <div class="tips">{{ element.label }}</div>
+                <el-select :value="element.value" :placeholder="element.placeholder">
+                  <el-option v-for="item in element.options" :key="item.value" :label="item.label" :value="item.value" />
+                </el-select>
+              </div>
+              <div v-if="element.type==='checkbox'" :class="[element.type,'form-item']">
+                <div class="tips">{{ element.label }}</div>
+                <el-checkbox-group :value="element.value">
+                  <el-checkbox v-for="item in element.options" :key="item.value" :label="item.label" />
+                </el-checkbox-group>
+              </div>
+              <div v-if="element.type==='radio'" :class="[element.type,'form-item']">
+                <div class="tips">{{ element.label }}</div>
+                <el-radio-group :value="element.value">
+                  <el-radio v-for="item in element.options" :key="item.value" :label="item.label" />
+                </el-radio-group>
+              </div>
+              <div v-if="element.type==='number'" :class="[element.type,'form-item']">
+                <div class="tips">{{ element.label }}</div>
+                <el-input-number :value="element.value" :max="element.max" :min="element.min" :step="element.step" prefix-icon="el-icon-user" :placeholder="element.placeholder" />
+              </div>
+              <div v-if="element.type==='slider'" :class="[element.type,'form-item']">
+                <div class="tips">{{ element.label }}</div>
+                <el-slider :value="element.value" :max="element.max" :min="element.min" :step="element.step" prefix-icon="el-icon-user" :placeholder="element.placeholder" />
+              </div>
+              <div v-if="element.type==='textarea'" :class="[element.type,'form-item']">
+                <div class="tips">{{ element.label }}</div>
+                <el-input :value="element.value" type="textarea" :placeholder="element.placeholder" :autosize="{ minRows: element.minRows, maxRows: element.maxRows}" />
+              </div>
+              <div v-if="element.type==='time'" :class="[element.type,'form-item']">
+                <div class="tips">{{ element.label }}</div>
+                <el-time-picker :value="element.value" :placeholder="element.placeholder" />
+              </div>
+              <div v-if="element.type==='date'" :class="[element.type,'form-item']">
+                <div class="tips">{{ element.label }}</div>
+                <el-date-picker :value="element.value" :placeholder="element.placeholder" />
+              </div>
+            </div>
+          </transition-group>
+        </draggable>
+      </div>
+    </div>
+    <div class="form-view">
+      <div class="scroll-view">
+        <div class="form-cont">
+          <div class="form-head">
+            <div class="title">未命名表单</div>
+            <div class="tips">从右侧拖动组件到表单区域</div>
+          </div>
+          <draggable v-model="formData" :group="{name:'form'}" @start="handleStart" @end="handleEnd" :options="{sort:true,animation:300}" class="form-body">
+            <transition-group class="drag-cont">
+              <div v-for="element in formData" :key="element.key" @mouseenter="hover(element)" @mouseleave="blur(element)">
+                <div v-if="element.type==='tips'" :class="[element.type,'form-item','view',{'active':element.hover}]">
+                  <div class="tips">{{ element.value }}</div>
+                </div>
+                <div v-if="element.type==='input'" :class="[element.type,'form-item','view',element.hover?'active':'']">
+                  <div class="tips">{{ element.label }}</div>
+                  <el-input :value="element.value" :placeholder="element.placeholder" />
+                </div>
+                <div v-if="element.type==='select'" :class="[element.type,'form-item','view',{'active':element.hover}]">
+                  <div class="tips">{{ element.label }}</div>
+                  <el-select :value="element.value" :placeholder="element.placeholder">
+                    <el-option v-for="item in element.options" :key="item.value" :label="item.label" :value="item.value" />
+                  </el-select>
+                </div>
+                <div v-if="element.type==='checkbox'" :class="[element.type,'form-item','view',{'active':element.hover}]">
+                  <div class="tips">{{ element.label }}</div>
+                  <el-checkbox-group :value="element.value">
+                    <el-checkbox v-for="item in element.options" :key="item.value" :label="item.label" />
+                  </el-checkbox-group>
+                </div>
+                <div v-if="element.type==='radio'" :class="[element.type,'form-item','view',{'active':element.hover}]">
+                  <div class="tips">{{ element.label }}</div>
+                  <el-radio-group :value="element.value">
+                    <el-radio v-for="item in element.options" :key="item.value" :label="item.label" />
+                  </el-radio-group>
+                </div>
+                <div v-if="element.type==='number'" :class="[element.type,'form-item','view',{'active':element.hover}]">
+                  <div class="tips">{{ element.label }}</div>
+                  <el-input-number :value="element.value" :max="element.max" :min="element.min" :step="element.step" prefix-icon="el-icon-user" :placeholder="element.placeholder" />
+                </div>
+                <div v-if="element.type==='slider'" :class="[element.type,'form-item','view',{'active':element.hover||element.active}]">
+                  <div class="tips">{{ element.label }}</div>
+                  <el-slider :value="element.value" :max="element.max" :min="element.min" :step="element.step" prefix-icon="el-icon-user" :placeholder="element.placeholder" />
+                </div>
+                <div v-if="element.type==='textarea'" :class="[element.type,'form-item','view',{'active':element.hover||element.active}]">
+                  <div class="tips">{{ element.label }}</div>
+                  <el-input :value="element.value" type="textarea" :placeholder="element.placeholder" :autosize="{ minRows: element.minRows, maxRows: element.maxRows}" />
+                </div>
+                <div v-if="element.type==='time'" :class="[element.type,'form-item','view',{'active':element.hover||element.active}]">
+                  <div class="tips">{{ element.label }}</div>
+                  <el-time-picker :value="element.value" :placeholder="element.placeholder" />
+                </div>
+                <div v-if="element.type==='date'" :class="[element.type,'form-item','view',{'active':element.hover||element.active}]">
+                  <div class="tips">{{ element.label }}</div>
+                  <el-date-picker :value="element.value" :placeholder="element.placeholder" />
+                </div>
+              </div>
+            </transition-group>
+          </draggable>
+        </div>
+      </div>
+    </div>
+    <div class="comp-edit">
+      <div class="title">表单设定</div>
+    </div>
+  </div>
+</template>
+
+<style scoped>
+  .main-box{
+    overflow: hidden;
+    padding: 0 !important;
+    height: 100%;
+    width: 100%;
+    display: grid;
+    grid-template-columns: 360px 1fr 360px;
+    grid-template-rows: 1fr;
+    .form-item{
+      cursor: grab;
+      background: white;
+      margin-bottom: -1px;
+      border-top: 1px solid lightgrey;
+      border-bottom: 1px solid lightgrey;
+      padding: 24px;
+      .tips{
+        font-size: 15px;
+        color: #989898;
+        margin-bottom: 8px;
+      }
+      &.select{
+        .el-select{
+          width: 100%;
+        }
+      }
+      &.number{
+        .el-input-number{
+          width: 100%;
+        }
+      }
+      &.time{
+        .el-date-editor{
+          width: 100%;
+        }
+      }
+      &.date{
+        .el-date-editor{
+          width: 100%;
+        }
+      }
+      &.view{
+        transition-duration: 300ms;
+        border-radius: 8px;
+        border: 3px solid #2563EB00;
+        padding: 12px 12px;
+        margin-bottom: 0;
+        &.tips{
+          padding: 12px 12px;
+        }
+        &.active{
+          border: 3px solid #2563EB;
+        }
+      }
+    }
+    .comp-lib{
+      z-index: 1;
+      position: relative;
+      display: grid;
+      grid-template-rows: auto 1fr;
+      box-shadow: 0 1px 4px 0 #00000022;
+      .title{
+        padding: 24px;
+      }
+      .list{
+        position: relative;
+        .drag-list{
+          position: absolute;
+          top: 0;
+          left: 0;
+          height: 100%;
+          width: 100%;
+          overflow: hidden;
+          overflow-y: auto;
+          .drag-cont{
+            width: 100%;
+            height: 100%;
+            display: block;
+          }
+        }
+      }
+    }
+    .form-view{
+      position: relative;
+      background: #F9FAFB;
+      .scroll-view{
+        position: absolute;
+        left: 0;
+        top: 0;
+        height: 100%;
+        width: 100%;
+        overflow: hidden;
+        overflow-y: scroll;
+        .form-cont{
+          padding: 12px;
+          border-radius: 16px;
+          margin: 24px;
+          background: white;
+          width: calc(100% - 48px);
+          box-shadow: 0 1px 4px 0 #00000022;
+          .form-head{
+            padding: 12px;
+            border-radius: 8px;
+            transition-duration: 300ms;
+            border: 3px solid #2563EB00;
+            &:hover{
+              border: 3px solid #2563EB;
+            }
+            .title{
+              font-size: 36px;
+              font-weight: bold;
+            }
+            .tips{
+              font-size: 20px;
+              color: #989898;
+              margin-bottom: 6px;
+            }
+          }
+          .form-body{
+            .drag-cont{
+              display: block;
+              width: 100%;
+              min-height: 300px;
+            }
+          }
+        }
+      }
+    }
+    .comp-edit{
+      z-index: 1;
+      position: relative;
+      box-shadow: 0 1px 4px 0 #00000022;
+      .title{
+        padding: 24px;
+      }
+    }
+  }
+</style>

+ 3 - 65
src/views/preRegManage/index.vue

@@ -1,4 +1,4 @@
-<script>
+<script lang="ts">
 import Vue from 'vue'
 
 export default Vue.extend({
@@ -7,71 +7,9 @@ export default Vue.extend({
 </script>
 
 <template>
-  <div class="main-box">
-    <div class="head">
-      <el-input prefix-icon="el-icon-search" placeholder="搜索表单名称" class="input"></el-input>
-      <el-button icon="el-icon-plus" type="primary">创建表单</el-button>
-      <el-button icon="el-icon-copy-document">批量复制</el-button>
-    </div>
-    <div class="body">
-      <el-table height="100%">
-        <el-table-column
-          label="表单名称"
-          width="260">
-        </el-table-column>
-        <el-table-column
-          label="创建时间"
-          width="260">
-        </el-table-column>
-        <el-table-column
-          label="状态">
-        </el-table-column>
-        <el-table-column
-          label="数量">
-        </el-table-column>
-        <el-table-column
-          label="最近提交时间"
-          width="260">
-        </el-table-column>
-        <el-table-column
-          label="操作">
-        </el-table-column>
-      </el-table>
-    </div>
-    <div class="foot">
-      <el-pagination
-        background
-        :page-size="100"
-        layout="total, prev, pager, next"
-        :total="1000">
-      </el-pagination>
-    </div>
-  </div>
+  <router-view></router-view>
 </template>
 
 <style scoped>
-  .main-box{
-    height: 100%;
-    display: grid;
-    grid-template-rows: auto 1fr auto;
-    grid-gap: 24px;
-    .head{
-      display: flex;
-      .input{
-        width: 50%;
-        margin-right: auto;
-      }
-    }
-    .body{
-      height: 100%;
-    }
-    .foot{
-      .el-pagination{
-        display: flex;
-        .el-pagination__total{
-          margin-right: auto;
-        }
-      }
-    }
-  }
+
 </style>

+ 95 - 0
src/views/preRegManage/list.vue

@@ -0,0 +1,95 @@
+<script>
+import Vue from 'vue'
+
+export default Vue.extend({
+  name: "index",
+  data() {
+    return {
+      formList: []
+    }
+  },
+  methods: {
+    handleCreate() {
+      this.$router.push({ path: '/preregmanage/edit' })
+    }
+  }
+})
+</script>
+
+<template>
+  <div class="main-box">
+    <div class="head">
+      <el-input prefix-icon="el-icon-search" placeholder="搜索表单名称" class="input"></el-input>
+      <el-button icon="el-icon-plus" type="primary" @click="handleCreate">创建表单</el-button>
+      <el-button icon="el-icon-copy-document">批量复制</el-button>
+    </div>
+    <div class="body">
+      <el-table height="100%" class="table">
+        <el-table-column
+          label="表单名称"
+          width="260">
+        </el-table-column>
+        <el-table-column
+          label="创建时间"
+          width="260">
+        </el-table-column>
+        <el-table-column
+          label="状态">
+        </el-table-column>
+        <el-table-column
+          label="数量">
+        </el-table-column>
+        <el-table-column
+          label="最近提交时间"
+          width="260">
+        </el-table-column>
+        <el-table-column
+          label="操作">
+        </el-table-column>
+      </el-table>
+    </div>
+    <div class="foot">
+      <el-pagination
+        background
+        :page-size="100"
+        layout="total, prev, pager, next"
+        :total="1000">
+      </el-pagination>
+    </div>
+  </div>
+</template>
+
+<style scoped>
+  .main-box{
+    height: 100%;
+    display: grid;
+    grid-template-rows: auto 1fr auto;
+    grid-gap: 24px;
+    .head{
+      display: flex;
+      .input{
+        width: 50%;
+        margin-right: auto;
+      }
+    }
+    .body{
+      position: relative;
+      height: 100%;
+      .table{
+        width: 100%;
+        height: 100%;
+        position: absolute;
+        top: 0;
+        left: 0;
+      }
+    }
+    .foot{
+      .el-pagination{
+        display: flex;
+        .el-pagination__total{
+          margin-right: auto;
+        }
+      }
+    }
+  }
+</style>