Bläddra i källkod

Merge branch 'master' of http://git.cc-lotus.info/service-platform/web-test

wuhongyu 4 år sedan
förälder
incheckning
3a9c080f93

+ 45 - 0
src/components/data-table.md

@@ -0,0 +1,45 @@
+# 组件文档说明
+## data-table.vue
+#### prop
+|参数|类型|默认值|是否必填|说明|
+|:-:|:-:|:-:|:-:|:-:|
+|fields|Array|`-`|是|字段列表(下文会说明如何使用)|
+|data|Array|`-`|是|数据列表|
+|opera|Array|[ ]|否|操作列的列表(下文会说明如何使用)|
+|toFormat|Function|`-`|否|如果fields中的format不是function类型,则会走toFormat的方法,需要自己写过滤规则,多个的情况需要区分|
+|select|Boolean|false|否|需要选择就变成true|
+|total|NUmber|0|否|分页的总数据|
+|usePage|Boolean|true|否|是否使用分页|
+|options|Object|null|否|加些属性,不知道能加啥,反正我把合计加上好使了|
+|useSum|Boolean|false|否|使用合计|
+|filter|Array|`[]`|否|额外查询|
+
+>fields
+>>
+|参数|类型|默认值|是否必填|说明|
+|:-:|:-:|:-:|:-:|:-:|
+|label|String|`-`|是|列名称|
+|prop|String|`-`|是|字段名称|
+|format|Function/String|`-`|否|Function类型:数据需要过滤则将过滤方法写在这;String类型:走toFormat方法,参数位(model=>字段名,value=>值)|
+|custom|Boolean|false|否|自定义输出|
+|options|Object|`-`|否|添加额外属性,比如说样式之类的|
+|filter|String|`-`|否|如果填写,则这个字段会查询,这里只填写类型,input/select,select的选项在options插槽中使用|
+|selected|Array|`-`|false|多选选项的数据|
+
+>opera
+>>
+|参数|类型|默认值|是否必填|说明|
+|:-:|:-:|:-:|:-:|:-:|
+|label|String|`-`|是|操作按钮提示文字|
+|icon|String|`-`|否|图标|
+|method|String|`-`|是|此按钮连接的父级方法($emit)|
+|confirm|Boolean|`-`|否|是否需要确认提示|
+|methodZh|String/Function|label|否|确认提示的操作文字,1,Function参数为这条数据,自己随意组合;2,String为纯自定义字符串,需要自己写整个提示语;3,默认,使用label字段提示|
+|display|Function|`-`|否|控制按钮是否显示(目前为简单版,只是根据此条数据中的内容判断,以后要是有需求会修改成toFormat的形式)|
+
+>methods
+>>
+|方法名|参数|说明|
+|:-:|:-:|:-:|
+|handleSelect|Array[object]|返回选择的内容|
+|query|{skip,limit,...info}|分页查询,及条件查询|

+ 284 - 0
src/components/data-table.vue

