wangqifan 3 years ago
parent
commit
a16de1e82d

+ 30 - 3
src/main/java/com/izouma/nineth/domain/Asset.java

@@ -23,9 +23,7 @@ import javax.persistence.*;
 import java.math.BigDecimal;
 import java.math.BigInteger;
 import java.time.LocalDateTime;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
+import java.util.*;
 
 
 @Data
@@ -307,4 +305,33 @@ public class Asset extends CollectionBaseEntity {
                 .chainFlag(item.getCollection().getChainFlag())
                 .build();
     }
+
+    public static Asset create(PhotoAsset photoAsset, User user) {
+        return Asset.builder()
+                .userId(user.getId())
+                .collectionId(photoAsset.getId())
+                .minter(photoAsset.getUserName())
+                .minterId(photoAsset.getUserId())
+                .minterAvatar(photoAsset.getUserAvatar())
+                .name(photoAsset.getPicName())
+                .detail(photoAsset.getPicDesc())
+                .pic(Collections.singletonList(photoAsset.getPic()))
+                .model3d(null)
+                .category("星图")
+                .canResale(false)
+                .royalties(0)
+                .serviceCharge(0)
+                .price(BigDecimal.ZERO)
+                .status(AssetStatus.NORMAL)
+                .owner(user.getNickname())
+                .ownerId(user.getId())
+                .ownerAvatar(user.getAvatar())
+                .type(CollectionType.PICTURE)
+                .holdDays(1)
+                .oldHoldDays(1)
+                .source(AssetSource.OFFICIAL)
+                .companyId(1L)
+                .chainFlag(1)
+                .build();
+    }
 }

+ 40 - 0
src/main/java/com/izouma/nineth/domain/PhotoAsset.java

@@ -0,0 +1,40 @@
+package com.izouma.nineth.domain;
+
+import com.izouma.nineth.converter.FileObjectConverter;
+import com.izouma.nineth.enums.CollectionStatus;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import javax.persistence.*;
+
+@Data
+@Entity
+@AllArgsConstructor
+@NoArgsConstructor
+public class PhotoAsset extends BaseEntity {
+    @ApiModelProperty("用户id")
+    private Long             userId;
+    @ApiModelProperty("销毁藏品id")
+    private Long             destroyAssetId;
+    @ApiModelProperty("销毁藏品名称")
+    private String           destroyAssetName;
+    @ApiModelProperty("销毁藏品编号")
+    private String           destroyAssetNumber;
+    @ApiModelProperty("用户名")
+    private String           userName;
+    @ApiModelProperty("用户头像")
+    private String           userAvatar;
+    @ApiModelProperty("图片名称")
+    private String           picName;
+    @ApiModelProperty("图片描述")
+    private String           picDesc;
+    @ApiModelProperty("图片")
+    @Column(columnDefinition = "TEXT")
+    @Convert(converter = FileObjectConverter.class)
+    private FileObject       pic;
+    @ApiModelProperty("状态")
+    @Enumerated(EnumType.STRING)
+    private CollectionStatus status;
+}

+ 2 - 1
src/main/java/com/izouma/nineth/enums/AssetStatus.java

