WebSocket Day04 : 消息推送

news2024/11/23 21:05:58

前言

随着Web应用程序的不断发展,实时性和交互性成为了用户体验中至关重要的一部分。传统的HTTP协议在处理实时数据传输方面存在一些局限性,而WebSocket作为一种全双工通信协议,为实现实时、高效的消息推送提供了全新的解决方案。

在Web开发领域,消息推送是一项重要的功能,它使得服务器能够将实时更新的信息主动推送给客户端,而不需要客户端频繁地向服务器发送请求。借助于WebSocket技术,开发人员能够轻松构建具有实时交互功能的Web应用程序,例如在线聊天、实时数据监控、多人协作编辑等。

一、前期准备

1、新建项目,结构如下

2、导入依赖
  <!-- websocket 依赖 -->
        <dependency>
            <groupId>javax.websocket</groupId>
            <artifactId>javax.websocket-api</artifactId>
            <version>1.1</version>
            <scope>provided</scope>
        </dependency>

        <!-- 打印日志 -->
        <dependency>
            <groupId>ch.qos.logback</groupId>
            <artifactId>logback-classic</artifactId>
            <version>1.3.8</version>
        </dependency>

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.24</version>
        </dependency>

        <!-- ch02 -->
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>4.0.1</version>
            <scope>provided</scope>
        </dependency>

        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>2.14.2</version>
        </dependency>

        <!-- ch03 -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>5.3.23</version>
        </dependency>
        <!-- 在 spring 4.0 开始支持-->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-websocket</artifactId>
            <version>5.3.23</version>
        </dependency>

        <!-- ch04 -->
        <!-- 如果想要使用 Spring 的消息代理,则添加以下依赖 -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-messaging</artifactId>
            <version>5.3.23</version>
        </dependency>

 每一个依赖的作用:

  1. javax.websocket-api: 这是Java API for WebSocket的依赖声明,版本为1.1。它提供了在Java应用程序中使用WebSocket所需的接口和类。

  2. logback-classic: 这是Logback日志框架的经典模块,版本为1.3.8。Logback是一个灵活而功能强大的日志框架,它可以代替log4j系统。

  3. lombok: Lombok是一个Java库,可以通过注解的方式来简化Java代码的开发。它通过消除样板代码(boilerplate code)来提高开发效率。

  4. javax.servlet-api: 这是Java Servlet API的依赖声明,版本为4.0.1。它提供了使用Java语言编写的Web应用程序中的Servlet和JSP规范。

  5. jackson-databind: Jackson是Java中用于处理JSON数据的流行库,databind模块提供了JSON和Java对象之间的转换功能。

  6. spring-webmvc: 这是Spring框架中的Web MVC模块的依赖声明,版本为5.3.23。它提供了创建基于Spring的Web应用程序的支持。

  7. spring-websocket: 这是Spring框架中的WebSocket模块的依赖声明,版本为5.3.23。它提供了对WebSocket的支持,使得在Spring应用程序中能够方便地集成和使用WebSocket。

  8. spring-messaging: 这是Spring框架中的消息代理模块的依赖声明,版本为5.3.23。它提供了在Spring应用程序中实现消息代理的支持。

以上依赖项将会为您的项目引入WebSocket所需的API、日志、简化代码、Servlet支持以及Spring框架的相关模块,让您可以方便地开发基于WebSocket的Web应用程序,并且与Spring框架无缝集成。

3、配置配置类
1)MvcConfig 类
@Configuration
@EnableWebMvc
public class MvcConfig implements WebMvcConfigurer {

    @Override
    public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
        configurer.enable();
    }
}

让我解释一下它的作用:

  1. @Configuration: 这个注解表示这是一个配置类,它会被Spring容器识别并用来配置应用程序上下文。

  2. @EnableWebMvc: 这个注解启用了Spring MVC,它会在Spring中注册必要的组件,如HandlerMapping、HandlerAdapter等,以支持基于注解的控制器方法。

  3. implements WebMvcConfigurer: MvcConfig类实现了WebMvcConfigurer接口,这样可以重写一些默认配置,自定义MVC的行为。

  4. configureDefaultServletHandling: 这是WebMvcConfigurer接口中的一个方法,通过重写这个方法,我们可以配置静态资源的处理。在这里的配置中,configurer.enable()启用了默认的Servlet处理,允许DispatcherServlet将对静态资源的请求转发到Servlet容器的default servlet。

