Compare commits

...

2 Commits

Author SHA1 Message Date
607589d2c5 feat(user): 添加根据手机号查询用户的跨租户功能
- 在 UserMapper 中新增 selectByPhone 方法,支持忽略租户隔离查询
- 更新 UserMapper.xml 中的 selectByPhone 查询语句,实现跨库查询逻辑
- 修改 UserServiceImpl 中的 getByPhone 方法,使用自定义 SQL 避免租户拦截器影响
- 实现跨租户查询,直接访问 gxwebsoft_core.sys_user 表获取用户信息
2026-03-30 11:39:23 +08:00
424929222f feat(contact): 添加联系表单销售线索功能支持
- 新增联系表单数据库表结构设计与实体类定义
- 实现联系表单提交接口,支持公开访问无需登录验证
- 添加后台管理接口,支持线索查询、状态更新和删除操作
- 集成企业微信和飞书机器人通知功能,实时推送新线索
- 在安全配置中开放联系表单提交接口访问权限
- 添加应用配置中的通知机器人Webhook配置项
2026-03-30 11:30:29 +08:00
6 changed files with 38 additions and 12 deletions

View File

@@ -67,13 +67,24 @@ public class AppUserController extends BaseController {
return fail("添加失败");
}
@Operation(summary = "邀请用户成为应用成员")
@Operation(summary = "邀请用户成为应用成员支持用户ID或手机号")
@PostMapping("/invite")
public ApiResult<?> invite(@RequestBody AppUser appUser) {
User loginUser = getLoginUser();
if (loginUser == null) {
return fail("请先登录");
}
// 支持手机号邀请:若 userId 为空但传了 phone则先按手机号查出用户
if (appUser.getUserId() == null && appUser.getPhone() != null && !appUser.getPhone().isEmpty()) {
User targetUser = appUserService.findUserByPhone(appUser.getPhone());
if (targetUser == null) {
return fail("手机号未注册,请确认后再试");
}
appUser.setUserId(targetUser.getUserId());
}
if (appUser.getUserId() == null) {
return fail("请输入用户ID或手机号");
}
try {
AppUser result = appUserService.inviteUser(
appUser.getWebsiteId(),

View File

@@ -57,4 +57,12 @@ public interface AppUserService extends IService<AppUser> {
*/
boolean isMember(Long websiteId, Integer userId);
/**
* 根据手机号查找系统用户(用于手机号邀请)
*
* @param phone 手机号
* @return 系统用户,不存在返回 null
*/
com.gxwebsoft.common.system.entity.User findUserByPhone(String phone);
}

View File

@@ -104,4 +104,9 @@ public class AppUserServiceImpl extends ServiceImpl<AppUserMapper, AppUser> impl
return count > 0;
}
@Override
public User findUserByPhone(String phone) {
return userService.getByPhone(phone);
}
}

View File

@@ -62,6 +62,14 @@ public interface UserMapper extends BaseMapper<User> {
@InterceptorIgnore(tenantLine = "true")
User selectByIdIgnoreTenant(@Param("userId") Integer userId);
/**
* 根据手机号查询用户(忽略租户隔离,跨库查 gxwebsoft_core.sys_user
* @param phone 手机号
* @return User
*/
@InterceptorIgnore(tenantLine = "true")
User selectByPhone(@Param("phone") String phone);
@InterceptorIgnore(tenantLine = "true")
List<User> pageAdminByPhone(@Param("param") UserParam param);

View File

@@ -182,20 +182,13 @@
</where>
</select>
<!-- 根据手机号码查询 -->
<!-- 根据手机号码查询(跨租户,忽略租户隔离) -->
<select id="selectByPhone" resultType="com.gxwebsoft.common.system.entity.User">
SELECT a.*
FROM gxwebsoft_core.sys_user a
<where>
AND a.deleted = 0
WHERE a.deleted = 0
AND a.phone = #{phone}
<if test="tenantId != null">
AND a.tenant_id = #{tenantId}
</if>
<if test="tenantId == null">
AND a.tenant_id = 1
</if>
</where>
LIMIT 1
</select>
<!-- 获取所有的邮政协会/管局工作人员 -->

View File

@@ -180,7 +180,8 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements Us
@Override
public User getByPhone(String phone) {
return query().eq("phone", phone).one();
// 使用自定义 SQL@InterceptorIgnore避免 TenantLineInterceptor 把表定位到当前库的 sys_user
return baseMapper.selectByPhone(phone);
}
@Override