feat(system): 实现注册码功能并优化用户注册流程

- 新增注册码生成和验证功能- 实现系统设置管理,包括注册功能开关
- 更新前端界面,增加系统管理和注册码相关功能
- 修改数据库结构,添加系统设置和注册码表
This commit is contained in:
ikmkj
2025-08-01 19:29:27 +08:00
parent 92b6f6da88
commit 77efac5a81
17 changed files with 395 additions and 9 deletions

View File

@@ -0,0 +1,10 @@
package com.test.bijihoudaun.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.test.bijihoudaun.entity.RegistrationCode;
public interface RegistrationCodeService extends IService<RegistrationCode> {
String generateCode(String creator);
boolean validateCode(String code);
void deleteExpiredCodes();
}

View File

@@ -0,0 +1,9 @@
package com.test.bijihoudaun.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.test.bijihoudaun.entity.SystemSetting;
public interface SystemSettingService extends IService<SystemSetting> {
boolean isRegistrationEnabled();
void setRegistrationEnabled(boolean enabled);
}

View File

@@ -0,0 +1,55 @@
package com.test.bijihoudaun.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.test.bijihoudaun.entity.RegistrationCode;
import com.test.bijihoudaun.mapper.RegistrationCodeMapper;
import com.test.bijihoudaun.service.RegistrationCodeService;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.time.LocalDateTime;
import java.util.UUID;
@Service
public class RegistrationCodeServiceImpl extends ServiceImpl<RegistrationCodeMapper, RegistrationCode> implements RegistrationCodeService {
@Override
public String generateCode(String creator) {
RegistrationCode registrationCode = new RegistrationCode();
String code = UUID.randomUUID().toString().replaceAll("-", "").substring(0, 16);
registrationCode.setCode(code);
registrationCode.setCreatedBy(creator);
registrationCode.setExpiryTime(LocalDateTime.now().plusDays(1));
save(registrationCode);
return code;
}
@Override
@Transactional
public boolean validateCode(String code) {
QueryWrapper<RegistrationCode> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("code", code);
RegistrationCode registrationCode = getOne(queryWrapper);
if (registrationCode == null) {
return false;
}
if (registrationCode.getExpiryTime().isBefore(LocalDateTime.now())) {
remove(queryWrapper); // 注册码过期,删除
return false;
}
// 验证成功后立即删除,确保一次性使用
remove(queryWrapper);
return true;
}
@Override
@Scheduled(cron = "0 0 1 * * ?") // 每天凌晨1点执行
public void deleteExpiredCodes() {
remove(new QueryWrapper<RegistrationCode>().lt("expiry_time", LocalDateTime.now()));
}
}

View File

@@ -0,0 +1,28 @@
package com.test.bijihoudaun.service.impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.test.bijihoudaun.entity.SystemSetting;
import com.test.bijihoudaun.mapper.SystemSettingMapper;
import com.test.bijihoudaun.service.SystemSettingService;
import org.springframework.stereotype.Service;
@Service
public class SystemSettingServiceImpl extends ServiceImpl<SystemSettingMapper, SystemSetting> implements SystemSettingService {
private static final String REGISTRATION_ENABLED_KEY = "registration.enabled";
@Override
public boolean isRegistrationEnabled() {
SystemSetting setting = getById(REGISTRATION_ENABLED_KEY);
// 默认开启注册
return setting == null || Boolean.parseBoolean(setting.getSettingValue());
}
@Override
public void setRegistrationEnabled(boolean enabled) {
SystemSetting setting = new SystemSetting();
setting.setSettingKey(REGISTRATION_ENABLED_KEY);
setting.setSettingValue(String.valueOf(enabled));
saveOrUpdate(setting);
}
}