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

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授权整个流程&#xff0c;创建机器人&#xff0c;使用机器人监听工会&#xff08;工会就是创建的服务器&#xff09;成员变化等等&#xff0c;对接国外的都是需要VPN的哦&#xff0c;对接的时候记得提前准备。 创建应用 点击 此页面添加应用,&#xff…...

微信小程序返回上一页刷新组件数据

在父页面的onShow和onHide里面添加一个标志 onShow() {this.setData({show:true})},onHide() {this.setData({show:false})}, 把这个值传给子组件 <importantList slot"importantConcern" flag"{{barSelect}}" flag2"{{show}}" /> 在子组…...

Aging Cell:匈牙利学者发现肠道微生物组的变化和衰老密切相关

基于DNA甲基化衰老时钟的开发可以准确用来测量生物年龄&#xff0c;生物年龄在很大程度上受生活方式、环境和遗传等因素的影响&#xff0c;大量证据也表明健康生活方式可以延缓衰老并延长寿命。 先前大规模微生物组分析表明&#xff0c;随着年龄的增长&#xff0c;微生物组菌群…...

837. 连通块中点的数量(acwing)

文章目录 837. 连通块中点的数量题目描述维护size的并查集 837. 连通块中点的数量 题目描述 给定一个包含 n 个点&#xff08;编号为 1&#xff5e;n&#xff09;的无向图&#xff0c;初始时图中没有边。 现在要进行 m 个操作&#xff0c;操作共有三种&#xff1a; C a b&a…...

【wine】WINEDEBUG 分析mame模拟器不能加载roms下面的游戏 可以调整参数,快速启动其中一个游戏kof98

故障现象&#xff0c;MAME启动后&#xff0c;游戏都没有识别 添加日志输出&#xff0c;重新启动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 验证是否安装成功&#xff1a;打开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&#xff1a;一种基于Transformer的语音前缀语言模型文章信息研究目的研究内容研究方法1.总体框图2.BERT-style Language Models&#xff08;基准模型&#xff09;3.Speech Module3.1Speech Temporal Encoder3.2Lightweight Attentive Aggregation (LAA) 4.训练…...

机器学习之分类回归模型(决策数、随机森林)

回归分析 回归分析属于监督学习方法的一种&#xff0c;主要用于预测连续型目标变量&#xff0c;可以预测、计算趋势以及确定变量之间的关系等。 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错误的解决办法 ​​ 如果前面的配置都正常的话&#xff0c;可能是LSP版本有问题重新去Github下载一个最新版的吧&#xff1b;我是这么解决的。 我安装1.91那个版本的LSP就是死活安装不上&#xff0c;下载了1.92的版本一次就…...

HarmonyOS 关系型数据 整体测试 进行 初始化 增删查改 操作

好啊 前面的文章 HarmonyOS 数据持久化 关系型数据库之 初始化操作 HarmonyOS 数据持久化 关系型数据库之 增删改逻辑编写 HarmonyOS 数据持久化 关系型数据库之 查询逻辑编写 我们分别编写了 初始化数据库表 增删查改操作 的逻辑代码 那么 下面我们就来整体操作一下 然后 这…...

软件杯 垃圾邮件(短信)分类算法实现 机器学习 深度学习

文章目录 0 前言2 垃圾短信/邮件 分类算法 原理2.1 常用的分类器 - 贝叶斯分类器 3 数据集介绍4 数据预处理5 特征提取6 训练分类器7 综合测试结果8 其他模型方法9 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 垃圾邮件(短信)分类算…...

cnpm install报错:报错Error: certificate has expired ,淘宝镜像证书过期了解决办法

方案1&#xff1a; 不校验证书 cnpm install --insecure; 方案2&#xff1a; 替换镜像源&#xff0c;比如换成华为的 cnpm confg set registry https://mirrors.huaweicloud.com/repository/npm/ 方案3&#xff1a; 使用http作为镜像源 cnpm confg set registry http://re…...

生成式 AI:使用 Pytorch 通过 GAN 生成合成数据

导 读 生成对抗网络&#xff08;GAN&#xff09;因其生成图像的能力而变得非常受欢迎&#xff0c;而语言模型&#xff08;例如 ChatGPT&#xff09;在各个领域的使用也越来越多。这些 GAN 模型可以说是人工智能/机器学习目前主流的原因&#xff1b; 因为它向每个人&#xff0…...

C#/WPF 清理任务栏托盘图标缓存

在我们开发Windows客户端程序时&#xff0c;往往会出现程序退出后&#xff0c;任务还保留之前程序的缓存图标。每打开关闭一次程序&#xff0c;图标会一直增加&#xff0c;导致托盘存放大量缓存图标。为了解决这个问题&#xff0c;我们可以通过下面的程序清理任务栏托盘图标缓存…...

java SSM科研管理系统myeclipse开发mysql数据库springMVC模式java编程计算机网页设计

