TestController.java 27 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688
  1. package com.backendsys.controller.api;
  2. import cn.hutool.json.JSONObject;
  3. import cn.hutool.json.JSONUtil;
  4. import com.backendsys.aspect.QueuingPoll;
  5. import com.backendsys.entity.Tencent.TencentCos.UploadOriginDTO;
  6. import com.backendsys.service.SDKService.SDKTencent.SDKTencentCOSService;
  7. //import com.backendsys.service.SDKService.SDKTinypng.SDKTinypngService;
  8. import com.backendsys.service.System.SysResourceService;
  9. import com.backendsys.utils.ResourceUtil;
  10. import com.backendsys.utils.response.Result;
  11. import com.fasterxml.jackson.core.JsonProcessingException;
  12. import com.fasterxml.jackson.databind.ObjectMapper;
  13. import cn.afterturn.easypoi.word.WordExportUtil;
  14. import com.backendsys.utils.MD5Util;
  15. import jakarta.servlet.http.HttpServletRequest;
  16. import org.apache.poi.xwpf.usermodel.XWPFDocument;
  17. import org.redisson.api.*;
  18. import org.springframework.beans.factory.annotation.Autowired;
  19. import org.springframework.beans.factory.annotation.Value;
  20. import org.springframework.context.annotation.Lazy;
  21. import org.springframework.data.redis.core.RedisTemplate;
  22. import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
  23. import org.springframework.util.StreamUtils;
  24. import org.springframework.web.bind.annotation.*;
  25. import java.awt.*;
  26. import java.io.*;
  27. import java.nio.charset.StandardCharsets;
  28. import java.nio.file.Path;
  29. import java.nio.file.Paths;
  30. import java.security.NoSuchAlgorithmException;
  31. import java.util.*;
  32. import java.util.List;
  33. import java.util.concurrent.CompletableFuture;
  34. import java.util.concurrent.TimeUnit;
  35. @RestController
  36. @RequestMapping("/api/test")
  37. public class TestController {
  38. @Value("${file.upload.directory}") // 配置保存文件的目录
  39. private String uploadDirectory;
  40. private static final ObjectMapper MAPPER = new ObjectMapper();
  41. // @Autowired
  42. // private HttpExchangeService httpExchangeService;
  43. // @Autowired
  44. // private HttpTodoService httpTodoService;
  45. @PostMapping("testWebHook")
  46. public Result testWebHook(@RequestBody Map<String, Object> requestBody, HttpServletRequest request) {
  47. System.out.println("------- testWebHook --------");
  48. // try {
  49. // String requestBody = StreamUtils.copyToString(request.getInputStream(), StandardCharsets.UTF_8);
  50. // System.out.println(requestBody);
  51. // } catch (IOException e) {
  52. // e.printStackTrace();
  53. // }
  54. System.out.println("===========================================");
  55. System.out.println("requestBody:");
  56. System.out.println(requestBody);
  57. System.out.println("----------------------------");
  58. System.out.println("requestBody (JSON):");
  59. System.out.println(JSONUtil.parseObj(requestBody));
  60. System.out.println("----------------------------");
  61. String token = request.getHeader("X-Codeup-Token");
  62. System.out.println("X-Codeup-Token: " + token);
  63. System.out.println("===========================================");
  64. return null;
  65. }
  66. // @Autowired
  67. // private SysResourceService sysResourceService;
  68. //
  69. // @GetMapping("testConsumptionPoint")
  70. // public Result testConsumptionPoint(String resource_type, String resource_tag) throws IOException {
  71. // sysResourceService.consumptionPoint(resource_type, resource_tag, null);
  72. // return Result.success("扣除成功");
  73. // }
  74. // @Autowired
  75. // private SDKTinypngService sdkTinypngService;
  76. //
  77. // @PostMapping("testCompressing")
  78. // public Result testCompressing(@RequestBody UploadOriginDTO uploadOriginDTO) throws IOException {
  79. // return Result.success(sdkTinypngService.runCompressing(uploadOriginDTO));
  80. // }
  81. // @Autowired
  82. // private SDKTencentCOSService sdkTencentCOSService;
  83. //
  84. // @PostMapping("testUploadOrigin")
  85. // public Result testUploadOrigin(@RequestBody UploadOriginDTO uploadOriginDTO) throws IOException {
  86. // return Result.success(sdkTencentCOSService.uploadOrigin(uploadOriginDTO));
  87. // }
  88. @GetMapping("testLocalPath")
  89. public Path testLocalPath() {
  90. return Paths.get(".");
  91. }
  92. @GetMapping("testDownloadLocal")
  93. public String testDownloadLocal() {
  94. // return ResourceUtil.downloadImage("https://dashscope-result-bj.oss-cn-beijing.aliyuncs.com/466b5214/20240417/172326_0_2a130824-cffe-4d18-8455-f98c18e4900e.png?Expires=1713432207&OSSAccessKeyId=LTAI5tQZd8AEcZX6KZV4G8qL&Signature=439TeHWxweXDJ%2FE8mAQ3UQJx7XI%3D");
  95. return ResourceUtil.downloadImage("http://cos.daoguyujia.com/customer-pipline/1/65119e58-9940-458c-8911-750d23f9fbf1/idcard/b.pdf", uploadDirectory);
  96. }
  97. //
  98. //
  99. // // 【腾讯云 COS】
  100. // // 文档中心 > 对象存储 > API 文档 > Object 接口 > 基本操作 > PUT Object
  101. // // https://cloud.tencent.com/document/product/436/7749
  102. // // https://github.com/tencentyun/cos-java-sdk-v5/blob/master/src/main/java/com/qcloud/cos/demo/PutObjectDemo.java
  103. // static COSClient cosClient = createCli();
  104. //
  105. // static COSClient createCli() {
  106. // return createCli("ap-hongkong");
  107. // }
  108. //
  109. // static COSClient createCli(String region) {
  110. // // 初始化用户身份信息(secretId, secretKey)
  111. // COSCredentials cred = new BasicCOSCredentials("AKID3zlNxRjstjnohWFnDUfeVBj3CJH7mFaK","IXgzFKB71rXOCxlS4BTdtCYuJbP8h7Xr");
  112. // // 设置bucket的区域, COS地域的简称请参照 https://www.qcloud.com/document/product/436/6224
  113. // ClientConfig clientConfig = new ClientConfig(new Region(region));
  114. // // 生成cos客户端
  115. // return new COSClient(cred, clientConfig);
  116. // }
  117. //
  118. // /**
  119. // * 腾讯云 COS - 上传文件
  120. // */
  121. // @GetMapping("testTencentSDK/putObject")
  122. // public String testTencentSDKPutObject() {
  123. // String bucketName = "storage-1320301544";
  124. //
  125. // // 获取当前日期
  126. // Date currentDate = new Date();
  127. // SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMddHHmmss");
  128. // String dateFolder = dateFormat.format(currentDate);
  129. //
  130. // System.out.println("dateFolder: " + dateFolder);
  131. //
  132. // String fileName = "README.md";
  133. // String key = dateFolder + "/" + fileName;
  134. //
  135. // String localPath = fileName;
  136. //
  137. // // 计算过期时间为 1 分钟后
  138. // Date currentTime = new Date();
  139. // long expiresTime = currentTime.getTime() + 60*1000; // 当前时间毫秒数 + 1分钟的毫秒数
  140. // ObjectMetadata objectMetadata = new ObjectMetadata();
  141. // objectMetadata.setHeader("expires", new Date(expiresTime));
  142. //
  143. // PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName, key, new File(localPath));
  144. // putObjectRequest.withMetadata(objectMetadata);
  145. //
  146. // PutObjectResult putObjectResult = cosClient.putObject(putObjectRequest);
  147. //
  148. // System.out.println(putObjectResult.getRequestId());
  149. //
  150. // GetObjectRequest getObjectRequest = new GetObjectRequest(bucketName, key);
  151. // COSObject cosObject = cosClient.getObject(getObjectRequest);
  152. // System.out.println(cosObject.getObjectMetadata().getRequestId());
  153. //
  154. // cosClient.shutdown();
  155. // return "ok";
  156. // }
  157. //
  158. // 文档中心 > SDK 中心 > Java
  159. // https://cloud.tencent.com/document/sdk/Java
  160. // 【腾讯云-混元大模型】
  161. // https://cloud.tencent.com/document/api/1729/101843
  162. // private final static Charset UTF8 = StandardCharsets.UTF_8;
  163. //// // 需要设置环境变量 TENCENTCLOUD_SECRET_ID,值为示例的 AKIDz8krbsJ5yKBZQpn74WFkmLPx3*******
  164. //// private final static String SECRET_ID = "AKID3zlNxRjstjnohWFnDUfeVBj3CJH7mFaK";
  165. //// // 需要设置环境变量 TENCENTCLOUD_SECRET_KEY,值为示例的 Gu5t9xGARNpq86cd98joQYCN3*******
  166. //// private final static String SECRET_KEY = "IXgzFKB71rXOCxlS4BTdtCYuJbP8h7Xr";
  167. //
  168. // @Value("tencent.hunyuan.secret-id")
  169. // private String SECRET_ID;
  170. // @Value("tencent.hunyuan.secret-key")
  171. // private String SECRET_KEY;
  172. //
  173. //
  174. // private final static String CT_JSON = "application/json; charset=utf-8";
  175. // public static byte[] hmac256(byte[] key, String msg) throws Exception {
  176. // Mac mac = Mac.getInstance("HmacSHA256");
  177. // SecretKeySpec secretKeySpec = new SecretKeySpec(key, mac.getAlgorithm());
  178. // mac.init(secretKeySpec);
  179. // return mac.doFinal(msg.getBytes(UTF8));
  180. // }
  181. // public static String sha256Hex(String s) throws Exception {
  182. // MessageDigest md = MessageDigest.getInstance("SHA-256");
  183. // byte[] d = md.digest(s.getBytes(UTF8));
  184. // return DatatypeConverter.printHexBinary(d).toLowerCase();
  185. // }
  186. // @GetMapping("testTencentSDK/hunyuan")
  187. // public Result testTencentSDKHunyuan() throws Exception {
  188. //
  189. // try {
  190. // String result = "";
  191. // Credential cred = new Credential(SECRET_ID, SECRET_KEY);
  192. // ClientProfile clientProfile = new ClientProfile();
  193. // HunyuanClient client = new HunyuanClient(cred, "ap-guangzhou", clientProfile);
  194. //
  195. // ChatStdRequest req = new ChatStdRequest();
  196. // Message msg = new Message();
  197. // msg.setRole("user");
  198. // msg.setContent("给我一句诗,不超过10个字");
  199. // req.setMessages(new Message[]{ msg });
  200. //
  201. // ChatStdResponse resp = client.ChatStd(req);
  202. //
  203. // Gson gson = new GsonBuilder().create();
  204. // for (SSEResponseModel.SSE e : resp) {
  205. //
  206. // System.out.println(e.Data);
  207. //
  208. // /**
  209. // * .Data:
  210. // * {"Note":"以上内容为AI生成,不代表开发者立场,请勿删除或修改本标记","Choices":[{"FinishReason":"","Delta":{"Role":"assistant","Content":"当然"}}],"Created":1709618061,"Id":"e73c0a71-5c98-4893-ba90-ad5056d5871a","Usage":{"PromptTokens":7,"CompletionTokens":1,"TotalTokens":8}}
  211. // * e.Data:
  212. // * {"Note":"以上内容为AI生成,不代表开发者立场,请勿删除或修改本标记","Choices":[{"FinishReason":"","Delta":{"Role":"assistant","Content":"可以"}}],"Created":1709618061,"Id":"e73c0a71-5c98-4893-ba90-ad5056d5871a","Usage":{"PromptTokens":7,"CompletionTokens":2,"TotalTokens":9}}
  213. // * e.Data:
  214. // * {"Note":"以上内容为AI生成,不代表开发者立场,请勿删除或修改本标记","Choices":[{"FinishReason":"","Delta":{"Role":"assistant","Content":","}}],"Created":1709618061,"Id":"e73c0a71-5c98-4893-ba90-ad5056d5871a","Usage":{"PromptTokens":7,"CompletionTokens":3,"TotalTokens":10}}
  215. // * e.Data:
  216. // */
  217. // JSONObject dataObject = JSONUtil.parseObj(e.Data);
  218. // JSONArray choicesArray = dataObject.getJSONArray("Choices");
  219. // if (choicesArray != null && choicesArray.size() > 0) {
  220. // // 获取第一个元素
  221. // JSONObject firstChoice = choicesArray.getJSONObject(0);
  222. // System.out.println("firstChoice:");
  223. // System.out.println(firstChoice);
  224. // // 获取 Delta 对象
  225. // JSONObject deltaObject = firstChoice.getJSONObject("Delta");
  226. // System.out.println("deltaObject:");
  227. // System.out.println(deltaObject);
  228. // // 获取 content 的值
  229. // String content = deltaObject.getStr("Content");
  230. // System.out.println("Content: " + content);
  231. //
  232. // result += content;
  233. // System.out.println("result: " + result);
  234. // System.out.println("---------------------------------------------");
  235. // }
  236. // }
  237. // return Result.success(result);
  238. //
  239. // } catch (TencentCloudSDKException e) {
  240. // e.printStackTrace();
  241. // }
  242. // return null;
  243. // }
  244. // @GetMapping("testQueue")
  245. // @QueuingPoll
  246. // public String testQueue(@RequestParam Integer tenantId, @RequestParam Integer time) throws InterruptedException {
  247. // Thread currentThread = Thread.currentThread();
  248. // String threadName = currentThread.getName();
  249. // System.out.println(threadName + " 开始休眠: " + time);
  250. // Thread.sleep(time);
  251. // System.out.println(threadName + " 休眠结束: " + time);
  252. // return threadName;
  253. // }
  254. @GetMapping("testMeitu/login")
  255. public JSONObject testMeituLogin(String code, String access_key) {
  256. System.out.println("code: " + code + ", access_key: " + access_key);
  257. System.out.println("---------------------------------------------------");
  258. String response = "{\"code\": 0,\"msg\": \"success\", \"data\": {\"id\": \"enjdj328ydhhw3u43yjhdj\", \"name\": \"张三\",\"avatar_url\": \"http://www.**.com/avatar/icon.jpg\"}}";
  259. JSONObject jsonObject = JSONUtil.parseObj(response);
  260. return jsonObject;
  261. }
  262. @Autowired
  263. private RedisTemplate redisTemplate;
  264. @GetMapping("testQueue")
  265. @QueuingPoll
  266. public String testQueue(String taskId) {
  267. redisTemplate.opsForList().rightPush("demoQueue", taskId);
  268. Long listSize = redisTemplate.opsForList().size("demoQueue");
  269. System.out.println("队伍总人数: " + listSize);
  270. List listData = redisTemplate.opsForList().range("demoQueue", 0, -1);
  271. System.out.println("队伍信息: " + listData.toString() + ", taskId: " + taskId + ", listData.get(0): " + listData.get(0));
  272. Integer index = 0;
  273. if (listData.size() == 0 || (listData.size() > 0 && listData.get(0).toString().equals(taskId))) {
  274. // 创建一个CompletableFuture来执行异步任务
  275. CompletableFuture<Void> future = CompletableFuture.runAsync(() -> {
  276. // 执行业务逻辑
  277. System.out.println("开始休眠..");
  278. try {
  279. Thread.sleep(5000);
  280. } catch (InterruptedException e) {
  281. throw new RuntimeException(e);
  282. }
  283. System.out.println("休眠结束..");
  284. //
  285. Long removeNum = redisTemplate.opsForList().remove("demoQueue", 0, taskId);
  286. System.out.println("离开队伍: " + removeNum);
  287. System.out.println("-------------------------------------");
  288. });
  289. return "操作成功";
  290. } else {
  291. index = listData.indexOf(taskId);
  292. return "排队中:" + index + " / " + listSize;
  293. }
  294. }
  295. /**
  296. * 这里多个key用":" 拼接,后续定时任务踢出队列拆分使用。
  297. * @param keys
  298. * @return
  299. */
  300. public static String buildResourcesSetValue(String... keys){
  301. return String.join(":",keys);
  302. }
  303. // @GetMapping("testQueue")
  304. // public String testQueue() throws InterruptedException {
  305. // // 定义Redis信号量,允许的最大并发数为1
  306. // RSemaphore semaphore = redissonClient.getSemaphore("demoQueue");
  307. // int maxConcurrentRequests = 2; // 允许的最大并发请求数
  308. //
  309. // try {
  310. // // 尝试获取信号量,设定超时时间为3秒
  311. // if (!semaphore.tryAcquire(maxConcurrentRequests, 3, TimeUnit.SECONDS)) {
  312. // // 如果无法获取信号量,说明并发数已满,抛出异常
  313. // long waitingPosition = getWaitingPosition();
  314. // throw new CustomException("正在排队中,第" + waitingPosition + "位 / 共" + maxConcurrentRequests + "位");
  315. // }
  316. // // 执行业务逻辑
  317. // System.out.println("开始休眠..");
  318. // Thread.sleep(5000);
  319. // System.out.println("休眠结束..");
  320. //
  321. // } catch (InterruptedException e) {
  322. // // 处理中断异常
  323. // throw new CustomException("处理中断异常");
  324. //
  325. // } finally {
  326. // // 释放信号量
  327. //// if (semaphore.isHeldByCurrentThread()) {
  328. // System.out.println("semaphore:");
  329. // System.out.println(semaphore);
  330. // System.out.println(semaphore.isExists());
  331. // semaphore.release();
  332. //// }
  333. // }
  334. //
  335. //
  336. // // 返回结果
  337. // return "操作成功";
  338. //
  339. // }
  340. //
  341. // // 获取当前排队位置的方法
  342. // private long getWaitingPosition() {
  343. // RScoredSortedSet<Object> scoreSet = redissonClient.getScoredSortedSet("demoQueue");
  344. //// long queueSize = scoreSet.size();
  345. //// System.out.println("(getWaitingPosition) queueSize: " + queueSize);
  346. // long waitingPosition = 0;
  347. // // 遍历有序集合,计算当前请求之前的请求数量
  348. // Iterator<Object> iterator = scoreSet.iterator(0);
  349. // while (iterator.hasNext()) {
  350. // Object obj = iterator.next();
  351. // Double score = scoreSet.getScore(obj);
  352. // if (score > System.currentTimeMillis()) {
  353. // waitingPosition++;
  354. // }
  355. // }
  356. // return waitingPosition;
  357. // }
  358. /* 字符串 转 JSONObject */
  359. @GetMapping("testJSONObject")
  360. public JSONObject testGson() {
  361. String jsonString = " {\"Note\":\"以上内容为AI生成,不代表开发者立场,请勿删除或修改本标记\",\"Choices\":[{\"FinishReason\":\"stop\",\"Delta\":{\"Role\":\"assistant\",\"Content\":\"\"}}],\"Created\":1709617106,\"Id\":\"7511d79a-6318-4da1-883a-35c8be97f67f\",\"Usage\":{\"PromptTokens\":7,\"CompletionTokens\":23,\"TotalTokens\":30}}";
  362. JSONObject jsonObject = JSONUtil.parseObj(jsonString);
  363. return jsonObject;
  364. }
  365. // 【火山引擎】
  366. // - 公共错误代码
  367. // https://www.volcengine.com/docs/6369/68677
  368. // - 获取个性化内容
  369. // https://www.volcengine.com/docs/6392/75762
  370. // - 模型广场
  371. // https://www.volcengine.com/docs/82379/1099503
  372. // @GetMapping("testHuoshanSDK")
  373. // public String testHuoShanSDK() throws Exception {
  374. // // 注意示例代码安全,代码泄漏会导致AK/SK泄漏,有极大的安全风险。
  375. // String ak = "AKLTMjM2OTNmNTViNGQ3NDM0NmI1YjU4MmU2ZjY5YzEwM2I";
  376. // String sk = "WlRZMk5qRTJOR1ZrTURnMk5EVmhZVGc1TmpVeE4yUTJNelkzWXpVeU1XVQ==";
  377. //
  378. // BusinessSecurityService businessSecurityService = BusinessSecurityServiceImpl.getInstance();
  379. // // call below method if you dont set ak and sk in ~/.volc/config
  380. //
  381. // businessSecurityService.setAccessKey(ak);
  382. // businessSecurityService.setSecretKey(sk);
  383. // // risk detection
  384. // try {
  385. // RiskDetectionRequest riskDetectionRequest = new RiskDetectionRequest();
  386. //// riskDetectionRequest.setLimit(3);
  387. //
  388. // RiskDetectionResponse riskDetectionResponse = businessSecurityService.RiskDetection(riskDetectionRequest);
  389. // System.out.println(JSON.toJSONString(riskDetectionResponse));
  390. // } catch (Exception e) {
  391. // e.printStackTrace();
  392. // }
  393. //
  394. // return "1";
  395. // }
  396. // @GetMapping("testMeituSDK")
  397. // public SdkResponseDTO.Result testMeituSDK() throws URISyntaxException {
  398. // //使用前需提前申请 AccessKey 和 secret,具体获取,请对接商务
  399. // String accessKey = "306129caf4574016be9c09a5b0ecdcad";
  400. // String secret = "a202a3f4f0a844109cea84af79ad9b40";
  401. //
  402. // // 创建AiClient实例
  403. // AiClient aiClient = new AiClient(accessKey,secret);
  404. //
  405. // // 【美图AI - 文生图】
  406. // // https://ai.meitu.com/doc/?id=228&type=api&lang=zh
  407. //
  408. // // 文生图的请求对象
  409. // InferenceParamsDTO inferenceParamsDTO = new InferenceParamsDTO();
  410. // // 推理业务配置中获取中约定的模型平台
  411. // inferenceParamsDTO.setModelPlatform("diffusers");
  412. // // 推理业务配置中获取的模型
  413. // inferenceParamsDTO.setModel("braBeautifulRealistic_V5_diffusers_v0.1.zip");
  414. // // 提示词
  415. // inferenceParamsDTO.setPrompt("a girl");
  416. // // 方向提示词
  417. // inferenceParamsDTO.setNegativePrompt("easy negative");
  418. // // 推理业务配置中获取中约定的高
  419. // inferenceParamsDTO.setHeight(512);
  420. // // 推理业务配置中获取中约定的宽
  421. // inferenceParamsDTO.setHeight(512);
  422. // // 推理提交推理任务,并等待返回推理图片地址
  423. // SdkResponseDTO.Result result = aiClient.inference(inferenceParamsDTO);
  424. // return result;
  425. // }
  426. @GetMapping("testWordExport")
  427. public Map<String, Object> SimpleWordExport() {
  428. Map<String, Object> map = new HashMap<String, Object>();
  429. map.put("title", "Easypoi 标题");
  430. map.put("content", "JueYue 内容,在家也能享受绿色健康美味!用纯天然无添加剂的食材,带给你和家人最纯净的美味。从选购新鲜食材到烘焙出炉,每一步都充满温馨与乐趣。让我们一起回归自然,享受绿色健康的蛋糕时光!");
  431. try {
  432. XWPFDocument doc = WordExportUtil.exportWord07("D:/excel/template.docx", map);
  433. FileOutputStream fos = new FileOutputStream("D:/excel/simple.docx");
  434. doc.write(fos);
  435. fos.close();
  436. } catch (Exception e) {
  437. e.printStackTrace();
  438. }
  439. return map;
  440. }
  441. @GetMapping("testGetUUID")
  442. public String testGetUUID() {
  443. return UUID.randomUUID().toString();
  444. }
  445. /**
  446. * BCrypt算法进行加密
  447. */
  448. @GetMapping("testPassword")
  449. public String testPassword(String value) {
  450. String password = Optional.ofNullable(value).orElse("123456");
  451. BCryptPasswordEncoder encoder = new BCryptPasswordEncoder();
  452. String encodedPassword = encoder.encode(password);
  453. boolean matched = encoder.matches(password, encodedPassword);
  454. return "Value: " + value + "\nencodedPassword: " + encodedPassword + "\nmatched: " + matched;
  455. }
  456. /**
  457. * 使用 MD5Util 工具类
  458. */
  459. @GetMapping("testMD5")
  460. public String testMD5(String value) throws NoSuchAlgorithmException {
  461. String password = Optional.ofNullable(value).orElse("123456");
  462. String version = "0.0.38";
  463. return "Value: " + value + "\n" +
  464. "MD5: " + MD5Util.encrypt(password) + "\n" +
  465. "Version: " + version;
  466. }
  467. @GetMapping("/testJSON")
  468. public String testJSON() throws JsonProcessingException {
  469. Integer[] a = MAPPER.readValue("1,2", Integer[].class);
  470. System.out.println("a: ");
  471. System.out.println(a);
  472. return "1";
  473. }
  474. @GetMapping("testFont")
  475. public String[] testFont() {
  476. GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
  477. String[] fontNames = ge.getAvailableFontFamilyNames();
  478. for (String fontName : fontNames) {
  479. System.out.println(fontName);
  480. }
  481. return fontNames;
  482. }
  483. /**
  484. * Redisson 加锁
  485. * @return
  486. */
  487. @Lazy
  488. @Autowired
  489. RedissonClient redissonClient;
  490. @GetMapping("testRedisson")
  491. public String testGetRedisson() throws InterruptedException {
  492. RLock lock = redissonClient.getLock("my-lock");
  493. lock.tryLock(3, TimeUnit.SECONDS); // 阻塞式等待。默认加的锁是30s时间
  494. try {
  495. // 1、锁的自动续期,运行期间自动给锁续上新的30s,无需担心业务时间长,锁过期会自动被释放
  496. // 2、加锁的业务只要运行完成,就不会给当前锁续期,即使不手动释放锁,锁默认在30s后自动释放,避免死锁
  497. System.out.println("加锁成功,执行业务代码..."+Thread.currentThread().getId());
  498. Thread.sleep(3000);
  499. } catch (Exception e) {
  500. e.printStackTrace();
  501. } finally {
  502. System.out.println("释放锁..."+Thread.currentThread().getId());
  503. lock.unlock();
  504. }
  505. return "get lock!";
  506. }
  507. /**
  508. * Redisson 一般用于商品秒杀活动:
  509. */
  510. /*
  511. @Component
  512. public class DistributedLockExample {
  513. @Autowired
  514. private Redisson redisson;
  515. private RLock distributedLock;
  516. @PostConstruct
  517. private void init() {
  518. distributedLock = redisson.getLock("myDistributedLock");
  519. }
  520. public void performOperation() {
  521. try {
  522. // 尝试获取分布式锁,最多等待10秒
  523. boolean lockAcquired = distributedLock.tryLock(10, TimeUnit.SECONDS);
  524. if (lockAcquired) {
  525. // 获取锁成功,执行需要加锁的业务逻辑
  526. // ...
  527. } else {
  528. // 获取锁失败,处理异常情况
  529. // ...
  530. }
  531. } catch (InterruptedException e) {
  532. // 处理中断异常
  533. // ...
  534. } finally {
  535. // 释放分布式锁
  536. distributedLock.unlock();
  537. }
  538. }
  539. }
  540. */
  541. public static Object resource1 = new Object();
  542. public static Object resource2 = new Object();
  543. @GetMapping("testDeadLock")
  544. public String testDeadLock() {
  545. RLock lock = redissonClient.getLock("thread-lock");
  546. // 线程1
  547. new Thread(() -> {
  548. //System.out.println("------- lock thread-1 -------");
  549. lock.lock();
  550. synchronized (resource2) {
  551. System.out.println(Thread.currentThread().getName() + "获取了 resource2 锁");
  552. try {
  553. Thread.sleep(3000);
  554. } catch (InterruptedException e) {
  555. throw new RuntimeException(e);
  556. }
  557. synchronized (resource1) {
  558. System.out.println(Thread.currentThread().getName() + "获取了 resource1 锁");
  559. lock.unlock();
  560. }
  561. }
  562. }).start();
  563. // 线程2
  564. new Thread(() -> {
  565. //System.out.println("------- lock thread-2 -------");
  566. lock.lock();
  567. synchronized (resource1) {
  568. System.out.println(Thread.currentThread().getName() + "获取了 resource1 锁");
  569. try {
  570. Thread.sleep(3000);
  571. } catch (InterruptedException e) {
  572. throw new RuntimeException(e);
  573. }
  574. synchronized (resource2) {
  575. System.out.println(Thread.currentThread().getName() + "获取了 resource2 锁");
  576. lock.unlock();
  577. }
  578. }
  579. }).start();
  580. return "ok";
  581. }
  582. // @GetMapping("testHttpExchangeList")
  583. // public List<Map<String, Object>> testHttpExchangeList() {
  584. // return httpTodoService.getTodos();
  585. // }
  586. //
  587. // @GetMapping("testHttpExchange")
  588. // public Map<String, Object> testHttpExchange() {
  589. // return httpTodoService.getTodoById(1);
  590. // }
  591. }