From 33dd0a57ac13d70fe8335729dd978a56fe596b98 Mon Sep 17 00:00:00 2001 From: huliyong <2783385703@qq.com> Date: Tue, 20 May 2025 22:52:47 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=96=B0=E5=A2=9E=E4=BD=9C=E5=AE=B6?= =?UTF-8?q?=E3=80=81=E4=B9=A6=E7=B1=8D=E3=80=81=E8=AF=84=E8=AE=BA=E3=80=81?= =?UTF-8?q?=E8=AE=A2=E5=8D=95=E7=AD=89=E7=9B=B8=E5=85=B3=E6=8E=A5=E5=8F=A3?= =?UTF-8?q?=E5=92=8C=E9=A1=B5=E9=9D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 新增作家相关接口和页面,包括保存或更新作家信息、获取作家信息等 - 新增书籍相关接口和页面,包括获取我的作品、添加或修改作品、增加或修改章节等 - 新增评论相关接口和页面,包括获取评论列表、删除评论、回复评论等 - 新增订单相关接口和页面,包括创建订单、支付订单、查询礼物详情等 - 优化部分页面样式和功能,修复已知问题 --- api/api.js | 10 +- api/model/bookshelf.js | 27 +- api/model/comment.js | 46 ++ api/model/index.js | 5 - api/model/my_book.js | 33 ++ api/model/order.js | 42 ++ api/model/task.js | 52 +++ api/model/writer.js | 18 + components/novel/RankListItem.vue | 102 ----- components/novel/newWorkItem.vue | 2 +- components/novel/novelItem.vue | 28 +- components/novel/workItem.vue | 72 ++- config.js | 2 +- pages.json | 17 +- pages/index/bookshelf.vue | 80 ++-- pages/index/center.vue | 22 +- pages_order/auth/wxLogin.vue | 2 +- pages_order/author/chapterList.vue | 231 ++++++++++ pages_order/{novel => author}/createNovel.vue | 20 +- pages_order/{novel => author}/creator.vue | 63 ++- pages_order/author/editor.vue | 17 +- pages_order/comment/comments.vue | 246 +++++++++++ pages_order/comment/respondComments.vue | 255 +++++++++++ pages_order/comment/review.vue | 197 +++++++++ pages_order/components/comment/commentItem.vue | 31 +- pages_order/components/novel/README.md | 141 ------ pages_order/components/novel/RankListItem.vue | 83 ++++ pages_order/components/novel/chapterPopup.vue | 127 ++---- pages_order/components/novel/novelVotePopup.vue | 101 +++-- pages_order/novel/Giftbox.vue | 22 +- pages_order/novel/ReaderAchievement.vue | 63 ++- pages_order/novel/Respondcomments.vue | 212 --------- pages_order/novel/Review.vue | 189 -------- pages_order/novel/Tipping.vue | 505 ++++++++++------------ pages_order/novel/Translation.vue | 129 +++++- pages_order/novel/Walletflow.vue | 3 - pages_order/novel/chapterList.vue | 166 ------- pages_order/novel/comments.vue | 250 ----------- pages_order/novel/components/AgreementCheck.vue | 39 -- pages_order/novel/components/BackArrow.vue | 28 -- pages_order/novel/components/LoginButton.vue | 45 -- pages_order/novel/novelDetail.vue | 332 ++++++++------ pages_order/novel/readnovels - 副本.vue | 463 ++++++++++++++++++++ pages_order/novel/readnovels.vue | 288 ++++++------ pages_order/static/top/4.png | Bin 0 -> 5182 bytes pages_order/static/top/top1.png | Bin 0 -> 132963 bytes store/store.js | 2 +- uni_modules/uv-empty/components/uv-empty/props.js | 8 +- 48 files changed, 2777 insertions(+), 2039 deletions(-) create mode 100644 api/model/comment.js create mode 100644 api/model/my_book.js create mode 100644 api/model/order.js create mode 100644 api/model/task.js create mode 100644 api/model/writer.js delete mode 100644 components/novel/RankListItem.vue create mode 100644 pages_order/author/chapterList.vue rename pages_order/{novel => author}/createNovel.vue (94%) rename pages_order/{novel => author}/creator.vue (68%) create mode 100644 pages_order/comment/comments.vue create mode 100644 pages_order/comment/respondComments.vue create mode 100644 pages_order/comment/review.vue delete mode 100644 pages_order/components/novel/README.md create mode 100644 pages_order/components/novel/RankListItem.vue delete mode 100644 pages_order/novel/Respondcomments.vue delete mode 100644 pages_order/novel/Review.vue delete mode 100644 pages_order/novel/chapterList.vue delete mode 100644 pages_order/novel/comments.vue delete mode 100644 pages_order/novel/components/AgreementCheck.vue delete mode 100644 pages_order/novel/components/BackArrow.vue delete mode 100644 pages_order/novel/components/LoginButton.vue create mode 100644 pages_order/novel/readnovels - 副本.vue create mode 100644 pages_order/static/top/4.png create mode 100644 pages_order/static/top/top1.png diff --git a/api/api.js b/api/api.js index b293594..8ce5cd6 100644 --- a/api/api.js +++ b/api/api.js @@ -5,7 +5,8 @@ import utils from '../utils/utils.js' let limit = {} let debounce = {} -const models = ['login', 'index', 'bookshelf'] +const models = ['login', 'index', 'bookshelf', 'my_book', 'comment', 'task' +, 'order', 'writer'] const config = { // 示例 @@ -52,8 +53,13 @@ export function api(key, data, callback, loadingTitle) { //必须登录 if (req.auth) { if (!uni.getStorageSync('token')) { + // utils.toLogin() + // console.error('需要登录', req.url) + + // store.commit('logout', '登录过期了,你可以停留在此页面或去重新登录') + console.error('登录过期'); utils.toLogin() - console.error('需要登录', req.url) + return Promise.reject() } } diff --git a/api/model/bookshelf.js b/api/model/bookshelf.js index 5c5615b..723240f 100644 --- a/api/model/bookshelf.js +++ b/api/model/bookshelf.js @@ -1,44 +1,29 @@ // 书架相关接口 const api = { - // 批量移除我阅读过的数据根据书籍标识 + // 批量移除我书架过的数据根据书籍标识 batchRemoveReadBook: { url: '/all_book/batchRemoveReadBook', method: 'GET', auth: true, }, - // 获取我的作品带分页 - getMyBookPage: { - url: '/all_book/getMyBookPage', - method: 'GET', - auth: true, - }, - // 获取我阅读过的书籍列表带分页 + // 获取我书架过的书籍列表带分页 getReadBookPage: { url: '/all_book/getReadBookPage', method: 'GET', auth: true, }, - // 移除我阅读过的书籍根据书籍标识 + // 移除我书架过的书籍根据书籍标识 removeReadBook: { url: '/all_book/removeReadBook', method: 'GET', auth: true, }, - // 添加作品或者修改作品 - saveOrUpdateBook: { - url: '/all_book/saveOrUpdateBook', - method: 'POST', - auth: true, - limit: 800, - showLoading: true, - }, - // 增加或修改作品章节 - saveOrUpdateCatalog: { - url: '/all_book/saveOrUpdateCatalog', + // 增加书架记录 + addReadBook: { + url: '/all_book/addReadBook', method: 'POST', auth: true, - limit: 800, }, } diff --git a/api/model/comment.js b/api/model/comment.js new file mode 100644 index 0000000..75e7b05 --- /dev/null +++ b/api/model/comment.js @@ -0,0 +1,46 @@ + + + const api = { + // 根据书本标识获取书本评论列表 + getBookCommentList: { + url: '/my_comment/getCommentList', + method: 'GET', + }, + // 删除评论信息 + deleteComment: { + url: '/my_comment/deleteComment', + method: 'GET', + }, + // 获取我的评论列表 + getMyCommentList: { + url: '/my_comment/getMyCommentList', + method: 'GET', + }, + // 获取我的评论数 + getMyCommentNum: { + url: '/my_comment/getMyCommentNum', + method: 'GET', + }, + // 回复评论信息 + replyComment: { + url: '/my_comment/replyComment', + method: 'POST', + }, + // 保存评论信息 + saveComment: { + url: '/my_comment/saveComment', + method: 'POST', + }, + // 更新评论已读状态 + updateCommentRead: { + url: '/my_comment/updateCommentRead', + method: 'POST', + }, + // 获取评论详情 + getCommentDetail: { + url: '/my_comment/getCommentDetail', + method: 'POST', + }, + } + + export default api \ No newline at end of file diff --git a/api/model/index.js b/api/model/index.js index 3df5fb7..d7d9ea1 100644 --- a/api/model/index.js +++ b/api/model/index.js @@ -38,11 +38,6 @@ const api = { url: '/all_index/getBookCatalogList', method: 'GET', }, - // 根据书本标识获取书本评论列表 - getBookCommentList: { - url: '/all_index/getBookCommentList', - method: 'GET', - }, // 根据书本标识获取书本详细信息 getBookDetail: { url: '/all_index/getBookDetail', diff --git a/api/model/my_book.js b/api/model/my_book.js new file mode 100644 index 0000000..d46fae7 --- /dev/null +++ b/api/model/my_book.js @@ -0,0 +1,33 @@ +// 书架相关接口 + +const api = { + // 获取我的作品带分页 + getMyBookPage: { + url: '/my_book/getMyShopPage', + method: 'GET', + auth: true, + }, + // 添加作品或者修改作品 + saveOrUpdateBook: { + url: '/my_book/saveOrUpdateShop', + method: 'POST', + auth: true, + limit: 800, + showLoading: true, + }, + // 增加或修改作品章节 + saveOrUpdateCatalog: { + url: '/my_book/saveOrUpdateShopNovel', + method: 'POST', + auth: true, + limit: 800, + }, + // 获取我的小说章节列表带分页 + getMyShopNovelPage : { + url: '/my_book/getMyShopNovelPage', + method: 'POST', + auth: true, + }, +} + +export default api \ No newline at end of file diff --git a/api/model/order.js b/api/model/order.js new file mode 100644 index 0000000..efd3c59 --- /dev/null +++ b/api/model/order.js @@ -0,0 +1,42 @@ + +const api = { + // 创建订单 + createOrder : { + url: '/my_order/createOrder', + method: 'POST', + auth: true, + limit: 800, + }, + // 查询礼物详情 + getGiftDetail : { + url: '/my_order/getGiftDetail', + method: 'GET', + auth: true, + }, + // 查询互动打赏礼物信息列表 + getInteractionGiftList : { + url: '/my_order/getInteractionGiftList', + method: 'GET', + auth: true, + }, + // 查询我的礼物包订单列表 + getMyGiftList : { + url: '/my_order/getMyGiftList', + method: 'GET', + auth: true, + }, + // 支付订单 + payOrder : { + url: '/my_order/payOrder', + method: 'POST', + auth: true, + }, + // 支付成功 + paySuccess : { + url: '/my_order/paySuccess', + method: 'POST', + auth: true, + }, +} + +export default api \ No newline at end of file diff --git a/api/model/task.js b/api/model/task.js new file mode 100644 index 0000000..36a31a7 --- /dev/null +++ b/api/model/task.js @@ -0,0 +1,52 @@ + + +const api = { + // 点击更多任务 + clickMoreTask: { + url: '/my_task/clickMoreTask', + method: 'POST', + auth: true, + limit : 1000, + showLoading: true, + }, + // 点击签到任务 + clickSignTask: { + url: '/my_task/clickSignTask', + method: 'GET', + auth: true, + limit : 1000, + showLoading: true, + }, + // 获取更多任务列表 + getMoreTaskList: { + url: '/my_task/getMoreTaskList', + method: 'GET', + auth: true, + }, + // 获取更多任务记录列表 + getMoreTaskRecordPage: { + url: '/my_task/getMoreTaskRecordPage', + method: 'GET', + auth: true, + }, + // 获取我的推荐票数 + getMyRecommendTicketNum: { + url: '/my_task/getMyRecommendTicketNum', + method: 'GET', + auth: true, + }, + // 获取我的推荐任务列表 + getSignTaskList: { + url: '/my_task/getSignTaskList', + method: 'GET', + auth: true, + }, + // 获取我的推荐任务记录列表 + getSignTaskRecordPage: { + url: '/my_task/getSignTaskRecordPage', + method: 'GET', + auth: true, + }, +} + +export default api \ No newline at end of file diff --git a/api/model/writer.js b/api/model/writer.js new file mode 100644 index 0000000..ae05ddb --- /dev/null +++ b/api/model/writer.js @@ -0,0 +1,18 @@ + +const api = { + // 填写或修改笔名以及简介成为作家 + saveOrUpdateWriter : { + url: '/my_writer/saveOrUpdateWriter', + method: 'POST', + auth: true, + limit: 800, + }, + // 查询我的笔名以及简介 + getMyWriter : { + url: '/my_writer/getMyWriter', + method: 'GET', + auth: true, + }, +} + +export default api \ No newline at end of file diff --git a/components/novel/RankListItem.vue b/components/novel/RankListItem.vue deleted file mode 100644 index cceec94..0000000 --- a/components/novel/RankListItem.vue +++ /dev/null @@ -1,102 +0,0 @@ - - - - - \ No newline at end of file diff --git a/components/novel/newWorkItem.vue b/components/novel/newWorkItem.vue index aca5070..76d0990 100644 --- a/components/novel/newWorkItem.vue +++ b/components/novel/newWorkItem.vue @@ -20,7 +20,7 @@ methods: { handleClick() { uni.navigateTo({ - url: '/pages_order/novel/createNovel' + url: '/pages_order/author/createNovel' }) }, handleSettingClick() { diff --git a/components/novel/novelItem.vue b/components/novel/novelItem.vue index deb64a3..527c756 100644 --- a/components/novel/novelItem.vue +++ b/components/novel/novelItem.vue @@ -16,7 +16,7 @@ - {{book.status}} + {{ statusText }} {{ item.service || '大家都在读' }} @@ -39,6 +39,24 @@ default: false } }, + computed: { + statusClass() { + const statusMap = { + 'draft': 'new', + '0': 'ongoing', + '1': 'completed' + }; + return statusMap[this.book.status] || 'ongoing'; + }, + statusText() { + const textMap = { + // '0': '新建', + '0': '连载中', + '1': '已完结' + }; + return textMap[this.book.status] || '连载中'; + }, + }, data() { return {} }, @@ -58,8 +76,8 @@ } .book-cover { - width: 170rpx; - height: 230rpx; + width: 160rpx; + height: 210rpx; border-radius: 8rpx; margin-right: 20rpx; box-shadow: 0 4rpx 8rpx rgba(0,0,0,0.1); @@ -139,13 +157,13 @@ /* 水平布局样式 - 用于网格展示 */ .book-item.horizontal { flex-direction: column; - width: 200rpx; + width: 160rpx; padding: 10rpx; border: none; .book-cover { width: 100%; - height: 260rpx; + height: 200rpx; margin-right: 0; margin-bottom: 10rpx; } diff --git a/components/novel/workItem.vue b/components/novel/workItem.vue index 59fbc4d..18f4698 100644 --- a/components/novel/workItem.vue +++ b/components/novel/workItem.vue @@ -19,8 +19,17 @@ - - {{work.publishStatus || '发布审核中'}} + + {{bookStatusText}} + + + + + {{toolStatusText}} @@ -41,7 +50,7 @@ isManaging: { type: Boolean, default: false - } + }, }, computed: { statusClass() { @@ -59,7 +68,39 @@ '1': '已完结' }; return textMap[this.work.status] || '连载中'; - } + }, + toolStatusClass() { + const toolStatusMap = { + '0': 'ongoing', + '1': 'completed', + '2': 'error', + }; + return toolStatusMap[this.work.toolStatus] || ''; + }, + toolStatusText() { + const textMap = { + '0': '设置审核中', + '1': '设置审核通过', + '2': '设置审核不通过' + }; + return textMap[this.work.toolStatus] || '连载中'; + }, + bookStatusClass() { + const bookStatusMap = { + '0': 'ongoing', + '1': 'completed', + '2': 'error', + }; + return bookStatusMap[this.work.bookStatus] || ''; + }, + bookStatusText() { + const textMap = { + '0': '发布审核中', + '1': '发布审核通过', + '2': '发布审核不通过' + }; + return textMap[this.work.bookStatus] || '连载中'; + }, }, methods: { handleClick() { @@ -69,7 +110,7 @@ } // 跳转到章节列表页面 uni.navigateTo({ - url: '/pages_order/novel/chapterList?id=' + this.work.id + url: '/pages_order/author/chapterList?id=' + this.work.id }); }, handleDelete() { @@ -148,6 +189,7 @@ display: flex; align-items: center; margin-top: 20rpx; + gap: 10rpx; .status-tag { font-size: 22rpx; @@ -173,14 +215,20 @@ } .publish-status { - text { - font-size: 22rpx; - color: #666; - background-color: #f5f5f5; - padding: 4rpx 16rpx; - border-radius: 20rpx; - white-space: nowrap; + &.error{ + color: #666; + background-color: #f5f5f5; + } + &.completed { + background-color: #67c23a; + color: #fff; } + font-size: 22rpx; + color: #666; + background-color: #f5f5f5; + padding: 4rpx 16rpx; + border-radius: 20rpx; + white-space: nowrap; } } } diff --git a/config.js b/config.js index b7ab4a5..605ed19 100644 --- a/config.js +++ b/config.js @@ -8,7 +8,7 @@ import uvUI from '@/uni_modules/uv-ui-tools' Vue.use(uvUI); // 当前环境 -const type = 'dev' +const type = 'prod' // 环境配置 diff --git a/pages.json b/pages.json index dc08b97..824dfcf 100644 --- a/pages.json +++ b/pages.json @@ -62,10 +62,10 @@ "path": "announcement/announcements" }, { - "path": "novel/createNovel" + "path": "author/createNovel" }, { - "path": "novel/chapterList" + "path": "author/chapterList" }, { "path": "novel/ReaderAchievement" @@ -77,22 +77,25 @@ "path": "novel/SubscriptionInformation" }, { - "path": "novel/Tipping" + "path": "novel/Tipping", + "style": { + "navigationBarTextStyle": "white" + } }, { - "path": "novel/Review" + "path": "comment/review" }, { - "path": "novel/comments" + "path": "comment/comments" }, { - "path": "novel/Respondcomments" + "path": "comment/respondComments" }, { "path": "novel/Walletflow" }, { - "path": "novel/creator" + "path": "author/creator" }, { "path": "novel/Giftbox" diff --git a/pages/index/bookshelf.vue b/pages/index/bookshelf.vue index cbd8142..747fee4 100644 --- a/pages/index/bookshelf.vue +++ b/pages/index/bookshelf.vue @@ -31,6 +31,11 @@ + + + 你书架还没有书籍呢 + 去首页看看吧 + @@ -178,16 +183,16 @@ // 检查是否需要切换到作品标签 const activeTab = uni.getStorageSync('activeBookshelfTab') - if (activeTab === 'work') { - this.activeTab = 'work' - this.mixinsListApi = this.apiMap[tab] - uni.removeStorageSync('activeBookshelfTab') - } + // if (activeTab === 'work') { + // this.activeTab = 'work' + // this.mixinsListApi = this.apiMap[tab] + // uni.removeStorageSync('activeBookshelfTab') + // } // 监听切换到作品标签的事件 - uni.$on('switchToWork', () => { - this.activeTab = 'work' - }) + // uni.$on('switchToWork', () => { + // this.activeTab = 'work' + // }) }, onShow() { @@ -315,15 +320,22 @@ uni.showModal({ title: '提示', content: content, - success: (res) => { + success: async (res) => { if (res.confirm) { if (this.activeTab === 'read') { // 移除选中的小说 - this.novels = this.novels.filter(novel => !this.selectedItems.includes(novel.id)); + // this.novels = this.novels.filter(novel => !this.selectedItems.includes(novel.id)); + + await this.$fetch('batchRemoveReadBook', { + bookIds : this.selectedItems.join(',') + }) + uni.showToast({ title: '移除成功', icon: 'success' }); + + this.getData() } else { // 删除选中的作品 this.list = this.list.filter(work => !this.selectedItems.includes(work.id)); @@ -338,7 +350,7 @@ this.selectedItems = []; // 如果没有数据了,退出编辑模式 - if ((this.activeTab === 'read' && this.novels.length === 0) || + if ((this.activeTab === 'read' && this.list.length === 0) || (this.activeTab === 'work' && this.list.length === 0)) { this.exitEditMode(); } @@ -346,11 +358,6 @@ } }); }, - // 加载作品列表 - loadWorksList() { - const savedWorks = uni.getStorageSync('list') || [] - this.list = savedWorks - } } } @@ -436,6 +443,26 @@ } } + .empty-works { + width: 100%; + padding: 100rpx 0; + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + + .empty-text { + font-size: 32rpx; + color: #666; + margin-bottom: 20rpx; + } + + .empty-tips { + font-size: 28rpx; + color: #999; + } + } + .novel-grid { padding: 20rpx; padding-top: 30rpx; @@ -444,7 +471,6 @@ .novel-row { display: flex; - justify-content: space-between; margin-bottom: 40rpx; .novel-item { @@ -494,26 +520,6 @@ position: relative; margin-bottom: 20rpx; } - - .empty-works { - width: 100%; - padding: 100rpx 0; - display: flex; - flex-direction: column; - align-items: center; - justify-content: center; - - .empty-text { - font-size: 32rpx; - color: #666; - margin-bottom: 20rpx; - } - - .empty-tips { - font-size: 28rpx; - color: #999; - } - } } } diff --git a/pages/index/center.vue b/pages/index/center.vue index 43e91c4..22bf6ec 100644 --- a/pages/index/center.vue +++ b/pages/index/center.vue @@ -51,7 +51,7 @@ 我的评论 - 294 + {{ commentNum }} @@ -59,7 +59,7 @@ 任务中心 - 5 + @@ -69,7 +69,7 @@ 设置 - + 申请成为作者 @@ -107,15 +107,15 @@ - - 点击登录 + + 点击登录 - + @@ -133,14 +133,19 @@ }, data() { return { + commentNum : 0, } }, - onLoad() { + onShow() { if(this.isLogin){ this.$store.commit('getUserInfo') + this.getMyCommentNum() } }, methods: { + async getMyCommentNum(){ + this.commentNum = await this.$fetch('getMyCommentNum') + }, } } @@ -243,7 +248,8 @@ font-size: 22rpx; padding: 2rpx 12rpx; border-radius: 20rpx; - margin-right: 10rpx; + margin-right: auto; + margin-left: 20rpx; } } } diff --git a/pages_order/auth/wxLogin.vue b/pages_order/auth/wxLogin.vue index 0cc5df2..851cda2 100644 --- a/pages_order/auth/wxLogin.vue +++ b/pages_order/auth/wxLogin.vue @@ -14,7 +14,7 @@ --> - 手机号授权登录 + 授权登录 diff --git a/pages_order/author/chapterList.vue b/pages_order/author/chapterList.vue new file mode 100644 index 0000000..fc293eb --- /dev/null +++ b/pages_order/author/chapterList.vue @@ -0,0 +1,231 @@ + + + + + \ No newline at end of file diff --git a/pages_order/novel/createNovel.vue b/pages_order/author/createNovel.vue similarity index 94% rename from pages_order/novel/createNovel.vue rename to pages_order/author/createNovel.vue index 1b0bd8e..7156ef4 100644 --- a/pages_order/novel/createNovel.vue +++ b/pages_order/author/createNovel.vue @@ -100,10 +100,26 @@ type: '1', details: '', status: '0' // 默认连载 - } + }, + id: 0 } }, + onLoad(options) { + if (options.id) { + this.id = options.id + this.getBookInfo() + } + }, methods: { + + getBookInfo() { + this.$fetch('getBookDetail', { + id : this.id + }).then(res => { + this.formData = res + }) + }, + // 选择封面 chooseCover() { uni.chooseImage({ @@ -149,7 +165,7 @@ Image: this.formData.Image, type: this.formData.type, details: this.formData.details, - status: this.formData.status, + status: this.formData.status || 0, } await this.$fetch('saveOrUpdateBook', workData) diff --git a/pages_order/novel/creator.vue b/pages_order/author/creator.vue similarity index 68% rename from pages_order/novel/creator.vue rename to pages_order/author/creator.vue index 1a61783..934fd78 100644 --- a/pages_order/novel/creator.vue +++ b/pages_order/author/creator.vue @@ -5,14 +5,12 @@ - * 笔名 - + - * 简介 -