diff --git a/src/main/java/io/v/nutz/zhgh/coffeeTicket/controller/CoffeeTicketNewController.java b/src/main/java/io/v/nutz/zhgh/coffeeTicket/controller/CoffeeTicketNewController.java index 411ea0c..7c45ea5 100644 --- a/src/main/java/io/v/nutz/zhgh/coffeeTicket/controller/CoffeeTicketNewController.java +++ b/src/main/java/io/v/nutz/zhgh/coffeeTicket/controller/CoffeeTicketNewController.java @@ -3,6 +3,7 @@ package io.v.nutz.zhgh.coffeeTicket.controller; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.StrUtil; import io.v.nutz.base.result.Result; +import io.v.nutz.base.utils.Html2Text; import io.v.nutz.zhgh.coffeeTicket.models.CoffeeTicketActivity; import io.v.nutz.zhgh.coffeeTicket.service.CoffeeTicketActivityService; import org.nutz.aop.interceptor.ioc.TransAop; @@ -36,7 +37,7 @@ public class CoffeeTicketNewController { /** * 保存咖啡抢票活动。 * - * @param activity 页面提交的活动配置,包含标题、封面、描述、活动开始/结束日期、可预约星期、活动总票数、每人每次可抢票数、每日预约时间段、可报名人员范围、预约方式、活动地点和参与须知 + * @param activity 页面提交的活动配置,包含标题、封面、描述、活动开始/结束日期、可预约星期、票池模式、票池数量、每人每次可抢票数、每日预约时间段、可报名人员范围、预约方式、活动地点和参与须知 * @return Result,成功时 data 为 CoffeeTicketActivity,可通过 data.id 获取活动ID */ @At @@ -68,7 +69,8 @@ public class CoffeeTicketNewController { if (StrUtil.isBlank(activity.getCover())) { return Result.error("请上传活动封面"); } - if (StrUtil.isBlank(activity.getDescription())) { + // 富文本空编辑器会提交 p、br 等标签,必须按去除 HTML 后的实际文本判断必填内容。 + if (StrUtil.isBlank(Html2Text.toPlainText(activity.getDescription()))) { return Result.error("请输入活动描述"); } if (activity.getActivityStartDate() == null || activity.getActivityEndDate() == null) { @@ -80,14 +82,21 @@ public class CoffeeTicketNewController { if (CollUtil.isEmpty(activity.getWeekDays())) { return Result.error("请选择可预约星期"); } + if (StrUtil.isNotBlank(activity.getTicketMode()) + && !CoffeeTicketActivity.TICKET_MODE_TOTAL.equals(activity.getTicketMode()) + && !CoffeeTicketActivity.TICKET_MODE_DAILY.equals(activity.getTicketMode())) { + return Result.error("请选择有效的票池模式"); + } if (activity.getTicketCount() == null || activity.getTicketCount() <= 0) { - return Result.error("活动总票数必须大于0"); + return Result.error(CoffeeTicketActivity.TICKET_MODE_DAILY.equals(activity.getTicketMode()) + ? "每日票数必须大于0" : "活动总票数必须大于0"); } if (activity.getPerUserTicketNum() == null || activity.getPerUserTicketNum() <= 0) { return Result.error("每人每次可抢票数必须大于0"); } if (activity.getPerUserTicketNum() > activity.getTicketCount()) { - return Result.error("每人每次可抢票数不能大于活动总票数"); + return Result.error(CoffeeTicketActivity.TICKET_MODE_DAILY.equals(activity.getTicketMode()) + ? "每人每天可抢票数不能大于每日票数" : "每人每次可抢票数不能大于活动总票数"); } if (StrUtil.isBlank(activity.getReserveStartTime()) || StrUtil.isBlank(activity.getReserveEndTime())) { return Result.error("请选择每日可预约时间段"); diff --git a/src/main/java/io/v/nutz/zhgh/coffeeTicket/h5controller/H5CoffeeTicketDetailController.java b/src/main/java/io/v/nutz/zhgh/coffeeTicket/h5controller/H5CoffeeTicketDetailController.java index 0faf208..0b5afaf 100644 --- a/src/main/java/io/v/nutz/zhgh/coffeeTicket/h5controller/H5CoffeeTicketDetailController.java +++ b/src/main/java/io/v/nutz/zhgh/coffeeTicket/h5controller/H5CoffeeTicketDetailController.java @@ -1,12 +1,9 @@ package io.v.nutz.zhgh.coffeeTicket.h5controller; -import cn.hutool.core.bean.BeanUtil; import io.v.nutz.base.result.Result; import io.v.nutz.web.commons.utils.ShiroUtil; -import io.v.nutz.zhgh.coffeeTicket.models.CoffeeTicketActivity; import io.v.nutz.zhgh.coffeeTicket.models.CoffeeTicketRecord; import io.v.nutz.zhgh.coffeeTicket.service.CoffeeTicketActivityService; -import io.v.nutz.zhgh.coffeeTicket.service.CoffeeTicketRecordService; import io.v.nutz.zhgh.coffeeTicket.vo.CoffeeTicketActivityH5DetailVO; import org.apache.shiro.authz.annotation.RequiresAuthentication; import org.nutz.aop.interceptor.ioc.TransAop; @@ -16,7 +13,6 @@ import org.nutz.ioc.loader.annotation.IocBean; import org.nutz.mvc.annotation.At; import org.nutz.mvc.annotation.Ok; import org.nutz.mvc.annotation.Param; -import org.apache.shiro.authz.annotation.RequiresPermissions; import javax.validation.Valid; @@ -28,9 +24,6 @@ public class H5CoffeeTicketDetailController { @Inject private CoffeeTicketActivityService coffeeTicketActivityService; - @Inject - private CoffeeTicketRecordService coffeeTicketRecordService; - /** * 打开移动端咖啡抢票活动详情页面。 */ @@ -49,23 +42,12 @@ public class H5CoffeeTicketDetailController { @At @RequiresAuthentication public Result findOne(@Valid String id) { - CoffeeTicketActivity activity = coffeeTicketActivityService.fetch(id); - if (activity == null) { - return Result.error("活动不存在"); + try { + CoffeeTicketActivityH5DetailVO detailVO = coffeeTicketActivityService.h5DetailData(id, ShiroUtil.getUserId()); + return Result.success(detailVO); + } catch (IllegalStateException e) { + return Result.error(e.getMessage()); } - if (!Boolean.TRUE.equals(activity.getEnabled())) { - return Result.error("活动未开启"); - } - String scopeMsg = coffeeTicketActivityService.checkH5ActivityUserScope(activity, ShiroUtil.getUserId()); - if (scopeMsg != null) { - return Result.error(scopeMsg); - } - CoffeeTicketActivityH5DetailVO detailVO = BeanUtil.copyProperties(activity, CoffeeTicketActivityH5DetailVO.class); - CoffeeTicketRecord userRecord = coffeeTicketRecordService.fetchLatestUserRecord(id, ShiroUtil.getUserId()); - detailVO.setHasGrabbed(userRecord != null); - detailVO.setMyTicketNum(userRecord == null ? 0 : coffeeTicketRecordService.countUserTicketNum(id, ShiroUtil.getUserId())); - detailVO.setMyGrabTime(userRecord == null ? null : userRecord.getGrabTime()); - return Result.success(detailVO); } /** diff --git a/src/main/java/io/v/nutz/zhgh/coffeeTicket/models/CoffeeTicketActivity.java b/src/main/java/io/v/nutz/zhgh/coffeeTicket/models/CoffeeTicketActivity.java index ba64694..21082e5 100644 --- a/src/main/java/io/v/nutz/zhgh/coffeeTicket/models/CoffeeTicketActivity.java +++ b/src/main/java/io/v/nutz/zhgh/coffeeTicket/models/CoffeeTicketActivity.java @@ -25,6 +25,9 @@ import java.util.List; @TableMeta("{'mysql-charset':'utf8mb4'}") @Comment("咖啡抢票活动表") public class CoffeeTicketActivity extends BaseModel implements Serializable, SysHomeConvert { + public static final String TICKET_MODE_TOTAL = "TOTAL"; + public static final String TICKET_MODE_DAILY = "DAILY"; + @Name @Comment("ID") @ColDefine(type = ColType.VARCHAR, width = 32) @@ -62,7 +65,12 @@ public class CoffeeTicketActivity extends BaseModel implements Serializable, Sys private List weekDays; @Column - @Comment("活动总票数") + @Comment("票池模式:TOTAL整场总票池,DAILY每日票池") + @ColDefine(type = ColType.VARCHAR, width = 20) + private String ticketMode; + + @Column + @Comment("票池数量:TOTAL为活动总票数,DAILY为每日票数") @ColDefine(type = ColType.INT) private Integer ticketCount; diff --git a/src/main/java/io/v/nutz/zhgh/coffeeTicket/models/CoffeeTicketRecord.java b/src/main/java/io/v/nutz/zhgh/coffeeTicket/models/CoffeeTicketRecord.java index 68a4c70..43d2c2a 100644 --- a/src/main/java/io/v/nutz/zhgh/coffeeTicket/models/CoffeeTicketRecord.java +++ b/src/main/java/io/v/nutz/zhgh/coffeeTicket/models/CoffeeTicketRecord.java @@ -21,11 +21,13 @@ import java.util.Date; @Data @Table("coffee_ticket_record") @TableIndexes({ - @Index(name = "UK_COFFEE_TICKET_RECORD_ACTIVITY_USER", fields = {"activityId", "userId"}, unique = true) + @Index(name = "UK_COFFEE_TICKET_RECORD_ACTIVITY_USER_QUOTA", fields = {"activityId", "userId", "quotaKey"}, unique = true) }) @TableMeta("{'mysql-charset':'utf8mb4'}") @Comment("咖啡抢票记录表") public class CoffeeTicketRecord extends BaseModel implements Serializable { + public static final String QUOTA_KEY_TOTAL = "TOTAL"; + @Name @Comment("ID") @ColDefine(type = ColType.VARCHAR, width = 32) @@ -52,6 +54,11 @@ public class CoffeeTicketRecord extends BaseModel implements Serializable { @ColDefine(type = ColType.DATETIME) private Date grabTime; + @Column + @Comment("票池标识:整场票池为TOTAL,每日票池为yyyy-MM-dd") + @ColDefine(type = ColType.VARCHAR, width = 10) + private String quotaKey; + @Column @Comment("用户ID") @ColDefine(type = ColType.VARCHAR, width = 32) diff --git a/src/main/java/io/v/nutz/zhgh/coffeeTicket/service/CoffeeTicketActivityService.java b/src/main/java/io/v/nutz/zhgh/coffeeTicket/service/CoffeeTicketActivityService.java index e13c9b8..cfc27bb 100644 --- a/src/main/java/io/v/nutz/zhgh/coffeeTicket/service/CoffeeTicketActivityService.java +++ b/src/main/java/io/v/nutz/zhgh/coffeeTicket/service/CoffeeTicketActivityService.java @@ -5,6 +5,7 @@ import io.v.nutz.base.page.Pagination; import io.v.nutz.base.query.PageForm; import io.v.nutz.zhgh.coffeeTicket.models.CoffeeTicketActivity; import io.v.nutz.zhgh.coffeeTicket.models.CoffeeTicketRecord; +import io.v.nutz.zhgh.coffeeTicket.vo.CoffeeTicketActivityH5DetailVO; import java.util.List; @@ -13,7 +14,7 @@ public interface CoffeeTicketActivityService extends BaseService { /** - * 统计指定活动已经占用的票数。 + * 统计指定活动当前票池已经占用的票数。 * * @param activityId 活动ID,必须传 coffee_ticket_activity 表中的活动主键 - * @return int,返回 coffee_ticket_record 中该活动 ticketNum 的合计值,无记录时返回 0 + * @param quotaKey 票池标识,整场总票池传 TOTAL,每日票池传 yyyy-MM-dd + * @return int,返回当前票池中 ticketNum 的合计值,无记录时返回 0;TOTAL 会兼容 quotaKey 为空的历史记录 */ - int countGrabbedTicketNum(String activityId); + int countGrabbedTicketNum(String activityId, String quotaKey); /** - * 判断用户是否已经抢过指定活动的票。 + * 判断用户是否已经抢过指定活动当前票池的票。 * * @param activityId 活动ID * @param userId 当前登录用户ID - * @return boolean,true 表示该用户已有该活动抢票记录 + * @param quotaKey 票池标识,整场总票池传 TOTAL,每日票池传 yyyy-MM-dd + * @return boolean,true 表示该用户已有当前票池抢票记录 */ - boolean hasUserGrabbed(String activityId, String userId); + boolean hasUserGrabbed(String activityId, String userId, String quotaKey); /** - * 查询用户在指定活动下最近一次抢票记录。 + * 查询用户在指定活动当前票池下最近一次抢票记录。 * * @param activityId 活动ID * @param userId 当前登录用户ID + * @param quotaKey 票池标识,整场总票池传 TOTAL,每日票池传 yyyy-MM-dd * @return CoffeeTicketRecord,返回最近一次抢票记录;没有记录时返回 null */ - CoffeeTicketRecord fetchLatestUserRecord(String activityId, String userId); + CoffeeTicketRecord fetchLatestUserRecord(String activityId, String userId, String quotaKey); /** - * 统计用户在指定活动下已抢票数。 + * 统计用户在指定活动当前票池下已抢票数。 * * @param activityId 活动ID * @param userId 当前登录用户ID - * @return int,返回该用户在当前活动下 ticketNum 的合计值,无记录时返回 0 + * @param quotaKey 票池标识,整场总票池传 TOTAL,每日票池传 yyyy-MM-dd + * @return int,返回该用户在当前票池下 ticketNum 的合计值,无记录时返回 0 */ - int countUserTicketNum(String activityId, String userId); + int countUserTicketNum(String activityId, String userId, String quotaKey); + + /** + * 判断活动是否已经产生抢票记录,用于阻止活动在产生记录后切换票池模式。 + * + * @param activityId 活动ID,必须传 coffee_ticket_activity 表中的活动主键 + * @return boolean,true 表示活动至少存在一条抢票记录 + */ + boolean hasActivityRecord(String activityId); /** * 保存手机端抢票记录。 * * @param activity 已通过规则校验的活动实体,用于回填活动ID和标题 * @param ticketNum 本次抢票张数,当前 H5 详情页默认传 1 + * @param quotaKey 票池标识,整场总票池传 TOTAL,每日票池传 yyyy-MM-dd * @return CoffeeTicketRecord,返回已经写入数据库的抢票记录实体 */ - CoffeeTicketRecord saveGrabRecord(CoffeeTicketActivity activity, Integer ticketNum); + CoffeeTicketRecord saveGrabRecord(CoffeeTicketActivity activity, Integer ticketNum, String quotaKey); /** * 手机端分页查询当前用户的抢票记录。 diff --git a/src/main/java/io/v/nutz/zhgh/coffeeTicket/service/impl/CoffeeTicketActivityServiceImpl.java b/src/main/java/io/v/nutz/zhgh/coffeeTicket/service/impl/CoffeeTicketActivityServiceImpl.java index 0ffbd9f..81a6f3c 100644 --- a/src/main/java/io/v/nutz/zhgh/coffeeTicket/service/impl/CoffeeTicketActivityServiceImpl.java +++ b/src/main/java/io/v/nutz/zhgh/coffeeTicket/service/impl/CoffeeTicketActivityServiceImpl.java @@ -13,6 +13,7 @@ import io.v.nutz.zhgh.coffeeTicket.models.CoffeeTicketActivity; import io.v.nutz.zhgh.coffeeTicket.models.CoffeeTicketRecord; import io.v.nutz.zhgh.coffeeTicket.service.CoffeeTicketActivityService; import io.v.nutz.zhgh.coffeeTicket.service.CoffeeTicketRecordService; +import io.v.nutz.zhgh.coffeeTicket.vo.CoffeeTicketActivityH5DetailVO; import io.v.nutz.zhgh.coffeeTicket.vo.CoffeeTicketActivityH5ListVO; import org.nutz.aop.interceptor.ioc.TransAop; import org.nutz.dao.Cnd; @@ -42,10 +43,20 @@ public class CoffeeTicketActivityServiceImpl extends BaseServiceImpl statisticsActivityList(Integer year) { Cnd cnd = Cnd.NEW(); @@ -126,6 +162,18 @@ public class CoffeeTicketActivityServiceImpl extends BaseServiceImpl
-
活动总票数
-
{{formData.ticketCount || 0}} 张
+
{{isDailyMode ? '每日票数' : '活动总票数'}}
+
{{formData.totalTicketNum || 0}} 张
+
+
+ +
{{isDailyMode ? '今日剩余' : '剩余票数'}}
+
--
+
{{formData.remainingTicketNum || 0}} 张
- {{formData.hasGrabbed ? '已抢票' : ticketActionInfo.text}} + {{ticketActionInfo.showCountdown && grabCountdownInfo.visible + ? '距抢票开始 ' + grabCountdownInfo.text + : (formData.hasGrabbed ? '已抢票' : ticketActionInfo.text)}} @@ -411,6 +431,7 @@ layout("/mobile/platform.html"){ grabTicketNum: 1, descriptionExpanded: false, nowTimestamp: Date.now(), + quotaDate: "", ticketTimer: null, formData: {}, weekMap: { @@ -439,8 +460,36 @@ layout("/mobile/platform.html"){ noticeText() { return this.formData.notice || this.defaultNotice }, + isDailyMode() { + return this.formData.ticketMode === "DAILY" + }, maxGrabTicketNum() { - return Number(this.formData.perUserTicketNum) > 0 ? Number(this.formData.perUserTicketNum) : 1 + const perUserTicketNum = Number(this.formData.perUserTicketNum) > 0 ? Number(this.formData.perUserTicketNum) : 1 + const remainingTicketNum = Number(this.formData.remainingTicketNum) + if (isNaN(remainingTicketNum) || remainingTicketNum <= 0) { + return 1 + } + return Math.max(Math.min(perUserTicketNum, remainingTicketNum), 1) + }, + grabCountdownInfo() { + const startTime = this.getCurrentGrabStartTime() + const now = this.$moment(this.nowTimestamp) + if (!startTime || !startTime.isValid() || !startTime.isAfter(now)) { + return {visible: false, text: ""} + } + const totalSeconds = Math.max(startTime.diff(now, "seconds"), 0) + const days = Math.floor(totalSeconds / 86400) + const hours = Math.floor(totalSeconds % 86400 / 3600) + const minutes = Math.floor(totalSeconds % 3600 / 60) + const seconds = totalSeconds % 60 + const formatNumber = (value) => { + return value < 10 ? "0" + value : String(value) + } + const dayText = days > 0 ? days + "天 " : "" + return { + visible: true, + text: dayText + formatNumber(hours) + "时" + formatNumber(minutes) + "分" + formatNumber(seconds) + "秒" + } }, ticketActionInfo() { const now = this.$moment(this.nowTimestamp) @@ -451,8 +500,11 @@ layout("/mobile/platform.html"){ if (!this.formData.activityStartDate || !this.formData.activityEndDate) { return { visible: false, disabled: true, text: "" } } + if (!this.formData.reserveStartTime || !this.formData.reserveEndTime) { + return { visible: true, disabled: true, text: "未配置抢票时间" } + } if (now.isBefore(this.$moment(this.formData.activityStartDate).startOf("day"))) { - return { visible: false, disabled: true, text: "" } + return { visible: true, disabled: true, text: "即将开始", showCountdown: true } } if (now.isAfter(this.$moment(this.formData.activityEndDate).endOf("day"))) { return { visible: true, disabled: true, text: "活动已结束" } @@ -460,20 +512,13 @@ layout("/mobile/platform.html"){ if (!this.formData.weekDays || this.formData.weekDays.indexOf(this.getTodayWeekValue()) === -1) { return { visible: true, disabled: true, text: "今日不可抢票" } } - if (!this.formData.reserveStartTime || !this.formData.reserveEndTime) { - return { visible: true, disabled: true, text: "未配置抢票时间" } + if (Number(this.formData.remainingTicketNum) <= 0) { + return { visible: true, disabled: true, text: this.isDailyMode ? "今日票已抢完" : "活动票已抢完" } } const startTime = this.$moment(today + " " + this.formData.reserveStartTime, "YYYY-MM-DD HH:mm") const endTime = this.$moment(today + " " + this.formData.reserveEndTime, "YYYY-MM-DD HH:mm") - const showTime = startTime.clone().subtract(10, "minutes") - if (now.isBefore(showTime)) { - return { visible: false, disabled: true, text: "" } - } if (now.isBefore(startTime)) { - const seconds = Math.max(startTime.diff(now, "seconds"), 0) - const minutes = Math.floor(seconds / 60) - const leftSeconds = seconds % 60 - return { visible: true, disabled: true, text: "距抢票开始 " + minutes + "分" + leftSeconds + "秒" } + return { visible: true, disabled: true, text: "即将开始", showCountdown: true } } if (now.isAfter(endTime)) { return { visible: true, disabled: true, text: "今日抢票已结束" } @@ -508,6 +553,19 @@ layout("/mobile/platform.html"){ const day = this.$moment(this.nowTimestamp).day() return day === 0 ? "7" : String(day) }, + // 倒计时目标:活动未开始时取活动开始日期,活动进行中时取当天的抢票开始时间。 + getCurrentGrabStartTime() { + if (!this.formData.activityStartDate || !this.formData.reserveStartTime) { + return null + } + const now = this.$moment(this.nowTimestamp) + const activityStartDate = this.$moment(this.formData.activityStartDate).startOf("day") + const targetDate = now.isBefore(activityStartDate) ? activityStartDate : now + return this.$moment( + targetDate.format("YYYY-MM-DD") + " " + this.formData.reserveStartTime, + "YYYY-MM-DD HH:mm" + ) + }, loadData() { const id = this.getQueryString("id") if (!id) { @@ -585,6 +643,8 @@ layout("/mobile/platform.html"){ this.$set(this.formData, "hasGrabbed", true) this.$set(this.formData, "myTicketNum", record.ticketNum || this.grabTicketNum) this.$set(this.formData, "myGrabTime", record.grabTime || "") + this.$set(this.formData, "grabbedTicketNum", Number(this.formData.grabbedTicketNum || 0) + Number(record.ticketNum || this.grabTicketNum)) + this.$set(this.formData, "remainingTicketNum", Math.max(Number(this.formData.remainingTicketNum || 0) - Number(record.ticketNum || this.grabTicketNum), 0)) this.$toast.success(res.msg || "抢票成功") } else { this.$toast.fail(res.msg) @@ -600,14 +660,21 @@ layout("/mobile/platform.html"){ }, mounted() { this.loadData() - this.ticketTimer = setInterval(() => { - this.nowTimestamp = Date.now() - }, 1000) + this.$set(this, "quotaDate", this.$moment().format("YYYY-MM-DD")) + this.$set(this, "ticketTimer", setInterval(() => { + this.$set(this, "nowTimestamp", Date.now()) + const currentDate = this.$moment(this.nowTimestamp).format("YYYY-MM-DD") + // 页面跨过午夜时重新读取当日配额和抢票状态,保证每日票池不会沿用前一天数据。 + if (currentDate !== this.quotaDate) { + this.$set(this, "quotaDate", currentDate) + this.loadData() + } + }, 1000)) }, beforeDestroy() { if (this.ticketTimer) { clearInterval(this.ticketTimer) - this.ticketTimer = null + this.$set(this, "ticketTimer", null) } } }) diff --git a/src/main/resources/views/mobile/coffeeTicket/list/index.html b/src/main/resources/views/mobile/coffeeTicket/list/index.html index 79e281a..a7ff30b 100644 --- a/src/main/resources/views/mobile/coffeeTicket/list/index.html +++ b/src/main/resources/views/mobile/coffeeTicket/list/index.html @@ -281,8 +281,9 @@ layout("/mobile/platform.html"){
- 活动总票数 {{item.totalTicketNum || 0}} - 剩余票数 {{item.remainingTicketNum || 0}} + {{isDailyMode(item) ? '每日票数' : '活动总票数'}} {{item.totalTicketNum || 0}} + 今日剩余 -- + {{isDailyMode(item) ? '今日剩余' : '剩余票数'}} {{item.remainingTicketNum || 0}}
立即抢票 @@ -326,6 +327,9 @@ layout("/mobile/platform.html"){ } }, methods: { + isDailyMode(row) { + return row && row.ticketMode === "DAILY" + }, formatDate(value) { return value ? this.$moment(value).format("YYYY-MM-DD") : "--" }, diff --git a/src/main/resources/views/mobile/coffeeTicket/mine/index.html b/src/main/resources/views/mobile/coffeeTicket/mine/index.html index d1502e9..e9ec3b1 100644 --- a/src/main/resources/views/mobile/coffeeTicket/mine/index.html +++ b/src/main/resources/views/mobile/coffeeTicket/mine/index.html @@ -16,26 +16,6 @@ layout("/mobile/platform.html"){ -webkit-overflow-scrolling: touch; } - .mine-filter-wrap { - background: #ffffff; - box-shadow: 0 4px 12px rgba(30, 70, 130, .05); - } - - .mine-filter { - display: flex; - align-items: center; - justify-content: flex-end; - padding: 10px 14px 8px; - color: #8b98aa; - font-size: 12px; - background: #f5f7fb; - } - - .mine-total strong { - color: #1f73ff; - font-weight: 600; - } - .mine-list { padding: 10px 12px 0; } @@ -187,12 +167,6 @@ layout("/mobile/platform.html"){
- -
-
{{pageForm.totalCount || 0}} 张票
-
-
- {{formatWeekDays(row.weekDays)}} - + + + + + +