團隊作業4——專案衝刺-4

AIZzcl發表於2024-11-14

團隊作業4——專案衝刺-4

資訊項 內容
課程名稱 廣工計院計科34班軟工
作業要求位置 作業要求
作業目標 在七天敏捷衝刺中,完成工大嚴選開發,記錄每日進展和問題,更新燃盡圖、簽入程式碼,併發布集合日誌總結成果
GitHub連結 GitHub

一、團隊簡介

  • 隊名:小飛棍隊

  • 團隊成員

姓名 學號
羅振烘(組長) 3122004748
莊崇立 3122004633
李響 3121002802
何昌洲 3122004737

二、會議總結

會議資訊

  • 日期:2024年11月14日
  • 時長:15分鐘
  • 會議形式:線上會議
  • 主持人:羅振烘(組長)

會議照片

昨天完成的工作

任務 內容
商品分類功能開發 完成商品分類模組的增刪查改介面,實現了商品分類的基本管理功能。
介面設計與最佳化 設計RESTful介面,並透過Swagger註解生成API文件,方便團隊測試和呼叫。
分類功能介面除錯 進行前後端介面除錯,確保商品分類資訊可以正常獲取、新增、修改和刪除。
code review 對程式碼規範進行了細緻檢查,統一了欄位命名,完善了註釋,提升程式碼一致性和可維護性。
需求文件更新 補充了分類模組的需求細節,基於實際開發中遇到的問題完善了相關文件。

今天完成的工作

任務 內容
熱門推薦完善 完善了熱門推薦功能,新增、修改、刪除都除錯順暢。
商品推薦最佳化 調整了推薦邏輯,讓推薦更精準。
資料庫加速 加了索引,查詢速度快多了。
前端UI改進 最佳化了頁面佈局,使用者體驗更好。
整合測試完成 測試了主要功能,修復了一些小問題。

工作中遇到的困難

團隊在協作中遇到一些挑戰,比如前後端介面對接時的資料格式不一致導致除錯時間增加,資料庫在資料量增多後出現了效能瓶頸,需要進行復雜的索引最佳化。需求變動也讓部分功能返工,前端在UI佈局和設計細節上需要多次溝通以確保一致。此外,多人程式碼合併時也出現衝突,需要謹慎處理才能保證程式碼的順利整合。

會議內容

  • 目標:確保團隊成員同步專案進展,解決昨天遇到的問題。

任務分配

四、燃盡圖

五、程式碼簽入記錄

簽入記錄對應的Issue內容與連結

code review編碼規範文件

六、專案程式/模組的最新(執行)截圖

核心程式碼

package com.example.hot.controller;

// 引入相關類和包
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.conditions.query.LambdaJoinQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.example.goods.pojo.Goods;
import com.example.goods.service.GoodsService;
import com.example.hot.pojo.*;
import com.example.hot.service.*;
import com.example.smartcommon.util.R;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.*;
import java.util.function.Function;
import java.util.stream.Collectors;

// 標記為控制器並設定基本請求路徑
@RestController
@RequestMapping(value = "/hot/")
@Tag(name = "顯示熱門推薦")
public class HotController {

    // 自動注入服務層物件
    @Autowired
    private HotService hotService;
    @Autowired
    private HotGoodsService hotGoodsService;
    @Autowired
    private GoodsService goodsService;
    @Autowired
    private TypeService typeService;
    @Autowired
    private RecommendService recommendService;

