java快速构建飞书API消息推送、消息加急等功能

文章目录

  • 飞书机器人
    • 自定义机器人
    • 自定义应用机器人
  • 自定义应用发送消息
    • 普通文本 text
    • 富文本 post
    • 图片 image
    • 文件 file
    • 语音 audio
    • 视频 media
    • 消息卡片 interactive
    • 分享群名片 share_chat
    • 分享个人名片 share_user
  • 批量发送消息
  • 消息加急
    • 发送应用内加急
    • 发送短信加急
  • 发送电话加急
  • springboot核心代码实现

在这里插入图片描述

给指定用户或者会话一對一发送消息
支持文本、富文本、可交互的消息卡片、群名片、个人名片、图片、视频、音频、文件、表情包

飞书机器人

自定义机器人

在这里插入图片描述

自定义机器人是一种只能在当前群聊中使用的机器人。
你可以在 群设置>群机器人 面板中快捷创建一个自定义机器人,无需经过租户管理员审核,即可在当前群聊中通过调用webhook地址的方式完成消息推送。由于自定义机器人无需经过租户管理员审核即可使用,使用上的便捷性也限制了其使用范围:

  • 只能在被添加的群聊内使用,不能与机器人单聊
  • 只能对群聊进行单向的消息推送,不能调用飞书丰富的开放接口,获取任何用户、租户信息等
    在这里插入图片描述

自定义应用机器人

应用机器人需要在 开发者后台 中创建,申请发布并经过租户的应用管理员审核通过后,即可使用。在应用发布范围内的用户,可以直接与你创建的机器人单聊,或在 群设置>群机器人 面板中将这个机器人添加进群聊使用。应用机器人受本租户的应用管理员管控。在应用管理员进行权限审核后,应用机器人可以调用飞书丰富的开放接口,获取、使用用户和租户资源。
PS:应用机器人需要提前申请-管理员审核
在这里插入图片描述

自定义应用发送消息

普通文本 text

{
    "receive_id": "ou_7d8a6e6df7621556ce0d21922b676706ccs",
    "content": "{\"text\":\" test content\"}", // 文本内容
    "msg_type": "text"
}

// 如果需要文本中进行换行,需要增加转义
{
    "receive_id": "oc_xxx",
    "content": "{\"text\":\"firstline \\n second line  \"}",
    "msg_type": "text"
}

// 文本消息@用法说明,user_id字段需填入open_id,union_id 或 user_id来@指定人
{
    "receive_id": "oc_xxx",
    "content": "{\"text\":\"<at user_id=\\\"ou_xxxxxxx\\\"></at> text content\"}",
    "msg_type": "text"
}

在这里插入图片描述

富文本 post

富文本可以在一条消息中同时支持文字、At、图片、视频、超链接等元素。
一个富文本可分多个段落(由多个[]组成),每个段落可由多个元素组成,每个元素由tag和相应的字段描述组成。主要图片元素必须是独立的一个段落。

{
        "receive_id": "oc_820faa21d7ed275b53d1727a0feaa917",
        "content": "{\"zh_cn\":{\"title\":\"我是一个标题\",\"content\":[[{\"tag\":\"text\",\"text\":\"第一行 :\"},{\"tag\":\"a\",\"href\":\"http://www.feishu.cn\",\"text\":\"超链接\"},{\"tag\":\"at\",\"user_id\":\"ou_1avnmsbv3k45jnk34j5\",\"user_name\":\"tom\"}],[{\"tag\":\"img\",\"image_key\":\"img_7ea74629-9191-4176-998c-2e603c9c5e8g\"}],[{\"tag\":\"text\",\"text\":\"第二行:\"},{\"tag\":\"text\",\"text\":\"文本测试\"}],[{\"tag\":\"img\",\"image_key\":\"img_7ea74629-9191-4176-998c-2e603c9c5e8g\"}]]}}",
        "msg_type": "post"
}

在这里插入图片描述

图片 image

{
        "receive_id": "oc_xxx",
        "content": "{\"image_key\": \"img_7ea74629-9191-4176-998c-2e603c9c5e8g\"}",
        // 图片Key,可通过 上传图片 接口获取image_key。
        "msg_type": "image"
}

文件 file

{
        "receive_id": "oc_820faa21d7ed275b53d1727a0feaa917",
        "content": "{\"file_key\":\"file_v2_xxx\"}",
        // 文件Key,可通过上传文件接口获取文件的 file_key。
        "msg_type": "file"
}

