增加发布

This commit is contained in:
筱野
2025-08-10 23:02:41 +08:00
parent 86e14cb445
commit 68a6558776
10 changed files with 1661 additions and 0 deletions

View File

@@ -0,0 +1,3 @@
export default definePageConfig({
navigationBarTitleText: '发布个人约球'
})

View File

@@ -0,0 +1,402 @@
.publish-ball-page {
background: #f5f5f5;
min-height: 100vh;
padding-bottom: 200px;
.reminder {
background: #fff8dc;
padding: 16px;
margin: 16px;
border-radius: 8px;
font-size: 14px;
color: #666;
line-height: 1.4;
}
.match-form {
background: #fff;
margin: 16px;
border-radius: 12px;
padding: 20px;
position: relative;
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.05);
.delete-btn {
position: absolute;
top: 15px;
right: 15px;
width: 28px;
height: 28px;
background: #ff4757;
border-radius: 50%;
display: flex;
align-items: center;
justify-content: center;
color: #fff;
font-size: 18px;
font-weight: bold;
}
.section {
margin-bottom: 24px;
.section-title {
font-size: 16px;
font-weight: 600;
color: #333;
margin-bottom: 12px;
display: block;
}
// 封面上传
.cover-upload {
.upload-container {
display: flex;
flex-wrap: wrap;
gap: 8px;
.upload-btn {
width: 80px;
height: 80px;
border: 2px dashed #ddd;
border-radius: 8px;
display: flex;
align-items: center;
justify-content: center;
background: #fafafa;
.plus-icon {
font-size: 24px;
color: #999;
}
}
.image-item {
position: relative;
width: 80px;
height: 80px;
.cover-image {
width: 100%;
height: 100%;
border-radius: 8px;
}
.remove-btn {
position: absolute;
top: -6px;
right: -6px;
width: 20px;
height: 20px;
background: #ff4757;
border-radius: 50%;
display: flex;
align-items: center;
justify-content: center;
color: #fff;
font-size: 14px;
}
}
}
}
// 主题输入
.theme-input {
width: 100%;
height: 44px;
border: 1px solid #e0e0e0;
border-radius: 8px;
padding: 0 16px;
font-size: 14px;
background: #fff;
}
// 时间显示
.time-display {
background: #f8f8f8;
border-radius: 8px;
padding: 16px;
.time-row {
display: flex;
align-items: center;
margin-bottom: 8px;
&:last-child {
margin-bottom: 0;
}
.time-label {
width: 40px;
font-size: 14px;
color: #666;
}
.time-value {
flex: 1;
font-size: 14px;
color: #333;
margin-left: 16px;
&:last-child {
text-align: right;
}
}
}
}
// 场地输入
.venue-input-container {
display: flex;
align-items: center;
border: 1px solid #e0e0e0;
border-radius: 8px;
padding-right: 16px;
.venue-input {
flex: 1;
height: 44px;
padding: 0 16px;
font-size: 14px;
border: none;
}
.arrow {
font-size: 18px;
color: #999;
}
}
// 价格输入
.price-input {
width: 100%;
height: 44px;
border: 1px solid #e0e0e0;
border-radius: 8px;
padding: 0 16px;
font-size: 14px;
background: #fff;
}
// 玩法选择
.play-style-container {
display: flex;
flex-wrap: wrap;
gap: 12px;
.play-style-btn {
padding: 8px 20px;
border: 1px solid #e0e0e0;
border-radius: 20px;
background: #fff;
font-size: 14px;
color: #666;
&.selected {
background: #000;
color: #fff;
border-color: #000;
}
}
}
// 人数控制
.player-count-container {
display: flex;
align-items: center;
justify-content: space-between;
.count-group {
display: flex;
align-items: center;
gap: 8px;
.count-label {
font-size: 14px;
color: #666;
}
.count-controls {
display: flex;
align-items: center;
gap: 8px;
.count-btn {
width: 32px;
height: 32px;
border: 1px solid #ddd;
border-radius: 50%;
display: flex;
align-items: center;
justify-content: center;
background: #fff;
font-size: 18px;
color: #333;
}
.count-number {
font-size: 16px;
color: #333;
min-width: 24px;
text-align: center;
}
}
}
.separator {
font-size: 14px;
color: #666;
}
}
// NTRP滑动条
.ntrp-container {
display: flex;
align-items: center;
gap: 12px;
.ntrp-label {
font-size: 12px;
color: #666;
white-space: nowrap;
}
.slider-container {
flex: 1;
position: relative;
.slider-track {
height: 4px;
background: #e0e0e0;
border-radius: 2px;
position: relative;
.slider-fill {
position: absolute;
height: 100%;
background: #333;
border-radius: 2px;
left: 20%;
right: 20%;
}
.slider-thumb {
position: absolute;
width: 20px;
height: 20px;
background: #333;
border-radius: 50%;
top: -8px;
transform: translateX(-50%);
}
}
}
}
// 性别选择
.requirements-hint {
font-size: 12px;
color: #999;
margin-bottom: 12px;
}
.gender-buttons {
display: flex;
flex-wrap: wrap;
gap: 8px;
.gender-btn {
padding: 8px 16px;
border: 1px solid #e0e0e0;
border-radius: 6px;
background: #fff;
font-size: 14px;
color: #666;
&.selected {
background: #000;
color: #fff;
border-color: #000;
}
}
}
// 自动候补
.standby-container {
display: flex;
align-items: center;
justify-content: space-between;
.checkbox {
width: 20px;
height: 20px;
border: 1px solid #ddd;
border-radius: 3px;
display: flex;
align-items: center;
justify-content: center;
background: #fff;
&.checked {
background: #000;
border-color: #000;
.checkmark {
color: #fff;
font-size: 12px;
}
}
}
}
}
}
// 底部操作区
.bottom-actions {
position: fixed;
bottom: 0;
left: 0;
right: 0;
background: #fff;
padding: 20px 16px 30px;
border-top: 1px solid #e0e0e0;
.add-match-btn {
display: flex;
align-items: center;
justify-content: center;
gap: 8px;
height: 44px;
border: 1px solid #ddd;
border-radius: 8px;
background: #fff;
margin-bottom: 12px;
font-size: 14px;
color: #666;
.plus-icon {
font-size: 20px;
color: #999;
}
}
.complete-btn {
width: 100%;
height: 48px;
background: #000;
color: #fff;
border: none;
border-radius: 8px;
font-size: 16px;
font-weight: 600;
margin-bottom: 12px;
}
.disclaimer {
font-size: 12px;
color: #999;
text-align: center;
line-height: 1.4;
}
}
}

