zwhui преди 2 години
родител
ревизия
a8d52a1f80
променени са 39 файла, в които са добавени 1092 реда и са изтрити 4 реда
  1. 35 0
      netflix-common/src/main/java/com/cyksj/common/util/TimeUtil.java
  2. 11 0
      netflix-dao/src/main/java/com/cyksj/mapper/InformationCategoryMapper.java
  3. 11 0
      netflix-dao/src/main/java/com/cyksj/mapper/InformationClickUserRecordMapper.java
  4. 20 0
      netflix-dao/src/main/java/com/cyksj/mapper/InformationMapper.java
  5. 11 0
      netflix-dao/src/main/java/com/cyksj/mapper/SearchHistoryMapper.java
  6. 11 0
      netflix-dao/src/main/java/com/cyksj/mapper/UserGalaxycoinRecordMapper.java
  7. 4 0
      netflix-dao/src/main/java/com/cyksj/mapper/UserMapper.java
  8. 57 0
      netflix-dao/src/main/java/com/cyksj/model/entity/Information.java
  9. 22 0
      netflix-dao/src/main/java/com/cyksj/model/entity/InformationCategory.java
  10. 18 0
      netflix-dao/src/main/java/com/cyksj/model/entity/InformationClickUserRecord.java
  11. 10 0
      netflix-dao/src/main/java/com/cyksj/model/entity/OrderDon.java
  12. 20 0
      netflix-dao/src/main/java/com/cyksj/model/entity/SearchHistory.java
  13. 5 0
      netflix-dao/src/main/java/com/cyksj/model/entity/User.java
  14. 36 0
      netflix-dao/src/main/java/com/cyksj/model/entity/UserGalaxycoinRecord.java
  15. 6 0
      netflix-dao/src/main/java/com/cyksj/model/request/ClickRecordReq.java
  16. 5 0
      netflix-dao/src/main/java/com/cyksj/model/request/OrderPayRequest.java
  17. 76 0
      netflix-dao/src/main/java/com/cyksj/model/views/InformationDetailView.java
  18. 41 0
      netflix-dao/src/main/java/com/cyksj/model/views/InformationListView.java
  19. 101 0
      netflix-dao/src/main/java/com/cyksj/model/views/InformationView.java
  20. 17 0
      netflix-dao/src/main/java/com/cyksj/model/views/SearchView.java
  21. 5 0
      netflix-dao/src/main/java/com/cyksj/model/views/UserPersonalView.java
  22. 28 0
      netflix-dao/src/main/resources/mapper/InformationMapper.xml
  23. 1 0
      netflix-service/src/main/java/com/cyksj/redis/RedisService.java
  24. 16 0
      netflix-service/src/main/java/com/cyksj/service/home/impl/ClickRecordFrontServiceImpl.java
  25. 11 0
      netflix-service/src/main/java/com/cyksj/service/information/InformationCategoryService.java
  26. 17 0
      netflix-service/src/main/java/com/cyksj/service/information/InformationService.java
  27. 15 0
      netflix-service/src/main/java/com/cyksj/service/information/impl/InformationCategoryServiceImpl.java
  28. 32 0
      netflix-service/src/main/java/com/cyksj/service/information/impl/InformationServiceImpl.java
  29. 4 0
      netflix-service/src/main/java/com/cyksj/service/mange/impl/CmsOrderDonServiceImpl.java
  30. 7 0
      netflix-service/src/main/java/com/cyksj/service/order/impl/OrderDonServiceImpl.java
  31. 6 0
      netflix-service/src/main/java/com/cyksj/service/user/UserBenefitsService.java
  32. 11 0
      netflix-service/src/main/java/com/cyksj/service/user/UserGalaxycoinRecordService.java
  33. 24 4
      netflix-service/src/main/java/com/cyksj/service/user/impl/UserBenefitsServiceImpl.java
  34. 17 0
      netflix-service/src/main/java/com/cyksj/service/user/impl/UserGalaxycoinRecordServiceImpl.java
  35. 91 0
      netflix-web/src/main/java/com/cyksj/web/controller/information/InformationController.java
  36. 15 0
      netflix-web/src/main/java/com/cyksj/web/controller/manage/CmsUserController.java
  37. 175 0
      netflix-web/src/main/java/com/cyksj/web/controller/manage/information/CmsInformationController.java
  38. 84 0
      netflix-web/src/main/java/com/cyksj/web/controller/search/SearchController.java
  39. 16 0
      netflix-web/src/main/java/com/cyksj/web/controller/user/UserController.java

+ 35 - 0
netflix-common/src/main/java/com/cyksj/common/util/TimeUtil.java

@@ -0,0 +1,35 @@
+package com.cyksj.common.util;
+
+import java.text.SimpleDateFormat;
+import java.util.Date;
+
+/**
+ * @author zwhui
+ * @date 2023/10/12 18:06
+ */
+public class TimeUtil {
+    /**
+     * 差值日期
+     */
+    public static String getDifferenceTime(Date date){
+        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
+        long span = (System.currentTimeMillis() - date.getTime()) / 1000;
+        //比当前时间还大
+        if(span < 0){
+            return format.format(date);
+        }else if(span/(60*60*24*30) > 0){
+            //大于30天直接显示年月日
+            return format.format(date);
+        }else if(span/(60*60*24*7) > 0){
+            return  span/(60*60*24*7) +"周前";
+        }else if(span/(60*60*24) > 0){
+            return span/(60*60*24) +"天前";
+        }else if(span/(60*60) > 0 ){
+            return span/(60*60) +"小时前";
+        }else if(span/(60) > 0){
+            return span/(60) +"分钟前";
+        }
+
+        return "刚刚";
+    }
+}

+ 11 - 0
netflix-dao/src/main/java/com/cyksj/mapper/InformationCategoryMapper.java

@@ -0,0 +1,11 @@
+package com.cyksj.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.cyksj.model.entity.InformationCategory;
+
+/**
+ * @author zwhui
+ * @date 2023/10/12 15:47
+ */
+public interface InformationCategoryMapper extends BaseMapper<InformationCategory> {
+}

+ 11 - 0
netflix-dao/src/main/java/com/cyksj/mapper/InformationClickUserRecordMapper.java

@@ -0,0 +1,11 @@
+package com.cyksj.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.cyksj.model.entity.InformationClickUserRecord;
+
+/**
+ * @author zwhui
+ * @date 2023/10/13 14:03
+ */
+public interface InformationClickUserRecordMapper extends BaseMapper<InformationClickUserRecord> {
+}