    // 獲取所有熱門推薦
    @Operation(summary = "獲得所有的熱門推薦")
    @GetMapping(value = "/getAllHot")
    public R getAllHot() {
        // 建立連線查詢包裝器,進行表連線查詢
        LambdaJoinQueryWrapper<HotGoods> wrapper = new LambdaJoinQueryWrapper<>(HotGoods.class);
        wrapper.innerJoin(Hot.class, Hot::getHotPicturesId, HotGoods::getHotId)
                .innerJoin(Goods.class, Goods::getGoodsId, HotGoods::getGoodsId);
        QueryWrapper<HotGoods> queryWrapper = new QueryWrapper<>();
        queryWrapper.orderByAsc("rand()"); // 按隨機順序排列

        // 查詢所有熱門商品並進行打亂處理
        List<HotGoods> hotGoodsList = hotGoodsService.list(wrapper);
        Collections.shuffle(hotGoodsList, new Random());

        // 建立用於儲存熱門推薦的列表和已新增的熱門推薦 ID 集合
        List<HotVo> hotVoList = new ArrayList<>();
        Set<Integer> addedHotIds = new HashSet<>();

        // 根據熱門 ID 排序並遍歷每個商品
        hotGoodsList.sort(Comparator.comparingInt(hotGoods -> hotGoods.getHot().getHotId()));
        hotGoodsList.forEach(item -> {
            int hotId = item.getHot().getHotId();
            if (!addedHotIds.contains(hotId)) {
                // 獲取圖片並構建熱點推薦檢視物件
                String[] hotImages = hotGoodsList.stream()
                        .filter(hotGoods -> hotGoods.getHot().getHotId() == hotId)
                        .map(hotGoods -> hotGoods.getGoods().getGoodsPicture())
                        .limit(2)
                        .toArray(String[]::new);

                HotVo hotVo = new HotVo();
                BeanUtils.copyProperties(item, hotVo);
                hotVo.setHotId(hotId);
                hotVo.setHotPictures(hotImages);
                hotVo.setHotTitle(item.getHot().getHotTitle());
                hotVo.setHotAlt(item.getHot().getHotAlt());
                hotVo.setHotTarget(item.getHot().getHotTarget());
                hotVo.setHotType(item.getHot().getHotType());
                hotVoList.add(hotVo);
                addedHotIds.add(hotId);
            }
        });
        return R.ok("查詢所有熱門推薦成功").data("hot", hotVoList);
    }

    // 獲取熱門商品推薦
    @Operation(summary = "獲得熱門商品推薦")
    @GetMapping(value = "/getHotGoods")
    public R getHotGoods() {
        LambdaJoinQueryWrapper<HotGoods> wrapper = new LambdaJoinQueryWrapper<>(HotGoods.class);
        wrapper.innerJoin(Hot.class, Hot::getHotPicturesId, HotGoods::getHotId)
                .innerJoin(Goods.class, Goods::getGoodsId, HotGoods::getGoodsId);
        List<HotGoods> hotGoodsList = hotGoodsService.list(wrapper);
        return R.ok("查詢熱門商品推薦成功").data("hot", hotGoodsList);
    }

    // 獲取特惠推薦
    @Operation(summary = "獲得特惠推薦")
    @GetMapping(value = "/getPreference")
    public R getPreference(@RequestParam(name = "page", defaultValue = "1") Long page,
                           @RequestParam(name = "pageSize", defaultValue = "10") Long pageSize) {
        return getRecommendData(page, pageSize, 0, "獲得特惠推薦成功");
    }

    // 獲取爆款推薦
    @Operation(summary = "獲得爆款推薦")
    @GetMapping(value = "/getInVogue")
    public R getInVogue(@RequestParam(name = "page", defaultValue = "1") Long page,
                        @RequestParam(name = "pageSize", defaultValue = "10") Long pageSize) {
        return getRecommendData(page, pageSize, 1, "獲得爆款推薦成功");
    }

    // 獲取一站買全推薦
    @Operation(summary = "獲得一站買全")
    @GetMapping(value = "/getOneStop")
    public R getOneStop(@RequestParam(name = "page", defaultValue = "1") Long page,
                        @RequestParam(name = "pageSize", defaultValue = "10") Long pageSize) {
        return getRecommendData(page, pageSize, 2, "獲得一站買全成功");
    }

    // 獲取新鮮好物推薦
    @Operation(summary = "獲得新鮮好物")
    @GetMapping(value = "/getNewShop")
    public R getNewShop(@RequestParam(name = "page", defaultValue = "1") Long page,
                        @RequestParam(name = "pageSize", defaultValue = "10") Long pageSize) {
        return getRecommendData(page, pageSize, 3, "獲得新鮮好物成功");
    }

