RabbitMQ(四种使用模式)

news2024/11/26 12:19:05

文章目录

    • 1.Fanout(广播模式)
        • 1.基本介绍
        • 2.需求分析
        • 3.具体实现
          • 1.编写配置类 RabbitMQConfig.java
          • 2.编写生产者,发送消息到交换机 MQSender.java
          • 3.编写消费者,接受消息 MQReceiver.java
          • 4.控制层调用方法,发送信息到交换机
        • 4.启动测试
          • 1.访问查看IDEA控制台输出
            • 1.访问 http://localhost:9092/seckill/mq/exchange
            • 2.查看控制台输出,两个队列同时接受到了消息
          • 2.访问RabbitMQ控制台 http://ip:15672
            • 1.查看交换机是否绑定了两个队列
            • 2.再查看Queues,新增了两个队列
    • 2.Direct(路由模式)
        • 1.基本介绍
        • 2.需求分析
        • 3.具体实现
          • 1.配置类 RabbitMQConfig.java
          • 2.编写生产者,发送消息到交换机并指定路由 MQSender.java
          • 3.编写消费者,接受消息 MQReceiver.java
          • 4.控制层调用方法,发送信息到交换机
        • 4.启动测试
          • 1.访问查看IDEA控制台输出
            • 1.访问 http://localhost:9092/seckill/mq/direct/green
            • 2.访问 http://localhost:9092/seckill/mq/direct/red
          • 2.访问RabbitMQ控制台 http://140.143.164.206:15672
            • 1.交换机绑定了两个队列
            • 2.再查看Queues,新增了两个队列
    • 3.Topic(主题模式)
        • 1.基本介绍
          • 1.介绍
          • 2.关于匹配模式的说明
        • 2.需求分析
        • 3.具体实现
          • 1.配置类 RabbitMQConfig.java
          • 2.编写生产者,发送消息到交换机并指定路由 MQSender.java
          • 3.编写消费者,接受消息 MQReceiver.java
          • 4.控制层调用方法,发送信息到交换机
        • 4.启动测试
          • 1.示意图
          • 2.访问查看IDEA控制台输出
            • 1.访问 http://localhost:9092/seckill/mq/topic/one.orange.one 匹配Q1
            • 2.访问 http://localhost:9092/seckill/mq/topic/one.one.rabbit 匹配Q2
            • 3.访问 http://localhost:9092/seckill/mq/topic/lazy.orange.one 匹配Q1和Q2
            • 4.访问 http://localhost:9092/seckill/mq/topic/lazy.any.any.any.any 匹配Q2
    • 4.Headers(头路由模式,使用较少)
        • 1.基本介绍
        • 2.示意图
        • 3.需求分析
        • 4.具体实现
          • 1.配置类 RabbitMQConfig.java
          • 2.编写生产者,发送消息到交换机并指定路由 MQSender.java
          • 3.编写消费者,接受消息 MQReceiver.java
          • 4.控制层调用方法,发送信息到交换机
        • 5.启动测试
          • 1.访问查看IDEA控制台输出
            • 1.访问 http://localhost:9092/seckill/mq/headers 匹配队列一
            • 2.访问 http://localhost:9092/seckill/mq/headers2 匹配队列二
    • 5.RabbitMQ使用模式总结
        • 1.整体架构图
        • 2.通用使用方式
          • 1.编写RabbitMQ的配置类
          • 2.编写消息发送者
          • 3.编写消息接受者
          • 4.编写控制层

1.Fanout(广播模式)

1.基本介绍

image-20240511143401624

2.需求分析

image-20240511143533335

3.具体实现
1.编写配置类 RabbitMQConfig.java
    // 定义一个交换机,两个队列的名称
    private static final String EXCHANGE = "exchange";
    private static final String QUEUE1 = "queue1";
    private static final String QUEUE2 = "queue2";

    // 创建两个队列和一个交换机
    // 创建队列1
    @Bean
    public Queue queue1() {
        return new Queue(QUEUE1, true);
    }
    // 创建队列2
    @Bean
    public Queue queue2() {
        return new Queue(QUEUE2, true);
    }
    // 创建交换机
    @Bean
    public FanoutExchange exchange() {
        return new FanoutExchange(EXCHANGE);
    }

    // 将队列一和交换机绑定
    @Bean
    public Binding binding1() {
        return BindingBuilder.bind(queue1()).to(exchange());
    }
    // 将队列二和交换机绑定
    @Bean
    public Binding binding2() {
        return BindingBuilder.bind(queue2()).to(exchange());
    }
