app.js 10 KB

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