소스 검색

feat(system): 添加首页轮播图管理功能

- 新增 AppBannerController、AppBannerServiceImpl、IAppBannerService
- 实现首页轮播图的分页查询、添加、编辑、删除等功能
- 在 AppHomeController 中添加根据课程类型查询课程列表的接口
- 修改 DetailServiceImpl 中的 getPlaceInfo 方法,移除课程信息查询逻辑
SheepHy 2 주 전
부모
커밋
49ccd057c8

+ 14 - 1
national-motion-module-system/national-motion-system-biz/src/main/java/org/jeecg/modules/app/controller/AppHomeController.java

@@ -120,7 +120,20 @@ public class AppHomeController {
      **/
     @GetMapping("/getCourseInfo")
     @Operation(summary = "课程详情")
-    public Result<CourseInfoVO> getCourseInfo(@Schema(description="课程ID")String id, double latitude, double longitude){
+    public Result<CourseInfoVO> getCourseInfo(@RequestParam @Schema(description="课程ID")String id, @RequestParam double latitude,@RequestParam double longitude){
         return Result.ok(detailService.getCourseInfo(id, latitude, longitude));
     }
+
+    /**
+     * @Author SheepHy
+     * @Description 根据课程类型查询课程列表
+     * @Date 9:52 2025/7/9
+     * @Param type 课程类型
+     * @return List<PlaceInfoVO.CourseInfoVO>
+     **/
+    @GetMapping("/courseInfoVOList")
+    @Operation(summary = "根据课程类型查询课程列表")
+    public Result<List<PlaceInfoVO.CourseInfoVO>> courseInfoVOList(@RequestParam @Schema(description="课程类型")String type, @RequestParam @Schema(description="课程ID")String id){
+        return Result.ok(detailService.courseInfoVOList(type, id));
+    }
 }

+ 19 - 0
national-motion-module-system/national-motion-system-biz/src/main/java/org/jeecg/modules/app/service/IDetailService.java

@@ -3,6 +3,8 @@ package org.jeecg.modules.app.service;
 import org.jeecg.modules.app.vo.CourseInfoVO;
 import org.jeecg.modules.app.vo.PlaceInfoVO;
 
+import java.util.List;
+
 public interface IDetailService {
     /**
      * @Author SheepHy
@@ -21,4 +23,21 @@ public interface IDetailService {
      * @return CourseInfoVO {@link CourseInfoVO}
      **/
     CourseInfoVO getCourseInfo(String id, double latitude, double longitude);
+
+    /**
+     * @Author SheepHy
+     * @Description 根据课程类型查询课程列表
+     * @Date 9:52 2025/7/9
+     * @Param type 课程类型
+     * @return List<PlaceInfoVO.CourseInfoVO>
+     **/
+    List<PlaceInfoVO.CourseInfoVO> courseInfoVOList(String type, String id);
+    
+    /** 
+     * @Author SheepHy
+     * @Description //TODO 
+     * @Date 10:14 2025/7/9
+     * @Param 
+     * @return 
+     **/
 }

+ 1 - 1
national-motion-module-system/national-motion-system-biz/src/main/java/org/jeecg/modules/app/service/impl/AppHomeServiceImpl.java

@@ -129,7 +129,7 @@ public class AppHomeServiceImpl implements IAppHomeService {
      * @Description 合并课程信息
      * @Date 9:14 2025/7/4
      * @Param appCoureseList {@link List<AppCourses>}
-     * @return List<CoureseVO> {@link List< CourseVO >}
+     * @return List<CoureseVO> {@link List<CourseVO>}
      **/
     private List<CourseVO> convertToCoureseVOList(List<AppCourses> appCoureseList) {
         return appCoureseList.stream()

+ 23 - 18
national-motion-module-system/national-motion-system-biz/src/main/java/org/jeecg/modules/app/service/impl/DetailServiceImpl.java

@@ -40,7 +40,6 @@ public class DetailServiceImpl implements IDetailService {
 
     @Override
     public PlaceInfoVO getPlaceInfo(String id) {
-        LoginUser user = (LoginUser) SecurityUtils.getSubject().getPrincipal();
         AppSite appSite = appSiteMapper.selectById(id);
         PlaceInfoVO placeInfo = appSiteMapper.getPlaceInfo(id);
         AppSitePriceRules appSitePriceRules = appSitePriceRulesMapper.selectOne(Wrappers.<AppSitePriceRules>lambdaQuery()
@@ -57,22 +56,8 @@ public class DetailServiceImpl implements IDetailService {
                 instructorVOList.add(vo);
             }
         }
-        List<PlaceInfoVO.CourseInfoVO> courseInfoVOList = new ArrayList<>();
-        appCoursesMapper.selectList(Wrappers.<AppCourses>lambdaQuery()
-                .eq(AppCourses::getSiteId, id)
-                .eq(AppCourses::getStatus, 0)
-                .eq(AppCourses::getDelFlag, 0)).forEach(appCourses -> {
-                PlaceInfoVO.CourseInfoVO courseInfoVO = new PlaceInfoVO.CourseInfoVO();
-                    BeanUtils.copyProperties(courseInfoVO, appCourses);
-                    courseInfoVO.setSales(getCourseSalesCount(appCourses.getId()));
-                    courseInfoVO.setSalesYear(getCourseSales(appCourses.getId()));
-                    courseInfoVO.setPriceType(isFirstPurchase(user.getId()));
-            courseInfoVOList.add(courseInfoVO);
-        });
         placeInfo.setInstructorVOList(instructorVOList);
-        placeInfo.setCourseInfoVOList(courseInfoVOList);
         if(appSite.getType() == 0){
-            //todo 评价查询待添加
             PlaceInfoVO.PlaceInfoMsgVO placeInfoMsgVO = new PlaceInfoVO.PlaceInfoMsgVO();
             placeInfoMsgVO.setName(appSite.getName())
                     .setSales(getPlaceSales(id))
@@ -81,7 +66,6 @@ public class DetailServiceImpl implements IDetailService {
             placeInfo.setPlaceInfoMsgVO(placeInfoMsgVO);
             return placeInfo;
         }else if(appSite.getType() == 1){
-//            //todo 评价查询待添加
             PlaceInfoVO.PlaceInfoMsgVO placeInfoMsgVO = new PlaceInfoVO.PlaceInfoMsgVO();
             placeInfoMsgVO.setName(appSite.getName())
                     .setSales(getPlaceSales(id))
@@ -109,10 +93,27 @@ public class DetailServiceImpl implements IDetailService {
             courseDetailVOList.add(courseDetailVO);
         });
         courseInfoVO.setCourseDetail(courseDetailVOList);
-        //todo 评价查询待添加
         return courseInfoVO;
     }
 
+    @Override
+    public List<PlaceInfoVO.CourseInfoVO> courseInfoVOList(String type, String id) {
+        LoginUser user = (LoginUser) SecurityUtils.getSubject().getPrincipal();
+        List<PlaceInfoVO.CourseInfoVO> courseInfoVOList = new ArrayList<>();
+        appCoursesMapper.selectList(Wrappers.<AppCourses>lambdaQuery()
+                .eq(AppCourses::getSiteId, id)
+                .eq(AppCourses::getStatus, 0)
+                .eq(AppCourses::getDelFlag, 0)).forEach(appCourses -> {
+            PlaceInfoVO.CourseInfoVO courseInfoVO = new PlaceInfoVO.CourseInfoVO();
+            BeanUtils.copyProperties(courseInfoVO, appCourses);
+            courseInfoVO.setSales(getCourseSalesCount(appCourses.getId()));
+            courseInfoVO.setSalesYear(getCourseSales(appCourses.getId()));
+            courseInfoVO.setPriceType(isFirstPurchase(user.getId()));
+            courseInfoVOList.add(courseInfoVO);
+        });
+        return courseInfoVOList;
+    }
+
     /**
      * @return
      * @Author SheepHy
@@ -148,6 +149,9 @@ public class DetailServiceImpl implements IDetailService {
         return Math.toIntExact(appOrderProductMapper.selectCount(
                 Wrappers.<AppOrderProduct>lambdaQuery()
                         .eq(AppOrderProduct::getProductId, id)
+                        .eq(AppOrderProduct::getStatus,0)
+                        .eq(AppOrderProduct::getDelFlag,0)
+                        .eq(AppOrderProduct::getProductOrderStatus,1)
                         .ge(AppOrderProduct::getCreateTime, Date.from(startOfYear.atZone(ZoneId.systemDefault()).toInstant())) // >= 2025-01-01
                         .lt(AppOrderProduct::getCreateTime, Date.from(endOfYear.atZone(ZoneId.systemDefault()).toInstant())) // < 2026-01-01
         ));
@@ -175,7 +179,8 @@ public class DetailServiceImpl implements IDetailService {
      * @return
      **/
     private int isFirstPurchase(String userId) {
-        AppOrder appOrder = appOrderMapper.selectOne(Wrappers.<AppOrder>lambdaQuery().eq(AppOrder::getUpdateBy, userId).last("limit 1"));
+        AppOrder appOrder = appOrderMapper.selectOne(Wrappers.<AppOrder>lambdaQuery()
+                .eq(AppOrder::getUpdateBy, userId).last("limit 1"));
         if(null == appOrder){
             return 1;
         }else {

+ 17 - 3
national-motion-module-system/national-motion-system-biz/src/main/java/org/jeecg/modules/app/vo/PlaceInfoVO.java

@@ -43,12 +43,10 @@ public class PlaceInfoVO {
     private Object placeInfoMsgVO;
     @Schema(description = "教练简约返回参数")
     private List<InstructorVO> instructorVOList;
-    @Schema(description="课程返回参数")
-    private List<CourseInfoVO> courseInfoVOList;
     @Data
     @Accessors(chain = true)
     @EqualsAndHashCode(callSuper = false)
-    @Schema(description="场地简约返回参数")
+    @Schema(description="场地简约返回参数-学校")
     public static class PlaceInfoMsgVO{
         @Schema(description = "场地名称")
         private String name;
@@ -61,6 +59,22 @@ public class PlaceInfoVO {
         @Schema(description = "售价")
         private BigDecimal sellingPrice;
     }
+//    @Data
+//    @Accessors(chain = true)
+//    @EqualsAndHashCode(callSuper = false)
+//    @Schema(description="场地简约返回参数-体育馆")
+//    public static class PlaceInfoMsgVO{
+//        @Schema(description = "场地名称")
+//        private String name;
+//        @Schema(description = "销售数量")
+//        private int sales;
+//        @Schema(description = "类目")
+//        private List<String> category;
+//        @Schema(description = "原价")
+//        private BigDecimal originalPrice;
+//        @Schema(description = "售价")
+//        private BigDecimal sellingPrice;
+//    }
     @Data
     @Accessors(chain = true)
     @EqualsAndHashCode(callSuper = false)

+ 159 - 0
national-motion-module-system/national-motion-system-biz/src/main/java/org/jeecg/modules/system/app/controller/AppBannerController.java

@@ -0,0 +1,159 @@
+package org.jeecg.modules.system.app.controller;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
+import org.jeecg.common.api.vo.Result;
+import org.jeecg.common.aspect.annotation.AutoLog;
+import org.jeecg.common.constant.CommonConstant;
+import org.jeecg.common.system.base.controller.JeecgController;
+import org.jeecg.common.system.query.QueryGenerator;
+import org.jeecg.modules.system.app.entity.AppBanner;
+import org.jeecg.modules.system.app.service.IAppBannerService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.servlet.ModelAndView;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.util.Arrays;
+
+/**
+ * @Description: 首页轮播图管理
+ * @Author: jeecg-boot
+ * @Date:   2023-08-14
+ * @Version: V1.0
+ */
+@Tag(name="首页轮播图管理")
+@RestController
+@RequestMapping("/app/appBanner")
+@Slf4j
+public class AppBannerController extends JeecgController<AppBanner, IAppBannerService> {
+	@Autowired
+	private IAppBannerService appBannerService;
+	
+	/**
+	 * 分页列表查询
+	 *
+	 * @param appBanner
+	 * @param pageNo
+	 * @param pageSize
+	 * @param req
+	 * @return
+	 */
+	//@AutoLog(value = "首页轮播图管理-分页列表查询")
+	@Operation(summary="首页轮播图管理-分页列表查询")
+	@GetMapping(value = "/list")
+	public Result<IPage<AppBanner>> queryPageList(AppBanner appBanner,
+													@RequestParam(name="pageNo", defaultValue="1") Integer pageNo,
+													@RequestParam(name="pageSize", defaultValue="10") Integer pageSize,
+													HttpServletRequest req) {
+		QueryWrapper<AppBanner> queryWrapper = QueryGenerator.initQueryWrapper(appBanner, req.getParameterMap());
+		Page<AppBanner> page = new Page<AppBanner>(pageNo, pageSize);
+		IPage<AppBanner> pageList = appBannerService.page(page, queryWrapper);
+		return Result.OK(pageList);
+	}
+	
+	/**
+	 *   添加
+	 *
+	 * @param appBanner
+	 * @return
+	 */
+	@AutoLog(value = "首页轮播图管理-添加")
+	@Operation(summary="首页轮播图管理-添加")
+	@PostMapping(value = "/add")
+	public Result<String> add(@RequestBody AppBanner appBanner) {
+		appBanner.setDelFlag(CommonConstant.DEL_FLAG_0);
+		appBannerService.save(appBanner);
+		return Result.OK("添加成功!");
+	}
+	
+	/**
+	 *  编辑
+	 *
+	 * @param appBanner
+	 * @return
+	 */
+	@AutoLog(value = "首页轮播图管理-编辑")
+	@Operation(summary="首页轮播图管理-编辑")
+	@RequestMapping(value = "/edit", method = {RequestMethod.PUT,RequestMethod.POST})
+	public Result<String> edit(@RequestBody AppBanner appBanner) {
+		appBannerService.updateById(appBanner);
+		return Result.OK("编辑成功!");
+	}
+	
+	/**
+	 *   通过id删除
+	 *
+	 * @param id
+	 * @return
+	 */
+	@AutoLog(value = "首页轮播图管理-通过id删除")
+	@Operation(summary="首页轮播图管理-通过id删除")
+	@DeleteMapping(value = "/delete")
+	public Result<String> delete(@RequestParam(name="id",required=true) String id) {
+		appBannerService.removeById(id);
+		return Result.OK("删除成功!");
+	}
+	
+	/**
+	 *  批量删除
+	 *
+	 * @param ids
+	 * @return
+	 */
+	@AutoLog(value = "首页轮播图管理-批量删除")
+	@Operation(summary="首页轮播图管理-批量删除")
+	@DeleteMapping(value = "/deleteBatch")
+	public Result<String> deleteBatch(@RequestParam(name="ids",required=true) String ids) {
+		this.appBannerService.removeByIds(Arrays.asList(ids.split(",")));
+		return Result.OK("批量删除成功!");
+	}
+	
+	/**
+	 * 通过id查询
+	 *
+	 * @param id
+	 * @return
+	 */
+	//@AutoLog(value = "首页轮播图管理-通过id查询")
+	@Operation(summary="首页轮播图管理-通过id查询")
+	@GetMapping(value = "/queryById")
+	public Result<AppBanner> queryById(@RequestParam(name="id",required=true) String id) {
+		AppBanner appBanner = appBannerService.getById(id);
+		if(appBanner==null) {
+			return Result.error("未找到对应数据");
+		}
+		return Result.OK(appBanner);
+	}
+
+    /**
+    * 导出excel
+    *
+    * @param request
+    * @param appBanner
+    */
+    @RequiresPermissions("app:app_banner:exportXls")
+    @RequestMapping(value = "/exportXls")
+    public ModelAndView exportXls(HttpServletRequest request, AppBanner appBanner) {
+        return super.exportXls(request, appBanner, AppBanner.class, "首页轮播图管理");
+    }
+
+    /**
+      * 通过excel导入数据
+    *
+    * @param request
+    * @param response
+    * @return
+    */
+    @RequiresPermissions("app:app_banner:importExcel")
+    @RequestMapping(value = "/importExcel", method = RequestMethod.POST)
+    public Result<?> importExcel(HttpServletRequest request, HttpServletResponse response) {
+        return super.importExcel(request, response, AppBanner.class);
+    }
+}

+ 13 - 0
national-motion-module-system/national-motion-system-biz/src/main/java/org/jeecg/modules/system/app/service/IAppBannerService.java

@@ -0,0 +1,13 @@
+package org.jeecg.modules.system.app.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import org.jeecg.modules.system.app.entity.AppBanner;
+
+/**
+ * @Description: 首页轮播图管理
+ * @Author: jeecg-boot
+ * @Date:   2023-08-14
+ * @Version: V1.0
+ */
+public interface IAppBannerService extends IService<AppBanner> {
+}

+ 18 - 0
national-motion-module-system/national-motion-system-biz/src/main/java/org/jeecg/modules/system/app/service/impl/AppBannerServiceImpl.java

@@ -0,0 +1,18 @@
+package org.jeecg.modules.system.app.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.jeecg.modules.system.app.entity.AppBanner;
+import org.jeecg.modules.system.app.mapper.AppBannerMapper;
+import org.jeecg.modules.system.app.service.IAppBannerService;
+import org.springframework.stereotype.Service;
+
+/**
+ * @Description: 首页轮播图管理
+ * @Author: jeecg-boot
+ * @Date: 2023-08-14
+ * @Version: V1.0
+ */
+@Service
+public class AppBannerServiceImpl extends ServiceImpl<AppBannerMapper, AppBanner> implements IAppBannerService {
+
+}