【商城实战(91)】安全审计与日志管理:为电商平台筑牢安全防线

【商城实战】专栏重磅来袭!这是一份专为开发者与电商从业者打造的超详细指南。从项目基础搭建,运用 uniapp、Element Plus、SpringBoot 搭建商城框架,到用户、商品、订单等核心模块开发,再到性能优化、安全加固、多端适配,乃至运营推广策略,102 章内容层层递进。无论是想深入钻研技术细节,还是探寻商城运营之道,本专栏都能提供从 0 到 1 的系统讲解,助力你打造独具竞争力的电商平台,开启电商实战之旅。

目录

  • 一、建立安全审计机制
    • 1.1 审计内容与范围
    • 1.2 Spring Boot 实现审计
    • 1.3 MyBatis-Plus 在审计中的作用
  • 二、开发日志管理系统
    • 2.1 日志收集
    • 2.2 日志存储
    • 2.3 日志查询
  • 三、分析审计与日志数据
    • 3.1 潜在风险分析
    • 3.2 防范措施
  • 四、总结


一、建立安全审计机制

1.1 审计内容与范围

在商城系统中,安全审计机制需要记录的信息广泛。对于用户操作,涵盖登录、注册、密码修改、商品浏览、添加购物车、下单、支付、评论等。例如,用户登录时,记录登录时间、登录 IP、登录账号等信息,有助于追踪用户的登录行为,及时发现异常登录情况,如异地登录、频繁登录失败等。下单操作则记录下单时间、订单金额、购买商品列表、用户 ID 等,方便后续对订单相关操作的追溯。

系统事件方面,包括服务器错误(如 500 内部服务器错误、404 页面未找到等)、资源访问(如对数据库、文件系统的访问)、系统配置变更等。当服务器出现 500 错误时,记录错误发生时间、错误堆栈信息、触发错误的请求等,能够帮助开发人员快速定位问题。资源访问记录可以监控对关键数据的读取和修改操作,确保数据的安全性和完整性。

1.2 Spring Boot 实现审计

基于 Spring AOP 实现审计功能,首先需要添加相关依赖。在pom.xml文件中添加spring-boot-starter-aop依赖:

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-aop</artifactId>
</dependency>

接着定义一个自定义注解,用于标识需要审计的方法。例如:

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface AuditAnnotation {String value() default "";
}