2.编写生产者,发送消息到交换机 MQSender.java
    // 发送消息到交换机
    public void sendExchange(Object message) {
        log.info("发送消息到交换机: " + message);
        // 发送消息到交换机,需要指定在配置类中配置的交换机名,这里的空字符串表示忽略路由键
        rabbitTemplate.convertAndSend("exchange", "", message);
    }
3.编写消费者,接受消息 MQReceiver.java
    // 两个队列从交换机接受消息
    @RabbitListener(queues = "queue1")
    public void receive1(Object message) {
        log.info("queue1接收消息: " + message);
    }
    // 两个队列从交换机接受消息
    @RabbitListener(queues = "queue2")
    public void receive2(Object message) {
        log.info("queue2接收消息: " + message);
    }
4.控制层调用方法,发送信息到交换机
    // 发送信息到交换机
    @RequestMapping("/mq/exchange")
    @ResponseBody
    public void mqExchange() {
        mqSender.sendExchange("hello rabbitmq exchange");
    }
4.启动测试
1.访问查看IDEA控制台输出
1.访问 http://localhost:9092/seckill/mq/exchange

image-20240511145506791

2.查看控制台输出,两个队列同时接受到了消息

image-20240511145523594

2.访问RabbitMQ控制台 http://ip:15672
1.查看交换机是否绑定了两个队列

image-20240511145927045

image-20240511145938023

2.再查看Queues,新增了两个队列

image-20240511145956152

2.Direct(路由模式)

1.基本介绍

image-20240511150759660

2.需求分析

image-20240511151501711

3.具体实现
1.配置类 RabbitMQConfig.java
    // ----------------- Direct模式 -----------------
    // 定义一个交换机,两个队列的名称
    private static final String DIRECT_EXCHANGE = "directExchange";
    private static final String DIRECT_QUEUE1 = "directQueue1";
    private static final String DIRECT_QUEUE2 = "directQueue2";

    // 定义两个路由分别为red和green
    public static final String RED = "red";
    public static final String GREEN = "green";

    // 创建两个队列和一个交换机
    // 创建队列1
    @Bean
    public Queue directQueue1() {
        return new Queue(DIRECT_QUEUE1, true);
    }

    // 创建队列2
    @Bean
    public Queue directQueue2() {
        return new Queue(DIRECT_QUEUE2, true);
    }

    // 创建Direct交换机
    @Bean
    public DirectExchange directExchange() {
        return new DirectExchange(DIRECT_EXCHANGE);
    }

    // 将队列一和交换机绑定,并指定路由为red
    @Bean
    public Binding directBinding1() {
        return BindingBuilder.bind(directQueue1()).to(directExchange()).with(RED);
    }
    // 将队列二和交换机绑定,并指定路由为green
    @Bean
    public Binding directBinding2() {
        return BindingBuilder.bind(directQueue2()).to(directExchange()).with(GREEN);
    }
    // ----------------- Direct模式 -----------------
2.编写生产者,发送消息到交换机并指定路由 MQSender.java
    // ----------------- Direct模式 -----------------
    // 发送消息到Direct交换机,指定路由键
    public void sendDirect(Object message, String routingKey) {
        log.info("发送消息到Direct交换机: " + message);
        // 发送消息到交换机,需要指定在配置类中配置的交换机名,这里的路由键为 routingKey
        rabbitTemplate.convertAndSend("directExchange", routingKey, message);
    }
    // ----------------- Direct模式 -----------------
3.编写消费者,接受消息 MQReceiver.java
    // ----------------- Direct模式 -----------------
    // directQueue1接收消息
    @RabbitListener(queues = "directQueue1")
    public void receiveDirect(Object message) {
        log.info("directQueue1接收消息: " + message);
    }

    // directQueue2接收消息
    @RabbitListener(queues = "directQueue2")
    public void receiveDirect2(Object message) {
        log.info("directQueue2接收消息: " + message);
    }
    // ----------------- Direct模式 -----------------
