feat(main): 新增 websopy 内部服务调用密钥及默认域名初始化

- 在配置文件中添加内部服务调用密钥配置,支持环境变量覆盖
- ConfigProperties 添加 internalKey 属性用于读取密钥
- MainController 新增 initDefaultDomain 方法,调用 websopy 初始化租户默认域名
- 租户注册成功后调用默认域名初始化接口,失败时记录日志但不阻断流程
- TenantServiceImpl 内置超管账号时设置已安装标志,避免重复操作
This commit is contained in:
2026-08-08 01:44:46 +08:00
parent 262a9e0183
commit 70bd81c45d
5 changed files with 49 additions and 6 deletions

View File

@@ -97,6 +97,11 @@ public class ConfigProperties {
*/ */
private String websopyUrl; private String websopyUrl;
/**
* 内部服务调用密钥(调用 websopy 等内部接口时使用)
*/
private String internalKey;
/** /**
* 微信扫码H5页面访问地址用于微信扫码登录跳转 * 微信扫码H5页面访问地址用于微信扫码登录跳转
*/ */

View File

@@ -57,6 +57,7 @@ import lombok.extern.slf4j.Slf4j;
import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.transaction.annotation.Isolation; import org.springframework.transaction.annotation.Isolation;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.client.RestTemplate;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource; import javax.annotation.Resource;
@@ -69,6 +70,7 @@ import java.time.LocalDateTime;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.HashMap; import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
import java.util.concurrent.ThreadLocalRandom; import java.util.concurrent.ThreadLocalRandom;
@@ -90,6 +92,8 @@ public class MainController extends BaseController {
@Resource @Resource
private ConfigProperties configProperties; private ConfigProperties configProperties;
@Resource @Resource
private RestTemplate restTemplate;
@Resource
private UserService userService; private UserService userService;
@Resource @Resource
private UserMapper userMapper; private UserMapper userMapper;
@@ -1285,6 +1289,31 @@ public class MainController extends BaseController {
return access_token; return access_token;
} }
/**
* 向 websopy 初始化租户默认域名并标记为已生效
*/
private void initDefaultDomain(Integer tenantId, String appCode) {
String websopyUrl = configProperties.getWebsopyUrl();
if (StrUtil.isBlank(websopyUrl)) {
return;
}
String prefix = "site";
String suffix = "sitelnk.cn";
if ("mp".equals(appCode)) {
prefix = "mp";
suffix = "shoplnk.cn";
} else if ("shop".equals(appCode)) {
prefix = "shop";
suffix = "shoplnk.cn";
}
String domain = prefix + "-" + tenantId + "." + suffix;
Map<String, Object> body = new HashMap<>();
body.put("tenantId", tenantId);
body.put("domain", domain);
body.put("internalKey", configProperties.getInternalKey());
restTemplate.postForObject(websopyUrl + "/api/app/user-sync/initDomain", body, String.class);
}
@Operation(summary = "开发者短信验证码登录") @Operation(summary = "开发者短信验证码登录")
@PostMapping("/loginByDeveloperSms") @PostMapping("/loginByDeveloperSms")
public ApiResult<LoginResult> loginByDeveloperSms(@RequestBody LoginParam param, HttpServletRequest request) { public ApiResult<LoginResult> loginByDeveloperSms(@RequestBody LoginParam param, HttpServletRequest request) {
@@ -1448,9 +1477,6 @@ public class MainController extends BaseController {
userParam.setTemplateId(user.getTemplateId()); userParam.setTemplateId(user.getTemplateId());
userParam.setTenantId(addCompany.getTenantId()); // 使用新创建的租户ID userParam.setTenantId(addCompany.getTenantId()); // 使用新创建的租户ID
final User adminByPhone = userService.getAdminByPhone(userParam); final User adminByPhone = userService.getAdminByPhone(userParam);
// 注册即开通:标记该超管账号已安装(initialized)
adminByPhone.setInstalled(true);
userService.updateById(adminByPhone);
// 设置过期时间 // 设置过期时间
Long tokenExpireTime = configProperties.getTokenExpireTime(); Long tokenExpireTime = configProperties.getTokenExpireTime();
@@ -1632,9 +1658,14 @@ public class MainController extends BaseController {
userParam1.setTemplateId(user.getTemplateId()); userParam1.setTemplateId(user.getTemplateId());
userParam1.setTenantId(addCompany.getTenantId()); // 使用新创建的租户ID userParam1.setTenantId(addCompany.getTenantId()); // 使用新创建的租户ID
final User adminByPhone = userService.getAdminByPhone(userParam1); final User adminByPhone = userService.getAdminByPhone(userParam1);
// 注册即开通:标记该超管账号已安装(initialized)
adminByPhone.setInstalled(true); // 在 websopy 初始化默认域名site-租户ID.sitelnk.cn并标记为已生效
userService.updateById(adminByPhone); try {
initDefaultDomain(addCompany.getTenantId(), "site");
} catch (Exception e) {
log.error("注册后初始化默认域名失败: tenantId={}", addCompany.getTenantId(), e);
// 域名初始化失败不阻断注册流程
}
// 设置过期时间 // 设置过期时间
Long tokenExpireTime = configProperties.getTokenExpireTime(); Long tokenExpireTime = configProperties.getTokenExpireTime();

View File

@@ -146,6 +146,7 @@ import java.util.stream.Collectors;
superAdmin.setPassword(userService.encodePassword(company.getPassword())); superAdmin.setPassword(userService.encodePassword(company.getPassword()));
} }
superAdmin.setTenantId(company.getTid()); superAdmin.setTenantId(company.getTid());
superAdmin.setInstalled(true);
if(company.getTemplateId() != null){ if(company.getTemplateId() != null){
superAdmin.setTemplateId(company.getTemplateId()); superAdmin.setTemplateId(company.getTemplateId());
} }

View File

@@ -53,6 +53,9 @@ config:
# websopy 服务地址(用于同步用户数据) # websopy 服务地址(用于同步用户数据)
websopyUrl: https://websopy-api.websoft.top websopyUrl: https://websopy-api.websoft.top
# 内部服务调用密钥(调用 websopy 等内部接口时使用,请务必与 websopy 端保持一致)
internal-key: ${INTERNAL_KEY:websopy-internal-2025}
# 生产环境证书配置 # 生产环境证书配置
certificate: certificate:
# 生产环境使用挂载卷模式 # 生产环境使用挂载卷模式

View File

@@ -119,6 +119,9 @@ config:
# websopy 服务地址(用于同步用户数据) # websopy 服务地址(用于同步用户数据)
websopyUrl: https://websopy-api.websoft.top websopyUrl: https://websopy-api.websoft.top
# 内部服务调用密钥(调用 websopy 等内部接口时使用,请务必与 websopy 端保持一致)
internal-key: ${INTERNAL_KEY:websopy-internal-2025}
# 阿里云OSS云存储 # 阿里云OSS云存储
endpoint: https://oss-cn-shenzhen.aliyuncs.com endpoint: https://oss-cn-shenzhen.aliyuncs.com
accessKeyId: LTAI5tGXuJku8MK7TA6gQMZw accessKeyId: LTAI5tGXuJku8MK7TA6gQMZw