    // 通用推薦資料查詢方法
    private R getRecommendData(Long page, Long pageSize, int index, String message) {
        LambdaJoinQueryWrapper<Recommend> wrapper = new LambdaJoinQueryWrapper<>(Recommend.class);
        wrapper.innerJoin(Type.class, Type::getTypeId, Recommend::getTypeId);

        // 獲取推薦列表和型別對映
        List<Recommend> recommendList = recommendService.list(wrapper);
        Map<Integer, Type> typeMap = typeService.list().stream()
                .collect(Collectors.toMap(Type::getTypeId, Function.identity()));
        Recommend recommend = recommendList.isEmpty() ? null : recommendList.get(index);
        List<RecommendVo> recommendVoList = new ArrayList<>();

        // 若推薦項存在,進行型別和商品資料的獲取與封裝
        if (recommend != null) {
            String[] typeSplit = recommend.getTypeId().split(",");
            List<Type> types = Arrays.stream(typeSplit)
                    .map(Integer::valueOf)
                    .map(typeMap::get)
                    .toList();

            RecommendVo recommendVo = new RecommendVo();
            BeanUtils.copyProperties(recommend, recommendVo);

            List<TypeVo> typeVoList = new ArrayList<>();
            for (Type type : types) {
                TypeVo typeVo = new TypeVo();
                BeanUtils.copyProperties(type, typeVo);

                // 設定商品分頁查詢及結果儲存
                Page<Goods> goodsPage = new Page<>(page, pageSize);
                QueryWrapper<Goods> queryWrapper = new QueryWrapper<>();
                queryWrapper.orderByDesc("rand()");
                goodsService.page(goodsPage, queryWrapper);

                List<Goods> goodsList = goodsPage.getRecords();
                Map<String, Object> map = new HashMap<>();
                map.put("counts", goodsPage.getTotal());
                map.put("pageSize", goodsPage.getSize());
                map.put("pages", goodsPage.getPages());
                map.put("page", goodsPage.getCurrent());
                map.put("goodsList", goodsList);

                typeVo.setGoodsItems(map);
                typeVoList.add(typeVo);
            }
            recommendVo.setTypeList(typeVoList);
            recommendVoList.add(recommendVo);
        }

        // 返回封裝後的推薦資料
        Map<String, Object> maps = new HashMap<>();
        maps.put("recommendList", recommendVoList);
        return R.ok(message).data(maps);
    }

    // 增加熱門推薦
    @Operation(summary = "增加熱門推薦")
    @PostMapping(value = "/addHot")
    public R addHot(@RequestBody Hot hot) {
        boolean flag = hotService.save(hot);
        return flag ? R.ok("增加熱門推薦成功") : R.error("增加熱門推薦失敗");
    }

    // 刪除指定 ID 的熱門推薦
    @Operation(summary = "刪除熱門推薦資料")
    @DeleteMapping(value = "/deleteHot/{id}")
    public R deleteHot(@PathVariable("id") Integer bannerId) {
        boolean flag = hotService.removeById(bannerId);
        return flag ? R.ok("刪除熱門推薦成功") : R.error("刪除熱門推薦失敗");
    }

    // 按熱門推薦編號查詢資料
    @Operation(summary = "按照熱門推薦編號查詢資料")
    @GetMapping(value = "/getHotById/{id}")
    public R getByIdHot(@PathVariable("id") Integer bannerId) {
        Hot hot = hotService.getById(bannerId);
        return R.ok("按照熱門推薦編號查詢資料成功").data("banner", hot);
    }

    // 修改熱門推薦資料
    @Operation(summary = "修改熱門推薦資料")
    @PutMapping(value = "/updateHot")
    public R updateHot(@RequestBody Hot hot) {
        boolean flag = hotService.updateById(hot);
        if (flag) {
            return R.ok("修改熱門推薦成功");
        } else {
            return R.error("修改熱門推薦失敗");
        }
    }
}

最新模組截圖

七、每日每人總結

姓名 總結
羅振烘 除錯介面時終於通了,有大家協作支援,解決問題更高效了。
莊崇立 頁面細節改進了不少,和後端的對接順利,協作真的讓進展飛快。
李響 資料庫最佳化後效果顯著,和前端配合更默契,整體效能提升看得見。
何昌洲 佈局更靈活,UI提升不少,大家配合默契,開發效率明顯提高了。

相關文章