parent
15baa50907
commit
d154aab9ed
@ -0,0 +1,45 @@ |
||||
///*
|
||||
// * Class created by lensfrex.
|
||||
// */
|
||||
//
|
||||
//package net.lensfrex.dscape.annotation;
|
||||
//
|
||||
//import net.lensfrex.dscape.utils.validate.TextCheckUtil;
|
||||
//
|
||||
//import java.lang.annotation.Documented;
|
||||
//import java.lang.annotation.Repeatable;
|
||||
//import java.lang.annotation.Retention;
|
||||
//import java.lang.annotation.Target;
|
||||
//
|
||||
//import static java.lang.annotation.ElementType.*;
|
||||
//import static java.lang.annotation.RetentionPolicy.RUNTIME;
|
||||
//
|
||||
//@Target({METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER, TYPE_USE})
|
||||
//@Retention(RUNTIME)
|
||||
//@Repeatable(NotInvalidChar.List.class)
|
||||
//@Documented
|
||||
//@Constraint(validatedBy = TextCheckUtil.class)//标明由哪个类执行校验逻辑
|
||||
//public @interface NotInvalidChar {
|
||||
// String message() default "value not in enum values.";
|
||||
//
|
||||
// Class<?>[] groups() default {};
|
||||
//
|
||||
//// Class<? extends Payload>[] payload() default {};
|
||||
//
|
||||
// /**
|
||||
// * @return date must in this value array
|
||||
// */
|
||||
// String[] value();
|
||||
//
|
||||
// /**
|
||||
// * Defines several {@link NotInvalidChar} annotations on the same element.
|
||||
// *
|
||||
// * @see NotInvalidChar
|
||||
// */
|
||||
// @Target({METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER, TYPE_USE})
|
||||
// @Retention(RUNTIME)
|
||||
// @Documented
|
||||
// @interface List {
|
||||
// NotInvalidChar[] value();
|
||||
// }
|
||||
//}
|
@ -0,0 +1,57 @@ |
||||
package net.lensfrex.dscape.dao.entity; |
||||
|
||||
import lombok.Data; |
||||
import java.util.Date; |
||||
import java.util.List; |
||||
import java.io.Serializable; |
||||
import com.baomidou.mybatisplus.annotation.IdType; |
||||
import com.baomidou.mybatisplus.annotation.TableId; |
||||
|
||||
/** |
||||
* @description black_list |
||||
* @author lensfrex |
||||
* @date 2022-08-19 |
||||
*/ |
||||
@Data |
||||
public class BlackList implements Serializable { |
||||
|
||||
private static final long serialVersionUID = 1L; |
||||
|
||||
@TableId(type = IdType.AUTO) |
||||
/** |
||||
* id |
||||
*/ |
||||
private Integer id; |
||||
|
||||
/** |
||||
* 黑名单数据类型;0:ip;1:uid |
||||
*/ |
||||
private int type; |
||||
|
||||
/** |
||||
* 黑名单条目名称,可空 |
||||
*/ |
||||
private String name; |
||||
|
||||
/** |
||||
* 黑名单数据 |
||||
*/ |
||||
private String data; |
||||
|
||||
/** |
||||
* create_time |
||||
*/ |
||||
private Date createTime; |
||||
|
||||
/** |
||||
* edit_time |
||||
*/ |
||||
private Date editTime; |
||||
|
||||
/** |
||||
* is_deleted |
||||
*/ |
||||
private int isDeleted; |
||||
|
||||
public BlackList() {} |
||||
} |
@ -0,0 +1,57 @@ |
||||
package net.lensfrex.dscape.dao.entity; |
||||
|
||||
import lombok.Data; |
||||
|
||||
import java.time.LocalDateTime; |
||||
import java.io.Serializable; |
||||
import com.baomidou.mybatisplus.annotation.IdType; |
||||
import com.baomidou.mybatisplus.annotation.TableId; |
||||
|
||||
/** |
||||
* @description register_applies |
||||
* @author lensfrex |
||||
* @date 2022-08-18 |
||||
*/ |
||||
@Data |
||||
public class RegisterApplies implements Serializable { |
||||
|
||||
private static final long serialVersionUID = 1L; |
||||
|
||||
/** |
||||
* id |
||||
*/ |
||||
@TableId(type = IdType.AUTO) |
||||
private Long id; |
||||
|
||||
/** |
||||
* 管理员uid |
||||
*/ |
||||
private String admin; |
||||
|
||||
/** |
||||
* 申请认证的用户 |
||||
*/ |
||||
private String applyUser; |
||||
|
||||
/** |
||||
* 申请状态 |
||||
*/ |
||||
private int status; |
||||
|
||||
/** |
||||
* create_time |
||||
*/ |
||||
private LocalDateTime createTime; |
||||
|
||||
/** |
||||
* edit_time |
||||
*/ |
||||
private LocalDateTime editTime; |
||||
|
||||
/** |
||||
* is_deleted |
||||
*/ |
||||
private int isDeleted; |
||||
|
||||
public RegisterApplies() {} |
||||
} |
@ -0,0 +1,15 @@ |
||||
package net.lensfrex.dscape.dao.mapper; |
||||
import com.baomidou.mybatisplus.core.mapper.BaseMapper; |
||||
import org.apache.ibatis.annotations.Mapper; |
||||
import org.apache.ibatis.annotations.Select; |
||||
import net.lensfrex.dscape.dao.entity.BlackList; |
||||
import java.util.List; |
||||
/** |
||||
* @description black_listMapper |
||||
* @author lensfrex |
||||
* @date 2022-08-19 |
||||
*/ |
||||
@Mapper |
||||
public interface BlackListMapper extends BaseMapper<BlackList> { |
||||
|
||||
} |
@ -0,0 +1,15 @@ |
||||
package net.lensfrex.dscape.dao.mapper; |
||||
import com.baomidou.mybatisplus.core.mapper.BaseMapper; |
||||
import org.apache.ibatis.annotations.Mapper; |
||||
import org.apache.ibatis.annotations.Select; |
||||
import net.lensfrex.dscape.dao.entity.RegisterApplies; |
||||
import java.util.List; |
||||
/** |
||||
* @description register_appliesMapper |
||||
* @author lensfrex |
||||
* @date 2022-08-18 |
||||
*/ |
||||
@Mapper |
||||
public interface RegisterAppliesMapper extends BaseMapper<RegisterApplies> { |
||||
|
||||
} |
@ -0,0 +1,13 @@ |
||||
package net.lensfrex.dscape.dao.service; |
||||
import net.lensfrex.dscape.dao.entity.BlackList; |
||||
import org.springframework.stereotype.Service; |
||||
import com.baomidou.mybatisplus.extension.service.IService; |
||||
/** |
||||
* @description black_list服务层 |
||||
* @author lensfrex |
||||
* @date 2022-08-19 |
||||
*/ |
||||
@Service |
||||
public interface BlackListService extends IService<BlackList> { |
||||
|
||||
} |
@ -0,0 +1,13 @@ |
||||
package net.lensfrex.dscape.dao.service; |
||||
import net.lensfrex.dscape.dao.entity.RegisterApplies; |
||||
import org.springframework.stereotype.Service; |
||||
import com.baomidou.mybatisplus.extension.service.IService; |
||||
/** |
||||
* @description register_applies服务层 |
||||
* @author lensfrex |
||||
* @date 2022-08-18 |
||||
*/ |
||||
@Service |
||||
public interface RegisterAppliesService extends IService<RegisterApplies> { |
||||
|
||||
} |
@ -0,0 +1,16 @@ |
||||
/* |
||||
* Class created by lensfrex. |
||||
*/ |
||||
|
||||
package net.lensfrex.dscape.dao.service.impl; |
||||
|
||||
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; |
||||
import net.lensfrex.dscape.dao.entity.BlackList; |
||||
import net.lensfrex.dscape.dao.mapper.BlackListMapper; |
||||
import net.lensfrex.dscape.dao.service.BlackListService; |
||||
import org.springframework.stereotype.Service; |
||||
|
||||
@Service |
||||
public class BlackListServiceImpl extends ServiceImpl<BlackListMapper, BlackList> implements BlackListService { |
||||
|
||||
} |
@ -0,0 +1,14 @@ |
||||
/* |
||||
* Class created by lensfrex. |
||||
*/ |
||||
|
||||
package net.lensfrex.dscape.dao.service.impl; |
||||
|
||||
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; |
||||
import net.lensfrex.dscape.dao.entity.RegisterApplies; |
||||
import net.lensfrex.dscape.dao.mapper.RegisterAppliesMapper; |
||||
import net.lensfrex.dscape.dao.service.RegisterAppliesService; |
||||
|
||||
public class RegisterAppliesServiceImpl extends ServiceImpl<RegisterAppliesMapper, RegisterApplies> implements RegisterAppliesService { |
||||
|
||||
} |
@ -1,10 +1,15 @@ |
||||
package net.lensfrex.dscape.dto.request.user; |
||||
|
||||
import com.fasterxml.jackson.annotation.JsonProperty; |
||||
import lombok.Data; |
||||
|
||||
@Data |
||||
public class RegisterRequestBody { |
||||
private String password; |
||||
private String superior; |
||||
@JsonProperty("user_name") |
||||
private String userName; |
||||
|
||||
private String password; |
||||
|
||||
@JsonProperty("invite_code") |
||||
private String inviteCode; |
||||
} |
@ -0,0 +1,20 @@ |
||||
package net.lensfrex.dscape.enums.user; |
||||
|
||||
import com.baomidou.mybatisplus.annotation.EnumValue; |
||||
import lombok.Getter; |
||||
|
||||
@Getter |
||||
public enum BlackListTypeEnum { |
||||
|
||||
IP_ADDRESS(0, "IP地址"), |
||||
UID(1, "用户UID"),; |
||||
|
||||
@EnumValue |
||||
private final int code; |
||||
private final String name; |
||||
|
||||
BlackListTypeEnum(int code, String name) { |
||||
this.code = code; |
||||
this.name = name; |
||||
} |
||||
} |
@ -0,0 +1,20 @@ |
||||
package net.lensfrex.dscape.utils; |
||||
|
||||
import org.springframework.context.annotation.Scope; |
||||
import org.springframework.stereotype.Component; |
||||
|
||||
import javax.servlet.http.HttpServletRequest; |
||||
|
||||
@Component |
||||
@Scope("singleton") |
||||
public class NetworkUtil { |
||||
|
||||
public static String getRealIP(HttpServletRequest request) { |
||||
String forward = request.getHeader("X-Forwarded-For"); |
||||
if (forward != null) { |
||||
return forward.split(",")[0]; |
||||
} else { |
||||
return request.getRemoteAddr(); |
||||
} |
||||
} |
||||
} |
@ -0,0 +1,57 @@ |
||||
/* |
||||
* Class created by lensfrex. |
||||
*/ |
||||
|
||||
/* |
||||
* Class created by lensfrex. |
||||
*/ |
||||
|
||||
package net.lensfrex.dscape.utils.validate; |
||||
|
||||
public class TextCheckUtil { |
||||
|
||||
private static final String ABC_AND_CHINESE_REGEX = "[^a-zA-Z0-9\\_\\u4e00-\\u9fa5]"; |
||||
|
||||
private static final String ABC_REGEX = "[^a-zA-Z0-9\\_]"; |
||||
|
||||
// [^a-zA-Z0-9\_\[\];',./{}:"<>?/*\-\\!@#$%^&()\+\u4e00-\u9fa5]
|
||||
private static final String ALL_CHARACTER_REGEX = "[^a-zA-Z0-9\\_\\[\\];',./{}:\"<>?/*\\-\\\\!@#$%^&()+=~`\\u4e00-\\u9fa5]"; |
||||
|
||||
/** |
||||
* 检测非字母和中文符号(下划线"_"除外) |
||||
* @param source 待检测字符串 |
||||
* @return 是否含有非字母字符 |
||||
*/ |
||||
public static boolean checkNoneAbcAndChinese(String source) { |
||||
return !source.matches(ABC_AND_CHINESE_REGEX); |
||||
} |
||||
|
||||
/** |
||||
* 批量检测非字母和中文符号(下划线"_"除外) |
||||
* @param source 待检测字符串 |
||||
* @return 是否含有非字母字符 |
||||
*/ |
||||
public static boolean checkNoneAbcAndChinese(String... source) { |
||||
for (String text : source) { |
||||
if (text.matches(ABC_AND_CHINESE_REGEX)) { |
||||
return true; |
||||
} |
||||
} |
||||
|
||||
return false; |
||||
} |
||||
|
||||
public static boolean checkNoneCharacter(String source) { |
||||
return !source.matches(ALL_CHARACTER_REGEX); |
||||
} |
||||
|
||||
public static boolean checkNoneCharacter(String... source) { |
||||
for (String text : source) { |
||||
if (text.matches(ALL_CHARACTER_REGEX)) { |
||||
return true; |
||||
} |
||||
} |
||||
|
||||
return false; |
||||
} |
||||
} |
@ -0,0 +1,112 @@ |
||||
/* |
||||
* Class created by lensfrex. |
||||
*/ |
||||
|
||||
package net.lensfrex.dscape.web.service.user.admin; |
||||
|
||||
import cn.dev33.satoken.stp.StpUtil; |
||||
import cn.dev33.satoken.util.SaFoxUtil; |
||||
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; |
||||
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; |
||||
import net.lensfrex.dscape.dao.entity.BlackList; |
||||
import net.lensfrex.dscape.dao.entity.UserBasic; |
||||
import net.lensfrex.dscape.dao.service.BlackListService; |
||||
import net.lensfrex.dscape.dao.service.UserBasicService; |
||||
import net.lensfrex.dscape.dto.response.general.ResponseCode; |
||||
import net.lensfrex.dscape.enums.user.BlackListTypeEnum; |
||||
import net.lensfrex.dscape.exception.GlobalException; |
||||
import org.springframework.data.redis.core.RedisTemplate; |
||||
import org.springframework.stereotype.Service; |
||||
|
||||
import java.util.ArrayList; |
||||
import java.util.HashMap; |
||||
import java.util.List; |
||||
|
||||
@Service |
||||
public class AdminService { |
||||
private final RedisTemplate<String, String> redis; |
||||
|
||||
private final UserBasicService userBasicService; |
||||
|
||||
private final BlackListService blackListService; |
||||
|
||||
public AdminService(RedisTemplate<String, String> redis, |
||||
UserBasicService userBasicService, |
||||
BlackListService blackListService) { |
||||
|
||||
this.redis = redis; |
||||
this.userBasicService = userBasicService; |
||||
this.blackListService = blackListService; |
||||
} |
||||
|
||||
private static final int INVITE_CODE_LENGTH = 6; |
||||
|
||||
private static final String REGISTER_INVITE_CODE_KEY = "dscape:user:inviteCodes"; |
||||
|
||||
private static final String ADMIN_INVITE_CODE_COUNTER_KEY = "dscape:admin:inviteCodeCounter:%s"; |
||||
|
||||
public List<String> generateInviteCode(long expired, int count) { |
||||
String adminUid = StpUtil.getLoginIdAsString(); |
||||
String adminInviteCodeCounterKey = String.format(ADMIN_INVITE_CODE_COUNTER_KEY, adminUid); |
||||
|
||||
String countResult = redis.opsForValue().get(adminInviteCodeCounterKey); |
||||
|
||||
if (countResult != null && Integer.parseInt(countResult) > 1024) { |
||||
throw new GlobalException(ResponseCode.INVITE_CODE_REACHED_LIMIT); |
||||
} |
||||
|
||||
List<String> inviteCodes = new ArrayList<>(count); |
||||
|
||||
for (int i = 0; i < count; i++) { |
||||
inviteCodes.add(SaFoxUtil.getRandomString(INVITE_CODE_LENGTH)); |
||||
} |
||||
HashMap<String, String> codeAdmin = new HashMap<>(count); |
||||
inviteCodes.forEach(inviteCode -> codeAdmin.put(inviteCode, adminUid)); |
||||
|
||||
redis.opsForHash().putAll(REGISTER_INVITE_CODE_KEY, codeAdmin); |
||||
redis.opsForValue().increment(adminInviteCodeCounterKey, count); |
||||
|
||||
return inviteCodes; |
||||
} |
||||
|
||||
private static final String USER_INFO_CACHE_KEY = "dscape:user:basic"; |
||||
|
||||
public void modifyUserStatus(String username, int status) { |
||||
UpdateWrapper<UserBasic> wrapper = new UpdateWrapper<>(); |
||||
wrapper.lambda() |
||||
.eq(UserBasic::getUserName, username) |
||||
.eq(UserBasic::getSuperior, StpUtil.getLoginIdAsString()) |
||||
.set(UserBasic::getStatus, status); |
||||
|
||||
boolean success = userBasicService.update(wrapper); |
||||
|
||||
if (success) { |
||||
this.clearUserBasicCache(username); |
||||
} |
||||
} |
||||
|
||||
public void addUserToBlackList(String username) { |
||||
BlackList blackList = new BlackList(); |
||||
blackList.setData(username); |
||||
blackList.setType(BlackListTypeEnum.UID.getCode()); |
||||
|
||||
boolean success = blackListService.save(blackList); |
||||
} |
||||
|
||||
public void deleteUser(String username) { |
||||
UpdateWrapper<UserBasic> wrapper = new UpdateWrapper<>(); |
||||
wrapper.lambda() |
||||
.eq(UserBasic::getUserName, username) |
||||
.set(UserBasic::getIsDeleted, 1); |
||||
|
||||
boolean success = userBasicService.update(wrapper); |
||||
|
||||
if (success) { |
||||
this.clearUserBasicCache(username); |
||||
} |
||||
} |
||||
|
||||
private void clearUserBasicCache(String username) { |
||||
redis.opsForHash().delete(USER_INFO_CACHE_KEY, username); |
||||
} |
||||
} |
Loading…
Reference in new issue