diff --git a/app.js b/app.js index 6b14f0f..c40f249 100644 --- a/app.js +++ b/app.js @@ -161,6 +161,14 @@ App({ success: (resp) => { if (resp.data.code === 2000000) { resolve(resp.data.data.url); + } else if (resp.data.code === 5000014) { + // 次数用完,显示广告弹窗 + const pages = getCurrentPages(); + const currentPage = pages[pages.length - 1]; + if (currentPage && currentPage.showLimitDialog) { + currentPage.showLimitDialog(); + } + reject(new Error(resp.data.msg || '次数已用完')); } else { wx.showToast({ title: resp.data.msg || '生成失败', diff --git a/pages/index/index.js b/pages/index/index.js index 2b34fd8..aa50d1a 100644 --- a/pages/index/index.js +++ b/pages/index/index.js @@ -5,6 +5,7 @@ const typeList = app.globalData.getTypeList(); const selectedIndex = typeList.length > 1 ? app.globalData.getSelectedTypeIndex() : 0; let audio = null; +let videoAd = null; Page({ data: { @@ -15,6 +16,118 @@ Page({ }, onLoad(){ wx.showShareMenu(); + this.initVideoAd(); + }, + + // 初始化激励视频广告 + initVideoAd() { + // 若在开发者工具中无法预览广告,请切换开发者工具中的基础库版本 + if (wx.createRewardedVideoAd) { + videoAd = wx.createRewardedVideoAd({ + adUnitId: 'adunit-aedf0933f69de926' + }); + + videoAd.onLoad(() => { + console.log('激励视频广告加载成功'); + }); + + videoAd.onError((err) => { + console.error('激励视频广告加载失败', err); + }); + + videoAd.onClose((res) => { + if (res && res.isEnded) { + // 用户看完广告,重置使用次数 + this.resetTtsCount(); + } else { + // 用户中途退出 + wx.showToast({ + title: '请看完广告获取次数', + icon: 'none' + }); + } + }); + } + }, + + // 显示激励视频广告 + showVideoAd() { + if (videoAd) { + videoAd.show().catch(() => { + // 失败重试 + videoAd.load() + .then(() => videoAd.show()) + .catch(err => { + console.error('激励视频广告显示失败', err); + wx.showToast({ + title: '广告加载失败,请稍后重试', + icon: 'none' + }); + }); + }); + } else { + wx.showToast({ + title: '广告功能暂不可用', + icon: 'none' + }); + } + }, + + // 重置TTS使用次数 + async resetTtsCount() { + wx.showLoading({ + title: '正在重置次数...', + mask: true + }); + + try { + const result = await new Promise((resolve, reject) => { + app.request({ + url: `${app.globalData.domain}/open-api/wx330e54aa6000516d/tts-count-reset`, + success(res) { + resolve(res.data); + }, + fail(err) { + reject(err); + } + }); + }); + + wx.hideLoading(); + + if (result.code === 2000000) { + wx.showToast({ + title: '获得10次使用机会!', + icon: 'success' + }); + } else { + wx.showToast({ + title: result.msg || '重置失败', + icon: 'none' + }); + } + } catch (error) { + wx.hideLoading(); + wx.showToast({ + title: '网络错误', + icon: 'none' + }); + } + }, + + // 显示次数用完弹窗 + showLimitDialog() { + wx.showModal({ + title: '使用次数已用完', + content: '今日免费次数已用完,观看广告可获得额外10次使用机会', + confirmText: '观看广告', + cancelText: '明日再试', + success: (res) => { + if (res.confirm) { + this.showVideoAd(); + } + } + }); }, inputText(e){ this.data.text = e.detail.value; diff --git a/pages/index/index.wxml b/pages/index/index.wxml index e53d050..f005480 100644 --- a/pages/index/index.wxml +++ b/pages/index/index.wxml @@ -28,5 +28,5 @@ > {{item.desc}} - - \ No newline at end of file + \ No newline at end of file diff --git a/pages/index/index.wxss b/pages/index/index.wxss index b5772f6..8147d8d 100644 --- a/pages/index/index.wxss +++ b/pages/index/index.wxss @@ -1,47 +1,223 @@ /**index.wxss**/ +/* 防止横向滚动 */ +page { + width: 100%; + overflow-x: hidden; + box-sizing: border-box; +} + +/* 全局移除按钮边框 */ +button { + border: none !important; + outline: none !important; +} + +button::after { + border: none !important; +} + +button::before { + border: none !important; +} + +.container { + width: 100%; + max-width: 100vw; + overflow-x: hidden; + box-sizing: border-box; + padding: 20rpx; +} + .text-view{ width: 100%; margin-bottom: 20rpx; text-align: center; + box-sizing: border-box; } .text-area{ - width: 95%; - padding: 5rpx 10rpx; + width: 100%; + max-width: 100%; + padding: 20rpx; text-align: left; box-sizing: border-box; - display: inline-block; - border: 1px dashed #afafaf; + display: block; + border: none; + border-radius: 16rpx; + background-color: #fafafa; + font-size: 32rpx; + line-height: 1.5; + transition: all 0.3s ease; + box-shadow: 0 2rpx 12rpx rgba(0, 0, 0, 0.08); +} +.text-area:focus { + background-color: #ffffff; + box-shadow: 0 4rpx 20rpx rgba(0, 122, 255, 0.15); } .button-view{ width: 100%; margin-bottom: 40rpx; text-align: center; + box-sizing: border-box; } + +/* 主要按钮样式 */ .button-view button{ - width: 95%; - display: inline-block; - vertical-align: top; + width: 100%; + max-width: 100%; + display: block; margin-bottom: 20rpx; - height: 92rpx; - line-height: 92rpx; - font-size: 36rpx; + height: 88rpx; + line-height: 88rpx; + font-size: 32rpx; text-align: center; + border-radius: 44rpx; + border: none !important; + font-weight: 600; + letter-spacing: 2rpx; + transition: all 0.3s ease; + position: relative; + overflow: hidden; + box-sizing: border-box; +} + +.button-view button::after { + border: none !important; +} + +.button-view button::before { + border: none !important; +} + +/* 播放按钮 - 主要操作 */ +.button-view button[bindtap="play"] { + background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); + color: white; + box-shadow: 0 8rpx 24rpx rgba(102, 126, 234, 0.4), inset 0 2rpx 0 rgba(255, 255, 255, 0.2); +} + +.button-view button[bindtap="play"]:active { + transform: translateY(2rpx); + box-shadow: 0 4rpx 12rpx rgba(102, 126, 234, 0.4); +} + +/* 下载按钮 - 次要操作 */ +.goto-audio-list { + background: linear-gradient(135deg, #f093fb 0%, #f5576c 100%); + color: white; + box-shadow: 0 8rpx 24rpx rgba(240, 147, 251, 0.4), inset 0 2rpx 0 rgba(255, 255, 255, 0.2); +} + +.goto-audio-list:active { + transform: translateY(2rpx); + box-shadow: 0 4rpx 12rpx rgba(240, 147, 251, 0.4); } +/* 清空按钮 - 辅助操作 */ +.button-view button[bindtap="clear"] { + background: linear-gradient(135deg, #ffecd2 0%, #fcb69f 100%); + color: #8b4513; + box-shadow: 0 8rpx 24rpx rgba(252, 182, 159, 0.4), inset 0 2rpx 0 rgba(255, 255, 255, 0.3); +} + +.button-view button[bindtap="clear"]:active { + transform: translateY(2rpx); + box-shadow: 0 4rpx 12rpx rgba(252, 182, 159, 0.4); +} + +/* 语音类型选择区域 */ .type-view{ - width: 95%; - margin-bottom: 40rpx; - display: flex; - justify-content: space-between; + width: 100%; + max-width: 100%; + margin: 0 0 40rpx 0; + padding: 20rpx; + background: linear-gradient(135deg, rgba(255, 255, 255, 0.95) 0%, rgba(248, 250, 252, 0.95) 100%); + border-radius: 20rpx; + box-shadow: 0 6rpx 24rpx rgba(0, 0, 0, 0.08); + backdrop-filter: blur(10rpx); + box-sizing: border-box; } + .type-view button{ - padding: 20rpx 10rpx; - writing-mode: vertical-lr; + width: 100%; + max-width: 100%; + height: 60rpx; + margin-bottom: 16rpx; + padding: 0 20rpx; + writing-mode: horizontal-tb; text-align: center; - letter-spacing: 15rpx; + letter-spacing: 1rpx; + font-size: 28rpx; + font-weight: 500; + border-radius: 30rpx; + border: none !important; + transition: all 0.3s ease; + position: relative; + overflow: hidden; + display: flex; + align-items: center; + justify-content: center; + white-space: nowrap; + box-sizing: border-box; +} + +.type-view button::after { + border: none !important; +} + +.type-view button::before { + border: none !important; } + +.type-view button:last-child { + margin-bottom: 0; +} + +/* 未选中的语音类型按钮 */ +.type-view button[type="default"] { + background: linear-gradient(135deg, #ffffff 0%, #f8f9fa 100%); + color: #495057; + box-shadow: 0 4rpx 12rpx rgba(0, 0, 0, 0.1), inset 0 1rpx 0 rgba(255, 255, 255, 0.8); +} + +.type-view button[type="default"]:active { + background: linear-gradient(135deg, #f8f9fa 0%, #e9ecef 100%); + transform: translateY(2rpx); + box-shadow: 0 2rpx 6rpx rgba(0, 0, 0, 0.15), inset 0 1rpx 0 rgba(255, 255, 255, 0.6); +} + +/* 选中的语音类型按钮 */ +.type-view button[type="primary"] { + background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); + color: white; + box-shadow: 0 6rpx 20rpx rgba(102, 126, 234, 0.4), inset 0 1rpx 0 rgba(255, 255, 255, 0.2); + transform: scale(1.02); +} + +.type-view button[type="primary"]:active { + transform: scale(1.02) translateY(2rpx); + box-shadow: 0 4rpx 16rpx rgba(102, 126, 234, 0.5), inset 0 1rpx 0 rgba(255, 255, 255, 0.1); +} + +/* 按钮悬浮效果动画 */ +.button-view button::before, +.type-view button::before { + content: ''; + position: absolute; + top: 0; + left: -100%; + width: 100%; + height: 100%; + background: linear-gradient(90deg, transparent, rgba(255,255,255,0.2), transparent); + transition: left 0.5s; +} + +.button-view button:active::before, +.type-view button:active::before { + left: 100%; +} + .ad-1{ margin-bottom: 20rpx; } \ No newline at end of file diff --git a/pages/result/result.wxml b/pages/result/result.wxml index eda37c6..c8dd4d2 100644 --- a/pages/result/result.wxml +++ b/pages/result/result.wxml @@ -1,6 +1,6 @@ - +