【畅购商城】详情页模块之评论

目录

接口

分析

后端实现:JavaBean

后端实现

前端实现

接口

GET http://localhost:10010/web-service/comments/spu/2?current=1&size=2

{

  "code": 20000,

  "message": "查询成功",

  "data": {

    "impressions": [

      {

        "id": 1,

        "title": "口感不错",

        "count": 15326,

        "spu_id": 2,

        "sku_id": 2600242

      }

    ],

    "ratio": {

      "common": "33.33",

      "bad": "33.33",

      "goods": "33.33"

    },

    "comment_count": 3,

    "comments": [

      {

        "id": 3,

        "userId": 1,

        "user": {

          "face": "images/user3.jpg",

        },

        "spuId": 2,

        "skuId": 2600248,

        "ratio": "2",

        "content": "差",

      }

    ]

  },

  "other": {}

}

分析

后端实现:JavaBean

步骤一:创建 Impression ,用于封装印象表中的数据

package com.czxy.changgou4.pojo;import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;/** 印象* @author 桐叔* @email liangtong@itcast.cn*/
@TableName("tb_impression")
@Data
public class Impression {@TableId(type = IdType.AUTO)private Integer id;private String title;private Integer count;@TableField("spu_id")@JsonProperty("spu_id")private Integer spuId;@TableField("sku_id")@JsonProperty("sku_id")private Integer skuId;}

步骤二:创建 CommentResult,用于封装评论相关的信息

package com.czxy.changgou4.pojo;import lombok.Data;import java.util.List;
import java.util.Map;/*** @author 桐叔* @email liangtong@itcast.cn*/
@Data
public class CommentResult {private List<Impression> impressions;       //印象private Map<String,Object> ratio;           //好评度private Integer comment_count;              //评论数private List<SkuComment> comments;          //评论}

后端实现

步骤一:创建 ImpressionMapper,完成 “查询指定SpuId的所有印象”

package com.czxy.changgou4.mapper;import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.czxy.changgou4.pojo.Impression;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;import java.util.List;/*** @author 桐叔* @email liangtong@itcast.cn*/
@Mapper
public interface ImpressionMapper extends BaseMapper<Impression> {/*** 查询指定SpuId的所有印象* @param spuid* @return*/@Select("select * from tb_impression where spu_id = #{spuid}")public List<Impression> findImpressionsBySpuid(@Param("spuid") Integer spuid);}

步骤二:修改 SkuCommentMapper,完成“查询指定好评度的评论数”

/*** 查询指定好评度的评论数* @param spuid* @param ratio  0好评、1中评、2差评* @return*/
@Select("select count(*) from tb_sku_comment where spu_id = #{spuid} and ratio = #{ratio}")
public Integer findCommentCountByRatio(@Param("spuid")Integer spuid,@Param("ratio")Integer ratio);

步骤三:修改 SkuCommentMapper,完成“查询SpuId的评论数”

/*** 查询SpuId的评论数* @param spuid* @return*/
@Select("select count(*) from tb_sku_comment where spu_id = #{spuid}")
public Integer findTotalCommentBySpuid(@Param("spuid") Integer spuid);

