巴青农资商城

会员管理技术方案.md 16KB

会员管理 — 技术方案

依据: 《会员管理功能需求.md》v1.0
关联: 《订单管理功能需求.md》v1.0.1、《商品管理功能需求.md》v1.3.3、《店铺管理功能需求.md》v1.3.2、《关联需求分析.md》v1.2
范围: 本文以 会员主数据、收货地址、平台端查询/启用订单只读聚合 为主;biz_order 由订单模块维护,本文给出 ER、Facade 契约与会员侧接口;C 端注册/登录接口单列 §4(与平台共用表)。
原则: 会员与 biz_merchant_account 分表;手机号 del_flag=0 唯一;消费统计 O11 与订单一致。


1. 技术架构

选型
基础框架 RuoYi v3.9.2springboot2 分支)
数据库 MySQL 5.7.39
ORM / 权限 / 响应 MyBatis;@PreAuthorizeAjaxResult / TableDataInfo
密码 C 端 SecurityUtils.encryptPassword(BCrypt);存于 sys_user.password
账号 sys_user 复用member_id = user_id;会员角色 role_key=member
脱敏 列表手机号中间 4 位 *(如 177****9136
日志 启用状态变更 @Log

1.1 模块落位

baqing-shop
├── com.ruoyi.web.controller.agri.MemberController          # 平台端
└── com.ruoyi.web.controller.api.MemberAppController       # C 端(注册/资料/地址,可选同模块分包)
ruoyi-agri
├── domain.BizMember / BizMemberAddress
├── service.IMemberService / IMemberAddressService
└── facade.MemberFacadeImpl → IMemberFacade

1.2 业务链

sys_user(账号:user_name/phonenumber/nick_name/password/avatar/status)
    └── biz_member(member_id = user_id;等级/消费统计/注册时间)
            ├── biz_member_address(1:N)
            │
            ├── IMemberFacade ──► 订单模块
            └── biz_order.member_id
字段映射 sys_user biz_member(业务层别名)
主键 user_id member_id
手机号 phonenumber mobile
会员名称 user_name memberCode
昵称 nick_name nickName
密码 password password
头像 avatar avatar
状态 status(0正常 1停用) status

注册(事务): insertUser(角色 member)→ insert biz_membermember_id = userId)。

模块 表/职责
会员(本文) biz_memberbiz_member_address;平台列表/详情/启用
订单管理 v1.0 biz_order 等;履约写操作;向会员回写消费汇总
商户/店铺/商品 无会员表;经营账号 不关联 member_id

1.3 跨模块 Facade

接口 提供方 调用方 方法
IMemberFacade 本模块 订单、C 端下单 getMemberisMemberEnabledexistsByMobilerefreshConsumption
IOrderFacade 订单 本模块 pageOrdersByMembergetOrderDetailhasUnfinishedOrdersByShop/Merchant(见《订单管理技术方案》§1.3)

订单未实现前:pageOrdersByMember 可桩返回空页;实现后以《订单管理技术方案》为准。

消费统计(O11)实现二选一(推荐 A):

方案 说明
A 冗余字段 biz_member.order_counttotal_amount;订单 已完成 时订单模块调用 IMemberFacade.refreshConsumption(memberId) 同事务
B 实时聚合 列表/详情每次 SUM biz_order;数据量大时再改 A

1.4 状态联动

事件 biz_member biz_order 商户/店铺
禁用会员 status=1 不变(M15) 不变
订单已完成 刷新 order_count/total_amount 状态→已完成
商户冻结/店停业 不变 仅禁 下单 各模块规则

2. 数据库设计

2.1 本模块表

表名 说明
biz_member C 端买家主档
biz_member_address 收货地址簿

2.2 关联表(订单模块,ER 引用)

表名 说明
biz_order member_id FK;DDL 见《订单管理技术方案.md》v1.0

2.3 biz_member + sys_user

权威 DDL:sql/biz_member.sql。账号列在 sys_user;查询通过 biz_member JOIN sys_user

biz_member(扩展表)

字段 类型 说明
member_id bigint PK = sys_user.user_id(非自增)
member_level tinyint 选填;字典 biz_member_level
order_count int 已完成订单笔数
total_amount decimal(12,2) 已完成实付合计
register_time datetime 注册时间
create_by/time, update_by/time, remark 审计

sys_user(账号,注册时写入)

字段 说明
user_name 会员名称(C 端可随机生成)
nick_name 昵称
phonenumber 手机号;del_flag=0 唯一
password BCrypt
avatar 头像 URL
status 0 启用 1 禁用
角色 注册时分配 role_key=member

2.4 biz_member_address

字段 类型 说明
address_id bigint PK
member_id bigint FK
consignee_name varchar(64) 收货人
mobile varchar(20) 联系电话
province varchar(32)
city varchar(32)
district varchar(32)
detail_address varchar(256) 详细地址
is_default char(1) 0 否 1 是;每会员至多一条默认
del_flag char(1) 0 存在 2 删除
create_time, update_time

