【商城实战(74)】数据采集与整理,夯实电商运营基石
【商城实战】专栏重磅来袭!这是一份专为开发者与电商从业者打造的超详细指南。从项目基础搭建,运用 uniapp、Element Plus、SpringBoot 搭建商城框架,到用户、商品、订单等核心模块开发,再到性能优化、安全加固、多端适配,乃至运营推广策略,102 章内容层层递进。无论是想深入钻研技术细节,还是探寻商城运营之道,本专栏都能提供从 0 到 1 的系统讲解,助力你打造独具竞争力的电商平台,开启电商实战之旅。
目录
- 一、确定商城需采集的数据类型
- 1.1 用户行为数据
- 1.2 商品销售数据
- 1.3 系统日志数据
- 二、选择数据采集工具并部署采集代码
- 2.1 埋点技术在前端的数据采集
- 2.2 日志采集器在后端的数据采集
- 2.3 采集代码的部署与注意事项
- 三、清洗采集到的数据
- 3.1 处理缺失值
- 3.2 处理重复值
- 3.3 数据质量保障措施
一、确定商城需采集的数据类型
在商城系统中,全面且准确的数据采集是后续数据分析与业务决策的基石。我们主要确定采集以下几类关键数据:
1.1 用户行为数据
用户行为数据包含用户在商城中的各类操作记录,如浏览记录,记录用户访问过的商品页面、分类页面等,能直观反映用户的兴趣点;搜索关键词,可了解用户的需求和关注点;点击行为,包括点击商品图片、按钮、链接等,有助于分析用户的操作偏好;购买路径,即用户从进入商城到完成购买的一系列页面跳转轨迹,这对优化商城页面布局和购物流程意义重大。
在 uniapp 移动前端,利用生命周期函数和事件绑定获取用户行为数据,如在页面的onLoad、onShow生命周期中记录页面访问时间,示例代码如下:
export default {onLoad() {const pageVisitTime = new Date().getTime();// 假设后端接口为 /user/behavioruni.request({url: 'http://your-backend-url/user/behavior',method: 'POST',data: {userId: this.userId,action: 'page_visit',page: this.$route.path,time: pageVisitTime},success: res => {console.log('用户行为数据发送成功', res.data);},fail: err => {console.error('用户行为数据发送失败', err);}});}
}
在 Element plus PC 前端,借助 Vue 的指令和事件监听,如使用v-on:click监听按钮点击事件,获取点击行为数据:
<template><el-button v-on:click="handleButtonClick">点击按钮</el-button>
</template><script>
export default {methods: {handleButtonClick() {const clickTime = new Date().getTime();// 假设后端接口为 /user/behavioraxios.post('http://your-backend-url/user/behavior', {userId: this.userId,action: 'button_click',buttonName: '点击按钮',time: clickTime}).then(res => {console.log('用户行为数据发送成功', res.data);}).catch(err => {console.error('用户行为数据发送失败', err);});}}
}
</script>
在 Spring Boot 后端,定义 Controller 层接口接收前端传来的用户行为数据,通过 Service 层调用 Mybatis-plus 将数据存入数据库。例如:
@RestController
public class UserBehaviorController {@Autowiredprivate UserBehaviorService userBehaviorService;@PostMapping("/user/behavior")public String handleUserBehavior(@RequestBody UserBehavior userBehavior) {userBehaviorService.save(userBehavior);return "success";}
}
UserBehavior实体类对应数据库表,Mybatis-plus 自动实现数据持久化,无需手写 Mapper 文件。
1.2 商品销售数据
商品销售数据涵盖商品 ID,用于唯一标识商品;销量,体现商品的受欢迎程度;销售额,直接反映商品的商业价值;销售时间,可分析销售趋势和时间相关性。这些数据对于库存管理至关重要,通过销量和库存对比,可及时补货或调整库存策略;在商品定价策略上,结合销售额和成本分析,能制定更合理的价格。
在 Spring Boot 后端,通过 SQL 查询语句或 Mybatis-plus 的 QueryWrapper 构建查询条件获取商品销售数据。例如,获取某时间段内的商品销售数据:
@Service
public class ProductSalesService extends ServiceImpl<ProductSalesMapper, ProductSales> {public List<ProductSales> getProductSalesByTime(String startTime, String endTime) {QueryWrapper<ProductSales> wrapper = new QueryWrapper<>();wrapper.between("sale_time", startTime, endTime);return list(wrapper);}
}
Controller 层接口:
@RestController
public class ProductSalesController {@Autowiredprivate ProductSalesService productSalesService;@GetMapping("/product/sales/time")public List<ProductSales> getProductSalesByTime(@RequestParam String startTime, @RequestParam String endTime) {return productSalesService.getProductSalesByTime(startTime, endTime);}
}
在 uniapp 移动前端,通过uni.request请求后端接口获取商品销售数据:
uni.request({url: 'http://your-backend-url/product/sales/time',method: 'GET',data: {startTime: '2024-01-01',endTime: '2024-01-31'},success: res => {console.log('商品销售数据获取成功', res.data);},fail: err => {console.error('商品销售数据获取失败', err);}
});
Element plus PC 前端类似,使用axios请求后端接口。
1.3 系统日志数据
系统日志数据用于记录系统操作,如用户登录、退出,管理员的系统配置操作等;错误信息,包括代码异常、数据库连接错误等,便于及时发现和解决系统问题;性能指标,如接口响应时间、服务器资源利用率等,对系统性能优化和稳定性保障意义非凡。
在 Spring Boot 后端,利用日志框架(如 Logback)记录系统日志,通过配置文件定义日志输出格式和级别。例如,在logback.xml中配置:
<configuration><appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"><encoder><pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n</pattern></encoder></appender><root level="info"><appender-ref ref="STDOUT" /></root>
</configuration>
在代码中使用日志记录,如:
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;@Service
public class SystemLogService {private static final Logger logger = LoggerFactory.getLogger(SystemLogService.class);public void logSystemOperation(String operation, String userId) {logger.info("用户 {} 进行了操作: {}", userId, operation);}
}
在 uniapp 移动前端和 Element plus PC 前端,可通过自定义日志上报机制,将前端发生的错误和操作信息发送到后端。例如,uniapp 中捕获错误并上报:
try {// 可能出错的代码
} catch (error) {uni.request({url: 'http://your-backend-url/log/front',method: 'POST',data: {errorMessage: error.message,stack: error.stack,page: this.$route.path},success: res => {console.log('前端日志上报成功', res.data);},fail: err => {console.error('前端日志上报失败', err);}});
}
后端接收并处理前端上报的日志数据,存入数据库供后续分析。
二、选择数据采集工具并部署采集代码
2.1 埋点技术在前端的数据采集
埋点技术是前端数据采集中常用的手段,它能精准捕捉用户在页面上的各类交互行为。埋点可分为代码埋点、可视化埋点和无痕埋点,这里我们主要探讨代码埋点和可视化埋点在 uniapp 和 Element plus 中的实现。
在 uniapp 中实现代码埋点,可利用其生命周期和事件绑定机制。比如,要统计页面的访问次数和停留时间,在页面的onLoad生命周期中记录页面加载时间,在onUnload中计算并上报停留时间:
export default {data() {return {pageLoadTime: null};},onLoad() {this.pageLoadTime = new Date().getTime();// 记录页面访问事件uni.request({url: 'http://your-backend-url/track',method: 'POST',data: {userId: this.userId,event: 'page_visit',page: this.$route.path},success: res => {console.log('页面访问事件上报成功', res.data);},fail: err => {console.error('页面访问事件上报失败', err);}});},onUnload() {const pageStayTime = new Date().getTime() - this.pageLoadTime;// 上报页面停留时间uni.request({url: 'http://your-backend-url/track',method: 'POST',data: {userId: this.userId,event: 'page_stay_time',page: this.$route.path,stayTime: pageStayTime},success: res => {console.log('页面停留时间上报成功', res.data);},fail: err => {console.error('页面停留时间上报失败', err);}});}
}
在 Element plus 中,借助 Vue 的指令和事件监听实现代码埋点。例如,为按钮添加点击埋点:
<template><el-button v-on:click="handleButtonClick" v-trace="buttonName">点击按钮</el-button>
</template><script>
export default {data() {return {buttonName: '点击按钮'};},methods: {handleButtonClick() {// 假设已经全局挂载了埋点上报方法$tracker.reportthis.$tracker.report({evName: this.buttonName,evInfo: '按钮被点击'});}}
}
</script>
其中,v-trace指令可用于快速为元素添加埋点标识,在指令的实现中,当元素被点击时,获取指令绑定的值作为事件名称等信息进行上报。
可视化埋点方面,可借助第三方可视化埋点工具。以某可视化埋点工具为例,在 uniapp 项目中集成时,先在项目中引入该工具的 SDK,然后在页面加载时,通过 SDK 提供的 API 注册页面元素的埋点信息。例如:
import VisualTracker from 'your-visual-tracker-sdk';export default {onLoad() {VisualTracker.init({appId: 'your-app-id',pageName: this.$route.path});VisualTracker.registerElement({element: document.getElementById('specific-element-id'),event: 'click',data: {category: 'button',action: 'click'}});}
}
在 Element plus 项目中类似,通过 SDK 的可视化界面,用户可直接在页面上选择需要埋点的元素,配置埋点事件和相关数据,工具会自动生成埋点代码并在运行时采集数据上报。
2.2 日志采集器在后端的数据采集
后端数据采集主要依赖日志采集器,常见的有 Logback 和 Log4j。这里以 Logback 为例,结合 Spring Boot 框架进行配置。
首先在pom.xml文件中添加 Spring Boot 和 Logback 的依赖:
<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-logging</artifactId></dependency>
</dependencies>
在src/main/resources目录下创建logback-spring.xml配置文件,配置如下:
<configuration><appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"><encoder><pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n</pattern></encoder></appender><appender name="FILE" class="ch.qos.logback.core.FileAppender"><file>logs/app.log</file><encoder><pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n</pattern></encoder></appender><root level="info"><appender-ref ref="STDOUT" /><appender-ref ref="FILE" /></root>
</configuration>
上述配置中,STDOUT appender 将日志输出到控制台,FILE appender 将日志输出到logs/app.log文件。通过pattern标签定义日志输出格式,包含时间、线程、日志级别、类名和日志信息。
在业务代码中,使用LoggerFactory获取日志记录器进行日志记录。例如,在一个 Service 类中记录业务操作日志:
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;@Service
public class OrderService {private static final Logger logger = LoggerFactory.getLogger(OrderService.class);public void createOrder(String orderInfo) {logger.info("创建订单,订单信息: {}", orderInfo);// 订单创建逻辑}
}
当createOrder方法被调用时,会记录一条 INFO 级别的日志,包含订单创建的信息。
Mybatis-plus 与日志采集器结合时,可通过配置让 Mybatis-plus 输出 SQL 执行日志,便于调试和性能分析。在application.yml中添加配置:
mybatis-plus:configuration:log-impl: org.apache.ibatis.logging.slf4j.Slf4jImpl
这样,Mybatis-plus 执行的 SQL 语句及参数等信息会被日志采集器记录,在logback-spring.xml配置的输出目标中展示。
2.3 采集代码的部署与注意事项
将采集代码部署到生产环境时,首先要确保服务器环境满足要求。对于前端代码,在 uniapp 项目中,打包生成的文件需上传到 Web 服务器,如 Nginx。在 Nginx 配置文件中,设置好静态资源路径,指向 uniapp 打包生成的文件目录。例如:
server {listen 80;server_name your-domain.com;location / {root /path/to/your/uniapp/dist;index index.html index.htm;try_files $uri $uri/ /index.html;}
}
Element plus 项目同理,打包后的文件部署到 Web 服务器,配置好服务器路径。
对于后端 Spring Boot 项目,可将其打包成 Jar 包,通过命令行启动:
java -jar your-project.jar
在服务器上,需安装 Java 运行环境,确保版本与项目要求一致。同时,安装数据库客户端,保证 Mybatis-plus 能正常连接数据库。
部署过程中,要注意数据传输安全。对于前端采集的数据,可采用 HTTPS 协议进行传输,防止数据被窃取或篡改。在后端,对敏感日志信息进行加密存储,如用户密码等。
性能优化也是关键,前端埋点代码要避免影响页面加载速度和用户体验,尽量采用异步方式发送数据。后端日志采集要合理配置日志级别,避免因日志过多影响系统性能,对于大量日志数据,可采用日志聚合工具(如 ELK Stack)进行集中管理和分析。
三、清洗采集到的数据
采集到的数据往往存在各种质量问题,如缺失值、重复值等,这些问题会影响数据分析的准确性和可靠性,因此需要对数据进行清洗,以确保数据质量。
3.1 处理缺失值
在商城数据中,缺失值可能出现在各个数据类型中。对于用户数据,可能存在年龄、性别等字段缺失;商品数据中,可能有商品描述、价格等字段缺失。常见的缺失值处理方法如下:
- 删除记录:当缺失值所在的记录对整体分析影响较小时,可直接删除。例如,在用户行为数据中,如果某条记录的多个关键行为字段都缺失,且该记录数量占比较小,可考虑删除。在 Spring Boot 中使用 Mybatis-plus 实现时,假设UserBehavior为用户行为实体类,代码示例如下:
@Service
public class UserBehaviorService extends ServiceImpl<UserBehaviorMapper, UserBehavior> {public void deleteMissingRecords() {QueryWrapper<UserBehavior> wrapper = new QueryWrapper<>();wrapper.isNull("behavior_field1").or().isNull("behavior_field2");remove(wrapper);}
}
- 均值填充:适用于数值型数据。如商品销售数据中的销量字段,若存在缺失值,可计算该商品历史销量的均值进行填充。代码示例:
@Service
public class ProductSalesService extends ServiceImpl<ProductSalesMapper, ProductSales> {public void fillMissingSalesWithMean() {List<ProductSales> salesList = list();Map<Long, Double> productMeanSales = new HashMap<>();// 计算每个商品的平均销量salesList.forEach(sales -> {if (!productMeanSales.containsKey(sales.getProductId())) {productMeanSales.put(sales.getProductId(), 0.0);}productMeanSales.put(sales.getProductId(), productMeanSales.get(sales.getProductId()) + sales.getSalesVolume());});productMeanSales.forEach((productId, totalSales) -> {long count = salesList.stream().filter(s -> s.getProductId().equals(productId)).count();productMeanSales.put(productId, totalSales / count);});// 填充缺失值salesList.forEach(sales -> {if (sales.getSalesVolume() == null) {sales.setSalesVolume(productMeanSales.get(sales.getProductId()).intValue());updateById(sales);}});}
}
- 中位数填充:同样用于数值型数据,能减少异常值影响。以商品价格为例,若有价格缺失,可使用中位数填充。实现代码类似均值填充,只是计算时获取中位数。
- 众数填充:用于分类数据。如用户性别字段缺失,可用数据集中出现频率最高的性别填充。假设User实体类有gender字段,代码示例:
@Service
public class UserService extends ServiceImpl<UserMapper, User> {public void fillMissingGenderWithMode() {QueryWrapper<User> wrapper = new QueryWrapper<>();wrapper.select("gender", "count(*) as count").groupBy("gender").orderByDesc("count");List<Map<String, Object>> result = baseMapper.selectMaps(wrapper);String modeGender = (String) result.get(0).get("gender");wrapper = new QueryWrapper<>();wrapper.isNull("gender");List<User> users = list(wrapper);users.forEach(user -> {user.setGender(modeGender);updateById(user);});}
}
- 基于模型填充:利用机器学习模型预测填充缺失值。如构建回归模型预测商品销量缺失值,先准备训练数据,将有完整销量数据的记录作为训练集,以其他相关字段为特征,销量为目标变量,训练模型后对缺失值进行预测填充。这涉及到更多机器学习相关的库和复杂的代码逻辑,此处暂不详细展开代码示例。
3.2 处理重复值
重复值会占用存储空间,干扰数据分析,需要进行处理。常见的去重方式有基于唯一标识去重和模糊去重。
- 基于唯一标识去重:在订单数据中,订单号通常是唯一标识。利用 Mybatis-plus 实现去重,假设Order实体类对应订单表,有orderId字段作为唯一标识,代码如下:
@Service
public class OrderService extends ServiceImpl<OrderMapper, Order> {public void removeDuplicateOrders() {QueryWrapper<Order> wrapper = new QueryWrapper<>();wrapper.select("distinct *").groupBy("order_id");List<Order> distinctOrders = list(wrapper);// 先删除原表数据remove(null);// 重新插入去重后的数据saveBatch(distinctOrders);}
}
- 模糊去重:当数据没有明显唯一标识或存在模糊性时使用。例如商品名称相似但有细微差异的数据去重,可通过字符串相似度算法(如编辑距离算法、余弦相似度算法)计算相似度,将相似度高且判定为重复的记录合并或删除。以编辑距离算法为例,使用Apache Commons Text库,假设Product实体类有productName字段,代码示例:
import org.apache.commons.text.similarity.LevenshteinDistance;@Service
public class ProductService extends ServiceImpl<ProductMapper, Product> {public void removeFuzzyDuplicateProducts() {List<Product> productList = list();List<Product> distinctProducts = new ArrayList<>();LevenshteinDistance levenshteinDistance = new LevenshteinDistance();for (Product product : productList) {boolean isDuplicate = false;for (Product distinctProduct : distinctProducts) {int distance = levenshteinDistance.apply(product.getProductName(), distinctProduct.getProductName());if (distance < 3) { // 距离阈值,可根据实际情况调整isDuplicate = true;break;}}if (!isDuplicate) {distinctProducts.add(product);}}// 先删除原表数据remove(null);// 重新插入去重后的数据saveBatch(distinctProducts);}
}
3.3 数据质量保障措施
数据质量是商城运营决策的关键依据,高质量的数据能为精准营销、库存管理、客户关系维护等业务提供有力支持。为确保清洗后的数据准确、完整、一致,可采取以下措施:
- 数据校验规则:在数据入库前进行校验。例如,用户注册数据中,对邮箱格式进行校验,使用正则表达式判断邮箱是否符合格式规范。假设User实体类有email字段,在 Controller 层校验代码如下:
@RestController
public class UserController {@Autowiredprivate UserService userService;@PostMapping("/user/register")public String registerUser(@RequestBody User user) {String emailPattern = "^[A-Za-z0-9+_.-]+@[A-Za-z0-9.-]+$";if (!user.getEmail().matches(emailPattern)) {return "邮箱格式错误";}if (userService.save(user)) {return "注册成功";} else {return "注册失败";}}
}
- 定期数据审计:建立定期审计机制,检查数据的准确性、完整性和一致性。如每月对商品销售数据进行审计,对比不同渠道获取的销售数据,检查是否存在差异。审计流程示例:
- 制定审计计划,确定审计周期、范围和重点数据。
- 从数据库中提取待审计数据,进行数据汇总和分析。
- 与相关业务部门沟通,确认数据的真实性和合理性。
- 生成审计报告,记录发现的问题和改进建议。
- 根据审计结果,对数据进行修正和优化。
通过以上数据清洗和质量保障措施,能有效提升商城数据的质量,为后续的数据分析和业务决策提供可靠的数据基础。
相关文章:
【商城实战(74)】数据采集与整理,夯实电商运营基石
【商城实战】专栏重磅来袭!这是一份专为开发者与电商从业者打造的超详细指南。从项目基础搭建,运用 uniapp、Element Plus、SpringBoot 搭建商城框架,到用户、商品、订单等核心模块开发,再到性能优化、安全加固、多端适配…...
使用独立服务器的最佳方式指南
在寻找合适的主机服务方案时,可以考虑独立服务器,因为它拥有管理员权限以及更高的性能配置。在本指南中,我们将介绍独立服务器的多种用途,并分析为什么选择独立服务器可能是处理高性能、资源密集型应用和大流量网站的最佳方案。 搭…...
视频格式转换:畅享多平台无缝视频体验
视频格式转换:畅享多平台无缝视频体验 视频已成为我们日常生活中不可或缺的一部分,不论是工作中展示方案的演示,还是生活里记录美好瞬间的短片,视频的存在无处不在。然而,面对各类设备、平台对视频格式的不同要求&…...
【HTML 基础教程】HTML 属性
HTML 属性 属性是 HTML 元素提供的附加信息。 属性通常出现在 HTML 标签的开始标签中,用于定义元素的行为、样式、内容或其他特性。 属性总是以 name"value" 的形式写在标签内,name 是属性的名称,value 是属性的值。 HTML 属性 …...
爬虫问题整理(2025.3.27)
此时此刻,困扰我一天的两个问题终于得到了解决,在此分享给大家。 问题1:使用anaconda prompt无法进行pip安装,这里只是一个示例,实际安装任何模块都会出现类似报错。 解决办法:关掉梯子......没错…...
短信验证码安全需求设计
背景: 近期发现部分系统再短信充值频繁,发现存在恶意消耗短信额度现象,数据库表排查,发现大量非合法用户非法调用短信接口API导致额度耗尽。由于系统当初设计存在安全缺陷,故被不法分子进行利用,造成损失。…...
若依专题——基础应用篇
若依搭建 搭建后端项目 ① Git 克隆并初始化项目 ② MySQL 导入与配置 ③ 启动 Redis 搭建后端项目注意事项? ① 项目初始化慢,执行clean、package ② MySQL导入后,修改application-druid.yml ③ Redis有密码,修改ap…...
给AI装“记忆U盘“:LangChain记忆持久化入门指南
🧠 什么是记忆持久化? 想象AI对话就像和朋友聊天: 普通模式:每次重启都忘记之前聊过什么持久化模式:给AI配了个"记忆U盘",聊天记录永不丢失 核心组件三件套 #mermaid-svg-ORm8cbBXsaRy2sZ…...
AI for CFD入门指南(传承版)
AI for CFD入门指南 前言适用对象核心目标基础准备传承机制 AI for CFDLibtorch的介绍与使用方法PytorchAutogluon MakefileVscodeOpenFOAMParaviewGambit 前言 适用对象 新加入课题组的硕士/博士研究生对AICFD交叉领域感兴趣的本科生实习生需要快速上手组内研究工具的合作研…...
DeepSeek+RAG局域网部署
已经有很多平台集成RAG模式,dify,cherrystudio等,这里通过AI辅助,用DS的API实现一个简单的RAG部署。框架主要技术栈是Chroma,langchain,streamlit,答案流式输出,并且对答案加上索引。支持doc,docx,pdf,txt。…...
JavaScript快速入门之函数
引言 总所周知,JavaScript是一个很随便的语言,因此,在学习它的语法的时候,我是和Java语法对比着学的,可能会有些绕 函数 方法:对象(属性,方法) 函数:放在对…...
Java中synchronized 和 Lock
1. synchronized 关键字 工作原理 对象锁:在Java中,每个对象都有一个与之关联的监视器锁(monitor lock)。当一个线程尝试进入由 synchronized 保护的代码块或方法时,它必须首先获取该对象的监视器锁。如果锁已经被其…...
Linux系统-ls命令
一、ls命令的定义 Linux ls命令(英文全拼:list directory contents)用于显示指定工作目录下之内容(列出目前工作目录所含的文件及子目录)。 二、ls命令的语法 ls [选项] [目录或文件名] ls [-alrtAFR] [name...] 三、参数[选项…...
个人学习编程(3-24) 数据结构
括号的匹配: if((s[i]) && now() || (s[i]] && now[)){ #include <bits/stdc.h>using namespace std;int main() {char s[300];scanf("%s",&s);int i;int len strlen(s);stack <char> st;for (i 0; i < len; i){if(…...
.NET开源的智能体相关项目推荐
一、AntSK 由AIDotNet团队开发的人工智能知识库与智能体框架,支持多模型集成和离线部署能力。 核心能力: • 支持OpenAI、Azure OpenAI、星火、阿里灵积等主流大模型,以及20余种国产数据库(如达梦) • 内置语义内核&a…...
面试八股文--框架篇(SSM)
一、Spring框架 1、什么是spring Spring框架是一个开源的Java平台应用程序框架,由Rod Johnson于2003年首次发布。它提供了一种全面的编程和配置模型,用于构建现代化的基于Java的企业应用程序。Spring框架的核心特性包括依赖注入(DI…...
跨语言语言模型预训练
摘要 最近的研究表明,生成式预训练在英语自然语言理解任务中表现出较高的效率。在本研究中,我们将这一方法扩展到多种语言,并展示跨语言预训练的有效性。我们提出了两种学习跨语言语言模型(XLM)的方法:一种…...
[识记]Mysql8 远程授权
今天在测试docker时,因更换为Mysql8,使用SQL方式实现远程授权,其方式方法同于Mysql,但语句稍有不同,仅供参考。 登录mysql mysql -u root -p 输入密码: [请依据交互输入你的mysql密码]切换数据库 use mysql;选择需要…...
Nodejs上传文件的问题
操作系统:window和linux都会遇到 软件环境:v20.10.0的Nodejs 1、前端代码如下: 2、后端Nodejs 2.1、注册接口 2.2、上传接口 其中memoryUpload方法代码如下: 3、用页面上传文件 查看具体报错原因: TypeError: sourc…...
无人机螺旋桨平衡标准
螺旋桨平衡是确保无人机(UAV)平稳运行、可靠性和使用寿命的关键过程。螺旋桨的不平衡会导致振动、噪音,并加速关键部件的磨损,从而对飞行性能产生负面影响。 ISO 21940-11:2016标准为旋翼平衡提供了一个广泛引用的框架,定义了可接受的不平衡…...
Qt开发:双缓冲机制
文章目录 什么是双缓冲机制?Qt 中的双缓冲实现方式 什么是双缓冲机制? 双缓冲(Double Buffering) 是一种减少屏幕绘制闪烁的技术,广泛用于图形渲染和游戏开发。 它的基本原理是: 先在后台缓冲区࿰…...
HandyJSON原理
HandyJSON 的优势 JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式, 应用广泛. 在 App 的使用过程中, 服务端给移动端发送的大部分都是 JSON 数据, 移动端需要解析数据才能做进一步的处理. 在解析JSON数据这一块, 目前 Swift 中流行的框架基本上是 SwiftyJSON, …...
SpringBoot+策略模式+枚举类,使用配置文件改进,优雅消除if-else,完全符合OOP原则
需求分析 公司做物联网系统的,使用nettry进行设备连接,对设备进行数据采集,根据设备的协议对数据进行解析,解析完成之后存放数据库,但是不同厂家的设备协议不同。公司系统使用了使用了函数式编程的去写了一个解析类&am…...
[力扣每日一练]关于MySQL和pandas的正则表达式应用
一:题目要求 表:Users-------------------------- | Column Name | Type | -------------------------- | user_id | int | | email | varchar | -------------------------- (user_id) 是这张表的唯一主键。 每一行包含用…...
每日免费分享之精品wordpress主题系列~DAY16
主题介绍: 今日在网上寻找wordpress主题的时候逛到了大叔的网站,赶脚这个主题蛮不错的,于是百度一下,果然,这个主题很受欢迎。作为主题下载站追梦者也不甘落后,马上就发布出来了,希望对你们有用…...
OpenCV图像拼接(9)实现图像拼接功能的一个高级接口cv::Stitcher
操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 cv::Stitcher 类是OpenCV中用于实现图像拼接功能的一个高级接口。它简化了从一组部分重叠的图像创建全景图的过程,隐藏了许多底层细节…...
MySQL 用户权限与安全管理
MySQL 用户权限与安全管理 在数据库系统中,用户权限与安全管理是保障数据安全性、完整性和隐私性的核心机制。MySQL 提供了丰富的权限管理功能,可以精细地控制用户对数据库、表以及其他数据库对象的访问权限,同时也支持各种安全管理策略来防…...
dify + deepseek /qwen + win +xinference 等完成知识库建设
Dify.AI The Innovation Engine for Generative AI Applications 简介:Dify是一个用于构建人工智能应用程序的开源平台。我们将后端即服务和LLMOps相结合,简化了生成式人工智能解决方案的开发,使开发人员和非技术创新者都可以使用。CPU>…...
模数转换电路(A/D转换器)
A/D转换,是将输入的模拟电压量转换成相应的数字量。 A/D转换器的类型很多,按工作原理可分为直接转换型和间接转换型两大类。前者直接将模拟电压量转换成数字量,后者是先将模拟电压量转换成一个中间量,再将中间量转换成数字量。 …...
算法 | 麻雀搜索算法原理,公式,改进算法综述,应用场景及matlab完整代码
一、麻雀搜索算法(SSA)原理 1. 算法基础 麻雀搜索算法(Sparrow Search Algorithm, SSA)是2020年提出的一种群体智能优化算法,灵感来源于麻雀群体的觅食与反捕食行为。算法将麻雀分为三类角色:发现者(Producer):适应度最高,负责探索全局最优区域;加入者(Follower)…...
