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.rhkb.cn/news/492656.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

libaom 源码分析:熵编码模块介绍

AV1 熵编码原理介绍 关于AV1 熵编码原理介绍可以参考:AV1 编码标准熵编码技术概述libaom 熵编码相关源码介绍 函数流程图 核心函数介绍 av1_pack_bitstream 函数:该函数负责将编码后的数据打包成符合 AV1 标准的比特流格式;包括写入序列头 OBU 的函数 av1_write_obu_header…

一个开源的自托管虚拟浏览器项目,支持在安全、私密的环境中使用浏览器

大家好&#xff0c;今天给大家分享一个开源的自托管虚拟浏览器项目Neko&#xff0c;旨在利用 WebRTC 技术在 Docker 容器中运行虚拟浏览器&#xff0c;为用户提供安全、私密且多功能的浏览体验。 项目介绍 Neko利用 WebRTC 技术在 Docker 容器中运行虚拟浏览器&#xff0c;提供…

【已解决】启动此实时调试器时未使用必需的安全权限。要调试该进程,必须以管理员身份运行此实时调试器。是否调试该进程?

【已解决】启动此实时调试器时未使用必需的安全权限。要调试该进程&#xff0c;必须以管理员身份运行此实时调试器。是否调试该进程? 目录一、前言二、具体原因三、解决方法 目录 报错截图 一、前言 进行应用程序开发时&#xff0c;需要对w3wp进行附加调试等场景&#xff…

Docker--Docker Registry(镜像仓库)

什么是Docker Registry&#xff1f; 镜像仓库&#xff08;Docker Registry&#xff09;是Docker生态系统中用于存储、管理和分发Docker镜像的关键组件。 镜像仓库主要负责存储Docker镜像&#xff0c;这些镜像包含了应用程序及其相关的依赖项和配置&#xff0c;是构建和运行Doc…

如何用细节提升用户体验?

前端给用户反馈是提升用户体验的重要部分&#xff0c;根据场景选择不同的方式可以有效地提升产品的易用性和用户满意度。以下是常见的方法&#xff1a; 1. 视觉反馈 用户执行了某些操作后&#xff0c;需要即时确认操作结果。例如&#xff1a;按钮点击、数据提交、页面加载等。…

flutter 使用dio 请求go语言后台数据接口展示瀑布流图片

添加依赖 dependencies:flutter:sdk: flutterdio: ^5.0.0 # 请检查最新版本flutter_staggered_grid_view: ^0.4.0 添加网络权限 <uses-permission android:name"android.permission.INTERNET" /> go后端代码 图片存放目录 // main.go package mainimport (&q…

感知机与逻辑回归的异同点

1. 共同点 (1) 应用场景 都用于二分类问题。都假设数据是线性可分或近似线性可分的。 (2) 决策边界 两者都通过寻找一个超平面来区分数据。决策函数是线性的&#xff0c;形式为&#xff1a; (3) 输入特征 都可以处理连续和离散特征。都可以通过添加非线性变换扩展到非线…

实操给桌面机器人加上超拟人音色

前面我们讲了怎么用CSK6大模型开发板做一个桌面机器人充当AI语音助理&#xff0c;近期上线超拟人方案&#xff0c;不仅大模型语音最快可以1秒内回复&#xff0c;还可以让我们的桌面机器人使用超拟人音色、具备声纹识别等能力&#xff0c;本文以csk6大模型开发板为例实操怎么把超…

docker(wsl)命令 帮助文档

