当前位置: 首页 > news >正文

SpringBoot快速整合canal1.1.5(TCP模式)

SpringBoot快速整合canal1.1.5(TCP模式)

安装并配置MySQL主从⭐
  • 1:Docker安装MySQL8.0.28
docker pull mysql:8.0.28
  • 2:创建目录:
mkdir -p /usr/local/mysql8/data
mkdir -p /usr/local/mysql8/log
mkdir -p /usr/local/mysql8/my.conf.d
chmod -R 777 /usr/local/mysql8/
  • 3:编写my.cnf文件:
vi /usr/local/mysql8/my.conf.d/my.cnf

内容如下:(注意:把binlog-do-db的值修改成你需要canal监听的数据库名称,如果需要监听多个数据库,一定要在下面写多个binlog-do-db,而不是用“,”分隔)

[client]
# 默认字符集
# default_character_set=utf8
[mysqld]
server-id=138
# 开启二进制日志功能
log-bin=mysql-slave-bin
# binlog 记录内容的方式,记录被操作的每一行
binlog_format = ROW
# ------- >>>>指定监听的数据库(防止监听所有数据库)<<<<<----------
binlog-do-db=security-jwt-db
# 忽略大小写
lower_case_table_names=1
pid-file= /var/run/mysqld/mysqld.pid
socket= /var/run/mysqld/mysqld.sock
# 数据库数据存放目录
datadir= /var/lib/mysql
secure-file-priv= NULL
skip-symbolic-links=0
# 最大链接数
max_connections=200
# 最大失败次数
max_connect_errors=10
# 默认时区
default-time_zone='+8:00'
character-set-client-handshake=FALSE
character_set_server=utf8mb4
# default-character-set=utf8
collation-server=utf8mb4_unicode_ci
init_connect='SET NAMES utf8mb4 COLLATE utf8mb4_unicode_ci'
# 默认使用‘mysql_native_password’插件认证
default_authentication_plugin=mysql_native_password
  • 4:启动MySQL容器:
docker run \--name mysql8.0.28 \--privileged=true \--restart=always \-it -p 3308:3306 \-v /usr/local/mysql8/data:/var/lib/mysql \-v /usr/local/mysql8/log:/var/log/mysql \-v /usr/local/mysql8/my.conf.d/my.cnf:/etc/mysql/my.cnf \-e MYSQL_ROOT_PASSWORD=123456 \-d mysql:8.0.28
  • 5:查看mysql容器是否启动成功:
[root@centos7-sql my.conf.d]# docker ps
CONTAINER ID   IMAGE          COMMAND                  CREATED          STATUS          PORTS                                                  NAMES
ca41de7447ab   mysql:8.0.28   "docker-entrypoint.s…"   12 seconds ago   Up 11 seconds   33060/tcp, 0.0.0.0:3308->3306/tcp, :::3308->3306/tcp   mysql8.0.28
  • 6:修改密码连接模式(mysql8.0版本都要进行修改):
docker exec -it mysql /bin/bash
mysql -uroot -p'123456'
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '123456';
  • 7:在MySQL中创建一个canal用户,专门用作数据同步:
create user 'canal'@'%' IDENTIFIED WITH mysql_native_password BY 'canal';GRANT all privileges ON *.* TO 'canal'@'%';FLUSH PRIVILEGES;
  • 8:退出并重启MySQL容器:
docker restart mysql
docker安装canal1.1.5(版本要对应)⭐
  • 1:拉取canal1.1.5镜像:
docker pull canal/canal-server:v1.1.5
  • 2:运行canal容器:
docker run -p 11111:11111 --name canal \
-e canal.destinations=example \
-e canal.instance.master.address=192.168.184.123:3308  \
-e canal.instance.dbUsername=canal  \
-e canal.instance.dbPassword=canal  \
-e canal.instance.connectionCharset=UTF-8 \
-e canal.instance.tsdb.enable=true \
-e canal.instance.gtidon=false  \
-e canal.instance.filter.regex=security-jwt-db\\..* \
-d canal/canal-server:v1.1.5