4.控制层调用方法,发送信息到交换机
    // ----------------- Direct模式 -----------------
    // 发送消息到Direct交换机,指定路由键
    @RequestMapping("/mq/direct/{routingKey}")
    @ResponseBody
    public void mqDirect(@PathVariable String routingKey) {
        mqSender.sendDirect("hello rabbitmq direct", routingKey);
    }
    // ----------------- Direct模式 -----------------
4.启动测试
1.访问查看IDEA控制台输出
1.访问 http://localhost:9092/seckill/mq/direct/green

image-20240511155350571

2.访问 http://localhost:9092/seckill/mq/direct/red

image-20240511155417490

2.访问RabbitMQ控制台 http://140.143.164.206:15672
1.交换机绑定了两个队列

image-20240511155827225

image-20240511155911603

2.再查看Queues,新增了两个队列

image-20240511155943495

3.Topic(主题模式)

1.基本介绍
1.介绍

image-20240511161221729

2.关于匹配模式的说明
  • 星号:可以匹配一个单词
  • 井号:可以匹配零个或多个单词
2.需求分析

image-20240511161528268

3.具体实现
1.配置类 RabbitMQConfig.java
    // ----------------- Topic模式 -----------------
    // 定义一个交换机,两个队列的名称
    private static final String TOPIC_EXCHANGE = "topicExchange";
    private static final String TOPIC_QUEUE1 = "topicQueue1";
    private static final String TOPIC_QUEUE2 = "topicQueue2";

    // 定义三个路由
    public static final String ROUTING_KEY1 = "*.orange.*";
    public static final String ROUTING_KEY2 = "*.*.rabbit";
    public static final String ROUTING_KEY3 = "lazy.#";

    // 创建两个队列和一个交换机
    // 创建队列1
    @Bean
    public Queue topicQueue1() {
        return new Queue(TOPIC_QUEUE1, true);
    }
    // 创建队列2
    @Bean
    public Queue topicQueue2() {
        return new Queue(TOPIC_QUEUE2, true);
    }
    // 创建Topic交换机
    @Bean
    public TopicExchange topicExchange() {
        return new TopicExchange(TOPIC_EXCHANGE);
    }

    // 将队列一和交换机绑定,并指定路由为*.orange.*
    @Bean
    public Binding topicBinding1() {
        return BindingBuilder.bind(topicQueue1()).to(topicExchange()).with(ROUTING_KEY1);
    }
    // 将队列二和交换机绑定,并指定路由为*.*.rabbit和lazy.#
    @Bean
    public Binding topicBinding2() {
        return BindingBuilder.bind(topicQueue2()).to(topicExchange()).with(ROUTING_KEY2);
    }
    @Bean
    public Binding topicBinding3() {
        return BindingBuilder.bind(topicQueue2()).to(topicExchange()).with(ROUTING_KEY3);
    }
    // ----------------- Topic模式 -----------------

2.编写生产者,发送消息到交换机并指定路由 MQSender.java
    // ----------------- Topic模式 -----------------
    // 发送消息到Topic交换机,指定路由键
    public void sendTopic(Object message, String routingKey) {
        log.info("发送消息到Topic交换机: " + message);
        // 发送消息到交换机,需要指定在配置类中配置的交换机名,这里的路由键为 routingKey
        rabbitTemplate.convertAndSend("topicExchange", routingKey, message);
    }
    // ----------------- Topic模式 -----------------

3.编写消费者,接受消息 MQReceiver.java
    // ----------------- Topic模式 -----------------
    // topicQueue1接收消息
    @RabbitListener(queues = "topicQueue1")
    public void receiveTopic1(Object message) {
        log.info("topicQueue1接收消息: " + message);
    }
    // topicQueue2接收消息
    @RabbitListener(queues = "topicQueue2")
    public void receiveTopic2(Object message) {
        log.info("topicQueue2接收消息: " + message);
    }
    // ----------------- Topic模式 -----------------

4.控制层调用方法,发送信息到交换机
    // ----------------- Topic模式 -----------------
    // 发送消息到Topic交换机,指定路由键
    @RequestMapping("/mq/topic/{routingKey}")
    @ResponseBody
    public void mqTopic(@PathVariable String routingKey) {
        mqSender.sendTopic("hello rabbitmq topic", routingKey);
    }
    // ----------------- Topic模式 -----------------
4.启动测试
1.示意图

image-20240511161528268

2.访问查看IDEA控制台输出
1.访问 http://localhost:9092/seckill/mq/topic/one.orange.one 匹配Q1