+ 20 - 0
netflix-dao/src/main/java/com/cyksj/mapper/InformationMapper.java

@@ -0,0 +1,20 @@
+package com.cyksj.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.cyksj.model.entity.Information;
+import com.cyksj.model.views.InformationListView;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+/**
+ * @author zwhui
+ * @date 2023/10/12 14:32
+ */
+public interface InformationMapper extends BaseMapper<Information> {
+    IPage<InformationListView> getInformation(@Param("page") Page<InformationListView> page, @Param("categoryId") Long categoryId);
+
+    List<InformationListView> getInformationByTitle(@Param("title") String title);
+}

+ 11 - 0
netflix-dao/src/main/java/com/cyksj/mapper/SearchHistoryMapper.java

@@ -0,0 +1,11 @@
+package com.cyksj.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.cyksj.model.entity.SearchHistory;
+
+/**
+ * @author zwhui
+ * @date 2023/10/13 10:55
+ */
+public interface SearchHistoryMapper extends BaseMapper<SearchHistory> {
+}

+ 11 - 0
netflix-dao/src/main/java/com/cyksj/mapper/UserGalaxycoinRecordMapper.java

@@ -0,0 +1,11 @@
+package com.cyksj.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.cyksj.model.entity.UserGalaxycoinRecord;
+
+/**
+ * @author zwhui
+ * @date 2023/10/12 10:23
+ */
+public interface UserGalaxycoinRecordMapper extends BaseMapper<UserGalaxycoinRecord> {
+}

+ 4 - 0
netflix-dao/src/main/java/com/cyksj/mapper/UserMapper.java

@@ -62,4 +62,8 @@ public interface UserMapper extends BaseMapper<User> {
 
     @Update("update user set yhs_money = yhs_money - #{subMoney} where id = #{shopUserId} and yhs_money >= #{subMoney} and yhs_money > 0")
     Integer subYhsMoney(@Param("shopUserId") Long shopUserId, @Param("subMoney") BigDecimal subMoney);
+
+    @Update("update user set galaxycoin = galaxycoin + (${addGalaxycoin}) where id = #{id} and galaxycoin = #{originalGalaxycoin}")
+    Integer updateGalaxycoin(@Param("id") Long id, @Param("originalGalaxycoin") BigDecimal originalGalaxycoin, @Param("addGalaxycoin") BigDecimal addGalaxycoin);
+
 }

+ 57 - 0
netflix-dao/src/main/java/com/cyksj/model/entity/Information.java

@@ -0,0 +1,57 @@
+package com.cyksj.model.entity;
+
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * @author zwhui
+ * @date 2023/10/11 17:11
+ */
+@Getter
+@Setter
+public class Information extends BaseEntity{
+    /**
+     * 文章标题
+     */
+    private String title;
+
+    /**
+     * 缩略图
+     */
+    private String thumbnail;
+
+    /**
+     * 文章类型
+     */
+    private String categoryIds;
+
+    /**
+     * 内容
+     */
+    private String content;
+
+    /**
+     * true 上架 || false 下架
+     */
+    private Boolean status;
+
+    /**
+     * true 推荐 || false
+     */
+    private Boolean recommend;
+
+    /**
+     * true 置顶 || false
+     */
+    private Boolean top;
+
+    /**
+     * true 存在 || false 删除
+     */
+    private Boolean deleted;
+
+    /**
+     * 推荐商品
+     */
+    private String goodsIds;
+}

+ 22 - 0
netflix-dao/src/main/java/com/cyksj/model/entity/InformationCategory.java

@@ -0,0 +1,22 @@
+package com.cyksj.model.entity;
+
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * @author zwhui
+ * @date 2023/10/12 15:36
+ */
+@Getter
+@Setter
+public class InformationCategory extends BaseEntity{
+    /**
+     * 类型名称
+     */
+    private String name;
+
+    /**
+     * 排序
+     */
+    private Integer sortBy;
+}

+ 18 - 0
netflix-dao/src/main/java/com/cyksj/model/entity/InformationClickUserRecord.java

@@ -0,0 +1,18 @@
+package com.cyksj.model.entity;
+
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * @author zwhui
+ * @date 2023/10/13 14:02
+ */
+@Getter
+@Setter
+public class InformationClickUserRecord extends BaseEntity{
+    private Long userId;
+
+    private Long goodsId;
+
+    private Long infoId;
+}

+ 10 - 0
netflix-dao/src/main/java/com/cyksj/model/entity/OrderDon.java

