Browse Source

测试完成首页信息展示

杨兴卓 1 month ago
parent
commit
36da0331d9
25 changed files with 534 additions and 156 deletions
  1. 5 1
      xyzc-common/xyzc-common-core/pom.xml
  2. 3 0
      xyzc-common/xyzc-common-core/src/main/java/com/xyzc/common/core/exception/ErrorCode.java
  3. 47 47
      xyzc-common/xyzc-common-core/src/main/java/com/xyzc/common/core/exception/ServerExceptionHandler.java
  4. 11 0
      xyzc-common/xyzc-common-core/src/main/java/com/xyzc/common/core/utils/AssertUtils.java
  5. 1 1
      xyzc-common/xyzc-common-core/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
  6. 14 0
      xyzc-start/src/main/java/com/xyzc/start/constant/BaseUserConst.java
  7. 14 0
      xyzc-start/src/main/java/com/xyzc/start/constant/FuelDeduct.java
  8. 46 8
      xyzc-start/src/main/java/com/xyzc/start/controller/HomePageController.java
  9. 0 11
      xyzc-start/src/main/java/com/xyzc/start/controller/MyPageController.java
  10. 24 0
      xyzc-start/src/main/java/com/xyzc/start/controller/OssController.java
  11. 26 21
      xyzc-start/src/main/java/com/xyzc/start/controller/UserInfoController.java
  12. 3 3
      xyzc-start/src/main/java/com/xyzc/start/domain/BaseUserCollect.java
  13. 28 0
      xyzc-start/src/main/java/com/xyzc/start/domain/vo/BaseUserCollectAppVo.java
  14. 50 0
      xyzc-start/src/main/java/com/xyzc/start/domain/vo/BaseUserSelectAppVo.java
  15. 3 3
      xyzc-start/src/main/java/com/xyzc/start/domain/vo/WebHomePageVo.java
  16. 5 15
      xyzc-start/src/main/java/com/xyzc/start/mapper/AppMapper.java
  17. 33 0
      xyzc-start/src/main/java/com/xyzc/start/mapper/BaseUserCollectMapper.java
  18. 7 0
      xyzc-start/src/main/java/com/xyzc/start/mapper/BaseUserMapper.java
  19. 17 1
      xyzc-start/src/main/java/com/xyzc/start/service/IHomePageService.java
  20. 15 0
      xyzc-start/src/main/java/com/xyzc/start/service/IUserInfoService.java
  21. 77 45
      xyzc-start/src/main/java/com/xyzc/start/service/impl/HomePageServiceImpl.java
  22. 26 0
      xyzc-start/src/main/java/com/xyzc/start/service/impl/UserInfoServiceImpl.java
  23. 7 0
      xyzc-start/src/main/resources/mapper/WebStart/AppMapper.xml
  24. 66 0
      xyzc-start/src/main/resources/mapper/WebStart/BaseUserCollectMapper.xml
  25. 6 0
      xyzc-start/src/main/resources/mapper/WebStart/BaseUserMapper.xml

+ 5 - 1
xyzc-common/xyzc-common-core/pom.xml

@@ -123,8 +123,12 @@
             <groupId>ch.qos.logback</groupId>
             <artifactId>logback-core</artifactId>
         </dependency>
+        <dependency>
+            <groupId>org.springframework.security</groupId>
+            <artifactId>spring-security-core</artifactId>
+        </dependency>
 
-<!--        <dependency>-->
+        <!--        <dependency>-->
 <!--            <groupId>org.springframework.security</groupId>-->
 <!--            <artifactId>spring-security-core</artifactId>-->
 <!--        </dependency>-->

+ 3 - 0
xyzc-common/xyzc-common-core/src/main/java/com/xyzc/common/core/exception/ErrorCode.java

