Springboot應用開發工具類整理

目錄

一、編寫目的

二、映射工具類

2.1 依賴

2.2 代碼

三、日期格式

3.1 依賴

3.2 代碼

四、加密

4.1 代碼

五、Http請求

5.1 依賴

5.2 代碼

六、金額

6.1?代碼

七、二維碼

7.1 依賴

7.2 代碼

八、坐標轉換

8.1 代碼

九、樹結構

9.1?代碼

9.1.1 節點

?9.1.2 工具類

十、結語


Welcome to Code Block’s blog

本篇文章主要介紹了

[Springboot應用開發:工具類整理]
博主廣交技術好友,喜歡文章的可以關注一下

一、編寫目的

在實際的Springboot應用開發中,有很多類可作為工具類,這些類將實際開發中可能用到的重復性代碼進行提取,方便在后續的開發中使用,在這里我對在開發中經常用到的工具類進行整理,方便自己之后查找,同時希望可以幫助到有實現相關功能的朋友。

二、映射工具類

映射工具類主要用于在不同實體類結構之間的轉換,經常用于DTO->BO的轉換.例:在Controller中接收的Body(DTO)與要存儲到數據庫中的字段(BO)經常是不同的.這時可以使用該工具類進行轉換,使用sourceToTarget對單個實體類或列表進行轉換.具體代碼如下:

2.1 依賴

		<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId><exclusions><exclusion><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-logging</artifactId></exclusion></exclusions></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-log4j2</artifactId></dependency>

2.2 代碼

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.BeanUtils;import java.util.ArrayList;
import java.util.Collection;
import java.util.List;/*** 轉換工具類*/
public class ConvertUtils {private static Logger logger = LoggerFactory.getLogger(ConvertUtils.class);/**** @param source 原始類實體* @param target 目標類* @return 目標類實體* @param <T> 泛型*/public static <T> T sourceToTarget(Object source, Class<T> target){if(source == null){return null;}T targetObject = null;try {targetObject = target.newInstance();BeanUtils.copyProperties(source, targetObject);} catch (Exception e) {logger.error("convert error ", e);}return targetObject;}/**** @param sourceList 原始類實體列表* @param target 目標類* @return 目標類實體列表* @param <T> 泛型*/public static <T> List<T> sourceToTarget(Collection<?> sourceList, Class<T> target){if(sourceList == null){return null;}List targetList = new ArrayList<>(sourceList.size());try {for(Object source : sourceList){T targetObject = target.newInstance();BeanUtils.copyProperties(source, targetObject);targetList.add(targetObject);}}catch (Exception e){logger.error("convert error ", e);}return targetList;}
}

三、日期格式

日期格式工具類主要用于日期格式的轉換和日期的計算,例如:從yyyy-MM-dd HH:mm:ss轉換為yyyy-MM-dd格式或者從字符串轉換為日期格式.具體代碼如下:

3.1 依賴

		<dependency><groupId>joda-time</groupId><artifactId>joda-time</artifactId><version>2.9.9</version></dependency><dependency><groupId>org.apache.commons</groupId><artifactId>commons-lang3</artifactId><version>3.9</version><!--$NO-MVN-MAN-VER$ --></dependency>

3.2 代碼