@@ -165,6 +165,11 @@ public class OrderDon extends BaseEntity implements Serializable {
      */
     private Long popularizeId;
 
+    /**
+     * 文章id
+     */
+    private Long infoId;
+
     /**
      * 是否是推广未登录用户购买订单
      */
@@ -215,6 +220,11 @@ public class OrderDon extends BaseEntity implements Serializable {
      */
     private BigDecimal balance;
 
+    /**
+     * 银河币
+     */
+    private BigDecimal galaxycoin;
+
     /**
      * 付款说明
      */

+ 20 - 0
netflix-dao/src/main/java/com/cyksj/model/entity/SearchHistory.java

@@ -0,0 +1,20 @@
+package com.cyksj.model.entity;
+
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * @author zwhui
+ * @date 2023/10/13 10:43
+ */
+@Getter
+@Setter
+public class SearchHistory extends BaseEntity{
+
+    /**
+     * 搜索名称
+     */
+    private String name;
+
+    private Long userId;
+}

+ 5 - 0
netflix-dao/src/main/java/com/cyksj/model/entity/User.java

@@ -67,6 +67,11 @@ public class User extends BaseEntity implements Serializable{
      */
     private BigDecimal yhsMoney;
 
+    /**
+     * 银河币
+     */
+    private BigDecimal galaxycoin;
+
     /**
      * 推广id
      */

+ 36 - 0
netflix-dao/src/main/java/com/cyksj/model/entity/UserGalaxycoinRecord.java

@@ -0,0 +1,36 @@
+package com.cyksj.model.entity;
+
+import com.ejlchina.searcher.bean.SearchBean;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.math.BigDecimal;
+
+/**
+ * @author zwhui
+ * @date 2023/10/12 09:58
+ */
+@Getter
+@Setter
+@SearchBean(tables = "user_galaxycoin_record")
+public class UserGalaxycoinRecord extends BaseEntity{
+    private Long userId;
+
+    private BigDecimal galaxycoin;
+
+    private String remark;
+
+    private Source source;
+
+    @Getter
+    public enum Source {
+        payment("下单"),
+        refund("订单退款");
+        String desc;
+
+        Source(String desc) {
+            this.desc = desc;
+        }
+    }
+
+}

+ 6 - 0
netflix-dao/src/main/java/com/cyksj/model/request/ClickRecordReq.java

@@ -20,9 +20,15 @@ public class ClickRecordReq {
 
 	private Long goodsId;
 
+	/**
+	 * 文章id
+	 */
+	private Long infoId;
+
 	/**
 	 * 1、首页点击
 	 * 2、平台分类点击
+	 * 3、文章点击
 	 */
 	private Integer type;
 }

+ 5 - 0
netflix-dao/src/main/java/com/cyksj/model/request/OrderPayRequest.java

@@ -74,6 +74,11 @@ public class OrderPayRequest {
      */
     private Long popularizeId;
 
+    /**
+     * 文章id
+     */
+    private Long infoId;
+
     private Boolean isNoLogin;
 
     /**

+ 76 - 0
netflix-dao/src/main/java/com/cyksj/model/views/InformationDetailView.java

@@ -0,0 +1,76 @@
+package com.cyksj.model.views;
+
+import com.ejlchina.searcher.bean.DbField;
+import com.ejlchina.searcher.bean.DbIgnore;
+import com.ejlchina.searcher.bean.SearchBean;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.util.List;
+
+/**
+ * @author zwhui
+ * @date 2023/10/13 13:38
+ */
+@Getter
+@Setter
+@SearchBean(tables = "information i")
+public class InformationDetailView {
+    @DbField("i.id")
+    private Long id;
+
+    /**
+     * 文章标题
+     */
+    @DbField("i.title")
+    private String title;
+
+    /**
+     * 缩略图
+     */
+    @DbField("i.thumbnail")
+    private String thumbnail;
+
+    /**
+     * 文章类型
+     */
+    @DbField("i.category_ids")
+    private String categoryIds;
+
+
+    /**
+     * 内容
+     */
+    @DbField("i.content")
+    private String content;
+
+    /**
+     * true 上架 || false 下架
+     */
+    @DbField("i.status")
+    private Boolean status;
+
+    /**
+     * true 推荐 || false
+     */
+    @DbField("i.recommend")
+    private Boolean recommend;
+
+    /**
+     * true 置顶 || false
+     */
+    @DbField("i.top")
+    private Boolean top;
+
+    /**
+     * 推荐商品id
+     */
+    @DbField("i.goods_ids")
+    private String goodsIds;
+
+    /**
+     * 推荐商品名
+     */
+    @DbIgnore
+    private List<GoodsFrontListView> goods;
+}

+ 41 - 0
netflix-dao/src/main/java/com/cyksj/model/views/InformationListView.java

@@ -0,0 +1,41 @@
+package com.cyksj.model.views;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.cyksj.common.util.TimeUtil;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.util.Date;
+
+/**
+ * @author zwhui
+ * @date 2023/10/12 18:02
+ */
+@Getter
+@Setter
+public class InformationListView {
+    /**
+     * 文章标题
+     */
+    private String title;
+
+    /**
+     * 缩略图
+     */
+    private String thumbnail;
+
+    /**
+     * 内容
+     */
+    private String content;
+
+    private Date createdTime;
+
+    @TableField(exist = false)
+    private String differenceTime;
+
+    public void setCreatedTime(Date createdTime) {
+        this.createdTime = createdTime;
+        this.differenceTime = TimeUtil.getDifferenceTime(createdTime);
+    }
+}

+ 101 - 0
netflix-dao/src/main/java/com/cyksj/model/views/InformationView.java

@@ -0,0 +1,101 @@
+package com.cyksj.model.views;
+
+import com.ejlchina.searcher.bean.DbField;
+import com.ejlchina.searcher.bean.DbIgnore;
+import com.ejlchina.searcher.bean.SearchBean;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.util.List;
+
+/**
+ * @author zwhui
+ * @date 2023/10/12 14:58
+ */
+@Getter
+@Setter
+@SearchBean(tables = "information i" +
+        " left join information_category ic on i.category_id = ic.id")
+public class InformationView {
+    @DbField("i.id")
+    private Long id;
+
+    /**
+     * 文章标题
+     */
+    @DbField("i.title")
+    private String title;
+
+    /**
+     * 缩略图
+     */
+    @DbField("i.thumbnail")
+    private String thumbnail;
+
+    /**
+     * 文章类型
+     */
+    @DbField("i.category_ids")
+    private String categoryIds;
+
+    /**
+     * 文章类型名
+     */
+    @DbIgnore
+    private List<String> categoryNames;
+
+    /**
+     * 内容
+     */
+    @DbField("i.content")
+    private String content;
+
+    /**
+     * true 上架 || false 下架
+     */
+    @DbField("i.status")
+    private Boolean status;
+
+    /**
+     * true 推荐 || false
+     */
+    @DbField("i.recommend")
+    private Boolean recommend;
+
+    /**
+     * true 置顶 || false
+     */
+    @DbField("i.top")
+    private Boolean top;
+
+    /**
+     * 推荐商品id
+     */
+    @DbField("i.goods_ids")
+    private String goodsIds;
+
+    /**
+     * 推荐商品名
+     */
+    @DbIgnore
+    private List<String> goodsTitles;
+
+    /**
+     * 点击数
+     */
+    @DbIgnore
+    private Integer click;
+
+    /**
+     * 下单数
+     */
+    @DbIgnore
+    private Integer order;
+
+    /**
+     * 浏览量
+     */
+    @DbIgnore
+    private Integer visit;
+
+}

+ 17 - 0
netflix-dao/src/main/java/com/cyksj/model/views/SearchView.java

@@ -0,0 +1,17 @@
+package com.cyksj.model.views;
+
+import lombok.Getter;
+import lombok.Setter;
+
+import java.util.List;
+
+/**
+ * @author zwhui
+ * @date 2023/10/13 12:11
+ */
+@Getter
+@Setter
+public class SearchView {
+    private List<GoodsFrontListView> goodsList;
+    private List<InformationListView> informationList;
+}

+ 5 - 0
netflix-dao/src/main/java/com/cyksj/model/views/UserPersonalView.java

@@ -50,4 +50,9 @@ public class UserPersonalView {
 	private Integer numOfGiftCard;
 
 	private String phone;
+
+	/**
+	 * 银河币
+	 */
+	private BigDecimal galaxycoin;
 }

+ 28 - 0
netflix-dao/src/main/resources/mapper/InformationMapper.xml

@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+
+<mapper namespace="com.cyksj.mapper.InformationMapper">
+
+
+    <select id="getInformation" resultType="com.cyksj.model.views.InformationListView">
+        select title,thumbnail,created_time,content from information where status is true and deleted is true
+        <choose>
+            <when test="categoryId != null">
+                and JSON_CONTAINS(category_ids,'"${categoryId}"') = 1
+            </when>
+            <otherwise>
+                and recommend is true
+            </otherwise>
+        </choose>
+        order by case when top is true then 1 else 2 end,created_time desc
+    </select>
+
+    <select id="getInformationByTitle" resultType="com.cyksj.model.views.InformationListView">
+        select title,thumbnail,created_time,content
+        from information
+        where title like '%${title}%'
+          and status is true
+          and deleted is true
+        order by created_time desc
+    </select>
+</mapper>

+ 1 - 0
netflix-service/src/main/java/com/cyksj/redis/RedisService.java

@@ -652,6 +652,7 @@ public class RedisService {
         PLUS_GOODS_ADDRESS_KEY("plus_goods_address_key:", "优惠加购实物地址key", 10 * 60l),
         GROUPS_TRIPS_OUTSIDE_RELATION("groups_trips_outside_relation:key", "额外车位", 30l),
         DISTRIBUTE_RULE_TIME_KEY("DISTRIBUTE_RULE_TIME_KEY", "渠道规格记录时间key", 5 * 60L),
+        INFORMATION_KEY("information_key:", "文章", 30 * 60L),
         ;
 
         private String name;

+ 16 - 0
netflix-service/src/main/java/com/cyksj/service/home/impl/ClickRecordFrontServiceImpl.java

@@ -5,6 +5,7 @@ import com.cyksj.common.exception.BusinessRuntimeException;
 import com.cyksj.mapper.GoodsClickUserRecordMapper;
 import com.cyksj.mapper.GoodsDonCategoryMapper;
 import com.cyksj.mapper.GoodsDonMapper;
+import com.cyksj.mapper.InformationClickUserRecordMapper;
 import com.cyksj.mapper.manage.home.HomeManagementConfigMapper;
 import com.cyksj.mapper.manage.home.HomeManagementConfigUserClickRecordMapper;
 import com.cyksj.model.entity.*;
@@ -35,6 +36,8 @@ public class ClickRecordFrontServiceImpl implements ClickRecordFrontService {
 
 	private final GoodsClickUserRecordMapper goodsClickUserRecordMapper;
 
+	private final InformationClickUserRecordMapper informationClickUserRecordMapper;
+
 
 	@Override
 	public void click(Long userId, ClickRecordReq request) {
@@ -47,6 +50,9 @@ public class ClickRecordFrontServiceImpl implements ClickRecordFrontService {
 			clickGoodsCategoryOrGoods(userId, request.getGoodsId(), request.getCategory());
 			return;
 		}
+		if (request.getType() == 3) {
+			clickInformation(userId,request.getGoodsId(),request.getInfoId());
+		}
 	}
 
 	public void clickHomePage(Long userId, Long configId) {
@@ -88,4 +94,14 @@ public class ClickRecordFrontServiceImpl implements ClickRecordFrontService {
 			}
 		}
 	}
+	public void clickInformation(Long userId,Long goodsId,Long infoId){
+		if (infoId == null && goodsId == null) {
+			throw BusinessRuntimeException.getInstance("参数错误");
+		}
+		InformationClickUserRecord record = new InformationClickUserRecord();
+		record.setUserId(userId);
+		record.setGoodsId(goodsId);
+		record.setInfoId(infoId);
+		informationClickUserRecordMapper.insert(record);
+	}
 }

+ 11 - 0
netflix-service/src/main/java/com/cyksj/service/information/InformationCategoryService.java

@@ -0,0 +1,11 @@
+package com.cyksj.service.information;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.cyksj.model.entity.InformationCategory;
+
+/**
+ * @author zwhui
+ * @date 2023/10/12 15:48
+ */
+public interface InformationCategoryService extends IService<InformationCategory> {
+}

+ 17 - 0
netflix-service/src/main/java/com/cyksj/service/information/InformationService.java

@@ -0,0 +1,17 @@
+package com.cyksj.service.information;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.cyksj.model.entity.Information;
+import com.cyksj.model.views.InformationListView;
+
+import java.util.List;
+
+/**
+ * @author zwhui
+ * @date 2023/10/12 14:39
+ */
+public interface InformationService extends IService<Information> {
+    IPage<InformationListView> getInformation(Long categoryId, Integer start, Integer limit);
+    List<InformationListView> getInformationByTitle(String name);
+}

+ 15 - 0
netflix-service/src/main/java/com/cyksj/service/information/impl/InformationCategoryServiceImpl.java

@@ -0,0 +1,15 @@
+package com.cyksj.service.information.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.cyksj.mapper.InformationCategoryMapper;
+import com.cyksj.model.entity.InformationCategory;
+import com.cyksj.service.information.InformationCategoryService;
+import org.springframework.stereotype.Service;
+
+/**
+ * @author zwhui
+ * @date 2023/10/12 15:48
+ */
+@Service
+public class InformationCategoryServiceImpl extends ServiceImpl<InformationCategoryMapper, InformationCategory> implements InformationCategoryService {
+}

+ 32 - 0
netflix-service/src/main/java/com/cyksj/service/information/impl/InformationServiceImpl.java

@@ -0,0 +1,32 @@
+package com.cyksj.service.information.impl;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.cyksj.mapper.InformationMapper;
+import com.cyksj.model.entity.Information;
+import com.cyksj.model.views.InformationListView;
+import com.cyksj.service.information.InformationService;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+/**
+ * @author zwhui
+ * @date 2023/10/12 14:40
+ */
+@Service
+public class InformationServiceImpl extends ServiceImpl<InformationMapper, Information> implements InformationService {
+
+
+    @Override
+    public IPage<InformationListView> getInformation(Long categoryId, Integer start, Integer limit) {
+        return baseMapper.getInformation(new Page<>(start,limit),categoryId);
+    }
+
+
+    @Override
+    public List<InformationListView> getInformationByTitle(String name) {
+        return baseMapper.getInformationByTitle(name);
+    }
+}

+ 4 - 0
netflix-service/src/main/java/com/cyksj/service/mange/impl/CmsOrderDonServiceImpl.java

@@ -813,6 +813,10 @@ public class CmsOrderDonServiceImpl extends ServiceImpl<OrderDonMapper,OrderDon>
             if (gcCash != null && gcCash.compareTo(BigDecimal.ZERO) > 0) {
                 giftCardOrderUseRecordService.returnGiftCardCash(orderDon.getId());
             }
+            //记录银河币明细
+            BigDecimal refundGalaxycoin = orderDon.getRefundMoney().add(orderDon.getRefundBalance());
+            orderDon.setGalaxycoin(orderDon.getGalaxycoin().subtract(refundGalaxycoin));
+            userBenefitsService.updateGalaxycoin(orderDon.getUserId(),refundGalaxycoin.negate(), UserGalaxycoinRecord.Source.refund);
         });
     }
 

+ 7 - 0
netflix-service/src/main/java/com/cyksj/service/order/impl/OrderDonServiceImpl.java

@@ -420,6 +420,7 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 		orderDon.setCouponExCode(payRequest.getCouponExCode());
 		//店铺id
 		orderDon.setYhsId(yhsId);
+		orderDon.setInfoId(payRequest.getInfoId());
 		if (relation != null && relation.getStatus() == GroupsRelation.Status.outside) {
 			orderDon.setIsOt(true);
 		}
@@ -2170,6 +2171,8 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 			//客服续费订单
 			handleServiceRenewOrder(orderDon);
 		}
