SpringBoot+WebSocket实现即时通讯(二)

前言

紧接着上文《SpringBoot+WebSocket实现即时通讯(一)》

本博客姊妹篇

  • SpringBoot+WebSocket实现即时通讯(一)
  • SpringBoot+WebSocket实现即时通讯(二)
  • SpringBoot+WebSocket实现即时通讯(三)
  • SpringBoot+WebSocket实现即时通讯(四)

一、功能描述

  • 用户管理:业务自己实现,暂从数据库添加
  • 好友管理:添加好友、删除好友、修改备注、好友列表等
  • 群组管理:新建群、解散群、编辑群、变更群主、拉人进群、踢出群等
  • 聊天模式:私聊、群聊
  • 消息类型:系统、文本、语音、图片、视频
  • 聊天管理:删除聊天、置顶聊天、查看聊天记录等

二、沟通功能设计

2.1 数据库设计

SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;-- ----------------------------
-- Table structure for im_chat
-- ----------------------------
DROP TABLE IF EXISTS `im_chat`;
CREATE TABLE `im_chat`  (`id` bigint UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 'id',`user_id` bigint NOT NULL COMMENT '用户id',`chat_type` char(2) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '聊天类型:01-私聊 02-群聊',`target_id` bigint NOT NULL COMMENT '聊天对象id',`top_flag` tinyint(1) NOT NULL DEFAULT 0 COMMENT '置顶标志',`del_flag` tinyint(1) NOT NULL DEFAULT 0 COMMENT '删除标志',`create_by` bigint NULL DEFAULT NULL COMMENT '创建人',`create_time` datetime NULL DEFAULT NULL COMMENT '创建时间',`update_by` bigint NULL DEFAULT NULL COMMENT '更新人',`update_time` datetime NULL DEFAULT NULL COMMENT '更新时间',PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '聊天会话' ROW_FORMAT = DYNAMIC;-- ----------------------------
-- Table structure for im_friend
-- ----------------------------
DROP TABLE IF EXISTS `im_friend`;
CREATE TABLE `im_friend`  (`id` bigint UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 'id',`user_id` bigint NOT NULL COMMENT '用户id',`friend_user_id` bigint NOT NULL COMMENT '好友用户id',`remark` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '好友备注',`del_flag` tinyint(1) NOT NULL DEFAULT 0 COMMENT '删除标志',`create_by` bigint NULL DEFAULT NULL COMMENT '创建人',`create_time` datetime NULL DEFAULT NULL COMMENT '创建时间',`update_by` bigint NULL DEFAULT NULL COMMENT '更新人',`update_time` datetime NULL DEFAULT NULL COMMENT '更新时间',PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '好友' ROW_FORMAT = DYNAMIC;-- ----------------------------
-- Table structure for im_group
-- ----------------------------
DROP TABLE IF EXISTS `im_group`;
CREATE TABLE `im_group`  (`id` bigint UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 'id',`name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '群名称',`avatar` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '群头像',`master` bigint NULL DEFAULT NULL COMMENT '群主',`manager` varchar(2000) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '群管理',`notice` varchar(1000) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '公告',`remark` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '备注',`del_flag` tinyint(1) NOT NULL DEFAULT 0 COMMENT '删除标志',`create_by` bigint NULL DEFAULT NULL COMMENT '创建人',`create_time` datetime NULL DEFAULT NULL COMMENT '创建时间',`update_by` bigint NULL DEFAULT NULL COMMENT '更新人',`update_time` datetime NULL DEFAULT NULL COMMENT '更新时间',PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '群组' ROW_FORMAT = DYNAMIC;-- ----------------------------
-- Table structure for im_group_user
-- ----------------------------
DROP TABLE IF EXISTS `im_group_user`;
CREATE TABLE `im_group_user`  (`id` bigint UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 'id',`group_id` bigint NOT NULL COMMENT '群id ',`user_id` bigint NOT NULL COMMENT '用户id',`nick_name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '群昵称',`del_flag` tinyint(1) NOT NULL DEFAULT 0 COMMENT '删除标志',`create_by` bigint NULL DEFAULT NULL COMMENT '创建人',`create_time` datetime NULL DEFAULT NULL COMMENT '创建时间',`update_by` bigint NULL DEFAULT NULL COMMENT '更新人',`update_time` datetime NULL DEFAULT NULL COMMENT '更新时间',PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '群成员' ROW_FORMAT = DYNAMIC;-- ----------------------------
-- Table structure for im_message
-- ----------------------------
DROP TABLE IF EXISTS `im_message`;
CREATE TABLE `im_message`  (`id` bigint UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 'id',`chat_id` bigint NULL DEFAULT NULL COMMENT '聊天会话id',`sender_id` bigint NULL DEFAULT NULL COMMENT '发送者id',`message_type` char(2) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '消息类型:00-系统、02-文本、03-图片、04-音频、05-视频',`message` varchar(2000) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '消息',`del_flag` tinyint(1) NOT NULL DEFAULT 0 COMMENT '删除标志',`create_by` bigint NULL DEFAULT NULL COMMENT '创建人',`create_time` datetime NULL DEFAULT NULL COMMENT '创建时间',`update_by` bigint NULL DEFAULT NULL COMMENT '更新人',`update_time` datetime NULL DEFAULT NULL COMMENT '更新时间',PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '消息' ROW_FORMAT = DYNAMIC;-- ----------------------------
-- Table structure for im_message_receiver
-- ----------------------------
DROP TABLE IF EXISTS `im_message_receiver`;
CREATE TABLE `im_message_receiver`  (`id` bigint UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 'id',`message_id` bigint NOT NULL COMMENT '消息id',`receiver_id` bigint NOT NULL COMMENT '接收者id',`read_flag` tinyint(1) NOT NULL DEFAULT 0 COMMENT '已读标志',`del_flag` tinyint(1) NOT NULL DEFAULT 0 COMMENT '删除标志',`create_by` bigint NULL DEFAULT NULL COMMENT '创建人',`create_time` datetime NULL DEFAULT NULL COMMENT '创建时间',`update_by` bigint NULL DEFAULT NULL COMMENT '更新人',`update_time` datetime NULL DEFAULT NULL COMMENT '更新时间',PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '接收者消息' ROW_FORMAT = DYNAMIC;-- ----------------------------
-- Table structure for sys_user
-- ----------------------------
DROP TABLE IF EXISTS `sys_user`;
CREATE TABLE `sys_user`  (`id` bigint UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 'id',`dept_id` bigint NULL DEFAULT NULL COMMENT '部门id',`user_name` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '账号',`password` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '密码',`nick_name` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '昵称',`email` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '用户邮箱',`phone_number` varchar(11) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '手机号码',`sex` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '0' COMMENT '用户性别(0男 1女)',`avatar` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '头像地址',`status` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '0' COMMENT '帐号状态(0正常 1停用)',`remark` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '备注',`del_flag` tinyint(1) NOT NULL DEFAULT 0 COMMENT '删除标志',`create_by` bigint NULL DEFAULT NULL COMMENT '创建人',`create_time` datetime NULL DEFAULT NULL COMMENT '创建时间',`update_by` bigint NULL DEFAULT NULL COMMENT '更新人',`update_time` datetime NULL DEFAULT NULL COMMENT '更新时间',PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '用户信息' ROW_FORMAT = DYNAMIC;SET FOREIGN_KEY_CHECKS = 1;

2.2 引入依赖

<dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.11</version>
</dependency><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.5.3</version>
</dependency>

2.3 配置

# 服务配置
server:port: 8007# springboot配置
spring:datasource:driver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://127.0.0.1:3306/boot_business?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=GMT%2B8username: rootpassword: rootmvc:pathmatch:matching-strategy: ant_path_matcher# mybatis-plus配置
mybatis-plus:type-aliases-package: com.qiangesoft.im.entitymapper-locations: classpath*:mapper/*Mapper.xmlconfiguration:log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

2.4 实体类

package com.qiangesoft.im.entity;import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import lombok.Data;
import lombok.EqualsAndHashCode;import java.io.Serializable;
import java.util.Date;/*** <p>* 聊天会话* </p>** @author qiangesoft* @date 2024-02-07*/
@Data
@EqualsAndHashCode(callSuper = false)
public class ImChat implements Serializable {private static final long serialVersionUID = 1L;/*** id*/@TableId(value = "id", type = IdType.AUTO)private Long id;/*** 用户id*/private Long userId;/*** 聊天类型:01-私聊 02-群聊*/private String chatType;/*** 聊天对象id*/private Long targetId;/*** 置顶标志*/private Boolean topFlag;/*** 删除标志*/private Boolean delFlag;/*** 创建人*/@TableField(fill = FieldFill.INSERT)private Long createBy;/*** 创建时间*/@TableField(fill = FieldFill.INSERT)private Date createTime;/*** 最后更新人*/@TableField(fill = FieldFill.UPDATE)private Long updateBy;/*** 最后更新时间*/@TableField(fill = FieldFill.UPDATE)private Date updateTime;}
package com.qiangesoft.im.entity;import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import lombok.Data;
import lombok.EqualsAndHashCode;import java.io.Serializable;
import java.util.Date;/*** <p>* 好友* </p>** @author qiangesoft* @date 2024-02-07*/
@Data
@EqualsAndHashCode(callSuper = false)
public class ImFriend implements Serializable {private static final long serialVersionUID = 1L;/*** id*/@TableId(value = "id", type = IdType.AUTO)private Long id;/*** 用户id*/private Long userId;/*** 好友用户id*/private Long friendUserId;/*** 好友备注*/private String remark;/*** 删除标志*/private Boolean delFlag;/*** 创建人*/@TableField(fill = FieldFill.INSERT)private Long createBy;/*** 创建时间*/@TableField(fill = FieldFill.INSERT)private Date createTime;/*** 最后更新人*/@TableField(fill = FieldFill.UPDATE)private Long updateBy;/*** 最后更新时间*/@TableField(fill = FieldFill.UPDATE)private Date updateTime;}
package com.qiangesoft.im.entity;import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import lombok.Data;
import lombok.EqualsAndHashCode;import java.io.Serializable;
import java.util.Date;/*** <p>* 群组* </p>** @author qiangesoft* @date 2024-02-07*/
@Data
@EqualsAndHashCode(callSuper = false)
public class ImGroup implements Serializable {private static final long serialVersionUID = 1L;/*** id*/@TableId(value = "id", type = IdType.AUTO)private Long id;/*** 群名称*/private String name;/*** 群头像*/private String avatar;/*** 群主*/private Long master;/*** 群主*/private String manager;/*** 公告*/private String notice;/*** 备注*/private String remark;/*** 删除标志*/private Boolean delFlag;/*** 创建人*/@TableField(fill = FieldFill.INSERT)private Long createBy;/*** 创建时间*/@TableField(fill = FieldFill.INSERT)private Date createTime;/*** 更新人*/@TableField(fill = FieldFill.UPDATE)private Long updateBy;/*** 最后更新时间*/@TableField(fill = FieldFill.UPDATE)private Date updateTime;}
package com.qiangesoft.im.entity;import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import lombok.Data;
import lombok.EqualsAndHashCode;import java.io.Serializable;
import java.util.Date;/*** <p>* 群成员* </p>** @author qiangesoft* @date 2024-02-07*/
@Data
@EqualsAndHashCode(callSuper = false)
public class ImGroupUser implements Serializable {private static final long serialVersionUID = 1L;/*** id*/@TableId(value = "id", type = IdType.AUTO)private Long id;/*** 群id */private Long groupId;/*** 用户id*/private Long userId;/*** 昵称*/private String nickName;/*** 删除标志*/private Boolean delFlag;/*** 创建人*/@TableField(fill = FieldFill.INSERT)private Long createBy;/*** 创建时间*/@TableField(fill = FieldFill.INSERT)private Date createTime;/*** 最后更新人*/@TableField(fill = FieldFill.UPDATE)private Long updateBy;/*** 最后更新时间*/@TableField(fill = FieldFill.UPDATE)private Date updateTime;}
package com.qiangesoft.im.entity;import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import lombok.Data;
import lombok.EqualsAndHashCode;import java.io.Serializable;
import java.util.Date;/*** <p>* 消息* </p>** @author qiangesoft* @date 2024-02-07*/
@Data
@EqualsAndHashCode(callSuper = false)
public class ImMessage implements Serializable {private static final long serialVersionUID = 1L;@TableId(value = "id", type = IdType.AUTO)private Long id;/*** 聊天会话id*/private Long chatId;/*** 发送者id*/private Long senderId;/*** 消息类型:01-系统、02-文本、03-图片、04-音频、05-视频*/private String messageType;/*** 消息*/private String message;/*** 删除标志*/private Boolean delFlag;/*** 创建人*/@TableField(fill = FieldFill.INSERT)private Long createBy;/*** 创建时间*/@TableField(fill = FieldFill.INSERT)private Date createTime;/*** 最后更新人*/@TableField(fill = FieldFill.UPDATE)private Long updateBy;/*** 最后更新时间*/@TableField(fill = FieldFill.UPDATE)private Date updateTime;}
package com.qiangesoft.im.entity;import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import lombok.Data;
import lombok.EqualsAndHashCode;import java.io.Serializable;
import java.util.Date;/*** <p>* 接收者消息* </p>** @author qiangesoft* @since 2023-08-23*/
@Data
@EqualsAndHashCode(callSuper = false)
public class ImMessageReceiver implements Serializable {private static final long serialVersionUID = 1L;/*** id*/@TableId(value = "id", type = IdType.AUTO)private Long id;/*** 消息id*/private Long messageId;/*** 接收者id*/private Long receiverId;/*** 已读标志*/private Boolean readFlag;/*** 删除标志*/private Boolean delFlag;/*** 创建人*/@TableField(fill = FieldFill.INSERT)private Long createBy;/*** 创建时间*/@TableField(fill = FieldFill.INSERT)private Date createTime;/*** 最后更新人*/@TableField(fill = FieldFill.UPDATE)private Long updateBy;/*** 最后更新时间*/@TableField(fill = FieldFill.UPDATE)private Date updateTime;}
package com.qiangesoft.im.entity;import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import lombok.Data;
import lombok.EqualsAndHashCode;import java.io.Serializable;
import java.util.Date;/*** <p>* 用户* </p>** @author qiangesoft* @date 2024-02-07*/
@Data
@EqualsAndHashCode(callSuper = false)
public class SysUser implements Serializable {private static final long serialVersionUID = 1L;/*** id*/@TableId(type = IdType.AUTO)private Long id;/*** 部门id*/private Long deptId;/*** 账号*/private String userName;/*** 密码*/private String password;/*** 昵称*/private String nickName;/*** 用户邮箱*/private String email;/*** 手机号码*/private String phoneNumber;/*** 用户性别*/private String sex;/*** 用户头像*/private String avatar;/*** 帐号状态(0正常 1停用)*/private String status;/*** 备注*/private String remark;/*** 删除标志*/private Boolean delFlag;/*** 创建人*/@TableField(fill = FieldFill.INSERT)private Long createBy;/*** 创建时间*/@TableField(fill = FieldFill.INSERT)private Date createTime;/*** 最后更新人*/@TableField(fill = FieldFill.UPDATE)private Long updateBy;/*** 最后更新时间*/@TableField(fill = FieldFill.UPDATE)private Date updateTime;
}

2.5 接口文档

 <!-- knife4j依赖 --><dependency><groupId>com.github.xiaoymin</groupId><artifactId>knife4j-spring-boot-starter</artifactId><version>3.0.3</version></dependency>
package com.qiangesoft.im.config;import com.github.xiaoymin.knife4j.spring.annotations.EnableKnife4j;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.service.Contact;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;/*** Knife4j的接口配置** @author qiangesoft*/
@Configuration
@EnableKnife4j
public class Knife4jConfig {@Beanpublic Docket docket() {return new Docket(DocumentationType.SWAGGER_2)// 用来创建该API的基本信息,展示在文档的页面中(自定义展示的信息).apiInfo(this.apiInfo())// 设置哪些接口展示.select()// 扫描指定包.apis(RequestHandlerSelectors.basePackage("com.qiangesoft.im.controller")).build();}/*** 添加摘要信息*/private ApiInfo apiInfo() {// 用ApiInfoBuilder进行定制return new ApiInfoBuilder()// 设置标题.title("标题:即时通讯_接口文档")// 描述.description("描述:用于管理即时通讯的接口")// 作者信息.contact(new Contact("qiangesoft", null, null))// 版本.version("v1.0.0").build();}
}

查看接口文档
在这里插入图片描述

三、源码地址

源码地址:https://gitee.com/qiangesoft/boot-business/tree/master/boot-business-im

后续内容见下章

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

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

相关文章

第3.1章:StarRocks数据导入——Insert into 同步模式

一、概述 在StarRocks中&#xff0c;insert的语法和mysql等数据库的语法类似&#xff0c;并且每次insert into操作都是一次完整的导入事务。 主要的 insertInto 命令包含以下两种&#xff1a; insert into tbl select ...insert into tbl (col1, col2, ...) values (1, 2, ...…

day02_java基础_变量_数据类型等

零、今日内容 1 HelloWorld程序 2 idea使用 3 变量 4 数据类型 5 String 一、复习 班规班纪。。。。。 安装jdk JDK 是开发工具 JRE 是运行代码 JDK包含JRE 配置环境变量 二、HelloWorld程序 前提&#xff1a;JDK已经安装配置完毕&#xff0c;有了这些环境就敲代码 代码…

Vue路由组件练习

Vue 路由组件练习 1. 演示效果 2. 代码分析 2.1. 安装 vue-router 命令&#xff1a;npm i vue-router 应用插件&#xff1a;Vue.use(VueRouter) 2.2. 创建路由文件 在 src 文件夹下&#xff0c;创建router文件夹&#xff0c;并在该文件夹创建index.js文件 2.3. 导入依赖…

普中51单片机学习(定时器和计数器)

定时器和计数器 51单片机有两组定时器/计数器&#xff0c;因为既可以定时&#xff0c;又可以计数&#xff0c;故称之为定时器/计数器。定时器/计数器和单片机的CPU是相互独立的。定时器/计数器工作的过程是自动完成的&#xff0c;不需要CPU的参与。51单片机中的定时器/计数器是…

<网络安全>《43 网络攻防专业课<第九课 - 跨站脚本攻击及防范>》

1 什么是XSS XSS(cross site script)或者说跨站脚本是一种Web应用程序的漏洞&#xff0c;恶意攻击者往Web页面里插入恶意Script代码&#xff0c;当用户浏览该页之时&#xff0c;嵌入其中Web里面的Script代码会被执行&#xff0c;从而达到恶意攻击用户的目的。 2 XSS脚本实例 …

城市智能交通指挥中心系统方案

二、方案设计 1.简介 公路治安卡口子系统实现对交通流信息的及时采集和各类嫌疑车辆的查控与处置&#xff0c;扼制并打击一些显见性违规违法行为。其主要功能包括&#xff1a;车辆图像记录、速度测定、车辆号牌识别、自动报警、数据检索、流量统计、图像存贮、数据传输和远程…

在前后端分离项目中如何设置统一返回格式

目录 一、步骤一 二、步骤二 在前后端分离的项目中&#xff0c;为了方便前后端交互&#xff0c;后端往往需要给前端返回固定的数据格式&#xff0c;但不同的实体类返回格式不同&#xff0c;所以在真实开发中&#xff0c;我们将所有API接口设置返回统一的格式。基本上包括的有…

【vue3】手动实现md在线编辑

1.背景 由于知识库的一些.md格式的文件的文件内容可能会有变动&#xff0c;如果频繁下载修改后&#xff0c;再进行上传&#xff0c;会让用户操作不方便&#xff0c;为此接入md在线编辑功能 2 md在线编辑具体实现 2.1 搭建项目 搭建项目下载和引入bytemd和fflate相关依赖&…

【深度优先搜索】【树】【状态压缩】2791. 树中可以形成回文的路径数

作者推荐 【深度优先搜索】【树】【有向图】【推荐】685. 冗余连接 II 本文涉及知识点 深度优先搜索 树 图论 状态压缩 LeetCode:2791. 树中可以形成回文的路径数 给你一棵 树&#xff08;即&#xff0c;一个连通、无向且无环的图&#xff09;&#xff0c;根 节点为 0 &am…

lv15 I2C背景知识(裸机I2C、linux对I2C支持、MPU6050)4

一、I2C总线背景知识 SOC芯片平台的外设分为&#xff1a; 一级外设&#xff1a;外设控制器集成在SOC芯片内部 二级外设&#xff1a;外设控制器由另一块芯片负责&#xff0c;通过一些通讯总线与SOC芯片相连 Inter-Integrated Circuit&#xff1a; 字面意思是用于“集成电路之…

css实现悬浮卡片

结果展示 html代码 <!doctype html> <html lang"zh"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge,chrome1"> <meta name"viewport" content"…

Android Studio创建项目时gradle下载慢

先停止当前Sync&#xff0c;找到gradle-wrapper.properties文件&#xff0c;将distributionUrl修改为腾讯镜像源&#xff1a; distributionUrlhttps\://mirrors.cloud.tencent.com/gradle/gradle-6.5-bin.zip

Vue 使用 v-bind 动态绑定 CSS 样式

在 Vue3 中&#xff0c;可以通过 v-bind 动态绑定 CSS 样式。 语法格式&#xff1a; color: v-bind(数据); 基础使用&#xff1a; <template><h3 class"title">我是父组件</h3><button click"state !state">按钮</button&…

【Spring】IoC容器 控制反转 与 DI依赖注入 XML实现版本 第二期

文章目录 基于 XML 配置方式组件管理前置 准备项目一、 组件&#xff08;Bean&#xff09;信息声明配置&#xff08;IoC&#xff09;&#xff1a;1.1 基于无参构造1.2 基于静态 工厂方法实例化1.3 基于非静态 工厂方法实例化 二、 组件&#xff08;Bean&#xff09;依赖注入配置…

C++ bfs 的状态表示(六十二)【第九篇】

今天我们来学习一下bfs的复杂状态表示 1.bfs状态表示 无论是深度优先搜索还是广度优先搜索&#xff0c;搜索的过程均会建立一棵 搜索树&#xff0c;搜索树上的每一个结点都是一个 状态&#xff0c;而搜索的过程又可以看作是 状态的转移。 对于 BFS&#xff0c;搜索过程中产生…

计算机设计大赛 深度学习人体跌倒检测 -yolo 机器视觉 opencv python

0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; **基于深度学习的人体跌倒检测算法研究与实现 ** 该项目较为新颖&#xff0c;适合作为竞赛课题方向&#xff0c;学长非常推荐&#xff01; &#x1f947;学长这里给一个题目综合评分(每项满…

P6354 [COCI2007-2008#3] TAJNA

题目传送门 题目描述 使用一种加密算法。 设字符串的长度为 n&#xff0c;则构造一个矩阵&#xff0c;使得 rcn 且在 r≤c 的情况下使得 r 尽量大。 然后把给定的明文按照由上到下&#xff0c;从左到右的顺序填充这个 rc 的矩阵。 得到的密文就是把矩阵按照从左到右&#…

内存计算研究进展- 针对图计算的近数据计算架构

针对图计算的近数据计算架构的代表性工作有&#xff1a; Seoul National University的 Tesseract和 Georgia Institute of Technology 的 GraphPIM&#xff0c;具体如下。 1 Tesseract Tesseract是一个针对图计算的可编程的内存计算系统架构&#xff0c;它综合了图计算的特点&…

VMware的三种连接模式

桥接模式 就是将主机网卡与虚拟机虚拟的网卡利用虚拟网桥进行通信。在桥接的作用下&#xff0c;类似于把物理主机虚拟为一个交换机&#xff0c;所有桥接设置的虚拟机连接到这个交换机的一个接口上&#xff0c;物理主机也同样插在这个交换机当中&#xff0c;所以所有桥接下的网…

weblog项目开发记录--SpringBoot后端工程骨架

知识点查漏补缺 跟着犬小哈做项目实战时发现好多知识点都忘了&#xff0c;还有一些小的知识点可能之前没学过&#xff0c;记录下&#xff01;顺带整理下开发流程。 完整项目学习见犬小哈实战专栏 SpringBoot后端工程骨架 搭建好的工程骨架中实现了很多基础功能&#xff0c;…