红包雨项目前端部分

创建项目

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

负载均衡

压测

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

蓝桥杯嵌入式备赛(三)—— LED +按键 + LCD

目录 一、LED1、原理图介绍2、程序代码 二、按键1、原理图介绍2、程序代码 三、LCD1、原理图介绍2、程序代码 一、LED 1、原理图介绍 如果所示&#xff0c;STM32G431RBT6中有八个LED&#xff0c;由八个GPIO控制&#xff0c;分别为PC8-15&#xff0c;当输出为低电平时点亮。其中…

[Java基础]函数式编程

Lambda函数 JDK8新增的语法形式, 使用Lambda函数替代某些匿名内部类对象&#xff0c;从而让程序代码更简洁&#xff0c;可读性更好。 基本使用 lambda表达式只能简化函数式接口的匿名内部类写法 // 1.定义抽象类 abstract class Animal {public abstract void crt(); }publi…

Vim 多窗口编辑及文件对比

水平分割 :split 默认使用水平分割的方式。 :split :sp 垂直分割 :vsplit :vs 带文件的分割 :split 文件名 :sp 文件名 在光标所在的窗口&#xff0c;输入分割窗口命令就会对那个窗口进行分割。 切换窗口 Ctrlw 切换正在编辑的窗口 快速分割窗口 Ctrlwn 快速分割当前…

二级C语言题解:十进制转其他进制、非素数求和、重复数统计

目录 一、程序填空&#x1f4dd; --- 十进制转其他进制 题目&#x1f4c3; 分析&#x1f9d0; 二、程序修改&#x1f6e0;️ --- 非素数求和 题目&#x1f4c3; 分析&#x1f9d0; 三、程序设计&#x1f4bb; --- 重复数统计 题目&#x1f4c3; 分析&#x1f9d0; 前言…

使用服务器部署DeepSeek-R1模型【详细版】

文章目录 引言deepseek-r1IDE或者终端工具算力平台体验deepseek-r1模型总结 引言 在现代的机器学习和深度学习应用中&#xff0c;模型部署和服务化是每个开发者面临的重要任务。无论是用于智能推荐、自然语言处理还是图像识别&#xff0c;如何高效、稳定地将深度学习模型部署到…

央行发布《贸易金融分布式账本技术要求》,参考架构包括5部分

《银行科技研究社》(作者 木子剑):2024年12月11日,中国人民银行发布金融行业标准《贸易金融分布式账本技术要求》(JR/T 0308-2024)(以下简称“《要求》”),当日实施。据悉,该文件的起草单位包括6大行和多家股份制银行等。 《要求》规定了分布式账本技术在贸易金融领域…

Python aiortc API

本研究的主要目的是基于Python aiortc api实现抓取本地设备媒体流&#xff08;摄像机、麦克风&#xff09;并与Web端实现P2P通话。本文章仅仅描述实现思路&#xff0c;索要源码请私信我。 1 demo-server解耦 1.1 原始代码解析 1.1.1 http服务器端 import argparse import …

记录 | WPF基础学习Style局部和全局调用

目录 前言一、Style1.1 例子1.2 为样式起名字1.3 BasedOn 继承上一个样式 二、外部StyleStep1 创建资源字典BaseButtonStyle.xamlStep2 在资源字典中写入StyleStep3 App.xaml中写引用路径【全局】Step4 调用三、代码提供四、x:Key和x:Name区别 更新时间 前言 参考文章&#xff…

吴恩达深度学习——卷积神经网络实例分析

内容来自https://www.bilibili.com/video/BV1FT4y1E74V&#xff0c;仅为本人学习所用。 文章目录 LeNet-5AlexNetVGG-16ResNets残差块 1*1卷积 LeNet-5 输入层&#xff1a;输入为一张尺寸是 32 32 1 32321 32321的图像&#xff0c;其中 32 32 3232 3232是图像的长和宽&…

【Uniapp-Vue3】z-paging插件组件实现触底和下拉加载数据

一、下载z-paing插件 注意下载下载量最多的这个 进入Hbuilder以后点击“确定” 插件的官方文档地址&#xff1a; https://z-paging.zxlee.cn 二、z-paging插件的使用 在文档中向下滑动&#xff0c;会有使用方法。 使用z-paging标签将所有的内容包起来 配置标签中的属性 在s…