核心说明:(只有下面的6个参数才需要我们手动根据自己情况配置,其他可以不用变)

  • -p 11111:11111:这是canal的默认监听端口
  • -e canal.instance.master.address=192.168.184.123:3308数据库地址和端口(一定要设置成你的MySQL对外暴露的IP和端口号才行)
  • -e canal.instance.dbUsername=canal:数据库中canal用户的用户名(也就是我们之前单独创建的用户)
  • -e canal.instance.dbPassword=canal :数据库中canal用户的密码(也就是我们之前单独创建的用户)
  • -e canal.instance.filter.regex=security-jwt-db\\..*:要监听的表名称(我们这个配置的意思是:监听security-jwt-db数据库下的所有表)
  • --network:输入我们刚刚创建好的自定义网络,让canal也加入到和MySQL同一个网络中去。

表名称监听支持的语法:

mysql 数据解析关注的表,Perl正则表达式.
多个正则之间以逗号(,)分隔,转义符需要双斜杠(\\) 
常见例子:
1.  所有表:.*   or  .*\\..*
2.  canal schema下所有表: canal\\..*
3.  canal下的以canal打头的表:canal\\.canal.*
4.  canal schema下的一张表:canal.test1
5.  多个规则组合使用然后以逗号隔开:canal\\..*,mysql.test1,mysql.test2 
整合SpringBoot项目⭐
  • 1:导入依赖:(这个依赖并不是alibaba官方的,而是由其他人帮我们整合了SpringBoot项目,我们只需要去导入这个依赖,再做一些简单的配置即可,非常方便!)
    • 注意:canal-spring-boot-starter的1.2.1-RELEASE版本匹配的是canal的1.1.5版本(canal的新版本没有去试过,不知道有没有问题)
<!--        springboot整合canal1.1.5(因为canal-spring-boot-starter的1.2.1-RELEASE版本匹配的是canal的1.1.5版本) --><dependency><groupId>top.javatool</groupId><artifactId>canal-spring-boot-starter</artifactId><version>1.2.1-RELEASE</version></dependency>
  • 2:配置canal:(application.yml)
    • destination:也就是我们安装canal时执行的docker run … canal中配置的-e canal.destinations的参数内容。
    • server:配置canal所在服务器ip+端口号(默认是11111),记得修改成自己的ip地址
#配置alibaba-canal
canal:destination: example # canal数据同步的目的地。也就是我们安装canal时配置的exampleserver: 192.168.184.123:11111 # canal的地址(canal所在服务器ip+端口号(默认是11111))
# 解决canal-spring-boot-starter一直输出日志
logging:level:top.javatool.canal.client: warn
  • 3:编写实体类(这个类也就是我们要监听操作的实体类)
