精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

全棧實(shí)戰(zhàn)!用 WebSocket 實(shí)現(xiàn)實(shí)時(shí)消息推送 + 動(dòng)態(tài)進(jìn)度條可視化

開發(fā) 前端
借助 WebSocket 實(shí)現(xiàn)的實(shí)時(shí)通信機(jī)制,我們有效地解決了輪詢帶來的性能瓶頸和用戶體驗(yàn)問題。無論是消息推送,待辦提醒,還是任務(wù)進(jìn)度的動(dòng)態(tài)刷新,WebSocket 都提供了更優(yōu)雅與高效的解決方案。

在傳統(tǒng) Web 應(yīng)用中,任務(wù)狀態(tài)查詢或通知推送往往依賴前端定時(shí)輪詢接口獲取數(shù)據(jù)。雖然這種方式實(shí)現(xiàn)簡(jiǎn)單,但在數(shù)據(jù)頻繁變化或用戶量激增的場(chǎng)景下,頻繁的 HTTP 請(qǐng)求會(huì)引起數(shù)據(jù)庫(kù)壓力增大,響應(yīng)延遲甚至系統(tǒng)性能下降。

本文將基于 Spring Boot + WebSocket 的技術(shù)棧,構(gòu)建一個(gè)服務(wù)端主動(dòng)推送消息的實(shí)時(shí)提醒系統(tǒng),并可視化每項(xiàng)任務(wù)的進(jìn)度。前端將通過 WebSocket 進(jìn)行一次性連接,并實(shí)時(shí)響應(yīng)后端推送的最新數(shù)據(jù),從而極大提升用戶體驗(yàn)與系統(tǒng)性能。

系統(tǒng)功能概覽

  • 待辦數(shù)量實(shí)時(shí)推送
  • 通知紅點(diǎn)自動(dòng)刷新
  • 支持 WebSocket 持久連接
  • 動(dòng)態(tài)進(jìn)度條展示任務(wù)完成情況
  • 前后端獨(dú)立交互,解耦式開發(fā)結(jié)構(gòu)

依賴配置(Maven)

添加必要的依賴于 pom.xml 文件中:

<!-- MyBatis Plus & MySQL -->
<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-boot-starter</artifactId>
    <version>3.4.2</version>
</dependency>
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <scope>runtime</scope>
</dependency>


<!-- WebSocket -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-websocket</artifactId>
    <version>2.1.6.RELEASE</version>
</dependency>

數(shù)據(jù)庫(kù)結(jié)構(gòu)設(shè)計(jì)

建立兩張表用于模擬待辦任務(wù)及其子任務(wù)進(jìn)度:

CREATE TABLE t_todo (
  id BIGINT PRIMARY KEY AUTO_INCREMENT,
  user_name VARCHAR(255) COMMENT '用戶名稱',
  name VARCHAR(255) COMMENT '待辦標(biāo)題'
) COMMENT='待辦任務(wù)主表';


CREATE TABLE t_todo_attr (
  id BIGINT PRIMARY KEY AUTO_INCREMENT,
  todo_id BIGINT COMMENT '主表ID',
  status INT COMMENT '完成狀態(tài) 1為已完成'
) COMMENT='待辦任務(wù)進(jìn)度子表';

一條 t_todo 記錄表示一個(gè)任務(wù),對(duì)應(yīng)若干 t_todo_attr 子任務(wù)進(jìn)度項(xiàng)。

WebSocket 服務(wù)端配置

WebSocket 注冊(cè)配置

// /src/main/java/com/icoderoad/config/WebSocketConfig.java
@Configuration
public class WebSocketConfig {
    @Bean
    public ServerEndpointExporter serverEndpointExporter() {
        return new ServerEndpointExporter();
    }
}

實(shí)現(xiàn)主任務(wù)通知服務(wù)

// /src/main/java/com/icoderoad/ws/WebSocketTodoServer.java
@ServerEndpoint("/ws/todo/{username}")
@Component
public class WebSocketTodoServer {
    private static final Map<String, Session> sessions = new ConcurrentHashMap<>();


    @OnOpen
    public void open(Session session, @PathParam("username") String username) {
        sessions.put(username, session);
        int count = SpringContextUtil.getBean(TodoService.class)
                .count(new LambdaQueryWrapper<Todo>().eq(Todo::getUserName, username));
        send(session, String.valueOf(count));
    }


    @OnClose
    public void close(@PathParam("username") String username) {
        sessions.remove(username);
    }


    @OnMessage
    public void message(String msg) {}


    @OnError
    public void error(Session session, Throwable throwable) {
        throwable.printStackTrace();
    }


