| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572 |
- // index.js
- const defaultAvatarUrl =
- "https://mmbiz.qpic.cn/mmbiz/icTdbqWNOwNRna42FI242Lcia07jQodd2FJGIYQfG0LAJGFxM4FbnQP6yfMxBgJ0F3YRqJCJ1aPAK2dQagdusBZg/0";
- const testCover = "/assets/images/bg-book.png";
- import {
- getBannerList,
- getCardNovels,
- getBrowsingHistory,
- getNovelDetail,
- } from "../../api/api";
- import { goToBookDetail, SendEvent } from "../../utils/util";
- import { apple } from "../../config/config";
- const app = getApp();
- let interstitialAd = null;
- Page({
- data: {
- isLoggedIn: false,
- // 轮播配置
- indicatorDots: true,
- autoplay: true,
- interval: 3000,
- duration: 500,
- cardNovels: [],
- bannerList: [], // 添加banner列表数据
- // 性别选项
- gender: "male", // male or female
- // 主编推荐数据
- recommendBooks: [], // 主编推荐数据
- // 推荐书籍列表
- bookList: [],
- // 全网热推
- hotBooks: [], // 全网热推数据
- // 强力推荐
- showStrongRecommend: false, // 控制强力推荐模块显示/隐藏
- strongBooks: [],
- // 最近阅读书籍
- recentBook: null, // 最近阅读的书籍
- showRecentBook: false, // 是否显示最近阅读
- isRecentBookHidden: false, // 最近阅读是否隐藏
- recentBookAnimation: {}, // 最近阅读动画数据
- motto: "Hello World",
- userInfo: {
- avatarUrl: defaultAvatarUrl,
- nickName: "",
- },
- hasUserInfo: false,
- canIUseGetUserProfile: wx.canIUse("getUserProfile"),
- canIUseNicknameComp: wx.canIUse("input.type.nickname"),
- share_count: 1,
- },
- onLoad(options) {
- console.log("入参options:", options);
- const promotionid = options.promotionId;
- console.log("传入promotionid:", promotionid);
- this.interstitalLoad();
- this.autoLogin(promotionid);
- // 创建动画实例
- this.recentBookAnimator = wx.createAnimation({
- duration: 300,
- timingFunction: "ease",
- });
- const scene = wx.getStorageSync("scene");
- const bookId = parseInt(options.novelId);
- const jump = options.jump; // 跳转类型 1-不进阅读器
- console.log("传入jump:", jump);
- console.log("scene:", scene);
- console.log("传入novelId:", bookId);
- if (
- bookId &&
- this.data.share_count === 1 &&
- (scene === 1008 || scene === 1007) &&
- jump !== 1
- ) {
- getNovelDetail(bookId).then((res) => {
- this.setData({
- share_count: 2,
- });
- goToBookDetail({
- bookId,
- wxBookId: res.wxBookId,
- });
- });
- } else if (bookId && this.data.share_count === 2) {
- setTimeout(() => {
- this.interstitalPlayFn();
- }, 1000);
- }
- },
- onShow() {
- // 每次页面显示时检查是否需要更新数据
- if (this.data.isLoggedIn) {
- this.checkAndUpdateGender();
- // 每次页面显示时获取最近阅读
- this.getRecentReadBook();
- }
- },
- onTabItemTap(item) {
- console.log(item.index);
- setTimeout(() => {
- this.interstitalPlayFn();
- }, 1000);
- // tabBar 点击时检查是否需要更新数据
- if (this.data.isLoggedIn) {
- this.checkAndUpdateGender();
- }
- },
- // 插屏广告加载
- interstitalLoad() {
- let adId = apple.ads.insertAdId;
- interstitialAd = wx.createInterstitialAd({
- adUnitId: adId,
- });
- interstitialAd.onLoad(() => {
- console.log("书城页插屏广告onLoad");
- });
- interstitialAd.onError((err) => {
- console.log("书城页插屏广告onError", err);
- });
- interstitialAd.onClose(() => {
- console.log("书城页插屏广告onClose");
- });
- },
- // 插屏广告展示
- interstitalPlayFn() {
- if (interstitialAd) {
- interstitialAd.show().catch((err) => {
- console.error("书城页插屏显示错误", err);
- });
- }
- },
- // 页面滚动触发
- onPageScroll(e) {
- // 清除之前的定时器
- if (this.scrollTimer) {
- clearTimeout(this.scrollTimer);
- this.scrollTimer = null;
- }
- // 滚动时隐藏最近阅读
- if (
- e.scrollTop > 300 &&
- !this.data.isRecentBookHidden &&
- this.data.showRecentBook
- ) {
- this.hideRecentBook();
- }
- // 设置滑动停止后的定时器
- this.lastScrollTop = e.scrollTop;
- this.scrollTimer = setTimeout(() => {
- // 2秒后检查是否已经停止滚动
- if (
- this.lastScrollTop === e.scrollTop &&
- this.data.isRecentBookHidden &&
- this.data.showRecentBook
- ) {
- this.showRecentBook();
- }
- }, 1500); // 2秒后执行
- },
- // 隐藏最近阅读
- hideRecentBook() {
- // 计算移动距离,只漏出10px
- const windowWidth = wx.getSystemInfoSync().windowWidth;
- const rpxToPx = windowWidth / 750; // rpx到px的转换比例
- const btnWidth = 90 * rpxToPx; // 悬浮按钮宽度,90rpx转换为px
- const moveX = -(btnWidth + 35); // 只漏出10px
- this.recentBookAnimator.translateX(moveX).step();
- this.setData({
- recentBookAnimation: this.recentBookAnimator.export(),
- isRecentBookHidden: true,
- });
- },
- // 显示最近阅读
- showRecentBook() {
- this.recentBookAnimator.translateX(0).step();
- this.setData({
- recentBookAnimation: this.recentBookAnimator.export(),
- isRecentBookHidden: false,
- });
- },
- // 点击隐藏的最近阅读
- toggleRecentBook() {
- if (this.data.isRecentBookHidden) {
- // 隐藏状态点击展开
- this.showRecentBook();
- } else {
- // 展开状态点击跳转
- this.goToRecentBook();
- }
- },
- // 自动登录
- async autoLogin(promotionid) {
- try {
- // 检查是否已经登录
- if (app.globalData.accessToken) {
- this.setData({
- isLoggedIn: true,
- });
- // 获取性别设置并加载数据
- this.initGenderAndLoadData();
- // 获取最近阅读记录
- this.getRecentReadBook();
- return;
- }
- // 未登录,执行登录
- const res = await getApp().login(promotionid);
- this.setData({
- isLoggedIn: true,
- });
- // 登录成功后获取性别设置并加载数据
- this.initGenderAndLoadData();
- // 获取最近阅读记录
- this.getRecentReadBook();
- } catch (error) {
- console.error("登录失败:", error);
- // 登录失败也尝试加载数据,使用默认性别
- this.initGenderAndLoadData();
- }
- },
- // 初始化性别设置并加载数据
- initGenderAndLoadData() {
- // 获取保存的性别设置,如果没有则使用默认值
- const gender = wx.getStorageSync("gender") || "male";
- this.setData({
- gender,
- });
- // 加载所有数据
- this.loadAllData();
- },
- // 检查并更新性别,如果有变化则重新加载数据
- checkAndUpdateGender() {
- const savedGender = wx.getStorageSync("gender") || "male";
- if (savedGender !== this.data.gender) {
- this.setData({
- gender: savedGender,
- });
- this.loadAllData();
- }
- },
- // 获取最近阅读的书籍
- async getRecentReadBook() {
- try {
- const historyList = await getBrowsingHistory();
- if (Array.isArray(historyList) && historyList.length > 0) {
- // 取第一本作为最近阅读
- const recentBook = historyList[0];
- this.setData({
- recentBook: recentBook,
- showRecentBook: true,
- isRecentBookHidden: false,
- });
- // 重置动画
- if (this.recentBookAnimator) {
- this.recentBookAnimator.translateX(0).step();
- this.setData({
- recentBookAnimation: this.recentBookAnimator.export(),
- });
- }
- } else {
- this.setData({
- showRecentBook: false,
- });
- }
- } catch (error) {
- console.error("获取最近阅读失败:", error);
- this.setData({
- showRecentBook: false,
- });
- }
- },
- // 跳转到最近阅读的书籍
- goToRecentBook() {
- if (this.data.recentBook) {
- SendEvent("click_bookmall_recently_read", {
- video_id: this.data.recentBook.novelId,
- wx_book_id: this.data.recentBook.wxBookId,
- chapter_no: this.data.recentBook.novelChapterId,
- uuid: app.globalData.uuid,
- });
- goToBookDetail({
- bookId: this.data.recentBook.novelId,
- wxBookId: this.data.recentBook.wxBookId,
- chapterId: this.data.recentBook.novelChapterId,
- });
- }
- },
- // 加载所有数据
- loadAllData() {
- wx.showLoading({
- title: "加载中...",
- });
- // 并行请求数据
- Promise.all([this.getBannerList(), this.getCardNovels()]).finally(() => {
- wx.hideLoading();
- });
- },
- // 切换性别分类
- switchGender: function (e) {
- const { gender } = e.detail;
- // 如果性别没有改变,直接返回
- if (this.data.gender === gender) {
- return;
- }
- // 保存性别设置到本地存储
- wx.setStorageSync("gender", gender);
- this.setData({
- gender,
- });
- SendEvent("click_bookmall_classify", {
- gender: gender,
- uuid: app.globalData.uuid,
- });
- // 重新加载数据
- this.loadAllData();
- },
- // 跳转到搜索页面
- goToSearch: function () {
- // SendEvent('click_bookmall_classify', {});
- wx.navigateTo({
- url: "/pages/search/search",
- });
- },
- // 跳转到书籍详情页
- goToBookDetail: function (e) {
- const bookId = e.currentTarget.dataset.bookId;
- const wxBookId = e.currentTarget.dataset.wxBookId;
- const chapterId = e.currentTarget.dataset.chapterId;
- console.log("bookId", bookId);
- console.log("wxBookId", wxBookId);
- console.log("chapterId", chapterId);
- goToBookDetail({
- bookId,
- wxBookId,
- chapterId,
- });
- },
- // 跳转到功能页面
- goToFeature: function (e) {
- const feature = e.currentTarget.dataset.feature;
- switch (feature) {
- case "recent":
- // 修改为跳转到书架页面的阅读历史标签
- SendEvent("click_shelf_tab", { uuid: app.globalData.uuid });
- wx.switchTab({
- url: "/pages/bookshelf/bookshelf",
- });
- break;
- case "user":
- // 修改为跳转到我的页面
- SendEvent("click_mine_tab", { uuid: app.globalData.uuid });
- wx.switchTab({
- url: "/pages/mine/mine",
- });
- break;
- case "category":
- // 修改为跳转到分类页面
- SendEvent("click_classify_tab", { uuid: app.globalData.uuid });
- wx.switchTab({
- url: "/pages/category/category",
- });
- break;
- case "hot":
- SendEvent("click_bookmall_classify", { uuid: app.globalData.uuid });
- wx.navigateTo({
- url: "/pages/book/list?type=hot",
- });
- break;
- case "recommend":
- SendEvent("click_bookmall_classify", { uuid: app.globalData.uuid });
- wx.navigateTo({
- url: "/pages/book/list?type=recommend",
- });
- break;
- default:
- break;
- }
- },
- bindViewTap() {
- wx.navigateTo({
- url: "../logs/logs",
- });
- },
- onChooseAvatar(e) {
- const { avatarUrl } = e.detail;
- const { nickName } = this.data.userInfo;
- this.setData({
- "userInfo.avatarUrl": avatarUrl,
- hasUserInfo: nickName && avatarUrl && avatarUrl !== defaultAvatarUrl,
- });
- },
- onInputChange(e) {
- const nickName = e.detail.value;
- const { avatarUrl } = this.data.userInfo;
- this.setData({
- "userInfo.nickName": nickName,
- hasUserInfo: nickName && avatarUrl && avatarUrl !== defaultAvatarUrl,
- });
- },
- getUserProfile(e) {
- // 推荐使用wx.getUserProfile获取用户信息,开发者每次通过该接口获取用户个人信息均需用户确认,开发者妥善保管用户快速填写的头像昵称,避免重复弹窗
- wx.getUserProfile({
- desc: "展示用户信息", // 声明获取用户个人信息后的用途,后续会展示在弹窗中,请谨慎填写
- success: (res) => {
- console.log(res);
- this.setData({
- userInfo: res.userInfo,
- hasUserInfo: true,
- });
- },
- });
- },
- // 获取banner列表
- async getBannerList() {
- try {
- const channel = this.data.gender === "male" ? 1 : 2;
- const bannerList = await getBannerList(channel);
- this.setData({
- bannerList,
- });
- return bannerList;
- } catch (error) {
- console.error("获取banner失败:", error);
- wx.showToast({
- title: "获取banner失败",
- icon: "none",
- });
- return [];
- }
- },
- async getCardNovels() {
- try {
- const channel = this.data.gender === "male" ? 1 : 2;
- const cardNovels = await getCardNovels(channel);
- this.setData({
- cardNovels,
- });
- // 处理主编推荐数据
- if (cardNovels[0]) {
- const [firstBook, ...restBooks] = cardNovels[0].novelList;
- this.setData({
- recommendBooks: firstBook
- ? [
- {
- id: firstBook.id,
- title: firstBook.title,
- desc: firstBook.brief,
- stats: `近期收藏${firstBook.readingNumber}`,
- cover: firstBook.cover,
- wxBookId: firstBook.wxBookId,
- chapterId: firstBook.chapterId,
- },
- ]
- : [],
- bookList: restBooks.slice(0, 4).map((novel) => ({
- id: novel.id,
- title: novel.title,
- cover: novel.cover,
- wxBookId: novel.wxBookId,
- chapterId: novel.chapterId,
- })),
- editorTitle: cardNovels[0].name, // 设置实际的标题
- });
- }
- // 处理全网热推数据
- if (cardNovels[1]) {
- this.setData({
- hotBooks: cardNovels[1].novelList.map((novel) => ({
- id: novel.id,
- title: novel.title,
- desc: novel.brief,
- stats: `${novel.readingNumber}人看过`,
- cover: novel.cover,
- wxBookId: novel.wxBookId,
- chapterId: novel.chapterId,
- })),
- hotTitle: cardNovels[1].name, // 设置实际的标题
- });
- }
- // 处理强力推荐数据
- if (cardNovels[2] && cardNovels[2].novelList.length > 0) {
- this.setData({
- strongBooks: cardNovels[2].novelList.slice(0, 4).map((novel) => ({
- id: novel.id,
- title: novel.title,
- cover: novel.cover,
- wxBookId: novel.wxBookId,
- chapterId: novel.chapterId,
- })),
- showStrongRecommend: true,
- });
- } else {
- // 如果没有第三组数据,隐藏强力推荐模块
- this.setData({
- strongBooks: [],
- showStrongRecommend: false,
- });
- }
- return cardNovels;
- } catch (error) {
- console.error("获取卡片小说失败:", error);
- wx.showToast({
- title: "获取卡片小说失败",
- icon: "none",
- });
- return [];
- }
- },
- // 处理banner点击
- onBannerTap(e) {
- const banner = e.currentTarget.dataset.item;
- if (banner.linkUrl) {
- SendEvent("banner_click", {
- banner_id: banner.id,
- banner_title: banner.title,
- uuid: app.globalData.uuid,
- });
- wx.navigateTo({
- url: banner.linkUrl,
- });
- }
- },
- });
|