当前位置: 首页 > news >正文

【商城实战(54)】解锁商城国际化密码:内容管理全攻略

【商城实战】专栏重磅来袭!这是一份专为开发者与电商从业者打造的超详细指南。从项目基础搭建,运用 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 框架进行开发。uniapp 具有出色的跨平台能力,能让我们方便地构建出兼容多端(如 Web、微信小程序、APP 等)的用户界面。它利用 Vue.js 的响应式原理和组件化开发模式,使开发者可以轻松创建交互性强、用户体验良好的界面。例如,在商品信息录入页面,通过 uniapp 的组件库,我们可以快速搭建出各种输入框、下拉菜单等元素,方便商家录入商品的多语言描述信息。同时,前端还负责与用户进行交互,接收用户的输入,并将这些数据发送到后端进行处理。

后端部分,采用 Spring Boot 框架。Spring Boot 基于 Spring 框架,它简化了 Spring 应用的搭建和开发过程,提供了自动配置、起步依赖等功能,能让我们快速构建出稳定、高效的后端服务。在国际化商品信息管理系统中,后端主要负责处理前端发送过来的请求,对数据进行验证、存储和查询等操作。例如,当后端接收到前端发送的商品多语言描述数据时,它会将这些数据存储到数据库中,并在用户查询商品信息时,根据用户选择的语言,从数据库中获取相应的商品描述数据返回给前端。

前后端之间通过 RESTful API 进行通信。RESTful API 是一种基于 HTTP 协议的网络应用程序接口设计风格,它具有简洁、易理解、可扩展等优点。在本系统中,前端通过 HTTP 请求向后端发送商品信息的录入、查询、更新等操作,后端则以 JSON 格式返回相应的数据。例如,前端发送一个 POST 请求到后端的 “/products” 接口,携带商品的多语言描述数据,后端接收到请求后,对数据进行处理,并返回一个包含操作结果的 JSON 对象给前端。

1.2 数据库表结构设计

为了存储多语言商品信息,我们需要精心设计数据库表结构。这里以 MySQL 数据库为例,设计两张主要的表:商品主表 “products” 和商品翻译表 “product_translations”。

商品主表 “products” 主要存储商品的基本信息,这些信息不依赖于语言,具有通用性。其字段设计如下:

  • id:商品的唯一标识,采用自增长的整数类型,作为主键,确保每个商品在系统中都有唯一的编号。
  • sku:商品库存保有单位,是商品的一种编码,用于唯一标识商品的特定属性组合,例如颜色、尺寸等,采用字符串类型。
  • price:商品价格,采用 DECIMAL 类型,能够精确地表示货币金额,避免浮点数运算带来的精度问题。
  • stock:商品库存数量,采用整数类型,用于记录商品的当前库存情况。

商品翻译表 “product_translations” 则用于存储商品的多语言描述信息,通过外键与商品主表关联。其字段设计如下:

  • id:翻译记录的唯一标识,自增长整数类型,作为主键。
  • product_id:关联商品主表中的id字段,建立外键约束,表明这条翻译记录属于哪个商品,采用整数类型。
  • language_code:语言代码,用于标识该条翻译记录对应的语言,例如 “zh-CN” 表示简体中文,“en-US” 表示美式英语,采用字符串类型。
  • name:商品名称的翻译,采用字符串类型,长度根据实际需求设置。
  • description:商品描述的翻译,通常商品描述内容较多,采用 TEXT 类型来存储。

通过这样的表结构设计,当需要添加新的语言支持时,只需在商品翻译表中插入新的记录即可,无需修改商品主表的结构,具有良好的扩展性。例如,当要为一个商品添加法语描述时,只需在 “product_translations” 表中插入一条记录,设置 “product_id” 为该商品的 ID,“language_code” 为 “fr-FR”,并填写对应的 “name” 和 “description” 字段即可。

1.3 录入功能实现

在前端,利用 uniapp 的表单组件和数据绑定功能来实现多语言商品描述的录入界面。我们可以创建一个表单页面,在页面中为每种支持的语言都设置相应的输入框。例如,对于简体中文和美式英语两种语言,页面上会有两个文本区域,分别标注为 “简体中文描述” 和 “美式英语描述”。通过 uniapp 的数据绑定,将用户在这些输入框中输入的内容与 Vue 实例中的数据对象进行关联。

当用户填写完商品的多语言描述信息并点击提交按钮时,前端会将这些数据封装成 JSON 格式,通过 HTTP POST 请求发送到后端。在请求中,会包含商品的基本信息(如sku、price、stock等)以及多语言描述信息(每个语言对应的name和description)。

后端,Spring Boot 应用通过定义相应的 RESTful API 接口来接收前端发送的数据。在控制器类中,使用@RequestMapping或@PostMapping注解来映射请求路径,例如 “/products”。接口方法的参数会使用@RequestBody注解来接收前端发送的 JSON 数据,并将其自动转换为 Java 对象。

