소스 검색

Merge branch 'dev-meta' of xiongzhu/raex_back into master

sunkean 2 년 전
부모
커밋
e7c181c23c

+ 0 - 2
src/main/java/com/izouma/nineth/domain/MetaObjectMove.java

@@ -12,7 +12,6 @@ import lombok.NoArgsConstructor;
 import javax.persistence.Column;
 import javax.persistence.Column;
 import javax.persistence.Convert;
 import javax.persistence.Convert;
 import javax.persistence.Entity;
 import javax.persistence.Entity;
-import javax.persistence.Transient;
 import java.time.LocalDateTime;
 import java.time.LocalDateTime;
 import java.util.List;
 import java.util.List;
 
 
@@ -37,7 +36,6 @@ public class MetaObjectMove extends BaseEntity {
     @Convert(converter = MetaObjectMoveCoordinateListConverter.class)
     @Convert(converter = MetaObjectMoveCoordinateListConverter.class)
     private List<MetaObjectMoveCoordinateDTO> metaObjectMoveCoordinateDTOS;
     private List<MetaObjectMoveCoordinateDTO> metaObjectMoveCoordinateDTOS;
 
 
-    @Transient
     @ApiModelProperty("总移动时间")
     @ApiModelProperty("总移动时间")
     @ExcelProperty("总移动时间")
     @ExcelProperty("总移动时间")
     private Long totalTime;
     private Long totalTime;

+ 1 - 1
src/main/java/com/izouma/nineth/dto/MetaObjectMoveCoordinateDTO.java

@@ -23,5 +23,5 @@ public class MetaObjectMoveCoordinateDTO {
 
 
     private float eulerZ;
     private float eulerZ;
 
 
-    private Long time;
+    private long time;
 }
 }

+ 1 - 1
src/main/java/com/izouma/nineth/repo/MetaObjectMoveCoordinateRepo.java

@@ -6,5 +6,5 @@ import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
 
 
 public interface MetaObjectMoveCoordinateRepo extends JpaRepository<MetaObjectMoveCoordinate, Long>, JpaSpecificationExecutor<MetaObjectMoveCoordinate> {
 public interface MetaObjectMoveCoordinateRepo extends JpaRepository<MetaObjectMoveCoordinate, Long>, JpaSpecificationExecutor<MetaObjectMoveCoordinate> {
 
 
-    MetaObjectMoveCoordinate findByObjectIdAndCoordinateIndexAndDel(Long objectId, Long coordinateIndex, boolean del);
+    MetaObjectMoveCoordinate findByObjectIdAndCoordinateIndexAndDel(Long objectId, int coordinateIndex, boolean del);
 }
 }

+ 2 - 0
src/main/java/com/izouma/nineth/repo/MetaObjectMoveRepo.java

@@ -15,6 +15,8 @@ public interface MetaObjectMoveRepo extends JpaRepository<MetaObjectMove, Long>,
     @Transactional
     @Transactional
     void softDelete(Long id);
     void softDelete(Long id);
 
 
+    MetaObjectMove findByIdAndDel(Long id, boolean del);
+
     MetaObjectMove findByObjectIdAndDel(Long objectId, boolean del);
     MetaObjectMove findByObjectIdAndDel(Long objectId, boolean del);
 
 
     @Query(value = "select * from meta_object_move a where a.object_id like ?1 and a.del = false", nativeQuery = true)
     @Query(value = "select * from meta_object_move a where a.object_id like ?1 and a.del = false", nativeQuery = true)

+ 1 - 1
src/main/java/com/izouma/nineth/repo/MetaTaskNewRepo.java

@@ -22,6 +22,6 @@ public interface MetaTaskNewRepo extends JpaRepository<MetaTaskNew, Long>, JpaSp
 
 
     List<MetaTaskNew> findAllByPublishAndDel(boolean publish, boolean del);
     List<MetaTaskNew> findAllByPublishAndDel(boolean publish, boolean del);
 
 
-    @Query(value = "select * from meta_task_new where finish = false and del = false and publish = true and channel_id = ?2 and id not in (select task_id from meta_task_to_user where user_id = ?1)", nativeQuery = true)
+    @Query(value = "select * from meta_task_new where del = false and publish = true and channel_id = ?2 and id not in (select task_id from meta_task_to_user where user_id = ?1)", nativeQuery = true)
     List<MetaTaskNew> canGet(Long userId, Long channelId);
     List<MetaTaskNew> canGet(Long userId, Long channelId);
 }
 }

+ 198 - 1
src/main/java/com/izouma/nineth/service/MetaObjectMoveService.java

@@ -1,20 +1,217 @@
 package com.izouma.nineth.service;
 package com.izouma.nineth.service;
 
 
+import com.izouma.nineth.config.MetaConstants;
 import com.izouma.nineth.domain.MetaObjectMove;
 import com.izouma.nineth.domain.MetaObjectMove;
+import com.izouma.nineth.domain.MetaObjectMoveCoordinate;
+import com.izouma.nineth.dto.MetaObjectMoveCoordinateDTO;
 import com.izouma.nineth.dto.PageQuery;
 import com.izouma.nineth.dto.PageQuery;
+import com.izouma.nineth.exception.BusinessException;
+import com.izouma.nineth.repo.MetaObjectMoveCoordinateRepo;
 import com.izouma.nineth.repo.MetaObjectMoveRepo;
 import com.izouma.nineth.repo.MetaObjectMoveRepo;
 import com.izouma.nineth.utils.JpaUtils;
 import com.izouma.nineth.utils.JpaUtils;
 import lombok.AllArgsConstructor;
 import lombok.AllArgsConstructor;
+import org.apache.commons.collections.CollectionUtils;
 import org.springframework.data.domain.Page;
 import org.springframework.data.domain.Page;
+import org.springframework.data.redis.core.RedisTemplate;
 import org.springframework.stereotype.Service;
 import org.springframework.stereotype.Service;
 
 
