import { SendEvent } from "/utils/util.js"; import { unlockChapter, userActive } from "/api/api.js"; // app.js // 引入阅读器插件 const novelPlugin = requirePlugin("novel-plugin"); import { userLogin, getChapterUnlockStatus, getNovelDetail, addBrowsingHistory, } from "./api/api"; import { apple } from "./config/config"; import { SDK } from "@dn-sdk/miniprogram"; SDK.setDebug(true); App({ onLaunch(options) { this.globalData.queryData = { ...options.query, }; console.log("场景值:", options, options.scene); this.globalData.from = options.query.from || ""; novelPlugin.setLoggerConfig({ info: false, debug: false, log: false, warn: false, error: true, }); // 监听进入插件页事件 novelPlugin.onPageLoad(onNovelPluginLoad); // 展示本地存储能力 // const logs = wx.getStorageSync('logs') || [] // logs.unshift(Date.now()) // wx.setStorageSync('logs', logs); wx.setStorageSync("scene", options.scene); // 储存场景值 }, onShow: function (opt) { console.log("onShow-小程序进入前台", opt); SendEvent("customAppletsShowEvent", {}, this); }, onHide: function () { console.log("onHide-小程序进入后台"); SendEvent("customAppletsHideEvent", {}, this); }, // 腾讯广告小程序sdk上报 sdkTrack(eventName, eventValue) { try { this.globalData.sdk.track(eventName, eventValue); } catch (error) { console.log("sdkTrack error:", error); } }, // 登录方法 login(promotionid) { return new Promise((resolve, reject) => { // 检查登录状态 if (this.checkLoginStatus()) { resolve(); return; } wx.login({ success: (res) => { userLogin({ appid: apple.appid, channel: 1, srcType: "0", srcAppId: "", srcId: "", cusId: "", inviter: "", promotionId: promotionid, inviterPromotionId: "", system: "pc", type: "inner", inner: 1, code: res.code, }) .then((res) => { console.log(res); wx.setStorageSync("accessToken", res.accessToken); this.globalData.accessToken = res.accessToken; this.globalData.isLogin = true; if (res.userCode) { this.globalData.userCode = res.userCode; wx.setStorageSync("userCode", res.userCode); } if (res.openId) { this.globalData.openId = res.openId; wx.setStorageSync("openId", res.openId); } if (res.unionId) { this.globalData.unionId = res.unionId; wx.setStorageSync("unionId", res.unionId); } console.log("登录成功", this.globalData); if (res.sdkUserActionSetId && res.sdkSecretKey) { this.globalData.sdk = new SDK({ // 数据源ID,必填 user_action_set_id: Number(res.sdkUserActionSetId), // 加密key,必填 secret_key: res.sdkSecretKey, appid: apple.appid, }); this.globalData.sdk.setOpenId(this.globalData.openId); if (res.newUser) { this.globalData.sdk.track("REGISTER"); } this.sdkTrack("START_APP"); } userActive({ appId: apple.appid, openId: res.openId, }) .then(() => { }) .catch((err) => { }); SendEvent("login", { userCode: res.userCode, openId: res.openId, unionId: res.unionId, }); resolve(res); }) .catch((err) => { this.globalData.isLogin = false; reject(err); }); }, fail: (err) => { this.globalData.isLogin = false; reject(err); }, }); }); }, // 自动登录 async autoLogin(promotionid) { try { // 检查是否已经登录 if (this.globalData.accessToken) { // 已经登录 console.log("已经登录"); return; } // 未登录,执行登录 this.login(promotionid); } catch (error) { console.error("登录失败:", error); } }, // 检查登录状态 checkLoginStatus() { return !!this.globalData.accessToken && this.globalData.isLogin; }, globalData: { userInfo: null, isLogin: false, accessToken: "", novelManager: {}, uuid: "fuck", isShowDialog: false, novelManagerId: 0, novel: null, novelId: "", chapterIndex: 0, unlockChapterNum: 1, bookmarkAdNum: 3, openId: "", unionId: "", isEnterVideoDetail: false, // 是否进入过视频详情页 ads_config: {}, // 广告策略配置 userCode: "", from: "", videoAd: null, queryData: {}, sdk: null, }, }); // 插件初始化回调 async function onNovelPluginLoad(data) { // data.id - 阅读器实例 id,每个插件页对应一个阅读器实例 const novelManager = novelPlugin.getNovelManager(data.id); getApp().globalData.novelManagerId = data.id; getApp().globalData.novelManager = novelManager; rewardVideoLoad(); // novelManager.setFullScreenComponentStatus({ // show: true, // }); let pluginInfo = novelManager.getPluginInfo(); let innerBookId = pluginInfo.query?.innerBookId; let unlockStatus = await getChapterUnlockStatus({ novelId: innerBookId, }); let bookDetail = await getNovelDetail(innerBookId); getApp().globalData.novelId = bookDetail.id; console.log("bookDetail", bookDetail); if (unlockStatus && Array.isArray(unlockStatus.status)) { const contents = unlockStatus.status.map((lockState, index) => { return { index: index, status: lockState, }; }); novelManager.setContents({ contents: contents, }); novelManager.setChargeWay({ globalConfig: { mode: 5, buttonText: "观看广告解锁", showButton: true, countdownInProgressButtonText: "广告解锁倒计时还剩{{countdown}}秒", countdownEndedButtonText: "观看广告解锁章节", tip: "看完广告之后可继续阅读", }, }); novelManager.onCountdownDoneUnlock((res) => { console.log("novelManager倒计时结束"); rewardVideoPlayFn(); }); novelManager.onUserClickCustomUnlock((res) => { console.log("novelManager 点击解锁"); rewardVideoPlayFn(); }); let chapterConfigs = []; for (let index = 0; index < bookDetail.latestChapterNo; index++) { if ((index + 1) % getApp().globalData.bookmarkAdNum === 0) { chapterConfigs.push({ chapterIndex: index, blocks: [ { type: 3, unitId: apple.ads.bookmarkAdId, }, ], }); } } novelManager.setAdBlock({ chapterConfigs: chapterConfigs, }); } function startRead(res) { console.log("开始阅读", res); getApp().globalData.novel = res; getApp().sdkTrack("VIEW_NOVEL", { novel_id: res.book_id, // 小说id(字符串类型) novel_name: res.title, // 小说名(字符串类型) chapters: res.chapter_index, // 章数(第几章,整型) }); updateBrowsingHistory(res); } function updateBrowsingHistory(res) { let params = { novelAuthor: bookDetail.author, novelCover: bookDetail.cover, novelId: bookDetail.id, novelTitle: bookDetail.title, status: bookDetail.status, }; addBrowsingHistory(params); } // 监听用户行为事件 novelManager.onUserTriggerEvent((res) => { const { event_id } = res; console.log("用户行为:", event_id, res); // 根据不同的事件类型处理 switch (event_id) { case "start_read": // 开始阅读 console.log("开始阅读章节:", res.chapter_id); SendEvent("start_read", { page: "开始阅读", }); getApp().globalData.chapterIndex = res.chapter_index; console.log( "开始阅读跳转", pluginInfo.query?.shared_video_id, pluginInfo.query?.tag_id, ); // 跳转普通视频 if (pluginInfo.query?.shared_video_id && pluginInfo.query?.tag_id) { setTimeout(() => { novelManager.redirectTo({ url: `/pages/video/detail?id=${pluginInfo.query?.shared_video_id}&tag_id=${pluginInfo.query?.tag_id}`, }); }, 200); } // 跳转合集视频 if (pluginInfo.query?.collectId) { console.log("跳转合集视频,", pluginInfo.query?.collectId); setTimeout(() => { novelManager.redirectTo({ url: `/pages/collect-video/video?collectId=${pluginInfo.query?.collectId}`, }); }, 200); } break; case "click_startread": // 点击开始阅读 SendEvent("click_startread", { page: "点击开始阅读", }); getApp().globalData.chapterIndex = res.chapter_index; startRead(res); break; case "leave_readpage": // 离开阅读页 SendEvent("leave_readpage", { page: "离开阅读页", }); console.log("阅读时长:", res.read_time); break; case "change_chapter": // 切换章节 SendEvent("change_chapter", { page: "切换到章节", }); getApp().globalData.chapterIndex = res.chapter_index; console.log("切换到章节:", res.chapter_id); break; case "get_chapter": // 获取章节数据 SendEvent("get_chapter", { page: "获取章节数据", }); console.log("get_chapter", res); console.log("章节状态:", res.pay_status); break; default: break; } }); } // 激励视频加载 function rewardVideoLoad() { if (getApp().globalData.videoAd === null && wx.createRewardedVideoAd) { getApp().globalData.videoAd = wx.createRewardedVideoAd({ adUnitId: apple.ads.rewardAdId, }); getApp().globalData.videoAd.onLoad(() => { console.log("激励加载成功"); }); getApp().globalData.videoAd.onError((err) => { console.log("激励失败", err); }); getApp().globalData.videoAd.onClose((res) => { const novelManager = novelPlugin.getNovelManager( getApp().globalData.novelManagerId, ); if (res && res.isEnded) { let params = { chapterNo: getApp().globalData.chapterIndex, novelId: getApp().globalData.novelId, type: 1, }; unlockChapter(params).then((res) => { console.log(res); novelManager.paymentCompleted({ chapterIndex: getApp().globalData.chapterIndex, }); if (getApp().globalData.novel) { getApp().sdkTrack("UNLOCK_PAID_EPISODES", { novel_id: getApp().globalData.novel.book_id, // 小说id(字符串类型) novel_name: getApp().globalData.novel.title, // 小说名(字符串类型) chapters: [getApp().globalData.chapterIndex], // 解锁的章数,填写解锁的第几章(可多个) }); } wx.showToast({ title: "解锁成功", icon: "none", }); console.log("章节解锁成功", getApp().globalData.chapterIndex); }); } else { novelManager.closeChargeDialog(); console.log("关闭解锁组件"); wx.showToast({ title: "解锁失败", icon: "none", }); } }); } } // 激励视频展示 function rewardVideoPlayFn() { wx.showLoading({ title: "解锁视频中", }); getApp() .globalData.videoAd.show() .then(() => { console.log("激励视频播放成功"); }) .catch((err) => { console.log("激励视频播放失败", err); }) .then(() => { wx.hideLoading(); }); }