app.js 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437
  1. import { SendEvent } from "/utils/util.js";
  2. import { unlockChapter, userActive } from "/api/api.js";
  3. // app.js
  4. // 引入阅读器插件
  5. const novelPlugin = requirePlugin("novel-plugin");
  6. import {
  7. userLogin,
  8. getChapterUnlockStatus,
  9. getNovelDetail,
  10. addBrowsingHistory,
  11. } from "./api/api";
  12. import { apple } from "./config/config";
  13. import { SDK } from "@dn-sdk/miniprogram";
  14. SDK.setDebug(true);
  15. App({
  16. onLaunch(options) {
  17. this.globalData.queryData = {
  18. ...options.query,
  19. };
  20. console.log("场景值:", options, options.scene);
  21. this.globalData.from = options.query.from || "";
  22. novelPlugin.setLoggerConfig({
  23. info: false,
  24. debug: false,
  25. log: false,
  26. warn: false,
  27. error: true,
  28. });
  29. // 监听进入插件页事件
  30. novelPlugin.onPageLoad(onNovelPluginLoad);
  31. // 展示本地存储能力
  32. // const logs = wx.getStorageSync('logs') || []
  33. // logs.unshift(Date.now())
  34. // wx.setStorageSync('logs', logs);
  35. wx.setStorageSync("scene", options.scene); // 储存场景值
  36. },
  37. onShow: function (opt) {
  38. console.log("onShow-小程序进入前台", opt);
  39. SendEvent("customAppletsShowEvent", {}, this);
  40. },
  41. onHide: function () {
  42. console.log("onHide-小程序进入后台");
  43. SendEvent("customAppletsHideEvent", {}, this);
  44. },
  45. // 腾讯广告小程序sdk上报
  46. sdkTrack(eventName, eventValue) {
  47. try {
  48. this.globalData.sdk.track(eventName, eventValue);
  49. } catch (error) {
  50. console.log("sdkTrack error:", error);
  51. }
  52. },
  53. // 登录方法
  54. login(promotionid) {
  55. return new Promise((resolve, reject) => {
  56. // 检查登录状态
  57. if (this.checkLoginStatus()) {
  58. resolve();
  59. return;
  60. }
  61. wx.login({
  62. success: (res) => {
  63. userLogin({
  64. appid: apple.appid,
  65. channel: 1,
  66. srcType: "0",
  67. srcAppId: "",
  68. srcId: "",
  69. cusId: "",
  70. inviter: "",
  71. promotionId: promotionid,
  72. inviterPromotionId: "",
  73. system: "pc",
  74. type: "inner",
  75. inner: 1,
  76. code: res.code,
  77. })
  78. .then((res) => {
  79. console.log(res);
  80. wx.setStorageSync("accessToken", res.accessToken);
  81. this.globalData.accessToken = res.accessToken;
  82. this.globalData.isLogin = true;
  83. if (res.userCode) {
  84. this.globalData.userCode = res.userCode;
  85. wx.setStorageSync("userCode", res.userCode);
  86. }
  87. if (res.openId) {
  88. this.globalData.openId = res.openId;
  89. wx.setStorageSync("openId", res.openId);
  90. }
  91. if (res.unionId) {
  92. this.globalData.unionId = res.unionId;
  93. wx.setStorageSync("unionId", res.unionId);
  94. }
  95. console.log("登录成功", this.globalData);
  96. if (res.sdkUserActionSetId && res.sdkSecretKey) {
  97. this.globalData.sdk = new SDK({
  98. // 数据源ID,必填
  99. user_action_set_id: Number(res.sdkUserActionSetId),
  100. // 加密key,必填
  101. secret_key: res.sdkSecretKey,
  102. appid: apple.appid,
  103. });
  104. this.globalData.sdk.setOpenId(this.globalData.openId);
  105. if (res.newUser) {
  106. this.globalData.sdk.track("REGISTER");
  107. }
  108. this.sdkTrack("START_APP");
  109. }
  110. userActive({
  111. appId: apple.appid,
  112. openId: res.openId,
  113. })
  114. .then(() => { })
  115. .catch((err) => { });
  116. SendEvent("login", {
  117. userCode: res.userCode,
  118. openId: res.openId,
  119. unionId: res.unionId,
  120. });
  121. resolve(res);
  122. })
  123. .catch((err) => {
  124. this.globalData.isLogin = false;
  125. reject(err);
  126. });
  127. },
  128. fail: (err) => {
  129. this.globalData.isLogin = false;
  130. reject(err);
  131. },
  132. });
  133. });
  134. },
  135. // 自动登录
  136. async autoLogin(promotionid) {
  137. try {
  138. // 检查是否已经登录
  139. if (this.globalData.accessToken) {
  140. // 已经登录
  141. console.log("已经登录");
  142. return;
  143. }
  144. // 未登录,执行登录
  145. this.login(promotionid);
  146. } catch (error) {
  147. console.error("登录失败:", error);
  148. }
  149. },
  150. // 检查登录状态
  151. checkLoginStatus() {
  152. return !!this.globalData.accessToken && this.globalData.isLogin;
  153. },
  154. globalData: {
  155. userInfo: null,
  156. isLogin: false,
  157. accessToken: "",
  158. novelManager: {},
  159. uuid: "fuck",
  160. isShowDialog: false,
  161. novelManagerId: 0,
  162. novel: null,
  163. novelId: "",
  164. chapterIndex: 0,
  165. unlockChapterNum: 1,
  166. bookmarkAdNum: 3,
  167. openId: "",
  168. unionId: "",
  169. isEnterVideoDetail: false, // 是否进入过视频详情页
  170. ads_config: {}, // 广告策略配置
  171. userCode: "",
  172. from: "",
  173. videoAd: null,
  174. queryData: {},
  175. sdk: null,
  176. },
  177. });
  178. // 插件初始化回调
  179. async function onNovelPluginLoad(data) {
  180. // data.id - 阅读器实例 id,每个插件页对应一个阅读器实例
  181. const novelManager = novelPlugin.getNovelManager(data.id);
  182. getApp().globalData.novelManagerId = data.id;
  183. getApp().globalData.novelManager = novelManager;
  184. rewardVideoLoad();
  185. // novelManager.setFullScreenComponentStatus({
  186. // show: true,
  187. // });
  188. let pluginInfo = novelManager.getPluginInfo();
  189. let innerBookId = pluginInfo.query?.innerBookId;
  190. let unlockStatus = await getChapterUnlockStatus({
  191. novelId: innerBookId,
  192. });
  193. let bookDetail = await getNovelDetail(innerBookId);
  194. getApp().globalData.novelId = bookDetail.id;
  195. console.log("bookDetail", bookDetail);
  196. if (unlockStatus && Array.isArray(unlockStatus.status)) {
  197. const contents = unlockStatus.status.map((lockState, index) => {
  198. return {
  199. index: index,
  200. status: lockState,
  201. };
  202. });
  203. novelManager.setContents({
  204. contents: contents,
  205. });
  206. novelManager.setChargeWay({
  207. globalConfig: {
  208. mode: 5,
  209. buttonText: "观看广告解锁",
  210. showButton: true,
  211. countdownInProgressButtonText: "广告解锁倒计时还剩{{countdown}}秒",
  212. countdownEndedButtonText: "观看广告解锁章节",
  213. tip: "看完广告之后可继续阅读",
  214. },
  215. });
  216. novelManager.onCountdownDoneUnlock((res) => {
  217. console.log("novelManager倒计时结束");
  218. rewardVideoPlayFn();
  219. });
  220. novelManager.onUserClickCustomUnlock((res) => {
  221. console.log("novelManager 点击解锁");
  222. rewardVideoPlayFn();
  223. });
  224. let chapterConfigs = [];
  225. for (let index = 0; index < bookDetail.latestChapterNo; index++) {
  226. if ((index + 1) % getApp().globalData.bookmarkAdNum === 0) {
  227. chapterConfigs.push({
  228. chapterIndex: index,
  229. blocks: [
  230. {
  231. type: 3,
  232. unitId: apple.ads.bookmarkAdId,
  233. },
  234. ],
  235. });
  236. }
  237. }
  238. novelManager.setAdBlock({
  239. chapterConfigs: chapterConfigs,
  240. });
  241. }
  242. function startRead(res) {
  243. console.log("开始阅读", res);
  244. getApp().globalData.novel = res;
  245. getApp().sdkTrack("VIEW_NOVEL", {
  246. novel_id: res.book_id, // 小说id(字符串类型)
  247. novel_name: res.title, // 小说名(字符串类型)
  248. chapters: res.chapter_index, // 章数(第几章,整型)
  249. });
  250. updateBrowsingHistory(res);
  251. }
  252. function updateBrowsingHistory(res) {
  253. let params = {
  254. novelAuthor: bookDetail.author,
  255. novelCover: bookDetail.cover,
  256. novelId: bookDetail.id,
  257. novelTitle: bookDetail.title,
  258. status: bookDetail.status,
  259. };
  260. addBrowsingHistory(params);
  261. }
  262. // 监听用户行为事件
  263. novelManager.onUserTriggerEvent((res) => {
  264. const { event_id } = res;
  265. console.log("用户行为:", event_id, res);
  266. // 根据不同的事件类型处理
  267. switch (event_id) {
  268. case "start_read": // 开始阅读
  269. console.log("开始阅读章节:", res.chapter_id);
  270. SendEvent("start_read", {
  271. page: "开始阅读",
  272. });
  273. getApp().globalData.chapterIndex = res.chapter_index;
  274. console.log(
  275. "开始阅读跳转",
  276. pluginInfo.query?.shared_video_id,
  277. pluginInfo.query?.tag_id,
  278. );
  279. // 跳转普通视频
  280. if (pluginInfo.query?.shared_video_id && pluginInfo.query?.tag_id) {
  281. setTimeout(() => {
  282. novelManager.redirectTo({
  283. url: `/pages/video/detail?id=${pluginInfo.query?.shared_video_id}&tag_id=${pluginInfo.query?.tag_id}`,
  284. });
  285. }, 200);
  286. }
  287. // 跳转合集视频
  288. if (pluginInfo.query?.collectId) {
  289. console.log("跳转合集视频,", pluginInfo.query?.collectId);
  290. setTimeout(() => {
  291. novelManager.redirectTo({
  292. url: `/pages/collect-video/video?collectId=${pluginInfo.query?.collectId}`,
  293. });
  294. }, 200);
  295. }
  296. break;
  297. case "click_startread": // 点击开始阅读
  298. SendEvent("click_startread", {
  299. page: "点击开始阅读",
  300. });
  301. getApp().globalData.chapterIndex = res.chapter_index;
  302. startRead(res);
  303. break;
  304. case "leave_readpage": // 离开阅读页
  305. SendEvent("leave_readpage", {
  306. page: "离开阅读页",
  307. });
  308. console.log("阅读时长:", res.read_time);
  309. break;
  310. case "change_chapter": // 切换章节
  311. SendEvent("change_chapter", {
  312. page: "切换到章节",
  313. });
  314. getApp().globalData.chapterIndex = res.chapter_index;
  315. console.log("切换到章节:", res.chapter_id);
  316. break;
  317. case "get_chapter": // 获取章节数据
  318. SendEvent("get_chapter", {
  319. page: "获取章节数据",
  320. });
  321. console.log("get_chapter", res);
  322. console.log("章节状态:", res.pay_status);
  323. break;
  324. default:
  325. break;
  326. }
  327. });
  328. }
  329. // 激励视频加载
  330. function rewardVideoLoad() {
  331. if (getApp().globalData.videoAd === null && wx.createRewardedVideoAd) {
  332. getApp().globalData.videoAd = wx.createRewardedVideoAd({
  333. adUnitId: apple.ads.rewardAdId,
  334. });
  335. getApp().globalData.videoAd.onLoad(() => {
  336. console.log("激励加载成功");
  337. });
  338. getApp().globalData.videoAd.onError((err) => {
  339. console.log("激励失败", err);
  340. });
  341. getApp().globalData.videoAd.onClose((res) => {
  342. const novelManager = novelPlugin.getNovelManager(
  343. getApp().globalData.novelManagerId,
  344. );
  345. if (res && res.isEnded) {
  346. let params = {
  347. chapterNo: getApp().globalData.chapterIndex,
  348. novelId: getApp().globalData.novelId,
  349. type: 1,
  350. };
  351. unlockChapter(params).then((res) => {
  352. console.log(res);
  353. novelManager.paymentCompleted({
  354. chapterIndex: getApp().globalData.chapterIndex,
  355. });
  356. if (getApp().globalData.novel) {
  357. getApp().sdkTrack("UNLOCK_PAID_EPISODES", {
  358. novel_id: getApp().globalData.novel.book_id, // 小说id(字符串类型)
  359. novel_name: getApp().globalData.novel.title, // 小说名(字符串类型)
  360. chapters: [getApp().globalData.chapterIndex], // 解锁的章数,填写解锁的第几章(可多个)
  361. });
  362. }
  363. wx.showToast({
  364. title: "解锁成功",
  365. icon: "none",
  366. });
  367. console.log("章节解锁成功", getApp().globalData.chapterIndex);
  368. });
  369. } else {
  370. novelManager.closeChargeDialog();
  371. console.log("关闭解锁组件");
  372. wx.showToast({
  373. title: "解锁失败",
  374. icon: "none",
  375. });
  376. }
  377. });
  378. }
  379. }
  380. // 激励视频展示
  381. function rewardVideoPlayFn() {
  382. wx.showLoading({
  383. title: "解锁视频中",
  384. });
  385. getApp()
  386. .globalData.videoAd.show()
  387. .then(() => {
  388. console.log("激励视频播放成功");
  389. })
  390. .catch((err) => {
  391. console.log("激励视频播放失败", err);
  392. })
  393. .then(() => {
  394. wx.hideLoading();
  395. });
  396. }