【B站保姆级视频教程:Jetson配置YOLOv11环境(七)Ultralytics YOLOv11配置】

Jetson配置YOLOv11环境&#xff08;7&#xff09;Ultralytics YOLOv11环境配置 文章目录 1. 下载YOLOv11 github项目2. 安装ultralytics包3. 验证ultralytics安装3.1 下载yolo11n.pt权重文件3.2 推理 1. 下载YOLOv11 github项目 创建一个目录&#xff0c;用于存放YOLOv11的项目…

第二天:系统从BIOS/UEFI到GRUB/bootloader的启动过程

目录 **一、BIOS/UEFI初始化阶段****二、引导加载程序&#xff08;GRUB&#xff09;的启动过程****1. BIOS模式下的GRUB分阶段加载****2. UEFI模式下的GRUB加载** **三、操作系统内核加载与初始化****四、关键组件与配置文件****五、故障排查与恢复****总结**常见问题如何在UEF…

【容器技术01】使用 busybox 构建 Mini Linux FS

使用 busybox 构建 Mini Linux FS 构建目标 在 Linux 文件系统下构建一个 Mini 的文件系统&#xff0c;构建目标如下&#xff1a; minilinux ├── bin │ ├── ls │ ├── top │ ├── ps │ ├── sh │ └── … ├── dev ├── etc │ ├── g…

【C语言系列】深入理解指针(5)

深入理解指针&#xff08;5&#xff09; 一、sizeof和strlen的对比1.1sizeof1.2strlen1.3sizeof和strlen的对比 二、数组和指针笔试题解析2.1 一维数组2.2 字符数组2.2.1代码1&#xff1a;2.2.2代码2&#xff1a;2.2.3代码3&#xff1a;2.2.4代码4&#xff1a;2.2.5代码5&#…

【蓝桥杯嵌入式】2_LED

1、电路图 74HC573是八位锁存器&#xff0c;当控制端LE脚为高电平时&#xff0c;芯片“导通”&#xff0c;LE为低电平时芯片“截止”即将输出状态“锁存”&#xff0c;led此时不会改变状态&#xff0c;所以可通过led对应的八个引脚的电平来控制led的状态&#xff0c;原理图分析…

Diskgenius系统迁移之后无法使用USB启动

前言 本文用于记录系统迁移中遇到的问题及解决方法&#xff0c;如有不对请指出&#xff0c;谢谢&#xff01; 现象 使用DiskGenius进行系统迁移后&#xff0c;使用USB启动失败&#xff0c;反复在品牌logo和黑屏之间切换&#xff0c;期间还会在左上角显示”reset system“报错…

SQL Server 数据库备份指南

SQL Server备份是数据库维护的日常工作。备份的目的是在发生数据丢失、损坏甚至硬件故障时将数据库和事务日志恢复到最近的时间点。您可以借助专业的SQL Server备份软件,操作起来更方便。前提需要安装SQL Server Management Studio (SSMS)工具。 对于 SQL 数据库备份,有多种…

SpringAI介绍及本地模型使用方法

博客原文地址 前言 Spring在Java语言中一直稳居高位&#xff0c;与AI的洪流碰撞后也产生了一些有趣的”化学反应“&#xff0c;当然你要非要说碰撞属于物理反应也可以&#xff0c; 在经历了一系列复杂的反应方程后&#xff0c;Spring家族的新成员——SpringAI&#xff0c;就…

ip地址是手机号地址还是手机地址

在数字化生活的浪潮中&#xff0c;IP地址、手机号和手机地址这三个概念如影随形&#xff0c;它们各自承载着网络世界的独特功能&#xff0c;却又因名称和功能的相似性而时常被混淆。尤其是“IP地址”这一术语&#xff0c;经常被错误地与手机号地址或手机地址划上等号。本文旨在…

车载以太网__传输层

车载以太网中&#xff0c;传输层和实际用的互联网相差无几。本篇文章对传输层中的IP进行介绍 目录 什么是IP&#xff1f; IP和MAC的关系 IP地址分类 私有IP NAT DHCP 为什么要防火墙穿透&#xff1f; 广播 本地广播 直接广播 本地广播VS直接广播 组播 …