From 193975597521af1ffd768c3367f9219b85c897b8 Mon Sep 17 00:00:00 2001 From: unknown Date: Wed, 18 Dec 2024 16:15:08 +0800 Subject: [PATCH] Initial Commit --- .eslintrc.js | 31 + .gitignore | 14 + miniprogram/app.json | 45 + miniprogram/app.ts | 41 + miniprogram/app.wxss | 10 + miniprogram/components/reader/reader.json | 4 + miniprogram/components/reader/reader.ts | 886 + miniprogram/components/reader/reader.wxml | 120 + miniprogram/components/reader/reader.wxss | 402 + miniprogram/images/bookshelf/txt.jpg | Bin 0 -> 90714 bytes miniprogram/images/tabbar/README.txt | 27 + miniprogram/images/tabbar/create_icons.ts | 16 + miniprogram/images/tabbar/home.png | Bin 0 -> 3731 bytes miniprogram/pages/bookshelf/add.json | 3 + miniprogram/pages/bookshelf/add.ts | 236 + miniprogram/pages/bookshelf/add.wxml | 100 + miniprogram/pages/bookshelf/add.wxss | 81 + miniprogram/pages/bookshelf/detail.ts | 25 + miniprogram/pages/bookshelf/list.json | 4 + miniprogram/pages/bookshelf/list.ts | 92 + miniprogram/pages/bookshelf/list.wxml | 43 + miniprogram/pages/bookshelf/list.wxss | 133 + miniprogram/pages/bookshelf/reader.ts | 18 + miniprogram/pages/bookshelf/reader.wxml | 5 + miniprogram/pages/bookshelf/reader/index.js | 27 + miniprogram/pages/bookshelf/reader/index.json | 6 + miniprogram/pages/bookshelf/reader/index.ts | 24 + miniprogram/pages/bookshelf/reader/read.json | 3 + miniprogram/pages/bookshelf/reader/read.ts | 66 + miniprogram/pages/bookshelf/reader/read.wxml | 2 + miniprogram/pages/bookshelf/reader/read.wxss | 1 + .../pages/bookshelf/reader/reader.json | 4 + miniprogram/pages/bookshelf/reader/reader.ts | 892 + .../pages/bookshelf/reader/reader.wxml | 120 + .../pages/bookshelf/reader/reader.wxss | 402 + miniprogram/pages/index/index.json | 4 + miniprogram/pages/index/index.ts | 152 + miniprogram/pages/index/index.wxml | 80 + miniprogram/pages/index/index.wxss | 351 + miniprogram/pages/login/index.ts | 137 + miniprogram/pages/login/index.wxml | 30 + miniprogram/pages/login/index.wxss | 43 + miniprogram/pages/logs/logs.json | 4 + miniprogram/pages/logs/logs.ts | 21 + miniprogram/pages/logs/logs.wxml | 6 + miniprogram/pages/logs/logs.wxss | 16 + miniprogram/pages/notes/list.json | 4 + miniprogram/pages/notes/list.ts | 26 + miniprogram/pages/notes/list.wxml | 22 + miniprogram/pages/notes/list.wxss | 59 + miniprogram/pages/notes/notes.json | 4 + miniprogram/pages/notes/notes.ts | 140 + miniprogram/pages/notes/notes.wxml | 65 + miniprogram/pages/notes/notes.wxss | 168 + miniprogram/pages/profile/index.json | 4 + miniprogram/pages/profile/index.ts | 21 + miniprogram/pages/profile/index.wxml | 39 + miniprogram/pages/profile/index.wxss | 70 + miniprogram/pages/profile/profile.json | 3 + miniprogram/pages/profile/profile.ts | 66 + miniprogram/pages/profile/profile.wxml | 60 + miniprogram/pages/profile/profile.wxss | 118 + miniprogram/resources/example.txt | 25 + miniprogram/resources/大爱仙尊.txt | 1 + miniprogram/svg/home.json | 3 + miniprogram/svg/home.wxml | 3 + miniprogram/types/book.d.ts | 24 + miniprogram/utils/request.ts | 139 + miniprogram/utils/util.ts | 19 + package.json | 15 + project.config.json | 56 + project.private.config.json | 8 + tsconfig.json | 30 + types/book.d.ts | 17 + types/note.d.ts | 10 + types/reading-stats.d.ts | 15 + typings/index.d.ts | 8 + typings/types/index.d.ts | 1 + typings/types/wx/index.d.ts | 163 + typings/types/wx/lib.wx.api.d.ts | 33751 ++++++++++++++++ typings/types/wx/lib.wx.app.d.ts | 424 + typings/types/wx/lib.wx.behavior.d.ts | 85 + typings/types/wx/lib.wx.canvas.d.ts | 2623 ++ typings/types/wx/lib.wx.cloud.d.ts | 1016 + typings/types/wx/lib.wx.component.d.ts | 771 + typings/types/wx/lib.wx.event.d.ts | 1436 + typings/types/wx/lib.wx.page.d.ts | 299 + typings/types/wx/lib.wx.phys3D.d.ts | 409 + typings/types/wx/lib.wx.wasm.d.ts | 152 + typings/types/wx/lib.wx.xr-frame.d.ts | 16375 ++++++++ 90 files changed, 63474 insertions(+) create mode 100644 .eslintrc.js create mode 100644 .gitignore create mode 100644 miniprogram/app.json create mode 100644 miniprogram/app.ts create mode 100644 miniprogram/app.wxss create mode 100644 miniprogram/components/reader/reader.json create mode 100644 miniprogram/components/reader/reader.ts create mode 100644 miniprogram/components/reader/reader.wxml create mode 100644 miniprogram/components/reader/reader.wxss create mode 100644 miniprogram/images/bookshelf/txt.jpg create mode 100644 miniprogram/images/tabbar/README.txt create mode 100644 miniprogram/images/tabbar/create_icons.ts create mode 100644 miniprogram/images/tabbar/home.png create mode 100644 miniprogram/pages/bookshelf/add.json create mode 100644 miniprogram/pages/bookshelf/add.ts create mode 100644 miniprogram/pages/bookshelf/add.wxml create mode 100644 miniprogram/pages/bookshelf/add.wxss create mode 100644 miniprogram/pages/bookshelf/detail.ts create mode 100644 miniprogram/pages/bookshelf/list.json create mode 100644 miniprogram/pages/bookshelf/list.ts create mode 100644 miniprogram/pages/bookshelf/list.wxml create mode 100644 miniprogram/pages/bookshelf/list.wxss create mode 100644 miniprogram/pages/bookshelf/reader.ts create mode 100644 miniprogram/pages/bookshelf/reader.wxml create mode 100644 miniprogram/pages/bookshelf/reader/index.js create mode 100644 miniprogram/pages/bookshelf/reader/index.json create mode 100644 miniprogram/pages/bookshelf/reader/index.ts create mode 100644 miniprogram/pages/bookshelf/reader/read.json create mode 100644 miniprogram/pages/bookshelf/reader/read.ts create mode 100644 miniprogram/pages/bookshelf/reader/read.wxml create mode 100644 miniprogram/pages/bookshelf/reader/read.wxss create mode 100644 miniprogram/pages/bookshelf/reader/reader.json create mode 100644 miniprogram/pages/bookshelf/reader/reader.ts create mode 100644 miniprogram/pages/bookshelf/reader/reader.wxml create mode 100644 miniprogram/pages/bookshelf/reader/reader.wxss create mode 100644 miniprogram/pages/index/index.json create mode 100644 miniprogram/pages/index/index.ts create mode 100644 miniprogram/pages/index/index.wxml create mode 100644 miniprogram/pages/index/index.wxss create mode 100644 miniprogram/pages/login/index.ts create mode 100644 miniprogram/pages/login/index.wxml create mode 100644 miniprogram/pages/login/index.wxss create mode 100644 miniprogram/pages/logs/logs.json create mode 100644 miniprogram/pages/logs/logs.ts create mode 100644 miniprogram/pages/logs/logs.wxml create mode 100644 miniprogram/pages/logs/logs.wxss create mode 100644 miniprogram/pages/notes/list.json create mode 100644 miniprogram/pages/notes/list.ts create mode 100644 miniprogram/pages/notes/list.wxml create mode 100644 miniprogram/pages/notes/list.wxss create mode 100644 miniprogram/pages/notes/notes.json create mode 100644 miniprogram/pages/notes/notes.ts create mode 100644 miniprogram/pages/notes/notes.wxml create mode 100644 miniprogram/pages/notes/notes.wxss create mode 100644 miniprogram/pages/profile/index.json create mode 100644 miniprogram/pages/profile/index.ts create mode 100644 miniprogram/pages/profile/index.wxml create mode 100644 miniprogram/pages/profile/index.wxss create mode 100644 miniprogram/pages/profile/profile.json create mode 100644 miniprogram/pages/profile/profile.ts create mode 100644 miniprogram/pages/profile/profile.wxml create mode 100644 miniprogram/pages/profile/profile.wxss create mode 100644 miniprogram/resources/example.txt create mode 100644 miniprogram/resources/大爱仙尊.txt create mode 100644 miniprogram/svg/home.json create mode 100644 miniprogram/svg/home.wxml create mode 100644 miniprogram/types/book.d.ts create mode 100644 miniprogram/utils/request.ts create mode 100644 miniprogram/utils/util.ts create mode 100644 package.json create mode 100644 project.config.json create mode 100644 project.private.config.json create mode 100644 tsconfig.json create mode 100644 types/book.d.ts create mode 100644 types/note.d.ts create mode 100644 types/reading-stats.d.ts create mode 100644 typings/index.d.ts create mode 100644 typings/types/index.d.ts create mode 100644 typings/types/wx/index.d.ts create mode 100644 typings/types/wx/lib.wx.api.d.ts create mode 100644 typings/types/wx/lib.wx.app.d.ts create mode 100644 typings/types/wx/lib.wx.behavior.d.ts create mode 100644 typings/types/wx/lib.wx.canvas.d.ts create mode 100644 typings/types/wx/lib.wx.cloud.d.ts create mode 100644 typings/types/wx/lib.wx.component.d.ts create mode 100644 typings/types/wx/lib.wx.event.d.ts create mode 100644 typings/types/wx/lib.wx.page.d.ts create mode 100644 typings/types/wx/lib.wx.phys3D.d.ts create mode 100644 typings/types/wx/lib.wx.wasm.d.ts create mode 100644 typings/types/wx/lib.wx.xr-frame.d.ts diff --git a/.eslintrc.js b/.eslintrc.js new file mode 100644 index 0000000..115cc02 --- /dev/null +++ b/.eslintrc.js @@ -0,0 +1,31 @@ +/* + * Eslint config file + * Documentation: https://eslint.org/docs/user-guide/configuring/ + * Install the Eslint extension before using this feature. + */ +module.exports = { + env: { + es6: true, + browser: true, + node: true, + }, + ecmaFeatures: { + modules: true, + }, + parserOptions: { + ecmaVersion: 2018, + sourceType: 'module', + }, + globals: { + wx: true, + App: true, + Page: true, + getCurrentPages: true, + getApp: true, + Component: true, + requirePlugin: true, + requireMiniProgram: true, + }, + // extends: 'eslint:recommended', + rules: {}, +} diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..14ea590 --- /dev/null +++ b/.gitignore @@ -0,0 +1,14 @@ +# Windows +[Dd]esktop.ini +Thumbs.db +$RECYCLE.BIN/ + +# macOS +.DS_Store +.fseventsd +.Spotlight-V100 +.TemporaryItems +.Trashes + +# Node.js +node_modules/ diff --git a/miniprogram/app.json b/miniprogram/app.json new file mode 100644 index 0000000..c3692b9 --- /dev/null +++ b/miniprogram/app.json @@ -0,0 +1,45 @@ +{ + "pages": [ + "pages/login/index", + "pages/index/index", + "pages/bookshelf/add", + "pages/logs/logs", + "pages/bookshelf/list", + "pages/notes/notes", + "pages/profile/profile", + "pages/bookshelf/reader/reader" + ], + "window": { + "navigationBarTextStyle": "black", + "navigationBarTitleText": "阅读管理", + "navigationBarBackgroundColor": "#ffffff" + }, + "style": "v2", + "componentFramework": "glass-easel", + "lazyCodeLoading": "requiredComponents", + "tabBar": { + "color": "#999999", + "selectedColor": "#1989fa", + "backgroundColor": "#ffffff", + "list": [ + { + "pagePath": "pages/index/index", + "text": "首页", + "iconPath": "images/tabbar/home.png", + "selectedIconPath": "images/tabbar/home.png" + }, + { + "pagePath": "pages/bookshelf/list", + "text": "书架" + }, + { + "pagePath": "pages/notes/notes", + "text": "笔记" + }, + { + "pagePath": "pages/profile/profile", + "text": "我的" + } + ] + } +} \ No newline at end of file diff --git a/miniprogram/app.ts b/miniprogram/app.ts new file mode 100644 index 0000000..845cdd5 --- /dev/null +++ b/miniprogram/app.ts @@ -0,0 +1,41 @@ +// app.ts +App({ + globalData: { + userInfo: null, + isLoggedIn: false + }, + + onLaunch() { + // 检查登录状态 + const token = wx.getStorageSync('token'); + const userInfo = wx.getStorageSync('userInfo'); + + if (token && userInfo) { + this.globalData.isLoggedIn = true; + this.globalData.userInfo = userInfo; + } else { + // 未登录则跳转到登录页 + wx.redirectTo({ + url: '/pages/login/index' + }); + } + + // 登录 + wx.login({ + success: res => { + console.log('微信登录成功,code:', res.code); + }, + }); + }, + + // 检查登录状态的方法 + checkLogin() { + if (!this.globalData.isLoggedIn) { + wx.redirectTo({ + url: '/pages/login/index' + }); + return false; + } + return true; + } +}); \ No newline at end of file diff --git a/miniprogram/app.wxss b/miniprogram/app.wxss new file mode 100644 index 0000000..06c6fc9 --- /dev/null +++ b/miniprogram/app.wxss @@ -0,0 +1,10 @@ +/**app.wxss**/ +.container { + height: 100%; + display: flex; + flex-direction: column; + align-items: center; + justify-content: space-between; + padding: 200rpx 0; + box-sizing: border-box; +} diff --git a/miniprogram/components/reader/reader.json b/miniprogram/components/reader/reader.json new file mode 100644 index 0000000..b8c1f40 --- /dev/null +++ b/miniprogram/components/reader/reader.json @@ -0,0 +1,4 @@ +{ + "component": true, + "usingComponents": {} +} \ No newline at end of file diff --git a/miniprogram/components/reader/reader.ts b/miniprogram/components/reader/reader.ts new file mode 100644 index 0000000..832e79e --- /dev/null +++ b/miniprogram/components/reader/reader.ts @@ -0,0 +1,886 @@ +import request from '../../utils/request'; + +// 定义组件方法接口 +interface IComponentMethods { + loadChapter: (chapter: number) => Promise; + splitPages: () => Promise; + prevPage: () => void; + nextPage: () => void; + touchStart: (e: WechatMiniprogram.TouchEvent) => void; + touchEnd: (e: WechatMiniprogram.TouchEvent) => void; + toggleToolbar: () => void; + toggleMenu: () => void; + prevChapter: () => void; + nextChapter: () => void; + jumpToChapter: (e: WechatMiniprogram.TouchEvent) => void; + goBack: () => void; + onScroll: (e: WechatMiniprogram.TouchEvent) => void; + toggleSettings: () => void; + decreaseFontSize: () => void; + increaseFontSize: () => void; + startTimeUpdate: () => void; + calculateProgress: () => void; + closeAllPanels: () => void; + switchTheme: (e: WechatMiniprogram.TouchEvent) => void; + adjustBrightness: (e: WechatMiniprogram.SliderChange) => void; + toggleAutoReading: (e: WechatMiniprogram.SwitchChange) => void; + setAutoReadingInterval: (e: WechatMiniprogram.PickerChange) => void; + startAutoReading: () => void; + stopAutoReading: () => void; + toggleBookmarks: () => void; + addBookmark: () => void; + loadBookmarks: () => void; + jumpToBookmark: (e: WechatMiniprogram.TouchEvent) => void; + toggleNotes: () => void; + showTextMenu: (e: WechatMiniprogram.TouchEvent) => void; + addNote: () => void; + loadNotes: () => void; + copyText: () => void; + startReadingTimer: () => void; + updateReadingTime: () => void; + loadTodayReadingTime: () => void; + saveReadingProgress: () => void; + restoreSettings: () => void; + toggleMore: () => void; + onSelectText: (e: any) => void; + addBookmarkWithSelection: () => void; + addNoteWithSelection: () => void; + copySelectedText: () => void; + hideTextMenu: () => void; + startReadingTimer: () => void; + stopReadingTimer: () => void; + saveReadingRecord: (duration: number) => void; +} + +// 定义组件数据接口 +interface IComponentData { + bookTitle: string; + content: string; + currentChapter: number; + totalChapters: number; + showToolbar: boolean; + showMenu: boolean; + scrollTop: number; + chapters: number[]; + lastTapTime: number; + pages: string[]; + currentPage: number; + pageHeight: number; + lineHeight: number; + fontSize: number; + showSettings: boolean; + minFontSize: number; + maxFontSize: number; + currentTime: string; + readingProgress: number; + themes: Array<{id: string; name: string; bg: string; color: string}>; + currentTheme: string; + brightness: number; + autoReading: boolean; + autoReadingInterval: number; + showBookmarks: boolean; + showNotes: boolean; + showTextMenu: boolean; + textMenuTop: number; + textMenuLeft: number; + selectedText: string; + bookmarks: any[]; + notes: any[]; + readingStartTime: number; + todayReadingTime: number; + showMore: boolean; + selectionStart: number; + selectionEnd: number; + readingDuration: number; + isReading: boolean; + readingTimer: any; +} + +// 定义组件属性接口 +interface IComponentProperties { + bookId: string; + bookUrl: string; + title: string; +} + +Component({ + data: { + bookTitle: '', + content: '', + currentChapter: 1, + totalChapters: 2541, + showToolbar: true, + showMenu: false, + scrollTop: 0, + chapters: [] as number[], + lastTapTime: 0, + pages: [] as string[], + currentPage: 0, + pageHeight: 0, + lineHeight: 36, + fontSize: 32, + showSettings: false, + minFontSize: 24, + maxFontSize: 48, + currentTime: '', + readingProgress: 0, + themes: [ + { id: 'default', name: '默认', bg: '#f4ecd8', color: '#333' }, + { id: 'night', name: '夜间', bg: '#222', color: '#999' }, + { id: 'green', name: '护眼', bg: '#cce8cf', color: '#333' }, + { id: 'paper', name: '纸张', bg: '#e8e2d3', color: '#333' } + ], + currentTheme: 'default', + brightness: 100, + autoReading: false, + autoReadingInterval: 5000, + showBookmarks: false, + showNotes: false, + showTextMenu: false, + textMenuTop: 0, + textMenuLeft: 0, + selectedText: '', + bookmarks: [] as any[], + notes: [] as any[], + readingStartTime: 0, + todayReadingTime: 0, + showMore: false, + selectionStart: -1, + selectionEnd: -1, + readingDuration: 0, + isReading: false, + readingTimer: null as any, + }, + + properties: { + bookId: String, + bookUrl: String, + title: String + }, + + lifetimes: { + attached() { + this.setData({ + bookTitle: this.properties.title || '大爱仙尊', + chapters: Array.from({length: 2541}, (_, i) => i + 1) + }); + this.loadChapter(1).then(() => { + this.calculateProgress(); + }); + const savedFontSize = wx.getStorageSync('reader_font_size'); + if (savedFontSize) { + this.setData({ + fontSize: savedFontSize + }); + } + this.startTimeUpdate(); + this.startReadingTimer(); + this.loadBookmarks(); + this.loadNotes(); + this.restoreSettings(); + + // 获取当前屏幕亮度 + wx.getScreenBrightness({ + success: (res) => { + this.setData({ + brightness: Math.round(res.value * 100) + }); + } + }); + }, + + detached() { + if (this.data.readingTimer) { + clearInterval(this.data.readingTimer); + } + this.updateReadingTime(); + this.saveReadingProgress(); + if (this.autoReadingTimer) { + clearInterval(this.autoReadingTimer); + } + this.stopReadingTimer(); + } + }, + + pageLifetimes: { + hide() { + this.stopReadingTimer(); + }, + + show() { + if (!this.data.readingDuration) { + this.startReadingTimer(); + } + } + }, + + methods: { + // 加载章节内容 + async loadChapter(chapter: number) { + try { + wx.showLoading({ title: '加载中...' }); + const res = await request.get('/common/getBookContent', { + bookName: this.data.bookTitle, + id: chapter + }); + + if (res.code === 200) { + // 处理换行符 + const content = res.data.replace(/\\r\\n/g, '\n'); + this.setData({ + content, + currentChapter: chapter // 更新当前章节号 + }); + // 分页处理 + await this.splitPages(); + this.calculateProgress(); + } + } catch (error) { + console.error('加载章节失败:', error); + wx.showToast({ + title: '加载失败', + icon: 'none' + }); + } finally { + wx.hideLoading(); + } + }, + + // 分页处理 + async splitPages() { + // 获取容器尺寸 + const query = this.createSelectorQuery(); + query.select('.content').boundingClientRect(); + const rect = await new Promise(resolve => query.exec(resolve)); + const containerHeight = rect[0].height; + + // 计算每页能显示的行数 + const lineHeight = this.data.lineHeight; + const linesPerPage = Math.floor((containerHeight - 160) / (lineHeight * 2 / 750 * wx.getSystemInfoSync().windowWidth)); + + // 按自然段落分割内容 + const paragraphs = this.data.content.split('\n').filter(p => p.trim()); + + // 分页 + const pages = []; + let currentPage = []; + let currentLines = 0; + + for (const paragraph of paragraphs) { + // 计算段落需要的行数 + const paragraphLines = Math.ceil(paragraph.length * (this.data.fontSize / 32) / 20); + + if (currentLines + paragraphLines > linesPerPage) { + // 当前页放不下这段,新建一页 + if (currentPage.length > 0) { + pages.push(currentPage.join('\n')); + currentPage = []; + currentLines = 0; + } + + // 如果单个段落超过一页 + if (paragraphLines > linesPerPage) { + const chars = Math.floor(20 * linesPerPage); + let p = paragraph; + while (p.length > 0) { + const pageContent = p.slice(0, chars); + pages.push(pageContent); + p = p.slice(chars); + } + } else { + currentPage.push(paragraph); + currentLines = paragraphLines; + } + } else { + // 当前页能放下这段 + currentPage.push(paragraph); + currentLines += paragraphLines; + } + } + + // 保存最后一页 + if (currentPage.length > 0) { + pages.push(currentPage.join('\n')); + } + + this.setData({ + pages, + currentPage: 0, + pageHeight: containerHeight + }, () => { + this.calculateProgress(); + }); + }, + + // 上一页 + prevPage() { + if (this.data.currentPage > 0) { + this.setData({ + currentPage: this.data.currentPage - 1 + }, () => { + this.calculateProgress(); + }); + } else if (this.data.currentChapter > 1) { + // 上一章最后一页 + const prevChapter = this.data.currentChapter - 1; + this.loadChapter(prevChapter).then(() => { + this.setData({ + currentPage: this.data.pages.length - 1 + }, () => { + this.calculateProgress(); + }); + }); + } + }, + + // 下一页 + nextPage() { + if (this.data.currentPage < this.data.pages.length - 1) { + this.setData({ + currentPage: this.data.currentPage + 1 + }, () => { + this.calculateProgress(); + }); + } else if (this.data.currentChapter < this.data.totalChapters) { + // 下一章第一页 + const nextChapter = this.data.currentChapter + 1; + this.loadChapter(nextChapter).then(() => { + this.calculateProgress(); + }); + } + }, + + // 触摸开始 + touchStart(e: any) { + this.touchStartX = e.touches[0].pageX; + }, + + // 触摸结束 + touchEnd(e: any) { + const touchEndX = e.changedTouches[0].pageX; + const diff = touchEndX - this.touchStartX; + + if (Math.abs(diff) > 50) { // 滑动距离大于50px才触发翻页 + if (diff > 0) { + this.prevPage(); + } else { + this.nextPage(); + } + } + }, + + // 切换工具栏显示 + toggleToolbar() { + const now = Date.now(); + if (now - this.data.lastTapTime < 300) { + // 双击 + this.setData({ + showToolbar: !this.data.showToolbar + }); + } + this.setData({ lastTapTime: now }); + }, + + // 切换目录显示 + toggleMenu() { + this.setData({ + showMenu: !this.data.showMenu + }); + }, + + // 上一章 + prevChapter() { + if (this.data.currentChapter > 1) { + this.loadChapter(this.data.currentChapter - 1); + } + }, + + // 下一章 + nextChapter() { + if (this.data.currentChapter < this.data.totalChapters) { + this.loadChapter(this.data.currentChapter + 1); + } + }, + + // 跳转到指定章节 + jumpToChapter(e: any) { + const chapter = e.currentTarget.dataset.chapter; + this.loadChapter(Number(chapter)); // 确保 chapter 是数字 + this.toggleMenu(); + }, + + // 返回 + goBack() { + this.stopReadingTimer(); // 停止计时 + + // 打印阅读时间 + const minutes = Math.floor(this.data.readingDuration / 60); + const seconds = this.data.readingDuration % 60; + console.log(`本次阅读时长: ${minutes}分${seconds}秒`); + console.log('详细信息:', { + 开始时间: new Date(this.data.readingStartTime).toLocaleString(), + 结束时间: new Date().toLocaleString(), + 总秒数: this.data.readingDuration, + 格式化时长: `${minutes}分${seconds}秒` + }); + + wx.navigateBack(); + }, + + // 滚动处理 + onScroll(e: any) { + // 可以在这里处理阅读进度保存等逻辑 + }, + + // 切换设置面板 + toggleSettings() { + console.log('切换设置面板', this.data.showSettings); + this.setData({ + showSettings: !this.data.showSettings, + showMenu: false // 确保目录菜单关闭 + }); + }, + + // 减小字体 + decreaseFontSize() { + if (this.data.fontSize > this.data.minFontSize) { + const newSize = this.data.fontSize - 2; + this.setData({ + fontSize: newSize + }, () => { + // 重新计算分页 + this.splitPages(); + // 保存设置到本地 + wx.setStorageSync('reader_font_size', newSize); + }); + } + }, + + // 增大字体 + increaseFontSize() { + if (this.data.fontSize < this.data.maxFontSize) { + const newSize = this.data.fontSize + 2; + this.setData({ + fontSize: newSize + }, () => { + // 重新计算分页 + this.splitPages(); + // 保存设置到本地 + wx.setStorageSync('reader_font_size', newSize); + }); + } + }, + + // 更新时间 + startTimeUpdate() { + const updateTime = () => { + const now = new Date(); + const hours = now.getHours().toString().padStart(2, '0'); + const minutes = now.getMinutes().toString().padStart(2, '0'); + this.setData({ + currentTime: `${hours}:${minutes}` + }); + }; + + // 立即更新一次 + updateTime(); + // 每分钟更新一次 + this.timeInterval = setInterval(updateTime, 60000); + }, + + // 计算阅读进度 + calculateProgress() { + // 当前章节进度 + const currentChapterProgress = this.data.pages.length > 0 + ? (this.data.currentPage + 1) / this.data.pages.length + : 0; + + // 总进度计算:(当前章节 - 1 + 当前章节阅读进度) / 总章节数 + const totalProgress = Math.floor( + ((this.data.currentChapter - 1 + currentChapterProgress) / this.data.totalChapters) * 100 + ); + + console.log('Progress calculation:', { + currentChapter: this.data.currentChapter, + totalChapters: this.data.totalChapters, + currentPage: this.data.currentPage, + totalPages: this.data.pages.length, + chapterProgress: currentChapterProgress, + totalProgress + }); + + this.setData({ + readingProgress: totalProgress + }); + }, + + // 关闭所有面板 + closeAllPanels() { + this.setData({ + showSettings: false, + showMenu: false + }); + }, + + // 切换主题 + switchTheme(e: any) { + const themeId = e.currentTarget.dataset.theme; + this.setData({ + currentTheme: themeId, + showMore: false // 选择后关闭面板 + }); + wx.setStorageSync('reader_theme', themeId); + }, + + // 调整屏幕亮度 + adjustBrightness(e: WechatMiniprogram.SliderChange) { + const value = e.detail.value; + console.log('调整亮度:', value); // 添加调试日志 + wx.setScreenBrightness({ + value: value / 100, + success: () => { + this.setData({ brightness: value }); + wx.setStorageSync('reader_brightness', value); + console.log('亮度设置成功:', value); + }, + fail: (error) => { + console.error('设置亮度失败:', error); + wx.showToast({ + title: '设置亮度失败', + icon: 'none' + }); + } + }); + }, + + // 自动阅读相关 + toggleAutoReading(e: any) { + const isChecked = e.detail.value; + this.setData({ autoReading: isChecked }); + if (isChecked) { + this.startAutoReading(); + } else { + this.stopAutoReading(); + } + }, + + setAutoReadingInterval(e: any) { + const interval = [3000, 5000, 8000, 10000][e.detail.value]; + this.setData({ autoReadingInterval: interval }); + if (this.data.autoReading) { + this.stopAutoReading(); + this.startAutoReading(); + } + }, + + startAutoReading() { + this.autoReadingTimer = setInterval(() => { + this.nextPage(); + }, this.data.autoReadingInterval); + }, + + stopAutoReading() { + if (this.autoReadingTimer) { + clearInterval(this.autoReadingTimer); + } + }, + + // 书签相关 + toggleBookmarks() { + this.setData({ + showBookmarks: !this.data.showBookmarks, + showSettings: false, + showNotes: false + }); + }, + + addBookmark() { + const bookmark = { + chapter: this.data.currentChapter, + page: this.data.currentPage, + content: this.data.pages[this.data.currentPage].slice(0, 50), + time: new Date().toLocaleString() + }; + const bookmarks = [...this.data.bookmarks, bookmark]; + this.setData({ bookmarks }); + wx.setStorageSync(`bookmarks_${this.data.bookTitle}`, bookmarks); + wx.showToast({ title: '添加书签成功', icon: 'success' }); + }, + + loadBookmarks() { + const bookmarks = wx.getStorageSync(`bookmarks_${this.data.bookTitle}`) || []; + this.setData({ bookmarks }); + }, + + jumpToBookmark(e: any) { + const bookmark = e.currentTarget.dataset.bookmark; + this.loadChapter(bookmark.chapter).then(() => { + this.setData({ + currentPage: bookmark.page, + showBookmarks: false + }); + }); + }, + + // 笔记相关 + toggleNotes() { + this.setData({ + showNotes: !this.data.showNotes, + showSettings: false, + showBookmarks: false + }); + }, + + showTextMenu(e: any) { + const text = this.data.pages[this.data.currentPage]; + const start = 0; + const end = text.length; + + this.setData({ + selectionStart: start, + selectionEnd: end, + selectedText: text.substring(start, end), + showTextMenu: true, + textMenuTop: e.touches[0].clientY, + textMenuLeft: e.touches[0].clientX + }); + }, + + addNote() { + wx.showModal({ + title: '添加笔记', + editable: true, + placeholderText: '请输入笔记内容', + success: (res) => { + if (res.confirm && res.content) { + const note = { + chapter: this.data.currentChapter, + page: this.data.currentPage, + content: res.content, + selectedText: this.data.selectedText, + time: new Date().toLocaleString() + }; + const notes = [...this.data.notes, note]; + this.setData({ + notes, + showTextMenu: false + }); + wx.setStorageSync(`notes_${this.data.bookTitle}`, notes); + wx.showToast({ title: '添加笔记成功', icon: 'success' }); + } + } + }); + }, + + loadNotes() { + const notes = wx.getStorageSync(`notes_${this.data.bookTitle}`) || []; + this.setData({ notes }); + }, + + copyText() { + wx.setClipboardData({ + data: this.data.selectedText, + success: () => { + this.setData({ showTextMenu: false }); + wx.showToast({ title: '复制成功', icon: 'success' }); + } + }); + }, + + // 阅读统计相关 + startReadingTimer() { + this.setData({ + readingStartTime: Date.now(), + isReading: true, + readingDuration: 0 + }); + + // 每秒更新阅读时长 + this.data.readingTimer = setInterval(() => { + const duration = Math.floor((Date.now() - this.data.readingStartTime) / 1000); + this.setData({ readingDuration: duration }); + }, 1000); + }, + + updateReadingTime() { + const duration = Math.floor((Date.now() - this.data.readingStartTime) / 1000); + const today = new Date().toDateString(); + const newTodayTime = this.data.todayReadingTime + duration; + this.setData({ todayReadingTime: newTodayTime }); + + let statistics = wx.getStorageSync('reading_statistics') || {}; + statistics[today] = newTodayTime; + wx.setStorageSync('reading_statistics', statistics); + }, + + loadTodayReadingTime() { + const today = new Date().toDateString(); + const statistics = wx.getStorageSync('reading_statistics') || {}; + this.setData({ todayReadingTime: statistics[today] || 0 }); + }, + + // 保存和恢复设置 + saveReadingProgress() { + const progress = { + chapter: this.data.currentChapter, + page: this.data.currentPage, + timestamp: Date.now() + }; + wx.setStorageSync(`reading_progress_${this.data.bookTitle}`, progress); + }, + + restoreSettings() { + // 恢复主题 + const theme = wx.getStorageSync('reader_theme'); + if (theme) { + this.setData({ currentTheme: theme }); + } + + // 恢复亮度 + const brightness = wx.getStorageSync('reader_brightness'); + if (brightness !== undefined) { + this.setData({ brightness }); + wx.setScreenBrightness({ value: brightness / 100 }); + } + + // 恢复阅读进度 + const progress = wx.getStorageSync(`reading_progress_${this.data.bookTitle}`); + if (progress) { + this.loadChapter(progress.chapter).then(() => { + this.setData({ currentPage: progress.page }); + }); + } + }, + + toggleMore() { + this.setData({ + showMore: !this.data.showMore, + showSettings: false, + showMenu: false + }); + }, + + // 处理文本选择事件 + onSelectText(e: any) { + console.log('Selected text:', e.detail); + const selectedText = e.detail.text; + if (selectedText && selectedText.trim()) { + this.setData({ selectedText }); + } + }, + + // 隐藏文本菜单 + hideTextMenu() { + this.setData({ + showTextMenu: false, + selectionStart: -1, + selectionEnd: -1 + }); + }, + + // 添加书签 + addBookmarkWithSelection() { + const bookmark = { + chapter: this.data.currentChapter, + page: this.data.currentPage, + content: this.data.selectedText, + time: new Date().toLocaleString() + }; + const bookmarks = [...this.data.bookmarks, bookmark]; + this.setData({ + bookmarks, + showTextMenu: false + }); + wx.setStorageSync(`bookmarks_${this.data.bookTitle}`, bookmarks); + wx.showToast({ + title: '添加书签成功', + icon: 'success' + }); + }, + + // 添加笔记 + addNoteWithSelection() { + wx.showModal({ + title: '添加笔记', + editable: true, + placeholderText: '请输入笔记内容', + success: (res) => { + if (res.confirm && res.content) { + const note = { + chapter: this.data.currentChapter, + page: this.data.currentPage, + selectedText: this.data.selectedText, + content: res.content, + time: new Date().toLocaleString() + }; + const notes = [...this.data.notes, note]; + this.setData({ + notes, + showTextMenu: false + }); + wx.setStorageSync(`notes_${this.data.bookTitle}`, notes); + wx.showToast({ + title: '添加笔记成功', + icon: 'success' + }); + } + } + }); + }, + + // 复制选中文本 + copySelectedText() { + if (this.data.selectedText) { + wx.setClipboardData({ + data: this.data.selectedText, + success: () => { + this.setData({ showTextMenu: false }); + wx.showToast({ + title: '复制成功', + icon: 'success' + }); + } + }); + } + }, + + // 结束计时并保存 + stopReadingTimer() { + if (!this.data.isReading) return; + + if (this.data.readingTimer) { + clearInterval(this.data.readingTimer); + } + + const endTime = Date.now(); + const duration = Math.floor((endTime - this.data.readingStartTime) / 1000); + + this.setData({ + readingDuration: duration, + isReading: false + }); + + // 保存阅读记录 + this.saveReadingRecord(duration); + }, + + // 保存阅读记录 + saveReadingRecord(duration: number) { + const readingRecord = { + bookId: this.data.bookId, + startTime: this.data.readingStartTime, + duration: duration, + endTime: Date.now() + }; + + // 可以选择保存到本地或发送到服务器 + wx.setStorageSync('lastReadingRecord', readingRecord); + + wx.showToast({ + title: `本次阅读 ${Math.floor(duration / 60)} 分钟`, + icon: 'none', + duration: 2000 + }); + } + } +}); \ No newline at end of file diff --git a/miniprogram/components/reader/reader.wxml b/miniprogram/components/reader/reader.wxml new file mode 100644 index 0000000..a17dff4 --- /dev/null +++ b/miniprogram/components/reader/reader.wxml @@ -0,0 +1,120 @@ + + + + + + + {{bookTitle}} + + + + + 已阅读 {{Math.floor(readingDuration / 60)}}分{{readingDuration % 60}}秒 + + + + + + 第{{currentChapter}}章 + + {{pages[currentPage]}} + + {{currentPage + 1}}/{{pages.length}} + + + + + + 上一页 + {{currentChapter}}/{{totalChapters}} + 设置 + 下一页 + + + {{currentTime}} + 已读{{readingProgress}}% + + + + + + + 目录 + × + + + + 第{{index + 1}}章 + + + + + + + + 设置 + × + + + + + 字体大小 + + A- + {{fontSize}}px + A+ + + + + + + 主题 + + + {{theme.name}} + + + + + + + 屏幕亮度 + + + + + + + + + + + 添加笔记 + 添加书签 + + \ No newline at end of file diff --git a/miniprogram/components/reader/reader.wxss b/miniprogram/components/reader/reader.wxss new file mode 100644 index 0000000..0897b70 --- /dev/null +++ b/miniprogram/components/reader/reader.wxss @@ -0,0 +1,402 @@ +.reader { + height: 100vh; + background: #f4ecd8; + position: relative; + overflow: hidden; +} + +/* 顶部工具栏 */ +.toolbar { + position: fixed; + top: 0; + left: 0; + right: 0; + height: 88rpx; + background: rgba(0,0,0,0.7); + display: flex; + align-items: center; + padding: 0 30rpx; + transition: all 0.3s; + z-index: 100; +} + +.toolbar.hidden { + transform: translateY(-100%); +} + +.back, .menu { + color: #fff; + font-size: 40rpx; + padding: 20rpx; +} + +.title { + flex: 1; + color: #fff; + font-size: 32rpx; + text-align: center; +} + +/* 阅读区域 */ +.content { + height: 100vh; + padding: 0rpx 0rpx 0rpx; + box-sizing: border-box; + display: flex; + flex-direction: column; + width: 100%; + max-width: 700rpx; + margin: 0 auto; +} + +.chapter-title { + font-size: 36rpx; + font-weight: bold; + color: #333; + margin: 20rpx 0; + text-align: center; +} + +.page-content { + flex: 1; + line-height: 1.8; + text-align: justify; + overflow: hidden; + white-space: pre-wrap; + padding: 0; + width: 100%; + box-sizing: border-box; +} + +.page-content text { + text-indent: 2em; + line-height: 1.8; +} + +.page-number { + text-align: center; + color: #999; + font-size: 24rpx; + padding: 20rpx 0; +} + +/* 底部页码 */ +.page-info { + text-align: center; + color: #999; + font-size: 24rpx; + padding: 10rpx 0; +} + +/* 底部评论区域 */ +.bottom-section { + position: fixed; + bottom: 0; + left: 0; + right: 0; + background: #fff; + border-top: 1rpx solid #eee; + padding: 20rpx; + display: flex; + justify-content: space-between; + align-items: center; +} + +.bookmark-btn { + color: #666; + font-size: 28rpx; + padding: 10rpx 20rpx; +} + +.add-bookmark { + color: #666; + font-size: 28rpx; + padding: 10rpx 20rpx; + display: flex; + align-items: center; +} + +.add-bookmark .close { + margin-left: 10rpx; + font-size: 24rpx; +} + +/* 评论列表 */ +.comment-list { + padding: 20rpx; + background: #fff; + border-top: 1rpx solid #eee; +} + +.comment-item { + padding: 20rpx 0; + border-bottom: 1rpx solid #eee; + font-size: 28rpx; + color: #333; +} + +.comment-time { + font-size: 24rpx; + color: #999; + margin-top: 10rpx; +} + +/* 底部工具栏 */ +.bottom-toolbar { + position: fixed; + bottom: 0; + left: 0; + right: 0; + background: rgba(0,0,0,0.7); + transition: all 0.3s; + z-index: 100; + padding-bottom: env(safe-area-inset-bottom); +} + +.toolbar-top { + height: 100rpx; + display: flex; + align-items: center; + justify-content: space-around; +} + +.toolbar-bottom { + height: 60rpx; + display: flex; + justify-content: space-between; + align-items: center; + padding: 0 40rpx; + border-top: 1rpx solid rgba(255, 255, 255, 0.1); +} + +.prev, .next, .settings { + color: #fff; + font-size: 28rpx; + padding: 20rpx 40rpx; +} + +.progress { + color: #fff; + font-size: 28rpx; +} + +.current-time, .reading-progress { + color: rgba(255, 255, 255, 0.6); + font-size: 24rpx; +} + +/* 设置面板 */ +.settings-panel { + position: fixed; + bottom: 0; + left: 0; + right: 0; + background: #fff; + transform: translateY(100%); + transition: all 0.3s; + z-index: 999; + border-radius: 20rpx 20rpx 0 0; + padding-bottom: env(safe-area-inset-bottom); +} + +.settings-panel.show { + transform: translateY(0); +} + +.settings-header { + height: 88rpx; + display: flex; + align-items: center; + justify-content: space-between; + padding: 0 30rpx; + border-bottom: 1rpx solid #eee; +} + +.settings-header .close { + font-size: 40rpx; + color: #999; + padding: 20rpx; +} + +.settings-content { + padding: 30rpx; +} + +.setting-item { + margin-bottom: 40rpx; +} + +.setting-item text { + font-size: 28rpx; + color: #666; + margin-bottom: 20rpx; + display: block; +} + +/* 字体大小控制 */ +.font-size-control { + display: flex; + align-items: center; + justify-content: space-between; + background: #f7f7f7; + border-radius: 12rpx; + padding: 20rpx; + margin-top: 16rpx; +} + +.size-btn { + width: 80rpx; + height: 80rpx; + border: none; + border-radius: 50%; + display: flex; + align-items: center; + justify-content: center; + font-size: 32rpx; + color: #333; + background: #fff; + box-shadow: 0 2rpx 8rpx rgba(0, 0, 0, 0.1); +} + +.current-size { + font-size: 28rpx; + color: #333; +} + +/* 主题列表 */ +.theme-list { + display: grid; + grid-template-columns: repeat(4, 1fr); + gap: 20rpx; + margin-top: 16rpx; +} + +.theme-item { + aspect-ratio: 1; + border-radius: 12rpx; + display: flex; + align-items: center; + justify-content: center; + font-size: 24rpx; + box-shadow: 0 2rpx 8rpx rgba(0, 0, 0, 0.1); + transition: all 0.3s; +} + +.theme-item.active { + transform: scale(1.05); + box-shadow: 0 4rpx 12rpx rgba(25, 137, 250, 0.2); +} + +/* 亮度调节 */ +.brightness-slider { + margin-top: 16rpx; + padding: 0 12rpx; +} + +.brightness-slider slider { + margin: 0; +} + +.mask { + position: fixed; + top: 0; + left: 0; + right: 0; + bottom: 0; + background: rgba(0, 0, 0, 0.5); + opacity: 0; + visibility: hidden; + transition: all 0.3s; + z-index: 998; +} + +.mask.show { + opacity: 1; + visibility: visible; +} + +/* 目录菜单 */ +.menu-panel { + position: fixed; + top: 0; + right: 0; + bottom: 0; + width: 80%; + background: #fff; + transform: translateX(100%); + transition: all 0.3s; + z-index: 999; + display: flex; + flex-direction: column; +} + +.menu-panel.show { + transform: translateX(0); +} + +.menu-header { + height: 88rpx; + display: flex; + align-items: center; + justify-content: space-between; + padding: 0 30rpx; + border-bottom: 1rpx solid #eee; +} + +.menu-header .close { + font-size: 40rpx; + color: #999; + padding: 20rpx; +} + +.chapter-list { + flex: 1; + overflow-y: auto; +} + +.chapter-item { + padding: 30rpx; + border-bottom: 1rpx solid #eee; + color: #333; + font-size: 28rpx; +} + +.chapter-item.active { + color: #1989fa; + background: rgba(25, 137, 250, 0.1); +} + +/* 文本选择菜单 */ +.text-menu { + position: fixed; + background: rgba(0,0,0,0.8); + border-radius: 8rpx; + padding: 10rpx 0; + transform: translate(-50%, -100%); + opacity: 0; + visibility: hidden; + transition: all 0.2s; + z-index: 999; +} + +.text-menu.show { + opacity: 1; + visibility: visible; +} + +.menu-item { + color: #fff; + font-size: 28rpx; + padding: 16rpx 30rpx; + white-space: nowrap; +} + +.menu-item:active { + background: rgba(255,255,255,0.1); +} + +.reading-time { + font-size: 24rpx; + color: #fff; + margin-right: 20rpx; +} \ No newline at end of file diff --git a/miniprogram/images/bookshelf/txt.jpg b/miniprogram/images/bookshelf/txt.jpg new file mode 100644 index 0000000000000000000000000000000000000000..af9a84ead5c86e8aa8323777b1e66086e06aff02 GIT binary patch literal 90714 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 OZA?*O_F7dH@2Gn=uQ>Yv literal 0 HcmV?d00001 diff --git a/miniprogram/images/tabbar/README.txt b/miniprogram/images/tabbar/README.txt new file mode 100644 index 0000000..0037555 --- /dev/null +++ b/miniprogram/images/tabbar/README.txt @@ -0,0 +1,27 @@ +Tabbar 图标规范说明 + +1. 图标列表 +- home.png & home-active.png // 首页图标 +- bookshelf.png & bookshelf-active.png // 书架图标 +- notes.png & notes-active.png // 笔记图标 +- profile.png & profile-active.png // 我的图标 + +2. 图标规格要求 +- 尺寸: 81px × 81px +- 格式: PNG +- 背景: 透明背景 +- 普通态颜色: #999999 +- 选中态颜色: #1989fa + +3. 设计建议 +- 线条粗细统一 +- 图标风格保持一致 +- 预留出边距,不要顶边 +- 避免过于复杂的细节 + +4. 图标来源建议 +- iconfont (https://www.iconfont.cn/) +- 设计师定制 +- 其他开源图标库 + +注意:替换图标时需保持文件名不变,以确保 tabbar 正常显示。 \ No newline at end of file diff --git a/miniprogram/images/tabbar/create_icons.ts b/miniprogram/images/tabbar/create_icons.ts new file mode 100644 index 0000000..c8297ba --- /dev/null +++ b/miniprogram/images/tabbar/create_icons.ts @@ -0,0 +1,16 @@ +// 创建 tabbar 图标目录 +const iconFiles = [ + 'home.png', // 首页-未选中 + 'home-active.png', // 首页-选中 + 'book.png', // 书架-未选中 + 'book-active.png', // 书架-选中 + 'note.png', // 笔记-未选中 + 'note-active.png', // 笔记-选中 + 'user.png', // 我的-未选中 + 'user-active.png' // 我的-选中 +]; + +// 由于微信小程序对图标有特定要求,建议: +// 1. 图标尺寸: 81px × 81px +// 2. 图标格式: PNG +// 3. 背景色: 透明 \ No newline at end of file diff --git a/miniprogram/images/tabbar/home.png b/miniprogram/images/tabbar/home.png new file mode 100644 index 0000000000000000000000000000000000000000..3c8150c7a0e7072f3c0d40f672a660baf2e64712 GIT binary patch literal 3731 zcmeHK_g9l$5`Gg%Kp==z=}{J`2~8;03gm< zoVm!+9e)cioU;}?mt=DkBF8B_35G=2K?XK58mA52c+-Mr~$tf$%nS9RFD|| zsG+JRNiZLx&)cF4tk!!qe zJ_s1M#d6Zj8fhPcx*nFFQdX7q5XvRIi7P z%v$NWxiy&Z>Mb|DuE(mU!DMOf8Z{3pKI=Jg{3|*qOYU2vNItY({yH7DfcO30Z5(Sk z9z+G4et7R&fnGNr~;H^F`tZQZs z3WzM1d;hh;xH2CWurZNlO*a^6%zE5&fVjaGGLm*8dkX1pq|5#p`soh^h>$R@h<*jK z2_0q?yW&Vca~4d|Z?XVO{0e2veIB2-ZeD=Z{7Ef9P49EpkT|z@k$iVgOjB+QN&daz zGt4*|Ro!+v<;$@N_~x7;EPXJ3;_QMu=r1_doi9F(f^J6xYjUG~k3L~jHvqRb*m=L`qqiz%1oSdMW<4+m_&b5IA+zQB_fo- z*sHh7Z!)ex8RJhJ|B-xysQ^oVnHrMT7}yI^$t@vEaBQ>!IO61gZ?N?sB*Mh>Wl`OZ zTimQ{>&lnnT{*~DK3Hx}c$4Mu+U_Z=dZSi*Wn8sm|5y!9Jtz89?TfmwuOi5BWe;jC zR&>wpwcTW#?}doL)CYSV19MM;H9#XuOS#)DuWHjN09;ClJ#pQyKIvY%zwn)h3+evs zp^qbakLSf@i9Dj3SOJ`+W-k zgaNw#5Fu8s_1dx9Z(gN*`bma%DjAV4mW5&YOD5 zmQ-(XD^z|rA(=uGK514Nair25lh>R#T*WA?j7&Q#CqJ_efSLMSZEvammV4M8ms1G&-bZ*c$W+gNs2r;Vx`%08^+iDcB$u~YcWoy1yH! zct*EuGTagq(T-%p0-^=u1`A4X_~B62+W~Q0K|3Mo5g|i^(GXU&4+H0ChS6EO?7`2`*B*C8tF#o~wrL>u^skrSV{P)(0JBW z+nn--)uRVbroKraaa?Zh7&_L*_dZ#qX{c_cJs49C?(j0q(8!um7(CJCi<>W;-rP4P zL#C5#V|YBjNEWGas>jZu^m30+9)PRr_HV1PO+hV~%iGru{@~2qR*krX zr)rd~=SE6^=2L5bv?fJ>=J&!E$vo2;0-PNo>>RBa43|P-CewJTmD4a!wckfip;Ic-`=+#<0l^aMp~qZFU}mFw7+DhPD$x! zNi|d!)(s<1*wdui^TS`U;1pCRK zC5(S?J*n?Lb+WkvdIn6k^|hY(tZpV5{xX|4oS<*M-=orLG?>hi3>pS`Ag;O}BB9!RQ!>D*uK7*k3?fD;IFkgL? z9gDmvfmGw^bOcJ0qzvg8mz^*za0MmySJ?&=jd>!NVhJn@8Mss9Dt<0T0QX!~@g7S< zZlJoXj1r))9!ibi@?IQ-0LB3YeR0Kqli-78cp2#(>)#OR)#vjeqn})F#H}>e^Ao!X z-|)b$S?ZynoVS1K<-s4tB=J#tQ3Eh$qIqPX?Lr_+5u9^L^Smzy zQm$*Esd4OID<*(pl$wU^$1SM09HTO68SyoLM!HhtVabTd1D VL2jmSo-<_vXH9L+l$dzL{|nLKuGIhl literal 0 HcmV?d00001 diff --git a/miniprogram/pages/bookshelf/add.json b/miniprogram/pages/bookshelf/add.json new file mode 100644 index 0000000..8835af0 --- /dev/null +++ b/miniprogram/pages/bookshelf/add.json @@ -0,0 +1,3 @@ +{ + "usingComponents": {} +} \ No newline at end of file diff --git a/miniprogram/pages/bookshelf/add.ts b/miniprogram/pages/bookshelf/add.ts new file mode 100644 index 0000000..a7862ec --- /dev/null +++ b/miniprogram/pages/bookshelf/add.ts @@ -0,0 +1,236 @@ +import request from '../../utils/request'; + +interface BookForm { + isbn: string; + title: string; + author: string; + publisher: string; + description: string; + bookUrl: string; + coverUrl: string; + category: string; + tags: string; + language: string; + publishDate: string; +} + +Component({ + data: { + form: { + isbn: '', + title: '', + author: '', + publisher: '', + description: '', + bookUrl: '', + coverUrl: '', + category: '', + tags: '', + language: '汉语', + publishDate: '' + } as BookForm, + categories: ['小说', '文学', '历史', '科技', '教育', '其他'] + }, + + methods: { + // 输入框变化处理 + onInput(e: any) { + const { field } = e.currentTarget.dataset; + this.setData({ + [`form.${field}`]: e.detail.value + }); + }, + + // 选择分类 + onCategoryChange(e: any) { + this.setData({ + 'form.category': e.detail.value + }); + }, + + // 选择日期 + onDateChange(e: any) { + const date = e.detail.value; // 格式: "2024-12-16" + // 添加时间部分,转换为标准格式 + const dateTime = `${date} 00:00:00`; + this.setData({ + 'form.publishDate': dateTime + }); + }, + + // 上传封面 + async uploadCover() { + try { + const res = await wx.chooseMedia({ + count: 1, + mediaType: ['image'], + sizeType: ['compressed'] + }); + + wx.showLoading({ title: '上传中...' }); + + // 上传文件到服务器 + const uploadRes = await new Promise((resolve, reject) => { + wx.uploadFile({ + url: 'http://localhost:8084/api/common/uploadFile', + filePath: res.tempFiles[0].tempFilePath, + name: 'file', + formData: { + bucketName: 'photo' + }, + success: (res) => { + console.log('上传成功:', res); + resolve(res); + }, + fail: (error) => { + console.error('上传失败:', error); + reject(error); + } + }); + }); + + console.log('上传响应:', uploadRes); + + if (uploadRes.statusCode !== 200) { + throw new Error(`服务器响应错误: ${uploadRes.statusCode}`); + } + + const data = JSON.parse(uploadRes.data); + console.log('解析后的数据:', data); + + if(data.code === 200) { + this.setData({ + 'form.coverUrl': data.data + }); + wx.showToast({ + title: '上传成功', + icon: 'success' + }); + } else { + throw new Error(data.message || '上传失败'); + } + + } catch (error) { + console.error('上传封面失败:', error); + wx.showToast({ + title: error instanceof Error ? error.message : '上传失败', + icon: 'none' + }); + } finally { + wx.hideLoading(); + } + }, + + // 上传电子书 + async uploadBook() { + try { + const res = await wx.chooseMessageFile({ + count: 1, + type: 'file', + extension: ['txt'] + }); + + wx.showLoading({ title: '上传中...' }); + + // 上传文件到服务器 + const uploadRes = await new Promise((resolve, reject) => { + wx.uploadFile({ + url: 'http://localhost:8084/api/common/uploadFile', + filePath: res.tempFiles[0].path, + name: 'file', + formData: { + bucketName: 'txt' + }, + success: (res) => { + console.log('上传成功:', res); + resolve(res); + }, + fail: (error) => { + console.error('上传失败:', error); + reject(error); + } + }); + }); + + console.log('上传响应:', uploadRes); + + if (uploadRes.statusCode !== 200) { + throw new Error(`服务器响应错误: ${uploadRes.statusCode}`); + } + + const data = JSON.parse(uploadRes.data); + console.log('解析后的数据:', data); + + if(data.code === 200) { + this.setData({ + 'form.bookUrl': data.data + }); + wx.showToast({ + title: '上传成功', + icon: 'success' + }); + } else { + throw new Error(data.message || '上传失败'); + } + + } catch (error) { + console.error('上传文件失败:', error); + wx.showToast({ + title: error instanceof Error ? error.message : '上传失败', + icon: 'none' + }); + } finally { + wx.hideLoading(); + } + }, + + // 提交表单 + async submitForm() { + try { + const { form } = this.data; + + // 表单验证 + if (!form.title || !form.author || !form.bookUrl) { + wx.showToast({ + title: '请填写必要信息', + icon: 'none' + }); + return; + } + + // 确保日期格式正确 + if (form.publishDate && !form.publishDate.includes(':')) { + form.publishDate = `${form.publishDate} 00:00:00`; + } + + wx.showLoading({ title: '提交中...' }); + + const res = await request.post('/books/add', { + ...form, + // 添加当前时间作为创建和更新时间 + createdTime: new Date().toISOString().replace('T', ' ').split('.')[0], + updatedTime: new Date().toISOString().replace('T', ' ').split('.')[0] + }); + + if (res.code === 200) { + wx.showToast({ + title: '添加成功', + icon: 'success' + }); + // 返回书架页面 + setTimeout(() => { + wx.navigateBack(); + }, 1500); + } + } catch (error) { + console.error('提交失败:', error); + wx.showToast({ + title: '提交失败', + icon: 'none' + }); + } finally { + wx.hideLoading(); + } + } + } +}); \ No newline at end of file diff --git a/miniprogram/pages/bookshelf/add.wxml b/miniprogram/pages/bookshelf/add.wxml new file mode 100644 index 0000000..84fa8a4 --- /dev/null +++ b/miniprogram/pages/bookshelf/add.wxml @@ -0,0 +1,100 @@ + +

+ + ISBN + + + + + 书名* + + + + + 作者* + + + + + 出版社 + + + + + 简介 +