会员相关核心逻辑说明
功能说明
1.登录买家端,可进行会员注册,填写会员账号密码等信息.
2.会员登录,基于token进行鉴权验权实现登录功能.
3.个人信息修改,可设置性别,生日,地址等信息.
4.会员购买商品下订单等流程操作.
数据库设计
表结构展示
会员表(es_member)
字段名 | 类型 | 备注 | 是否索引 |
---|---|---|---|
member_id | bigint(20) | 会员ID | 是 |
uname | varchar(255) | 会员登录用户名 | 是 |
varchar(255) | 邮箱 | 是 | |
password | varchar(255) | 会员登录密码 | 否 |
create_time | bigint(20) | 会员注册时间 | 否 |
sex | int(1) | 会员性别 | 否 |
birthday | bigint(20) | 会员生日 | 否 |
province_id | bigint(20) | 所属省份ID | 否 |
city_id | bigint(20) | 所属城市ID | 否 |
county_id | bigint(20) | 所属县(区)ID | 否 |
town_id | bigint(20) | 所属城镇ID | 否 |
province | varchar(255) | 所属省份名称 | 否 |
city | varchar(255) | 所属城市名称 | 否 |
county | varchar(255) | 所属县(区)名称 | 否 |
town | varchar(255) | 所属城镇名称 | 否 |
address | varchar(255) | 详细地址 | 否 |
mobile | varchar(255) | 手机号码 | 否 |
tel | varchar(255) | 座机号码 | 否 |
grade_point | bigint(20) | 等级积分 | 否 |
msn | varchar(255) | 会员MSN | 否 |
remark | varchar(255) | 会员备注 | 否 |
last_login | bigint(20) | 上次登录时间 | 否 |
login_count | int(10) | 登录次数 | 否 |
is_cheked | int(1) | 邮件是否已验证 | 否 |
register_ip | varchar(255) | 注册IP地址 | 否 |
recommend_point_state | int(10) | 是否已经完成了推荐积分 | 否 |
info_full | int(1) | 会员信息是否完善 | 否 |
find_code | varchar(255) | find_code | 否 |
face | varchar(255) | 会员头像 | 否 |
midentity | int(10) | 身份证号 | 否 |
disabled | int(8) | 会员状态 | 否 |
shop_id | bigint(20) | 店铺ID | 是 |
have_shop | int(1) | 是否开通店铺 | 是 |
consum_point | bigint(20) | 消费积分 | 否 |
nickname | varchar(255) | 昵称 | 否 |
此表为会员信息的核心数据表 从注册会员到完善信息的相关数据都保存在此表中
代码展示
登录方式有三种:
1.账号密码登录
用户点击登录,输入账号密码,系统会根据用户名进入es_member表查询会员信息
2.手机号登录
用户点击登录,输入手机号和验证码,系统会根据手机号进入es_member表查询会员信息
关于以上两种登录方式,详情可参考:
cn.shoptnt.api.buyer.passport.PassportLoginBuyerController3.第三方信任登录
关于第三方登录,我们对接了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_id | bigint(20) | 店铺Id | 是 |
member_id | bigint(20) | 会员Id | 是 |
member_name | varchar(50) | 会员名称 | 否 |
shop_name | varchar(255) | 店铺名称 | 否 |
shop_disable | varchar(50) | 店铺状态 | 否 |
shop_createtime | bigint(20) | 店铺创建时间 | 否 |
shop_endtime | bigint(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_id | bigint(20) | 主键ID | 是 |
member_id | bigint(20) | 会员ID | 是 |
name | varchar(255) | 收货人姓名 | 否 |
country | varchar(255) | 收货人国籍 | 否 |
province_id | bigint(20) | 所属省份ID | 否 |
city_id | bigint(20) | 所属城市ID | 否 |
county_id | bigint(20) | 所属县(区)ID | 否 |
town_id | bigint(20) | 所属城镇ID | 否 |
county | varchar(255) | 所属县(区)名称 | 否 |
city | varchar(255) | 所属城市名称 | 否 |
province | varchar(255) | 所属省份名称 | 否 |
town | varchar(255) | 所属城镇名称 | 否 |
addr | varchar(255) | 详细地址 | 否 |
tel | varchar(255) | 联系电话(座机) | 否 |
mobile | varchar(255) | 手机号码 | 否 |
def_addr | int(1) | 是否为默认收货地址 | 是 |
ship_address_name | varchar(255) | 地址别名 | 否 |
会员咨询表(es_member_ask)
会员发布商品咨询,系统会在es_member_ask表添加商品咨询信息
管理端进行审核,审核状态变更,会修改auth_status字段
审核通过后商家和会员可以进行回复,系统会修改reply,reply_num等字段
请参考"购买咨询架构文档"
字段名 | 类型 | 备注 | 是否索引 |
---|---|---|---|
ask_id | bigint(20) | 主键ID | 是 |
goods_id | bigint(20) | 商品id | 是 |
member_id | bigint(20) | 会员id | 是 |
content | longtext | 咨询内容 | 否 |
create_time | bigint(20) | 咨询时间 | 否 |
seller_id | bigint(20) | 卖家id | 是 |
reply | longtext | 商家回复内容 | 否 |
reply_time | bigint(20) | 商家回复时间 | 否 |
reply_status | varchar(50) | 商家是否回复 | 否 |
status | varchar(50) | 删除状态 | 否 |
member_name | varchar(100) | 咨询人名称 | 否 |
goods_name | varchar(255) | 会员头像 | 否 |
member_face | varchar(255) | 商品名称 | 否 |
auth_status | varchar(50) | 审核状态 | 否 |
goods_img | varchar(255) | 商品图片 | 否 |
anonymous | varchar(50) | 是否匿名 | 否 |
reply_num | int(10) | 咨询回复数量 | 否 |
会员评论表(es_member_comment)
会员在购买商品并确认收货后可进行评论
在管理端审核通过后,评论内容会添加到es_member_comment表中
商家可以对评论进行回复,系统会修改表中的reply_status字段
管理端可以删除评论,系统会根据评论主键comment_id删除相关数据
请参考"会员评论架构"
字段名 | 类型 | 备注 | 是否索引 |
---|---|---|---|
comment_id | bigint(20) | 评论主键 | 是 |
goods_id | bigint(20) | 商品id | 是 |
sku_id | bigint(20 | skuid | 是 |
member_id | bigint(20) | 会员id | 是 |
seller_id | bigint(20 | 卖家id | 是 |
member_name | varchar(255) | 会员名称 | 否 |
member_face | varchar(255) | 会员头像 | 否 |
goods_name | varchar(255) | 商品名称 | 否 |
goods_img | varchar(255) | 商品默认图片 | 否 |
content | longtext | 评论内容 | 否 |
create_time | bigint(20) | 评论时间 | 否 |
have_image | smallint(1) | 是否有图片 | 否 |
status | smallint(1) | 状态 | 否 |
grade | varchar(50) | 好中差评 | 否 |
order_sn | varchar(50) | 订单编号 | 否 |
reply_status | smallint(1) | 是否回复 | 否 |
audit_status | varchar(255) | 初评审核 | 否 |
comments_type | varchar(255) | 评论类型 | 否 |
parent_id | bigint(20) | 初评id | 否 |
会员优惠券表(es_member_coupon)
商家中心和管理中心可发起平台优惠券,会员可进行领取
领取后系统会将数据存入es_member_coupon会员优惠券表中
通过used_status字段区分优惠券的4种状态,1:未使用 2:已使用,3已过期,4为不可用优惠券(已使用和已过期)
请参考"会员优惠券架构"
字段名 | 类型 | 备注 | 是否索引 |
---|---|---|---|
mc_id | bigint(20) | 主键 | 是 |
coupon_id | bigint(20) | 优惠券表主键 | 是 |
member_id | bigint(20) | 会员表主键 | 是 |
used_time | bigint(11) | 使用时间 | 否 |
create_time | bigint(11) | 领取时间 | 否 |
order_id | bigint(20) | 订单表主键 | 是 |
order_sn | varchar(30) | 订单编号 | 是 |
member_name | varchar(30) | 会员用户名 | 否 |
title | varchar(20) | 优惠券名称 | 否 |
coupon_price | decimal(10) | 优惠券面额 | 否 |
coupon_threshold_price | decimal(10) | 优惠券门槛金额 | 否 |
start_time | bigint(20) | 有效期--起始时间 | 否 |
end_time | bigint(20) | 有效期--截止时间 | 否 |
used_status | smallint(1) | 使用状态 | 否 |
seller_id | bigint(20) | 商家ID | 否 |
seller_name | varchar(50) | 商家名称 | 否 |
use_scope | varchar(20) | 使用范围 | 否 |
scope_id | longtext | 范围关联的id | 否 |
会员预存款表(es_member_wallet)
会员预存款,也就是账户余额.详情可参考:MemberShopScoreManager
请参考"会员预存款架构"
字段名 | 类型 | 备注 | 是否索引 |
---|---|---|---|
id | bigint(20) | 主键ID | 是 |
member_id | bigint(20) | 会员id | 是 |
member_name | varchar(200) | 会员名称 | 否 |
pre_deposite | decimal(20) | 会员预存款 | 否 |
deposite_password | varchar(50) | 预存款密码 | 否 |
会员积分表(es_member_point_history)
在管理端的系统设置中进行积分设置,通过可通过不同的方式获取积分
会员获取积分后,系统会将会员与积分的信息添加到es_member_point_history表中
会员可以在买家端使用积分购买积分商品
字段名 | 类型 | 备注 | 是否索引 |
---|---|---|---|
id | bigint(20) | 主键ID | 是 |
member_id | bigint(20) | 会员ID | 是 |
grade_point | bigint(20) | 等级积分 | 否 |
time | bigint(20) | 操作时间 | 否 |
reason | varchar(255) | 操作理由 | 否 |
grade_point_type | int(2) | 等级积分类型 | 是 |
operator | varchar(255) | 操作者 | 否 |
consum_point | bigint(20) | 消费积分 | 否 |
consum_point_type | int(2) | 消费积分类型 | 是 |
会员站内消息历史表(es_member_notice_log)
管理中心可发布站内消息,类型为全站和指定会员
当发布指定会员的站内消息时,系统会将相关信息添加到es_member_notice_log表中
字段名 | 类型 | 备注 | 是否索引 |
---|---|---|---|
id | bigint(20) | 主键 | 是 |
member_id | bigint(20) | 会员id | 是 |
content | longtext | 站内信内容 | 否 |
send_time | bigint(20) | 发送时间 | 否 |
is_del | int(2) | 是否删除 | 否 |
is_read | int(2) | 是否已读 | 否 |
receive_time | bigint(20) | 接收时间 | 否 |
title | varchar(20) | 标题 | 否 |
会员商品收藏表(es_member_collection_goods)
进入商品详情页,点击收藏商品,系统会将商品信息与会员ID添加到此表中
会员点击我的收藏-收藏的商品,系统会根据会员ID查询收藏的商品
如果会员删除某个收藏商品,系统会根据会员ID和收藏商品ID从表中删除这条数据
字段名 | 类型 | 备注 | 是否索引 |
---|---|---|---|
id | bigint(20) | 主键ID | 是 |
member_id | bigint(20) | 会员ID | 是 |
goods_id | bigint(20) | 收藏商品ID | 是 |
create_time | bigint(20) | 收藏商品时间 | 否 |
goods_name | varchar(255) | 商品名称 | 否 |
goods_price | decimal(20) | 商品价格 | 否 |
goods_sn | varchar(255) | 商品编号 | 是 |
goods_img | varchar(255) | 商品图片 | 否 |
shop_id | bigint(20) | 店铺id | 是 |
会员收藏店铺表(es_member_collection_shop)
进入商品详情页,点击右侧收藏店铺,系统会将店铺信息与会员ID添加到此表中
会员点击我的收藏-收藏的店铺,系统会根据会员ID查询收藏的店铺
如果会员删除某个收藏的店铺,系统会根据会员ID和店铺id从表中删除这条数据
字段名 | 类型 | 备注 | 是否索引 |
---|---|---|---|
id | bigint(20) | 收藏id | 是 |
member_id | bigint(20) | 会员id | 是 |
shop_id | bigint(20) | 店铺id | 是 |
shop_name | varchar(255) | 店铺名称 | 否 |
create_time | bigint(20) | 收藏时间 | 否 |
logo | varchar(255) | 店铺logo | 否 |
shop_province | varchar(255) | 店铺所在省 | 否 |
shop_city | varchar(255) | 店铺所在市 | 否 |
shop_region | varchar(255) | 店铺所在县 | 否 |
shop_town | varchar(255) | 店铺所在镇 | 否 |
shop_praise_rate | decimal(20) | 店铺好评率 | 否 |
shop_description_credit | decimal(20) | 店铺描述相符度 | 否 |
shop_service_credit | decimal(20) | 服务态度分数 | 否 |
shop_delivery_credit | decimal(20) | 发货速度分数 | 否 |
会员发票信息缓存表(es_member_receipt)
关于会员发票信息的增删改查等操作.详情可参考:MemberReceiptManager
字段名 | 类型 | 备注 | 是否索引 |
---|---|---|---|
receipt_id | bigint(20) | 会员发票id | 是 |
member_id | bigint(20) | 会员id | 否 |
receipt_type | varchar(50) | 发票类型 | 是 |
receipt_title | varchar(255) | 发票抬头 | 否 |
receipt_content | varchar(255) | 发票内容 | 否 |
tax_no | varchar(100) | 发票税号 | 否 |
member_mobile | varchar(50) | 收票人手机号 | 否 |
member_email | varchar(100) | 收票人邮箱 | 否 |
is_default | smallint(1) | 是否为默认选项 | 否 |
会员店铺评分表(es_member_shop_score)
会员确认收货后,去评论,里面有一个店铺评分.详情可参考:MemberShopScoreManager
字段名 | 类型 | 备注 | 是否索引 |
---|---|---|---|
score_id | bigint(20) | 主键ID | 是 |
member_id | bigint(20) | 会员id | 是 |
order_sn | varchar(50) | 订单编号 | 是 |
delivery_score | smallint(1) | 发货速度评分 | 否 |
description_score | smallint(1) | 描述相符度评分 | 否 |
service_score | smallint(1) | 服务评分 | 否 |
seller_id | bigint(20) | 卖家 | 是 |
会员增票资质表(es_member_zpzz)
会员需要申请增票资质.详情可参考:MemberZpzzManager
字段名 | 类型 | 备注 | 是否索引 |
---|---|---|---|
id | bigint(20) | 主键ID | 是 |
member_id | bigint(20) | 会员ID | 是 |
uname | varchar(100) | 会员登陆用户名 | 是 |
status | varchar(50) | 状态 | 否 |
company_name | varchar(255) | 单位名称 | 否 |
taxpayer_code | varchar(100) | 纳税人识别码 | 否 |
register_address | varchar(255) | 公司注册地址 | 否 |
register_tel | varchar(100) | 公司注册电话 | 否 |
bank_name | varchar(255) | 开户银行 | 否 |
bank_account | varchar(100) | 银行账户 | 否 |
audit_remark | varchar(255) | 平台审核备注 | 否 |
apply_time | bigint(20) | 申请时间 | 否 |