跳到主要内容

会员相关核心逻辑说明

功能说明

1.登录买家端,可进行会员注册,填写会员账号密码等信息.
2.会员登录,基于token进行鉴权验权实现登录功能.
3.个人信息修改,可设置性别,生日,地址等信息.
4.会员购买商品下订单等流程操作.

数据库设计

表结构展示

会员表(es_member)

字段名类型备注是否索引
member_idbigint(20)会员ID
unamevarchar(255)会员登录用户名
emailvarchar(255)邮箱
passwordvarchar(255)会员登录密码
create_timebigint(20)会员注册时间
sexint(1)会员性别
birthdaybigint(20)会员生日
province_idbigint(20)所属省份ID
city_idbigint(20)所属城市ID
county_idbigint(20)所属县(区)ID
town_idbigint(20)所属城镇ID
provincevarchar(255)所属省份名称
cityvarchar(255)所属城市名称
countyvarchar(255)所属县(区)名称
townvarchar(255)所属城镇名称
addressvarchar(255)详细地址
mobilevarchar(255)手机号码
telvarchar(255)座机号码
grade_pointbigint(20)等级积分
msnvarchar(255)会员MSN
remarkvarchar(255)会员备注
last_loginbigint(20)上次登录时间
login_countint(10)登录次数
is_chekedint(1)邮件是否已验证
register_ipvarchar(255)注册IP地址
recommend_point_stateint(10)是否已经完成了推荐积分
info_fullint(1)会员信息是否完善
find_codevarchar(255)find_code
facevarchar(255)会员头像
midentityint(10)身份证号
disabledint(8)会员状态
shop_idbigint(20)店铺ID
have_shopint(1)是否开通店铺
consum_pointbigint(20)消费积分
nicknamevarchar(255)昵称

此表为会员信息的核心数据表 从注册会员到完善信息的相关数据都保存在此表中

代码展示

登录方式有三种:
1.账号密码登录
用户点击登录,输入账号密码,系统会根据用户名进入es_member表查询会员信息
2.手机号登录
用户点击登录,输入手机号和验证码,系统会根据手机号进入es_member表查询会员信息

关于以上两种登录方式,详情可参考:
cn.shoptnt.api.buyer.passport.PassportLoginBuyerController

3.第三方信任登录
关于第三方登录,我们对接了QQ,微信,微博,支付宝 四种登录方式
以上登录方式,需要在管理端的设置管理/网店设置/信任登录中配置登录参数
还要在配置文件domain中配置您的买家端域名以及回调地址

  domain:
buyer: pc-v720.javamall.com.cn #配置为您买家端PC的域名
mobileBuyer: m-v720.javamall.com.cn #配置为您买家端WAP的域名
callback: buyer-api-v720.javamall.com.cn #请配置为您站点的买家端的api域名

以下为信任登录统一回调地址代码展示,相关代码请参考:
cn.shoptnt.api.buyer.passport.PassportConnectBuyerController

    @ApiOperation(value = "信任登录统一回调地址")
