低代码可视化-转盘小游戏可视化-代码生成器

news2025/1/24 6:12:35

转盘小程序是一种互动工具,它通过模拟真实的转盘抽奖或决策体验,为用户提供了一种有趣且公平的选择方式。以下是对转盘小程序的详细介绍:

转盘小程序的应用场景

日常决策:转盘小程序可以帮助用户解决日常生活中的选择困难问题,如决定晚餐吃什么、周末去哪里玩等。
聚会游戏:在聚会或派对中,转盘小程序可以作为互动游戏,增添欢乐气氛。用户可以自定义转盘内容,如真心话大冒险、喝酒游戏等。
企业活动:转盘小程序也常被用于企业年会、新品发布、客户答谢等活动中,作为抽奖或互动环节,提升现场气氛并收集参与者信息。


转盘小程序的特点

用户友好:转盘小程序通常具有直观易用的界面,用户无需编程基础即可快速上手。
高度可定制:用户可以根据自己的需求自定义转盘样式、选项、概率等,满足特定场景下的使用需求。
互动性强:转盘小程序支持分享功能,用户可以将自己制作的转盘分享给朋友或家人,一起享受互动的乐趣。
数据收集:在企业活动中,转盘小程序可以帮助主办方收集参与者信息,为后续营销活动提供数据支持。

功能设计 

大转盘组件

拖进一个转盘组件进设计器。

转盘中奖自定义

转盘中奖项通过子表单用户快速自定义

实现代码如下

<template>
	<view class="container container334706">
		<u-form-item :borderBottom="false" v-if="!showForm && globalData.isshow" class="diygw-col-24 title-clz" labelPosition="top" prop="title">
			<u-input @blur="listApi" :data-title_like="title" :focus="titleFocus" placeholder="请输入产品标题" v-model="title"></u-input>
			<text @tap="navigateTo" data-type="listApi" :data-title_like="title" class="diy-icon-search" style="color: #363636; font-size: 32rpx"></text>
		</u-form-item>
		<view v-if="!showForm && list.total > 0" class="flex flex-wrap diygw-col-24 flex-direction-column">
			<view v-for="(item, index) in list.rows" :key="index" class="flex flex-wrap diygw-col-24 flex-direction-column flex4-clz" @tap="navigateTo" data-type="page" data-url="/pages/index" :data-id="item.id" data-redirect="1">
				<text class="diygw-text-line2 diygw-col-24 text1-clz">
					{
  
  { item.title }}
				</text>
				<text v-if="item.remark" class="diygw-text-line3 diygw-col-24 text2-clz">
					{
  
  { item.remark }}
				</text>
				<view class="flex flex-wrap diygw-col-24 justify-end items-center flex2-clz">
					<text @tap.stop="navigateTo" data-type="editFunction" :data-index="index" class="diygw-col-0 text6-clz"> 修改 </text>
					<text @tap.stop="navigateTo" data-type="copyApi" :data-id="item.id" :data-index="index" class="diygw-col-0 text4-clz"> 复制 </text>
					<text @tap.stop="navigateTo" data-type="delApi" :data-id="item.id" :data-index="index" class="diygw-col-0 text13-clz"> 删除 </text>
				</view>
			</view>
		</view>
		<view v-if="!showForm && globalData.isshow && (globalOption.isself || userInfo.username == 'admin')" class="flex flex-wrap diygw-col-24 justify-start diygw-bottom flex3-clz">
			<view class="flex flex-wrap diygw-col-24 justify-center items-center green flex20-clz" @tap="showForm = true">
				<text class="flex icon2 diygw-col-0 diy-icon-add"></text>
				<text class="diygw-col-0"> 新增转盘 </text>
			</view>
		</view>
		<view v-if="globalData.isshow && list.code == 200 && list.total == 0" class="flex flex-wrap diygw-col-24 flex-direction-column items-center flex-clz">
			<image src="/static/zwjl.png" class="image-size diygw-image diygw-col-0" mode="widthFix"></image>
			<text class="diygw-col-0 text-clz"> 未找到任何数据 </text>
		</view>
		<u-form :model="form" :rules="formRules" :errorType="['message', 'toast']" ref="formRef" v-if="showForm" class="flex diygw-form diygw-col-24 form-clz">
			<view class="flex flex-wrap diygw-col-24 flex-direction-column flex1-clz">
				<u-form-item class="diygw-col-24" :required="true" label="转盘标题" prop="title">
					<u-input :focus="formData.titleFocus" placeholder="请输入标题" v-model="form.title"></u-input>
				</u-form-item>
				<u-form-item class="diygw-col-24" label="转盘描述" prop="remark">
					<u-input maxlength="200" height="60px" class="" placeholder="请输入提示信息" v-model="form.remark" type="textarea"></u-input>
				</u-form-item>
				<view class="flex flex-wrap diygw-col-24">
					<view class="diygw-col-24" v-for="(configItem, configIndex) in form.config" :key="configIndex">
						<u-form class="diygw-col-24" :model="form.config[configIndex]" :errorType="['message', 'toast']" ref="configRef" :rules="configItemRules">
							<view class="flex flex-wrap diygw-col-24 flex-direction-column flex5-clz">
								<u-form-item class="diygw-col-24" label="奖项" prop="text">
									<u-input :focus="formData.configItemDatas[configIndex].textFocus" placeholder="请输入奖项" v-model="configItem.text"></u-input>
								</u-form-item>
								<u-form-item class="diygw-col-24" label="中奖率" prop="range">
									<u-input :focus="formData.configItemDatas[configIndex].rangeFocus" placeholder="请输入提示信息" v-model="configItem.range"></u-input>
								</u-form-item>
								<u-form-item class="diygw-col-24" label="奖项背景色" prop="background">
									<u-input @tap="formData.configItemDatas[configIndex].showBackground = true" placeholder="请输入奖项背景色,不填写默认生成" v-model="configItem.background"></u-input>
									<text class="diygw-text-lg diy-icon-colorlens" @tap="formData.configItemDatas[configIndex].showBackground = true" :style="{ color: configItem.background }"></text>
									<diy-color-picker v-model="formData.configItemDatas[configIndex].showBackground" :hexcolor="configItem.background" @confirm="changeConfigItemBackground($event, configIndex, configItem)"></diy-color-picker>
								</u-form-item>
							</view>
						</u-form>
						<view class="formconfigtools flex justify-end">
							<button @tap="upConfigItem" :data-index="configIndex" class="diygw-btn flex-sub radius margin-xs"><text class="button-icon diy-icon-fold"></text> 上移</button>
							<button @tap="downConfigItem" :data-index="configIndex" class="diygw-btn flex-sub radius margin-xs"><text class="button-icon diy-icon-unfold"></text> 下移</button>
							<button @tap="addConfigItem" :data-index="configIndex" class="diygw-btn flex-sub radius margin-xs"><text class="button-icon diy-icon-add"></text> 新增</button>
							<button @tap="delConfigItem" :data-index="configIndex" class="diygw-btn flex-sub radius margin-xs"><text class="button-icon diy-icon-close"></text> 删除</button>
						</view>
					</view>
				</view>
			</view>
			<view class="flex diygw-col-24">
				<button @tap="showForm = false" class="diygw-btn red radius flex-sub margin-xs button-button-clz">取消</button>
				<button @click="submitForm" class="diygw-btn green radius flex-sub margin-xs button-button-clz">保存</button>
			</view>
		</u-form>
		<view class="clearfix"></view>
	</view>
