353 lines
10 KiB
JavaScript
353 lines
10 KiB
JavaScript
|
|
const config = require('../config/config.js');
|
|||
|
|
const apiClient = require('../utils/api-client.js');
|
|||
|
|
|
|||
|
|
Component({
|
|||
|
|
data: {
|
|||
|
|
selected: 0,
|
|||
|
|
color: '#999999',
|
|||
|
|
selectedColor: '#ffffff',
|
|||
|
|
showCameraAction: false, // 拍照弹窗显示状态
|
|||
|
|
cameraActive: false, // 发布按钮激活状态
|
|||
|
|
list: [
|
|||
|
|
{
|
|||
|
|
pagePath: '/pages/map/map',
|
|||
|
|
text: '发现',
|
|||
|
|
iconPath: '/images/index/location.png',
|
|||
|
|
selectedIconPath: '/images/index/location-active.png'
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
pagePath: '/pages/circle/circle',
|
|||
|
|
text: '圈子',
|
|||
|
|
iconPath: '/images/index/circle.png',
|
|||
|
|
selectedIconPath: '/images/index/circle-active.png'
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
pagePath: '/subpackages/media/camera/camera',
|
|||
|
|
iconPath: '/images/index/phone.png',
|
|||
|
|
text: '发布',
|
|||
|
|
selectedIconPath: '/images/index/phone-active.png'
|
|||
|
|
},
|
|||
|
|
|
|||
|
|
{
|
|||
|
|
pagePath: '/pages/message/message',
|
|||
|
|
text: '聊天',
|
|||
|
|
iconPath: '/images/index/message.png',
|
|||
|
|
selectedIconPath: '/images/index/message-active.png'
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
pagePath: '/pages/social/friends/friends',
|
|||
|
|
text: '好友',
|
|||
|
|
iconPath: '/images/index/friend.png',
|
|||
|
|
selectedIconPath: '/images/index/friend-active.png'
|
|||
|
|
}
|
|||
|
|
]
|
|||
|
|
},
|
|||
|
|
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* 用户点击右上角分享
|
|||
|
|
*/
|
|||
|
|
onShareAppMessage(options) {
|
|||
|
|
// options.from 可以是 'button' 或 'menu'
|
|||
|
|
// 'button' 表示通过页面内的分享按钮触发
|
|||
|
|
// 'menu' 表示通过右上角菜单的分享按钮触发
|
|||
|
|
|
|||
|
|
return {
|
|||
|
|
title: 'Find Me', // 分享标题
|
|||
|
|
path: '/custom-tab-bar/index/index', // 分享路径,必须是以 / 开头的完整路径
|
|||
|
|
imageUrl: '/images/findme-logo.png', // 分享图标,可以是本地图片或网络图片
|
|||
|
|
success(res) {
|
|||
|
|
// 分享成功后的回调
|
|||
|
|
console.log('分享成功', res);
|
|||
|
|
// 可以在这里添加统计代码等
|
|||
|
|
},
|
|||
|
|
fail(res) {
|
|||
|
|
// 分享失败后的回调
|
|||
|
|
console.log('分享失败', res);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
},
|
|||
|
|
|
|||
|
|
attached() {
|
|||
|
|
// 已通过CSS调整适配所有设备
|
|||
|
|
try {
|
|||
|
|
const counts = wx.getStorageSync('unreadCounts') || {};
|
|||
|
|
const friends = Number(counts.friends || 0);
|
|||
|
|
const messages = Number(counts.messages || 0);
|
|||
|
|
if (friends || messages) {
|
|||
|
|
this.setData({
|
|||
|
|
friendsBadge: friends,
|
|||
|
|
messagesBadge: messages
|
|||
|
|
});
|
|||
|
|
}
|
|||
|
|
} catch (_) {}
|
|||
|
|
},
|
|||
|
|
methods: {
|
|||
|
|
// 对外暴露:设置好友请求角标数量
|
|||
|
|
setFriendsBadge(count) {
|
|||
|
|
const n = Number(count) || 0;
|
|||
|
|
if (this.data.friendsBadge === n) return;
|
|||
|
|
this.setData({ friendsBadge: n < 0 ? 0 : n });
|
|||
|
|
},
|
|||
|
|
// 对外暴露:设置消息未读角标数量
|
|||
|
|
setMessagesBadge(count) {
|
|||
|
|
const n = Number(count) || 0;
|
|||
|
|
if (this.data.messagesBadge === n) return;
|
|||
|
|
this.setData({ messagesBadge: n < 0 ? 0 : n });
|
|||
|
|
},
|
|||
|
|
// 清除所有角标
|
|||
|
|
clearBadges() {
|
|||
|
|
this.setData({ friendsBadge: 0, messagesBadge: 0 });
|
|||
|
|
},
|
|||
|
|
switchTab(e) {
|
|||
|
|
const data = e.currentTarget.dataset;
|
|||
|
|
const url = data.path;
|
|||
|
|
const index = data.index;
|
|||
|
|
|
|||
|
|
// 获取当前页面信息
|
|||
|
|
const pages = getCurrentPages();
|
|||
|
|
const currentPage = pages[pages.length - 1];
|
|||
|
|
|
|||
|
|
// 检查是否是"发布"按钮(索引2)- 直接跳转到编辑页面
|
|||
|
|
if (index === 2) {
|
|||
|
|
// 切换发布按钮激活状态
|
|||
|
|
this.setData({ cameraActive: !this.data.cameraActive });
|
|||
|
|
// 检查登录状态
|
|||
|
|
const app = getApp();
|
|||
|
|
if (!app.globalData.isLoggedIn) {
|
|||
|
|
wx.navigateTo({
|
|||
|
|
url: '/pages/login/login?from=camera'
|
|||
|
|
});
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
// 已登录时直接跳转到编辑页面
|
|||
|
|
wx.navigateTo({
|
|||
|
|
url: '/subpackages/media/edits/edits',
|
|||
|
|
fail: (err) => {
|
|||
|
|
console.error('跳转编辑页面失败:', err);
|
|||
|
|
wx.showToast({
|
|||
|
|
title: '跳转失败,请重试',
|
|||
|
|
icon: 'none'
|
|||
|
|
});
|
|||
|
|
// 跳转失败时重置激活状态
|
|||
|
|
this.setData({ cameraActive: false });
|
|||
|
|
}
|
|||
|
|
});
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 切换到其他按钮时,取消发布按钮激活状态
|
|||
|
|
if (this.data.cameraActive) {
|
|||
|
|
this.setData({ cameraActive: false });
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 先更新选中状态(其他 tabBar 页面)
|
|||
|
|
this.setData({
|
|||
|
|
selected: index
|
|||
|
|
});
|
|||
|
|
|
|||
|
|
// 检查是否是"发现"按钮(索引0)
|
|||
|
|
if (index === 0) {
|
|||
|
|
// 检查当前是否已经在地图页面
|
|||
|
|
if (currentPage.route === 'pages/map/map') {
|
|||
|
|
// 如果已经在地图页面,直接打开地点收藏栏
|
|||
|
|
currentPage.onOpenLocationFavoriteBar();
|
|||
|
|
} else {
|
|||
|
|
const app = getApp();
|
|||
|
|
// 如果不在地图页面,先跳转到地图页面,然后通过全局变量标记需要打开收藏栏
|
|||
|
|
wx.switchTab({
|
|||
|
|
url,
|
|||
|
|
success: () => {
|
|||
|
|
// 设置全局变量,让地图页面加载后知道需要打开收藏栏
|
|||
|
|
app.globalData.needOpenLocationFavoriteBar = true;
|
|||
|
|
}
|
|||
|
|
});
|
|||
|
|
}
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 检查是否是"圈子"按钮(索引1)
|
|||
|
|
if (index === 1) {
|
|||
|
|
// 检查登录状态
|
|||
|
|
const app = getApp();
|
|||
|
|
if (!app.globalData.isLoggedIn) {
|
|||
|
|
wx.navigateTo({
|
|||
|
|
url: '/pages/login/login?from=circle'
|
|||
|
|
});
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
// 正常跳转到圈子页面
|
|||
|
|
wx.switchTab({
|
|||
|
|
url
|
|||
|
|
});
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 检查是否是"聊天"按钮(索引3)
|
|||
|
|
if (index === 3) {
|
|||
|
|
// 检查登录状态
|
|||
|
|
const app = getApp();
|
|||
|
|
if (!app.globalData.isLoggedIn) {
|
|||
|
|
wx.navigateTo({
|
|||
|
|
url: '/pages/login/login?from=message'
|
|||
|
|
});
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
// 已登录时正常跳转
|
|||
|
|
wx.switchTab({
|
|||
|
|
url
|
|||
|
|
});
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 检查是否是"我的"按钮(索引4)- 跳转到好友列表页面
|
|||
|
|
if (index === 4) {
|
|||
|
|
// 检查登录状态
|
|||
|
|
const app = getApp();
|
|||
|
|
if (!app.globalData.isLoggedIn) {
|
|||
|
|
wx.navigateTo({
|
|||
|
|
url: '/pages/login/login?from=friends'
|
|||
|
|
});
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
// 已登录时跳转到好友列表页面(使用 switchTab,因为它在 tabBar 中)
|
|||
|
|
wx.switchTab({
|
|||
|
|
url: '/pages/social/friends/friends'
|
|||
|
|
});
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 其他按钮正常跳转
|
|||
|
|
wx.switchTab({
|
|||
|
|
url
|
|||
|
|
});
|
|||
|
|
},
|
|||
|
|
|
|||
|
|
// 显示拍照弹窗
|
|||
|
|
showCameraActionSheet() {
|
|||
|
|
this.setData({ showCameraAction: true });
|
|||
|
|
},
|
|||
|
|
|
|||
|
|
// 隐藏拍照弹窗
|
|||
|
|
hideCameraActionSheet() {
|
|||
|
|
this.setData({ showCameraAction: false, cameraActive: false });
|
|||
|
|
},
|
|||
|
|
|
|||
|
|
// 拍照
|
|||
|
|
takePhoto() {
|
|||
|
|
this.hideCameraActionSheet();
|
|||
|
|
wx.navigateTo({
|
|||
|
|
url: '/subpackages/media/camera/camera',
|
|||
|
|
fail: (err) => {
|
|||
|
|
console.error('跳转拍照页面失败:', err);
|
|||
|
|
wx.showToast({
|
|||
|
|
title: '跳转失败,请重试',
|
|||
|
|
icon: 'none'
|
|||
|
|
});
|
|||
|
|
}
|
|||
|
|
});
|
|||
|
|
},
|
|||
|
|
|
|||
|
|
// 从相册选择
|
|||
|
|
chooseImage() {
|
|||
|
|
this.hideCameraActionSheet();
|
|||
|
|
wx.chooseImage({
|
|||
|
|
count: 1,
|
|||
|
|
sizeType: ['original', 'compressed'],
|
|||
|
|
sourceType: ['album'],
|
|||
|
|
success: (res) => {
|
|||
|
|
const tempFilePath = res.tempFilePaths[0];
|
|||
|
|
wx.showLoading({ title: '上传中...', mask: true });
|
|||
|
|
|
|||
|
|
// 上传图片
|
|||
|
|
this.uploadImage(tempFilePath)
|
|||
|
|
.then(imageUrl => {
|
|||
|
|
wx.hideLoading();
|
|||
|
|
if (imageUrl) {
|
|||
|
|
wx.navigateTo({
|
|||
|
|
url: `/subpackages/media/edits/edits?imagePath=${encodeURIComponent(imageUrl)}`,
|
|||
|
|
fail: (err) => {
|
|||
|
|
console.error('跳转编辑页失败:', err);
|
|||
|
|
wx.showToast({
|
|||
|
|
title: '跳转失败,请重试',
|
|||
|
|
icon: 'none'
|
|||
|
|
});
|
|||
|
|
}
|
|||
|
|
});
|
|||
|
|
}
|
|||
|
|
})
|
|||
|
|
.catch(error => {
|
|||
|
|
wx.hideLoading();
|
|||
|
|
console.error('上传失败:', error);
|
|||
|
|
wx.showToast({
|
|||
|
|
title: error.message || '上传失败,请重试',
|
|||
|
|
icon: 'none'
|
|||
|
|
});
|
|||
|
|
});
|
|||
|
|
},
|
|||
|
|
fail: (error) => {
|
|||
|
|
console.error('选择图片失败:', error);
|
|||
|
|
if (error.errMsg && !error.errMsg.includes('cancel')) {
|
|||
|
|
wx.showToast({
|
|||
|
|
title: '选择图片失败',
|
|||
|
|
icon: 'none'
|
|||
|
|
});
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
});
|
|||
|
|
},
|
|||
|
|
|
|||
|
|
// 上传图片
|
|||
|
|
uploadImage(tempFilePath) {
|
|||
|
|
return new Promise((resolve, reject) => {
|
|||
|
|
wx.uploadFile({
|
|||
|
|
url: `${config.api.baseUrl}/api/v1/file/upload`,
|
|||
|
|
filePath: tempFilePath,
|
|||
|
|
name: 'file',
|
|||
|
|
formData: {
|
|||
|
|
file_type: 'image',
|
|||
|
|
usage_type: 'feed'
|
|||
|
|
},
|
|||
|
|
header: {
|
|||
|
|
'Authorization': `Bearer ${apiClient.getToken()}`
|
|||
|
|
},
|
|||
|
|
success: (uploadRes) => {
|
|||
|
|
if (apiClient.is401Error(uploadRes)) {
|
|||
|
|
const app = getApp();
|
|||
|
|
const isLoggedIn = app?.globalData?.isLoggedIn || false;
|
|||
|
|
apiClient.handle401Error(isLoggedIn);
|
|||
|
|
if (isLoggedIn) {
|
|||
|
|
reject(new Error('登录已过期,请重新登录'));
|
|||
|
|
} else {
|
|||
|
|
resolve(null);
|
|||
|
|
}
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
try {
|
|||
|
|
const data = JSON.parse(uploadRes.data);
|
|||
|
|
if (data.code === 0) {
|
|||
|
|
const fileData = data?.data?.data || data?.data || {};
|
|||
|
|
const imageUrl = fileData.file_url || fileData.fileUrl || fileData.url;
|
|||
|
|
if (imageUrl) {
|
|||
|
|
resolve(imageUrl);
|
|||
|
|
} else {
|
|||
|
|
reject(new Error('上传成功但未获取到图片URL'));
|
|||
|
|
}
|
|||
|
|
} else {
|
|||
|
|
reject(new Error(data.message || '上传失败'));
|
|||
|
|
}
|
|||
|
|
} catch (error) {
|
|||
|
|
reject(new Error('响应解析失败'));
|
|||
|
|
}
|
|||
|
|
},
|
|||
|
|
fail: (error) => {
|
|||
|
|
console.error('上传失败:', error);
|
|||
|
|
reject(new Error(error.errMsg || '上传失败'));
|
|||
|
|
}
|
|||
|
|
});
|
|||
|
|
});
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
});
|