Просмотр исходного кода

Merge branch 'dev' into 2D展厅

licailing 3 лет назад
Родитель
Сommit
72b288f347

+ 2 - 3
src/main/java/com/izouma/nineth/domain/News.java

@@ -6,14 +6,13 @@ import lombok.Builder;
 import lombok.Data;
 import lombok.NoArgsConstructor;
 
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.Transient;
+import javax.persistence.*;
 
 @Data
 @AllArgsConstructor
 @NoArgsConstructor
 @Builder
+@Table(indexes = {@Index(columnList = "title")})
 @Entity
 public class News extends BaseEntity {
     private String title;

+ 7 - 0
src/main/java/com/izouma/nineth/domain/Recommend.java

@@ -7,11 +7,14 @@ import lombok.Data;
 import lombok.NoArgsConstructor;
 
 import javax.persistence.Entity;
+import javax.persistence.Index;
+import javax.persistence.Table;
 
 @Data
 @Entity
 @AllArgsConstructor
 @NoArgsConstructor
+@Table(indexes = {@Index(columnList = "category")})
 @Builder
 public class Recommend extends BaseEntity {
 
@@ -28,4 +31,8 @@ public class Recommend extends BaseEntity {
     private String type;
 
     private String pic;
+
+    /*藏品,新闻*/
+    @ApiModelProperty("种类")
+    private String category;
 }

+ 14 - 0
src/main/java/com/izouma/nineth/dto/RecommendDTO.java

@@ -0,0 +1,14 @@
+package com.izouma.nineth.dto;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class RecommendDTO {
+    private Integer sort;
+    private Object obj;
+    private String type;
+}

+ 15 - 0
src/main/java/com/izouma/nineth/dto/RecommendNews.java

@@ -0,0 +1,15 @@
+package com.izouma.nineth.dto;
+
+import com.izouma.nineth.domain.News;
+import com.izouma.nineth.domain.Recommend;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class RecommendNews {
+    private News      news;
+    private Recommend recommend;
+}

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

@@ -62,7 +62,7 @@ public interface CollectionRepo extends JpaRepository<Collection, Long>, JpaSpec
     Collection save(@Nonnull Collection collection);
 
     @Query("select new com.izouma.nineth.dto.RecommendCollection(c,r) from Collection c join Recommend r on c.id = r.collectionId " +
-            "where c.del = false and c.onShelf = true and r.type = ?1 order by r.sort desc")
+            "where c.del = false and c.onShelf = true and r.type = ?1 and r.category = 'COLLECTION' order by r.sort desc")
     List<RecommendCollection> recommend(String type);
 
     @Transactional

+ 8 - 0
src/main/java/com/izouma/nineth/repo/NewsRepo.java

@@ -1,6 +1,8 @@
 package com.izouma.nineth.repo;
 
 import com.izouma.nineth.domain.News;
+import com.izouma.nineth.dto.RecommendCollection;
+import com.izouma.nineth.dto.RecommendNews;
 import org.springframework.cache.annotation.CacheEvict;
 import org.springframework.data.jpa.repository.JpaRepository;
 import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
@@ -8,6 +10,7 @@ import org.springframework.data.jpa.repository.Modifying;
 import org.springframework.data.jpa.repository.Query;
 
 import javax.transaction.Transactional;
+import java.util.List;
 
 public interface NewsRepo extends JpaRepository<News, Long>, JpaSpecificationExecutor<News> {
     @Query("update News t set t.del = true where t.id = ?1")
@@ -20,4 +23,9 @@ public interface NewsRepo extends JpaRepository<News, Long>, JpaSpecificationExe
     @Transactional
     @CacheEvict(value = "news", key = "#id")
     void addLike(Long id, int num);
+
+    @Query("select new com.izouma.nineth.dto.RecommendNews(n,r) from News n join Recommend r on n.id = r.collectionId " +
+                "where n.del = false and r.type = ?1 and r.category = 'NEWS' order by r.sort desc")
+    List<RecommendNews> recommend(String type);
+
 }

+ 7 - 1
src/main/java/com/izouma/nineth/service/OrderService.java

@@ -130,6 +130,8 @@ public class OrderService {
         int stock = Optional.ofNullable(collectionService.decreaseStock(collectionId, qty))
                 .map(Math::toIntExact)
                 .orElseThrow(new BusinessException("很遗憾,藏品已售罄", ErrorCode.SOLD_OUT));
+
+        int usePoint = 0;
         // 创建订单出错后需要回滚库存,所以需要try-catch
         try {
             if (stock < 0) {
@@ -188,7 +190,6 @@ public class OrderService {
             }
 
             //查询是否有拉新任务,只算官方购买
-            int usePoint = 0;
             if (collection.getSource() != CollectionSource.TRANSFER && collection.getAssignment() > 0) {
                 //延迟销售
                 if (!vip && collection.getTimeDelay()) {
@@ -290,6 +291,11 @@ public class OrderService {
             return order;
         } catch (Exception e) {
             collectionService.increaseStock(collectionId, qty);
+            if (usePoint > 0) {
+                // 扣除积分
+                userRepo.updateVipPoint(userId, usePoint);
+                log.info("取消加积分用户ID:{}, 积分:{}", userId, usePoint);
+            }
             throw e;
         }
     }

+ 36 - 8
src/main/java/com/izouma/nineth/web/CollectionController.java

@@ -2,11 +2,10 @@ package com.izouma.nineth.web;
 
 import com.izouma.nineth.domain.Collection;
 import com.izouma.nineth.domain.FileObject;
-import com.izouma.nineth.dto.CollectionDTO;
-import com.izouma.nineth.dto.CreateBlindBox;
-import com.izouma.nineth.dto.PageQuery;
+import com.izouma.nineth.dto.*;
 import com.izouma.nineth.exception.BusinessException;
 import com.izouma.nineth.repo.CollectionRepo;
+import com.izouma.nineth.repo.NewsRepo;
 import com.izouma.nineth.service.CollectionService;
 import com.izouma.nineth.service.LikeService;
 import com.izouma.nineth.utils.SecurityUtils;
@@ -16,15 +15,14 @@ import lombok.AllArgsConstructor;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.BeanUtils;
 import org.springframework.cache.annotation.CacheEvict;
-import org.springframework.cache.annotation.Cacheable;
 import org.springframework.data.domain.Page;
 import org.springframework.web.bind.annotation.*;
 
 import javax.servlet.http.HttpServletResponse;
 import java.io.IOException;
-import java.util.Collections;
-import java.util.List;
+import java.util.*;
 import java.util.stream.Collectors;
+import org.springframework.cache.annotation.Cacheable;
 
 @RestController
 @RequestMapping("/collection")
@@ -33,6 +31,7 @@ public class CollectionController extends BaseController {
     private CollectionService collectionService;
     private CollectionRepo    collectionRepo;
     private LikeService       likeService;
+    private NewsRepo          newsRepo;
 
     //@PreAuthorize("hasRole('ADMIN')")
     @PostMapping("/save")
@@ -99,8 +98,8 @@ public class CollectionController extends BaseController {
         collectionService.appointment(id, SecurityUtils.getAuthenticatedUser().getId());
     }
 
-    @GetMapping("/recommend")
-    @Cacheable("recommend")
+    //    @GetMapping("/recommend")
+//    @Cacheable("recommend")
     public List<CollectionDTO> recommend(@RequestParam String type) {
         return collectionRepo.recommend(type).stream().map(rc -> {
             if (StringUtils.isNotBlank(rc.getRecommend().getPic())) {
@@ -112,5 +111,34 @@ public class CollectionController extends BaseController {
             return collectionDTO;
         }).collect(Collectors.toList());
     }
+
+    @GetMapping("/recommend")
+    @Cacheable("recommend")
+    public List<RecommendDTO> recommendAll() {
+        List<RecommendDTO> recommedDTOS = new ArrayList<>();
+
+        List<RecommendDTO> collectionDTOS = collectionRepo.recommend("LIST").stream().map(rc -> {
+            if (StringUtils.isNotBlank(rc.getRecommend().getPic())) {
+                rc.getCollection().setPic(Collections.singletonList(new FileObject(null, rc.getRecommend()
+                        .getPic(), null, null)));
+            }
+            CollectionDTO collectionDTO = new CollectionDTO();
+            BeanUtils.copyProperties(rc.getCollection(), collectionDTO);
+            return new RecommendDTO(rc.getRecommend().getSort(), collectionDTO, "collection");
+        }).collect(Collectors.toList());
+
+        List<RecommendDTO> news = newsRepo.recommend("LIST").stream().map(rn -> {
+            if (StringUtils.isNotBlank(rn.getRecommend().getPic())) {
+                rn.getNews().setPic(rn.getRecommend().getPic());
+            }
+            rn.getNews().setSort(rn.getRecommend().getSort());
+            return new RecommendDTO(rn.getRecommend().getSort(), rn.getNews(), "news");
+        }).collect(Collectors.toList());
+
+        recommedDTOS.addAll(collectionDTOS);
+        recommedDTOS.addAll(news);
+        recommedDTOS.sort((a, b) -> b.getSort().compareTo(a.getSort()));
+        return recommedDTOS;
+    }
 }
 

+ 53 - 9
src/main/vue/src/views/RecommendEdit.vue

@@ -16,13 +16,36 @@
                     size="small"
                     style="max-width: 500px"
                 >
-                    <el-form-item prop="collectionId" label="藏品/盲盒ID">
+                    <el-form-item prop="type" label="类型">
+                        <el-select v-model="formData.category" clearable filterable placeholder="请选择">
+                            <el-option
+                                v-for="item in typeOptions"
+                                :key="item.value"
+                                :label="item.label"
+                                :value="item.value"
+                            >
+                            </el-option>
+                        </el-select>
+                    </el-form-item>
+                    <el-form-item prop="collectionId" label="藏品/盲盒ID" v-if="formData.category === 'COLLECTION'">
                         <collection-search v-model="formData.collectionId" @select="onSelect"></collection-search>
                     </el-form-item>
+                    <el-form-item prop="collectionId" label="新闻ID" v-else>
+                        <el-select
+                            v-model="formData.collectionId"
+                            clearable
+                            filterable
+                            placeholder="请选择"
+                            @change="onSelectNews"
+                        >
+                            <el-option v-for="item in newsList" :key="item.value" :label="item.title" :value="item.id">
+                            </el-option>
+                        </el-select>
+                    </el-form-item>
                     <el-form-item prop="sort" label="排序">
                         <el-input-number v-model="formData.sort" :min="0"></el-input-number>
                     </el-form-item>
-                    <el-form-item prop="type" label="类型">
+                    <!-- <el-form-item prop="type" label="类型">
                         <el-select v-model="formData.type" clearable filterable placeholder="请选择">
                             <el-option
                                 v-for="item in typeOptions"
@@ -32,7 +55,7 @@
                             >
                             </el-option>
                         </el-select>
-                    </el-form-item>
+                    </el-form-item> -->
                     <el-form-item label="图片" prop="pic">
                         <single-upload v-model="formData.pic"></single-upload>
                         <div class="tip">推荐分辨率:列表1000x1000,轮播765x420</div>
@@ -64,11 +87,22 @@ export default {
                     this.$message.error(e.error);
                 });
         }
+        this.$http
+            .post('news/all', { size: 100, sort: 'sort,desc', query: { del: false } }, { body: 'json' })
+            .then(res => {
+                this.newsList = res.content;
+            })
+            .catch(e => {
+                console.log(e);
+                this.$message.error(e.error);
+            });
     },
     data() {
         return {
             saving: false,
-            formData: {},
+            formData: {
+                type: 'LIST'
+            },
             rules: {
                 collectionId: [
                     {
@@ -101,9 +135,10 @@ export default {
                 pic: [{ required: true, message: '请上传图片' }]
             },
             typeOptions: [
-                { label: '列表', value: 'LIST' },
-                { label: '轮播', value: 'BANNER' }
-            ]
+                { label: '藏品/盲盒', value: 'COLLECTION' },
+                { label: '新闻', value: 'NEWS' }
+            ],
+            newsList: []
         };
     },
     methods: {
@@ -153,14 +188,23 @@ export default {
             console.log(e);
             if (e) {
                 this.$set(this.formData, 'name', e.name);
-                if (e.pic && e.pic[0]){
+                if (e.pic && e.pic[0]) {
                     if (/\.mp4$/.test(e.pic[0].url)) {
                         this.$set(this.formData, 'pic', e.pic[0].thumb);
                     } else {
                         this.$set(this.formData, 'pic', e.pic[0].url);
                     }
                 }
-
+            }
+        },
+        onSelectNews(val) {
+            let e = this.newsList.find(i => i.id === val);
+            console.log(e);
+            if (e) {
+                this.$set(this.formData, 'name', e.title);
+                if (e.pic) {
+                    this.$set(this.formData, 'pic', e.pic);
+                }
             }
         }
     }

+ 5 - 5
src/main/vue/src/views/RecommendList.vue

@@ -38,10 +38,10 @@
         >
             <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="collectionId" label="藏品/盲盒ID"> </el-table-column>
+            <el-table-column prop="collectionId" label="相关ID"> </el-table-column>
             <el-table-column prop="name" label="名称"> </el-table-column>
             <el-table-column prop="sort" label="排序"> </el-table-column>
-            <el-table-column prop="type" label="类型" :formatter="typeFormatter"> </el-table-column>
+            <el-table-column prop="category" label="类型" :formatter="typeFormatter"> </el-table-column>
             <el-table-column label="操作" align="center" fixed="right" width="150">
                 <template slot-scope="{ row }">
                     <el-button @click="editRow(row)" type="primary" size="mini" plain>编辑</el-button>
@@ -86,8 +86,8 @@ export default {
             url: '/recommend/all',
             downloading: false,
             typeOptions: [
-                { label: '列表', value: 'LIST' },
-                { label: '轮播', value: 'BANNER' }
+                { label: '藏品/盲盒', value: 'COLLECTION' },
+                { label: '新闻', value: 'NEWS' }
             ],
             type: null,
             sortStr: 'sort,desc'
@@ -107,7 +107,7 @@ export default {
             return '';
         },
         beforeGetData() {
-            return { search: this.search, query: { del: false, type: this.type } };
+            return { search: this.search, query: { del: false, category: this.type } };
         },
         toggleMultipleMode(multipleMode) {
             this.multipleMode = multipleMode;