</template>

<script>
	export default {
		data() {
			return {
				//用户全局信息
				userInfo: {},
				//页面传参
				globalOption: {},
				//自定义全局变量
				globalData: { isshow: false },
				listNum: 1,
				list: {
					rows: [
						{
							id: 0,
							title: '',
							remark: '',
							img: '',
							userId: 0,
							createTime: '',
							updateTime: '',
							deleteTime: null
						}
					],
					total: 0,
					code: 0,
					msg: ''
				},
				copy: {
					code: 200,
					msg: '复制成功'
				},
				del: {
					code: 200,
					msg: '删除成功'
				},
				titleFocus: false,
				title: '',
				showForm: false,
				formRules: {
					title: [
						{
							trigger: ['change', 'blur'],
							required: true,
							message: '标题不能为空'
						}
					]
				},
				form: {
					title: '',
					remark: '',
					config: []
				},
				formData: {
					titleFocus: false,
					configItemDatas: []
				},
				configItemRules: {},
				configItemData: {
					textFocus: false,
					rangeFocus: false,
					showBackground: false
				},
				configItem: {
					text: '',
					range: '',
					background: ''
				}
			};
		},
		onShow() {
			this.setCurrentPage(this);
		},
		onLoad(option) {
			this.setCurrentPage(this);
			if (option) {
				this.setData({
					globalOption: this.getOption(option)
				});
			}

			this.init();
		},
		onReady() {
			this.$refs.formRef?.setRules(this.formRules);
			this.initConfigData();
		},
		methods: {
			async init() {
				await this.listApi();
				await this.initResetform();
			},
			// 列表数据 API请求方法
			async listApi(param) {
				let thiz = this;
				param = param || {};

				//如果请求要重置页面,请配置点击附加参数refresh=1  增加判断如输入框回调param不是对象
				if (param.refresh || typeof param != 'object') {
					this.listNum = 1;
				}

				//请求地址及请求数据,可以在加载前执行上面增加自己的代码逻辑
				let http_url = '/game/project/list';
				let http_data = {
					pageNum: this.listNum,
					pageSize: 10,
					title_like: param.title_like || this.title
				};
				let http_header = {};

				if (!this.globalOption.isself) {
					http_data.userId = '1';
				} else {
					http_data.isself = '1';
				}

				let list = await this.$http.post(http_url, http_data, http_header, 'json');

				let datarows = list.rows;
				if (http_data.pageNum == 1) {
					this.list = list;
				} else if (datarows) {
					let rows = this.list.rows.concat(datarows);
					list.rows = rows;
					this.list = Object.assign(this.list, list);
				}
				if (datarows && datarows.length > 0) {
					this.listNum = this.listNum + 1;
				}
				this.globalData.isshow = true;
			},
			// 复制数据 API请求方法
			async copyApi(param) {
				let thiz = this;
				param = param || {};

				//请求地址及请求数据,可以在加载前执行上面增加自己的代码逻辑
				let http_url = '/game/project/copy';
				let http_data = {
					id: param.id || this.item.id || '1',
					index: param.index || this.index
				};
				let http_header = {};

				let flag = await this.showModal('是否确定复制该数据');
				if (!flag) {
					this.showToast('你已取消删');
					return;
				}

				let copy = await this.$http.post(http_url, http_data, http_header, 'json');

				this.copy = copy;
				await this.listApi({ refresh: 1 });
			},
			// 删除数据 API请求方法
			async delApi(param) {
				let thiz = this;
				param = param || {};

				//请求地址及请求数据,可以在加载前执行上面增加自己的代码逻辑
				let http_url = '/game/project/del';
				let http_data = {
					id: param.id || this.item.id,
					index: param.index || this.index
				};
				let http_header = {};

				let flag = await this.showModal('是否确定删除该数据');
				if (!flag) {
					this.showToast('你已取消删');
					return;
				}

				let del = await this.$http.post(http_url, http_data, http_header, 'json');

				this.del = del;
				if (del.code == 200) {
					this.list.rows.splice(param.index, 1);
					this.list.total = this.list.rows.length;
					this.showToast('删除数据成功');
				} else {
					this.showToast('删除数据失败', 'error');
				}
			},

			// 修改数据 自定义方法
			async editFunction(param) {
				let thiz = this;
				let index = param && (param.index || param.index == 0) ? param.index : thiz.index || '';
				let form = JSON.parse(JSON.stringify(this.list.rows[param.index]));
				form.config = JSON.parse(form.config);
				let configItemDatas = [];
				form.config.forEach((item) => {
					configItemDatas.push(JSON.parse(JSON.stringify(this.configItemData)));
				});
				this.formData.configItemDatas = configItemDatas;
				this.form = form;
				this.showForm = true;
			},
			//初始化显示子表单数据条数
			initConfigData() {
				for (let i = 0; i < 1; i++) {
					this.form.config.push(JSON.parse(JSON.stringify(this.configItem)));
					this.formData.configItemDatas.push(JSON.parse(JSON.stringify(this.configItemData)));
				}
				this.initConfigValid();
			},
			//子表单验证
			initConfigValid() {
				this.$nextTick(() => {
					this.$refs['configRef']?.forEach((subform) => {
						subform.setRules(this.configItemRules);
					});
				});
			},
			//上移子表单
			upConfigItem(evt) {
				let { index } = evt.currentTarget.dataset;
				if (index == 0) {
					this.navigateTo({
						type: 'tip',
						tip: '已经是第一个'
					});
					return false;
				}
				this.form.config[index] = this.form.config.splice(index - 1, 1, this.form.config[index])[0];
				this.formData.configItemDatas[index] = this.formData.configItemDatas.splice(index - 1, 1, this.formData.configItemDatas[index])[0];
				this.initConfigValid();
			},
			//下移子表单
			downConfigItem(evt) {
				let { index } = evt.currentTarget.dataset;
				if (index == this.form.config.length - 1) {
					this.navigateTo({
						type: 'tip',
						tip: '已经是最后一个'
					});
					return false;
				}
				this.form.config[index] = this.form.config.splice(index + 1, 1, this.form.config[index])[0];
				this.formData.configItemDatas[index] = this.formData.configItemDatas.splice(index + 1, 1, this.formData.configItemDatas[index])[0];
				this.initConfigValid();
			},
			//删除子表单
			delConfigItem(evt) {
				let { index } = evt.currentTarget.dataset;
				this.form.config.splice(index, 1);
				this.formData.configItemDatas.splice(index, 1);
				this.initConfigValid();
			},
			//增加子表单
			addConfigItem() {
				this.form.config.push(JSON.parse(JSON.stringify(this.configItem)));
				this.formData.configItemDatas.push(JSON.parse(JSON.stringify(this.configItemData)));
				this.initConfigValid();
			},
			//验证所有的子表单
			checkConfigValid() {
				let flag = true;
				this.$refs['configRef']?.forEach((subform) => {
					subform.validate((valid) => {
						if (!valid) {
							flag = false;
							return false;
						}
					});
				});
				return flag;
			},
			changeConfigItemBackground(evt, configIndex, configItem) {
				let result = evt.hex;
				configItem.background = result;
			},
			initResetform() {
				this.initform = JSON.stringify(this.form);
				//如果想给表单默认初始值,其中row为某一行数据也可能是API返回的结果集,然后给到this.form
				//this.form = this.$tools.changeRowToForm(row,this.form)
			},
			resetForm() {
				this.form = JSON.parse(this.initform);
			},

			async submitForm(e) {
				this.$refs.formRef?.setRules(this.formRules);

				this.initConfigValid();
				this.$nextTick(async () => {
					let configvalid = await this.checkConfigValid();
					let valid = await this.$refs.formRef.validate();
					if (valid && configvalid) {
						//保存数据
						let param = this.form;
						let header = {
							'Content-Type': 'application/json'
						};
						let url = '/game/project/add';

						if (this.form.id) {
							url = '/game/project/update';
						}
						uni.showLoading({
							title: '正在保存...'
						});
						let res = await this.$http.post(url, param, header, 'json');
						uni.hideLoading();
						if (res.code == 200) {
							//更新列表数据
							this.listNum = 1;
							this.listApi();
							if (this.form.id) {
								this.showToast('更新成功');
								//关闭表单
								this.showForm = false;
							} else {
								//提示是否继续新增
								let flag = await this.showModal('是否继续新增');
								if (flag) {
									//重置表单
									this.resetForm();
								} else {
									//关闭窗口
									this.showForm = false;
								}
							}
						} else {
							this.showModal(res.msg, '提示', false);
						}
					} else {
						console.log('验证失败');
					}
				});
			}
		},
		onPullDownRefresh() {
			// 列表数据 API请求方法
			this.listNum = 1;
			this.listApi();

			uni.stopPullDownRefresh();
		},
		onReachBottom() {
			// 列表数据 API请求方法
			this.listApi();
		}
	};
