红包雨项目前端部分
创建项目
pnpm i -g @vue/cli
vue create red_pakage
pnpm i sass sass-locader -D
pnpm i --save normalize.css
pnpm i --save-dev postcss-px-to-viewportpnpm i vant@latest-v2 -S
pnpm i babel-plugin-import -Dhttps://vant.pro/vant/v2/#/zh-CN/



<van-button @click="test" type="info" size="large">信息按钮</van-button><script>
import { Toast } from "vant";
export default {name: "RedPackageApp",data() {return {};},mounted() {},methods: {test: function () {Toast.success("成功文案");},},
};
</script>

封装Axios
pnpm i axios
import axios from "axios";
import { Toast } from "vant";
import getToken from "./getToken";const request = axios.create({baseURL: "/api",timeout: 10000,
});request.interceptors.request.use((config) => {config.headers.token = getToken();return config;},(error) => {Toast.fail("请求发送失败" + error);return Promise.reject(error);}
);request.interceptors.response.use((response) => {console.log(response);if (response.data.code === 200) {return response.data;} else {Toast.fail("请求失败");return Promise.reject(response);}},(error) => {Toast.fail("请求失败" + error);return Promise.reject(error);}
);export default request;
倒计时遮罩
<template><van-overlay :show="isShow"><div class="wrapper"><van-count-down v-if="isShow" :time="time" v-slot="{ seconds }" @finish="finish"><span class="seconds">{{ seconds }}</span></van-count-down></div></van-overlay>
</template><script>
export default {name: "CountdownMask",props: ["onFinish"],data() {return {isShow: false,time: 3500,};},mounted() {},methods: {show(time = 3500) {this.isShow = true;this.time = time;},finish() {this.isShow = false;this.onFinish();// this.$emit("finish");},},
};
</script><style lang="scss" scoped>
.wrapper {display: flex;align-items: center;justify-content: center;height: 100%;
}.seconds {font-size: 40px;color: #f00;
}
</style>
<template><div><CountdownMask ref="countdownMast" :onFinish="onCountFinish" /></div>
</template><script>
import request from "@/utils/request";
import CountdownMask from "./components/CountdownMask";
export default {name: "RedPackageApp",components: {CountdownMask,},data() {return {};},mounted() {setTimeout(() => {this.$refs.countdownMast.show(5000);}, 2000);},methods: {onCountFinish() {console.log("onFinish in RedPackageApp");},},
};
</script><style lang="scss" scoped></style>
记录页遮罩
<template><van-overlay :show="isShow"><div class="wrapper"><div class="content"><span class="title">恭喜获得</span><span class="amount">{{ amount }}</span><span class="unit">元</span></div><van-icon name="close" class="close_icon" @click="close" /></div></van-overlay>
</template><script>
export default {name: "RecordMask",props: ["onClose"],data() {return {isShow: false,amount: 0,};},mounted() {},methods: {show(amount = 0) {this.isShow = true;this.amount = amount;},close() {this.isShow = false;this.onClose();},},
};
</script><style lang="scss" scoped>
.wrapper {display: flex;align-items: center;justify-content: center;height: 100%;background-image: url("../assets/reward.jpg");background-repeat: no-repeat;background-size: 300px;background-position: center;.content {transform: translateY(15%);display: flex;align-items: center;justify-content: center;background-color: rgba(255, 255, 255, 0.8);padding: 20px;border-radius: 10px;}.close_icon {position: absolute;top: 10px;right: 10px;color: rgb(255, 255, 255);font-size: 40px;}
}
</style>
<template><div><CountdownMask ref="countdownMast" :onFinish="onCountFinish" /><RecordMask ref="recordMask" :onClose="onRecordClose" /></div>
</template>//
<script>
// import request from "@/utils/request";
import CountdownMask from "./components/CountdownMask";
import RecordMask from "./components/RecordMask.vue";
export default {name: "RedPackageApp",components: {CountdownMask,RecordMask,},data() {return {};},mounted() {setTimeout(() => {this.$refs.recordMask.show(5000);}, 2000);},methods: {onCountFinish() {console.log("onFinish in RedPackageApp");},onRecordClose() {console.log("onRecordClose in RedPackageApp");},},
};
</script><style lang="scss" scoped></style>
下红包雨

import defaultUrl from './../assets/red.jpg';export default class RedPacket {constructor(options) {this.url = options.url || defaultUrl;this.width = options.width || '20vw';this.height = options.height || 'auto';this.callback = options.callback || function () { };this.parent = options.parent || document.body;this.create();}create( ) {const img = document.createElement('img');img.src = this.url;img.style.width = this.width;img.style.height = this.height;// border-radius: 10px;img.style.borderRadius = '10px';img.ontouchstart = this.destroy.bind(this, img);this.parent.appendChild(img);}destroy (currentImg) {currentImg.remove();this.callback();}
}
<template><div><CountdownMask ref="countdownMast" :onFinish="onCountFinish" /><div class="rain-container" ref="rainContainer"></div><RecordMask ref="recordMask" :onClose="onRecordClose" /></div>
</template>//
<script>
// import request from "@/utils/request";
import CountdownMask from "./components/CountdownMask";
import RecordMask from "./components/RecordMask.vue";
import RedPacket from "./class/RedPacket.js";
export default {name: "RedPackageApp",components: {CountdownMask,RecordMask,},data() {return {};},mounted() {setTimeout(() => {// this.$refs.countdownMast.show(5000);}, 2000);new RedPacket({parent: this.$refs.rainContainer,});new RedPacket({parent: this.$refs.rainContainer,});new RedPacket({parent: this.$refs.rainContainer,});new RedPacket({parent: this.$refs.rainContainer,});new RedPacket({parent: this.$refs.rainContainer,});new RedPacket({parent: this.$refs.rainContainer,});},methods: {onCountFinish() {console.log("onFinish in RedPackageApp");},onRecordClose() {console.log("onRecordClose in RedPackageApp");},},
};
</script><style lang="scss" scoped>
.rain-container {position: fixed;left: 0;top: 0;bottom: 0;right: 0;background-image: linear-gradient(180deg, orange, red);overflow: hidden;
}
</style>
动画逻辑-随机位置

import defaultUrl from './../assets/red.jpg';export default class RedPacket {constructor(options) {// 生成一个0-4的随机整数.const random = Math.floor(Math.random() * 5);this.track = options.track || random * 20;}create( ) { // position: absolute;img.style.position = 'absolute'; // left: 80vw;img.style.left = this.track + 'vw'; }}
动画逻辑-下落动画
import defaultUrl from './../assets/red.jpg';export default class RedPacket {constructor(options) {this.url = options.url || defaultUrl;this.width = options.width || '20vw';this.height = options.height || 'auto';// 生成一个0-4的随机整数.const random = Math.floor(Math.random() * 5);this.track = options.track || random * 20; // 生成一个-360-360的随机整数. // 生成一个3-8的随机整数. const random1 = Math.floor(Math.random() * 721) - 360;const random2 = Math.floor(Math.random() * 6) + 3;this.rotate = options.rotate || random1;this.duration = options.duration || random2; this.callback = options.callback || function () { };this.parent = options.parent || document.body;this.create();}create( ) {const img = document.createElement('img');img.src = this.url;img.style.width = this.width;img.style.height = this.height;// border-radius: 10px;img.style.borderRadius = '10px';// position: absolute;img.style.position = 'absolute'; // left: 80vw;img.style.left = this.track + 'vw';img.animate([{ transform: 'translateY(0)' },{ transform: `translateY(120vh) rotate(${this.rotate}deg)` }], {duration: this.duration * 1000,iterations: 1,fill: 'forwards'});img.ontouchstart = this.destroy.bind(this, img);this.parent.appendChild(img);setTimeout(() => {img.remove();}, this.duration * 1000);}destroy (currentImg) {currentImg.remove();this.callback();}
}
红包雨基本逻辑
<template><div><CountdownMask ref="countdownMast" :onFinish="onCountFinish" /><div v-show="rainContainerShow" class="rain-container" ref="rainContainer"></div><RecordMask ref="recordMask" :onClose="onRecordClose" /></div>
</template>//
<script>
// import request from "@/utils/request";
import CountdownMask from "./components/CountdownMask";
import RecordMask from "./components/RecordMask.vue";
import RedPacket from "./class/RedPacket.js";
export default {name: "RedPackageApp",components: {CountdownMask,RecordMask,},data() {return {rainContainerShow: false,timer: null,};},mounted() {this.$refs.countdownMast.show();},methods: {onCountFinish() {console.log("倒计时结束");this.createRain(5000, 200);},onRecordClose() {console.log("点了关闭");},onRainEnd() {console.log("下完雨了");this.$refs.recordMask.show(888);},onPacketClick() {console.log(" PacketClick ");},createRain(duration, speed) {console.log("开始下红包雨");this.rainContainerShow = true;this.timer = setInterval(() => {new RedPacket({parent: this.$refs.rainContainer,callback: this.onPacketClick,});}, speed);setTimeout(() => {clearInterval(this.timer);this.onRainEnd();}, duration);},},
};
</script><style lang="scss" scoped>
.rain-container {position: fixed;left: 0;top: 0;bottom: 0;right: 0;background-image: linear-gradient(180deg, orange, red);overflow: hidden;
}
</style>
部署详解

部署Redis









负载均衡
压测

相关文章:
红包雨项目前端部分
创建项目 pnpm i -g vue/cli vue create red_pakage pnpm i sass sass-locader -D pnpm i --save normalize.css pnpm i --save-dev postcss-px-to-viewportpnpm i vantlatest-v2 -S pnpm i babel-plugin-import -Dhttps://vant.pro/vant/v2/#/zh-CN/<van-button click&…...
新版AndroidStudio 修改 jdk版本
一、问题 之前,在安卓项目中配置JDK和Gradle的过程非常直观,只需要进入Android Studio的File菜单中的Project Structure即可进行设置,十分方便。 如下图可以在这修改JDK: 但是升级AndroidStudio之后,比如我升级到了Android Stu…...
【golang学习之旅】使用VScode安装配置Go开发环境
1. 下载并安装Go 1.1 下载地址1.2 选择版本并下载1.3 安装目录1.4 验证是否安装成功 2. 配置环境变量 2.1 配置步骤2.2 GO部分环境变量说明 3. 下载或更新 Vscode 3.1 下载地址3.2 安装步骤 4. 为Go开发配置VScode 1. 下载并安装Go 1.1 下载地址 https://studygolang.com/dl…...
langchain教程-2.prompt
前言 该系列教程的代码: https://github.com/shar-pen/Langchain-MiniTutorial 我主要参考 langchain 官方教程, 有选择性的记录了一下学习内容 这是教程清单 1.初试langchain2.prompt3.OutputParser/输出解析4.model/vllm模型部署和langchain调用5.DocumentLoader/多种文档…...
GGML、GGUF、GPTQ 都是啥?
GGML、GGUF和GPTQ是三种与大型语言模型(LLM)量化和优化相关的技术和格式。它们各自有不同的特点和应用场景,下面将详细解释: 1. GGML(GPT-Generated Model Language) 定义:GGML是一种专为机器学习设计的张量库,由Georgi Gerganov创建。它最初的目标是通过单一文件格式…...
C++ 原码、反码、补码和位操作符
目录 一、原码、反码、补码 二、位操作符 1、左移操作符是双⽬操作符 移位规则:左边抛弃、右边补 0 2、右移操作符是双⽬操作符 逻辑右移:左边⽤ 0 填充,右边丢弃算术右移:左边⽤原该值的符号位填充,右边丢弃 3、…...
idea中git版本回退
idea中git版本回退 将dev分支代码合并到master分支执行回退步骤 将dev分支代码合并到master分支 #合并成功之后 执行回退步骤 #在指定的版本上 右键 #这里选择【Hard】彻底回退 #本地的master分支回退成功 #将本地的master强制推送到远程,需要执行命令 git p…...
【PostgreSQL内核学习 —— (WindowAgg(三))】
WindowAgg set_subquery_pathlist 部分函数解读check_and_push_window_quals 函数find_window_run_conditions 函数执行案例总结 计划器模块(set_plan_refs函数)set_windowagg_runcondition_references 函数执行案例 fix_windowagg_condition_expr 函数f…...
redis教程
Redis 教程 Redis 是一个开源的内存数据结构存储系统,用作数据库、缓存和消息代理。以下是一些基础知识和常用操作。 一、简介 Redis 支持多种数据结构,如字符串、哈希、列表、集合、有序集合等。它具有高性能、高可用性和数据持久化的特性。 二、安…...
Python aiortc API
本研究的主要目的是基于Python aiortc api实现抓取本地设备媒体流(摄像机、麦克风)并与Web端实现P2P通话。本文章仅仅描述实现思路,索要源码请私信我。 1 demo-server解耦 1.1 原始代码解析 1.1.1 http服务器端 import argparse import …...
Transaction rolled back because it has been marked as rollback-only问题解决
1、背景 在我们的日常开发中,经常会存在在一个Service层中调用另外一个Service层的方法。比如:我们有一个TaskService,里面有一个execTask方法,且这个方法存在事物,这个方法在执行完之后,需要调用LogServi…...
深入浅出 DeepSeek V2 高效的MoE语言模型
今天,我们来聊聊 DeepSeek V2 高效的 MoE 语言模型,带大家一起深入理解这篇论文的精髓,同时,告诉大家如何将这些概念应用到实际中。 🌟 什么是 MoE?——Mixture of Experts(专家混合模型&#x…...
读书笔记--分布式架构的异步化和缓存技术原理及应用场景
本篇是在上一篇的基础上,主要对分布式应用架构下的异步化机制和缓存技术进行学习,主要记录和思考如下,供大家学习参考。大家知道原来传统的单一WAR应用中,由于所有数据都在同一个数据库中,因此事务问题一般借助数据库事…...
售后板子HDMI无输出分析
问题: 某产品售后有1例HDMI无输出。 分析: 1、测试HDMI的HPD脚(HDMI座子的19pin),测试电压4.5V,属于正常。 2、用万用表直流电压档,测试HDMI的3对数据脚和1对时钟脚(板子通过HDM…...
python3处理表格常用操作
使用pandas库读取excel文件 import pandas as pd data pd.read_excel(D:\\飞书\\近一年用量.xlsx)指定工作表 import pandas as pd data pd.read_excel(D:\\飞书\\近一年用量.xlsx, sheet_nameSheet1)读取日期格式 data pd.read_excel(example.xlsx, parse_dates[Date])添…...
AUX接口(Auxiliary Port)
AUX接口(Auxiliary Port)是网络设备(如路由器、交换机等)上的一个辅助端口,主要用于设备的配置、管理和维护。以下是关于AUX接口的一些关键点: ### 1. **功能** - **设备配置**:通过AUX接口连接…...
计算机毕业设计Python+Vue.js游戏推荐系统 Steam游戏推荐系统 Django Flask 游 戏可视化 游戏数据分析 游戏大数据 爬虫
温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 作者简介:Java领…...
【梦想终会实现】Linux驱动学习5
加油加油坚持住! 1、 Linux驱动模型:驱动模型即将各模型中共有的部分抽象成C结构体。Linux2.4版本前无驱动模型的概念,每个驱动写的代码因人而异,随后为规范书写方式,发明了驱动模型,即提取公共信息组成一…...
Spring 核心技术解析【纯干货版】-Spring 数据访问模块 Spring-Jdbc
在 Spring 框架中,有一个重要的子项目叫做 spring-jdbc。这个模块提供了一种方 便的编程方式来访问基于 JDBC(Java数据库连接)的数据源。本篇博客将详细解析 Spring JDBC 的主要组件和用法,以帮助你更好地理解并使用这个强大的工具…...
Docker 安装详细教程(适用于CentOS 7 系统)
目录 步骤如下: 1. 卸载旧版 Docker 2. 配置 Docker 的 YUM 仓库 3. 安装 Docker 4. 启动 Docker 并验证安装 5. 配置 Docker 镜像加速 总结 前言 Docker 分为 CE 和 EE 两大版本。CE即社区版(免费,支持周期7个月)…...
visual studio 2022更改主题为深色
visual studio 2022更改主题为深色 点击visual studio 上方的 工具-> 选项 在选项窗口中,选择 环境 -> 常规 ,将其中的颜色主题改成深色 点击确定,更改完成...
【机器视觉】单目测距——运动结构恢复
ps:图是随便找的,为了凑个封面 前言 在前面对光流法进行进一步改进,希望将2D光流推广至3D场景流时,发现2D转3D过程中存在尺度歧义问题,需要补全摄像头拍摄图像中缺失的深度信息,否则解空间不收敛…...
工程地质软件市场:发展现状、趋势与策略建议
一、引言 在工程建设领域,准确把握地质条件是确保项目顺利推进和安全运营的关键。工程地质软件作为处理、分析、模拟和展示工程地质数据的重要工具,正发挥着日益重要的作用。它凭借强大的数据处理能力、三维建模功能、空间分析工具和可视化展示手段&…...
linux arm系统烧录
1、打开瑞芯微程序 2、按住linux arm 的 recover按键 插入电源 3、当瑞芯微检测到有设备 4、松开recover按键 5、选择升级固件 6、点击固件选择本地刷机的linux arm 镜像 7、点击升级 (忘了有没有这步了 估计有) 刷机程序 和 镜像 就不提供了。要刷的时…...
OkHttp 中实现断点续传 demo
在 OkHttp 中实现断点续传主要通过以下步骤完成,核心是利用 HTTP 协议的 Range 请求头指定下载范围: 实现原理 Range 请求头:向服务器请求文件的特定字节范围(如 Range: bytes1024-) 本地文件记录:保存已…...
Java 加密常用的各种算法及其选择
在数字化时代,数据安全至关重要,Java 作为广泛应用的编程语言,提供了丰富的加密算法来保障数据的保密性、完整性和真实性。了解这些常用加密算法及其适用场景,有助于开发者在不同的业务需求中做出正确的选择。 一、对称加密算法…...
鱼香ros docker配置镜像报错:https://registry-1.docker.io/v2/
使用鱼香ros一件安装docker时的https://registry-1.docker.io/v2/问题 一键安装指令 wget http://fishros.com/install -O fishros && . fishros出现问题:docker pull 失败 网络不同,需要使用镜像源 按照如下步骤操作 sudo vi /etc/docker/dae…...
第 86 场周赛:矩阵中的幻方、钥匙和房间、将数组拆分成斐波那契序列、猜猜这个单词
Q1、[中等] 矩阵中的幻方 1、题目描述 3 x 3 的幻方是一个填充有 从 1 到 9 的不同数字的 3 x 3 矩阵,其中每行,每列以及两条对角线上的各数之和都相等。 给定一个由整数组成的row x col 的 grid,其中有多少个 3 3 的 “幻方” 子矩阵&am…...
HDFS分布式存储 zookeeper
hadoop介绍 狭义上hadoop是指apache的一款开源软件 用java语言实现开源框架,允许使用简单的变成模型跨计算机对大型集群进行分布式处理(1.海量的数据存储 2.海量数据的计算)Hadoop核心组件 hdfs(分布式文件存储系统)&a…...
JS设计模式(4):观察者模式
JS设计模式(4):观察者模式 一、引入 在开发中,我们经常会遇到这样的场景:一个对象的状态变化需要自动通知其他对象,比如: 电商平台中,商品库存变化时需要通知所有订阅该商品的用户;新闻网站中࿰…...