@@ -47,6 +47,9 @@ public enum ErrorCode {
     ORDER_NO_EXIST(2007, "此订单号不存在"),
     DISCOUNT_NO_CONFIG(2008, "折扣未配置"),
 
+    // 用户燃料不足
+    SURPLUS_FUEL_NOT_ENOUGH(2300, "燃料不足"),
+
     PARAM_NOT_EMPTY(3000, "必填参数不能为空"),
 
     // 5000自定义编码

+ 47 - 47
xyzc-common/xyzc-common-core/src/main/java/com/xyzc/common/core/exception/ServerExceptionHandler.java

@@ -1,47 +1,47 @@
-//package com.xyzc.common.core.exception;
-//
-//import com.xyzc.common.core.utils.Result;
-//import lombok.extern.slf4j.Slf4j;
-//import org.springframework.security.access.AccessDeniedException;
-//import org.springframework.validation.BindException;
-//import org.springframework.validation.FieldError;
-//import org.springframework.web.bind.annotation.ExceptionHandler;
-//import org.springframework.web.bind.annotation.RestControllerAdvice;
-//
-//
-///**
-// * 异常处理器
-// */
-//@Slf4j
-//@RestControllerAdvice
-//public class ServerExceptionHandler {
-//    /**
-//     * 处理自定义异常
-//     */
-//    @ExceptionHandler(ServerException.class)
-//    public Result<String> handleException(ServerException ex) {
-//        return Result.error(ex.getCode(), ex.getMsg());
-//    }
-//
-//    /**
-//     * SpringMVC参数绑定,Validator校验不正确
-//     */
-//    @ExceptionHandler(BindException.class)
-//    public Result<String> bindException(BindException ex) {
-//        FieldError fieldError = ex.getFieldError();
-//        assert fieldError != null;
-//        return Result.error(fieldError.getDefaultMessage());
-//    }
-//
-//    @ExceptionHandler(AccessDeniedException.class)
-//    public Result<String> handleAccessDeniedException(Exception ex) {
-//        return Result.error(ErrorCode.FORBIDDEN);
-//    }
-//
-//    @ExceptionHandler(Exception.class)
-//    public Result<String> handleException(Exception ex) {
-//        log.error(ex.getMessage(), ex);
-//        return Result.error(ErrorCode.INTERNAL_SERVER_ERROR);
-//    }
-//
-//}
+package com.xyzc.common.core.exception;
+
+import com.xyzc.common.core.utils.Result;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.security.access.AccessDeniedException;
+import org.springframework.validation.BindException;
+import org.springframework.validation.FieldError;
+import org.springframework.web.bind.annotation.ExceptionHandler;
+import org.springframework.web.bind.annotation.RestControllerAdvice;
+
+
+/**
+ * 异常处理器
+ */
+@Slf4j
+@RestControllerAdvice
+public class ServerExceptionHandler {
+    /**
+     * 处理自定义异常
+     */
+    @ExceptionHandler(ServerException.class)
+    public Result<String> handleException(ServerException ex) {
+        return Result.error(ex.getCode(), ex.getMsg());
+    }
+
+    /**
+     * SpringMVC参数绑定,Validator校验不正确
+     */
+    @ExceptionHandler(BindException.class)
+    public Result<String> bindException(BindException ex) {
+        FieldError fieldError = ex.getFieldError();
+        assert fieldError != null;
+        return Result.error(fieldError.getDefaultMessage());
+    }
+
+    @ExceptionHandler(AccessDeniedException.class)
+    public Result<String> handleAccessDeniedException(Exception ex) {
+        return Result.error(ErrorCode.FORBIDDEN);
+    }
+
+    @ExceptionHandler(Exception.class)
+    public Result<String> handleException(Exception ex) {
+        log.error(ex.getMessage(), ex);
+        return Result.error(ErrorCode.INTERNAL_SERVER_ERROR);
+    }
+
+}

+ 11 - 0
xyzc-common/xyzc-common-core/src/main/java/com/xyzc/common/core/utils/AssertUtils.java

@@ -54,4 +54,15 @@ public class AssertUtils {
             throw new ServerException(errCode);
         }
     }
+
+    /**
+     * 判断剩余燃料是否大于0,小于0抛出异常
+     *
+     * @param surplusFuel
+     */
+    public static void surplusFuel(Long surplusFuel) {
+        if (surplusFuel < 0) {
+            throw new ServerException(ErrorCode.SURPLUS_FUEL_NOT_ENOUGH);
+        }
+    }
 }

+ 1 - 1
xyzc-common/xyzc-common-core/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports

@@ -4,4 +4,4 @@ com.xyzc.common.core.config.XyzcConfig
 com.xyzc.common.core.config.ThreadPoolConfig
 com.xyzc.common.core.config.ValidatorConfig
 com.xyzc.common.core.utils.SpringUtils
-#com.xyzc.common.core.exception.ServerExceptionHandler
+com.xyzc.common.core.exception.ServerExceptionHandler

+ 14 - 0
xyzc-start/src/main/java/com/xyzc/start/constant/BaseUserConst.java

@@ -12,4 +12,18 @@ public interface BaseUserConst {
      */
     Integer CALL_STATUS = 0;
 
+    /**
+     * 收藏应用
+     */
+    Integer COLLECT_APP = 3;
+
+    /**
+     * 收藏
+     */
+    Integer COLLECT = 1;
+
+    /**
+     * 取消收藏
+     */
+    Integer CANCEL_COLLECT = 0;
 }

+ 14 - 0
xyzc-start/src/main/java/com/xyzc/start/constant/FuelDeduct.java

@@ -0,0 +1,14 @@
+package com.xyzc.start.constant;
+
+public interface FuelDeduct {
+
+    /**
+     * 扣除燃料成功
+     */
+    String DEDUCT_SUCCESS = "燃料扣除成功";
+
+    /**
+     *  扣除燃料失败
+     */
+    String DEDUCT_FAIL = "燃料扣除失败";
+}