语音 audio

{
        "receive_id": "oc_xxx",
        "content": "{\"file_key\":\"file_v2_xxx\"}",
         // 语音文件Key,可通过上传文件接口获取音频文件的 file_key。
        "msg_type": "audio"
}

视频 media

{
    "receive_id": "oc_xxx",
    "content": "{\"file_key\":\"file_v2_xxx\",\"image_key\":\"img_v2_xxx\"}",
    // 视频文件Key,可通过上传文件接口获取视频文件的 file_key。
    // 视频封面图片Key,可通过上传图片接口获取图片的image_key。
    "msg_type": "media"
}

消息卡片 interactive

务必注意content消息内容的构建!!

// 使用卡片JSON发送
{
      "receive_id": "oc_820faa21d7ed275b53d1727a0feaa917",
      "content": "{\"config\":{\"wide_screen_mode\":true},\"elements\":[{\"alt\":{\"content\":\"\",\"tag\":\"plain_text\"},\"img_key\":\"img_7ea74629-9191-4176-998c-2e603c9c5e8g\",\"tag\":\"img\"},{\"tag\":\"div\",\"text\":{\"content\":\"你是否曾因为一本书而产生心灵共振,开始感悟人生?\\n你有哪些想极力推荐给他人的珍藏书单?\\n\\n加入 **4·23 飞书读书节**,分享你的**挚爱书单**及**读书笔记**,**赢取千元读书礼**!\\n\\n📬 填写问卷,晒出你的珍藏好书\\n😍 想知道其他人都推荐了哪些好书?马上[入群围观](https://open.feishu.cn/)\\n📝 用[读书笔记模板](https://open.feishu.cn/)(桌面端打开),记录你的心得体会\\n🙌 更有惊喜特邀嘉宾 4月12日起带你共读\",\"tag\":\"lark_md\"}},{\"actions\":[{\"tag\":\"button\",\"text\":{\"content\":\"立即推荐好书\",\"tag\":\"plain_text\"},\"type\":\"primary\",\"url\":\"https://open.feishu.cn/\"},{\"tag\":\"button\",\"text\":{\"content\":\"查看活动指南\",\"tag\":\"plain_text\"},\"type\":\"default\",\"url\":\"https://open.feishu.cn/\"}],\"tag\":\"action\"}],\"header\":{\"template\":\"turquoise\",\"title\":{\"content\":\"📚晒挚爱好书,赢读书礼金\",\"tag\":\"plain_text\"}}}",
      "msg_type": "interactive"
  }
  
// 使用卡片模板template_id发送
{
      "receive_id": "ou_7d8a6exxxxccs",
      "msg_type": "interactive",
      "content": "{\"type\": \"template\", \"data\": { \"template_id\": \"ctp_xxxxxxxxxxxx\", \"template_variable\": {\"article_title\": \"这是文章标题内容\"} } }"
  }

在这里插入图片描述

分享群名片 share_chat

{
        "receive_id": "oc_xxx",
        "content": "{\"chat_id\":\"oc_xxx\"}", // 群ID,获取方式请参见群ID 说明。
        "msg_type": "share_chat"
}

分享个人名片 share_user

{
        "receive_id": "oc_820faa21d7ed275b53d1727a0feaa917",
        "content": "{\"user_id\":\"ou_xxx\"}",// 只支持Open ID,且机器人必须对该用户可见,用户的Open ID获取方式请参见了解更多:如何获取 Open ID。
        "msg_type": "share_user"
}

批量发送消息

给多个用户或者多个部门中的成员发送消息。
注意事项:
应用需要启用机器人能力
接口权限说明:
    必须拥有获取与发送单聊、群组消息权限,或者以应用的身份发消息权限
    至少拥有一个批量发送消息权限:
    给用户发送需要拥有 给多个用户批量发消息 权限
    给部门成员发送需要拥有 给一个或多个部门的成员批量发消息 权限
通过该接口发送的消息 不支持更新以及回复等操作
只能发送给用户,无法发送给群组
异步接口,会有一定延迟,每个应用待发送的消息按顺序处理,请合理安排批量发送范围和顺序。
单个应用每天通过该接口发送的总消息条数不超过50

消息加急

发送应用内加急

对指定消息进行应用内加急
注意事项:
    需要开启机器人能力
    不支持加急批量消息
    只能加急机器人自己发送的消息
    加急时机器人需要在加急消息所在的群中
    加急用户的未读加急总数不能超过200

