第一次提交

This commit is contained in:
2026-04-03 09:56:14 +08:00
commit 60e2c8debd
3598 changed files with 746659 additions and 0 deletions

View File

@@ -0,0 +1,47 @@
package org.jeecg;
import com.alibaba.fastjson.JSONObject;
import org.jeecg.common.util.RestUtil;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpMethod;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
/**
* @Description: TODO
* @author: scott
* @date: 2022年05月10日 14:02
*/
public class TestMain {
public static void main(String[] args) {
// 请求地址
String url = "https://api3.boot.jeecg.com/sys/user/list";
// 请求 Header 用于传递Token
HttpHeaders headers = getHeaders();
// 请求方式是 GET 代表获取数据
HttpMethod method = HttpMethod.GET;
//System.out.println("请求地址:" + url);
//System.out.println("请求方式:" + method);
// 利用 RestUtil 请求该url
ResponseEntity<JSONObject> result = RestUtil.request(url, method, headers, null, null, JSONObject.class);
if (result != null && result.getBody() != null) {
System.out.println("返回结果:" + result.getBody().toJSONString());
} else {
System.out.println("查询失败");
}
}
private static HttpHeaders getHeaders() {
String token = "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.50h-g6INOZRVnznExiawFb1U6PPjcVVA4POeYRA5a5Q";
System.out.println("请求Token" + token);
HttpHeaders headers = new HttpHeaders();
String mediaType = MediaType.APPLICATION_JSON_VALUE;
headers.setContentType(MediaType.parseMediaType(mediaType));
headers.set("Accept", mediaType);
headers.set("X-Access-Token", token);
return headers;
}
}

View File