+		BigDecimal addGalaxycoin = orderDon.getMoney().add(orderDon.getBalance());
+		orderDon.setGalaxycoin(addGalaxycoin);
 		this.updateById(orderDon);
 
 		TASK_POOL.execute(()->{
@@ -2219,6 +2222,10 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 						}
 					}
 				}
+				//银河币
+				if (addGalaxycoin.compareTo(BigDecimal.ZERO) > 0){
+					TASK_POOL.execute(() -> userBenefitsService.updateGalaxycoin(orderDon.getUserId(), addGalaxycoin, UserGalaxycoinRecord.Source.payment));
+				}
 			} catch (Exception e) {
 				log.error("回调修改订单信息错误,orderId:{},error:{}", orderDon.getId(), StringUtil.getErrorText(e));
 			}

+ 6 - 0
netflix-service/src/main/java/com/cyksj/service/user/UserBenefitsService.java

@@ -1,6 +1,7 @@
 package com.cyksj.service.user;
 
 import com.cyksj.model.entity.UserBalanceSourceRecord;
+import com.cyksj.model.entity.UserGalaxycoinRecord;
 
 import java.math.BigDecimal;
 
@@ -44,4 +45,9 @@ public interface UserBenefitsService {
 	 * 扣除店铺主用户 提成金额
 	 */
 	void deductYhShopTakeMoney(Long orderId, Long shopUserId, BigDecimal deductMoney);
+
+	/**
+	 * 修改用户银河币
+	 */
+	void updateGalaxycoin(Long userId, BigDecimal addGalaxycoin, UserGalaxycoinRecord.Source source);
 }

