uniapp可视化-活动报名表单系统-代码生成器
- IT业界
- 2025-09-10 12:30:01

活动报名表单系统小程序旨在为各类活动组织者提供一个便捷、高效的线上报名管理平台,同时为参与者提供简单易用的报名途径。
主要功能 活动发布:活动组织者可以发布活动的详细信息,包括活动名称、时间、地点、活动内容等。用户可以在小程序中浏览并了解活动的相关信息,从而决定是否参与。个性化信息填写:针对不同活动,组织者可自定义预约时需填写的信息,支持多种自定义字段类型,如字符串、单选、复选、日期、列表、图片等。报名管理:活动组织者可以查看所有提交的报名信息,并进行审核、拒绝或确认等操作。同时,还可以对报名数据进行统计和分析,如已报名人数、各时段报名人数分布等,为活动的后续工作提供参考依据。新闻和动态:定期更新公司的新闻、行业动态和活动情况,让用户了解企业的最新进展。联系方式:提供公司的联系方式,如电话、地址、电子邮件和在线联系表单等,方便用户与企业进行沟通和联系。部分小程序还支持地图定位功能,用户点击“联系我们”即可获取企业位置。在线客服:提供在线客服功能,让用户可以直接与客服代表进行实时沟通和问题解答。搜索功能:提供搜索功能,方便用户快速找到所需的信息。用户互动:设置表单、留言等体系,方便企业与用户进行线上互动,收集用户线索。 软件架构本系统使用thinkphp8+uniapp来实现。移动端APP所有界面功能都是DIYGW可视化开发完成,后台使用diygw-ui-php集成活动报名表单系统。
首页可视化自定义公告、轮播、列表可视化内容
API可视化快速对接API接口
数据绑定生成的源码
<template> <view class="container container335134"> <view class="flex flex-wrap diygw-col-24 items-center flex13-clz"> <view class="flex flex-wrap diygw-col-0 flex-direction-column flex14-clz"> <text class="diygw-col-0 text7-clz"> 最新 </text> <text class="diygw-col-0"> 公告 </text> </view> <view class="flex diygw-col-0 noticebar-clz"> <diy-noticebar class="flex1 diy-notice-bar" :remote="true" :list="notices.rows" color="#00d6b9" bgColor="#fff" :speed="80" leftIcon="diy-icon-notification"> <block v-slot:content> <text class="diy-notice-item" v-for="(item, index) in notices.rows" :key="index"> {{ item.title }} </text> </block> </diy-noticebar> </view> </view> <view class="flex diygw-col-24 swiper-clz"> <swiper :current="swiperIndex" class="swiper swiper-indicator_rect_radius" @change="changeSwiper" indicator-color="rgba(51, 51, 51, 0.39)" indicator-active-color="#fff" indicator-dots="true" autoplay interval="3000" circular="true" style="height: 300rpx"> <swiper-item v-for="(item, index) in swipers.rows" :key="index" @tap="navigateTo" data-type="openFunction" :data-path="item.path" class="diygw-swiper-item"> <view class="diygw-swiper-item-wrap"> <image :src="item.img" class="diygw-swiper-image"></image> <view class="diygw-swiper-item-title swiper-title"> {{ item.title }} </view> </view> </swiper-item> </swiper> </view> <view class="flex flex-wrap diygw-col-24 justify-between items-center flex32-clz"> <view class="flex flex-wrap diygw-col-0 items-center"> <view class="flex flex-wrap diygw-col-0 flex-direction-column"> <text class="diygw-col-0 text19-clz"> </text> <text class="diygw-col-0 text24-clz"> </text> <text class="diygw-text-line1 diygw-col-0 text26-clz"> 为你推荐 </text> </view> <text class="diygw-text-line1 diygw-col-0 text27-clz"> 报名预约参加 </text> </view> <view class="flex flex-wrap diygw-col-0 items-center" @tap="navigateTo" data-type="page" data-url="/pages/huodong"> <text class="diygw-col-0 text44-clz"> 查看更多 </text> <text class="flex icon1 diygw-col-0 icon1-clz diy-icon-right"></text> </view> </view> <view v-if="huodongs.total > 0" class="flex flex-wrap diygw-col-24 flex-direction-column"> <view v-for="(item, index) in huodongs.rows" :key="index" class="flex flex-wrap diygw-col-24 flex-direction-column items-stretch flex6-clz" @tap="navigateTo" data-type="page" data-url="/pages/huodong/page" :data-id="item.id"> <view class="flex flex-wrap diygw-col-24 items-center"> <image :src="item.img" class="response diygw-col-24" mode="widthFix"></image> </view> <view class="flex flex-wrap diygw-col-0 items-center flex20-clz"> <view class="flex flex-wrap diygw-col-0 flex-direction-column flex35-clz"> <text class="diygw-col-0 text22-clz"> {{ item.title }} </text> <view class="flex flex-wrap diygw-col-24 items-center flex9-clz"> <text class="flex icon2 diygw-col-0 diy-icon-time"></text> <text class="diygw-text-line1 diygw-col-0 text2-clz"> {{ item.starttime }} 至 {{ item.endtime }} </text> </view> <view class="flex flex-wrap diygw-col-24 items-center flex15-clz"> <text class="flex icon5 diygw-col-0 diy-icon-location"></text> <text class="diygw-text-line1 diygw-col-0 text8-clz"> {{ item.address }} </text> </view> </view> </view> </view> </view> <view v-if="globalData.isshow && huodongs.code == 200 && huodongs.total == 0" class="flex flex-wrap diygw-col-24 flex-direction-column items-center flex1-clz"> <image src="/static/zwjl.png" class="image1-size diygw-image diygw-col-0" mode="widthFix"></image> <text class="diygw-col-0 text-clz"> 未找到任何数据 </text> </view> <view class="flex flex-wrap diygw-col-24 items-end diygw-bottom flex2-clz"> <view class="flex flex-wrap diygw-col-6 flex-direction-column items-center flex8-clz"> <view class="flex flex-wrap diygw-col-0 flex-direction-column items-center"> <image src="/static/sy.png" class="image2-size diygw-image diygw-col-0" mode="widthFix"></image> </view> <text class="diygw-text-line1 diygw-col-0 text3-clz"> 首页 </text> </view> <view class="flex flex-wrap diygw-col-6 flex-direction-column items-center flex4-clz" @tap="navigateTo" data-type="page" data-url="/pages/huodong"> <view class="flex flex-wrap diygw-col-0 flex-direction-column items-center"> <image src="/static/cp1.png" class="image3-size diygw-image diygw-col-0" mode="widthFix"></image> </view> <text class="diygw-text-line1 diygw-col-0"> 活动 </text> </view> <view class="flex flex-wrap diygw-col-6 flex-direction-column items-center flex11-clz" @tap="navigateTo" data-type="page" data-url="/pages/articles"> <view class="flex flex-wrap diygw-col-0 flex-direction-column items-center"> <text class="diygw-text-line1 diygw-col-0 animate__animated animate__heartBeat animate__infinite text15-clz"> </text> <image src="/static/xw1.png" class="image8-size diygw-image diygw-col-0" mode="widthFix"></image> </view> <text class="diygw-text-line1 diygw-col-0"> 新闻资讯 </text> </view> <view class="flex flex-wrap diygw-col-6 flex-direction-column items-center flex12-clz" @tap="navigateTo" data-type="page" data-url="/pages/user"> <view class="flex flex-wrap diygw-col-0 flex-direction-column items-center"> <image src="/static/wd.png" class="image4-size diygw-image diygw-col-0" mode="widthFix"></image> </view> <text class="diygw-text-line1 diygw-col-0"> 我的 </text> </view> </view> <view class="clearfix"></view> </view> </template> <script> export default { data() { return { //用户全局信息 userInfo: {}, //页面传参 globalOption: {}, //自定义全局变量 globalData: { isshow: false }, swipersNum: 1, swipers: { rows: [ { id: 0, title: '', remark: '', img: '', path: null, userId: 0, createTime: '', updateTime: '', deleteTime: null } ], total: 0, code: 0, msg: '' }, noticesNum: 1, notices: { rows: [ { id: 0, title: '', remark: '', userId: 0, createTime: '', updateTime: '', deleteTime: null } ], total: 0, code: 0, msg: '' }, huodongsNum: 1, huodongs: { rows: [ { id: 0, title: '', remark: '', starttime: null, endtime: '', address: null, num: 0, views: 0, baomingnum: 0, imgs: null, img: '', content: '', fields: '', userId: 0, createTime: '', updateTime: '', deleteTime: null, baomingEndtime: null } ], total: 0, code: 0, msg: '' }, swiperIndex: 0 }; }, onShow() { this.setCurrentPage(this); }, onLoad(option) { this.setCurrentPage(this); if (option) { this.setData({ globalOption: this.getOption(option) }); } this.init(); }, methods: { async init() { this.swipersApi(); this.noticesApi(); await this.huodongsApi(); }, // 轮播数据 API请求方法 async swipersApi(param) { let thiz = this; param = param || {}; //请求地址及请求数据,可以在加载前执行上面增加自己的代码逻辑 let http_url = '/cms/api.swiper/list'; let http_data = { pageNum: this.swipersNum, pageSize: 10, pageSize: param.pageSize || '5' }; let http_header = {}; let swipers = await this.$http.post(http_url, http_data, http_header, 'json'); this.swipers = swipers; this.globalData.isshow = true; }, // 公告数据 API请求方法 async noticesApi(param) { let thiz = this; param = param || {}; //请求地址及请求数据,可以在加载前执行上面增加自己的代码逻辑 let http_url = '/cms/api.notice/list'; let http_data = { pageNum: this.noticesNum, pageSize: 10, pageSize: param.pageSize || '5' }; let http_header = {}; let notices = await this.$http.post(http_url, http_data, http_header, 'json'); this.notices = notices; }, // 活动数据 API请求方法 async huodongsApi(param) { let thiz = this; param = param || {}; //如果请求要重置页面,请配置点击附加参数refresh=1 增加判断如输入框回调param不是对象 if (param.refresh || typeof param != 'object') { this.huodongsNum = 1; } //请求地址及请求数据,可以在加载前执行上面增加自己的代码逻辑 let http_url = '/cms/api.huodong/list'; let http_data = { pageNum: this.huodongsNum, pageSize: 10 }; let http_header = {}; http_data.baomingEndtime_gt = this.$tools.formatDateTime(new Date()); let huodongs = await this.$http.post(http_url, http_data, http_header, 'json'); let datarows = huodongs.rows; if (http_data.pageNum == 1) { this.huodongs = huodongs; } else if (datarows) { let rows = this.huodongs.rows.concat(datarows); huodongs.rows = rows; this.huodongs = Object.assign(this.huodongs, huodongs); } if (datarows && datarows.length > 0) { this.huodongsNum = this.huodongsNum + 1; } this.globalData.isshow = true; }, // 打开链接 自定义方法 async openFunction(param) { let thiz = this; let path = param && (param.path || param.path == 0) ? param.path : thiz.item.path || ''; if (path) { this.navigateTo({ type: 'page', url: path }); } }, changeSwiper(evt) { let swiperIndex = evt.detail.current; this.setData({ swiperIndex }); } }, onPullDownRefresh() { // 活动数据 API请求方法 this.huodongsNum = 1; this.huodongsApi(); uni.stopPullDownRefresh(); }, onReachBottom() { // 活动数据 API请求方法 this.huodongsApi(); } }; </script> <style lang="scss" scoped> .flex13-clz { padding-top: 6rpx; border-bottom-left-radius: 12rpx; padding-left: 0rpx; padding-bottom: 6rpx; border-top-right-radius: 12rpx; margin-right: 20rpx; background-color: #ffffff; margin-left: 20rpx; box-shadow: 0rpx 0rpx 12rpx 2px rgba(219, 219, 219, 0.31); 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: 0rpx; } .flex14-clz { margin-left: 10rpx; padding-top: 0rpx; z-index: 1; font-weight: bold; letter-spacing: 4rpx !important; padding-left: 10rpx; padding-bottom: 0rpx; margin-top: 0rpx; font-style: italic; margin-bottom: 0rpx; margin-right: -20rpx; padding-right: 10rpx; } .text7-clz { color: #00d6b9; } .noticebar-clz { flex: 1; } .swiper-clz { background-color: #ffffff; margin-left: 20rpx; border-bottom-left-radius: 12rpx; box-shadow: 0rpx 0rpx 12rpx 2px rgba(219, 219, 219, 0.31); overflow: hidden; width: calc(100% - 20rpx - 20rpx) !important; border-top-left-radius: 12rpx; margin-top: 10rpx; border-top-right-radius: 12rpx; border-bottom-right-radius: 12rpx; margin-bottom: 10rpx; margin-right: 20rpx; } .swiper-title { background-color: rgba(0, 0, 0, 0.281); color: #e6e6e6; } .flex32-clz { margin-left: 20rpx; padding-top: 10rpx; padding-left: 10rpx; width: calc(100% - 20rpx - 20rpx) !important; padding-bottom: 10rpx; margin-top: 10rpx; margin-bottom: 10rpx; margin-right: 20rpx; padding-right: 10rpx; } .text19-clz { background-color: #7feadb; flex-shrink: 0; transform: translate(0rpx, 0rpx) skew(-9deg, 0deg); top: -4rpx; width: 24rpx !important; position: absolute; right: -10rpx; height: 24rpx !important; } .text24-clz { background-color: #7feadb; flex-shrink: 0; transform: translate(0rpx, 0rpx) skew(-9deg, 0deg); left: -10rpx; bottom: -4rpx; width: 24rpx !important; position: absolute; height: 24rpx !important; } .text26-clz { padding-top: 0rpx; font-weight: bold; flex: 1; padding-left: 0rpx; font-size: 32rpx !important; padding-bottom: 0rpx; padding-right: 0rpx; } .text27-clz { margin-left: 30rpx; color: #b3b2b2; margin-top: 0rpx; margin-bottom: 0rpx; margin-right: 0rpx; } .text44-clz { color: #666666; text-align: right; } .icon1-clz { color: #666666; } .icon1 { font-size: 24rpx; } .flex6-clz { background-color: #ffffff; margin-left: 20rpx; border-bottom-left-radius: 12rpx; box-shadow: 0rpx 0rpx 12rpx 2px rgba(219, 219, 219, 0.31); overflow: hidden; width: calc(100% - 20rpx - 20rpx) !important; border-top-left-radius: 12rpx; margin-top: 10rpx; border-top-right-radius: 12rpx; border-bottom-right-radius: 12rpx; margin-bottom: 10rpx; margin-right: 20rpx; } .flex20-clz { padding-top: 10rpx; flex: 1; padding-left: 10rpx; padding-bottom: 10rpx; padding-right: 10rpx; } .flex35-clz { padding-top: 10rpx; flex: 1; padding-left: 10rpx; padding-bottom: 10rpx; padding-right: 10rpx; } .text22-clz { font-weight: bold; font-size: 28rpx !important; } .flex9-clz { margin-left: 0rpx; width: calc(100% - 0rpx - 0rpx) !important; margin-top: 10rpx; margin-bottom: 10rpx; margin-right: 0rpx; } .icon2 { font-size: 32rpx; } .text2-clz { padding-top: 0rpx; flex: 1; padding-left: 0rpx; font-size: 28rpx !important; padding-bottom: 0rpx; padding-right: 0rpx; } .flex15-clz { margin-left: 0rpx; width: calc(100% - 0rpx - 0rpx) !important; margin-top: 10rpx; margin-bottom: 10rpx; margin-right: 0rpx; } .icon5 { font-size: 32rpx; } .text8-clz { padding-top: 0rpx; flex: 1; padding-left: 0rpx; font-size: 28rpx !important; padding-bottom: 0rpx; padding-right: 0rpx; } .flex1-clz { padding-top: 20rpx; padding-left: 20rpx; padding-bottom: 20rpx; padding-right: 20rpx; } .image1-size { height: 400rpx !important; width: 400rpx !important; } .text-clz { color: #969696; font-size: 28rpx !important; } .flex2-clz { border-top: 2rpx solid #e4e4e4; padding-top: 16rpx; border-bottom-left-radius: 0rpx; bottom: 0rpx; padding-left: 16rpx; padding-bottom: 16rpx; border-top-right-radius: 24rpx; background-color: #ffffff; box-shadow: 0rpx 4rpx 12rpx rgba(31, 31, 31, 0.16); overflow: visible; left: 0rpx; border-top-left-radius: 24rpx; border-bottom-right-radius: 0rpx; padding-right: 16rpx; } .flex8-clz { flex: 1; } .image2-size { height: 48rpx !important; width: 48rpx !important; } .text3-clz { color: #031aeb; } .flex4-clz { flex: 1; } .image3-size { height: 48rpx !important; width: 48rpx !important; } .flex11-clz { flex: 1; } .text15-clz { border: 2rpx solid #eee; border-bottom-left-radius: 40rpx; -webkit-animation-duration: 5000ms; color: #ffffff; animation-delay: 1000ms; -webkit-animation-delay: 1000ms; border-top-right-radius: 40rpx; right: -8rpx; background-color: rgba(255, 17, 17, 0.91); animation-duration: 5000ms; flex-shrink: 0; overflow: hidden; top: -8rpx; width: 16rpx !important; border-top-left-radius: 40rpx; border-bottom-right-radius: 40rpx; position: absolute; height: 16rpx !important; } .image8-size { height: 48rpx !important; width: 48rpx !important; } .flex12-clz { flex: 1; } .image4-size { height: 48rpx !important; width: 48rpx !important; } .container335134 { padding-bottom: 160rpx; background-color: #f5f5f5; background-image: url(/static/loginbg.png); background-size: cover; background-repeat: no-repeat; } </style> 活动发布 活动CRUD活动发布CRUD功能发布,表单可视化
活动表单活动表单可视化拖拉表单字段拖拉设计
<template> <view class="container container335134"> <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" data-isself="1" placeholder="请输入活动标题" v-model="title"></u-input> <text @tap="navigateTo" data-type="listApi" :data-title_like="title" data-isself="1" 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"> <view class="flex flex-wrap diygw-col-24 flex-direction-column items-center" @tap="navigateTo" data-type="page" data-url="/pages/huodong/page" :data-id="item.id"> <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> <view class="flex flex-wrap diygw-col-24 justify-between items-center flex2-clz"> <text @tap="navigateTo" data-type="page" data-url="/pages/huodong/data" :data-id="item.id" class="diygw-col-0 text7-clz"> 报名数据 </text> <text @tap="navigateTo" data-type="page" data-url="/pages/huodong/field" :data-id="item.id" class="diygw-col-0 text5-clz"> 表单字段 </text> <text @tap="navigateTo" data-type="editFunction" :data-index="index" class="diygw-col-0 text4-clz"> 修改 </text> <text @tap="navigateTo" data-type="delApi" :data-id="item.id" :data-index="index" class="diygw-col-0 text13-clz"> 删除 </text> </view> </view> </view> <view v-if="globalData.isshow" class="flex flex-wrap diygw-col-24 justify-start diygw-bottom flex3-clz"> <view v-if="showForm" 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> <view v-if="!showForm" 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="!showForm && 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"> <u-form-item class="diygw-col-24" :required="true" label="活动标题" prop="title"> <u-input placeholder="请输入活动标题" v-model="form.title"></u-input> </u-form-item> <u-form-item class="diygw-col-24" label="开始时间" :required="true" prop="starttime"> <u-input @click="formData.showStarttime = true" class="" placeholder="请选择开始时间" v-model="form.starttime" type="select"></u-input> <u-picker :defaultTime="form.starttime" v-model="formData.showStarttime" mode="time" :params="formData.paramsStarttime" @confirm="changeFormStarttime"></u-picker> </u-form-item> <u-form-item class="diygw-col-24" label="结束时间" :required="true" prop="endtime"> <u-input @click="formData.showEndtime = true" class="" placeholder="请选择结束时间" v-model="form.endtime" type="select"></u-input> <u-picker :defaultTime="form.endtime" v-model="formData.showEndtime" mode="time" :params="formData.paramsEndtime" @confirm="changeFormEndtime"></u-picker> </u-form-item> <u-form-item class="diygw-col-24" :required="true" label="活动地点" prop="address"> <u-input placeholder="请输入活动地点" v-model="form.address"></u-input> </u-form-item> <u-form-item :required="true" class="diygw-col-24" label="活动封面" prop="img"> <u-upload width="160" height="160" margin="0" maxCount="1" @on-success="uploadFormImg" @on-remove="delFormImg" action="/sys/storage/upload" v-model="form.img"> </u-upload> </u-form-item> <u-form-item :required="true" class="diygw-col-24" label="活动轮播图" prop="imgs"> <u-upload width="160" height="160" maxCount="6" @on-success="uploadFormImgs" @on-remove="delFormImgs" action="/sys/storage/upload" v-model="form.imgs"> </u-upload> </u-form-item> <u-form-item labelWidth="auto" class="diygw-col-24" label="报名结束时间" :required="true" prop="baomingEndtime"> <u-input @click="formData.showBaomingEndtime = true" class="" placeholder="请选择结束时间" v-model="form.baomingEndtime" type="select"></u-input> <u-picker :defaultTime="form.baomingEndtime" v-model="formData.showBaomingEndtime" mode="time" :params="formData.paramsBaomingEndtime" @confirm="changeFormBaomingEndtime"></u-picker> </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> <u-form-item :borderBottom="false" class="diygw-col-24" labelPosition="top" prop="content"> <diy-editor height="400px" v-model="form.content"></diy-editor> </u-form-item> </u-form> <view class="clearfix"></view> </view> </template> <script> export default { data() { return { //用户全局信息 userInfo: {}, //页面传参 globalOption: {}, //自定义全局变量 globalData: { isshow: false }, listNum: 1, list: { rows: [], total: 0, code: 200, msg: 'success' }, del: { code: 200, msg: '删除成功' }, title: '', showForm: false, formRules: { title: [ { trigger: ['change', 'blur'], required: true, message: '标题不能为空' } ], starttime: [ { trigger: ['change', 'blur'], required: true, message: '结束时间不能为空哟' } ], endtime: [ { trigger: ['change', 'blur'], required: true, message: '结束时间不能为空哟' } ], address: [ { trigger: ['change', 'blur'], required: true, message: '标题不能为空' } ], img: [ { trigger: ['change', 'blur'], required: true, message: '请上传图片哟' } ], imgs: [ { trigger: ['change', 'blur'], required: true, message: '请上传图片哟' } ], baomingEndtime: [ { trigger: ['change', 'blur'], required: true, message: '结束时间不能为空哟' } ] }, form: { title: '', starttime: '', endtime: '', address: '', img: '', imgs: '', baomingEndtime: '', remark: '', content: '' }, formData: { paramsStarttime: { year: true, month: true, day: true, hour: true, minute: true, second: false }, showStarttime: false, paramsEndtime: { year: true, month: true, day: true, hour: true, minute: true, second: false }, showEndtime: false, paramsBaomingEndtime: { year: true, month: true, day: true, hour: true, minute: true, second: false }, showBaomingEndtime: false } }; }, 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); }, 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 = '/cms/huodong/list'; let http_data = { pageNum: this.listNum, pageSize: 10, title_like: param.title_like || this.title, isself: param.isself || '1' }; let http_header = {}; //如果是管理员,可以看见所有的活动 if (this.userInfo.username == 'admin') { delete http_data.isself; } 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 delApi(param) { let thiz = this; param = param || {}; //请求地址及请求数据,可以在加载前执行上面增加自己的代码逻辑 let http_url = '/cms/huodong/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 || ''; this.form = JSON.parse(JSON.stringify(this.list.rows[param.index])); this.showForm = true; }, changeFormStarttime(evt) { this.form.starttime = evt.year + '-' + evt.month + '-' + evt.day + ' ' + evt.hour + ':' + evt.minute; }, changeFormEndtime(evt) { this.form.endtime = evt.year + '-' + evt.month + '-' + evt.day + ' ' + evt.hour + ':' + evt.minute; }, changeFormImg(index, lists) {}, delFormImg(index, lists) { this.changeFormImg(index, lists); }, uploadFormImg(res, index, lists) { this.changeFormImg(index, lists); }, changeFormImgs(index, lists) {}, delFormImgs(index, lists) { this.changeFormImgs(index, lists); }, uploadFormImgs(res, index, lists) { this.changeFormImgs(index, lists); }, changeFormBaomingEndtime(evt) { this.form.baomingEndtime = evt.year + '-' + evt.month + '-' + evt.day + ' ' + evt.hour + ':' + evt.minute; }, 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.$nextTick(async () => { let valid = await this.$refs.formRef.validate(); if (valid) { //保存数据 let param = this.form; let header = {}; let url = '/cms/huodong/add'; if (this.form.id) { url = '/cms/huodong/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; } .text7-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; } .text5-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; } .button-button-clz { margin: 6rpx !important; } .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; } .container335134 { padding-bottom: 160rpx; background-color: #f5f5f5; } </style> 活动表单自定义字段自定义表单字段,支持多种字段类型
<template> <view class="container container335134"> <u-form :model="form" :rules="formRules" :errorType="['message', 'toast']" ref="formRef" class="flex diygw-form diygw-col-24"> <u-form-item class="diygw-col-24 hidden" label="标题" prop="input"> <u-input placeholder="由于表单验证至少保留一个输入" v-model="form.input"></u-input> </u-form-item> <view v-if="isData && form.fields.length > 0" class="flex flex-wrap diygw-col-24 flex-direction-column items-center flex8-clz"> <text class="diygw-col-0"> 已存在预约数据,不要修改变量字段类型。 </text> </view> <view class="flex flex-wrap diygw-col-24 flex-direction-column flex2-clz"> <view class="flex flex-wrap diygw-col-24"> <view class="diygw-col-24" v-for="(fieldsItem, fieldsIndex) in form.fields" :key="fieldsItem"> <u-form class="diygw-col-24" :model="form.fields[fieldsIndex]" :errorType="['message', 'toast']" ref="fieldsRef" :rules="fieldsItemRules"> <view class="flex flex-wrap diygw-col-24 flex-direction-column flex-clz"> <text class="diygw-col-24 text1-clz"> 字段{{ fieldsIndex + 1 }} </text> <u-form-item class="diygw-col-24 diygw-form-border diygw-uform-item" label="字段标题" prop="title"> <view class="flex flex-sub padding-top-xs padding-bottom-xs align-center solid"> <u-input placeholder="请输入字段标题" v-model="fieldsItem.title"></u-input> </view> </u-form-item> <u-form-item class="diygw-col-24" label="是否必填" prop="required"> <view class="flex diygw-col-24 justify-end"> <u-switch :size="44" :activeValue="1" :inactiveValue="0" inactiveTextColor="#000000" activeTextColor="#ffffff" v-model="fieldsItem.required" slot="right"></u-switch> </view> </u-form-item> <u-form-item v-if="!isData || (isData && !fieldsItem.field)" class="diygw-col-24 diygw-uform-item diygw-form-border" label="字段类型" prop="type"> <diy-selectinput @click="formData.fieldsItemDatas[fieldsIndex].showType = true" class="diygw-col-24 solid" valueName="value" labelName="label" :list="formData.fieldsItemDatas[fieldsIndex].typeDatas" placeholder="请选择" v-model="fieldsItem.type" type="select"></diy-selectinput> <u-select mode="single-column" valueName="value" labelName="label" :list="formData.fieldsItemDatas[fieldsIndex].typeDatas" isDefaultSelect :defaultSelectValue="fieldsItem.type" v-model="formData.fieldsItemDatas[fieldsIndex].showType" @confirm="changeFieldsItemType($event, fieldsIndex, fieldsItem)"></u-select> </u-form-item> <view v-if="isData && fieldsItem.field" class="flex flex-wrap diygw-col-24 flex9-clz"> <text class="diygw-col-0 text-clz"> 字段类型 </text> <text class="diygw-col-0 text5-clz"> {{ getType(fieldsItem) }} </text> </view> <view v-if="['radio', 'checkbox', 'select'].includes(fieldsItem.type)" class="flex flex-wrap diygw-col-24 flex-direction-column flex1-clz"> <view class="flex flex-wrap diygw-col-24 flex-direction-column"> <text class="diygw-col-24 text3-clz"> 选项值 </text> <view class="flex flex-wrap diygw-col-24 datas-clz"> <view class="diygw-col-24" v-for="(datasItem, datasIndex) in fieldsItem.datas" :key="datasItem"> <u-form class="diygw-col-24" :model="fieldsItem.datas[datasIndex]" :errorType="['message', 'toast']" ref="datasRef" :rules="datasItemRules"> <view class="flex flex-wrap diygw-col-24 flex5-clz"> <u-form-item class="diygw-col-0 value-clz diygw-form-border diygw-uform-item diygw-form-item-notpadding" labelPosition="top" prop="value"> <view class="flex flex-sub padding-top-xs padding-bottom-xs align-center solid"> <u-input placeholder="请输入选项值" v-model="datasItem.value"></u-input> </view> </u-form-item> <view class="flex flex-wrap diygw-col-0 flex4-clz"> <text @tap="navigateTo" data-type="upDatasItemFunction" :data-index="datasIndex" :data-fields-index="fieldsIndex" class="flex icon diygw-col-0 icon-clz diy-icon-fold"></text> <text @tap="navigateTo" data-type="downDatasItemFunction" :data-index="datasIndex" :data-fields-index="fieldsIndex" class="flex icon3 diygw-col-0 icon3-clz diy-icon-unfold"></text> <text @tap="navigateTo" data-type="addDatasItemFunction" :data-fields-index="fieldsIndex" class="flex icon2 diygw-col-0 icon2-clz diy-icon-add"></text> <text @tap="navigateTo" data-type="delDatasItemFunction" :data-fields-index="fieldsIndex" :data-index="datasIndex" class="flex icon1 diygw-col-0 icon1-clz diy-icon-close"></text> </view> </view> </u-form> </view> </view> </view> </view> </view> </u-form> <view class="formfieldstools flex justify-end"> <button @tap="upFieldsItem" :data-index="fieldsIndex" class="diygw-btn flex-sub radius margin-xs"> <text class="button-icon diy-icon-fold"></text> </button> <button @tap="downFieldsItem" :data-index="fieldsIndex" class="diygw-btn flex-sub radius margin-xs"> <text class="button-icon diy-icon-unfold"></text> </button> <button @tap="addFieldsItem" :data-index="fieldsIndex" class="diygw-btn flex-sub radius margin-xs"> <text class="button-icon diy-icon-add"></text> </button> <button @tap="delFieldsItem" :data-index="fieldsIndex" class="diygw-btn flex-sub radius margin-xs"> <text class="button-icon diy-icon-close"></text> </button> </view> </view> </view> </view> </u-form> <view v-if="isshow && form.fields.length == 0" class="flex flex-wrap diygw-col-24 flex-direction-column items-center"> <text class="diygw-col-0"> 字段为空,是否添加自定义活动字段 </text> <button @tap="addFieldsItem" class="diygw-col-24 btn-clz diygw-btn-default">新增字段</button> </view> <view v-if="form.fields.length > 0" class="flex flex-wrap diygw-col-24 justify-start diygw-bottom flex7-clz"> <view class="flex diygw-col-24"> <button @tap="$tools.backpage()" 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> </view> <view class="clearfix"></view> </view> </template> <script> export default { data() { return { //用户全局信息 userInfo: {}, //页面传参 globalOption: {}, //自定义全局变量 globalData: {}, data: { code: 200, msg: 'success', data: { id: 5, title: 'cms', remark: 'cmscmscms', endtime: '2025-02-12 00:00:00', num: 0, img: 'http://sell.t /storage/image/20250212/fe98841d27ec081580410b325ecf552903d33e0b.png', content: '<p>cmscmscmscmscmscmscms</p>', fields: null, userId: 1, createTime: '2025-02-12 16:57:07', updateTime: '2025-02-12 16:57:07', deleteTime: null } }, huodongDataNum: 1, huodongData: { rows: [ { id: 0, title: '', img: '', remark: '', data: '', huodongId: 0, huodongTitle: '', userId: 0, createTime: '', updateTime: '', deleteTime: null } ], total: 0, code: 0, msg: '' }, isData: false, isshow: false, datasItem: { value: '' }, datasItemRules: {}, form: { input: '', fields: [] }, fieldsItem: { title: '', required: 1, type: 'input', datasItemDatas: [], datas: [] }, formRules: {}, fieldsItemData: { showType: false, typeDatas: [ { value: 'input', label: '单选文本' }, { value: 'textarea', label: '多行文本' }, { value: 'phone', label: '手机号码' }, { value: 'number', label: '数字' }, { value: 'img', label: '图片' }, { value: 'date', label: '日期' }, { value: 'datetime', label: '年月日时分' }, { value: 'radio', label: '单选' }, { value: 'checkbox', label: '复选' }, { value: 'select', label: '下拉' }, { value: 'sign', label: '手写签名' } ] }, formData: { fieldsItemDatas: [] }, fieldsItemRules: {} }; }, 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.initDatasData(); }, methods: { async init() { await this.dataApi(); await this.initResetform(); }, // 获取数据 API请求方法 async dataApi(param) { let thiz = this; param = param || {}; //请求地址及请求数据,可以在加载前执行上面增加自己的代码逻辑 let http_url = '/cms/huodong/get'; let http_data = { id: param.id || this.globalOption.id || '5' }; let http_header = {}; if (!this.globalOption.id) { this.isshow = true; return; } let data = await this.$http.post(http_url, http_data, http_header, 'json'); this.data = data; if (data.code == 200 && data.data.fields) { this.form.fields = JSON.parse(data.data.fields); let fieldsItemDatas = []; this.form.fields.forEach((item) => { fieldsItemDatas.push(JSON.parse(JSON.stringify(this.fieldsItemData))); }); this.formData.fieldsItemDatas = fieldsItemDatas; } this.isChange = false; await this.huodongDataApi({}); this.isshow = true; }, // 预约数据 API请求方法 async huodongDataApi(param) { let thiz = this; param = param || {}; //请求地址及请求数据,可以在加载前执行上面增加自己的代码逻辑 let http_url = '/cms/api.huodongData/list'; let http_data = { pageNum: this.huodongDataNum, pageSize: 10, huodongId: param.huodongId || this.globalOption.id, pageSize: param.pageSize || '1' }; let http_header = {}; let huodongData = await this.$http.post(http_url, http_data, http_header, 'json'); this.huodongData = huodongData; this.isData = huodongData.total; }, // 新增选项值 自定义方法 async addDatasItemFunction(param) { let thiz = this; let fieldsIndex = param && (param.fieldsIndex || param.fieldsIndex == 0) ? param.fieldsIndex : thiz.fieldsIndex || '0'; //由于默认生成的不支持多层嵌套,所以选项值这些自定义实现 let fieldsItem = this.form.fields[fieldsIndex]; fieldsItem.datas.push(JSON.parse(JSON.stringify(this.datasItem))); this.fieldsItemData.datasItemDatas.push(JSON.parse(JSON.stringify(this.datasItemData))); this.initDatasValid(); }, // 下移子表单 自定义方法 async downDatasItemFunction(param) { let thiz = this; let index = param && (param.index || param.index == 0) ? param.index : thiz.datasIndex || ''; let fieldsIndex = param && (param.fieldsIndex || param.fieldsIndex == 0) ? param.fieldsIndex : thiz.fieldsIndex || ''; let fieldsItem = this.form.fields[fieldsIndex]; if (index == fieldsItem.datas.length - 1) { this.navigateTo({ type: 'tip', tip: '已经是最后一个' }); return false; } fieldsItem.datas[index] = fieldsItem.datas.splice(index + 1, 1, fieldsItem.datas[index])[0]; this.fieldsItemData.datasItemDatas[index] = this.fieldsItemData.datasItemDatas.splice(index + 1, 1, this.fieldsItemData.datasItemDatas[index])[0]; this.initDatasValid(); }, // 上移子表单 自定义方法 async upDatasItemFunction(param) { let thiz = this; let index = param && (param.index || param.index == 0) ? param.index : thiz.datasIndex || ''; let fieldsIndex = param && (param.fieldsIndex || param.fieldsIndex == 0) ? param.fieldsIndex : thiz.fieldsIndex || ''; let fieldsItem = this.form.fields[fieldsIndex]; if (index == 0) { this.navigateTo({ type: 'tip', tip: '已经是第一个' }); return false; } fieldsItem.datas[index] = fieldsItem.datas.splice(index - 1, 1, fieldsItem.datas[index])[0]; this.fieldsItemData.datasItemDatas[index] = this.fieldsItemData.datasItemDatas.splice(index - 1, 1, this.fieldsItemData.datasItemDatas[index])[0]; this.initDatasValid(); }, // 删除子表单 自定义方法 async delDatasItemFunction(param) { let thiz = this; let fieldsIndex = param && (param.fieldsIndex || param.fieldsIndex == 0) ? param.fieldsIndex : thiz.fieldsIndex || ''; let index = param && (param.index || param.index == 0) ? param.index : thiz.datasIndex || ''; let fieldsItem = this.form.fields[fieldsIndex]; fieldsItem.datas.splice(index, 1); this.fieldsItemData.datasItemDatas.splice(index, 1); this.initDatasValid(); }, //子表单验证 initFieldsValid() { this.$nextTick(() => { this.$refs['fieldsRef']?.forEach((subform) => { subform.setRules(this.fieldsItemRules); }); }); }, //验证所有的子表单 checkFieldsValid() { let flag = true; this.$refs['fieldsRef']?.forEach((subform) => { subform.validate((valid) => { if (!valid) { flag = false; return false; } }); }); return flag; }, //上移子表单 upFieldsItem(evt) { let { index } = evt.currentTarget.dataset; if (index == 0) { this.navigateTo({ type: 'tip', tip: '已经是第一个' }); return false; } this.form.fields[index] = this.form.fields.splice(index - 1, 1, this.form.fields[index])[0]; this.formData.fieldsItemDatas[index] = this.formData.fieldsItemDatas.splice(index - 1, 1, this.formData.fieldsItemDatas[index])[0]; this.initFieldsValid(); }, //下移子表单 downFieldsItem(evt) { let { index } = evt.currentTarget.dataset; if (index == this.form.fields.length - 1) { this.navigateTo({ type: 'tip', tip: '已经是最后一个' }); return false; } this.form.fields[index] = this.form.fields.splice(index + 1, 1, this.form.fields[index])[0]; this.formData.fieldsItemDatas[index] = this.formData.fieldsItemDatas.splice(index + 1, 1, this.formData.fieldsItemDatas[index])[0]; this.initFieldsValid(); }, //删除子表单 delFieldsItem(evt) { let { index } = evt.currentTarget.dataset; this.form.fields.splice(index, 1); this.formData.fieldsItemDatas.splice(index, 1); this.initFieldsValid(); }, //增加子表单 addFieldsItem() { this.form.fields.push(JSON.parse(JSON.stringify(this.fieldsItem))); this.formData.fieldsItemDatas.push(JSON.parse(JSON.stringify(this.fieldsItemData))); this.initFieldsValid(); }, changeFieldsItemType(evt, fieldsIndex, fieldsItem) { evt.map((val, index) => { fieldsItem.type = val.value; }); }, getType(item) { let find = this.fieldsItemData.typeDatas.find((type) => { return type.value == item.type; }); return find ? find.label : '单行文本'; }, //初始化显示子表单数据条数 initDatasData() { for (let i = 0; i < 1; i++) { this.fieldsItem.datas.push(JSON.parse(JSON.stringify(this.datasItem))); } this.initDatasValid(); }, //子表单验证 initDatasValid() { this.$nextTick(() => { this.$refs['datasRef']?.forEach((subform) => { subform.setRules(this.datasItemRules); }); }); }, //验证所有的子表单 checkDatasValid() { let flag = true; this.$refs['datasRef']?.forEach((subform) => { subform.validate((valid) => { if (!valid) { flag = false; return false; } }); }); return flag; }, 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.initFieldsValid(); this.initDatasValid(); this.$nextTick(async () => { let fieldsvalid = await this.checkFieldsValid(); let datasvalid = await this.checkDatasValid(); let valid = await this.$refs.formRef.validate(); if (valid && fieldsvalid && datasvalid) { //保存数据 let param = this.form; let header = { 'Content-Type': 'application/json' }; let url = '/cms/huodong/update'; let find = this.form.fields.find((item) => { return !item.title; }); if (find) { this.showToast('字段标题不能为空'); return; } /* let finds = [] this.form.fields.forEach(item=>{ if(['radio', 'checkbox', 'select'].includes(item.type)){ find = item.datas.find(data=>{ return !data.value }) if(find){ finds.push(item) } } }) if(finds.length>0){ this.showToast(finds[0].title+"选项值不能为空") return }*/ let time = new Date().getTime(); this.form.fields.forEach((item, index) => { item.field = item.field ? item.field : 'field' + time + index; }); param = { id: this.globalOption.id, fields: this.form.fields }; let res = await this.$http.post(url, param, header, 'json'); if (res.code == 200) { this.showToast(res.msg, 'success'); uni.navigateBack(); } else { this.showModal(res.msg, '提示', false); } if (res.code == 200) { this.showToast(res.msg, 'success'); } else { this.showModal(res.msg, '提示', false); } } else { console.log('验证失败'); } }); } } }; </script> <style lang="scss" scoped> .flex8-clz { padding-top: 10rpx; color: #ff0000; padding-left: 10rpx; padding-bottom: 10rpx; padding-right: 10rpx; } .flex2-clz { padding-top: 10rpx; padding-left: 10rpx; padding-bottom: 10rpx; padding-right: 10rpx; } .formfieldstools { position: absolute; z-index: 1; right: 12rpx; top: 12rpx; } .formfieldstools .diygw-btn { padding: 5px; height: auto; flex: inherit; border-radius: 20px; } .flex-clz { background-color: #ffffff; margin-left: 10rpx; border-bottom-left-radius: 12rpx; box-shadow: 0rpx 2rpx 6rpx rgba(31, 31, 31, 0.16); overflow: hidden; width: calc(100% - 10rpx - 10rpx) !important; border-top-left-radius: 12rpx; margin-top: 10rpx; border-top-right-radius: 12rpx; border-bottom-right-radius: 12rpx; margin-bottom: 10rpx; margin-right: 10rpx; } .text1-clz { padding-top: 20rpx; font-weight: bold; flex: 1; padding-left: 30rpx; padding-bottom: 20rpx; padding-right: 30rpx; } .flex9-clz { margin-left: 20rpx; width: calc(100% - 20rpx - 20rpx) !important; margin-top: 10rpx; margin-bottom: 10rpx; border-bottom: 2rpx solid #ebedf0; margin-right: 20rpx; } .text-clz { padding-top: 20rpx; font-weight: bold; padding-left: 10rpx; padding-bottom: 20rpx; padding-right: 10rpx; } .text5-clz { margin-left: 20rpx; padding-top: 20rpx; flex: 1; padding-left: 36rpx; padding-bottom: 20rpx; margin-top: 0rpx; margin-bottom: 0rpx; margin-right: 30rpx; padding-right: 16rpx; } .flex1-clz { background-color: #ffffff; margin-left: 20rpx; border-bottom-left-radius: 12rpx; overflow: hidden; width: calc(100% - 20rpx - 20rpx) !important; border-top-left-radius: 12rpx; margin-top: 10rpx; border-top-right-radius: 12rpx; border-bottom-right-radius: 12rpx; margin-bottom: 10rpx; margin-right: 20rpx; } .text3-clz { padding-top: 20rpx; font-weight: bold; flex: 1; padding-left: 16rpx; padding-bottom: 20rpx; padding-right: 16rpx; } .datas-clz { padding-top: 20rpx; font-weight: bold; flex: 1; padding-left: 16rpx; padding-bottom: 20rpx; padding-right: 16rpx; } .flex5-clz { margin-left: 0rpx; width: calc(100% - 0rpx - 0rpx) !important; margin-top: 10rpx; margin-bottom: 10rpx; margin-right: 0rpx; } .value-clz { flex: 1; } .flex4-clz { color: #989898; } .icon-clz { margin-left: 10rpx; padding-top: 10rpx; padding-left: 10rpx; padding-bottom: 10rpx; margin-top: 10rpx; margin-bottom: 10rpx; margin-right: 10rpx; padding-right: 10rpx; } .icon { font-size: 28rpx; } .icon3-clz { margin-left: 10rpx; padding-top: 10rpx; padding-left: 10rpx; padding-bottom: 10rpx; margin-top: 10rpx; margin-bottom: 10rpx; margin-right: 10rpx; padding-right: 10rpx; } .icon3 { font-size: 28rpx; } .icon2-clz { margin-left: 10rpx; padding-top: 10rpx; padding-left: 10rpx; padding-bottom: 10rpx; margin-top: 10rpx; margin-bottom: 10rpx; margin-right: 10rpx; padding-right: 10rpx; } .icon2 { font-size: 28rpx; } .icon1-clz { margin-left: 10rpx; padding-top: 10rpx; padding-left: 10rpx; padding-bottom: 10rpx; margin-top: 10rpx; margin-bottom: 10rpx; margin-right: 10rpx; padding-right: 10rpx; } .icon1 { font-size: 28rpx; } .btn-clz { padding-top: 16rpx; border-bottom-left-radius: 120rpx; color: #fff; padding-left: 20rpx; font-size: 28rpx !important; padding-bottom: 16rpx; border-top-right-radius: 120rpx; margin-right: 30rpx; background-color: #07c160; margin-left: 30rpx; overflow: hidden; width: calc(100% - 30rpx - 30rpx) !important; border-top-left-radius: 120rpx; margin-top: 10rpx; border-bottom-right-radius: 120rpx; margin-bottom: 10rpx; text-align: center; padding-right: 20rpx; } .flex7-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; } .button-button-clz { margin: 6rpx !important; } .container335134 { padding-bottom: 160rpx; background-color: #f5f5f5; } </style> 活动详情 活动展示页活动详情包括轮播、签到时间、距活动结束
活动表单可视化活动表单根据活动自定义的表单可视化、自定义表单字段。
<template> <view class="container container335134"> <u-form :model="form" :rules="formRules" :errorType="['message', 'toast']" ref="formRef" v-if="showForm" class="flex diygw-form diygw-col-24 form-clz"> <u-form-item class="diygw-col-24" :required="true" label="联系人" prop="title"> <u-input 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 v-for="(item, index) in data.data.fields" :key="index" class="flex flex-wrap diygw-col-24 flex-direction-column"> <u-form-item v-if="item.type == 'kaiguang'" :required="item.required" :newprop="item.field" class="diygw-col-24" :label="item.title" prop="kaiguang"> <view class="flex diygw-col-24"> <u-switch :size="44" :activeValue="1" :inactiveValue="0" inactiveTextColor="#000000" activeTextColor="#ffffff" v-model="item.kaiguang" slot="right"></u-switch> </view> </u-form-item> <u-form-item v-if="item.type == 'date'" :required="item.required" :newprop="item.field" class="diygw-col-24" :label="item.title" prop="date"> <u-input @click="item.showDate = true" class="" placeholder="请选择" v-model="item.date" type="select"></u-input> <u-calendar maxDate="2050-12-31" v-model="item.showDate" mode="date" @change="changeItemDate($event, index, item)"></u-calendar> </u-form-item> <u-form-item v-if="item.type == 'input'" :required="item.required" :newprop="item.field" class="diygw-col-24" :label="item.title" prop="input"> <u-input id="diyid" placeholder="请输入提示信息" v-model="item.input"></u-input> </u-form-item> <u-form-item v-if="item.type == 'phone'" :required="item.required" :newprop="item.field" class="diygw-col-24" :label="item.title" prop="phone"> <u-input placeholder="请输入提示信息" v-model="item.phone"></u-input> </u-form-item> <u-form-item v-if="item.type == 'sign'" :required="item.required" :newprop="item.field" class="diygw-col-24" :label="item.title" prop="sign"> <diy-signature v-model="item.sign"></diy-signature> </u-form-item> <u-form-item v-if="item.type == 'datetime'" :required="item.required" :newprop="item.field" class="diygw-col-24" :label="item.title" prop="datetime"> <u-input @click="item.showDatetime = true" class="" placeholder="请选择" v-model="item.datetime" type="select"></u-input> <u-picker :defaultTime="item.datetime" v-model="item.showDatetime" mode="time" :params="item.paramsDatetime" @confirm="changeItemDatetime($event, index, item)"></u-picker> </u-form-item> <u-form-item v-if="item.type == 'img'" :required="item.required" :newprop="item.field" class="diygw-col-24" :label="item.title" prop="img"> <u-upload :index="index" width="160" height="160" maxCount="6" @on-success="uploadItemImg" @on-remove="delItemImg" action="/sys/storage/upload" v-model="item.img"> </u-upload> </u-form-item> <u-form-item v-if="item.type == 'rate'" :required="item.required" :newprop="item.field" class="diygw-col-24" :label="item.title" prop="rate"> <view class="flex diygw-col-24"> <u-rate activeColor="#07c160" active-icon="starfill" inactive-icon="starfill" custom-prefix="diy-icon" size="48" inactiveColor="#eee" :count="5" @change="changeItemRate($event, index, item)" v-model="item.rate"></u-rate> </view> </u-form-item> <u-form-item v-if="item.type == 'textarea'" :required="item.required" :newprop="item.field" class="diygw-col-24" :label="item.title" prop="textarea"> <u-input maxlength="200" height="60px" class="" placeholder="请输入提示信息" v-model="item.textarea" type="textarea"></u-input> </u-form-item> <u-form-item v-if="item.type == 'select'" :required="item.required" :newprop="item.field" class="diygw-col-24" :label="item.title" prop="select"> <diy-selectinput @click="item.showSelect = true" class="diygw-col-24" valueName="value" labelName="value" :list="item.datas" placeholder="请选择" v-model="item.select" type="select"></diy-selectinput> <u-select mode="single-column" valueName="value" labelName="value" :list="item.datas" isDefaultSelect :defaultSelectValue="item.select" v-model="item.showSelect" @confirm="changeItemSelect($event, index, item)"></u-select> </u-form-item> <u-form-item v-if="item.type == 'slider'" :required="item.required" :newprop="item.field" class="diygw-col-24" :label="item.title" prop="slider"> <view class="flex1 flex align-center diygw-col-24"> <u-slider class="flex1" active-color="#07c160" blockWidth="50" @change="changeItemSlider($event, index, item)" name="slider" v-model="item.slider" :min="0" :max="100" :step="1" /> </view> </u-form-item> <u-form-item class="diygw-col-24" v-if="item.type == 'checkbox'" :required="item.required" :newprop="item.field" :label="item.title" prop="checkbox"> <u-checkbox-group class="flex flex-wrap diygw-col-24 justify-between" wrapClass=" justify-between" v-model="item.checkbox"> <u-checkbox class="diygw-col-24" v-for="(checkboxitem, checkboxindex) in item.datas" :key="checkboxindex" :name="checkboxitem.value"> {{ checkboxitem.value }} </u-checkbox> </u-checkbox-group> </u-form-item> <u-form-item v-if="item.type == 'radio'" :required="item.required" :newprop="item.field" class="diygw-col-24" :label="item.title" prop="radio"> <u-radio-group class="flex flex-wrap diygw-col-24 justify-between" wrapClass=" justify-between" v-model="item.radio"> <u-radio class="diygw-col-24" shape="circle" v-for="(radioitem, radioindex) in item.datas" :key="radioindex" :name="radioitem.value"> {{ radioitem.value }} </u-radio> </u-radio-group> </u-form-item> </view> </u-form> <view v-if="data.code == 200 && !showForm" class="flex flex-wrap diygw-col-24 flex-direction-column"> <view class="flex diygw-col-24"> <swiper :current="swiperIndex" class="swiper swiper-indicator_rect_radius" @change="changeSwiper" indicator-color="rgba(51, 51, 51, 0.39)" indicator-active-color="#fff" indicator-dots="true" autoplay interval="3000" circular="true" style="height: 300rpx"> <swiper-item v-for="(item, index) in data.data.imgs" :key="index" class="diygw-swiper-item"> <view class="diygw-swiper-item-wrap"> <image :src="item" class="diygw-swiper-image"></image> </view> </swiper-item> </swiper> </view> <view class="flex flex-wrap diygw-col-24 flex-direction-column justify-center items-center flex6-clz"> <text class="diygw-text-line3 diygw-col-24 text20-clz"> {{ data.data.title }} </text> <view class="flex flex-wrap diygw-col-24 justify-between items-center flex4-clz"> <view class="flex flex-wrap diygw-col-0 justify-between items-baseline flex9-clz"> <text class="flex icon1 diygw-col-0 diy-icon-attention"></text> <text class="diygw-text-line3 diygw-col-0"> 浏览: </text> <text class="diygw-text-line3 diygw-col-0"> {{ data.data.views }} </text> </view> <view class="flex flex-wrap diygw-col-0 justify-between items-baseline flex10-clz"> <text class="flex icon3 diygw-col-0 diy-icon-people"></text> <text class="diygw-text-line3 diygw-col-0"> 报名: </text> <text class="diygw-text-line3 diygw-col-0"> {{ data.data.baomingnum }} </text> </view> </view> </view> <view v-if="!data.data.isover" class="flex flex-wrap diygw-col-24 justify-between items-center flex16-clz"> <view class="flex flex-wrap diygw-col-24 items-center flex17-clz"> <text class="flex icon6 diygw-col-0 icon6-clz diy-icon-titles"></text> <text class="diygw-text-line1 diygw-col-0 text11-clz"> 距活动结束 </text> <view class="flex flex-direction-column diygw-col-0 countdown-clz"> <u-count-down ref="refCountdown" :timestamp="data.data.countdown" format="DD天HH时mm分ss秒" @end="finishCountdown"> </u-count-down> </view> </view> </view> <view class="flex flex-wrap diygw-col-24 justify-between items-center flex7-clz"> <view class="flex flex-wrap diygw-col-24 items-center flex34-clz"> <text class="flex icon diygw-col-0 icon-clz diy-icon-titles"></text> <text class="diygw-text-line1 diygw-col-0 text26-clz"> 签到时间 </text> </view> <view class="flex flex-wrap diygw-col-24 items-center flex8-clz"> <text class="flex icon2 diygw-col-0 diy-icon-time"></text> <text class="diygw-text-line1 diygw-col-0 text1-clz"> {{ data.data.starttime }} 至 {{ data.data.endtime }} </text> </view> </view> <view class="flex flex-wrap diygw-col-24 justify-between items-center flex11-clz"> <view class="flex flex-wrap diygw-col-24 items-center flex12-clz"> <text class="flex icon4 diygw-col-0 icon4-clz diy-icon-titles"></text> <text class="diygw-text-line1 diygw-col-0 text2-clz"> 活动地点 </text> </view> <view class="flex flex-wrap diygw-col-24 items-center flex13-clz"> <text class="flex icon5 diygw-col-0 diy-icon-location"></text> <text class="diygw-text-line1 diygw-col-0 text4-clz"> {{ data.data.address }} </text> </view> </view> <view v-if="data.data.content" class="flex flex-wrap diygw-col-24 flex-direction-column justify-center items-center flex5-clz"> <view class="flex flex-wrap diygw-col-24 items-center flex14-clz"> <view class="flex diygw-col-0 line1-clz"> <view class="diygw-pzx" style="border-bottom: 1px solid #eee"></view> </view> <text class="diygw-text-line1 diygw-col-0 text5-clz"> 活动详情 </text> <view class="flex diygw-col-0 line-clz"> <view class="diygw-pzx" style="border-bottom: 1px solid #eee"></view> </view> </view> <mp-html :content="data.data.content" class="diygw-col-24 ucontent1-clz"></mp-html> </view> </view> <view v-if="globalData.isshow" class="flex flex-wrap diygw-col-24 justify-start diygw-bottom flex3-clz"> <view v-if="showForm" class="flex diygw-col-24"> <button @tap="showForm = false" class="diygw-btn red radius flex-sub margin-xs button1-button-clz">取消</button> <button @click="submitForm" class="diygw-btn green radius flex-sub margin-xs button1-button-clz">预约</button> </view> <view v-if="!showForm && data.data.isover" class="flex flex-wrap diygw-col-24 justify-center items-center flex20-clz" @tap="showForm = true"> <text class="diygw-col-0"> 活动已结束 </text> </view> <view v-if="!showForm && !data.data.isover && data.data.isuser" class="flex flex-wrap diygw-col-24 justify-center items-center flex15-clz" @tap="showForm = true"> <text class="diygw-col-0"> 已报名 </text> </view> <view v-if="!showForm && !data.data.isover && !data.data.isuser" class="flex flex-wrap diygw-col-24 justify-center items-center green flex2-clz" @tap="navigateTo" data-type="addFunction"> <text class="diygw-col-0"> 立即预约 </text> </view> </view> <view class="clearfix"></view> </view> </template> <script> export default { data() { return { //用户全局信息 userInfo: {}, //页面传参 globalOption: {}, //自定义全局变量 globalData: { datas: [ { field: 'radio', options: [ { id: 'A', content: '微信小程序' }, { id: 'B', content: '支付宝小程序' }, { id: 'C', content: 'UniApp小程序' }, { id: 'D', content: 'UniApp-uView小程序' } ], title: '单选标题', type: 'radio', radio: '' }, { select: '', field: 'select', options: [ { id: 'A', content: '微信小程序' }, { id: 'B', content: '支付宝小程序' }, { id: 'C', content: 'UniApp小程序' }, { id: 'D', content: 'UniApp-uView小程序' } ], title: '下拉标题', type: 'select' }, { field: 'checkbox', options: [ { id: 'A', content: 'UniApp' }, { id: 'B', content: '微信小程序' }, { id: 'C', content: '支付宝小程序' }, { id: 'D', content: 'QQ小程序' } ], checkbox: [], title: '多选标题', type: 'checkbox' }, { input: '', field: 'input', title: '单行输入', type: 'input' }, { kaiguang: '', field: 'kaiguang', title: '开关标题', type: 'kaiguang' }, { slider: '', field: 'slider', title: '滑块', type: 'slider' }, { field: 'textarea', textarea: '', title: '多行输入', type: 'textarea' }, { field: 'rate', rate: '', title: '评分', type: 'rate' }, { date: '', field: 'date', title: '日期', type: 'date' } ] }, dataNum: 1, data: { code: 0, msg: '', data: { id: 0, title: '', remark: '', starttime: '', endtime: '', address: '', num: 0, views: 0, baomingnum: 0, imgs: [], img: '', content: '', fields: [], userId: 0, createTime: '', updateTime: '', deleteTime: null, baomingEndtime: '' } }, huodongDataNum: 1, huodongData: { rows: [ { id: 0, title: '', img: '', remark: '', data: null, huodongId: 0, huodongTitle: '', userId: 0, createTime: '', updateTime: '', deleteTime: null } ], total: 0, code: 0, msg: '' }, viewNum: 1, view: { code: 200, msg: '设置成功' }, swiperIndex: 0, showForm: false, item: { kaiguang: 1, showDate: false, date: '', input: '', phone: '', sign: '', paramsDatetime: { year: true, month: true, day: true, hour: true, minute: true, second: false }, showDatetime: false, datetime: '', img: '', rateCount: 5, rate: 3, textarea: '', showSelect: false, select: '', slider: 66, checkbox: [], radio: '' }, formRules: { title: [ { trigger: ['change', 'blur'], required: true, message: '不能为空哟' } ] }, form: { title: '', remark: '' } }; }, watch: { data: { handler(newVal, oldVal) { newVal.data.fields.forEach((item) => { this.form[item.field] = item[item.type]; }); }, deep: true } }, 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); }, methods: { async init() { this.dataApi(); await this.initResetform(); }, // 文章数据 API请求方法 async dataApi(param) { let thiz = this; param = param || {}; //请求地址及请求数据,可以在加载前执行上面增加自己的代码逻辑 let http_url = '/cms/api.huodong/get'; let http_data = { pageNum: this.dataNum, pageSize: 10, id: param.id || this.globalOption.id }; let http_header = {}; let data = await this.$http.post(http_url, http_data, http_header, 'json'); if (!data.data) { this.showToast('详情不存在'); uni.navigateBack(); return; } data.data.imgs = data.data.imgs ? data.data.imgs.split(',') : []; data.data.fields = data.data.fields ? JSON.parse(data.data.fields) : []; data.data.isover = new Date(data.data.baomingEndtime).getTime() < new Date().getTime(); data.data.countdown = data.data.isover ? 0 : new Date(data.data.baomingEndtime).getTime() - new Date().getTime(); data.data.isuser = false; data.data.fields.forEach((item) => { item['show' + item.type.charAt(0).toUpperCase() + item.type.slice(1)] = false; if (item.required) { let rule = { trigger: ['change', 'blur'], required: true, message: item.title + '不能为空哟' }; if (item.type == 'checkbox') { rule.type = 'array'; } if (['checkbox', 'radio', 'select', 'date', 'datetime'].includes(item.type)) { rule.message = '请选择' + item.title; } else if (['img'].includes(item.type)) { rule.message = '请上传' + item.title; } this.formRules[item.field] = [rule]; } if (item.type == 'datetime') { item.paramsDatetime = { year: true, month: true, day: true, hour: true, minute: true, second: false }; } if (item.type == 'checkbox') { item['checkbox'] = []; this.form[item.field] = []; } else if (item.type == 'number') { item['number'] = undefined; this.form[item.field] = undefined; } else { item[item.type] = ''; this.form[item.field] = ''; } }); this.form.title = this.userInfo.nickname; this.data = data; if (this.userInfo.token) { await this.huodongDataApi({}); } await this.viewApi({}); this.data.data.view = this.data.data.view + 1; this.globalData.isshow = true; uni.setNavigationBarTitle({ title: data.data.title }); }, // 查询用户是否已报名 API请求方法 async huodongDataApi(param) { let thiz = this; param = param || {}; //请求地址及请求数据,可以在加载前执行上面增加自己的代码逻辑 let http_url = '/cms/api.huodongData/list'; let http_data = { pageNum: this.huodongDataNum, pageSize: 10, huodongId: param.huodongId || this.globalOption.id, isself: param.isself || '1' }; let http_header = {}; let huodongData = await this.$http.post(http_url, http_data, http_header, 'json'); this.huodongData = huodongData; this.data.data.isuser = huodongData.total > 0; }, // 查看数据增加 API请求方法 async viewApi(param) { let thiz = this; param = param || {}; //如果请求要重置页面,请配置点击附加参数refresh=1 增加判断如输入框回调param不是对象 if (param.refresh || typeof param != 'object') { this.viewNum = 1; } //请求地址及请求数据,可以在加载前执行上面增加自己的代码逻辑 let http_url = '/cms/api.huodong/incOrDec'; let http_data = { pageNum: this.viewNum, pageSize: 10, id: param.id || this.globalOption.id, key: param.key || 'views', value: param.value || '1' }; let http_header = {}; let view = await this.$http.post(http_url, http_data, http_header, 'json'); let datarows = view.rows; if (http_data.pageNum == 1) { this.view = view; } else if (datarows) { let rows = this.view.rows.concat(datarows); view.rows = rows; this.view = Object.assign(this.view, view); } if (datarows && datarows.length > 0) { this.viewNum = this.viewNum + 1; } }, // 倒计时结束 自定义方法 async overFunction(param) { let thiz = this; this.data.data.isover = true; }, // 新增预约 自定义方法 async addFunction(param) { let thiz = this; if (!this.$session.getToken()) { //比如未登录,转身到其他页面等 this.showToast('请先登录'); this.navigateTo({ type: 'page', url: 'login' }); return; } this.showForm = true; this.$nextTick(() => { if (this.$refs.formRef) { this.$refs.formRef.setRules(this.formRules); } }); }, changeItemDate(evt, index, item) { item.date = evt.result; }, changeItemDatetime(evt, index, item) { item.datetime = evt.year + '-' + evt.month + '-' + evt.day + ' ' + evt.hour + ':' + evt.minute; }, changeItemImg(index, lists, dataindex) {}, delItemImg(index, lists, dataindex) { this.changeItemImg(index, lists, index); }, uploadItemImg(res, index, lists, dataindex) { this.changeItemImg(index, lists, dataindex); }, changeItemRate(evt, index, item) {}, changeItemSelect(evt, index, item) { evt.map((val, index) => { item.select = val.value; }); }, changeItemSlider(evt, index, item) {}, 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.$nextTick(async () => { let valid = await this.$refs.formRef.validate(); if (valid) { //保存数据 let param = this.form; let header = {}; let url = '/cms/huodongData/add'; param.huodongId = this.data.data.id; param.huodongTitle = this.data.data.title; param.img = this.data.data.img; param.data = JSON.stringify(param); param.fields = JSON.stringify(this.data.data.fields); let res = await this.$http.post(url, param, header, 'json'); this.data.data.isuer = true; this.showForm = false; this.data.data.baomingnum = this.data.data.baomingnum + 1; if (res.code == 200) { this.showToast('预约成功', 'success'); } else { this.showModal(res.msg, '提示', false); } } else { console.log('验证失败'); } }); }, changeSwiper(evt) { let swiperIndex = evt.detail.current; this.setData({ swiperIndex }); }, finishCountdown() { this.navigateTo({ type: 'overFunction' }); } }, onPullDownRefresh() { // 查看数据增加 API请求方法 this.viewNum = 1; this.viewApi(); uni.stopPullDownRefresh(); }, onReachBottom() { // 查看数据增加 API请求方法 this.viewApi(); } }; </script> <style lang="scss" scoped> .form-clz { background-color: #ffffff; margin-left: 10rpx; border-bottom-left-radius: 12rpx; overflow: hidden; width: calc(100% - 10rpx - 10rpx) !important; border-top-left-radius: 12rpx; margin-top: 10rpx; border-top-right-radius: 12rpx; border-bottom-right-radius: 12rpx; margin-bottom: 10rpx; margin-right: 10rpx; } .swiper-title { background-color: rgba(0, 0, 0, 0.281); } .flex6-clz { background-color: #fcfcfc; } .text20-clz { padding-top: 20rpx; font-weight: bold; padding-left: 20rpx; font-size: 28rpx !important; padding-bottom: 20rpx; border-bottom: 2rpx solid #eee; padding-right: 20rpx; } .flex4-clz { padding-top: 20rpx; padding-left: 20rpx; font-size: 28rpx !important; padding-bottom: 20rpx; padding-right: 20rpx; } .flex9-clz { padding-top: 10rpx; padding-left: 0rpx; padding-bottom: 10rpx; padding-right: 0rpx; } .icon1 { font-size: 32rpx; } .flex10-clz { padding-top: 10rpx; padding-left: 0rpx; padding-bottom: 10rpx; padding-right: 0rpx; } .icon3 { font-size: 32rpx; } .flex16-clz { background-color: #ffffff; margin-left: 0rpx; width: calc(100% - 0rpx - 0rpx) !important; margin-top: 20rpx; margin-bottom: 0rpx; border-bottom: 2rpx solid #eee; margin-right: 0rpx; } .flex17-clz { padding-top: 16rpx; padding-left: 10rpx; padding-bottom: 16rpx; border-bottom: 2rpx solid #eee; padding-right: 20rpx; } .icon6-clz { color: #00bc25; } .icon6 { font-size: 32rpx; } .text11-clz { padding-top: 0rpx; flex: 1; padding-left: 0rpx; font-size: 28rpx !important; padding-bottom: 0rpx; padding-right: 0rpx; } .countdown-clz { font-weight: bold; font-size: 28rpx !important; } .flex7-clz { background-color: #ffffff; margin-left: 0rpx; width: calc(100% - 0rpx - 0rpx) !important; margin-top: 20rpx; margin-bottom: 0rpx; border-bottom: 2rpx solid #eee; margin-right: 0rpx; } .flex34-clz { padding-top: 16rpx; padding-left: 10rpx; padding-bottom: 16rpx; border-bottom: 2rpx solid #eee; padding-right: 10rpx; } .icon-clz { color: #00bc25; } .icon { font-size: 32rpx; } .text26-clz { padding-top: 0rpx; flex: 1; padding-left: 0rpx; font-size: 28rpx !important; padding-bottom: 0rpx; padding-right: 0rpx; } .flex8-clz { padding-top: 16rpx; padding-left: 20rpx; padding-bottom: 16rpx; padding-right: 20rpx; } .icon2 { font-size: 32rpx; } .text1-clz { padding-top: 0rpx; flex: 1; padding-left: 0rpx; font-size: 28rpx !important; padding-bottom: 0rpx; padding-right: 0rpx; } .flex11-clz { background-color: #ffffff; margin-left: 0rpx; width: calc(100% - 0rpx - 0rpx) !important; margin-top: 20rpx; margin-bottom: 0rpx; border-bottom: 2rpx solid #eee; margin-right: 0rpx; } .flex12-clz { padding-top: 16rpx; padding-left: 10rpx; padding-bottom: 16rpx; border-bottom: 2rpx solid #eee; padding-right: 10rpx; } .icon4-clz { color: #00bc25; } .icon4 { font-size: 32rpx; } .text2-clz { padding-top: 0rpx; flex: 1; padding-left: 0rpx; font-size: 28rpx !important; padding-bottom: 0rpx; padding-right: 0rpx; } .flex13-clz { padding-top: 16rpx; padding-left: 20rpx; padding-bottom: 16rpx; padding-right: 20rpx; } .icon5 { font-size: 32rpx; } .text4-clz { padding-top: 0rpx; flex: 1; padding-left: 0rpx; font-size: 28rpx !important; padding-bottom: 0rpx; padding-right: 0rpx; } .flex5-clz { background-color: #ffffff; margin-left: 0rpx; width: calc(100% - 0rpx - 0rpx) !important; margin-top: 20rpx; margin-bottom: 0rpx; border-bottom: 2rpx solid #eee; margin-right: 0rpx; } .flex14-clz { padding-top: 16rpx; padding-left: 10rpx; padding-bottom: 16rpx; border-bottom: 2rpx solid #eee; padding-right: 10rpx; } .line1-clz { flex: 1; } .text5-clz { margin-left: 10rpx; font-size: 28rpx !important; margin-top: 10rpx; margin-bottom: 10rpx; margin-right: 10rpx; } .line-clz { flex: 1; } .ucontent1-clz { padding-top: 16rpx; padding-left: 20rpx; padding-bottom: 16rpx; border-bottom: 2rpx solid #eee; padding-right: 20rpx; } .flex3-clz { border-top: 2rpx solid #eee; 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; box-shadow: 0rpx 2rpx 6rpx rgba(31, 31, 31, 0.21); overflow: hidden; left: 0rpx; border-top-left-radius: 20rpx; border-bottom-right-radius: 0rpx; padding-right: 16rpx; } .button1-button-clz { margin: 6rpx !important; } .flex20-clz { background-color: #d6d6d6; 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; } .flex15-clz { background-color: #d6d6d6; 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; } .flex2-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; } .container335134 { padding-bottom: 160rpx; background-color: #f5f5f5; } </style>个人中心
个人中心把其他功能串起来,方便发布其他内容
<template> <view class="container container335134"> <!-- #ifdef MP-WEIXIN --> <u-navbar @change="changeNavbarHeight" :isFixed="true" :isMarginRight="false" :borderBottom="false" title="" :background="{}" :backTextStyle="{ color: 'inherit' }" backIconColor="#fff" titleColor="inherit" :isHome="false" :isBack="false"> <view class="flex align-center diygw-text-md text-bold align-center flex-nowrap diygw-col-24"> </view> </u-navbar> <!-- #endif --> <view class="flex diygw-col-24 flex-direction-column items-start flex-nowrap flex73-clz"> <view class="flex flex-wrap diygw-col-24 items-center flex74-clz"> <image :src="userInfo.avatar || '/static/avatar.png'" class="image8-size diygw-image diygw-col-0 image8-clz" mode="widthFix"></image> <view class="flex flex-wrap diygw-col-0 justify-between flex3-clz"> <text class="diygw-text-line1 diygw-col-0 text5-clz"> {{ userInfo.nickname || '请先登录' }} </text> </view> </view> <view class="flex flex-wrap diygw-col-24 flex-direction-column flex-clz"> <view class="flex flex-wrap diygw-col-24"> <view class="flex flex-wrap diygw-col-8 flex-direction-column items-center" @tap="navigateTo" data-type="page" data-url="/pages/cms/cate"> <image src="/static/sc.png" class="image7-size diygw-image diygw-col-0" mode="widthFix"></image> <text class="diygw-text-line1 diygw-col-0"> 我的收藏 </text> </view> <view class="flex flex-wrap diygw-col-8 flex-direction-column items-center" @tap="navigateTo" data-type="page" data-url="/pages/huodong/mydata"> <image src="/static/bmjl.png" class="image10-size diygw-image diygw-col-0" mode="widthFix"></image> <text class="diygw-text-line1 diygw-col-0"> 我的报名 </text> </view> <view class="flex flex-wrap diygw-col-8 flex-direction-column items-center" @tap="navigateTo" data-type="page" data-url="/pages/article" data-id="1"> <image src="/static/gy.png" class="image11-size diygw-image diygw-col-0" mode="widthFix"></image> <text class="diygw-text-line1 diygw-col-0"> 关于我们 </text> </view> </view> </view> <view class="flex flex-wrap diygw-col-24 flex-direction-column flex1-clz"> <view class="flex flex-wrap diygw-col-24"> <view class="flex flex-wrap diygw-col-24 items-center flex2-clz" @tap="navigateTo" data-type="page" data-url="/pages/huodong/index"> <image src="/static/yy.png" class="image17-size diygw-image diygw-col-0" mode="widthFix"></image> <text class="diygw-text-line1 diygw-col-0 text-clz"> 我的活动 </text> </view> <view class="flex flex-wrap diygw-col-24 items-center flex27-clz" @tap="navigateTo" data-type="phone" data-phone="15913132246"> <image src="/static/kfdh.png" class="image12-size diygw-image diygw-col-0" mode="widthFix"></image> <text class="diygw-text-line1 diygw-col-0 text18-clz"> 客服电话 </text> </view> <view class="flex flex-wrap diygw-col-24 items-center flex30-clz" @tap="navigateTo" data-type="page" data-url="/pages/msg/edit"> <image src="/static/fkjl.png" class="image19-size diygw-image diygw-col-0" mode="widthFix"></image> <text class="diygw-text-line1 diygw-col-0 text21-clz"> 在线预约 </text> </view> <view class="flex flex-wrap diygw-col-24 items-center flex5-clz" @tap="navigateTo" data-type="page" data-url="/pages/article" data-id="1"> <image src="/static/gy.png" class="image-size diygw-image diygw-col-0" mode="widthFix"></image> <text class="diygw-text-line1 diygw-col-0 text1-clz"> 关于我们 </text> </view> </view> </view> <view v-if="userInfo.username == 'admin'" class="flex flex-wrap diygw-col-24 flex-direction-column flex7-clz"> <text class="diygw-col-24 text17-clz"> 管理员管理功能 </text> <view class="flex flex-wrap diygw-col-24"> <view class="flex flex-wrap diygw-col-6 flex-direction-column items-center" @tap="navigateTo" data-type="page" data-url="/pages/cms/cate"> <image src="/static/cl.png" class="image2-size diygw-image diygw-col-0 image2-clz" mode="widthFix"></image> <text class="diygw-text-line1 diygw-col-0 text3-clz"> 我的收藏 </text> </view> <view class="flex flex-wrap diygw-col-6 flex-direction-column items-center" @tap="navigateTo" data-type="page" data-url="/pages/cms/article"> <image src="/static/zxxjsbbf.png" class="image9-size diygw-image diygw-col-0 image9-clz" mode="widthFix"></image> <text class="diygw-text-line1 diygw-col-0 text11-clz"> 文章管理 </text> </view> <view class="flex flex-wrap diygw-col-6 flex-direction-column items-center" @tap="navigateTo" data-type="page" data-url="/pages/cms/product"> <image src="/static/zxxjsbbf.png" class="image13-size diygw-image diygw-col-0 image13-clz" mode="widthFix"></image> <text class="diygw-text-line1 diygw-col-0 text14-clz"> 产品管理 </text> </view> <view class="flex flex-wrap diygw-col-6 flex-direction-column items-center" @tap="navigateTo" data-type="page" data-url="/pages/cms/swiper"> <image src="/static/cb.png" class="image14-size diygw-image diygw-col-0 image14-clz" mode="widthFix"></image> <text class="diygw-text-line1 diygw-col-0 text15-clz"> 轮播管理 </text> </view> <view class="flex flex-wrap diygw-col-6 flex-direction-column items-center" @tap="navigateTo" data-type="page" data-url="/pages/cms/notice"> <image src="/static/cb.png" class="image15-size diygw-image diygw-col-0 image15-clz" mode="widthFix"></image> <text class="diygw-text-line1 diygw-col-0 text16-clz"> 消息管理 </text> </view> </view> </view> </view> <view class="flex flex-wrap diygw-col-24 items-end diygw-bottom flex6-clz"> <view class="flex flex-wrap diygw-col-6 flex-direction-column items-center flex8-clz" @tap="navigateTo" data-type="page" data-url="/pages/index" data-redirect="1"> <view class="flex flex-wrap diygw-col-0 flex-direction-column items-center"> <image src="/static/sy3.png" class="image1-size diygw-image diygw-col-0" mode="widthFix"></image> </view> <text class="diygw-text-line1 diygw-col-0"> 首页 </text> </view> <view class="flex flex-wrap diygw-col-6 flex-direction-column items-center flex10-clz" @tap="navigateTo" data-type="page" data-url="/pages/huodong" data-redirect="1"> <view class="flex flex-wrap diygw-col-0 flex-direction-column items-center"> <image src="/static/cp1.png" class="image3-size diygw-image diygw-col-0" mode="widthFix"></image> </view> <text class="diygw-text-line1 diygw-col-0"> 活动 </text> </view> <view class="flex flex-wrap diygw-col-6 flex-direction-column items-center flex14-clz" @tap="navigateTo" data-type="page" data-url="/pages/articles" data-redirect="1"> <view class="flex flex-wrap diygw-col-0 flex-direction-column items-center"> <text class="diygw-text-line1 diygw-col-0 animate__animated animate__heartBeat animate__infinite text7-clz"> </text> <image src="/static/xw1.png" class="image4-size diygw-image diygw-col-0" mode="widthFix"></image> </view> <text class="diygw-text-line1 diygw-col-0"> 新闻资讯 </text> </view> <view class="flex flex-wrap diygw-col-6 flex-direction-column items-center flex15-clz"> <view class="flex flex-wrap diygw-col-0 flex-direction-column items-center"> <image src="/static/wd1.png" class="image5-size diygw-image diygw-col-0" mode="widthFix"></image> </view> <text class="diygw-text-line1 diygw-col-0 text9-clz"> 我的 </text> </view> </view> <view class="clearfix"></view> </view> </template> <script> export default { data() { return { //用户全局信息 userInfo: {}, //页面传参 globalOption: {}, //自定义全局变量 globalData: {}, navbarHeight: 0 }; }, onShow() { this.setCurrentPage(this); }, onLoad(option) { this.setCurrentPage(this); if (option) { this.setData({ globalOption: this.getOption(option) }); } this.init(); }, methods: { async init() { await this.isloginFunction(); }, // 判断是否登录 自定义方法 async isloginFunction(param) { let thiz = this; if (!this.$session.getToken()) { //比如未登录,转身到其他页面等 this.showToast('请先登录'); this.navigateTo({ type: 'page', url: 'login' }); return; } }, changeNavbarHeight(val) { this.navbarHeight = val; } } }; </script> <style lang="scss" scoped> .flex73-clz { margin-left: 10rpx; padding-top: 20rpx; padding-left: 20rpx; width: calc(100% - 10rpx - 10rpx) !important; padding-bottom: 20rpx; margin-top: 10rpx; margin-bottom: 10rpx; margin-right: 10rpx; padding-right: 20rpx; } .flex74-clz { margin-left: 0rpx; width: calc(100% - 0rpx - 0rpx) !important; margin-top: 10rpx; margin-bottom: 10rpx; margin-right: 0rpx; } .image8-clz { border-bottom-left-radius: 120rpx; overflow: hidden; border-top-left-radius: 120rpx; border-top-right-radius: 120rpx; border-bottom-right-radius: 120rpx; } .image8-size { height: 96rpx !important; width: 96rpx !important; } .flex3-clz { padding-top: 10rpx; flex: 1; padding-left: 10rpx; padding-bottom: 10rpx; padding-right: 10rpx; } .text5-clz { font-weight: bold; font-size: 40rpx !important; } .flex-clz { padding-top: 20rpx; border-bottom-left-radius: 12rpx; padding-left: 10rpx; padding-bottom: 20rpx; border-top-right-radius: 12rpx; margin-right: 0rpx; background-color: #ffffff; margin-left: 0rpx; overflow: hidden; width: calc(100% - 0rpx - 0rpx) !important; border-top-left-radius: 12rpx; margin-top: 20rpx; border-bottom-right-radius: 12rpx; margin-bottom: 20rpx; padding-right: 10rpx; } .image7-size { height: 72rpx !important; width: 72rpx !important; } .image10-size { height: 72rpx !important; width: 72rpx !important; } .image11-size { height: 72rpx !important; width: 72rpx !important; } .flex1-clz { padding-top: 10rpx; border-bottom-left-radius: 12rpx; padding-left: 10rpx; padding-bottom: 10rpx; border-top-right-radius: 12rpx; margin-right: 0rpx; background-color: #ffffff; margin-left: 0rpx; overflow: hidden; width: calc(100% - 0rpx - 0rpx) !important; border-top-left-radius: 12rpx; margin-top: 20rpx; border-bottom-right-radius: 12rpx; margin-bottom: 20rpx; padding-right: 10rpx; } .flex2-clz { margin-left: 10rpx; padding-top: 10rpx; padding-left: 10rpx; width: calc(100% - 10rpx - 10rpx) !important; padding-bottom: 10rpx; margin-top: 10rpx; margin-bottom: 10rpx; border-bottom: 2rpx solid #eee; margin-right: 10rpx; padding-right: 10rpx; } .image17-size { height: 60rpx !important; width: 60rpx !important; } .text-clz { padding-top: 10rpx; padding-left: 10rpx; padding-bottom: 10rpx; padding-right: 10rpx; } .flex27-clz { margin-left: 10rpx; padding-top: 10rpx; padding-left: 10rpx; width: calc(100% - 10rpx - 10rpx) !important; padding-bottom: 10rpx; margin-top: 10rpx; margin-bottom: 10rpx; border-bottom: 2rpx solid #eee; margin-right: 10rpx; padding-right: 10rpx; } .image12-size { height: 60rpx !important; width: 60rpx !important; } .text18-clz { padding-top: 10rpx; padding-left: 10rpx; padding-bottom: 10rpx; padding-right: 10rpx; } .flex30-clz { margin-left: 10rpx; padding-top: 10rpx; padding-left: 10rpx; width: calc(100% - 10rpx - 10rpx) !important; padding-bottom: 10rpx; margin-top: 10rpx; margin-bottom: 10rpx; border-bottom: 2rpx solid #eee; margin-right: 10rpx; padding-right: 10rpx; } .image19-size { height: 64rpx !important; width: 64rpx !important; } .text21-clz { padding-top: 10rpx; padding-left: 10rpx; padding-bottom: 10rpx; padding-right: 10rpx; } .flex5-clz { margin-left: 10rpx; padding-top: 10rpx; padding-left: 10rpx; width: calc(100% - 10rpx - 10rpx) !important; padding-bottom: 10rpx; margin-top: 10rpx; margin-bottom: 10rpx; border-bottom: 2rpx solid #eee; margin-right: 10rpx; padding-right: 10rpx; } .image-size { height: 64rpx !important; width: 64rpx !important; } .text1-clz { padding-top: 10rpx; padding-left: 10rpx; padding-bottom: 10rpx; padding-right: 10rpx; } .flex7-clz { padding-top: 10rpx; border-bottom-left-radius: 12rpx; padding-left: 10rpx; padding-bottom: 10rpx; border-top-right-radius: 12rpx; margin-right: 0rpx; background-color: #ffffff; margin-left: 0rpx; overflow: hidden; width: calc(100% - 0rpx - 0rpx) !important; border-top-left-radius: 12rpx; margin-top: 20rpx; border-bottom-right-radius: 12rpx; margin-bottom: 20rpx; padding-right: 10rpx; } .text17-clz { margin-left: 10rpx; padding-top: 10rpx; font-weight: bold; padding-left: 10rpx; width: calc(100% - 10rpx - 10rpx) !important; font-size: 28rpx !important; padding-bottom: 10rpx; margin-top: 10rpx; margin-bottom: 10rpx; margin-right: 10rpx; padding-right: 10rpx; } .image2-clz { border-bottom-left-radius: 120rpx; overflow: hidden; border-top-left-radius: 120rpx; border-top-right-radius: 120rpx; border-bottom-right-radius: 120rpx; } .image2-size { height: 80rpx !important; width: 80rpx !important; } .text3-clz { padding-top: 10rpx; padding-left: 10rpx; padding-bottom: 10rpx; padding-right: 10rpx; } .image9-clz { border-bottom-left-radius: 120rpx; overflow: hidden; border-top-left-radius: 120rpx; border-top-right-radius: 120rpx; border-bottom-right-radius: 120rpx; } .image9-size { height: 80rpx !important; width: 80rpx !important; } .text11-clz { padding-top: 10rpx; padding-left: 10rpx; padding-bottom: 10rpx; padding-right: 10rpx; } .image13-clz { border-bottom-left-radius: 120rpx; overflow: hidden; border-top-left-radius: 120rpx; border-top-right-radius: 120rpx; border-bottom-right-radius: 120rpx; } .image13-size { height: 80rpx !important; width: 80rpx !important; } .text14-clz { padding-top: 10rpx; padding-left: 10rpx; padding-bottom: 10rpx; padding-right: 10rpx; } .image14-clz { border-bottom-left-radius: 120rpx; overflow: hidden; border-top-left-radius: 120rpx; border-top-right-radius: 120rpx; border-bottom-right-radius: 120rpx; } .image14-size { height: 80rpx !important; width: 80rpx !important; } .text15-clz { padding-top: 10rpx; padding-left: 10rpx; padding-bottom: 10rpx; padding-right: 10rpx; } .image15-clz { border-bottom-left-radius: 120rpx; overflow: hidden; border-top-left-radius: 120rpx; border-top-right-radius: 120rpx; border-bottom-right-radius: 120rpx; } .image15-size { height: 80rpx !important; width: 80rpx !important; } .text16-clz { padding-top: 10rpx; padding-left: 10rpx; padding-bottom: 10rpx; padding-right: 10rpx; } .flex6-clz { border-top: 2rpx solid #e4e4e4; padding-top: 16rpx; border-bottom-left-radius: 0rpx; bottom: 0rpx; padding-left: 16rpx; padding-bottom: 16rpx; border-top-right-radius: 24rpx; background-color: #ffffff; box-shadow: 0rpx 4rpx 12rpx rgba(31, 31, 31, 0.16); overflow: visible; left: 0rpx; border-top-left-radius: 24rpx; border-bottom-right-radius: 0rpx; padding-right: 16rpx; } .flex8-clz { flex: 1; } .image1-size { height: 48rpx !important; width: 48rpx !important; } .flex10-clz { flex: 1; } .image3-size { height: 48rpx !important; width: 48rpx !important; } .flex14-clz { flex: 1; } .text7-clz { border: 2rpx solid #eee; border-bottom-left-radius: 40rpx; -webkit-animation-duration: 5000ms; color: #ffffff; animation-delay: 1000ms; -webkit-animation-delay: 1000ms; border-top-right-radius: 40rpx; right: -8rpx; background-color: rgba(255, 17, 17, 0.91); animation-duration: 5000ms; flex-shrink: 0; overflow: hidden; top: -8rpx; width: 16rpx !important; border-top-left-radius: 40rpx; border-bottom-right-radius: 40rpx; position: absolute; height: 16rpx !important; } .image4-size { height: 48rpx !important; width: 48rpx !important; } .flex15-clz { flex: 1; } .image5-size { height: 48rpx !important; width: 48rpx !important; } .text9-clz { color: #031aeb; } .container335134 { background-image: url(/static/loginbg.png); background-position: top center; background-size: cover; background-repeat: no-repeat; } </style>uniapp可视化-活动报名表单系统-代码生成器由讯客互联IT业界栏目发布,感谢您对讯客互联的认可,以及对我们原创作品以及文章的青睐,非常欢迎各位朋友分享到个人网站或者朋友圈,但转载请说明文章出处“uniapp可视化-活动报名表单系统-代码生成器”