@@ -0,0 +1,136 @@
package org.jeecg.modules.message.test;
import com.alibaba.fastjson.JSONObject;
import com.aliyuncs.exceptions.ClientException;
import org.jeecg.JeecgSystemApplication;
import org.jeecg.common.api.dto.message.BusMessageDTO;
import org.jeecg.common.api.dto.message.BusTemplateMessageDTO;
import org.jeecg.common.api.dto.message.MessageDTO;
import org.jeecg.common.api.dto.message.TemplateMessageDTO;
import org.jeecg.common.constant.CommonConstant;
import org.jeecg.common.constant.enums.DySmsEnum;
import org.jeecg.common.constant.enums.EmailTemplateEnum;
import org.jeecg.common.constant.enums.MessageTypeEnum;
import org.jeecg.common.constant.enums.SysAnnmentTypeEnum;
import org.jeecg.common.system.api.ISysBaseAPI;
import org.jeecg.common.util.DySmsHelper;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import java.util.HashMap;
import java.util.Map;
/**
* @Description: 消息推送测试
* @Author: lsq
*/
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT, classes = JeecgSystemApplication.class)
public class SendMessageTest {
@Autowired
ISysBaseAPI sysBaseAPI;
/**
* 发送系统消息
*/
@Test
public void sendSysAnnouncement() {
//发送人
String fromUser = "admin";
//接收人
String toUser = "jeecg";
//标题
String title = "系统消息";
//内容
String msgContent = "TEST:今日份日程计划已送达!";
//发送系统消息
sysBaseAPI.sendSysAnnouncement(new MessageDTO(fromUser, toUser, title, msgContent));
//消息类型
String msgCategory = CommonConstant.MSG_CATEGORY_1;
//业务类型
String busType = SysAnnmentTypeEnum.EMAIL.getType();
//业务ID
String busId = "11111";
//发送带业务参数的系统消息
BusMessageDTO busMessageDTO = new BusMessageDTO(fromUser, toUser, title, msgContent, msgCategory, busType,busId);
sysBaseAPI.sendBusAnnouncement(busMessageDTO);
}
/**
* 发送模版消息
*/
@Test
public void sendTemplateAnnouncement() {
//发送人
String fromUser = "admin";
//接收人
String toUser = "jeecg";
//标题
String title = "通知公告";
//模版编码
String templateCode = "412358";
//模版参数
Map templateParam = new HashMap<>();
templateParam.put("realname","JEECG用户");
sysBaseAPI.sendTemplateAnnouncement(new TemplateMessageDTO(fromUser,toUser,title,templateParam,templateCode));
//业务类型
String busType = SysAnnmentTypeEnum.EMAIL.getType();
//业务ID
String busId = "11111";
//发送带业务参数的模版消息
BusTemplateMessageDTO busMessageDTO = new BusTemplateMessageDTO(fromUser, toUser, title, templateParam ,templateCode, busType,busId);
sysBaseAPI.sendBusTemplateAnnouncement(busMessageDTO);
//新发送模版消息
MessageDTO messageDTO = new MessageDTO();
messageDTO.setType(MessageTypeEnum.XT.getType());
messageDTO.setToAll(false);
messageDTO.setToUser(toUser);
messageDTO.setTitle("【流程错误】");
messageDTO.setFromUser("admin");
HashMap data = new HashMap<>();
data.put(CommonConstant.NOTICE_MSG_BUS_TYPE, "msg_node");
messageDTO.setData(data);
messageDTO.setContent("TEST:流程执行失败!任务节点未找到");
sysBaseAPI.sendTemplateMessage(messageDTO);
}
/**
* 发送邮件
*/
@Test
public void sendEmailMsg() {
String title = "【日程提醒】您的日程任务即将开始";
String content = "TEST:尊敬的王先生您购买的演唱会将于本周日1008分在国家大剧院如期举行届时请携带好您的门票和身份证到场";
String email = "250678106@qq.com";
sysBaseAPI.sendEmailMsg(email,title,content);
}
/**
* 发送html模版邮件
*/
@Test
public void sendTemplateEmailMsg() {
String title = "收到一个催办";
String email = "250678106@qq.com";
JSONObject params = new JSONObject();
params.put("bpm_name","高级设置");
params.put("bpm_task","审批人");
params.put("datetime","2023-10-07 18:00:49");
params.put("url","http://boot3.jeecg.com/message/template");
params.put("remark","快点快点快点快点快点快点快点快点快点快点快点快点快点快点快点快点快点快点快点快点快点快点快点快点快点快点快点快点");
sysBaseAPI.sendHtmlTemplateEmail(email,title, EmailTemplateEnum.BPM_CUIBAN_EMAIL,params);
}
/**
* 发送短信
*/
@Test
public void sendSms() throws ClientException {
//手机号
String mobile = "159***";
//消息模版
DySmsEnum templateCode = DySmsEnum.LOGIN_TEMPLATE_CODE;
//模版所需参数
JSONObject obj = new JSONObject();
obj.put("code", "4XDP");
DySmsHelper.sendSms(mobile, obj, templateCode);
}
}

View File