</script>

<style lang="scss" scoped>
	.title-clz {
		background-color: #ffffff;
		margin-left: 16rpx;
		border-bottom-left-radius: 12rpx;
		overflow: hidden;
		width: calc(100% - 16rpx - 16rpx) !important;
		border-top-left-radius: 12rpx;
		margin-top: 16rpx;
		border-top-right-radius: 12rpx;
		border-bottom-right-radius: 12rpx;
		margin-bottom: 16rpx;
		margin-right: 16rpx;
	}
	.flex4-clz {
		padding-top: 10rpx;
		border-bottom-left-radius: 12rpx;
		padding-left: 10rpx;
		padding-bottom: 10rpx;
		border-top-right-radius: 12rpx;
		margin-right: 20rpx;
		background-color: #ffffff;
		margin-left: 20rpx;
		overflow: hidden;
		width: calc(100% - 20rpx - 20rpx) !important;
		border-top-left-radius: 12rpx;
		margin-top: 10rpx;
		border-bottom-right-radius: 12rpx;
		margin-bottom: 10rpx;
		padding-right: 10rpx;
	}
	.text1-clz {
		padding-top: 10rpx;
		padding-left: 10rpx;
		font-size: 28rpx !important;
		padding-bottom: 10rpx;
		padding-right: 10rpx;
	}
	.text2-clz {
		padding-top: 10rpx;
		color: #7c7c7c;
		padding-left: 10rpx;
		padding-bottom: 10rpx;
		padding-right: 10rpx;
	}
	.flex2-clz {
		border-top: 2rpx solid #eee;
		padding-top: 10rpx;
		color: #6b6b6b;
		padding-left: 10rpx;
		padding-bottom: 10rpx;
		padding-right: 10rpx;
	}
	.text6-clz {
		border: 2rpx solid #038af2;
		padding-top: 10rpx;
		border-bottom-left-radius: 10rpx;
		color: #038af2;
		padding-left: 20rpx;
		padding-bottom: 10rpx;
		border-top-right-radius: 10rpx;
		margin-right: 10rpx;
		background-color: #f0f1ff;
		margin-left: 10rpx;
		overflow: hidden;
		border-top-left-radius: 10rpx;
		margin-top: 10rpx;
		border-bottom-right-radius: 10rpx;
		margin-bottom: 10rpx;
		padding-right: 20rpx;
	}
	.text4-clz {
		border: 2rpx solid #038af2;
		padding-top: 10rpx;
		border-bottom-left-radius: 10rpx;
		color: #038af2;
		padding-left: 20rpx;
		padding-bottom: 10rpx;
		border-top-right-radius: 10rpx;
		margin-right: 10rpx;
		background-color: #f0f1ff;
		margin-left: 10rpx;
		overflow: hidden;
		border-top-left-radius: 10rpx;
		margin-top: 10rpx;
		border-bottom-right-radius: 10rpx;
		margin-bottom: 10rpx;
		padding-right: 20rpx;
	}
	.text13-clz {
		border: 2rpx solid #ffb08f;
		padding-top: 10rpx;
		border-bottom-left-radius: 10rpx;
		color: #ff592c;
		padding-left: 20rpx;
		padding-bottom: 10rpx;
		border-top-right-radius: 10rpx;
		margin-right: 10rpx;
		background-color: #fff4f0;
		margin-left: 10rpx;
		overflow: hidden;
		border-top-left-radius: 10rpx;
		margin-top: 10rpx;
		border-bottom-right-radius: 10rpx;
		margin-bottom: 10rpx;
		padding-right: 20rpx;
	}
	.flex3-clz {
		padding-top: 16rpx;
		border-bottom-left-radius: 0rpx;
		color: #747474;
		bottom: 0rpx;
		padding-left: 16rpx;
		padding-bottom: 16rpx;
		border-top-right-radius: 20rpx;
		background-color: #ffffff;
		overflow: hidden;
		left: 0rpx;
		border-top-left-radius: 20rpx;
		border-bottom-right-radius: 0rpx;
		padding-right: 16rpx;
	}
	.flex20-clz {
		padding-top: 16rpx;
		border-bottom-left-radius: 200rpx;
		overflow: hidden;
		font-weight: bold;
		padding-left: 10rpx;
		font-size: 28rpx !important;
		padding-bottom: 16rpx;
		border-top-left-radius: 200rpx;
		border-top-right-radius: 200rpx;
		border-bottom-right-radius: 200rpx;
		padding-right: 10rpx;
	}
	.icon2 {
		font-size: 40rpx;
	}
	.flex-clz {
		padding-top: 20rpx;
		padding-left: 20rpx;
		padding-bottom: 20rpx;
		padding-right: 20rpx;
	}
	.image-size {
		height: 400rpx !important;
		width: 400rpx !important;
	}
	.text-clz {
		color: #969696;
		font-size: 28rpx !important;
	}
	.form-clz {
		padding-top: 10rpx;
		border-bottom-left-radius: 12rpx;
		padding-left: 10rpx;
		padding-bottom: 10rpx;
		border-top-right-radius: 12rpx;
		margin-right: 20rpx;
		background-color: #ffffff;
		margin-left: 20rpx;
		overflow: hidden;
		width: calc(100% - 20rpx - 20rpx) !important;
		border-top-left-radius: 12rpx;
		margin-top: 10rpx;
		border-bottom-right-radius: 12rpx;
		margin-bottom: 10rpx;
		padding-right: 10rpx;
	}
	.flex1-clz {
		overflow: auto;
	}
	.formconfigtools {
		position: absolute;
		z-index: 1;
		right: 30rpx;
		bottom: 16rpx;
	}
	.formconfigtools .diygw-btn {
		padding: 5px;
		height: auto;
		flex: inherit;
		border-radius: 20px;
	}
	.flex5-clz {
		border: 2rpx solid #eee;
		padding-top: 10rpx;
		border-bottom-left-radius: 12rpx;
		padding-left: 10rpx;
		padding-bottom: 80rpx;
		border-top-right-radius: 12rpx;
		margin-right: 10rpx;
		margin-left: 10rpx;
		overflow: hidden;
		width: calc(100% - 10rpx - 10rpx) !important;
		border-top-left-radius: 12rpx;
		margin-top: 10rpx;
		border-bottom-right-radius: 12rpx;
		margin-bottom: 10rpx;
		padding-right: 10rpx;
	}
	.button-button-clz {
		margin: 6rpx !important;
	}
	.container334706 {
		padding-bottom: 160rpx;
		background-color: #f5f5f5;
	}