@GetMapping("/connect/{port}/{type}/callback")
@ApiImplicitParams({
@ApiImplicitParam(name = "type", value = "登录类型", required = true, dataType = "String", allowableValues = "QQ,WEIBO,WECHAT,ALIPAY", paramType = "path"),
@ApiImplicitParam(name = "port", value = "登录客户端", required = true, dataType = "String", allowableValues = "PC,WAP", paramType = "path"),
@ApiImplicitParam(name = "uid", value = "会员id", required = true, dataType = "Integer", paramType = "query")
})
public void callBack(@PathVariable("type") String type, @PathVariable("port") String port, @ApiIgnore Long uid) {
try {
uid = getUidForCookies(uid);
if (uid != null && uid != 0) {
bindCallBackMethod(type, port, uid);
} else {
String uuid = UUID.randomUUID().toString();

debugger.log("生成uuid:");
debugger.log(uuid);

MemberVO memberVO = connectManager.callBack(type, port, null, uuid);

HttpServletResponse httpResponse = ThreadContextHolder.getHttpResponse();
//主域名
String main = domainHelper.getTopDomain();
String buyer = domainHelper.getBuyerDomain();
//如果是wap站点,需要跳转到wap对应的绑定页面或者是首页
if (StringUtil.isWap()) {
buyer = domainHelper.getMobileDomain();
}
String redirectUri = buyer + binder + "?uuid=" + uuid;
//如果会员存在则直接跳转到首页
if (memberVO != null) {
Cookie accessTokenCookie = new Cookie("access_token", memberVO.getAccessToken());
Cookie refreshTokenCookie = new Cookie("refresh_token", memberVO.getRefreshToken());
Cookie uidCookie = new Cookie("uid", StringUtil.toString(memberVO.getUid()));
accessTokenCookie.setDomain(main);
accessTokenCookie.setPath("/");
accessTokenCookie.setMaxAge(shoptntConfig.getAccessTokenTimeout());

refreshTokenCookie.setDomain(main);
refreshTokenCookie.setPath("/");
refreshTokenCookie.setMaxAge(shoptntConfig.getRefreshTokenTimeout());

uidCookie.setDomain(main);
uidCookie.setPath("/");
uidCookie.setMaxAge(shoptntConfig.getRefreshTokenTimeout());

httpResponse.addCookie(uidCookie);
httpResponse.addCookie(accessTokenCookie);
httpResponse.addCookie(refreshTokenCookie);
redirectUri = buyer + index + "?uuid=" + uuid;
}
//如果会员存在则登录此会员并将uuid及token信息存入cookie
Cookie cookie = new Cookie("uuid_connect", uuid);
cookie.setDomain(main);
cookie.setPath("/");
cookie.setMaxAge(shoptntConfig.getRefreshTokenTimeout());
httpResponse.addCookie(cookie);
//无会员则跳转至绑定页
httpResponse.sendRedirect(redirectUri);
return;
}

} catch (IOException e) {
this.logger.error(e.getMessage(), e);
throw new ServiceException(MemberErrorCode.E131.name(), "联合登录失败");
}
}

关于免登录以及登录时间,我们采用token鉴权的方式
详情请参考"基于Token机制鉴权架构"

相关表结构

会员与店铺

会员与店铺相关API
1.会员申请开店 ShopBuyerController
2.会员收藏店铺 MemberCollectionShopBuyerController

会员申请开店,共分为4步

请参考"店铺申请开店开发文档"

申请店铺并且在管理端审核通过之后
系统会修改es_member的have_shop和shop_id字段,将es_member和es_shop表关联
系统会在es_shop表中插入刚申请的店铺信息,此时该会员就拥有自己的店铺啦

会员收藏店铺

会员收藏店铺后
系统会将member_id和shop_id关联到es_member_collection_shop表

详情可参考 MemberCollectionShopBuyerController 会员收藏店铺表相关API

店铺表数据结构

店铺表(es_shop)

字段名类型备注是否索引
shop_idbigint(20)店铺Id
member_idbigint(20)会员Id
member_namevarchar(50)会员名称
shop_namevarchar(255)店铺名称
shop_disablevarchar(50)店铺状态
shop_createtimebigint(20)店铺创建时间
shop_endtimebigint(20)店铺关闭时间

会员与地址

与会员相关的有两个地址
1.会员信息中的地址 MemberManager.edit
2.会员收货地址 MemberAddressManager.add

会员信息中的地址

province_id 所属省份ID     city_id 所属城市ID
county_id 所属县(区)ID      town_id 所属城镇ID
这些地址是在会员中心编辑会员信息时添加的,存在于es_member表中

请参考"地区缓存架构"

会员收货地址

在提交订单页面添加的收货地址,存在于es_member_address表中

会员收货地址表数据结构

会员收货地址表(es_member_address)

字段名类型备注是否索引
addr_idbigint(20)主键ID
member_idbigint(20)会员ID
namevarchar(255)收货人姓名
countryvarchar(255)收货人国籍
province_idbigint(20)所属省份ID
city_idbigint(20)所属城市ID
county_idbigint(20)所属县(区)ID
town_idbigint(20)所属城镇ID
countyvarchar(255)所属县(区)名称
cityvarchar(255)所属城市名称
provincevarchar(255)所属省份名称
townvarchar(255)所属城镇名称
addrvarchar(255)详细地址
telvarchar(255)联系电话(座机)
mobilevarchar(255)手机号码
def_addrint(1)是否为默认收货地址
ship_address_namevarchar(255)地址别名

