Browse Source

'新上计划、工具管理、自动规则'

魏志佳 4 years ago
parent
commit
ea8f6631f4

+ 21 - 0
src/api/actor.js

@@ -32,6 +32,20 @@ export function actorPhotoDelete(parameter) {
       params: parameter
     })
 }
+export function actorListDelete(parameter) {
+    return axios({
+      url: "/ctop/actor/delete",
+      method: 'delete',
+      params: parameter
+    })
+}
+export function propListDelete(parameter) {
+    return axios({
+      url: "/ctop/prop/delete",
+      method: 'delete',
+      params: parameter
+    })
+}
 
 export function actorPhotoAdd(parameter) {
     return axios({
@@ -64,6 +78,13 @@ export function actorDetail(parameter) {
         params: parameter
     })
 }
+export function propDetail(parameter) {
+    return axios({
+        url: "/ctop/prop/detail",
+        method: 'get',
+        params: parameter
+    })
+}
 
 
 export function actorCommentList(parameter) {

+ 553 - 0
src/components/ctop/vm-card-prop.vue

@@ -0,0 +1,553 @@
+<style>
+.ping .ant-modal-content .ant-modal-footer {
+  display: none !important;
+}
+.ping .ant-list-item-content {
+  justify-content: space-between;
+  cursor: pointer;
+}
+.ping-list .detele {
+  display: none;
+}
+/* .ping-list:hover span {
+  display: block;
+} */
+li {
+  list-style-type: none;
+}
+</style>
+<style lang="scss" scoped>
+.actor-photo-list {
+  display: flex;
+  padding-left: 0;
+  li {
+    width: 25%;
+    margin: 10px;
+    position: relative;
+    height: 250px;
+    border: 1px solid #f2f2f2;
+    img,
+    video {
+      width: 100%;
+      margin-top: auto;
+      margin-bottom: auto;
+      top: 0;
+      bottom: 0;
+      position: absolute;
+      max-height: 250px;
+    }
+  }
+}
+</style>
+<template>
+  <div :class="[type === 'horizantal' ? 'vm-card-horizantal' : 'vm-card-vertical' , 'vm-panel']" style="border:1px solid black">
+    <div
+      class="card-img"
+      style="height:250px;border-bottom:1px solid #f2f2f2"
+      :style="{backgroundImage: img?'url(' +img+')':'url('+noImgUrl+')', backgroundSize:'contain', backgroundRepeat: 'no-repeat',backgroundPosition:'center center'}"
+    >
+      <!-- <img :src="img" alt="" height="250"> -->
+      <div v-if="editable && type == 'vertical'" class="control">
+        <span class="edit">
+          <a href="javascript:;">
+            <a-icon type="edit" @click="handleDetail(record)"></a-icon>
+          </a>
+        </span>
+        <span class="delete">
+          <a-icon type="message" @click="getComment"></a-icon>
+        </span>
+      </div>
+    </div>
+    <div class="card-desc panel-body">
+      <h2>{{ title }}</h2>
+      <p>{{ desc }}</p>
+      <a :href="detailUrl" @click="getDetail">详情 ></a>
+      <a :href="detailUrl" @click="deleteItemCard" style="float:right">删除 </a>
+    </div>
+    <a-modal title="评论" v-model="visible" class="ping">
+      <div>
+        <div style="height:300px;overflow:auto">
+          <a-list
+            v-if="comments.length"
+            :dataSource="comments"
+            :header="`${comments.length} ${comments.length > 1 ? 'replies' : 'reply'}`"
+            itemLayout="horizontal"
+          >
+            <a-list-item slot="renderItem" slot-scope="item, index" class="ping-list">
+              <a-comment
+                :author="item.createBy"
+                :avatar="item.avatar"
+                :content="item.comment"
+                :datetime="item.createTime"
+              ></a-comment>
+              <span class="detele" style="margin:20px;color:red;" @click="detele(item,index)">删除</span>
+            </a-list-item>
+          </a-list>
+          <div v-else style="height:300px;text-align:center;line-height:300px">暂无评论</div>
+        </div>
+        <a-comment>
+          <!-- <a-avatar
+            slot="avatar"
+            :src="loginInfo.value.avatar"
+            alt="Han Solo"
+          />-->
+          <img :src="loginInfo.value.avatar" alt slot="avatar" />
+          <div slot="content">
+            <a-form-item>
+              <a-textarea :rows="4" @change="handleChange" :value="value"></a-textarea>
+            </a-form-item>
+            <a-form-item>
+              <a-button
+                htmlType="submit"
+                :loading="submitting"
+                @click="handleSubmit"
+                type="primary"
+              >添加</a-button>
+            </a-form-item>
+          </div>
+        </a-comment>
+      </div>
+    </a-modal>
+
+    <a-modal title="详情" v-model="detail" class="ping" :width="800">
+      <a-tabs defaultActiveKey="1" @change="callback" v-model="indexDetail">
+        <a-tab-pane tab="演员信息" key="1">
+          <div style="display:flex;flex-direction:row;height:200px;">
+            <div
+              style="height:200px;width:30%;border:1px solid #f2f2f2;"
+              :style="{backgroundImage: img?'url(' +img+')':'url('+noImgUrl+')', backgroundSize:'contain', backgroundRepeat: 'no-repeat',backgroundPosition:'center center'}"
+            ></div>
+            <div style="flex:1;margin:15px">
+              <a-form :form="form">
+                <a-form-item label="姓名" :label-col="{ span: 5 }" :wrapper-col="{ span: 12 }">
+                  <span>{{form.name}}</span>
+                </a-form-item>
+                <a-form-item label="性别" :label-col="{ span: 5 }" :wrapper-col="{ span: 12 }">
+                  <span>{{form.sex==1?"男":"女"}}</span>
+                </a-form-item>
+                <a-form-item label="出生年月" :label-col="{ span: 5 }" :wrapper-col="{ span: 12 }">
+                  <span>{{form.birthday}}</span>
+                </a-form-item>
+              </a-form>
+            </div>
+          </div>
+          <div style="margin-top:20px">
+            <a-collapse accordion>
+              <a-collapse-panel header="个人信息" key="1">
+                <p>{{form.speciality}}</p>
+              </a-collapse-panel>
+            </a-collapse>
+          </div>
+        </a-tab-pane>
+        <a-tab-pane tab="演员图集" key="2" forceRender>
+          <div>
+            <a type="primary" style="margin-left:10px" @click="addPhoto=true">新增图集</a>
+            <ul class="actor-photo-list">
+              <li v-for="(item,index) of photoList" :key="index">
+                <a-icon
+                  type="close-circle"
+                  style="position:absolute;top:-5px;right:-5px;color:red;z-index:10;cursor: pointer;"
+                  @click="deteleImg(item.id)"
+                />
+                <img :src="item.photoUrl" alt />
+              </li>
+            </ul>
+          </div>
+          <div style="text-align:right">
+            <a-pagination
+              showQuickJumper
+              :total="total"
+              @change="pageChange"
+              :pageSize.sync="pageSize"
+            />
+          </div>
+        </a-tab-pane>
+        <a-tab-pane tab="演员作品" key="3">
+          <div>
+            <a type="primary" style="margin-left:10px" @click="addVideo=true">新增作品</a>
+            <ul class="actor-photo-list">
+              <li v-for="(item,index) of videoList" :key="index">
+                <a-icon
+                  type="close-circle"
+                  style="position:absolute;top:-5px;right:-5px;color:red;z-index:10;cursor: pointer;"
+                  @click="deteleVideo(item.id)"
+                />
+                <video
+                  class="video"
+                  :src="item.videoUrl"
+                  controls="controls"
+                  style="min-height:160px"
+                >您的浏览器不支持 video 标签。</video>
+              </li>
+            </ul>
+          </div>
+          <div style="text-align:right">
+            <a-pagination
+              showQuickJumper
+              :total="videoTotal"
+              @change="pageChange"
+              :pageSize.sync="pageSize"
+            />
+          </div>
+        </a-tab-pane>
+      </a-tabs>
+    </a-modal>
+    <!-- 新增图集 -->
+    <a-modal
+      v-model="addPhoto"
+      title="新增图集"
+      @ok="handleOk('photo')"
+      @cancel="handleCancel('photo')"
+    >
+    <uploadFile :value.sync="imageUrl" :fileCount="1" uploadType="image" :multiple="false" />
+      <!-- <upload-to-ali
+        style="margin:10px"
+        v-model="imageUrl"
+        :customDomain="customDomain"
+        preview
+        :region="region"
+        :bucket="bucket"
+        :accept="acceptImage"
+        :max="1"
+        :size="1024000"
+        :accessKeyId="accessKeyId"
+        :accessKeySecret="accessKeySecret"
+      ></upload-to-ali> -->
+    </a-modal>
+    <!-- 新增作品 -->
+    <a-modal
+      v-model="addVideo"
+      title="新增作品"
+      @ok="handleOk('video')"
+      @cancel="handleCancel('video')"
+    >
+    <uploadFile :value.sync="videoUrl" :fileCount="1" uploadType="video" :multiple="false" />
+      <!-- <upload-to-ali
+        style="margin:10px"
+        v-model="videoUrl"
+        :customDomain="customDomain"
+        preview
+        :region="region"
+        :bucket="bucket"
+        :accept="acceptVideo"
+        :max="1"
+        :size="1024000"
+        :accessKeyId="accessKeyId"
+        :accessKeySecret="accessKeySecret"
+      ></upload-to-ali> -->
+    </a-modal>
+    <actor-modal ref="modalForm" @ok="modalFormOk" @updateList="updateList" @close="closeVideo"></actor-modal>
+  </div>
+</template>
+<script>
+import moment from 'moment'
+import {
+  actorDetail,
+  actorCommentList,
+  actorCommentAdd,
+  actorCommentDetele,
+  actorPhotoList,
+  actorVideoList,
+  actorPhotoDelete,
+  actorVideoDelete,
+  actorPhotoAdd,
+  actorVideoAdd
+} from '@/api/actor'
+import actorModal from './ActorModal'
+import UploadToAli from '@femessage/upload-to-ali'
+  import uploadFile from '@/components/uploadFile.vue'
+import { JeecgListMixin } from '@/mixins/JeecgListMixin'
+import { closeAllVideoFun } from '@/utils/videoControl'
+export default {
+  name: 'VmCard',
+  mixins: [JeecgListMixin],
+  components: {
+    actorModal,
+    UploadToAli,
+    uploadFile
+  },
+  props: {
+    type: {
+      type: String,
+      default: 'vertical'
+    },
+    editable: {
+      type: Boolean,
+      default: false
+    },
+    title: {
+      type: String,
+      default: 'Title'
+    },
+    img: {
+      type: String,
+      default: require('@/assets/img/noImg.png')
+    },
+    desc: {
+      type: String,
+      default:
+        "Lorem Ipsum is simply dummy text of the printing and typesetting industry,Lorem Ipsum has been the industry's standard dummy text ever since the 1500s"
+    },
+    detailUrl: {
+      type: String,
+      default: '#'
+    },
+    editUrl: {
+      type: String,
+      default: '#'
+    },
+    deleteUrl: {
+      type: String,
+      default: '#'
+    },
+    id: {
+      default() {
+        return 0
+      }
+    },
+    record: {
+      default() {
+        return {}
+      }
+    }
+  },
+  data: function() {
+    return {
+      addPhoto: false,
+      addVideo: false,
+      indexDetail: '1',
+      to: null,
+      comments: [],
+      submitting: false,
+      value: '',
+      moment,
+      visible: false,
+      detail: false,
+      customDomain: '',
+      region: 'oss-cn-beijing',
+      bucket: 'ctop-media',
+      acceptVideo: 'video/mpeg,video/mp4',
+      acceptImage: 'image/jpeg,image/jpg,image/png',
+      accessKeyId: 'LTAIbNbqWzSOklQV',
+      accessKeySecret: '1rkPz7JNoXk8sJevPaeYHWqfkQXBGh',
+      form: {
+        name: '',
+        birthday: '',
+        sex: null,
+        speciality: ''
+      },
+      noImgUrl: require('@/assets/img/noImg.png'),
+      loginInfo: JSON.parse(localStorage.getItem('pro__Login_Userinfo')),
+      photoList: [],
+      imageUrl: '',
+      videoUrl: '',
+      total: 1,
+      videoTotal: 1,
+      pageSize: 4,
+      url: {
+        list: '/ctop/actor/list'
+      },
+      columns: [
+        {
+          title: 'ID',
+          align: 'center',
+          dataIndex: 'id'
+        },
+        {
+          title: '姓名',
+          align: 'center',
+          dataIndex: 'name'
+        },
+        {
+          title: '生日',
+          align: 'center',
+          dataIndex: 'birthday'
+        },
+        {
+          title: '性别',
+          align: 'center',
+          dataIndex: 'sex_dictText'
+        },
+        {
+          title: '特长',
+          align: 'center',
+          dataIndex: 'speciality'
+        },
+        {
+          title: '创建时间',
+          align: 'center',
+          dataIndex: 'createTime'
+        },
+        {
+          title: '操作',
+          dataIndex: 'action',
+          align: 'center',
+          scopedSlots: { customRender: 'action' }
+        }
+      ],
+      currentPage: 1,
+      videoList: []
+    }
+  },
+  methods: {
+    updateList() {
+      this.$emit('updateList')
+    },
+    pageChange: function(page) {
+      console.log(page)
+      this.currentPage = page
+      if (this.indexDetail == '2') {
+        this.getPhoto()
+      } else if (this.indexDetail == '3') {
+        this.getVideo()
+      }
+    },
+    handleSubmit() {
+      if (!this.value) {
+        return
+      }
+
+      this.submitting = true
+
+      actorCommentAdd({ actorId: this.id, comment: this.value }).then(res => {
+        this.submitting = false
+        if (res.code == 200) {
+          this.getComment()
+          this.value = ''
+        }
+      })
+      //   setTimeout(() => {}, 1000)
+    },
+    handleChange(e) {
+      this.value = e.target.value
+    },
+    // 删除
+    deleteItemCard(){
+      this.$emit('delete-ok', {id:this.id})
+    },
+    getDetail() {
+      this.indexDetail = '1'
+      this.detail = true
+      actorDetail({ actorId: this.id }).then(res => {
+        console.log(res)
+        if (res.code == 0) {
+          this.form.name = res.result.name
+          this.form.birthday = res.result.birthday
+          this.form.sex = res.result.sex
+          this.form.speciality = res.result.speciality
+        }
+      })
+    },
+    getComment() {
+      this.visible = true
+      this.comments = []
+      actorCommentList({ actorId: this.id }).then(res => {
+        if (res.code == 0) {
+          console.log(res)
+          this.comments = res.result.records.reverse()
+        }
+      })
+    },
+    detele(item, index) {
+      console.log(item, index)
+
+      actorCommentDetele({ id: item.id }).then(res => {
+        if (res.code == 200) {
+          this.comments.splice(index, 1)
+        }
+      })
+    },
+    closeVideo() {
+      closeAllVideoFun()
+    },
+    callback(key) {
+      console.log(key)
+      if (key == '2') {
+        this.closeVideo()
+        this.currentPage = 1
+        this.getPhoto()
+      } else if (key == '3') {
+        this.currentPage = 1
+        this.getVideo()
+      } else if (key == '1') {
+        this.closeVideo()
+      }
+    },
+    getPhoto() {
+      actorPhotoList({ pageNo: this.currentPage, pageSize: 4, actorId: this.id }).then(res => {
+        if (res.code == 0) {
+          console.log(res)
+          this.photoList = res.result.records
+          this.total = res.result.total
+        }
+      })
+    },
+    getVideo() {
+      actorVideoList({ pageNo: this.currentPage, pageSize: 4, actorId: this.id }).then(res => {
+        if (res.code == 0) {
+          console.log(res)
+          this.videoList = res.result.records
+          this.videoTotal = res.result.total
+        }
+      })
+    },
+    deteleImg(id) {
+      actorPhotoDelete({ id: id }).then(res => {
+        if (res.code == 200) {
+          console.log(res)
+          this.getPhoto()
+        }
+      })
+    },
+    deteleVideo(id) {
+      actorPhotoDelete({ id: id }).then(res => {
+        if (res.code == 200) {
+          console.log(res)
+          this.getPhoto()
+        }
+      })
+    },
+    handleOk(type) {
+      const that = this
+      if (type == 'photo') {
+        actorPhotoAdd({ actorId: that.id, photoUrl: that.imageUrl })
+          .then(res => {
+            if (res.success) {
+              this.getPhoto()
+              this.handleCancel('photo')
+            } else {
+              that.$message.warning(res.message)
+            }
+          })
+          .finally(() => {
+            that.confirmLoading = false
+            that.handleCancel('photo')
+          })
+      } else {
+        actorVideoAdd({ actorId: that.id, videoUrl: that.videoUrl })
+          .then(res => {
+            if (res.success) {
+              this.getVideo()
+              this.handleCancel('video')
+            } else {
+              that.$message.warning(res.message)
+            }
+          })
+          .finally(() => {
+            that.confirmLoading = false
+            that.handleCancel('video')
+          })
+      }
+    },
+    handleCancel(type) {
+      if (type == 'photo') {
+        this.imageUrl = ''
+        this.addPhoto = false
+      } else {
+        this.videoUrl = ''
+        this.addVideo = false
+      }
+    }
+  }
+}
+</script>

+ 59 - 5
src/components/ctop/vm-card.vue

@@ -62,6 +62,7 @@ li {
       <h2>{{ title }}</h2>
       <p>{{ desc }}</p>
       <a :href="detailUrl" @click="getDetail">详情 ></a>
+      <a :href="detailUrl" @click="deleteItemCard" style="float:right">删除 </a>
     </div>
     <a-modal title="评论" v-model="visible" class="ping">
       <div>
@@ -109,7 +110,8 @@ li {
     </a-modal>
 
     <a-modal title="详情" v-model="detail" class="ping" :width="800">
-      <a-tabs defaultActiveKey="1" @change="callback" v-model="indexDetail">
+    <!-- {{pageTitle}} -->
+      <a-tabs defaultActiveKey="1" @change="callback" v-model="indexDetail" v-if="pageTitle=='演员列表'">
         <a-tab-pane tab="演员信息" key="1">
           <div style="display:flex;flex-direction:row;height:200px;">
             <div
@@ -190,6 +192,27 @@ li {
           </div>
         </a-tab-pane>
       </a-tabs>
+      <div v-else>
+        <div style="display:flex;flex-direction:row;height:200px;">
+            <div
+              style="height:200px;width:30%;border:1px solid #f2f2f2;"
+              :style="{backgroundImage: img?'url(' +img+')':'url('+noImgUrl+')', backgroundSize:'contain', backgroundRepeat: 'no-repeat',backgroundPosition:'center center'}"
+            ></div>
+            <div style="flex:1;margin:15px">
+              <a-form :form="form">
+                <a-form-item label="道具名称" :label-col="{ span: 5 }" :wrapper-col="{ span: 12 }">
+                  <span>{{form.name}}</span>
+                </a-form-item>
+                <a-form-item label="道具类型" :label-col="{ span: 5 }" :wrapper-col="{ span: 12 }">
+                  <span>{{form.type|| '暂无类型'}}</span>
+                </a-form-item>
+                <a-form-item label="道具描述" :label-col="{ span: 5 }" :wrapper-col="{ span: 12 }">
+                  <span>{{form.decs|| '暂无描述'}}</span>
+                </a-form-item>
+              </a-form>
+            </div>
+          </div>
+      </div>
     </a-modal>
     <!-- 新增图集 -->
     <a-modal
@@ -250,7 +273,8 @@ import {
   actorPhotoDelete,
   actorVideoDelete,
   actorPhotoAdd,
-  actorVideoAdd
+  actorVideoAdd,
+  propDetail,
 } from '@/api/actor'
 import actorModal from './ActorModal'
 import UploadToAli from '@femessage/upload-to-ali'
@@ -278,6 +302,9 @@ export default {
       type: String,
       default: 'Title'
     },
+    pageTitle: {
+      type: String,
+    },
     img: {
       type: String,
       default: require('@/assets/img/noImg.png')
@@ -295,6 +322,10 @@ export default {
       type: String,
       default: '#'
     },
+    deleteUrl: {
+      type: String,
+      default: '#'
+    },
     id: {
       default() {
         return 0
@@ -329,7 +360,9 @@ export default {
         name: '',
         birthday: '',
         sex: null,
-        speciality: ''
+        speciality: '',
+        desc:'',
+        type:'',
       },
       noImgUrl: require('@/assets/img/noImg.png'),
       loginInfo: JSON.parse(localStorage.getItem('pro__Login_Userinfo')),
@@ -416,10 +449,15 @@ export default {
     handleChange(e) {
       this.value = e.target.value
     },
+    // 删除
+    deleteItemCard(){
+      this.$emit('delete-ok', {id:this.id})
+    },
     getDetail() {
       this.indexDetail = '1'
       this.detail = true
-      actorDetail({ actorId: this.id }).then(res => {
+      if(this.pageTitle=='演员列表'){
+        actorDetail({ actorId: this.id }).then(res => {
         console.log(res)
         if (res.code == 0) {
           this.form.name = res.result.name
@@ -428,6 +466,18 @@ export default {
           this.form.speciality = res.result.speciality
         }
       })
+      }else{
+        propDetail({ propId: this.id }).then(res => {
+            console.log(res)
+          if (res.code == 0) {
+            this.form.name = res.result.name
+            this.form.type = res.result.type
+            this.form.desc = res.result.desc
+            
+          }
+        })
+      }
+      
     },
     getComment() {
       this.visible = true
@@ -539,6 +589,10 @@ export default {
         this.addVideo = false
       }
     }
-  }
+  },
+
+  mounted() {
+    console.log(this.pageTitle)
+  },
 }
 </script>

+ 4 - 2
src/components/ctop/vm-image-list.vue

@@ -69,6 +69,7 @@
     </a-row>
     <a-row class="image-list" :gutter="16" style="padding:0 8px">
       <a-col :lg="6" :sm="12" class="vm-margin" v-for="(item, index) of dataShow" :key="index" style="padding:0">
+        
         <vm-card
           style="margin: 0 15px;"
           :editable="true"
@@ -76,7 +77,8 @@
           :img="item.coverUrl"
           :desc="item.speciality"
           :detailUrl="item.videoUrl"
-          :editUrl="item.editUrl"
+          :editUrl="item.editUrl"      
+          :pageTitle='title'   
           :id="item.id"
           :record="item"
           @delete-ok="deleteOk(item)"
@@ -106,7 +108,7 @@ export default {
   props: {
     title: {
       type: String,
-      default: '演员列表'
+      // default: '演员列表'
     },
     // origin data
     data: {

+ 1 - 1
src/views/modules/BatchCreate/TouTiaoBatch.vue

@@ -986,7 +986,7 @@ export default {
                                 pageSize:this.ipagination.pageSize,
                                 
                             })
-                            this.$message.success(res.message)
+                        this.$message.success(res.message)
                     }else{
                         this.$message.error(res.message)
                     }

+ 21 - 13
src/views/modules/Statistics/components/Treeselect.vue

@@ -57,6 +57,12 @@ export default {
         return true
       },
     },
+    appId: {
+      
+      default() {
+        return ''
+      },
+    },
     //判断媒体类型
     request: {
       type: String,
@@ -77,19 +83,21 @@ export default {
   },
   watch: {
     $route(n, o) {},
-    //   appId: {
-    //     handler(n, o) {
-    //       console.log(n)
-    //       if (n.length == 0) {
-    //         if (this.multiple) {
-    //           this.value = []
-    //         } else {
-    //           this.value = ''
-    //         }
-    //       }
-    //     },
-    //     deep: true
-    //   }
+      appId: {
+        handler(n, o) {
+          console.log(n)
+          if (n.length == 0) {
+            if (this.multiple) {
+              this.value = []
+            } else {
+              this.value = ''
+            }
+          }else{
+            this.value=this.appId
+          }
+        },
+        deep: true
+      }
   },
   methods: {
     ...mapGetters(['nickname', 'avatar', 'userInfo']),

+ 1 - 3
src/views/modules/Statistics/components/datePick.vue

@@ -163,9 +163,7 @@ export default {
       
     },
     disabledDate(current) {
-      // console.log(current)
-
-      return current && current > moment().subtract(1, 'day')
+        return current && current > moment()
     },
     openChange(open) {
       // console.log(open)

+ 2 - 2
src/views/modules/Statistics/mediaReport.vue

@@ -330,8 +330,8 @@
         if (this.advertiser == '' || this.advertiser == undefined) {
 
           this.project = undefined;
-		  this.projectArr = [];
-		  this.getPruduct()
+          this.projectArr = [];
+          this.getPruduct()
         } else {
           this.project = undefined;
           this.projectArr = [];

+ 283 - 42
src/views/modules/Statistics/newPlanStatic/newPlanStatic.vue

@@ -170,8 +170,8 @@
   <div class="newPlanStatic">
     <div class="tabbody">
       <a-tabs v-model="tabKey" @change="tabChange">
-        <a-tab-pane :key="1" tab="头条">        
-        </a-tab-pane>
+        <!-- <a-tab-pane :key="1" tab="头条">        
+        </a-tab-pane> -->
         <a-tab-pane :key="2" tab="快手">       
         </a-tab-pane>
       </a-tabs>
@@ -201,6 +201,7 @@
                 :maxTagCount='1'    
                 :tree-data="treeData"
                 :filterOption='filterOption'
+                :disabled='accountDisabled'
             >
              </a-tree-select>
 
@@ -213,16 +214,21 @@
               style="width: 200px"
               :filter-option="filterOption"
               @change="operateChange"
+              :disabled='operateDisabled'
+              allowClear
             >
-              <a-select-option v-for="item in operateList" :key="item.id" :value="item.id">
-                {{item.name}}
+              <a-select-option v-for="item in operateList" :key="item.user_id" :value="item.user_id">
+                {{item.user_name}}
               </a-select-option>
             </a-select> 
+            <a-button type='primary' style="position:absolute;right:20px" @click="search">查询</a-button>
         </div>
           <div class="time"  @click="opendate" >
             <datePick  :dateValue.sync='dateValue'   :type.sync='type'   />
+            
           </div>
           <!-- <p>对比</p> -->
+          
         </a-card>
       </a-col>
     </a-row>
@@ -230,8 +236,7 @@
       <div class="showNumBox">
           <a-col :sm="24" :md="10" :xl="10" :xxl="10">
             <span class="title">
-              新上
-              {{tabKey==1?'计划数':'推广组'}}
+              新上{{tabKey==1?'计划数':'推广组'}}
             </span>
             <div>
               <countTo
@@ -324,11 +329,11 @@ require('echarts/lib/component/legend')
 
 let TTcolumns=[
   {
-    title: '项目名称',
-    dataIndex: 'accountName',
-    scopedSlots: { customRender: 'accountName' },
+    title: '账户名称',
+    dataIndex: 'authName',
+    scopedSlots: { customRender: 'authName' },
     align: 'center',
-    key:'accountName'
+    key:'authName'
     
   },
   {
@@ -356,7 +361,7 @@ let TTcolumns=[
     
   },
   {
-    title: '时间周期',
+    title: '最近上新',
     dataIndex: 'statDate',
     scopedSlots: { customRender: 'statDate' },
     align: 'center',
@@ -364,13 +369,13 @@ let TTcolumns=[
     
   },
 ]
-let KScolumns=[
+let TTcolumnsVaild=[
   {
-    title: '项目名称',
-    dataIndex: 'accountName',
-    scopedSlots: { customRender: 'accountName' },
+    title: '账户名称',
+    dataIndex: 'authName',
+    scopedSlots: { customRender: 'authName' },
     align: 'center',
-    key:'accountName'
+    key:'authName'
     
   },
   {
@@ -390,7 +395,7 @@ let KScolumns=[
     
   },
   {
-    title: '上新推广组',
+    title: '有效计划数',
     dataIndex: 'newPlan',
     scopedSlots: { customRender: 'newPlan' },
     align: 'center',
@@ -398,7 +403,7 @@ let KScolumns=[
     
   },
   {
-    title: '时间周期',
+    title: '最近上新',
     dataIndex: 'statDate',
     scopedSlots: { customRender: 'statDate' },
     align: 'center',
@@ -408,6 +413,109 @@ let KScolumns=[
 ]
 
 
+let KScolumns=[
+  // {
+  //   title: '项目名称',
+  //   dataIndex: 'projectName',
+  //   scopedSlots: { customRender: 'projectName' },
+  //   align: 'center',
+  //   key:'projectName'
+    
+  // },
+  {
+    title: '账户名称',
+    dataIndex: 'authName',
+    scopedSlots: { customRender: 'authName' },
+    align: 'center',
+    key:'authName'
+    
+  },
+  {
+    title: '账户ID',
+    dataIndex: 'accountId',
+    scopedSlots: { customRender: 'accountId' },
+    align: 'center',
+    key:'accountId'
+    
+  },
+  {
+    title: '账户所属人',
+    dataIndex: 'userName',
+    scopedSlots: { customRender: 'userName' },
+    align: 'center',
+    key:'userName'
+    
+  },
+  {
+    title: '上新推广组',
+    dataIndex: 'new',
+    scopedSlots: { customRender: 'new' },
+    align: 'center',
+    key:'new'
+    
+  },
+  {
+    title: '最近上新',
+    dataIndex: 'maxCreateTime',
+    scopedSlots: { customRender: 'maxCreateTime' },
+    align: 'center',
+    key:'maxCreateTime'
+    
+  },
+]
+let KScolumnsVaild=[
+  // {
+  //   title: '项目名称',
+  //   dataIndex: 'projectName',
+  //   scopedSlots: { customRender: 'projectName' },
+  //   align: 'center',
+  //   key:'projectName'
+    
+  // },
+  {
+    title: '账户名称',
+    dataIndex: 'authName',
+    scopedSlots: { customRender: 'authName' },
+    align: 'center',
+    key:'authName'
+    
+  },
+  {
+    title: '账户ID',
+    dataIndex: 'accountId',
+    scopedSlots: { customRender: 'accountId' },
+    align: 'center',
+    key:'accountId'
+    
+  },
+  {
+    title: '账户所属人',
+    dataIndex: 'userName',
+    scopedSlots: { customRender: 'userName' },
+    align: 'center',
+    key:'userName'
+    
+  },
+  {
+    title: '有效推广组',
+    dataIndex: 'valid',
+    scopedSlots: { customRender: 'valid' },
+    align: 'center',
+    key:'valid'
+    
+  },
+  {
+    title: '最近上新',
+    dataIndex: 'maxCreateTime',
+    scopedSlots: { customRender: 'maxCreateTime' },
+    align: 'center',
+    key:'maxCreateTime'
+    
+  },
+]
+
+
+
 
 let sectionOption={
     backgroundColor: '#fff',
@@ -430,10 +538,10 @@ let sectionOption={
         top: '12%',
         containLabel: true
     },
-    xAxis: [
+    xAxis: 
         {
             type: 'category',
-            data: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'],
+            data: [],
             boundaryGap: false,
             // 坐标轴线
             axisLine: {
@@ -451,7 +559,7 @@ let sectionOption={
               }
             }
         }
-    ],
+    ,
     yAxis: [
         {
           type: 'value',
@@ -474,10 +582,11 @@ let sectionOption={
             name: '新上计划数',
             type: 'line',
             smooth: true,
-            data:  [820, 932, 901, 934, 1290, 1330, 1320],
+            data:  [],
             symbol: 'circle',
+            symbolSize :8,
             color: '#0bcd74',
-            symbolSize: 1,
+           
             lineStyle: {
               normal: {
                 width: 2,
@@ -485,7 +594,7 @@ let sectionOption={
               }
             },
             itemStyle: {
-              borderColor: '#ffffff',
+              borderColor: '#fff',
               borderWidth: 3
             },
         },
@@ -493,10 +602,10 @@ let sectionOption={
             name: '有效计划数',
             type: 'line',
             smooth: true,
-            data:  [850, 952, 951, 954, 1250, 1530, 1520],           
+            data:  [],           
             symbol: 'circle',
             color: '#9933ff',
-            symbolSize: 1,
+            symbolSize: 8,
             lineStyle: {
               normal: {
                 width: 2,
@@ -524,6 +633,9 @@ export default {
 
   data: function() {
     return {
+      accountDisabled:false,
+      operateDisabled:false,
+      userId:JSON.parse(localStorage.getItem('pro__Login_Userinfo')).value.id,
       duration: 1000,
     //treeselect的参数
       treeValue: [],
@@ -536,23 +648,26 @@ export default {
       operate:'',
       operateList:[],
 
-      tabKey:1,
-      sectionOption,
+      tabKey:2,
+      sectionOption:JSON.parse(JSON.stringify(sectionOption)),
 
       loading: false,
       TTcolumns,
       KScolumns,
-      columns:[...TTcolumns],    
+      columns:[...KScolumns],    
       dataTable: [],
      
       tableTab:1,
 
-      newPlan:2222,
-      effectPlan:1000,
+      newPlan:0,
+      effectPlan:0,
      
       echartSpinning:false,
 
       openOptions:false,
+
+      target:'',
+      order:'desc',
     }
   },
   methods: {
@@ -563,6 +678,7 @@ export default {
       this.accountId = [];
       //选择一个后禁用其他
       if(val.length==1){
+        this.operateDisabled=true;
           if(val[0]*1){
             let selectindex=0
               this.treeData.forEach((ele,index)=>{                   
@@ -630,9 +746,8 @@ export default {
                 }
               
           });
-        this.rebatePropDisabled=false;
-        this.discountDisabled=false;
-        this.discount=1.0  
+        this.operateDisabled=false;
+        this.opendate=''
       }
       if(val){
         val.forEach((ele,index)=>{
@@ -662,7 +777,8 @@ export default {
     disabledDate(current) {
       // console.log(current)
 
-       return current && current > moment().subtract(1, 'day')
+      //  return  current && current > moment().add(1, 'day')
+      return moment().endOf('day');
     },
     filterOption(input, option){
       console.log(input, option)
@@ -682,15 +798,23 @@ export default {
       
       if(key==1){
         // toutiao
-        this.columns=[...TTcolumns]
+        this.columns=this.tableTab==1?[...TTcolumns]:[...TTcolumnsVaild]
+        this.sectionOption.legend.data=['新上计划数','有效计划数']
       }else{
         // kuaishou
-        this.columns=[...KScolumns]
+        this.columns=this.tableTab==1?[...KScolumns]:[...KScolumnsVaild]
+        this.sectionOption.legend.data=['新上推广组','有效推广组']
       }
       this.accountHttp()
     },
     operateChange(value){
-      console.log(value)
+      console.log(value);
+      if(value){
+        this.accountDisabled=true;
+        this.accountId=''
+      }else{
+        this.accountDisabled=false
+      }
     },
 
     //初始化chart
@@ -710,7 +834,16 @@ export default {
     moment,
     // table区域的tab切换
     tableTabChange(key){
-
+      if(key==1){
+       
+        this.columns=this.tabKey==1?[...TTcolumns]:[...KScolumns]
+        this.target='new'
+      }else{
+        
+        this.columns=this.tabKey==1?[...TTcolumnsVaild]:[...KScolumnsVaild]
+        this.target='valid'
+      }
+      this.getNewPlan()
     },
     //处理echart
     sectionHttp(params) {
@@ -794,12 +927,14 @@ export default {
 
      //请求项目和账户内容
     accountHttp(){
-     this.treeData=[];
+    
      this.treeValue=[];
      getAction(`/ctop/projectMember/getProjectAccountByUserId?mediaType=${this.tabKey}`, {}).then(res => {
        if(res.success){
             // console.log(res);
+            
             if(res.result){
+              this.treeData=[];
                 res.result.forEach((element,index) => {
                   if(element){                  
                       this.treeData.push({});                    
@@ -835,8 +970,99 @@ export default {
       })
     },
 
+    // 获取所有运营
+    getAllOperator(){
+      let url=''
+      if(this.tabKeykey==1){
+        // 头条
+        url=''
+      }else{
+        // 快手
+        url='/ctop/kuaishou/newPlan/report/AllOperator'
+      }
+      postAction(url,{}).then(res=>{
+        console.log(res);
+        if(res.success){
+          this.operateList=res.result
+        }
+      })
+    },
+
+
+    // 获取展示数据
+    getNewPlan(){
+      let url=''
+      if(this.tabKey==1){
+        // 头条
+        url=''
+      }else{
+        // 快手
+        url='/ctop/kuaishou/newPlan/report/data'
+      }
+      if(this.accountId){
+        this.operate='';
+      }else if(this.operate){
+        this.accountId=''
+      }
+      this.loading=true;
+      
+      this.sectionOption=JSON.parse(JSON.stringify(sectionOption));
+      postAction(url,{
+        accountIds:this.accountId,
+        userId:this.operate ,
+        startDate:this.dateValue[0].format('YYYY-MM-DD'),
+        endDate:this.dateValue[1].format('YYYY-MM-DD'),
+        target:this.tableTab=='1'?'new':'valid',
+        order:this.order
+      }).then(res=>{
+        console.log(res);
+        this.loading=false;
+        this.echartSpinning=false;
+        if(res.success){
+          this.effectPlan=res.result.sumData.valid;
+          this.newPlan=res.result.sumData.new;
+          this.dataTable=res.result.listData;
+
+          // 处理echar数据
+          res.result.chartData.map(item=>{
+            this.sectionOption.xAxis.data.push(item.statDate)
+            this.sectionOption.series[0].data.push(item.new)
+            this.sectionOption.series[1].data.push(item.valid)
+          })
+          if(this.tabKey==1){
+            this.sectionOption.legend.data=['新上计划数','有效计划数']
+            this.sectionOption.series[0].name='新上计划数'
+            this.sectionOption.series[1].name='有效计划数'
+          }else{
+            this.sectionOption.legend.data=['新上推广组','有效推广组']
+            this.sectionOption.series[0].name='新上推广组'
+            this.sectionOption.series[1].name='有效推广组'
+          }
+
+
+          this.getEchartData('sectionChart', this.sectionOption);
+
+        }
+      })
+    },
+
+    // 查询按钮
+    search(){
+      if(this.accountId || this.operate){
+        this.echartSpinning=true;
+        this.getNewPlan()
+      }else{
+        this.$message.error('请选择具体账户或者运营')
+      }
+      
+    }
+  },
+  watch: {
+    dateValue(newName,oldName){
+      
+          this.search()
+    },
   },
-  watch: {},
   computed: {
     newDate() {
       var myDate = new Date()
@@ -848,10 +1074,25 @@ export default {
       return day
     }
   },
+  mounted() {
+     this.accountHttp()
+  },
   activated: function() {
     this.$nextTick(()=>{
-      this.getEchartData('sectionChart', this.sectionOption);
       this.accountHttp()
+      this.getEchartData('sectionChart', this.sectionOption);
+     
+      this.getAllOperator()
+      this.tabChange(2)
+      let userInfo=localStorage.getItem('pro__Login_Userinfo')
+      if(userInfo){
+        this.userId=JSON.parse(userInfo).value.id;
+        this.operate=this.userId;
+        this.getNewPlan()
+      }
+      // console.log(this.userId)
+
+      
     })
      
   },

+ 20 - 6
src/views/modules/actor/ActorList.vue

@@ -1,12 +1,13 @@
 <template>
-  <vm-image-list :data="dataImageList" :total="total" @delete-ok="deletefn" class="vm-margin" @getList="getActorList"
+  <vm-image-list :data="dataImageList" :total="total" title="演员列表" @delete-ok="deletefn" class="vm-margin" @getList="getActorList"
     @updateList="getActorList(1, '')"></vm-image-list>
 </template>
 
 <script>
   import VmImageList from '@/components/ctop/vm-image-list'
   import {
-    actorList
+    actorList,
+    actorListDelete
   } from '@/api/actor'
   export default {
     name: 'ImageList',
@@ -20,11 +21,24 @@
     },
     methods: {
       deletefn: function (data) {
-        for (let i = 0; i < this.dataImageList.length; i++) {
-          if (this.dataImageList[i].id === data.id) {
-            this.dataImageList.splice(i, 1)
+        console.log('最外层deleteFn执行')
+        actorListDelete({
+          id:data.id
+        }).then(res=>{
+          if(res.success){
+            this.$message.success('删除成功')
+            // for (let i = 0; i < this.dataImageList.length; i++) {
+            //   if (this.dataImageList[i].id === data.id) {
+            //     this.dataImageList.splice(i, 1)
+            //   }
+            // }
+            this.getActorList(1)
+          }else{
+            this.$message.error('删除失败,稍后再试')
           }
-        }
+          
+        })
+        
       },
       getActorList(page, name) {
         this.dataImageList = []

+ 95 - 23
src/views/modules/autoRules/autoRulesList.vue

@@ -3,7 +3,7 @@
         <div class="tabBody">
             <a-tabs v-model="tabKey" @change="tabChange">
                 <a-tab-pane key="1" tab="规则管理"></a-tab-pane>
-                <a-tab-pane key="2" tab="运行记录" ></a-tab-pane>
+                <!-- <a-tab-pane key="2" tab="运行记录" ></a-tab-pane> -->
             </a-tabs>
         </div>
         <div class="tableBody">
@@ -35,11 +35,12 @@
                         </a-spin>
                         <!-- <a-switch size="default" :checked=text  @change="switchChange(text,record)"/> -->
                     </span>
+                    <span slot="processMethod" slot-scope="text">
+                        {{text=='SEND'?'仅发送通知':'发送并关停组'}}
+                    </span>
                     <span slot="options" slot-scope="text,record">
                         <a href="javascript:;" @click="editRule(record)">编辑</a>
                         <a-divider type="vertical" />
-                        <a href="javascript:;" @click="recordsRule(record)">计划分析</a>
-                        <a-divider type="vertical" />
                         <a-popconfirm
                             title="确定删除该规则吗?"
                             @confirm="deleteRule(record)"                            
@@ -69,33 +70,33 @@ let existColumns=[
     },
     {
         title: '规则名称',
-        dataIndex: 'name',
+        dataIndex: 'eventRuleName',
         align: 'center',
         
-        key: 'name',
-        scopedSlots: { customRender: 'name' }
+        key: 'eventRuleName',
+        scopedSlots: { customRender: 'eventRuleName' }
     },
     {
-        title: '规则ID',
-        dataIndex: 'id',
+        title: '应用对象',
+        dataIndex: 'accountName',
         align: 'center',
-        key: 'id',
-        scopedSlots: { customRender: 'id' }
+        key: 'accountName',
+        scopedSlots: { customRender: 'accountName' }
     },
     {
-        title: '应用对象',
-        dataIndex: 'applyObject',
+        title: '结果操作',
+        dataIndex: 'processMethod',
         align: 'center',
-        key: 'applyObject',
-        scopedSlots: { customRender: 'applyObject' }
+        key: 'processMethod',
+        scopedSlots: { customRender: 'processMethod' }
     },
     {
         title: '创建者',
-        dataIndex: 'creator',
+        dataIndex: 'userName',
         align: 'center',
         
-        key: 'creator',
-        scopedSlots: { customRender: 'creator' }
+        key: 'userName',
+        scopedSlots: { customRender: 'userName' }
     },
     {
         title: '操作',
@@ -208,18 +209,89 @@ export default {
             this.search()
         },
         editRule(record){
-            console.log(record)
-        },
-        recordsRule(record){
-            console.log(record)
+            console.log(record);
+            this.$router.push(`/newBlankRule?id=${record.eventRuleId}`)
         },
+        // recordsRule(record){
+        //     console.log(record);
+            
+        // },
         deleteRule(record){
-            console.log(record)
+            console.log(record);
+            getAction('/alarm/alarmEventRule/delete',{
+                id:record.eventRuleId
+            }).then(res=>{
+                console.log(res);
+                if(res.success){
+                    this.getTableListHttp()
+                }else{
+                    this.$message.error('删除失败')
+                }
+            })
         },
         switchChange(text,record){
-            console.log(text,record)
+            console.log(text,record);
+            record.spin=true;
+            let eventRuleStatus='1'
+            if(text){
+                eventRuleStatus='0'
+                
+            }else{
+                eventRuleStatus='1';
+            }
+           
+            postAction('/alarm/alarmEventRule/edit',{
+                eventRuleId:record.eventRuleId,
+                eventRuleStatus,
+            }).then(res=>{
+                console.log(res);
+                record.spin=false;
+                if(res.success){
+                    // this.getTableListHttp()                    
+                    if(text){
+                        record.status=false
+                        eventRuleStatus='0'                       
+                    }else{
+                        record.status=true
+                        eventRuleStatus='1';
+                    }
+                }else{
+                    this.$message.error('修改失败')
+                    // this.getTableListHttp()
+                }
+            })
         },
+
+        getTableListHttp(){
+            this.data=[];
+            this.loading=true;
+            let url='/alarm/alarmEventRule/list'
+            getAction(url,{
+                pageNo:this.ipagination.current,
+                pageSize:this.ipagination.pageSize
+            }).then(res=>{
+                console.log(res);
+                this.loading=false;
+                if(res.success){
+                    this.data=res.result.list.map(item=>{
+                        return {
+                            ...item,
+                            status:item.eventRuleStatus=='1'?true:false,
+                            spin:false,
+                        }
+                    })
+                    this.ipagination.total=res.result.total
+                }
+            })
+        }
+    },
+
+    mounted(){
+        this.getTableListHttp()
     },
+    activated(){
+        this.getTableListHttp()
+    }
 }
 
 

+ 254 - 106
src/views/modules/autoRules/newBlankRule.vue

@@ -18,19 +18,11 @@
                         </div>
                         <div class="input-item"> 
                              <a-form-model-item ref="applyObject"  prop="applyObject">
-                                <!-- <a-input
-                                    v-model="form.name"
-                                    @blur="
-                                    () => {
-                                        $refs.name.onFieldBlur();
-                                    }
-                                    "
-                                /> -->
                                 <a-radio-group v-model="form.applyObject" @change="applyObjChange">
                                     <a-radio-button value="ACCOUNT">账户</a-radio-button>
-                                    <a-radio-button value="CAMPAIGN">计划</a-radio-button>
+                                    <!-- <a-radio-button value="CAMPAIGN">计划</a-radio-button>
                                     <a-radio-button value="UNIT">组</a-radio-button>
-                                    <a-radio-button value="CREATE">创意</a-radio-button>
+                                    <a-radio-button value="CREATE">创意</a-radio-button> -->
                                 </a-radio-group>
                             </a-form-model-item>
                         </div>
@@ -50,12 +42,35 @@
                             </a-form-model-item>
 
                             <a-form-model-item ref="applyAccount" prop="applyAccount" v-if="form.applyObject=='ACCOUNT'">
-                                <a-select  style="width: 300px" v-model="form.applyAccount" mode="multiple" placeholder="请选择具体的账户">
-                                    <a-select-option v-for="item in accountList" :key="item.id" :value='item.value'>
-                                        {{item.title}}
+                                <Treeselect :appId.sync="form.applyAccount" :multiple="false" request="2,4"  ref="treeSelect" />
+
+                            </a-form-model-item>
+                        </div>
+                    </div>
+                    <div class="row-item">
+                        <div class="hint-item"></div>
+                        <div class="label-item">
+                            <div class="text-item">规则字段</div>
+                            <div class="required-item"></div>
+                        </div>
+                        <div class="input-item" > 
+                            <a-form-model-item ref="metricValueCode"  prop="metricValueCode">
+                                 <a-select
+                                    v-model="form.metricValueCode"
+                                    show-search
+                                    placeholder="选择规则字段"
+                                    option-filter-prop="children"
+                                    style="width: 200px"
+                                    :filter-option="filterOption"
+                                    @change="handleChange"
+                                >
+                                    <a-select-option  v-for="item in rulesFieldList" :key="item.id" :value='item.metricValueCode'>
+                                        {{item.metricValueName}}
                                     </a-select-option>
+                                   
                                 </a-select>
                             </a-form-model-item>
+
                         </div>
                     </div>
                     <div class="row-item" v-if="form.applyRange=='ACCORDINGTO_STATUS'&&form.applyObject!='ACCOUNT'">
@@ -127,97 +142,104 @@
                                    <a-form-model-item ref="causalCondition"  prop="causalCondition">
                                         <a-select  style="width: 300px" v-model="form.causalCondition">
                                             <a-select-option  value='MEET_ALL'>满足以下所有条件</a-select-option>
-                                            <a-select-option  value='MEET_ANY'>满足以下任意条件</a-select-option>
+                                            <!-- <a-select-option  value='MEET_ANY'>满足以下任意条件</a-select-option> -->
                                         </a-select>
                                     </a-form-model-item>
                                </div>
                                <div class="content">
                                    <div class="rules-list" v-for="(item,index) in rulesList" :key='index'>
+                                       
                                         <div class="rules-list-item">
                                             <div class="rules-list-item-subject" >
-                                                <a-cascader
-                                                    v-model="item.baseCondition"
+                                                <!-- <a-cascader
+                                                    v-model="item.metricValueName"
                                                     :options="condition"
                                                     :display-render="displayRender"
                                                     expand-trigger="hover"
                                                     placeholder=""
                                                     @change="conditionChange(item)"
-                                                />
+                                                /> -->
+                                                <span class="ruleName">
+                                                    {{item.metricValueName || '消耗'}}
+                                                </span>
+                                                
                                             </div>
                                             <div class="rules-list-item-subject" >
-                                                <a-select  v-model="item.whichDayOfData">
+                                                <a-select  v-model="item.dataRange">
                                                     <a-select-option  value='CURRENT_DAY_DATA'>当天数据</a-select-option>
                                                 </a-select>
                                             </div>
                                             <div class="rules-list-item-subject" >
-                                                <a-select   v-model="item.compareOperate">
+                                                <a-select   v-model="item.judgeMethod">
                                                     <a-select-option  value='GT_EQ'>大于等于</a-select-option>
                                                     <a-select-option  value='LT_EQ'>小于等于</a-select-option>
                                                     <a-select-option  value='BETWEEN'>介于</a-select-option>
                                                 </a-select>
                                             </div>
-                                            <div class="rules-list-item-subject" v-if="item.baseCondition[1]=='COST'">
-                                                <a-select   v-model="item.whichModuleOfMoney">
+                                            <!--  -->
+                                            <div class="rules-list-item-subject" v-if="isCost(item.metricValueCode)">
+                                                <a-select   v-model="item.judgeType">
                                                     <a-select-option  value='MONEY'>金额</a-select-option>
-                                                    <a-select-option  value='DAY_BUDGET'>日预算</a-select-option>
+                                                    <!-- <a-select-option  value='DAY_BUDGET'>日预算</a-select-option> -->
                                                 </a-select>
                                             </div>
-                                            <!-- <div class="rules-list-item-subject" v-if="item.whichModuleOfMoney=='MONEY'&&item.compareOperate!='BETWEEN'">
+                                            <!-- <div class="rules-list-item-subject" v-if="item.judgeType=='MONEY'&&item.judgeMethod!='BETWEEN'">
                                                 <a-input-number :min="0" style="width:100%" :max="9999999.99" :step="1" v-model="item.specificMoney" placeholder="请输入" />
                                                 <span style="margin-left:8px;line-height:32px">元</span>
                                             </div> -->
                                             
-                                            <div class="rules-list-item-subject" v-if="item.whichModuleOfMoney=='MONEY'&&item.compareOperate!='LT_EQ'">
-                                                <a-input-number :min="0" style="width:100%" :max="9999999.99" :step="1" v-model="item.specificMoneyMin" placeholder="请输入" />
-                                                <span style="margin-left:8px;line-height:32px"></span>
+                                            <div class="rules-list-item-subject" v-if="item.judgeMethod=='BETWEEN'">
+                                                <a-input-number :min="0" style="width:100%" :max="9999999.99" :step="1" v-model="item.minThreshold" placeholder="请输入" @blur="inputCheck" />
+                                                <span style="margin-left:8px;line-height:32px">{{item.metricValueCode | handlerDANWEI }}</span>
                                             </div>
-                                            <span style="margin-right:20px" v-if="item.whichModuleOfMoney=='MONEY'&&item.compareOperate!='GT_EQ'">-</span>
-                                            <div class="rules-list-item-subject" v-if="item.whichModuleOfMoney=='MONEY'&&item.compareOperate=='BETWEEN'">
-                                               <a-input-number :min="0" style="width:100%" :max="9999999.99" :step="1" v-model="item.specificMoneyMax" placeholder="请输入" />
-                                               <span style="margin-left:8px;line-height:32px"></span>
+                                            <span style="margin-right:20px" v-if="item.judgeMethod=='BETWEEN'">-</span>
+                                            <div class="rules-list-item-subject" >
+                                               <a-input-number :min="0" style="width:100%" :max="9999999.99" :step="1" v-model="item.threshold" placeholder="请输入" />
+                                               <span style="margin-left:8px;line-height:32px">{{item.metricValueCode | handlerDANWEI }}</span>
                                             </div>
 
 
-                                            <!-- <div class="rules-list-item-subject" v-if="item.whichModuleOfMoney=='DAY_BUDGET'&&item.compareOperate!='BETWEEN'">
+                                            <!-- <div class="rules-list-item-subject" v-if="item.judgeType=='DAY_BUDGET'&&item.judgeMethod!='BETWEEN'">
                                                 <a-select   v-model="item.budgetMultiple">
                                                     <a-select-option v-for="item in budgetMultipleArr" :key="item.value" :value='item.value' >{{item.label}}</a-select-option>
                                                 </a-select>
                                             </div> -->
-                                            <div class="rules-list-item-subject" v-if="item.whichModuleOfMoney=='DAY_BUDGET'&&item.compareOperate!='LT_EQ'">
+                                            <!-- <div class="rules-list-item-subject" v-if="item.judgeType=='DAY_BUDGET'&&item.judgeMethod!='LT_EQ'">
                                                 <a-select   v-model="item.budgetMultipleMin">
                                                     <a-select-option v-for="item in budgetMultipleArr" :key="item.value" :value='item.value' >{{item.label}}</a-select-option>
                                                 </a-select>
                                             </div>
 
-                                            <span style="margin-right:20px" v-if="item.whichModuleOfMoney=='DAY_BUDGET'&&item.compareOperate=='BETWEEN'">-</span>
-                                            <div class="rules-list-item-subject" v-if="item.whichModuleOfMoney=='DAY_BUDGET'&&item.compareOperate!='GT_EQ'">
+                                            <span style="margin-right:20px" v-if="item.judgeType=='DAY_BUDGET'&&item.judgeMethod=='BETWEEN'">-</span>
+                                            <div class="rules-list-item-subject" v-if="item.judgeType=='DAY_BUDGET'&&item.judgeMethod!='GT_EQ'">
                                                 <a-select   v-model="item.budgetMultipleMax">
                                                     <a-select-option v-for="item in budgetMultipleArr" :key="item.value" :value='item.value' >{{item.label}}</a-select-option>
                                                 </a-select>
-                                            </div>
+                                            </div> -->
 
 
                                             <!-- 处理不是消耗的情况 -->
-                                            <div class="rules-list-item-subject" v-if="item.baseCondition[1]!='COST'&&item.compareOperate!='LT_EQ'">
-                                                <a-input-number :min="0" style="width:100%" :max="9999999.99" :step="1" v-model="item.minNumber" placeholder="请输入" />
-                                                <span style="margin-left:8px;line-height:32px">{{item.baseCondition[1] | handlerDANWEI}}</span>
+                                            <!-- <div class="rules-list-item-subject" v-if="item.metricValueName[1]!='COST'&&item.judgeMethod!='LT_EQ'">
+                                                <a-input-number :min="0" style="width:100%" :max="9999999.99" :step="1" v-model="item.threshold" placeholder="请输入" />
+                                                <span style="margin-left:8px;line-height:32px">{{item.metricValueCode | handlerDANWEI}}</span>
                                             </div>
-                                            <span style="margin-right:20px" v-if="item.baseCondition[1]!='COST'&&item.compareOperate=='BETWEEN'">-</span>
-                                            <div class="rules-list-item-subject" v-if="item.baseCondition[1]!='COST'&&item.compareOperate!='GT_EQ'">
+                                            <span style="margin-right:20px" v-if="item.metricValueName[1]!='COST'&&item.judgeMethod=='BETWEEN'">-</span>
+                                            <div class="rules-list-item-subject" v-if="item.metricValueName[1]!='COST'&&item.judgeMethod!='GT_EQ'">
                                                <a-input-number :min="0" style="width:100%" :max="9999999.99" :step="1" v-model="item.maxNumber" placeholder="请输入" />
-                                               <span style="margin-left:8px;line-height:32px">{{item.baseCondition[1] | handlerDANWEI }}</span>
-                                            </div>
+                                               <span style="margin-left:8px;line-height:32px">{{item.metricValueCode | handlerDANWEI }}</span>
+                                            </div> -->
 
 
 
-                                            <div class="rules-list-item-delete" @click="deleteRulesListItem(item,index)">
+                                            <!-- <div class="rules-list-item-delete" @click="deleteRulesListItem(item,index)">
                                                 <a-icon type="delete" style="font-size:16px;position: relative;top: 4px;" />
-                                            </div>
+                                            </div> -->
 
                                         </div>
+                                        
                                     </div>
                                     
-                                   <div class="add-rule" @click="addRule"> 添加条件</div>
+                                   <!-- <div class="add-rule" @click="addRule"> 添加条件</div> -->
                                </div>
                            </div>
                            <div class="toolbox-automate-rules-create-content_rules-and-condition_rules">
@@ -228,10 +250,10 @@
                                     <div class="rules-list">                                        
                                         <div class="rules-list-item">
                                             <div class="rules-list-item-subject" >
-                                                <a-form-model-item ref="checkedTime"  prop="checkedTime">
-                                                    <a-select   v-model="form.finalOperation">
-                                                        <a-select-option  value='PAUSE' v-if="form.applyObject!='ACCOUNT'">暂停{{form.applyObject | handlerApplyObj}}</a-select-option>
-                                                        <a-select-option  value='OLNY_SENDMESSAGE'>仅发送通知</a-select-option>
+                                                <a-form-model-item ref="processMethod"  prop="processMethod">
+                                                    <a-select   v-model="form.processMethod">
+                                                        <a-select-option  value='PAUSE' >关停组</a-select-option>
+                                                        <a-select-option  value='SEND'>仅发送通知</a-select-option>
                                                     </a-select>
                                                 </a-form-model-item>
                                             </div>
@@ -250,9 +272,9 @@
                             <div class="required-item"></div>
                         </div>
                         <div class="input-item"> 
-                             <a-form-model-item ref="checkedTime"  prop="checkedTime">
-                                <a-radio-group v-model="form.checkedTime">
-                                    <a-radio-button value="DAY">每天</a-radio-button>
+                             <a-form-model-item ref="checkFrequency"  prop="checkFrequency">
+                                <a-radio-group v-model="form.checkFrequency">
+                                    <!-- <a-radio-button value="DAY">每天</a-radio-button> -->
                                     <a-radio-button value="HOUR">每小时</a-radio-button>
                                     <a-radio-button value="HALF_AN_HOUR">每半小时</a-radio-button>
                                     <!-- <a-radio-button value="CUSTOM_TIME">自定义</a-radio-button> -->
@@ -260,7 +282,7 @@
                             </a-form-model-item>
                         </div>
                     </div>
-                     <div class="row-item" v-if="form.checkedTime=='DAY'">
+                     <div class="row-item" v-if="form.checkFrequency=='DAY'">
                         <div class="hint-item"></div>
                         <div class="label-item">
                             <div class="text-item">选择时刻</div>
@@ -298,14 +320,10 @@
                             <div class="required-item"></div>
                         </div>
                         <div class="input-item"> 
-                             <a-form-model-item ref="applyObject"  prop="applyObject">
+                             <a-form-model-item ref="eventRuleName"  prop="eventRuleName">
                                 <a-input
-                                    v-model="form.name"
-                                    @blur="
-                                    () => {
-                                        $refs.name.onFieldBlur();
-                                    }
-                                    "
+                                    v-model="form.eventRuleName"
+                                    allowClear
                                 />
                             </a-form-model-item>
                         </div>
@@ -328,7 +346,7 @@
 import moment from 'moment';
 import { getAction, postAction, downFile, downFilePost } from '@/api/manage';
 import { Switch } from 'ant-design-vue';
-
+import Treeselect from '@/views/modules/Statistics/components/Treeselect.vue'
 let statusList=[
     {
         id:1,
@@ -423,9 +441,6 @@ let condition=[
     }
 ]
 
-let rulesField = [
-    
-]
 
 
 let budgetMultipleArr=[
@@ -449,8 +464,14 @@ let budgetMultipleArr=[
 
 
 export default {
+    components:{
+        Treeselect,
+    },
     data() {
         return {
+            currentRuleId:'',
+            rulesFieldList:[],
+            accountID:undefined,
             selectedCampaignValue:undefined,
             spinning:false,
             campaignHaveList:[],
@@ -468,48 +489,95 @@ export default {
             budgetMultipleArr,
             accountList:[],    
             form: {
-                name: `空白规则_${moment().format('YYYY_MM_DD_hh:mm:ss')}`,
+                eventRuleName: `空白规则_${moment().format('YYYY_MM_DD_hh:mm:ss')}`,
                 applyObject:'ACCOUNT',
-                applyAccount:[],
+                applyAccount:'',
                 applyRange:'ACCORDINGTO_STATUS',
-                status:'STATUS_DELIVERY_OK',
-                specificMoment:undefined,
-                sendMessage:1,
-                specificMoment:undefined,
-                checkedTime:'DAY',
+                status:'STATUS_DELIVERY_OK',               
+                sendMessage:1,                
+                checkFrequency:'HOUR',
                 causalCondition:'MEET_ALL', //因果条件 满足所有/满足任意
-                finalOperation:'OLNY_SENDMESSAGE',
-               
+                processMethod:'SEND',
+                metricValueCode:undefined,
             },
             rules: {
-                name: [
+                eventRuleName: [
                     { required: true, message: '请填写规则的具体名称', trigger: 'blur' },
                     { min: 2, message: '长度不得小于2', trigger: 'blur' },
                 ],
-                applyObject: [{ required: true, message: '请选择具体应用对象', trigger: 'change' }],
+                metricValueCode: [{ required: true, message: '请选择规则字段', trigger: 'change' }],
                 applyRange: [{ required: true, message: '请选择具体应用范围', trigger: 'change' }],
                 applyAccount: [{required: true, message: '请选择具体应用范围', trigger: 'change' }],
                 specificMoment: [{required: true, message: '请选择具体时刻', trigger: 'change' }],
-               
+                money: [
+                    { required: true, message: '请填写具体金额', trigger: 'blur' },
+                    // { min: 2, message: '长度不得小于2', trigger: 'blur' },
+                ],
             },
 
             rulesList:[
                 {
-                    baseCondition:['0','COST'],
-                    whichDayOfData:'CURRENT_DAY_DATA',
-                    compareOperate:'GT_EQ',
-                    whichModuleOfMoney:'MONEY',
-                    budgetMultiple:0.5,
-                    budgetMultipleMin:0.5,
-                    budgetMultipleMax:0.8,
-                    specificMoney:undefined,
-                    specificMoneyMin:undefined,
-                    specificMoneyMax:undefined,
+                    metricValueName:'',
+                    metricValueCode:'',
+                    dataRange:'CURRENT_DAY_DATA',
+                    judgeMethod:'GT_EQ',
+                    judgeType:'MONEY',
+                    threshold:0,
+                    minThreshold:0,
+                    // budgetMultiple:0.5,
+                    // budgetMultipleMin:0.5,
+                    // budgetMultipleMax:0.8,
+                    // specificMoney:undefined,
+                    // specificMoneyMin:undefined,
+                    // specificMoneyMax:undefined,
                 }
             ]
         }
     },
     methods: {
+        inputCheck(val){
+            console.log(val)
+        },
+
+
+        isCost(val){
+            if(val.indexOf('Cost') != -1){
+                return true
+            } else if(val.indexOf('depletion') != -1){
+                return true
+            }else{
+                return false
+            }
+            
+        },
+
+        handleChange(value) {
+            console.log(value,this.metricValueCode);
+            let rulesList={};
+            rulesList=this.rulesFieldList.filter(item=>{
+                return item.metricValueCode==value
+            })[0]
+            console.log(rulesList);rulesList
+            this.rulesList=[]
+            rulesList.childs.forEach((ele,index)=>{
+                this.rulesList.push({
+                    metricValueName:ele.metricValueName,
+                    metricValueCode:ele.metricValueCode,
+                    dataRange:'CURRENT_DAY_DATA',
+                    judgeMethod:'GT_EQ',
+                    judgeType:'MONEY',
+                    threshold:undefined,
+                    minThreshold:undefined,
+                })
+            })
+        },
+        
+        filterOption(input, option) {
+            return (
+                option.componentOptions.children[0].text.toLowerCase().indexOf(input.toLowerCase()) >= 0
+            );
+        },
+
         // form-modal 自带方法
         onSubmit() {
             this.$refs.ruleForm.validate(valid => {
@@ -526,18 +594,16 @@ export default {
         },
         addRule(){
             this.rulesList.push({
-                baseCondition:['0','COST'],
-                whichDayOfData:'CURRENT_DAY_DATA',
-                compareOperate:'GT_EQ',
-                whichModuleOfMoney:'MONEY',
+                metricValueName:['0','COST'],
+                dataRange:'CURRENT_DAY_DATA',
+                judgeMethod:'GT_EQ',
+                judgeType:'MONEY',
                 budgetMultiple:0.5,
                 budgetMultipleMin:0.5,
                 budgetMultipleMax:0.8,
-                specificMoney:undefined,
-                specificMoneyMin:undefined,
-                specificMoneyMax:undefined,
-                minNumber:undefined,
-                maxNumber:undefined,
+                
+                threshold:0,
+                maxNumber:0,
             })
         },
         deleteRulesListItem(item,index){
@@ -551,32 +617,64 @@ export default {
         },
         conditionChange(item){
             console.log(item)
-            if(item.baseCondition[1]=='COST'){
-                item.whichModuleOfMoney='MONEY';
+            if(item.metricValueName[1]=='COST'){
+                item.judgeType='MONEY';
             }else{
-                item.whichModuleOfMoney=undefined;
+                item.judgeType=undefined;
             } 
             item.specificMoney=undefined;
             item.specificMoneyMin=undefined;
             item.specificMoneyMax=undefined;
-            item.minNumber=undefined;
+            item.threshold=undefined;
             item.maxNumber=undefined;
         },
 
         applyObjChange(e){
             if(e.target.value=='ACCOUNT'){
-                this.form.finalOperation='OLNY_SENDMESSAGE'
+                this.form.processMethod='SEND'
             }   
         },
 
         saveHandler(){
              this.$refs.ruleForm.validate(valid=> {
                 if (valid) {
-                    this.form.rulesList=this.rulesList;
+                    // this.form.rulesList=this.rulesList;
                     console.log(valid,this.form);
-
+                    this.saveLoading=true;
+                    let params ={accountId:this.form.applyAccount,alarmEventMetric:this.rulesList,...this.form}
+                    if(this.currentRuleId){
+                        postAction('/alarm/alarmEventRule/edit',params).then(res=>{
+                        console.log(res);
+                        this.saveLoading=false;
+                        if(res.success){
+                            
+                            this.$router.push('/autoRules')
+                            this.$bus.$emit('remove', '/newBlankRule')
+                        }else{
+                            this.$message.error('修改失败')
+                        }
+                            
+                        
+                        })
+                    }else{
+                        postAction('/alarm/alarmEventRule/add',params).then(res=>{
+                        console.log(res);
+                        this.saveLoading=false;
+                        if(res.success){
+                            
+                            this.$router.push('/autoRules')
+                            this.$bus.$emit('remove', '/newBlankRule')
+                        }else{
+                            this.$message.error('创建失败')
+                        }
+                            
+                        
+                        })
+                    }
+                    
                 } else {
                     console.log('error submit!!');
+                    this.$message.error('请按提示填写必填项目!')
                     return false;
                 }
             });
@@ -646,17 +744,50 @@ export default {
 
             let returnVal='';
             
-            if(val.indexOf("RATE") != -1){
-                returnVal='%';
-            }else if(val.indexOf("COST") != -1|| val.indexOf("PRICE") != -1){
+            if(val.indexOf("Roi") != -1){
+                returnVal='';
+            }else if(val.indexOf("Cost") != -1|| val.indexOf("depletion") != -1){
                 returnVal='元'                   
             }else{
-                    returnVal=''                    
+                    returnVal=''                    
             }
 
             return returnVal
         },
     },
+
+    mounted(){
+        getAction('/alarm/alarmMetricValue/queryParentChildList',{}).then(res=>{
+            console.log(res);
+            if(res.success){
+                this.rulesFieldList=res.result;
+                
+            }
+            
+        })
+
+        // console.log(this.$route.query);
+        this.currentRuleId=this.$route.query.id
+        if(this.$route.query.id){
+            getAction('/alarm/alarmEventRule/queryById',{
+                id:this.$route.query.id
+            }).then(res=>{
+                console.log(res);
+                if(res.success){
+                    this.form={
+                        applyObject:'ACCOUNT',
+                        causalCondition:'MEET_ALL', //因果条件 满足所有/满足任意
+                        applyAccount:res.result.accountId,
+                        ...res.result
+                    }
+                    this.rulesList=res.result.alarmEventMetrics
+                    console.log(this.form)
+                }
+                
+            })
+        }
+
+    },
 }
 </script>
 
@@ -838,6 +969,16 @@ export default {
                     width: 120px;
                     margin-right: 16px;
                     display: flex;
+                    .ruleName{
+                        display: block;
+                        width: 100%;
+                        height: 32px;
+                        line-height: 32px;
+                        text-align: center;
+                        background-color: #fff;
+                        border: 1px solid #d9d9d9;
+                        border-radius: 4px;
+                    }
                 }
             }
             .rules—list_item:last-of-type {
@@ -958,6 +1099,13 @@ export default {
 .newBlankRule{
     .ant-form-item {
         margin-bottom: 0;
+        
+    }
+    .content{
+        .ant-form-item {
+            margin-bottom: 0;
+            width: 100%;
+        } 
     }
     .ant-radio-button-wrapper {
         

+ 18 - 5
src/views/modules/prop/prop.vue

@@ -6,7 +6,8 @@
 <script>
   import VmImageList from './modules/vm-image-list'
   import {
-    propList
+    propList,
+    propListDelete
   } from '@/api/actor'
   export default {
     name: 'ImageList',
@@ -20,11 +21,23 @@
     },
     methods: {
       deletefn: function (data) {
-        for (let i = 0; i < this.dataImageList.length; i++) {
-          if (this.dataImageList[i].id === data.id) {
-            this.dataImageList.splice(i, 1)
+        // console.log('最外层deleteFn执行')
+        propListDelete({
+          id:data.id
+        }).then(res=>{
+          if(res.success){
+            this.$message.success('删除成功')
+            // for (let i = 0; i < this.dataImageList.length; i++) {
+            //   if (this.dataImageList[i].id === data.id) {
+            //     this.dataImageList.splice(i, 1)
+            //   }
+            // }
+            this.getActorList(1)
+          }else{
+            this.$message.error('删除失败,稍后再试')
           }
-        }
+          
+        })
       },
       getActorList(page, name) {
         this.dataImageList = []

+ 50 - 16
src/views/modules/workBench/index.vue

@@ -28,7 +28,9 @@
                             我的工作内容
                         </div>
                         <div class="zhanshiBox">
+                           
                             <div class="item">
+                                <router-link to="/workBench/orderList">
                                 <div class="title">
                                     <img src="@/assets/work.png" alt="" class="iconImg">
                                     <span>我发起的</span>
@@ -36,8 +38,11 @@
                                 <div class="itemBody">
                                     <p class="count">60 <span>个</span></p>
                                 </div>
+                                </router-link>
                             </div>
+                            
                             <div class="item">
+                                <router-link to="/workBench/orderList">
                                 <div class="title">
                                     <img src="@/assets/work.png" alt="" class="iconImg">
                                     <span>我发起的</span>
@@ -45,17 +50,21 @@
                                 <div class="itemBody">
                                     <p class="count">60 <span>个</span></p>
                                 </div>
+                                </router-link>
                             </div>
                             <div class="item">
-                                <div class="title">
+                                <router-link to="/workBench/orderList">
+                                <div class="title">                                   
                                     <img src="@/assets/work.png" alt="" class="iconImg">
                                     <span>我发起的</span>
                                 </div>
                                 <div class="itemBody">
                                     <p class="count">60 <span>个</span></p>
                                 </div>
+                                </router-link>
                             </div>
                             <div class="item">
+                                <router-link to="/workBench/orderList">
                                 <div class="title">
                                     <img src="@/assets/work.png" alt="" class="iconImg">
                                     <span>我发起的</span>
@@ -63,8 +72,10 @@
                                 <div class="itemBody">
                                     <p class="count">60 <span>个</span></p>
                                 </div>
+                                </router-link>
                             </div>
                             <div class="item">
+                                <router-link to="/workBench/orderList">
                                 <div class="title">
                                     <img src="@/assets/work.png" alt="" class="iconImg">
                                     <span>我发起的</span>
@@ -72,8 +83,10 @@
                                 <div class="itemBody">
                                     <p class="count">60 <span>个</span></p>
                                 </div>
+                                </router-link>
                             </div>
                             <div class="item">
+                                <router-link to="/workBench/orderList">
                                 <div class="title">
                                     <img src="@/assets/work.png" alt="" class="iconImg">
                                     <span>我发起的</span>
@@ -81,6 +94,7 @@
                                 <div class="itemBody">
                                     <p class="count" >60 <span>个</span></p>
                                 </div>
+                                </router-link>
                             </div>
                         </div>  
                     </div>
@@ -124,26 +138,26 @@
                             <a-timeline>
                                 <a-timeline-item color='#F0F2F5' style="height:30px">
                                    <p style="margin-bottom:0px">
-                                       Create a services site 2015-09-01
-                                    <span style="float:right">1分钟前</span>
+                                    <span class="content-item">Create a services site 2015-09-01</span> 
+                                    <span class="time">1分钟前</span>
                                    </p>
                                 </a-timeline-item>
                                 <a-timeline-item color='#F0F2F5' style="height:30px">
                                    <p style="margin-bottom:0px">
-                                       Create a services site 2015-09-01
-                                    <span style="float:right">1分钟前</span>
+                                    <span class="content-item">Create a services site 2015-09-01</span> 
+                                    <span class="time">1分钟前</span>
                                    </p>
                                 </a-timeline-item>
                                 <a-timeline-item color='#F0F2F5' style="height:30px">
                                    <p style="margin-bottom:0px">
-                                       Create a services site 2015-09-01
-                                    <span style="float:right">1分钟前</span>
+                                    <span class="content-item">Create a services site 2015-09-01</span> 
+                                    <span class="time">1分钟前</span>
                                    </p>
                                 </a-timeline-item>
                                 <a-timeline-item color='#F0F2F5' style="height:30px">
                                    <p style="margin-bottom:0px">
-                                       Create a services site 2015-09-01
-                                    <span style="float:right">1分钟前</span>
+                                    <span class="content-item">Create a services site 2015-09-01</span> 
+                                    <span class="time">1分钟前</span>
                                    </p>
                                 </a-timeline-item>
                                 
@@ -229,7 +243,7 @@ export default {
         width: 100%;
         height: 146px;
         background: #FFFFFF;
-        margin-bottom: 24px;
+        margin-bottom: 12px;
         padding: 20px;
         box-sizing: border-box;
         .breadcrumb{
@@ -290,15 +304,17 @@ export default {
                 color: rgba(0, 0, 0, 0.85);
                 line-height: 24px;
                 border-bottom: 1px solid  #E9E9E9;;
+                position: relative;
                 .allOrder{
-                    float: right;
+                    position: absolute;
+                    right: 5px;
                 }
             }
             .sectionLeftBox{
                 width: 70%;
                
                 .leftTop{
-                    height: 370px;
+                    overflow: hidden;
                     background: white;
                 }
                 .zhanshiBox{
@@ -312,6 +328,7 @@ export default {
                         border-bottom: 1px solid #E9E9E9;
                         .title{
                             padding-bottom: 34px;
+                            color: #000000;
                             .iconImg{
                                 width: 24px;
                                 margin-right: 8px;
@@ -342,7 +359,7 @@ export default {
                     }
                 }
                 .leftBottom{
-                    margin-top: 20px;
+                    margin-top: 12px;
                     background: white;
                     .orderProgress{
                         padding: 0 20px;
@@ -398,18 +415,35 @@ export default {
                 }
             }
             .sectionRightBox{
-                width: 29%;
+                width: 29.5%;
                 // background: white;
-                margin-left: 20px;
+                margin-left: 12px;
                 .rightTop{
                     height: 370px;
                      background: white;
                      .optionRecordList{
                          padding: 20px;
+                         p{
+                             width: 100%;
+                         }
+                        .content-item{
+                            width: 80%;
+                            display: inline-block;
+                            overflow: hidden;
+                            text-overflow: ellipsis;
+                            white-space: nowrap;
+                        }
+                        .time{
+                            width: 20%;
+                            display: inline-block;
+                            overflow: hidden;
+                            text-overflow: ellipsis;
+                            white-space: nowrap;
+                        }
                      }
                 }
                 .rightBottom{
-                    margin-top: 20px;
+                    margin-top: 12px;
                      background: white;
                     .burnDown{
                          padding: 30px 20px;

+ 2 - 2
src/views/modules/workBench/orderDetail.vue

@@ -10,7 +10,7 @@
     .topBody{
         width: 100%;
         background: #FFFFFF;
-        margin-bottom: 24px;
+        margin-bottom: 12px;
         padding: 20px;
         box-sizing: border-box;
         .breadcrumb{
@@ -424,7 +424,6 @@
                             size="middle"
                             :columns="columns"
                             :dataSource="data"
-                            bordered
                             id="outTable"
                             :pagination="ipagination"
                             :loading="loading"
@@ -576,6 +575,7 @@ let materialColumns=[
         dataIndex: 'options',
         align: 'center',        
         key: 'options',
+        width:250,
         scopedSlots: { customRender: 'options' }
     },
 ]

+ 710 - 0
src/views/modules/workBench/orderList.vue

@@ -0,0 +1,710 @@
+
+<style lang="scss" scoped>
+.orderDetail{
+    ul,li{
+        margin: 0;
+        padding: 0;
+    }
+   
+    width: 100%;
+    .topBody{
+        width: 100%;
+        background: #FFFFFF;
+        margin-bottom: 12px;
+        padding: 20px;
+        box-sizing: border-box;
+        .breadcrumb{
+            height: 22px;
+            font-size: 12px;
+            font-family: PingFangSC-Regular, PingFang SC;
+            font-weight: 400;
+            color: #000000;
+            line-height: 22px;
+        }
+        .bottom{
+            display: flex;
+            position: relative;
+            justify-content: space-between;
+            // padding: 20px;
+            .orderIcon{
+                width: 28px;
+                height: 28px;
+                margin-right: 15px;
+                img{
+                    width: 100%;
+                }
+            }
+            .tip{
+                .greet{
+                    width: 300px;
+                    height: 28px;
+                    font-size: 20px;
+                    font-family: PingFangSC-Medium, PingFang SC;
+                    font-weight: 500;
+                    color: rgba(0, 0, 0, 0.85);
+                    line-height: 28px;
+                    margin-bottom: 5px;
+                }
+                .descPosition{
+                    
+                    font-size: 14px;
+                    font-family: PingFangSC-Regular, PingFang SC;
+                    font-weight: 400;
+                    color: rgba(0, 0, 0, 0.45);
+                    overflow: hidden;
+                    margin-bottom: 0;
+                    li{
+                        height: 22px;
+                        line-height: 22px;
+                        margin-top:3px ;
+                    }
+                    span{
+                        width: 250px;
+                        display: inline-block;
+                    }
+                }
+
+            }
+            .optBody{
+                width: 200px;
+                flex-shrink:0;
+                // justify-content: flex-end;
+                text-align: right;
+                .btnBody{
+                    margin-bottom: 10px;
+                }
+                .orderInfo{
+                    display: flex;
+                    justify-content: space-between;
+                    text-align: right;
+                    p{
+                        margin-bottom: 0;
+                    }
+                    
+                    .markName{                        
+                        height: 22px;
+                        font-size: 14px;
+                        font-family: PingFangSC-Regular, PingFang SC;
+                        font-weight: 400;
+                        color: rgba(0, 0, 0, 0.45);
+                        line-height: 22px;
+                    }
+                    .big{                                               
+                        height: 28px;
+                        font-size: 20px;
+                        font-family: PingFangSC-Regular, PingFang SC;
+                        font-weight: 400;
+                        color: rgba(0, 0, 0, 0.85);
+                        line-height: 28px;
+                    }
+                }
+
+            }
+        }
+
+    }
+    .section{
+        .sectionBody{
+            
+            p{
+                margin-bottom: 0;
+            }
+            .section-item{
+                background: white;
+                margin-bottom: 20px;
+            }
+            .tabBox{
+                padding: 15px 20px 0;
+                display: flex;
+                flex-wrap: wrap;
+                position: relative;
+                .search-item{
+                    margin-bottom: 12px;
+                    width: 30%;
+                }
+                .opt-item{
+                    position: absolute;
+                    right: 20px;
+                    top: 60px;
+                }
+            }
+            .sectionHead{
+                padding: 15px 20px;
+                // height: 24px;
+                font-size: 16px;
+                font-family: PingFangSC-Medium, PingFang SC;
+                font-weight: 500;
+                color: rgba(0, 0, 0, 0.85);
+                line-height: 24px;
+                border-bottom: 1px solid  #E9E9E9;;
+                .allOrder{
+                    float: right;
+                }
+            }
+            .section-box{
+                padding: 20px 20px;
+                .description{
+                    margin-top: 10px;
+                    .time{
+                        height: 32px;
+                        line-height: 32px;
+                    }
+                }
+                ul{
+                    display: flex;
+                    flex-wrap: wrap;
+                    // justify-content: space-around;
+                }
+                li{
+                    
+                    width: 30%;
+                    height: 22px;
+                    font-size: 14px;
+                    font-family: PingFangSC-Regular, PingFang SC;
+                    font-weight: 400;
+                    color: rgba(0, 0, 0, 0.85);
+                    line-height: 22px;
+                    text-align: left;
+                    margin-bottom: 15px;
+                }
+                .top{
+                    margin-bottom: 25px;
+                }
+                .bottom{
+                    h4{
+                        
+                        font-size: 15px;
+                        font-family: PingFangSC-Medium, PingFang SC;
+                        font-weight: 600;
+                        color: rgba(0, 0, 0, 0.85);
+                        margin-bottom: 25px;
+                    }
+                }
+                .shenhe{
+                    width: 6px;
+                    height: 6px;
+                    display: inline-block;
+                    background: #52C41A;
+                    border-radius: 50%;
+                    position: relative;
+                    top: -2px;
+
+                }
+                .wancheng{
+                    width: 6px;
+                    height: 6px;
+                     display: inline-block;
+                    background: #1890FF;
+                    border-radius: 50%;
+                    // margin-right: 3px;
+                    position: relative;
+                    top: -2px;
+                }
+                .bohui{
+                    width: 6px;
+                    height: 6px;
+                    display: inline-block;
+                    background: #F5222D;
+                    border-radius: 50%;
+                    position: relative;
+                    top: -2px;
+                }
+            }
+            
+        }
+    }
+}
+.videoBox{
+    width: 320px;
+    height: 180px;
+}
+.imgBox{
+    width: 100%;
+    height: 180px;
+}
+.marterialInfo{
+    
+    p{margin-bottom: 0;}
+    ul,li{
+        margin: 0;
+        padding: 0;
+    }
+    .info-item{
+        margin-bottom: 20px;
+        display: flex;
+        // justify-content: center;
+        align-items: center;
+        span{
+            display: inline-block;
+            width: 70px;
+            text-align: left;
+        }
+        .ant-tag{
+            width: auto;
+            min-width: 50px;
+            text-align: center;
+        }
+    }
+    .info{
+        ul{
+            display: flex;
+            justify-content: space-between;
+            flex-wrap: wrap;
+        }
+        li{
+            width: 33.3%;
+            margin-bottom: 20px;
+        }
+        margin-bottom: 0;
+    }
+    .bottom-btn{
+        width: 100%;
+        text-align: center;
+        position: absolute;
+        bottom: 20px;
+        left: 0;
+
+    }
+}
+</style>
+
+<style lang="less">
+    .orderDetail{
+        .ant-timeline-item-head{
+            background: rgb(240,242,245);
+        }
+    }
+</style>
+<template>
+    <div class="orderDetail ">
+        <div class="topBody">
+            <p class="breadcrumb">
+                <a-breadcrumb style="display:block;width:100%">
+                    <a-breadcrumb-item><router-link to="/workBench">工作台</router-link></a-breadcrumb-item>
+                    <a-breadcrumb-item>订单列表</a-breadcrumb-item>
+                </a-breadcrumb>
+            </p>
+            <div class="bottom">
+                <div class="left" style="display:flex;width:70%">
+                     <div class="orderIcon">
+                        <img src="@/assets/orderIcon.png" alt="">
+                    </div>  
+                    <div class='tip'>
+                        <p class="greet">订单标题</p>
+                        <p class="descPosition">
+                        <ul>
+                            <li>
+                                <span>订单发起人:{{}}</span>
+                                <span>关联项目:{{}}</span>
+                            </li>
+                            <li>
+                                <span>创建时间:{{}}</span>
+                                <span>设计负责人:{{}}</span>
+                            </li>
+                            <li>
+                                <span>订单周期:{{}}</span>
+                            </li>
+                        </ul>
+                        </p>
+                    </div>
+                </div>
+               
+                <div class="optBody">
+                    <div class="btnBody">
+                        <a-button type='default' style="margin-right:15px" @click="withdrawOrder">撤回订单</a-button>
+                        <a-dropdown>
+                            <a-menu slot="overlay" @click="handleMenuClick">
+                                <a-menu-item key="1">1</a-menu-item>
+                                <a-menu-item key="2">2</a-menu-item>
+                                <a-menu-item key="3">3</a-menu-item>
+                            </a-menu>
+                            <a-button> 更多 <a-icon type="down" /> </a-button>
+                        </a-dropdown>
+                    </div>
+                    <div class="orderInfo">
+                        <div>
+                            <p class="markName">状态</p>
+                            <p class="big">{{ orderInfo.status || '待确定'}}</p>
+                        </div>
+                        <div>
+                            <p class="markName">订单进度</p>
+                            <p class="big">{{orderInfo.progress|| 0 }}%</p>
+                        </div>
+                    </div>
+                </div>
+                
+            </div>
+        </div>
+        <div class="section">
+            <div class="sectionBody">
+                
+                <!-- 素材列表 -->
+                <div class="section-item">
+                    <div class="tabBox">
+                        
+                        <div class="search-item">
+                            <span>订单名称:</span>
+                            <a-input placeholder="请输入订单名称" allow-clear v-model="orderName" style="width:300px" />
+                        </div>
+                        <div class="search-item">
+                            <span>订单编号:</span>
+                            <a-input placeholder="请输入订单编号" allow-clear v-model="orderId" style="width:300px" />
+                        </div>
+                        <div class="search-item">
+                            <span>订单状态:</span>
+                            <a-select
+                                show-search
+                                placeholder="选择订单状态"
+                                option-filter-prop="children"
+                                style="width: 300px"
+                                :filter-option="filterOption"
+                                @change="handleChange"
+                            >
+                                <a-select-option value="jack">
+                                Jack
+                                </a-select-option>
+                                <a-select-option value="lucy">
+                                Lucy
+                                </a-select-option>
+                                <a-select-option value="tom">
+                                Tom
+                                </a-select-option>
+                            </a-select>
+                        </div>
+                        <div class="search-item">
+                            <span>参与的人:</span>
+                            <a-input placeholder="请输入订单参与人" allow-clear v-model="orderParticipants" style="width:300px" />
+                        </div>
+                        <div class="search-item">
+                            <span>发起的人:</span>
+                            <a-input placeholder="请输入订单发起人" allow-clear v-model="orderSponsor" style="width:300px" />
+                        </div>
+                        <div class="opt-item">
+                            <a-button type='primary' @click="search" style="margin-right:20px">查询</a-button>
+                            <a-button type='default' @click="reset">查询</a-button>
+                        </div>
+                    </div>
+                        
+                    
+                    <div class="section-box">
+                         <a-table
+                            size="middle"
+                            :columns="columns"
+                            :dataSource="data"
+                            id="outTable"
+                            :pagination="ipagination"
+                            :loading="loading"
+                            @change="sort"
+                            style="word-break: break-all;"
+                            >
+                            <div slot="status" slot-scope="text" >
+                                <!-- <a-spin :spinning="record.spin" size="small" >
+                                    <div class="spin-content">
+                                        <a-switch size="default" :checked=text  @change="switchChange(text,record)"/>
+                                    </div>
+                                </a-spin>
+                                <a-switch size="default" :checked=text  @change="switchChange(text,record)"/> -->
+                               
+                                <span class="shenhe" v-if="text=='待审核'"> </span>
+                                <span class="wancheng" v-else-if="text=='已完成'"> </span>
+                                <span class="bohui" v-else> </span>
+                                {{text}}
+                            </div>
+                            <span slot="options" slot-scope="text,record">
+                                <a href="javascript:;" @click="hurryUp(record)">催一下</a>
+                                <a-divider type="vertical" />
+                                <a href="javascript:;" @click="viewDetails(record)">详情</a>
+
+                                <!-- <a-divider type="vertical" />
+                                <a href="javascript:;" @click="viewDetails(record)">通过</a>
+                                <a-divider type="vertical" />
+                                <a href="javascript:;" @click="viewDetails(record)">驳回</a> -->
+                                <!-- <a-divider type="vertical" /> -->
+                                                            
+                            </span>
+
+                        </a-table>
+                    </div>
+                    <a-drawer
+                    title="素材详情"
+                    width="640"
+                    :placement="placement"
+                    :closable="false"
+                    :visible="visible"
+                    @close="onClose"
+                    >
+                        <div class="videoBody">
+                            <div class="videoBox">
+                                <video :src="currentMaterial.src" ></video>
+                            </div>
+                            
+                            <div class="imgBox">
+                                <img src="" alt="">
+                                <img src="" alt="">
+                            </div>
+                        </div>
+                        <div class="marterialInfo">
+                            <div class="info-item">
+                                <span>素材状态:</span>
+                                <p>未审核</p>
+                            </div>
+                            <div class="info-item">
+                                <span>生成水印:</span>
+                                <a-select :defaultValue="4" v-model="size" style="width:70%;">
+                                    <a-select-option :value="item.id" :key="item.id" v-for="item of sizeType">{{
+                                        item.name
+                                    }}</a-select-option>
+                                </a-select>
+                                
+                            </div>
+                            <div class="info-item">
+                                <span>视频标签:</span>
+                                <a-tag>Tag 1</a-tag>
+                                <a-tag>Tag 1</a-tag>
+                            </div>
+                            <div class="info-item info">
+                                <ul>
+                                    <li><span>视频时长:</span> 17秒 </li>
+                                    <li><span>视频尺寸:</span> 1080*1920 </li>
+                                    <li><span>视频大小:</span> 31.42M </li>
+                                    <li><span>策划:</span> 吴永前 </li>
+                                    <li><span>拍摄:</span> 吴永前 </li>
+                                    <li><span>剪辑:</span> 吴永前 </li>                                    
+                                </ul>
+                            </div>
+                            <div class="info-item">
+                                <span>广告语:</span>
+                                <p>14354534324454354水电费水电费方式手动</p>
+                            </div>
+                            <div class="bottom-btn">
+                                <a-button type='primary' @click="approved" style="margin-right:20px">通过审核</a-button>
+                                <a-button type='default' @click="reject">驳回</a-button>
+                            </div>
+                        </div>
+                    </a-drawer>
+                </div>
+            </div>
+        </div>
+    </div>
+</template>
+
+<script>
+import moment from 'moment';
+import { getAction, postAction, downFile, downFilePost } from '@/api/manage';
+
+
+let listColumns=[
+    {
+        title: '订单名称',
+        dataIndex: 'name',
+        align: 'center',        
+        key: 'name',
+        scopedSlots: { customRender: 'name' }
+    },
+    {
+        title: '订单编号',
+        dataIndex: 'id',
+        align: 'center',        
+        key: 'tag',
+        scopedSlots: { customRender: 'tag' }
+    },
+    {
+        title: '订单发起人',
+        dataIndex: 'status',
+        align: 'center',        
+        key: 'status',
+        scopedSlots: { customRender: 'status' }
+    },
+    {
+        title: '订单状态',
+        dataIndex: 'time',
+        align: 'center',        
+        key: 'time',
+        scopedSlots: { customRender: 'time' }
+    },
+    {
+        title: '更新时间',
+        dataIndex: 'remarks',
+        align: 'center',        
+        key: 'remarks',
+        scopedSlots: { customRender: 'remarks' }
+    },
+    {
+        title: '操作',
+        dataIndex: 'options',
+        align: 'center',        
+        key: 'options',
+        width:250,
+        scopedSlots: { customRender: 'options' }
+    },
+]
+
+let marterialData=[
+    {
+        name:'1111',
+        type:'真人',
+        status:'待审核',
+        time:'2020-10-20 19:23:12',
+        id:0,
+        remarks:'xx'
+    },
+    {
+        name:'2211',
+        type:'vlog',
+        status:'已完成',
+        time:'2020-10-20 19:23:12',
+        id:1
+    },
+    {
+        name:'3331',
+        type:'真人',
+        status:'已驳回',
+        time:'2020-10-20 19:23:12',
+        id:2
+    },
+    {
+        name:'4444',
+        type:'真人',
+        status:'待审核',
+        time:'2020-10-20 19:23:12',
+        id:3
+    },
+]
+export default {
+    data() {
+        return {
+            orderInfo:{
+
+            },
+
+            columns:[...listColumns],
+            data:[...marterialData],
+            loading:false,
+            ipagination: {
+                current: 1,
+                pageSize: 10,
+                //   pageSizeOptions: ['10', '20', '30'],
+                showTotal: (total, range) => {
+                    return range[0] + "-" + range[1] + " 共" + total + "条"
+                },
+                showQuickJumper: true,
+                showSizeChanger:true,
+                pageSizeOptions: ['10', '30', '50'],
+                total: 0,
+                onChange: (current, pageSize) => {
+                    // 切换分页时的回调,
+                    // 当在页面定义change事件时,切记要把此处的事件清除,因为这两个事件重叠了,可能到时候会导致一些莫名的bug
+                    this.ipagination.current = current;
+                    this.ipagination.pageSize= pageSize;
+                }
+            },
+            // 订单进度
+            orderName:'',
+            orderId:'',
+            orderStatus:'',
+            orderParticipants:"",
+            orderSponsor:'',
+
+            visible: false,
+            placement: 'right',
+            currentMaterial:{},
+
+
+            sizeType:[],
+            size: "4",
+        }
+    },
+    methods: {
+        handleChange(value) {
+            console.log(`selected ${value}`);
+        },
+        
+        filterOption(input, option) {
+            return (
+                option.componentOptions.children[0].text.toLowerCase().indexOf(input.toLowerCase()) >= 0
+            );
+        },
+
+        // 查看详情
+        viewDetails(record){
+            console.log(record)
+            this.visible = true;
+        },
+        
+        onClose() {
+            this.visible = false;
+        },
+        // 撤回订单
+        withdrawOrder(){
+
+        },
+        // 更多操作
+        handleMenuClick(e) {
+            console.log('click', e);
+        },
+
+        // 催一下
+        hurryUp(record){
+            console.log(record)
+        },
+
+        // 验收
+        checkAccept(record){
+            console.log(record)
+        },
+
+        // 上传素材
+        uploadMaterial(){
+
+        },
+
+        sort(pagination, filters, sorter, { currentDataSource }){
+        
+            this.ipagination.current=pagination.current;
+
+            this.ipagination.pageSize=pagination.pageSize;
+            this.materialHttp()
+        },
+        // 请求素材
+        materialHttp(){
+            // this.loading=true;           
+            this.data=[];
+        },
+
+        
+
+        // tabqiehuan
+        tabChange(key){
+            console.log(key);
+            if(key==1){
+                this.columns=[...materialColumns]
+            }else{
+                this.columns=[...scriptColumns]
+            }
+        },
+
+        // 素材通过审核
+        approved(){
+
+        },
+        // 素材驳回
+        reject(){
+
+        },
+        
+        search(){
+
+        },
+        reset(){
+            this.orderName='';
+            this.orderId='';
+            this.orderStatus='';
+            this.orderParticipants="";
+            this.orderSponsor='';
+        },
+    },
+    created(){
+        
+    }
+}
+</script>

+ 7 - 1
src/views/modules/yard/YardList.vue

@@ -77,6 +77,11 @@
               <a-menu-item v-show="show">
                 <a @click="handleEdit(record)">编辑</a>
               </a-menu-item>
+              <a-menu-item v-show="show">
+                <a-popconfirm title="确定删除吗?" @confirm="() => handleDelete(record.id)">
+                  <a>删除</a>
+                </a-popconfirm>
+              </a-menu-item>
             </a-menu>
           </a-dropdown>
           <a-divider type="vertical" />
@@ -223,7 +228,8 @@
           }
         ],
         url: {
-          list: '/ctop/yard/list'
+          list: '/ctop/yard/list',
+          delete:'/ctop/yard/delete',
         },
         detail: false,
         indexDetail: '1',

+ 3 - 3
vue.config.js

@@ -70,16 +70,16 @@ module.exports = {
       '/jeecg-boot': {
         //  target: 'http://192.168.1.8:8080', //请求本地 需要jeecg-boot后台项目  蒙蒙
         // target: 'http://192.168.0.59:8088', //请求本地 需要jeecg-boot后台项目  英豪
-        target: 'http://192.168.1.188:8088', //请求本地 需要jeecg-boot后台项目  英豪
+        // target: 'http://192.168.1.188:8088', //请求本地 需要jeecg-boot后台项目  英豪
         // target: 'http://192.168.2.115:8080', //请求本地 需要jeecg-boot后台项目  祚云
 
         // target: 'http://192.168.1.74:8098', //请求本地 需要jeecg-boot后台项目  毕洁泉
-        // target: 'http://192.168.1.74:8088', //请求本地 需要jeecg-boot后台项目  毕洁泉
+        target: 'http://192.168.1.43:8088', //请求本地 需要jeecg-boot后台项目  毕洁泉
         // target: 'http://192.168.0.252:8098', //请求本地 需要jeecg-boot后台项目  毕洁泉
         
         // target: 'http://192.168.0.170:8088', //请求本地 需要jeecg-boot后台项目  毕洁泉
 
-        // target: 'http://192.168.1.94:8080', //请求本地 需要jeecg-boot后台项目  赵西安
+        // target: 'http://192.168.1.219:8080', //请求本地 需要jeecg-boot后台项目  赵西安
 
 
         //  target: 'http://api.tjyourong.com.cn', //请求本地 需要jeecg-boot后台项目