import org.apache.commons.lang3.StringUtils;
import org.joda.time.DateTime;
import org.joda.time.LocalDate;
import org.joda.time.format.DateTimeFormat;
import org.joda.time.format.DateTimeFormatter;import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;/*** 日期處理* @author seaua*/
public class DateUtils {/** 時間格式(yyyy-MM-dd) */public final static String DATE_PATTERN = "yyyy-MM-dd";/** 時間格式(yyyy-MM-dd HH:mm:ss) */public final static String DATE_TIME_PATTERN = "yyyy-MM-dd HH:mm:ss";public static Date parse(String date) {if(StringUtils.isEmpty(date)){return null;}SimpleDateFormat df = new SimpleDateFormat(DATE_TIME_PATTERN);try {return df.parse(date);} catch (ParseException e) {e.printStackTrace();return null;}}/*** 日期格式化 日期格式為:yyyy-MM-dd* @param date  日期* @return  返回yyyy-MM-dd格式日期*/public static String format(Date date) {return format(date, DATE_PATTERN);}/*** 日期格式化 日期格式為:yyyy-MM-dd* @param date  日期* @param pattern  格式,如:DateUtils.DATE_TIME_PATTERN* @return  返回yyyy-MM-dd格式日期*/public static String format(Date date, String pattern) {if(date != null){SimpleDateFormat df = new SimpleDateFormat(pattern);return df.format(date);}return null;}/*** 日期解析* @param date  日期* @param pattern  格式,如:DateUtils.DATE_TIME_PATTERN* @return  返回Date*/public static Date parse(String date, String pattern) {try {return new SimpleDateFormat(pattern).parse(date);} catch (ParseException e) {e.printStackTrace();}return null;}/*** 字符串轉換成日期* @param strDate 日期字符串* @param pattern 日期的格式,如:DateUtils.DATE_TIME_PATTERN*/public static Date stringToDate(String strDate, String pattern) {if (StringUtils.isBlank(strDate)){return null;}DateTimeFormatter fmt = DateTimeFormat.forPattern(pattern);return fmt.parseLocalDateTime(strDate).toDate();}/*** 根據周數,獲取開始日期、結束日期* @param week  周期  0本周,-1上周,-2上上周,1下周,2下下周* @return  返回date[0]開始日期、date[1]結束日期*/public static Date[] getWeekStartAndEnd(int week) {DateTime dateTime = new DateTime();LocalDate date = new LocalDate(dateTime.plusWeeks(week));date = date.dayOfWeek().withMinimumValue();Date beginDate = date.toDate();Date endDate = date.plusDays(6).toDate();return new Date[]{beginDate, endDate};}/*** 對日期的【秒】進行加/減** @param date 日期* @param seconds 秒數,負數為減* @return 加/減幾秒后的日期*/public static Date addDateSeconds(Date date, int seconds) {DateTime dateTime = new DateTime(date);return dateTime.plusSeconds(seconds).toDate();}/*** 對日期的【分鐘】進行加/減** @param date 日期* @param minutes 分鐘數,負數為減* @return 加/減幾分鐘后的日期*/public static Date addDateMinutes(Date date, int minutes) {DateTime dateTime = new DateTime(date);return dateTime.plusMinutes(minutes).toDate();}/*** 對日期的【小時】進行加/減** @param date 日期* @param hours 小時數,負數為減* @return 加/減幾小時后的日期*/public static Date addDateHours(Date date, int hours) {DateTime dateTime = new DateTime(date);return dateTime.plusHours(hours).toDate();}/*** 對日期的【天】進行加/減** @param date 日期* @param days 天數,負數為減* @return 加/減幾天后的日期*/public static Date addDateDays(Date date, int days) {DateTime dateTime = new DateTime(date);return dateTime.plusDays(days).toDate();}/*** 對日期的【周】進行加/減** @param date 日期* @param weeks 周數,負數為減* @return 加/減幾周后的日期*/public static Date addDateWeeks(Date date, int weeks) {DateTime dateTime = new DateTime(date);return dateTime.plusWeeks(weeks).toDate();}/*** 對日期的【月】進行加/減** @param date 日期* @param months 月數,負數為減* @return 加/減幾月后的日期*/public static Date addDateMonths(Date date, int months) {DateTime dateTime = new DateTime(date);return dateTime.plusMonths(months).toDate();}/*** 對日期的【年】進行加/減** @param date 日期* @param years 年數,負數為減* @return 加/減幾年后的日期*/public static Date addDateYears(Date date, int years) {DateTime dateTime = new DateTime(date);return dateTime.plusYears(years).toDate();}
}

四、加密

加密工具類用于對數據進行加密,這里是使用HmacSHA256加密算法進行加密,具體代碼如下:

4.1 代碼