</style>

点击列表传id进转盘页面

首页获取转盘ID

根据用户维护的列表id动态显示出来。

<template>
	<view class="container container334706">
		<view v-if="isshow" class="flex flex-wrap diygw-col-24 flex-direction-column items-center flex-clz">
			<view class="diygw-col-24">
				<diy-lucky-wheel ref="refPrize" width="600rpx" height="600rpx" :blocks="prizeConfig.blocks" :prizes="prizeConfig.prizes" :buttons="prizeConfig.buttons" :defaultStyle="prizeConfig.defaultStyle" :defaultConfig="prizeConfig.defaultConfig" @start="startPrize" @end="endPrize"></diy-lucky-wheel>
			</view>
			<view class="flex flex-wrap diygw-col-24 justify-center flex1-clz">
				<text @tap="navigateTo" data-type="page" data-url="/pages/records" class="diygw-col-0 more-clz"> 热门转盘 </text>
				<text @tap="navigateTo" data-type="page" data-url="/pages/records" data-isself="1" class="diygw-col-0 text-clz"> 我的转盘 </text>
			</view>
		</view>
		<view class="clearfix"></view>
	</view>
</template>

<script>
	export default {
		data() {
			return {
				//用户全局信息
				userInfo: {},
				//页面传参
				globalOption: {},
				//自定义全局变量
				globalData: {},
				dataNum: 1,
				data: {
					code: 0,
					msg: '',
					data: {
						id: 0,
						title: '',
						config: '',
						remark: '',
						userId: 0,
						createTime: '',
						updateTime: '',
						deleteTime: null
					}
				},
				isshow: false,
				prize: undefined,
				prizeConfig: {
					blocks: [{ padding: '0' }],
					prizes: [
						{ range: 1, background: '#fea832', fonts: [{ text: '一等奖', top: '20' }], imgs: [{ src: '/static/ps.png', top: '50', width: '50px' }] },
						{ range: 1, background: '#fedb41', fonts: [{ text: '二等奖', top: '20' }] },
						{ range: 1, background: '#fea832', fonts: [{ text: '三等奖', top: '20' }] },
						{ range: 1, background: '#fedb41', fonts: [{ text: '四等奖', top: '20' }] },
						{ range: 1, background: '#fea832', fonts: [{ text: '五等奖', top: '20' }] },
						{ range: 1, background: '#fedb41', fonts: [{ text: '谢谢参与', top: '20' }] }
					],
					buttons: [
						{ radius: '40%', background: '#f44b24' },
						{ radius: '35%', background: '#fea832' },
						{ radius: '30%', background: '#ffecbf', pointer: true, fonts: [{ text: '开始', top: '-25' }] },
						{ radius: '30%', pointer: true, fonts: [{ text: '抽奖' }] }
					],
					defaultStyle: { gutter: 0, speed: 20, accelerationTime: 2500, decelerationTime: 2500 }
				}
			};
		},
		onShow() {
			this.setCurrentPage(this);
		},
		onLoad(option) {
			this.setCurrentPage(this);
			if (option) {
				this.setData({
					globalOption: this.getOption(option)
				});
			}

			this.init();
		},
		methods: {
			async init() {
				await this.dataApi();
				await this.isloginFunction();
			},
			// 列表数据 API请求方法
			async dataApi(param) {
				let thiz = this;
				param = param || {};

				//如果请求要重置页面,请配置点击附加参数refresh=1  增加判断如输入框回调param不是对象
				if (param.refresh || typeof param != 'object') {
					this.dataNum = 1;
				}

				//请求地址及请求数据,可以在加载前执行上面增加自己的代码逻辑
				let http_url = '/game/api.project/get';
				let http_data = {
					pageNum: this.dataNum,
					pageSize: 10,
					id: param.id || this.globalOption.id || '1'
				};
				let http_header = {};

				//不是修改,初始化用户信息
				if (!this.globalOption.id) {
					this.isshow = true;
					return;
				}

				let data = await this.$http.post(http_url, http_data, http_header, 'json');

				let datarows = data.rows;
				if (http_data.pageNum == 1) {
					this.data = data;
				} else if (datarows) {
					let rows = this.data.rows.concat(datarows);
					data.rows = rows;
					this.data = Object.assign(this.data, data);
				}
				if (datarows && datarows.length > 0) {
					this.dataNum = this.dataNum + 1;
				}

				uni.setNavigationBarTitle({
					title: data.data.title
				});
				let config = JSON.parse(data.data.config);
				function getRandomColor(index) {
					let colors = ['#fea832', 'fedb41'];
					return colors[index % 2];
				}
				let prizes = config.map((item, index) => {
					return { range: item.range ? parseInt(item.range) : 1, background: item.background || getRandomColor(index), fonts: [{ text: item.text, top: '20' }] };
				});
				this.prizeConfig.prizes = prizes;
				this.isshow = true;
			},

			// 判断用户是否登录 自定义方法
			async isloginFunction(param) {
				let thiz = this;
				if (!this.$session.getToken()) {
					//比如未登录,转身到其他页面等
					this.showToast('请先登录');
					this.navigateTo({
						type: 'page',
						url: 'login'
					});
					return;
				}
			},

			// 退出登录 自定义方法
			async logoutFunction(param) {
				let thiz = this;
				this.$session.clearUser();
				this.navigateTo({
					type: 'page',
					url: 'login'
				});
			},

			// 得奖回调 自定义方法
			async changeZhongjiangFunction(param) {
				let thiz = this;
				let prize = param && (param.prize || param.prize == 0) ? param.prize : thiz.prize || '';
				console.log(JSON.stringify(prize));
				this.navigateTo({
					type: 'tip',
					tip: prize.fonts[0].text
				});
				let flag = await this.showModal(prize.fonts[0].text);
			},
			//开始
			startPrize() {
				this.$refs.refPrize.play();
				setTimeout(() => {
					this.$refs.refPrize.stop();
				}, 3000);
			},
			// 停止
			endPrize(prize) {
				this.prize = prize;
				this.navigateTo({ prize: this.prize, type: 'changeZhongjiangFunction' });
			}
		},
		onPullDownRefresh() {
			// 列表数据 API请求方法
			this.dataNum = 1;
			this.dataApi();

			uni.stopPullDownRefresh();
		},
		onReachBottom() {
			// 列表数据 API请求方法
			this.dataApi();
		}
	};
