ai-c/pages/academy/list/list.js
2026-02-02 18:21:32 +08:00

157 lines
3.8 KiB
JavaScript

const api = require('../../../utils/api')
Page({
data: {
articles: [],
categories: [],
activeCategory: null,
page: 1,
hasMore: true,
loading: false,
error: null
},
onLoad() {
this.loadCategories()
this.loadArticles()
},
onBack() {
wx.navigateBack()
},
onArticleTap(e) {
const id = e.currentTarget.dataset.id
wx.navigateTo({
url: `/pages/academy/detail/detail?id=${id}`
})
},
async loadCategories() {
try {
const res = await api.happySchool.getCategories()
console.log('[happy-school] 分类响应:', res)
if (res.success && res.data) {
let categories = []
if (res.data.length > 0 && res.data[0].id !== null) {
categories = [
{ id: null, name: '全部' },
...res.data.map(cat => ({
id: cat.id,
name: cat.name
}))
]
} else {
categories = res.data.map(cat => ({
id: cat.id,
name: cat.name
}))
}
this.setData({ categories })
}
} catch (err) {
console.error('[happy-school] 加载分类失败:', err)
}
},
async loadArticles(reset = true) {
if (this.data.loading) return
if (!reset && !this.data.hasMore) return
this.setData({ loading: true, error: null })
const page = reset ? 1 : this.data.page + 1
try {
const params = {
page,
limit: 20
}
if (this.data.activeCategory) {
params.categoryId = this.data.activeCategory
}
console.log('[happy-school] 请求文章列表:', params)
const res = await api.happySchool.getArticles(params)
console.log('[happy-school] 文章响应:', res)
if (res.success && res.data) {
let list = []
if (Array.isArray(res.data)) {
list = res.data
} else if (res.data.data && Array.isArray(res.data.data)) {
list = res.data.data
} else if (res.data.list && Array.isArray(res.data.list)) {
list = res.data.list
}
const articles = list.map(item => ({
id: item.id,
title: item.title,
summary: item.summary || '',
cover: this.processImageUrl(item.coverImage),
date: this.formatDate(item.publishTime),
views: item.readCount || 0,
categoryName: item.categoryName || ''
}))
this.setData({
articles: reset ? articles : [...this.data.articles, ...articles],
page,
hasMore: articles.length >= params.limit,
loading: false
})
} else {
this.setData({
loading: false,
error: res.error || '加载失败'
})
}
} catch (err) {
console.error('[happy-school] 加载文章失败:', err)
this.setData({
loading: false,
error: err.message || '加载失败'
})
}
},
onCategoryTap(e) {
const categoryId = e.currentTarget.dataset.id
if (categoryId === this.data.activeCategory) return
this.setData({
activeCategory: categoryId,
page: 1,
hasMore: true,
articles: []
})
this.loadArticles(true)
},
processImageUrl(url) {
if (!url) return ''
if (url.startsWith('http://') || url.startsWith('https://')) {
return url
}
return 'https://ai-c.maimanji.com' + (url.startsWith('/') ? '' : '/') + url
},
formatDate(dateStr) {
if (!dateStr) return ''
const date = new Date(dateStr)
const year = date.getFullYear()
const month = String(date.getMonth() + 1).padStart(2, '0')
const day = String(date.getDate()).padStart(2, '0')
return `${year}-${month}-${day}`
},
onReachBottom() {
this.loadArticles(false)
}
})