// zooble@2025-12-14 const { createRequest } = require('./utils/request.js'); App({ globalData: { // domain: 'http://localhost:3003', domain: 'https://api.xwenliang.cn', appid: 'wx330e54aa6000516d', cid: '', safeAreaTop: 0, safeAreaBottom: 0, statusBarHeight: 0, navBarHeight: 0, totalNavHeight: 0, // 导航栏总高度(状态栏 + 导航栏) tabBarHeight: 56, totalTabBarHeight: 0, // tab总高度(tab + 底部安全区) contentHeight: 0, // 内容区域高度(全屏高度 - 导航栏总高度 - 底部安全区) contentWithoutTabbarHeight: 0, // 内容区域高度 - tab 高度 getTypeList(){ const globalData = this; return [ { desc: 'Chelsie(女)', voice: 'Chelsie', async createUrl(text){ return await globalData.requestTTS(text, 'Chelsie'); } }, { desc: 'Cherry(女)', voice: 'Cherry', async createUrl(text){ return await globalData.requestTTS(text, 'Cherry'); } }, { desc: 'Ethan(男)', voice: 'Ethan', async createUrl(text){ return await globalData.requestTTS(text, 'Ethan'); } }, { desc: 'Serena(女)', voice: 'Serena', async createUrl(text){ return await globalData.requestTTS(text, 'Serena'); } }, { desc: 'Dylan(北京话-男)', voice: 'Dylan', async createUrl(text){ return await globalData.requestTTS(text, 'Dylan'); } }, { desc: 'Jada(吴语-女)', voice: 'Jada', async createUrl(text){ return await globalData.requestTTS(text, 'Jada'); } }, { desc: 'Sunny(四川话-女)', voice: 'Sunny', async createUrl(text){ return await globalData.requestTTS(text, 'Sunny'); } } ]; }, // TTS接口请求方法 async requestTTS(text, voice) { return new Promise((resolve, reject) => { const app = getApp(); app.request({ url: `${this.domain}/open-api/wx330e54aa6000516d/tts`, data: { text, voice }, 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 || '生成失败', icon: 'none' }); reject(new Error(resp.data.msg || '生成失败')); } }, fail: (error) => { wx.showToast({ title: '网络错误', icon: 'none' }); reject(error); } }); }); }, getSelectedTypeIndex(){ const storageKey = 'audioTypeselectedIndex'; return wx.getStorageSync(storageKey); }, setSelectedTypeIndex(index){ const storageKey = 'audioTypeselectedIndex'; wx.setStorageSync(storageKey, index); return index; }, getAudioList(){ const storageKey = 'audioList'; return wx.getStorageSync(storageKey) || []; }, /** * @param {(add|delete)} action - 增或删 * @param {object|number} [param] - 增加时是 audio 描述,删除时是唯一特征 path 值 */ setAudioList(action, param){ const storageKey = 'audioList'; const list = this.getAudioList() || []; if(action === 'add' && param.constructor === Object){ list.push(param); wx.setStorageSync(storageKey, list); } if(action === 'delete' && String(param)){ const index = list.findIndex(v => v.path === param); if(index > -1){ list.splice(index, 1); wx.setStorageSync(storageKey, list); } } return list; } }, onLaunch(option){ const { query } = option; // 获取渠道值 this.globalData.cid = query.cid || ''; // 挂载 request const { domain, appid, cid } = this.globalData; this.request = createRequest({ domain, appid, cid }); // 获取系统信息,计算安全区域 const windowInfo = wx.getWindowInfo ? wx.getWindowInfo() : wx.getSystemInfoSync(); const { statusBarHeight, safeArea, windowHeight, screenHeight } = windowInfo; this.globalData.statusBarHeight = statusBarHeight; this.globalData.safeAreaTop = safeArea.top; this.globalData.safeAreaBottom = screenHeight - safeArea.bottom; // 右上角胶囊位置信息 const menuButtonInfo = wx.getMenuButtonBoundingClientRect(); // 导航栏高度,是胶囊以及胶囊的上下边距所包含的高度,通常是 32+4+4 this.globalData.navBarHeight = menuButtonInfo.height + (menuButtonInfo.top - statusBarHeight) * 2; this.globalData.totalNavHeight = statusBarHeight + this.globalData.navBarHeight; this.globalData.contentHeight = windowHeight - this.globalData.totalNavHeight; this.globalData.totalTabBarHeight = this.globalData.tabBarHeight + this.globalData.safeAreaBottom; this.globalData.contentWithoutTabbarHeight = this.globalData.contentHeight - this.globalData.totalTabBarHeight; // 移除 2022-12-05 之前的本地存储,因为可能有敏感词存在 const timestamp = new Date('2022-12-05').getTime(); const audioList = this.globalData.getAudioList().filter(v => v.time > timestamp); const storageKey = 'audioList'; wx.setStorageSync(storageKey, audioList); } });