</script>

<style lang="scss" scoped>
	.flex-clz {
		padding-top: 40rpx;
		padding-left: 10rpx;
		padding-bottom: 10rpx;
		padding-right: 10rpx;
	}
	.flex1-clz {
		margin-left: 10rpx;
		font-weight: bold;
		width: calc(100% - 10rpx - 10rpx) !important;
		font-size: 32rpx !important;
		margin-top: 30rpx;
		margin-bottom: 10rpx;
		margin-right: 10rpx;
	}
	.more-clz {
		padding-top: 10rpx;
		padding-left: 10rpx;
		padding-bottom: 10rpx;
		padding-right: 10rpx;
	}
	.text-clz {
		padding-top: 10rpx;
		padding-left: 10rpx;
		padding-bottom: 10rpx;
		padding-right: 10rpx;
	}
	.container334706 {
	}
</style>

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

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

相关文章

【Uniapp-Vue3】uni-icons的安装和使用

一、uni-icon的安装 进入到如下页面中&#xff0c;点击“点击下载&安装”。 uni-icons 图标 | uni-app官网 点击“下载插件并导入HBuilder”&#xff0c;如果没有登录就登陆一下 网页中会打开Hbuilder&#xff0c;进入Hbuilder以后&#xff0c;选择需要使用该插件的项目进…

