本模块提供商户用户信息修改功能,支持修改昵称、姓名、身份证号、账号简介、头像等个人信息。接口采用部分更新策略,只更新提供的非空字段。
POST /merchantUser/updateMerchantUserInfo@LoginRequired 注解)| 参数名 | 类型 | 必填 | 说明 | 示例值 |
|---|---|---|---|---|
| id | Integer | 是 | 用户ID | 12345 |
| nickName | String | 否 | 昵称 | "小明的店铺" |
| name | String | 否 | 真实姓名 | "张三" |
| idCard | String | 否 | 身份证号 | "110101199001011234" |
| accountBlurb | String | 否 | 账号简介 | "专业提供优质服务" |
| headImg | String | 否 | 头像URL | "https://example.com/avatar.jpg" |
注意:
id 字段必须提供POST /merchantUser/updateMerchantUserInfo
Content-Type: application/json
Authorization: Bearer YOUR_TOKEN
{
"id": 12345,
"nickName": "小明的店铺",
"headImg": "https://example.com/avatar.jpg"
}
curl -X POST "http://localhost:8080/merchantUser/updateMerchantUserInfo" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer YOUR_TOKEN" \
-d '{
"id": 12345,
"nickName": "小明的店铺",
"headImg": "https://example.com/avatar.jpg"
}'
{
"id": 12345,
"name": "张三",
"idCard": "110101199001011234"
}
{
"id": 12345,
"accountBlurb": "专业提供优质服务,欢迎光临"
}
{
"id": 12345,
"nickName": "小明的店铺",
"name": "张三",
"idCard": "110101199001011234",
"accountBlurb": "专业提供优质服务",
"headImg": "https://example.com/avatar.jpg"
}
{
"code": 200,
"success": true,
"data": true,
"msg": "修改成功"
}
| 字段名 | 类型 | 说明 |
|---|---|---|
| code | Integer | 状态码, 200表示成功 |
| success | Boolean | 是否成功 |
| data | Boolean | 修改结果, true表示成功 |
| msg | String | 提示信息 |
{
"code": 500,
"success": false,
"data": null,
"msg": "修改失败:用户ID不能为空"
}
{
"code": 500,
"success": false,
"data": false,
"msg": "修改失败"
}
{
"code": 500,
"success": false,
"data": null,
"msg": "请先登录"
}
{
"code": 500,
"success": false,
"data": null,
"msg": "修改失败:{异常信息}"
}
┌─────────────────────────────────────────────┐
│ 1. 接收请求参数 │
│ StoreUser对象(包含id和待更新字段) │
└─────────────────┬───────────────────────────┘
↓
┌─────────────────────────────────────────────┐
│ 2. 登录验证(AOP切面) │
│ - 验证Token │
│ - 验证用户类型 │
└─────────────────┬───────────────────────────┘
↓
┌─────────────────────────────────────────────┐
│ 3. 参数验证 │
│ 检查用户ID是否为空 │
└─────────────────┬───────────────────────────┘
↓
┌─────────────────────────────────────────────┐
│ 4. 构建更新对象 │
│ 创建新的StoreUser对象 │
│ 设置id字段 │
└─────────────────┬───────────────────────────┘
↓
┌─────────────────────────────────────────────┐
│ 5. 部分字段更新逻辑 │
│ IF nickName != null AND nickName != "" │
│ THEN 设置nickName │
│ IF name != null AND name != "" │
│ THEN 设置name │
│ IF idCard != null AND idCard != "" │
│ THEN 设置idCard │
│ IF accountBlurb != null AND accountBlurb != ""│
│ THEN 设置accountBlurb │
│ IF headImg != null AND headImg != "" │
│ THEN 设置headImg │
└─────────────────┬───────────────────────────┘
↓
┌─────────────────────────────────────────────┐
│ 6. 执行数据库更新 │
│ storeUserMapper.updateById(storeUser) │
└─────────────────┬───────────────────────────┘
↓
┌─────────────────────────────────────────────┐
│ 7. 返回结果 │
│ updateResult > 0 → 成功 │
│ updateResult = 0 → 失败 │
└─────────────────────────────────────────────┘
接口采用部分更新(Partial Update)策略:
只更新提供的字段:
空字符串处理:
"" 被视为无效值,不会更新数据库StringUtils.isNotEmpty() 进行判断Null值处理:
null 值的字段不会被更新更新SQL:
UPDATE store_user
SET
nick_name = ? (如果提供),
name = ? (如果提供),
id_card = ? (如果提供),
account_blurb = ? (如果提供),
head_img = ? (如果提供)
WHERE id = ?
说明:
updateById 方法背景: 用户刚注册,需要完善个人信息
请求:
{
"id": 12345,
"nickName": "小明的店铺",
"name": "张三",
"idCard": "110101199001011234",
"accountBlurb": "专业提供优质服务"
}
预期:
背景: 用户只想更换头像
请求:
{
"id": 12345,
"headImg": "https://example.com/new_avatar.jpg"
}
预期:
headImg 字段被更新背景: 用户想要更改显示昵称
请求:
{
"id": 12345,
"nickName": "新店铺名称"
}
预期:
nickName 字段被更新背景: 用户一次性修改多个信息
请求:
{
"id": 12345,
"nickName": "小明的优质店铺",
"accountBlurb": "专业提供优质服务,欢迎光临",
"headImg": "https://example.com/avatar.jpg"
}
预期:
背景: 提供的用户ID在数据库中不存在
请求:
{
"id": 999999,
"nickName": "测试店铺"
}
预期:
背景: 请求中没有提供用户ID
请求:
{
"nickName": "测试店铺"
}
预期:
接口使用 @LoginRequired 注解进行登录验证:
storePlatform建议:
建议:
身份证号:
接口记录了详细的日志信息:
// INFO级别 - 请求日志
log.info("MerchantUserController.updateMerchantUserInfo?storeUser={}", storeUser);
// INFO级别 - 业务开始
log.info("MerchantUserServiceImpl.updateMerchantUserInfo - 开始修改商户用户信息: userId={}", userId);
// DEBUG级别 - 字段更新
log.debug("MerchantUserServiceImpl.updateMerchantUserInfo - 更新昵称: {}", nickName);
// INFO级别 - 业务完成
log.info("MerchantUserServiceImpl.updateMerchantUserInfo - 修改完成: userId={}, success={}", userId, success);
// ERROR级别 - 异常日志
log.error("MerchantUserController.updateMerchantUserInfo ERROR: {}", e.getMessage(), e);
建议对敏感字段进行脱敏:
// 身份证号脱敏
String maskedIdCard = idCard.replaceAll("(\\d{6})\\d{8}(\\d{4})", "$1********$2");
log.debug("更新身份证号: {}", maskedIdCard); // 110101********1234
| 异常情况 | HTTP状态码 | 返回code | 返回msg |
|---|---|---|---|
| 用户ID为空 | 200 | 500 | "修改失败:用户ID不能为空" |
| 数据库更新失败 | 200 | 500 | "修改失败" |
| 未登录 | 200 | 500 | "请先登录" |
| 系统异常 | 200 | 500 | "修改失败:{异常信息}" |
前置条件:
请求:
{
"id": 12345,
"nickName": "新昵称"
}
预期结果:
{"success": true, "msg": "修改成功"}nick_name 字段被更新请求:
{
"id": 12345,
"nickName": "新昵称",
"name": "新姓名",
"headImg": "https://example.com/new.jpg"
}
预期结果:
请求:
{
"id": 999999,
"nickName": "测试"
}
预期结果:
{"success": false, "msg": "修改失败"}请求:
{
"nickName": "测试"
}
预期结果:
{"success": false, "msg": "修改失败:用户ID不能为空"}前置条件:
预期结果:
{"success": false, "msg": "请先登录"}请求:
{
"id": 12345,
"nickName": "",
"name": "张三"
}
预期结果:
nickName 不会被更新(空字符串被忽略)name 会被更新为 "张三"确保 store_user 表的主键有索引:
-- 主键索引(通常自动创建)
ALTER TABLE store_user ADD PRIMARY KEY (id);
updateById 方法(基于主键更新,性能高)如果用户信息频繁读取,建议:
缓存Key: store:user:{userId}
// 伪代码示例
@Override
public boolean updateMerchantUserInfo(StoreUser storeUser) {
boolean success = storeUserMapper.updateById(storeUser);
if (success) {
// 清除缓存
redisTemplate.delete("store:user:" + storeUser.getId());
}
return success;
}
"" 不会更新数据库id 字段必须提供建议在前端和后端都进行字段长度验证:
在高并发场景下,可能需要考虑:
alien-store/alienStore/store/user/setUserInfoStoreUserControllerStoreUserService.setUserInfo()alien-store-platform/merchantUser/updateMerchantUserInfoMerchantUserControllerMerchantUserService.updateMerchantUserInfo()| 项目 | app端 | web端 | 说明 |
|---|---|---|---|
| 接口路径 | /setUserInfo |
/updateMerchantUserInfo |
更符合web端命名规范 |
| 登录验证 | 无明确标注 | ✅ 有(@LoginRequired) | 增加统一登录验证 |
| 参数类型 | StoreUser | StoreUser | 保持一致 |
| 返回类型 | R<Boolean> | R<Boolean> | 保持一致 |
| 业务逻辑 | ✅ | ✅ | 完全复用 |
| 日志记录 | 基础 | 详细 | 增强日志记录 |
StoreUserMapperStoreUserStringUtils (Apache Commons Lang3)可以添加更详细的字段验证:
// 身份证号验证
if (StringUtils.isNotEmpty(idCard)) {
if (!IdCardValidator.isValid(idCard)) {
throw new RuntimeException("身份证号格式不正确");
}
}
// 昵称长度验证
if (StringUtils.isNotEmpty(nickName)) {
if (nickName.length() > 50) {
throw new RuntimeException("昵称长度不能超过50个字符");
}
}
记录用户信息修改的审计日志:
// 保存修改记录
AuditLog auditLog = new AuditLog();
auditLog.setUserId(storeUser.getId());
auditLog.setAction("UPDATE_USER_INFO");
auditLog.setDetails(JSONObject.toJSONString(storeUser));
auditLog.setOperateTime(new Date());
auditLogMapper.insert(auditLog);
当关键信息修改时,发送通知:
// 如果修改了身份证号,发送通知
if (StringUtils.isNotEmpty(storeUser.getIdCard())) {
notificationService.send(userId, "您的身份证号已更新");
}
新增接口:
POST /merchantUser/updateMerchantUserInfo - 修改商户用户信息核心功能:
涉及文件:
MerchantUserController.java - 更新MerchantUserService.java - 更新MerchantUserServiceImpl.java - 更新代码质量:
开发人员: ssk
文档版本: v1.0
最后更新: 2025-11-17
维护人员: ssk