总的来说,这段代码配置了Spring MVC,并且使得Spring能够处理静态资源的请求,从而使得静态资源可以被正确地访问和展示。

2)WebSocket 类

@Configuration
// 启用 webSocket 消息代理中间件
@EnableWebSocketMessageBroker
public class WebSocketConfig implements WebSocketMessageBrokerConfigurer {

    /**
     * 注册一个连接消息中间件的端点( 路径url )
     * @param registry
     */
    @Override
    public void registerStompEndpoints(StompEndpointRegistry registry) {
        registry.addEndpoint("broker");
    }

    /**
     * 配置消息代理,主要是设置相关的主题
     * 消息代理是服务中心的核心,spring-websocket 内置了
     * 一个简单的消息代理,但也只能够满足基本要求,如果
     * 需要强大的消息中心的功能,通常都会集成第三方的消息队列
     * 例如:RabbitMQ 等
     * @param registry
     */
    @Override
    public void configureMessageBroker(MessageBrokerRegistry registry) {
        // 启用 Spring 内置简单的消息代理并设置一个主题(topic)的前缀
        // 用于消息的发布和订阅
        registry.enableSimpleBroker("/news","video");

        // 如果需要集成外部其他的消息代理,使用下面等等方法
        // registry.enableStompBrokerRelay();

    }
}

让我来解释一下它的作用:

  1. @Configuration: 这个注解表示这是一个配置类,它会被Spring容器识别并用来配置应用程序上下文。

  2. @EnableWebSocketMessageBroker: 这个注解启用了基于消息代理的WebSocket支持,它会为您的应用程序提供了实时的、双向通信能力。

  3. implements WebSocketMessageBrokerConfigurer: WebSocketConfig类实现了WebSocketMessageBrokerConfigurer接口,这样可以重写一些默认配置,自定义WebSocket的行为。

  4. registerStompEndpoints: 在这个方法中,我们注册了一个STOMP端点(也就是WebSocket端点),客户端可以通过该端点进行连接。在这里的配置中,我们注册了一个名为"broker"的端点,客户端将使用这个端点来建立WebSocket连接。

  5. configureMessageBroker: 这个方法用来配置消息代理,主要是设置相关的主题。在这里的配置中,我们启用了Spring内置的简单消息代理,并设置了两个主题的前缀 "/news" 和 "/video",用于消息的发布和订阅。这样客户端就可以订阅这些主题,从而接收相关的消息。

总的来说,这段代码配置了Spring WebSocket的消息代理中间件,使得应用程序能够通过WebSocket进行实时的双向通信,同时设置了相关的主题,以便客户端可以订阅并接收相应的消息。

3)AppConfig 类
@Configuration
@ComponentScan(basePackages = "edu.nf.ch04")
@Import({MvcConfig.class,WebSocketConfig.class})
public class AppConfig {
}

让我来解释一下它的作用:

  1. @Configuration: 这个注解表示这是一个配置类,它会被Spring容器识别并用来配置应用程序上下文。

  2. @ComponentScan(basePackages = "edu.nf.ch04"): 这个注解指定了Spring容器在初始化时要扫描的包路径,以寻找带有特定注解的组件。在这里的配置中,容器会扫描"edu.nf.ch04"包及其子包,寻找带有@Component@Service@Repository等注解的组件,并将它们纳入Spring容器管理。

  3. @Import({MvcConfig.class, WebSocketConfig.class}): 这个注解用于导入其他的配置类,将其配置加入到当前的配置类中。在这里的配置中,AppConfig类导入了MvcConfig和WebSocketConfig两个配置类,从而将它们的配置内容整合到当前的配置中。

总的来说,这段代码配置了Spring应用程序的整体配置信息,包括了组件扫描的包路径以及导入了其他的配置类,从而将整个应用程序的配置信息整合在一起。

4)WebConfig 类
public class WebConfig extends AbstractAnnotationConfigDispatcherServletInitializer {
    @Override
    protected Class<?>[] getRootConfigClasses() {
        return new Class[0];
    }