后端接收到数据后,首先会对数据进行验证,确保数据的完整性和合法性。例如,检查商品的sku是否唯一,价格是否为正数,库存是否为非负数等。如果数据验证通过,后端会将商品的基本信息插入到商品主表 “products” 中,获取插入后的商品 ID。然后,根据前端发送的多语言描述数据,将每条翻译记录插入到商品翻译表 “product_translations” 中,关联刚刚插入的商品 ID 和对应的语言代码。如果数据验证失败,后端会返回错误信息给前端,前端根据错误信息提示用户进行修改。

二、管理多语言页面文案

2.1 文案管理工具选择

在选择多语言文案管理工具时,我们需要综合考虑多方面因素。市面上有许多优秀的工具可供选择,它们各自具有独特的特点和优势。

Crowdin 是一款功能强大的在线多语言翻译管理工具。它支持多种文件格式的导入和导出,这使得我们可以方便地与现有的项目进行集成。例如,我们可以将项目中的 JSON、XML 等格式的文案文件导入到 Crowdin 中进行翻译管理。Crowdin 提供了实时协作功能,翻译人员和开发人员可以在同一个平台上进行协作,实时查看和修改翻译内容。它还具备自动化翻译功能,能够利用翻译记忆库和机器翻译技术,提高翻译效率,降低翻译成本。然而,Crowdin 也存在一些缺点,例如对于一些小型项目来说,其费用相对较高,可能会超出预算。

Transifex 同样是一款知名的在线多语言翻译管理工具。它拥有简洁易用的界面,即使是非技术人员也能快速上手。Transifex 支持团队协作,能够方便地管理翻译项目的流程,包括任务分配、进度跟踪等。它还提供了丰富的 API,便于与其他系统进行集成。但是,Transifex 在术语管理方面相对较弱,如果项目中涉及大量专业术语,可能需要额外的工作来确保术语的一致性。

对于本商城项目,考虑到我们需要处理大量的页面文案,且团队成员之间需要高效协作,同时要控制成本,Crowdin 是一个较为合适的选择。它的实时协作和自动化翻译功能能够大大提高我们的工作效率,虽然费用相对较高,但对于一个大型商城项目来说,其带来的价值是值得的。

2.2 文案收集与整理

收集首页标语、导航栏文字等需要翻译的文案是一项细致的工作。首先,我们可以从前端代码入手,利用一些工具来批量提取硬编码在代码中的文本。例如,对于基于 uniapp 开发的前端项目,我们可以使用 IDE(如 HBuilderX)的查找功能,结合正则表达式,搜索出所有可能需要翻译的文本。同时,产品经理和设计师也需要参与到文案收集工作中,他们可以从用户界面的角度出发,梳理出页面上可见的文案,如按钮文字、提示信息等。

在收集到文案后,我们需要对其进行分类整理。可以按照页面模块进行分类,例如将首页相关的文案放在一个类别,商品详情页的文案放在另一个类别。为每个文案建立一个唯一的标识(Key),这个 Key 在整个项目中用于引用该文案,确保在不同语言版本中能够准确对应。同时,记录每个文案的原始文本、所在页面路径以及相关的上下文信息,例如文案所在的界面截图,这有助于翻译人员更好地理解文案的含义和使用场景,从而提供更准确的翻译。例如,对于导航栏上的 “首页” 按钮文案,我们可以为其分配一个 Key 为 “nav_home_button”,记录原始文本为 “首页”,页面路径为 “/home”,并附上导航栏的界面截图。将整理好的文案存储在一个表格中,方便后续的翻译和管理工作。

2.3 翻译流程与协作

翻译工作可以根据实际情况选择内部翻译或借助专业的翻译平台。如果公司内部有具备多语言能力的员工,且翻译量不大时,可以采用内部翻译的方式。内部翻译人员对公司业务和产品有更深入的了解,能够更好地把握文案的风格和语境。但对于大规模的翻译工作,借助专业的翻译平台可能更为高效和准确。

当选择借助翻译平台时,我们可以将整理好的文案表格上传到 Crowdin 等翻译管理工具中。在 Crowdin 中,我们可以创建翻译项目,将不同语言的翻译任务分配给相应的翻译人员。翻译人员在平台上进行翻译工作,实时提交翻译结果。开发人员可以在平台上实时查看翻译进度,对翻译结果进行审核。如果发现翻译不准确或不符合项目风格的地方,及时与翻译人员沟通,进行修改。