+import javax.transaction.Transactional;
+import java.time.ZoneOffset;
+import java.util.*;
+import java.util.stream.Collectors;
+
 @Service
 @Service
 @AllArgsConstructor
 @AllArgsConstructor
 public class MetaObjectMoveService {
 public class MetaObjectMoveService {
 
 
-    private MetaObjectMoveRepo metaObjectMoveRepo;
+    private MetaObjectMoveRepo            metaObjectMoveRepo;
+    private MetaObjectMoveCoordinateRepo  metaObjectMoveCoordinateRepo;
+    private RedisTemplate<String, Object> redisTemplate;
 
 
     public Page<MetaObjectMove> all(PageQuery pageQuery) {
     public Page<MetaObjectMove> all(PageQuery pageQuery) {
         return metaObjectMoveRepo.findAll(JpaUtils.toSpecification(pageQuery, MetaObjectMove.class), JpaUtils.toPageRequest(pageQuery));
         return metaObjectMoveRepo.findAll(JpaUtils.toSpecification(pageQuery, MetaObjectMove.class), JpaUtils.toPageRequest(pageQuery));
     }
     }
+
+    @Transactional
+    public MetaObjectMove save(MetaObjectMove record) {
+        if (Objects.isNull(record)) {
+            throw new BusinessException("params can not be null");
+        }
+        if (Objects.isNull(record.getObjectId())) {
+            throw new BusinessException("objectId can not be null");
+        }
+        if (Objects.isNull(record.getStartTime())) {
+            throw new BusinessException("startTime can not be null");
+        }
+        MetaObjectMove metaObjectMove = metaObjectMoveRepo.findByObjectIdAndDel(record.getObjectId(), false);
+        if (Objects.nonNull(metaObjectMove)) {
+            throw new BusinessException("objectId already exists");
+        }
+        List<MetaObjectMoveCoordinateDTO> metaObjectMoveCoordinateDTOS = record.getMetaObjectMoveCoordinateDTOS();
+        if (CollectionUtils.isEmpty(metaObjectMoveCoordinateDTOS)) {
+            throw new BusinessException("object movement coordinates can not be null");
+        }
+        if (metaObjectMoveCoordinateDTOS.size() < 2) {
+            throw new BusinessException("object moves with at least two coordinates");
+        }
+        for (int i = 0; i < metaObjectMoveCoordinateDTOS.size(); i++) {
+            if (Float.isNaN(metaObjectMoveCoordinateDTOS.get(i).getAxisX())) {
+                throw new BusinessException("coordinates are illegal,axisX can not be null");
+            }
+            if (Float.isNaN(metaObjectMoveCoordinateDTOS.get(i).getAxisY())) {
+                throw new BusinessException("coordinates are illegal,axisY can not be null");
+            }
+            if (Float.isNaN(metaObjectMoveCoordinateDTOS.get(i).getAxisZ())) {
+                throw new BusinessException("coordinates are illegal,axisZ can not be null");
+            }
+            if (Float.isNaN(metaObjectMoveCoordinateDTOS.get(i).getEulerX())) {
+                throw new BusinessException("coordinates are illegal,eulerX can not be null");
+            }
+            if (Float.isNaN(metaObjectMoveCoordinateDTOS.get(i).getEulerY())) {
+                throw new BusinessException("coordinates are illegal,eulerY can not be null");
+            }
+            if (Float.isNaN(metaObjectMoveCoordinateDTOS.get(i).getEulerZ())) {
+                throw new BusinessException("coordinates are illegal,eulerZ can not be null");
+            }
+            if (i > 0 && metaObjectMoveCoordinateDTOS.get(i).getTime() <= metaObjectMoveCoordinateDTOS.get(i - 1).getTime()) {
+                throw new BusinessException("coordinates are illegal,time must be incremented");
+            }
+        }
+        record.setTotalTime(metaObjectMoveCoordinateDTOS.get(metaObjectMoveCoordinateDTOS.size() - 1).getTime());
+        MetaObjectMove save = metaObjectMoveRepo.save(record);
+        String objectMoveKey = MetaConstants.META_OBJECT_MOVE_REDIS_KEY.concat(String.valueOf(save.getObjectId()));
+        // 缓存-物体移动配置
+        if (Boolean.FALSE.equals(redisTemplate.hasKey(objectMoveKey))) {
+            redisTemplate.opsForValue().set(objectMoveKey, save);
+            handleCoordinate(save.getId());
+            return save;
+        }
+        redisTemplate.delete(objectMoveKey);
+        redisTemplate.opsForValue().set(objectMoveKey, save);
+        handleCoordinate(save.getId());
+        return save;
+    }
+
+    @Transactional
+    public void handleCoordinate(Long id) {
+        MetaObjectMove metaObjectMove = metaObjectMoveRepo.findByIdAndDel(id, false);
+        if (Objects.isNull(metaObjectMove)) {
+            throw new BusinessException("物体移动配置为空");
+        }
+        List<MetaObjectMoveCoordinateDTO> metaObjectMoveCoordinateDTOS = metaObjectMove.getMetaObjectMoveCoordinateDTOS();
+        if (CollectionUtils.isEmpty(metaObjectMoveCoordinateDTOS)) {
+            throw new BusinessException("物体移动坐标配置为空");
+        }
+        int size = metaObjectMoveCoordinateDTOS.size();
+        if (size < 2) {
+            throw new BusinessException("物体移动最低配置两个坐标");
+        }
+        List<MetaObjectMoveCoordinate> list = new ArrayList<>();
+        for (int i = 0; i < size - 1; i++) {
+            MetaObjectMoveCoordinateDTO start = metaObjectMoveCoordinateDTOS.get(i);
+            // 开始时间(getTime取出来的值单位为秒)
+            int startTime = (int) start.getTime() * 24;
+            MetaObjectMoveCoordinateDTO end = metaObjectMoveCoordinateDTOS.get(i + 1);
+            // 到达时间(getTime取出来的值单位为秒)
+            int endTime = (int) end.getTime() * 24;
+            // 两个坐标间总共移动时间
+            int time = endTime - startTime;
+            if (time <= 0) {
+                throw new BusinessException("两个坐标间移动时间必须大于0");
+            }
+            float startAxisX = start.getAxisX();
+            float endAxisX = end.getAxisX();
+            float axisX = (endAxisX - startAxisX) / time;
+
+            float startAxisY = start.getAxisY();
+            float endAxisY = end.getAxisY();
+            float axisY = (endAxisY - startAxisY) / time;
+
+            float startAxisZ = start.getAxisZ();
+            float endAxisZ = end.getAxisZ();
+            float axisZ = (endAxisZ - startAxisZ) / time;
+
+            float startEulerX = start.getEulerX();
+            float endEulerX = end.getEulerX();
+            float eulerX = (endEulerX - startEulerX) / time;
+
+            float startEulerY = start.getEulerY();
+            float endEulerY = end.getEulerY();
+            float eulerY = (endEulerY - startEulerY) / time;
+
+            float startEulerZ = start.getEulerZ();
+            float endEulerZ = end.getEulerZ();
+            float eulerZ = (endEulerZ - startEulerZ) / time;
+
+            for (int a = startTime; a <= endTime; a++) {
+                MetaObjectMoveCoordinate dbExist = metaObjectMoveCoordinateRepo.findByObjectIdAndCoordinateIndexAndDel(metaObjectMove.getObjectId(), a, false);
+                if (Objects.isNull(dbExist)) {
+                    dbExist = new MetaObjectMoveCoordinate();
+                    dbExist.setObjectId(metaObjectMove.getObjectId());
+                    dbExist.setCoordinateIndex(a);
+                    dbExist.setAxisX(startAxisX + (a - startTime) * axisX);
+                    dbExist.setAxisY(startAxisY + (a - startTime) * axisY);
+                    dbExist.setAxisZ(startAxisZ + (a - startTime) * axisZ);
+                    dbExist.setEulerX(startEulerX + (a - startTime) * eulerX);
+                    dbExist.setEulerY(startEulerY + (a - startTime) * eulerY);
+                    dbExist.setEulerZ(startEulerZ + (a - startTime) * eulerZ);
+                    list.add(dbExist);
+                    // 查询缓存坐标信息
+                    String coordinateKey = MetaConstants.META_OBJECT_INDEX_REDIS_KEY.concat(String.valueOf(dbExist.getObjectId())).concat("_").concat(String.valueOf(dbExist.getCoordinateIndex()));
+                    if (Boolean.FALSE.equals(redisTemplate.hasKey(coordinateKey))) {
+                        redisTemplate.opsForValue().set(coordinateKey, dbExist);
+                    } else {
+                        redisTemplate.delete(coordinateKey);
+                        redisTemplate.opsForValue().set(coordinateKey, dbExist);
+                    }
+                }
+            }
+        }
+        // 多索引去重
+        List<MetaObjectMoveCoordinate> distinctList = list.stream()
+                                                          .collect(Collectors.collectingAndThen(Collectors.toCollection(() ->
+                                                                          new TreeSet<>(Comparator.comparing(MetaObjectMoveCoordinate::getCoordinateIndex))),
+                                                                  ArrayList::new));
+        metaObjectMoveCoordinateRepo.saveAll(distinctList);
+    }
+
+    public MetaObjectMoveCoordinate queryCoordinate(Long objectId) {
+        // 查询缓存-物体移动配置
+        String objectMoveKey = MetaConstants.META_OBJECT_MOVE_REDIS_KEY.concat(String.valueOf(objectId));
+        MetaObjectMove metaObjectMove = (MetaObjectMove) redisTemplate.opsForValue().get(objectMoveKey);
+        // 缓存不存在 查询数据库
+        if (Objects.isNull(metaObjectMove)) {
+            metaObjectMove = metaObjectMoveRepo.findByObjectIdAndDel(objectId, false);
+            if (Objects.isNull(metaObjectMove)) {
+                throw new BusinessException("物体配置不存在!");
+            }
+            // 重新缓存-物体移动配置
+            redisTemplate.delete(objectMoveKey);
+            redisTemplate.opsForValue().set(objectMoveKey, metaObjectMove);
+        }
+        // 开始时间戳(单位为秒)
+        long startTime = metaObjectMove.getStartTime().toInstant(ZoneOffset.of("+8")).toEpochMilli() / 1000;
+        // 当前时间戳(单位为秒)
+        long currentTime = System.currentTimeMillis() / 1000;
+        // 计算坐标索引
+        long index = (currentTime - startTime) % (metaObjectMove.getTotalTime() * 2L);
+        if (index > (metaObjectMove.getTotalTime())) {
+            index = metaObjectMove.getTotalTime() * 2L - index;
+        }
+        index = index * 24;
+        // 查询缓存坐标信息
+        String coordinateKey = MetaConstants.META_OBJECT_INDEX_REDIS_KEY.concat(String.valueOf(objectId)).concat("_").concat(String.valueOf(index));
+        MetaObjectMoveCoordinate metaObjectMoveCoordinate = (MetaObjectMoveCoordinate) redisTemplate.opsForValue().get(coordinateKey);
+        if (Objects.isNull(metaObjectMoveCoordinate)) {
+            // 查询数据库坐标信息
+            metaObjectMoveCoordinate = metaObjectMoveCoordinateRepo.findByObjectIdAndCoordinateIndexAndDel(objectId, (int) index, false);
+            if (Objects.isNull(metaObjectMoveCoordinate)) {
+                throw new BusinessException("坐标信息为空");
+            }
+            // 重新缓存坐标信息
+            redisTemplate.delete(coordinateKey);
+            redisTemplate.opsForValue().set(coordinateKey, metaObjectMoveCoordinate);
+        }
+        return metaObjectMoveCoordinate;
+    }
 }
 }