@TableName(value="sys_oper_log")
@Data
@AllArgsConstructor
@NoArgsConstructor
@JsonInclude(JsonInclude.Include.NON_NULL)
@Builder
public class OperationLog implements Serializable {private static final long serialVersionUID = 1L;@TableId("id")@JsonSerialize(using = ToStringSerializer.class) //解决雪花算法生成的id过长导致前端js精度丢失问题(也就是js拿到的数据和后端不一致问题)@ApiModelProperty(name = "id",value = "主键")@ExcelProperty("id")private Long id;@TableField("username")@ApiModelProperty("执行操作的用户名")@ExcelProperty("执行操作的用户名")private String username;@TableField("type")@ApiModelProperty("操作类型")@ExcelProperty("操作类型")private String type;@TableField("uri")@ApiModelProperty("访问的接口uri")@ExcelProperty("访问的接口uri")private String uri;@TableField("time")@ApiModelProperty("访问接口耗时")@ExcelProperty("访问接口耗时")private String time;@TableField("ip")@ApiModelProperty("执行操作的用户的ip")@ExcelProperty("执行操作的用户的ip")private String ip;@TableField("address")@ApiModelProperty("执行操作的用户的ip对应的地址")@ExcelProperty("执行操作的用户的ip对应的地址")private String address;@TableField("browser")@ApiModelProperty("执行操作的用户所使用的浏览器")@ExcelProperty("执行操作的用户所使用的浏览器")private String browser;@TableField("os")@ApiModelProperty("执行操作的用户所使用的操作系统")@ExcelProperty("执行操作的用户所使用的操作系统")private String os;@TableField("oper_time")@ApiModelProperty("操作时间")@ExcelProperty(value = "操作时间",converter = LocalDateTimeConverter.class)private LocalDateTime operTime;@TableLogic//逻辑删除@TableField("del_flag")@ApiModelProperty("删除标志(0代表未删除,1代表已删除)")@ExcelProperty(value = "删除标志",converter = DelFlagConverter.class)private Integer delFlag;}
  • 4:创建一个中转类(也就是说我们报错的原因是OperationLog类中的LocalDateTime属性,这个时候我们可以创建一个新的类,其他字段不变,把这个LocalDateTime日期类变成String就可以解决这个bug)
    • 原因:(这是由于canal+SpringBoot中的StringConvertUtil类的源码的问题):
      • 可以看到下面的源码没有对LocalDateTime转LocalDatetime进行处理,而是把LocalDateTime转为String类型进行返回(问题出在type.equals(java.sql.Date.class) ? parseDate(columnValue) : columnValue),而columnValue是String类型,所以我们可以用String类型去接收LocalDateTime类型。
package com.boot.entity;import com.alibaba.excel.annotation.ExcelProperty;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableLogic;
import com.baomidou.mybatisplus.annotation.TableName;
import com.boot.converter.DelFlagConverter;
import com.boot.converter.LocalDateTimeConverter;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;import javax.persistence.Column;
import java.io.Serializable;
import java.time.LocalDateTime;/*** 操作日志canal中转类。解决OperationLog类中的LocalDatetime类型的字段无法被canal接收导致报错** @author youzhengjie* @date 2022/10/30 21:16:54*/
@Data
@AllArgsConstructor
@NoArgsConstructor
@JsonInclude(JsonInclude.Include.NON_NULL)
@Builder
public class OperationLogCanal implements Serializable {private static final long serialVersionUID = 1L;private Long id;private String username;private String type;private String uri;private String time;private String ip;private String address;private String browser;private String os;//canal+springboot当属性名和数据库字段不一致时,要用@Column去指定数据库字段名,否则会接收不到canal数据@Column(name = "oper_time")private String operTime;//canal+springboot当属性名和数据库字段不一致时,要用@Column去指定数据库字段名,否则会接收不到canal数据@Column(name = "del_flag")private Integer delFlag;}
  • 5:OperationLogService
package com.boot.service;import com.baomidou.mybatisplus.extension.service.IService;
import com.boot.entity.OperationLog;import java.util.List;/*** 操作日志服务** @author youzhengjie* @date 2022/10/21 23:32:14*/
public interface OperationLogService extends IService<OperationLog> {long selectAllOperationLogCount();/*** 添加操作日志到elasticsearch** @param operationLog 操作日志* @return boolean*/boolean addOperationLogToEs(OperationLog operationLog);/*** 根据id删除elasticsearch中的操作日志** @param id id* @return boolean*/boolean deleteOperationLogToEs(Long id);/*** 更新elasticsearch中的操作日志** @param operationLog 操作日志* @return boolean*/boolean updateOperationLogToEs(OperationLog operationLog);}
  • 6:OperationLogServiceImpl
package com.boot.service.impl;import cn.hutool.core.bean.BeanUtil;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.boot.entity.OperationLog;
import com.boot.mapper.OperationLogMapper;
import com.boot.service.OperationLogService;
import lombok.extern.slf4j.Slf4j;
import org.elasticsearch.action.delete.DeleteRequest;
import org.elasticsearch.action.index.IndexRequest;
import org.elasticsearch.action.search.SearchRequest;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.action.update.UpdateRequest;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.client.core.CountRequest;
import org.elasticsearch.client.core.CountResponse;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.search.SearchHit;
import org.elasticsearch.search.builder.SearchSourceBuilder;
import org.elasticsearch.search.sort.SortOrder;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;import java.io.IOException;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;/*** 操作日志服务impl** @author youzhengjie* @date 2022/10/21 23:42:49*/
@Service
@Slf4j
public class OperationLogServiceImpl extends ServiceImpl<OperationLogMapper, OperationLog> implements OperationLogService {@Autowiredprivate OperationLogMapper operationLogMapper;@Autowiredprivate RestHighLevelClient restHighLevelClient;/*** 操作日志的es索引*/private static final String OPER_LOG_INDEX="operation-log-index";@Overridepublic boolean addOperationLogToEs(OperationLog operationLog) {try {IndexRequest indexRequest = new IndexRequest(OPER_LOG_INDEX);indexRequest.id(operationLog.getId().toString());Map<String, Object> sources = new ConcurrentHashMap<>();sources.put("username", operationLog.getUsername());sources.put("type", operationLog.getType());sources.put("uri", operationLog.getUri());sources.put("time", operationLog.getTime());sources.put("ip", operationLog.getIp());sources.put("address",operationLog.getAddress());sources.put("browser", operationLog.getBrowser());sources.put("os", operationLog.getOs());sources.put("operTime", operationLog.getOperTime());sources.put("delFlag", operationLog.getDelFlag());indexRequest.source(sources);restHighLevelClient.index(indexRequest,RequestOptions.DEFAULT);return true;}catch (Exception e){e.printStackTrace();return false;}}@Overridepublic boolean deleteOperationLogToEs(Long id) {try {DeleteRequest deleteRequest = new DeleteRequest(OPER_LOG_INDEX);deleteRequest.id(id.toString());restHighLevelClient.delete(deleteRequest,RequestOptions.DEFAULT);return true;}catch (Exception e) {e.printStackTrace();return false;}}@Overridepublic boolean updateOperationLogToEs(OperationLog operationLog) {try {//将operationLog封装成MapMap<String,Object> operationLogMap=new ConcurrentHashMap<>();//将operationLog拷贝到Map中BeanUtil.copyProperties(operationLog,operationLogMap);//把map中的id去掉operationLogMap.remove("id");String idStr = operationLog.getId().toString();UpdateRequest updateRequest = new UpdateRequest(OPER_LOG_INDEX,idStr);updateRequest.doc(operationLogMap);restHighLevelClient.update(updateRequest,RequestOptions.DEFAULT);return true;}catch (Exception e){e.printStackTrace();return false;}}}
  • 7:创建一个canal监听类(非常核心),指定监听一个表(这里我监听的是sys_oper_log表):
package com.boot.canal;import cn.hutool.core.bean.BeanUtil;
import com.boot.entity.OperationLog;
import com.boot.entity.OperationLogCanal;
import com.boot.service.OperationLogService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import top.javatool.canal.client.annotation.CanalTable;
import top.javatool.canal.client.handler.EntryHandler;/*** 操作日志canal处理器** @author youzhengjie* @date 2022/10/30 15:19:09*/
@CanalTable("sys_oper_log") //@CanalTable("sys_oper_log"):指定canal监听的表名为sys_oper_log
@Component
@Slf4j
public class OperationLogCanalHandle implements EntryHandler<OperationLogCanal> {@Autowiredprivate OperationLogService operationLogService;@Overridepublic void insert(OperationLogCanal operationLogCanal) {//编写mysql和缓存同步的逻辑(例如JVM本地缓存、Redis分布式缓存、es等)OperationLog operationLog = new OperationLog();//bean拷贝BeanUtil.copyProperties(operationLogCanal,operationLog);//同步到es中operationLogService.addOperationLogToEs(operationLog);log.warn("OperationLogCanalHandle->insert->开始同步->"+operationLog);}/*** 更新** @param before 之前* @param after  之后*/@Overridepublic void update(OperationLogCanal before, OperationLogCanal after) {//编写mysql和缓存同步的逻辑(例如JVM本地缓存、Redis分布式缓存、es等)OperationLog operationLog = new OperationLog();//注意:要拷贝after对象,这个对象是修改之后的对象BeanUtil.copyProperties(after,operationLog);//同步esoperationLogService.updateOperationLogToEs(operationLog);log.warn("OperationLogCanalHandle->update->开始同步->"+operationLog);}@Overridepublic void delete(OperationLogCanal operationLogCanal) {//编写mysql和缓存同步的逻辑(例如JVM本地缓存、Redis分布式缓存、es等)Long id = operationLogCanal.getId();//同步esoperationLogService.deleteOperationLogToEs(id);log.warn("OperationLogCanalHandle->delete->开始同步->"+id);}
}

相关文章:

SpringBoot快速整合canal1.1.5(TCP模式)

SpringBoot快速整合canal1.1.5&#xff08;TCP模式&#xff09; 安装并配置MySQL主从⭐ 1&#xff1a;Docker安装MySQL8.0.28 docker pull mysql:8.0.282&#xff1a;创建目录&#xff1a; mkdir -p /usr/local/mysql8/data mkdir -p /usr/local/mysql8/log mkdir -p /usr/…...

docker打包container成image,然后将image上传到docker hub

第一步&#xff1a;停止正在运行的容器 docker stop <container_name> eg: docker stop xuanjie_mlir 第二步&#xff1a;将对应的container打包成image docker commit <container_id> <镜像名&#xff1a;版本> eg&#xff1a;docker commit 005672e6d97a…...

设计模式—创建型模式之原型模式

设计模式—创建型模式之原型模式 原型模式&#xff08;Prototype Pattern&#xff09;用于创建重复的对象&#xff0c;同时又能保证性能。 本体给外部提供一个克隆体进行使用。 比如我们做一个SjdwzMybatis&#xff0c;用来操作数据库&#xff0c;从数据库里面查出很多记录&…...

Zygote进程通信为什么用Socket而不是Binder?

Zygote进程是Android系统中的一个特殊进程&#xff0c;它在系统启动时被创建&#xff0c;并负责孵化其他应用进程。它的主要作用是预加载和共享应用进程的资源&#xff0c;以提高应用启动的速度。 在Android系统中&#xff0c;常用的进程通信方式有以下几种&#xff1a; Intent…...

API接口加密,解决自动化中登录问题

一、加密方式 AES&#xff1a;对称加密&#xff0c;快RAS&#xff1a;非对称加密&#xff0c;慢AESRAS&#xff1a;安全高效 加密过程&#xff1a;字符串》字节流》加密的字节流&#xff08;算法&#xff09;&#xff0c;解密有可能出现乱码&#xff0c;所以不能直接转成字符…...

COCOS2DX3.17.2 Android升级targetSDK30问题解决方案

一、luajit不兼容问题 不兼容版本&#xff1a;【2.1.0-bate2、2.1.0-bate3都存在异常】 出问题系统&#xff1a;Android11&#xff1b;Android10的系统部分机型有问题&#xff0c;部分机型正常 异常点1&#xff1a;c调用lua接口&#xff0c;pushObjiect的时候crash 异常点2…...

HarmonyOS鸿蒙原生应用开发设计- 隐私声明

HarmonyOS设计文档中&#xff0c;为大家提供了独特的隐私声明&#xff0c;开发者可以根据需要直接引用。 开发者直接使用官方提供的隐私声明内容&#xff0c;既可以符合HarmonyOS原生应用的开发上架运营规范&#xff0c;又可以防止使用别人的内容产生的侵权意外情况等&#xff…...

【面试精选】00后卷王带你三天刷完软件测试面试八股文

前言 本人普通本科计算机专业&#xff0c;做测试也有3年的时间了&#xff0c;讲下我的经历&#xff0c;我刚毕业就进了一个小自研薪资还不错&#xff0c;有10.5k&#xff08;个人觉得我很优秀&#xff09;&#xff0c;在里面呆了两年&#xff0c;积累了一些的经验和技能&#…...

k-means算法c++实现

计算数据集中的元素与各个簇的中心的距离&#xff0c;将它赋给最近的簇&#xff0c;然后重新计算每个簇的平均值&#xff0c;再将元素按离平均值点最近的原则重新分配直到没有出现重新分配 该算法要事先给出k的值&#xff0c;即划分为几个簇。 vector<int> datoclu(dat…...

oracle查询哪些用户下有表

oracle查询哪些用户下有表,排除系统用户。 在实际业务中 oracle数据库中创建了很多的用户 但实际都是无表的,利用SQL语句将这些有表的用户查询出来 并显示用户名、表名、创建表的时间等信息。 select * from dba_objects where object_type = TABLE and owner not in ( AN…...

机器人连杆惯量参数辨识(估计)

杆的转动惯量的计算公式是Imr^2。在经典力学中&#xff0c;转动惯量&#xff08;又称质量惯性矩&#xff0c;简称惯矩&#xff09;通常以I 或J表示&#xff0c;SI 单位为 kgm。对于一个质点&#xff0c;I mr&#xff0c;其中 m 是其质量&#xff0c;r 是质点和转轴的垂直距离。…...

一座 “数智桥梁”,华为助力“天堑变通途”

《水调歌头游泳》中的一句话&#xff0c;“一桥飞架南北&#xff0c;天堑变通途”&#xff0c;广为人们所熟知&#xff0c;其中展现出的&#xff0c;是中国人对美好出行的无限向往。 天堑变通途从来不易。 中国是当今世界上交通运输最繁忙、最快捷的国家之一&#xff0c;交通行…...

C#知识总结 基础篇(上)

本篇内容参考C#图解教程 本篇内容偏向基础&#xff0c;适合0基础的朋友快速上手&#xff0c;也适合有一定C语言&#xff08;或其他语言如C,java&#xff09;基础的人快速上手C#。同时适合unity引擎的初学者&#xff0c;更加详细的了解C#语言。 本文内容基本涵盖C#基础内容&am…...

照片编辑软件Affinity Photo 2 for Mac v2.1.1中文激活版 2024年最新中文版下载

照片编辑软件Affinity Photo 2 for Mac v2.1.1中文激活版是一款功能强大的专业级图像编辑软件&#xff0c;由Serif公司开发。它提供了广泛的工具和功能&#xff0c;适用于摄影师、设计师和艺术家。 照片编辑软件Affinity Photo 2 for Mac v2.1.1中文激活版软件介绍 TIFF&#…...

TPAMI 2023 | Temporal Perceiver:通用时序边界检测方法

本文介绍一下今年我们组被T-PAMI 2023收录的时序边界检测工作 Temporal Perceiver: A General Architecture for Arbitrary Boundary Detection。​​​​​​​ 论文名称&#xff1a; Temporal Perceiver: A General Architecture for Arbitrary Boundary Detection 论文链接&…...

Unity-UV展开工具

using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEditor;public class unfold : EditorWindow {[MenuItem("Gq_Tools/展开")]public static void ShowWin(){EditorWindow.CreateInstance<unfold>().Show();}priva…...

springboot actuator jvm监控丢失

1、背景 系统接入了监控prometheus和grafana&#xff0c;某天grafana突然发现只有几台机器可以看到指标。 随便点击一个地址http://192.168.0.76:8681/lms/actuator/prometheus访问指标&#xff0c;发现JVM相关指标全部丢失 2、解决方法 从网上查找相关资料&#xff0c;逐一…...

UDP服务端和客户端通信代码开发流程

一、UDP通信 TCP&#xff1a;传输控制协议&#xff0c;面向连接的&#xff0c;稳定的&#xff0c;可靠的&#xff0c;安全的数据集流传递 稳定和可靠:丢包重传 数据有序:序号和确认序号 流量控制:稳定窗口 UDP&#xff1a;用户数据报协议 面向无连接的,不稳定的,不可靠,不安…...

数据库实验:SQL的数据定义与单表查询

目录 实验目的实验内容实验要求实验过程实验步骤实例代码结果示意 数据库的实验&#xff0c;对关系型数据库MySQL进行一些实际的操作 实验目的 (1) 掌握DBMS的数据定义功能 (2) 掌握SQL语言的数据定义语句 (3) 掌握RDBMS的数据单表查询功能 (4) 掌握SQL语言的数据单表查询语句…...

P3398 仓鼠找 sugar

Portal. LCA。 询问树上两条路径是否有交点。 画图发现无非两种情况&#xff1a; 发现一条路径的起点和终点的 LCA 经过另一条路径&#xff0c;是两路径相交的充要条件。 考虑如何判断这个 LCA 在不在路径上。若 d ( s , LCA ) d ( LCA , t ) d ( s , t ) d(s,\text{LCA…...

C# 发送邮件

1.安装 NuGet 包 2.代码如下 SendMailUtil using MimeKit; using Srm.CMER.Application.Contracts.CmerInfo; namespace Srm.Mail { public class SendMailUtil { public async static Task<string> SendEmail(SendEmialDto sendEmialDto,List<strin…...

Zeal下载文档慢的问题

1. 安装Zeal 官方下载网站&#xff1a; https://zealdocs.org/ 2. 安装文档&#xff08;在线安装方式&#xff09;&#xff08;下载速度非常慢&#xff09; Tools - Docsets Available中下载安装对应的文档 3. 安装文档&#xff08;离线安装方式&#xff09; ①下载文档…...

HR模块开发(1):简单的开发流程和注意事项

HR模块开发 一、模块概述 人力资源管理解决方案关注3个领域:每位雇员都发展和维护着‘公司内’和‘公司外’的种种‘关系’。运用科技,强化这些关系,可以提高忠诚度和生产力,公司整体得到商业价值。 员工关系管理员工职业生命周期管理员工事务处理管理HR模块的基本知识和构…...

创建Vue实例

我们已经知道了Vue框架可以 基于数据帮助我们渲染出用户界面&#xff0c;那应该怎么做呢&#xff1f; 核心步骤&#xff08;4步&#xff09;&#xff1a; 准备容器 引包&#xff08;官网&#xff09; — 开发版本/生产版本 创建Vue实例 new Vue() 指定配置项&#xff0c;渲…...

2024上海国际人工智能展(CSITF)以“技术,让生活更精彩”为核心理念,以“创新驱动发展,保护知识产权,促进技术贸易”为主题

2024上海国际人工智能展&#xff08;CSITF&#xff09; China&#xff08;Shanghai&#xff09;International Technology Fair 时间:2024年6月12-14日 地点:上海世博展览馆 主办单位 中华人民共和国商务部 中华人民共和国科学技术部 中华人民共和国国家知识产权局 上海市…...

Vue3使用Monaco-editor

Monaco-editor&#xff0c;一个vs code 编辑器&#xff0c;需要将其集成到项目。不说闲话了&#xff0c;直接上代码。 npm地址&#xff1a;https://www.npmjs.com/package/monaco-editor 中文文档&#xff1a;https://aydk.site/editor/ 安装&#xff1a; pnpm add monaco…...

java 根据ip获取到城市 GeoLite2-City.mmdb

本文可解决 根据ip定位获取不到问题&#xff0c;提供多种方式仅供参考&#xff1a; 1.选型 1.1 实现方式 Java可以实现IP地址解析和省市区信息查询&#xff0c;但是需要借助一些外部数据源或数据库来实现。常用的方法有以下几种&#xff1a; 1.1.1 本地文件解析 可以通过下…...

kaggle使用说明

kaggle kaggle使用参考1、kaggle目录2、kaggle上传本地文件后&#xff0c;如何不改代码就可运行3、已上传文件的修改3.1 重新上传3.2 重写文件 4、创建文件夹5、结果下载5.1 多文件&#xff1a;先打包再下载5.2 重定文件下载链接 kaggle使用参考 Kaggle 新手入门必看&#xff…...

BUUCTF FLAG 1

BUUCTF:https://buuoj.cn/challenges 题目描述&#xff1a; 注意&#xff1a;请将 hctf 替换为 flag 提交&#xff0c;格式 flag{} 密文&#xff1a; 下载附件&#xff0c;得到一张.png图片。 解题思路&#xff1a; 1、因为附件是一张图片&#xff0c;先放到StegSolve中&…...

万物皆可“云” 从杭州云栖大会看数智生活的未来

文章目录 前言一、云栖渐进&#xff1a;一个科技论坛的变迁与互联网历史互联网创新创业飞天进化飞天智能驱动数字中国 二、2023云栖大会&#xff1a;云计算人工智能 玩出科技跨界新花样大会亮点重磅嘉宾热门展览算力馆人工智能馆产业创新馆 总结 前言 10月31日&#xff0c;202…...