会员咨询表(es_member_ask)
会员发布商品咨询,系统会在es_member_ask表添加商品咨询信息
管理端进行审核,审核状态变更,会修改auth_status字段
审核通过后商家和会员可以进行回复,系统会修改reply,reply_num等字段

请参考"购买咨询架构文档"

字段名类型备注是否索引
ask_idbigint(20)主键ID
goods_idbigint(20)商品id
member_idbigint(20)会员id
contentlongtext咨询内容
create_timebigint(20)咨询时间
seller_idbigint(20)卖家id
replylongtext商家回复内容
reply_timebigint(20)商家回复时间
reply_statusvarchar(50)商家是否回复
statusvarchar(50)删除状态
member_namevarchar(100)咨询人名称
goods_namevarchar(255)会员头像
member_facevarchar(255)商品名称
auth_statusvarchar(50)审核状态
goods_imgvarchar(255)商品图片
anonymousvarchar(50)是否匿名
reply_numint(10)咨询回复数量

会员评论表(es_member_comment)
会员在购买商品并确认收货后可进行评论
在管理端审核通过后,评论内容会添加到es_member_comment表中
商家可以对评论进行回复,系统会修改表中的reply_status字段
管理端可以删除评论,系统会根据评论主键comment_id删除相关数据

请参考"会员评论架构"