    @Override
    protected Class<?>[] getServletConfigClasses() {
        return new Class[]{AppConfig.class};
    }

    @Override
    protected String[] getServletMappings() {
        return new String[]{"/"};
    }
}

这段代码是一个典型的Spring Web应用程序的配置类,它继承自AbstractAnnotationConfigDispatcherServletInitializer,用于替代传统的web.xml文件,让我来解释一下它的作用:

  1. public class WebConfig extends AbstractAnnotationConfigDispatcherServletInitializer: 这个类是Web应用程序的初始化类,它相当于web.xml文件中的配置。

  2. @Override protected Class<?>[] getRootConfigClasses() { return new Class[0]; }: 在这个方法中,我们返回一个空数组,表示不需要加载根配置类。通常,根配置类用来配置数据源、持久层框架、安全框架等应用程序级别的组件,但在这里我们没有定义。

  3. @Override protected Class<?>[] getServletConfigClasses() { return new Class[]{AppConfig.class}; }: 在这个方法中,我们返回一个包含AppConfig类的数组,表示加载Web应用程序的配置类。在这里,我们将之前提到的AppConfig配置类加载到Servlet上下文中,这样就可以使用其中定义的Bean。

  4. @Override protected String[] getServletMappings() { return new String[]{"/"}; }: 这个方法返回一个包含"/"路径的字符串数组,表示DispatcherServlet要映射的路径。在这里的配置中,DispatcherServlet会映射到应用程序的根路径,即所有的请求都会交给DispatcherServlet进行处理。

总的来说,这段代码配置了Spring Web应用程序的初始化信息,包括加载Web应用程序的配置类、指定DispatcherServlet的映射路径等,从而取代了传统的web.xml文件。

4、封装一个信息类
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Message {

    private String content;
    private String sendTime;

}

让我来解释一下使用到的注解和它的作用:

  1. @Data: 这是Lombok库提供的一个注解,它会为类自动生成一些通用的方法,如toString()equals()hashCode()等,以及针对每个字段的getterssetters方法。使用@Data注解可以减少样板代码,让类看起来更简洁。

  2. @AllArgsConstructor: 这是Lombok库提供的另一个注解,它会为类生成一个包含所有字段的构造方法,这样就不需要手动编写构造方法。

  3. @NoArgsConstructor: 这也是Lombok库提供的注解,它会生成一个无参的构造方法。

  4. private String content;: 这行代码定义了一个私有字段content,用于存储消息的内容。

  5. private String sendTime;: 这行代码定义了另一个私有字段sendTime,用于存储消息的发送时间。

总的来说,这段代码使用了Lombok库的注解来自动生成通用方法和构造方法,从而简化了代码编写。同时,定义了一个简单的Java类Message,用于表示消息对象,包括消息内容和发送时间两个属性。

二、编写 controller 类,实现通知

@RestController
@RequiredArgsConstructor
public class PublishController {

    /**
     * 消息处理模板,用于发布消息
     */
    private final SimpMessagingTemplate template;

    /**
     * 后台发布消息
     * @param message
     */
    @PostMapping("/publish/{topic}/{sub}")
    public void publish(@PathVariable("topic") String topic,@PathVariable("sub")String sub, String message){
        // 创建一个时间
        String sendTime = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date());
        Message msg = new Message(message,sendTime);

        // 将消息发布到消息代理指定的主题中
        template.convertAndSend("/"+ topic +"/" + sub,msg);
    }

}

这段代码是一个Spring框架中的REST控制器类PublishController,它使用了一些注解和依赖注入,让我来逐步解释:

  1. @RestController: 这个注解表示该类是一个RESTful风格的控制器,它将处理传入的HTTP请求,并返回相应的HTTP响应。相比于@Controller注解,它会自动将返回结果转换为JSON格式。

  2. @RequiredArgsConstructor: 这是Lombok库提供的注解,它会为类中标记了final的字段生成一个构造方法,用于进行依赖注入。在这里,它的作用是为template字段生成一个构造方法,实现依赖注入。

  3. private final SimpMessagingTemplate template;: 这行代码定义了一个私有的、不可变的SimpMessagingTemplate类型的字段template,用于向WebSocket消息代理发送消息。

  4. @PostMapping("/publish/{topic}/{sub}"): 这是一个用于处理HTTP POST请求的方法级注解,表示对应的publish方法将处理POST请求,并且在路径中包含了两个占位符{topic}{sub}

  5. public void publish(@PathVariable("topic") String topic, @PathVariable("sub") String sub, String message): 这是一个处理POST请求的方法,它接受三个参数,其中@PathVariable注解表示从URL中获取路径参数。方法内部首先创建了消息对象msg,然后使用SimpMessagingTemplate将消息发布到指定的主题中。

