const app = getApp() Page({ data: { projects: [], banners: [], categories: [], userInfo: {}, hasUserInfo: false, canIUse: wx.canIUse('button.open-type.getUserInfo'), canIUseGetUserProfile: false, canIUseOpenData: wx.canIUse('open-data.type.userAvatarUrl') && wx.canIUse('open-data.type.userNickName'), // 如需尝试获取用户信息可改为false selectedCategory: 'all', showcases: [], categoryStats: {} }, onLoad() { if (wx.getUserProfile) { this.setData({ canIUseGetUserProfile: true }) } this.fetchData(); this.fetchBanners(); this.fetchShowcases(); this.fetchCategoryStats(); }, handleCategorySelect(e) { const type = e.currentTarget.dataset.type; this.setData({ selectedCategory: type }); this.fetchData(type); }, fetchBanners() { const { request } = require('../../utils/request') request({ url: '/banners/?is_active=true' }) .then(data => { const list = Array.isArray(data) ? data : (data && data.results) || [] this.setData({ banners: list }) }) .catch(err => console.error('Fetch banners error:', err)) }, handleBannerClick(e) { const item = e.currentTarget.dataset.item; if (item.project) { wx.navigateTo({ url: `/pages/detail/detail?id=${item.project}` }) } else if (item.link) { // Simple link handling (copy or webview) // For simplicity, if it starts with http, copy it if (item.link.startsWith('http')) { wx.setClipboardData({ data: item.link, success: () => wx.showToast({ title: '链接已复制', icon: 'none' }) }) } } }, fetchShowcases() { const { request } = require('../../utils/request') request({ url: '/student-showcases/?is_active=true' }) .then(data => { const list = Array.isArray(data) ? data : (data && data.results) || [] this.setData({ showcases: list }) }) .catch(err => console.error('Fetch showcases error:', err)) }, playVideo(e) { let url = e.currentTarget.dataset.url; if (!url) return; // Fix for local development: replace localhost/127.0.0.1 with actual API host if (url.includes('localhost') || url.includes('127.0.0.1')) { const app = getApp(); // Extract host from baseUrl (e.g. http://127.0.0.1:8000/api -> http://127.0.0.1:8000) const apiBase = app.globalData.baseUrl.split('/api')[0]; // Replace the localhost part url = url.replace(/http:\/\/localhost:\d+/, apiBase) .replace(/http:\/\/127.0.0.1:\d+/, apiBase); } // Use previewMedia for all video urls as our backend uploads files directly now wx.previewMedia({ sources: [{ url: url, type: 'video' }], success: () => console.log('Preview success'), fail: (err) => { console.error('Preview failed', err); // Fallback for non-previewable links wx.setClipboardData({ data: url, success: () => wx.showToast({ title: '视频链接已复制', icon: 'none' }) }) } }) }, fetchData(type = 'all') { const { request } = require('../../utils/request') let url = '/projects/'; if (type !== 'all') { url += `?project_type=${type}`; } request({ url: url }) .then((data) => { const list = Array.isArray(data) ? data : (data && data.results) || [] this.setData({ projects: list }) }) .catch((err) => { console.error(err) this.setData({ projects: [ { id: 1, title: 'Python 数据分析实战', category: '编程开发', image: 'https://images.unsplash.com/photo-1526379095098-d400fd0bf935?w=500&auto=format&fit=crop&q=60&ixlib=rb-4.0.3', students: 1205, rating: 4.8, duration: '12 周' }, { id: 2, title: '零基础英语口语速成', category: '语言学习', image: 'https://images.unsplash.com/photo-1543269865-cbf427effbad?w=500&auto=format&fit=crop&q=60&ixlib=rb-4.0.3', students: 850, rating: 4.9, duration: '8 周' } ] }) }) }, fetchCategoryStats() { const { request } = require('../../utils/request') request({ url: '/dashboard/stats' }) .then(res => { const stats = {}; if (res.pie_chart_data) { res.pie_chart_data.forEach(item => { if (item.type) { stats[item.type] = item.value; } }); } this.setData({ categoryStats: stats }); }) .catch(err => console.error('Fetch stats error:', err)) }, goToDetail(e) { const id = e.currentTarget.dataset.id; wx.navigateTo({ url: `/pages/detail/detail?id=${id}`, }) } })