feat(circle): 添加酒友圈社交模块
- 新增酒友圈、圈子详情、发布动态、好友列表、活动创建等页面配置 - 添加酒友圈相关API接口,包括动态、评论、好友、活动等功能 - 实现模拟数据用于前端开发和测试 - 创建评论项、空状态、活动卡片、动态卡片、好友项等组件 - 编写酒友圈模块详细的接口文档,定义数据结构和业务规则
This commit is contained in:
+104
@@ -154,3 +154,107 @@ export async function refreshAuthToken() {
|
||||
return false
|
||||
}
|
||||
}
|
||||
|
||||
// ==========================================
|
||||
// 酒友圈 API(当前返回 Mock 数据,后端就绪后切换为 SDK 调用)
|
||||
// ==========================================
|
||||
import { MOCK_FEEDS, MOCK_COMMENTS, MOCK_FRIENDS, MOCK_FRIEND_REQUESTS, MOCK_EVENTS } from './mock-data'
|
||||
|
||||
/** 模拟网络延迟 */
|
||||
function mockDelay(data, ms = 300) {
|
||||
return new Promise(resolve => setTimeout(() => resolve({ data }), ms))
|
||||
}
|
||||
|
||||
/** 获取动态信息流 */
|
||||
export function GetCircleFeeds({ page = 1, pageSize = 10 } = {}) {
|
||||
// TODO: 后端就绪后替换为 client.GetCircleFeeds(...)
|
||||
const start = (page - 1) * pageSize
|
||||
const list = MOCK_FEEDS.slice(start, start + pageSize)
|
||||
return mockDelay({ list, total: MOCK_FEEDS.length, hasMore: start + pageSize < MOCK_FEEDS.length })
|
||||
}
|
||||
|
||||
/** 点赞动态 */
|
||||
export function LikeFeed({ feedId }) {
|
||||
return mockDelay({ success: true })
|
||||
}
|
||||
|
||||
/** 取消点赞 */
|
||||
export function UnlikeFeed({ feedId }) {
|
||||
return mockDelay({ success: true })
|
||||
}
|
||||
|
||||
/** 获取动态评论 */
|
||||
export function GetFeedComments({ feedId }) {
|
||||
const list = MOCK_COMMENTS[feedId] || []
|
||||
return mockDelay({ list })
|
||||
}
|
||||
|
||||
/** 发表评论 */
|
||||
export function AddComment({ feedId, content }) {
|
||||
return mockDelay({ success: true, comment: { id: 'c_' + Date.now(), content, time: '刚刚' } })
|
||||
}
|
||||
|
||||
/** 发布动态 */
|
||||
export function PublishFeed({ text, images, recordId, visibility }) {
|
||||
return mockDelay({ success: true, feedId: 'feed_' + Date.now() })
|
||||
}
|
||||
|
||||
/** 获取酒友列表 */
|
||||
export function GetFriends({ keyword = '' } = {}) {
|
||||
const list = keyword
|
||||
? MOCK_FRIENDS.filter(f => f.nickname.includes(keyword))
|
||||
: MOCK_FRIENDS
|
||||
return mockDelay({ list })
|
||||
}
|
||||
|
||||
/** 获取好友请求 */
|
||||
export function GetFriendRequests() {
|
||||
return mockDelay({ list: MOCK_FRIEND_REQUESTS })
|
||||
}
|
||||
|
||||
/** 发送好友请求 */
|
||||
export function SendFriendRequest({ userId }) {
|
||||
return mockDelay({ success: true })
|
||||
}
|
||||
|
||||
/** 接受好友请求 */
|
||||
export function AcceptFriendRequest({ requestId }) {
|
||||
return mockDelay({ success: true })
|
||||
}
|
||||
|
||||
/** 删除酒友 */
|
||||
export function RemoveFriend({ userId }) {
|
||||
return mockDelay({ success: true })
|
||||
}
|
||||
|
||||
/** 获取酒局列表 */
|
||||
export function GetEvents({ status = '' } = {}) {
|
||||
const list = status ? MOCK_EVENTS.filter(e => e.status === status) : MOCK_EVENTS
|
||||
return mockDelay({ list })
|
||||
}
|
||||
|
||||
/** 获取酒局详情 */
|
||||
export function GetEventDetail({ eventId }) {
|
||||
const evt = MOCK_EVENTS.find(e => e.id === eventId) || MOCK_EVENTS[0]
|
||||
return mockDelay(evt)
|
||||
}
|
||||
|
||||
/** 发起酒局 */
|
||||
export function CreateEvent({ title, time, location, maxPeople, note }) {
|
||||
return mockDelay({ success: true, eventId: 'evt_' + Date.now() })
|
||||
}
|
||||
|
||||
/** 报名酒局 */
|
||||
export function JoinEvent({ eventId }) {
|
||||
return mockDelay({ success: true })
|
||||
}
|
||||
|
||||
/** 取消报名 */
|
||||
export function QuitEvent({ eventId }) {
|
||||
return mockDelay({ success: true })
|
||||
}
|
||||
|
||||
/** 酒局签到 */
|
||||
export function CheckInEvent({ eventId }) {
|
||||
return mockDelay({ success: true })
|
||||
}
|
||||
|
||||
@@ -148,3 +148,184 @@ export function getUserInfo() {
|
||||
}
|
||||
return MOCK_USER
|
||||
}
|
||||
|
||||
// ==========================================
|
||||
// 酒友圈 Mock 数据
|
||||
// ==========================================
|
||||
|
||||
// 模拟酒友列表
|
||||
export const MOCK_FRIENDS = [
|
||||
{ id: 'f001', nickname: '老张', avatar: '', lastDrink: '昨晚喝了飞天茅台', lastDrinkTime: '2小时前', online: true },
|
||||
{ id: 'f002', nickname: '酒仙李白', avatar: '', lastDrink: '青岛啤酒×3', lastDrinkTime: '5小时前', online: true },
|
||||
{ id: 'f003', nickname: '小红', avatar: '', lastDrink: '梅见青梅酒', lastDrinkTime: '昨天', online: false },
|
||||
{ id: 'f004', nickname: '阿伟', avatar: '', lastDrink: '百威经典×2', lastDrinkTime: '昨天', online: false },
|
||||
{ id: 'f005', nickname: '品酒师Tony', avatar: '', lastDrink: '麦卡伦12年', lastDrinkTime: '3天前', online: true },
|
||||
{ id: 'f006', nickname: '醉翁之意', avatar: '', lastDrink: '奔富Bin389', lastDrinkTime: '3天前', online: false }
|
||||
]
|
||||
|
||||
// 模拟好友请求
|
||||
export const MOCK_FRIEND_REQUESTS = [
|
||||
{ id: 'req001', userId: 'u101', nickname: '夜猫子', avatar: '', message: '一起喝过酒,加个好友', time: '1小时前' },
|
||||
{ id: 'req002', userId: 'u102', nickname: '杯中物', avatar: '', message: '酒友圈看到你的动态', time: '3小时前' }
|
||||
]
|
||||
|
||||
// 模拟动态信息流
|
||||
export const MOCK_FEEDS = [
|
||||
{
|
||||
id: 'feed001',
|
||||
userId: 'f001',
|
||||
nickname: '老张',
|
||||
avatar: '',
|
||||
time: '2小时前',
|
||||
text: '今晚和几个老兄弟整了瓶飞天,配重庆火锅,巴适得很!',
|
||||
drinks: [{ category: 'baijiu', name: '飞天茅台53度', amount: '100ml' }],
|
||||
feeling: 'tipsy',
|
||||
images: [],
|
||||
likes: 12,
|
||||
liked: false,
|
||||
comments: 3
|
||||
},
|
||||
{
|
||||
id: 'feed002',
|
||||
userId: 'f002',
|
||||
nickname: '酒仙李白',
|
||||
avatar: '',
|
||||
time: '5小时前',
|
||||
text: '夏天就是要冰啤酒配小龙虾,三瓶百威下肚,人生圆满。',
|
||||
drinks: [{ category: 'beer', name: '百威经典', amount: '3瓶' }],
|
||||
feeling: 'buzzed',
|
||||
images: [],
|
||||
likes: 8,
|
||||
liked: true,
|
||||
comments: 5
|
||||
},
|
||||
{
|
||||
id: 'feed003',
|
||||
userId: 'f003',
|
||||
nickname: '小红',
|
||||
avatar: '',
|
||||
time: '昨天 21:30',
|
||||
text: '第一次尝试青梅酒,酸酸甜甜的,适合女生微醺~',
|
||||
drinks: [{ category: 'fruit', name: '梅见青梅酒', amount: '200ml' }],
|
||||
feeling: 'tipsy',
|
||||
images: [],
|
||||
likes: 15,
|
||||
liked: false,
|
||||
comments: 7
|
||||
},
|
||||
{
|
||||
id: 'feed004',
|
||||
userId: 'f005',
|
||||
nickname: '品酒师Tony',
|
||||
avatar: '',
|
||||
time: '昨天 19:00',
|
||||
text: '麦卡伦12年雪莉桶,闻香有太妃糖和干果的气息,入口丝滑。推荐搭配黑巧克力。',
|
||||
drinks: [{ category: 'whisky', name: '麦卡伦12年', amount: '3 shot' }],
|
||||
feeling: 'tipsy',
|
||||
images: [],
|
||||
likes: 22,
|
||||
liked: false,
|
||||
comments: 4
|
||||
},
|
||||
{
|
||||
id: 'feed005',
|
||||
userId: 'f004',
|
||||
nickname: '阿伟',
|
||||
avatar: '',
|
||||
time: '前天 20:15',
|
||||
text: '公司团建,五粮液配水煮鱼,喝到位了。明天又要搬砖...',
|
||||
drinks: [{ category: 'baijiu', name: '五粮液普五52度', amount: '150ml' }, { category: 'beer', name: '雪花勇闯天涯', amount: '1瓶' }],
|
||||
feeling: 'drunk',
|
||||
images: [],
|
||||
likes: 6,
|
||||
liked: false,
|
||||
comments: 2
|
||||
}
|
||||
]
|
||||
|
||||
// 模拟评论数据
|
||||
export const MOCK_COMMENTS = {
|
||||
feed001: [
|
||||
{ id: 'c001', userId: 'f002', nickname: '酒仙李白', avatar: '', content: '茅台配火锅,土豪啊老张!', time: '1小时前' },
|
||||
{ id: 'c002', userId: 'f003', nickname: '小红', avatar: '', content: '看着就馋了,下次带上我', time: '45分钟前' },
|
||||
{ id: 'c003', userId: 'f005', nickname: '品酒师Tony', avatar: '', content: '飞天53度确实是经典,好酒!', time: '30分钟前' }
|
||||
],
|
||||
feed002: [
|
||||
{ id: 'c004', userId: 'f001', nickname: '老张', avatar: '', content: '夏天标配!', time: '4小时前' },
|
||||
{ id: 'c005', userId: 'f004', nickname: '阿伟', avatar: '', content: '小龙虾哪买的?看着不错', time: '3小时前' }
|
||||
],
|
||||
feed003: [
|
||||
{ id: 'c006', userId: 'f001', nickname: '老张', avatar: '', content: '梅见确实适合入门', time: '昨天' },
|
||||
{ id: 'c007', userId: 'f002', nickname: '酒仙李白', avatar: '', content: '下次试试蜜桃味', time: '昨天' }
|
||||
]
|
||||
}
|
||||
|
||||
// 模拟酒局活动
|
||||
export const MOCK_EVENTS = [
|
||||
{
|
||||
id: 'evt001',
|
||||
title: '周五夜·老地方火锅局',
|
||||
organizer: { id: 'f001', nickname: '老张', avatar: '' },
|
||||
time: '2026-07-25 19:00',
|
||||
location: '渝味晓宇火锅(解放碑店)',
|
||||
maxPeople: 8,
|
||||
joined: 5,
|
||||
participants: [
|
||||
{ id: 'f001', nickname: '老张', avatar: '' },
|
||||
{ id: 'f002', nickname: '酒仙李白', avatar: '' },
|
||||
{ id: 'f003', nickname: '小红', avatar: '' },
|
||||
{ id: 'f004', nickname: '阿伟', avatar: '' },
|
||||
{ id: 'f005', nickname: '品酒师Tony', avatar: '' }
|
||||
],
|
||||
status: 'open',
|
||||
note: '自带酒水,AA制餐费',
|
||||
isJoined: false,
|
||||
isOrganizer: false
|
||||
},
|
||||
{
|
||||
id: 'evt002',
|
||||
title: '威士忌品鉴之夜',
|
||||
organizer: { id: 'f005', nickname: '品酒师Tony', avatar: '' },
|
||||
time: '2026-07-27 20:00',
|
||||
location: 'Malt Bar(国贸店)',
|
||||
maxPeople: 6,
|
||||
joined: 3,
|
||||
participants: [
|
||||
{ id: 'f005', nickname: '品酒师Tony', avatar: '' },
|
||||
{ id: 'f001', nickname: '老张', avatar: '' },
|
||||
{ id: 'f006', nickname: '醉翁之意', avatar: '' }
|
||||
],
|
||||
status: 'open',
|
||||
note: '品鉴3款单一麦芽,费用AA',
|
||||
isJoined: true,
|
||||
isOrganizer: false
|
||||
},
|
||||
{
|
||||
id: 'evt003',
|
||||
title: '啤酒花园烧烤趴',
|
||||
organizer: { id: 'f002', nickname: '酒仙李白', avatar: '' },
|
||||
time: '2026-07-20 18:00',
|
||||
location: '望京啤酒花园',
|
||||
maxPeople: 12,
|
||||
joined: 10,
|
||||
participants: [],
|
||||
status: 'ongoing',
|
||||
note: '畅饮模式,不醉不归',
|
||||
isJoined: false,
|
||||
isOrganizer: false
|
||||
},
|
||||
{
|
||||
id: 'evt004',
|
||||
title: '红酒配牛排·优雅之夜',
|
||||
organizer: { id: 'f003', nickname: '小红', avatar: '' },
|
||||
time: '2026-07-15 19:30',
|
||||
location: 'The Grill(三里屯)',
|
||||
maxPeople: 4,
|
||||
joined: 4,
|
||||
participants: [],
|
||||
status: 'ended',
|
||||
note: '已圆满结束,下次再约',
|
||||
isJoined: false,
|
||||
isOrganizer: false
|
||||
}
|
||||
]
|
||||
|
||||
Reference in New Issue
Block a user