Jelajahi Sumber

1.添加隐身部分后台操作,

slambb 2 tahun lalu
induk
melakukan
cee5eceba3
42 mengubah file dengan 432 tambahan dan 109 penghapusan
  1. TEMPAT SAMPAH
      .DS_Store
  2. 13 0
      .idea/libraries/Maven__com_mchange_mchange_commons_java_0_2_15.xml
  3. 13 0
      .idea/libraries/Maven__org_quartz_scheduler_quartz_2_3_2.xml
  4. 13 0
      .idea/libraries/Maven__org_springframework_boot_spring_boot_starter_quartz_2_4_3.xml
  5. 1 0
      pom.xml
  6. TEMPAT SAMPAH
      src/.DS_Store
  7. TEMPAT SAMPAH
      src/main/.DS_Store
  8. TEMPAT SAMPAH
      src/main/java/com/YuyeTech/.DS_Store
  9. TEMPAT SAMPAH
      src/main/java/com/YuyeTech/HeartRate/.DS_Store
  10. 1 5
      src/main/java/com/YuyeTech/HeartRate/aspect/AuthorizeFilter.java
  11. 1 0
      src/main/java/com/YuyeTech/HeartRate/config/security/SecurityConfig.java
  12. 4 0
      src/main/java/com/YuyeTech/HeartRate/constant/RedisConstant.java
  13. TEMPAT SAMPAH
      src/main/java/com/YuyeTech/HeartRate/game/.DS_Store
  14. TEMPAT SAMPAH
      src/main/java/com/YuyeTech/HeartRate/game/cDietInfo/.DS_Store
  15. TEMPAT SAMPAH
      src/main/java/com/YuyeTech/HeartRate/game/cDietInfo/controller/.DS_Store
  16. TEMPAT SAMPAH
      src/main/java/com/YuyeTech/HeartRate/game/cDietInfo/projo/.DS_Store
  17. TEMPAT SAMPAH
      src/main/java/com/YuyeTech/HeartRate/game/cDietInfo/repository/.DS_Store
  18. TEMPAT SAMPAH
      src/main/java/com/YuyeTech/HeartRate/game/cDietInfo/service/.DS_Store
  19. TEMPAT SAMPAH
      src/main/java/com/YuyeTech/HeartRate/game/cDietInfo/vo/.DS_Store
  20. TEMPAT SAMPAH
      src/main/java/com/YuyeTech/HeartRate/game/cHistoricalCalorie/.DS_Store
  21. TEMPAT SAMPAH
      src/main/java/com/YuyeTech/HeartRate/game/cHistoricalCalorie/controller/.DS_Store
  22. 30 0
      src/main/java/com/YuyeTech/HeartRate/game/food/controller/BackstageFoodController.java
  23. 20 22
      src/main/java/com/YuyeTech/HeartRate/game/food/controller/FoodController.java
  24. 4 1
      src/main/java/com/YuyeTech/HeartRate/game/food/pojo/Food.java
  25. 3 0
      src/main/java/com/YuyeTech/HeartRate/game/food/repository/FoodRepository.java
  26. 29 0
      src/main/java/com/YuyeTech/HeartRate/game/food/scheduled/FoodDayTask.java
  27. 9 5
      src/main/java/com/YuyeTech/HeartRate/game/food/scheduled/FoodQuartzConfig.java
  28. 11 1
      src/main/java/com/YuyeTech/HeartRate/game/food/service/FoodService.java
  29. 139 58
      src/main/java/com/YuyeTech/HeartRate/game/food/service/FoodServiceImpl.java
  30. 5 1
      src/main/java/com/YuyeTech/HeartRate/game/food/vo/FoodSimpleVo.java
  31. 5 1
      src/main/java/com/YuyeTech/HeartRate/game/food/vo/FoodVo.java
  32. TEMPAT SAMPAH
      src/main/java/com/YuyeTech/HeartRate/game/foodRecommend/.DS_Store
  33. TEMPAT SAMPAH
      src/main/java/com/YuyeTech/HeartRate/game/foodRecommend/Heart_App_Server_Layuisrcm.textClipping
  34. TEMPAT SAMPAH
      src/main/java/com/YuyeTech/HeartRate/game/foodRecommend/controller/.DS_Store
  35. 108 15
      src/main/java/com/YuyeTech/HeartRate/game/foodRecommend/controller/FoodRecommendController.java
  36. TEMPAT SAMPAH
      src/main/java/com/YuyeTech/HeartRate/game/foodRecommend/pojo/.DS_Store
  37. TEMPAT SAMPAH
      src/main/java/com/YuyeTech/HeartRate/game/foodRecommend/repository/.DS_Store
  38. TEMPAT SAMPAH
      src/main/java/com/YuyeTech/HeartRate/game/foodRecommend/service/.DS_Store
  39. TEMPAT SAMPAH
      src/main/java/com/YuyeTech/HeartRate/game/foodRecommend/vo/.DS_Store
  40. 2 0
      src/main/java/com/YuyeTech/HeartRate/game/userinfo/controller/UserInfoController.java
  41. 10 0
      src/main/java/com/YuyeTech/HeartRate/utils/RedisData.java
  42. 11 0
      src/main/java/com/YuyeTech/HeartRate/utils/RedisSettingMap.java

TEMPAT SAMPAH
.DS_Store


+ 13 - 0
.idea/libraries/Maven__com_mchange_mchange_commons_java_0_2_15.xml

