Browse Source

fix: 修复用户积分信息更新不一致问题

将多处直接调用getUserInfo替换为fetchLatestUserInfo,确保用户积分信息及时更新
修改书籍详情页跳转逻辑,增加章节存在性验证
调整搜索页每页显示数量为18条
master
前端-胡立永 4 weeks ago
parent
commit
8e0dc213bd
10 changed files with 65 additions and 32 deletions
  1. +2
    -2
      src/api/index.js
  2. +2
    -1
      src/components/book/InteractiveReward.vue
  3. +7
    -10
      src/views/author/WorkSetup.vue
  4. +12
    -0
      src/views/book/chapter.vue
  5. +4
    -0
      src/views/book/index.vue
  6. +22
    -12
      src/views/home/Bookshelf.vue
  7. +5
    -3
      src/views/home/Home.vue
  8. +5
    -2
      src/views/home/Search.vue
  9. +4
    -0
      src/views/user/MoneyLog.vue
  10. +2
    -2
      src/views/user/Recharge.vue

+ 2
- 2
src/api/index.js View File

@ -1,8 +1,8 @@
import axios from 'axios'; import axios from 'axios';
const api = axios.create({ const api = axios.create({
// baseURL: 'http://127.0.0.1:8002/novel-admin',
baseURL: 'https://prod-api.budingxiaoshuo.com/novel-admin',
baseURL: 'http://127.0.0.1:8002/novel-admin',
// baseURL: 'https://prod-api.budingxiaoshuo.com/novel-admin',
// baseURL: import.meta.env.VITE_API_BASE_URL || 'http://127.0.0.1', // baseURL: import.meta.env.VITE_API_BASE_URL || 'http://127.0.0.1',
timeout: 50000, timeout: 50000,
headers: { headers: {


+ 2
- 1
src/components/book/InteractiveReward.vue View File

@ -179,7 +179,8 @@ const submitReward = async () => {
})) }))
}); });
store.getUserInfo();
//
await store.fetchLatestUserInfo();
// //
rewardItems.value.forEach(item => { rewardItems.value.forEach(item => {


+ 7
- 10
src/views/author/WorkSetup.vue View File

@ -75,6 +75,7 @@ import { useRouter, useRoute } from 'vue-router';
import { ElMessage } from 'element-plus'; import { ElMessage } from 'element-plus';
import { Plus } from '@element-plus/icons-vue'; import { Plus } from '@element-plus/icons-vue';
import { myBookApi } from '@/api/bookshelf'; import { myBookApi } from '@/api/bookshelf';
import { homeApi } from '@/api/modules.js';
import { useMainStore } from '@/store'; import { useMainStore } from '@/store';
import { ossService } from '@/utils/oss'; import { ossService } from '@/utils/oss';
@ -131,18 +132,14 @@ export default defineComponent({
const loadWorkData = async () => { const loadWorkData = async () => {
try { try {
loading.value = true; loading.value = true;
const response = await myBookApi.getMyShopPage({
pageNo: 1,
pageSize: 1,
id: workId
});
if (response.success && response.result?.records?.length > 0) {
const workData = response.result.records[0];
const response = await homeApi.getBookDetail({ id: workId });
if (response.success && response.result) {
const workData = response.result;
Object.assign(workForm, { Object.assign(workForm, {
name: workData.name, name: workData.name,
image: workData.image, image: workData.image,
shopClass: workData.shopClass ? workData.shopClass.split(',').map(id => parseInt(id)) : [], //
shopClass: workData.shopClass ? workData.shopClass.split(',') : [], //
details: workData.details, details: workData.details,
status: workData.status status: workData.status
}); });
@ -351,4 +348,4 @@ export default defineComponent({
} }
} }
} }
</style>
</style>

+ 12
- 0
src/views/book/chapter.vue View File

@ -152,6 +152,7 @@ import { bookshelfApi } from '@/api/bookshelf.js';
import CatalogDialog from '@/components/book/CatalogDialog.vue'; import CatalogDialog from '@/components/book/CatalogDialog.vue';
import SubscriptionPopup from '@/components/book/SubscriptionPopup.vue'; import SubscriptionPopup from '@/components/book/SubscriptionPopup.vue';
import { toggleTheme, getThemeMode, setThemeMode } from '@/utils/theme.js'; import { toggleTheme, getThemeMode, setThemeMode } from '@/utils/theme.js';
import { useMainStore } from '@/store';
export default { export default {
name: 'ChapterDetail', name: 'ChapterDetail',
@ -172,6 +173,7 @@ export default {
setup() { setup() {
const route = useRoute(); const route = useRoute();
const router = useRouter(); const router = useRouter();
const store = useMainStore();
const bookId = computed(() => route.params.id); const bookId = computed(() => route.params.id);
const chapterId = computed(() => route.params.chapterId); const chapterId = computed(() => route.params.chapterId);
@ -439,6 +441,11 @@ export default {
updateSubscriptionStatus(); updateSubscriptionStatus();
ElMessage.success('订阅成功'); ElMessage.success('订阅成功');
//
if (store.isAuthenticated) {
await store.fetchLatestUserInfo();
}
// //
await getBookCatalogDetail(); await getBookCatalogDetail();
} catch (err) { } catch (err) {
@ -475,6 +482,11 @@ export default {
ElMessage.success(`成功订阅${chapterIds.length}`); ElMessage.success(`成功订阅${chapterIds.length}`);
//
if (store.isAuthenticated) {
await store.fetchLatestUserInfo();
}
// //
await getBookCatalogList(); await getBookCatalogList();
isPay.value = false; isPay.value = false;


+ 4
- 0
src/views/book/index.vue View File

@ -378,6 +378,8 @@ export default {
fetchBookDetail(); fetchBookDetail();
if (store.isAuthenticated) { if (store.isAuthenticated) {
fetchUserAchievement(); fetchUserAchievement();
//
store.fetchLatestUserInfo();
} }
}; };
@ -389,6 +391,8 @@ export default {
fetchBookDetail(); fetchBookDetail();
if (store.isAuthenticated) { if (store.isAuthenticated) {
fetchUserAchievement(); fetchUserAchievement();
//
store.fetchLatestUserInfo();
} }
}; };


+ 22
- 12
src/views/home/Bookshelf.vue View File

@ -67,6 +67,7 @@ import { useRouter } from 'vue-router';
import { ElMessage, ElMessageBox } from 'element-plus'; import { ElMessage, ElMessageBox } from 'element-plus';
import bookshelfCard from '@/components/bookshelf/bookshelfCard.vue'; import bookshelfCard from '@/components/bookshelf/bookshelfCard.vue';
import { bookshelfApi } from '@/api/bookshelf.js'; import { bookshelfApi } from '@/api/bookshelf.js';
import { homeApi } from '@/api/modules.js';
export default { export default {
name: 'BookshelfView', name: 'BookshelfView',
@ -119,24 +120,32 @@ export default {
if (deleteMode.value) return; // if (deleteMode.value) return; //
if(book.novelId){ if(book.novelId){
router.push({
name: 'ChapterDetail',
params: {
id: book.shopId,
chapterId: book.novelId
//
try {
const chapterResponse = await homeApi.getBookCatalogDetail(book.novelId);
if (chapterResponse && chapterResponse.success && chapterResponse.result) {
//
router.push({
name: 'ChapterDetail',
params: {
id: book.shopId,
chapterId: book.novelId
}
});
return;
} }
});
return
} catch (error) {
console.warn('章节不存在或获取失败,将跳转到第一章:', error);
}
//
} }
// //
try { try {
const response = await homeApi.getBookCatalogList({ const response = await homeApi.getBookCatalogList({
bookId: bookId,
bookId: book.shopId,
pageNo: 1, pageNo: 1,
pageSize: 1, //
pageSize: 1, //
}); });
if (response.success && response.result) { if (response.success && response.result) {
@ -157,6 +166,7 @@ export default {
} }
} catch (error) { } catch (error) {
console.error('获取章节目录失败:', error); console.error('获取章节目录失败:', error);
ElMessage.error('获取章节失败,请稍后重试');
} }
}; };
@ -374,4 +384,4 @@ export default {
margin-top: 20px; margin-top: 20px;
border-top: 1px solid #f0f0f0; border-top: 1px solid #f0f0f0;
} }
</style>
</style>

+ 5
- 3
src/views/home/Home.vue View File

@ -13,7 +13,7 @@
<div class="home-banner"> <div class="home-banner">
<el-carousel height="280px" indicator-position="outside"> <el-carousel height="280px" indicator-position="outside">
<el-carousel-item v-for="(banner, index) in banners" :key="index" <el-carousel-item v-for="(banner, index) in banners" :key="index"
@click="goToDetail(banner.id)">
@click="goToDetail(banner)">
<div class="banner-item" :style="{ backgroundImage: `url(${banner.image})` }"> <div class="banner-item" :style="{ backgroundImage: `url(${banner.image})` }">
<!-- <div class="banner-content"> <!-- <div class="banner-content">
<h2>{{ banner.title }}</h2> <h2>{{ banner.title }}</h2>
@ -139,8 +139,10 @@ export default {
} }
}; };
const goToDetail = (id) => {
router.push(`/book/${id}`);
const goToDetail = (banner) => {
if (banner.pcPath) {
router.push(banner.pcPath);
}
}; };
const viewAnnouncement = (id) => { const viewAnnouncement = (id) => {


+ 5
- 2
src/views/home/Search.vue View File

@ -132,7 +132,7 @@ export default {
// //
const currentPage = ref(1); const currentPage = ref(1);
const pageSize = ref(20);
const pageSize = ref(18);
const total = ref(0); const total = ref(0);
const loading = ref(false); const loading = ref(false);
@ -223,6 +223,9 @@ export default {
const handlePageChange = (page) => { const handlePageChange = (page) => {
currentPage.value = page; currentPage.value = page;
//
fetchBooks();
// //
const query = { const query = {
page: page page: page
@ -634,4 +637,4 @@ export default {
} }
} }
} }
</style>
</style>

+ 4
- 0
src/views/user/MoneyLog.vue View File

@ -79,6 +79,7 @@ import { ElMessage } from 'element-plus';
import { Wallet } from '@element-plus/icons-vue'; import { Wallet } from '@element-plus/icons-vue';
import { moneyApi } from '@/api/user.js'; import { moneyApi } from '@/api/user.js';
import { formatDate as formatDateUtil } from '@/utils/date'; import { formatDate as formatDateUtil } from '@/utils/date';
import { useMainStore } from '@/store';
export default { export default {
name: 'MoneyLog', name: 'MoneyLog',
@ -93,10 +94,13 @@ export default {
const currentPage = ref(1); const currentPage = ref(1);
const pageSize = ref(10); const pageSize = ref(10);
const total = ref(0); const total = ref(0);
const mainStore = useMainStore();
// //
const getMyMoneyNum = async () => { const getMyMoneyNum = async () => {
try { try {
mainStore.fetchLatestUserInfo();
const res = await moneyApi.getMyMoneyNum(); const res = await moneyApi.getMyMoneyNum();
balance.value = res.result || 0; balance.value = res.result || 0;
} catch (error) { } catch (error) {


+ 2
- 2
src/views/user/Recharge.vue View File

@ -168,7 +168,7 @@ const handlePaymentSuccess = async (orderId) => {
ElMessage.success(`充值成功,获得${totalBeans.value}豆豆`); ElMessage.success(`充值成功,获得${totalBeans.value}豆豆`);
// //
await store.getUserInfo();
await store.fetchLatestUserInfo();
// //
showPaymentModal.value = false; showPaymentModal.value = false;
@ -494,4 +494,4 @@ onMounted(() => {
gap: 12px; gap: 12px;
} }
} }
</style>
</style>

Loading…
Cancel
Save