import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;public class HMACSHA256 {public static String HMACSHA256(String key, String data) {try {SecretKeySpec signingKey = new SecretKeySpec(key.getBytes(), "HmacSHA256");Mac mac = Mac.getInstance("HmacSHA256");mac.init(signingKey);return byte2hex(mac.doFinal(data.getBytes()));} catch (NoSuchAlgorithmException | InvalidKeyException e) {e.printStackTrace();}return null;}public static String byte2hex(byte[] b) {StringBuilder hs = new StringBuilder();String stmp;for (int n = 0; b != null && n < b.length; n++) {stmp = Integer.toHexString(b[n] & 0XFF);if (stmp.length() == 1) {hs.append('0');}hs.append(stmp);}return hs.toString().toUpperCase();}
}

五、Http請求

Http請求工具類用于從request獲取相關請求參數,如獲取參數列表(ParameterMap)或者請求的Language參數.具體代碼如下:

5.1 依賴

        <dependency><groupId>org.apache.commons</groupId><artifactId>commons-lang3</artifactId><version>3.9</version><!--$NO-MVN-MAN-VER$ --></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency>

5.2 代碼

import java.util.Enumeration;
import java.util.HashMap;
import java.util.Map;import javax.servlet.http.HttpServletRequest;import org.apache.commons.lang3.StringUtils;
import org.springframework.http.HttpHeaders;
import org.springframework.web.context.request.RequestAttributes;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;/*** Http*/
public class HttpContextUtils {/*** 獲取http請求* @return request*/public static HttpServletRequest getHttpServletRequest() {RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes();if (requestAttributes == null) {return null;}return ((ServletRequestAttributes) requestAttributes).getRequest();}/*** 獲取http請求的請求參數列表* @param request http請求* @return 請求參數列表*/public static Map<String, String> getParameterMap(HttpServletRequest request) {Enumeration<String> parameters = request.getParameterNames();Map<String, String> params = new HashMap<>();while (parameters.hasMoreElements()) {String parameter = parameters.nextElement();String value = request.getParameter(parameter);if (StringUtils.isNotBlank(value)) {params.put(parameter, value);}}return params;}/*** 獲取域名 Domain* @return Domain*/public static String getDomain() {HttpServletRequest request = getHttpServletRequest();StringBuffer url = request.getRequestURL();return url.delete(url.length() - request.getRequestURI().length(), url.length()).toString();}/*** 獲取請求地址* @return origin*/public static String getOrigin() {HttpServletRequest request = getHttpServletRequest();return request.getHeader(HttpHeaders.ORIGIN);}/*** 獲取語言,默認返回 "zh-CN"* @return language*/public static String getLanguage() {// 默認語言String defaultLanguage = "zh-CN";// requestHttpServletRequest request = getHttpServletRequest();if (request == null) {return defaultLanguage;}// 請求語言defaultLanguage = request.getHeader(HttpHeaders.ACCEPT_LANGUAGE);return defaultLanguage;}/*** 獲取請求消息頭中的數據*/public static String getRequestReader(HttpServletRequest request) {String line;StringBuilder sb = new StringBuilder();try {while ((line = request.getReader().readLine()) != null) {sb.append(line);}request.getReader().close();} catch (Exception e) {e.printStackTrace();}return sb.toString();}}

六、金額

金額用于對金額數據進行轉換,即帶有格式的字符串數據,將其轉換為方便存儲和計算的數據,本工具類中將元轉換為分.具體代碼如下:

6.1代碼

/*** @author seaua*/
public class MoneyUtil {/*** 獲取金額,轉換單位,元轉換成分*/public static String getMoney(String amount) {if (amount == null) {return "0";}String currency = amount.replaceAll("[$¥,]", ""); // 處理包含, ¥// 或者$的金額int index = currency.indexOf(".");int length = currency.length();long amLong;if (index == -1) {amLong = Long.parseLong(currency + "00");} else if (length - index >= 3) {amLong = Long.parseLong((currency.substring(0, index + 3)).replace(".", ""));} else if (length - index == 2) {amLong = Long.parseLong((currency.substring(0, index + 2)).replace(".", "") + 0);} else {amLong = Long.parseLong((currency.substring(0, index + 1)).replace(".", "") + "00");}return Long.toString(amLong);}
}

七、二維碼

二維碼工具類在實際開發中用于二維碼的生成,在本工具類中createImageToLocal將生成的二維碼存儲到本地,createImage用于生成二維碼并轉換為base64字符串,用于在網絡中傳輸.具體代碼如下:

7.1 依賴

