会员相关核心逻辑说明
功能说明
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) | 申请时间 | 否 |