《爱液》伦理:探索情感联结的边界与可能性
电商轮播图RestController RequestMapping(/index) public class CarouselController { Autowired private CarouselService carouselService; /** * 获取轮播图列表 * * return */ GetMapping(/carousel) public JsonResult carousel() { return JsonResult.ok(carouselService.queryAll(YesOrNo.YES.type)); } }Service public class CarouselServiceImpl implements CarouselService { Autowired private CarouselMapper carouselMapper; Override public ListCarouselDO queryAll(Integer isShow) { return carouselMapper.selectList(new QueryWrapperCarouselDO().eq(is_show, isShow).orderByDesc(sort)); } }首页分类第一次刷新主页查询大分类渲染展示到首页如果鼠标移动到大分类则加载小分类的内容一级分类/** * 获取商品分类一级分类 * * return */ GetMapping(/cats) public JsonResult cats() { return JsonResult.ok(categoryService.queryAllRootLevelCat()); }Service public class CategoryServiceImpl implements CategoryService { Autowired private CategoryMapper categoryMapper; /** * 查询所有一级分类 * return */ Override public ListCategoryDO queryAllRootLevelCat() { return categoryMapper.selectList(new QueryWrapperCategoryDO().eq(type, CategoryType.FIRST.type)); } }查询子分类/** * 二级分类VO */ Data NoArgsConstructor AllArgsConstructor Builder public class CategoryVO { private Integer id; private String name; private Integer type; private Integer fatherId; private ListSubCategoryVO subCatList; }/** * 三级分类VO */ Data NoArgsConstructor AllArgsConstructor Builder public class SubCategoryVO { private Integer subId; private String subName; private Integer subType; private Integer subFatherId; }/** * 获取商品子分类 * * param rootCatId * return */ GetMapping(/subCat/{rootCatId}) public JsonResult subCat(PathVariable Integer rootCatId) { if (rootCatId null){ return JsonResult.errorMsg(分类不存在); } return JsonResult.ok(categoryService.querySubLevelCat(rootCatId)); }/** * 查询所有二级分类 * param fatherId * return */ Override public ListCategoryVO querySubLevelCat(Integer fatherId) { // 从数据库查询符合条件的二级分类DO列表 ListCategoryDO categoryDOS categoryMapper.selectList(new QueryWrapperCategoryDO() .eq(type, CategoryType.SECOND.type) .eq(father_id, fatherId)); ListCategoryVO categoryVOS categoryDOS.stream() .map(categoryDO - { CategoryVO categoryVO CategoryVO.builder() .id(categoryDO.getId()) .name(categoryDO.getName()) .type(categoryDO.getType()) .fatherId(categoryDO.getFatherId()) .subCatList(queryThirdLevelCat(categoryDO.getId())) .build(); return categoryVO; }) .collect(Collectors.toCollection(ArrayList::new)); return categoryVOS; } /** * 查询所有三级分类 * param fatherId * return */ Override public ListSubCategoryVO queryThirdLevelCat(Integer fatherId) { ListCategoryDO categoryDOS categoryMapper.selectList(new QueryWrapperCategoryDO() .eq(type, CategoryType.THIRD.type) .eq(father_id, fatherId)); ListSubCategoryVO subCategoryVOS categoryDOS.stream() .map(categoryDO - { SubCategoryVO subCategoryVO SubCategoryVO.builder() .subId(categoryDO.getId()) .subName(categoryDO.getName()) .subType(categoryDO.getType()) .subFatherId(categoryDO.getFatherId()) .build(); return subCategoryVO; }) .collect(Collectors.toCollection(ArrayList::new)); return subCategoryVOS; }首页推荐分类表商品表商品图片表/** * 查询每个一级分类下的最新6条商品 * param rootCatId * return */ Override public ListNewItemsVO querySixNewItems(Integer rootCatId) { ListItemsDO itemsDOS itemsMapper.selectList(new QueryWrapperItemsDO().eq(root_cat_id, rootCatId).eq(on_off_status,
); CategoryDO categoryDO categoryMapper.selectOne(new QueryWrapperCategoryDO().eq(id, rootCatId)); NewItemsVO newItemsVO NewItemsVO.builder() .rootCatId(rootCatId) .rootCatName(categoryDO.getName()) .slogan(categoryDO.getSlogan()) .catImage(categoryDO.getCatImage()) .bgColor(categoryDO.getBgColor()) .simpleItemList(itemsDOS.stream().map(itemsDO - querySimpleItemList(itemsDO.getId(), itemsDO.getItemName())).collect(Collectors.toCollection(ArrayList::new))) .build(); return Collections.singletonList(newItemsVO); } /** * 查询商品列表 * param id * return */ Override public SimpleItemVO querySimpleItemList(String id,String itemName) { ItemsImgDO itemsImgDO itemsImgMapper.selectOne(new QueryWrapperItemsImgDO().eq(item_id, id).eq(is_main,
); SimpleItemVO simpleItemVO SimpleItemVO.builder() .itemId(id) .itemName(itemName) .itemUrl(itemsImgDO.getUrl()) .build(); return simpleItemVO; }/** * 查询每个一级分类下最新的6条商品 * param rootCatId * return */ GetMapping(/sixNewItems/{rootCatId}) public JsonResult sixNewItems(PathVariable Integer rootCatId) { if (rootCatId null){ return JsonResult.errorMsg(分类不存在); } return JsonResult.ok(categoryService.querySixNewItems(rootCatId)); }商品详情功能商品规格表商品参数表Service public class ItemsServiceImpl implements ItemsService { Autowired private ItemsMapper itemsMapper; Autowired private ItemsImgService itemsImgService; Autowired private ItemsSpecMapper itemsSpecMapper; Autowired private ItemsParamService itemsParamService; Autowired private ItemsImgMapper itemsImgMapper; /** * 根据商品id查询商品 * * param itemId * return */ Override public ItemsDO queryItemById(String itemId) { return itemsMapper.selectById(itemId); } Override public ListItemsImgDO queryItemImgList(String itemId) { return itemsImgMapper.selectList(new QueryWrapperItemsImgDO().eq(item_id,itemId)); } Override public ListItemsSpecDO queryItemSpecList(String itemId) { return itemsSpecMapper.selectList(new QueryWrapperItemsSpecDO().eq(item_id,itemId)); } Override public ItemsParamDO queryItemParam(String itemId) { return itemsParamService.getOne(new QueryWrapperItemsParamDO().eq(item_id,itemId)); } }商品评价商品评价表GetMapping(/commentLevel) public JsonResult commentLevel(RequestParam String itemId) { if (StringUtils.isBlank(itemId)) { return JsonResult.errorMsg(商品不存在); } CommentLevelCountsVO countsVO itemsService.queryCommentCounts(itemId); return JsonResult.ok(countsVO); }/** * 查询商品评价等级数量 * * param itemId * return */ Override public CommentLevelCountsVO queryCommentCounts(String itemId) { Integer goodCounts getCountByLevel(itemId, CommentLevel.SELLER_LEVEL_ONE.type); Integer normalCounts getCountByLevel(itemId, CommentLevel.SELLER_LEVEL_TWO.type); Integer badCounts getCountByLevel(itemId, CommentLevel.SELLER_LEVEL_THREE.type); CommentLevelCountsVO commentLevelCountsVO new CommentLevelCountsVO(); commentLevelCountsVO.setTotalCounts(goodCounts normalCounts badCounts); commentLevelCountsVO.setGoodCounts(goodCounts); commentLevelCountsVO.setNormalCounts(normalCounts); commentLevelCountsVO.setBadCounts(badCounts); return commentLevelCountsVO; } Integer getCountByLevel(String itemId,Integer level){ ItemsComments itemsComments new ItemsComments(); itemsComments.setItemId(itemId); if (level ! null){ itemsComments.setCommentLevel(level); } return itemsCommentsMapper.selectCount(new QueryWrapperItemsComments().eq(item_id,itemId).eq(comment_level,level)); }分页查询评价分页插件Configuration public class MybatisPlusPageConfig { /** * 新的分页插件,一缓和二缓遵循mybatis的规则, * 需要设置 MybatisConfiguration#useDeprecatedExecutor false 避免缓存出现问题 */ Bean public MybatisPlusInterceptor mybatisPlusInterceptor(){ MybatisPlusInterceptor interceptornew MybatisPlusInterceptor(); interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL)); return interceptor; } }代码编写/** * 分页查询商品评价 * * param itemId * param level * param page * param pageSize * return */ Override public MapString, Object queryPageComments(String itemId, Integer level, Integer page, Integer pageSize) { //
基础参数校验避免非法参数导致查询异常 if (page null || page
{ page 1; } if (pageSize null || pageSize 1 || pageSize
{ pageSize 10; // 限制最大每页100条防止查询压力过大 } if (level null) { level 1; // 兼容前端可能传递的空值默认查好评 } //
构建 MyBatis-Plus 分页对象执行查询 PageItemsComments pageInfo new Page(page, pageSize); QueryWrapperItemsComments queryWrapper new QueryWrapperItemsComments() .eq(item_id, itemId) // 按商品ID筛选 .eq(comment_level, level); // 按评论等级筛选 // 执行分页查询 PageItemsComments selectPage itemsCommentsMapper.selectPage(pageInfo, queryWrapper); //
修复 ItemCommentVO 构建问题关键builder() 必须赋值给 VO 对象否则返回空数据 ListItemCommentVO itemCommentVOS new ArrayList(); for (ItemsComments itemsComments : selectPage.getRecords()) { // 正确构建 ItemCommentVO直接用 builder() 构建并赋值无需先 new 空对象 ItemCommentVO itemCommentVO ItemCommentVO.builder() .commentLevel(itemsComments.getCommentLevel()) .content(itemsComments.getContent()) .specName(itemsComments.getSepcName()) // 注意若数据库字段是 specName此处修正笔误为 getSpecName() .createdTime(itemsComments.getCreatedTime()) .userFace(usersMapper.selectById(itemsComments.getUserId()).getFace()) .nickname(usersMapper.selectById(itemsComments.getUserId()).getNickname()) .build(); // 完成构建字段才会有值 itemCommentVOS.add(itemCommentVO); } //
构建前端需要的返回对象字段名完全匹配前端取值逻辑 MapString, Object resultMap new HashMap(); resultMap.put(rows, itemCommentVOS); // 对应前端 grid.rows评论列表 resultMap.put(total, selectPage.getPages()); // 对应前端 grid.total总页数赋值给 maxPage resultMap.put(records, selectPage.getTotal()); // 对应前端 grid.records总记录数赋值给 total //
返回该 map供 Controller 层包装后返回给前端 return resultMap; }/** * 商品评论 * * param itemId * param level * param page * param pageSize * return */ GetMapping(/comments) public JsonResult comments(RequestParam String itemId, RequestParam(defaultValue
Integer level, RequestParam(defaultValue
Integer page, RequestParam(defaultValue
Integer pageSize) { //
校验商品ID和前端逻辑一致提示商品不存在 if (StringUtils.isBlank(itemId)) { return JsonResult.errorMsg(商品不存在); } //
调用 Service 层获取适配前端的分页数据包含 rows、total、records MapString, Object commentPageData itemsService.queryPageComments(itemId, level, page, pageSize); //
直接返回该数据前端 res.data.data 即可拿到 grid 对象 return JsonResult.ok(commentPageData); }脱敏工具类public class DesensitizationUtil { private static final int SIZE 6; private static final String SYMBOL *; /** * 通用脱敏方法 * param value * return */ public static String commonDisplay(String value) { if (null value || .equals(value)) { return value; } int len value.length(); int pamaone len / 2; int pamatwo pamaone - 1; int pamathree len % 2; StringBuilder stringBuilder new StringBuilder(); if (len
{ if (pamathree
{ return SYMBOL; } stringBuilder.append(SYMBOL); stringBuilder.append(value.charAt(len -
); } else { if (pamatwo
{ stringBuilder.append(value.substring(0,
); stringBuilder.append(SYMBOL); stringBuilder.append(value.substring(len - 1, len)); } else if (pamatwo SIZE / 2 SIZE 1 ! len) { int pamafive (len - SIZE) / 2; stringBuilder.append(value.substring(0, pamafive)); for (int i 0; i SIZE; i) { stringBuilder.append(SYMBOL); } if ((pamathree 0 SIZE / 2
|| (pamathree ! 0 SIZE % 2 !
) { stringBuilder.append(value.substring(len - pamafive, len)); } else { stringBuilder.append(value.substring(len - (pamafive
, len)); } } else { int pamafour len - 2; stringBuilder.append(value.substring(0,
); for (int i 0; i pamafour; i) { stringBuilder.append(SYMBOL); } stringBuilder.append(value.substring(len - 1, len)); } } return stringBuilder.toString(); } }商品搜索/** * 商品搜索 * * param keywords * param sort * param page * param pageSize * return */ GetMapping(/search) public JsonResult search(RequestParam String keywords, RequestParam(defaultValue ) String sort, RequestParam(defaultValue
Integer page, RequestParam(defaultValue
Integer pageSize) { //
校验 if (StringUtils.isBlank(keywords)) { return JsonResult.errorMsg(null); } //
调用 Service 层获取适配前端的分页数据包含 rows、total、records MapString, Object result itemsService.searchItems(keywords, sort, page, pageSize); return JsonResult.ok(result); }/** * 商品搜索 * * param keywords * param sort * param page * param pageSize * return */ Override public MapString, Object searchItems(String keywords, String sort, Integer page, Integer pageSize) { //
分页参数校验与默认值处理避免非法参数导致异常和之前评论分页逻辑一致 if (page null || page
{ page 1; } if (pageSize null || pageSize 1 || pageSize
{ pageSize 10; // 限制最大每页100条防止查询压力过大 } // 排序参数默认值匹配 XML 中的 otherwise默认按商品名称升序 if (StringUtils.isBlank(sort)) { sort k; } //
构建 MyBatis 分页对象注意这里因为你用了自定义 XML SQL需手动处理分页 // 方式先构建分页参数再封装查询条件 Map和 XML 中的 parameterTypeMap 对应 PageSearchItemsVO pageInfo new Page(page, pageSize); //
封装 XML SQL 需要的查询参数key 必须和 XML 中的 paramsMap 对应 MapString, Object paramsMap new HashMap(); paramsMap.put(keywords, keywords); // 搜索关键词 paramsMap.put(sort, sort); // 排序条件c: 销量降序p: 价格升序k: 默认名称升序 //
执行分页查询分两步① 查询符合条件的总记录数 ② 查询当前页的商品列表 // 注意你现有 XML 中没有总记录数查询需先补充一个 count 方法下面会给出补充说明这里先按完整逻辑实现 // ① 查询总记录数用于计算总页数 Long totalRecords itemsMapperCustom.countSearchItems(paramsMap); // ② 查询当前页的商品列表传递分页参数适配自定义 XML 分页 // 给 paramsMap 补充分页参数limit 起始位置、每页条数 paramsMap.put(start, (page -
* pageSize); paramsMap.put(pageSize, pageSize); ListSearchItemsVO searchItemsVOList itemsMapperCustom.searchItems(paramsMap); //
封装分页对象计算总页数 pageInfo.setRecords(searchItemsVOList); pageInfo.setTotal(totalRecords); long totalPages (totalRecords pageSize -
/ pageSize; // 向上取整计算总页数 pageInfo.setPages(totalPages); //
构建前端需要的返回 Map和评论分页格式一致字段名严格匹配 MapString, Object resultMap new HashMap(); resultMap.put(rows, searchItemsVOList); // 商品列表对应前端 grid.rows resultMap.put(total, pageInfo.getPages()); // 总页数对应前端 grid.total → maxPage resultMap.put(records, pageInfo.getTotal()); // 总记录数对应前端 grid.records → total //
返回结果 Map return resultMap; }package com.guslegend.mapper; import com.guslegend.vo.SearchItemsVO; import java.util.List; import java.util.Map; public interface ItemsMapperCustom { /** * 商品搜索 - 查询符合条件的总记录数 */ Long countSearchItems(MapString, Object paramsMap); /** * 商品搜索 - 分页查询商品列表补充分页参数 */ ListSearchItemsVO searchItems(MapString, Object paramsMap); }?xml version
0 encodingUTF-8 ? !DOCTYPE mapper PUBLIC -//mybatis.org//DTD Mapper
0//EN http://mybatis.org/dtd/mybatis-3-mapper.dtd mapper namespacecom.guslegend.mapper.ItemsMapperCustom !-- 商品搜索 - 查询总记录数 -- select idcountSearchItems parameterTypeMap resultTypejava.lang.Long SELECT COUNT(DISTINCT i.id) FROM items i LEFT JOIN items_img ii ON i.id ii.item_id LEFT JOIN (SELECT item_id,MIN(price_discount) as price_discount from items_spec GROUP BY item_id) tempSpec ON i.id tempSpec.item_id WHERE ii.is_main 1 !-- 去掉 paramsMap.直接用 keywords -- if testkeywords ! null and keywords ! AND i.item_name like concat(%, #{keywords}, %) /if /select !-- 商品搜索 - 分页查询商品列表 -- select idsearchItems parameterTypeMap resultTypecom.guslegend.vo.SearchItemsVO SELECT i.id as itemId, i.item_name as itemName, i.sell_counts as sellCounts, ii.url as imgUrl, tempSpec.price_discount as price FROM items i LEFT JOIN items_img ii on i.id ii.item_id LEFT JOIN (SELECT item_id,MIN(price_discount) as price_discount from items_spec GROUP BY item_id) tempSpec on i.id tempSpec.item_id WHERE ii.is_main 1 !-- 去掉 paramsMap.直接用 keywords -- if testkeywords ! null and keywords ! AND i.item_name like concat(%, #{keywords}, %) /if ORDER BY choose !-- 去掉 paramsMap.直接用 sort -- when testsort quot;cquot; i.sell_counts desc /when !-- 去掉 paramsMap.直接用 sort -- when testsort quot;pquot; tempSpec.price_discount asc /when otherwise i.item_name asc /otherwise /choose !-- 去掉 paramsMap.直接用 start 和 pageSize -- LIMIT #{start}, #{pageSize} /select /mapper购物车存储功能商品添加到购物车RestController RequestMapping(/orderStatusDO) public class ShopCartController { PostMapping(/add) public JsonResult add(RequestParam String userId, RequestBody ShopCartBO shopCartBO, HttpServletRequest request, HttpServletResponse response){ if (StringUtils.isBlank(userId)){ return JsonResult.errorMsg(用户不存在); } //TODO 后端同步到redis return JsonResult.ok(); } }渲染购物车GetMapping(/refresh) public JsonResult refresh(RequestParam String itemSpecIds) { if (StringUtils.isBlank(itemSpecIds)) { return JsonResult.ok(Collections.emptyList()); } ListShopCartVO list itemsService.queryItemsBySpecIds(itemSpecIds); return JsonResult.ok(list); }Override public ListShopCartVO queryItemsBySpecIds(String itemSpecIdsStr) { //
校验字符串参数 if (StringUtils.isBlank(itemSpecIdsStr)) { return Collections.emptyList(); } //
拆分字符串为 ListString按逗号分割过滤空值 String[] specIdArray itemSpecIdsStr.split(,); // 优化避免数组转 List 后无法修改同时过滤空字符串 ListString specIdList new ArrayList(); for (String specId : specIdArray) { if (StringUtils.isNotBlank(specId)) { specIdList.add(specId.trim()); } } return itemsMapperCustom.queryItemsBySpecIds(specIdList); }ListShopCartVO queryItemsBySpecIds(Param(specIdList) ListString specIdList);select idqueryItemsBySpecIds parameterTypejava.util.List resultTypecom.guslegend.vo.ShopCartVO SELECT t_items.id as itemId, t_items.item_name as itemName, t_items_img.url as itemImgUrl, t_items_spec.id as specId, t_items_spec.name as specName, t_items_spec.price_discount as priceDiscount, t_items_spec.price_normal as priceNormal FROM items_spec t_items_spec LEFT JOIN items t_items ON t_items.id t_items_spec.item_id LEFT JOIN items_img t_items_img ON t_items_img.item_id t_items.id WHERE t_items_img.is_main 1 AND t_items_spec.id IN foreach collectionspecIdList indexindex itemspecId open( separator, close) #{specId} /foreach /select
免费行情网站app-免费行情网站应用