总的来说,这个PublishController类是一个RESTful风格的控制器,用于处理POST请求,并通过SimpMessagingTemplate向WebSocket消息代理发布消息。

三、编写页面

1、admin.html --- 发送信息后台
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="js/JQuery文件.txt.js"></script>
</head>
<body>
<h1>后台管理</h1>
<form id="f1">
<select id="topic">
    <option value="sport">体育</option>
    <option value="recreation">娱乐</option>
</select>

<input type="text" name="message" id="message"/>
<input type="button" value="发布">
</form>

<script>
    $(function () {
        $(':button').on('click',function () {
            let param = $('#f1').serialize();
            let subTopic = $('#topic').val();
            // alert(subTopic)
            $.ajax({
                url:'../publish/news/' + subTopic,
                type:'post',
                data:param,
                success:function ( data ) {
                    $('#message').val('');
                }
            })
        })
    })
</script>

</body>
</html>
2、index.html --- 体育栏目
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="js/JQuery文件.txt.js"></script>
    <script src="js/stomp.min.js"></script>

</head>
<body>
<h1>体育</h1>

<div id="msg">

</div>

<script>
    $(function () {
        // 创建 WebSocket 对象
        var ws = new WebSocket("ws://localhost:8080/broker");

        // 将 WebSocket 包装成 stomp 客户端
        let stompClient = Stomp.over(ws);

        // 连接服务器并订阅消息
        stompClient.connect({},function () {
            // 执行订阅
            stompClient.subscribe('/news/sport',function ( data ) {
                // 接收发布的通知内容
                // alert(data);
                // 取出 stomp 中的 body 部分并解析为 json 对象
                let msg = $.parseJSON(data.body);
                $('#msg').append(msg.sendTime + '<br>');
                $('#msg').append(msg.content + '<br>')
            })
        })
    })
</script>

</body>
</html>

让我来逐行解释上述代码的含义:

  1. var ws = new WebSocket("ws://localhost:8080/broker"); - 这一行创建了一个WebSocket对象,并指定了连接的URL为"ws://localhost:8080/broker"。这将尝试连接到本地主机上的WebSocket服务器,并订阅了"/broker"频道。

  2. let stompClient = Stomp.over(ws); - 这一行使用了STOMP(Simple Text Oriented Messaging Protocol)库,通过WebSocket创建了一个STOMP客户端对象。

  3. stompClient.connect({}, function () {...}); - 这段代码表示当STOMP客户端成功连接到服务器时,执行后续的操作。

  4. stompClient.subscribe('/news/sport', function (data) {...}); - 在连接成功后,客户端订阅了"/news/sport"频道,用于接收体育新闻。当有消息到达时,会执行回调函数,并将消息的发送时间和内容显示在页面上。

总体来说,这段代码的作用是在页面加载后,通过WebSocket连接到服务器,订阅体育新闻频道,并将接收到的消息动态显示在页面上。

2、index2.html --- 娱乐栏目
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="js/JQuery文件.txt.js"></script>
    <script src="js/stomp.min.js"></script>

</head>
<body>
<h1>娱乐</h1>

<div id="msg">

</div>

<script>
    $(function () {
        // 创建 WebSocket 对象
        var ws = new WebSocket("ws://localhost:8080/broker");

        // 将 WebSocket 包装成 stomp 客户端
        let stompClient = Stomp.over(ws);

        // 连接服务器并订阅消息
        stompClient.connect({},function () {
            // 执行订阅
            stompClient.subscribe('/news/recreation',function ( data ) {
                // 接收发布的通知内容
                // alert(data);
                // 取出 stomp 中的 body 部分并解析为 json 对象
                let msg = $.parseJSON(data.body);
                $('#msg').append(msg.sendTime + '<br>');
                $('#msg').append(msg.content + '<br>')
            })
        })
    })