+ 11 - 0
netflix-service/src/main/java/com/cyksj/service/user/UserGalaxycoinRecordService.java

@@ -0,0 +1,11 @@
+package com.cyksj.service.user;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.cyksj.model.entity.UserGalaxycoinRecord;
+
+/**
+ * @author zwhui
+ * @date 2023/10/12 13:34
+ */
+public interface UserGalaxycoinRecordService extends IService<UserGalaxycoinRecord> {
+}

+ 24 - 4
netflix-service/src/main/java/com/cyksj/service/user/impl/UserBenefitsServiceImpl.java

@@ -4,12 +4,10 @@ import com.cyksj.common.EnvCommonService;
 import com.cyksj.common.constant.Constant;
 import com.cyksj.mapper.DistributeOrdersDeductPointsRecordMapper;
 import com.cyksj.mapper.UserBalanceSourceRecordMapper;
+import com.cyksj.mapper.UserGalaxycoinRecordMapper;
 import com.cyksj.mapper.UserMapper;
 import com.cyksj.mapper.shop.YhShopDistributeOrdersDeductPointsRecordMapper;
-import com.cyksj.model.entity.DistributeOrdersDeductPointsRecord;
-import com.cyksj.model.entity.User;
-import com.cyksj.model.entity.UserBalanceSourceRecord;
-import com.cyksj.model.entity.YhShopDistributeOrdersDeductPointsRecord;
+import com.cyksj.model.entity.*;
 import com.cyksj.service.sms.SmsService;
 import com.cyksj.service.user.UserBenefitsService;
 import lombok.RequiredArgsConstructor;