在翻译过程中,建立术语库是非常重要的。术语库用于存储项目中涉及的专业术语及其翻译,确保在整个翻译过程中术语的一致性。翻译人员在翻译时,需要参考术语库,避免出现同一术语不同翻译的情况。同时,随着项目的发展,术语库也需要不断更新和完善。例如,当商城引入新的商品品类或业务概念时,及时将相关术语添加到术语库中。通过这样的翻译流程和协作方式,能够确保多语言页面文案的准确性和一致性,为用户提供良好的国际化体验。

三、确保国际化内容同步展示及更新

3.1 前端国际化方案

前端采用 Vue - i18n 库来实现多语言内容展示。在基于 uniapp 和 Element Plus 搭建的前端项目中,首先安装 Vue - i18n 库,通过 npm install vue - i18n 命令即可完成安装。安装完成后,在项目的入口文件(如 main.js)中进行配置。

创建一个语言资源对象,包含不同语言的翻译内容。例如:

const messages = {'zh-CN': {'home': '首页','products': '商品','cart': '购物车'},'en-US': {'home': 'Home','products': 'Products','cart': 'Cart'}
};

然后,创建 Vue - i18n 实例并挂载到 Vue 应用中:

import Vue from 'vue';
import VueI18n from 'vue-i18n';Vue.use(VueI18n);const i18n = new VueI18n({locale: 'zh-CN', // 设置默认语言messages
});new Vue({i18n,// 其他配置
}).$mount('#app');在组件中,通过$t方法来获取对应的翻译文本。例如,在导航栏组件中:
<template><div><el - menu><el - menu - item :index="'/home'">{{ $t('home') }}</el - menu - item><el - menu - item :index="'/products'">{{ $t('products') }}</el - menu - item><el - menu - item :index="'/cart'">{{ $t('cart') }}</el - menu - item></el - menu></div>
</template>

为了实现动态切换语言,我们可以在组件中定义一个方法来修改i18n.locale的值。比如,在页面上添加一个语言选择下拉框,当用户选择不同语言时,触发切换方法:

<template><div><el - select v - model="currentLang" @change="changeLanguage"><el - option label="简体中文" value="zh-CN"></el - option><el - option label="美式英语" value="en-US"></el - option></el - select></div>
</template><script>
export default {data() {return {currentLang: this.$i18n.locale};},methods: {changeLanguage() {this.$i18n.locale = this.currentLang;}}
};
</script>

这样,当用户切换语言时,前端页面上的所有文本都会根据所选语言进行相应的更新。

3.2 后端数据处理

后端基于 Spring Boot 框架,根据前端请求的语言偏好,返回相应语言版本的商品信息和页面文案。在 Spring Boot 中,我们可以通过拦截器或过滤器来获取前端请求中的语言参数。

首先,定义一个拦截器,用于获取请求头中的语言信息,例如Accept - Language头。在拦截器中,将获取到的语言信息存储到线程局部变量中,以便后续在控制器方法中使用。

import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;public class LocaleInterceptor implements HandlerInterceptor {@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {String language = request.getHeader("Accept - Language");// 解析语言信息,例如从"zh - CN,en - US;q = 0.9"中提取"zh - CN"String locale = parseLocale(language);// 将语言信息存储到线程局部变量LocaleContextHolder.setLocale(locale);return true;}@Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {// 可以在这里进行一些后置处理}@Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {// 清理线程局部变量LocaleContextHolder.resetLocale();}private String parseLocale(String language) {if (language != null && language.contains(",")) {return language.split(",")[0];}return language;}
}

然后,在 Spring Boot 的配置类中注册这个拦截器:

import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;@Configuration
public class WebMvcConfig implements WebMvcConfigurer {@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(new LocaleInterceptor()).addPathPatterns("/**");}
}

在控制器方法中,通过LocaleContextHolder获取当前语言信息,然后从数据库中查询相应语言版本的商品信息和页面文案。例如,查询商品信息的方法:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.i18n.LocaleContextHolder;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;import java.util.Locale;@RestController
public class ProductController {@Autowiredprivate ProductService productService;@GetMapping("/products/{id}")public Product getProduct(@PathVariable Long id) {Locale locale = LocaleContextHolder.getLocale();return productService.getProductById(id, locale);}
}

在ProductService中,根据语言信息从数据库中查询商品的多语言描述:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Service;import java.util.Locale;@Service
public class ProductService {@Autowiredprivate JdbcTemplate jdbcTemplate;public Product getProductById(Long id, Locale locale) {String languageCode = locale.getLanguage();String sql = "SELECT p.id, p.sku, p.price, p.stock, pt.name, pt.description " +"FROM products p " +"JOIN product_translations pt ON p.id = pt.product_id " +"WHERE p.id =? AND pt.language_code =?";return jdbcTemplate.queryForObject(sql, new Object[]{id, languageCode}, (rs, rowNum) -> {Product product = new Product();product.setId(rs.getLong("id"));product.setSku(rs.getString("sku"));product.setPrice(rs.getBigDecimal("price"));product.setStock(rs.getInt("stock"));product.setName(rs.getString("name"));product.setDescription(rs.getString("description"));return product;});}
}