+ 11 - 56
src/main/java/com/izouma/nineth/web/MetaObjectMoveController.java

@@ -1,46 +1,38 @@
 package com.izouma.nineth.web;
 package com.izouma.nineth.web;
 
 
-import com.izouma.nineth.config.MetaConstants;
 import com.izouma.nineth.domain.MetaObjectMove;
 import com.izouma.nineth.domain.MetaObjectMove;
 import com.izouma.nineth.domain.MetaObjectMoveCoordinate;
 import com.izouma.nineth.domain.MetaObjectMoveCoordinate;
 import com.izouma.nineth.dto.PageQuery;
 import com.izouma.nineth.dto.PageQuery;
 import com.izouma.nineth.exception.BusinessException;
 import com.izouma.nineth.exception.BusinessException;
-import com.izouma.nineth.repo.MetaObjectMoveCoordinateRepo;
 import com.izouma.nineth.repo.MetaObjectMoveRepo;
 import com.izouma.nineth.repo.MetaObjectMoveRepo;
 import com.izouma.nineth.service.MetaObjectMoveService;
 import com.izouma.nineth.service.MetaObjectMoveService;
-import com.izouma.nineth.utils.ObjUtils;
 import com.izouma.nineth.utils.excel.ExcelUtils;
 import com.izouma.nineth.utils.excel.ExcelUtils;
 import lombok.AllArgsConstructor;
 import lombok.AllArgsConstructor;
 import org.springframework.data.domain.Page;
 import org.springframework.data.domain.Page;
-import org.springframework.data.redis.core.RedisTemplate;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.web.bind.annotation.*;
 
 
 import javax.servlet.http.HttpServletResponse;
 import javax.servlet.http.HttpServletResponse;
 import java.io.IOException;
 import java.io.IOException;
-import java.time.ZoneOffset;
 import java.util.List;
 import java.util.List;