image-20240511163348473

2.访问 http://localhost:9092/seckill/mq/topic/one.one.rabbit 匹配Q2

image-20240511163438210

3.访问 http://localhost:9092/seckill/mq/topic/lazy.orange.one 匹配Q1和Q2

image-20240511163527113

4.访问 http://localhost:9092/seckill/mq/topic/lazy.any.any.any.any 匹配Q2

image-20240511163618877

4.Headers(头路由模式,使用较少)

1.基本介绍

image-20240511164450490

2.示意图

image-20240511165737435

3.需求分析

image-20240511170148293

4.具体实现
1.配置类 RabbitMQConfig.java
    // ----------------- Headers模式 -----------------
    // 定义一个交换机,两个队列的名称
    private static final String HEADERS_EXCHANGE = "headersExchange";
    private static final String HEADERS_QUEUE1 = "headersQueue1";
    private static final String HEADERS_QUEUE2 = "headersQueue2";

    // 创建两个队列和一个交换机
    // 创建队列1
    @Bean
    public Queue headersQueue1() {
        return new Queue(HEADERS_QUEUE1, true);
    }
    // 创建队列2
    @Bean
    public Queue headersQueue2() {
        return new Queue(HEADERS_QUEUE2, true);
    }
    // 创建Headers交换机
    @Bean
    public HeadersExchange headersExchange() {
        return new HeadersExchange(HEADERS_EXCHANGE);
    }

    // 将队列一和交换机绑定,并指定key-value,使用any表示只要有一个匹配就可以
    @Bean
    public Binding headersBinding1() {
        Map<String, Object> map = new HashMap<>();
        map.put("key1", "value1");
        map.put("key2", "value2");
        return BindingBuilder.bind(headersQueue1()).to(headersExchange()).whereAny(map).match();
    }

    // 将队列二和交换机绑定,并指定key-value,使用all表示所有的key-value都要匹配
    @Bean
    public Binding headersBinding2() {
        Map<String, Object> map = new HashMap<>();
        map.put("key3", "value3");
        map.put("key4", "value4");
        return BindingBuilder.bind(headersQueue2()).to(headersExchange()).whereAll(map).match();
    }
    // ----------------- Headers模式 -----------------
2.编写生产者,发送消息到交换机并指定路由 MQSender.java
    // ----------------- Headers模式 -----------------
    // 发送消息到Headers交换机,匹配队列一
    public void sendHeaders(Object message) {
        log.info("发送消息到Headers交换机: " + message);
        // 发送消息到交换机,需要指定在配置类中配置的交换机名,这里的空字符串表示忽略路由键
        rabbitTemplate.convertAndSend("headersExchange", "", message, message1 -> {
            message1.getMessageProperties().getHeaders().put("key1", "value1");
            return message1;
        });
    }
    // 发送消息到Headers交换机,匹配队列二
    public void sendHeaders2(Object message) {
        log.info("发送消息到Headers交换机: " + message);
        // 发送消息到交换机,需要指定在配置类中配置的交换机名,这里的空字符串表示忽略路由键
        rabbitTemplate.convertAndSend("headersExchange", "", message, message1 -> {
            message1.getMessageProperties().getHeaders().put("key3", "value3");
            message1.getMessageProperties().getHeaders().put("key4", "value4");
            return message1;
        });
    }
    // ----------------- Headers模式 -----------------
3.编写消费者,接受消息 MQReceiver.java
    // ----------------- Headers模式 -----------------
    // headersQueue1接收消息
    @RabbitListener(queues = "headersQueue1")
    public void receiveHeaders1(Object message) {
        log.info("headersQueue1接收消息: " + message);
    }
    // headersQueue2接收消息
    @RabbitListener(queues = "headersQueue2")
    public void receiveHeaders2(Object message) {
        log.info("headersQueue2接收消息: " + message);
    }
    // ----------------- Headers模式 -----------------
4.控制层调用方法,发送信息到交换机
    // ----------------- Headers模式 -----------------
    // 发送消息到Headers交换机,匹配队列一
    @RequestMapping("/mq/headers")
    @ResponseBody
    public void mqHeaders() {
        mqSender.sendHeaders("hello rabbitmq headers");
    }
    // 发送消息到Headers交换机,匹配队列二
    @RequestMapping("/mq/headers2")
    @ResponseBody
    public void mqHeaders2() {
        mqSender.sendHeaders2("hello rabbitmq headers2");
    }
    // ----------------- Headers模式 -----------------
