Commit ce14c25e by zhangxingmin

Merge remote-tracking branch 'origin/dev' into prod

parents 0523cbb2 04f8a3c9
......@@ -34,6 +34,11 @@ public class AuthUserDto implements UserDetails {
private String username;
/**
* 真实姓名
*/
private String realName;
/**
* 加密后的密码(实现UserDetails接口必需)
*/
private String password;
......
......@@ -51,6 +51,7 @@ public class AuthUserDetailsService implements UserDetailsService {
authUserDto = new AuthUserDto();
BeanUtils.copyProperties(response,authUserDto);
authUserDto.setUsername(response.getUserName());
authUserDto.setRealName(response.getRealName());
// 查询用户角色 TODO
// authUserDto.setRoles(roles);
......
......@@ -82,6 +82,8 @@ public enum CommonEnum {
UID_TYPE_AGENT_ACCUMULATED_FYC("fyc","业务员累计积分表"),
UID_TYPE_AGENT_ACCUMULATED_FYC_LOG("fyc_log","业务员累计积分表操作日志记录表"),
UID_TYPE_EVALUATE_RANK("evaluate_rank","评定职级表"),
UID_TYPE_SALARY("salary","薪资单表"),
UID_TYPE_SALARY_REMITTANCE("salary_remittance","薪资汇款明细表"),
//作用域枚举
SCOPE_SYS("1","系统级(全局)"),
......
......@@ -54,6 +54,6 @@ public class ChineseTextConverter {
}
public static void main(String[] args) {
System.out.println(traditionalToSimplified("鑫安逸儲蓄保險计划"));
System.out.println(traditionalToSimplified("JAVA IS FUN"));
}
}
\ No newline at end of file
package com.yd.common.utils;
import org.apache.commons.lang3.StringUtils;
import java.util.Locale;
/**
* 英文文本工具类
*/
public final class EnglishTextUtil {
// 私有构造器,防止实例化
private EnglishTextUtil() {
throw new UnsupportedOperationException("Utility class cannot be instantiated");
}
/**
* 将输入字符串中的英文字母转换为小写。
*
* @param text 待转换的字符串,可以为 null
* @return 转换后的小写字符串;如果输入为 null,则返回 null
*/
public static String toLowerCase(String text) {
if (text == null) {
return null;
}
// 使用英语区域设置进行转换,避免土耳其语等特殊语言环境下的错误
return text.toLowerCase(Locale.ENGLISH);
}
// 可选的空安全版本,将 null 转为空字符串
public static String toLowerCaseSafe(String text) {
return StringUtils.isBlank(text) ? "" : text.toLowerCase(Locale.ENGLISH);
}
// 简单测试
public static void main(String[] args) {
System.out.println(toLowerCase("扎根")); // hello world
System.out.println(toLowerCase("JAVA IS FUN")); // java is fun
System.out.println(toLowerCase(null)); // null
System.out.println(toLowerCaseSafe("")); // (空字符串)
}
}
\ No newline at end of file
package com.yd.common.utils;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
public class UrlPathExtractor {
/**
* 从分号分隔的 URL 中提取路径部分,并去掉开头的 "/"
*/
public static List<String> extractPaths(String urlStr) {
if (urlStr == null || urlStr.isEmpty()) {
return new ArrayList<>();
}
return Arrays.stream(urlStr.split(";"))
.map(String::trim)
.filter(s -> !s.isEmpty())
.map(UrlPathExtractor::getPath)
.collect(Collectors.toList());
}
/**
* 从单个 URL 中提取路径,并去掉开头的 "/"
*/
private static String getPath(String url) {
try {
URI uri = new URI(url);
String path = uri.getPath(); // 例如 /pc/test/png/...
if (path != null && path.startsWith("/")) {
path = path.substring(1); // 去掉开头斜杠
}
return path;
} catch (URISyntaxException e) {
// 解析失败时,直接返回原字符串(可按需处理)
return url.startsWith("/") ? url.substring(1) : url;
}
}
// 测试
public static void main(String[] args) {
String input =
"https://yd-ali-oss.oss-cn-shanghai-finance-1-pub.aliyuncs111.com/pc/test/png/2026/04/28/253339f4a88e4eaa8a0c78618df3cf07.png;" +
"https://yd-ali-oss.oss-cn-shanghai-finance-1-pub.11aliyuncs222.com/pc/test/png/2026/04/27/aeca68e15d8d4301acc2d62ed2f31f4e.png";
List<String> paths = extractPaths(input);
System.out.println("[" + String.join(", ", paths) + "]");
}
}
\ No newline at end of file
package com.yd.framework.config;
import org.redisson.api.RLock;
import org.redisson.api.RedissonClient;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
import java.util.concurrent.TimeUnit;
import java.util.function.Supplier;
/**
* Redisson 分布式锁流式执行器
*/
@Component
public class LockExecutor {
@Resource
private RedissonClient redissonClient;
/**
* 在锁保护下执行无返回值的操作(阻塞直到获取锁,自动续期)
*/
public void executeWithLock(String lockKey, Runnable action) {
RLock lock = redissonClient.getLock(lockKey);
lock.lock();
try {
action.run();
} finally {
if (lock.isHeldByCurrentThread()) {
lock.unlock();
}
}
}
/**
* 在锁保护下执行有返回值的操作(阻塞直到获取锁)
*/
public <T> T executeWithLock(String lockKey, Supplier<T> supplier) {
RLock lock = redissonClient.getLock(lockKey);
lock.lock();
try {
return supplier.get();
} finally {
if (lock.isHeldByCurrentThread()) {
lock.unlock();
}
}
}
/**
* 尝试获取锁,支持等待超时,超时后返回 false(不执行操作)
*/
public boolean tryExecuteWithLock(String lockKey, long waitTime, TimeUnit unit, Runnable action) {
RLock lock = redissonClient.getLock(lockKey);
boolean locked = false;
try {
locked = lock.tryLock(waitTime, unit);
if (locked) {
action.run();
return true;
}
return false;
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
return false;
} finally {
if (locked && lock.isHeldByCurrentThread()) {
lock.unlock();
}
}
}
}
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment