| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567 |
- // 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 {
- // 检查是否已经登录
- const token = wx.getStorageSync('accessToken');
- if (token) {
- 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
- });
- }
- },
- })
|