@@ -0,0 +1,97 @@
package org.jeecg.modules.openapi.test;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import org.apache.http.HttpEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;
import org.junit.jupiter.api.Test;
import java.security.MessageDigest;
public class SampleOpenApiTest {
private final String base_url = "http://localhost:8080/jeecg-boot";
private final String appKey = "ak-pFjyNHWRsJEFWlu6";
private final String searchKey = "4hV5dBrZtmGAtPdbA5yseaeKRYNpzGsS";
@Test
public void test() throws Exception {
// 根据部门ID查询用户
String url = base_url+"/openapi/call/TEwcXBlr?id=c6d7cb4deeac411cb3384b1b31278596";
JSONObject header = genTimestampAndSignature();
HttpGet httpGet = new HttpGet(url);
// 设置请求头
httpGet.setHeader("Content-Type", "application/json");
httpGet.setHeader("appkey",appKey);
httpGet.setHeader("signature",header.get("signature").toString());
httpGet.setHeader("timestamp",header.get("timestamp").toString());
try (CloseableHttpClient httpClient = HttpClients.createDefault();
CloseableHttpResponse response = httpClient.execute(httpGet);) {
// 获取响应状态码
int statusCode = response.getStatusLine().getStatusCode();
System.out.println("[debug] 响应状态码: " + statusCode);
HttpEntity entity = response.getEntity();
System.out.println(entity);
// 获取响应内容
String responseBody = EntityUtils.toString(response.getEntity());
System.out.println("[debug] 响应内容: " + responseBody);
// 解析JSON响应
JSONObject res = JSON.parseObject(responseBody);
//错误日志判断
if(res.containsKey("success")){
Boolean success = res.getBoolean("success");
if(success){
System.out.println("[info] 调用成功: " + res.toJSONString());
}else{
System.out.println("[error] 调用失败: " + res.getString("message"));
}
}else{
System.out.println("[error] 调用失败: " + res.getString("message"));
}
}
}
private JSONObject genTimestampAndSignature(){
JSONObject jsonObject = new JSONObject();
long timestamp = System.currentTimeMillis();
jsonObject.put("timestamp",timestamp);
jsonObject.put("signature", md5(appKey + searchKey + timestamp));
return jsonObject;
}
/**
* 生成md5
* @param sourceStr
* @return
*/
protected String md5(String sourceStr) {
String result = "";
try {
MessageDigest md = MessageDigest.getInstance("MD5");
md.update(sourceStr.getBytes("utf-8"));
byte[] hash = md.digest();
int i;
StringBuffer buf = new StringBuffer(32);
for (int offset = 0; offset < hash.length; offset++) {
i = hash[offset];
if (i < 0) {
i += 256;
}
if (i < 16) {
buf.append("0");
}
buf.append(Integer.toHexString(i));
}
result = buf.toString();
} catch (Exception e) {
throw new RuntimeException("sign签名错误", e);
}
return result;
}
}

View File

@@ -0,0 +1,37 @@
package org.jeecg.modules.system.test;
import org.jeecg.config.JeecgBaseConfig;
import org.jeecg.modules.base.service.BaseCommonService;
import org.jeecg.modules.demo.mock.MockController;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest;
import org.springframework.boot.test.mock.mockito.MockBean;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.result.MockMvcResultHandlers;
import org.springframework.test.web.servlet.result.MockMvcResultMatchers;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
/**
* 单个controller测试
* @date 2025/4/7 11:21
*/
@WebMvcTest(value = MockController.class)
public class MockControllerTest {
@Autowired
private MockMvc mockMvc;
@MockBean
private BaseCommonService baseCommonService;
@MockBean
private JeecgBaseConfig jeecgBaseConfig;
@Test
public void testSave() throws Exception {
mockMvc.perform(get("/mock/api/json/area"))
.andDo(MockMvcResultHandlers.print())
.andExpect(MockMvcResultMatchers.status().isOk());
}
}

View File

@@ -0,0 +1,61 @@
package org.jeecg.modules.system.test;
import jakarta.annotation.Resource;
import org.jeecg.JeecgSystemApplication;
import org.jeecg.modules.demo.mock.MockController;
import org.jeecg.modules.demo.test.entity.JeecgDemo;
import org.jeecg.modules.demo.test.mapper.JeecgDemoMapper;
import org.jeecg.modules.demo.test.service.IJeecgDemoService;
import org.jeecg.modules.system.service.ISysDataLogService;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.util.Assert;
import java.util.List;
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT,classes = JeecgSystemApplication.class)
public class SampleTest {
@Resource
private JeecgDemoMapper jeecgDemoMapper;
@Resource
private IJeecgDemoService jeecgDemoService;
@Resource
private ISysDataLogService sysDataLogService;
@Resource
private MockController mock;
@Test
public void testSelect() {
System.out.println(("----- selectAll method test ------"));
List<JeecgDemo> userList = jeecgDemoMapper.selectList(null);
Assert.isTrue(15==userList.size(),"结果不是5条");
userList.forEach(System.out::println);
}
@Test
public void testXmlSql() {
System.out.println(("----- selectAll method test ------"));
List<JeecgDemo> userList = jeecgDemoMapper.getDemoByName("Sandy12");
userList.forEach(System.out::println);
}
/**
* 测试事务
*/
@Test
public void testTran() {
jeecgDemoService.testTran();
}
/**
* 测试数据日志添加
*/
@Test
public void testDataLogSave() {
System.out.println(("----- datalog test ------"));
String tableName = "jeecg_demo";
String dataId = "4028ef81550c1a7901550c1cd6e70001";
String dataContent = mock.sysDataLogJson();
sysDataLogService.addDataLog(tableName, dataId, dataContent);
}
}