@@ -10,7 +10,8 @@ public enum AssetStatus {
     AUCTIONING("拍卖中"),
     AUCTION_TRADING("拍卖中"),
     AUCTIONED("已拍卖"),
-    DESTROYED("已销毁")
+    DESTROYED("已销毁"),
+    DESTROYING("销毁中")
     ;
 
     private final String description;

+ 2 - 1
src/main/java/com/izouma/nineth/enums/CollectionType.java

@@ -4,7 +4,8 @@ public enum CollectionType {
     DEFAULT("默认"),
     BLIND_BOX("盲盒"),
     AUCTION("拍卖"),
-    SHOWROOM("展厅");
+    SHOWROOM("展厅"),
+    PICTURE("星图");
 
     private final String description;
 

+ 16 - 0
src/main/java/com/izouma/nineth/repo/PhotoAssetRepo.java

@@ -0,0 +1,16 @@
+package com.izouma.nineth.repo;
+
+import com.izouma.nineth.domain.PhotoAsset;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
+import org.springframework.data.jpa.repository.Modifying;
+import org.springframework.data.jpa.repository.Query;
+
+import javax.transaction.Transactional;
+
+public interface PhotoAssetRepo extends JpaRepository<PhotoAsset, Long>, JpaSpecificationExecutor<PhotoAsset> {
+    @Query("update PhotoAsset t set t.del = true where t.id = ?1")
+    @Modifying
+    @Transactional
+    void softDelete(Long id);
+}

+ 149 - 10
src/main/java/com/izouma/nineth/service/AssetService.java

@@ -209,6 +209,65 @@ public class AssetService {
         return asset;
     }
 
+    public Asset createAsset(PhotoAsset photoAsset, User user, Long orderId, BigDecimal price, String type,
+                             Integer number, boolean safeFlag) {
+        Asset asset = Asset.create(photoAsset, user);
+        asset.setTokenId(TokenUtils.genTokenId());
+        asset.setNumber(number);
+        asset.setOrderId(orderId);
+        asset.setPrice(price);
+        asset.setPrefixName("星图");
+        asset.setTags(new HashSet<>());
+        User fakeUser = null;
+        if (safeFlag) {
+            fakeUser = createFakeUser();
+            asset.setOwner(fakeUser.getNickname());
+            asset.setOwnerId(fakeUser.getId());
+            asset.setOwnerAvatar(fakeUser.getAvatar());
+        }
+        assetRepo.saveAndFlush(asset);
+        tokenHistoryRepo.save(TokenHistory.builder()
+                .tokenId(asset.getTokenId())
+                .fromUser(photoAsset.getUserName())
+                .fromUserId(photoAsset.getUserId())
+                .fromAvatar(photoAsset.getUserAvatar())
+                .toUser((safeFlag ? fakeUser : user).getNickname())
+                .toUserId((safeFlag ? fakeUser : user).getId())
+                .toAvatar((safeFlag ? fakeUser : user).getAvatar())
+                .operation(type)
+                .price(price)
+                .companyId(asset.getCompanyId())
+                .build());
+
+        //绿洲石
+        rockRecordService.addRock(user.getId(), price, "购买");
+
+        rocketMQTemplate.syncSend(generalProperties.getMintTopic(), asset.getId());
+        if (asset.getOasisId() != null & asset.getSource().equals(AssetSource.OFFICIAL)) {
+            AirDrop airDrop = new AirDrop();
+            airDrop.setName("建筑空投展厅");
+            airDrop.setCollectionId(207012L);
+            List<Long> userIds = new ArrayList<>();
+            userIds.add(user.getId());
+            List<Long> nums = new ArrayList<>();
+            nums.add(1L);
+            airDrop.setType(AirDropType.asset);
+            List<DropTarget> dropTargets = new ArrayList<>();
+            DropTarget dropTarget = new DropTarget();
+            dropTarget.setNickname(user.getNickname());
+            dropTarget.setNum(1);
+            dropTarget.setPhone(user.getPhone());
+            dropTarget.setUserId(user.getId());
+            dropTargets.add(dropTarget);
+            airDrop.setTargets(dropTargets);
+            airDrop.setUserIds(userIds);
+            airDrop.setNum(nums);
+            airDropService.create(airDrop);
+
+        }
+        return asset;
+    }
+
     public Asset createAsset(BlindBoxItem winItem, User user, Long orderId, BigDecimal price, String type,
                              Integer number, Integer holdDays, boolean safeFlag) {
         Collection blindBox = collectionRepo.findDetailById(winItem.getBlindBoxId())
@@ -321,6 +380,10 @@ public class AssetService {
             throw new BusinessException("此藏品不属于你");
         }
 
+        if (asset.getType().equals(CollectionType.PICTURE)) {
+            throw new BusinessException("星图藏品不可寄售");
+        }
+
         if (asset.getLockTo() != null && asset.getLockTo().isAfter(LocalDateTime.now())) {
             throw new BusinessException("已锁仓,不能寄售");
         }
@@ -430,6 +493,31 @@ public class AssetService {
         assetRepo.saveAndFlush(asset);
     }
 
+    public void cancelConsignmentAndStore(Long id) {
+        Asset asset = assetRepo.findById(id).orElseThrow(new BusinessException("无记录"));
+        if (!asset.getUserId().equals(SecurityUtils.getAuthenticatedUser().getId())) {
+            throw new BusinessException("此藏品不属于你");
+        }
+        if (!asset.getStatus().equals(AssetStatus.NORMAL)) {
+            throw new BusinessException("销毁藏品状态错误!");
+        }
+        if (asset.getPublicCollectionId() != null) {
+            List<Order> orders = orderRepo.findByCollectionId(asset.getPublicCollectionId());
+            if (orders.stream().anyMatch(o -> o.getStatus() != OrderStatus.CANCELLED)) {
+                throw new BusinessException("已有订单不可取消");
+            }
+            collectionRepo.findById(asset.getPublicCollectionId())
+                    .ifPresent(collection -> {
+                        collection.setSalable(false);
+                        collectionRepo.save(collection);
+                    });
+        }
+        asset.setConsignment(false);
+        asset.setPublicShow(false);
+        asset.setStatus(AssetStatus.DESTROYING);
+        assetRepo.saveAndFlush(asset);
+    }
+
     public void cancelConsignment(Long id) {
         Asset asset = assetRepo.findById(id).orElseThrow(new BusinessException("无记录"));
         if (!asset.getUserId().equals(SecurityUtils.getAuthenticatedUser().getId())) {
@@ -795,16 +883,16 @@ public class AssetService {
             if (tags.isEmpty()) return new PageImpl<>(Collections.emptyList());
             return assetRepo.findAll((Specification<Asset>) (root, query, criteriaBuilder) ->
                     query.distinct(true).where(
-                                    // where userId=some id
-                                    criteriaBuilder.equal(root.get("userId"), userId),
-                                    // and (lockTo is null or (lockTo is not null and lockTo < now))
-                                    criteriaBuilder.or(criteriaBuilder.isNull(root.get("lockTo")),
-                                            criteriaBuilder.and(criteriaBuilder.isNotNull(root.get("lockTo")),
-                                                    criteriaBuilder.lessThan(root.get("lockTo"), LocalDateTime.now()))),
-                                    // and status = 'NORMAL'
-                                    criteriaBuilder.equal(root.get("status"), AssetStatus.NORMAL),
-                                    // and has some tagId
-                                    root.join("tags").get("id").in(tags.stream().map(Tag::getId).toArray()))
+                            // where userId=some id
+                            criteriaBuilder.equal(root.get("userId"), userId),
+                            // and (lockTo is null or (lockTo is not null and lockTo < now))
+                            criteriaBuilder.or(criteriaBuilder.isNull(root.get("lockTo")),
+                                    criteriaBuilder.and(criteriaBuilder.isNotNull(root.get("lockTo")),
+                                            criteriaBuilder.lessThan(root.get("lockTo"), LocalDateTime.now()))),
+                            // and status = 'NORMAL'
+                            criteriaBuilder.equal(root.get("status"), AssetStatus.NORMAL),
+                            // and has some tagId
+                            root.join("tags").get("id").in(tags.stream().map(Tag::getId).toArray()))
                             .getRestriction(), pageable);
         } else {
             return assetRepo.findByUserIdAndStatusAndNameLike(userId, AssetStatus.NORMAL,
@@ -871,6 +959,57 @@ public class AssetService {
         userRepo.addDestroyPoint(userId, 1);
     }
 
+    public void destroyWithoutTradecode(Long id, Long userId) {
+        Asset asset = assetRepo.findById(id).orElseThrow(new BusinessException("无记录"));
+        if (!asset.getUserId().equals(userId)) {
+            throw new BusinessException("此藏品不属于该用户");
+        }
+        if (asset.getStatus() != AssetStatus.DESTROYING) {
+            throw new BusinessException("当前状态不可销毁");
+        }
+        if (asset.isPublicShow()) {
+            throw new BusinessException("请先取消公开展示");
+//            cancelPublic(asset);
+        }
+        User toUser = userRepo.findById(Constants.BLACK_HOLE_USER_ID).orElseThrow(new BusinessException("无记录"));
+
+        TokenHistory tokenHistory = TokenHistory.builder()
+                .tokenId(asset.getTokenId())
+                .fromUser(asset.getOwner())
+                .fromUserId(asset.getOwnerId())
+                .fromAvatar(asset.getOwnerAvatar())
+                .toUser(toUser.getNickname())
+                .toUserId(toUser.getId())
+                .toAvatar(toUser.getAvatar())
+                .operation(TransferReason.DESTROY.getDescription())
+                .price(null)
+                .companyId(asset.getCompanyId())
+                .build();
+        tokenHistoryRepo.save(tokenHistory);
+
+        asset.setPublicShow(false);
+        asset.setConsignment(false);
+        asset.setPublicCollectionId(null);
+        asset.setStatus(AssetStatus.DESTROYED);
+        asset.setOwner(toUser.getNickname());
+        asset.setOwnerId(toUser.getId());
+        asset.setOwnerAvatar(toUser.getAvatar());
+        assetRepo.saveAndFlush(asset);
+        //积分记录
+        destroyRecordRepo.save(DestroyRecord.builder()
+                .userId(userId)
+                .assetId(asset.getId())
+                .name(asset.getName())
+                .pic(asset.getPic().get(0).getUrl())
+                .record(1)
+                .type(RecordType.OBTAIN)
+                .companyId(asset.getCompanyId())
+                .build());
+
+        //加积分
+        userRepo.addDestroyPoint(userId, 1);
+    }
+
     public double getRoyalties(Long minterId, double royalties, Long userId) {
         if (royalties == 2) {
             return 2;

+ 61 - 0
src/main/java/com/izouma/nineth/service/PhotoAssetService.java

@@ -0,0 +1,61 @@
+package com.izouma.nineth.service;
+
+import com.izouma.nineth.domain.Asset;
+import com.izouma.nineth.domain.Collection;
+import com.izouma.nineth.domain.PhotoAsset;
+import com.izouma.nineth.dto.PageQuery;
+import com.izouma.nineth.enums.AssetStatus;
+import com.izouma.nineth.enums.CollectionStatus;
+import com.izouma.nineth.exception.BusinessException;
+import com.izouma.nineth.repo.AssetRepo;
+import com.izouma.nineth.repo.PhotoAssetRepo;
+import com.izouma.nineth.repo.UserRepo;
+import com.izouma.nineth.utils.JpaUtils;
+import com.izouma.nineth.utils.ObjUtils;
+import lombok.AllArgsConstructor;
+import org.springframework.data.domain.Page;
+import org.springframework.stereotype.Service;
+
+import java.math.BigDecimal;
+
+@Service
+@AllArgsConstructor
+public class PhotoAssetService {
+
+    private PhotoAssetRepo photoAssetRepo;
+    private AssetRepo      assetRepo;
+    private AssetService   assetService;
+    private UserRepo       userRepo;
+
+    public Page<PhotoAsset> all(PageQuery pageQuery) {
+        return photoAssetRepo
+                .findAll(JpaUtils.toSpecification(pageQuery, PhotoAsset.class), JpaUtils.toPageRequest(pageQuery));
+    }
+
+    public PhotoAsset save(PhotoAsset record) {
+        //将选取的藏品取消上架
+        assetService.cancelConsignmentAndStore(record.getDestroyAssetId());
+        return photoAssetRepo.save(record);
+    }
+
+    public void pass(Long id) {
+        PhotoAsset photoAsset = photoAssetRepo.findById(id).orElseThrow(new BusinessException("无记录"));
+        //销毁原来的藏品
+        assetService.destroyWithoutTradecode(photoAsset.getDestroyAssetId(), photoAsset.getUserId());
+        //生成新的藏品
+        assetService.createAsset(photoAsset, userRepo.findById(photoAsset.getUserId())
+                .orElseThrow(new BusinessException("无用户记录")), null, BigDecimal.ZERO, "星图", 1, true);
+        photoAsset.setStatus(CollectionStatus.SUCCESS);
+        photoAssetRepo.save(photoAsset);
+    }
+
+    public void deny(Long id) {
+        PhotoAsset photoAsset = photoAssetRepo.findById(id).orElseThrow(new BusinessException("无记录"));
+        photoAsset.setStatus(CollectionStatus.FAIL);
+
+        Asset asset = assetRepo.findById(photoAsset.getId()).orElseThrow(new BusinessException("无藏品记录"));
+        asset.setStatus(AssetStatus.NORMAL);
+        assetRepo.saveAndFlush(asset);
+        photoAssetRepo.save(photoAsset);
+    }
+}

+ 72 - 0
src/main/java/com/izouma/nineth/web/PhotoAssetController.java

@@ -0,0 +1,72 @@
+package com.izouma.nineth.web;
+
+import com.izouma.nineth.domain.PhotoAsset;
+import com.izouma.nineth.enums.CollectionStatus;
+import com.izouma.nineth.service.PhotoAssetService;
+import com.izouma.nineth.dto.PageQuery;
+import com.izouma.nineth.exception.BusinessException;
+import com.izouma.nineth.repo.PhotoAssetRepo;
+import com.izouma.nineth.utils.ObjUtils;
+import com.izouma.nineth.utils.SecurityUtils;
+import com.izouma.nineth.utils.excel.ExcelUtils;
+import io.swagger.annotations.ApiOperation;
+import lombok.AllArgsConstructor;
+import org.springframework.boot.autoconfigure.data.elasticsearch.ReactiveElasticsearchRepositoriesAutoConfiguration;
+import org.springframework.data.domain.Page;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.util.List;
+
+@RestController
+@RequestMapping("/photoAsset")
+@AllArgsConstructor
+public class PhotoAssetController extends BaseController {
+    private PhotoAssetService photoAssetService;
+    private PhotoAssetRepo    photoAssetRepo;
+
+    //@PreAuthorize("hasRole('ADMIN')")
+    @PostMapping("/save")
+    public PhotoAsset save(@RequestBody PhotoAsset record) {
+        return photoAssetService.save(record);
+    }
+
+    @PreAuthorize("hasRole('ADMIN')")
+    @PostMapping("/pass")
+    public void pass(@RequestParam Long id) {
+        photoAssetService.pass(id);
+    }
+
+    @PreAuthorize("hasRole('ADMIN')")
+    @PostMapping("/deny")
+    public void deny(@RequestParam Long id) {
+        photoAssetService.deny(id);
+    }
+
+
+//    @PreAuthorize("hasRole('ADMIN')")
+    @PostMapping("/all")
+    public Page<PhotoAsset> all(@RequestBody PageQuery pageQuery) {
+        return photoAssetService.all(pageQuery);
+    }
+
+    @GetMapping("/get/{id}")
+    public PhotoAsset get(@PathVariable Long id) {
+        return photoAssetRepo.findById(id).orElseThrow(new BusinessException("无记录"));
+    }
+
+    @PostMapping("/del/{id}")
+    public void del(@PathVariable Long id) {
+        photoAssetRepo.softDelete(id);
+    }
+
+    @GetMapping("/excel")
+    @ResponseBody
+    public void excel(HttpServletResponse response, PageQuery pageQuery) throws IOException {
+        List<PhotoAsset> data = all(pageQuery).getContent();
+        ExcelUtils.export(response, data);
+    }
+}
+

+ 8 - 0
src/main/vue/src/router.js

@@ -1220,6 +1220,14 @@ const router = new Router({
                     meta: {
                        title: 'MMO登陆信息',
                     },
+                },
+                {
+                    path: '/photoAssetList',
+                    name: 'PhotoAssetList',
+                    component: () => import(/* webpackChunkName: "photoAssetList" */ '@/views/PhotoAssetList.vue'),
+                    meta: {
+                        title: '相册',
+                    },
                 }
                 /**INSERT_LOCATION**/
             ]

+ 253 - 0
src/main/vue/src/views/PhotoAssetList.vue

@@ -0,0 +1,253 @@
+<template>
+    <div class="list-view">
+        <page-title>
+<!--            <el-button @click="addRow" type="primary" icon="el-icon-plus" :disabled="fetchingData || downloading"-->
+<!--                       class="filter-item">-->
+<!--                新增-->
+<!--            </el-button>-->
+            <el-button @click="download" icon="el-icon-upload2" :loading="downloading" :disabled="fetchingData"
+                       class="filter-item">
+                导出
+            </el-button>
+        </page-title>
+        <div class="filters-container">
+            <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-input>
+        </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-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="userId" label="用户Id"
+            >
+            </el-table-column>
+            <el-table-column prop="userName" label="用户名"
+            >
+            </el-table-column>
+            <el-table-column prop="picName" label="图片名称"
+            >
+            </el-table-column>
+            <el-table-column prop="picDesc" label="图片描述"
+            >
+            </el-table-column>
+            <el-table-column prop="pic" label="图片"
+            >
+                <template slot-scope="{row}">
+                    <el-image style="width: 30px; height: 30px"
+                              :src="row.pic" fit="cover"
+                              :preview-src-list="[row.pic]"></el-image>
+                </template>
+            </el-table-column>
+            <el-table-column prop="status" label="状态"
+                             :formatter="statusFormatter"
+            >
+            </el-table-column>
+            <el-table-column
+                label="操作"
+                align="center"
+                fixed="right"
+                width="150">
+                <template slot-scope="{row}">
+                    <el-button
+                        @click="pass(row)"
+                        type="success"
+                        size="mini"
+                        plain
+                        v-if="row.status === 'PENDING'"
+                        :loading="row.saving"
+                    >
+                        通过
+                    </el-button>
+                    <el-button
+                        @click="deny(row)"
+                        type="danger"
+                        size="mini"
+                        plain
+                        v-if="row.status === 'PENDING'"
+                        :loading="row.saving"
+                    >
+                        拒绝
+                    </el-button>
+                </template>
+            </el-table-column>
+        </el-table>
+        <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>
+        </div>
+
+    </div>
+</template>
+<script>
+import {mapState} from "vuex";
+import pageableTable from "@/mixins/pageableTable";
+
+export default {
+    name: 'PhotoAssetList',
+    mixins: [pageableTable],
+    data() {
+        return {
+            multipleMode: false,
+            search: "",
+            url: "/photoAsset/all",
+            downloading: false,
+            statusOptions: [{"label": "审核中", "value": "PENDING"}, {"label": "通过", "value": "SUCCESS"}, {
+                "label": "失败",
+                "value": "FAIL"
+            }],
+        }
+    },
+    computed: {
+        selection() {
+            return this.$refs.table.selection.map(i => i.id);
+        }
+    },
+    methods: {
+        afterGetData(res) {
+            this.tableData = res.content.map(item => {
+                return {
+                    ...item,
+                    saving: false
+                };
+            });
+        },
+        pass(row) {
+            this.$set(row, 'saving', true);
+            this.$confirm('确定通过?')
+                .then(res => {
+                    return this.$http.post('/photoAsset/pass', { id: row.id });
+                })
+                .then(res => {
+                    this.$message.success('成功');
+                    this.$set(row, 'saving', false);
+                    this.getData();
+                })
+                .catch(e => {
+                    this.$set(row, 'saving', false);
+                });
+        },
+        deny(row, index) {
+            this.$set(row, 'saving', true);
+            this.$confirm('确定拒绝?')
+                .then(res => {
+                    return this.$http.post('/photoAsset/deny', { id: row.id });
+                })
+                .then(res => {
+                    this.$message.success('成功');
+                    this.$set(row, 'saving', false);
+                    this.getData();
+                })
+                .catch(e => {
+                    this.$set(row, 'saving', false);
+                });
+        },
+        statusFormatter(row, column, cellValue, index) {
+            let selectedOption = this.statusOptions.find(i => i.value === cellValue);
+            if (selectedOption) {
+                return selectedOption.label;
+            }
+            return '';
+        },
+        beforeGetData() {
+            return {search: this.search, query: {del: false}};
+        },
+        toggleMultipleMode(multipleMode) {
+            this.multipleMode = multipleMode;
+            if (!multipleMode) {
+                this.$refs.table.clearSelection();
+            }
+        },
+        addRow() {
+            this.$router.push({
+                path: "/photoAssetEdit",
+                query: {
+                    ...this.$route.query
+                }
+            });
+        },
+        editRow(row) {
+            this.$router.push({
+                path: "/photoAssetEdit",
+                query: {
+                    id: row.id
+                }
+            });
+        },
+        download() {
+            this.downloading = true;
+            this.$axios
+                .get("/photoAsset/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(`/photoAsset/del/${row.id}`)
+            }).then(() => {
+                this.$message.success('删除成功');
+                this.getData();
+            }).catch(e => {
+                if (e !== 'cancel') {
+                    this.$message.error(e.error);
+                }
+            })
+        },
+    }
+}
+</script>
+<style lang="less" scoped>
+</style>