【橘子ES】Kibana的分析能力Analytics简易分析

一、kibana是啥&#xff0c;能干嘛 我们经常会用es来实现一些关于检索&#xff0c;关于分析的业务。但是es本身并没有UI,我们只能通过调用api来完成一些能力。而kibana就是他的一个外置UI&#xff0c;你完全可以这么理解。 当我们进入kibana的主页的时候你可以看到这样的布局。…

一、引论,《组合数学(第4版)》卢开澄 卢华明

零、前言 发现自己数数题做的很烂&#xff0c;重新学一遍组合数学吧。 参考卢开澄 卢华明 编著的《组合数学(第4版)》&#xff0c;只打算学前四章。 通过几个经典问题来了解组合数学所研究的内容。 一、幻方问题 据说大禹治水之前&#xff0c;河里冒出来一只乌龟&#xff0c…

LabVIEW太阳能照明监控系统

在公共照明领域&#xff0c;传统的电力照明系统存在高能耗和维护不便等问题。利用LabVIEW开发太阳能照明监控系统&#xff0c;通过智能控制和实时监测&#xff0c;提高能源利用效率&#xff0c;降低维护成本&#xff0c;实现照明系统的可持续发展。 ​ 项目背景 随着能源危机…

5. 马科维茨资产组合模型+政策意图AI金融智能体(Qwen-Max)增强方案(理论+Python实战)

