فهرست منبع

Merge branch 'product' of http://1.116.113.26:8088/zhuliu/xiaoshi_system into product

zhuhao 1 سال پیش
والد
کامیت
6dddf14fd5

+ 5 - 0
src/api/newApi/file.js

@@ -0,0 +1,5 @@
+import axios from "@/utils/axios";
+// 新系统事件新接口
+export default {
+  
+};

+ 13 - 1
src/assets/css/main.scss

@@ -1,12 +1,24 @@
+
 //弹窗
-.el-dialog{
+.el-dialog__wrapper{
+  display: flex;
+  align-items: center;
+  .el-dialog{
+    margin: auto !important;
     .el-dialog__title{
       font-family: var(--fm) !important;
       color: var(--color1) !important;
       font-weight: bold !important;
       font-size: 20px !important;
     }
+    .el-dialog__body{
+      padding-top: 15px;
+      max-height: calc(100vh - 220px) !important;
+      overflow: auto;
+    }
   }
+}
+
   //抽屉
   .el-drawer{
     #el-drawer__title span{

+ 43 - 0
src/utils/model/imageViewer/dom.js

@@ -0,0 +1,43 @@
+/* istanbul ignore next */
+
+import Vue from 'vue';
+
+const isServer = Vue.prototype.$isServer;
+const SPECIAL_CHARS_REGEXP = /([:\-_]+(.))/g;
+const MOZ_HACK_REGEXP = /^moz([A-Z])/;
+const ieVersion = isServer ? 0 : Number(document.documentMode);
+
+/* istanbul ignore next */
+export const on = (function () {
+  if (!isServer && document.addEventListener) {
+    return function (element, event, handler) {
+      if (element && event && handler) {
+        element.addEventListener(event, handler, false);
+      }
+    };
+  } else {
+    return function (element, event, handler) {
+      if (element && event && handler) {
+        element.attachEvent('on' + event, handler);
+      }
+    };
+  }
+})();
+
+/* istanbul ignore next */
+export const off = (function () {
+  if (!isServer && document.removeEventListener) {
+    return function (element, event, handler) {
+      if (element && event) {
+        element.removeEventListener(event, handler, false);
+      }
+    };
+  } else {
+    return function (element, event, handler) {
+      if (element && event) {
+        element.detachEvent('on' + event, handler);
+      }
+    };
+  }
+})();
+

+ 450 - 0
src/utils/model/imageViewer/index.vue

@@ -0,0 +1,450 @@
+<template>
+    <transition name="viewer-fade">
+      <div class="el-image-viewer__wrapper" :style="{ 'z-index': zIndex }">
+        <div class="el-image-viewer__mask"></div>
+        <!-- CLOSE -->
+        <span class="el-image-viewer__btn el-image-viewer__close" @click="hide">
+          <i class="el-icon-circle-close"></i>
+        </span>
+        <!-- ARROW -->
+        <template v-if="!isSingle">
+          <span class="el-image-viewer__btn el-image-viewer__prev" :class="{ 'is-disabled': !infinite && isFirst }" @click="prev">
+            <i class="el-icon-arrow-left" />
+          </span>
+          <span class="el-image-viewer__btn el-image-viewer__next" :class="{ 'is-disabled': !infinite && isLast }" @click="next">
+            <i class="el-icon-arrow-right" />
+          </span>
+        </template>
+        <!-- ACTIONS -->
+        <div class="el-image-viewer__btn el-image-viewer__actions">
+          <div class="el-image-viewer__actions__inner">
+            <i class="el-icon-zoom-out" style="margin-right: 10px;" @click="handleActions('zoomOut')"></i>
+            <i class="el-icon-zoom-in" style="margin-right: 10px;" @click="handleActions('zoomIn')"></i>
+            <i class="el-icon-refresh" @click="handleActions('clocelise')"></i>
+            <i class="el-image-viewer__actions__divider"></i>
+            <i :class="mode.icon" @click="toggleMode"></i>
+            <i class="el-image-viewer__actions__divider"></i>
+            <i class="el-icon-refresh-left" @click="handleActions('anticlocelise')"></i>
+            <i class="el-icon-refresh-right" @click="handleActions('clocelise')"></i>
+          </div>
+        </div>
+        <!-- CANVAS -->
+        <div class="el-image-viewer__canvas">
+          <div v-for="(url, i) in urlList" v-if="i === index">
+          
+            <img ref="img" class="el-image-viewer__img" :key="url" :src="currentImg" :style="imgStyle" @load="handleImgLoad" @error="handleImgError" @mousedown="handleMouseDown">
+          </div>
+        </div>
+      </div>
+    </transition>
+</template>
+  
+<script>
+  import { on, off } from './dom';
+  import { rafThrottle, isFirefox } from './util';
+  
+  const Mode = {
+    CONTAIN: {
+      name: 'contain',
+      icon: 'el-icon-full-screen'
+    },
+    ORIGINAL: {
+      name: 'original',
+      icon: 'el-icon-c-scale-to-original'
+    }
+  };
+  const mousewheelEventName = isFirefox() ? 'DOMMouseScroll' : 'mousewheel';
+  export default {
+    name: 'elImageViewer',
+    props: {
+      urlList: {
+        type: Array,
+        default: () => []
+      },
+      zIndex: {
+        type: Number,
+        default: 2300
+      },
+      onSwitch: {
+        type: Function,
+        default: () => { }
+      },
+      onClose: {
+        type: Function,
+        default: () => { }
+      }
+    },
+    data () {
+      return {
+        index: 0,
+        isShow: false,
+        infinite: true,
+        loading: false,
+        mode: Mode.CONTAIN,
+        transform: {
+          scale: 1,
+          deg: 0,
+          offsetX: 0,
+          offsetY: 0,
+          enableTransition: false
+        }
+      };
+    },
+    components: {
+    },
+    computed: {
+      isSingle () {
+        return this.urlList.length <= 1;
+      },
+      isFirst () {
+        return this.index === 0;
+      },
+      isLast () {
+        return this.index === this.urlList.length - 1;
+      },
+
+      currentImg () {
+        return this.urlList[this.index]
+      },
+
+      imgStyle () {
+        const { scale, deg, offsetX, offsetY, enableTransition } = this.transform;
+        const style = {
+          transform: `scale(${scale}) rotate(${deg}deg)`,
+          transition: enableTransition ? 'transform .3s' : '',
+          'margin-left': `${offsetX}px`,
+          'margin-top': `${offsetY}px`
+        };
+        if (this.mode === Mode.CONTAIN) {
+          style.maxWidth = style.maxHeight = '100%';
+        }
+        return style;
+      }
+    },
+    watch: {
+      index: {
+        handler: function (val) {
+          this.reset();
+          this.onSwitch(val);
+        }
+      },
+      currentImg (val) {
+        this.$nextTick(_ => {
+          const $img = this.$refs.img[0];
+          if (!$img.complete) {
+            this.loading = true;
+          }
+        });
+      }
+    },
+    methods: {
+      hide () {
+        this.deviceSupportUninstall();
+        this.onClose();
+      },
+      deviceSupportInstall () {
+        this._keyDownHandler = rafThrottle(e => {
+          const keyCode = e.keyCode;
+          switch (keyCode) {
+            // ESC
+            case 27:
+              this.hide();
+              break;
+            // SPACE
+            case 32:
+              this.toggleMode();
+              break;
+            // LEFT_ARROW
+            case 37:
+              this.prev();
+              break;
+            // UP_ARROW
+            case 38:
+              this.handleActions('zoomIn');
+              break;
+            // RIGHT_ARROW
+            case 39:
+              this.next();
+              break;
+            // DOWN_ARROW
+            case 40:
+              this.handleActions('zoomOut');
+              break;
+          }
+        });
+        this._mouseWheelHandler = rafThrottle(e => {
+          const delta = e.wheelDelta ? e.wheelDelta : -e.detail;
+          if (delta > 0) {
+            this.handleActions('zoomIn', {
+              zoomRate: 0.015,
+              enableTransition: false
+            });
+          } else {
+            this.handleActions('zoomOut', {
+              zoomRate: 0.015,
+              enableTransition: false
+            });
+          }
+        });
+        on(document, 'keydown', this._keyDownHandler);
+        on(document, mousewheelEventName, this._mouseWheelHandler);
+      },
+      deviceSupportUninstall () {
+        off(document, 'keydown', this._keyDownHandler);
+        off(document, mousewheelEventName, this._mouseWheelHandler);
+        this._keyDownHandler = null;
+        this._mouseWheelHandler = null;
+      },
+      handleImgLoad (e) {
+        this.loading = false;
+      },
+      handleImgError (e) {
+        this.loading = false;
+        e.target.alt = '加载失败';
+      },
+      handleMouseDown (e) {
+        if (this.loading || e.button !== 0) return;
+        const { offsetX, offsetY } = this.transform;
+        const startX = e.pageX;
+        const startY = e.pageY;
+        this._dragHandler = rafThrottle(ev => {
+          this.transform.offsetX = offsetX + ev.pageX - startX;
+          this.transform.offsetY = offsetY + ev.pageY - startY;
+        });
+        on(document, 'mousemove', this._dragHandler);
+        on(document, 'mouseup', ev => {
+          off(document, 'mousemove', this._dragHandler);
+        });
+        e.preventDefault();
+      },
+      reset () {
+        this.transform = {
+          scale: 1,
+          deg: 0,
+          offsetX: 0,
+          offsetY: 0,
+          enableTransition: false
+        };
+      },
+      toggleMode () {
+        if (this.loading) return;
+        const modeNames = Object.keys(Mode);
+        const modeValues = Object.values(Mode);
+        const index = modeValues.indexOf(this.mode);
+        const nextIndex = (index + 1) % modeNames.length;
+        this.mode = Mode[modeNames[nextIndex]];
+        this.reset();
+      },
+      prev () {
+        if (this.isFirst && !this.infinite) return;
+        const len = this.urlList.length;
+        this.index = (this.index - 1 + len) % len;
+      },
+      next () {
+        if (this.isLast && !this.infinite) return;
+        const len = this.urlList.length;
+        this.index = (this.index + 1) % len;
+      },
+      handleActions (action, options = {}) {
+        if (this.loading) return;
+        const { zoomRate, rotateDeg, enableTransition } = {
+          zoomRate: 0.2,
+          rotateDeg: 90,
+          enableTransition: true,
+          ...options
+        };
+        const { transform } = this;
+        switch (action) {
+          case 'zoomOut':
+            if (transform.scale > 0.2) {
+              transform.scale = parseFloat((transform.scale - zoomRate).toFixed(3));
+            }
+            break;
+          case 'zoomIn':
+            transform.scale = parseFloat((transform.scale + zoomRate).toFixed(3));
+            break;
+          case 'clocelise':
+            transform.deg += rotateDeg;
+            break;
+          case 'anticlocelise':
+            transform.deg -= rotateDeg;
+            break;
+        }
+        transform.enableTransition = enableTransition;
+      }
+    },
+    mounted () {
+      this.deviceSupportInstall();
+    }
+  };
+  </script>
+  <style  scoped>
+  .el-image__error,
+  .el-image__inner,
+  .el-image__placeholder {
+    width: 100%;
+    height: 100%;
+  }
+  
+  .el-image {
+    position: relative;
+    display: inline-block;
+    overflow: hidden;
+  }
+  
+  .el-image__inner {
+    vertical-align: top;
+  }
+  
+  .el-image__inner--center {
+    position: relative;
+    top: 50%;
+    left: 50%;
+    transform: translate(-50%, -50%);
+    display: block;
+  }
+  
+  .el-image__error,
+  .el-image__placeholder {
+    background: #f5f7fa;
+  }
+  
+  .el-image__error {
+    display: flex;
+    justify-content: center;
+    align-items: center;
+    font-size: 14px;
+    color: #c0c4cc;
+    vertical-align: middle;
+  }
+  
+  .el-image__preview {
+    cursor: pointer;
+  }
+  
+  .el-image-viewer__wrapper {
+    
+    position: fixed;
+    top: 0;
+    right: 0;
+    bottom: 0;
+    left: 0;
+  }
+  
+  .el-image-viewer__btn {
+    position: absolute;
+    z-index: 1;
+    display: flex;
+    align-items: center;
+    justify-content: center;
+    border-radius: 50%;
+    opacity: 0.8;
+    cursor: pointer;
+    box-sizing: border-box;
+    user-select: none;
+  }
+  
+  .el-image-viewer__close {
+    top: 40px;
+    right: 40px;
+    width: 40px;
+    height: 40px;
+    font-size: 40px;
+  }
+  
+  .el-image-viewer__canvas {
+    width: 100%;
+    height: 100%;
+    display: flex;
+    justify-content: center;
+    align-items: center;
+  }
+  
+  .el-image-viewer__actions {
+    left: 50%;
+    bottom: 30px;
+    transform: translateX(-50%);
+    width: 100px;
+    height: 44px;
+    padding: 0 23px;
+    background-color: #606266;
+    border-color: #fff;
+    border-radius: 22px;
+  }
+  
+  .el-image-viewer__actions__inner {
+    width: 100%;
+    height: 100%;
+    text-align: justify;
+    cursor: default;
+    font-size: 23px;
+    color: #fff;
+    display: flex;
+    align-items: center;
+    justify-content: space-around;
+  }
+  
+  .el-image-viewer__prev {
+    left: 40px;
+  }
+  
+  .el-image-viewer__next,
+  .el-image-viewer__prev {
+    top: 50%;
+    transform: translateY(-50%);
+    width: 44px;
+    height: 44px;
+    font-size: 24px;
+    color: #fff;
+    background-color: #606266;
+    border-color: #fff;
+  }
+  
+  .el-image-viewer__next {
+    right: 40px;
+    text-indent: 2px;
+  }
+  
+  .el-image-viewer__mask {
+    position: absolute;
+    width: 100%;
+    height: 100%;
+    top: 0;
+    left: 0;
+    opacity: 0.5;
+    background: #000;
+  }
+  
+  .viewer-fade-enter-active {
+    animation: viewer-fade-in 0.3s;
+  }
+  
+  .viewer-fade-leave-active {
+    animation: viewer-fade-out 0.3s;
+  }
+  
+  @keyframes viewer-fade-in {
+    0% {
+      transform: translate3d(0, -20px, 0);
+      opacity: 0;
+    }
+  
+    to {
+      transform: translateZ(0);
+      opacity: 1;
+    }
+  }
+  
+  @keyframes viewer-fade-out {
+    0% {
+      transform: translateZ(0);
+      opacity: 1;
+    }
+  
+    to {
+      transform: translate3d(0, -20px, 0);
+      opacity: 0;
+    }
+  }
+  </style>
+  

+ 8 - 0
src/utils/model/imageViewer/types.js

@@ -0,0 +1,8 @@
+export function isString(obj) {
+    return Object.prototype.toString.call(obj) === '[object String]';
+  }
+  export function isObject(obj) {
+    return Object.prototype.toString.call(obj) === '[object Object]';
+  }
+  
+  

+ 39 - 0
src/utils/model/imageViewer/util.js

@@ -0,0 +1,39 @@
+import Vue from 'vue';
+import {
+  isString,
+  isObject
+} from './types';
+
+const hasOwnProperty = Object.prototype.hasOwnProperty;
+
+export const isFirefox = function () {
+  return !Vue.prototype.$isServer && !!window.navigator.userAgent.match(/firefox/i);
+};
+
+export const autoprefixer = function (style) {
+  if (typeof style !== 'object') return style;
+  const rules = ['transform', 'transition', 'animation'];
+  const prefixes = ['ms-', 'webkit-'];
+  rules.forEach(rule => {
+    const value = style[rule];
+    if (rule && value) {
+      prefixes.forEach(prefix => {
+        style[prefix + rule] = value;
+      });
+    }
+  });
+  return style;
+};
+
+export function rafThrottle(fn) {
+  let locked = false;
+  return function (...args) {
+    if (locked) return;
+    locked = true;
+    window.requestAnimationFrame(_ => {
+      fn.apply(this, args);
+      locked = false;
+    });
+  };
+}
+

+ 5 - 1
src/utils/model/index.js

@@ -13,6 +13,8 @@ import myTimeChoose from './time/timeIndex.vue';
 import myContextMenu from './contextMenu/index.vue';
 import mySelectTree from './selectTree/index'
 import myCard from './card/index'
+import myImageViewer from './imageViewer/index'
+import myUpload from './upload/index'
 
 var models = {
   myCustomSvg,
@@ -28,7 +30,9 @@ var models = {
 
   myContextMenu,
   mySelectTree,
-  myCard
+  myCard,
+  myImageViewer,
+  myUpload
 }
 export default {
   install(Vue) {

+ 5 - 8
src/utils/model/route.vue

@@ -1,17 +1,14 @@
 <template>
   <div>
-    <el-table :data="tableData" v-el-table-infinite-scroll="load" height="300px">
-      <el-table-column prop="date" label="日期" width="180"></el-table-column>
-      <el-table-column prop="name" label="姓名" width="180"></el-table-column>
-      <el-table-column prop="address" label="地址"></el-table-column>
-    </el-table>
-
-    <el-alert v-if="isflag" title="正在努力加载中..." type="success" center :closable="false" show-icon></el-alert>
-    <el-alert v-if="isMore" title="没有更多啦!" type="warning" center show-icon></el-alert>
+    <upload style="height: 200px;width:100%;" :fileList="tableData"></upload>
   </div>
 </template>
 <script>
+import upload from './upload/index.vue'
 export default {
+  components:{
+    upload
+  },
   data() {
     return {
       isflag: false,

+ 216 - 0
src/utils/model/upload/index.vue

@@ -0,0 +1,216 @@
+<template>
+  <div class="myUpload">
+    <div class="myUpload1">
+      <div class="myDemo">
+        <el-upload
+          class="upload-demo"
+          :drag="drag"
+          :action="action"
+          :multiple="multiple"
+          :data="data"
+          :name="name"
+          :show-file-list="showFileList"
+          :accept="accept"
+          :list-type="listType"
+          :auto-upload="autoUpload"
+          :disabled="disabled"
+          :limit="limit"
+          :on-preview="onPreview"
+          :on-remove="onRemove"
+          :on-success="onSuccess"
+          :on-error="onError"
+          :on-progress="onProgress"
+          :on-change="onChange"
+          :on-exceed="onExceed"
+          style="width: 100%"
+        >
+          <i class="el-icon-upload"></i>
+          <div class="el-upload__text">将文件拖到此处,或<em>点击上传</em></div>
+        </el-upload>
+      </div>
+      <div class="line" v-if="fileList.length>0"></div>
+      <div class="fileList" v-if="fileList.length>0">
+        <ul>
+          <li v-for="item in fileList" :key="item.id">
+            <div><i class="el-icon-document" style="margin-right:10px"></i><span class="name" @click="checkFiles(item)">{{ item.name }}</span></div>
+            <div class="type">{{ item.id?'已上传':'待上传' }}</div>
+            <div class="icon" @click="onRemove(item,fileList)"><i class="el-icon-close"></i></div>
+          </li>
+        </ul>
+      </div>
+    </div>
+  </div>
+</template>
+
+<script>
+export default {
+  components: {},
+  props: {
+    action:{
+        type:String,
+        default:''
+    },
+    multiple:{
+        type:Boolean
+    },
+    data:{
+        type:Object
+    },
+    name:{
+        type:String,
+        default:''
+    },
+    showFileList:{
+        type:Boolean
+    },
+    drag:{
+        type:Boolean,
+        default:true
+    },
+    accept:{
+        type:String,
+        default:''
+    },
+    listType:{
+        type:String,
+        default:'text'
+    },
+    autoUpload:{
+        type:Boolean,
+        default:true
+    },
+    fileList:{
+        type:Array,
+        default:()=>{
+            return []
+        }
+    },
+    disabled:{
+        type:Boolean,
+        default:false
+    },
+    limit:{
+        type:Number,
+    }
+  },
+  data() {
+    return {};
+  },
+  watch: {},
+  computed: {},
+  created() {},
+  mounted() {},
+  methods: {
+    onPreview(file){
+        this.$emit('on-preview',file)
+    },
+    onRemove(){
+        this.$emit('on-preview',file,fileList)
+    },
+    onSuccess(response,file,fileList){
+        this.$emit('on-preview',response,file,fileList)
+    },
+    onError(err,file,fileList){
+        this.$emit('on-preview',err,file,fileList)
+    },
+    onProgress(event,file,fileList){
+        this.$emit('on-preview',event,file,fileList)
+    },
+    onChange(file,fileList){
+        console.log(file)
+        this.$emit('on-preview',file,fileList)
+    },
+    onExceed(file,fileList){
+        this.$emit('on-preview',file,fileList)
+    },
+    //查看图片
+    checkFiles(file){
+
+    }
+  },
+};
+</script>
+<style lang="scss">
+.myUpload1 {
+  .el-upload {
+    width: 100%;
+    height: 100%;
+    .el-upload-dragger {
+      width: 100% !important;
+      height: 100%;
+      border: none;
+      border-radius: 0px;
+    }
+    .el-upload-dragger:hover {
+      border: none;
+    }
+  }
+  .el-upload-list {
+    display: none;
+  }
+}
+</style>
+<style lang="scss" scoped>
+.myUpload{
+    width: calc(100% - 0px);
+    height: 100%;
+    padding: 5px;
+}
+.myUpload1 {
+    width: calc(100% - 20px);
+    height: 100%;
+  padding: 5px;
+  display: flex;
+  align-items: center;
+  background: white;
+  border: 1px dashed var(--bg);
+  border-radius: 10px;
+  .myDemo {
+    width: 100%;
+    height: 100%;
+    flex: 1;
+  }
+  .line {
+    width: 1px;
+    height: 100%;
+    background: var(--bg);
+  }
+  .fileList {
+    width: 100%;
+    height: 100%;
+    overflow-y: auto;
+    flex: 2;
+    ul {
+      list-style-type: none;
+      padding: 0 10px;
+      li{
+        padding:5px 10px;
+        border-radius: 5px;
+        display: flex;
+        justify-content: space-between;
+        .type{
+            display: block;
+            color: #57a5f7;
+        }
+        .icon{
+            display: none;
+        }
+      }
+      li:hover{
+        background: #f4f4f4;
+        .name{
+           color: #57a5f7; 
+           cursor: pointer;
+        }
+        .type{
+            display: none;
+        }
+        .icon{
+            display: block;
+            cursor: pointer;
+        }
+      }
+    }
+  }
+}
+</style>

+ 116 - 103
src/views/components/dialog/ClientTable.vue

@@ -1,83 +1,97 @@
 <template>
-  <div class="admin-department">
+  <div class="admin-department" style="height:calc(100vh - 230px)">
+    <el-container>
+      <el-header>
+        <el-form :inline="true">
+          <el-form-item label="人员名称">
+            <el-input
+              v-model="queryParams.name"
+              size="small"
+              placeholder="请输入"
+            ></el-input>
+          </el-form-item>
+          <el-form-item>
+            <el-button type="" size="small" @click="getList">查询</el-button>
+            <el-button type="primary" size="small" @click="submit"
+              >保存</el-button
+            >
+          </el-form-item>
+        </el-form>
+      </el-header>
+      <el-main>
+		<div class="height_100">
+			<el-table
+          :data="tableData"
+          v-loading="loading"
+          style="width: 100%"
+          v-if="showTable"
+        >
+          <el-table-column width="55" align="center">
+            <template slot-scope="scope">
+              <div>
+                <el-checkbox
+                  :checked="personIds.indexOf(scope.row.id) != -1"
+                  @change="getCheck(scope.row)"
+                  v-if="showCheck"
+                ></el-checkbox>
+              </div>
+            </template>
+          </el-table-column>
+          <el-table-column
+            prop="name"
+            label="人员名称"
+            align="center"
+            show-overflow-tooltip
+          ></el-table-column>
+          <el-table-column
+            label="Email"
+            prop="email"
+            align="center"
+            show-overflow-tooltip
+          >
+          </el-table-column>
+          <el-table-column
+            prop="mobile"
+            label="手机号码"
+            align="center"
+            show-overflow-tooltip
+          ></el-table-column>
+          <el-table-column
+            prop="personnelDescription"
+            label="描述"
+            align="center"
+            show-overflow-tooltip
+          ></el-table-column>
+        </el-table>
+		</div>
+        
+      </el-main>
+      <el-footer class="pagination">
+			<el-pagination
+				:current-page.sync="queryParams.current"
+				:page-size="queryParams.size"
+				:total="total"
+				@current-change="handleCurrentChange"
+				layout="total, prev, pager, next, jumper"
+				background
+			></el-pagination>
+	  </el-footer>
+    </el-container>
 
-
-    <el-form :inline="true">
-      <el-form-item label="人员名称">
-        <el-input
-          v-model="queryParams.name"
-          size="small"
-          placeholder="请输入"
-        ></el-input>
-      </el-form-item>
-      <el-form-item>
-        <el-button type="" size="small" @click="getList">查询</el-button>
-        <el-button type="primary" size="small" @click="submit">保存</el-button>
-      </el-form-item>
-    </el-form>
-    <el-table
-      :data="tableData"
-      v-loading="loading"
-      style="width: 100%"
-	  v-if="showTable"
-    >
-      <el-table-column width="55" align="center">
-		<template slot-scope="scope">
-			<div>
-				<el-checkbox :checked="personIds.indexOf(scope.row.id)!=-1" @change="getCheck(scope.row)" v-if="showCheck"></el-checkbox>
-			</div>
-		</template>
-		
-	  </el-table-column>
-      <el-table-column
-        prop="name"
-        label="人员名称"
-        align="center"
-        show-overflow-tooltip
-      ></el-table-column>
-      <el-table-column
-        label="Email"
-        prop="email"
-        align="center"
-        show-overflow-tooltip
-      >
-      </el-table-column>
-      <el-table-column
-        prop="mobile"
-        label="手机号码"
-        align="center"
-        show-overflow-tooltip
-      ></el-table-column>
-      <el-table-column
-        prop="personnelDescription"
-        label="描述"
-        align="center"
-        show-overflow-tooltip
-      ></el-table-column>
-    </el-table>
-    <div class="pagination">
-      <el-pagination
-        :current-page.sync="queryParams.current"
-        :page-size="queryParams.size"
-        :total="total"
-        @current-change="handleCurrentChange"
-        layout="total, prev, pager, next, jumper"
-        background
-      ></el-pagination>
-    </div>
+    
   </div>
 </template>
 
 <script>
 export default {
-	props:{
-		personIds:{
-			default:[]
-		},
-		persons:{
-			default:[]
-		},
-	},
+  props: {
+    personIds: {
+      default: [],
+    },
+    persons: {
+      default: [],
+    },
+  },
   data() {
     name: "ClientTable";
     return {
@@ -92,26 +106,23 @@ export default {
         current: 1,
         projectId: this.projectId,
       },
-	  
-	  showTable:true,
-	  showCheck:true
 
+      showTable: true,
+      showCheck: true,
     };
   },
   mounted() {
     this.getList();
-
   },
-watch:{
-	personIds(val){
-		this.showCheck = false
-		this.$nextTick(()=>{
-			this.showCheck = true
-		})
-	}
-},
-  computed: {
+  watch: {
+    personIds(val) {
+      this.showCheck = false;
+      this.$nextTick(() => {
+        this.showCheck = true;
+      });
+    },
   },
+  computed: {},
 
   methods: {
     getList() {
@@ -134,22 +145,24 @@ watch:{
       this.queryParams.current = val;
       this.getList();
     },
-	//保存
-	submit(){
-		this.$emit('getPersonIds',{personIds:this.personIds,persons:this.persons})
-
-	},
-	//选择
-	getCheck(row){
-		var index = this.personIds.indexOf(row.id)
-		if(index==-1){
-			this.personIds.push(row.id)
-			this.persons.push(row)
-		}else{
-			this.personIds.splice(index,1)
-			this.persons.splice(index,1)
-		}
-	}
+    //保存
+    submit() {
+      this.$emit("getPersonIds", {
+        personIds: this.personIds,
+        persons: this.persons,
+      });
+    },
+    //选择
+    getCheck(row) {
+      var index = this.personIds.indexOf(row.id);
+      if (index == -1) {
+        this.personIds.push(row.id);
+        this.persons.push(row);
+      } else {
+        this.personIds.splice(index, 1);
+        this.persons.splice(index, 1);
+      }
+    },
   },
 };
 </script>
@@ -157,7 +170,7 @@ watch:{
 <style lang="scss" scoped>
 .admin-department {
   border: 1px solid #eee;
-  padding: 20px;
+//   padding: 20px;
   // border-radius: 8px;
 }
 </style>

+ 3 - 1
src/views/components/dialog/person.vue

@@ -30,7 +30,9 @@ export default {
   watch: {},
   computed: {},
   created() {},
-  mounted() {},
+  mounted() {
+    
+  },
   methods: {
     //关闭弹窗
     handleClose(){

+ 3 - 0
src/views/event/components/dialog/addEvent.vue

@@ -38,6 +38,9 @@
               </el-option>
             </el-select>
           </el-form-item>
+          <el-form-item label="文件上传">
+            <myUpload :file-list="files" @on-change="onchange"></myUpload>
+          </el-form-item>
           <el-form-item label="事件描述" prop="description">
             <el-input type="textarea" :rows="2" v-model="formData[0].description" autocomplete="off" placeholder="请输入事件描述"
               ></el-input>

+ 161 - 17
src/views/product/components/dialog/addEditProduct.vue

@@ -10,15 +10,16 @@
             filterable
             remote
             reserve-keyword
-            placeholder="请输入关键词"
+            placeholder="请选择产品类别"
             v-SelectLazyLoading="lazyLoading"
             :remote-method="remoteMethod"
-            :loading="loading">
+            :loading="loading"
+            style="width:100%">
             <el-option
               v-for="item in productCategoryList"
-              :key="item.value"
-              :label="item.label"
-              :value="item.value">
+              :key="item.id"
+              :label="item.name"
+              :value="item.id">
             </el-option>
           </el-select>
         </el-form-item>
@@ -40,19 +41,36 @@
         <el-form-item label="参考许可费率" prop="licenseRate">
           <el-input v-model="form.licenseRate" placeholder="请输入参考许可费率(介于 0 ~ 1 之间)"></el-input>
         </el-form-item>
+        <el-form-item label="管理人" prop="rate">
+          <div class="manage">
+            <el-button size="small" @click="showDialog(2)">选择</el-button>
+            <div v-html="getNames(form.adminPersons)">
+
+            </div>
+          </div>
+        </el-form-item>
+        <el-form-item label="谁可以看" prop="rate">
+            <div  v-for="item in $constants.showType" :key="item.value" >
+              <div>
+                <el-radio :checked="item.value == form.showType" :label="item.value" v-model="form.showType" @input="changeShowType(item.value)">{{item.label}}</el-radio>
+              </div>
+              <div v-if="form.showType && item.value == form.showType && [0,1].indexOf(item.value)==-1" class="person" @click="showDialog(1)">
+                <p>选择朋友</p>
+                <p v-html="getNames(form.persons)">
+                </p>
+              </div>
+            </div>
+        </el-form-item>
         <el-form-item label="图片" prop="">
-          <el-upload ref="upload" action="#" :auto-upload="false" :on-change="handleChange" list-type="picture"
-            :show-file-list="false">
-            <span v-if="form.pictures && form.pictures.length > 0" class="avatar">
+          <el-upload ref="upload"  action="#" :auto-upload="false"  :on-change="handleChange"  list-type="picture" :show-file-list="false">
+            <span v-if="form.systemFileList&&form.systemFileList.length>0" class="avatar">
               <span class="deleteImg">
-                <span>
+                <span> 
                   <i class="el-icon-zoom-in" @click.stop="handlePictureCardPreview"></i>
                   <i class="el-icon-delete" @click.stop="handleRemove"></i>
                 </span>
               </span>
-              <el-image ref="image" style="width:100%;height: 100%;"
-                :src="form.pictures[0].id ? $p2 + form.pictures[0].url : form.pictures[0].url"
-                :preview-src-list="form.pictures ? form.pictures.map(item => { return item.id ? $p2 + item.url : item.url }) : []"></el-image>
+                <el-image ref="image" style="width:100%;height: 100%;" :src="form.systemFileList[0].id?$p2 + form.systemFileList[0].url:form.systemFileList[0].url" :preview-src-list="form.systemFileList?form.systemFileList.map(item=>{return item.id? $p2 + item.url:item.url}):[]"></el-image>
             </span>
             <i v-else class="el-icon-plus avatar-uploader-icon"></i>
           </el-upload>
@@ -66,12 +84,32 @@
         <el-button type="primary" @click="submit">确定</el-button>
       </div>
     </el-dialog>
+    <choose-person ref="choosePerson" @getPersonIds="getPersonIds"></choose-person>
   </div>
 </template>
 
 <script>
+import choosePerson from '@/views/components/dialog/person.vue'
 export default {
+  components:{
+    choosePerson
+  },
   data() {
+    const licenseRateRule = (rule , value ,callback)=>{
+      if(value){
+         if (!isNaN(value)) {
+          if (value>=0 && value<=1) {
+            callback()
+          } else {
+            callback(new Error('输入错误,参考许可费率介于0-1之间'))
+          }
+        } else {
+          callback(new Error('输入错误,参考许可费率介于0-1之间'))
+        }
+      }else{
+        callback()
+      }
+    }
     return {
       // 产品弹窗的title
       title: "",
@@ -83,6 +121,7 @@ export default {
       rules: {
         productCategoryId: [{ required: true, message: '请输入所属产品类别', trigger: 'blur' },],
         productName: [{ required: true, message: '请输入产品名称', trigger: 'blur' },],
+        licenseRate:[{ required: false, validator:licenseRateRule, trigger: 'blur' },],
       },
       //产品类别集合
       productCategoryList:[],
@@ -93,20 +132,37 @@ export default {
       },
       //是否懒加载
       isLazy:true,
+      loading:false,
+      //待上传的文件
+      file:[],
+      //选择类型是管理人还是谁都可以看
+      chooseType:1
     };
   },
-  mounted() { },
+  mounted() { 
+    this.getProductCategory();
+  },
   methods: {
     // 上传的change
-    handleChange(file, fileList) { },
+    handleChange(file,fileList){
+      this.$set(this.form,'systemFileList', [{url:file.url}])
+      this.file = [file.raw]
+    },
     // 点击已上传的文件
-    handlePictureCardPreview(file) { },
+    handlePictureCardPreview(file) {
+      this.$refs.image.showViewer = true
+     },
     // 文件列表移除文件
-    handleRemove(file) { },
+    handleRemove(file) {
+      this.file = []
+      this.form.systemFileList = []//直接清空适用于单张图片
+     },
     // 打开弹窗
     open(row) {
-      console.log(row);
       this.form = JSON.parse(JSON.stringify(row))
+      if(!this.form.showType && this.form.showType!=0){
+        this.form.showType=0
+      }
       if (this.form.id) {
         this.title = '编辑产品'
       } else {
@@ -187,6 +243,62 @@ export default {
         }
       }).catch(error=>{
       })
+    },
+     //切换谁可以看类型
+     changeShowType(val){
+      this.form.showType1 = this.form.showType
+      this.$set(this.form,'showType',val)
+      this.$set(this.form,'persons',[])
+      this.$set(this.form,'showPersonId',[])
+      if(this.form.showType == 2 || this.form.showType == 3){
+        this.showDialog(1)
+      }
+      
+    },
+    //打开人员弹窗
+    showDialog(type){
+      this.chooseType = type
+      if(type == 2){
+        this.$refs.choosePerson.open(this.form.adminIds,this.form.adminPersons)
+        return false
+      }
+      this.$refs.choosePerson.open(this.form.showPersonId,this.form.persons)
+    },
+    //获取人员信息
+    getPersonIds({personIds,persons}){
+      if(this.chooseType == 2){
+        if(personIds.length>0){
+          this.$set(this.form,'adminPersons',persons)
+          this.$set(this.form,'adminIds',personIds)
+        }else{
+          this.$set(this.form,'adminPersons',[])
+          this.$set(this.form,'adminIds',[])
+        }
+        return false
+      }
+      if(personIds.length>0){
+        this.$set(this.form,'persons',persons)
+        this.$set(this.form,'showPersonId',personIds)
+      }else{
+        if(this.form.showType == this.form.showType1){
+          this.$set(this.form,'showType',0)
+        }else{
+          this.$set(this.form,'showType',this.form.showType1)
+        }
+        
+        this.$set(this.form,'persons',[])
+        this.$set(this.form,'showPersonId',[])
+      }
+    },
+
+    getNames(row){
+      if(!row){
+        return ''
+      }
+      var arr = row.map(item=>{
+        return item.name
+      })
+      return arr.join('、')
     }
   },
 };
@@ -197,6 +309,38 @@ export default {
 }
 </style>
 <style lang="scss" scoped>
+.manage{
+  display: flex;
+  align-items: center;
+  height: 40px;
+  div{
+    width:100%;
+    padding-left:10px;
+    overflow: hidden;
+    white-space: nowrap;
+    text-overflow:ellipsis;
+  }
+}
+.person{
+  height:50px;
+  padding-left:30px;
+  cursor: pointer;
+  p{
+    margin:0;
+    height: 30px;
+    line-height: 30px;
+  }
+  p:first-child{
+    color: green;
+  }
+  p:last-child{
+    font-size: 12px;
+    overflow: hidden;
+    white-space: nowrap;
+    text-overflow:ellipsis;
+  }
+}
+
 .avatar-uploader-icon {
   background-color: #fbfdff;
   border: 1px dashed #c0ccda;

+ 26 - 9
src/views/product/components/index.vue

@@ -7,13 +7,13 @@
           </mySearch>
         </div>
         <div style="display: flex">
-          <div>
+          <!-- <div>
             <span>分组查询:</span>
             <el-select v-model="groupingValue" size="small" @change="changeGrouping" style="width: 120px">
               <el-option v-for="item in groupingOption" :key="item.value" :label="item.label" :value="item.value">
               </el-option>
             </el-select>
-          </div>
+          </div> -->
           <div style="margin:0 10px;">
             <el-dropdown trigger="click" split-button type="primary" size="small" >
               <span @click="handleCommand('0')">新增类别</span>
@@ -47,6 +47,7 @@
 
     <addEditCategory ref="addEditCategory" @getMessage="getMessage"></addEditCategory>
     <addEditProduct ref="addEditProduct"></addEditProduct>
+    <myImageViewer v-if="showImg" :on-close="closeViewer" :src="imgSrc"></myImageViewer>
   </div>
 </template>
 
@@ -109,6 +110,10 @@ export default {
       total: 0,
       // 产品类别数据
       tableData:[],
+      //展示图片
+      showImg:false,
+      //图片地址
+      imgSrc:'',
     }
   },
   mounted() {
@@ -123,7 +128,7 @@ export default {
   methods: {
     //获取检索字段以及分组字段
     async getColumn() {
-      let params = ['product','productCategory']
+      let params = ['productCategory']
       await this.$api.getParamsCommon(params).then(res => {
         if (res.code == 200) {
           // 显示栏位
@@ -132,15 +137,17 @@ export default {
           })
           // 分组字段
           let conditionDTOList= JSON.parse(JSON.stringify(res.data[0].conditionDTOList))
-          this.groupingOption = this.$commonJS.getField(conditionDTOList,(u)=> u.ifGroup == true,{
-            name: 'name',
-            value: 'value',
-          })
+          // this.groupingOption = this.$commonJS.getField(conditionDTOList,(u)=> u.ifGroup == true,{
+          //   name: 'name',
+          //   value: 'value',
+          // })
           // 搜索字段
           this.searchFiled = this.$commonJS.getField(conditionDTOList,(u)=> u.ifSearch == true ,{
             label: 'name',
             value: 'value',
             type:'type',
+          }).filter(item=>{
+            return item.value.indexOf('_id')==-1
           })
         }
       })
@@ -158,6 +165,7 @@ export default {
         case '1'://趋势图
           break;
         case '2'://预览图片
+          this.checkImage(row)
           break;
         case '3'://分类架构
           this.toFramework(row)
@@ -176,10 +184,19 @@ export default {
       let router = this.$router.resolve({
         path: '/frameworkIndex',
         query: {
-          row:JSON.stringify(row)
+          row: JSON.stringify(row)
         }
       })
-      window.open(router.href,'_blank')
+      window.open(router.href, '_blank')
+    },
+    //预览图片
+    checkImage(row){
+      this.imgSrc =  `http://192.168.1.14:8801/fileManager/downloadFile?fileId=${item.systemFileList[0].guid}`
+      this.showImg = true
+    },
+    //关闭预览图片
+    closeViewer(){
+      this.showImg = false
     },
     //获取删除的id
     deletes(row){

+ 1 - 2
src/views/product/components/view/productTable.vue

@@ -4,8 +4,7 @@
     <el-table :data="tableData" header-row-class-name="custom-table-header" 
       v-el-table-infinite-scroll="getList"
       :infinite-scroll-distance="10"
-      :infinite-scroll-disabled="disabled"
-      :height="row?300:auto">
+      :infinite-scroll-disabled="disabled">
       <el-table-column label="#" width="60" type="index" align="center">
         <template slot-scope="scope">
           <span>{{ (scope.$index + 1) }}</span>