电商网站域名wordpress搬家后图片打不开
- 作者: 五速梦信息网
- 时间: 2026年03月21日 11:25
当前位置: 首页 > news >正文
电商网站域名,wordpress搬家后图片打不开,抖音小程序注册,wordpress更改文章宽度#x1f525;博客主页#xff1a; 【小扳-CSDN博客】 ❤感谢大家点赞#x1f44d;收藏⭐评论✍ 文章目录 1.0 RabbitMQ 初识 1.1 RabbitMQ 安装 2.0 数据隔离 2.1 用户管理 2.2 virtual host 虚拟主机 3.0 SpringAMQP 3.1 RabbitMQ 配置 3.2 发送消息 3.3 接收消息 3.4 Wor… 博客主页 【小扳-CSDN博客】 ❤感谢大家点赞收藏⭐评论✍ 文章目录 1.0 RabbitMQ 初识 1.1 RabbitMQ 安装 2.0 数据隔离 2.1 用户管理 2.2 virtual host 虚拟主机 3.0 SpringAMQP 3.1 RabbitMQ 配置 3.2 发送消息 3.3 接收消息 3.4 WorkQueues 模式 4.0 交换机类型 4.1 Fanout 交换机 4.2 Direct 交换机 4.3 Topic 交换机 5.0 声明队列和交换机 5.1 基本的 API 5.2 fanout 示例 5.3 direct 示例 5.4 基于注解声明 5.4.1 Fanout 模式的交换机 5.4.2 Direct 模式的交换机 6.0 消息转换器 6.1 配置 JSON 转化器 6.2 实现业务幂等性 1.0 RabbitMQ 初识 RabbitMQ 是基于 Erlang 语言开发的开源消息通信中间件官网地址https://www.rabbitmq.com/ RabbitMQ 中间件的使用目的基于消息通知实现异步调用一般包含三个角色 1消息发送者投递消息的人就是原来的调用方。 2消息 Broker管理、暂存、转发消息可以理解为容器。 3消息接收者接收和处理消息的人服务提供方。 在异步调用中发送者不再直接同步调用接收者的业务接口而是发送一条消息投递给消息 Broker然后接收者根据自己的需求从消息 Broker 那里订阅消息。每当发送方发送消息后接收者都能接收消息并处理这样发送消息的人与接收消息的人完全解耦了。 RabbitMQ 对应的框架 其中包含的几个概念 1Publish生产者也就是发送消息的一方。 2consumer消费者也就是消费消息的一方。 3queue队列存储消息。生产者投递的消息会暂存在消息队列中等待消费者处理。 4exchange交换机负责消息路由。生产者发送的消息由交换机决定投递到哪个队列。 5virtual host虚拟主机起到数据隔离的作用。每个虚拟主机相互独立有各自的 exchange、queue 1.1 RabbitMQ 安装 1基于 Docker 来安装 RabbitMQ使用下面命令即可 docker run -e RABBITMQ_DEFAULT_USERitheima -e RABBITMQ_DEFAULT_PASS123321 -v mq-plugins:/plugins --name mq --hostname mq -p 15672:15672 -p 5672:5672 -d \rabbitmq:3.8-management 2如果部署在云服务器中则还需要添加管理员命令如下 1. 进入 RabbitMQ Docker 容器 首先找到正在运行的 RabbitMQ 容器的 ID 或名称 docker ps 2. 然后使用 docker exec 命令进入容器 docker exec -it mq /bin/bash 3. 添加用户 rabbitmqctl add_user admin admin_password 4. 设置用户权限 将用户设置为超级管理员 rabbitmqctl set_user_tags admin administrator 5. 配置用户虚拟主机权限 如果 RabbitMQ 使用虚拟主机 vhost需要为用户设置相应的权限假设虚拟主机为 “/” rabbitmqctl set_permissions -p / admin .* .* .* 6. 退出容器 exit 可以看到安装命令中有两个映射的端口 15672RabbitMQ 提供的管理控制台的端口。 5672RabbitMQ 的消息发送处理接口。 安装完成后访问自己的 IP:15672 即可看到管理控制台。 如果是首次访问需要登录默认的用户名和密码就是在设置超级管理员的时候所对应的用户名和密码。 2.0 数据隔离 2.1 用户管理 点击 admin 选项卡首先看到 RabbitMQ 控制台的用户管理界面 Name用户名。 Tagesadministrator说明该用户是超级管理员拥有所有权限。 Can access virtual host/可以访问的 virtual host这里的 / 是默认的 virtual host 。
添加用户 xbs 用户已经拥有了超级管理员的权限但是没有属于自己的虚拟主机。 因此可以通过添加用户且创建另一个 virtual host实现数据隔离。 2.2 virtual host 虚拟主机 先退出原先的用户切换到刚刚创建的 xbs 用户登录然后点击 Virtual Host 菜单进入 virtual hsot 管理页 创建虚拟主机 不同的虚拟主机之间数据是隔离的相互不会受到影响。简单理解成 MySQL 中的数据库数据库与数据库之间的数据不会受到影响。 3.0 SpringAMQP 由于 RabbitMQ 采用了 AMQP 协议因此具备跨语言的特性。任何语言只要遵循 AMQP 协议收发消息都可以与 RabbitMQ 交互。并且 RabbitMQ 官方也提供了各种不同语言的客户端。但是RabbitMQ 官方提供的 Java 客户端编码相对复杂一般生产环境下更多结合 Spring 来使用而 Spring 的官方刚好基于 RabbitMQ 提供了这样一套消息收发的模板工具SpringAMQP并且还基于 SpringBoot 对其实现了自动装配使用起来非常方便。 SpringAMQP 官方地址Spring AMQP SpringAMQP 提供了三个功能 1自动声明队列、交换机及其绑定关系。 2基于注解的监听器模式异步接收消息。 3封装了 RabbitTemplate 工具用于发送消息。 3.1 RabbitMQ 配置 1依赖引入 !–AMQP依赖包含RabbitMQ–dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-amqp/artifactId/dependency 2application.yml 添加配置 spring:rabbitmq:host: 113.45.166.112 # 你的虚拟机IPport: 5672 # 端口virtual-host: /tt # 虚拟主机username: xbs # 用户名password: ******** # 密码 3.2 发送消息 在发送消息之前需要先根据图形化界面创建一个 queue1 队列 成功创建 queue1 队列 接着在测试类 Test 中编写并利用 RabbitTemplate 实现消息发送
代码如下 Testvoid contextLoads() {//发送消息sendMessage(hello world);}// 首先引入依赖Autowiredprivate RabbitTemplate rabbitTemplate;private void sendMessage(String massage){//需要明确发送的队列名称以及发送的消息rabbitTemplate.convertAndSend(queue1,massage );} 测试结果 可以看到 queue1 队列中接收到消息了 3.3 接收消息 刚刚发送的消息已经到 queue1 队列中但是没有消费者进行消费所以现在创建消费者进行处理消息。 在 SpringAMQP 中是使用了监听器来进行对绑定的队列进行监听将来一旦监听的队列中有了消息就会推送给当前服务调用当前方法处理消息。
代码如下 Slf4j
Component
public class RabbitMQ {//接收消息//监听queue1队列RabbitListener(queues queue1)private void receiveMessage(String massage) {//用什么类型发送就接收什么类型log.info(接收到的消息为: massage);}
} 注意需要加上 Component 注解成为 IOC 容器中的 Bean 对象。
执行结果 3.4 WorkQueues 模式 Work queues任务模型简单来说就是让多个消费者绑定到一个队列共同消费队列中的消息如果直接将消息发送到队列中则队列每一个消息只能被处理一次每一个消息都不能被多个消费者同时消费。 而在 WorkQueues 模式中就是将消息直接发送到队列中且多个消费者绑定同一个队列。 WorkQueues 应用场景 当消息处理比较耗时时的时候可能产生消息的速度会远远大于消息的消费速度。长此以往消息就会堆积越来越多无法及时处理。 此时就可以使用 work 模型多个消费者共同处理消息处理消息处理的速度就能大大提高了。 默认情况下消息是平均分配每个消费者并没有考虑到消费者的处理能力没有充分利用每一个消费者的能力这样显然是有问题的。在 Spring 中有一个简单的配置可以解决这个问题通过修改 application.yml 文件添加配置 spring:rabbitmq:host: 113.45.166.112 # 你的虚拟机IPport: 5672 # 端口virtual-host: /tt # 虚拟主机username: xbs # 用户名password: ****** # 密码listener:simple:prefetch: 1 # 每次只能获取一条消息处理完成才能获取下一个消息 能者多劳只要完成处理了消息就能从队列获取一条消息。 测试 1定义了两个消费者进行对队列中的消息进行消费 Slf4j
Component
public class RabbitMQ {//接收消息//监听queue1队列RabbitListener(queues queue1)private void receiveMessage1(String massage) throws InterruptedException {String coloredMessage String.format(\u001B[32m%s\u001B[0m, massage); // 绿色字体//用什么类型发送就接收什么类型log.info(receiveMessage1接收到的消息为: coloredMessage);//手动阻塞,模拟消息处理中Thread.sleep(200);}//接收消息//监听queue1队列RabbitListener(queues queue1)private void receiveMessage2(String massage) throws InterruptedException {String coloredMessage String.format(\u001B[0m, massage); // 黄色字体//用什么类型发送就接收什么类型log.info(receiveMessage2接收到的消息为: massage);//手动阻塞,模拟消息处理中Thread.sleep(800);}
} 2发送多条消息到队列中 Testvoid contextLoads() {//发送多条消息到queue1队列中setRabbitTemplate();}// 首先引入依赖Autowiredprivate RabbitTemplate rabbitTemplate;private void setRabbitTemplate(){for (int i 1; i 100; i) {rabbitTemplate.convertAndSend(queue1,接收到第i条消息);}} 测试结果 很明显看得出来消费能力强的消费者处理队列中的消息越多。正所谓能者多劳这样充分利用每一个消费者的处理能力可以有效避免消息积压问题。 4.0 交换机类型 在之前没有交换机都是生产者直接发送消息给队列而一旦引入交换机消息发送的模式会有很大变化 Exchange 交换机只负责转发消息不具备存储消息的能力因此如果没有任何队列与 Exchange 绑定或者没有符合路由规则的队列那么消息会丢失。 而如果将消息直接发送到队列中那么队列可以将消息进行存储不会丢失。
交换机的类型有四种 1Fanout广播将消息交给所有绑定到交换机的队列。 2Direct订阅基于 RoutingKey路由 key发送给订阅了消息的队列。 3Topic通配符订阅与 Direct 类型只不过 RoutingKey 可以使用通配符。 4Headers头匹配基于 MQ 的消息匹配用的较少。 4.1 Fanout 交换机 在广播模式下消息发送流程是这样的 1 可以有多个队列 2 每个队列都要绑定到 Exchange交换机 3 生产者发送的消息只能发送到交换机 4 交换机把消息发送给绑定过的所有队列 5 订阅队列的消费者都能拿到消息
广播模式演示 先创建 Fanout 类型的交换机 再创建两个队列 queue1、queue2 接着 xbs.fanout 交换需要绑定 queue1、queue2 队列 再接着用代码实现发送消息、接收消息
代码如下 1接收消息 Slf4j
Component
public class RabbitMQ {//接收消息//监听queue1队列RabbitListener(queues queue1)private void receiveMessage1(String massage) throws InterruptedException {String coloredMessage String.format(\u001B[32m%s\u001B[0m, massage); // 绿色字体//用什么类型发送就接收什么类型log.info(receiveMessage1接收到的消息为: coloredMessage);}//接收消息//监听queue2队列RabbitListener(queues queue2)private void receiveMessage2(String massage) throws InterruptedException {//用什么类型发送就接收什么类型log.info(receiveMessage2接收到的消息为: massage);}
} 2发送消息 Testvoid contextLoads() {//发送多条消息到queue1队列中sendMessageByExchange(广播通知:狼来啦);}// 首先引入依赖Autowiredprivate RabbitTemplate rabbitTemplate;//发送消息到交换机private void sendMessageByExchange(String msg){rabbitTemplate.convertAndSend(xbs.fanout,,msg);} 执行结果 4.2 Direct 交换机 在 Fanout 模式中一条消息会被所有订阅的队列都消费。但是在某些场景下我们希望不同的消息被不同的队列消费。这时就要用到 Direct 类型的 Exchange 。 在Direct模型下 1队列与交换机的绑定不能是任意绑定了而是要指定一个 RoutingKey路由key 2消息的发送方在 向 Exchange 发送消息时也必须指定消息的 RoutingKey。 3Exchange 不再把消息交给每一个绑定的队列而是根据消息的 RoutingKey 进行判断只有队列的 RoutingKey 与消息的 RoutingKey 完全一致才会接收到消息。 Direct 交换机演示 1首先创建 xbs.direct 交换机 2再创建两个队列 queue3、queue4 3xbs.direct 交换机绑定两个队列 4通过 RoutingKey 路由关键字来指定。对于 queue4 队列也是同样的道理 接着使用代码来实现发送消息、接收消息
代码实现 1接收消息 Slf4j
Component
public class RabbitMQ {//接收消息//监听queue1队列RabbitListener(queues queue3)private void receiveMessage1(String massage) throws InterruptedException {String coloredMessage String.format(\u001B[32m%s\u001B[0m, massage); // 绿色字体//用什么类型发送就接收什么类型log.info(receiveMessage1接收到的消息为: coloredMessage);}//接收消息//监听queue2队列RabbitListener(queues queue4)private void receiveMessage2(String massage) throws InterruptedException {//用什么类型发送就接收什么类型log.info(receiveMessage2接收到的消息为: massage);}
} 2发送消息 Testvoid contextLoads() {sendMessageByDirect1();}Testpublic void sendMessageByDirect1(){rabbitTemplate.convertAndSend(xbs.direct,red,指定 red 路由进行发送消息);}Testpublic void sendMessageByDirect2(){rabbitTemplate.convertAndSend(xbs.direct,blue,指定 blue 路由进行发送消息);} 执行结果 当指定 red 的路由关键字那么只有队列 queue1 才能接收得到因此对应的消费者才能进行处理。 同理当指定 blue 的路由关键字那么只有队列 queue2 才能接收得到因此对应的消费者才能进行处理。 4.3 Topic 交换机 Topic 类型的 Exchange 与 Direct 相比都是可以根据 RoutingKey 吧消息路由到不同的队列。只不过 Topic 类型 Exhchange 可以让队列在绑定 BindingKey 的时候使用通配符。
通配符规则 1#匹配一个或多个词。 2只匹配一个词。 Topic 交换机演示 1创建 xbs.topic 交换机 2创建两个队列 queue5、queue5 3将该两个队列进行绑定到 xbs.topic 交换机上并且指定对应通配符的 RoutingKey 关键字 4使用代码实现发送消息、接收消息
代码如下 发送消息 Testvoid contextLoads() {//两个队列绑定同一个交换机sendMessageByTopic1();}// 首先引入依赖Autowiredprivate RabbitTemplate rabbitTemplate;Testpublic void sendMessageByTopic1(){rabbitTemplate.convertAndSend(xbs.topic,class.student,该消息通知学生以及老师:狼来啦);}Testpublic void sendMessageByTopic2(){rabbitTemplate.convertAndSend(xbs.topic,class.teacher,该消息不会通知学生:狼来啦);} 接收消息 Slf4j
Component
public class RabbitMQ {//接收消息//监听queue1队列RabbitListener(queues queue5)private void receiveMessage1(String massage) throws InterruptedException {String coloredMessage String.format(\u001B[32m%s\u001B[0m, massage); // 绿色字体//用什么类型发送就接收什么类型log.info(receiveMessage1接收到的消息为: coloredMessage);}//接收消息//监听queue2队列RabbitListener(queues queue6)private void receiveMessage2(String massage) throws InterruptedException {//用什么类型发送就接收什么类型log.info(receiveMessage2接收到的消息为: massage);}
} 测试结果 当发送的消息的关键字为 class.student 时则会将该消息发送到 queue5、queue6 队列中所以对应的两个消费者都能进行消费 当发送的消息的关键字为 class.teacher 时则该消息只会发送到 queue6 队列中 5.0 声明队列和交换机 在之前都是基于 RabbitMQ 控制台来创建队列、交换机。但是在实际开发时队列和交换机是程序员定义的将来项目上线又要交给运维去创建那么程序员就需要把程序中运行的所有队列和交换机都写下来交给运维在这个过程中是是很容易出错的。 因此推荐的做法是由程序员启动时检查队列和交换机是否存在如果不存在则自动创建。 5.1 基本的 API 1SpringAMQP 提供了一个 Queue 类用来创建队列 2SpringAMQP 还提供了一个 Exchange 接口来表示所有不同类型的交换机 我们可以自己创建队列和交换机不过 SpringAMQP 还提供了 ExchangeBuilder 来简化这个过程 3而在绑定队列和交换机时则需要使用 BindingBuilder 来创建 Binding 对象 5.2 fanout 示例 在 FanoutExchangeCom 中创建一个类声明两个队列和一个交换机 Configuration
public class FanoutExchangeCom {/** 声明交换机* return Fanout类型交换机/Beanpublic FanoutExchange fanoutExchange(){return ExchangeBuilder.fanoutExchange(tt.fanout).build();}/** 声明队列* return Queue/Beanpublic Queue queue1(){return new Queue(tt.queue1);}/** 声明队列* return Queue/Beanpublic Queue queue2(){return new Queue(tt.queue2);}/** 绑定第一个队列和交换机/Beanpublic Binding bindingQueue1(Queue queue1, FanoutExchange fanoutExchange){return BindingBuilder.bind(queue1).to(fanoutExchange);}/** 绑定第二个队列和交换机/Beanpublic Binding bindingQueue2(Queue queue2, FanoutExchange fanoutExchange){return BindingBuilder.bind(queue2).to(fanoutExchange);}
} 当代码运行起来则会自动创建交换机和队列 5.3 direct 示例 在 DirectExchangeCom 中创建一个类声明两个队列和一个交换机 Configuration
public class DirectExchangeCom {/** 创建一个direct交换机* return DirectExchange/Beanpublic DirectExchange directExchange(){return ExchangeBuilder.directExchange(tt.direct).build();}/** 创建一个队列* return Queue/Beanpublic Queue queue3(){return new Queue(tt.queue3);}/** 创建一个队列* return Queue/Beanpublic Queue queue4(){return new Queue(tt.queue4);}/** 绑定队列到交换机* param queue1* param directExchange* return 且指定路由键 xbs/Beanpublic Binding binding1(Queue queue3,DirectExchange directExchange){return BindingBuilder.bind(queue3).to(directExchange).with(xbs);}/** 绑定队列到交换机* param queue2* param directExchange* return 且指定路由键 tt*/Beanpublic Binding binding2(Queue queue4,DirectExchange directExchange){return BindingBuilder.bind(queue4).to(directExchange).with(tt);}} 程序执行结果 自动创建队列 自动创建交换机 5.4 基于注解声明 基于注解 Bean 的方式声明队列和交换机比价麻烦Spring 还提供了基于注解方式来声明。在监听队列 RabbitListener 注解上进行添加相关的注解来声明交换机或者队列。 5.4.1 Fanout 模式的交换机
代码如下 //基于注解声明交换机和队列RabbitListener(bindings QueueBinding(value Queue(name tt.queue5),exchange Exchange(name tt.fanoutExchange, type ExchangeTypes.FANOUT)))private void sendMessage(String massage) throws InterruptedException {log.info(sendMessage发送的消息为: massage);} 通过注解 Queue 声明队列Exchange 声明交换机可以指定类型默认的类型为 Direct 类型的交换机。最后再通过 QueueBinding 注解进行绑定队列到交换机中。
当程序运行起来 tt.fanoutExchange 交换机 tt.queue5 队列 //基于注解声明交换机和队列RabbitListener(bindings QueueBinding(value Queue(name tt.queue6),exchange Exchange(name tt.directExchange,type ExchangeTypes.DIRECT),key tt.xbs))private void listenMessageByDirect(String massage) throws InterruptedException {log.info(sendMessageByFanout发送的消息为: massage);} 5.4.2 Direct 模式的交换机
代码如下 //基于注解声明交换机和队列RabbitListener(bindings QueueBinding(value Queue(name tt.queue6),exchange Exchange(name tt.directExchange,type ExchangeTypes.DIRECT),key tt.xbs))private void listenMessageByDirect(String massage) throws InterruptedException {log.info(sendMessageByFanout发送的消息为: massage);} 通过 Queue 注解声明队列Exchange 注解声明交换机且指定交换机类型。还通过 QueueBinding 注解将队列绑定到交换机中通过 key 指定路由关键字。
程序执行结果 tt.directExchange 交换机 tt.queue6 队列 6.0 消息转换器 Spring 的消息发送代码接收的消息体是一个 Object // 首先引入依赖Autowiredprivate RabbitTemplate rabbitTemplate;Testvoid contextLoads() {//发送Object类型的消息textObject();}Testpublic void textObject(){User user new User(1,xbs,123456,null,null);rabbitTemplate.convertAndSend(text,user);} 此外还需要确保 User 类实现 Serializable 接口这是因为 SimpleMessageConverter 只支持 String、byte[] 和 Serializable 类型的消息负载。
此时队列中的消息 在数据传输时SimpleMessageConverter 会把发送的消息序列化为字节发送给 MQ接收消息的时候还会把字节反序列化为 Java 对象。 只不过默认情况下 Spring 采用的序列化方式是 JDK 序列化。从所周知JDK 序列化存在以下问题 1数据体积过大。 2有安全漏洞。 3可读性差。 6.1 配置 JSON 转化器 显然JDK 序列化方式并不合适期望消息体的体积更小、可读性更高因此可以使用 JSON 方式来做序列化和反序列化。 1引入依赖 dependencygroupIdcom.fasterxml.jackson.dataformat/groupIdartifactIdjackson-dataformat-xml/artifactIdversion2.9.10/version
/dependency 注意如果项目中引入了 Spring-boot-start-wed 依赖则无需再次引入 Jackson 依赖。 2添加新 MessageConverter 类型 Beanpublic MessageConverter messageConverter(){//1.定义消息转化器Jackson2JsonMessageConverter converter new Jackson2JsonMessageConverter();//2.配置自定创建消息id用于识别不同消息也可以在业务中基于ID判断是否是重复消息converter.setCreateMessageIds(true);return converter;} 消息转换器中添加的 messageId 可以便于我们将来做幂等性判断。
配置好了 Json 消息转化器之后进行测试 发送的消息是 User 类型且该 User 类不需要再实现 SimpleMessageConverter 接口。 // 首先引入依赖Autowiredprivate RabbitTemplate rabbitTemplate;Testvoid contextLoads() {//发送Object类型的消息textObject();}Testpublic void textObject(){User user new User(1,xbs,123456,null,null);rabbitTemplate.convertAndSend(text,user);} 执行结果 可以很容易看到消息体中的内容且字节只需要 81 个。 6.2 实现业务幂等性 幂等是一个数学概念用函数表达式来描述f(x)f(f(x)) 。在程序开发中则是指同一个业务执行一次或多次对业务状态的影响是一致的。 实现业务幂等可以通过唯一消息 id是给每个消息都设置一个唯一 ID利用 id 区分是否是重复消息 1每一条消息都生成一个唯一的 id与消息一起投递给消费者。 2消费者接收到消息后处理自己的业务业务处理成功后将消息 ID 保存到数据库。 3如果下次又收到相同消息去数据库查询判断是否存在存在则为重复消息放弃处理。 那么通过配置 JSON 转化器中设置 setCreateMessageIds(true) 方法接收者都可以在消息中获取到唯一 id 。
代码如下 1发送消息 // 首先引入依赖Autowiredprivate RabbitTemplate rabbitTemplate;Testvoid contextLoads() {//发送Object类型的消息textObject();}Testpublic void textObject(){User user new User(1,xbs,123456,null,null);rabbitTemplate.convertAndSend(textExchange, xbs, user, new MessagePostProcessor() {Overridepublic Message postProcessMessage(Message message) throws AmqpException {message.getMessageProperties().setMessageId(123456);return message;}});} 通过匿名类 MessagePostProcessor 重写 postProcessMessage 方法将消息发送之前对消息的属性进行修改比如说配置 id 属性、配置消息头等等而对于 postProcessMessage 方法不能携带消息本体只能在 convertAndSend() 方法中属性进行配置比如说发送 user 实体类。 2接收消息 AutowiredMessageConverter messageConverter;RabbitListener(queues text)private void listenMessage(Message massage) throws InterruptedException {log.info(sendMessage发送的消息为: massage.getMessageProperties().getMessageId());User user (User) messageConverter.fromMessage(massage);log.info(sendMessage发送的消息为: user);} 监听 text 队列中的消息接收的参数不再是 user而是 Message 类型通过 massage.getMessageProperties().getMessageId() 获取唯一 id再通过 MessageConverter 消息转化器将 massage 的本体消息转化为 User 类型。
接收消息的结果
相关文章
-
电商网站有哪些使用场景wordpress模糊搜索插件
电商网站有哪些使用场景wordpress模糊搜索插件
- 技术栈
- 2026年03月21日
-
电商网站页面分类厦门市规划建设局网站
电商网站页面分类厦门市规划建设局网站
- 技术栈
- 2026年03月21日
-
电商网站首页图片泰州网站设计培训
电商网站首页图片泰州网站设计培训
- 技术栈
- 2026年03月21日
-
电商网站在线支付怎么做菏泽网站建设便宜臻动传媒
电商网站在线支付怎么做菏泽网站建设便宜臻动传媒
- 技术栈
- 2026年03月21日
-
电商网站怎么制作调用wordpress
电商网站怎么制作调用wordpress
- 技术栈
- 2026年03月21日
-
电商网站怎么做seo市场营销公司
电商网站怎么做seo市场营销公司
- 技术栈
- 2026年03月21日






