修改河南项目的管理后台ui

This commit is contained in:
2026-09-27 19:12:59 +08:00
parent 34c7fa9d72
commit 3248ee4b83
31 changed files with 1605 additions and 558 deletions
@@ -9,7 +9,7 @@ import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
/**
* 推广后台 Web 配置:注册维护拦截器。
* <p>
* 对 /promo/** 生效,放行登录/注册接口(登录/注册由 PromoLoginController 自行提示维护)。
* 对 /promo/** 生效,放行登录/注册/开发用登录接口(这几条由 PromoLoginController 自行提示维护)。
*
* @author ruoyi
*/
@@ -23,6 +23,6 @@ public class PromoWebConfig implements WebMvcConfigurer {
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(promoMaintenanceInterceptor)
.addPathPatterns("/promo/**")
.excludePathPatterns("/promo/smsLogin", "/promo/register");
.excludePathPatterns("/promo/smsLogin", "/promo/register", "/promo/devLogin");
}
}
@@ -0,0 +1,18 @@
package com.ruoyi.promo.contract.request;
import lombok.Data;
/**
* 推广后台「开发用」账号密码登录请求体。
* <p>
* 仅供本地 / 测试环境联调使用,由 sys_config 的 {@code promoDevLoginEnabled} 控制是否可用。
*/
@Data
public class DevLoginRequest {
/** 登录账号:推广账号(主播/招商/卡商)填手机号;超管可填登录账号或手机号 */
private String account;
/** 登录密码(明文,服务端按 BCrypt 校验) */
private String password;
}
@@ -21,12 +21,14 @@ import com.ruoyi.admin.mapper.PromoAdminMapper;
import com.ruoyi.admin.mapper.TtUserMapper;
import com.ruoyi.common.redis.config.RedisLock;
import com.ruoyi.domain.other.ApiVerificationCodeLoginBody;
import com.ruoyi.promo.contract.request.DevLoginRequest;
import com.ruoyi.promo.contract.request.RegisterRequest;
import com.ruoyi.promo.contract.request.UpdateInvitationCodeRequest;
import com.ruoyi.promo.contract.response.GetShareDomainResponse;
import com.ruoyi.promo.service.PromoLoginService;
import com.ruoyi.system.service.ISysConfigService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
@@ -59,6 +61,10 @@ public class PromoLoginController extends BaseController {
@Autowired
private RedisLock redisLock;
/** 开发用账号密码登录开关:application-dev.yml 置 true,其余环境不配置即为 false */
@Value("${promo.dev-login.enabled:false}")
private boolean devLoginEnabled;
@PostMapping("/getInfo")
public R<Map<String, Object>> getPromoInfo() {
var loginUser = getLoginUser();
@@ -271,6 +277,30 @@ public class PromoLoginController extends BaseController {
}
}
/**
* 开发用账号密码登录:仅本地/测试联调使用,绕过短信验证码直接按密码登录。
* <p>
* 由配置项 {@code promo.dev-login.enabled} 控制(默认 false,只有 dev profile 置 true);
* 生产 profile 不配置该项 ⇒ 接口恒返回「账号密码登录未开启」。
*/
@Anonymous
@PostMapping("/devLogin")
public AjaxResult devLogin(@RequestBody DevLoginRequest body) {
if (!devLoginEnabled) {
return AjaxResult.error("账号密码登录未开启");
}
if ("1".equals(configService.selectConfigByKey("promoMaintenance"))) {
return AjaxResult.error("系统维护中,请稍后再试");
}
try {
AjaxResult ajax = AjaxResult.success();
ajax.put(Constants.TOKEN, promoLoginService.devLogin(body.getAccount(), body.getPassword()));
return ajax;
} catch (IllegalArgumentException e) {
return AjaxResult.error(e.getMessage());
}
}
@Anonymous
@PostMapping("/register")
public AjaxResult register(@RequestBody RegisterRequest request) {
@@ -18,6 +18,14 @@ public interface PromoLoginService {
String createUserToken(String phoneNumber);
/**
* 开发用账号密码登录:仅本地/测试环境联调使用,由 sys_config 的 promoDevLoginEnabled 控制是否可用。
* 账号口径与 {@link #createUserToken} 一致(推广账号手机号 / 超管账号),只是把短信验证码换成密码校验。
*
* @return 推广后台 token
*/
String devLogin(String account, String password);
R<TtUser> register(RegisterRequest request);
R<TtUser> updateInvitationCode(UpdateInvitationCodeRequest request);
@@ -14,6 +14,7 @@ import com.ruoyi.admin.service.TtUserAvatarService;
import com.ruoyi.admin.service.TtUserService;
import com.ruoyi.admin.util.RandomUtils;
import com.ruoyi.common.core.domain.R;
import com.ruoyi.common.core.domain.entity.UserData;
import com.ruoyi.common.core.domain.model.LoginUser;
import com.ruoyi.common.core.redis.RedisCache;
import com.ruoyi.common.utils.DateUtils;
@@ -214,8 +215,48 @@ public class PromoLoginServiceImpl implements PromoLoginService {
@Override
public String createUserToken(String phoneNumber) {
sysLoginService.validateBlackIp(phoneNumber);
LoginUser loginUser = (LoginUser) apiUserDetailsService.loadUserByUsername("promo_user_" + phoneNumber);
return issueToken(loginUser, phoneNumber);
}
/**
* 开发用账号密码登录(仅本地/测试联调,生产 profile 未配置 promo.dev-login.enabled 即为关闭)。
* <p>
* 账号解析完全复用 {@link #createUserToken} 的 {@code promo_user_} 入口,
* 因此推广账号(主播/招商/卡商,登录名即手机号)与超管(promo_admin 的 username 或 phone_number)
* 都能登录,区别只是「短信验证码」这一步换成了 BCrypt 密码校验。
*/
@Override
public String devLogin(String account, String password) {
String acc = StringUtils.trim(account);
String rawPassword = password == null ? "" : password;
if (StringUtils.isEmpty(acc) || StringUtils.isEmpty(rawPassword)) {
throw new IllegalArgumentException("账号和密码不能为空");
}
LoginUser loginUser;
try {
loginUser = (LoginUser) apiUserDetailsService.loadUserByUsername("promo_user_" + acc);
} catch (Exception e) {
// 账号不存在 / 已停用 / 已删除 一律收敛为同一句提示,避免这个接口被拿来枚举账号
log.warn("[推广后台·开发用密码登录] 账号加载失败 account={} reason={}", acc, e.getMessage());
throw new IllegalArgumentException("账号或密码错误");
}
UserData userData = loginUser.getUserData();
if (userData == null || StringUtils.isEmpty(userData.getPassword())
|| !SecurityUtils.matchesPassword(rawPassword, userData.getPassword())) {
log.warn("[推广后台·开发用密码登录] 密码校验失败 account={}", acc);
throw new IllegalArgumentException("账号或密码错误");
}
return issueToken(loginUser, acc);
}
/**
* 校验黑名单 IP 并签发推广后台 token(短信登录与开发用密码登录共用)
*/
private String issueToken(LoginUser loginUser, String blackIpAccount) {
sysLoginService.validateBlackIp(blackIpAccount);
// 超级管理员来自 promo_admin 表,其 id 与 tt_user 不同表,不能按 id 回写 tt_user 登录信息
if (!UserType.SUPER_ADMIN.getCode().equals(loginUser.getUserData().getUserType())) {
recordLoginInfo(loginUser.getUserId());