-import java.util.Objects;
-import java.util.concurrent.atomic.AtomicLong;
 
 
 @RestController
 @RestController
 @RequestMapping("/metaObjectMove")
 @RequestMapping("/metaObjectMove")
 @AllArgsConstructor
 @AllArgsConstructor
 public class MetaObjectMoveController extends BaseController {
 public class MetaObjectMoveController extends BaseController {
-    private MetaObjectMoveService         metaObjectMoveService;
-    private MetaObjectMoveRepo            metaObjectMoveRepo;
-    private MetaObjectMoveCoordinateRepo  metaObjectMoveCoordinateRepo;
-    private RedisTemplate<String, Object> redisTemplate;
+    private MetaObjectMoveService metaObjectMoveService;
+    private MetaObjectMoveRepo    metaObjectMoveRepo;
 
 
     //@PreAuthorize("hasRole('ADMIN')")
     //@PreAuthorize("hasRole('ADMIN')")
     @PostMapping("/save")
     @PostMapping("/save")
     public MetaObjectMove save(@RequestBody MetaObjectMove record) {
     public MetaObjectMove save(@RequestBody MetaObjectMove record) {
-        MetaObjectMove metaObjectMove = metaObjectMoveRepo.findByObjectId(record.getObjectId());
-        if (Objects.nonNull(metaObjectMove)) {
-            throw new BusinessException("当前物体id已经存在");
-        }
-        return metaObjectMoveRepo.save(record);
+        return metaObjectMoveService.save(record);
+
     }
     }
 
 
+    @PostMapping("/{id}/handleCoordinate")
+    public void handleCoordinate(@PathVariable Long id) {
+        metaObjectMoveService.handleCoordinate(id);
+    }
 
 
     //@PreAuthorize("hasRole('ADMIN')")
     //@PreAuthorize("hasRole('ADMIN')")
     @PostMapping("/all")
     @PostMapping("/all")
@@ -65,46 +57,9 @@ public class MetaObjectMoveController extends BaseController {
         ExcelUtils.export(response, data);
         ExcelUtils.export(response, data);
     }
     }
 
 
-    @GetMapping("/test")
-    public MetaObjectMoveCoordinate test(Long objectId) {
-        // 查询缓存-物体移动配置
-        String objectMoveKey = MetaConstants.META_OBJECT_MOVE_REDIS_KEY.concat(String.valueOf(objectId));
-        MetaObjectMove metaObjectMove = (MetaObjectMove) redisTemplate.opsForValue().get(objectMoveKey);
-        // 缓存不存在 查询数据库
-        if (Objects.isNull(metaObjectMove)) {
-            metaObjectMove = metaObjectMoveRepo.findByObjectIdAndDel(objectId, false);
-            if (Objects.isNull(metaObjectMove)) {
-                throw new BusinessException("物体配置不存在!");
-            }
-            AtomicLong totalTime = new AtomicLong();
-            metaObjectMove.getMetaObjectMoveCoordinateDTOS().forEach(metaObjectMoveCoordinateDTO -> {
-                totalTime.set(totalTime.get() + metaObjectMoveCoordinateDTO.getTime());
-            });
-            metaObjectMove.setTotalTime(totalTime.get());
-            // 重新缓存-物体移动配置
-            redisTemplate.delete(objectMoveKey);
-            redisTemplate.opsForValue().set(objectMoveKey, metaObjectMove);
-        }
-        long startTime = metaObjectMove.getStartTime().toInstant(ZoneOffset.of("+8")).toEpochMilli();
-        long now = System.currentTimeMillis();
-        long index = (now - startTime) % (metaObjectMove.getTotalTime() * 2L);
-        if (index > metaObjectMove.getTotalTime()) {
-            index = metaObjectMove.getTotalTime() * 2L - index;
-        }
-        // 查询缓存坐标信息
-        String coordinateKey = MetaConstants.META_OBJECT_INDEX_REDIS_KEY.concat(String.valueOf(objectId)).concat("_").concat(String.valueOf(index));
-        MetaObjectMoveCoordinate metaObjectMoveCoordinate = (MetaObjectMoveCoordinate) redisTemplate.opsForValue().get(coordinateKey);
-        if (Objects.isNull(metaObjectMoveCoordinate)) {
-            // 查询数据库坐标信息
-            metaObjectMoveCoordinate = metaObjectMoveCoordinateRepo.findByObjectIdAndCoordinateIndexAndDel(objectId, index, false);
-            if (Objects.isNull(metaObjectMoveCoordinate)) {
-                throw new BusinessException("坐标信息为空");
-            }
-            // 重新缓存坐标信息
-            redisTemplate.delete(coordinateKey);
-            redisTemplate.opsForValue().set(coordinateKey, metaObjectMoveCoordinate);
-        }
-        return metaObjectMoveCoordinate;
+    @GetMapping("/{objectId}/queryCoordinate")
+    public MetaObjectMoveCoordinate queryCoordinate(@PathVariable Long objectId) {
+        return metaObjectMoveService.queryCoordinate(objectId);
     }
     }
 }
 }
 
 

+ 193 - 250
src/main/vue/src/views/MetaObjectMoveEdit.vue

@@ -8,109 +8,65 @@
         </page-title>
         </page-title>
         <div class="edit-view__content-wrapper">
         <div class="edit-view__content-wrapper">
             <div class="edit-view__content-section">
             <div class="edit-view__content-section">
-                <el-form
-                    :model="formData"
-                    :rules="rules"
-                    ref="form"
-                    label-width="80px"
-                    label-position="right"
-                    size="small"
-                    style="max-width: 500px;"
-                >
+                <el-form :model="formData" :rules="rules" ref="form" label-width="80px" label-position="right" size="small"
+                    style="max-width: 500px;">
                     <el-form-item prop="objectId" label="物体id">
                     <el-form-item prop="objectId" label="物体id">
                         <el-input v-model="formData.objectId" :disabled="!canEdit"></el-input>
                         <el-input v-model="formData.objectId" :disabled="!canEdit"></el-input>
                     </el-form-item>
                     </el-form-item>
                     <el-form-item prop="startTime" label="开始时间">
                     <el-form-item prop="startTime" label="开始时间">
-                        <el-date-picker
-                            v-model="formData.startTime"
-                            type="datetime"
-                            value-format="yyyy-MM-dd HH:mm:ss"
-                            placeholder="请选择日期时间"
-                            :disabled="!canEdit"
-                        ></el-date-picker>
+                        <el-date-picker v-model="formData.startTime" type="datetime" value-format="yyyy-MM-dd HH:mm:ss"
+                            placeholder="请选择日期时间" :disabled="!canEdit"></el-date-picker>
                     </el-form-item>
                     </el-form-item>
 
 
