This commit is contained in:
@@ -1,2 +0,0 @@
|
||||
const api=require('../../utils/api');const app=getApp();
|
||||
Page({data:{id:'',activity:null,user:null,joined:false,purpose:'',showPurpose:false,submitting:false},onLoad({id}){this.setData({id,user:app.globalData.user||wx.getStorageSync('user')});app.ensureLogin().then(user=>{this.setData({user});this.load()}).catch(()=>this.load())},onShow(){if(this.data.activity)this.load()},async load(){try{const activity=await api.request(`/api/activities/${this.data.id}`);const mine=activity.participants.find(p=>this.data.user&&p.id===this.data.user.id);this.setData({activity,joined:!!mine,purpose:mine?mine.purpose:''})}catch(e){wx.showToast({title:e.message,icon:'none'})}},preview(e){const urls=this.data.activity.images.map(x=>x.url);wx.previewImage({current:e.currentTarget.dataset.url,urls})},editPurpose(){this.setData({showPurpose:true})},purposeInput(e){this.setData({purpose:e.detail.value})},closePurpose(){this.setData({showPurpose:false})},async savePurpose(){this.setData({submitting:true});try{await api.request(`/api/activities/${this.data.id}/participations/me`,{method:'PUT',data:{purpose:this.data.purpose}});this.setData({showPurpose:false});await this.load();wx.showToast({title:'已加入'})}catch(e){wx.showToast({title:e.message,icon:'none'})}finally{this.setData({submitting:false})}},leave(){wx.showModal({title:'退出活动?',content:'你的参与目的也会被移除',success:async r=>{if(r.confirm){await api.request(`/api/activities/${this.data.id}/participations/me`,{method:'DELETE'});this.load()}}})},openGroup(e){wx.previewImage({urls:[e.currentTarget.dataset.url]})},submitGroup(){wx.chooseMedia({count:1,mediaType:['image'],success:async r=>{wx.showLoading({title:'上传中'});try{const file=await api.upload(r.tempFiles[0].tempFilePath);await api.request(`/api/activities/${this.data.id}/participations/groups`,{method:'POST',data:{name:`${this.data.activity.title}交流群`,qrImageUrl:file.url,note:'用户提交,待管理员核验'}});wx.showToast({title:'已提交审核'})}catch(e){wx.showToast({title:e.message,icon:'none'})}finally{wx.hideLoading()}}})}})
|
||||
@@ -0,0 +1,23 @@
|
||||
import { request, upload } from '../../utils/api'
|
||||
import type { Activity } from '../../types/models'
|
||||
|
||||
const app = getApp<IAppOption>()
|
||||
interface ActivityData { id: string; activity: Activity | null; user: CoffeeChatUser | null; joined: boolean; purpose: string; showPurpose: boolean; submitting: boolean }
|
||||
|
||||
Page<ActivityData, WechatMiniprogram.Page.CustomOption>({
|
||||
data: { id: '', activity: null, user: null, joined: false, purpose: '', showPurpose: false, submitting: false },
|
||||
onLoad({ id }) { this.setData({ id, user: app.globalData.user || wx.getStorageSync('user') }); app.ensureLogin().then((user) => { this.setData({ user }); void this.load() }).catch(() => this.load()) },
|
||||
onShow() { if (this.data.activity) void this.load() },
|
||||
async load() {
|
||||
try { const activity = await request<Activity>(`/api/activities/${this.data.id}`); const mine = activity.participants.find((person) => person.id === this.data.user?.id); this.setData({ activity, joined: Boolean(mine), purpose: mine?.purpose || '' }) }
|
||||
catch (error) { wx.showToast({ title: error instanceof Error ? error.message : '加载失败', icon: 'none' }) }
|
||||
},
|
||||
preview(event: WechatMiniprogram.TouchEvent) { const activity = this.data.activity; if (activity) wx.previewImage({ current: event.currentTarget.dataset.url, urls: activity.images.map((image) => image.url) }) },
|
||||
editPurpose() { this.setData({ showPurpose: true }) },
|
||||
purposeInput(event: WechatMiniprogram.CustomEvent<{ value: string }>) { this.setData({ purpose: event.detail.value }) },
|
||||
closePurpose() { this.setData({ showPurpose: false }) },
|
||||
async savePurpose() { this.setData({ submitting: true }); try { await request(`/api/activities/${this.data.id}/participations/me`, { method: 'PUT', data: { purpose: this.data.purpose } }); this.setData({ showPurpose: false }); await this.load(); wx.showToast({ title: '已加入' }) } catch (error) { wx.showToast({ title: error instanceof Error ? error.message : '提交失败', icon: 'none' }) } finally { this.setData({ submitting: false }) } },
|
||||
leave() { wx.showModal({ title: '退出活动?', content: '你的参与目的也会被移除', success: ({ confirm }) => { if (confirm) void request(`/api/activities/${this.data.id}/participations/me`, { method: 'DELETE' }).then(() => this.load()) } }) },
|
||||
openGroup(event: WechatMiniprogram.TouchEvent) { wx.previewImage({ urls: [event.currentTarget.dataset.url] }) },
|
||||
submitGroup() { wx.chooseMedia({ count: 1, mediaType: ['image'], success: async ({ tempFiles }) => { wx.showLoading({ title: '上传中' }); try { const file = await upload(tempFiles[0].tempFilePath); await request(`/api/activities/${this.data.id}/participations/groups`, { method: 'POST', data: { name: `${this.data.activity?.title || '活动'}交流群`, qrImageUrl: file.url, note: '用户提交,待管理员核验' } }); wx.showToast({ title: '已提交审核' }) } catch (error) { wx.showToast({ title: error instanceof Error ? error.message : '上传失败', icon: 'none' }) } finally { wx.hideLoading() } } }) }
|
||||
})
|
||||
@@ -1,2 +0,0 @@
|
||||
const api = require('../../utils/api')
|
||||
Page({data:{activities:[],exhibitions:[],tags:[],exhibitionIndex:0,selectedTag:'',time:'available',loading:true},onLoad(){this.loadMeta()},onShow(){if(this.data.exhibitions.length)this.loadActivities()},onPullDownRefresh(){this.loadActivities().finally(wx.stopPullDownRefresh)},async loadMeta(){try{const data=await api.request('/api/activities/meta');this.setData({exhibitions:[{id:'',name:'全部会展'}].concat(data.exhibitions),tags:data.tags});await this.loadActivities()}catch(e){this.fail(e)}},async loadActivities(){this.setData({loading:true});const exhibition=this.data.exhibitions[this.data.exhibitionIndex];const qs=[`time=${this.data.time}`];if(exhibition&&exhibition.id)qs.push(`exhibitionId=${exhibition.id}`);if(this.data.selectedTag)qs.push(`tagId=${this.data.selectedTag}`);try{const activities=await api.request(`/api/activities?${qs.join('&')}`);this.setData({activities,loading:false})}catch(e){this.fail(e)}},changeExhibition(e){this.setData({exhibitionIndex:Number(e.detail.value)});this.loadActivities()},selectTag(e){this.setData({selectedTag:this.data.selectedTag===e.currentTarget.dataset.id?'':e.currentTarget.dataset.id});this.loadActivities()},setTime(e){this.setData({time:e.currentTarget.dataset.value});this.loadActivities()},open(e){wx.navigateTo({url:`/pages/activity/index?id=${e.currentTarget.dataset.id}`})},fail(e){this.setData({loading:false});wx.showToast({title:e.message||'加载失败',icon:'none'})}})
|
||||
@@ -0,0 +1,34 @@
|
||||
import { request } from '../../utils/api'
|
||||
import type { Activity, CatalogMeta, Exhibition, Tag } from '../../types/models'
|
||||
|
||||
interface IndexData {
|
||||
activities: Activity[]; exhibitions: Exhibition[]; tags: Tag[]; exhibitionIndex: number
|
||||
selectedTag: string; time: 'upcoming' | 'available'; loading: boolean
|
||||
}
|
||||
|
||||
Page<IndexData, WechatMiniprogram.Page.CustomOption>({
|
||||
data: { activities: [], exhibitions: [], tags: [], exhibitionIndex: 0, selectedTag: '', time: 'available', loading: true },
|
||||
onLoad() { void this.loadMeta() },
|
||||
onShow() { if (this.data.exhibitions.length) void this.loadActivities() },
|
||||
onPullDownRefresh() { void this.loadActivities().finally(() => wx.stopPullDownRefresh()) },
|
||||
async loadMeta() {
|
||||
try {
|
||||
const data = await request<CatalogMeta>('/api/activities/meta')
|
||||
const all = { id: '', name: '全部会展', venue: '', address: '', startsAt: '', endsAt: '', description: '' }
|
||||
this.setData({ exhibitions: [all, ...data.exhibitions], tags: data.tags }); await this.loadActivities()
|
||||
} catch (error) { this.fail(error) }
|
||||
},
|
||||
async loadActivities() {
|
||||
this.setData({ loading: true }); const exhibition = this.data.exhibitions[this.data.exhibitionIndex]
|
||||
const query = [`time=${this.data.time}`]
|
||||
if (exhibition?.id) query.push(`exhibitionId=${encodeURIComponent(exhibition.id)}`)
|
||||
if (this.data.selectedTag) query.push(`tagId=${encodeURIComponent(this.data.selectedTag)}`)
|
||||
try { this.setData({ activities: await request<Activity[]>(`/api/activities?${query.join('&')}`), loading: false }) }
|
||||
catch (error) { this.fail(error) }
|
||||
},
|
||||
changeExhibition(event: WechatMiniprogram.CustomEvent<{ value: string }>) { this.setData({ exhibitionIndex: Number(event.detail.value) }); void this.loadActivities() },
|
||||
selectTag(event: WechatMiniprogram.TouchEvent) { const id = String(event.currentTarget.dataset.id || ''); this.setData({ selectedTag: this.data.selectedTag === id ? '' : id }); void this.loadActivities() },
|
||||
setTime(event: WechatMiniprogram.TouchEvent) { this.setData({ time: event.currentTarget.dataset.value }); void this.loadActivities() },
|
||||
open(event: WechatMiniprogram.TouchEvent) { wx.navigateTo({ url: `/pages/activity/index?id=${event.currentTarget.dataset.id}` }) },
|
||||
fail(error: unknown) { this.setData({ loading: false }); wx.showToast({ title: error instanceof Error ? error.message : '加载失败', icon: 'none' }) }
|
||||
})
|
||||
@@ -1 +0,0 @@
|
||||
Page({retry(){getApp().login().then(()=>wx.switchTab({url:'/pages/index/index'})).catch(e=>wx.showToast({title:e.message,icon:'none'}))}})
|
||||
@@ -0,0 +1 @@
|
||||
Page({ retry() { getApp<IAppOption>().login().then(() => wx.switchTab({ url: '/pages/index/index' })).catch((error: unknown) => wx.showToast({ title: error instanceof Error ? error.message : '登录失败', icon: 'none' })) } })
|
||||
@@ -1 +0,0 @@
|
||||
const api=require('../../utils/api');const app=getApp();Page({data:{user:null,editing:false,nickname:''},onShow(){app.ensureLogin().then(user=>this.setData({user,nickname:user.nickname})).catch(()=>{})},edit(){this.setData({editing:true})},input(e){this.setData({nickname:e.detail.value})},cancel(){this.setData({editing:false})},async save(){try{const user=await api.request('/api/auth/me',{method:'PATCH',data:{nickname:this.data.nickname,avatarUrl:this.data.user.avatarUrl||''}});wx.setStorageSync('user',user);app.globalData.user=user;this.setData({user,editing:false});wx.showToast({title:'已保存'})}catch(e){wx.showToast({title:e.message,icon:'none'})}},chooseAvatar(e){const avatarUrl=e.detail.avatarUrl;this.setData({'user.avatarUrl':avatarUrl});api.upload(avatarUrl).then(file=>this.setData({'user.avatarUrl':file.url}))}})
|
||||
@@ -0,0 +1,12 @@
|
||||
import { request, upload } from '../../utils/api'
|
||||
const app = getApp<IAppOption>()
|
||||
|
||||
Page({
|
||||
data: { user: null as CoffeeChatUser | null, editing: false, nickname: '' },
|
||||
onShow() { app.ensureLogin().then((user) => this.setData({ user, nickname: user.nickname })).catch(() => undefined) },
|
||||
edit() { this.setData({ editing: true }) },
|
||||
input(event: WechatMiniprogram.CustomEvent<{ value: string }>) { this.setData({ nickname: event.detail.value }) },
|
||||
cancel() { this.setData({ editing: false }) },
|
||||
async save() { if (!this.data.user) return; try { const user = await request<CoffeeChatUser>('/api/auth/me', { method: 'PATCH', data: { nickname: this.data.nickname, avatarUrl: this.data.user.avatarUrl || '' } }); wx.setStorageSync('user', user); app.globalData.user = user; this.setData({ user, editing: false }); wx.showToast({ title: '已保存' }) } catch (error) { wx.showToast({ title: error instanceof Error ? error.message : '保存失败', icon: 'none' }) } },
|
||||
chooseAvatar(event: WechatMiniprogram.CustomEvent<{ avatarUrl: string }>) { const avatarUrl = event.detail.avatarUrl; this.setData({ 'user.avatarUrl': avatarUrl }); upload(avatarUrl).then((file) => this.setData({ 'user.avatarUrl': file.url })).catch(() => wx.showToast({ title: '头像上传失败', icon: 'none' })) }
|
||||
})
|
||||
Reference in New Issue
Block a user