Sfoglia il codice sorgente

Merge branch 'master' of http://git.izouma.com/xiongzhu/raex_back into dev-meta

sunkean 3 anni fa
parent
commit
b3d49579f4

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

@@ -310,9 +310,9 @@ public class Asset extends CollectionBaseEntity {
         return Asset.builder()
         return Asset.builder()
                 .userId(user.getId())
                 .userId(user.getId())
                 .collectionId(photoAsset.getId())
                 .collectionId(photoAsset.getId())
-                .minter(photoAsset.getUserName())
-                .minterId(photoAsset.getUserId())
-                .minterAvatar(photoAsset.getUserAvatar())
+                .minter(user.getNickname())
+                .minterId(user.getId())
+                .minterAvatar(user.getAvatar())
                 .name(photoAsset.getPicName())
                 .name(photoAsset.getPicName())
                 .detail(photoAsset.getPicDesc())
                 .detail(photoAsset.getPicDesc())
                 .pic(Collections.singletonList(photoAsset.getPic()))
                 .pic(Collections.singletonList(photoAsset.getPic()))
@@ -331,7 +331,7 @@ public class Asset extends CollectionBaseEntity {
                 .oldHoldDays(1)
                 .oldHoldDays(1)
                 .source(AssetSource.OFFICIAL)
                 .source(AssetSource.OFFICIAL)
                 .companyId(1L)
                 .companyId(1L)
-                .chainFlag(1)
+                .chainFlag(3)
                 .build();
                 .build();
     }
     }
 }
 }

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

@@ -38,5 +38,9 @@ public class PhotoAsset extends BaseEntity {
     @Enumerated(EnumType.STRING)
     @Enumerated(EnumType.STRING)
     private CollectionStatus status;
     private CollectionStatus status;
 
 
+    private String auditResult;
+
     private Long createAssetId;
     private Long createAssetId;
+
+    private boolean gifted;
 }
 }

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

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

+ 11 - 23
src/main/java/com/izouma/nineth/service/AssetService.java

@@ -69,6 +69,7 @@ public class AssetService {
     private RockRecordRepo          rockRecordRepo;
     private RockRecordRepo          rockRecordRepo;
     private AssetLockRepo           assetLockRepo;
     private AssetLockRepo           assetLockRepo;
     private UserBalanceService      userBalanceService;
     private UserBalanceService      userBalanceService;
+    private PhotoAssetRepo          photoAssetRepo;
 
 
     public Page<Asset> all(PageQuery pageQuery) {
     public Page<Asset> all(PageQuery pageQuery) {
 
 
@@ -240,31 +241,9 @@ public class AssetService {
                 .build());
                 .build());
 
 
         //绿洲石
         //绿洲石
-        rockRecordService.addRock(user.getId(), price, "购买");
+//        rockRecordService.addRock(user.getId(), price, "购买");
 
 
         rocketMQTemplate.syncSend(generalProperties.getMintTopic(), asset.getId());
         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;
         return asset;
     }
     }
 
 