-                    <el-form-item
-                        prop="metaObjectMoveCoordinateDTOS"
-                        label="坐标配置"
-                        style="width: calc(100vw - 450px)"
-                        size="mini"
-                    >
+                    <el-form-item prop="metaObjectMoveCoordinateDTOS" label="坐标配置" style="width: calc(100vw - 450px)"
+                        size="mini">
                         <el-table :data="formData.metaObjectMoveCoordinateDTOS">
                         <el-table :data="formData.metaObjectMoveCoordinateDTOS">
                             <el-table-column prop="axisX" label="axisX" align="center">
                             <el-table-column prop="axisX" label="axisX" align="center">
                                 <template v-slot="{ row }">
                                 <template v-slot="{ row }">
-                                    <el-input
-                                        v-model="row.axisX"
-                                        style="width: 120px"
-                                        placeholder="请输入axisX"
-                                        :disabled="!canEdit"
-                                    >
+                                    <el-input v-model="row.axisX" style="width: 120px" placeholder="请输入axisX"
+                                        :disabled="!canEdit">
                                     </el-input>
                                     </el-input>
                                 </template>
                                 </template>
                             </el-table-column>
                             </el-table-column>
                             <el-table-column prop="axisY" label="axisY" align="center">
                             <el-table-column prop="axisY" label="axisY" align="center">
                                 <template v-slot="{ row }">
                                 <template v-slot="{ row }">
-                                    <el-input
-                                        v-model="row.axisY"
-                                        style="width: 120px"
-                                        placeholder="请输入axisY"
-                                        :disabled="!canEdit"
-                                    >
+                                    <el-input v-model="row.axisY" style="width: 120px" placeholder="请输入axisY"
+                                        :disabled="!canEdit">
                                     </el-input>
                                     </el-input>
                                 </template>
                                 </template>
                             </el-table-column>
                             </el-table-column>
                             <el-table-column prop="axisZ" label="axisZ" align="center">
                             <el-table-column prop="axisZ" label="axisZ" align="center">
                                 <template v-slot="{ row }">
                                 <template v-slot="{ row }">
-                                    <el-input
-                                        v-model="row.axisZ"
-                                        style="width: 120px"
-                                        placeholder="请输入axisZ"
-                                        :disabled="!canEdit"
-                                    >
+                                    <el-input v-model="row.axisZ" style="width: 120px" placeholder="请输入axisZ"
+                                        :disabled="!canEdit">
                                     </el-input>
                                     </el-input>
                                 </template>
                                 </template>
                             </el-table-column>
                             </el-table-column>
                             <el-table-column prop="eulerX" label="eulerX" align="center">
                             <el-table-column prop="eulerX" label="eulerX" align="center">
                                 <template v-slot="{ row }">
                                 <template v-slot="{ row }">
-                                    <el-input
-                                        v-model="row.eulerX"
-                                        style="width: 120px"
-                                        placeholder="请输入eulerX"
-                                        :disabled="!canEdit"
-                                    >
+                                    <el-input v-model="row.eulerX" style="width: 120px" placeholder="请输入eulerX"
+                                        :disabled="!canEdit">
                                     </el-input>
                                     </el-input>
                                 </template>
                                 </template>
                             </el-table-column>
                             </el-table-column>
                             <el-table-column prop="eulerY" label="eulerY" align="center">
                             <el-table-column prop="eulerY" label="eulerY" align="center">
                                 <template v-slot="{ row }">
                                 <template v-slot="{ row }">
-                                    <el-input
-                                        v-model="row.eulerY"
-                                        style="width: 120px"
-                                        placeholder="请输入eulerY"
-                                        :disabled="!canEdit"
-                                    >
+                                    <el-input v-model="row.eulerY" style="width: 120px" placeholder="请输入eulerY"
+                                        :disabled="!canEdit">
                                     </el-input>
                                     </el-input>
                                 </template>
                                 </template>
                             </el-table-column>
                             </el-table-column>
                             <el-table-column prop="eulerZ" label="eulerZ" align="center">
                             <el-table-column prop="eulerZ" label="eulerZ" align="center">
                                 <template v-slot="{ row }">
                                 <template v-slot="{ row }">
-                                    <el-input
-                                        v-model="row.eulerZ"
-                                        style="width: 120px"
-                                        placeholder="请输入eulerZ"
-                                        :disabled="!canEdit"
-                                    >
+                                    <el-input v-model="row.eulerZ" style="width: 120px" placeholder="请输入eulerZ"
+                                        :disabled="!canEdit">
                                     </el-input>
                                     </el-input>
                                 </template>
                                 </template>
                             </el-table-column>
                             </el-table-column>
                             <el-table-column prop="time" label="time" align="center">
                             <el-table-column prop="time" label="time" align="center">
                                 <template v-slot="{ row }">
                                 <template v-slot="{ row }">
-                                    <el-input
-                                        v-model="row.time"
-                                        style="width: 120px"
-                                        placeholder="请输入time"
-                                        :disabled="!canEdit"
-                                    >
+                                    <el-input v-model="row.time" type="number" style="width: 120px" placeholder="请输入time"
+                                        :disabled="!canEdit">
                                     </el-input>
                                     </el-input>
                                 </template>
                                 </template>
                             </el-table-column>
                             </el-table-column>
@@ -124,6 +80,8 @@
                         </el-table>
                         </el-table>
                     </el-form-item>
                     </el-form-item>
                     <el-form-item v-if="canEdit">
                     <el-form-item v-if="canEdit">
+                        <div class="tip">注意坐标配置规则:时间含义为到达该坐标的时间(整数,单位为秒)</div>
+                        <div class="tip">起点时间必须为0,后续坐标时间递增</div>
                         <el-button size="mini" @click="add"> 添加坐标配置 </el-button>
                         <el-button size="mini" @click="add"> 添加坐标配置 </el-button>
                     </el-form-item>
                     </el-form-item>
                     <el-form-item class="form-submit">
                     <el-form-item class="form-submit">