View File

@@ -0,0 +1,87 @@
package org.jeecg.modules.system.test;
import org.aspectj.lang.annotation.Before;
import org.jeecg.JeecgSystemApplication;
import org.jeecg.common.system.api.ISysBaseAPI;
import org.jeecg.config.JeecgBaseConfig;
import org.jeecg.config.firewall.SqlInjection.IDictTableWhiteListHandler;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
/**
* @Description: 系统表白名单测试
* @Author: sunjianlei
*/
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT, classes = JeecgSystemApplication.class)
public class SysTableWhiteCheckTest {
@Autowired
IDictTableWhiteListHandler whiteListHandler;
@Autowired
ISysBaseAPI sysBaseAPI;
@Autowired
JeecgBaseConfig jeecgBaseConfig;
@BeforeEach
public void before() {
String lowCodeMode = this.jeecgBaseConfig.getFirewall().getLowCodeMode();
System.out.println("当前 LowCode 模式为: " + lowCodeMode);
// 清空缓存,防止影响测试
whiteListHandler.clear();
}
@Test
public void testSql() {
System.out.println("=== 开始测试 SQL 方式 ===");
String[] sqlArr = new String[]{
"select username from sys_user",
"select username, CONCAT(realname, SEX) from SYS_USER",
"select username, CONCAT(realname, sex) from sys_user",
};
for (String sql : sqlArr) {
System.out.println("- 测试Sql: " + sql);
try {
sysBaseAPI.dictTableWhiteListCheckBySql(sql);
System.out.println("-- 测试通过");
} catch (Exception e) {
System.out.println("-- 测试未通过: " + e.getMessage());
}
}
System.out.println("=== 结束测试 SQL 方式 ===");
}
@Test
public void testDict() {
System.out.println("=== 开始测试 DICT 方式 ===");
String table = "sys_user";
String code = "username";
String text = "realname";
this.testDict(table, code, text);
table = "sys_user";
code = "username";
text = "CONCAT(realname, sex)";
this.testDict(table, code, text);
table = "SYS_USER";
code = "username";
text = "CONCAT(realname, SEX)";
this.testDict(table, code, text);
System.out.println("=== 结束测试 DICT 方式 ===");
}
private void testDict(String table, String code, String text) {
try {
sysBaseAPI.dictTableWhiteListCheckByDict(table, code, text);
System.out.println("- 测试通过");
} catch (Exception e) {
System.out.println("- 测试未通过: " + e.getMessage());
}
}
}

View File

