红包雨项目前端部分
创建项目
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个月)…...
[2025CVPR]DeepVideo-R1:基于难度感知回归GRPO的视频强化微调框架详解
突破视频大语言模型推理瓶颈,在多个视频基准上实现SOTA性能 一、核心问题与创新亮点 1.1 GRPO在视频任务中的两大挑战 安全措施依赖问题 GRPO使用min和clip函数限制策略更新幅度,导致: 梯度抑制:当新旧策略差异过大时梯度消失收敛困难:策略无法充分优化# 传统GRPO的梯…...
深入浅出:JavaScript 中的 `window.crypto.getRandomValues()` 方法
深入浅出:JavaScript 中的 window.crypto.getRandomValues() 方法 在现代 Web 开发中,随机数的生成看似简单,却隐藏着许多玄机。无论是生成密码、加密密钥,还是创建安全令牌,随机数的质量直接关系到系统的安全性。Jav…...

(二)TensorRT-LLM | 模型导出(v0.20.0rc3)
0. 概述 上一节 对安装和使用有个基本介绍。根据这个 issue 的描述,后续 TensorRT-LLM 团队可能更专注于更新和维护 pytorch backend。但 tensorrt backend 作为先前一直开发的工作,其中包含了大量可以学习的地方。本文主要看看它导出模型的部分&#x…...
Linux简单的操作
ls ls 查看当前目录 ll 查看详细内容 ls -a 查看所有的内容 ls --help 查看方法文档 pwd pwd 查看当前路径 cd cd 转路径 cd .. 转上一级路径 cd 名 转换路径 …...

微信小程序 - 手机震动
一、界面 <button type"primary" bindtap"shortVibrate">短震动</button> <button type"primary" bindtap"longVibrate">长震动</button> 二、js逻辑代码 注:文档 https://developers.weixin.qq…...
C++ 基础特性深度解析
目录 引言 一、命名空间(namespace) C 中的命名空间 与 C 语言的对比 二、缺省参数 C 中的缺省参数 与 C 语言的对比 三、引用(reference) C 中的引用 与 C 语言的对比 四、inline(内联函数…...

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

Netty从入门到进阶(二)
二、Netty入门 1. 概述 1.1 Netty是什么 Netty is an asynchronous event-driven network application framework for rapid development of maintainable high performance protocol servers & clients. Netty是一个异步的、基于事件驱动的网络应用框架,用于…...
jmeter聚合报告中参数详解
sample、average、min、max、90%line、95%line,99%line、Error错误率、吞吐量Thoughput、KB/sec每秒传输的数据量 sample(样本数) 表示测试中发送的请求数量,即测试执行了多少次请求。 单位,以个或者次数表示。 示例:…...
LCTF液晶可调谐滤波器在多光谱相机捕捉无人机目标检测中的作用
中达瑞和自2005年成立以来,一直在光谱成像领域深度钻研和发展,始终致力于研发高性能、高可靠性的光谱成像相机,为科研院校提供更优的产品和服务。在《低空背景下无人机目标的光谱特征研究及目标检测应用》这篇论文中提到中达瑞和 LCTF 作为多…...