</script>

</body>
</html>

这部分代码和体育栏目的是一样的。

四、测试

我们每次发送的通知都是实时的通知,在做一些有通知的功能时就能用到这个案例,实时的发布系统通知。

五、gitee 案例

地址:ch04 · qiuqiu/WebSocket-study - 码云 - 开源中国 (gitee.com) 

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

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

相关文章

基于单片机微波炉加热箱系统设计

**单片机设计介绍&#xff0c; 基于单片机微波炉加热箱系统设计 文章目录 一 概要二、功能设计设计思路 三、 软件设计原理图 五、 程序六、 文章目录 一 概要 基于单片机的微波炉加热箱系统是一种智能化的厨房电器设备&#xff0c;利用单片机控制技术实现自动加热和定时等功能…

unity 使用Vuforia扫描实体物体交互

文章目录 前言一、Vuforia是什么&#xff1f;二、Unity导入Vuforia1.去Unity - Windows – Asset Store&#xff0c;搜vuforia engine&#xff0c;添加到我的资源2.从 Unity 的菜单 Assets -> Import package -> Custom Package 导入脚本&#xff0c;添加 Vuforia Engine…

selenium报错:没有打开网页或selenium.common.exceptions.NoSuchDriverException

文章目录 问题解决方法 问题 当selenium的环境配置没有问题&#xff0c;但在使用selenium访问浏览器时并没有打开网页&#xff0c;或者出现selenium.common.exceptions.NoSuchDriverException报错信息&#xff08;如下图所示&#xff09;。 以上问题可能的原因是没有配置chrom…

格式化或删除了存储卡的照片?值得收藏的几个有效方法

最好的恢复软件可以从 SD 卡、固态硬盘和硬盘恢复已删除的照片、视频和数据 您是否不小心重新格式化了存储卡或删除了想要保留的照片&#xff1f;最好的照片恢复软件可以提供帮助&#xff01;如果您使用数码相机拍摄的时间足够长&#xff0c;当您错误地删除了您想要保留的图像…

音画欣赏|《还有个家园》

《还有个家园》 38x30cm 陈可之2018年绘 猎户星座 【朴树】 你还记得吗 那时的夜晚 是如何降临的 什么都不说 像来自天空 轻如指尖的触痛 你是否得到了 期待的人生 梦里的海潮声 他们又如何从 指缝中滑过 像吹在旷野里的风 情长 飘黄 静悄悄的时光 清晨 日暮 何处是…

Spring Boot项目优雅实现读写分离

文章目录 1. 读写分离简介2. Spring Boot集成MyBatis3. 配置读写分离数据源4. 定义数据源上下文5. 自定义注解和切面6. 在Service层使用注解7. 拓展与分析7.1 多数据源的选择7.2 事务的处理7.3 异常处理7.4 动态数据源切换7.5 Spring Boot版本适配 &#x1f389;欢迎来到架构设…

单片机与PLC的区别有哪些?

单片机与PLC的区别有哪些? 什么是单片机&#xff1f; 单片机&#xff08;Microcontroller&#xff0c;缩写MCU&#xff09;是一种集成了中央处理器&#xff08;CPU&#xff09;、存储器和输入/输出接口等功能模块的微型计算机系统。它通常被用于嵌入式系统和控制系统中&#x…

怎样能实现不同服务器之间的文件实时同步?

数字化时代&#xff0c;数据已经成为企业的重要资产&#xff0c;其中文件共享是企业运行中的重要业务场景。由于办公文件可能存在不同服务器甚至不同的城市之间&#xff0c;企业文件的实时同步是很多中大型企业急需解决的问题&#xff0c;为了不耽误业务的运行&#xff0c;甚至…

WebSocket真实项目总结

websocket websocket是什么? websocket是一种网络通讯协议。 websocket 是HTML5开始提供的一种在单个TCP链接上进行全双工通讯的协议。 为什么需要websocket? 初次接触websocket&#xff0c;都会带着疑惑去学习&#xff0c;既然已经有了HTTP协议&#xff0c;为什么还需要另一…

千兆光模块和万兆光模块的安装和维护指南