WSL wsl使用教程 wsl -l -v 列出所有已安装的 Linux 发行版 wsl -t Ubuntu-22.04 --shutdown 关闭所有正在运行的WSL发行版。如果你只想关闭特定的发行版 wsl -d Ubuntu-22.04 登录到Ubuntu环境 wsl --list --running 查看正在wsl中运行的linux发行版 wsl --unregister (系统名…

CNN、RNN、LSTM和Transformer之间的区别和联系

文章目录 CNN、RNN、LSTM和Transformer之间的区别和联系前言CNN&#xff08;卷积神经网络&#xff09;RNN&#xff08;循环神经网络&#xff09;LSTM&#xff08;长短期记忆网络&#xff09;Transformer四者之间的联系与区别Yolo算法简介Yolo和CNN的关系YOLO各版本 CNN、RNN、L…

无人机航测VS传统测绘

无人机航测系统的优点 机动灵活&#xff0c;作业周期短&#xff1a; 无人机航测系统能够迅速响应测绘需求&#xff0c;不受地形和交通限制&#xff0c;可以灵活调整航线&#xff0c;作业周期短。 无人机体积小&#xff0c;噪音小&#xff0c;可以垂直起降、悬停、侧飞、倒飞…

小红书飞书素材库 | AI改写 | 无水印下载 | 多维表格 | 采集同步 | 影刀RPA

小红书飞书素材库 | AI改写 | 无水印下载 | 多维表格 | 采集同步 | 影刀RPA 模板准备 进入【小红书】素材采集库_荷逸模板&#xff0c;点击使用模板 创建文档应用 在开发者后台 - 飞书开放平台创建 企业自建应用 (需要账号有相应的权限, 如果没有权限向管理员申请) 获取 Ap…

[计算机网络]ARP协议的故事:小明找小红的奇妙旅程

1.ARP小故事 在一个繁忙的网络世界中&#xff0c;每个设备都有自己的身份标识——MAC地址&#xff0c;就像每个人的身份证号码一样。在这个故事里&#xff0c;我们的主角小明&#xff08;主机&#xff09;需要找到小红&#xff08;目标主机&#xff09;的MAC地址&#xff0c;才…

IP协议详解

目录 一. IP协议概述 1. 概念 2. 特点 (1) 无连接性 (2) 不可靠传输 (3) 数据包分片和重组 二. IP协议报文格式 1. 版本 (4位) 2. 首部长度 (4位) 3. 服务类型 (8位) 4. 总长度 (16位) 5. 标识, 标志位, 片偏移 6. 生存时间 (8位) 7. 协议 (8位) 8. 首部检验和 (1…

使用Gradio编写大模型ollama客户端 -界面版

使用Gradio编写大模型ollama客户端 -界面版 flyfish 文末包含完整源码 图例 sqlite3 是 Python 内置的一个库&#xff0c;用于与 SQLite 数据库进行交互。SQLite 是一个轻量级的数据库&#xff0c;它不需要单独的服务器进程或系统的配置&#xff0c;非常适合于嵌入式应用和…

[IT项目管理]九.项目质量管理

九&#xff0e;项目质量管理 9.1项目质量管理的重要性 对于很多IT项目的差劲&#xff0c;大多数人只可以忍受。项目质量管理是IT项目管理的重要组成部分&#xff0c;对于提高项目成功率、降低项目成本、提升客户满意度至关重要。尽管很多人对IT项目的质量问题感到无奈&#x…

SSM 框架结合 Vue 实现电脑测评系统:助力用户明智选择

2相关技术 2.1 MYSQL数据库 MySQL是一个真正的多用户、多线程SQL数据库服务器。 是基于SQL的客户/服务器模式的关系数据库管理系统&#xff0c;它的有点有有功能强大、使用简单、管理方便、安全可靠性高、运行速度快、多线程、跨平台性、完全网络化、稳定性等&#xff0c;非常适…

图像生成工具WebUI

介绍 Stable Diffusion WebUI&#xff08;AUTOMATIC1111&#xff0c;简称A1111&#xff09;是一个为高级用户设计的图形用户界面&#xff08;GUI&#xff09;&#xff0c;它提供了丰富的功能和灵活性&#xff0c;以满足复杂和高级的图像生成需求。如今各种人工智能满天飞&…

智源大模型通用算子库FlagGems四大能力升级 持续赋能AI系统开源生态

FlagGems是由智源研究院于2024年6月推出的面向多种AI芯片的开源大模型通用算子库。FlagGems使用Triton语言开发&#xff0c;在Triton生态开源开放的基础上&#xff0c;为多种AI芯片提供开源、统一、高效的算子层生态接入方案。FlagGems沿着统一的中间语言、统一的算子接口和统一…

FFmpeg库之ffplay

文章目录 FFmpeg环境搭建ffplay使用通用选项视频选项音频选项快捷键使用滤镜直播拉流 FFmpeg环境搭建 FFmpeg官网 FFmpeg环境搭建 ./configure \--prefix"$HOME/ffmpeg" \--extra-cflags"-I$HOME/ffmpeg/include" \--extra-ldflags"-L$HOME/ffmpeg…