@@ -0,0 +1,284 @@
+<template>
+  <div id="data-table">
+    <el-form :model="searchInfo" :inline="true" style="padding:0.9rem 1.875rem ;" size="mini" v-if="useFilter">
+      <el-form-item v-for="(item, index) in filterList" :key="index">
+        <template v-if="item.filter === 'select'">
+          <el-select v-model="searchInfo[item.prop]" size="mini" clearable filterable :placeholder="`请选择${item.label}`" @clear="toClear(item.prop)">
+            <slot name="options" v-bind="{ item }"></slot>
+          </el-select>
+        </template>
+        <template v-else-if="item.filter === 'date'">
+          <el-date-picker
+            v-model="searchInfo[item.prop]"
+            value-format="yyyy-MM-dd"
+            format="yyyy-MM-dd"
+            type="daterange"
+            range-separator="-"
+            start-placeholder="开始日期"
+            end-placeholder="结束日期"
+            clearable
+          >
+          </el-date-picker>
+        </template>
+        <template v-else>
+          <el-input v-model="searchInfo[item.prop]" clearable size="mini" :placeholder="`请输入${item.label}`" @clear="toClear(item.prop)"></el-input>
+        </template>
+      </el-form-item>
+      <el-form-item>
+        <el-button type="primary" size="mini" @click="filterSearch">查询</el-button>
+      </el-form-item>
+    </el-form>
+    <el-table
+      ref="table"
+      row-key="id"
+      :data="data"
+      border
+      stripe
+      size="mini"
+      :max-height="height !== null ? height : ''"
+      @select="handleSelectionChange"
+      @select-all="handleSelectAll"
+      v-bind="options"
+      :show-summary="useSum"
+      @row-click="rowClick"
+    >
+      <el-table-column type="selection" width="55" v-if="select" prop="id" :reserve-selection="true" :show-overflow-tooltip="true"> </el-table-column>
+      <template v-for="(item, index) in fields">
+        <template v-if="item.custom">
+          <el-table-column :key="index" align="center" :label="item.label" v-bind="item.options" :show-overflow-tooltip="true">
+            <template v-slot="{ row }">
+              <slot name="custom" v-bind="{ item, row }"></slot>
+            </template>
+          </el-table-column>
+        </template>
+        <template v-else>
+          <el-table-column
+            :key="index"
+            align="center"
+            :label="item.label"
+            :prop="item.prop"
+            :formatter="toFormatter"
+            sortable
+            v-bind="item.options"
+            :show-overflow-tooltip="true"
+          >
+          </el-table-column>
+        </template>
+      </template>
+      <template v-if="opera.length > 0">
+        <el-table-column label="操作" align="center">
+          <template v-slot="{ row, $index }">
+            <template v-for="(item, index) in opera">
+              <template v-if="display(item, row)">
+                <el-tooltip v-if="item.icon" :key="index" effect="dark" :content="item.label" placement="bottom">
+                  <el-button
+                    :key="index"
+                    type="text"
+                    :icon="item.icon || ''"
+                    size="mini"
+                    @click="handleOpera(row, item.method, item.confirm, item.methodZh, item.label, $index)"
+                  ></el-button>
+                </el-tooltip>
+                <el-button v-else :key="index" type="text" size="mini" @click="handleOpera(row, item.method, item.confirm, item.methodZh, item.label, $index)">
+                  {{ item.label }}
+                </el-button>
+              </template>
+            </template>
+          </template>
+        </el-table-column>
+      </template>
+    </el-table>
+    <el-row type="flex" align="middle" justify="end" style="padding-top:1rem" v-if="usePage">
+      <el-col :span="24" style="text-align:right;">
+        <el-pagination
+          background
+          layout="sizes, total, prev, pager, next"
+          :page-sizes="[10, 15, 20, 50, 100]"
+          :total="total"
+          :page-size="limit"
+          :current-page.sync="currentPage"
+          @current-change="changePage"
+          @size-change="sizeChange"
+        >
+        </el-pagination>
+      </el-col>
+    </el-row>
+  </div>
+</template>
+
+<script>
+import _ from 'lodash';
+import dataForm from '@/components/form.vue';
+export default {
+  name: 'data-table',
+  props: {
+    fields: { type: Array, required: true },
+    data: { type: Array, required: true },
+    opera: { type: Array, default: () => [] },
+    toFormat: null,
+    height: null,
+    select: { type: Boolean, default: false },
+    selected: { type: Array, default: () => [] },
+    usePage: { type: Boolean, default: true },
+    total: { type: Number, default: 0 },
+    options: null,
+    useSum: { type: Boolean, default: false },
+    filter: { type: Array, default: () => [] },
+  },
+  components: {},
+  data: () => ({
+    pageSelected: [],
+    currentPage: 1,
+    limit: _.get(this, `$limit`, undefined) !== undefined ? this.$limit : process.env.VUE_APP_LIMIT * 1,
+    searchInfo: {},
+    useFilter: true,
+    filterList: [],
+  }),
+  created() {},
+  computed: {},
+  methods: {
+    toFormatter(row, column, cellValue, index) {
+      let this_fields = this.fields.filter(fil => fil.prop === column.property);
+      if (this_fields.length > 0) {
+        let format = _.get(this_fields[0], `format`, false);
+        if (format) {
+          let res;
+          if (_.isFunction(format)) {
+            res = format(cellValue);
+          } else {
+            res = this.toFormat({
+              model: this_fields[0].prop,
+              value: cellValue,
+            });
+          }
+          return res;
+        } else return cellValue;
+      }
+    },
+    handleOpera(data, method, confirm = false, methodZh, label, index) {
+      let self = true;
+      if (_.isFunction(methodZh)) {
+        methodZh = methodZh(data);
+      } else if (!_.isString(methodZh)) {
+        methodZh = label;
+        self = false;
+      }
+      if (confirm) {
+        this.$confirm(self ? methodZh : `您确认${methodZh}该数据?`, '提示', {
+          confirmButtonText: '确定',
+          cancelButtonText: '取消',
+          type: 'warning',
+        })
+          .then(() => {
+            this.$emit(method, { data, index });
+          })
+          .catch(() => {});
+      } else {
+        this.$emit(method, { data, index });
+      }
+    },
+    handleSelectionChange(selection, row) {
+      // console.log(selection);
+      // console.log(row);
+      //根据row是否再pageSelected中,判断是添加还是删除
+      let res = [];
+      if (this.pageSelected.find(i => i.id === row.id)) {
+        res = this.pageSelected.filter(f => f.id !== row.id);
+      } else {
+        this.pageSelected.push(row);
+        res = this.pageSelected;
+      }
+      this.$set(this, `pageSelected`, res);
+      this.$emit(`handleSelect`, _.uniqBy(res, 'id'));
+    },
+    handleSelectAll(selection) {
+      //处于没全选状态,选择之后一定是全选,只有处于全选状态时,才会反选(全取消)
+      // console.log(selection);
+      let res = [];
+      if (selection.length > 0) {
+        //全选
+        res = _.uniqBy(this.pageSelected.concat(selection), 'id');
+      } else {
+        //全取消
+        res = _.differenceBy(this.pageSelected, this.data, 'id');
+      }
+      this.$set(this, `pageSelected`, res);
+      this.$emit(`handleSelect`, res);
+    },
+    initSelection() {
+      this.$nextTick(() => {
+        this.$refs.table.clearSelection();
+        this.selected.forEach(info => {
+          let d = this.data.filter(p => p.id === info.id);
+          if (d.length > 0) this.$refs.table.toggleRowSelection(d[0]);
+        });
+      });
+    },
+    selectReset() {
+      this.$refs.table.clearSelection();
+    },
+    display(item, row) {
+      let display = _.get(item, `display`, true);
+      if (display === true) return true;
+      else {
+        let res = display(row);
+        return res;
+      }
+    },
+    //
+    changePage(page) {
+      this.$emit('query', { skip: (page - 1) * this.limit, limit: this.limit, ...this.searchInfo });
+    },
+    sizeChange(limit) {
+      this.limit = limit;
+      this.currentPage = 1;
+      this.$emit('query', { skip: 0, limit: this.limit, ...this.searchInfo });
+    },
+    getFilterList() {
+      let res = this.fields.filter(f => _.get(f, 'filter', false));
+      this.$set(this, `useFilter`, res.length > 0);
+      res.map(i => {
+        if (i.filter === 'date' && this.searchInfo[i.porp] === undefined) this.$set(this.searchInfo, i.prop, []);
+      });
+      res = [...res, ...this.filter];
+      this.$set(this, `filterList`, res);
+    },
+    filterSearch() {
+      this.currentPage = 1;
+      this.$emit('query', { skip: 0, limit: this.limit, ...this.searchInfo });
+    },
+    rowClick(row, column, event) {
+      this.$emit(`rowClick`, row);
+    },
+    toClear(prop) {
+      delete this.searchInfo[prop];
+    },
+  },
+  watch: {
+    selected: {
+      handler(val) {
+        if (val.length > 0) {
+          this.pageSelected = val;
+          this.initSelection();
+        }
+      },
+      immediate: true,
+    },
+    data: {
+      handler(val, oval) {
+        if (this.select) {
+          this.initSelection();
+        }
+      },
+    },
+    fields: {
+      handler(val, oval) {
+        if (val) this.getFilterList();
+      },
+      immediate: true,
+    },
+  },
+};
+</script>
+
+<style lang="less" scoped></style>

+ 81 - 0
src/components/form.md