光模块是网络通信中不可或缺的设备&#xff0c;安装和维护的重要性不能被忽视。本文将为您详细介绍千兆光模块和万兆光模块的安装和维护指南&#xff0c;帮助您更好地了解光模块的应用和维护技巧&#xff0c;从而为您的网络通信体验提供优质保障。 一、光模块简介 作为网络通…

CSS实现图片滑动对比

实现效果图如下&#xff1a; css代码&#xff1a; 知识点&#xff1a;resize: horizontal; 文档地址 <style>.image-slider {position: relative;display: inline-block;width: 500px;height: 300px;}.image-slider>div {position: absolute;top: 0;bottom: 0;left: …

有什么方法可以改善CRM实施投资回报?

数据统计显示&#xff0c;几乎70%以上CRM客户管理系统项目的投资回报是负数。这意味着超过半数的CRM项目的结果是失败的。那么我们有什么方法可以改善CRM实施投资回报吗&#xff1f;当然有&#xff0c;下面我们就来说一说。 如何改善CRM实施投资回报 首先&#xff0c;您选择的…

概念解析 | 费马路径

注1:本文系“概念解析”系列之一,致力于简洁清晰地解释、辨析复杂而专业的概念。本次辨析的概念是:费马路径 费马路径: Fermat Path & 费马原理 背景介绍 在异质光学介质中,光线传播呈现出折射的行为。由于光速在不同介质中有所不同,光线在经过界面时,其路径也会发生偏转…

需要买哪些网络设备才能过等保?求解!

随着等保2.0的落地执行&#xff0c;越来越多的企业需要过等保。但不少企业都是第一次过等保&#xff0c;对于等保政策不是很了解&#xff0c;有小伙伴问&#xff0c;需要买哪些网络设备才能过等保&#xff1f;这里我们小编就给大家来简单回答一下&#xff0c;仅供参考哈&#x…

编程实例与解释,编程入门自学指南,中文编程工具下载

编程实例与解释&#xff0c;编程入门自学指南&#xff0c;中文编程工具下载。 编程实例可以点击最下方卡片了解&#xff0c;编程入门自学可以先从容易的入手&#xff0c;比如中文编程&#xff0c;先学习编程思路&#xff0c;然后再学习其他语言会比较轻松。中文编程工具可以下…

【java学习—十三】处理流之六:对象流(5)

文章目录 1. ObjectInputStream 和 OjbectOutputSteam2. 对象的序列化 假设有一个Person对象 把这个对象存到电脑的硬盘上&#xff0c;硬盘存储的基础是什么&#xff1f;&#xff08;二进制&#xff09;。那就需要把对象转化为一个二进制的字节流&#xff0c;把这个流保存到电脑…

园区网络项目实战

实验背景 某写字楼备搭建一张网络供楼内企业办公使用。写字楼共6层&#xff0c;目前已有三层投入使用&#xff0c;分别 是一层会客大厅、二层行政部及总经理办公室、三层研发部和市场部。一层设有核心机房&#xff0c;其 他各楼层均有一个小房间放置网络设备。 第一步 询…

出入库管理系统vue2前端开发服务器地址配置

【精选】vue.config.js 的完整配置&#xff08;超详细&#xff09;_vue.config.js配置_web学生网页设计的博客-CSDN博客 本项目需要修改两处&#xff1a; 1、vue开发服务器地址&#xff1a;config\index.js use strict // Template version: 1.3.1 // see http://vuejs-templa…

中国1024程序员节·上海站纪实

目录 前言 活动前奏 盛大开幕 技术交流与分享 彩蛋 游戏互动环节 番外篇&#xff1a;上海站活动安排 结束语 前言 1024 程序员节是专属开发者的节日&#xff0c;他们以“码”为梦&#xff0c;在技术世界中“程”风破浪。作为 2023 长沙中国 1024 程序员节的重要组成部分…

系统无法访问提示“配额不足无法处理此命令“的解决思路

一些老的电脑系统会出现 电脑系统出现无法访问C:Documents and SetAdministrator桌面&#xff0c;配额不足。 解决思路如下 1、电脑的开始菜单的工具栏&#xff0c;选择运行。 2、输入栏中写入命令“gpedit.msc”。 3、弹出组策略窗口&#xff0c;选择打开“计算机配置”—“…