@@ -39,6 +37,8 @@ public class UserBenefitsServiceImpl implements UserBenefitsService {
 
 	private final YhShopDistributeOrdersDeductPointsRecordMapper yhShopDistributeOrdersDeductPointsRecordMapper;
 
+	private final UserGalaxycoinRecordMapper userGalaxycoinRecordMapper;
+
 	@Override
 	public void deductDistributePoints(Long orderId, Long userId, BigDecimal deductPoints) {
 		if (deductPoints.compareTo(BigDecimal.ZERO) <= 0) {
@@ -178,4 +178,24 @@ public class UserBenefitsServiceImpl implements UserBenefitsService {
 
 		}
 	}
+
+
+	@Override
+	public void updateGalaxycoin(Long userId, BigDecimal addGalaxycoin, UserGalaxycoinRecord.Source source) {
+		if (addGalaxycoin.compareTo(BigDecimal.ZERO) == 0) {
+			return;
+		}
+		while (true) {
+			User user = userMapper.selectById(userId);
+			if (user == null) break;
+			Integer success = userMapper.updateGalaxycoin(user.getId(), addGalaxycoin, user.getGalaxycoin());
+			if (success == 1) break;
+			UserGalaxycoinRecord record = new UserGalaxycoinRecord();
+			record.setUserId(userId);
+			record.setGalaxycoin(addGalaxycoin);
+			record.setSource(source);
+			record.setRemark(source.getDesc());
+			userGalaxycoinRecordMapper.insert(record);
+		}
+	}
 }

+ 17 - 0
netflix-service/src/main/java/com/cyksj/service/user/impl/UserGalaxycoinRecordServiceImpl.java

@@ -0,0 +1,17 @@
+package com.cyksj.service.user.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.cyksj.mapper.UserGalaxycoinRecordMapper;
+import com.cyksj.model.entity.UserGalaxycoinRecord;
+import com.cyksj.service.user.UserGalaxycoinRecordService;
+import lombok.RequiredArgsConstructor;
+import org.springframework.stereotype.Service;
+
+/**
+ * @author zwhui
+ * @date 2023/10/12 13:35
+ */
+@Service
+@RequiredArgsConstructor
+public class UserGalaxycoinRecordServiceImpl extends ServiceImpl<UserGalaxycoinRecordMapper, UserGalaxycoinRecord> implements UserGalaxycoinRecordService {
+}

+ 91 - 0
netflix-web/src/main/java/com/cyksj/web/controller/information/InformationController.java

@@ -0,0 +1,91 @@
+package com.cyksj.web.controller.information;
+
+import cn.hutool.core.collection.CollUtil;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.cyksj.common.util.Jsons;
+import com.cyksj.dto.Result;
+import com.cyksj.enums.GatewayResponse;
+import com.cyksj.model.entity.InformationCategory;
+import com.cyksj.model.views.GoodsFrontListView;
+import com.cyksj.model.views.InformationDetailView;
+import com.cyksj.model.views.InformationListView;
+import com.cyksj.redis.RedisService;
+import com.cyksj.service.information.InformationCategoryService;
+import com.cyksj.service.information.InformationService;
+import com.cyksj.web.util.StpUserUtil;
+import com.ejlchina.searcher.BeanSearcher;
+import com.ejlchina.searcher.param.Operator;
+import com.ejlchina.searcher.util.MapUtils;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletRequest;
+import java.util.List;
+import java.util.Optional;
+
+/**
+ * @author zwhui
+ * @date 2023/10/12 17:20
+ */
+@Slf4j
+@RestController
+@RequestMapping("/applets/information")
+@RequiredArgsConstructor
+public class InformationController {
+    private final BeanSearcher beanSearcher;
+
+    private final InformationCategoryService informationCategoryService;
+
+    private final InformationService informationService;
+
+    private final HttpServletRequest request;
+
+    private final RedisService redisService;
+
+    /**
+     * 查询发现页文章列表
+     */
+    @GetMapping("/get")
+    public Result<IPage<InformationListView>> getInformation(Long categoryId, @RequestParam(defaultValue = "0") Integer start, @RequestParam(defaultValue = "5") Integer limit){
+        String key = RedisService.key.INFORMATION_KEY.getEnvName() + "categoryId:" + categoryId;
+        IPage<InformationListView> information = (IPage<InformationListView>) redisService.get(key);
+        if (information == null) {
+            information = informationService.getInformation(categoryId, start, limit);
+            redisService.setNx(key, information, RedisService.key.INFORMATION_KEY.getTimeout());
+        }
+        return GatewayResponse.SUCCESS.newBuilder().toResult(information);
+    }
+
+
+    /**
+     * 查询分类
+     */
+    @GetMapping("/get/category")
+    public Result<List<InformationCategory>> getInformationCategory() {
+        return GatewayResponse.SUCCESS.newBuilder().toResult(informationCategoryService.list(Wrappers.lambdaQuery(InformationCategory.class).orderByAsc(InformationCategory::getSortBy)));
+    }
+
+    /**
+     * 获取文章详情
+     */
+    @GetMapping("/get/detail/{id}")
+    public Result<InformationDetailView> getInformation(@PathVariable Long id) {
+        String key = RedisService.key.INFORMATION_KEY.getEnvName() + "id:" + id;
+        InformationDetailView view = (InformationDetailView) redisService.get(key);
+        if (view == null){
+            view = beanSearcher.searchFirst(InformationDetailView.class, MapUtils.flatBuilder(request.getParameterMap())
+                    .field(InformationDetailView::getId, id).build());
+            try {
+                List<Long> goodsIds = Jsons.parseList(view.getGoodsIds(), Long.class);
+                List<GoodsFrontListView> goodsList = beanSearcher.searchAll(GoodsFrontListView.class, MapUtils.flatBuilder(request.getParameterMap()).field(GoodsFrontListView::getId,goodsIds).op(Operator.InList).build());
+                view.setGoods(goodsList);
+            } catch (Exception e) {
+                e.printStackTrace();
+            }
+            redisService.setNx(key, view, RedisService.key.INFORMATION_KEY.getTimeout());
+        }
+        return GatewayResponse.SUCCESS.newBuilder().toResult(view);
+    }
+}

+ 15 - 0
netflix-web/src/main/java/com/cyksj/web/controller/manage/CmsUserController.java

@@ -2,7 +2,9 @@ package com.cyksj.web.controller.manage;
 
 import cn.dev33.satoken.annotation.SaCheckPermission;
 import cn.hutool.core.util.StrUtil;
+import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.cyksj.common.constant.Constant;
 import com.cyksj.common.exception.BusinessRuntimeException;
 import com.cyksj.dto.Result;
@@ -18,6 +20,8 @@ import com.cyksj.model.request.UserFuncPropertyReq;
 import com.cyksj.model.views.*;
 import com.cyksj.service.relation.GroupRelationClearService;
 import com.cyksj.service.user.UserBindRelationService;
+import com.cyksj.service.user.UserGalaxycoinRecordService;
+import com.cyksj.web.util.StpUserUtil;
 import com.ejlchina.searcher.BeanSearcher;
 import com.ejlchina.searcher.SearchResult;
 import com.ejlchina.searcher.param.Operator;
@@ -62,6 +66,8 @@ public class CmsUserController{
 
     private final OrderDonMapper orderDonMapper;
 
+    private final UserGalaxycoinRecordService userGalaxycoinRecordService;
+
     @GetMapping("/get")
     @SaCheckPermission("user:view")
     public Result<SearchResult<UserView>> get(String otherPhone, Long sharedId, String userid, Long businessId, String sort, String order) {
@@ -277,4 +283,13 @@ public class CmsUserController{
         List<QuestionResponseRecordView> views = beanSearcher.searchAll(QuestionResponseRecordView.class, builder.build());
         return GatewayResponse.SUCCESS.newBuilder().toResult(views);
     }
+
+    /**
+     * 查询用户银河币明细
+     */
+    @GetMapping("/get/galaxycoinRecord")
+    public Result<SearchResult<UserGalaxycoinRecord>> getGalaxycoinRecord(){
+        SearchResult<UserGalaxycoinRecord> search = beanSearcher.search(UserGalaxycoinRecord.class, MapUtils.flatBuilder(request.getParameterMap()).build());
+        return GatewayResponse.SUCCESS.newBuilder().toResult(search);
+    }
 }

+ 175 - 0
netflix-web/src/main/java/com/cyksj/web/controller/manage/information/CmsInformationController.java

@@ -0,0 +1,175 @@
+package com.cyksj.web.controller.manage.information;
+
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.cyksj.common.exception.BusinessRuntimeException;
+import com.cyksj.common.util.Jsons;
+import com.cyksj.dto.Result;
+import com.cyksj.enums.GatewayResponse;
+import com.cyksj.mapper.GoodsDonMapper;
+import com.cyksj.mapper.InformationClickUserRecordMapper;
+import com.cyksj.mapper.OrderDonMapper;
+import com.cyksj.model.entity.*;
+import com.cyksj.model.views.InformationView;
+import com.cyksj.redis.RedisService;
+import com.cyksj.service.information.InformationCategoryService;
+import com.cyksj.service.information.InformationService;
+import com.ejlchina.searcher.BeanSearcher;
+import com.ejlchina.searcher.SearchResult;
+import com.ejlchina.searcher.util.MapUtils;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletRequest;
+import java.util.List;
+import java.util.Set;
+import java.util.stream.Collectors;
+
+/**
+ * @author zwhui
+ * @date 2023/10/12 14:41
+ */
+@Slf4j
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/manage/information")
+public class CmsInformationController {
+    private final InformationService informationService;
+
+    private final BeanSearcher beanSearcher;
+
+    private final HttpServletRequest request;
+
+    private final InformationCategoryService informationCategoryService;
+
+    private final GoodsDonMapper goodsDonMapper;
+
+    private final RedisService redisService;
+
+    private final InformationClickUserRecordMapper informationClickUserRecordMapper;
+
+    private final OrderDonMapper orderDonMapper;
+
+    /**
+     * 保存文章
+     */
+    @PostMapping("/post")
+    public Result<String> saveInformation(@RequestBody Information information) {
+        informationService.save(information);
+        Set<String> keys = redisService.keys(RedisService.key.INFORMATION_KEY.getName() + "*");
+        redisService.del(keys.toArray(String[]::new));
+        return GatewayResponse.SUCCESS.newBuilder().toResult();
+    }
+
+    /**
+     * 修改文章
+     */
+    @PutMapping("/put")
+    public Result<String> updateInformation(@RequestBody Information information) {
+        if (information.getId() == null) {
+            throw BusinessRuntimeException.getInstance("请指定要修改的文章");
+        }
+        informationService.updateById(information);
+        Set<String> keys = redisService.keys(RedisService.key.INFORMATION_KEY.getName() + "*");
+        redisService.del(keys.toArray(String[]::new));
+        return GatewayResponse.SUCCESS.newBuilder().toResult();
+    }
+
+    /**
+     * 获取文章
+     */
+    @GetMapping("/get")
+    public Result<SearchResult<InformationView>> getInformation() {
+        SearchResult<InformationView> list = beanSearcher.search(InformationView.class, MapUtils.flatBuilder(request.getParameterMap()).build());
+        list.getDataList().forEach(data -> {
+            data.setClick(informationClickUserRecordMapper.selectCount(Wrappers.lambdaQuery(InformationClickUserRecord.class).eq(InformationClickUserRecord::getInfoId,data.getId()).ne(InformationClickUserRecord::getGoodsId,0)));
+            data.setVisit(informationClickUserRecordMapper.selectCount(Wrappers.lambdaQuery(InformationClickUserRecord.class).eq(InformationClickUserRecord::getInfoId,data.getId()).eq(InformationClickUserRecord::getGoodsId,0)));
+            data.setOrder(orderDonMapper.selectCount(Wrappers.lambdaQuery(OrderDon.class).eq(OrderDon::getInfoId,data.getId()).in(OrderDon::getStatus, List.of(OrderDon.Status.noPayment, OrderDon.Status.close))));
+            try {
+                List<Long> goodsIds = Jsons.parseList(data.getGoodsIds(), Long.class);
+                data.setGoodsTitles(goodsDonMapper.selectList(Wrappers.lambdaQuery(GoodsDon.class)
+                        .select(GoodsDon::getTitle)
+                        .in(GoodsDon::getId, goodsIds)
+                        .eq(GoodsDon::getStatus, true)
+                        .eq(GoodsDon::getDeleted,true)).stream().map(GoodsDon::getTitle).collect(Collectors.toList()));
+            } catch (Exception e) {
+                e.printStackTrace();
+            }
+        });
+        return GatewayResponse.SUCCESS.newBuilder().toResult(list);
+    }
+
+    /**
+     * 修改文章状态
+     */
+    @PutMapping("/update/status")
+    public Result<String> updateStatus(@RequestBody Information information) {
+        if (information.getId() == null) {
+            throw BusinessRuntimeException.getInstance("请指定要修改的文章");
+        }
+        informationService.updateById(information);
+        Set<String> keys = redisService.keys(RedisService.key.INFORMATION_KEY.getName() + "*");
+        redisService.del(keys.toArray(String[]::new));
+        return GatewayResponse.SUCCESS.newBuilder().toResult();
+    }
+
+    /**
+     * 删除文章
+     */
+    @DeleteMapping("/del/{id}")
+    public Result<String> delById(@PathVariable Long id) {
+        Information byId = informationService.getById(id);
+        if (byId == null) {
+            return GatewayResponse.SUCCESS.newBuilder().toResult();
+        }
+        byId.setDeleted(false);
+        informationService.updateById(byId);
+        Set<String> keys = redisService.keys(RedisService.key.INFORMATION_KEY.getName() + "*");
+        redisService.del(keys.toArray(String[]::new));
+        return GatewayResponse.SUCCESS.newBuilder().toResult();
+    }
+
+
+    /**
+     * 保存文章类型
+     */
+    @PostMapping("/post/category")
+    public Result<String> saveInformationCategory(@RequestBody InformationCategory informationCategory) {
+        informationCategoryService.save(informationCategory);
+        return GatewayResponse.SUCCESS.newBuilder().toResult();
+    }
+
+    /**
+     * 修改文章类型
+     */
+    @PutMapping("/put/category")
+    public Result<String> updateInformationCategory(@RequestBody InformationCategory informationCategory) {
+        if (informationCategory.getId() == null) {
+            throw BusinessRuntimeException.getInstance("请指定要修改的文章类型");
+        }
+        informationCategoryService.updateById(informationCategory);
+        return GatewayResponse.SUCCESS.newBuilder().toResult();
+    }
+
+    /**
+     * 获取文章类型
+     */
+    @GetMapping("/get/category")
+    public Result<List<InformationCategory>> getInformationCategory() {
+        return GatewayResponse.SUCCESS.newBuilder().toResult(informationCategoryService.list(Wrappers.lambdaQuery(InformationCategory.class).orderByAsc(InformationCategory::getSortBy)));
+    }
+
+    /**
+     * 删除文章类型
+     */
+    @DeleteMapping("/del/category/{id}")
+    public Result<String> delCategoryById(@PathVariable Long id) {
+        int count = informationService.count(Wrappers.lambdaQuery(Information.class).eq(Information::getDeleted, true));
+        if (count > 0){
+            throw BusinessRuntimeException.getInstance("该类型下存在文章,无法删除");
+        }
+        informationCategoryService.removeById(id);
+        return GatewayResponse.SUCCESS.newBuilder().toResult();
+    }
+
+}

+ 84 - 0
netflix-web/src/main/java/com/cyksj/web/controller/search/SearchController.java

@@ -0,0 +1,84 @@
+package com.cyksj.web.controller.search;
+
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.cyksj.dto.Result;
+import com.cyksj.enums.GatewayResponse;
+import com.cyksj.mapper.SearchHistoryMapper;
+import com.cyksj.model.entity.SearchHistory;
+import com.cyksj.model.views.GoodsFrontListView;
+import com.cyksj.model.views.InformationListView;
+import com.cyksj.model.views.SearchView;
+import com.cyksj.service.information.InformationService;
+import com.cyksj.web.util.StpUserUtil;
+import com.ejlchina.searcher.BeanSearcher;
+import com.ejlchina.searcher.operator.Contain;
+import com.ejlchina.searcher.param.Operator;
+import com.ejlchina.searcher.util.MapUtils;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletRequest;
+import java.util.List;
+
+/**
+ * @author zwhui
+ * @date 2023/10/12 17:13
+ */
+@Slf4j
+@RestController
+@RequestMapping("/applets/search")
+@RequiredArgsConstructor
+public class SearchController {
+
+    private final BeanSearcher beanSearcher;
+
+    private final InformationService informationService;
+
+    private final SearchHistoryMapper searchHistoryMapper;
+
+    private final HttpServletRequest request;
+
+    /**
+     * 查询搜索结果
+     */
+    @GetMapping("/get")
+    public Result<SearchView> search(String name){
+        Long userId = StpUserUtil.getUserIdAfterLogin();
+        if (userId != null){
+            SearchHistory searchHistory = new SearchHistory();
+            searchHistory.setName(name);
+            searchHistory.setUserId(userId);
+            searchHistoryMapper.insert(searchHistory);
+        }
+        List<GoodsFrontListView> goodsList = beanSearcher.searchAll(GoodsFrontListView.class, MapUtils.flatBuilder(request.getParameterMap()).field(GoodsFrontListView::getTitle,name).op(Operator.Contain).build());
+        List<InformationListView> informationList = informationService.getInformationByTitle(name);
+        SearchView view = new SearchView();
+        view.setGoodsList(goodsList);
+        view.setInformationList(informationList);
+        return GatewayResponse.SUCCESS.newBuilder().toResult(view);
+    }
+
+
+    /**
+     * 查询搜索历史
+     */
+    @GetMapping("/get/searchHistory")
+    public Result<List<SearchHistory>> getSearchHistory(){
+        Long userId = StpUserUtil.getUserIdAfterLogin();
+        if (userId != null){
+            return GatewayResponse.SUCCESS.newBuilder().toResult(searchHistoryMapper.selectList(Wrappers.lambdaQuery(SearchHistory.class).eq(SearchHistory::getUserId,userId).orderByDesc(SearchHistory::getCreatedTime).last("limit 10")));
+        }
+        return GatewayResponse.SUCCESS.newBuilder().toResult();
+    }
+
+    /**
+     * 删除搜索历史
+     */
+    @DeleteMapping("/delete/history")
+    private Result<Void> delHistory(Long id){
+        long userId = StpUserUtil.getLoginIdAsLong();
+        searchHistoryMapper.delete(Wrappers.lambdaQuery(SearchHistory.class).eq(id != null,SearchHistory::getId,id).eq(SearchHistory::getUserId,userId));
+        return GatewayResponse.SUCCESS.newBuilder().toResult();
+    }
+}

+ 16 - 0
netflix-web/src/main/java/com/cyksj/web/controller/user/UserController.java

@@ -2,7 +2,9 @@ package com.cyksj.web.controller.user;
 
 import cn.hutool.core.date.DateTime;
 import cn.hutool.core.util.StrUtil;
+import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.cyksj.common.annotation.NoSubmit;
 import com.cyksj.common.exception.BusinessRuntimeException;
 import com.cyksj.dto.Result;
@@ -21,6 +23,7 @@ import com.cyksj.service.exchange.ExchangeCodeService;
 import com.cyksj.service.order.UserRealOrderBenefitsService;
 import com.cyksj.service.shop.YhShopFrontService;
 import com.cyksj.service.user.UserBindRelationService;
+import com.cyksj.service.user.UserGalaxycoinRecordService;
 import com.cyksj.service.user.UserService;
 import com.cyksj.service.user.WorkOrderFrontService;
 import com.cyksj.web.util.StpUserUtil;
@@ -69,6 +72,8 @@ public class UserController {
 
     private final YhShopFrontService yhShopFrontService;
 
+    private final UserGalaxycoinRecordService userGalaxycoinRecordService;
+
     @GetMapping(value = "/wx/whoami")
     public Result<UserWhoami> whoami() {
         long userId = StpUserUtil.getLoginIdAsLong();
@@ -118,6 +123,7 @@ public class UserController {
         //推广积分
         personalView.setPopularizePoints(user.getPoints());
         personalView.setBalance(user.getBalance());
+        personalView.setGalaxycoin(user.getGalaxycoin());
         OrderDon orderDon = orderDonMapper.selectOne(Wrappers.lambdaQuery(OrderDon.class)
                 .eq(OrderDon::getUserId, userId)
                 .eq(OrderDon::getStatus, OrderDon.Status.noPayment).last("limit 1"));
@@ -404,4 +410,14 @@ public class UserController {
         userService.receiveGiftCardByRc(userId, req.getCode(), relationId);
         return GatewayResponse.SUCCESS.newBuilder().toResult();
     }
+
+    /**
+     * 查询用户银河币明细
+     */
+    @GetMapping("/get/galaxycoinRecord")
+    public Result<IPage<UserGalaxycoinRecord>> getGalaxycoinRecord(@RequestParam(defaultValue = "1") Long start, @RequestParam(defaultValue = "5") Long limit){
+        long userId = StpUserUtil.getLoginIdAsLong();
+        Page<UserGalaxycoinRecord> page = userGalaxycoinRecordService.page(new Page<>(start, limit), Wrappers.lambdaQuery(UserGalaxycoinRecord.class).eq(UserGalaxycoinRecord::getUserId, userId));
+        return GatewayResponse.SUCCESS.newBuilder().toResult(page);
+    }
 }