字段名类型备注是否索引
comment_idbigint(20)评论主键
goods_idbigint(20)商品id
sku_idbigint(20skuid
member_idbigint(20)会员id
seller_idbigint(20卖家id
member_namevarchar(255)会员名称
member_facevarchar(255)会员头像
goods_namevarchar(255)商品名称
goods_imgvarchar(255)商品默认图片
contentlongtext评论内容
create_timebigint(20)评论时间
have_imagesmallint(1)是否有图片
statussmallint(1)状态
gradevarchar(50)好中差评
order_snvarchar(50)订单编号
reply_statussmallint(1)是否回复
audit_statusvarchar(255)初评审核
comments_typevarchar(255)评论类型
parent_idbigint(20)初评id

会员优惠券表(es_member_coupon)
商家中心和管理中心可发起平台优惠券,会员可进行领取
领取后系统会将数据存入es_member_coupon会员优惠券表中
通过used_status字段区分优惠券的4种状态,1:未使用 2:已使用,3已过期,4为不可用优惠券(已使用和已过期)

请参考"会员优惠券架构"

字段名类型备注是否索引
mc_idbigint(20)主键
coupon_idbigint(20)优惠券表主键
member_idbigint(20)会员表主键
used_timebigint(11)使用时间
create_timebigint(11)领取时间
order_idbigint(20)订单表主键
order_snvarchar(30)订单编号
member_namevarchar(30)会员用户名
titlevarchar(20)优惠券名称
coupon_pricedecimal(10)优惠券面额
coupon_threshold_pricedecimal(10)优惠券门槛金额
start_timebigint(20)有效期--起始时间
end_timebigint(20)有效期--截止时间
used_statussmallint(1)使用状态
seller_idbigint(20)商家ID
seller_namevarchar(50)商家名称
use_scopevarchar(20)使用范围
scope_idlongtext范围关联的id

会员预存款表(es_member_wallet)
会员预存款,也就是账户余额.详情可参考:MemberShopScoreManager

请参考"会员预存款架构"

字段名类型备注是否索引
idbigint(20)主键ID
member_idbigint(20)会员id
member_namevarchar(200)会员名称
pre_depositedecimal(20)会员预存款
deposite_passwordvarchar(50)预存款密码

会员积分表(es_member_point_history)
在管理端的系统设置中进行积分设置,通过可通过不同的方式获取积分
会员获取积分后,系统会将会员与积分的信息添加到es_member_point_history表中
会员可以在买家端使用积分购买积分商品

字段名类型备注是否索引
idbigint(20)主键ID
member_idbigint(20)会员ID
grade_pointbigint(20)等级积分
timebigint(20)操作时间
reasonvarchar(255)操作理由
grade_point_typeint(2)等级积分类型
operatorvarchar(255)操作者
consum_pointbigint(20)消费积分
consum_point_typeint(2)消费积分类型

会员站内消息历史表(es_member_notice_log)
管理中心可发布站内消息,类型为全站和指定会员
当发布指定会员的站内消息时,系统会将相关信息添加到es_member_notice_log表中

字段名类型备注是否索引
idbigint(20)主键
member_idbigint(20)会员id
contentlongtext站内信内容
send_timebigint(20)发送时间
is_delint(2)是否删除
is_readint(2)是否已读
receive_timebigint(20)接收时间
titlevarchar(20)标题

会员商品收藏表(es_member_collection_goods)
进入商品详情页,点击收藏商品,系统会将商品信息与会员ID添加到此表中
会员点击我的收藏-收藏的商品,系统会根据会员ID查询收藏的商品
如果会员删除某个收藏商品,系统会根据会员ID和收藏商品ID从表中删除这条数据

字段名类型备注是否索引
idbigint(20)主键ID
member_idbigint(20)会员ID
goods_idbigint(20)收藏商品ID
create_timebigint(20)收藏商品时间
goods_namevarchar(255)商品名称
goods_pricedecimal(20)商品价格
goods_snvarchar(255)商品编号
goods_imgvarchar(255)商品图片
shop_idbigint(20)店铺id

会员收藏店铺表(es_member_collection_shop)
进入商品详情页,点击右侧收藏店铺,系统会将店铺信息与会员ID添加到此表中
会员点击我的收藏-收藏的店铺,系统会根据会员ID查询收藏的店铺
如果会员删除某个收藏的店铺,系统会根据会员ID和店铺id从表中删除这条数据

字段名类型备注是否索引
idbigint(20)收藏id
member_idbigint(20)会员id
shop_idbigint(20)店铺id
shop_namevarchar(255)店铺名称
create_timebigint(20)收藏时间
logovarchar(255)店铺logo
shop_provincevarchar(255)店铺所在省
shop_cityvarchar(255)店铺所在市
shop_regionvarchar(255)店铺所在县
shop_townvarchar(255)店铺所在镇
shop_praise_ratedecimal(20)店铺好评率
shop_description_creditdecimal(20)店铺描述相符度
shop_service_creditdecimal(20)服务态度分数
shop_delivery_creditdecimal(20)发货速度分数

会员发票信息缓存表(es_member_receipt)
关于会员发票信息的增删改查等操作.详情可参考:MemberReceiptManager

字段名类型备注是否索引
receipt_idbigint(20)会员发票id
member_idbigint(20)会员id
receipt_typevarchar(50)发票类型
receipt_titlevarchar(255)发票抬头
receipt_contentvarchar(255)发票内容
tax_novarchar(100)发票税号
member_mobilevarchar(50)收票人手机号
member_emailvarchar(100)收票人邮箱
is_defaultsmallint(1)是否为默认选项

会员店铺评分表(es_member_shop_score)
会员确认收货后,去评论,里面有一个店铺评分.详情可参考:MemberShopScoreManager

字段名类型备注是否索引
score_idbigint(20)主键ID
member_idbigint(20)会员id
order_snvarchar(50)订单编号
delivery_scoresmallint(1)发货速度评分
description_scoresmallint(1)描述相符度评分
service_scoresmallint(1)服务评分
seller_idbigint(20)卖家

会员增票资质表(es_member_zpzz)
会员需要申请增票资质.详情可参考:MemberZpzzManager

字段名类型备注是否索引
idbigint(20)主键ID
member_idbigint(20)会员ID
unamevarchar(100)会员登陆用户名
statusvarchar(50)状态
company_namevarchar(255)单位名称
taxpayer_codevarchar(100)纳税人识别码
register_addressvarchar(255)公司注册地址
register_telvarchar(100)公司注册电话
bank_namevarchar(255)开户银行
bank_accountvarchar(100)银行账户
audit_remarkvarchar(255)平台审核备注
apply_timebigint(20)申请时间