@@ -142,193 +100,178 @@
 <script>
 <script>
 import { reg } from '../util/regRules';
 import { reg } from '../util/regRules';
 export default {
 export default {
-    name: 'MetaObjectMoveEdit',
-    created() {
-        if (this.$route.query.id) {
-            this.$http
-                .get('metaObjectMove/get/' + this.$route.query.id)
-                .then(res => {
-                    this.formData = res;
-                })
-                .catch(e => {
-                    console.log(e);
-                    this.$message.error(e.error);
-                });
-        }
-    },
-    computed: {
-        canEdit() {
-            return !!!this.$route.query.id;
-        }
-    },
-    data() {
-        return {
-            reg,
-            saving: false,
-            formData: {
-                metaObjectMoveCoordinateDTOS: []
-            },
-            rules: {
-                objectId: [
-                    {
-                        required: true,
-                        message: '请输入物体id',
-                        trigger: 'blur'
-                    }
-                ],
-                startTime: [
-                    {
-                        required: true,
-                        message: '请选择开始移动时间',
-                        trigger: 'blur'
-                    }
-                ],
-                metaObjectMoveCoordinateDTOS: [
-                    {
-                        required: true,
-                        validator: (rule, value, callback) => {
-                            if (value) {
-                                if (!(value instanceof Array)) {
-                                    callback(new Error('metaObjectMoveCoordinateDTOS must be array!'));
-                                    return;
-                                } else {
-                                    if (value.length < 2) {
-                                        callback(new Error('坐标配置必须大于2条'));
-                                        return;
-                                    }
-                                    for (let i = 0; i < value.length; i++) {
-                                        if (
-                                            value[i].axisX === '' ||
-                                            value[i].axisX === undefined ||
-                                            value[i].axisX === null
-                                        ) {
-                                            callback(new Error('请填写axisX'));
-                                            return;
-                                        }
-                                        if (
-                                            value[i].axisY === '' ||
-                                            value[i].axisY === undefined ||
-                                            value[i].axisY === null
-                                        ) {
-                                            callback(new Error('请填写axisY'));
-                                            return;
-                                        }
-                                        if (
-                                            value[i].axisZ === '' ||
-                                            value[i].axisZ === undefined ||
-                                            value[i].axisZ === null
-                                        ) {
-                                            callback(new Error('请填写axisZ'));
-                                            return;
-                                        }
-                                        if (
-                                            value[i].eulerX === '' ||
-                                            value[i].eulerX === undefined ||
-                                            value[i].eulerX === null
-                                        ) {
-                                            callback(new Error('请填写eulerX'));
-                                            return;
-                                        }
-                                        if (
-                                            value[i].eulerY === '' ||
-                                            value[i].eulerY === undefined ||
-                                            value[i].eulerY === null
-                                        ) {
-                                            callback(new Error('请填写eulerY'));
-                                            return;
-                                        }
-                                        if (
-                                            value[i].eulerZ === '' ||
-                                            value[i].eulerZ === undefined ||
-                                            value[i].eulerZ === null
-                                        ) {
-                                            callback(new Error('请填写eulerZ'));
-                                            return;
-                                        }
-                                        if (
-                                            value[i].time === '' ||
-                                            value[i].time === undefined ||
-                                            value[i].time === null
-                                        ) {
-                                            callback(new Error('请填写time'));
-                                            return;
-                                        }
-                                        if (i === 0) {
-                                            if (value[i].time !== '0') {
-                                                callback(new Error('time必须从0开始'));
-                                                return;
-                                            }
-                                        } else {
-                                            if (!this.reg.test(value[i].time)) {
-                                                callback(new Error('除起点以外,到达其他坐标时间必须为大于1的整数'));
-                                                return;
-                                            }
-                                            if (value[i].time <= value[i - 1].time) {
-                                                callback(new Error('时间必须为递增'));
-                                                return;
-                                            }
-                                        }
-                                    }
-                                }
-                            }
-                            callback();
-                        },
-                        trigger: 'blur'
-                    }
-                ]
-            }
-        };
-    },
-    methods: {
-        add() {
-            this.formData.metaObjectMoveCoordinateDTOS.push({});
-        },
-        delAward(i) {
-            this.formData.metaObjectMoveCoordinateDTOS.splice(i, 1);
-        },
-        onSave() {
-            this.$refs.form.validate(valid => {
-                if (valid) {
-                    this.submit();
-                } else {
-                    return false;
-                }
-            });
-        },
-        submit() {
-            let data = { ...this.formData };
+	name: 'MetaObjectMoveEdit',
+	created() {
+		if (this.$route.query.id) {
+			this.$http
+				.get('metaObjectMove/get/' + this.$route.query.id)
+				.then(res => {
+					this.formData = res;
+				})
+				.catch(e => {
+					console.log(e);
+					this.$message.error(e.error);
+				});
+		}
+	},
+	computed: {
+		canEdit() {
+			return !!!this.$route.query.id;
+		}
+	},
+	data() {
+		return {
+			reg,
+			saving: false,
+			formData: {
+				metaObjectMoveCoordinateDTOS: []
+			},
+			rules: {
+				objectId: [
+					{
+						required: true,
+						message: '请输入物体id',
+						trigger: 'blur'
+					}
+				],
+				startTime: [
+					{
+						required: true,
+						message: '请选择开始移动时间',
+						trigger: 'blur'
+					}
+				],
+				metaObjectMoveCoordinateDTOS: [
+					{
+						required: true,
+						validator: (rule, value, callback) => {
+							if (value) {
+								if (!(value instanceof Array)) {
+									callback(new Error('metaObjectMoveCoordinateDTOS must be array!'));
+									return;
+								} else {
+									if (value.length < 2) {
+										callback(new Error('坐标配置必须大于2条'));
+										return;
+									}
+									for (let i = 0; i < value.length; i++) {
+										if (
+											value[i].axisX === '' ||
+											value[i].axisX === undefined ||
+											value[i].axisX === null
+										) {
+											callback(new Error('请填写axisX'));
+											return;
+										}
+										if (
+											value[i].axisY === '' ||
+											value[i].axisY === undefined ||
+											value[i].axisY === null
+										) {
+											callback(new Error('请填写axisY'));
+											return;
+										}
+										if (
+											value[i].axisZ === '' ||
+											value[i].axisZ === undefined ||
+											value[i].axisZ === null
+										) {
+											callback(new Error('请填写axisZ'));
+											return;
+										}
+										if (
+											value[i].eulerX === '' ||
+											value[i].eulerX === undefined ||
+											value[i].eulerX === null
+										) {
+											callback(new Error('请填写eulerX'));
+											return;
+										}
+										if (
+											value[i].eulerY === '' ||
+											value[i].eulerY === undefined ||
+											value[i].eulerY === null
+										) {
+											callback(new Error('请填写eulerY'));
+											return;
+										}
+										if (
+											value[i].eulerZ === '' ||
+											value[i].eulerZ === undefined ||
+											value[i].eulerZ === null
+										) {
+											callback(new Error('请填写eulerZ'));
+											return;
+										}
+										if (
+											value[i].time === '' ||
+											value[i].time === undefined ||
+											value[i].time === null
+										) {
+											callback(new Error('请填写time'));
+											return;
+										}
+									}
+								}
+							}
+							callback();
+						},
+						trigger: 'blur'
+					}
+				]
+			}
+		};
+	},
+	methods: {
+		add() {
+			this.formData.metaObjectMoveCoordinateDTOS.push({});
+		},
+		delAward(i) {
+			this.formData.metaObjectMoveCoordinateDTOS.splice(i, 1);
+		},
+		onSave() {
+			this.$refs.form.validate(valid => {
+				if (valid) {
+					this.submit();
+				} else {
+					return false;
+				}
+			});
+		},
+		submit() {
+			let data = { ...this.formData };
 
 
-            this.saving = true;
-            this.$http
-                .post('/metaObjectMove/save', data, { body: 'json' })
-                .then(res => {
-                    this.saving = false;
-                    this.$message.success('成功');
-                    this.$router.go(-1);
-                })
-                .catch(e => {
-                    console.log(e);
-                    this.saving = false;
-                    this.$message.error(e.error);
-                });
-        },
-        onDelete() {
-            this.$confirm('删除将无法恢复,确认要删除么?', '警告', { type: 'error' })
-                .then(() => {
-                    return this.$http.post(`/metaObjectMove/del/${this.formData.id}`);
-                })
-                .then(() => {
-                    this.$message.success('删除成功');
-                    this.$router.go(-1);
-                })
-                .catch(e => {
-                    if (e !== 'cancel') {
-                        console.log(e);
-                        this.$message.error((e || {}).error || '删除失败');
-                    }
-                });
-        }
-    }
+			this.saving = true;
+			this.$http
+				.post('/metaObjectMove/save', data, { body: 'json' })
+				.then(res => {
+					this.saving = false;
+					this.$message.success('成功');
+					this.$router.go(-1);
+				})
+				.catch(e => {
+					console.log(e);
+					this.saving = false;
+					this.$message.error(e.error);
+				});
+		},
+		onDelete() {
+			this.$confirm('删除将无法恢复,确认要删除么?', '警告', { type: 'error' })
+				.then(() => {
+					return this.$http.post(`/metaObjectMove/del/${this.formData.id}`);
+				})
+				.then(() => {
+					this.$message.success('删除成功');
+					this.$router.go(-1);
+				})
+				.catch(e => {
+					if (e !== 'cancel') {
+						console.log(e);
+						this.$message.error((e || {}).error || '删除失败');
+					}
+				});
+		}
+	}
 };
 };
 </script>
 </script>
 <style lang="less" scoped></style>
 <style lang="less" scoped></style>