@@ -0,0 +1,81 @@
+# 组件说明文档
+### form.vue
+### props
+
+|参数|类型|默认值|是否必填|说明|
+|:-:|:-:|:-:|:-:|:-:|
+|fields|Array|`-`|是|字段相关都在这里,用来自动输出,详情见下面|
+|submitText|String|`保存`|否|默认保存按钮的文字|
+|rules|Object|`-`|否|校验规则,不会找el-form的例子,不过使用的async-validator这个依赖为基础,会写这个也可以~~(那就厉害了,反正我是不行)~~|
+|isNew|Boolean|`-`|是|修改还是添加的提示|
+|data|Object|`-`|否|修改传来的数据|
+|needSave|Boolean|false|否|是否禁用保存按钮|
+|useEnter|Boolean|true|否|使用回车提交|
+|reset|Boolean|true|否|提交后是否重置表单|
+
+
+### fields
+>Array类型 必填
+>>
+|参数|类型|默认值|是否必填|说明|
+|:-:|:-:|:-:|:-:|:-:|
+|label|String|`-`|是|显示的字段中文|
+|type|String|input|否|这个字段要用什么类型来输出 input的基本类型可选值:date,datetime,radio,checkbox,select,text(只显示值),editor(富文本编辑器),password|
+|required|Boolean|`-`|否|是否必须输入|
+|model|String|`-`|是|字段名|
+|placeholder|String|`-`|否|占位,正常用,只是个透传|
+|options|object|`-`|否|标签的属性设置,例如:textarea 需要显示剩余字数,或者input限制长度,都往这里写,key-value形式(键值对,json的基本了解,不知道百度,具体属性看你具体用那个组件,那个组件有什么属性,瞎写不一定好使)|
+|custom|Boolean|`-`|否|是否使用自定义插槽|
+|tip|String|`-`|否|提示语,例如:请输入11位电话号码|
+|labelWidth|String|`120px`|否|表单label宽度,element的,默认120px|
+
+
+
+
+
+
+
+### slot
+>
+|插槽名|说明|
+|:-:|:-:|
+|options|fields中type为select的,选项都写在这个插槽中,多个select则需要区分options所属问题|
+|radios|fields中type为radio的,选项都写在这个插槽中,多个radio则需要区分radios所属问题|
+|checkboxs|fields中type为checkbox的,选项都写在这个插槽中,多个checkbox则需要区分checkboxs所属问题|
+|custom|自定义插槽,完全自己去写|
+|submit|提交按钮部分,当needSave为false时才可以使用|
+>>关于自定义的用法:
+>>在fields中,custom:true的情况即需要自定义,写法如下
+
+>>`<template #custom="{ item, form, fieldChange }"> ... </template>`
+>>
+|参数名|说明|
+|:-:|:-:|
+|item|fields循环出来的每一项|
+|form|组件内部的表单|
+|fieldChange|组件内部的修改方法,此方法不一定必须使用,看情况来;参数:{model:xxx,value:XXX}(model:字段名,value:值)|
+>>在使用时,此插槽内的v-model可以写成form[item.model],也可以写成form.字段名
+
+>>例如`<el-input v-model="form[item.model]">`或者`<el-input v-model="form.xxx">`
+
+>> **如果有多处需要自定义,请区分开去写**
+
+
+***
+### upload
+|参数|类型|默认值|是否必填|说明|
+|:-:|:-:|:-:|:-:|:-:|
+|url|String|`-`|是|上传地址|
+|limit|Number|`-`|是|限制上传数量|
+|data|any|`-`|否|上传数据|
+|type|String|`-`|否|上传返回的字段|
+|isBtn|Boolean|false|否|是否只显示按钮|
+|showList|Boolean|true|否|是否显示上传列表|
+|accept|String|`-`|否|可以上传的文件类型,不写就没限制|
+|tip|String|`-`|否|提示信息|
+|listType|String|picture-card|否|上传文件列表显示类型|
+
+>### method
+>|方法名|返回参数|说明|
+|:-:|:-:|:-:|
+|upload|{type,data}|上传成功返回

+ 203 - 0
src/components/form.vue

@@ -0,0 +1,203 @@
+<template>
+  <div id="add">
+    <el-form
+      ref="form"
+      :model="form"
+      :rules="rules"
+      :label-width="labelWidth"
+      class="form"
+      size="small"
+      @submit.native.prevent
+      :style="styles"
+      :inline="inline"
+    >
+      <template v-for="(item, index) in fields">
+        <template v-if="!loading">
+          <el-form-item v-if="display(item)" :key="'form-field-' + index" :label="getField('label', item)" :prop="item.model" :required="item.required">
+            <template v-if="!item.custom">
+              <template v-if="item.type !== 'text'">
+                <!-- <el-tooltip class="item" effect="dark" :content="item.tip" placement="top-start" :disabled="!item.tip"> -->
+                <template v-if="item.type === `date` || item.type === `datetime`">
+                  <el-date-picker
+                    v-model="form[item.model]"
+                    :type="item.type"
+                    placeholder="选择择"
+                    format="yyyy-MM-dd"
+                    value-format="yyyy-MM-dd"
+                    v-bind="item.options"
+                  >
+                  </el-date-picker>
+                </template>
+                <template v-else-if="item.type === `year` || item.type === `week` || item.type === `day`">
+                  <el-date-picker
+                    v-model="form[item.model]"
+                    :type="item.type"
+                    placeholder="选择择"
+                    :format="`${item.type === 'year' ? 'yyyy' : item.type === 'week' ? 'MM' : 'dd'}`"
+                    :value-format="`${item.type === 'year' ? 'yyyy' : item.type === 'week' ? 'MM' : 'dd'}`"
+                    v-bind="item.options"
+                  >
+                  </el-date-picker>
+                </template>
+                <template v-else-if="item.type === 'radio'">
+                  <el-radio-group v-model="form[item.model]" size="mini" v-bind="item.options">
+                    <slot name="radios" v-bind="{ item, form, fieldChange }"></slot>
+                  </el-radio-group>
+                </template>
+                <template v-else-if="item.type === 'select'">
+                  <el-select v-model="form[item.model]" v-bind="item.options" filterable clearable>
+                    <slot name="options" v-bind="{ item, form, fieldChange }"></slot>
+                  </el-select>
+                </template>
+                <template v-else-if="item.type === 'textarea'">
+                  <el-input clearable v-model="form[item.model]" type="textarea" :autosize="{ minRows: 3, maxRows: 5 }"></el-input>
+                </template>
+                <template v-else-if="item.type === 'editor'">
+                  <wang-editor v-model="form[item.model]"></wang-editor>
+                </template>
+                <template v-else-if="item.type === 'checkbox'">
+                  <el-checkbox-group v-model="form[item.model]" v-bind="item.options">
+                    <slot name="checkboxs" v-bind="{ item, form, fieldChange }"></slot>
+                  </el-checkbox-group>
+                </template>
+                <template v-else>
+                  <el-input
+                    clearable
+                    v-model="form[item.model]"
+                    :type="getField('type', item)"
+                    :placeholder="getField('placeholder', item)"
+                    :show-password="getField('type', item) === 'password'"
+                    v-bind="item.options"
+                  ></el-input>
+                </template>
+                <!-- </el-tooltip> -->
+              </template>
+              <template v-else>
+                {{ form[item.model] }}
+              </template>
+            </template>
+            <template v-else>
+              <slot name="custom" v-bind="{ item, form, fieldChange }"></slot>
+            </template>
+          </el-form-item>
+        </template>
+      </template>
+      <el-form-item v-if="needSave" class="btn">
+        <el-row type="flex" align="middle" justify="space-around">
+          <el-col :span="6">
+            <el-button type="primary" @click="save">{{ submitText }}</el-button>
+          </el-col>
+        </el-row>
+      </el-form-item>
+      <el-form-item v-else>
+        <slot name="submit"></slot>
+      </el-form-item>
+    </el-form>
+  </div>
+</template>
+
+<script>
+import _ from 'lodash';
+import wangEditor from './wang-editor.vue';
+export default {
+  name: 'add',
+  props: {
+    fields: { type: Array, default: () => [] },
+    rules: { type: Object, default: () => {} },
+    isNew: { type: Boolean, default: true },
+    data: null,
+    styles: { type: Object, default: () => {} },
+    needSave: { type: Boolean, default: true },
+    labelWidth: { type: String, default: '120px' },
+    useEnter: { type: Boolean, default: true },
+    submitText: { type: String, default: '保存' },
+    inline: { type: Boolean, default: false },
+    reset: { type: Boolean, default: true },
+  },
+  components: {
+    wangEditor,
+  },
+  data: () => ({
+    form: {},
+    show: false,
+    dateShow: false,
+    loading: true,
+  }),
+  created() {
+    if (this.useEnter) {
+      document.onkeydown = () => {
+        let key = window.event.keyCode;
+        if (key == 13) {
+          this.save();
+        }
+      };
+    }
+  },
+  computed: {},
+  mounted() {},
+  watch: {
+    fields: {
+      handler(val) {
+        this.checkType();
+      },
+      immediate: true,
+    },
+    data: {
+      handler(val) {
+        this.loading = true;
+        if (val) this.$set(this, `form`, this.data);
+        this.loading = false;
+      },
+      immediate: true,
+      deep: true,
+    },
+  },
+  methods: {
+    getField(item, data) {
+      let res = _.get(data, item, null);
+      if (item === 'type') res = res === null ? `text` : res;
+      if (item === 'placeholder') res = res === null ? `请输入${data.label}` : res;
+      if (item === 'required') res = res === null ? false : res;
+      if (item === `error`) res = res === null ? `${data.label}错误` : res;
+      return res;
+    },
+    save() {
+      this.$refs['form'].validate(valid => {
+        if (valid) {
+          this.$emit(`save`, { isNew: this.isNew, data: JSON.parse(JSON.stringify(this.form)) });
+          if (this.reset) this.$refs.form.resetFields();
+        } else {
+          console.warn('form validate error!!!');
+        }
+      });
+    },
+    fieldChange({ model, value }) {
+      this.$set(this.form, model, value);
+    },
+    checkType() {
+      let arr = this.fields.filter(fil => fil.type === 'checkbox');
+      if (arr.length > 0 && this.isNew) {
+        for (const item of arr) {
+          this.$set(this.form, `${item.model}`, []);
+        }
+      }
+    },
+    display(field) {
+      let dis = _.get(field, `display`);
+      if (!_.isFunction(dis)) return true;
+      else return dis(field, this.form);
+    },
+  },
+};
+</script>
+
+<style lang="less" scoped>
+.form {
+  padding: 2rem 1rem;
+  background: #fff;
+  border-radius: 20px;
+}
+/deep/.btn .el-form-item__content {
+  margin-left: 0 !important;
+}
+</style>

