Ver Fonte

新闻推荐

licailing há 4 anos atrás
pai
commit
1701f9304d

+ 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;
 }

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

@@ -61,7 +61,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

+ 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;
         }
     }

+ 23 - 0
src/main/java/com/izouma/nineth/web/CollectionController.java

@@ -23,7 +23,9 @@ import org.springframework.web.bind.annotation.*;
 import javax.servlet.http.HttpServletResponse;
 import java.io.IOException;
 import java.util.Collections;
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 import java.util.stream.Collectors;
 
 @RestController
@@ -112,5 +114,26 @@ public class CollectionController extends BaseController {
             return collectionDTO;
         }).collect(Collectors.toList());
     }
+
+    //    @GetMapping("/recommendAll")
+//    @Cacheable("recommendAll")
+    public Map<String, List> recommendAll(@RequestParam String type) {
+        Map<String, List> map = new HashMap<>();
+
+        List<CollectionDTO> collectionDTOS = collectionRepo.recommend(type).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 collectionDTO;
+        }).collect(Collectors.toList());
+        map.put("collection", collectionDTOS);
+
+
+
+        return map;
+    }
 }
 

+ 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;