2.5 索引

索引 字段
biz_member PRIMARY member_id
uk_mobile mobile, del_flag(或应用层 mobile WHERE del_flag=0)
idx_register register_time DESC
idx_status status, del_flag
biz_member_address PRIMARY address_id
idx_member member_id, del_flag

2.6 DDL

CREATE TABLE `biz_member` (
  `member_id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '会员ID',
  `mobile` varchar(20) NOT NULL COMMENT '手机号',
  `member_code` varchar(64) NOT NULL DEFAULT '' COMMENT '会员名称',
  `nick_name` varchar(64) NOT NULL DEFAULT '' COMMENT '昵称',
  `password` varchar(100) NOT NULL COMMENT '密码BCrypt',
  `member_level` tinyint(4) DEFAULT NULL COMMENT '会员等级(字典 biz_member_level,选填)',
  `status` char(1) NOT NULL DEFAULT '0' COMMENT '0启用1禁用',
  `order_count` int(11) NOT NULL DEFAULT '0' COMMENT '已完成订单笔数',
  `total_amount` decimal(12,2) NOT NULL DEFAULT '0.00' COMMENT '已完成实付合计',
  `register_time` datetime NOT NULL COMMENT '注册时间',
  `avatar` varchar(512) DEFAULT NULL COMMENT '头像URL',
  `del_flag` char(1) NOT NULL DEFAULT '0' COMMENT '0存在2删除',
  `create_by` varchar(64) DEFAULT '',
  `create_time` datetime DEFAULT NULL,
  `update_by` varchar(64) DEFAULT '',
  `update_time` datetime DEFAULT NULL,
  `remark` varchar(500) DEFAULT NULL,
  PRIMARY KEY (`member_id`),
  KEY `idx_register` (`register_time`),
  KEY `idx_status` (`status`,`del_flag`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='C端会员';

CREATE TABLE `biz_member_address` (
  `address_id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '地址ID',
  `member_id` bigint(20) NOT NULL COMMENT '会员ID',
  `consignee_name` varchar(64) NOT NULL COMMENT '收货人',
  `mobile` varchar(20) NOT NULL COMMENT '联系电话',
  `province` varchar(32) NOT NULL DEFAULT '',
  `city` varchar(32) NOT NULL DEFAULT '',
  `district` varchar(32) NOT NULL DEFAULT '',
  `detail_address` varchar(256) NOT NULL COMMENT '详细地址',
  `is_default` char(1) NOT NULL DEFAULT '0' COMMENT '0否1默认',
  `del_flag` char(1) NOT NULL DEFAULT '0' COMMENT '0存在2删除',
  `create_time` datetime DEFAULT NULL,
  `update_time` datetime DEFAULT NULL,
  PRIMARY KEY (`address_id`),
  KEY `idx_member` (`member_id`,`del_flag`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='会员收货地址';

唯一约束(应用层): mobiledel_flag='0' 时不可重复(M2)。

2.7 字典

dict_type 用途
biz_member_status status:0 启用 / 1 禁用
biz_member_level member_level(tinyint;如 0=普通;选填)

3. 平台端接口设计

基路径: /agri/member
权限前缀: agri:member

3.1 接口一览

方法 路径 权限 说明
GET /list list 会员分页列表
POST / add 平台添加会员(无需短信验证码)
GET /{memberId} query 会员详情(基本 + 地址列表)
PUT /{memberId}/status edit 启用/禁用
GET /{memberId}/orders query 该会员订单分页(只读
GET /{memberId}/orders/{orderId} query 订单详情(只读;校验 member_id

不提供 导入、改等级、余额积分(需求 §13)。

3.2a 新增 POST /

Body 说明
mobile 必填;11 位手机号
password 必填;BCrypt 入库
memberCode 选填;sys_user.user_name;未填则 8 位随机
nickName 选填;未填同会员名称
memberLevel 选填
status 选填;默认 0 启用
remark 选填

流程: 同事务 insertUser(角色 member)→ insert biz_membermember_id=user_id)。
成功: 返回 memberId

3.2 列表 GET /list

Query 说明
pageNum, pageSize 分页
keyword 可选;会员名称、昵称或手机号 模糊(M11)
status 可选;0/1

过滤: del_flag='0';且 sys_user 须拥有 会员角色 role_key=member(排除仅平台/商户角色账号)。
排序: 默认 register_time DESC(可扩展 orderBy=total_amount)。

rows:

字段 说明
memberId, memberCode, nickName memberCode 为会员名称
mobile 脱敏
memberLevel, memberLevelLabel memberLevel 为 tinyint 字典值,可空;label 为展示文案
status, statusLabel 字典
orderCount, totalAmount 来自冗余字段(与 O11 一致)
registerTime

3.3 详情 GET /{memberId}

{
  "memberId": 1,
  "memberCode": "用户A",
  "nickName": "用户A",
  "mobile": "17712349136",
  "memberLevel": null,
  "status": "0",
  "orderCount": 3,
  "totalAmount": 1280.50,
  "registerTime": "2026-05-01 10:00:00",
  "addressList": [
    {
      "addressId": 10,
      "consigneeName": "张三",
      "mobile": "17712349136",
      "province": "西藏自治区",
      "city": "那曲市",
      "district": "比如县",
      "detailAddress": "某某路1号",
      "isDefault": "1",
      "fullAddress": "西藏自治区那曲市比如县某某路1号"
    }
  ]
}
规则 说明
不存在 code!=200msg 会员不存在
手机号 平台 query 权限可看完整号(需求 §10 权限)

3.4 启用/禁用 PUT /{memberId}/status

{ "status": "1" }
校验 说明
status 0 / 1
禁用 记操作日志; 调订单关闭

3.5 会员订单列表 GET /{memberId}/orders

委托 IOrderFacade.pageOrdersByMember;Query 对齐需求 §6.3:

Query 说明
pageNum, pageSize
orderNo 订单编号
goodsName 商品名称
payType, payStatus 支付
shipStatus 发货/订单履约状态
consigneeName, consigneeMobile, address 收货
logisticsCompany 物流公司
beginTime, endTime 下单时间

rows: 与《订单管理》列表字段对齐子集;operateType=readonly(前端隐藏发货/关闭按钮,M6)。

3.6 会员订单详情 GET /{memberId}/orders/{orderId}

  • 校验 biz_order.member_id = memberId,否则 403/业务异常。
  • 含商品明细、物流节点时间轴; 写操作字段。

3.7 错误码(业务 msg 示例)

场景 msg
会员不存在 会员不存在
订单不属于该会员 无权查看该订单
禁用成功 操作成功

统一包装:AjaxResult / TableDataInfocodemsgdata/rows/total)。


4. C 端接口(共用表 · 占位)

功能需求平台侧不写 C 端页面;实现会员数据须下列接口(路径可统一 /api/member匿名 + 会员 Token 与 RuoYi 分离)。

方法 路径 说明
POST /api/member/sms/send 发送验证码(限流)
POST /api/member/register 手机号+验证码+密码 → 写 biz_member
POST /api/member/login 手机号+密码;校验 status=0
GET /api/member/profile 当前会员资料
PUT /api/member/profile 改会员名称(memberCode)、昵称、头像等
GET /api/member/address/list 地址列表
POST/PUT/DELETE /api/member/address 地址 CRUD;设默认
规则 说明
M2 注册时 existsByMobile
M4 status=1 禁止登录/下单
M7 校验 biz_merchant_account.login_name

5. 与订单模块协作

5.1 biz_order 最小字段(订单方案待建时约定)

字段 说明
order_id, order_no
member_id 关联本表
shop_id
order_status 与订单 O3 一致
pay_amount 实付;统计 O11
明细、物流另表

5.2 消费汇总刷新(O11)

订单状态 → 已完成
    → IOrderFacade 内或监听
    → IMemberFacade.refreshConsumption(memberId)
    → UPDATE biz_member SET order_count=?, total_amount=?
          WHERE 统计条件 status=已完成 AND del_flag=0

refreshConsumption 建议 按 member_id 重算(避免并发漏加):

SELECT COUNT(1), IFNULL(SUM(pay_amount),0)
FROM biz_order
WHERE member_id = #{memberId} AND order_status = '已完成' AND del_flag = '0'

5.3 会员订单只读

平台 会员管理订单管理 共用 IOrderFacade.getOrderDetail;会员 Controller 禁止 暴露发货/关闭 URL(M6)。


6. 菜单与权限(RuoYi)

菜单 权限标识
会员管理 agri:member:list
添加会员 agri:member:add
查看详情 agri:member:query
启用/禁用 agri:member:edit

订单只读挂在 query;不写 agri:member:remove(本期无删会员需求,逻辑删除预留)。


7. 非本期(库表/接口不建)

说明
余额、积分、标签、导入、平台添加会员 需求 §13
商家端查会员 不做
会员等级自动升级 member_level 展示

8. 源文档对照

需求规则 技术落点
M1~M3 买家、只读订单 §1.2、§3.5~3.6
M2 手机号唯一 biz_member.mobile + 应用校验
M4 启用 status + IMemberFacade.isMemberEnabled
M5/O11 消费统计 order_count/total_amount + §5.2
M6 订单不写 无发货类接口
M7 与经营账号隔离 分表、无 FK
M9 订单仅当前会员 member_id 强制过滤
M11 检索 keyword 匹配 member_code / nick_name / mobile
M12 订单检索 §3.5 Query
M14 地址只读(平台) 详情 addressList;C 端 §4 维护

文档版本:v1.0.1 · MySQL 5.7.39 · RuoYi v3.9.2-springboot2 · v1.0.1:biz_member.member_code(会员名称)· 关联《会员管理功能需求.md》v1.0.1、《会员管理测试用例.md》v1.0、《订单管理功能需求.md》v1.0.1、《订单管理技术方案.md》v1.0、《关联需求分析.md》v1.2