5.启动测试
1.访问查看IDEA控制台输出
1.访问 http://localhost:9092/seckill/mq/headers 匹配队列一

image-20240511173539342

2.访问 http://localhost:9092/seckill/mq/headers2 匹配队列二

image-20240511173600832

5.RabbitMQ使用模式总结

1.整体架构图

image-20240511173928100

2.通用使用方式
1.编写RabbitMQ的配置类
  • 创建交换机和队列
  • 将队列分别与交换机按照具体标识绑定
2.编写消息发送者
  • 指定交换机
  • 携带消息和具体队列标识
3.编写消息接受者
  • 只需要监听队列,接收消息即可
4.编写控制层
  • 调用消息发送者,向交换机发送请求

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

大厂Java面试题:MyBatis中是如何实现动态SQL的?有哪些动态SQL元素(标签)?描述下动态SQL的实现原理。

大家好&#xff0c;我是王有志。 今天给大家带来的是一道来自京东的 MyBatis 面试题&#xff1a;MyBatis 中是如何实现动态 SQL 的&#xff1f;有哪些动态 SQL 元素&#xff08;标签&#xff09;&#xff1f;描述下动态 SQL 的实现原理。 MyBatis 中提供了 7 个动态 SQL 语句…

7B2 PRO主题5.4.2免授权直接安装

B2 PRO 5.4.2 最新免授权版不再需要改hosts&#xff0c;直接在wordpress上传安装即可

全域运营是割韭菜吗?看完再下结论!

随着流量时代的到来&#xff0c;各大公私域平台中的流量争夺战日益激烈&#xff0c;商家和品牌实现流量变现的难度值也不断提高&#xff0c;运营人员的压力也逐渐增大。在此背景下&#xff0c;全域运营的兴起或许是一个契机&#xff0c;能够将所有人从内卷的状态中解救出来。而…

基于springboot+vue+Mysql的医疗服务系统

开发语言&#xff1a;Java框架&#xff1a;springbootJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包&#xff1a;…

流量卡避坑指南

流量卡避坑指南 在选择流量卡时&#xff0c;有几点需要注意以避免踩坑&#xff1a; 合同期和优惠期。 务必看清楚流量卡的合同期和优惠期。 有些卡可能首月免费&#xff0c;但月底办理可能不划算。 真正的长期套餐应该是优惠期20年以上的。 宣传与实际。 对于所谓的“永久9元…

UV胶的应用场景有哪些?

UV胶是一种特殊的胶水&#xff0c;其固化过程需要紫外光照射。它具有快速固化、高强度、无溶剂挥发等优点&#xff0c;因此在许多应用场景中被广泛使用。UV胶的应用场景非常广泛&#xff0c;包括但不限于以下几个方面&#xff1a; 1.电子产品组装: UV胶在电子产品的组装中扮演…

【iOS逆向与安全】网上gw如何自动登录与签到SM2,SM3,SM4算法加解密

1.下载 app 2.frida 调试 3.抓包查看接口 4.分析加密数据 5.易语言编写代码 1 .开始下载 下载好发现有越狱检测&#xff0c;检测点为&#xff1a; -[AppDelegate isJailBreak]; 于是编写插件xm代码 : %hook AppDelegate- (void)isJailBreak{NSLog("AppDelegate is…

M 有效算法

M 有效算法 本题考验二分知识&#xff0c;思路是二分k的取值&#xff0c;就按第一组样例来说当我们k取值为1的时候我们遍历数组想让|8-x|<k1的话x的取值范围是7-9&#xff0c;想让|3-x|<k2的话x的取值范围是1-5&#xff0c;两者x的区间不重合&#xff0c;说明肯定没有x能…

【c++】二叉搜索树(BST)

&#x1f525;个人主页&#xff1a;Quitecoder &#x1f525;专栏&#xff1a;c笔记仓 朋友们大家好&#xff0c;本篇文章来到二叉搜索树的内容 目录 1.二叉搜索树的介绍2.二叉搜索树的操作与实现insert插入Find查找InOrder中序遍历Erase删除 3.二叉搜索树的应用&#xff08;K…

链动2+1结合消费增值:破解用户留存与复购的密码