@@ -368,6 +347,9 @@ public class AssetService {
         if (asset.getTags() != null) {
         if (asset.getTags() != null) {
             collection.getTags().addAll(asset.getTags());
             collection.getTags().addAll(asset.getTags());
         }
         }
+        if (asset.getType().equals(CollectionType.PICTURE)) {
+            collection.setType(CollectionType.PICTURE);
+        }
         collectionRepo.save(collection);
         collectionRepo.save(collection);
         asset.setPublicShow(true);
         asset.setPublicShow(true);
         asset.setPublicCollectionId(collection.getId());
         asset.setPublicCollectionId(collection.getId());
@@ -627,6 +609,12 @@ public class AssetService {
         newAsset.setOasisId(asset.getOasisId());
         newAsset.setOasisId(asset.getOasisId());
         newAsset.setFromAssetId(asset.getId());
         newAsset.setFromAssetId(asset.getId());
         newAsset.setType(CollectionType.DEFAULT);
         newAsset.setType(CollectionType.DEFAULT);
+        if (asset.getType().equals(CollectionType.PICTURE)) {
+            newAsset.setType(CollectionType.PICTURE);
+            PhotoAsset photoAsset = photoAssetRepo.findFirstByCreateAssetId(asset.getId());
+            photoAsset.setGifted(true);
+            photoAssetRepo.save(photoAsset);
+        }
         newAsset.setSource(TransferReason.GIFT == reason ? AssetSource.GIFT : AssetSource.TRANSFER);
         newAsset.setSource(TransferReason.GIFT == reason ? AssetSource.GIFT : AssetSource.TRANSFER);
         newAsset.setTags(new HashSet<>(asset.getTags()));
         newAsset.setTags(new HashSet<>(asset.getTags()));
         newAsset.setSafeFlag(safeFlag);
         newAsset.setSafeFlag(safeFlag);

+ 107 - 1
src/main/java/com/izouma/nineth/service/ContentAuditService.java

@@ -5,15 +5,20 @@ import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
 import com.alibaba.fastjson.JSONObject;
 import com.aliyuncs.DefaultAcsClient;
 import com.aliyuncs.DefaultAcsClient;
 import com.aliyuncs.IAcsClient;
 import com.aliyuncs.IAcsClient;
+import com.aliyuncs.green.model.v20180509.ImageSyncScanRequest;
 import com.aliyuncs.green.model.v20180509.TextScanRequest;
 import com.aliyuncs.green.model.v20180509.TextScanRequest;
 import com.aliyuncs.http.FormatType;
 import com.aliyuncs.http.FormatType;
 import com.aliyuncs.http.HttpResponse;
 import com.aliyuncs.http.HttpResponse;
+import com.aliyuncs.http.MethodType;
+import com.aliyuncs.http.ProtocolType;
 import com.aliyuncs.profile.DefaultProfile;
 import com.aliyuncs.profile.DefaultProfile;
 import com.aliyuncs.profile.IClientProfile;
 import com.aliyuncs.profile.IClientProfile;
 import com.izouma.nineth.config.AliyunProperties;
 import com.izouma.nineth.config.AliyunProperties;
+import com.izouma.nineth.exception.BusinessException;
 import lombok.AllArgsConstructor;
 import lombok.AllArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.commons.lang3.StringUtils;
+import org.hibernate.internal.util.StringHelper;
 import org.springframework.stereotype.Service;
 import org.springframework.stereotype.Service;
 
 
 import java.nio.charset.StandardCharsets;
 import java.nio.charset.StandardCharsets;
@@ -54,7 +59,8 @@ public class ContentAuditService {
         try {
         try {
             HttpResponse httpResponse = client.doAction(textScanRequest);
             HttpResponse httpResponse = client.doAction(textScanRequest);
             if (httpResponse.isSuccess()) {
             if (httpResponse.isSuccess()) {
-                JSONObject scrResponse = JSON.parseObject(new String(httpResponse.getHttpContent(), StandardCharsets.UTF_8));
+                JSONObject scrResponse = JSON
+                        .parseObject(new String(httpResponse.getHttpContent(), StandardCharsets.UTF_8));
                 log.info(JSON.toJSONString(scrResponse, true));
                 log.info(JSON.toJSONString(scrResponse, true));
                 if (200 == scrResponse.getInteger("code")) {
                 if (200 == scrResponse.getInteger("code")) {
                     JSONArray taskResults = scrResponse.getJSONArray("data");
                     JSONArray taskResults = scrResponse.getJSONArray("data");
@@ -87,4 +93,104 @@ public class ContentAuditService {
         }
         }
         return true;
         return true;
     }
     }
+
+    public boolean auditImage(String imageUrl) {
+        IClientProfile profile = DefaultProfile.getProfile("cn-shenzhen",
+                aliyunProperties.getAccessKeyId(), aliyunProperties.getAccessKeySecret());
+        DefaultProfile
+                .addEndpoint("cn-shenzhen", "Green", "green.cn-shenzhen.aliyuncs.com");
+        IAcsClient client = new DefaultAcsClient(profile);
+
+        ImageSyncScanRequest imageSyncScanRequest = new ImageSyncScanRequest();
+        // 指定API返回格式。
+        imageSyncScanRequest.setAcceptFormat(FormatType.JSON);
+        // 指定请求方法。
+        imageSyncScanRequest.setMethod(MethodType.POST);
+        imageSyncScanRequest.setEncoding("utf-8");
+        // 支持HTTP和HTTPS。
+        imageSyncScanRequest.setProtocol(ProtocolType.HTTP);
+
+
+        JSONObject httpBody = new JSONObject();
+        /**
+         * 设置要检测的风险场景。计费依据此处传递的场景计算。
+         * 一次请求中可以同时检测多张图片,每张图片可以同时检测多个风险场景,计费按照场景计算。
+         * 例如,检测2张图片,场景传递porn和terrorism,计费会按照2张图片鉴黄,2张图片暴恐检测计算。
+         * porn:表示鉴黄场景。
+         */
+        httpBody.put("scenes", Collections.singletonList("porn"));
+
+        /**
+         * 设置待检测图片。一张图片对应一个task。
+         * 多张图片同时检测时,处理的时间由最后一个处理完的图片决定。
+         * 通常情况下批量检测的平均响应时间比单张检测的要长。一次批量提交的图片数越多,响应时间被拉长的概率越高。
+         * 这里以单张图片检测作为示例, 如果是批量图片检测,请自行构建多个task。
+         */
+        JSONObject task = new JSONObject();
+        task.put("dataId", UUID.randomUUID().toString());
+
+        // 设置图片链接。URL中有特殊字符,需要对URL进行encode编码。
+        task.put("url", imageUrl);
+        task.put("time", new Date());
+        httpBody.put("tasks", Collections.singletonList(task));
+
+        imageSyncScanRequest
+                .setHttpContent(org.apache.commons.codec.binary.StringUtils.getBytesUtf8(httpBody.toJSONString()),
+                        "UTF-8", FormatType.JSON);
+
+        /**
+         * 请设置超时时间。服务端全链路处理超时时间为10秒,请做相应设置。
+         * 如果您设置的ReadTimeout小于服务端处理的时间,程序中会获得一个ReadTimeout异常。
+         */
+        imageSyncScanRequest.setConnectTimeout(3000);
+        imageSyncScanRequest.setReadTimeout(10000);
+        HttpResponse httpResponse = null;
+        try {
+            httpResponse = client.doAction(imageSyncScanRequest);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+
+        // 服务端接收到请求,完成处理后返回的结果。
+        if (httpResponse != null && httpResponse.isSuccess()) {
+            JSONObject scrResponse = JSON.parseObject(org.apache.commons.codec.binary.StringUtils
+                    .newStringUtf8(httpResponse.getHttpContent()));
+            System.out.println(JSON.toJSONString(scrResponse, true));
+            int requestCode = scrResponse.getIntValue("code");
+            // 每一张图片的检测结果。
+            JSONArray taskResults = scrResponse.getJSONArray("data");
+            if (200 == requestCode) {
+                for (Object taskResult : taskResults) {
+                    // 单张图片的处理结果。
+                    int taskCode = ((JSONObject) taskResult).getIntValue("code");
+                    // 图片对应检测场景的处理结果。如果是多个场景,则会有每个场景的结果。
+                    JSONArray sceneResults = ((JSONObject) taskResult).getJSONArray("results");
+                    if (200 == taskCode) {
+                        for (Object sceneResult : sceneResults) {
+                            String scene = ((JSONObject) sceneResult).getString("scene");
+                            String suggestion = ((JSONObject) sceneResult).getString("suggestion");
+                            if (StringUtils.equals(suggestion, "pass")) {
+                                return false;
+                            }
+                            // 根据scene和suggestion做相关处理。
+                            // 根据不同的suggestion结果做业务上的不同处理。例如,将违规数据删除等。
+                            System.out.println("scene = [" + scene + "]");
+                            System.out.println("suggestion = [" + suggestion + "]");
+                        }
+                    } else {
+                        // 单张图片处理失败, 原因视具体的情况详细分析。
+                        System.out.println("task process fail. task response:" + JSON.toJSONString(taskResult));
+                        throw new BusinessException("审核失败");
+                    }
+                }
+            } else {
+                /**
+                 * 表明请求整体处理失败,原因视具体的情况详细分析。
+                 */
+                System.out.println("the whole image scan request failed. response:" + JSON.toJSONString(scrResponse));
+                throw new BusinessException("审核失败");
+            }
+        }
+        return true;
+    }
 }
 }

+ 48 - 8
src/main/java/com/izouma/nineth/service/PhotoAssetService.java

@@ -1,10 +1,14 @@
 package com.izouma.nineth.service;
 package com.izouma.nineth.service;
 
 
+import com.izouma.nineth.annotations.RedisLock;
+import com.izouma.nineth.config.GeneralProperties;
 import com.izouma.nineth.domain.Asset;
 import com.izouma.nineth.domain.Asset;
 import com.izouma.nineth.domain.Collection;
 import com.izouma.nineth.domain.Collection;
+import com.izouma.nineth.domain.IdentityAuth;
 import com.izouma.nineth.domain.PhotoAsset;
 import com.izouma.nineth.domain.PhotoAsset;
 import com.izouma.nineth.dto.PageQuery;
 import com.izouma.nineth.dto.PageQuery;
 import com.izouma.nineth.enums.AssetStatus;
 import com.izouma.nineth.enums.AssetStatus;
+import com.izouma.nineth.enums.AuthStatus;
 import com.izouma.nineth.enums.CollectionStatus;
 import com.izouma.nineth.enums.CollectionStatus;
 import com.izouma.nineth.exception.BusinessException;
 import com.izouma.nineth.exception.BusinessException;
 import com.izouma.nineth.repo.AssetRepo;
 import com.izouma.nineth.repo.AssetRepo;
@@ -13,19 +17,30 @@ import com.izouma.nineth.repo.UserRepo;
 import com.izouma.nineth.utils.JpaUtils;
 import com.izouma.nineth.utils.JpaUtils;
 import com.izouma.nineth.utils.ObjUtils;
 import com.izouma.nineth.utils.ObjUtils;
 import lombok.AllArgsConstructor;
 import lombok.AllArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.core.env.Environment;
 import org.springframework.data.domain.Page;
 import org.springframework.data.domain.Page;
+import org.springframework.scheduling.annotation.Scheduled;
 import org.springframework.stereotype.Service;
 import org.springframework.stereotype.Service;
 
 
 import java.math.BigDecimal;
 import java.math.BigDecimal;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.TimeUnit;
 
 
 @Service
 @Service
 @AllArgsConstructor
 @AllArgsConstructor
+@Slf4j
 public class PhotoAssetService {
 public class PhotoAssetService {
 
 
-    private PhotoAssetRepo photoAssetRepo;
-    private AssetRepo      assetRepo;
-    private AssetService   assetService;
-    private UserRepo       userRepo;
+    private PhotoAssetRepo      photoAssetRepo;
+    private AssetRepo           assetRepo;
+    private AssetService        assetService;
+    private UserRepo            userRepo;
+    private ContentAuditService contentAuditService;
+    private GeneralProperties   generalProperties;
+    private Environment         env;
 
 
     public Page<PhotoAsset> all(PageQuery pageQuery) {
     public Page<PhotoAsset> all(PageQuery pageQuery) {
         return photoAssetRepo
         return photoAssetRepo
@@ -39,19 +54,19 @@ public class PhotoAssetService {
         record.setUserAvatar(asset.getOwnerAvatar());
         record.setUserAvatar(asset.getOwnerAvatar());
         record.setUserName(asset.getOwner());
         record.setUserName(asset.getOwner());
         record.setDestroyAssetName(asset.getName());
         record.setDestroyAssetName(asset.getName());
+        record.setGifted(false);
         if (asset.getNumber() != null) {
         if (asset.getNumber() != null) {
             record.setDestroyAssetNumber(asset.getNumber().toString());
             record.setDestroyAssetNumber(asset.getNumber().toString());
         }
         }
         return photoAssetRepo.save(record);
         return photoAssetRepo.save(record);
     }
     }
 
 
-    public void pass(Long id) {
-        PhotoAsset photoAsset = photoAssetRepo.findById(id).orElseThrow(new BusinessException("无记录"));
+    public void pass(PhotoAsset photoAsset) {
         //销毁原来的藏品
         //销毁原来的藏品
         assetService.destroyWithoutTradecode(photoAsset.getDestroyAssetId(), photoAsset.getUserId());
         assetService.destroyWithoutTradecode(photoAsset.getDestroyAssetId(), photoAsset.getUserId());
         //生成新的藏品
         //生成新的藏品
         Long createId = assetService.createAsset(photoAsset, userRepo.findById(photoAsset.getUserId())
         Long createId = assetService.createAsset(photoAsset, userRepo.findById(photoAsset.getUserId())
-                .orElseThrow(new BusinessException("无用户记录")), null, BigDecimal.ZERO, "星图", 1, true).getId();
+                .orElseThrow(new BusinessException("无用户记录")), null, BigDecimal.ZERO, "星图", null, false).getId();
         photoAsset.setStatus(CollectionStatus.SUCCESS);
         photoAsset.setStatus(CollectionStatus.SUCCESS);
         photoAsset.setCreateAssetId(createId);
         photoAsset.setCreateAssetId(createId);
         photoAssetRepo.save(photoAsset);
         photoAssetRepo.save(photoAsset);
@@ -61,9 +76,34 @@ public class PhotoAssetService {
         PhotoAsset photoAsset = photoAssetRepo.findById(id).orElseThrow(new BusinessException("无记录"));
         PhotoAsset photoAsset = photoAssetRepo.findById(id).orElseThrow(new BusinessException("无记录"));
         photoAsset.setStatus(CollectionStatus.FAIL);
         photoAsset.setStatus(CollectionStatus.FAIL);
 
 
-        Asset asset = assetRepo.findById(photoAsset.getId()).orElseThrow(new BusinessException("无藏品记录"));
+        Asset asset = assetRepo.findById(photoAsset.getDestroyAssetId()).orElseThrow(new BusinessException("无藏品记录"));
         asset.setStatus(AssetStatus.NORMAL);
         asset.setStatus(AssetStatus.NORMAL);
         assetRepo.saveAndFlush(asset);
         assetRepo.saveAndFlush(asset);
         photoAssetRepo.save(photoAsset);
         photoAssetRepo.save(photoAsset);
     }
     }
+
+    @Scheduled(fixedRate = 60000)
+    @RedisLock(value = "autoPictureAudit", expire = 30, unit = TimeUnit.MINUTES)
+    public void autoValidate() {
+        if (generalProperties.isNotifyServer()) return;
+        if (Arrays.asList(env.getActiveProfiles()).contains("dev")) {
+            return;
+        }
+        try {
+            List<PhotoAsset> list = photoAssetRepo.findAllByStatusAndAuditResultNotNull(CollectionStatus.PENDING);
+            list.parallelStream().forEach(this::imageAudit);
+        } catch (Exception e) {
+            log.error("批量图片审核出错", e);
+        }
+    }
+
+    public void imageAudit(PhotoAsset photoAsset) {
+        boolean result = contentAuditService.auditImage(photoAsset.getPic().getUrl());
+        if (!result) {
+            photoAsset.setAuditResult("涉及色情性感内容或暴恐,需要人工审核.");
+            photoAssetRepo.save(photoAsset);
+        } else {
+            pass(photoAsset);
+        }
+    }
 }
 }

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

@@ -36,7 +36,7 @@ public class PhotoAssetController extends BaseController {
     @PreAuthorize("hasRole('ADMIN')")
     @PreAuthorize("hasRole('ADMIN')")
     @PostMapping("/pass")
     @PostMapping("/pass")
     public void pass(@RequestParam Long id) {
     public void pass(@RequestParam Long id) {
-        photoAssetService.pass(id);
+        photoAssetService.pass(photoAssetRepo.findById(id).orElseThrow(new BusinessException("未找到星图")));
     }
     }
 
 
     @PreAuthorize("hasRole('ADMIN')")
     @PreAuthorize("hasRole('ADMIN')")
@@ -46,7 +46,7 @@ public class PhotoAssetController extends BaseController {
     }
     }
 
 
 
 
-//    @PreAuthorize("hasRole('ADMIN')")
+    //    @PreAuthorize("hasRole('ADMIN')")
     @PostMapping("/all")
     @PostMapping("/all")
     public Page<PhotoAsset> all(@RequestBody PageQuery pageQuery) {
     public Page<PhotoAsset> all(@RequestBody PageQuery pageQuery) {
         return photoAssetService.all(pageQuery);
         return photoAssetService.all(pageQuery);

+ 1 - 0
src/main/java/com/izouma/nineth/web/UserController.java

@@ -114,6 +114,7 @@ public class UserController extends BaseController {
     @PostMapping("/all")
     @PostMapping("/all")
     public Page<UserDTO> all(@RequestBody PageQuery pageQuery) {
     public Page<UserDTO> all(@RequestBody PageQuery pageQuery) {
         pageQuery.getQuery().put("minter", true);
         pageQuery.getQuery().put("minter", true);
+        pageQuery.getQuery().putIfAbsent("companyId", 1L);
         if (pageQuery.getSize() > 100) pageQuery.setSize(100);
         if (pageQuery.getSize() > 100) pageQuery.setSize(100);
         return userService.toDTO(userService.all(pageQuery).toPage());
         return userService.toDTO(userService.all(pageQuery).toPage());
     }
     }

+ 11 - 6
src/main/vue/src/views/PhotoAssetList.vue

@@ -43,18 +43,23 @@
             <el-table-column prop="picDesc" label="图片描述"
             <el-table-column prop="picDesc" label="图片描述"
             >
             >
             </el-table-column>
             </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>
+            <el-table-column prop="pic" label="作品内容" width="90" align="center">
+                <template slot-scope="{ row }">
+                    <el-image
+                        style="width: 30px; height: 30px"
+                        :src="row.pic.thumb || row.pic.url"
+                        fit="cover"
+                        :preview-src-list="[row.pic.thumb || row.pic.url]"
+                    ></el-image>
                 </template>
                 </template>
             </el-table-column>
             </el-table-column>
             <el-table-column prop="status" label="状态"
             <el-table-column prop="status" label="状态"
                              :formatter="statusFormatter"
                              :formatter="statusFormatter"
             >
             >
             </el-table-column>
             </el-table-column>
+            <el-table-column prop="auditResult" label="图片审查建议"
+            >
+            </el-table-column>
             <el-table-column
             <el-table-column
                 label="操作"
                 label="操作"
                 align="center"
                 align="center"