+ 105 - 155
src/main/vue/src/views/MetaObjectMoveList.vue

@@ -1,61 +1,27 @@
 <template>
 <template>
     <div class="list-view">
     <div class="list-view">
         <page-title>
         <page-title>
-            <el-button
-                @click="addRow"
-                type="primary"
-                icon="el-icon-plus"
-                :disabled="fetchingData || downloading"
-                class="filter-item"
-            >
+            <el-button @click="addRow" type="primary" icon="el-icon-plus" :disabled="fetchingData || downloading"
+                class="filter-item">
                 新增
                 新增
             </el-button>
             </el-button>
-            <el-button
-                @click="download"
-                icon="el-icon-upload2"
-                :loading="downloading"
-                :disabled="fetchingData"
-                class="filter-item"
-            >
+            <el-button @click="download" icon="el-icon-upload2" :loading="downloading" :disabled="fetchingData"
+                class="filter-item">
                 导出
                 导出
             </el-button>
             </el-button>
         </page-title>
         </page-title>
         <div class="filters-container">
         <div class="filters-container">
-            <el-input
-                placeholder="搜索..."
-                v-model="search"
-                clearable
-                class="filter-item search"
-                @keyup.enter.native="getData"
-            >
+            <el-input placeholder="搜索..." v-model="search" clearable class="filter-item search"
+                @keyup.enter.native="getData">
                 <el-button @click="getData" slot="append" icon="el-icon-search"> </el-button>
                 <el-button @click="getData" slot="append" icon="el-icon-search"> </el-button>
             </el-input>
             </el-input>
         </div>
         </div>
-        <el-table
-            :data="tableData"
-            row-key="id"
-            ref="table"
-            header-row-class-name="table-header-row"
-            header-cell-class-name="table-header-cell"
-            row-class-name="table-row"
-            cell-class-name="table-cell"
-            :height="tableHeight"
-            v-loading="fetchingData"
-        >
+        <el-table :data="tableData" row-key="id" ref="table" header-row-class-name="table-header-row"
+            header-cell-class-name="table-header-cell" row-class-name="table-row" cell-class-name="table-cell"
+            :height="tableHeight" v-loading="fetchingData">
             <el-table-column v-if="multipleMode" align="center" type="selection" width="50"> </el-table-column>
             <el-table-column v-if="multipleMode" align="center" type="selection" width="50"> </el-table-column>
-            <el-table-column prop="id" label="ID" width="100"> </el-table-column>
-            <el-table-column prop="objectId" label="物体id"> </el-table-column>
-            <!-- <el-table-column prop="metaObjectMoveCoordinateDTOS" label="坐标配置">
-                <template v-slot="{ row }">
-                    <template v-if="row.metaObjectMoveCoordinateDTOS">
-                        <div v-for="item in row.metaObjectMoveCoordinateDTOS" :key="item.index">
-                            axisX: {{ item.axisX }},axisX: {{ item.axisX }},axisX: {{ item.axisX }},axisX:
-                            {{ item.axisX }},axisX: {{ item.axisX }},axisX: {{ item.axisX }},axisX: {{ item.axisX }}
-                        </div>
-                    </template>
-                </template>
-            </el-table-column> -->
-            <el-table-column prop="startTime" label="物体开始移动时间"> </el-table-column>
+            <el-table-column prop="objectId" label="物体id" align="center" > </el-table-column>
+            <el-table-column prop="startTime" label="物体开始移动时间" align="center" > </el-table-column>
             <el-table-column label="操作" align="center" fixed="right" width="150">
             <el-table-column label="操作" align="center" fixed="right" width="150">
                 <template slot-scope="{ row }">
                 <template slot-scope="{ row }">
                     <el-button @click="editRow(row)" type="primary" size="mini" plain>查看</el-button>
                     <el-button @click="editRow(row)" type="primary" size="mini" plain>查看</el-button>
