游戏陪玩系统开发评论模块,提升用户互动体验!
评论模块在具备互动属性的软件系统中经常能够看到,在游戏陪玩系统开发时,实现评论模块提高用户互动体验的同时,增加用户在平台内的留存,一般在开发评论模块时需要用到相关的数据库。一、前端界面分析先看看游戏陪玩系统开发前端评论界面长什么样,知道了前端需要什么数据,就知道数据库该怎么设计了。首先游戏陪玩系统开发评论的主体可以是人、项目、资源,所以要有一个 type 字段标明这条评论的类型。以项目为例,一个项目下面可能会有多条评论。每条评论其实分为两种,一种是直接对项目的评论,称之为父评论吧;另一种是对已有评论的评论,称为子评论。梳理一下关系,在游戏陪玩系统中每个项目可能有多个父评论,每个父评论可能有多个子评论。项目与父评论,父评论与子评论,都是一对多的关系。由此可知游戏陪玩系统开发数据库应该分为两个表,一个存储父评论,一个存储子评论。再看都需要什么字段,先分析主评论。必须要有的是项目id,得知道是对谁评论的,叫 ownerId 吧。还有评论者的头像、昵称、id,还有评论时间、内容、点赞个数等。子评论跟父评论的字段差不多,只是不要点赞数量。二、数据库设计分析了游戏陪玩系统开发评论模块的界面,知道需要什么字段,就开始设计数据库吧。评论主表(父评论表)CREATETABLE`comments_info`(`id`varchar(32)NOTNULLCOMMENT'评论主键id',`type`tinyint(1)NOTNULLCOMMENT'评论类型:对人评论,对项目评论,对资源评论',`owner_id`varchar(32)NOTNULLCOMMENT'被评论者id,可以是人、项目、资源',`from_id`varchar(32)NOTNULLCOMMENT'评论者id',`from_name`varchar(32)NOTNULLCOMMENT'评论者名字',`from_avatar`varchar(512)DEFAULT''COMMENT'评论者头像',`like_num`int(11)DEFAULT'0'COMMENT'点赞的数量',`content`varchar(512)DEFAULTNULLCOMMENT'评论内容',`create_time`timestampNOTNULLDEFAULTCURRENT_TIMESTAMPCOMMENT'创建时间',`update_time`timestampNOTNULLDEFAULTCURRENT_TIMESTAMPONUPDATECURRENT_TIMESTAMPCOMMENT'修改时间',PRIMARYKEY(`id`),KEY`owner_id`(`owner_id`))ENGINE=InnoDBDEFAULTCHARSET=utf8mb4COMMENT='评论主表';评论回复表(子评论表)CREATETABLE`comments_reply`(`id`int(11)NOTNULLAUTO_INCREMENT,`comment_id`varchar(32)NOTNULLCOMMENT'评论主表id',`from_id`varchar(32)NOTNULLCOMMENT'评论者id',`from_name`varchar(32)NOTNULLCOMMENT'评论者名字',`from_avatar`varchar(512)DEFAULT''COMMENT'评论者头像',`to_id`varchar(32)NOTNULLCOMMENT'被评论者id',`to_name`varchar(32)NOTNULLCOMMENT'被评论者名字',`to_avatar`varchar(512)DEFAULT''COMMENT'被评论者头像',`content`varchar(512)DEFAULTNULLCOMMENT'评论内容',`create_time`timestampNOTNULLDEFAULTCURRENT_TIMESTAMPCOMMENT'创建时间',`update_time`timestampNOTNULLDEFAULTCURRENT_TIMESTAMPONUPDATECURRENT_TIMESTAMPCOMMENT'修改时间',PRIMARYKEY(`id`),KEY`comment_id`(`comment_id`))ENGINE=InnoDBAUTO_INCREMENT=4DEFAULTCHARSET=utf8mb4COMMENT='评论回复表';三、功能实现游戏陪玩系统开发采用 SpringCloud 微服务架构,评论模块跟其他模块的关联性不强,可以抽出为一个单独的服务 comments-service 。数据实体对象 CommentsInfopackagecom.solo.coderiver.comments.dataobject;importlombok.Data;importorg.hibernate.annotations.DynamicUpdate;importjavax.persistence.Entity;importjavax.persistence.Id;importjava.util.Date;/***评论表主表*/@Entity@Data@DynamicUpdatepublicclassCommentsInfo{//评论主键id@IdprivateStringid;//评论类型。1用户评论,2项目评论,3资源评论privateIntegertype;//被评论者的idprivateStringownerId;//评论者idprivateStringfromId;//评论者名字privateStringfromName;//评论者头像privateStringfromAvatar;//获得点赞的数量privateIntegerlikeNum;//评论内容privateStringcontent;//创建时间privateDatecreateTime;//更新时间privateDateupdateTime;}数据实体对象 CommentsReplypackagecom.solo.coderiver.comments.dataobject;importlombok.Data;importorg.hibernate.annotations.DynamicUpdate;importjavax.persistence.Entity;importjavax.persistence.GeneratedValue;importjavax.persistence.GenerationType;importjavax.persistence.Id;importjava.util.Date;/***评论回复表*/@Entity@Data@DynamicUpdatepublicclassCommentsReply{@Id@GeneratedValue(strategy=GenerationType.IDENTITY)privateIntegerid;//评论主表idprivateStringcommentId;//评论者idprivateStringfromId;//评论者名字privateStringfromName;//评论者头像privateStringfromAvatar;//被评论者idprivateStringtoId;//被评论者名字privateStringtoName;//被评论者头像privateStringtoAvatar;//评论内容privateStringcontent;//创建时间privateDatecreateTime;//更新时间privateDateupdateTime;}数据库操作仓库 repository操作数据库暂时用的是 Jpa ,后期可能会增加一份 mybatis 的实现。CommentsInfoRepositorypackagecom.solo.coderiver.comments.repository;importcom.solo.coderiver.comments.dataobject.CommentsInfo;importorg.springframework.data.jpa.repository.JpaRepository;importjava.util.List;publicinterfaceCommentsInfoRepositoryextendsJpaRepository<CommentsInfo,String>{List<CommentsInfo>findByOwnerId(StringownerId);}CommentsReplyRepositorypackagecom.solo.coderiver.comments.repository;importcom.solo.coderiver.comments.dataobject.CommentsReply;importorg.springframework.data.jpa.repository.JpaRepository;importjava.util.List;publicinterfaceCommentsReplyRepositoryextendsJpaRepository<CommentsReply,Integer>{List<CommentsReply>findByCommentId(StringcommentId);}Service 接口封装为了游戏陪玩系统开发代码更健壮,要把数据库的操作封装一下CommentsInfoServicepackagecom.solo.coderiver.comments.service;importcom.solo.coderiver.comments.dataobject.CommentsInfo;importjava.util.List;publicinterfaceCommentsInfoService{/***保存评论*@paraminfo*@return*/CommentsInfosave(CommentsInfoinfo);/***根据被评论者的id查询评论列表*@paramownerId*@return*/List<CommentsInfo>findByOwnerId(StringownerId);}CommentsReplyServicepackagecom.solo.coderiver.comments.service;importcom.solo.coderiver.comments.dataobject.CommentsReply;importjava.util.List;publicinterfaceCommentsReplyService{/***保存评论回复*@paramreply*@return*/CommentsReplysave(CommentsReplyreply);/***根据评论id查询回复*@paramcommentId*@return*/List<CommentsReply>findByCommentId(StringcommentId);}接口的实现类CommentsInfoServiceImplpackagecom.solo.coderiver.comments.service.impl;importcom.solo.coderiver.comments.dataobject.CommentsInfo;importcom.solo.coderiver.comments.repository.CommentsInfoRepository;importcom.solo.coderiver.comments.service.CommentsInfoService;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.stereotype.Service;importjava.util.List;@ServicepublicclassCommentsInfoServiceImplimplementsCommentsInfoService{@AutowiredCommentsInfoRepositoryrepository;@OverridepublicCommentsInfosave(CommentsInfoinfo){returnrepository.save(info);}@OverridepublicList<CommentsInfo>findByOwnerId(StringownerId){returnrepository.findByOwnerId(ownerId);}}CommentsReplyServiceImplpackagecom.solo.coderiver.comments.service.impl;importcom.solo.coderiver.comments.dataobject.CommentsReply;importcom.solo.coderiver.comments.repository.CommentsReplyRepository;importcom.solo.coderiver.comments.service.CommentsReplyService;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.stereotype.Service;importjava.util.List;@ServicepublicclassCommentsReplyServiceImplimplementsCommentsReplyService{@AutowiredCommentsReplyRepositoryrepository;@OverridepublicCommentsReplysave(CommentsReplyreply){returnrepository.save(reply);}@OverridepublicList<CommentsReply>findByCommentId(StringcommentId){returnrepository.findByCommentId(commentId);}}控制层 ControllerController 层分发请求,并返回游戏陪玩系统前端需要的数据packagecom.solo.coderiver.comments.controller;@RestController@Api(description="评论相关接口")publicclassCommentsController{@AutowiredCommentsInfoServiceinfoService;@AutowiredCommentsReplyServicereplyService;@PostMapping("/save")@ApiOperation("保存评论")@TransactionalpublicResultVOsaveComments(@ValidCommentsInfoFormform,BindingResultbindingResult){if(bindingResult.hasErrors()){thrownewCommentsException(ResultEnums.PARAMS_ERROR.getCode(),bindingResult.getFieldError().getDefaultMessage());}//将CommentsInfoForm里的数据拷贝到CommentsInfoCommentsInfoinfo=newCommentsInfo();BeanUtils.copyProperties(form,info);//生成并设置评论的主键idinfo.setId(KeyUtils.genUniqueKey());CommentsInforesult=infoService.save(info);if(result==null){thrownewCommentsException(ResultEnums.SAVE_COMMENTS_FAIL);}returnResultVOUtils.success();}@GetMapping("/get/{ownerId}@ApiOperation("根据ownerId查询评论")@ApiImplicitParam(name="ownerId",value="被评论者id")publicResultVOgetCommentsByOwnerId(@PathVariable("ownerId")StringownerId){List<CommentsInfo>infoList=infoService.findByOwnerId(ownerId);//将CommentsInfo转换为CommentsInfoDTOList<CommentsInfoDTO>infoDTOS=infoList.stream().map(info->{CommentsInfoDTOdto=newCommentsInfoDTO();BeanUtils.copyProperties(info,dto);returndto;}).collect(Collectors.toList());returnResultVOUtils.success(infoDTOS);}@PostMapping("/save-reply")@ApiOperation("保存评论回复")@TransactionalpublicResultVOsaveReply(@ValidCommentsReplyFormform,BindingResultbindingResult){if(bindingResult.hasErrors()){thrownewCommentsException(ResultEnums.PARAMS_ERROR.getCode(),bindingResult.getFieldError().getDefaultMessage());}CommentsReplyreply=newCommentsReply();BeanUtils.copyProperties(form,reply);CommentsReplyresult=replyService.save(reply);if(result==null){thrownewCommentsException(ResultEnums.SAVE_COMMENTS_FAIL);}returnResultVOUtils.success();}@GetMapping("/get-reply/{commentId}")@ApiOperation("通过commentId获取评论回复")publicResultVOgetReplyByCommentId(@PathVariable("commentId")StringcommentId){List<CommentsReply>replyList=replyService.findByCommentId(commentId);//将CommentsReply转换为CommentsReplyDTOList<CommentsReplyDTO>replyDTOS=replyList.stream().map(reply->{CommentsReplyDTOdto=newCommentsReplyDTO();BeanUtils.copyProperties(reply,dto);returndto;}).collect(Collectors.toList());returnResultVOUtils.success(replyDTOS);}}代码中工具类和枚举类就不多说了,以上就是在游戏陪玩系统开发时,对评论模块的设计与功能实现,希望对大家有帮助。本文转载自网络,转载仅为分享干货知识,如有侵权欢迎联系云豹科技进行删除处理原文链接:
发表回复