Files
ai_wht_wechat/miniprogram/miniprogram/pages/home/home.ts
2025-12-19 22:36:48 +08:00

313 lines
8.0 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

// pages/home/home.ts
import { EmployeeService, Product as ApiProduct } from '../../services/employee';
interface Product {
id: number;
name: string;
price: number;
sales: number;
image: string;
category: string;
tags: string[];
hotLevel: number; // 1-5 热度等级
description?: string;
available_copies?: number;
}
interface Category {
id: string;
name: string;
}
Page({
data: {
selectedProduct: 0 as number, // 选中的商品ID
selectedProductName: '' as string, // 选中的商品名称
products: [] as Product[],
hasMore: true,
loading: false,
page: 1,
pageSize: 6
},
onLoad() {
// 不在onLoad检查登录允许用户浏览首页
this.loadProducts();
},
// 加载商品列表
async loadProducts() {
if (this.data.loading || !this.data.hasMore) return;
this.setData({ loading: true });
try {
// 从后端API获取产品列表公开接口不需要登录
const response = await EmployeeService.getProducts();
if (response.code === 200 && response.data) {
const apiProducts = response.data.list.map((product: ApiProduct, index: number) => ({
id: product.id,
name: product.name,
price: 0, // 后端暂无价格字段
sales: product.available_copies || 0,
image: product.image || `https://picsum.photos/id/${237 + index}/300/400`,
category: 'beauty', // 后端暂无分类字段
tags: ['种草', '推荐'],
hotLevel: product.available_copies > 5 ? 5 : 3,
description: product.description,
available_copies: product.available_copies
}));
this.setData({
products: apiProducts,
loading: false,
hasMore: false
});
return;
}
} catch (error) {
console.error('加载产品失败:', error);
// API失败使用模拟数据
}
// 如果API失败使用模拟数据
const allMockProducts = [
{
id: 1,
name: '兰蔻小黑瓶精华液',
price: 680,
sales: 10234,
image: 'https://picsum.photos/id/237/300/400',
category: 'beauty',
tags: ['美白', '抗老', '保湿'],
hotLevel: 5
},
{
id: 2,
name: 'SK-II神仙水',
price: 1299,
sales: 8765,
image: 'https://picsum.photos/id/152/300/400',
category: 'beauty',
tags: ['补水', '缩毛孔', '提亮'],
hotLevel: 5
},
{
id: 3,
name: '雅诗兰黛小棕瓶',
price: 790,
sales: 9432,
image: 'https://picsum.photos/id/292/300/400',
category: 'beauty',
tags: ['修复', '抗氧化', '紧致'],
hotLevel: 4
},
{
id: 4,
name: 'Dior烈艳蓝金口红',
price: 320,
sales: 15678,
image: 'https://picsum.photos/id/365/300/400',
category: 'beauty',
tags: ['段色', '滑顺', '持久'],
hotLevel: 5
},
{
id: 5,
name: 'AirPods Pro 2',
price: 1899,
sales: 23456,
image: 'https://picsum.photos/id/180/300/400',
category: 'digital',
tags: ['降噪', '音质', '舒适'],
hotLevel: 5
},
{
id: 6,
name: 'iPhone 15 Pro',
price: 7999,
sales: 34567,
image: 'https://picsum.photos/id/119/300/400',
category: 'digital',
tags: ['性能', '拍照', '长续航'],
hotLevel: 5
},
{
id: 7,
name: '海蓝之谜精华面霜',
price: 890,
sales: 7654,
image: 'https://picsum.photos/id/225/300/400',
category: 'beauty',
tags: ['保湿', '修复', '舒缓'],
hotLevel: 4
},
{
id: 8,
name: '迪奥烈影精华',
price: 1680,
sales: 5432,
image: 'https://picsum.photos/id/177/300/400',
category: 'beauty',
tags: ['抗衰老', '紧致', '提亮'],
hotLevel: 5
},
{
id: 9,
name: 'Zara复古风衣',
price: 299,
sales: 12345,
image: 'https://picsum.photos/id/111/300/400',
category: 'fashion',
tags: ['复古', '百搭', '时尚'],
hotLevel: 4
},
{
id: 10,
name: 'Uniqlo羊绒衫',
price: 199,
sales: 23456,
image: 'https://picsum.photos/id/222/300/400',
category: 'fashion',
tags: ['保暖', '舒适', '百搭'],
hotLevel: 5
},
{
id: 11,
name: '星巴克咖啡豆',
price: 88,
sales: 34567,
image: 'https://picsum.photos/id/431/300/400',
category: 'food',
tags: ['香浓', '精品', '中烘'],
hotLevel: 5
},
{
id: 12,
name: '三只松鼠零食礼盒',
price: 158,
sales: 19876,
image: 'https://picsum.photos/id/326/300/400',
category: 'food',
tags: ['零食', '礼盒', '美味'],
hotLevel: 4
}
];
// 模拟分页加载
setTimeout(() => {
const start = (this.data.page - 1) * this.data.pageSize;
const end = start + this.data.pageSize;
const newProducts = allMockProducts.slice(start, end);
this.setData({
products: [...this.data.products, ...newProducts],
hasMore: end < allMockProducts.length,
loading: false,
page: this.data.page + 1
});
}, 800);
},
// 切换商品选中状态
toggleProduct(e: any) {
const productId = e.currentTarget.dataset.id;
const productName = e.currentTarget.dataset.name;
this.setData({
selectedProduct: productId === this.data.selectedProduct ? 0 : productId,
selectedProductName: productId === this.data.selectedProduct ? '' : productName
});
},
// 去生成内容
async goToGenerate() {
if (!this.data.selectedProduct) {
wx.showToast({
title: '请先选择商品',
icon: 'none'
});
return;
}
// 1. 检查登录状态
const token = wx.getStorageSync('token');
if (!token) {
wx.showModal({
title: '未登录',
content: '请先登录后再查看文案',
confirmText: '去登录',
success: (res) => {
if (res.confirm) {
wx.redirectTo({
url: '/pages/login/login'
});
}
}
});
return;
}
// 2. 检查小红书绑定状态
try {
const response = await EmployeeService.getProfile();
if (response.code === 200 && response.data) {
const isBoundXHS = response.data.is_bound_xhs;
if (!isBoundXHS) {
// 未绑定小红书,提示并跳转
wx.showModal({
title: '未绑定小红书',
content: '查看文案前需要先绑定小红书账号',
confirmText: '去绑定',
success: (res) => {
if (res.confirm) {
wx.navigateTo({
url: '/pages/profile/social-binding/social-binding'
});
}
}
});
return;
}
// 登录且已绑定,跳转到文案列表页面
wx.navigateTo({
url: `/pages/articles/articles?productId=${this.data.selectedProduct}`
});
} else {
throw new Error('获取用户信息失败');
}
} catch (error) {
console.error('检查绑定状态失败:', error);
wx.showToast({
title: '获取用户信息失败',
icon: 'none'
});
}
},
// 滚动到底部加载更多
onScrollToLower() {
this.loadProducts();
},
// 分享功能
onShareAppMessage() {
return {
title: '万花筒AI助手 - 智能生成种草文案',
path: '/pages/home/home',
imageUrl: '' // 可以设置分享图片
};
},
// 分享到朋友圈
onShareTimeline() {
return {
title: '万花筒AI助手 - 智能生成种草文案',
imageUrl: '' // 可以设置分享图片
};
}
});