发送短信加急

对指定消息进行应用内加急与短信加急
注意事项:
    需要开启机器人能力
    只能加急机器人自己发送的消息
    加急时机器人仍需要在加急消息所在的群组中
    加急用户的未读加急总数不能超过200条
    通过接口产生的短信加急将消耗企业的加急额度,请慎重调用

发送电话加急

对指定消息进行应用内加急与电话加急。
注意事项:
    需要开启机器人能力
    只能加急机器人自己发送的消息
    加急时机器人需要在加急消息所在的群组中
    加急用户的未读加急总数不能超过200条
    通过接口产生的电话加急将消耗企业的加急额度,请慎重调用

springboot核心代码实现

/*
 * Copyright © 2020-2021 Nimbus Corporation All rights reserved.
 *
 * 使本项目源码前请仔细阅读以下协议内容,如果你同意以下协议才能使用本项目所有的功能,
 * 否则如果你违反了以下协议,有可能陷入法律纠纷和赔偿,作者保留追究法律责任的权利.
 *
 * 1、本代码为商业源代码,只允许已授权内部人员查看使用
 * 2、任何人员无权将代码泄露或者授权给其他未被授权人员使用
 * 3、任何修改请保留原始作者信息,不得擅自删除及修改
 *
 * 请保留以上版权信息,否则作者将保留追究法律责任.
 */

package com.nimbus.messagecenter.util;

import com.alibaba.nacos.shaded.com.google.common.collect.Lists;
import com.lark.oapi.Client;
import com.lark.oapi.service.contact.v3.model.BatchGetIdUserReq;
import com.lark.oapi.service.contact.v3.model.BatchGetIdUserReqBody;
import com.lark.oapi.service.contact.v3.model.BatchGetIdUserResp;
import com.lark.oapi.service.contact.v3.model.BatchGetIdUserRespBody;
import com.lark.oapi.service.contact.v3.model.UserContactInfo;
import com.lark.oapi.service.im.v1.model.CreateMessageReq;
import com.lark.oapi.service.im.v1.model.CreateMessageReqBody;
import com.lark.oapi.service.im.v1.model.CreateMessageResp;
import com.lark.oapi.service.im.v1.model.UrgentAppMessageReq;
import com.lark.oapi.service.im.v1.model.UrgentAppMessageResp;
import com.lark.oapi.service.im.v1.model.UrgentPhoneMessageReq;
import com.lark.oapi.service.im.v1.model.UrgentPhoneMessageResp;
import com.lark.oapi.service.im.v1.model.UrgentReceivers;
import com.lark.oapi.service.im.v1.model.UrgentSmsMessageReq;
import com.lark.oapi.service.im.v1.model.UrgentSmsMessageResp;
import com.nimbus.common.data.model.api.ApiResultDto;
import lombok.extern.slf4j.Slf4j;

import java.util.ArrayList;
import java.util.List;
import java.util.Objects;

/**
 * FeiShuUtil.
 *
 * @author zhupeng
 * @version 1.0.0, 2024/4/9
 * @since 2024/4/9
 */
@Slf4j
public class FeiShuUtil {
    /**
     * 通过手机号获取飞书用户信息.
     *
     * @param phones     手机号
     * @param userIdType 用户ID类型,openid或user_id.
     * @param client     飞书客户端
     * @return 用户信息列表
     */
    public static List<UserContactInfo> getFeiShuUsersByPhones(List<String> phones, String userIdType, Client client) {
        List<UserContactInfo> userContactInfos = new ArrayList<>();
        // 批量查询最多一次查询50个
        List<List<String>> splitPhones = Lists.partition(phones, 50);
        for (List<String> phone : splitPhones) {
            BatchGetIdUserReq req = BatchGetIdUserReq.newBuilder()
                    .userIdType(userIdType)
                    .batchGetIdUserReqBody(BatchGetIdUserReqBody.newBuilder().mobiles(phone.toArray(new String[0])).build())
                    .build();
            BatchGetIdUserResp resp;
            try {
                resp = client.contact().user().batchGetId(req);
            } catch (Exception e) {
                throw new RuntimeException(e);
            }
            if (!resp.success()) {
                log.error("code:{}, msg:{}, regId:{}", resp.getCode(), resp.getMsg(), resp.getRequestId());
            }
            BatchGetIdUserRespBody data = resp.getData();
            if (Objects.nonNull(data)) {
                userContactInfos.addAll(List.of(data.getUserList()));
            }
        }
        return userContactInfos;
    }