@@ -64,24 +30,9 @@
             </el-table-column>
             </el-table-column>
         </el-table>
         </el-table>
         <div class="pagination-wrapper">
         <div class="pagination-wrapper">
-            <!-- <div class="multiple-mode-wrapper">
-                <el-button v-if="!multipleMode" @click="toggleMultipleMode(true)">批量编辑</el-button>
-                <el-button-group v-else>
-                    <el-button @click="operation1">批量操作1</el-button>
-                    <el-button @click="operation2">批量操作2</el-button>
-                    <el-button @click="toggleMultipleMode(false)">取消</el-button>
-                </el-button-group>
-            </div> -->
-            <el-pagination
-                background
-                @size-change="onSizeChange"
-                @current-change="onCurrentChange"
-                :current-page="page"
-                :page-sizes="[10, 20, 30, 40, 50]"
-                :page-size="pageSize"
-                layout="total, sizes, prev, pager, next, jumper"
-                :total="totalElements"
-            >
+            <el-pagination background @size-change="onSizeChange" @current-change="onCurrentChange" :current-page="page"
+                :page-sizes="[10, 20, 30, 40, 50]" :page-size="pageSize" layout="total, sizes, prev, pager, next, jumper"
+                :total="totalElements">
             </el-pagination>
             </el-pagination>
         </div>
         </div>
     </div>
     </div>
@@ -91,97 +42,96 @@ import { mapState } from 'vuex';
 import pageableTable from '@/mixins/pageableTable';
 import pageableTable from '@/mixins/pageableTable';
 
 
 export default {
 export default {
-    name: 'MetaObjectMoveList',
-    mixins: [pageableTable],
-    data() {
-        return {
-            multipleMode: false,
-            search: '',
-            url: '/metaObjectMove/all',
-            downloading: false
-        };
-    },
-    computed: {
-        selection() {
-            return this.$refs.table.selection.map(i => i.id);
-        }
-    },
-    methods: {
-        beforeGetData() {
-            return { search: this.search, query: { del: false } };
-        },
-        toggleMultipleMode(multipleMode) {
-            this.multipleMode = multipleMode;
-            if (!multipleMode) {
-                this.$refs.table.clearSelection();
-            }
-        },
-        addRow() {
-            this.$router.push({
-                path: '/metaObjectMoveEdit',
-                query: {
-                    ...this.$route.query
-                }
-            });
-        },
-        editRow(row) {
-            this.$router.push({
-                path: '/metaObjectMoveEdit',
-                query: {
-                    id: row.id
-                }
-            });
-        },
-        download() {
-            this.downloading = true;
-            this.$axios
-                .get('/metaObjectMove/excel', {
-                    responseType: 'blob',
-                    params: { size: 10000 }
-                })
-                .then(res => {
-                    console.log(res);
-                    this.downloading = false;
-                    const downloadUrl = window.URL.createObjectURL(new Blob([res.data]));
-                    const link = document.createElement('a');
-                    link.href = downloadUrl;
-                    link.setAttribute('download', res.headers['content-disposition'].split('filename=')[1]);
-                    document.body.appendChild(link);
-                    link.click();
-                    link.remove();
-                })
-                .catch(e => {
-                    console.log(e);
-                    this.downloading = false;
-                    this.$message.error(e.error);
-                });
-        },
-        operation1() {
-            this.$notify({
-                title: '提示',
-                message: this.selection
-            });
-        },
-        operation2() {
-            this.$message('操作2');
-        },
-        deleteRow(row) {
-            this.$alert('删除将无法恢复,确认要删除么?', '警告', { type: 'error' })
-                .then(() => {
-                    return this.$http.post(`/metaObjectMove/del/${row.id}`);
-                })
-                .then(() => {
-                    this.$message.success('删除成功');
-                    this.getData();
-                })
-                .catch(e => {
-                    if (e !== 'cancel') {
-                        this.$message.error(e.error);
-                    }
-                });
-        }
-    }
+	name: 'MetaObjectMoveList',
+	mixins: [pageableTable],
+	data() {
+		return {
+			multipleMode: false,
+			search: '',
+			url: '/metaObjectMove/all',
+			downloading: false
+		};
+	},
+	computed: {
+		selection() {
+			return this.$refs.table.selection.map(i => i.id);
+		}
+	},
+	methods: {
+		beforeGetData() {
+			return { search: this.search, query: { del: false } };
+		},
+		toggleMultipleMode(multipleMode) {
+			this.multipleMode = multipleMode;
+			if (!multipleMode) {
+				this.$refs.table.clearSelection();
+			}
+		},
+		addRow() {
+			this.$router.push({
+				path: '/metaObjectMoveEdit',
+				query: {
+					...this.$route.query
+				}
+			});
+		},
+		editRow(row) {
+			this.$router.push({
+				path: '/metaObjectMoveEdit',
+				query: {
+					id: row.id
+				}
+			});
+		},
+		download() {
+			this.downloading = true;
+			this.$axios
+				.get('/metaObjectMove/excel', {
+					responseType: 'blob',
+					params: { size: 10000 }
+				})
+				.then(res => {
+					console.log(res);
+					this.downloading = false;
+					const downloadUrl = window.URL.createObjectURL(new Blob([res.data]));
+					const link = document.createElement('a');
+					link.href = downloadUrl;
+					link.setAttribute('download', res.headers['content-disposition'].split('filename=')[1]);
+					document.body.appendChild(link);
+					link.click();
+					link.remove();
+				})
+				.catch(e => {
+					console.log(e);
+					this.downloading = false;
+					this.$message.error(e.error);
+				});
+		},
+		operation1() {
+			this.$notify({
+				title: '提示',
+				message: this.selection
+			});
+		},
+		operation2() {
+			this.$message('操作2');
+		},
+		deleteRow(row) {
+			this.$alert('删除将无法恢复,确认要删除么?', '警告', { type: 'error' })
+				.then(() => {
+					return this.$http.post(`/metaObjectMove/del/${row.id}`);
+				})
+				.then(() => {
+					this.$message.success('删除成功');
+					this.getData();
+				})
+				.catch(e => {
+					if (e !== 'cancel') {
+						this.$message.error(e.error);
+					}
+				});
+		}
+	}
 };
 };
 </script>
 </script>
-<style lang="less" scoped>
-</style>
+<style lang="less" scoped></style>