大家好&#xff0c;我是吴军&#xff0c;来自一家领先的软件开发公司&#xff0c;担任产品经理的职务。今天&#xff0c;我希望能与大家深入交流链动21模式&#xff0c;特别是它在提升用户留存和复购率方面的独特价值。 虽然链动模式在某些人眼中可能被视为传统或已被超越&…

HCIP的学习(16)

BGP的状态机 ​ OSPF的状态机是在描述整个协议的完整工作过程&#xff0c;而BGP的状态机仅描述的是对等体关系建立过程中的状态变化。-----因为BGP将邻居建立过程以及BGP路由收发过程完全隔离。 ​ IGP协议在启动后&#xff0c;需要通过network命令激活接口&#xff0c;从而使…

运筹系列92:vrp算法包VROOM

1. 介绍 VROOM is an open-source optimization engine written in C20 that aim at providing good solutions to various real-life vehicle routing problems (VRP) within a small computing time. 可以解决如下问题&#xff1a; TSP (travelling salesman problem) CVRP …

三极管 导通条件

一、三极管理解 三极管是电子行业常用的元器件之一&#xff0c;他是一种电流型控制的器件&#xff0c;他有三种工作状态&#xff1a;截止区&#xff0c;放大区、饱和区。当三极管当做开关使用时&#xff0c;他工作在饱和区。下面简短讲解三极管作为开关使用的方法&#xff0c;只…

2025考研 | 北京师范大学计算机考研考情分析

北京师范大学&#xff08;Beijing Normal University&#xff09;简称“北师大”&#xff0c;由中华人民共和国教育部直属&#xff0c;中央直管副部级建制&#xff0c;位列“211工程”、“985工程”&#xff0c;入选国家“双一流”、“珠峰计划”、“2011计划”、“111计划”、…

C--贪吃蛇

目录 前言 简单的准备工作 蛇的节点 开始前 void GameStart(pSnake ps) void WelcomeToGame() void CreateMap() void InitSnake(pSnake ps) void CreateFood(pSnake ps) 游戏进行 void GameRun(pSnake ps) int NextIsFood(pSnakeNode psn, pSnake ps) void NoFood(pSnak…

whisper之初步使用记录

文章目录 前言 一、whisper是什么&#xff1f; 二、使用步骤 1.安装 2.python调用 3.识别效果评估 4.一点封装 5.参考链接 总结 前言 随着AI大模型的不断发展&#xff0c;语音识别等周边内容也再次引发关注&#xff0c;通过语音转文字再与大模型交互&#xff0c;从而…

ssm125四六级报名与成绩查询系统+jsp

四六级报名与成绩查询系统的设计与实现 摘 要 互联网发展至今&#xff0c;无论是其理论还是技术都已经成熟&#xff0c;而且它广泛参与在社会中的方方面面。它让信息都可以通过网络传播&#xff0c;搭配信息管理工具可以很好地为人们提供服务。针对四六级报名信息管理混乱&am…

外卖 点金推广实战课程,2024外卖 点金推广全流程(7节课+资料)

课程内容&#xff1a; 外卖点金推广实操课程 资料 01 1-了解外卖.mp4 02 第一节:点金推广的说明.mp4 03 第二节:如何降低点金推广的成本,mp4 04 第三节:如何计算点金推广的流速,mp4 05 第四节:如何提升点金的精准度,mp4 06 第五节:点金推广实操,mp4 07 点金推广高级教程…

UE4_照亮环境_不同雾效的动态切换

一、问题及思路&#xff1a; 我们在一个地图上&#xff0c;经常切换不同的区域&#xff0c;不同的区域可能需要不同的色调&#xff0c;例如暖色调的野外或者幽暗的山洞&#xff0c;这两种环境上&#xff0c;雾效的选用肯定不一样&#xff0c;夕阳西下的户外用的就是偏暖的色调&…

基于微信小程序+JAVA Springboot 实现的【马拉松报名系统】app+后台管理系统 (内附设计LW + PPT+ 源码+ 演示视频 下载)

项目名称 项目名称&#xff1a; 马拉松报名系统微信小程序 项目技术栈 该项目采用了以下核心技术栈&#xff1a; 后端框架/库&#xff1a; Java SSM框架数据库&#xff1a; MySQL前端技术&#xff1a; 微信开发者工具、uni-app其他技术&#xff1a; JSP开发技术 项目展示 …