+ 46 - 8
xyzc-start/src/main/java/com/xyzc/start/controller/HomePageController.java

@@ -2,9 +2,7 @@ package com.xyzc.start.controller;
 
 import com.xyzc.common.core.utils.Result;
 import com.xyzc.start.domain.App;
-import com.xyzc.start.domain.vo.AppVo;
-import com.xyzc.start.domain.vo.IndustryVo;
-import com.xyzc.start.domain.vo.WebHomePageVo;
+import com.xyzc.start.domain.vo.*;
 import com.xyzc.start.service.IHomePageService;
 import lombok.AllArgsConstructor;
 import org.springframework.web.bind.annotation.CrossOrigin;
@@ -42,16 +40,56 @@ public class HomePageController {
 
 
     /**
-     * 最近使用
+     * 更多最近使用应用
      */
-    @GetMapping("/recentlyUsed")
-    public Result<List<AppVo>> recentlyUsed() {
-        List<AppVo> list = homePageService.getRecentlyUsed();
+    @GetMapping("/moreUse")
+    public Result<List<BaseUserCollectAppVo>> recentlyUsed(Long appId) {
+        List<BaseUserCollectAppVo> list = homePageService.getRecentlyUsed(appId);
 
         return Result.ok(list);
     }
 
     /**
-     *
+     * 更多收藏应用
+     */
+    @GetMapping("/moreCollect")
+    public Result<List<BaseUserCollectAppVo>> moreCollect(Long appId) {
+        List<BaseUserCollectAppVo> list = homePageService.getMoreCollect(appId);
+
+        return Result.ok(list);
+    }
+
+    /**
+     * 更多精选应用
+     */
+    @GetMapping("/moreSelector")
+    public Result<List<BaseUserSelectAppVo>> moreSelect(Long appId) {
+        List<BaseUserSelectAppVo> list = homePageService.getMoreSelector(appId);
+
+        return Result.ok(list);
+    }
+
+    /**
+     * 应用详情
+     */
+    @GetMapping("/clickApp")
+    public Result<App> clickApp(Long appId) {
+//        App app = homePageService.clickApp(appId);
+
+        return Result.ok();
+    }
+
+    /**
+     * 绘画
+     */
+
+
+    /**
+     * AI修图
+     */
+
+
+    /**
+     * 文案创作
      */
 }

+ 0 - 11
xyzc-start/src/main/java/com/xyzc/start/controller/MyPageController.java

@@ -33,17 +33,6 @@ public class MyPageController {
         return Result.ok(collectApps);
     }
 
-    /**
-     * 根据应用id,反回应用的具体信息
-     */
-//    @SaCheckPermission("webaccess:homePage:getAppDetail")
-//    @Log(title = "更具应用id,反回应用的具体信息")
-//    @GetMapping("/{id}")
-//    public R<CarefulSelectVo> getAppDetail(@PathVariable("id") String id){
-//         CarefulSelectVo appDetail = homePageService.getAppDetail(id);
-//        return Result.ok(appDetail);
-//    }
-
 
     /**
      * 联系客服

+ 24 - 0
xyzc-start/src/main/java/com/xyzc/start/controller/OssController.java

@@ -0,0 +1,24 @@
+package com.xyzc.start.controller;
+
+import lombok.RequiredArgsConstructor;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * 资源上传接口
+ *
+ * @author 杨兴卓
+ */
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/oss")
+public class OssController {
+//
+//    private final OssService ossService;
+//
+//    @RequestMapping("/upload")
+//    public String upload() {
+//        return ossService.upload();
+//    }
+
+}

+ 26 - 21
xyzc-start/src/main/java/com/xyzc/start/controller/UserInfoController.java

@@ -1,6 +1,7 @@
 package com.xyzc.start.controller;
 
 import com.xyzc.common.core.utils.Result;
+import com.xyzc.start.constant.FuelDeduct;
 import com.xyzc.start.domain.bo.AgentCardSecretBo;
 import com.xyzc.start.domain.bo.HobbyBo;
 import com.xyzc.start.domain.vo.BaseUserFuelFlowVo;
@@ -29,7 +30,6 @@ public class UserInfoController {
 
     /**
      * 登录用户获取用户信息
-     *
      */
     @GetMapping("/info")
     public Result<BaseUserVo> info() {
@@ -41,7 +41,6 @@ public class UserInfoController {
 
     /**
      * 获取当前用户的燃料和会员卡信息
-     *
      */
     @GetMapping("/current")
     public Result<BaseUserVo> current() {
@@ -53,7 +52,6 @@ public class UserInfoController {
 
     /**
      * 燃料流水
-     *
      */
     @GetMapping("/queryFuelFlow")
     public Result<List<BaseUserFuelFlowVo>> queryFuelFlow(Long flowId) {
@@ -65,7 +63,6 @@ public class UserInfoController {
 
     /**
      * 用户选择喜好
-     *
      */
     @PostMapping("/hobby")
     public Result<Void> hobby(@RequestBody @Valid HobbyBo hobby) {
@@ -74,29 +71,37 @@ public class UserInfoController {
         return Result.ok();
     }
 
-
     /**
-     * 获取所有行业
-     *
-     * @return
+     * 根据对应的appId扣减燃料
      */
-    @GetMapping("/queryIndustryAll")
-    public Result<List<IndustryVo>> queryIndustryAll() {
-        List<IndustryVo> industryAll = userInfoService.getIndustryAll();
+    @PutMapping("/deduct")
+    public Result<String> deduct(Long appId) {
+        userInfoService.deduct(appId);
 
-        return Result.ok(industryAll);
+        return Result.ok(FuelDeduct.DEDUCT_SUCCESS);
     }
 
+/**
+ * 获取所有行业
+ *
+ * @return
+ */
+@GetMapping("/queryIndustryAll")
+public Result<List<IndustryVo>> queryIndustryAll() {
+    List<IndustryVo> industryAll = userInfoService.getIndustryAll();
 
-    /**
-     * 销卡
-     *
-     */
-    @PostMapping("/exchange")
-    public Result<Void> exchange(@RequestBody @Valid AgentCardSecretBo exchangeBo) {
-        userInfoService.exchange(exchangeBo);
+    return Result.ok(industryAll);
+}
 
-        return Result.ok();
-    }
+
+/**
+ * 销卡
+ */
+@PostMapping("/exchange")
+public Result<Void> exchange(@RequestBody @Valid AgentCardSecretBo exchangeBo) {
+    userInfoService.exchange(exchangeBo);
+
+    return Result.ok();
+}
 
 }

+ 3 - 3
xyzc-start/src/main/java/com/xyzc/start/domain/BaseUserCollect.java

@@ -29,14 +29,14 @@ public class BaseUserCollect  {
     private Long agentId;
 
     /**
-     * 收藏的id
+     * 收藏的id
      */
     private Long collectId;
 
     /**
-     * 是否收藏,1-最近使用,2-收藏
+     * 是否收藏,0-最近使用,1-收藏
      */
-    private Long isCollect;
+    private Integer isCollect;
 
     /**
      * 收藏类型,1-绘画模型, 2-图像, 3-应用

+ 28 - 0
xyzc-start/src/main/java/com/xyzc/start/domain/vo/BaseUserCollectAppVo.java

@@ -0,0 +1,28 @@
+package com.xyzc.start.domain.vo;
+
+import lombok.Data;
+
+/**
+ * 用户收藏app信息
+ *
+ * @author 杨兴卓
+ *
+ */
+@Data
+public class BaseUserCollectAppVo {
+
+    /**
+     * 应用Id
+     */
+    private Long appId;
+
+    /**
+     * 应用名称
+     */
+    private String appName;
+
+    /**
+     * 应用图标
+     */
+    private String appIcon;
+}

+ 50 - 0
xyzc-start/src/main/java/com/xyzc/start/domain/vo/BaseUserSelectAppVo.java

@@ -0,0 +1,50 @@
+package com.xyzc.start.domain.vo;
+
+import lombok.Data;
+
+/**
+ * 用户精选应用
+ */
+@Data
+public class BaseUserSelectAppVo {
+
+    /**
+     * 应用Id
+     */
+    private Long appId;
+
+    /**
+     * 应用名称
+     */
+    private String appName;
+
+    /**
+     * 应用描述
+     */
+    private String appDesc;
+
+    /**
+     * 应用图标
+     */
+    private String appIcon;
+
+    /**
+     * ai模型图标
+     */
+    private String aiModelIcon;
+
+    /**
+     * ai模型名称
+     */
+    private String aiModelName;
+
+    /**
+     * 使用数量真
+     */
+    private Integer useCount;
+
+    /**
+     * 该用户是否使收藏
+     */
+    private Integer isCollect;
+}

+ 3 - 3
xyzc-start/src/main/java/com/xyzc/start/domain/vo/WebHomePageVo.java

@@ -17,15 +17,15 @@ public class WebHomePageVo {
     /**
      *  用户首页应用历史记录
      */
-    private List<BaseUserCollectVo> historyApps;
+    private List<BaseUserCollectAppVo> historyApps;
 
     /**
      * 用户收藏
      */
-    private List<BaseUserCollectVo> colletApps;
+    private List<BaseUserCollectAppVo> colletApps;
 
     /**
      * 精选应用
      */
-    private List<BaseUserCollectVo> carefullSelectApps;
+    private List<BaseUserSelectAppVo> carefullSelectApps;
 }

+ 5 - 15
xyzc-start/src/main/java/com/xyzc/start/mapper/AppMapper.java

@@ -6,6 +6,7 @@ import com.xyzc.common.mybatis.core.mapper.BaseMapperPlus;
 import com.xyzc.start.constant.Const;
 import com.xyzc.start.domain.App;
 import com.xyzc.start.domain.bo.AbilityBo;
+import com.xyzc.start.domain.vo.AiModelVo;
 import com.xyzc.start.domain.vo.AppVo;
 import org.apache.ibatis.annotations.Param;
 import org.springframework.stereotype.Repository;
@@ -18,24 +19,13 @@ import org.springframework.stereotype.Repository;
 @Repository
 public interface AppMapper extends BaseMapperPlus<App, AppVo> {
 
-    /**
-     * 自定义条件分页查询
-     */
-    Page<App> customPageList(@Param(Const.PAGE) Page<Object> build, @Param(Const.BO) AbilityBo bo);
 
     /**
-     * 默认读取前8个精选应用,后续再拿就需要传递id,然后从id开始获取数据
-     * @param id
+     *
+     * @param appId
      * @return
      */
-//    List<CarefulSelectVo> queryCarefulSelectApps(Long id);
+    AiModelVo queryAiModelFuel(Long appId);
+
 
-    /**
-     * 默认获取8个历史应用,更多需要拿到
-     * @param isCollect 0:未收藏 1:已收藏
-     * @param isMore 0:默认 1:更多
-     * @param userId 用户id
-     * @return
-     */
-//    List<CarefulSelectVo> queryCollectApps(Integer isCollect, Boolean isMore, Long userId);
 }

+ 33 - 0
xyzc-start/src/main/java/com/xyzc/start/mapper/BaseUserCollectMapper.java

@@ -70,4 +70,37 @@ public interface BaseUserCollectMapper extends BaseMapper<BaseUserCollect> {
      * @return
      */
     List<AppVo> queryAppById(Long userId, Long id);
+
+    /**
+     * 根据用户id查询收藏的应用
+     *
+     * @param userId
+     * @return
+     */
+    List<BaseUserCollectAppVo> queryCollectAppBy(Long userId);
+
+    /**
+     * 根据用户id查询浏览记录
+     *
+     * @param userId
+     * @return
+     */
+    List<BaseUserCollectAppVo> queryHistoryAppBy(Long userId);
+
+    /**
+     * 查询精选应用
+     *
+     * @return
+     */
+    List<BaseUserSelectAppVo> queryCarefulSelectAppBy(Long appId, Integer length);
+
+    /**
+     * 查询该用户是否收藏应用
+     *
+     * @param userId    用户id
+     * @param appIdList 应用id列表
+     * @param type      收藏类型
+     */
+    List<BaseUserCollect> queryCollectAppByUserIdAndAppId(@Param("userId") Long userId, List<Long> appIdList, @Param("type") Integer type);
+
 }

+ 7 - 0
xyzc-start/src/main/java/com/xyzc/start/mapper/BaseUserMapper.java

@@ -100,4 +100,11 @@ public interface BaseUserMapper extends BaseMapperPlus<BaseUser, BaseUserVo> {
      */
     BaseUserVo queryBaseUserVoById(Long userId);
 
+    /**
+     * 获取用户的燃料信息,加上行锁了
+     *
+     * @param userId
+     * @return
+     */
+    BaseUser selectVoByIdForUpdate(Long userId);
 }

+ 17 - 1
xyzc-start/src/main/java/com/xyzc/start/service/IHomePageService.java

@@ -33,7 +33,7 @@ public interface IHomePageService {
      * 获取最近使用
      * @return
      */
-    List<AppVo> getRecentlyUsed();
+    List<BaseUserCollectAppVo> getRecentlyUsed(Long appId);
 
     /**
      * 根据域名获取代理商id,返回代理商的联系方式
@@ -41,4 +41,20 @@ public interface IHomePageService {
      * @return
      */
     MerchantCancatVo getContact();
+
+    /**
+     *  获取更多收藏应用
+     *
+     * @param appId
+     * @return
+     */
+    List<BaseUserCollectAppVo> getMoreCollect(Long appId);
+
+    /**
+     * 获取更多精选应用
+     *
+     * @param appId
+     * @return
+     */
+    List<BaseUserSelectAppVo> getMoreSelector(Long appId);
 }

+ 15 - 0
xyzc-start/src/main/java/com/xyzc/start/service/IUserInfoService.java

@@ -10,6 +10,7 @@ import java.util.List;
 public interface IUserInfoService {
     /**
      * 获取用户详细信息
+     *
      * @return
      */
     BaseUserVo queryInfo();
@@ -17,12 +18,14 @@ public interface IUserInfoService {
 
     /**
      * 获取用户燃料等常变信息
+     *
      * @return
      */
     BaseUserVo queryCurrent();
 
     /**
      * 保存用户爱好
+     *
      * @param hobby HobbyBo
      */
     void saveHobby(HobbyBo hobby);
@@ -35,6 +38,7 @@ public interface IUserInfoService {
 
     /**
      * 获取画夹的所有内容
+     *
      * @param id
      * @return
      */
@@ -42,6 +46,7 @@ public interface IUserInfoService {
 
     /**
      * 根据id获取图画
+     *
      * @param id
      * @return
      */
@@ -49,18 +54,21 @@ public interface IUserInfoService {
 
     /**
      * 根据id删除图画
+     *
      * @param id
      */
     void deletePhoto(Long id);
 
     /**
      * 根据did删除多个图画
+     *
      * @param ids
      */
     void deletePhotos(List<Long> ids);
 
     /**
      * 获取燃料流水
+     *
      * @param flowId
      * @return
      */
@@ -72,4 +80,11 @@ public interface IUserInfoService {
      * @param exchangeBo
      */
     void exchange(AgentCardSecretBo exchangeBo);
+
+    /**
+     * 根据对应的id扣除燃料
+     *
+     * @param appId
+     */
+    void deduct(Long appId);
 }

+ 77 - 45
xyzc-start/src/main/java/com/xyzc/start/service/impl/HomePageServiceImpl.java

@@ -1,7 +1,9 @@
 package com.xyzc.start.service.impl;
 
 import com.xyzc.common.web.security.user.SecurityUser;
+import com.xyzc.start.constant.BaseUserConst;
 import com.xyzc.start.constant.MoreTypeConst;
+import com.xyzc.start.domain.BaseUserCollect;
 import com.xyzc.start.domain.bo.BaseUserCollectQueryBo;
 import com.xyzc.start.domain.vo.*;
 import com.xyzc.start.mapper.BaseUserCollectMapper;
@@ -12,6 +14,9 @@ import org.springframework.stereotype.Service;
 
 import java.util.ArrayList;
 import java.util.List;
+import java.util.Map;
+import java.util.function.Function;
+import java.util.stream.Collectors;
 
 @Service
 @RequiredArgsConstructor
@@ -24,79 +29,106 @@ public class HomePageServiceImpl implements IHomePageService {
     /**
      * 当前用户获取所有的历史应用和用户收藏的应用
      *
-     * @return
+     * @return WebHomePageVo
      */
     @Override
     public WebHomePageVo getHomePage() {
-        //拿到用户id
-        Long userId = SecurityUser.getUserId();
-        //获取当前用户的历史应用
-//        List<CarefulSelectVo> historyApps = abilityMapper.queryCollectApps(IsCollectConst.NOT_COLLECT, false, userId);
-//
-//        //获取当前用户的收藏应用
-//        List<CarefulSelectVo> colletApps = abilityMapper.queryCollectApps(IsCollectConst.COLLECTED, false, userId);
-//
-//        //TODO:后期优化,系统启动就将精选应用存储到redis,让用户优先从redis读取
-//        //获取精选应用
-//        List<CarefulSelectVo> carefulSelectApps = abilityMapper.queryCarefulSelectApps(null);
-
-        //todo: 先试用假数据测试,然后查数据库真数据
-        List<BaseUserCollectVo> historyApps = new ArrayList<>() {
-            {
-                add(new BaseUserCollectVo());
-                add(new BaseUserCollectVo());
-                add(new BaseUserCollectVo());
-            }
-        };
-        List<BaseUserCollectVo> colletApps = new ArrayList<>() {
-            {
-                add(new BaseUserCollectVo());
-                add(new BaseUserCollectVo());
-                add(new BaseUserCollectVo());
-            }
-        };
-        List<BaseUserCollectVo> carefulSelectApps = new ArrayList<>() {
-            {
-                add(new BaseUserCollectVo());
-                add(new BaseUserCollectVo());
-                add(new BaseUserCollectVo());
-            }
-
-            ;
-        };
 
+        // 获取用户收藏应用 前8个
+        List<BaseUserCollectAppVo> collectAppList = baseUserCollectMapper.queryCollectAppBy(SecurityUser.getUserId());
+
+        // 获取用户历史应用 前8个
+        List<BaseUserCollectAppVo> historyAppList = baseUserCollectMapper.queryHistoryAppBy(SecurityUser.getUserId());
+
+        // 获取精选应用 前4个
+        List<BaseUserSelectAppVo> carefulSelectAppList = baseUserCollectMapper.queryCarefulSelectAppBy(null, 4);
+        // 以精选应用id未key,精选应用为value,生成一个map,并且去重
+        Map<Long, BaseUserSelectAppVo> collect = carefulSelectAppList
+                .stream()
+                .collect(Collectors.toMap(BaseUserSelectAppVo::getAppId, Function.identity(), (k1, k2) -> k1));
+
+        // 将map的id值转换为list
+        List<Long> appIdList = new ArrayList<>(collect.keySet());
+        List<BaseUserCollect> baseUserCollect = baseUserCollectMapper.queryCollectAppByUserIdAndAppId(SecurityUser.getUserId(), appIdList, BaseUserConst.COLLECT_APP);
+        for (BaseUserCollect app : baseUserCollect){
+            collect.get(app.getCollectId()).setIsCollect(app.getIsCollect());
+        }
 
         //生成数据返回给视图
         WebHomePageVo webHomePageVo = new WebHomePageVo();
-        webHomePageVo.setHistoryApps(historyApps);
-        webHomePageVo.setColletApps(colletApps);
-        webHomePageVo.setCarefullSelectApps(carefulSelectApps);
+        webHomePageVo.setHistoryApps(historyAppList);
+        webHomePageVo.setColletApps(collectAppList);
+        webHomePageVo.setCarefullSelectApps(carefulSelectAppList);
+
         return webHomePageVo;
     }
 
     /**
-     * 获取最近使用的应用
+     * 获取更多最近使用的应用
      *
      * @return
      */
     @Override
-    public List<AppVo> getRecentlyUsed() {
+    public List<BaseUserCollectAppVo> getRecentlyUsed(Long appId) {
+        // 获取最近使用应用
 
-        return List.of();
+        return baseUserCollectMapper.queryHistoryAppBy(SecurityUser.getUserId());
     }
 
+    /**
+     * 获取联系信息
+     *
+     * @return
+     */
     @Override
     public MerchantCancatVo getContact() {
-        
+
         return merchantMapper.queryMerchantCancatById(SecurityUser.getUserId());
     }
 
     /**
-     * 获取所有的收藏应用
+     * 获取更多的收藏应用
      *
+     * @param appId 应用id
      * @return
      */
     @Override
+    public List<BaseUserCollectAppVo> getMoreCollect(Long appId) {
+        // 获取跟多用户收藏应用
+        return baseUserCollectMapper.queryCollectAppBy(SecurityUser.getUserId());
+    }
+
+    /**
+     * 获取更多精选应用
+     *
+     * @param appId
+     * @return
+     */
+    @Override
+    public List<BaseUserSelectAppVo> getMoreSelector(Long appId) {
+        // 获取更多精选应用
+        List<BaseUserSelectAppVo> baseUserSelectAppVos = baseUserCollectMapper.queryCarefulSelectAppBy(appId, 10);
+
+        // 以精选应用id未key,精选应用为value,生成一个map,并且去重
+        Map<Long, BaseUserSelectAppVo> collect = baseUserSelectAppVos.stream().collect(Collectors.toMap(BaseUserSelectAppVo::getAppId, Function.identity(), (k1, k2) -> k1));
+
+        // 将map的id值转换为list
+        List<Long> ids = new ArrayList<>(collect.keySet());
+        List<BaseUserCollect> baseUserCollect = baseUserCollectMapper.queryCollectAppByUserIdAndAppId(SecurityUser.getUserId(), ids, BaseUserConst.COLLECT_APP);
+        for (BaseUserCollect app : baseUserCollect){
+            collect.get(app.getCollectId()).setIsCollect(app.getIsCollect());
+        }
+
+        return baseUserSelectAppVos;
+
+    }
+
+    /**
+     * 获取更多收藏
+     *
+     * @return List<BaseUserCollectVo>
+     */
+    @Override
     public List<BaseUserCollectVo> getMoreApps(BaseUserCollectQueryBo collectBo) {
         //todo : 需要获取当前用户信息
         Long userId = 123L;

+ 26 - 0
xyzc-start/src/main/java/com/xyzc/start/service/impl/UserInfoServiceImpl.java

@@ -2,7 +2,9 @@ package com.xyzc.start.service.impl;
 
 import com.xyzc.common.core.exception.ErrorCode;
 import com.xyzc.common.core.exception.ServerException;
+import com.xyzc.common.core.utils.AssertUtils;
 import com.xyzc.common.web.security.user.SecurityUser;
+import com.xyzc.start.domain.BaseUser;
 import com.xyzc.start.domain.bo.AgentCardSecretBo;
 import com.xyzc.start.domain.bo.HobbyBo;
 import com.xyzc.start.domain.vo.*;
@@ -25,6 +27,8 @@ public class UserInfoServiceImpl implements IUserInfoService {
 
     private final FuelFlowMapper fuelFlowMapper;
 
+    private final AppMapper appMapper;
+
     /**
      * 获取当前用户信息
      *
@@ -154,6 +158,28 @@ public class UserInfoServiceImpl implements IUserInfoService {
 
         // 4. 开始核销卡密,先将其状态修改为 正在核销
 
+    }
 
+    /**
+     * 根据应用id扣除对应的燃料
+     *
+     * @param appId
+     */
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void deduct(Long appId) {
+        // 首先获取个人燃料剩余量
+        BaseUser baseUser = baseUserMapper.selectVoByIdForUpdate(SecurityUser.getUserId());
+
+        // 然后获取应用对应的ai模型燃料扣除量
+        AiModelVo aiModelVo = appMapper.queryAiModelFuel(appId);
+        baseUser.setSurplusFuel(baseUser.getSurplusFuel()-aiModelVo.getConsumeFuelNumber());
+
+        // 判断扣除后的用户剩余燃料是否小于0,如果小于0,则抛出异常
+        AssertUtils.surplusFuel(baseUser.getSurplusFuel());
+
+        // 然后扣除燃料返回成功
+        baseUserMapper.updateById(baseUser);
     }
 }
+

+ 7 - 0
xyzc-start/src/main/resources/mapper/WebStart/AppMapper.xml

@@ -9,5 +9,12 @@
 
     </select>
 
+    <select id="queryAiModelFuel" resultType="com.xyzc.start.domain.vo.AiModelVo">
+        SELECT am.id, am.consume_fuel_number
+        from xy_app app
+            left join xy_ai_model_app  ama on ama.app_id = .app_id
+                 left join xy_ai_model am on app.ai_model_id = am.id
+    </select>
+
 
 </mapper>

+ 66 - 0
xyzc-start/src/main/resources/mapper/WebStart/BaseUserCollectMapper.xml

@@ -92,5 +92,71 @@
         LIMIT 10
     </select>
 
+    <select id="queryCarefulSelectAppBy" resultType="com.xyzc.start.domain.vo.BaseUserSelectAppVo">
+        SELECT app.id               as app_id,
+               app.app_name         as app_name,
+               app.description      as app_desc,
+               oss.url              as app_icon,
+               oss2.url             as ai_model_icon,
+               am.ai_model_name     as ai_model_name,
+               app.use_count        as use_count
+        from xy_app app
+            left join sys_oss oss on app.oss_id = oss.oss_id
+            left join xy_ai_model_app ama on ama.app_id = app.id
+            left join xy_ai_model am on ama.ai_model_id = am.id
+            left join sys_oss oss2 on am.ai_model_logo_oss_id = oss2.oss_id
+        where app.is_choiceness = 1
+          <if test="appId != null">
+              and app.id > #{appId}
+          </if>
+        limit #{length}
+    </select>
+
+    <select id="queryHistoryAppBy" resultType="com.xyzc.start.domain.vo.BaseUserCollectAppVo">
+        SELECT app.id       as app_id,
+               app.app_name as app_name,
+               oss.url      as app_icon
+        from xy_base_user_collect buc
+                 left join xy_app app on buc.collect_id = app.id
+                 left join sys_oss oss on app.oss_id = oss.oss_id
+        where buc.base_user_id = #{userId}
+          and buc.type = 3
+        order by buc.create_time desc
+        limit 8
+
+    </select>
+
+
+    <select id="queryCollectAppBy" resultType="com.xyzc.start.domain.vo.BaseUserCollectAppVo">
+        SELECT app.id       as app_id,
+               app.app_name as app_name,
+               oss.url      as app_icon
+        from xy_base_user_collect buc
+                 left join xy_app app on buc.collect_id = app.id
+                 left join sys_oss oss on app.oss_id = oss.oss_id
+        where buc.base_user_id = #{userId}
+          and buc.type = 3
+          and buc.is_collect = 1
+        order by buc.create_time desc
+        limit 8
+    </select>
+
+
+    <select id="queryCollectAppByUserIdAndAppId" resultType="com.xyzc.start.domain.BaseUserCollect">
+        SELECT
+            id,
+            collect_id,
+            is_collect
+        FROM
+            xy_base_user_collect
+        WHERE base_user_id = #{userId}
+          AND type = #{type}
+          AND collect_id in
+            <foreach collection="appIdList" item="appId" open="(" separator="," close=")">
+                #{appId}
+            </foreach>
+
+    </select>
+
 
 </mapper>

+ 6 - 0
xyzc-start/src/main/resources/mapper/WebStart/BaseUserMapper.xml

@@ -56,5 +56,11 @@
         where id = #{userId}
     </select>
 
+    <select id="selectVoByIdForUpdate" resultType="com.xyzc.start.domain.BaseUser">
+        select id, surplus_fuel
+        from xy_base_user
+        where id = #{userId} for update
+    </select>
+
 
 </mapper>