java b2b2c商城

一、需求分析

  1. 买家可以对商品提交购买问题咨询,买家提交的商品购买咨询不单单商家可以进行回复,也应该可以将问题推送给购买过此商品的买家来进行回复。

  2. 买家提出的咨询和对其他买家咨询的回复,都应该推送消息给相应的会员用户,做到及时提醒。

二、流程图

在这里插入图片描述

三、数据结构

  1. 会员问题咨询表

在这里插入图片描述

  1. 会员问题咨询回复表

在这里插入图片描述

  1. 会员咨询与回复站内消息表

在这里插入图片描述

四、类图展示

1、实体类展示

在这里插入图片描述

2、枚举类展示

在这里插入图片描述

五、领域模型

1、会员问题咨询

在这里插入图片描述

2、会员回复问题咨询

在这里插入图片描述

3、会员商品咨询审核通过发送消息

在这里插入图片描述

六、源码展示

这里以会员购买咨询为例:

会员问题咨询实体--Memb

1/** 2 * 会员问题咨询实体 3 * 4 * @author dmy 5 * @version v2.0 6 * @since v7.1.5 7 * 2019-09-16 8 */ 9@Table(name = "es_member_ask") 10@ApiModel 11@JsonNaming(value = PropertyNamingStrategy.SnakeCaseStrategy.class) 12public class MemberAsk implements Serializable { 13 14 private static final long serialVersionUID = 1642694855238993L; 15 16 /** 17 * 主键 18 */ 19 @Id(name = "ask_id") 20 @ApiModelProperty(hidden = true) 21 private Integer askId; 22 /** 23 * 商品id 24 */ 25 @Column(name = "goods_id") 26 @ApiModelProperty(name = "goods_id", value = "商品id", required = false) 27 private Integer goodsId; 28 /** 29 * 会员id 30 */ 31 @Column(name = "member_id") 32 @ApiModelProperty(name = "member_id", value = "会员id", required = false) 33 private Integer memberId; 34 /** 35 * 卖家id 36 */ 37 @Column(name = "seller_id") 38 @ApiModelProperty(name = "seller_id", value = "卖家id", required = false) 39 private Integer sellerId; 40 /** 41 * 咨询内容 42 */ 43 @Column(name = "content") 44 @ApiModelProperty(name = "content", value = "咨询内容", required = false) 45 private String content; 46 /** 47 * 咨询时间 48 */ 49 @Column(name = "create_time") 50 @ApiModelProperty(name = "create_time", value = "咨询时间", required = false) 51 private Long createTime; 52 /** 53 * 商家回复内容 54 */ 55 @Column(name = "reply") 56 @ApiModelProperty(name = "reply", value = "商家回复内容", required = false) 57 private String reply; 58 /** 59 * 商家回复时间 60 */ 61 @Column(name = "reply_time") 62 @ApiModelProperty(name = "reply_time", value = "商家回复时间", required = false) 63 private Long replyTime; 64 /** 65 * 商家是否回复 YES:是,NO:否 66 */ 67 @Column(name = "reply_status") 68 @ApiModelProperty(name = "reply_status", value = "商家是否回复 YES:是,NO:否", required = false) 69 private String replyStatus; 70 /** 71 * 删除状态 DELETED:已删除 NORMAL:正常 72 */ 73 @Column(name = "status") 74 @ApiModelProperty(name = "status", value = "删除状态 DELETED:已删除 NORMAL:正常", required = false) 75 private String status; 76 /** 77 * 咨询人名称 78 */ 79 @Column(name = "member_name") 80 @ApiModelProperty(name = "member_name", value = "咨询人名称", required = false) 81 private String memberName; 82 /** 83 * 会员头像 84 */ 85 @Column(name = "member_face") 86 @ApiModelProperty(name = "member_face", value = "会员头像", required = false) 87 private String memberFace; 88 /** 89 * 商品名称 90 */ 91 @Column(name = "goods_name") 92 @ApiModelProperty(name = "goods_name", value = "商品名称", required = false) 93 private String goodsName; 94 /** 95 * 商品图片 96 */ 97 @Column(name = "goods_img") 98 @ApiModelProperty(name = "goods_img", value = "商品图片", required = false) 99 private String goodsImg; 100 /** 101 * 审核状态 WAIT_AUDIT:待审核,PASS_AUDIT:审核通过,REFUSE_AUDIT:审核未通过 102 */ 103 @Column(name = "auth_status") 104 @ApiModelProperty(name = "auth_status", value = "审核状态 WAIT_AUDIT:待审核,PASS_AUDIT:审核通过,REFUSE_AUDIT:审核未通过", required = false) 105 private String authStatus; 106 /** 107 * 是否匿名 YES:是,NO:否 108 */ 109 @Column(name = "anonymous") 110 @ApiModelProperty(name = "anonymous", value = "是否匿名 YES:是,NO:否", required = false) 111 private String anonymous; 112 /** 113 * 会员问题咨询回复数量 114 * 包含商家回复 115 */ 116 @Column(name = "reply_num") 117 @ApiModelProperty(name = "reply_num", value = "会员问题咨询回复数量", required = false) 118 private Integer replyNum; 119 120 @PrimaryKeyField 121 public Integer getAskId() { 122 return askId; 123 } 124 125 public void setAskId(Integer askId) { 126 this.askId = askId; 127 } 128 129 public Integer getGoodsId() { 130 return goodsId; 131 } 132 133 public void setGoodsId(Integer goodsId) { 134 this.goodsId = goodsId; 135 } 136 137 public Integer getMemberId() { 138 return memberId; 139 } 140 141 public void setMemberId(Integer memberId) { 142 this.memberId = memberId; 143 } 144 145 public Integer getSellerId() { 146 return sellerId; 147 } 148 149 public void setSellerId(Integer sellerId) { 150 this.sellerId = sellerId; 151 } 152 153 public String getContent() { 154 return content; 155 } 156 157 public void setContent(String content) { 158 this.content = content; 159 } 160 161 public Long getCreateTime() { 162 return createTime; 163 } 164 165 public void setCreateTime(Long createTime) { 166 this.createTime = createTime; 167 } 168 169 public String getReply() { 170 return reply; 171 } 172 173 public void setReply(String reply) { 174 this.reply = reply; 175 } 176 177 public Long getReplyTime() { 178 return replyTime; 179 } 180 181 public void setReplyTime(Long replyTime) { 182 this.replyTime = replyTime; 183 } 184 185 public String getReplyStatus() { 186 return replyStatus; 187 } 188 189 public void setReplyStatus(String replyStatus) { 190 this.replyStatus = replyStatus; 191 } 192 193 public String getStatus() { 194 return status; 195 } 196 197 public void setStatus(String status) { 198 this.status = status; 199 } 200 201 public String getMemberName() { 202 return memberName; 203 } 204 205 public void setMemberName(String memberName) { 206 this.memberName = memberName; 207 } 208 209 public String getMemberFace() { 210 return memberFace; 211 } 212 213 public void setMemberFace(String memberFace) { 214 this.memberFace = memberFace; 215 } 216 217 public String getGoodsName() { 218 return goodsName; 219 } 220 221 public void setGoodsName(String goodsName) { 222 this.goodsName = goodsName; 223 } 224 225 public String getGoodsImg() { 226 return goodsImg; 227 } 228 229 public void setGoodsImg(String goodsImg) { 230 this.goodsImg = goodsImg; 231 } 232 233 public String getAuthStatus() { 234 return authStatus; 235 } 236 237 public void setAuthStatus(String authStatus) { 238 this.authStatus = authStatus; 239 } 240 241 public String getAnonymous() { 242 return anonymous; 243 } 244 245 public void setAnonymous(String anonymous) { 246 this.anonymous = anonymous; 247 } 248 249 public Integer getReplyNum() { 250 return replyNum; 251 } 252 253 public void setReplyNum(Integer replyNum) { 254 this.replyNum = replyNum; 255 } 256 257 @Override 258 public boolean equals(Object o) { 259 if (this == o) { 260 return true; 261 } 262 if (o == null || getClass() != o.getClass()) { 263 return false; 264 } 265 MemberAsk memberAsk = (MemberAsk) o; 266 return Objects.equals(askId, memberAsk.askId) && 267 Objects.equals(goodsId, memberAsk.goodsId) && 268 Objects.equals(memberId, memberAsk.memberId) && 269 Objects.equals(sellerId, memberAsk.sellerId) && 270 Objects.equals(content, memberAsk.content) && 271 Objects.equals(createTime, memberAsk.createTime) && 272 Objects.equals(reply, memberAsk.reply) && 273 Objects.equals(replyTime, memberAsk.replyTime) && 274 Objects.equals(replyStatus, memberAsk.replyStatus) && 275 Objects.equals(status, memberAsk.status) && 276 Objects.equals(memberName, memberAsk.memberName) && 277 Objects.equals(memberFace, memberAsk.memberFace) && 278 Objects.equals(goodsName, memberAsk.goodsName) && 279 Objects.equals(goodsImg, memberAsk.goodsImg) && 280 Objects.equals(authStatus, memberAsk.authStatus) && 281 Objects.equals(anonymous, memberAsk.anonymous) && 282 Objects.equals(replyNum, memberAsk.replyNum); 283 } 284 285 @Override 286 public int hashCode() { 287 return Objects.hash(askId, goodsId, memberId, sellerId, content, createTime, reply, replyTime, replyStatus, status, memberName, memberFace, goodsName, goodsImg, authStatus, anonymous, replyNum); 288 } 289 290 @Override 291 public String toString() { 292 return "MemberAsk{" + 293 "askId=" + askId + 294 ", goodsId=" + goodsId + 295 ", memberId=" + memberId + 296 ", sellerId=" + sellerId + 297 ", content='" + content + '\'' + 298 ", createTime=" + createTime + 299 ", reply='" + reply + '\'' + 300 ", replyTime=" + replyTime + 301 ", replyStatus='" + replyStatus + '\'' + 302 ", status='" + status + '\'' + 303 ", memberName='" + memberName + '\'' + 304 ", memberFace='" + memberFace + '\'' + 305 ", goodsName='" + goodsName + '\'' + 306 ", goodsImg='" + goodsImg + '\'' + 307 ", authStatus='" + authStatus + '\'' + 308 ", anonymous='" + anonymous + '\'' + 309 ", replyNum=" + replyNum + 310 '}'; 311 } 312}

