红包雨项目前端部分

创建项目

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.rhkb.cn/news/13752.html

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

相关文章

深入理解k8s中的容器存储接口(CSI)

CSI出现的原因 K8s原生支持一些存储类型的PV&#xff0c;像iSCSI、NFS等。但这种方式让K8s代码与三方存储厂商代码紧密相连&#xff0c;带来不少麻烦。比如更改存储代码就得更新K8s组件&#xff0c;成本高&#xff1b;存储代码的bug还会影响K8s稳定性&#xff1b;K8s社区维护和…

DeepSeek回答禅宗三重境界重构交易认知

人都是活在各自心境里&#xff0c;有些话通过语言去交流&#xff0c;还是要回归自己心境内在的&#xff0c;而不是靠外在映射到股票和技术方法&#xff1b;比如说明天市场阶段是不修复不接力节点&#xff0c;这就是最高视角看整个市场&#xff0c;还有哪一句话能概括&#xff1…

简单说一下CAP理论和Base理论

CAP理论 什么是CAP 一致性 可用性 分区容错性&#xff1a;系统如果不能再时限内达成数据一致性&#xff0c;就说明发生了分区的情况 然后当前操作在C和A之间做出选择 例如我的网络出现问题了&#xff0c;但是我们的系统不能因为网络问题就直接崩溃 只要我们的分布式系统没…

13.PPT:诺贝尔奖【28】

目录 NO1234 NO567 NO8/9/10 NO11/12 NO1234 设计→变体→字体→自定义字体 SmartArt超链接新增加节 NO567 版式删除图片中的白色背景&#xff1a;选中图片→格式→删除背景→拖拉整个图片→保留更改插入→图表→散点图 &#xff1a;图表图例、网格线、坐标轴和图表标题…

RabbitMQ的安装

1、官网地址 下载地址&#xff1a;Installing RabbitMQ | RabbitMQhttp://www.rabbitmq.com/download.htmlhttp://www.rabbitmq.com/download.html RabbitMQ Documentation | RabbitMQhttps://www.rabbitmq.com/docshttps://www.rabbitmq.com/docs 2、Windows上安装 2.1 安装…

【LeetCode】152、乘积最大子数组

【LeetCode】152、乘积最大子数组 文章目录 一、dp1.1 dp1.2 简化代码 二、多语言解法 一、dp 1.1 dp 从前向后遍历, 当遍历到 nums[i] 时, 有如下三种情况 能得到最大值: 只使用 nums[i], 例如 [0.1, 0.3, 0.2, 100] 则 [100] 是最大值使用 max(nums[0…i-1]) * nums[i], 例…

【分布式理论六】分布式调用(4):服务间的远程调用(RPC)

文章目录 一、RPC 调用过程二、RPC 动态代理&#xff1a;屏蔽远程通讯细节1. 动态代理示例2. 如何将动态代理应用于 RPC 三、RPC 序列化四、RPC 协议编码1. 协议编码的作用2. RPC 协议消息组成 五、RPC 网络传输1. 网络传输流程2. 关键优化点 一、RPC 调用过程 RPC&#xff08…

Spring Task之Cron表达式

&#x1f31f; Spring Task高能预警&#xff1a;你以为的Cron表达式可能都是错的&#xff01;【附实战避坑指南】 开篇暴击&#xff1a;为什么你的定时任务总在凌晨3点翻车&#xff1f; “明明设置了0 0 2 * * ?&#xff0c;为什么任务每天凌晨3点执行&#xff1f;” —— 来…

第16章 Single Thread Execution设计模式(Java高并发编程详解:多线程与系统设计)

简单来说&#xff0c; Single Thread Execution就是采用排他式的操作保证在同一时刻只能有一个线程访问共享资源。 1.机场过安检 1.1非线程安全 先模拟一个非线程安全的安检口类&#xff0c;旅客(线程)分别手持登机牌和身份证接受工作人员的检查&#xff0c;示例代码如所示。…

OSPF基础(2):数据包详解

OSPF数据包(可抓包) OSPF报文直接封装在IP报文中&#xff0c;协议号89 头部数据包内容&#xff1a; 版本(Version):对于OSPFv2&#xff0c;该字段值恒为2(使用在IPV4中)&#xff1b;对于OSPFv3&#xff0c;该字段值恒为3(使用在IPV6中)。类型(Message Type):该OSPF报文的类型。…

