Discord OAuth2授权以及机器人监听群事件
下面文章讲解获取OAuth2授权整个流程,创建机器人,使用机器人监听工会(工会就是创建的服务器)成员变化等等,对接国外的都是需要VPN的哦,对接的时候记得提前准备。
创建应用
点击 此页面添加应用,,创建完成以后会生成应用名称,公钥,客户id等等,这些我们可以保存下来。这些应用会自动和我们的工会关联的。

创建机器人
在下面页面创建一个机器人,机器人会会生成自己的token,这个一定要保存好,注意机器人安全。
配置OAuth2
页面创建我们的OAuth2,重定向URL需要配置前端页面的URL,因为获取用户token需要重定向到前端页面,这个地方我们自定义配置即可,授权我们可以访问用户的一些功能权限。

将机器人加入我们的工会
创建工会(服务器)直接在discord聊天页面创建就好了,这个就不多说了,那么我们如何将我们的机器人拉入到我们的服务器呢?
选择OAuth2,选择bot,勾选机器人的工会权限,然后下面会生成一个链接。

打开链接会出现下图内容,我们将我们的机器人加入到我们自己的服务器即可。

我们通过上面的步骤成功的创建了我们的应用、工会和机器人,下面我们将介绍如何使用OAuth2相关功能以及操作机器人。
OAuth2功能实现
<!-- Discord4J 依赖 --> <dependency><groupId>com.discord4j</groupId><artifactId>discord4j-core</artifactId><version>3.2.1</version> </dependency><dependency><groupId>net.dv8tion</groupId><artifactId>JDA</artifactId><version>5.0.0-beta.12</version> </dependency>
根据配置的OAuth2页面生成相关的链接,用户点击授权以后回调到前端页面,页面会带有code以及state参数,code我们用来换取token,state授权页面我们传什么参数过去会给我们带回来的一个参数,授权类似与下面的地址。
https://discord.com/oauth2/authorize?client_id=1215207180614246411&state=%E9%9A%8F%E6%9C%BA%E5%8F%82%E6%95%B0&response_type=code&redirect_uri=http%3A%2F%2F9cxuu6.natappfree.cc%2Fdiscord%2FgetDiscordByCode&scope=identify+guilds+email+guilds.join+connections+guilds.members.read
根据token交互用户数据
拿到token以后我们可以查询用户的信息,用户工会情况等等。
package com.odcchina.server.api;import com.odcchina.common.config.BaseComponent;
import com.odcchina.server.dto.DiscordDto;
import com.odcchina.server.service.DiscordService;
import com.odcchina.server.service.GuildEvent;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import net.dv8tion.jda.api.JDABuilder;
import net.dv8tion.jda.api.requests.GatewayIntent;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Isolation;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import java.util.HashMap;
import java.util.Map;@Slf4j
@RestController
@RequestMapping("/discord")
@Api(tags = "discord服务")
@Transactional(isolation = Isolation.READ_COMMITTED)
public class DiscordController extends BaseComponent {@Autowiredprivate DiscordService discordService;/*** 授权回调code* @param code* @return*/@GetMapping("getDiscordByCode")@ApiOperation("获取discord的Code")public Map<String, String> getTuiteCode(String code) {Map<String, String> map = new HashMap<>();//根据code换取tokenDiscordDto discordDto = discordService.getToken(code,null);map.put("code", code);map.put("access_token", discordDto.getAccessToken());map.put("refresh_token", discordDto.getRefreshToken());return map;}@GetMapping("findLaborUnionList")@ApiOperation("查询我的工会列表")public Map<String, String> findLaborUnionList(String token) {Map<String, String> map = new HashMap<>();try {discordService.findLaborUnionList(token);} catch (Exception e) {throw new RuntimeException(e);}return map;}@GetMapping("findUserLaborUnion")@ApiOperation("查询用户是否存在工会里面")public Map<String, String> findUserLaborUnion(String token,String guildId) {Map<String, String> map = new HashMap<>();try {discordService.findUserLaborUnion(token,guildId);} catch (Exception e) {throw new RuntimeException(e);}return map;}@GetMapping("findUser")@ApiOperation("查询用户信息")public Map<String, String> findUser(String token) {Map<String, String> map = new HashMap<>();try {discordService.findUser(token);} catch (Exception e) {throw new RuntimeException(e);}return map;}}
package com.odcchina.server.service;import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.github.scribejava.apis.DiscordApi;
import com.odcchina.server.config.DiscordConfig;
import com.odcchina.server.dto.DiscordDto;
import com.odcchina.server.dto.DiscordlaborUnionDto;
import com.odcchina.server.dto.UserDto;
import lombok.extern.slf4j.Slf4j;
import net.dv8tion.jda.api.JDA;
import net.dv8tion.jda.api.JDABuilder;
import org.apache.commons.lang3.StringUtils;
import org.apache.http.HttpEntity;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClientBuilder;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.util.EntityUtils;
import org.springframework.stereotype.Service;import java.io.*;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.*;@Slf4j
@Service
public class DiscordService {/*** form表单提交* @param url* @param map* @return*/public DiscordDto doPostForm(String url, Map<String, Object> map) {String strResult = "";CloseableHttpClient client = HttpClients.createDefault();HttpPost httpPost = new HttpPost(url);httpPost.setHeader("Content-Type","application/x-www-form-urlencoded;charset=UTF-8");List<BasicNameValuePair> paramPairs = new ArrayList<>();Set<String> keySet = map.keySet();for (String key : keySet) {Object val = map.get(key);paramPairs.add(new BasicNameValuePair(key, val.toString()));}UrlEncodedFormEntity entity;try {// 4. 将参数设置到entity对象中entity = new UrlEncodedFormEntity(paramPairs, "UTF-8");// 5. 将entity对象设置到httppost对象中httpPost.setEntity(entity);// 6. 发送请求并回去响应CloseableHttpResponse resp = client.execute(httpPost);try {HttpEntity respEntity = resp.getEntity();strResult = EntityUtils.toString(respEntity, "UTF-8");JSONObject json = JSON.parseObject(strResult.toString());Object access_token = json.get("access_token");Object refresh_token = json.get("refresh_token");Object token_type = json.get("token_type");Object expires_in = json.get("expires_in");if(access_token == null || refresh_token == null){return null;}DiscordDto discordDto = new DiscordDto();discordDto.setAccessToken(access_token.toString());discordDto.setRefreshToken(refresh_token.toString());discordDto.setTokenType(token_type.toString());discordDto.setExpiresIn(Integer.parseInt(expires_in.toString()));return discordDto;} finally {resp.close();}} catch (ClientProtocolException e) {e.printStackTrace();} catch (UnsupportedEncodingException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();} finally {// 10. 关闭连接,释放资源try {client.close();} catch (Exception e) {e.printStackTrace();}}return null;}/*** 根据code换取token** @param code* @return*/public DiscordDto getToken(String code,String refreshToken) {try {Map<String, Object> formData = new HashMap<>();if(!StringUtils.isBlank(code)){formData.put("grant_type", "authorization_code");formData.put("code", code);}if(!StringUtils.isBlank(refreshToken)){formData.put("refresh_token", refreshToken);formData.put("grant_type", "refresh_token");}//TODO 重定向配置的URL,一定要和重定向里面的地址保持一致formData.put("redirect_uri", 重定向配置的地址URL");formData.put("client_id", DiscordConfig.CLIENT_ID);formData.put("client_secret", DiscordConfig.CLIENT_SECRET);// 创建URL对象DiscordDto discordDto = this.doPostForm("https://discord.com/api/oauth2/token",formData);return discordDto;} catch (Exception e) {throw new RuntimeException(e);}}/*** 获取用户的所有服务器* @param token* @return*/public List<DiscordlaborUnionDto> findLaborUnionList(String token) {try {// 设置请求URL和Bearer TokenCloseableHttpClient httpClient = HttpClientBuilder.create().build();HttpGet httpPost = new HttpGet("https://discord.com/api/v9/users/@me/guilds");httpPost.setHeader("Content-Type", "application/json;charset=utf8");httpPost.setHeader("Authorization", "Bearer " + token);CloseableHttpResponse response = null;// 由客户端执行(发送)Post请求response = httpClient.execute(httpPost);// 从响应模型中获取响应实体HttpEntity responseEntity = response.getEntity();if (response.getStatusLine().getStatusCode() == 200 && responseEntity != null) {String responseJson = EntityUtils.toString(responseEntity);JSONArray jsonArray = JSON.parseArray(responseJson);List<DiscordlaborUnionDto> jsonArrayToStringList = JSONObject.parseArray(jsonArray.toJSONString(),DiscordlaborUnionDto.class);return jsonArrayToStringList;}} catch (Exception e) {e.printStackTrace();}return null;}public Boolean findUserLaborUnion(String token, String guildId) {try {// 设置请求URL和Bearer TokenCloseableHttpClient httpClient = HttpClientBuilder.create().build();HttpGet httpPost = new HttpGet("https://discord.com/api/v9/users/@me/guilds/" + guildId+"/member");httpPost.setHeader("Content-Type", "application/json;charset=utf8");httpPost.setHeader("Authorization", "Bearer " + token);CloseableHttpResponse response = null;// 由客户端执行(发送)Post请求response = httpClient.execute(httpPost);// 从响应模型中获取响应实体HttpEntity responseEntity = response.getEntity();if (response.getStatusLine().getStatusCode() == 200 && responseEntity != null) {String responseJson = EntityUtils.toString(responseEntity);JSONObject jsonArray = JSON.parseObject(responseJson);if(jsonArray.get("user") != null){return true;}}} catch (Exception e) {e.printStackTrace();}return false;}/*** 查询用户信息* @param token* @return*/public UserDto findUser(String token) {try {// 设置请求URL和Bearer TokenCloseableHttpClient httpClient = HttpClientBuilder.create().build();HttpGet httpPost = new HttpGet("https://discord.com/api/v9/users/@me");httpPost.setHeader("Content-Type", "application/json;charset=utf8");httpPost.setHeader("Authorization", "Bearer " + token);CloseableHttpResponse response = null;// 由客户端执行(发送)Post请求response = httpClient.execute(httpPost);// 从响应模型中获取响应实体HttpEntity responseEntity = response.getEntity();if (response.getStatusLine().getStatusCode() == 200 && responseEntity != null) {String responseJson = EntityUtils.toString(responseEntity);JSONObject jsonArray = JSON.parseObject(responseJson);UserDto userDto = JSON.toJavaObject(jsonArray, UserDto.class);return userDto;}} catch (Exception e) {e.printStackTrace();}return null;}}
package com.odcchina.server.dto;import lombok.Data;
import lombok.experimental.Accessors;@Data
@Accessors(chain = true)
public class DiscordDto {/*** 访问令牌*/private String accessToken;/*** 刷新令牌*/private String refreshToken;/*** 认证方式 Bearer*/private String tokenType;/*** 过期时间 (秒)*/private Integer expiresIn;}
package com.odcchina.server.dto;import lombok.Data;
import lombok.experimental.Accessors;/*** 获取工会列表*/
@Data
@Accessors(chain = true)
public class DiscordlaborUnionDto {/*** 工会ID*/public String id;/*** 工会名称*/public String name;}
package com.odcchina.server.dto;import lombok.Data;
import lombok.experimental.Accessors;@Data
@Accessors(chain = true)
public class DiscordUserDto {/*** 服务器ID*/private String guildId;/*** 服务器名称*/private String guildName;/*** 用户ID*/private String userId;/*** 用户名称*/private String userName;}
package com.odcchina.server.config;/*** Discord相关配置*/
public class DiscordConfig {/*** 客户id和客户私钥*/public static final String CLIENT_ID = "111111";public static final String CLIENT_SECRET = "nL8gLAmZEFZYtQQ2mqE3tEYWC111111";public static final String PUBLIC_CLIENT_SECRET = "feca6db06a1af3c5ebff8fb3710213b86651f6401623d103a5111111";public static final String TOKEN_ENDPOINT = "https://discord.com/api/oauth2/token";
}
使用机器人监听工会会员变动情况
工会会员新加入,退出等情况监听,前期我们需要开启下面这些功能,不然机器人无法监听:

@GetMapping("botMonitor")@ApiOperation("开启机器人监听服务")public Map<String, String> botMonitor() {//启动机器人,监听成员事件try {//这里是机器人的token的,注意下String botToken = "1111.Gh00hD.1111";JDABuilder builder = JDABuilder.createDefault(botToken);//添加事件监听器builder.addEventListeners(new GuildEvent());//builder.useSharding(int shardId, int shardTotal)//工会成员 GUILD_MEMBERS TODO 这个地方在机器人里面有个选项需要开启,不然无法调用builder.enableIntents(GatewayIntent.GUILD_MEMBERS);builder.build();} catch (Exception e) {e.printStackTrace();}
当我们启动以后我们的机器人就会在线,由于我没有启动监听,所以我们的机器人在离线中的:

package com.odcchina.server.service;import com.odcchina.server.dto.DiscordUserDto;
import net.dv8tion.jda.api.entities.Guild;
import net.dv8tion.jda.api.entities.User;
import net.dv8tion.jda.api.events.guild.GuildLeaveEvent;
import net.dv8tion.jda.api.events.guild.invite.GuildInviteCreateEvent;
import net.dv8tion.jda.api.events.guild.invite.GuildInviteDeleteEvent;
import net.dv8tion.jda.api.events.guild.member.GuildMemberJoinEvent;
import net.dv8tion.jda.api.events.guild.member.GuildMemberRemoveEvent;
import net.dv8tion.jda.api.events.guild.member.GuildMemberRoleAddEvent;
import net.dv8tion.jda.api.events.guild.member.GuildMemberRoleRemoveEvent;
import net.dv8tion.jda.api.hooks.ListenerAdapter;
import javax.annotation.Nonnull;public class GuildEvent extends ListenerAdapter {@Overridepublic void onGuildInviteCreate(@Nonnull GuildInviteCreateEvent event) {//一个邀请被创建了}@Overridepublic void onGuildInviteDelete(@Nonnull GuildInviteDeleteEvent event) {//一个邀请被删除了}@Overridepublic void onGuildMemberJoin(@Nonnull GuildMemberJoinEvent event) {//有新成员进入公会Guild guild = event.getGuild();User user = event.getUser();DiscordUserDto discordUserDto = new DiscordUserDto();discordUserDto.setGuildId(guild.getId());discordUserDto.setGuildName(guild.getName());discordUserDto.setUserId(user.getId());discordUserDto.setUserName(user.getName());}@Overridepublic void onGuildLeave(@Nonnull GuildLeaveEvent event) {//有老成员离开公会}@Overridepublic void onGuildMemberRemove(@Nonnull GuildMemberRemoveEvent event) {//有成员被移除公会}@Overridepublic void onGuildMemberRoleAdd(@Nonnull GuildMemberRoleAddEvent event) {//公会成员添加角色}@Overridepublic void onGuildMemberRoleRemove(@Nonnull GuildMemberRoleRemoveEvent event) {//公会成员移除角色}
}
机器人其他功能调用,比如查询邀请信息,查询邀请我的频道会员
https://discord.com/api/v9/channels/工会ID/invites

关于其他机器人功能实现可以参考下面的文档,大佬写的很详细,点这里
相关文章:
Discord OAuth2授权以及机器人监听群事件
下面文章讲解获取OAuth2授权整个流程,创建机器人,使用机器人监听工会(工会就是创建的服务器)成员变化等等,对接国外的都是需要VPN的哦,对接的时候记得提前准备。 创建应用 点击 此页面添加应用,ÿ…...
微信小程序返回上一页刷新组件数据
在父页面的onShow和onHide里面添加一个标志 onShow() {this.setData({show:true})},onHide() {this.setData({show:false})}, 把这个值传给子组件 <importantList slot"importantConcern" flag"{{barSelect}}" flag2"{{show}}" /> 在子组…...
Aging Cell:匈牙利学者发现肠道微生物组的变化和衰老密切相关
基于DNA甲基化衰老时钟的开发可以准确用来测量生物年龄,生物年龄在很大程度上受生活方式、环境和遗传等因素的影响,大量证据也表明健康生活方式可以延缓衰老并延长寿命。 先前大规模微生物组分析表明,随着年龄的增长,微生物组菌群…...
837. 连通块中点的数量(acwing)
文章目录 837. 连通块中点的数量题目描述维护size的并查集 837. 连通块中点的数量 题目描述 给定一个包含 n 个点(编号为 1~n)的无向图,初始时图中没有边。 现在要进行 m 个操作,操作共有三种: C a b&a…...
【wine】WINEDEBUG 分析mame模拟器不能加载roms下面的游戏 可以调整参数,快速启动其中一个游戏kof98
故障现象,MAME启动后,游戏都没有识别 添加日志输出,重新启动wine #!/bin/bashexport WINEPREFIX$(pwd)/.wine export WINESERVER$(pwd)/bin/wineserver export WINELOADER$(pwd)/bin/wine export WINEDEBUG"file,mame,warn,err"…...
pytorch安装记录
pytorch安装记录 1 安装anconda2 安装pycharm3 安装显卡驱动4 根据显卡驱动版本下载CUDA5 cudnn安装6 根据CUDA版本安装pytorch7 pytorch卸载 1 安装anconda 下载地址: https://www.anaconda.com/download#downloads 验证是否安装成功:打开cmd, 输入 conda 验证环…...
不依赖第三方平台,用Dart语言实现 ios 消息推送
仅仅给大家提供代码,还搞不定的欢迎咨询。 void _sendIosPushNotification(BleMessage message, String deviceToken, {bool debugMode = false}) async {final Map<String, dynamic> header = {"alg": "ES256", "kid": GloabelConfigu…...
TEASEL: A transformer-based speech-prefixed language model
文章目录 TEASEL:一种基于Transformer的语音前缀语言模型文章信息研究目的研究内容研究方法1.总体框图2.BERT-style Language Models(基准模型)3.Speech Module3.1Speech Temporal Encoder3.2Lightweight Attentive Aggregation (LAA) 4.训练…...
机器学习之分类回归模型(决策数、随机森林)
回归分析 回归分析属于监督学习方法的一种,主要用于预测连续型目标变量,可以预测、计算趋势以及确定变量之间的关系等。 Regession Evaluation Metrics 以下是一些最流行的回归评估指标: 平均绝对误差(MAE):目标变量的预测值与实际值之间的平均绝对差…...
算法二刷day3
203.移除链表元素 class Solution { public:ListNode* removeElements(ListNode* head, int val) {ListNode *dummyHead new ListNode(0);dummyHead->next head;ListNode *cur dummyHead;while (cur->next ! nullptr) {if (cur->next->val val) {ListNode *tm…...
面具安装LSP模块时提示 Unzip error错误的解决办法
面具(Magisk Delta)安装LSP模块时提示 Unzip error错误的解决办法 如果前面的配置都正常的话,可能是LSP版本有问题重新去Github下载一个最新版的吧;我是这么解决的。 我安装1.91那个版本的LSP就是死活安装不上,下载了1.92的版本一次就…...
HarmonyOS 关系型数据 整体测试 进行 初始化 增删查改 操作
好啊 前面的文章 HarmonyOS 数据持久化 关系型数据库之 初始化操作 HarmonyOS 数据持久化 关系型数据库之 增删改逻辑编写 HarmonyOS 数据持久化 关系型数据库之 查询逻辑编写 我们分别编写了 初始化数据库表 增删查改操作 的逻辑代码 那么 下面我们就来整体操作一下 然后 这…...
软件杯 垃圾邮件(短信)分类算法实现 机器学习 深度学习
文章目录 0 前言2 垃圾短信/邮件 分类算法 原理2.1 常用的分类器 - 贝叶斯分类器 3 数据集介绍4 数据预处理5 特征提取6 训练分类器7 综合测试结果8 其他模型方法9 最后 0 前言 🔥 优质竞赛项目系列,今天要分享的是 🚩 垃圾邮件(短信)分类算…...
cnpm install报错:报错Error: certificate has expired ,淘宝镜像证书过期了解决办法
方案1: 不校验证书 cnpm install --insecure; 方案2: 替换镜像源,比如换成华为的 cnpm confg set registry https://mirrors.huaweicloud.com/repository/npm/ 方案3: 使用http作为镜像源 cnpm confg set registry http://re…...
生成式 AI:使用 Pytorch 通过 GAN 生成合成数据
导 读 生成对抗网络(GAN)因其生成图像的能力而变得非常受欢迎,而语言模型(例如 ChatGPT)在各个领域的使用也越来越多。这些 GAN 模型可以说是人工智能/机器学习目前主流的原因; 因为它向每个人࿰…...
C#/WPF 清理任务栏托盘图标缓存
在我们开发Windows客户端程序时,往往会出现程序退出后,任务还保留之前程序的缓存图标。每打开关闭一次程序,图标会一直增加,导致托盘存放大量缓存图标。为了解决这个问题,我们可以通过下面的程序清理任务栏托盘图标缓存…...
java SSM科研管理系统myeclipse开发mysql数据库springMVC模式java编程计算机网页设计
一、源码特点 java SSM科研管理系统是一套完善的web设计系统(系统采用SSM框架进行设计开发,springspringMVCmybatis),对理解JSP java编程开发语言有帮助,系统具有完整的源代码和数据库,系统主要采用B/S…...
C# OpenCvSharp 图片批量改名
目录 效果 项目 代码 下载 C# OpenCvSharp 图片批量改名 效果 项目 代码 using NLog; using OpenCvSharp; using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Windows.Forms; namespace OpenCvSharp_Demo { publi…...
大数据开发-Hive介绍以及安装配置
文章目录 数据库和数据仓库的区别Hive安装配置Hive使用方式Hive日志配置 数据库和数据仓库的区别 数据库:传统的关系型数据库主要应用在基本的事务处理,比如交易,支持增删改查数据仓库:主要做一些复杂的分析操作,侧重…...
指针篇章-(4)+qsort函数的模拟
学习目录 ———————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————…...
突破不可导策略的训练难题:零阶优化与强化学习的深度嵌合
强化学习(Reinforcement Learning, RL)是工业领域智能控制的重要方法。它的基本原理是将最优控制问题建模为马尔可夫决策过程,然后使用强化学习的Actor-Critic机制(中文译作“知行互动”机制),逐步迭代求解…...
微软PowerBI考试 PL300-选择 Power BI 模型框架【附练习数据】
微软PowerBI考试 PL300-选择 Power BI 模型框架 20 多年来,Microsoft 持续对企业商业智能 (BI) 进行大量投资。 Azure Analysis Services (AAS) 和 SQL Server Analysis Services (SSAS) 基于无数企业使用的成熟的 BI 数据建模技术。 同样的技术也是 Power BI 数据…...
3.3.1_1 检错编码(奇偶校验码)
从这节课开始,我们会探讨数据链路层的差错控制功能,差错控制功能的主要目标是要发现并且解决一个帧内部的位错误,我们需要使用特殊的编码技术去发现帧内部的位错误,当我们发现位错误之后,通常来说有两种解决方案。第一…...
基于uniapp+WebSocket实现聊天对话、消息监听、消息推送、聊天室等功能,多端兼容
基于 UniApp + WebSocket实现多端兼容的实时通讯系统,涵盖WebSocket连接建立、消息收发机制、多端兼容性配置、消息实时监听等功能,适配微信小程序、H5、Android、iOS等终端 目录 技术选型分析WebSocket协议优势UniApp跨平台特性WebSocket 基础实现连接管理消息收发连接…...
微信小程序云开发平台MySQL的连接方式
注:微信小程序云开发平台指的是腾讯云开发 先给结论:微信小程序云开发平台的MySQL,无法通过获取数据库连接信息的方式进行连接,连接只能通过云开发的SDK连接,具体要参考官方文档: 为什么? 因为…...
Java面试专项一-准备篇
一、企业简历筛选规则 一般企业的简历筛选流程:首先由HR先筛选一部分简历后,在将简历给到对应的项目负责人后再进行下一步的操作。 HR如何筛选简历 例如:Boss直聘(招聘方平台) 直接按照条件进行筛选 例如:…...
Java求职者面试指南:Spring、Spring Boot、MyBatis框架与计算机基础问题解析
Java求职者面试指南:Spring、Spring Boot、MyBatis框架与计算机基础问题解析 一、第一轮提问(基础概念问题) 1. 请解释Spring框架的核心容器是什么?它在Spring中起到什么作用? Spring框架的核心容器是IoC容器&#…...
Linux 中如何提取压缩文件 ?
Linux 是一种流行的开源操作系统,它提供了许多工具来管理、压缩和解压缩文件。压缩文件有助于节省存储空间,使数据传输更快。本指南将向您展示如何在 Linux 中提取不同类型的压缩文件。 1. Unpacking ZIP Files ZIP 文件是非常常见的,要在 …...
纯 Java 项目(非 SpringBoot)集成 Mybatis-Plus 和 Mybatis-Plus-Join
纯 Java 项目(非 SpringBoot)集成 Mybatis-Plus 和 Mybatis-Plus-Join 1、依赖1.1、依赖版本1.2、pom.xml 2、代码2.1、SqlSession 构造器2.2、MybatisPlus代码生成器2.3、获取 config.yml 配置2.3.1、config.yml2.3.2、项目配置类 2.4、ftl 模板2.4.1、…...
快刀集(1): 一刀斩断视频片头广告
一刀流:用一个简单脚本,秒杀视频片头广告,还你清爽观影体验。 1. 引子 作为一个爱生活、爱学习、爱收藏高清资源的老码农,平时写代码之余看看电影、补补片,是再正常不过的事。 电影嘛,要沉浸,…...