这样,后端就能根据前端请求的语言偏好返回相应语言版本的数据。

3.3 同步更新机制

当内容在后端更新后,为了确保前端能及时同步展示更新后的国际化内容,我们采用消息队列技术,这里以 RabbitMQ 为例。

在后端,当商品信息或页面文案发生更新时,发送一条消息到 RabbitMQ 的队列中。例如,在ProductService的更新方法中:

import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import org.springframework.stereotype.Service;import java.io.IOException;
import java.util.concurrent.TimeoutException;@Service
public class ProductService {private static final String QUEUE_NAME = "product_update_queue";public void updateProduct(Product product) {// 更新数据库中的商品信息//...// 发送更新消息到消息队列sendUpdateMessage(product.getId());}private void sendUpdateMessage(Long productId) {ConnectionFactory factory = new ConnectionFactory();factory.setHost("localhost");try (Connection connection = factory.newConnection();Channel channel = connection.createChannel()) {channel.queueDeclare(QUEUE_NAME, false, false, false, null);String message = productId.toString();channel.basicPublish("", QUEUE_NAME, null, message.getBytes("UTF-8"));System.out.println(" [x] Sent '" + message + "'");} catch (IOException | TimeoutException e) {e.printStackTrace();}}
}

在前端,创建一个消息消费者,监听 RabbitMQ 队列中的消息。当接收到消息时,根据消息中的商品 ID 或页面文案标识,重新请求后端获取最新的国际化内容,并更新前端页面。

使用pika库(Python)来实现消息消费者:

import pikadef callback(ch, method, properties, body):product_id = body.decode('UTF-8')# 重新请求后端获取最新的商品信息update_product_on_frontend(product_id)ch.basic_ack(delivery_tag = method.delivery_tag)connection = pika.BlockingConnection(pika.ConnectionParameters('localhost'))
channel = connection.channel()
channel.queue_declare(queue='product_update_queue')channel.basic_consume(queue='product_update_queue', on_message_callback = callback)print(' [*] Waiting for messages. To exit press CTRL+C')
channel.start_consuming()

在update_product_on_frontend函数中,通过调用前端的 API 来更新页面上的商品信息展示:

import requestsdef update_product_on_frontend(product_id):url = f'http://frontend.com/products/{product_id}'response = requests.get(url)if response.status_code == 200:product_data = response.json()# 更新前端页面上的商品信息展示update_ui(product_data)

通过这种消息队列的方式,实现了后端内容更新与前端展示的同步,确保用户能够及时看到最新的国际化内容。

四、总结与展望

在商城实战中,国际化内容管理是提升商城竞争力、拓展全球市场的关键环节。搭建国际化商品信息管理系统,使我们能够高效地管理多语言商品描述,满足不同地区用户的需求,为商品的全球推广奠定了坚实基础。通过精心选择文案管理工具,系统地收集、整理和翻译多语言页面文案,确保了商城在各个语言版本下都能传达准确、一致的品牌形象和信息。而前端和后端的国际化方案以及同步更新机制的建立,则保证了用户无论何时何地访问商城,都能获得流畅、及时的多语言体验。

展望未来,随着人工智能技术的不断发展,机器翻译的准确性和智能化程度将进一步提高,我们可以探索将更先进的机器翻译技术融入到国际化内容管理流程中,进一步提高翻译效率和降低成本。同时,随着全球市场的不断变化和用户需求的日益多样化,我们需要更加关注不同文化背景下用户的个性化需求,在内容管理上实现更精准的本地化定制,以提供更贴心的用户服务。此外,加强对国际化内容的数据分析,深入了解用户行为和偏好,也将有助于我们不断优化商城的国际化内容,提升用户满意度和忠诚度,推动商城在国际化道路上持续稳健发展。

相关文章:

【商城实战(54)】解锁商城国际化密码:内容管理全攻略

【商城实战】专栏重磅来袭&#xff01;这是一份专为开发者与电商从业者打造的超详细指南。从项目基础搭建&#xff0c;运用 uniapp、Element Plus、SpringBoot 搭建商城框架&#xff0c;到用户、商品、订单等核心模块开发&#xff0c;再到性能优化、安全加固、多端适配&#xf…...

JS 应用WebPack 打包器第三方库 JQuery安装使用安全检测

# 打包器 -WebPack- 使用 & 安全 参考&#xff1a; https://mp.weixin.qq.com/s/J3bpy-SsCnQ1lBov1L98WA Webpack 是一个模块打包器。在 Webpack 中会将前端的所有资源文件都作为模块处理。 它将根据模块的依赖关系进行分析&#xff0c;生成对应的资源。 五个核心概…...

【嵌入式硬件】三款DCDC调试笔记

关于开关电源芯片&#xff0c;重点关注输入电源范围、输出电流、最低压降。 1.MP9943: 以MP9943为例&#xff0c;输入电压范围4-36V&#xff0c;输出最大电流3A&#xff0c;最低压降为0.3V 调整FB使正常输出为5.06V 给定6V空载、5V空载、5V带2A负载的情况&#xff1a; 6V带2A…...

深入理解 HTML5 Web Workers:提升网页性能的关键技术解析

深入理解 HTML5 Web Workers&#xff1a;提升网页性能的关键技术解析 引言1. 什么是 Web Workers&#xff1f;Web Workers 的特点&#xff1a; 2. Web Workers 的使用方式2.1 创建一个 Web Worker步骤 1&#xff1a;创建 Worker 文件步骤 2&#xff1a;在主线程中调用 Worker 3…...

计算机网络的分类——按照按拓扑结构分类

计算机的拓扑结构是引用拓扑学中研究和大小、形状无关的点、线关系的方法&#xff0c;将网络中的计算机和通信设备抽象为一个点&#xff0c;把传输介质抽象成一条线&#xff0c;由点和线组成的几何图形就是计算机网络的拓扑结构。计算机网络的拓扑结构主要由通信子网决定&#…...

AI大白话(四):自然语言处理——AI是如何理解和生成人类语言的?

🌟引言: 专栏:《AI大白话》 AI大白话(一):5分钟了解AI到底是什么? AI大白话(二):机器学习——AI是怎么“学习“的? AI大白话(三):深度学习——AI的‘大脑‘是如何构建的? 大家好!欢迎回到"AI大白话"系列。前面我们聊了AI的基本概念、机器学习的原理…...

Android第六次面试总结(Java设计模式篇一)

单例模式属于创建型设计模式&#xff0c;它保证一个类仅有一个实例&#xff0c;并且提供一个全局访问点来获取该实例。下面为你详细阐述单例模式的好处和坏处。 好处 资源优化&#xff1a;单例模式能保证一个类只有一个实例&#xff0c;这对于那些创建和销毁开销大的对象&…...

如何在 React 项目中进行服务器端渲染(SSR),它有什么优势

大白话如何在 React 项目中进行服务器端渲染&#xff08;SSR&#xff09;&#xff0c;它有什么优势 什么是服务器端渲染&#xff08;SSR&#xff09; 在传统的 React 项目里&#xff0c;页面的渲染工作是在浏览器里完成的。也就是当你访问一个网页时&#xff0c;浏览器会先下…...

JVM 01

今天是2025/03/20 16:36 day 09 总路线请移步主页Java大纲相关文章 今天进行JVM前二个模块的归纳 首先是JVM的相关内容概括的思维导图 以下是针对思维导图中 内存管理 和 垃圾回收&#xff08;GC&#xff09; 模块的详细说明&#xff1a; 1. 内存管理&#xff08;运行时数据…...

MATLAB 调用arduino uno

为了授课&#xff0c;必须重新把arduino用上。 采用MATLAB编码&#xff0c;可以简化相关程序授课部分 1 安装包 MATLAB Support Package for Arduino Hardware - File Exchange - MATLAB Central (mathworks.com) 需要这个插件。 当然也可下载simulink的模块&#xff0c;但…...

WPS宏开发手册——JSA语法

目录 系列文章2、JSA语法2.1、打印输出2.2、注释2.3、变量2.4、数据类型2.5、函数2.6、运算符2.7、比较2.8、if else条件语句2.9、for循环2.10、Math对象&#xff08;数字常用方法&#xff09;2.11、字符串常用方法2.12、数组常用方法 系列文章 使用、工程、模块介绍 JSA语…...

linux如何释放内存缓存

[rootredis ~]# sync #将内存缓存数据强制写入磁盘&#xff08;保存数据后再做释放&#xff09; [rootredis ~]# echo 1 > /proc/sys/vm/drop_caches #释放内存缓存...

2025年渗透测试面试题总结-某360-企业蓝军面试复盘 (题目+回答)

网络安全领域各种资源&#xff0c;学习文档&#xff0c;以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具&#xff0c;欢迎关注。 目录 360-企业蓝军 一、Shiro绕WAF实战方案 二、WebLogic遭遇WAF拦截后的渗透路径 三、JBoss/WebLogic反序…...

Atlas 800I A2 双机直连部署DeepSeek-R1-w8a8

一、环境信息 1.1、硬件信息 Atlas 800I A2 * 2 1.2、环境信息 操作系统&#xff1a;openEuler 22.03 LTS NPU驱动&#xff1a;Ascend-hdk-910b-npu-driver 24.1.0 linux-aarch64.run NPU固件&#xff1a;Ascend-hdk-910b-npu-firware 7.5.0.3.220.run MindIE镜像&#xff…...

OpenHarmony 入门——ArkUI 跨页面数据同步和页面级UI状态存储LocalStorage小结(二)

文章大纲 引言一、在代码逻辑使用LocalStorage二、从UI内部使用LocalStorage三、LocalStorageProp和LocalStorage单向同步四、LocalStorageLink和LocalStorage双向同步五、兄弟组件之间同步状态变量七、将LocalStorage实例从UIAbility共享到一个或多个视图 引言 前面一篇文章主…...

自我革命!优利德全面进入智能示波器时代

AI重构电子测试新范式 春节期间&#xff0c;DeepSeek&#xff08;深度求索&#xff09;火遍全网。作为国内首个全面对标GPT-4技术架构的AI大模型&#xff0c;DeepSeek凭借其自主研发的通用大语言模型体系&#xff0c;涵盖了从7B到超千亿参数的完整模型矩阵&#xff0c;在数学推…...

Vue3 实战:基于 mxGraph 与 WebSocket 的动态流程图构建

本文将详细介绍如何在 Vue3 项目中集成 mxGraph 可视化库&#xff0c;并通过 WebSocket 实现画布元素的实时更新。适合有 Vue 基础的前端开发者学习参考。 一、技术栈准备 Vue3&#xff1a;采用 Composition API 开发mxGraph&#xff1a;JavaScript 流程图库&#xff08;版本 …...

Python-金融相关代码讲解

文章目录 概要整体架构流程1.代码部分2.逐个讲解1&#xff09;# -*- coding: utf-8 -*-2&#xff09;基本库引入3&#xff09;函数模块4&#xff09;主程序 小结1. 问题拆解思维2. 文件处理三件套3. 字典的妙用&#xff1a;4. 上下文管理器&#xff08;with open...&#xff09…...

深度解读DeepSeek:开源周(Open Source Week)技术解读

深度解读DeepSeek&#xff1a;开源周&#xff08;Open Source Week&#xff09;技术解读 深度解读DeepSeek&#xff1a;源码解读 DeepSeek-V3 深度解读DeepSeek&#xff1a;技术原理 深度解读DeepSeek&#xff1a;发展历程 文章目录 一、开源内容概览Day1&#xff1a;FlashMLAD…...

【算法】十大排序算法(含时间复杂度、核心思想)

以下是 **十大经典排序算法** 的时间复杂度、空间复杂度及稳定性总结&#xff0c;适用于面试快速回顾&#xff1a;排序算法对比表 排序算法最佳时间复杂度平均时间复杂度最差时间复杂度空间复杂度稳定性核心思想冒泡排序O(n)O(n)O(n)O(1)稳定相邻元素交换&#xff0c;大数沉底…...

TCP传输---计算机网络

TCP结构 源端口和目标端口&#xff1a;标识通信的应用程序。序列号&#xff1a;标记发送的数据段的顺序序号。确认号 ( ACK)&#xff1a;确认接收到的数据序号。标志位&#xff1a;控制连接状态&#xff0c;包括 SYN&#xff08;同步&#xff09;、ACK&#xff08;确认&#xf…...

创建vue2项目

1、前往 Node.js 官网下载并安装 Node.js&#xff0c;安装完成后&#xff0c;npm 会随之安装。确认 Node.js 和 npm 是否成功安装&#xff0c;可以在命令行中运行以下命令检查版本&#xff1a; node -v npm -v 运行结果&#xff1a;&#xff08;如下&#xff0c;表示node和n…...

从投机到可持续发展:ETHDenver 2025 的关键启示!

ETHDenver 2025 重点讨论了 Web3 向可持续发展转型&#xff0c;特别强调了人才培养、去中心化治理和激励机制的紧密结合。Polkadot 一直以来的长期观点也进一步支持了行业从投机转向长期、社区驱动增长的趋势。随着 ETHDenver 2025 会议的的落幕&#xff0c;Polkadot 生态中的贡…...

WPS宏开发手册——使用、工程、模块介绍

目录 系列文章前言1、开始1.1、宏编辑器使用步骤1.2、工程1.3、工程 系列文章 使用、工程、模块介绍 JSA语法 第三篇练习练习题&#xff0c;持续更新中… 前言 如果你是开发人员&#xff0c;那么wps宏开发对你来说手拿把切。反之还挺吃力&#xff0c;需要嘻嘻&#xf…...

操作系统为ubantu的服务器上部署nginx软件基础步骤总结

今天在这里&#xff0c;我们总结一下ubantu的服务器上部署nginx软件&#xff0c;请按照以下步骤进行安装&#xff1a; 1、更新包列表&#xff1a; 首先更新你系统中的可用软件包列表&#xff0c;以确保你可以安装最新版本。 sudo apt update2、 Ubuntu上更新已安装软件包&…...

批量给 PPT 文档添加或删除保护,批量设置打开密码和只读密码

为了保护保护档的安全&#xff0c;我们经常会给 PPT 文档添加打开密码或者只读密码保护。有些场景下&#xff0c;我们也可能会碰到需要删除 PPT 文档的打开密码或者只读密码的需求。今天就给大家介绍一种方法可以一次性批量给多个 PPT 文档添加打开密码或者只读密码保护&#x…...

Elasticsearch 中的数据分片问题

Elasticsearch 分片机制 Elasticsearch 在存储数据时采用 分片&#xff08;Shard&#xff09;机制&#xff0c;以提高性能和可扩展性。它索引中的数据被划分成多个 主分片&#xff08;Primary Shard&#xff09; 和 副本分片&#xff08;Replica Shard&#xff09;&#xff0c…...

如何在IPhone 16Pro上运行python文件?

在 iPhone 16 Pro 上运行 Python 文件需要借助第三方工具或远程服务&#xff0c;以下是具体实现方法和步骤&#xff1a; 一、本地运行方案&#xff08;无需越狱&#xff09; 使用 Python 编程类 App 以下应用可在 App Store 下载&#xff0c;支持直接在 iPhone 上编写并运行 …...

Xinference安装、使用详细笔记

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 Xinference安装、使用详细笔记 支持推理引擎安装Xinference启动Xinference关于模型的推理引擎运行 qwen2.5-instruct管理模型官方详细文档&#xff1a;具体使用&#xff1a;对…...

NAT 模式

使用LVS的 NAT 模式实现 3 台RS的轮询访问。IP地址和主机自己规划。 1.节点规划 主机角色系统网络IPclientclientredhat 9.5仅主机192.168.180.100/24lvslvsredhat 9.5仅主机 NAT192.168.180.200/24 VIP 192.168.72.8/24 DIPnginxrs1redhat 9.5NAT192.168.226.7/24nginxrs2r…...

【中间件】Rabbit离线部署操作

准备安装包&#xff1a; 1.rabbitmq-server-4.0.7-1.el8.noarch.rpm 2.erlang-26.2.5.4-1.el9.x86_64.rpm 3.socat-1.7.4.1-6.el9.x86_64.rpm 操作步骤&#xff1a; 1.上传将RabbitMQ文件夹上传至服务器的home中 2.先安装erlang服务&#xff0c;顺序执行以下命令 设置服务的S…...

thinkphp漏洞再现

Thinkphp5x远程命令执行及getshell 1、开环境 2、使用工具攻击 开启工具 输入地址&#xff0c;点击漏洞检测 存在漏洞之后&#xff0c;选择漏洞&#xff0c;执行命令 3、也可以执行远程命令 执行命令 ?sindex/think\app/invokefunction&functioncall_user_func_array&…...

a-date-picker 格式化日期格式 YYYY-MM-DD HH:mm:ss

<template><a-range-pickerv-model:value"dateRange":show-time"{ format: HH:mm:ss, // 时间部分格式defaultValue: [moment(00:00:00, HH:mm:ss), moment(23:59:59, HH:mm:ss)] // 默认时间范围}"format"YYYY-MM-DD HH:mm:ss" // 整体…...

【前端】在<el-form>里循环插入list内容

这里的list为日志list【logList】 <el-row v-if"logList && logList.length > 0" style"display: flex; flex-direction: column; align-items: center;"><el-rowv-for"(log, index) in logList" :key"index" s…...

Spring Boot 一个接口实现任意表的 Excel 导入导出

Java的web开发需要excel的导入导出工具&#xff0c;所以需要一定的工具类实现&#xff0c;如果是使用easypoi、Hutool导入导出excel&#xff0c;会非常的损耗内存&#xff0c;因此可以尝试使用easyexcel解决大数据量的数据的导入导出&#xff0c;且可以通过Java8的函数式编程解…...

华为交换相关

端口模式 &#xff08;1&#xff09;access&#xff1a;只能属于单个VLAN&#xff0c;一般用于连接计算机端口 &#xff08;2&#xff09;trunk&#xff1a;端口允许多个VLAN通过&#xff0c;可以接收和发送多个VLAN报文&#xff0c;默认情况下只有管理VLAN不携带标签信息 &…...

「宇树科技」13家核心零部件供应商梳理!

2025年2月6日&#xff0c;摩根士丹利&#xff08;Morgan Stanley&#xff09;发布最新人形机器人研报&#xff1a;Humanoid 100: Mapping the Humanoid Robot Value Chain&#xff08;人形机器人100&#xff1a;全球人形机器人产业链梳理&#xff09;。 2025年2月20日&#xf…...

Kafka Snappy 压缩异常分析与解决方案

1. 问题描述 在使用 Kafka 进行消息发送时&#xff0c;遇到了以下异常&#xff1a; org.apache.kafka.common.KafkaException: java.lang.UnsatisfiedLinkError: /tmp/snappy-1.1.7-ee0a2284-1d05-4116-9ddc-a0d5d4b3f8cd-libsnappyjava.so: Error loading shared library ld…...

Agent系列——Manus调研

一、Manus核心技术解析&#xff08;代码实现原理&#xff09; 1. 多智能体协同架构 class PlanningAgent: # 任务规划代理def decompose_task(self, task):return ["unzip_files", "extract_info", "match_skills"]class ExecutionAgent: # …...

CS实现票据样式效果

效果图 代码 <template> <div class"outer"><div class"outer-container"></div></div> </template> <script langts> import { reactive, toRefs, onBeforeMount, onMounted } from vue import { useRouter, …...

Maven 简介及其核心概念

Maven 是 Apache 软件基金会组织维护的一款自动化构建工具,专注服务于 Java 平台的项目构建和 依赖管理。 官网: Introduction – Maven 下载地址: Download Apache Maven – Maven 1 Introduction Maven, a Yiddish word meaning accumulator of knowledge, began as an …...

阿里开源的免费数据集成工具——DataX

企业里真实的数据流转是什么样子的呢&#xff1f; 左侧描述了一个企业真实的样子&#xff0c;我们总是需要把数据从一个地方搬到另一个地方&#xff0c;最后就是搬来搬去搬成了一张张解不开的网。 右侧则表达了使用DataX为中心实现数据的同步。 什么是DataX DataX是一个异构…...

医学图像分割数据集肺分割数据labelme格式6299张2类别

数据集格式&#xff1a;labelme格式(不包含mask文件&#xff0c;仅仅包含jpg图片和对应的json文件) 图像分辨率&#xff1a;1024x1024 图片数量(jpg文件个数)&#xff1a;6299 标注数量(json文件个数)&#xff1a;6299 标注类别数&#xff1a;2 标注类别名称:["leftl…...

Spring IoC的设计与实现

IoC,Inversion of Control 控制反转&#xff0c;将原本由应用程序负责对象创建的工作&#xff0c;交给IOC容器来完成。容器通过依赖注入&#xff08;DI&#xff0c;Dependency Injection&#xff09;来实现。 作用&#xff1a;降低类对象之间的耦合度&#xff0c;减少代码量。…...

微信小程序开发:页面结构与样式设计

微信小程序页面结构与样式设计研究 摘要 微信小程序作为移动互联网的重要应用形式&#xff0c;其页面结构与样式设计对于用户体验和功能实现具有关键作用。本文深入探讨微信小程序的页面结构与样式设计&#xff0c;包括WXML语法与页面结构搭建、WXSS样式编写与页面美化提升以…...

Linux paste命令

目录 一. 简介二. 基本语法三. 小案例 一. 简介 paste 命令用于合并多个文件的行&#xff0c;按列方式输出&#xff0c;默认以制表符&#xff08;Tab&#xff09;分隔。 ⏹基本语法 paste [选项] 文件1 文件2 ...二. 基本语法 <()的方式模拟文件流paste命令将2个文件流粘…...

关于Object.assign

Object.assign 基本用法 Object.assign() 方法用于将所有可枚举属性的值从一个或者多个源对象source复制到目标对象。它将返回目标对象target const target { a: 1, b: 2 } const source { b: 4, c: 5 }const returnedTarget Object.assign(target, source)target // { a…...

新能源汽车充换站如何实现光储充一体化管理?

长三角某换电站光伏板晒到发烫&#xff0c;却因电网限电被迫切机&#xff1b;北京五环充电站每月多缴6万超容费&#xff1b;深圳物流车充电高峰排队3小时...当95%的充换站深陷“用不起绿电、扛不住扩容、算不清碳账”困局&#xff0c;安科瑞用一组真实数据撕开行业潜规则&#…...

Flink 流处理框架的核心特性

文章目录 事件时间支持Flink状态编程一、状态的类型1. 托管状态&#xff08;Managed State&#xff09;2. 原始状态&#xff08;Raw State&#xff09; 二、状态的管理和容错 Flink端到端的一致性1、检查点机制2、幂等3、事务 水位线窗口操作1、窗口类型2、窗口操作的时间语义 …...

蓝桥杯之AT24C02的页写页读

一、原理&#xff1a; 1、页写&#xff1a;一次性向AT24C02里的多个数据存储单元地址写入多个数据 &#xff08;1&#xff09;在AT24C02的页写模式下&#xff0c;每次写入数据后&#xff0c;存储单元地址会自动加1。 &#xff08;2&#xff09;一页有8个数据存储单元&#xff…...