MAC 安装mysql全过程记录

4.然后等待下载吧&#xff0c;&#xff08;下载中。。。。&#xff09;&#xff0c;好了&#xff0c;网速的问题&#xff0c;半个小时终于下载好了&#xff0c;开始安装吧。 5.得到如下安装包&#xff0c;mac下也是双击直接下载&#xff0c;来&#xff0c;我们来看看下载的过程…

神经网络常见激活函数 1-sigmoid函数

sigmoid 1 函数求导 sigmoid函数 σ ( x ) 1 1 e ( − x ) \sigma(x) \frac{1}{1e^{(-x)}} σ(x)1e(−x)1​ sigmoid函数求导 d d x σ ( x ) d d x ( 1 1 e − x ) e − x ( 1 e − x ) 2 ( 1 e − x ) − 1 ( 1 e − x ) 2 1 1 e − x − 1 ( 1 e − x ) 2 …

微软发布基于PostgreSQL的开源文档数据库平台DocumentDB

我们很高兴地宣布正式发布DocumentDB——一个开源文档数据库平台&#xff0c;以及基于 vCore、基于 PostgreSQL 构建的 Azure Cosmos DB for MongoDB 的引擎。 过去&#xff0c;NoSQL 数据库提供云专用解决方案&#xff0c;而没有通用的互操作性标准。这导致对可互操作、可移植…

【苍穹外卖 Day1】前后端搭建 Swagger导入接口文档

项目技术选型 前端 直接使用打包好的nginx运行。 后端 1、导入初始代码结构如下&#xff1a; 2、将代码上传远程仓库。 3、创建数据库&#xff0c;并修改数据库配置。 4、断点调试&#xff0c;前后端联调。 5、使用Nginx代理&#xff0c;修改Nginx配置 好处&#xff1a;提…

零基础Vue入门6——Vue router

本节重点&#xff1a; 路由定义路由跳转 前面几节学习的都是单页面的功能&#xff08;都在专栏里面https://blog.csdn.net/zhanggongzichu/category_12883540.html&#xff09;&#xff0c;涉及到项目研发都是有很多页面的&#xff0c;这里就需要用到路由&#xff08;vue route…

深度学习里面的而优化函数 Adam,SGD,动量法,AdaGrad 等 | PyTorch 深度学习实战

前一篇文章&#xff0c;使用线性回归模型逼近目标模型 | PyTorch 深度学习实战 本系列文章 GitHub Repo: https://github.com/hailiang-wang/pytorch-get-started 本篇文章内容来自于 强化学习必修课&#xff1a;引领人工智能新时代【梗直哥瞿炜】 深度学习里面的而优化函数 …

mybatis-plus updateById源码

1.版本 : mybatis-plus-core 3.5.1 2.入口:MybatisPlusAutoConfiguration类sqlSessionFactory中的factory.getObject() 3.注入AbstractSqlInjector类中的inspectInject方法中 Overridepublic void inspectInject(MapperBuilderAssistant builderAssistant, Class<?> m…

RabbitMQ 从入门到精通:从工作模式到集群部署实战(三)

文章目录 使用CLI管理RabbitMQrabbitmqctlrabbitmq-queuesrabbitmq-diagnosticsrabbitmq-pluginsrabbitmq-streamsrabbitmq-upgraderabbitmqadmin 使用CLI管理RabbitMQ RabbitMQ CLI 工具需要安装兼容的 Erlang/OTP版本。 这些工具假定系统区域设置为 UTF-8&#xff08;例如en…

PlanLLM: 首个支持开放词汇与封闭集任务的跨模态视频程序规划框架

2025年1月7号&#xff0c;由杨德杰、赵子敬、刘洋联合提出PlanLLM&#xff0c;一种基于可微调大型语言模型&#xff08;LLM&#xff09;的跨模态联合学习框架&#xff0c;用于解决视频程序规划任务。通过引入LLM增强规划模块和互信息最大化模块&#xff0c;PlanLLM突破了现有方…

WGCLOUD监控系统部署教程

官网地址&#xff1a;下载WGCLOUD安装包 - WGCLOUD官网 第一步、环境配置 #安装jdk 1、安装 EPEL 仓库&#xff1a; sudo yum install -y epel-release 2、安装 OpenJDK 11&#xff1a; sudo yum install java-11-openjdk-devel 3、如果成功&#xff0c;你可以通过运行 java …