 步骤四:修改 skuCommentMapper,完成“查询指定spu的所有评论”

/*** 查询指定spu的所有评论* @param spuid* @return*/
@Select("select * from tb_sku_comment where spu_id = #{spuid} limit #{startIndex},#{size}")
@Results({@Result(property = "createdAt" , column = "created_at"),@Result(property = "updatedAt" , column = "updated_at"),@Result(property = "userId" , column = "user_id"),@Result(property = "skuId" , column = "sku_id"),@Result(property = "specList" , column = "spec_list"),@Result(property = "user" , one = @One(select = "com.czxy.changgou4.mapper.UserMapper.selectById"), column = "user_id"),
})
public List<SkuComment> findCommentsBySpuid(@Param("spuid") Integer spuid, @Param("startIndex") Integer startIndex, @Param("size") Integer size);

步骤五:创建 SkuCommentService接口,定义“查询指定spu的所有评论”方法

package com.czxy.changgou4.service;import com.baomidou.mybatisplus.extension.service.IService;
import com.czxy.changgou4.pojo.SkuComment;
import com.czxy.changgou4.vo.CommentResult;
import com.czxy.changgou4.vo.PageRequest;/*** @author 桐叔* @email liangtong@itcast.cn*/
public interface SkuCommentService extends IService<SkuComment> {/**** @param spuid* @param pageRequest* @return*/public CommentResult findComments(Integer spuid, PageRequest pageRequest);
}

步骤六:创建 SkuCommentServiceImpl实现类

package com.czxy.changgou4.service.impl;import com.baomidou.mybatisplus.extension.service.IService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.czxy.changgou4.mapper.ImpressionMapper;
import com.czxy.changgou4.mapper.SkuCommentMapper;
import com.czxy.changgou4.mapper.SkuMapper;
import com.czxy.changgou4.pojo.Impression;
import com.czxy.changgou4.pojo.SkuComment;
import com.czxy.changgou4.service.SkuCommentService;
import com.czxy.changgou4.vo.CommentResult;
import com.czxy.changgou4.vo.PageRequest;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;import javax.annotation.Resource;
import java.util.HashMap;
import java.util.List;
import java.util.Map;/*** @author 桐叔* @email liangtong@itcast.cn*/
@Service
@Transactional
public class SkuCommentServiceImpl extends ServiceImpl<SkuCommentMapper, SkuComment> implements SkuCommentService {@Resourceprivate ImpressionMapper impressionMapper;public CommentResult findComments(Integer spuid, PageRequest pageRequest){CommentResult commentResult = new CommentResult();//查询所有印象List<Impression> impressionList = impressionMapper.findImpressionsBySpuid(spuid);commentResult.setImpressions(impressionList);//好评度Integer goodCount = baseMapper.findCommentCountByRatio(spuid,0);// 好评Integer commonCount = baseMapper.findCommentCountByRatio(spuid,1);// 中评Integer badCount = baseMapper.findCommentCountByRatio(spuid,2);// 差评Integer totalCount = baseMapper.findTotalCommentBySpuid(spuid);//Map<String,Object> ratio = new HashMap<>();ratio.put("goods", String.format("%.2f" , goodCount * 100.0 / totalCount ));ratio.put("common",String.format("%.2f" , commonCount * 100.0 / totalCount ));ratio.put("bad",String.format("%.2f" , badCount * 100.0 / totalCount ));commentResult.setRatio( ratio );//总评论数Integer comment_count = baseMapper.findNumBySpuId(spuid);commentResult.setComment_count(comment_count);//查询所有int startIndex = (pageRequest.getCurrent() - 1) * pageRequest.getSize();List<SkuComment> comments = baseMapper.findCommentsBySpuid(spuid, startIndex ,pageRequest.getSize());commentResult.setComments(comments);return commentResult;}}

步骤七:创建 SkuCommentController,完成“查询指定spu的所有评论”

package com.czxy.changgou4.controller;import com.czxy.changgou4.service.SkuCommentService;
import com.czxy.changgou4.vo.BaseResult;
import com.czxy.changgou4.vo.CommentResult;
import com.czxy.changgou4.vo.PageRequest;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import javax.annotation.Resource;/*** @author 桐叔* @email liangtong@itcast.cn*/
@RestController
@RequestMapping("/comments")public class SkuCommentController {@Resourceprivate SkuCommentService skuCommentService;@GetMapping("/spu/{spuid}")public BaseResult findCommentsByPage(@PathVariable("spuid") Integer spuid, PageRequest pageRequest){CommentResult comments = skuCommentService.findComments(spuid, pageRequest);return BaseResult.ok("查询成功", comments);}}

前端实现

步骤一:修改 apiclient.js,添加 getComments 函数,完成查询评论操作

 //评论getComments : (spuid , size, current) => {return axios.get(`/web-service/comments/spu/${spuid}`,{params: {size: size,current: current}})},

步骤二:修改 Goods.vue ,编写查询评论函数,用于支持分页