@@ -0,0 +1,174 @@
package org.jeecg.modules.system.test;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.jeecg.common.api.vo.Result;
import org.jeecg.common.modules.redis.client.JeecgRedisClient;
import org.jeecg.common.util.RedisUtil;
import org.jeecg.config.JeecgBaseConfig;
import org.jeecg.modules.base.service.BaseCommonService;
import org.jeecg.modules.system.controller.SysUserController;
import org.jeecg.modules.system.entity.SysUser;
import org.jeecg.modules.system.service.*;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest;
import org.springframework.boot.test.mock.mockito.MockBean;
import org.springframework.http.MediaType;
import org.springframework.test.web.servlet.MockMvc;
import java.util.ArrayList;
import java.util.List;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.BDDMockito.given;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*;
/**
* 系统用户单元测试
*/
@WebMvcTest(SysUserController.class)
public class SysUserApiTest {
@Autowired
private MockMvc mockMvc;
@MockBean
private ISysUserService sysUserService;
@MockBean
private ISysDepartService sysDepartService;
@MockBean
private ISysUserRoleService sysUserRoleService;
@MockBean
private ISysUserDepartService sysUserDepartService;
@MockBean
private ISysDepartRoleUserService departRoleUserService;
@MockBean
private ISysDepartRoleService departRoleService;
@MockBean
private RedisUtil redisUtil;
@Value("${jeecg.path.upload}")
private String upLoadPath;
@MockBean
private BaseCommonService baseCommonService;
@MockBean
private ISysPositionService sysPositionService;
@MockBean
private ISysUserTenantService userTenantService;
@MockBean
private JeecgRedisClient jeecgRedisClient;
@MockBean
private JeecgBaseConfig jeecgBaseConfig;
/**
* 测试地址:实际使用时替换成你自己的地址
*/
private final String BASE_URL = "/sys/user/";
/**
* 测试用例:查询记录
*/
@Test
public void testQuery() throws Exception{
// 请求地址
String url = BASE_URL + "list";
Page<SysUser> sysUserPage = new Page<>();
SysUser sysUser = new SysUser();
sysUser.setUsername("admin");
List<SysUser> users = new ArrayList<>();
users.add(sysUser);
sysUserPage.setRecords(users);
sysUserPage.setCurrent(1);
sysUserPage.setSize(10);
sysUserPage.setTotal(1);
given(this.sysUserService.queryPageList(any(), any(), any(), any())).willReturn(Result.OK(sysUserPage));
String result = mockMvc.perform(get(url)).andReturn().getResponse().getContentAsString();
JSONObject jsonObject = JSON.parseObject(result);
Assertions.assertEquals("admin", jsonObject.getJSONObject("result").getJSONArray("records").getJSONObject(0).getString("username"));
}
/**
* 测试用例:新增
*/
@Test
public void testAdd() throws Exception {
// 请求地址
String url = BASE_URL + "add" ;
JSONObject params = new JSONObject();
params.put("username", "wangwuTest");
params.put("password", "123456");
params.put("confirmpassword","123456");
params.put("realname", "单元测试");
params.put("activitiSync", "1");
params.put("userIdentity","1");
params.put("workNo","0025");
String result = mockMvc.perform(post(url).contentType(MediaType.APPLICATION_JSON_VALUE).content(params.toJSONString()))
.andReturn().getResponse().getContentAsString();
JSONObject jsonObject = JSON.parseObject(result);
Assertions.assertTrue(jsonObject.getBoolean("success"));
}
/**
* 测试用例:修改
*/
@Test
public void testEdit() throws Exception {
// 数据Id
String dataId = "1331795062924374018";
// 请求地址
String url = BASE_URL + "edit";
JSONObject params = new JSONObject();
params.put("username", "wangwuTest");
params.put("realname", "单元测试1111");
params.put("activitiSync", "1");
params.put("userIdentity","1");
params.put("workNo","0025");
params.put("id",dataId);
SysUser sysUser = new SysUser();
sysUser.setUsername("admin");
given(this.sysUserService.getById(any())).willReturn(sysUser);
String result = mockMvc.perform(put(url).contentType(MediaType.APPLICATION_JSON_VALUE).content(params.toJSONString()))
.andReturn().getResponse().getContentAsString();
JSONObject jsonObject = JSON.parseObject(result);
Assertions.assertTrue(jsonObject.getBoolean("success"));
}
/**
* 测试用例:删除
*/
@Test
public void testDelete() throws Exception {
// 数据Id
String dataId = "1331795062924374018";
// 请求地址
String url = BASE_URL + "delete" + "?id=" + dataId;
String result = mockMvc.perform(delete(url)).andReturn().getResponse().getContentAsString();
JSONObject jsonObject = JSON.parseObject(result);
Assertions.assertTrue(jsonObject.getBoolean("success"));
}
}

View File