目录 0. 承前1. AI金融智能体1.1 What is AI金融智能体1.2 Why is AI金融智能体1.3 How to AI金融智能体 2. 数据要素&计算流程2.1 参数集设置2.2 数据获取&预处理2.3 收益率计算2.4 因子构建与预期收益率计算2.5 协方差矩阵计算2.6 投资组合优化2.7 持仓筛选2.8 AI金融…

【华为路由的arp配置】

华为路由的arp配置 ARP&#xff1a;IP地址与MAC地址的映射。 R1: g0/0/0:10.1.1.254/24 g0/0/1:10.1.2.254/24 PC1: 10.1.1.1/16 PC2: 10.1.1.2/16 PC3: 10.1.2.3/16 动态ARP 查看PC1的arp表&#xff0c;可以看到&#xff0c;列表为空。 查看R1的arp表 在PC3上ping命令测…

U3D的.Net学习

Mono&#xff1a;这是 Unity 最初采用的方式&#xff0c;它将 C# 代码编译为中间语言 (IL)&#xff0c;然后在目标平台上使用虚拟机 (VM) 将其转换为本地机器码执行。 IL2CPP&#xff1a;这是一种较新的方法&#xff0c;它会将 C# 代码先编译为 C 代码&#xff0c;再由 C 编译器…

机器学习-线性回归(简单回归、多元回归)

这一篇文章&#xff0c;我们主要来理解一下&#xff0c;什么是线性回归中的简单回归和多元回归&#xff0c;顺便掌握一下特征向量的概念。 一、简单回归 简单回归是线性回归的一种最基本形式&#xff0c;它用于研究**一个自变量&#xff08;输入&#xff09;与一个因变量&…

智能体的核心技能之插件,插件详解和实例 ,扣子免费系列教程(11)

