feat(event): 添加酒局编辑删除功能并优化状态管理
- 移除 UniAppWebSocket 类实现,使用独立的 websocket 模块 - 添加 UpdateEvent 和 DeleteEvent API 接口 - 在 EventCard 组件中添加发起人管理操作按钮 - 实现酒局状态数字枚举到字符串的映射转换 - 在 circle 页面集成编辑删除事件处理 - 重构 event-create 页面支持编辑模式 - 在 event-detail 页面添加发起人操作区域 - 实现删除确认对话框和页面返回刷新逻辑
This commit is contained in:
@@ -14,7 +14,7 @@
|
||||
<scroll-view class="evt-scroll" scroll-y>
|
||||
<view class="evt-body" v-if="event">
|
||||
<!-- 状态 -->
|
||||
<view class="evt-status" :class="'status-' + event.status">
|
||||
<view class="evt-status" :class="'status-' + statusKey">
|
||||
<text class="evt-status-text">{{ statusLabel }}</text>
|
||||
</view>
|
||||
|
||||
@@ -94,42 +94,47 @@
|
||||
</view>
|
||||
</view>
|
||||
</scroll-view>
|
||||
|
||||
<!-- 底部操作栏 -->
|
||||
<view class="evt-action-bar" v-if="event">
|
||||
<button
|
||||
v-if="(event.status === 'open' || event.status === 'upcoming') && !event.isJoined && !event.isOrganizer"
|
||||
v-if="canJoin && !event.isJoined && !event.isOrganizer"
|
||||
class="evt-btn evt-btn-primary"
|
||||
@click="handleJoin"
|
||||
>
|
||||
报名参加
|
||||
</button>
|
||||
<button
|
||||
v-if="(event.status === 'open' || event.status === 'upcoming') && event.isJoined && !event.isOrganizer"
|
||||
v-if="canJoin && event.isJoined && !event.isOrganizer"
|
||||
class="evt-btn evt-btn-ghost"
|
||||
@click="handleQuit"
|
||||
>
|
||||
取消报名
|
||||
</button>
|
||||
<button
|
||||
v-if="event.status === 'ongoing' && event.isJoined"
|
||||
v-if="statusKey === 'ongoing' && event.isJoined"
|
||||
class="evt-btn evt-btn-primary"
|
||||
@click="handleCheckIn"
|
||||
>
|
||||
到场签到
|
||||
</button>
|
||||
<view v-if="event.status === 'ended'" class="evt-ended-tip">
|
||||
<view v-if="statusKey === 'ended' && !event.isOrganizer" class="evt-ended-tip">
|
||||
<text class="evt-ended-text">酒局已结束</text>
|
||||
</view>
|
||||
<view v-if="event.isOrganizer" class="evt-ended-tip">
|
||||
<text class="evt-ended-text">你是发起人</text>
|
||||
<!-- 发起人:编辑/删除自己的酒局 -->
|
||||
<view v-if="event.isOrganizer" class="evt-org-actions">
|
||||
<button class="evt-btn evt-btn-ghost" @click="goEdit">
|
||||
✏️ 编辑酒局
|
||||
</button>
|
||||
<button class="evt-btn evt-btn-danger" @click="confirmDelete">
|
||||
🗑️ 删除酒局
|
||||
</button>
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import { GetEventDetail, JoinEvent, QuitEvent, CheckInEvent } from '../../common/api'
|
||||
import { GetEventDetail, JoinEvent, QuitEvent, CheckInEvent, DeleteEvent } from '../../common/api'
|
||||
import themeMixin from '../../common/theme-mixin'
|
||||
|
||||
export default {
|
||||
@@ -143,11 +148,20 @@ export default {
|
||||
}
|
||||
},
|
||||
computed: {
|
||||
statusLabel() {
|
||||
/** 后端状态为数字枚举:1=报名中 2=待开始 3=进行中 4=已结束(兼容字符串返回) */
|
||||
statusKey() {
|
||||
if (!this.event) return ''
|
||||
const val = String(this.event.status).toLowerCase()
|
||||
const map = { 1: 'open', 2: 'upcoming', 3: 'ongoing', 4: 'ended' }
|
||||
const raw = this.event.status
|
||||
return map[Number(raw)] || String(raw).toLowerCase()
|
||||
},
|
||||
/** 报名中/待开始阶段可报名或取消 */
|
||||
canJoin() {
|
||||
return this.statusKey === 'open' || this.statusKey === 'upcoming'
|
||||
},
|
||||
statusLabel() {
|
||||
const map = { open: '报名中', upcoming: '待开始', ongoing: '进行中', ended: '已结束' }
|
||||
return map[val] || '报名中'
|
||||
return map[this.statusKey] || '报名中'
|
||||
},
|
||||
eventMarkers() {
|
||||
if (!this.event || !this.event.latitude) return []
|
||||
@@ -165,6 +179,12 @@ export default {
|
||||
this.eventId = options.id || ''
|
||||
this.loadDetail()
|
||||
},
|
||||
onShow() {
|
||||
// 从编辑页返回时刷新详情
|
||||
if (this.eventId && this._hasLoaded) {
|
||||
this.loadDetail()
|
||||
}
|
||||
},
|
||||
methods: {
|
||||
goBack() {
|
||||
uni.navigateBack()
|
||||
@@ -173,10 +193,34 @@ export default {
|
||||
try {
|
||||
const res = await GetEventDetail({ eventId: this.eventId })
|
||||
this.event = res.data
|
||||
this._hasLoaded = true
|
||||
} catch (e) {
|
||||
console.warn('加载酒局详情失败', e)
|
||||
}
|
||||
},
|
||||
/** 发起人编辑酒局(复用发起页的编辑模式) */
|
||||
goEdit() {
|
||||
uni.navigateTo({ url: `/pages/event-create/event-create?id=${this.eventId}` })
|
||||
},
|
||||
/** 发起人删除酒局(二次确认,成功后返回上一页) */
|
||||
confirmDelete() {
|
||||
uni.showModal({
|
||||
title: '删除酒局',
|
||||
content: '确定要删除这场酒局吗?删除后不可恢复',
|
||||
confirmText: '删除',
|
||||
confirmColor: '#FF6B6B',
|
||||
success: async (res) => {
|
||||
if (!res.confirm) return
|
||||
try {
|
||||
await DeleteEvent({ eventId: this.eventId })
|
||||
uni.showToast({ title: '已删除', icon: 'none' })
|
||||
setTimeout(() => uni.navigateBack(), 800)
|
||||
} catch (e) {
|
||||
// httpRequest 已全局弹错误提示
|
||||
}
|
||||
}
|
||||
})
|
||||
},
|
||||
async handleJoin() {
|
||||
try {
|
||||
await JoinEvent({ eventId: this.eventId })
|
||||
@@ -525,4 +569,19 @@ export default {
|
||||
font-size: $fs-base;
|
||||
color: $text-tertiary;
|
||||
}
|
||||
|
||||
.evt-org-actions {
|
||||
display: flex;
|
||||
gap: $sp-md;
|
||||
|
||||
.evt-btn {
|
||||
flex: 1;
|
||||
}
|
||||
}
|
||||
|
||||
.evt-btn-danger {
|
||||
background: rgba(255,107,107,0.1);
|
||||
color: $coral;
|
||||
border: 1rpx solid rgba(255,107,107,0.25);
|
||||
}
|
||||
</style>
|
||||
|
||||
Reference in New Issue
Block a user