@@ -0,0 +1,13 @@
+<component name="libraryTable">
+  <library name="Maven: com.mchange:mchange-commons-java:0.2.15">
+    <CLASSES>
+      <root url="jar://$MAVEN_REPOSITORY$/com/mchange/mchange-commons-java/0.2.15/mchange-commons-java-0.2.15.jar!/" />
+    </CLASSES>
+    <JAVADOC>
+      <root url="jar://$MAVEN_REPOSITORY$/com/mchange/mchange-commons-java/0.2.15/mchange-commons-java-0.2.15-javadoc.jar!/" />
+    </JAVADOC>
+    <SOURCES>
+      <root url="jar://$MAVEN_REPOSITORY$/com/mchange/mchange-commons-java/0.2.15/mchange-commons-java-0.2.15-sources.jar!/" />
+    </SOURCES>
+  </library>
+</component>

+ 13 - 0
.idea/libraries/Maven__org_quartz_scheduler_quartz_2_3_2.xml

@@ -0,0 +1,13 @@
+<component name="libraryTable">
+  <library name="Maven: org.quartz-scheduler:quartz:2.3.2">
+    <CLASSES>
+      <root url="jar://$MAVEN_REPOSITORY$/org/quartz-scheduler/quartz/2.3.2/quartz-2.3.2.jar!/" />
+    </CLASSES>
+    <JAVADOC>
+      <root url="jar://$MAVEN_REPOSITORY$/org/quartz-scheduler/quartz/2.3.2/quartz-2.3.2-javadoc.jar!/" />
+    </JAVADOC>
+    <SOURCES>
+      <root url="jar://$MAVEN_REPOSITORY$/org/quartz-scheduler/quartz/2.3.2/quartz-2.3.2-sources.jar!/" />
+    </SOURCES>
+  </library>
+</component>

+ 13 - 0
.idea/libraries/Maven__org_springframework_boot_spring_boot_starter_quartz_2_4_3.xml

@@ -0,0 +1,13 @@
+<component name="libraryTable">
+  <library name="Maven: org.springframework.boot:spring-boot-starter-quartz:2.4.3">
+    <CLASSES>
+      <root url="jar://$MAVEN_REPOSITORY$/org/springframework/boot/spring-boot-starter-quartz/2.4.3/spring-boot-starter-quartz-2.4.3.jar!/" />
+    </CLASSES>
+    <JAVADOC>
+      <root url="jar://$MAVEN_REPOSITORY$/org/springframework/boot/spring-boot-starter-quartz/2.4.3/spring-boot-starter-quartz-2.4.3-javadoc.jar!/" />
+    </JAVADOC>
+    <SOURCES>
+      <root url="jar://$MAVEN_REPOSITORY$/org/springframework/boot/spring-boot-starter-quartz/2.4.3/spring-boot-starter-quartz-2.4.3-sources.jar!/" />
+    </SOURCES>
+  </library>
+</component>

+ 1 - 0
pom.xml

@@ -308,6 +308,7 @@
             <groupId>org.springframework.boot</groupId>
             <artifactId>spring-boot-starter-quartz</artifactId>
         </dependency>
+
     </dependencies>
 
     <build>

TEMPAT SAMPAH
src/.DS_Store


TEMPAT SAMPAH
src/main/.DS_Store


TEMPAT SAMPAH
src/main/java/com/YuyeTech/.DS_Store


TEMPAT SAMPAH
src/main/java/com/YuyeTech/HeartRate/.DS_Store


+ 1 - 5
src/main/java/com/YuyeTech/HeartRate/aspect/AuthorizeFilter.java

