通過easyexcel導入數據,添加表格參數的校驗,同表格內校驗以及和已有數據的校驗

?引入依賴

<dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>2.2.11</version><scope>compile</scope></dependency>

需要導入到某個目錄下

如果產品名稱相同,就追加里面的型號,如果型號也相同就返回提示,

如果產品名稱相同,表格內的數據要和瀏覽器錄入的 型號對應參數保持一致,順序、名稱、數量等都要完全一致

如果產品名稱相同,表格內部的 型號對應的參數必須保持一致,順序、名稱、數量等都要完全一致;

例如:

?導入的表格要個瀏覽器對應上

controller

	/*** 導入設備*/@PostMapping("importProduct")@ApiOperationSupport(order = 11)@ApiOperation(value = "導入設備", notes = "傳入excel/產品")public R importProduct(MultipartFile file, Long categoryId) throws IOException {//此處判斷文件大小不能為0if (file.getSize() == 0) {return R.fail("文件大小不能為空");}if (categoryId == null || categoryId <= 0) {return R.fail("請選擇所屬產品分類");}return productService.importProduct(file, categoryId);}

services

	//導入產品@Override@Transactional(rollbackFor = Exception.class)public R importProduct(MultipartFile file, Long categoryId) throws IOException {CategoryEntity category = categoryService.getById(categoryId);if (category == null) {throw new ServiceException("產品分類不存在");}DataExcelListener<ProductImportExcel> listener = new DataExcelListener<ProductImportExcel>();// headRowNumber(2):表示第一、二行為表頭,從第三行取值ExcelReader excelReader = EasyExcelFactory.read(file.getInputStream(), ProductImportExcel.class, listener).headRowNumber(2).build();excelReader.readAll();List<ProductImportExcel> data = listener.getDatas();excelReader.finish();Map<String, List<CodeProTypeJson>> map = new LinkedHashMap<>();//獲取表格數據,根據表格每一行的列數量不同,獲取數據后組裝型號jsongetExcelData(data, map);// 轉換數據并添加產品List<ProductEntity> productList = new ArrayList<>();//判斷導入的產品名稱和已有的產品名稱是否相同,如果相同就追加型號List<String> productNameList = new ArrayList<>();for (Map.Entry<String, List<CodeProTypeJson>> listEntry : map.entrySet()) {String productName = listEntry.getKey();List<CodeProTypeJson> value = listEntry.getValue();ProductEntity product = new ProductEntity();product.setCategoryId(categoryId);product.setCodeProName(productName);product.setCodeProType(JSON.toJSONString(value));product.setCodeProTypeNum(value.size());product.setEnterpriseId(IotAuthUtil.getEnterpriseId());productNameList.add(productName);productList.add(product);}// 批量查詢 已經存在的產品 存在就覆蓋 不存在就新增if (productNameList != null && productNameList.size() > 0) {LambdaQueryWrapper<ProductEntity> queryWrapper = new LambdaQueryWrapper<>();queryWrapper.in(ProductEntity::getCodeProName, productNameList);List<ProductEntity> selectList = baseMapper.selectList(queryWrapper);List<ProductEntity> updateList = new ArrayList<>();List<ProductEntity> addList = new ArrayList<>();for (ProductEntity entity : productList) {// 判斷產品是否已經添加,如已添加就走修改邏輯,未添加就走添加邏輯ProductEntity product = containsProductEntity(entity, selectList);if (product != null) {entity.setId(product.getId());updateList.add(entity);} else {addList.add(entity);}/*Long productId = containsProductEntity(entity, selectList);if (productId != null) {entity.setId(productId);updateList.add(entity);} else {addList.add(entity);}*/}// 批量更新if (updateList != null && updateList.size() > 0) {this.updateBatchById(updateList);}// 批量添加if (addList != null && addList.size() > 0) {this.saveBatch(addList);}}return R.success("導入成功!");}

?Excel導入數據 解析監聽器 用于獲取excel表格的數據

package com.bluebird.code.util;import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import com.alibaba.excel.metadata.Cell;import java.util.ArrayList;
import java.util.List;
import java.util.Map;/*** Excel導入數據 解析監聽器 用于獲取excel表格的數據*/
public class DataExcelListener<T> extends AnalysisEventListener<T> {/*** 自定義用于暫時存儲data* 可以通過實例獲取該值*/private List<T> datas = new ArrayList<>();/*** 每解析一行都會回調invoke()方法** @param object  讀取后的數據對象* @param context 內容*/@Override@SuppressWarnings("unchecked")public void invoke(Object object, AnalysisContext context) {T data = (T) object;//數據存儲到list,供批量處理,判斷每一行是否為空行。if (data != null && !isEmptyRow(context.readRowHolder().getCellMap())) {datas.add(data);}}@Overridepublic void doAfterAllAnalysed(AnalysisContext context) {//解析結束銷毀不用的資源//注意不要調用datas.clear(),否則getDatas為null}/*** 返回數據** @return 返回讀取的數據集合**/public List<T> getDatas() {return datas;}/*** 設置讀取的數據集合** @param datas 設置讀取的數據集合**/public void setDatas(List<T> datas) {this.datas = datas;}/*** 判斷一行是否為空行* @param cellMap 當前行的單元格映射* @return 如果所有單元格都為空,則返回 true,否則返回 false*/private boolean isEmptyRow(Map<Integer, Cell> cellMap) {for (Object cellValue : cellMap.values()) {if (cellValue != null && !cellValue.toString().trim().isEmpty()) {return false;}}return true;}}

獲取數據后組裝型號json串 (同時處理表格內部相同產品名稱不同型號參數名的問題,要確保相同參數名稱的參數名保持一致)

// 獲取數據后組裝型號json串 (同時處理表格內部相同產品名稱不同型號參數名的問題,要確保相同參數名稱的參數名保持一致)public void getExcelData(List<ProductImportExcel> data, Map<String, List<CodeProTypeJson>> map) {int count = 2;// 判斷產品名稱和型號是否相等,如過相等就返回提示,產品名和型號組成合并后需要唯一Map<String, String> proNameTypeMap = new HashMap<>();// 定義一個map集合,key:產品名稱,value:型號集合的名稱拼接Map<String, String> mapProductType = new LinkedHashMap<>();for (ProductImportExcel entity : data) {count++;String productName = entity.getCodeProName();String codeProType = entity.getCodeProType();String proNameType = productName + codeProType;if (StringUtils.isBlank(productName) || StringUtils.isEmpty(productName)) {throw new ServiceException("第 " + count + " 行產品名稱不能為空!");}if (StringUtils.isBlank(codeProType) || StringUtils.isEmpty(codeProType)) {throw new ServiceException("第 " + count + " 行規格型號不能為空!");}//String proNameTypeStr = proNameTypeMap.get(proNameType);if (StringUtils.isNotBlank(proNameTypeStr)) {throw new ServiceException("第 " + count + " 行和第 " + (count - 1) + "產品名稱下的規格型號不能重復!");}proNameTypeMap.put(proNameType, proNameType);List<CodeProTypeJson> list = map.get(productName);CodeProTypeJson json = new CodeProTypeJson();List<CodeProTypeJson.SkuParamsList> listDate = new ArrayList<>();json.setSkuName(entity.getCodeProType());json.setSkuId(IdWorker.getIdStr());// 將參數名進行拼接StringBuilder paramSb = new StringBuilder();// 根據型號參數名字處理表格數據,如果此單元格為空就不處理(因為每個產品的型號數量不確定)if (StringUtils.isNotEmpty(entity.getParamName1())) {CodeProTypeJson.SkuParamsList skuParamsList = new CodeProTypeJson.SkuParamsList();skuParamsList.setParamId(IdWorker.getIdStr());skuParamsList.setParamName(entity.getParamName1());skuParamsList.setParamValue(entity.getParamValue1());listDate.add(skuParamsList);paramSb.append(entity.getParamName1());}// 根據型號參數名字處理表格數據,如果此單元格為空就不處理(因為每個產品的型號數量不確定)if (StringUtils.isNotEmpty(entity.getParamName2())) {CodeProTypeJson.SkuParamsList skuParamsList = new CodeProTypeJson.SkuParamsList();skuParamsList.setParamId(IdWorker.getIdStr());skuParamsList.setParamName(entity.getParamName2());skuParamsList.setParamValue(entity.getParamValue2());listDate.add(skuParamsList);paramSb.append("->");paramSb.append(entity.getParamName2());}// 根據型號參數名字處理表格數據,如果此單元格為空就不處理(因為每個產品的型號數量不確定)if (StringUtils.isNotEmpty(entity.getParamName3())) {CodeProTypeJson.SkuParamsList skuParamsList = new CodeProTypeJson.SkuParamsList();skuParamsList.setParamId(IdWorker.getIdStr());skuParamsList.setParamName(entity.getParamName3());skuParamsList.setParamValue(entity.getParamValue3());listDate.add(skuParamsList);paramSb.append("->");paramSb.append(entity.getParamName3());}// 根據型號參數名字處理表格數據,如果此單元格為空就不處理(因為每個產品的型號數量不確定)if (StringUtils.isNotEmpty(entity.getParamName4())) {CodeProTypeJson.SkuParamsList skuParamsList = new CodeProTypeJson.SkuParamsList();skuParamsList.setParamId(IdWorker.getIdStr());skuParamsList.setParamName(entity.getParamName4());skuParamsList.setParamValue(entity.getParamValue4());listDate.add(skuParamsList);paramSb.append("->");paramSb.append(entity.getParamName4());}// 根據型號參數名字處理表格數據,如果此單元格為空就不處理(因為每個產品的型號數量不確定)if (StringUtils.isNotEmpty(entity.getParamName5())) {CodeProTypeJson.SkuParamsList skuParamsList = new CodeProTypeJson.SkuParamsList();skuParamsList.setParamId(IdWorker.getIdStr());skuParamsList.setParamName(entity.getParamName5());skuParamsList.setParamValue(entity.getParamValue5());listDate.add(skuParamsList);paramSb.append("->");paramSb.append(entity.getParamName5());}// 根據型號參數名字處理表格數據,如果此單元格為空就不處理(因為每個產品的型號數量不確定)if (StringUtils.isNotEmpty(entity.getParamName6())) {CodeProTypeJson.SkuParamsList skuParamsList = new CodeProTypeJson.SkuParamsList();skuParamsList.setParamId(IdWorker.getIdStr());skuParamsList.setParamName(entity.getParamName6());skuParamsList.setParamValue(entity.getParamValue6());listDate.add(skuParamsList);paramSb.append("->");paramSb.append(entity.getParamName6());}// 根據型號參數名字處理表格數據,如果此單元格為空就不處理(因為每個產品的型號數量不確定)if (StringUtils.isNotEmpty(entity.getParamName7())) {CodeProTypeJson.SkuParamsList skuParamsList = new CodeProTypeJson.SkuParamsList();skuParamsList.setParamId(IdWorker.getIdStr());skuParamsList.setParamName(entity.getParamName7());skuParamsList.setParamValue(entity.getParamValue7());listDate.add(skuParamsList);paramSb.append("->");paramSb.append(entity.getParamName7());}// 根據型號參數名字處理表格數據,如果此單元格為空就不處理(因為每個產品的型號數量不確定)if (StringUtils.isNotEmpty(entity.getParamName8())) {CodeProTypeJson.SkuParamsList skuParamsList = new CodeProTypeJson.SkuParamsList();skuParamsList.setParamId(IdWorker.getIdStr());skuParamsList.setParamName(entity.getParamName8());skuParamsList.setParamValue(entity.getParamValue8());listDate.add(skuParamsList);paramSb.append("->");paramSb.append(entity.getParamName8());}// 將參數名拼接后轉換字符串String paramSbStr = paramSb.toString();// 根據當前行的產品名稱去map集合獲取已經存入的參數名的拼接串String paramNameMap = mapProductType.get(productName);if (Func.isNotBlank( paramNameMap ) && !paramNameMap.equals( paramSbStr )) {String msg = "[ " + paramNameMap + " ] 和 [ " + paramSbStr + " ] 型號參數名稱、數量、順序需保持一致";throw new ServiceException(" 產品名稱為:[ " + productName + " ] 的型號參數與表格其他行的參數名稱或順序不一致,請修改!</br>" + msg);}// 如果校驗通過后添加參數拼接串到map集合中mapProductType.put(productName, paramSbStr);json.setSkuParamsList(listDate);if (list == null) {list = new ArrayList<>();}List<CodeProTypeJson> typeJsons = map.get(productName);if (typeJsons != null && typeJsons.size() > 0) {typeJsons.add(json);map.put(productName, typeJsons);} else {list.add(json);map.put(productName, list);}}}

判斷產品是否已經添加,如已添加就走修改邏輯,未添加就走添加邏輯? excel:entity

	// 判斷產品是否已經添加,如已添加就走修改邏輯,未添加就走添加邏輯  excel:entityprivate static ProductEntity containsProductEntity(ProductEntity entity, List<ProductEntity> selectList) {for (ProductEntity item : selectList) {if (item.getCodeProName().equals(entity.getCodeProName())) {// 如果導入的產品名稱和已經添加的產品名稱相同,就追加型號,如果型號相同,就返回提示List<CodeProTypeJson> itemTypeJsonList = JSONObject.parseArray(Func.toStr(item.getCodeProType()), CodeProTypeJson.class);List<CodeProTypeJson> excelTypeJsonList = JSONObject.parseArray(Func.toStr(entity.getCodeProType()), CodeProTypeJson.class);for (CodeProTypeJson itemJson : itemTypeJsonList) {for (CodeProTypeJson excelJson : excelTypeJsonList) {if (Objects.equals(itemJson.getSkuName(), excelJson.getSkuName())) {throw new ServiceException(" 產品名稱為: " + item.getCodeProName() + " 的 " + itemJson.getSkuName() + " 型號已存在,請先修改該型號");}}}// 比較 如果導入的產品名稱和數據庫已有的數據產品名稱相同,就比對型號的名稱和順序是否一致,如果不一致就返回提示if (itemTypeJsonList != null && itemTypeJsonList.size() > 0 && excelTypeJsonList != null && excelTypeJsonList.size() > 0) {// 獲取查詢到的第一個型號的參數列表CodeProTypeJson codeProTypeJson = itemTypeJsonList.get(0);List<CodeProTypeJson.SkuParamsList> itemSkuParamsList = codeProTypeJson.getSkuParamsList();// 將參數名進行拼接StringBuilder sbItem = new StringBuilder();for (int i = 0; i < itemSkuParamsList.size(); i++) {CodeProTypeJson.SkuParamsList param = itemSkuParamsList.get(i);sbItem.append(param.getParamName());if (i < itemSkuParamsList.size() - 1) {sbItem.append("->");}}String itemTypeJson = sbItem.toString();// 遍歷excel表格里面的所有型號對應的參數列表for (CodeProTypeJson json : excelTypeJsonList) {List<CodeProTypeJson.SkuParamsList> skuParamsList = json.getSkuParamsList();// 遍歷某個型號的所有參數名,將參數名進行拼接StringBuilder sbJson = new StringBuilder();for (int i = 0; i < skuParamsList.size(); i++) {CodeProTypeJson.SkuParamsList param = skuParamsList.get(i);sbJson.append(param.getParamName());if (i < skuParamsList.size() - 1) {sbJson.append("->");}}String excelTypeJson = sbJson.toString();System.out.println("itemTypeJson " + itemTypeJson);System.out.println("excelTypeJson " + excelTypeJson);System.out.println(itemTypeJson.equals(excelTypeJson));// 比對數據庫查詢的 拼接參數和excel表格里面的 拼接參數是否一致if (!itemTypeJson.equals(excelTypeJson)) {String msg = "原參數[ " + itemTypeJson + " ] 新參數 [ " + excelTypeJson + " ]";throw new ServiceException(" 產品名稱為:[ " + item.getCodeProName() + " ]的型號參數與已有參數名稱不一致或順序不一致,請修改!</br>" + msg);}}}itemTypeJsonList.addAll(excelTypeJsonList);entity.setCodeProType(JSON.toJSONString(itemTypeJsonList));entity.setCodeProTypeNum(itemTypeJsonList.size());entity.setId(item.getId());return entity;}}return null;}

ProductEntity實體類

package com.bluebird.code.entity;import com.baomidou.mybatisplus.annotation.TableName;
import com.bluebird.core.tenant.mp.TenantEntity;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;/*** 賦碼 - 產品表 實體類 */
@Data
@TableName("t_code_product")
@ApiModel(value = "Product對象", description = "賦碼 - 產品表")
@EqualsAndHashCode(callSuper = true)
public class ProductEntity extends TenantEntity {/*** 企業id*/@ApiModelProperty(value = "企業id")private Long enterpriseId;/*** 產品名稱*/@ApiModelProperty(value = "產品名稱")private String codeProName;/*** 產品編號*/@ApiModelProperty(value = "產品編號")private String codeProNum;/*** 產品分類*/@ApiModelProperty(value = "產品分類")private Long categoryId;/*** 產品圖片*/@ApiModelProperty(value = "產品圖片")private String codeProImage;/*** 產品主圖圖片*/@ApiModelProperty(value = "產品主圖圖片")private String codeMainImage;/*** 產品視頻*/@ApiModelProperty(value = "產品視頻")private String codeProVideo;/*** 產品型號(第一組元素必須為規格型號)** @see com.bluebird.code.dto.CodeProTypeJson*/@ApiModelProperty(value = "產品型號(第一組元素必須為規格型號)")
//	private CodeProTypeJson codeProType;private String codeProType;/*** 產品簡介*/@ApiModelProperty(value = "產品簡介")private String codeProDesc;/*** 規格數量*/@ApiModelProperty(value = "規格數量")private Integer codeProTypeNum;/*** 排序*/@ApiModelProperty(value = "排序")private Integer sort;/*** 備注*/@ApiModelProperty(value = "備注")private String remark;}

CodeProTypeJson 產品型號Json對象 (第一組元素必須為規格型號)

package com.bluebird.code.dto;import lombok.Data;import java.util.List;/**** 產品型號Json對象 (第一組元素必須為規格型號)*** @return:* @date: 2024/6/20*/
@Data
public class CodeProTypeJson {//產品idprivate String skuId;//產品型號private String skuName;//規格英文名稱private String skuEnName;//產品規格參數Listprivate List<SkuParamsList> skuParamsList;@Datapublic static class SkuParamsList {//規格idprivate String paramId;//規格名稱private String paramName;//規格英文名稱private String paramEnName;//規格參數值private String paramValue;}
}

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

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

相關文章

Mybatis數據封裝

目錄 解決方案&#xff1a; 1.起別名&#xff1a; 2.手動結果映射&#xff1a; 3.開啟駝峰命名(推薦)&#xff1a; 我們看到查詢返回的結果中大部分字段是有值的&#xff0c;但是deptId&#xff0c;createTime&#xff0c;updateTime這幾個字段是沒有值的&#xff0c;而數據…

分析數據不要太老實,有BI方案就用起來——奧威BI軟件

在當今數據驅動的時代&#xff0c;企業對于數據分析的需求日益迫切。然而&#xff0c;面對海量的數據和復雜的分析需求&#xff0c;許多企業仍停留在傳統的手工分析模式&#xff0c;這不僅效率低下&#xff0c;還容易出錯。幸運的是&#xff0c;像奧威BI這樣的數據分析軟件提供…

Linux——互斥與同步練習

用多線程程序設計一個火車票售票系統&#xff0c; 要求至少有兩個售票窗口&#xff0c;每個售票窗口 不能重復買票&#xff0c;將100張車票均勻的從兩個 窗口賣出即可。 ./a.out 窗口1 賣出車票 1 窗口2 賣出車票 2 窗口1 賣出車票 3 窗口2 賣出車票 4 ..... #include <std…

【深度學習】掃描全能王的AI驅動創新與智能高清濾鏡技術解析

目錄 引言1、掃描全能王2、智能高清濾鏡黑科技2.1、圖像視覺矯正2.2、去干擾技術 3、實際應用案例3.1、打印文稿褶皺檢測3.2、試卷擦除手寫3.3、老舊文件處理3.4、收銀小票3.5、從不同角度掃描文檔 4、用戶體驗結論與未來展望 引言 在數字化時代背景下&#xff0c;文檔掃描功能…

Vue3+Pinia

1.單純調接口(安裝pinia及引入如下第一張圖) 1.npm install pinia2.在main.js里引入即可import { createPinia } from piniaapp.use(createPinia()) 1.stores建立你文件的ts、內容如下&#xff1a;1-1 import { defineStore } from pinia1-2 import { findPageJobSet } from …

GitCode見證:華為云DevUI如何定義下一代前端開發

在當今快速發展的數字時代&#xff0c;前端開發已成為企業數字化轉型的關鍵一環。隨著用戶對交互體驗的期待不斷增長&#xff0c;擁有一個強大、靈活且易于使用的前端解決方案變得至關重要。 DevUI的誕生&#xff0c;源于華為對研發工具的深入理解和長期積累&#xff0c;作為一…

【PYG】將節點特征壓縮為1和節點壓縮為1的例子

文章目錄 將節點特征壓縮為1和節點壓縮為1的例子示例1&#xff1a;將節點特征壓縮為1示例2&#xff1a;將節點壓縮為1 理論將特征壓縮為1將節點壓縮為1具體例子應用場景相關論文 將節點特征壓縮為1和節點壓縮為1的例子 示例1&#xff1a;將節點特征壓縮為1 假設我們有一個節點…

【云原生監控】Prometheus 普羅米修斯從搭建到使用詳解

目錄 一、前言 二、服務監控概述 2.1 什么是微服務監控 2.2 微服務監控指標 2.3 微服務監控工具 三、Prometheus概述 3.1 Prometheus是什么 3.2 Prometheus 特點 3.3 Prometheus 架構圖 3.3.1 Prometheus核心組件 3.3.2 Prometheus 工作流程 3.4 Prometheus 應用場景…

如何使用C++進行高效的數據處理和數據挖掘?

如何使用C進行高效的數據處理和數據挖掘&#xff1f; 數據處理和數據挖掘在如今信息爆炸的時代變得越來越重要。為了快速、高效地處理和分析大量的數據&#xff0c;選擇合適的編程語言非常重要。C作為一種高性能的編程語言&#xff0c;在數據處理和數據挖掘領域也有廣泛的應用…

open3d基礎使用-簡單易懂

Open3D是一個開源庫&#xff0c;主要用于快速開發處理3D數據的軟件。它提供了豐富的數據結構和算法&#xff0c;支持點云、網格和RGB-D圖像等多種3D數據的處理。以下是對Open3D基礎使用的詳細歸納和說明&#xff1a; 一、安裝Open3D Open3D可以通過Python的包管理器pip進行安…

8624 多項式系數累加和

這個問題可以通過使用數學的導數規則來解決。對于一個多項式&#xff0c;它的導數可以通過將每一項的系數乘以它的指數&#xff0c;然后降低該項的指數來得到。這個過程可以重復M次來得到多項式的M階導數。然后&#xff0c;我們可以簡單地將所有項的系數相加來得到結果。 以下…

3D Gaussian Splatting代碼中的train和render兩個文件代碼解讀

現在來聊一聊訓練和渲染是如何進行的 training train.py line 31 def training(dataset, opt, pipe, testing_iterations, saving_iterations, checkpoint_iterations, checkpoint, debug_from):# 初始化第一次迭代的索引為0first_iter 0# 準備輸出和日志記錄器tb_writer p…

Go語言中的閉包函數:強大而靈活的編程工具

Go語言中的閉包函數:強大而靈活的編程工具 閉包是Go語言中一個非常強大和有趣的特性。它不僅能夠幫助我們寫出更簡潔、更優雅的代碼,還能解決一些特定的編程問題。本文將深入探討Go語言中閉包的概念、使用方法和應用場景。 什么是閉包? 閉包是一個函數值,它引用了其外部…

【mybatis】mybatis-plus_CRUD具體操作

1、環境準備 1. 環境準備 1. 引入依賴 在Spring Boot項目的pom.xml文件中引入MyBatis-Plus及其數據庫驅動的依賴。這里以MySQL為例&#xff1a; <!-- Spring Boot Starter Web --> <dependency> <groupId>org.springframework.boot</groupId> …

wordpress企業主題和wordpress免費主題

農業畜牧養殖wordpress主題 簡潔大氣的農業畜牧養殖wordpress主題&#xff0c;農業農村現代化&#xff0c;離不開新農人、新技術。 https://www.jianzhanpress.com/?p3051 SEO優化wordpress主題 簡潔的SEO優化wordpress主題&#xff0c;效果好不好&#xff0c;結果會告訴你…

JS中的上下文

一.執行上下文的概念&#xff1a; 執行上下文簡稱上下文。變量或者函數的上下文決定了它們可以訪問哪些數據&#xff0c;以及它們的行為。每一個上下文都具有一個關聯的變量對象&#xff0c;而這個上下文中定義的所有變量和函數都存在于這個對象上。 二.JS中上下文的執行機制&a…

第一后裔The First Descendant延遲、卡頓、無法聯機?

The First Descendant第一后裔游戲中還設計了多種輔助攻擊手段&#xff0c;它們如同角色手中的魔法&#xff0c;為戰斗增添了無數可能性。這些輔助攻擊手段或能造成范圍傷害&#xff0c;或能減速敵人&#xff0c;甚至能召喚出強大的支援力量。最近有玩家反映&#xff0c;遇到了…

Windows條件競爭提權漏洞復現(CVE-2024-300889)

漏洞原理 當內核將當前令牌對象的 _AUTHZBASEP_SECURITY_ATTRIBUTES_INFORMATION 復制到用戶模式時&#xff0c;錯誤位于函數 AuthzBasepCopyoutInternalSecurityAttributes 內部&#xff0c;該模式的結構如下&#xff1a; //0x30 bytes (sizeof) struct _AUTHZBASEP_SECURIT…

科研工具|從圖片中提取曲線數據

最近水哥在做一個項目時需要用到一篇論文中的數據&#xff0c;而這數據是作者的實驗數據&#xff0c;且年代較為久遠&#xff0c;聯系原作者要一份數據也不太現實&#xff0c;因而只能從論文的圖片中提取數據了。 目前市面上有很多小軟件可以實現這方面的功能&#xff0c;比如…

DVT:華為提出動態級聯Vision Transformer,性能杠杠的 | NeurIPS 2021

論文主要處理Vision Transformer中的性能問題&#xff0c;采用推理速度不同的級聯模型進行速度優化&#xff0c;搭配層級間的特征復用和自注意力關系復用來提升準確率。從實驗結果來看&#xff0c;性能提升不錯 來源&#xff1a;曉飛的算法工程筆記 公眾號 論文: Not All Image…