+ 0 - 127
src/components/statistics/bar.vue

@@ -1,127 +0,0 @@
-<template>
-  <div id="bar">
-    <div :id="gid"></div>
-  </div>
-</template>
-
-<script>
-import _ from 'lodash';
-import { Bar, Column } from '@antv/g2plot';
-import { mapState, createNamespacedHelpers } from 'vuex';
-export default {
-  name: 'bar',
-  props: {
-    data: { type: [Object, Array], default: () => [] },
-    axis: { type: Object, default: () => {} },
-    gid: { type: String, default: `${new Date().getTime()}` },
-    horizontal: { type: Boolean, default: true },
-  },
-  components: {},
-  data: function() {
-    return {
-      chart: null,
-      list: [],
-    };
-  },
-  created() {},
-  mounted() {
-    this.init();
-  },
-  methods: {
-    async init() {
-      let e = document.getElementById(this.gid);
-      if (!e) {
-        console.warn('没有找到指定渲染容器');
-        return;
-      }
-      if (!this.list) {
-        //未获得数据
-        return;
-      }
-      if (this.chart) {
-        this.chart.updateConfig({ data: this.list });
-      } else {
-        let { x, y, xAlias, yAlias } = this.axis;
-        let meta = {};
-        meta[x] = { alias: xAlias };
-        meta[y] = { alias: yAlias };
-        let options = {
-          pixelRatio: 1,
-          data: this.list,
-          //条形和柱状的x,y轴需要互换
-          xField: this.horizontal ? y : x,
-          yField: this.horizontal ? x : y,
-          meta: meta,
-          point: {
-            visible: true,
-          },
-          label: {
-            visible: true,
-          },
-          //stackField + legend 一起使用,前者确定以哪个字段作为选项,后者是显示与否,位置
-          stackField: x,
-          legend: {
-            visible: true,
-            position: 'right-top',
-          },
-          xAxis: {
-            nice: true,
-            visible: true,
-            line: {
-              visible: true,
-            },
-            grid: {
-              visible: true,
-            },
-            tickLine: {
-              visible: true,
-            },
-          },
-          yAxis: {
-            nice: true,
-            visible: true,
-            grid: {
-              visible: true,
-            },
-            line: {
-              visible: true,
-            },
-          },
-
-          events: {
-            // onColumnClick: e => this.gclick(e),
-          },
-        };
-        if (this.horizontal) this.chart = new Bar(this.gid, options);
-        else this.chart = new Column(this.gid, options);
-      }
-      this.chart.render();
-    },
-  },
-  computed: {
-    ...mapState(['user']),
-    pageTitle() {
-      return `${this.$route.meta.title}`;
-    },
-  },
-  watch: {
-    data: {
-      handler(val) {
-        if (val.length > 0) this.$set(this, `list`, val);
-      },
-      immediate: true,
-      deep: true,
-    },
-    list: {
-      handler(val) {
-        if (val) this.$nextTick(() => this.init());
-      },
-    },
-  },
-  metaInfo() {
-    return { title: this.$route.meta.title };
-  },
-};
-</script>
-
-<style lang="less" scoped></style>

+ 0 - 102
src/components/statistics/donut.vue

