app.js 7.21 KB
// 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);
    }
});