@@ -83,11 +83,7 @@ public class AuthorizeFilter implements Filter {
                 /**
                  * 3D视界接口放行
                  */
-                path.indexOf("td") > -1 ||
-                /**
-                 * 食物接口
-                 */
-                path.indexOf("food") > -1
+                path.indexOf("td") > -1
         ) {
             //登录情况直接放行
 //            log.info("********登录情况直接放行********");

+ 1 - 0
src/main/java/com/YuyeTech/HeartRate/config/security/SecurityConfig.java

@@ -60,6 +60,7 @@ public class SecurityConfig extends WebSecurityConfigurerAdapter {
                 "/game/**"
                 ,"/tPlat/**"
                 ,"/food/**"
+                ,"/foodRecommend/**"
                 ,"/game_websocket/**"
                 ,"/static/**"
                 ,

+ 4 - 0
src/main/java/com/YuyeTech/HeartRate/constant/RedisConstant.java

@@ -14,4 +14,8 @@ public interface RedisConstant {
     String SMS_PREFIX = "code:%s";
 
     Integer  CODE_EXPIRE = 300;//5分钟
+
+
+    //keyword
+     String KEYWORD_PREFIX ="keyword:%s";
 }

TEMPAT SAMPAH
src/main/java/com/YuyeTech/HeartRate/game/.DS_Store


TEMPAT SAMPAH
src/main/java/com/YuyeTech/HeartRate/game/cDietInfo/.DS_Store


TEMPAT SAMPAH
src/main/java/com/YuyeTech/HeartRate/game/cDietInfo/controller/.DS_Store


TEMPAT SAMPAH
src/main/java/com/YuyeTech/HeartRate/game/cDietInfo/projo/.DS_Store


TEMPAT SAMPAH
src/main/java/com/YuyeTech/HeartRate/game/cDietInfo/repository/.DS_Store


TEMPAT SAMPAH
src/main/java/com/YuyeTech/HeartRate/game/cDietInfo/service/.DS_Store


TEMPAT SAMPAH
src/main/java/com/YuyeTech/HeartRate/game/cDietInfo/vo/.DS_Store


TEMPAT SAMPAH
src/main/java/com/YuyeTech/HeartRate/game/cHistoricalCalorie/.DS_Store


TEMPAT SAMPAH
src/main/java/com/YuyeTech/HeartRate/game/cHistoricalCalorie/controller/.DS_Store


+ 30 - 0
src/main/java/com/YuyeTech/HeartRate/game/food/controller/BackstageFoodController.java

@@ -0,0 +1,30 @@
+package com.YuyeTech.HeartRate.game.food.controller;
+
+
+import com.YuyeTech.HeartRate.VO.ResultVO;
+import com.YuyeTech.HeartRate.game.food.service.FoodService;
+import com.YuyeTech.HeartRate.utils.ResultVOUtil;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+
+@RestController
+@RequestMapping("/backstage_food")
+@Slf4j
+public class BackstageFoodController {
+
+    @Autowired
+    private FoodService foodService;
+
+
+//    @GetMapping(value = "/searchFromGroup")
+//    public ResultVO searchFromGroup(@RequestParam(value = "group") Integer group,
+//                                    @RequestParam(value = "page" ,defaultValue = "1") Integer page){
+//
+//        String url = "/food/group/"+group +"&page="+page;
+//        return  ResultVOUtil.success(foodService.getListFromUrl(url));
+//    }
+}

+ 20 - 22
src/main/java/com/YuyeTech/HeartRate/game/food/controller/FoodController.java

@@ -12,6 +12,7 @@ import com.YuyeTech.HeartRate.game.food.service.FoodService;
 import com.YuyeTech.HeartRate.game.foodRecommend.service.FoodRecommendService;
 import com.YuyeTech.HeartRate.game.foodRecommend.vo.FoodRecommendVo;
 import com.YuyeTech.HeartRate.utils.CopyUtil;
+import com.YuyeTech.HeartRate.utils.RedisSettingMap;
 import com.YuyeTech.HeartRate.utils.ResultVOUtil;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.beanutils.BeanUtils;
@@ -20,9 +21,14 @@ import org.jsoup.nodes.Document;
 import org.jsoup.nodes.Element;
 import org.jsoup.select.Elements;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.redis.core.StringRedisTemplate;
+import org.springframework.data.redis.core.ZSetOperations;
+import org.springframework.util.StringUtils;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.web.client.RestTemplate;
 
+import java.io.IOException;
+import java.net.URLEncoder;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.stream.Collectors;
@@ -37,6 +43,8 @@ public class FoodController extends CommonController<FoodVo, Food, Integer> {
     private FoodRecommendService foodRecommendService;
 
 
+
+
     /**
      * 直接查询服务器缓存数据,数据量不够时候
      * 直接查询数据库数据,数据量不够时候
@@ -47,10 +55,18 @@ public class FoodController extends CommonController<FoodVo, Food, Integer> {
      */
     @GetMapping(value = "/searchFromKeyword")
     public ResultVO searchFromKeyword(@RequestParam(value = "keyword") String keyword,
-                                    @RequestParam(value = "page" ,defaultValue = "1") Integer page){
+                                    @RequestParam(value = "page" ,defaultValue = "1") Integer page) throws IOException {
 
         String url = "/food/search?keyword="+keyword+"&page="+page;
-        return  ResultVOUtil.success(foodService.getListFromUrl(url));
+
+        String _encodeKeyword = URLEncoder.encode(keyword, "UTF-8");
+        String refer = "/food/search?keyword="+_encodeKeyword+"&page="+page;
+
+        List<FoodSimpleVo> foodSimpleVos = foodService.getListFromUrl(url,refer);
+        if(foodSimpleVos.size()>0){
+            foodService.addKeywordToRedis(keyword);
+        }
+        return  ResultVOUtil.success(foodSimpleVos);
     }
 
     /**
@@ -63,28 +79,10 @@ public class FoodController extends CommonController<FoodVo, Food, Integer> {
      */
     @GetMapping(value = "/searchFromGroup")
     public ResultVO searchFromGroup(@RequestParam(value = "group") Integer group,
-                                      @RequestParam(value = "page" ,defaultValue = "1") Integer page){
+                                      @RequestParam(value = "page" ,defaultValue = "1") Integer page) throws IOException {
 
         String url = "/food/group/"+group +"&page="+page;
-        return  ResultVOUtil.success(foodService.getListFromUrl(url));
-    }
-
-    /**
-     * 按照类型获取推荐数据
-     * @param type
-     * @return
-     */
-    @GetMapping(value = "/byType")
-    public ResultVO onGetByType(@RequestParam(value = "type") Integer type){
-        FoodRecommendVo foodRecommendVo = new FoodRecommendVo();
-        foodRecommendVo.setType(type);
-        //推荐列表
-        List<FoodRecommendVo> foodRecommendVos = foodRecommendService.listVo(foodRecommendVo);
-        List<Integer> ids = foodRecommendVos.stream().map(e->e.getFoodId()).collect(Collectors.toList());
-        //根据id列表获取信息
-        List<Food> foodList = foodService.getListByIds(ids);
-        List<FoodSimpleVo> foodSimpleVos = CopyUtil.copyList(foodList, FoodSimpleVo.class);
-        return  ResultVOUtil.success(foodSimpleVos);
+        return  ResultVOUtil.success(foodService.getListFromUrl(url,url));
     }
 
 }

+ 4 - 1
src/main/java/com/YuyeTech/HeartRate/game/food/pojo/Food.java

@@ -10,6 +10,7 @@ import java.util.Date;
 @Data
 public class Food implements Serializable {
     @Id
+    @GeneratedValue(strategy = GenerationType.IDENTITY)
     private Integer id;//
 
     private String title;//食物标题
@@ -32,7 +33,9 @@ public class Food implements Serializable {
 
     private Double cellulose;//纤维素
 
-    private String describe;//描述
+    private Integer fGroup;//分组
+
+    private String fDescribe;//描述
 
     private Date updateTime;//
 

+ 3 - 0
src/main/java/com/YuyeTech/HeartRate/game/food/repository/FoodRepository.java

@@ -5,10 +5,13 @@ import com.YuyeTech.HeartRate.game.food.pojo.Food;
 import org.springframework.stereotype.Repository;
 
 import java.util.List;
+import java.util.Optional;
 
 @Repository
 public interface FoodRepository extends CommonRepository<Food, Integer> {
 
     List<Food>  findAllByIdIn(List<Integer> ids);
 
+    Optional<Food> findByTitle(String title);
+
 }

+ 29 - 0
src/main/java/com/YuyeTech/HeartRate/game/food/scheduled/FoodDayTask.java

@@ -1,14 +1,28 @@
 package com.YuyeTech.HeartRate.game.food.scheduled;
 
+import cn.hutool.core.date.DateUtil;
+import com.YuyeTech.HeartRate.game.food.service.FoodService;
+import com.YuyeTech.HeartRate.utils.RedisData;
+import com.YuyeTech.HeartRate.utils.RedisLock;
+import lombok.extern.slf4j.Slf4j;
 import org.quartz.JobExecutionContext;
 import org.quartz.JobExecutionException;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.scheduling.annotation.EnableScheduling;
 import org.springframework.scheduling.quartz.QuartzJobBean;
 
+import java.util.Date;
 
+@Slf4j
 @EnableScheduling
 public class FoodDayTask extends QuartzJobBean {
 
+    @Autowired
+    private FoodService foodService;
+
+    @Autowired
+    private RedisLock redisLock;
+
     /**
      * 执行搜索数据任务
      * @param jobExecutionContext
@@ -16,7 +30,22 @@ public class FoodDayTask extends QuartzJobBean {
      */
     @Override
     protected void executeInternal(JobExecutionContext jobExecutionContext) throws JobExecutionException {
+
+        long time = System.currentTimeMillis() + RedisData.getKeywordTimeout();
+        String _redisKey = "LOCK:FOOD:DAY:"+ DateUtil.format(new Date(),"yyyyMMdd");
+
+        //加线程锁住任务
+        if(!redisLock.lock(_redisKey,String.valueOf(time))){
+            log.info("触发搜索字段加锁失败!");
+            return;
+        }
+//        log.info(_redisKey);
         //取用户搜索的字段数据,来进行数据更新到本地
+//        foodService.getKeywordsFromRedis();
+
+        //按照keyword查询对应字段,把结果记录到数据库
+
 
+        redisLock.unlock(_redisKey,String.valueOf(time));
     }
 }

+ 9 - 5
src/main/java/com/YuyeTech/HeartRate/game/food/scheduled/FoodQuartzConfig.java

@@ -1,22 +1,26 @@
 package com.YuyeTech.HeartRate.game.food.scheduled;
 
-import org.quartz.CronScheduleBuilder;
-import org.quartz.Trigger;
-import org.quartz.TriggerBuilder;
+import org.quartz.*;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
 
 @Configuration
 public class FoodQuartzConfig {
 
-    private static String DayTrigger = "0/5 * * * * ?";
+    private static String DayTrigger = "0 0/5 * * * ?";
+
+    @Bean
+    public JobDetail syncFoodDayJobDetail(){
+        JobDetail jobDetail = JobBuilder.newJob(FoodDayTask.class).storeDurably().build();
+        return jobDetail;
+    }
 
     @Bean
     public Trigger syncFoodDayTrigger(){
         //每隔五秒触发一次,暂时
         CronScheduleBuilder cronScheduleBuilder = CronScheduleBuilder.cronSchedule(DayTrigger);
 
-        Trigger trigger = TriggerBuilder.newTrigger().forJob("").withSchedule(cronScheduleBuilder).build();
+        Trigger trigger = TriggerBuilder.newTrigger().forJob(syncFoodDayJobDetail()).withSchedule(cronScheduleBuilder).build();
         return trigger;
     }
 }

+ 11 - 1
src/main/java/com/YuyeTech/HeartRate/game/food/service/FoodService.java

@@ -5,13 +5,23 @@ import com.YuyeTech.HeartRate.game.food.pojo.Food;
 import com.YuyeTech.HeartRate.game.food.vo.FoodSimpleVo;
 import com.YuyeTech.HeartRate.game.food.vo.FoodVo;
 
+import java.io.IOException;
 import java.util.List;
 
 public interface FoodService extends CommonService<FoodVo, Food, Integer> {
 
     Food addFood(Food food);
 
-    List<FoodSimpleVo> getListFromUrl(String url);
+    FoodSimpleVo getByFoodTitle(String title);
+
+    List<FoodSimpleVo> getListFromUrl(String url,String refer);
 
     List<Food> getListByIds(List<Integer> ids);
+
+
+    void addKeywordToRedis(String keyword);
+
+    List<String> getKeywordsFromRedis();
+
+
 }

+ 139 - 58
src/main/java/com/YuyeTech/HeartRate/game/food/service/FoodServiceImpl.java

@@ -1,25 +1,34 @@
 package com.YuyeTech.HeartRate.game.food.service;
 
-import com.YuyeTech.HeartRate.common.service.*;
-import com.YuyeTech.HeartRate.enums.FoodEnum;
+import cn.hutool.core.date.DateUtil;
+import com.YuyeTech.HeartRate.common.service.CommonServiceImpl;
 import com.YuyeTech.HeartRate.game.food.pojo.Food;
+import com.YuyeTech.HeartRate.game.food.repository.FoodRepository;
 import com.YuyeTech.HeartRate.game.food.vo.FoodSimpleVo;
 import com.YuyeTech.HeartRate.game.food.vo.FoodVo;
-import com.YuyeTech.HeartRate.game.food.repository.FoodRepository;
+import com.YuyeTech.HeartRate.utils.CopyUtil;
+import com.YuyeTech.HeartRate.utils.RedisSettingMap;
 import lombok.extern.slf4j.Slf4j;
 import org.jsoup.Jsoup;
 import org.jsoup.nodes.Document;
 import org.jsoup.nodes.Element;
 import org.jsoup.select.Elements;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.redis.core.StringRedisTemplate;
+import org.springframework.data.redis.core.ZSetOperations;
+import org.springframework.http.*;
+import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
+import org.springframework.util.MultiValueMap;
 import org.springframework.web.client.RestTemplate;
+import org.springframework.web.util.UriComponentsBuilder;
 
 import javax.persistence.EntityManager;
 import javax.persistence.PersistenceContext;
-import java.util.ArrayList;
-import java.util.List;
+import java.io.IOException;
+import java.net.URLEncoder;
+import java.util.*;
 
 @Slf4j
 @Service
@@ -33,88 +42,129 @@ public class FoodServiceImpl extends CommonServiceImpl<FoodVo, Food, Integer> im
     @Autowired
     private FoodRepository foodRepository;
 
+    @Autowired
+    private RedisSettingMap redisSettingMap;
+
+
+    @Autowired
+    private StringRedisTemplate stringRedisTemplate;
+
     @Override
     public Food addFood(Food food) {
         return null;
     }
 
     @Override
-    public List<FoodSimpleVo> getListFromUrl(String url) {
+    public FoodSimpleVo getByFoodTitle(String title) {
+        Food food = foodRepository.findByTitle(title).orElse(null);
+        return food == null?null: CopyUtil.copy(food,FoodSimpleVo.class);
+    }
+
+
+    @Override
+    public List<FoodSimpleVo> getListFromUrl(String url,String refer) {
 
         RestTemplate restTemplate = new RestTemplate();
         String response = restTemplate.getForObject(domain+url, String.class);
         Document doc = Jsoup.parse(response);
+//        log.info(String.valueOf(doc));
         Element postList = doc.getElementById("main");
         Elements postItems  = postList.getElementsByClass("item clearfix");
-        log.info("postList size={}", postItems.size());
+//        log.info("postList size={}", postItems.size());
         List<FoodSimpleVo>  foodVoList = new ArrayList<>();
         for (Element postItem : postItems) {
             //像jquery选择器一样,获取文章标题元素
             Elements titleEle = postItem.select(".text-box a");
             String detailUrl = domain+titleEle.attr("href");
-            log.info("标题:" + titleEle.attr("title"));;
-            log.info("详情地址:" + detailUrl);
+//            log.info("标题:" + titleEle.attr("title"));;
+//            log.info("详情地址:" + detailUrl);
             String src = postItem.select("img").attr("src");
-            log.info("缩略图:" + src);
+//            log.info("缩略图:" + src);
             Elements describe = postItem.select(".text-box p");
-            log.info("描述:" + describe.text());
-            log.info("*********************************");
+//            log.info("描述:" + describe.text());
+//            log.info("*********************************");
             String[] hrefs = titleEle.attr("href").split("/");
             FoodSimpleVo foodVo = new FoodSimpleVo();
             foodVo.setTitle(titleEle.attr("title"));
             foodVo.setType(hrefs[1]);
             foodVo.setName(hrefs[2]);
-            foodVo.setDescribe(describe.text());
-
-
-
-            String detailUrlResponse = restTemplate.getForObject(detailUrl, String.class);
-            Document detailDoc = Jsoup.parse(detailUrlResponse);
-
-            Element detailMain = detailDoc.getElementById("main");
-            Elements detailItems = detailMain.select(".basic-infor li");
+            foodVo.setIconUrl(src);
+            foodVo.setFDescribe(describe.text());
+            foodVo.setCreateTime(DateUtil.date());
+            foodVo.setUpdateTime(DateUtil.date());
+
+            String _describe = describe.text();
+            Integer _dIndex = _describe.indexOf("大卡");
+            String _calorieText =  _describe.substring(0,_dIndex);
+            String _calorieStr = _calorieText.replaceAll("\\s*","").replaceAll("[^(0-9)]","");
+            Double _calorie = Double.parseDouble(_calorieStr);
+//            log.info("_calorie:"+_calorie);
+            foodVo.setKcal(_calorie);
+            foodVo.setCarbohydrate(0d);
+            foodVo.setFat(0d);
+            foodVo.setProtein(0d);
+            foodVo.setCellulose(0d);
+            foodVo.setFGroup(0);
+
+            HttpHeaders headers = new HttpHeaders();
+            headers.add("referer",  domain + refer);
+            HttpEntity request = new HttpEntity(null, headers);
+//            MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter =
+//                    new MappingJackson2HttpMessageConverter();
+//            mappingJackson2HttpMessageConverter.setSupportedMediaTypes(Arrays.asList(MediaType.TEXT_HTML));
+//            restTemplate.getMessageConverters().add(mappingJackson2HttpMessageConverter);
+            ResponseEntity<String> detailUrlResponse = restTemplate.exchange(detailUrl, HttpMethod.GET, request, String.class);
+            Document detailDoc = Jsoup.parse(detailUrlResponse.getBody());
+//            log.info(String.valueOf(detailDoc));
+            Element detailMain = detailDoc.getElementById("food_cover");
             String iconUrl = detailMain.select("img").attr("src");
             foodVo.setIconUrl(iconUrl);
-            for (Element _item : detailItems) {
-                //像jquery选择器一样,获取文章标题元素
-                //Elements titleEle = _item.select(".basic-infor li");
-                log.info("b1:" + _item.text().split(":")[0]);
-                log.info("b2:" + _item.text().split(":")[1]);
-                Elements count =  _item.select(".stress");
-                log.info("count:" + count.text() + "K");
-                log.info("*********************************");
-            }
-            Elements infoItems = detailMain.select(".nutr-tag dl").not(".header");
-            Elements ddItems = infoItems.select("dd");
-            for (Element _ddItem : ddItems) {
-                Elements  _name= _ddItem.select(".dt");
-                Elements  _num= _ddItem.select(".dd");
-                log.info(_name.text() +" = "+_num.text());
-                double _value = 0;
-                try {
-                    _value = Double.parseDouble(_num.text());
-                } catch (Exception e) {
-                    _value = 0;
-                }
-
-                if(_name.text().indexOf("热量")>-1){
-                    foodVo.setKcal(_value);
-
-                }else if(_name.text().indexOf("碳水化合物")>-1){
-                    foodVo.setCarbohydrate(_value);
-                }else if(_name.text().indexOf("脂肪")>-1){
-                    foodVo.setFat(_value);
-                }else if(_name.text().indexOf("蛋白质")>-1){
-                    foodVo.setProtein(_value);
-                }else if(_name.text().indexOf("纤维素")>-1){
-                    foodVo.setCellulose(_value);
-                }
-            }
-            log.info("*********************************");
+//            Element detailMain = detailDoc.getElementById("main");
+//            Elements detailItems = detailMain.select(".basic-infor li");
+//            String iconUrl = detailMain.select("img").attr("src");
+//            foodVo.setIconUrl(iconUrl);
+//            for (Element _item : detailItems) {
+//                //像jquery选择器一样,获取文章标题元素
+//                //Elements titleEle = _item.select(".basic-infor li");
+//                log.info("b1:" + _item.text().split(":")[0]);
+//                log.info("b2:" + _item.text().split(":")[1]);
+//                Elements count =  _item.select(".stress");
+//                log.info("count:" + count.text() + "K");
+//                log.info("*********************************");
+//            }
+//            Elements infoItems = detailMain.select(".nutr-tag dl").not(".header");
+//            Elements ddItems = infoItems.select("dd");
+//            for (Element _ddItem : ddItems) {
+//                Elements  _name= _ddItem.select(".dt");
+//                Elements  _num= _ddItem.select(".dd");
+//                log.info(_name.text() +" = "+_num.text());
+//                double _value = 0;
+//                try {
+//                    _value = Double.parseDouble(_num.text());
+//                } catch (Exception e) {
+//                    _value = 0;
+//                }
+//
+//                if(_name.text().indexOf("热量")>-1){
+//                    foodVo.setKcal(_value);
+//
+//                }else if(_name.text().indexOf("碳水化合物")>-1){
+//                    foodVo.setCarbohydrate(_value);
+//                }else if(_name.text().indexOf("脂肪")>-1){
+//                    foodVo.setFat(_value);
+//                }else if(_name.text().indexOf("蛋白质")>-1){
+//                    foodVo.setProtein(_value);
+//                }else if(_name.text().indexOf("纤维素")>-1){
+//                    foodVo.setCellulose(_value);
+//                }
+//            }
+//            log.info("*********************************");
 
             foodVoList.add(foodVo);
         }
-
+        Collections.sort(foodVoList,(a,b)->{
+            return (int) (a.getKcal() - b.getKcal());
+        });
         return foodVoList;
     }
 
@@ -123,4 +173,35 @@ public class FoodServiceImpl extends CommonServiceImpl<FoodVo, Food, Integer> im
     public List<Food> getListByIds(List<Integer> ids) {
         return foodRepository.findAllByIdIn(ids);
     }
+
+    @Override
+    public void addKeywordToRedis(String keyword) {
+        //直接记录一个keyword 到缓存,用于定时任务爬数据
+        String keywordPrefix = redisSettingMap.getKeywordPrefix();
+        ZSetOperations zSetOperations = stringRedisTemplate.opsForZSet();
+        //如果不存在,直接添加,如果存在,+1
+        zSetOperations.incrementScore(keywordPrefix, keyword, 1.0);
+    }
+
+    @Override
+    public List<String> getKeywordsFromRedis() {
+        //直接记录一个keyword 到缓存,用于定时任务爬数据
+        String keywordPrefix = redisSettingMap.getKeywordPrefix();
+        ZSetOperations zSetOperations = stringRedisTemplate.opsForZSet();
+        //获取搜索最多的前十个数据
+        Set<ZSetOperations.TypedTuple<Object>> rankTen = zSetOperations.reverseRangeWithScores(keywordPrefix, 0, 10);
+        Iterator<ZSetOperations.TypedTuple<Object>> iterator = rankTen.iterator();
+        List<String> keywordList = new ArrayList<>();
+        List<Double> scoreList = new ArrayList<>();
+        while (iterator.hasNext()) {
+            ZSetOperations.TypedTuple<Object> typedTuple = iterator.next();
+            keywordList.add(typedTuple.getValue().toString());
+            scoreList.add(typedTuple.getScore());
+        }
+        return null;
+    }
+
+
+
+
 }

+ 5 - 1
src/main/java/com/YuyeTech/HeartRate/game/food/vo/FoodSimpleVo.java

@@ -28,7 +28,11 @@ public class FoodSimpleVo implements Serializable {
 
     private Double cellulose;//纤维素
 
-    private String describe;//描述
+    private Integer fGroup;//分组
+
+    private String fDescribe;//描述
+
+    private Date createTime;//
 
     private Date updateTime;//
 

+ 5 - 1
src/main/java/com/YuyeTech/HeartRate/game/food/vo/FoodVo.java

@@ -29,7 +29,11 @@ public class FoodVo extends PageCondition implements Serializable {
 
     private Double cellulose;//纤维素
 
-    private String describe;//描述
+    private Integer fGroup;//分组
+
+    private String fDescribe;//描述
+
+    private Date createTime;//
 
     private Date updateTime;//
 

TEMPAT SAMPAH
src/main/java/com/YuyeTech/HeartRate/game/foodRecommend/.DS_Store


TEMPAT SAMPAH
src/main/java/com/YuyeTech/HeartRate/game/foodRecommend/Heart_App_Server_Layuisrcm.textClipping


TEMPAT SAMPAH
src/main/java/com/YuyeTech/HeartRate/game/foodRecommend/controller/.DS_Store


+ 108 - 15
src/main/java/com/YuyeTech/HeartRate/game/foodRecommend/controller/FoodRecommendController.java

@@ -1,20 +1,26 @@
 package com.YuyeTech.HeartRate.game.foodRecommend.controller;
 
+import cn.hutool.core.date.DateUtil;
 import com.YuyeTech.HeartRate.VO.ResultVO;
 import com.YuyeTech.HeartRate.common.controller.*;
 import com.YuyeTech.HeartRate.common.pojo.PageInfo;
 import com.YuyeTech.HeartRate.enums.FoodEnum;
+import com.YuyeTech.HeartRate.game.food.pojo.Food;
+import com.YuyeTech.HeartRate.game.food.service.FoodService;
+import com.YuyeTech.HeartRate.game.food.vo.FoodSimpleVo;
+import com.YuyeTech.HeartRate.game.food.vo.FoodVo;
 import com.YuyeTech.HeartRate.game.foodRecommend.pojo.FoodRecommend;
 import com.YuyeTech.HeartRate.game.foodRecommend.vo.FoodRecommendVo;
 import com.YuyeTech.HeartRate.game.foodRecommend.service.FoodRecommendService;
+import com.YuyeTech.HeartRate.utils.CopyUtil;
 import com.YuyeTech.HeartRate.utils.ResultVOUtil;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
 
-import java.util.ArrayList;
-import java.util.EnumSet;
-import java.util.HashMap;
-import java.util.List;
+import java.io.IOException;
+import java.net.URLEncoder;
+import java.util.*;
+import java.util.stream.Collectors;
 
 @RestController
 @RequestMapping("/foodRecommend/")
@@ -22,21 +28,108 @@ public class FoodRecommendController extends CommonController<FoodRecommendVo, F
     @Autowired
     private FoodRecommendService foodRecommendService;
 
+    @Autowired
+    private FoodService foodService;
+
     /**
-     *  获取分类
+     * 按照类型获取推荐数据
+     * @param proType
      * @return
      */
-    @GetMapping(value = "/types")
-    public ResultVO onGetTypes(){
-        List<HashMap<String, Object>> list = new ArrayList<>();
-        for (FoodEnum foodEnumEnum : EnumSet.allOf(FoodEnum.class)) {
-            HashMap<String, Object> map = new HashMap<>();
-            map.put("name", foodEnumEnum.getName());
-            map.put("value", foodEnumEnum.getValue());
-            list.add(map);
-        }
-        return  ResultVOUtil.success(list);
+    @GetMapping(value = "/byType")
+    public ResultVO onGetByType(@RequestParam(value = "proType") Integer proType){
+        FoodRecommendVo foodRecommendVo = new FoodRecommendVo();
+        foodRecommendVo.setType(proType);
+        //推荐列表
+        List<FoodRecommendVo> foodRecommendVos = foodRecommendService.listVo(foodRecommendVo);
+        List<Integer> ids = foodRecommendVos.stream().map(e->e.getFoodId()).collect(Collectors.toList());
+        //根据id列表获取信息
+        List<Food> foodList = foodService.getListByIds(ids);
+        List<FoodSimpleVo> foodSimpleVos = CopyUtil.copyList(foodList, FoodSimpleVo.class);
+        Collections.sort(foodSimpleVos,(a, b)->{
+            return (int) (a.getKcal() - b.getKcal());
+        });
+        return  ResultVOUtil.success(foodSimpleVos);
     }
 
+    /**
+     *  生成推荐数据
+     *  碳水推荐:燕麦、大米、小米、紫薯、糯米、薏米
+     *  蛋白质推荐:鸡蛋、鸡胸肉、牛肉、
+     *  蔬菜:生菜、黄瓜、番茄、洋葱、胡萝卜、白菜、玉米
+     *  油    :椰子油、橄榄油、菜油、花生油
+     * @return
+     */
+//    @GetMapping(value = "/generate")
+    public ResultVO onGenerate() throws IOException{
+        List<String> CARBOHYDRATES = new ArrayList<>();
+        CARBOHYDRATES.add("燕麦");
+        CARBOHYDRATES.add("大米");
+        CARBOHYDRATES.add("小米");
+        CARBOHYDRATES.add("紫薯");
+        CARBOHYDRATES.add("糯米");
+        CARBOHYDRATES.add("薏米");
+//        CARBOHYDRATES.add("原兹林 紫薯果");
+        query(CARBOHYDRATES,FoodEnum.CARBOHYDRATES.getValue());
+
+
+        List<String> PROTEINS = new ArrayList<>();
+        PROTEINS.add("鸡蛋");
+        PROTEINS.add("鸡胸肉");
+        PROTEINS.add("牛肉");
+        query(PROTEINS,FoodEnum.PROTEINS.getValue());
+
+        List<String> VEGETABLES = new ArrayList<>();
+        VEGETABLES.add("生菜");
+        VEGETABLES.add("黄瓜");
+        VEGETABLES.add("番茄");
+        VEGETABLES.add("洋葱");
+        VEGETABLES.add("胡萝卜");
+        VEGETABLES.add("白菜");
+        VEGETABLES.add("玉米");
+        query(VEGETABLES,FoodEnum.VEGETABLES.getValue());
+
+        List<String> OILS = new ArrayList<>();
+        OILS.add("椰子油");
+        OILS.add("橄榄油");
+        OILS.add("菜油");
+        OILS.add("花生油");
+        query(OILS,FoodEnum.OILS.getValue());
+
+        return  ResultVOUtil.success();
+    }
+
+
+    public void query(List<String>  keywords,Integer proType) throws IOException {
+        for (int i=0;i<keywords.size();i++){
+            String url = "/food/search?keyword="+keywords.get(i)+"&page=1";
+            String _encodeKeyword = URLEncoder.encode(keywords.get(i), "UTF-8");
+            String refer = "/food/search?keyword="+_encodeKeyword+"&page=1";
+
+            List<FoodSimpleVo> foodSimpleVos = foodService.getListFromUrl(url,refer);
+            FoodVo addRecommendItem = null;
+            for (FoodSimpleVo item : foodSimpleVos) {
+                item.setProType(proType);
+                FoodVo foodVo = CopyUtil.copy(item, FoodVo.class);
+
+                FoodSimpleVo foodSimpleVo = foodService.getByFoodTitle(foodVo.getTitle());
+                if(foodSimpleVo == null){
+                    if(addRecommendItem == null){
+//                        FoodVo(id=null, title=燕麦片,又叫燕麦, proType=0, type=shiwu, name=yanmaipian, iconUrl=https://s.boohee.cn/house/upload_food/2021/8/18/small_photo_url_b7579d0f5a211460e8d356a846033f77.jpg, kcal=338.0, carbohydrate=0.0, fat=0.0, protein=0.0, cellulose=0.0, describe=热量:338 大卡(每100克), createTime=2023-06-09 18:08:29, updateTime=2023-06-09 18:08:29)
+                        addRecommendItem =  foodService.saveReturnVo(foodVo);
+                        FoodRecommendVo foodRecommendVo = new FoodRecommendVo();
+                        foodRecommendVo.setType(addRecommendItem.getProType());
+                        foodRecommendVo.setFoodId(addRecommendItem.getId());
+                        foodRecommendVo.setIsShow(1);
+                        foodRecommendVo.setShowTime(DateUtil.date());
+                        foodRecommendService.saveReturnVo(foodRecommendVo);
+                    } else{
+                        foodService.saveReturnVo(foodVo);
+                    }
+                }
+
+            }
+        }
+    }
 
 }

TEMPAT SAMPAH
src/main/java/com/YuyeTech/HeartRate/game/foodRecommend/pojo/.DS_Store


TEMPAT SAMPAH
src/main/java/com/YuyeTech/HeartRate/game/foodRecommend/repository/.DS_Store


TEMPAT SAMPAH
src/main/java/com/YuyeTech/HeartRate/game/foodRecommend/service/.DS_Store


TEMPAT SAMPAH
src/main/java/com/YuyeTech/HeartRate/game/foodRecommend/vo/.DS_Store


+ 2 - 0
src/main/java/com/YuyeTech/HeartRate/game/userinfo/controller/UserInfoController.java

@@ -874,6 +874,7 @@ public class UserInfoController {
            CHistoricalCalorie cHistoricalCalorie = cHistoricalCalorieService.findByToday();
            boolean bSaveDate = true;
            if(cHistoricalCalorie == null){
+               cHistoricalCalorie = new CHistoricalCalorie();
                cHistoricalCalorie.setUserId(userId);
                cHistoricalCalorie.setCalorie(calorie);
            }else{
@@ -913,6 +914,7 @@ public class UserInfoController {
 
         try {
             CHistoricalCalorieVo cHistoricalCalorieVo = new CHistoricalCalorieVo();
+            cHistoricalCalorieVo.setUserId(userId);
             cHistoricalCalorieVo.setPage(page);
             cHistoricalCalorieVo.setRows(size);
             cHistoricalCalorieVo.setSidx("DESC");

+ 10 - 0
src/main/java/com/YuyeTech/HeartRate/utils/RedisData.java

@@ -51,4 +51,14 @@ public class RedisData {
     public static int getCharacterTimeout() {
         return CHARACTER_TIMEOUT;
     }
+
+
+    /**
+     * keyword 搜寻锁
+     */
+    private static final int KEYWORD_TIMEOUT = 10 * 1000; //5s锁
+
+    public static int getKeywordTimeout() {
+        return KEYWORD_TIMEOUT;
+    }
 }

+ 11 - 0
src/main/java/com/YuyeTech/HeartRate/utils/RedisSettingMap.java

@@ -236,4 +236,15 @@ public class RedisSettingMap {
             default: return null;
         }
     }
+
+
+    /**
+     * 记录keyword的redis前缀
+     * @return
+     */
+
+    public String getKeywordPrefix(){
+        return applicationName.concat(":").concat("keyword");
+    }
+
 }