@@ -0,0 +1,40 @@
package org.jeecg.smallTools;
import org.junit.jupiter.api.Test;
/**
* 测试sql分割、替换等操作
*
* @author: scott
* @date: 2023年09月05日 16:13
*/
public class TestSqlHandle {
/**
* Where 分割测试
*/
@Test
public void testSqlSplitWhere() {
String tableFilterSql = " select * from data.sys_user Where name='12312' and age>100";
String[] arr = tableFilterSql.split(" (?i)where ");
for (String sql : arr) {
System.out.println("sql片段" + sql);
}
}
/**
* Where 替换
*/
@Test
public void testSqlWhereReplace() {
String input = " Where name='12312' and age>100";
String pattern = "(?i)where "; // (?i) 表示不区分大小写
String replacedString = input.replaceAll(pattern, "");
System.out.println("替换前的字符串:" + input);
System.out.println("替换后的字符串:" + replacedString);
}
}

View File

@@ -0,0 +1,99 @@
package org.jeecg.smallTools;
import com.alibaba.fastjson.JSONArray;
import org.apache.commons.lang3.StringUtils;
import org.jeecg.common.util.DateUtils;
import org.junit.jupiter.api.Test;
import java.text.MessageFormat;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.ZoneId;
import java.util.Arrays;
import java.util.Base64;
import java.util.Date;
/**
* 字符串处理测试
*
* @author: scott
* @date: 2023年03月30日 15:27
*/
public class TestStr {
/**
* 测试参数格式化的问题,数字值有问题
*/
@Test
public void testParameterFormat() {
String url = "/pages/lowApp/process/taskDetail?tenantId={0}&procInsId={1}&taskId={2}&taskDefKey={3}";
String cc = MessageFormat.format(url, "6364", "111", "22", "333");
System.out.println("参数是字符串:" + cc);
String cc2 = MessageFormat.format(url, 6364, 111, 22, 333);
System.out.println("参数是数字(出问题):" + cc2);
}
@Test
public void testStringSplitError() {
String conditionValue = "qweqwe";
String[] conditionValueArray = conditionValue.split(",");
System.out.println("length = "+ conditionValueArray.length);
Arrays.stream(conditionValueArray).forEach(System.out::println);
}
@Test
public void getThisDate() {
LocalDate d = DateUtils.getLocalDate();
System.out.println(d);
}
@Test
public void firstDayOfLastSixMonths() {
LocalDate today = LocalDate.now(); // 获取当前日期
LocalDate firstDayOfLastSixMonths = today.minusMonths(6).withDayOfMonth(1); // 获取近半年的第一天
LocalDateTime firstDateTime = LocalDateTime.of(firstDayOfLastSixMonths, LocalTime.MIN); // 设置时间为当天的最小时间00:00:00
Date date = Date.from(firstDateTime.atZone(ZoneId.systemDefault()).toInstant()); // 将 LocalDateTime 转换为 Date
System.out.println("近半年的第一天的 00:00:00 时间戳:" + date);
}
@Test
public void testJSONArrayJoin() {
JSONArray valArray = new JSONArray();
valArray.add("123");
valArray.add("qwe");
System.out.println("值: " + StringUtils.join(valArray, ","));
}
@Test
public void testSql() {
String sql = "select * from sys_user where sex = ${sex}";
sql = sql.replaceAll("'?\\$\\{sex}'?","1");
System.out.println(sql);
}
@Test
public void base64(){
String encodedString = "5L+d5a2Y5aSx6LSl77yM5YWN6LS554mI5pyA5aSa5Yib5bu6ezB95p2h6L+e5o6l77yM6K+35Y2H57qn5ZWG5Lia54mI77yB";
byte[] decodedBytes = Base64.getDecoder().decode(encodedString);
String decodedString = new String(decodedBytes);
String tipMsg = MessageFormat.format(decodedString, 10);
System.out.println(tipMsg);
}
/**
* 正则测试字符串只保存中文和数字和字母
*/
@Test
public void testSpecialChar() {
String str = "Hello, World! 你好这是一段特殊符号的测试This is__ a test string with special characters: @#$%^&*";
// 使用正则表达式替换特殊字符
String replacedStr = str.replaceAll("[^a-zA-Z0-9\\u4e00-\\u9fa5]", "");
System.out.println("Replaced String: " + replacedStr);
}
}