@@ -1,102 +0,0 @@
-<template>
-  <div id="donut">
-    <div :id="gid"></div>
-  </div>
-</template>
-
-<script>
-import { mapState, createNamespacedHelpers } from 'vuex';
-import { Donut } from '@antv/g2plot';
-export default {
-  name: 'donut',
-  props: {
-    data: { type: Array, default: () => [] },
-    axis: { type: Object, default: () => {} }, //{x:x轴字段名; xAlias:x轴名称; y:y轴字段名; yAlias:y轴名称}
-    gid: { type: String, default: `${new Date().getTime()}` },
-    headTitle: { type: String, default: '' },
-  },
-  components: {},
-  data: function() {
-    return {
-      chart: null,
-      list: undefined,
-    };
-  },
-  mounted() {
-    this.init();
-  },
-  methods: {
-    async init() {
-      let e = document.getElementById(this.gid);
-      if (!e) {
-        console.warn('没有找到指定渲染容器');
-        return;
-      }
-      if (!this.list) {
-        //未获得数据
-        return;
-      }
-      if (this.chart) {
-        this.chart.updateConfig({ data: this.list });
-      } else {
-        let { x, y, xAlias, yAlias } = this.axis;
-        let meta = {};
-        meta[x] = { alias: xAlias };
-        meta[y] = { alias: yAlias };
-        this.chart = new Donut(this.gid, {
-          title: { visible: true, text: this.headTitle },
-          pixelRatio: 4,
-          data: this.list,
-          colorField: x,
-          angleField: y,
-          meta: meta,
-          point: {
-            visible: true,
-          },
-          label: {
-            visible: true,
-            type: 'spider',
-            formatter: (text, item) => `${item._origin[x]}: ${item._origin[y]}`,
-          },
-          //stackField + legend 一起使用,前者确定以哪个字段作为选项,后者是显示与否,位置
-          stackField: x,
-          legend: {
-            visible: true,
-            position: 'right-top',
-          },
-          events: {
-            // onPieClick: e => this.gclick(e),
-          },
-        });
-      }
-
-      this.chart.render();
-    },
-  },
-  watch: {
-    data: {
-      handler(val) {
-        if (val.length > 0) this.$set(this, `list`, val);
-      },
-      immediate: true,
-      deep: true,
-    },
-    list: {
-      handler(val) {
-        if (val) this.$nextTick(() => this.init());
-      },
-    },
-  },
-  computed: {
-    ...mapState(['user']),
-    pageTitle() {
-      return `${this.$route.meta.title}`;
-    },
-  },
-  metaInfo() {
-    return { title: this.$route.meta.title };
-  },
-};
-</script>
-
-<style lang="less" scoped></style>

+ 0 - 81
src/components/statistics/liquid.vue

@@ -1,81 +0,0 @@
-<template>
-  <div id="liquid">
-    <div :id="gid" style="height:450px"></div>
-  </div>
-</template>
-
-<script>
-import _ from 'lodash';
-import { mapState, createNamespacedHelpers } from 'vuex';
-import { Liquid } from '@antv/g2plot';
-export default {
-  name: 'liquid',
-  props: {
-    data: { type: [Number, String], default: 0 },
-    max: { type: Number, default: 100 }, //整体上限,调整比例
-    min: { type: Number, default: 0 }, //整体上限,调整比例
-    gid: { type: String, default: `${new Date().getTime()}` },
-    headTitle: { type: String, default: '' },
-  },
-  components: {},
-  data: function() {
-    return {
-      chart: null,
-      value: 0,
-    };
-  },
-  mounted() {
-    this.init();
-  },
-  created() {},
-  methods: {
-    async init() {
-      let e = document.getElementById(this.gid);
-      if (!e) {
-        console.warn('没有找到指定渲染容器');
-        return;
-      }
-      if (this.chart) {
-        this.chart.updateConfig({ value: this.value });
-      } else {
-        this.chart = new Liquid(this.gid, {
-          title: { visible: true, text: this.headTitle },
-          min: this.min,
-          max: this.max,
-          value: this.value, //
-          events: {
-            // onPieClick: e => this.gclick(e),
-          },
-        });
-      }
-
-      this.chart.render();
-    },
-  },
-  watch: {
-    data: {
-      handler(val) {
-        if (val) this.$set(this, `value`, val);
-      },
-      immediate: true,
-      deep: true,
-    },
-    value: {
-      handler(val) {
-        if (val) this.$nextTick(() => this.init());
-      },
-    },
-  },
-  computed: {
-    ...mapState(['user']),
-    pageTitle() {
-      return `${this.$route.meta.title}`;
-    },
-  },
-  metaInfo() {
-    return { title: this.$route.meta.title };
-  },
-};
-</script>
-
-<style lang="less" scoped></style>

+ 0 - 114
src/components/statistics/pie.vue

@@ -1,114 +0,0 @@
-<template>
-  <div id="down-pie">
-    <div :id="gid"></div>
-  </div>
-</template>
-
-<script>
-import { mapState, createNamespacedHelpers } from 'vuex';
-import { Pie } from '@antv/g2plot';
-export default {
-  name: 'downPie',
-  props: {
-    data: { type: Array, default: () => [] },
-    axis: { type: Object, default: () => {} }, //{x:x轴字段名; xAlias:x轴名称; y:y轴字段名; yAlias:y轴名称}
-    gid: { type: String, default: `${new Date().getTime()}` },
-    headTitle: { type: String, default: '' },
-  },
-  components: {},
-  data: () => {
-    return {
-      chart: null,
-      list: undefined,
-    };
-  },
-  mounted() {
-    this.init();
-  },
-  methods: {
-    async init() {
-      let e = document.getElementById(this.gid);
-      if (!e) {
-        console.warn('没有找到指定渲染容器');
-        return;
-      }
-      if (!this.list) {
-        //未获得数据
-        return;
-      }
-      if (this.chart) {
-        this.chart.updateConfig({ data: this.list });
-      } else {
-        let { x, y, xAlias, yAlias } = this.axis;
-        let meta = {};
-        meta[x] = { alias: xAlias };
-        meta[y] = { alias: yAlias };
-        this.chart = new Pie(this.gid, {
-          title: { visible: true, text: this.headTitle },
-          pixelRatio: 4,
-          data: this.list,
-          colorField: x,
-          angleField: y,
-          meta: meta,
-          point: {
-            visible: true,
-          },
-          label: {
-            visible: true,
-            type: 'spider',
-            formatter: (text, item) => `${item._origin[x]}: ${item._origin[y]}`,
-          },
-          //stackField + legend 一起使用,前者确定以哪个字段作为选项,后者是显示与否,位置
-          stackField: x,
-          legend: {
-            visible: true,
-            position: 'right-top',
-          },
-          events: {
-            // onPieClick: e => this.gclick(e),
-          },
-        });
-      }
-
-      this.chart.render();
-    },
-  },
-  watch: {
-    data: {
-      handler(val) {
-        if (val.length > 0) this.$set(this, `list`, val);
-      },
-      immediate: true,
-      deep: true,
-    },
-    list: {
-      handler(val) {
-        if (val) this.$nextTick(() => this.init());
-      },
-    },
-  },
-  computed: {
-    ...mapState(['user']),
-    pageTitle() {
-      return `${this.$route.meta.title}`;
-    },
-  },
-  metaInfo() {
-    return { title: this.$route.meta.title };
-  },
-};
-</script>
-
-<style lang="less" scoped>
-.rightData {
-  padding: 0 30px;
-  height: 391px;
-  overflow: hidden;
-}
-/deep/.el-table td {
-  padding: 8px 0;
-}
-/deep/.el-table th {
-  padding: 8px 0;
-}
-</style>

+ 0 - 104
src/components/statistics/rose.vue

@@ -1,104 +0,0 @@
-<template>
-  <div id="rose">
-    <div :id="gid"></div>
-  </div>
-</template>
-
-<script>
-import { mapState, createNamespacedHelpers } from 'vuex';
-import { Rose } from '@antv/g2plot';
-export default {
-  name: 'rose',
-  props: {
-    data: { type: Array, default: () => [] },
-    axis: { type: Object, default: () => {} }, //{x:x轴字段名; xAlias:x轴名称; y:y轴字段名; yAlias:y轴名称}
-    gid: { type: String, default: `${new Date().getTime()}` },
-    headTitle: { type: String, default: '' },
-  },
-  components: {},
-  data: function() {
-    return {
-      chart: null,
-      list: undefined,
-    };
-  },
-  mounted() {
-    this.init();
-  },
-  methods: {
-    async init() {
-      let e = document.getElementById(this.gid);
-      if (!e) {
-        console.warn('没有找到指定渲染容器');
-        return;
-      }
-      if (!this.list) {
-        //未获得数据
-        return;
-      }
-      if (this.chart) {
-        this.chart.updateConfig({ data: this.list });
-      } else {
-        let { x, y, xAlias, yAlias } = this.axis;
-        let meta = {};
-        meta[x] = { alias: xAlias };
-        meta[y] = { alias: yAlias };
-        this.chart = new Rose(this.gid, {
-          title: { visible: true, text: this.headTitle },
-          pixelRatio: 4,
-          data: this.list,
-          radiusField: y,
-          categoryField: x,
-          colorField: x,
-          // angleField: y,
-          meta: meta,
-          point: {
-            visible: true,
-          },
-          label: {
-            visible: true,
-            type: 'spider',
-            formatter: (text, item) => `${item[x]}: ${item[y]}`,
-          },
-          //stackField + legend 一起使用,前者确定以哪个字段作为选项,后者是显示与否,位置
-          stackField: x,
-          legend: {
-            visible: true,
-            position: 'right-top',
-          },
-          events: {
-            // onPieClick: e => this.gclick(e),
-          },
-        });
-      }
-
-      this.chart.render();
-    },
-  },
-  watch: {
-    data: {
-      handler(val) {
-        if (val.length > 0) this.$set(this, `list`, val);
-      },
-      immediate: true,
-      deep: true,
-    },
-    list: {
-      handler(val) {
-        if (val) this.$nextTick(() => this.init());
-      },
-    },
-  },
-  computed: {
-    ...mapState(['user']),
-    pageTitle() {
-      return `${this.$route.meta.title}`;
-    },
-  },
-  metaInfo() {
-    return { title: this.$route.meta.title };
-  },
-};
-</script>
-
-<style lang="less" scoped></style>

+ 1 - 0
src/store/index.js

@@ -28,6 +28,7 @@ import expertsuser from '@common/store/market/exportuser';
 import productpact from '@common/store/market/productpact';
 import wxchattest from './user/wxchattest';
 import users from './user';
+// 新增
 import authUser from './user/auth-user';
 Vue.use(Vuex);
 

+ 0 - 1
src/views/adminCenter/basicInfo/index.vue