    /**
     * 给指定用户发飞书消息.
     *
     * @param receiveId     消息接收人:飞书用户id或飞书群号
     * @param content       消息内容
     * @param msgType       消息类型
     * @param receiveIdType 消息接收者id类型:open_id/user_id/union_id/email/chat_id
     * @param client        飞书客户端
     * @return 消息发送结果
     */
    public static ApiResultDto sendFeiShuMessage(String receiveId, String content, String msgType, String receiveIdType, Client client) {
        CreateMessageReq req = CreateMessageReq.newBuilder()
                .receiveIdType(receiveIdType)
                .createMessageReqBody(CreateMessageReqBody.newBuilder()
                        .receiveId(receiveId)               // 消息接收人
                        .msgType(msgType)                   // 消息类型
                        .content(content)                   // 消息内容
                        .build())
                .build();
        CreateMessageResp resp;
        try {
            resp = client.im().message().create(req);
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
        if (!resp.success()) {
            log.error("code:{}, msg:{}, regId:{}", resp.getCode(), resp.getMsg(), resp.getRequestId());
            return ApiResultDto.failed(resp.getCode(), resp.getMsg());
        }
        return ApiResultDto.success(resp.getData());
    }

    /**
     * 针对某个消息给某个人进行消息加急,目前使用飞书用户user_id识别用户.
     *
     * @param messageId  消息id
     * @param receiveIds 接收人id
     * @param client     飞书客户端
     * @return 处理结果
     */
    public static ApiResultDto sendUrgentAppMessage(String messageId, List<String> receiveIds, Client client) {
        // 发起请求
        UrgentAppMessageReq req = UrgentAppMessageReq.newBuilder()
                .messageId(messageId)
                .userIdType("user_id")
                .urgentReceivers(UrgentReceivers.newBuilder().userIdList(receiveIds.toArray(new String[0])).build())
                .build();
        UrgentAppMessageResp resp;
        try {
            resp = client.im().message().urgentApp(req);
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
        if (!resp.success()) {
            log.error("code:{}, msg:{}, regId:{}", resp.getCode(), resp.getMsg(), resp.getRequestId());
            return ApiResultDto.failed(resp.getCode(), resp.getMsg());
        }
        return ApiResultDto.success(resp.getData());
    }

    /**
     * 针对某个消息给某个人进行短信加急,目前使用飞书用户user_id识别用户.
     *
     * @param messageId  消息id
     * @param receiveIds 接收人id
     * @param client     飞书客户端
     * @return 处理结果
     */
    public static ApiResultDto sendUrgentSmsMessage(String messageId, List<String> receiveIds, Client client) {
        // 发起请求
        UrgentSmsMessageReq req = UrgentSmsMessageReq.newBuilder()
                .messageId(messageId)
                .userIdType("user_id")
                .urgentReceivers(UrgentReceivers.newBuilder().userIdList(receiveIds.toArray(new String[0])).build())
                .build();
        UrgentSmsMessageResp resp;
        try {
            resp = client.im().message().urgentSms(req);
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
        if (!resp.success()) {
            log.error("code:{}, msg:{}, regId:{}", resp.getCode(), resp.getMsg(), resp.getRequestId());
            return ApiResultDto.failed(resp.getCode(), resp.getMsg());
        }
        return ApiResultDto.success(resp.getData());
    }

    /**
     * 针对某个消息给某个人进行电话加急,目前使用飞书用户user_id识别用户.
     *
     * @param messageId  消息id
     * @param receiveIds 接收人id
     * @param client     飞书客户端
     * @return 处理结果
     */
    public static ApiResultDto sendUrgentPhoneMessage(String messageId, List<String> receiveIds, Client client) {
        // 发起请求
        UrgentPhoneMessageReq req = UrgentPhoneMessageReq.newBuilder()
                .messageId(messageId)
                .userIdType("user_id")
                .urgentReceivers(UrgentReceivers.newBuilder().userIdList(receiveIds.toArray(new String[0])).build())
                .build();
        UrgentPhoneMessageResp resp;
        try {
            resp = client.im().message().urgentPhone(req);
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
        if (!resp.success()) {
            log.error("code:{}, msg:{}, regId:{}", resp.getCode(), resp.getMsg(), resp.getRequestId());
            return ApiResultDto.failed(resp.getCode(), resp.getMsg());
        }
        return ApiResultDto.success(resp.getData());
    }
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【随身wifi京东金榜排名】格行vs华为vs上赞随身wifi哪款最好用?格行随身wifi官方正品,格行随身wifi怎么样?

第一名&#xff1a;格行随身wifi 综合分99.1 随身WiFi行业领跑品牌 &#xff0c;15年行业经验 &#xff0c;随身WiFi口碑榜第一名。轻便小巧&#xff0c;支持三网通&#xff0c;可以随时随地提供稳定高速的网络连接。使用目前先进的马维尔芯片&#xff0c;信号稳定&#xff0…

Unet++(pytorch实现)

Unet++网络 Dense connection Unet++继承了Unet的结构,同时又借鉴了DenseNet的稠密连接方式(图1中各种分支)。 作者通过各层之间的稠密连接,互相连接起来,就像Denset那样,前前后后每一个模块互相作用,每一个模块都能看到彼此,那对彼此互相熟悉,分割效果自然就会变好…

位像素海外仓管理系统对接ERP系统教程,一对一教学

在海外仓管理过程中&#xff0c;对接ERP系统的重要性不言而喻的。这种对接不仅能让数据实时共享&#xff0c;还能让海外仓管理者优化整个供应链管理流程。 因此&#xff0c;今天小编就来教大家&#xff0c;海外仓仓库系统是怎么对接ERP物流系统的&#xff1f; 1.分析需求 在对接…

2024年危险化学品经营单位安全管理人员证考试题库及试题解析

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2024年危险化学品经营单位安全管理人员证考试题库及危险化学品经营单位安全管理人员试题解析是安全生产模拟考试一点通结合&#xff08;安监局&#xff09;特种作业人员操作证考试大纲和&#xff08;质检局&#xff0…

Docker 镜像推送到docker hub

查看容器 #sudo docker ps -a commit容器为镜像 $ sudo docker commit d7b5e8d56a75 ubuntu_pytorch39_v4 #sha256: ********** 查看镜像信息 $ sudo docker images 登录 docker hub $ sudo docker login --username用户名 registry.cn-beijing.aliyuncs.com #密码 为…

2024年mathorcup数学建模思路及论文助攻

题目C题 物流网络分拣中心货量预测及人员排班 电商物流网络在订单履约中由多个环节组成&#xff0c;图1是一个简化的物流网络示意图。其中&#xff0c;分拣中心作为网络的中间环节&#xff0c;需要将包裹按照不同流向进行分拣并发往下一个场地&#xff0c;最终使包裹到达消费者…

在 macOS 上安装 Jenkins

Jenkins常用命令&#xff1a; 安装最新的 LTS 版本&#xff1a; brew install jenkins-lts 安装特定的 LTS 版本&#xff1a; brew install jenkins-ltsYOUR_VERSION 启动Jenkins服务&#xff1a; brew services start jenkins-lts 重启Jenkins服务&#xff1a; brew services…

[大模型]Yi-6B-Chat FastApi 部署调用

Yi-6B-Chat FastApi 部署调用 环境准备 在 Autodl 平台中租赁一个 3090 等 24G 显存的显卡机器&#xff0c;如下图所示镜像选择 PyTorch–>2.0.0–>3.8(ubuntu20.04)–>11.8&#xff08;11.3 版本以上的都可以&#xff09;。 接下来打开刚刚租用服务器的 JupyterLab…

文件上传【2】--靶场通关

1.前端禁用js绕过 上传文件&#xff0c;进行抓包&#xff0c;没有抓到&#xff0c;说明这里的验证是前端js验证跳出的弹窗 禁用js后&#xff0c;php文件上传成功。 2.文件上传.htaccess 上传png木马后连接不上 代码中存在.htaccess&#xff0c;判断此时应该就是需要用到.htac…

Xlinx相关原语讲解导航页面

原语就是对FPGA底层器件的直接调用&#xff0c;与IP功能是类似的&#xff0c;将原语的参数变成IP配置时的GUI界面参数&#xff0c;可能会更加直观。IP的缺陷在于繁杂&#xff0c;比如SelectIO IP内部包含IDDR、ODDR等等IO转换的功能&#xff0c;如果只想使用单沿转双沿一个功能…

Python根据主播直播时间段判定订单销售额归属

写在前面&#xff1a;最近在群里看到一个这样的直播电商的场景觉得还是挺有趣的&#xff0c;于是就想用Python来实现。 需求描述&#xff1a;根据主播直播时间段结合销售订单的付款时间判断所属销售的归属 生成主播在线直播时间段数据 from datetime import datetime, timed…

图片合成二维码怎么实现?图片二维码的生成技巧

图片合成二维码如何制作呢&#xff1f;现在很多的二维码都会提供图片预览的功能&#xff0c;我们可以用手机扫描二维码来查看图片的信息&#xff0c;比如很多的产品信息、旅游攻略、产品海报等等类型经常会制作这种类型的二维码。 其实图片制作二维码的方法很简单&#xff0c;…

自建远程桌面服务器,控制免root安卓手机和pc

RustDesk是一个开源的远程桌面软件&#xff0c;它允许用户通过互联网在不同设备之间共享桌面和控制权限。这款软件以最少的配置提供了自托管和安全保障&#xff0c;是一个类似于TeamViewer的开源替代品​ (RustDesk)​。RustDesk支持在Windows、macOS、Linux、iOS、Android以及…

2023年MathorCup数学建模D题航空安全风险分析和飞行技术评估问题解题全过程文档加程序

2023年第十三届MathorCup高校数学建模挑战赛 D题 航空安全风险分析和飞行技术评估问题 原题再现 飞行安全是民航运输业赖以生存和发展的基础。随着我国民航业的快速发展&#xff0c;针对飞行安全问题的研究显得越来越重要。2022 年 3 月 21 日&#xff0c;“3.21”空难的发生…

基于ES-EKF的LiDAR/GNSS/IMU传感器融合轨迹估计(附项目源码)

基于改进EKF的LiDAR/GNSS/IMU传感器融合轨迹估计&#xff08;附项目源码&#xff09; 算法概述PredictionCorrectionES-EKF算法融合算法实现轨迹估计实验结果 最近在研究传感器融合&#xff0c;看到一个很好的开源项目&#xff0c;适合小白学习&#xff0c;为以后做传感器融合、…

再谈C语言——理解指针(一)

内存和地址 内存 在讲内存和地址之前&#xff0c;我们想有个⽣活中的案例&#xff1a; 假设有⼀栋宿舍楼&#xff0c;把你放在楼⾥&#xff0c;楼上有100个房间&#xff0c;但是房间没有编号&#xff0c;你的⼀个朋友来找你玩&#xff0c; 如果想找到你&#xff0c;就得挨个房…

Vue 移动端(H5)项目怎么实现页面缓存(即列表页面进入详情返回后列表页面缓存且还原页面滚动条位置)keep-alive缓存及清除keep-alive缓存

一、需求 产品要求&#xff1a;Vue移动端项目进入列表页&#xff0c;列表页需要刷新&#xff0c;而从详情页返回列表页&#xff0c;列表页则需要缓存并且还原页面滚动条位置 二、实现思路 1、使用Vue中的keep-alive组件&#xff0c;keep-alive提供了路由缓存功能 2、因为我项…

《黑马点评》Redis高并发项目实战笔记(上)P1~P43

P1 Redis企业实战课程介绍 P2 短信登录 导入黑马点评项目 首先在数据库连接下新建一个数据库hmdp&#xff0c;然后右键hmdp下的表&#xff0c;选择运行SQL文件&#xff0c;然后指定运行文件hmdp.sql即可&#xff08;建议MySQL的版本在5.7及以上&#xff09;&#xff1a; 下面这…

冲刺2024年思维100春季线上比赛:做做历年思维100真题(附答案)

今天是2024年4月13日&#xff0c;距离2024年春季思维100活动第一阶段的线上比赛4月20日还有7天。今年思维100活动的考试重点是什么呢&#xff1f;虽然主办方未公布&#xff0c;我们可以从历年的思维100真题中来分析和推测&#xff0c;把历年真题和背后的知识点吃透了&#xff0…

宠物领养|基于springboot的宠物领养系统设计与实现(附项目源码+论文)

基于springboot的宠物领养系统设计与实现 目录 一、摘要 二、相关技术 三、系统设计 3.1 整体功能设计图 3.2 功能具体细节设计 四、数据库设计 五、核心代码 六、论文参考 七、源码获取 一、摘要 如今社会上各行各业&#xff0c;都在用属于自己专用的软件来进行…