一、源码特点 java SSM科研管理系统是一套完善的web设计系统&#xff08;系统采用SSM框架进行设计开发&#xff0c;springspringMVCmybatis&#xff09;&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用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日志配置 数据库和数据仓库的区别 数据库&#xff1a;传统的关系型数据库主要应用在基本的事务处理&#xff0c;比如交易&#xff0c;支持增删改查数据仓库&#xff1a;主要做一些复杂的分析操作&#xff0c;侧重…...

指针篇章-(4)+qsort函数的模拟

学习目录 ———————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————…...

树莓派超全系列教程文档--(62)使用rpicam-app通过网络流式传输视频

使用rpicam-app通过网络流式传输视频 使用 rpicam-app 通过网络流式传输视频UDPTCPRTSPlibavGStreamerRTPlibcamerasrc GStreamer 元素 文章来源&#xff1a; http://raspberry.dns8844.cn/documentation 原文网址 使用 rpicam-app 通过网络流式传输视频 本节介绍来自 rpica…...

新能源汽车智慧充电桩管理方案:新能源充电桩散热问题及消防安全监管方案

随着新能源汽车的快速普及&#xff0c;充电桩作为核心配套设施&#xff0c;其安全性与可靠性备受关注。然而&#xff0c;在高温、高负荷运行环境下&#xff0c;充电桩的散热问题与消防安全隐患日益凸显&#xff0c;成为制约行业发展的关键瓶颈。 如何通过智慧化管理手段优化散…...

【Java_EE】Spring MVC

目录 Spring Web MVC ​编辑注解 RestController RequestMapping RequestParam RequestParam RequestBody PathVariable RequestPart 参数传递 注意事项 ​编辑参数重命名 RequestParam ​编辑​编辑传递集合 RequestParam 传递JSON数据 ​编辑RequestBody ​…...

【论文阅读28】-CNN-BiLSTM-Attention-(2024)

本文把滑坡位移序列拆开、筛优质因子&#xff0c;再用 CNN-BiLSTM-Attention 来动态预测每个子序列&#xff0c;最后重构出总位移&#xff0c;预测效果超越传统模型。 文章目录 1 引言2 方法2.1 位移时间序列加性模型2.2 变分模态分解 (VMD) 具体步骤2.3.1 样本熵&#xff08;S…...

保姆级教程:在无网络无显卡的Windows电脑的vscode本地部署deepseek

文章目录 1 前言2 部署流程2.1 准备工作2.2 Ollama2.2.1 使用有网络的电脑下载Ollama2.2.2 安装Ollama&#xff08;有网络的电脑&#xff09;2.2.3 安装Ollama&#xff08;无网络的电脑&#xff09;2.2.4 安装验证2.2.5 修改大模型安装位置2.2.6 下载Deepseek模型 2.3 将deepse…...

Python+ZeroMQ实战:智能车辆状态监控与模拟模式自动切换

目录 关键点 技术实现1 技术实现2 摘要&#xff1a; 本文将介绍如何利用Python和ZeroMQ消息队列构建一个智能车辆状态监控系统。系统能够根据时间策略自动切换驾驶模式&#xff08;自动驾驶、人工驾驶、远程驾驶、主动安全&#xff09;&#xff0c;并通过实时消息推送更新车…...

Git 3天2K星标:Datawhale 的 Happy-LLM 项目介绍(附教程)

引言 在人工智能飞速发展的今天&#xff0c;大语言模型&#xff08;Large Language Models, LLMs&#xff09;已成为技术领域的焦点。从智能写作到代码生成&#xff0c;LLM 的应用场景不断扩展&#xff0c;深刻改变了我们的工作和生活方式。然而&#xff0c;理解这些模型的内部…...

MySQL 部分重点知识篇

一、数据库对象 1. 主键 定义 &#xff1a;主键是用于唯一标识表中每一行记录的字段或字段组合。它具有唯一性和非空性特点。 作用 &#xff1a;确保数据的完整性&#xff0c;便于数据的查询和管理。 示例 &#xff1a;在学生信息表中&#xff0c;学号可以作为主键&#xff…...

怎么让Comfyui导出的图像不包含工作流信息,

为了数据安全&#xff0c;让Comfyui导出的图像不包含工作流信息&#xff0c;导出的图像就不会拖到comfyui中加载出来工作流。 ComfyUI的目录下node.py 直接移除 pnginfo&#xff08;推荐&#xff09;​​ 在 save_images 方法中&#xff0c;​​删除或注释掉所有与 metadata …...

用鸿蒙HarmonyOS5实现中国象棋小游戏的过程

下面是一个基于鸿蒙OS (HarmonyOS) 的中国象棋小游戏的实现代码。这个实现使用Java语言和鸿蒙的Ability框架。 1. 项目结构 /src/main/java/com/example/chinesechess/├── MainAbilitySlice.java // 主界面逻辑├── ChessView.java // 游戏视图和逻辑├──…...