@@ -63,7 +63,6 @@ export default {
         data.name = this.form.adminuser;
         let arr = await this.authUserUpdate(data);
         if (this.$checkRes(arr)) {
-          console.log(arr);
           this.$message({
             message: '修改信息成功',
             type: 'success',

+ 153 - 6
src/views/adminCenter/dockInfo/index.vue

@@ -4,7 +4,28 @@
       <el-col :span="24">
         <el-col :span="24" class="leftTop"> <span>|</span> <span>展会管理</span> </el-col>
         <el-col :span="24" class="info">
-          展会管理
+          <span v-if="display == '1'">
+            <data-table
+              :fields="fields"
+              @delete="toDelete"
+              :data="list"
+              :opera="opera"
+              @edit="toEdit"
+              :total="total"
+              @query="search"
+              @share="share"
+              @order="order"
+            ></data-table>
+          </span>
+          <span v-else-if="display == '2'">
+            <dockEdit @back="back" :dockid="dockid"></dockEdit>
+          </span>
+          <span v-else-if="display == '3'">
+            <dockShare @back="back" :dockid="dockid"></dockShare>
+          </span>
+          <span v-else-if="display == '4'">
+            <dockStatus @back="back" :dockid="dockid"></dockStatus>
+          </span>
         </el-col>
       </el-col>
     </el-row>
@@ -13,15 +34,141 @@
 
 <script>
 import { mapState, createNamespacedHelpers } from 'vuex';
+import dataTable from '@/components/data-table.vue';
+import dockEdit from './parts/dockEdit.vue';
+import dockShare from './parts/dockShare.vue';
+import dockStatus from './parts/dockStatus.vue';
+const { mapActions: dock } = createNamespacedHelpers('dock');
+const { mapActions: place } = createNamespacedHelpers('place');
+const { mapActions: authUser } = createNamespacedHelpers('authUser');
+const { mapActions: login } = createNamespacedHelpers('login');
 export default {
   name: 'index',
   props: {},
-  components: {},
+  components: {
+    dataTable,
+    dockEdit,
+    dockShare,
+    dockStatus,
+  },
   data: function() {
-    return {};
+    return {
+      opera: [
+        {
+          label: '编辑',
+          icon: 'el-icon-edit',
+          method: 'edit',
+        },
+        {
+          label: '查看申请情况',
+          icon: 'el-icon-share',
+          method: 'share',
+          display: item => {
+            return item.is_allowed == '1' ? true : false;
+          },
+        },
+        {
+          label: '对接会开始状态审核',
+          icon: 'el-icon-s-order',
+          method: 'order',
+          display: item => {
+            return item.is_allowed == '1' ? true : false;
+          },
+        },
+
+        {
+          label: '删除',
+          icon: 'el-icon-delete',
+          method: 'delete',
+          confirm: true,
+        },
+      ],
+      fields: [
+        { label: '对接会标题', prop: 'title' },
+        { label: '开始时间', prop: 'start_time' },
+        { label: '结束时间', prop: 'end_time' },
+        { label: '报名截止', prop: 'join_end' },
+        { label: '省份', prop: 'sheng' },
+        { label: '市区', prop: 'shi' },
+        { label: '负责人', prop: 'adminuser' },
+        { label: '负责人手机', prop: 'phone' },
+        // {
+        //   label: '审核状态',
+        //   prop: 'is_allowed',
+        //   format: item => {
+        //     return item === '0' ? '未审核' : item === '1' ? '已允许' : '已拒绝';
+        //   },
+        // },
+        {
+          label: '对接会状态',
+          prop: 'status',
+          format: item => {
+            return item === '1' ? '开始' : item === '2' ? '结束' : '准备中';
+          },
+        },
+      ],
+      list: [],
+      total: 0,
+      display: '1',
+      dockid: '',
+    };
+  },
+  created() {
+    this.search();
+  },
+  methods: {
+    ...dock(['query', 'delete', 'update', 'delete']),
+    ...place({ palcequery: 'query', palcefetch: 'fetch' }),
+    ...authUser({ authUserDelete: 'delete' }),
+    ...login({ logout: 'logout', transactiondtetle: 'delete' }),
+    async search({ skip = 0, limit = 10, ...info } = {}) {
+      let res = await this.query({ skip, limit, uid: this.user.uid });
+      for (const val of res.data) {
+        let parent = val.province;
+        let places = val.place;
+        let reslte = await this.palcequery({ level: 1, parent });
+        let resltes = await this.palcequery({ level: 2, parent });
+        var arr = reslte.data.filter(item => item.code === parent);
+        var cre = resltes.data.filter(item => item.code === places);
+        for (const shi of cre) {
+          val.shi = shi.name;
+        }
+        for (const sheng of arr) {
+          val.sheng = sheng.name;
+        }
+      }
+      this.$set(this, `list`, res.data);
+      this.$set(this, `total`, res.total);
+    },
+    // 修改
+    toEdit() {
+      this.display = '2';
+      this.$set(this, `dockid`, this.list[0].id);
+    },
+    // 申请
+    share() {
+      this.display = '3';
+      this.$set(this, `dockid`, this.list[0].id);
+    },
+    // 开始审核
+    order() {
+      this.display = '4';
+      this.$set(this, `dockid`, this.list[0].id);
+    },
+    // 删除
+    async toDelete({ data }) {
+      const arr = await this.authUserDelete(data.uid);
+      const res = await this.delete(data.id);
+      if (this.$checkRes(res, '删除成功', res.errmsg || '删除失败')) {
+        this.logout();
+        this.$router.push({ path: '/newlogin' });
+      }
+    },
+    // 返回
+    back() {
+      this.display = '1';
+    },
   },
-  created() {},
-  methods: {},
   computed: {
     ...mapState(['user']),
     pageTitle() {
@@ -48,6 +195,6 @@ export default {
   color: #22529a;
 }
 .info {
-  padding: 0 40px 0 0;
+  padding: 0 38px 0 10px;
 }
 </style>

+ 149 - 0
src/views/adminCenter/dockInfo/parts/dockEdit.vue

@@ -0,0 +1,149 @@
+<template>
+  <div id="dockEdit">
+    <el-row>
+      <el-col :span="24">
+        <el-col :span="24" class="back">
+          <el-button type="primary" size="mini" @click="back()">返回</el-button>
+        </el-col>
+        <el-col :span="24" class="form">
+          <el-form ref="form" :model="form" label-width="120px">
+            <el-form-item label="对接会标题">
+              <el-input v-model="form.title"></el-input>
+            </el-form-item>
+            <el-form-item label="开始时间">
+              <el-date-picker v-model="form.start_time" type="datetime" placeholder="请选择开始时间" format="yyyy-MM-dd HH:mm" value-format="yyyy-MM-dd HH:mm">
+              </el-date-picker>
+            </el-form-item>
+            <el-form-item label="结束时间">
+              <el-date-picker v-model="form.end_time" type="datetime" placeholder="请选择结束时间" format="yyyy-MM-dd HH:mm" value-format="yyyy-MM-dd HH:mm">
+              </el-date-picker>
+            </el-form-item>
+            <el-form-item label="报名截止时间">
+              <el-date-picker
+                v-model="form.join_end"
+                type="datetime"
+                placeholder="请选择报名截止时间"
+                format="yyyy-MM-dd HH:mm"
+                value-format="yyyy-MM-dd HH:mm"
+              >
+              </el-date-picker>
+            </el-form-item>
+            <el-form-item label="省份">
+              <el-select v-model="form.province" placeholder="请选择省份" @change="changeshenge">
+                <el-option v-for="item in option" :key="item.code" :label="item.name" :value="item.code"> </el-option>
+              </el-select>
+            </el-form-item>
+            <el-form-item label="市">
+              <el-select v-model="form.place" placeholder="请选择市">
+                <el-option v-for="item in options" :key="item.code" :label="item.name" :value="item.code"> </el-option>
+              </el-select>
+            </el-form-item>
+            <el-form-item label="简介">
+              <el-input type="textarea" v-model="form.desc"></el-input>
+            </el-form-item>
+            <el-form-item label="负责人">
+              <el-input v-model="form.adminuser" placeholder="请输入用户名"></el-input>
+            </el-form-item>
+            <el-form-item label="负责人手机号">
+              <el-input v-model="form.phone" maxlength="11" placeholder="请输入手机号" disabled> </el-input>
+            </el-form-item>
+            <el-form-item label="密码">
+              <el-input v-model="form.passwd" placeholder="请输入密码" show-password disabled></el-input>
+            </el-form-item>
+            <el-form-item label="对接会视频">
+              <upload :limit="1" :data="form.file_path" type="file_path" listType="" :url="'/files/imgpath/upload'" @upload="uploadSuccess"></upload>
+            </el-form-item>
+            <el-form-item>
+              <el-button type="primary" @click="onSubmit()">提交</el-button>
+            </el-form-item>
+          </el-form>
+        </el-col>
+      </el-col>
+    </el-row>
+  </div>
+</template>
+
+<script>
+import upload from '@/components/upload.vue';
+import { mapState, createNamespacedHelpers } from 'vuex';
+const { mapActions: place } = createNamespacedHelpers('place');
+const { mapActions: dock } = createNamespacedHelpers('dock');
+export default {
+  name: 'dockEdit',
+  props: {
+    dockid: null,
+  },
+  components: {
+    upload,
+  },
+  data: function() {
+    return {
+      form: {},
+      option: [],
+      options: [],
+    };
+  },
+  created() {
+    this.searcOption();
+    this.searchInfo();
+  },
+  methods: {
+    ...place({ palcequery: 'query', transactiondtetle: 'delete' }),
+    ...dock(['query', 'delete', 'update', 'fetch']),
+    async searchInfo() {
+      if (this.dockid) {
+        let res = await this.fetch(this.dockid);
+        if (this.$checkRes(res)) {
+          this.$set(this, `form`, res.data);
+        }
+      }
+    },
+    // 提交
+    async onSubmit() {
+      let res = await this.update(this.form);
+      if (this.$checkRes(res)) {
+        this.$message({
+          message: '修改信息成功',
+          type: 'success',
+        });
+        this.back();
+      }
+    },
+    // 返回
+    back() {
+      this.$emit('back');
+    },
+    async searcOption() {
+      let level = 1;
+      let res = await this.palcequery({ level });
+      this.$set(this, `option`, res.data);
+    },
+    async changeshenge(value) {
+      let level = 2;
+      let parent = value;
+      let res = await this.palcequery({ level, parent });
+      this.$set(this, `options`, res.data);
+    },
+    uploadSuccess({ type, data }) {
+      console.log(type, data);
+      this.$set(this.form, `${type}`, data.uri);
+    },
+  },
+  computed: {
+    ...mapState(['user']),
+    pageTitle() {
+      return `${this.$route.meta.title}`;
+    },
+  },
+  metaInfo() {
+    return { title: this.$route.meta.title };
+  },
+};
+</script>
+
+<style lang="less" scoped>
+.back {
+  text-align: right;
+  margin: 0 0 10px 0;
+}
+</style>

+ 109 - 0
src/views/adminCenter/dockInfo/parts/dockShare.vue

@@ -0,0 +1,109 @@
+<template>
+  <div id="dockShare">
+    <el-row>
+      <el-col :span="24">
+        <el-col :span="24" class="back">
+          <el-button type="primary" size="mini" @click="back()">返回</el-button>
+        </el-col>
+        <el-col :span="24" class="form">
+          <data-table :fields="fields" @delete="toDelete" :data="list" :opera="opera" @edit="toEdit" :total="total" @query="search" @share="share"></data-table>
+        </el-col>
+      </el-col>
+    </el-row>
+  </div>
+</template>
+
+<script>
+import { mapState, createNamespacedHelpers } from 'vuex';
+import dataTable from '@/components/data-table.vue';
+const { mapActions: apply } = createNamespacedHelpers('apply');
+const { mapActions: dock } = createNamespacedHelpers('dock');
+export default {
+  name: 'dockShare',
+  props: {
+    dockid: null,
+  },
+  components: {
+    dataTable,
+  },
+  data: function() {
+    return {
+      opera: [
+        {
+          label: '通过审核',
+          icon: 'el-icon-edit',
+          method: 'edit',
+        },
+
+        {
+          label: '审核拒绝',
+          icon: 'el-icon-share',
+          method: 'share',
+        },
+      ],
+      fields: [
+        { label: '用户名称', prop: 'user_name' },
+        { label: '买家/卖家', prop: 'buyer', format: i => (i == '0' ? '买家' : i == '1' ? '卖家' : '') },
+        { label: '联系人', prop: 'contact' },
+        { label: '联系人电话', prop: 'contact_tel' },
+        { label: '邮箱', prop: 'email' },
+        { label: '单位名称', prop: 'company' },
+        { label: '申请时间', prop: 'apply_time' },
+        { label: '申请状态', prop: 'status', format: i => (i == '0' ? '待审核' : i == '1' ? '已通过' : '已拒绝') },
+      ],
+      list: [],
+      total: 0,
+    };
+  },
+  created() {
+    this.search();
+  },
+  methods: {
+    ...apply(['query', 'delete', 'update']),
+    ...dock({ dockFetch: 'fetch' }),
+    async search() {
+      if (this.dockid) {
+        let res = await this.dockFetch(this.dockid);
+        if (this.$checkRes(res)) {
+          this.$set(this, `list`, res.data.apply);
+          this.$set(this, `total`, res.data.apply.length);
+        }
+      }
+    },
+    async toEdit({ data }) {
+      data.status = '1';
+      data.dock_id = this.dockid;
+      data.id = data._id;
+      let res = await this.update(data);
+      this.$checkRes(res, '通过审核', '添加失败');
+    },
+
+    async share({ data }) {
+      data.status = '2';
+      data.dock_id = this.dockid;
+      data.id = data._id;
+      let res = await this.update(data);
+      this.$checkRes(res, '审核拒绝', '添加失败');
+    },
+    // 返回
+    back() {
+      this.$emit('back');
+    },
+  },
+  computed: {
+    ...mapState(['user']),
+    pageTitle() {
+      return `${this.$route.meta.title}`;
+    },
+  },
+  metaInfo() {
+    return { title: this.$route.meta.title };
+  },
+};
+</script>
+<style lang="less" scoped>
+.back {
+  text-align: right;
+  margin: 0 0 10px 0;
+}
+</style>

+ 112 - 0
src/views/adminCenter/dockInfo/parts/dockStatus.vue

@@ -0,0 +1,112 @@
+<template>
+  <div id="dockStatus">
+    <el-row>
+      <el-col :span="24">
+        <el-col :span="24" class="back">
+          <el-button type="primary" size="mini" @click="back()">返回</el-button>
+        </el-col>
+        <el-col :span="24" class="form">
+          <el-form ref="form" :model="form" label-width="120px">
+            <el-form-item label="对接会标题">
+              <el-input v-model="form.title" :disabled="true"></el-input>
+            </el-form-item>
+            <el-form-item label="开始时间">
+              <el-date-picker
+                :disabled="true"
+                v-model="form.start_time"
+                type="datetime"
+                placeholder="请选择开始时间"
+                format="yyyy-MM-dd HH:mm"
+                value-format="yyyy-MM-dd HH:mm"
+              >
+              </el-date-picker>
+            </el-form-item>
+            <el-form-item label="报名截止时间">
+              <el-date-picker
+                :disabled="true"
+                v-model="form.join_end"
+                type="datetime"
+                placeholder="请选择报名截止时间"
+                format="yyyy-MM-dd HH:mm"
+                value-format="yyyy-MM-dd HH:mm"
+              >
+              </el-date-picker>
+            </el-form-item>
+            <el-form-item label="简介">
+              <el-input type="textarea" v-model="form.desc" :disabled="true"></el-input>
+            </el-form-item>
+
+            <el-form-item label="状态" :disabled="true">
+              <el-radio v-model="form.status" label="1">开始</el-radio>
+              <el-radio v-model="form.status" label="2">结束</el-radio>
+            </el-form-item>
+            <el-form-item>
+              <el-button type="primary" @click="onSubmit()">提交</el-button>
+            </el-form-item>
+          </el-form>
+        </el-col>
+      </el-col>
+    </el-row>
+  </div>
+</template>
+
+<script>
+import { mapState, createNamespacedHelpers } from 'vuex';
+const { mapActions: dock } = createNamespacedHelpers('dock');
+export default {
+  name: 'dockStatus',
+  props: {
+    dockid: null,
+  },
+  components: {},
+  data: function() {
+    return {
+      form: {},
+    };
+  },
+  created() {
+    this.search();
+  },
+  methods: {
+    ...dock({ dockFetch: 'fetch', dockUpdate: 'update' }),
+    async search() {
+      if (this.dockid) {
+        let res = await this.dockFetch(this.dockid);
+        if (this.$checkRes(res)) {
+          this.$set(this, `form`, res.data);
+        }
+      }
+    },
+    async onSubmit() {
+      let res = await this.dockUpdate(this.form);
+      if (this.$checkRes(res)) {
+        this.$message({
+          message: '对接会审核成功',
+          type: 'success',
+        });
+        this.back();
+      }
+    },
+    // 返回
+    back() {
+      this.$emit('back');
+    },
+  },
+  computed: {
+    ...mapState(['user']),
+    pageTitle() {
+      return `${this.$route.meta.title}`;
+    },
+  },
+  metaInfo() {
+    return { title: this.$route.meta.title };
+  },
+};
+</script>
+
+<style lang="less" scoped>
+.back {
+  text-align: right;
+  margin: 0 0 10px 0;
+}
+</style>