 data() {return {commentVo: {size: 2,current: 1,},commentResult: {ratio: {}}}},
 async pageChanged (num) {this.commentVo.current = num// ajax 查询let { data } = await this.$request.getComments( this.goodsInfo.spuid, this.commentVo.current, this.commentVo.size)// 处理结果this.commentResult = data.data}

步骤三:修改 Goods.vue ,页面加载成功后,查询评论(第一页)

//评论this.pageChanged(1)

步骤四:修改 Goods.vue ,展示“好评度”

  <div class="rate fl"><strong><em>{{ commentResult.ratio.goods}}</em>%</strong> <br /><span>好评度</span></div><div class="percent fl"><dl><dt>好评({{ commentResult.ratio.goods}}%)</dt><dd><div :style="{'width': comments.ratio.goods + 'px'}"></div></dd></dl><dl><dt>中评({{ commentResult.ratio.common}}%)</dt><dd><div :style="{'width':comments.ratio.common + 'px'}"></div></dd></dl><dl><dt>差评({{ commentResult.ratio.bad}}%)</dt><dd><div :style="{'width': commentResult.ratio.bad + 'px'}" ></div></dd></dl></div>

 步骤五:修改 Goods.vue ,展示“买家印象”

<dl><dt>买家印象:</dt><dd v-for="(ci,cii) in commentResult.impressions" :key="cii"><span>{{ci.title}}</span><em>({{ci.count}})</em></dd>
</dl>

步骤六:修改 Goods.vue ,展示“评论”

<!-- 评论开始 --><div v-for="(cc,cci) in commentResult.comments" :key="cci" class="comment_items mt10"><div class="user_pic"><dl><dt><a href=""><img :src="cc.user.face" alt="" /></a></dt><dd><a href="">{{cc.user.name}}</a></dd></dl></div><div class="item"><div class="title"><span>{{cc.created_at}}</span><strong class="star" :class="'star' + cc.star"></strong> <!-- star5表示5星级 start4表示4星级,以此类推 --></div><div class="comment_content">{{cc.content}}</div><div class="btns"><a href="" class="reply">回复(0)</a><a href="" class="useful">有用(0)</a></div></div><div class="cornor"></div></div><!-- 评论结束 -->

步骤七:修改 Goods.vue ,展示“分页条”

import Pagination from '../components/Pagination'

 

<!-- 分页信息 start --><pagination :total="commentResult.comment_count":page_size="commentVo.size"@page_changed="pageChanged" ></pagination><!-- 分页信息 end -->

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/497937.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Kafka高性能设计

高性能设计概述 Kafka高性能是多方面协同的结果&#xff0c;包括集群架构、分布式存储、ISR数据同步及高效利用磁盘和操作系统特性等。主要体现在消息分区、顺序读写、页缓存、零拷贝、消息压缩和分批发送六个方面。 消息分区 存储不受单台服务器限制&#xff0c;能处理更多数据…

HTML——13.超链接

<!DOCTYPE html> <html><head><meta charset"UTF-8"><title>超链接</title></head><body><!--超链接:从一个网页链接到另一个网页--><!--语法&#xff1a;<a href"淘宝网链接的地址"> 淘宝…

LVS 负载均衡原理 | 配置示例

注&#xff1a;本文为 “ LVS 负载均衡原理 | 配置” 相关文章合辑。 部分内容已过时&#xff0c;可以看看原理实现。 使用 LVS 实现负载均衡原理及安装配置详解 posted on 2017-02-12 14:35 肖邦 linux 负载均衡集群是 load balance 集群的简写&#xff0c;翻译成中文就是负…

Docker 快速搭建 GBase 8s数据库服务

1.查看Gbase 8s镜像版本 可以去到docker hub网站搜索&#xff1a;gbase8s liaosnet/gbase8s如果无法访问到该网站&#xff0c;可以通过docker search搜索 docker search gbase8s2.拉取Gbase 8s镜像 以下演示的版本是目前官网最新版本Gbase8sV8.8_3.5.1 docker pull liaosn…

使用Lodash工具库的orderby和sortby进行排序的区别

简介 _.orderBy 和 _.sortBy 是 Lodash 库中用于排序数组的两个函数。 区别 _.orderBy 允许你指定一个或多个属性来排序&#xff0c;并为每个属性指定排序方向&#xff08;升序或降序&#xff09;。默认所有值为升序排&#xff0c;指定为"desc" 降序&#xff0c…

uniapp中Nvue白屏问题 ReferenceError: require is not defined

uniapp控制台输出如下 exception function:createInstanceContext, exception:white screen cause create instanceContext failed,check js stack ->Uncaught ReferenceError: require is not defined 或者 exception function:createInstanceContext, exception:white s…

STM32-笔记16-定时器中断点灯

一、实验目的 使用定时器 2 进行中断点灯&#xff0c;500ms LED 灯翻转一次。 二&#xff0c;定时器溢出时间计算 Tout&#xff1a;定时器溢出时间 Ft&#xff1a;定时器的时钟源频率 ARR&#xff1a;自动重装载寄存器的值&#xff08;可设置ARR从0开始&#xff0c;但是计数到…

Visual Studio 使用 GitHub Copilot 与 IntelliCode 辅助编码 【AI辅助开发系列】

&#x1f380;&#x1f380;&#x1f380;【AI辅助编程系列】&#x1f380;&#x1f380;&#x1f380; Visual Studio 使用 GitHub Copilot 与 IntelliCode 辅助编码Visual Studio 安装和管理 GitHub CopilotVisual Studio 使用 GitHub Copilot 扩展Visual Studio 使用 GitHu…

【数据结构】数据结构整体大纲

数据结构用来干什么的&#xff1f;很简单&#xff0c;存数据用的。 &#xff08;这篇文章仅介绍数据结构的大纲&#xff0c;详细讲解放在后面的每一个章节中&#xff0c;逐个击破&#xff09; 那为什么不直接使用数组、集合来存储呢 ——> 如果有成千上亿条数据呢&#xff…

开放世界目标检测 Grounding DINO

开放世界目标检测 Grounding DINO flyfish Grounding DINO 是一种开创性的开放集对象检测器&#xff0c;它通过结合基于Transformer的检测器DINO与基于文本描述的预训练技术&#xff0c;实现了可以根据人类输入&#xff08;如类别名称或指代表达&#xff09;检测任意对象的功…

webrtc 源码阅读 make_ref_counted模板函数用法

目录 1. 模板参数解析 1.1 typename T 1.2 typename... Args 1.3 typename std::enable_if::value, T>::type* nullptr 2. scoped_refptr 3. new RefCountedObject(std::forward(args)...); 4. 综合说明 5.在webrtc中的用法 5.1 peerConnectionFactory对象的构建过…

RK3566和Robo_C的EMC防护设计细节

USB部分的防护细节&#xff1a; ROBO C的USB接口&#xff1a; PF级别的电容滤波&#xff1a; TVS电容&#xff08;TVS Capacitor&#xff09;&#xff1a;用于与TVS二极管配合&#xff0c;保护电路免受瞬态电压冲击。电容一般较小&#xff0c;通常为几十皮法&#xff08;pF&am…

如果你的网站是h5网站,如何将h5网站变成小程序-除开完整重做方法如何快速h5转小程序-h5网站转小程序的办法-优雅草央千澈

如果你的网站是h5网站&#xff0c;如何将h5网站变成小程序-除开完整重做方法如何快速h5转小程序-h5网站转小程序的办法-优雅草央千澈 h5如何转小程序 如果当年你们开发网站是用的h5但是没有开发小程序&#xff0c;也没有使用uniapp这样的混开框架&#xff0c;但是目前根据业务需…

30天面试打卡计划 2024-12-25 26 27 面试题

2024-12-25 面试题 后端 MySQL三层B树能存多少数据&#xff1f; B 树&#xff1a;一种特殊的多路平衡查找树&#xff0c;广泛应用于数据库索引中。它具有所有叶子节点都位于同一层且包含指向相邻叶子节点指针的特点&#xff0c;这使得范围查询更加高效。InnoDB&#xff1a;My…

微信流量主挑战:用户破16!新增文档转换(新纪元3)

朋友们&#xff0c;报告好消息&#xff01;我的小程序用户数量已经涨到16个了&#xff01;没错&#xff0c;真没拉朋友圈亲戚好友来撑场子&#xff0c;全靠实力&#xff08;和一点点运气&#xff09;吸引了16位陌生小伙伴光临&#xff01;这波进步&#xff0c;连我自己都感动了…

阿里云redis内存优化——PCP数据清理

在阿里云安装了一个redis节点&#xff0c;今天使用时忽然想着点击了一下分析内存。好家伙&#xff0c;居然崩出了一个30多M的块出来。问题是我本地安装的redis没有这个啊&#xff0c;怎么奇怪冒出这个来了。 本着把系统用干榨尽的态度&#xff0c;研究了下这个问题的来源。网上…

常见的排序算法过程和比较分析

比较分析 排序类别排序算法时间复杂度&#xff08;最好&#xff09;时间复杂度&#xff08;最坏&#xff09;时间复杂度&#xff08;平均&#xff09;辅助空间复杂度稳定性插入排序直接插入排序O(n)O(n)O(n)O(1)稳定插入排序折半插入排序O(n)O(n)O(n)O(1)稳定插入排序希尔排序…

webrtc-internals调试工具

Google 的 Chrome&#xff08;87 或更高版本&#xff09;WebRTC 内部工具是一套内置于 Chrome 浏览器中的调试工具; webrtc-internals 能够查看有关视频和音频轨道、使用的编解码器以及流的一般质量的详细信息。这些知识对于解决音频和视频质量差的问题非常有帮助。 webrtc-int…

VS Code中怎样查看某分支的提交历史记录

VsCode中无法直接查看某分支的提交记录&#xff0c;需借助插件才行&#xff0c;常见的插件如果git history只能查看某页面的改动记录&#xff0c;无法查看某分支的整体提交记录&#xff0c;我们可以安装GIT Graph插件来解决这个问题 1.在 VSCode的插件库中搜索 GIT Graph安装&a…

超详细!一文搞定PID!嵌入式STM32-PID位置环和速度环

本文目录 一、知识点1. PID是什么&#xff1f;2. 积分限幅--用于限制无限累加的积分项3. 输出值限幅--用于任何pid的输出4. PID工程 二、各类PID1. 位置式PID&#xff08;用于位置环&#xff09;&#xff08;1&#xff09;公式&#xff08;2&#xff09;代码使用代码 2. 增量式…