View File

@@ -0,0 +1,62 @@
import React from 'react'
import { View } from '@tarojs/components'
import Taro from '@tarojs/taro'
import DynamicForm from '../../components/DynamicForm/DynamicForm'
import { publishBallFormConfig } from '../../config/formSchema/bulishBallFormSchema'
import './index.scss'
const PublishBallPage: React.FC = () => {
// 提交成功回调
const handleSubmitSuccess = (response: any) => {
console.log('发布成功:', response)
Taro.showModal({
title: '发布成功',
content: response.data.length > 1 ?
`成功发布${response.data.length}场约球活动!` :
'约球活动发布成功!',
showCancel: false,
success: () => {
// 可以跳转到活动列表页面
// Taro.navigateTo({ url: '/pages/matchList/matchList' })
}
})
}
// 提交失败回调
const handleSubmitError = (error: any) => {
console.error('发布失败:', error)
Taro.showModal({
title: '发布失败',
content: error.message || '网络错误,请稍后重试',
showCancel: false
})
}
// 添加表单
const handleAddForm = () => {
console.log('添加新表单')
}
// 删除表单
const handleDeleteForm = (index: number) => {
console.log('删除表单:', index)
}
return (
<View className='publish-ball-page'>
<DynamicForm
config={publishBallFormConfig}
formType='publishBall'
enableApiSubmit={true}
onSubmitSuccess={handleSubmitSuccess}
onSubmitError={handleSubmitError}
onAddForm={handleAddForm}
onDeleteForm={handleDeleteForm}
/>
</View>
)
}
export default PublishBallPage