新增会员购买咨询API--MemberAskBuyerController

1/** 2 * 会员商品咨询API 3 * 4 * @author dmy 5 * @version v2.0 6 * @since v7.1.5 7 * 2019-09-17 8 */ 9@RestController 10@RequestMapping("/members/asks") 11@Api(description = "会员商品咨询API") 12@Validated 13public class MemberAskBuyerController { 14 15 @Autowired 16 private MemberAskManager memberAskManager; 17 18 @ApiOperation(value = "添加咨询", response = MemberAsk.class) 19 @ApiImplicitParams({ 20 @ApiImplicitParam(name = "ask_content", value = "咨询内容", required = true, dataType = "string", paramType = "query"), 21 @ApiImplicitParam(name = "goods_id", value = "咨询商品id", required = true, dataType = "int", paramType = "query"), 22 @ApiImplicitParam(name = "anonymous", value = "是否匿名 YES:是,NO:否", required = true, dataType = "string", paramType = "query", allowableValues = "YES,NO") 23 }) 24 @PostMapping 25 public MemberAsk add(@NotEmpty(message = "请输入咨询内容")@ApiIgnore String askContent, 26 @NotNull(message = "咨询商品不能为空") @ApiIgnore Integer goodsId, 27 @NotNull(message = "请选择是否匿名提问") @ApiIgnore String anonymous) { 28 29 //咨询内容敏感词过滤 30 askContent = SensitiveFilter.filter(askContent, CharacterConstant.WILDCARD_STAR); 31 32 MemberAsk memberAsk = this.memberAskManager.add(askContent, goodsId, anonymous); 33 34 return memberAsk; 35 } 36}

业务层

新增会员咨询业务接口--MemberAskManager

1/** 2 * 咨询业务层 3 * @author dmy 4 * @version v2.0 5 * @since v7.1.5 6 * 2019-09-17 7 */ 8public interface MemberAskManager { 9 10 /** 11 * 添加咨询 12 * @param askContent 咨询 13 * @param goodsId 商品id 14 * @param anonymous 是否匿名 YES:是,NO:否 15 * @return MemberAsk 咨询 16 */ 17 MemberAsk add(String askContent, Integer goodsId, String anonymous); 18}

业务接口实现类--MemberAskManagerImpl

1/** 2 * 咨询业务类 3 * 4 * @author dmy 5 * @version v2.0 6 * @since v7.1.5 7 * 2019-09-17 8 */ 9@Service 10public class MemberAskManagerImpl implements MemberAskManager { 11 12 @Autowired 13 @Qualifier("memberDaoSupport") 14 private DaoSupport daoSupport; 15 @Autowired 16 private GoodsClient goodsClient; 17 @Autowired 18 private MemberManager memberManager; 19 @Autowired 20 private SettingClient settingClient; 21 @Autowired 22 private AmqpTemplate amqpTemplate; 23 24 @Override 25 @Transactional(value = "memberTransactionManager", propagation = Propagation.REQUIRED, rollbackFor = Exception.class) 26 public MemberAsk add(String askContent, Integer goodsId, String anonymous) { 27 if (askContent.length() < 3 || askContent.length() > 120) { 28 throw new ServiceException(MemberErrorCode.E202.code(), "咨询内容应在3到120个字符之间"); 29 } 30 31 //获取咨询的商品信息 32 CacheGoods goods = goodsClient.getFromCache(goodsId); 33 34 //获取当前登录的会员信息 35 Buyer buyer = UserContext.getBuyer(); 36 37 if (buyer == null) { 38 throw new ServiceException(MemberErrorCode.E110.code(), "当前会员已经退出登录"); 39 } 40 41 //在数据库中取出最新的会员信息 42 Member member = memberManager.getModel(buyer.getUid()); 43 44 MemberAsk memberAsk = new MemberAsk(); 45 memberAsk.setContent(askContent); 46 memberAsk.setMemberId(member.getMemberId()); 47 memberAsk.setGoodsId(goodsId); 48 memberAsk.setGoodsName(goods.getGoodsName()); 49 memberAsk.setGoodsImg(goods.getThumbnail()); 50 memberAsk.setCreateTime(DateUtil.getDateline()); 51 //咨询状态默认为正常状态 52 memberAsk.setStatus(DeleteStatusEnum.NORMAL.value()); 53 memberAsk.setSellerId(goods.getSellerId()); 54 //商家回复状态默认为未回复 55 memberAsk.setReplyStatus(CommonStatusEnum.NO.value()); 56 57 if (!CommonStatusEnum.YES.value().equals(anonymous) && !CommonStatusEnum.NO.value().equals(anonymous)) { 58 throw new ServiceException(MemberErrorCode.E107.code(), "是否匿名参数值不正确"); 59 } 60 memberAsk.setAnonymous(anonymous); 61 memberAsk.setMemberName(CommonStatusEnum.YES.value().equals(anonymous) ? "匿名" : member.getUname()); 62 memberAsk.setMemberFace(member.getFace()); 63 64 //获取商品咨询设置 65 String json = this.settingClient.get(SettingGroup.GOODS); 66 GoodsSettingVO goodsSettingVO = JsonUtil.jsonToObject(json,GoodsSettingVO.class); 67 memberAsk.setAuthStatus(goodsSettingVO.getAskAuth().intValue() == 0 ? AuditEnum.PASS_AUDIT.name() : AuditEnum.WAIT_AUDIT.name()); 68 69 this.daoSupport.insert(memberAsk); 70 memberAsk.setAskId(this.daoSupport.getLastId("")); 71 72 //如果平台没有开启会员咨询审核,那么就直接发送消息 73 if (goodsSettingVO.getAskAuth().intValue() == 0) { 74 List<MemberAsk> list = new ArrayList<>(); 75 list.add(memberAsk); 76 this.sendMessage(list); 77 } 78 79 return memberAsk; 80 } 81 82 /** 83 * 发送rabbitmq消息 84 * @param memberAskList 85 */ 86 private void sendMessage(List<MemberAsk> memberAskList) { 87 MemberAskMessage memberAskMessage = new MemberAskMessage(); 88 memberAskMessage.setMemberAsks(memberAskList); 89 memberAskMessage.setSendTime(DateUtil.getDateline()); 90 this.amqpTemplate.convertAndSend(AmqpExchange.MEMBER_GOODS_ASK, AmqpExchange.MEMBER_GOODS_ASK + "_ROUTING", memberAskMessage); 91 } 92}

处理rabbitmq消息的消费者--MemberAskConsumer

1/** 2 * 会员商品咨询消费者 3 * 会员提出咨询后给购买过此商品的会员发送消息 4 * @author dmy 5 * @version v1.0 6 * @since v7.1.5 7 * 2019-09-16 8 */ 9@Service 10public class MemberAskConsumer implements MemberAskSendMessageEvent { 11 12 @Autowired 13 private MemberAskClient memberAskClient; 14 15 @Autowired 16 private OrderQueryManager orderQueryManager; 17 18 @Override 19 public void goodsAsk(MemberAskMessage memberAskMessage) { 20 List<MemberAsk> memberAskList = memberAskMessage.getMemberAsks(); 21 22 if (memberAskList != null && memberAskList.size() != 0) { 23 for (MemberAsk memberAsk : memberAskList) { 24 if (memberAsk == null) { 25 break; 26 } 27 28 //获取3个月之内购买过相关商品的订单数据,获取的订单数据只限已完成和已收货并且未删除的订单 29 List<OrderDO> orderDOList = orderQueryManager.listOrderByGoods(memberAsk.getGoodsId(), memberAsk.getMemberId(), 3); 30 31 if (orderDOList != null && orderDOList.size() != 0) { 32 AskMessageDO askMessageDO = new AskMessageDO(); 33 askMessageDO.setAsk(memberAsk.getContent()); 34 askMessageDO.setAskId(memberAsk.getAskId()); 35 askMessageDO.setAskMember(memberAsk.getMemberName()); 36 askMessageDO.setAskAnonymous(memberAsk.getAnonymous()); 37 askMessageDO.setGoodsId(memberAsk.getGoodsId()); 38 askMessageDO.setGoodsName(memberAsk.getGoodsName()); 39 askMessageDO.setGoodsImg(memberAsk.getGoodsImg()); 40 askMessageDO.setIsDel(DeleteStatusEnum.NORMAL.value()); 41 askMessageDO.setIsRead(CommonStatusEnum.NO.value()); 42 askMessageDO.setSendTime(memberAskMessage.getSendTime()); 43 askMessageDO.setReceiveTime(DateUtil.getDateline()); 44 askMessageDO.setMsgType(AskMsgTypeEnum.ASK.value()); 45 46 //循环订单获取会员信息,然后给会员发送消息 47 for (OrderDO orderDO : orderDOList) { 48 askMessageDO.setMemberId(orderDO.getMemberId()); 49 this.memberAskClient.sendMessage(askMessageDO); 50 } 51 } 52 } 53 } 54 } 55}

 以上为本次分享内容,相关商城架构源码分享,请持续关注我们!!!

易族智汇(javashop)原创文章

点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

MySQL部分从库上面因为大量的临时表tmp_table造成慢查询

背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_

皕杰报表之UUID

​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

Java日期时间API系列31

  时间戳是指格林威治时间1970年01月01日00时00分00秒起至现在的总毫秒数,是所有时间的基础,其他时间可以通过时间戳转换得到。Java中本来已经有相关获取时间戳的方法,Java8后增加新的类Instant等专用于处理时间戳问题。 1获取时间戳的方法和性能对比1.1获取时间戳方法Java8以前

java b2b2c商城 - HelloWorld