欢迎来到滔滔讲AI&#xff0c;今天我们来学习智能体的核心功能点之一的插件。 插件是通过API连接集成各种平台和服务&#xff0c;它扩展了智能体的能力。平台内置了丰富的插件&#xff0c;我们可以直接调用。 一、什么是插件 首先&#xff0c;插件其实就像一个工具箱。 每个插…

Spring Security(maven项目) 3.0.2.6版本—总

通过实践而发现真理&#xff0c;又通过实践而证实真理和发展真理。从感性认识而能动地发展到理性认识&#xff0c;又从理性认识而能动地指导革命实践&#xff0c;改造主观世界和客观世界。实践、认识、再实践、再认识&#xff0c;这种形式&#xff0c;循环往复以至无穷&#xf…

超强推理大模型 QVQ-32B-preview 一键部署

QwQ-32B-Preview 是 Qwen 团队于 2024 年开发的实验研究模型&#xff0c;专注于提高 AI 推理能力。这个模型在多个基准测试中展现了卓越的性能&#xff0c;特别是在 GPQA、AIME、MATH-500 和 LiveCodeBench 等测试中&#xff0c;准确率分别达到了 65.2%、50.0%、90.6% 和 50.0%…

数据结构(Java)——二叉树

1.概念 二叉树是一种树形数据结构&#xff0c;其中每个节点最多有两个子节点&#xff0c;通常被称为左子节点和右子节点。二叉树可以是空的&#xff08;即没有节点&#xff09;&#xff0c;或者由一个根节点以及零个或多个左子树和右子树组成&#xff0c;其中左子树和右子树也分…

谷粒商城——商品服务-三级分类

1.商品服务-三级分类 1.1三级分类介绍 1.2查询三级分类查询-递归树型结构数据获取 1.2.1导入数据pms_catelog.sql到数据表pms_category 1.2.2一次性查出所有分类及子分类 1.2.2.1修改CategoryController.java /*** 查出所有分类以及子分类&#xff0c;以树形结构组装起来*/R…

AviatorScript用法

AviatorScript的介绍&#xff0c;网上有很多&#xff0c;这里就不啰嗦了。这里介绍下传参的用法 应用场景&#xff1a;如果不想频繁的打包升级&#xff0c;而是想只更新某些规则脚本重启服务就可以升级的话&#xff0c;AviatorScript无疑是最佳选择。比如说&#xff0c;今天制…

云计算和服务器

一、云计算概述 ICT是世界电信协会在2001年的全球性会议上提出的综合性概念&#xff0c;ICT分为IT和CT&#xff0c;IT(information technology)信息技术&#xff0c;负责对数据生命周期的管理&#xff1b;CT(communication technology)&#xff0c;负责数据的传输管理。 CT技术…

论文:深度可分离神经网络存内计算处理芯片

引言&#xff1a;SRAM - CIM芯片在处理深度可分离神经网络时面临的挑战 深度可分离卷积&#xff08;Depthwise separable convolution, DSC&#xff09;由逐深度卷积&#xff08;DW&#xff09;和逐点卷积&#xff08;PW)组成&#xff0c;逐深度卷积用于提取空间特征&#xff…

代码随想录刷题day14(1)|(链表篇)142.环形链表 II

目录 一、链表理论基础 二、环形链表思路 1.如何判断有环&#xff1f; 2.如何找出环的入口&#xff1f; 3.其他疑问 三、相关算法题目 四、总结 一、链表理论基础 代码随想录 (programmercarl.com) 二、环形链表思路 1.如何判断有环&#xff1f; 使用快慢指针法&…

运算放大器应用电路设计笔记(六)

6.1输出失调电压发生的原因与计算 6.1.1用噪声增益进行评价 若运算放大器两个输入端接地&#xff0c;则理想运放输出为零&#xff0c;但实际的运放输出不为零&#xff0c;有一定的直流输出电压。这种直流电压称为输出失调电压。发生的原因是&#xff0c;运算放大器内部元件尤…

openresty(nginx)+lua+kafka实现日志搜集系统

今天我们来实现一下快捷的nginx日志搜集系统&#xff0c;主讲的是nginx服务里面的openresty的日志搜集。采用的手段是采用lua做中间桥梁。 一、安装openresty 具体安装步骤在这里《centos7 二进制安装openresty》 二、安装kafka 1、安装Java及配置Java 具体安装步骤在这里《采…

PortSwigger靶场练习---网页 LLM 攻击:间接提示注入

网页 LLM 攻击&#xff1a; Indirect prompt injection 间接提示注入 PortSwigger靶场地址&#xff1a; Dashboard | Web Security Academy - PortSwigger 题目&#xff1a; 官方提示&#xff1a; 发现攻击面 点击实时聊天以访问实验室的聊天功能。 询问LLM它有权访问哪些 AP…