    public void sendInfo(String username, String msg) {
        Session session = sessions.get(username);
        send(session, msg);
    }


    private void send(Session session, String msg) {
        if (session != null) {
            synchronized (session) {
                try {
                    session.getBasicRemote().sendText(msg);
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

后端接口實(shí)現(xiàn)

// /src/main/java/com/icoderoad/controller/TodoController.java
@RestController
@RequestMapping("/todo")
public class TodoController {


    @Autowired private TodoService todoService;
    @Autowired private WebSocketTodoServer wsServer;


    @PostMapping("/insert")
    public ResponseUtils insert(@RequestParam String todoName, @RequestParam String userName) {
        Todo todo = new Todo();
        todo.setName(todoName);
        todo.setUserName(userName);
        todoService.save(todo);


        int count = todoService.count(new LambdaQueryWrapper<Todo>().eq(Todo::getUserName, userName));
        wsServer.sendInfo(userName, String.valueOf(count));


        return ResponseUtils.success(todoName);
    }


    @GetMapping("/list")
    public ResponseUtils list(@RequestParam String userName) {
        List<Todo> todos = todoService.list(new LambdaQueryWrapper<Todo>().eq(Todo::getUserName, userName));
        return ResponseUtils.success(todos);
    }
}

前端頁(yè)面展示

<!-- /src/main/resources/static/index.html -->
<div class="message-container" onclick="toggleTodo()">
    <div class="bell-icon"></div>
    <span class="message-count">0</span>
</div>
<div class="todo-section" id="todoSection" style="display:none;"></div>


<script>
    const socket = new WebSocket('ws://localhost:8077/ws/todo/張三');
    socket.onmessage = (event) => {
        document.querySelector('.message-count').textContent = event.data;
    };


    async function toggleTodo() {
        const section = document.getElementById('todoSection');
        section.style.display = section.style.display === 'none' ? 'block' : 'none';
        if (section.style.display === 'block') {
            const res = await fetch('/todo/list?userName=張三');
            const data = await res.json();
            section.innerHTML = data.data.map(t => `<div>${t.name}</div>`).join('');
        }
    }
</script>

子任務(wù)進(jìn)度 WebSocket(進(jìn)度條)

// /src/main/java/com/icoderoad/ws/WebSocketTodoAttrServer.java
@ServerEndpoint("/ws/todo/attr/{todoId}")
@Component
public class WebSocketTodoAttrServer {
    private static final Map<String, Session> attrSessions = new ConcurrentHashMap<>();


    @OnOpen
    public void onOpen(Session session, @PathParam("todoId") String todoId) {
        attrSessions.put(todoId, session);
        String progress = SpringContextUtil.getBean(TodoAttrService.class).progress(Long.valueOf(todoId));
        send(session, progress);
    }


    public void sendInfo(String todoId, String msg) {
        send(attrSessions.get(todoId), msg);
    }


    private void send(Session session, String msg) {
        try {
            if (session != null) session.getBasicRemote().sendText(msg);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

任務(wù)進(jìn)度更新接口

// /src/main/java/com/icoderoad/controller/TodoAttrController.java
@PostMapping("/attr/update")
public ResponseUtils updateAttr(@RequestParam Long id) {
    todoAttrService.updateById(new TodoAttr(id, 1));
    TodoAttr attr = todoAttrService.getById(id);
    webSocketTodoAttrServer.sendInfo(String.valueOf(attr.getTodoId()),
            todoAttrService.progress(attr.getTodoId()));
    return ResponseUtils.success();
}

結(jié)語:高性能實(shí)時(shí)系統(tǒng)構(gòu)建的利器

借助 WebSocket 實(shí)現(xiàn)的實(shí)時(shí)通信機(jī)制,我們有效地解決了輪詢帶來的性能瓶頸和用戶體驗(yàn)問題。無論是消息推送,待辦提醒,還是任務(wù)進(jìn)度的動(dòng)態(tài)刷新,WebSocket 都提供了更優(yōu)雅與高效的解決方案。

未來在構(gòu)建具有實(shí)時(shí)性要求的系統(tǒng)(如 IM 聊天、實(shí)時(shí)告警、系統(tǒng)監(jiān)控等)時(shí),WebSocket 可以作為首選的通信技術(shù)基礎(chǔ),而非傳統(tǒng)的“輪詢 + 回調(diào)”。

責(zé)任編輯:武曉燕 來源: 路條編程
相關(guān)推薦

2023-12-27 13:45:00

Python進(jìn)度條代碼

2024-09-02 09:31:19

2024-08-06 14:29:37

2009-08-17 14:41:47

C#進(jìn)度條實(shí)現(xiàn)

2009-08-17 17:15:48

C# 進(jìn)度條效果

2021-09-27 08:31:01

數(shù)據(jù)可視化柱狀圖折現(xiàn)圖

2015-07-31 11:19:43

數(shù)字進(jìn)度條源碼

2024-06-13 08:15:00

2023-12-11 17:15:05

應(yīng)用開發(fā)波紋進(jìn)度條ArkUI

2021-09-27 10:43:18

鴻蒙HarmonyOS應(yīng)用

2013-04-12 10:05:49

HTML5WebSocket

2023-11-17 09:35:58

2009-08-17 15:48:47

C# WinForm進(jìn)

2021-02-05 07:28:11

SpringbootNettyWebsocke

2017-10-14 13:54:26

數(shù)據(jù)可視化數(shù)據(jù)信息可視化

2023-11-30 11:38:29

CSS網(wǎng)頁(yè)進(jìn)度條

2009-07-21 14:49:55

XmlHttpRequ文件上傳進(jìn)度條

2024-07-25 08:55:47

進(jìn)度條水缸進(jìn)度動(dòng)畫效果

2011-07-05 15:16:00

QT 進(jìn)度條

2022-05-16 09:34:17

Python可視化圖表
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

xxxx黄色片| 亚洲一区二区在| 亚洲国产精一区二区三区性色| 久久精品国产亚洲5555| 欧美性生交大片免费| 亚洲国产另类久久久精品极度| 国产精品呻吟久久| 国产精品外国| 北条麻妃在线一区二区| 国产性生活毛片| 久久91视频| 婷婷激情综合网| 亚洲欧洲精品在线 | 成人激情免费在线| 久久精品性爱视频| 日韩1区在线| 亚洲精品一区二区在线观看| 亚洲无吗一区二区三区| 激情网站在线| 国产精品久久久久久久第一福利 | 中文字幕国产精品一区二区| 亚洲综合国产精品| 日韩欧美国产另类| 一区视频在线| 久热精品视频在线观看| 色婷婷在线影院| 亚洲国产中文在线| 欧美日韩一区不卡| 国产xxxxx在线观看| 美女91在线| 最新中文字幕一区二区三区| 日本欧洲国产一区二区| 天天干天天爽天天操| 国产麻豆精品95视频| 国产噜噜噜噜噜久久久久久久久| 国产污污视频在线观看 | 国产精品50p| 日韩激情av| 中文字幕日韩一区二区| 日韩免费三级| 黄网在线观看| 久久综合九色综合97婷婷女人| 国产经典一区二区三区| 国产黄色免费大片| 国产精品伊人色| 成人亲热视频网站| 国产又粗又猛又爽又黄的视频一| 青青草伊人久久| 国产精品高潮视频| 三级网站在线播放| 久久一日本道色综合久久| 清纯唯美日韩制服另类| 国产午夜免费福利| 毛片一区二区| 国产不卡视频在线| 成人毛片一区二区三区| 日韩电影免费在线| 国产精品亚洲自拍| 亚洲字幕av一区二区三区四区| 喷水一区二区三区| 国产女精品视频网站免费| 中文字幕a级片| 久久99精品一区二区三区 | 老司机亚洲精品一区二区| 欧美剧在线免费观看网站| 爱爱爱爱免费视频| 国产精品一区三区在线观看| 欧美一级日韩不卡播放免费| 日本一本在线视频| 国偷自产av一区二区三区| 亚洲成人免费在线视频| 变态另类丨国产精品| 精品大片一区二区| x99av成人免费| 老湿机69福利| 亚洲国产高清一区二区三区| 2018中文字幕一区二区三区| 91精品国产乱码在线观看| 免费在线成人| 国产欧美一区二区三区视频| 国产精品怡红院| 成人一级片在线观看| 久久久福利视频| 成年人在线免费观看| 亚洲欧美综合在线精品| 免费视频爱爱太爽了| 激情黄产视频在线免费观看| 91官网在线观看| 99视频在线观看视频| 成人线上播放| 一区二区三区www| 中文字幕在线有码| 国产农村妇女精品一区二区| 成人福利视频网| 熟妇人妻av无码一区二区三区| heyzo一本久久综合| 色一情一区二区三区四区| 成人看av片| 色老汉av一区二区三区| 天天看片天天操| 色综合www| 久久精品国产欧美激情| av大片在线免费观看| 久久精品国产网站| 久久亚洲综合网| a黄色片在线观看| 欧美性xxxxhd| caopor在线| 色狮一区二区三区四区视频| 久久久亚洲国产天美传媒修理工| 欧美日韩a v| 成人一区二区三区中文字幕| 亚洲一区二区不卡视频| 欧美男男tv网站在线播放| 91麻豆精品久久久久蜜臀| 97超碰在线免费观看| 欧美日韩亚洲一区三区| 国产精品直播网红| 青青草视频在线观看| 亚洲综合网站在线观看| 日韩av在线中文| 免费久久精品| 97超级碰在线看视频免费在线看 | 三级久久三级久久| 国产精品久久九九| av在线官网| 欧美日韩色一区| 黑人巨大精品欧美| 亚洲区第一页| 国产成人精品福利一区二区三区| 男人在线资源站| 欧美午夜不卡视频| 国产肥白大熟妇bbbb视频| 一区二区久久| 国产传媒一区二区| а√天堂官网中文在线| 欧美日韩美女一区二区| 蜜桃传媒一区二区亚洲| 午夜亚洲影视| 久久国产精品高清| 成人黄色动漫| 亚洲国产小视频在线观看| 精品少妇爆乳无码av无码专区| 国内精品在线播放| 永久免费在线看片视频| 91精品亚洲一区在线观看| 中文字幕精品—区二区| 秋霞av一区二区三区| 久久日一线二线三线suv| 久久精品国产精品亚洲色婷婷| 国产精品玖玖玖在线资源| 欧美精品videosex性欧美| 丰满人妻妇伦又伦精品国产| 一区二区三区小说| 国产成人精品一区二区在线小狼| 国产精品a级| 国产精品对白一区二区三区| 先锋成人av| 精品女同一区二区| 日韩成人免费观看| 久久综合久久久久88| 凹凸日日摸日日碰夜夜爽1| 九九综合久久| 国产日韩换脸av一区在线观看| 1pondo在线播放免费| 欧美精品免费视频| 欧美日韩成人免费观看| eeuss国产一区二区三区| 欧美亚洲精品一区二区| 九九久久婷婷| 成人久久久久久久| 欧洲在线视频| 亚洲成人黄色在线| 久久久成人免费视频| 国产亚洲精品久| 婷婷中文字幕在线观看| 黑丝一区二区三区| 麻豆av一区| 日韩专区视频| 午夜精品视频网站| 国产视频在线看| 日韩三级精品电影久久久| 久草精品视频在线观看| 久久久99精品久久| 精品人妻一区二区三| 国产一区白浆| 中文字幕中文字幕在线中心一区| 日韩欧美一级| 欧美最猛黑人xxxx黑人猛叫黄| 午夜毛片在线| 亚洲福利精品在线| 国产精品成人久久久| 亚洲综合成人网| 谁有免费的黄色网址| 国产成人鲁色资源国产91色综| 国产极品尤物在线| 国产精品成人av| 九九九九精品九九九九| 欧美天堂在线| 欧美亚洲另类激情另类| 大片免费在线看视频| 日韩精品视频在线播放| 国产三级在线观看视频| 日韩欧美国产视频| 免费无码毛片一区二区app| 国产午夜一区二区三区| 国产又黄又嫩又滑又白| 日本欧美加勒比视频| 免费高清一区二区三区| 欧美电影免费观看高清| 欧美亚州在线观看| 超碰97久久国产精品牛牛| 国产精品视频免费在线| 天堂√中文最新版在线| 欧美高跟鞋交xxxxxhd| 日本激情在线观看| 亚洲色图13p| 手机看片福利永久| 日韩欧美国产系列| 91肉色超薄丝袜脚交一区二区| 欧美日韩一区二区三区| 久久国产精品波多野结衣av| 国产精品二区一区二区aⅴ污介绍| 日本xxxx裸体xxxx| 成人午夜激情片| 中文字幕国产高清| 免费精品视频最新在线| 日韩 欧美 高清| 激情文学一区| 国产天堂视频在线观看| 欧美全黄视频| 日本丰满少妇黄大片在线观看| 精品视频97| 日韩一区免费观看| 欧美人妖在线| 欧美日韩一区二区视频在线 | 欧美一区二区啪啪| 国产一区二区小视频| 欧美日韩精品久久久| 亚洲性在线观看| 欧美日韩亚洲综合在线| 中文字幕在线观看视频免费| 色综合网站在线| 日本在线播放视频| 大桥未久av一区二区三区| 西西44rtwww国产精品| 欧美午夜丰满在线18影院| 亚洲精品国产精品乱码| 岛国av午夜精品| av资源免费观看| 欧美日韩亚洲系列| 在线观看 亚洲| 欧美性生交片4| 亚洲综合一区中| 9191国产精品| www.色日本| 精品sm捆绑视频| 天堂中文在线8| 亚洲天堂av高清| 98在线视频| 麻豆国产精品va在线观看不卡| 成人看av片| 97人人爽人人喊人人模波多| 正在播放日韩精品| 国产精品日韩一区| 国产日韩中文在线中文字幕| 99国产视频| 午夜先锋成人动漫在线| 日产精品一线二线三线芒果| 久久高清精品| 大胆欧美熟妇xx| 亚洲中字黄色| 一级黄色片国产| 成人小视频在线| 四虎永久免费在线观看| 国产精品久久久久一区二区三区共| 99鲁鲁精品一区二区三区| 亚洲国产视频直播| 无码视频在线观看| 91精品国产一区二区三区香蕉 | 欧洲av一区二区| 91久久国产婷婷一区二区| julia中文字幕一区二区99在线| 国精产品一区二区| 日韩伦理视频| 僵尸世界大战2 在线播放| 日韩精品一级二级 | 99久久综合国产精品| x88av在线| 亚洲已满18点击进入久久| 黄色片网站在线免费观看| 制服.丝袜.亚洲.中文.综合| 四虎精品在永久在线观看 | 超碰人人干人人| 亚洲午夜一区二区三区| 成年人视频免费| 精品国产第一区二区三区观看体验| 美女毛片在线看| 精品视频9999| 福利一区二区免费视频| 国产综合第一页| 自由日本语亚洲人高潮| 国产三级三级三级看三级| 粉嫩av亚洲一区二区图片| 阿v天堂2014| 午夜亚洲福利老司机| 99热在线只有精品| 亚洲性生活视频| а_天堂中文在线| 国产有码在线一区二区视频| 在线日韩一区| 国产亚洲黄色片| 韩国三级在线一区| 丰满的亚洲女人毛茸茸| 欧美日韩亚洲一区二区| 亚洲精品人妻无码| 久久视频精品在线| 黄页免费欧美| 日本免费高清不卡| 亚洲在线黄色| 亚洲天堂美女视频| 亚洲午夜一区二区| 成人福利小视频| 久久精品这里热有精品| 97久久网站| 日韩电影天堂视频一区二区| 亚洲作爱视频| 韩国三级hd两男一女| 亚洲激情男女视频| 国产视频www| 久久好看免费视频| 男人亚洲天堂| 亚洲精品不卡| 日韩激情一二三区| 91成人破解版| 91久久精品一区二区三| 能在线看的av| 日韩免费av在线| 一区三区在线欧| 四虎永久在线精品无码视频| av亚洲精华国产精华精华| 日产亚洲一区二区三区| 欧美精品一区二区三区蜜桃| 牛牛电影国产一区二区| 粉嫩高清一区二区三区精品视频 | 国产午夜精品一区二区三区视频| 91国产丝袜播放在线| 亚洲国产精品免费| 免费h视频在线观看| 久久久久久久久久久久久9999| 9国产精品视频| 亚洲专区区免费| 日本韩国一区二区三区视频| 撸视在线观看免费视频| 国产精品美女www爽爽爽视频| 欧美裸体在线版观看完整版| 蜜桃免费在线视频| 亚洲欧美综合另类在线卡通| 国产黄色片免费| 97精品欧美一区二区三区| 亚洲深夜福利在线观看| 黄色在线视频网| 最新日韩在线视频| 丰满少妇被猛烈进入| 欧美一级淫片aaaaaaa视频| 国产成人精品三级高清久久91| 午夜欧美福利视频| 亚洲天堂成人在线观看| 成人午夜免费在线观看| 奇米一区二区三区四区久久| 欧美日韩有码| 黄色片子免费看| 欧美日韩午夜视频在线观看| 成人高清免费在线播放| 91香蕉电影院| 国产视频欧美| 亚洲天堂av中文字幕| 欧美成人精品3d动漫h| 激情黄产视频在线免费观看| 午夜一区二区三区| 国产精品18久久久久久久久| 国产又大又黑又粗免费视频| 伊人精品在线观看| 日本亚州欧洲精品不卡| 欧美成人xxxxx| 中文字幕佐山爱一区二区免费| 神马久久久久久久久久| 国产精品视频地址| 一区在线播放| 小向美奈子av| 亚洲国产成人爱av在线播放| 成人四虎影院| 黄色大片在线免费看| 亚洲欧洲美洲综合色网| 无码国产精品96久久久久| 成人免费看吃奶视频网站| 亚洲一区国产一区| 999精品在线视频| 亚洲另类图片色| 亚洲国产欧美国产第一区|