然后创建切面类,在切面类中定义切点和增强逻辑。示例代码如下:

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;@Aspect
@Component
public class AuditAspect {private static final Logger logger = LoggerFactory.getLogger(AuditAspect.class);@Pointcut("@annotation(com.example.demo.AuditAnnotation)")public void auditPointCut() {}@Before("auditPointCut()")public void before(JoinPoint joinPoint) {logger.info("Before method {} execution", joinPoint.getSignature().getName());}@AfterReturning(pointcut = "auditPointCut()", returning = "result")public void afterReturning(JoinPoint joinPoint, Object result) {logger.info("After method {} execution, result: {}", joinPoint.getSignature().getName(), result);}@AfterThrowing(pointcut = "auditPointCut()", throwing = "e")public void afterThrowing(JoinPoint joinPoint, Exception e) {logger.error("Method {} threw an exception: {}", joinPoint.getSignature().getName(), e.getMessage());}@Around("auditPointCut()")public Object around(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {logger.info("Around method {} execution, start", proceedingJoinPoint.getSignature().getName());Object result = proceedingJoinPoint.proceed();logger.info("Around method {} execution, end", proceedingJoinPoint.getSignature().getName());return result;}
}

在上述代码中,@Pointcut定义了切点,即被@AuditAnnotation注解标注的方法。@Before、@AfterReturning、@AfterThrowing和@Around分别表示在方法执行前、执行成功后、抛出异常后和环绕方法执行时的增强逻辑。

1.3 MyBatis-Plus 在审计中的作用

MyBatis-Plus 与 Spring Boot 配合,可以方便地记录数据库操作相关的审计信息。在实体类中,可以通过自定义字段和注解来记录审计信息。例如,创建一个AuditEntity基类,包含创建时间、创建人、修改时间、修改人等字段:

import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.TableField;
import lombok.Data;import java.util.Date;@Data
public class AuditEntity {@TableField(fill = FieldFill.INSERT)private Date createTime;@TableField(fill = FieldFill.INSERT)private String createUser;@TableField(fill = FieldFill.INSERT_UPDATE)private Date updateTime;@TableField(fill = FieldFill.INSERT_UPDATE)private String updateUser;
}

其他需要审计的实体类继承AuditEntity,MyBatis-Plus 在执行插入和更新操作时,会自动填充这些字段。同时,可以通过自定义插件,在 SQL 执行前后记录审计信息。例如,创建一个自定义插件类:

import com.baomidou.mybatisplus.core.config.GlobalConfig;
import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import org.apache.ibatis.reflection.MetaObject;
import org.springframework.stereotype.Component;import java.util.Date;@Component
public class MyMetaObjectHandler implements MetaObjectHandler {@Overridepublic void insertFill(MetaObject metaObject) {this.setFieldValByName("createTime", new Date(), metaObject);this.setFieldValByName("updateTime", new Date(), metaObject);// 获取当前用户,这里假设通过工具类获取String currentUser = "admin";this.setFieldValByName("createUser", currentUser, metaObject);this.setFieldValByName("updateUser", currentUser, metaObject);}@Overridepublic void updateFill(MetaObject metaObject) {this.setFieldValByName("updateTime", new Date(), metaObject);// 获取当前用户,这里假设通过工具类获取String currentUser = "admin";this.setFieldValByName("updateUser", currentUser, metaObject);}
}

在上述代码中,MyMetaObjectHandler实现了MetaObjectHandler接口,重写了insertFill和updateFill方法,在插入和更新操作时自动填充审计字段。这样,通过 MyBatis-Plus 与 Spring Boot 的结合,能够有效地记录数据库操作相关的审计信息,为商城系统的安全审计提供有力支持。

二、开发日志管理系统

2.1 日志收集

在前端,无论是 uniapp(用于移动前端)还是 Element plus(用于 PC 前端),都可以通过自定义日志收集函数来捕获用户操作相关的日志。以 uniapp 为例,在utils目录下创建log.js文件,代码如下:

export function log(message) {const logData = {timestamp: new Date().getTime(),message: message,// 可以添加更多信息,如当前页面路径等pagePath: getCurrentPages().pop().route};// 这里可以使用uni.request将日志发送到后端uni.request({url: 'http://your-backend-url/log',method: 'POST',data: logData,success: (res) => {console.log('Log sent successfully', res);},fail: (err) => {console.error('Failed to send log', err);}});
}

在需要记录日志的页面,引入该函数并调用。例如:

import { log } from '@/utils/log.js';export default {methods: {addToCart() {// 模拟添加购物车操作log('User added item to cart');}}
};

在 Element plus 前端项目中,类似地可以在src/utils目录下创建log.js文件,实现日志收集和发送功能:

import axios from 'axios';export function log(message) {const logData = {timestamp: new Date().getTime(),message: message,// 可以添加更多信息,如当前路由等route: this.$router.currentRoute.path};axios.post('http://your-backend-url/log', logData).then((res) => {console.log('Log sent successfully', res);}).catch((err) => {console.error('Failed to send log', err);});
}

在后端 Spring Boot 中,创建一个日志接收的 Controller。在src/main/java/com/example/demo/controller目录下创建LogController.java文件:

import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;@RestController
public class LogController {@PostMapping("/log")public String receiveLog(@RequestBody LogData logData) {// 这里可以将日志数据传递给服务层进行进一步处理System.out.println("Received log: " + logData);return "Log received successfully";}
}class LogData {private long timestamp;private String message;private String pagePath; // 移动端日志包含的页面路径// 省略getter和setter方法
}

2.2 日志存储

使用 MyBatis-Plus 将日志存储到数据库。首先,创建日志实体类LogEntity。在src/main/java/com/example/demo/entity目录下创建LogEntity.java文件:

import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;import java.util.Date;@Data
@TableName("log")
public class LogEntity {private Long id;private long timestamp;private String message;private String pagePath; // 移动端日志包含的页面路径private Date createTime;
}

然后,创建日志服务层接口LogService和实现类LogServiceImpl。在src/main/java/com/example/demo/service目录下创建LogService.java文件:

import com.baomidou.mybatisplus.extension.service.IService;
import com.example.demo.entity.LogEntity;public interface LogService extends IService<LogEntity> {
}

在src/main/java/com/example/demo/service/impl目录下创建LogServiceImpl.java文件:

import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.example.demo.entity.LogEntity;
import com.example.demo.mapper.LogMapper;
import com.example.demo.service.LogService;
import org.springframework.stereotype.Service;import java.util.Date;@Service
public class LogServiceImpl extends ServiceImpl<LogMapper, LogEntity> implements LogService {@Overridepublic boolean saveLog(LogEntity logEntity) {logEntity.setCreateTime(new Date());return save(logEntity);}
}

其中,LogMapper由 MyBatis-Plus 自动生成,无需手动编写。在LogController中修改receiveLog方法,调用服务层保存日志:

import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;@RestController
public class LogController {private final LogService logService;public LogController(LogService logService) {this.logService = logService;}@PostMapping("/log")public String receiveLog(@RequestBody LogData logData) {LogEntity logEntity = new LogEntity();logEntity.setTimestamp(logData.getTimestamp());logEntity.setMessage(logData.getMessage());logEntity.setPagePath(logData.getPagePath());if (logService.saveLog(logEntity)) {return "Log saved successfully";} else {return "Failed to save log";}}
}

2.3 日志查询

在前端,通过界面组件触发日志查询请求。以 Element plus 为例,创建一个日志查询页面LogQuery.vue:

<template><div><el-input v-model="queryParams.message" placeholder="Search by message"></el-input><el-button @click="queryLogs">Query</el-button><el-table :data="logs"><el-table-column prop="id" label="ID"></el-table-column><el-table-column prop="timestamp" label="Timestamp"></el-table-column><el-table-column prop="message" label="Message"></el-table-column><el-table-column prop="pagePath" label="Page Path"></el-table-column><el-table-column prop="createTime" label="Create Time"></el-table-column></el-table></div>
</template><script>
import axios from 'axios';export default {data() {return {queryParams: {message: ''},logs: []};},methods: {async queryLogs() {try {const response = await axios.post('http://your-backend-url/log/query', this.queryParams);this.logs = response.data;} catch (error) {console.error('Failed to query logs', error);}}}
};
</script>

在后端 Spring Boot 中,创建日志查询的 Controller 方法。在LogController中添加如下方法:

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;import java.util.List;@RestController
public class LogController {private final LogService logService;public LogController(LogService logService) {this.logService = logService;}@PostMapping("/log/query")public List<LogEntity> queryLogs(@RequestBody LogQueryParams queryParams) {QueryWrapper<LogEntity> wrapper = new QueryWrapper<>();if (queryParams.getMessage() != null &&!queryParams.getMessage().isEmpty()) {wrapper.like("message", queryParams.getMessage());}return logService.list(wrapper);}
}class LogQueryParams {private String message;// 省略getter和setter方法
}

通过上述步骤,实现了日志管理系统的日志收集、存储和查询功能,能够有效地记录和管理商城系统中的日志信息。

三、分析审计与日志数据

3.1 潜在风险分析

通过对审计与日志数据的深入分析,可以发现多种潜在安全风险。例如,在用户登录方面,如果在一段时间内某个账号出现大量的登录失败记录,且这些失败记录来自不同的 IP 地址,这可能表明该账号正在遭受暴力破解攻击。假设通过日志查询发现,在某一小时内,用户 “user123” 的登录失败次数达到 50 次,且登录 IP 地址有 10 个不同的地址,这就明显超出了正常的登录行为范围,存在极大的安全风险。

在订单操作方面,若出现异常的订单修改或取消操作,也需要重点关注。比如,一个订单在短时间内被多次修改收货地址,且修改后的地址毫无规律,或者突然出现大量的订单在支付成功后立即被取消,这些都可能是恶意行为。例如,在某一天的订单日志中,发现有 100 个订单在支付成功后的 1 分钟内被取消,进一步调查发现这些订单的操作 IP 地址相同,这就很可能是有人在进行恶意刷单或其他欺诈行为。

3.2 防范措施

针对上述潜在风险,需要采取相应的防范措施。对于频繁登录失败的情况,可以限制登录次数。在 Spring Boot 中,可以通过配置过滤器来实现。在src/main/java/com/example/demo/config目录下创建LoginLimitFilter.java文件:

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;@WebFilter(filterName = "loginLimitFilter", urlPatterns = "/login")
public class LoginLimitFilter implements Filter {private static final int MAX_LOGIN_ATTEMPTS = 5;private static final Map<String, Integer> loginAttempts = new HashMap<>();@Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {HttpServletRequest request = (HttpServletRequest) servletRequest;HttpServletResponse response = (HttpServletResponse) servletResponse;String username = request.getParameter("username");if (username != null) {Integer attempts = loginAttempts.getOrDefault(username, 0);if (attempts >= MAX_LOGIN_ATTEMPTS) {response.setStatus(HttpServletResponse.SC_FORBIDDEN);response.getWriter().println("Too many login attempts, please try again later.");return;}loginAttempts.put(username, attempts + 1);}filterChain.doFilter(request, response);}@Overridepublic void init(FilterConfig filterConfig) throws ServletException {// 初始化操作}@Overridepublic void destroy() {// 销毁操作}
}

同时,在src/main/java/com/example/demo/DemoApplication.java中添加过滤器注册:

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;@SpringBootApplication
public class DemoApplication {public static void main(String[] args) {SpringApplication.run(DemoApplication.class, args);}@Beanpublic FilterRegistrationBean<LoginLimitFilter> loginLimitFilterRegistrationBean() {FilterRegistrationBean<LoginLimitFilter> registrationBean = new FilterRegistrationBean<>();registrationBean.setFilter(new LoginLimitFilter());registrationBean.addUrlPatterns("/login");return registrationBean;}
}

对于异常订单操作,加强订单验证是关键。在订单处理的 Service 层方法中添加验证逻辑。例如,在src/main/java/com/example/demo/service/impl/OrderServiceImpl.java中:

import com.example.demo.entity.Order;
import com.example.demo.mapper.OrderMapper;
import com.example.demo.service.OrderService;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;@Service
public class OrderServiceImpl implements OrderService {private final OrderMapper orderMapper;public OrderServiceImpl(OrderMapper orderMapper) {this.orderMapper = orderMapper;}@Override@Transactionalpublic boolean updateOrder(Order order) {// 验证订单修改的合法性Order originalOrder = orderMapper.selectById(order.getId());if (originalOrder == null) {return false;}// 检查收货地址是否合理,这里假设合理地址的判断逻辑if (!isValidAddress(order.getShippingAddress())) {return false;}// 其他验证逻辑return orderMapper.updateById(order) > 0;}private boolean isValidAddress(String address) {// 简单示例,实际应根据业务需求实现更复杂的验证return address != null &&!address.isEmpty();}
}

通过上述限制登录次数和加强订单验证等防范措施,可以有效地降低商城系统的安全风险,保障系统的稳定运行和用户数据的安全。

四、总结

安全审计与日志管理是商城系统中至关重要的环节,它们就像系统的 “安全卫士” 和 “记录员”。通过建立完善的安全审计机制,能够全面记录用户操作和系统事件,为系统的安全运行提供了有力的监控和追溯依据。而开发功能完备的日志管理系统,实现了日志的收集、存储和查询,使得系统运行过程中的各种信息能够被有效地管理和利用。通过对审计与日志数据的深入分析,能够及时发现潜在的安全风险,并采取针对性的防范措施,保障了商城系统的稳定运行和用户数据的安全。

未来,随着技术的不断发展和业务的日益复杂,安全审计与日志管理还需要不断优化和完善。在技术方面,可以引入人工智能和机器学习技术,实现对审计与日志数据的自动化分析和智能预警,提高发现潜在安全风险的效率和准确性。同时,进一步加强日志管理系统的性能优化,确保在高并发场景下也能稳定运行。在业务方面,要紧密结合商城的业务特点和发展需求,不断调整和完善审计内容和范围,使安全审计与日志管理更好地服务于商城的运营和发展。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/42841.html

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

相关文章

外包干了一个月,技术明显进步。。。。。

先说一下自己的情况&#xff0c;本科生&#xff0c;19年通过校招进入南京某软件公司&#xff0c;干了接近2年的功能测试&#xff0c;今年年初&#xff0c;感觉自己不能够在这样下去了&#xff0c;长时间呆在一个舒适的环境会让一个人堕落!而我已经在一个企业干了2年的功能测试&…

出海企业数字化为什么需要双层架构ERP?工博深度解析SAP ERP公有云方案

目录 什么是双层架构ERP&#xff1f; SAP双层架构ERP四大核心优势 标准化与集成 敏捷性与创新 成本与风险控制 合规与自主性 企业海外业务扩张时&#xff0c;可能由于文化差异、经验差异、合规要求和不断变化的地理政治环境等因素&#xff0c;使总部系统的在海外的推广充…

LVS的 NAT 模式实验

文章目录 目录 文章目录 概要 IP规划与题目分析 实验步骤 一、nginx配置&#xff08;rs1、rs2、rs3&#xff09; 二、LVS配置 三、客户端配置 四、防火墙和selinux配置 实验结果 痛点解答 概要 LVS/NAT lvs/nat网络地址转换模式&#xff0c;进站/出站的数据流量经过分发器(IP负…

MySQL Binlog

MySQL Binlog MySQL Binlog 介绍查看 Binlog 位点开启和关闭 BinlogBinlog 的作用Binlog 记录的格式Binlog 的解析Binlog 加密Binlog 的清理根据Binlog文件名删除根据时间删除 Binlog 保留参数Binlog 的落盘Binlog 相关参数 MySQL主从复制&#xff1a;https://blog.csdn.net/a…

第十四届蓝桥杯省赛电子类单片机学习记录(客观题)

01.一个8位的DAC转换器&#xff0c;供电电压为3.3V&#xff0c;参考电压2.4V&#xff0c;其ILSB产生的输出电压增量是&#xff08;D&#xff09;V。 A. 0.0129 B. 0.0047 C. 0.0064 D. 0.0094 解析&#xff1a; ILSB&#xff08;最低有效位&#xff09;的电压增量计算公式…

【随手记】支持多模态输入的 AI Chatbot App

一、Streamlit 1、Streamlit开发文档 官方文档&#xff1a;https://docs.streamlit.io/ 中文文档&#xff1a;https://blog.csdn.net/weixin_44458771/article/details/135495928 2、Streamlit命令行启动 pip install streamlit streamlit run app.py --server.port 85013…

为什么大模型在 OCR 任务上表现不佳?

编者按&#xff1a; 你是否曾经用最先进的大语言模型处理企业文档&#xff0c;却发现它把财务报表中的“$1,234.56”读成了“123456”&#xff1f;或者在处理医疗记录时&#xff0c;将“0.5mg”误读为“5mg”&#xff1f;对于依赖数据准确性的运营和采购团队来说&#xff0c;这…

关于ArcGIS中加载影像数据,符号系统中渲染参数的解析

今天遇到一个很有意思的问题&#xff0c;故记录下来&#xff0c;以作参考和后续的研究。欢迎随时沟通交流。如果表达错误或误导&#xff0c;请各位指正。 正文 当我们拿到一幅成果影像数据的时候&#xff0c;在不同的GIS软件中会有不同效果呈现&#xff0c;但这其实是影像是…

智能舵机:AI融合下的自动化新纪元

在自动化的浪潮中&#xff0c;智能舵机以其独特的魅力和卓越的性能&#xff0c;正引领着自动化产业迈向新的高度。今天&#xff0c;让我们一起走进智能舵机的世界&#xff0c;感受AI技术为其带来的无限可能。 一、智能舵机&#xff1a;自适应控制的先锋 智能舵机&#xff0c;…

计算机二级WPS Office第四套电子表格

解题过程 排名的函数有三个&#xff1a;rank函数、rank.avg函数、rank.eq函数

【数学建模】(启发式算法)蚁群算法(Ant Colony Optimization)的详解与应用

蚁群算法(Ant Colony Optimization)详解与应用 文章目录 蚁群算法(Ant Colony Optimization)详解与应用前言1. 蚁群算法的生物学基础2. 蚁群算法的基本原理2.1 算法框架2.2 状态转移规则2.3 信息素更新规则 3. 蚁群算法的实现4. 蚁群算法的改进4.1 MAX-MIN蚁群系统(MMAS)4.2 精…

基于Springboot的网上订餐系统 【源码】+【PPT】+【开题报告】+【论文】

网上订餐系统是一个基于Java语言和Spring Boot框架开发的Web应用&#xff0c;旨在为用户和管理员提供一个便捷的订餐平台。该系统通过简化餐饮订购和管理流程&#xff0c;为用户提供快速、高效的在线订餐体验&#xff0c;同时也为管理员提供完善的后台管理功能&#xff0c;帮助…

使用idea开发spark程序

新建scala 项目 创建lib目录 将spark jars/ 路径下所有jar 复制到 lib目录 添加依赖 创建scala 程序 package sparkimport org.apache.spark.{SparkConf, SparkContext}object WordCount {def main(args: Array[String]): Unit {val conf new SparkConf().setAppName(&q…

CORDIC算法:三角函数的硬件加速革命——从数学原理到FPGA实现的超高效计算方案

计算机该如何求解三角函数&#xff1f;或许你的第一印象是采用泰勒展开&#xff0c;或者采用多项式进行逼近。对于前者&#xff0c;来回的迭代计算开销成本很大&#xff1b;对于后者&#xff0c;多项式式逼近在较窄的范围內比较接近&#xff0c;超过一定范围后&#xff0c;就变…

无需docker三步安装deepseek可视化操作软件-Open-WebUI

在以前安装Open-WebUI时&#xff0c;需要通过docker安装, 针对小白来讲呢有些麻烦, 因此这里推荐使用python环境安装Open-WebUI,简单快捷上手快! 1. Mac安装python3.11 以上的环境, windows同学直接官网下载安装包msi,双击安装即可1.1 Mac直接安装 python3.11brew install pyt…

3DGS较真系列

目录 引言 三维高斯飞溅(3DGS) 总体流程 SFM算法 1.特征提取&#xff1a; 2.特征匹配&#xff1a; 3.图像对优选&#xff1a; 4.相机位姿估计及空间点坐标获取&#xff1a; 5.三角化确立新图像地图点&#xff1a; 6.重建场景及其约束&#xff1a; 3DGS 1.捏雪球 2…

【计网】网络、互连网、互联网的认识和区分

一、些杂乱的知识点&#xff1a; 1.Internet是由数量极大的各种计算机网络连接起来的。 2.世界上最大的计算机网络Internet叫互联网&#xff08;互联网 &#xff01; 互连网&#xff09;。 3.互联网的两个基本特点&#xff1a; &#xff08;1&#xff09;互通性&#xff1a…

手机零售行业的 AI 破局与创新降本实践 | OceanBase DB大咖说

OceanBase《DB 大咖说》第 20 期&#xff0c;我们邀请了九机与九讯云的技术总负责人&#xff0c;李远军&#xff0c;为我们分享手机零售企业如何借力分布式数据库OceanBase&#xff0c;赋能 AI 场景&#xff0c;并通过简化架构实现成本管控上的突破与创新。 李远军于2016年加入…

高并发金融系统,“可观测-可追溯-可回滚“的闭环审计体系

一句话总结 在高并发金融系统中&#xff0c;审计方案设计需平衡"观测粒度"与"系统损耗"&#xff0c;通过双AOP实现非侵入式采集&#xff0c;三表机制保障操作原子性&#xff0c;最终形成"可观测-可追溯-可回滚"的闭环体系。 业务痛点与需求 在…

迅为iTOP-RK3576人工智能开发板Android 系统接口功能测试

2.1 开机启动 开发板接通电源&#xff0c;并按下电源开关&#xff0c;系统即启动&#xff0c;在启动过程中&#xff0c;系统会显示下图中的开机画面&#xff0c;它们分别是 Android 系统启动时的 Logo 画面&#xff1a; 最后会显示如下解锁画面&#xff1a; 2.2 命令终端 将…