		<dependency><groupId>com.alipay.sdk</groupId><artifactId>alipay-sdk-java</artifactId><version>4.10.70.ALL</version></dependency><dependency><groupId>com.google.zxing</groupId><artifactId>core</artifactId><version>3.3.3</version></dependency><dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.7.3</version></dependency>

7.2 代碼

import java.awt.image.BufferedImage;
import java.io.OutputStream;
import java.util.Hashtable;import javax.imageio.ImageIO;import com.alipay.api.internal.util.file.ByteArrayOutputStream;
import com.google.zxing.BarcodeFormat;
import com.google.zxing.EncodeHintType;
import com.google.zxing.MultiFormatWriter;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;import cn.hutool.core.codec.Base64Encoder;public class QRCodeUtil {// 二維碼尺寸public static final int QRCODE_SIZE = 300;// 存放二維碼的路徑public static final String PAY_PATH = "c://pay";/*** 生成二維碼存到本地* * @param content      源內容* @param outputStream 輸出流* @throws Exception*/public static void createImageToLocal(String content, OutputStream outputStream) throws Exception {Hashtable hints = new Hashtable();hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H);hints.put(EncodeHintType.CHARACTER_SET, "utf-8");hints.put(EncodeHintType.MARGIN, 1);BitMatrix bitMatrix = new MultiFormatWriter().encode(content, BarcodeFormat.QR_CODE, QRCODE_SIZE, QRCODE_SIZE,hints);int width = bitMatrix.getWidth();int height = bitMatrix.getHeight();BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);for (int x = 0; x < width; x++) {for (int y = 0; y < height; y++) {image.setRGB(x, y, bitMatrix.get(x, y) ? 0xFF000000 : 0xFFFFFFFF);}}// 存到磁盤ImageIO.write(image, "jpg", outputStream);}/*** 生成二維碼* * @param content 源內容* @return* @throws Exception*/public static String createImage(String content) throws Exception {Hashtable hints = new Hashtable();hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H);hints.put(EncodeHintType.CHARACTER_SET, "utf-8");hints.put(EncodeHintType.MARGIN, 1);BitMatrix bitMatrix = new MultiFormatWriter().encode(content, BarcodeFormat.QR_CODE, QRCODE_SIZE, QRCODE_SIZE,hints);int width = bitMatrix.getWidth();int height = bitMatrix.getHeight();BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);for (int x = 0; x < width; x++) {for (int y = 0; y < height; y++) {image.setRGB(x, y, bitMatrix.get(x, y) ? 0xFF000000 : 0xFFFFFFFF);}}// 創建儲存圖片二進制流的輸出流ByteArrayOutputStream baos = new ByteArrayOutputStream();ImageIO.write(image, "jpg", baos);// 轉成Base64格式byte[] b = baos.toByteArray();Base64Encoder encoder = new Base64Encoder();return encoder.encode(b);}}

八、坐標轉換

坐標轉換用于不同地理坐標數據之間的轉換,這在地理應用開發中經常用到,在本篇文章中的代碼中實現gps84ToXY(wgs84到大地2000),GCJ02ToWGS84:火星坐標系(GCJ02)轉地球坐標系(WGS84)具體代碼如下:

8.1 代碼

public class RtkUtils {/*** 將WGS84經緯度轉為大地2000坐標** @param B      緯度* @param L      經度* @param degree //* @return*/public static double[] gps84ToXY(double B, double L, double degree) {double[] xy = {0, 0};double a = 6378137;//橢球長半軸double b = 6356752.3142451795;//橢球短半軸double e = 0.081819190842621;//第一偏心率double eC = 0.0820944379496957;//第二偏心率double L0 = 0;//中央子午線經度int n = 0;//帶號if (degree == 6) {//6度n = (int) (Math.round((L + degree / 2) / degree));L0 = degree * n - degree / 2;} else {//3度n = (int) Math.round(L / degree);L0 = degree * n;}//開始計算double radB = B * Math.PI / 180;//緯度(弧度)double radL = L * Math.PI / 180;//經度(弧度)double deltaL = (L - L0) * Math.PI / 180;//經度差(弧度)double N = a * a / b / Math.sqrt(1 + eC * eC * Math.cos(radB) * Math.cos(radB));double C1 = 1.0 + 3.0 / 4 * e * e + 45.0 / 64 * Math.pow(e, 4) + 175.0 / 256 * Math.pow(e, 6) + 11025.0 / 16384 * Math.pow(e, 8);double C2 = 3.0 / 4 * e * e + 15.0 / 16 * Math.pow(e, 4) + 525.0 / 512 * Math.pow(e, 6) + 2205.0 / 2048 * Math.pow(e, 8);double C3 = 15.0 / 64 * Math.pow(e, 4) + 105.0 / 256 * Math.pow(e, 6) + 2205.0 / 4096 * Math.pow(e, 8);double C4 = 35.0 / 512 * Math.pow(e, 6) + 315.0 / 2048 * Math.pow(e, 8);double C5 = 315.0 / 131072 * Math.pow(e, 8);double t = Math.tan(radB);double eta = eC * Math.cos(radB);double X = a * (1 - e * e) * (C1 * radB - C2 * Math.sin(2 * radB) / 2 + C3 * Math.sin(4 * radB) / 4 - C4 * Math.sin(6 * radB) / 6 + C5 * Math.sin(8 * radB));xy[0] = X + N * Math.sin(radB) * Math.cos(radB) * Math.pow(deltaL, 2) * (1 + Math.pow(deltaL * Math.cos(radB), 2) * (5 - t * t + 9 * eta * eta + 4 * Math.pow(eta, 4)) / 12 + Math.pow(deltaL * Math.cos(radB), 4) * (61 - 58 * t * t + Math.pow(t, 4)) / 360) / 2;xy[1] = N * deltaL * Math.cos(radB) * (1 + Math.pow(deltaL * Math.cos(radB), 2) * (1 - t * t + eta * eta) / 6 + Math.pow(deltaL * Math.cos(radB), 4) * (5 - 18 * t * t + Math.pow(t, 4) - 14 * eta * eta - 58 * eta * eta * t * t) / 120) + 500000;// +n * 1000000;return xy;}private static final double PI = 3.1415926535897932384626;// 衛星橢球坐標投影到平面地圖坐標系的投影因子。  地球長半徑private static final double EARTH_MAJOR_RADIUS = 6378245.0;// 橢球的偏心率。private static final double ECCENTRICITY_RATIO = 0.00669342162296594323;/*** 火星坐標系(GCJ02)轉地球坐標系(WGS84)** @param gcjLat 火星坐標緯度* @param gcjLng 火星坐標經度*/public static Double[] GCJ02ToWGS84(Double gcjLng, Double gcjLat) {double dlat = transformlat(gcjLng - 105.0, gcjLat - 35.0);double dlng = transformlng(gcjLng - 105.0, gcjLat - 35.0);double radlat = gcjLat / 180.0 * PI;double magic = Math.sin(radlat);magic = 1 - ECCENTRICITY_RATIO * magic * magic;double sqrtmagic = Math.sqrt(magic);dlat = (dlat * 180.0) / ((EARTH_MAJOR_RADIUS * (1 - ECCENTRICITY_RATIO)) / (magic * sqrtmagic) * PI);dlng = (dlng * 180.0) / (EARTH_MAJOR_RADIUS / sqrtmagic * Math.cos(radlat) * PI);double mglat = gcjLat + dlat;double mglng = gcjLng + dlng;return new Double[]{gcjLng * 2 - mglng, gcjLat * 2 - mglat};}private static Double transformlat(double lng, double lat) {double ret = -100.0 + 2.0 * lng + 3.0 * lat + 0.2 * lat * lat + 0.1 * lng * lat + 0.2 * Math.sqrt(Math.abs(lng));ret += (20.0 * Math.sin(6.0 * lng * PI) + 20.0 * Math.sin(2.0 * lng * PI)) * 2.0 / 3.0;ret += (20.0 * Math.sin(lat * PI) + 40.0 * Math.sin(lat / 3.0 * PI)) * 2.0 / 3.0;ret += (160.0 * Math.sin(lat / 12.0 * PI) + 320 * Math.sin(lat * PI / 30.0)) * 2.0 / 3.0;return ret;}private static Double transformlng(double lng, double lat) {double ret = 300.0 + lng + 2.0 * lat + 0.1 * lng * lng + 0.1 * lng * lat + 0.1 * Math.sqrt(Math.abs(lng));ret += (20.0 * Math.sin(6.0 * lng * PI) + 20.0 * Math.sin(2.0 * lng * PI)) * 2.0 / 3.0;ret += (20.0 * Math.sin(lng * PI) + 40.0 * Math.sin(lng / 3.0 * PI)) * 2.0 / 3.0;ret += (150.0 * Math.sin(lng / 12.0 * PI) + 300.0 * Math.sin(lng / 30.0 * PI)) * 2.0 / 3.0;return ret;}}

九、樹結構

樹結構工具類在實際開發中用于處理樹狀結構,如菜單部門數據的展示等,具體代碼如下:

9.1代碼

9.1.1 節點
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;/*** 樹節點,所有需要實現樹節點的,都需要繼承該類* @author seaua*/
public class TreeNode<T> implements Serializable {private static final long serialVersionUID = 1L;/*** 主鍵*/private Long id;/*** 上級ID*/private Long pid;/*** 子節點列表*/private List<T> children = new ArrayList<>();public Long getId() {return id;}public void setId(Long id) {this.id = id;}public Long getPid() {return pid;}public void setPid(Long pid) {this.pid = pid;}public List<T> getChildren() {return children;}public void setChildren(List<T> children) {this.children = children;}
}
9.1.2 工具類
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;/*** 樹形結構工具類,如:菜單、部門等*/
public class TreeUtils {/*** 根據pid,構建樹節點*/public static <T extends TreeNode> List<T> build(List<T> treeNodes, Long pid) {//pid不能為空AssertUtils.isNull(pid, "pid");List<T> treeList = new ArrayList<>();for(T treeNode : treeNodes) {if (pid.equals(treeNode.getPid())) {treeList.add(findChildren(treeNodes, treeNode));}}return treeList;}/*** 查找子節點*/private static <T extends TreeNode> T findChildren(List<T> treeNodes, T rootNode) {for(T treeNode : treeNodes) {if(rootNode.getId().equals(treeNode.getPid())) {rootNode.getChildren().add(findChildren(treeNodes, treeNode));}}return rootNode;}/*** 構建樹節點*/public static <T extends TreeNode> List<T> build(List<T> treeNodes) {List<T> result = new ArrayList<>();//list轉mapMap<Long, T> nodeMap = new LinkedHashMap<>(treeNodes.size());for(T treeNode : treeNodes){nodeMap.put(treeNode.getId(), treeNode);}for(T node : nodeMap.values()) {T parent = nodeMap.get(node.getPid());if(parent != null && !(node.getId().equals(parent.getId()))){parent.getChildren().add(node);continue;}result.add(node);}return result;}}

十、結語

上述為本人在實際開發中經常用到的工具類,您可以直接使用這些工具類代碼,當然也可以優化這些類并擴展自己的相關功能。

如果你對區塊鏈感興趣,可以看一下我的區塊鏈專欄.

感謝關注和收藏!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/896038.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/896038.shtml
英文地址,請注明出處:http://en.pswp.cn/news/896038.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【Research Proposal】基于提示詞方法的智能體工具調用研究——研究問題

博客主頁&#xff1a; [小????????] 本文專欄: AIGC | ChatGPT 文章目錄 &#x1f4af;前言&#x1f4af;研究問題1. 如何優化提示詞方法以提高智能體的工具調用能力&#xff1f;2. 如何解決提示詞方法在多模態任務中的挑戰&#xff1f;3. 如何通過提示詞優化智能體…

Java 大視界 -- 國際競爭與合作:Java 大數據在全球市場的機遇與挑戰(94)

&#x1f496;親愛的朋友們&#xff0c;熱烈歡迎來到 青云交的博客&#xff01;能與諸位在此相逢&#xff0c;我倍感榮幸。在這飛速更迭的時代&#xff0c;我們都渴望一方心靈凈土&#xff0c;而 我的博客 正是這樣溫暖的所在。這里為你呈上趣味與實用兼具的知識&#xff0c;也…

25旅游管理研究生復試面試問題匯總 旅游管理專業知識問題很全! 旅游管理復試全流程攻略 旅游管理考研復試真題匯總

旅游管理復試很難&#xff1f;&#xff01; 別怕&#xff01;經驗超豐富的老學姐來給你們出謀劃策啦&#xff01; 最近是不是被旅游管理考研復試折磨得夠嗆&#xff1f;莫慌&#xff01;我這有著豐富復試指導經驗的老學姐來幫你們排雷&#xff0c;助力大家順利上岸&#xff01…

美的樓宇科技基于阿里云 EMR Serverless Spark 構建 LakeHouse 湖倉數據平臺

作者&#xff1a;美的樓宇科技事業部 先行研究中心智能技術部 美的樓宇科技 IoT 數據平臺建設背景 美的樓宇科技事業部&#xff08;以下簡稱樓宇科技&#xff09;是美的集團旗下五大板塊之一&#xff0c;產品覆蓋多聯機組、大型冷水機組、單元機、機房空調、扶梯、直梯、貨梯…

Html5學習教程,從入門到精通,HTML5 元素語法知識點及案例代碼(2)

HTML5 元素語法知識點及案例代碼 一、HTML5 元素概述 HTML5 元素是構成網頁的基本單位&#xff0c;每個元素都有特定的語義和功能。HTML5 元素由開始標簽、內容和結束標簽組成&#xff0c;例如&#xff1a; <p>這是一個段落。</p><p> 是開始標簽這是一個段…

23種設計模式 - 備忘錄模式

模式定義 備忘錄模式&#xff08;Memento Pattern&#xff09;是一種行為型設計模式&#xff0c;其核心是在不破壞對象封裝性的前提下&#xff0c;捕獲并保存對象的內部狀態&#xff0c;以便后續恢復。該模式特別適用于需要實現撤銷/重做、狀態回滾等功能的系統&#xff0c;如…

2025asp.net全棧技術開發學習路線圖

2025年技術亮點?&#xff1a; Blazor已全面支持WebAssembly 2.0標準 .NET 8版本原生集成AI模型部署能力 Azure Kubernetes服務實現智能自動擴縮容 EF Core新增向量數據庫支持特性 ?ASP.NET 全棧開發關鍵技術說明&#xff08;2025年視角&#xff09;? 以下技術分類基于現…

Linux設備驅動-練習

練習要求&#xff1a; 一、設備樹 1、配置設備樹信息&#xff1a;將3個led燈和1個風扇使用到的設備信息配置到設備樹中 二、設備驅動層 1、通過of_find_node_by_name、of_get_named_gpion等內核核心層統一的api接口調用外設&#xff1b; 2、通過udev設備管理器自動注冊并創建設…

Python應用算法之貪心算法理解和實踐

一、什么是貪心算法&#xff1f; 貪心算法&#xff08;Greedy Algorithm&#xff09;是一種簡單而高效的算法設計思想&#xff0c;其核心思想是&#xff1a;在每一步選擇中&#xff0c;都采取當前狀態下最優的選擇&#xff08;即“局部最優解”&#xff09;&#xff0c;希望通…

競爭與冒險問題【數電速通】

時序邏輯電路&#xff1a; 組合邏輯電路中的競爭與冒險問題&#xff1a; 在組合邏輯電路中&#xff0c;競爭和冒險是兩種常見的時序問題&#xff0c;它們通常由電路的延時特性和不完美的設計引起。下面是這兩種現象的詳細解釋&#xff1a; 1. 競爭&#xff08;Race Condition&…

nasm - BasicWindow_64

文章目錄 nasm - BasicWindow_64概述筆記nasm_main.asmmy_build.batEND nasm - BasicWindow_64 概述 學個demo, 這個demo最主要學到了: 不用在調用每個API前都準備陰影區&#xff0c;在API調用后棧平衡。 可以在函數入口處考慮到所用的棧尺寸最大值(16字節對齊&#xff0c;陰…

JavaScript變量的作用域介紹

JavaScript變量的作用域介紹 JavaScript 變量的作用域決定了變量在代碼中的可訪問性。 var 是 JavaScript 中最早用于聲明變量的關鍵字&#xff0c;它函數作用域或全局作用域。 let 關鍵字&#xff0c;具有塊級作用域、全局作用域。 const關鍵字&#xff0c;具有塊級作用域…

Microsoft 365 Copilot中使用人數最多的是哪些應用

今天在瀏覽Microsoft 365 admin center時發現&#xff0c;copilot會自動整理過去30天內所有用戶使用copilot的概況&#xff1a; 直接把這個圖丟給copilot讓它去分析&#xff0c;結果如下&#xff1a; 總用戶情況 總用戶數在各應用中均為 561 人&#xff0c;說明此次統計的樣本…

ue5.2.1 quixel brideg顯示asset not available in uAsset format

我從未見過如此傻x的bug&#xff0c;在ue5.2.1上通過內置quixel下載資源顯示 asset not available in uAsset format 解決辦法&#xff1a;將ue更新到最新版本&#xff0c;通過fab進入商場選擇資源后add to my library 點擊view in launcher打開epic launcher&#xff0c;就可…

當電腦上有幾個python版本Vscode選擇特定版本python

查看當前vscode用的python版本命令 Import sys print(sys.version) 修改VSCODE解釋器 打開 VSCode。 按下 CtrlShiftP打開命令面板。 輸入 Python: Select Interpreter 并選擇它。 從彈出的列表中選擇你安裝的 Python 解釋器。如果你有多個 Python 版本&#xff08;例如…

Vue 中 nextTick 的原理詳解

1. 為什么需要 nextTick Vue 采用 異步渲染機制&#xff0c;當響應式數據發生變化時&#xff0c;Vue 并不會立即更新 DOM&#xff0c;而是將這些變化放入一個 隊列 中&#xff0c;并在 同一事件循環&#xff08;Event Loop&#xff09;中合并相同的修改&#xff0c;最后執行批…

Spring面試題2

1、compareable和compactor區別 定義與包位置:Comparable是一個接口&#xff0c;位于java.lang包,需要類去實現接口&#xff1b;而Compactor是一個外部比較器&#xff0c;位于java.util包 用法&#xff1a;Comparable只需要實現int compareTo(T o) 方法&#xff0c;比較當前對…

DuodooBMS源碼解讀之 cncw_statement模塊

財務應收應付擴展模組用戶使用手冊 一、模塊概述 財務應收應付擴展模組是一個基于 Odoo18 的擴展模塊&#xff0c;主要對財務應收應付相關功能進行了修改和增強。該模塊增加了多個功能模塊&#xff0c;如預收款單模塊、費用類別設置模塊等&#xff0c;同時對發票、公司、銷售…

JUC并發—9.并發安全集合四

大綱 1.并發安全的數組列表CopyOnWriteArrayList 2.并發安全的鏈表隊列ConcurrentLinkedQueue 3.并發編程中的阻塞隊列概述 4.JUC的各種阻塞隊列介紹 5.LinkedBlockingQueue的具體實現原理 6.基于兩個隊列實現的集群同步機制 4.JUC的各種阻塞隊列介紹 (1)基于數組的阻塞…

vue項目啟動時報錯:error:0308010C:digital envelope routines::unsupported

此錯誤與 Node.js 的加密模塊有關&#xff0c;特別是在使用 OpenSSL 3.0 及以上版本時。Vue 項目在啟動時可能會依賴一些舊的加密算法&#xff0c;而這些算法在 OpenSSL 3.0 中默認被禁用&#xff0c;導致 error:0308010C:digital envelope routines::unsupported 錯誤。 解決…