增加开启自动候补

This commit is contained in:
筱野
2025-08-18 23:34:24 +08:00
parent 4dea0f7b29
commit 3c91ee0e88
19 changed files with 629 additions and 190 deletions

View File

@@ -10,7 +10,7 @@
}
&__content {
padding-bottom: 40px;
padding-bottom: 94px;
}
@@ -24,7 +24,11 @@
border: 1px solid rgba(0, 0, 0, 0.06);
box-shadow: 0px 4px 36px 0px rgba(0, 0, 0, 0.06);
display: flex;
.ntrp-range{
.rangeWrapper{
border: none!important;
}
}
}
@@ -81,49 +85,6 @@
// 自动降分选择 - 白色块
.auto-degrade-section {
background: white;
border-radius: 16px;
padding: 20px 16px;
margin-bottom: 16px;
.auto-degrade-item {
display: flex;
align-items: center;
justify-content: space-between;
.auto-degrade-content {
display: flex;
align-items: center;
flex: 1;
.auto-degrade-text {
font-size: 16px;
color: #333;
font-weight: 500;
user-select: none;
}
.info-icon {
width: 16px;
height: 16px;
border: 1px solid #999;
border-radius: 50%;
display: flex;
align-items: center;
justify-content: center;
font-size: 12px;
color: #999;
margin-left: 8px;
}
}
.auto-degrade-checkbox {
margin-left: 16px;
}
}
}
// 提交区域
.submit-section {

View File

@@ -4,27 +4,12 @@ import Taro from '@tarojs/taro'
import ActivityTypeSwitch, { type ActivityType } from '../../components/ActivityTypeSwitch'
import PublishForm from './publishForm'
import { publishBallFormSchema } from '../../config/formSchema/publishBallFormSchema';
import { PublishBallFormData } from '../../../types/publishBall';
import './index.scss'
interface FormData {
activityType: ActivityType
title: string
timeRange: TimeRange
fee: string
location: string
gameplay: string
minParticipants: number
maxParticipants: number
ntpLevel: NTRPRange
additionalRequirements: string
autoDegrade: boolean
}
const PublishBall: React.FC = () => {
const [coverImages, setCoverImages] = useState<CoverImage[]>([])
const [showStadiumSelector, setShowStadiumSelector] = useState(false)
const [selectedStadium, setSelectedStadium] = useState<Stadium | null>(null)
const [formData, setFormData] = useState<FormData>({
const [formData, setFormData] = useState<PublishBallFormData>({
activityType: 'individual', // 默认值
title: '',
timeRange: {
@@ -37,15 +22,12 @@ const PublishBall: React.FC = () => {
gameplay: '',
minParticipants: 1,
maxParticipants: 4,
ntpLevel: { min: 2.0, max: 4.0 },
ntpLevel: [2.0, 4.0],
additionalRequirements: '',
autoDegrade: false
})
// 处理封面图片变化
const handleCoverImagesChange = (images: CoverImage[]) => {
setCoverImages(images)
}
// 更新表单数据
const updateFormData = (key: keyof FormData, value: any) => {
@@ -57,35 +39,6 @@ const PublishBall: React.FC = () => {
// 获取人数要求显示文本
const getParticipantsText = () => {
return `最少${formData.minParticipants}人,最多${formData.maxParticipants}`
}
// 处理NTRP范围变化
const handleNTRPChange = (range: NTRPRange) => {
updateFormData('ntpLevel', range)
}
// 处理时间范围变化
const handleTimeRangeChange = (timeRange: TimeRange) => {
updateFormData('timeRange', timeRange)
}
// 处理补充要求变化
const handleAdditionalRequirementsChange = (value: string) => {
updateFormData('additionalRequirements', value)
}
// 处理场馆选择
const handleStadiumSelect = (stadium: Stadium | null) => {
setSelectedStadium(stadium)
if (stadium) {
updateFormData('location', stadium.name)
}
setShowStadiumSelector(false)
}
// 处理活动类型变化
const handleActivityTypeChange = (type: ActivityType) => {
updateFormData('activityType', type)
@@ -104,17 +57,7 @@ const PublishBall: React.FC = () => {
})
return
}
if (coverImages.length === 0) {
Taro.showToast({
title: '请至少上传一张活动封面',
icon: 'none'
})
return
}
// TODO: 实现提交逻辑
console.log('提交数据:', { coverImages, formData })
Taro.showToast({
title: '发布成功',

View File

@@ -2,30 +2,18 @@ import React, { useState } from 'react'
import { View, Text } from '@tarojs/components'
import Taro from '@tarojs/taro'
import { CoverImageUpload, NTRPSlider, TimeSelector, TextareaTag, SelectStadium, ParticipantsControl, TitleInput, FormBasicInfo, FormSwitch } from '../../components'
import { type NTRPRange, type TimeRange, type Stadium, type ActivityType, type CoverImage } from '../../components/index.types'
import { CoverImageUpload, Range, TimeSelector, TextareaTag, SelectStadium, ParticipantsControl, TitleInput, FormBasicInfo, FormSwitch } from '../../components'
import { type Stadium, type CoverImage } from '../../components/index.types'
import { FormFieldConfig, FieldType } from '../../config/formSchema/publishBallFormSchema'
import './index.scss'
import { PublishBallFormData } from '../../../types/publishBall';
interface FormData {
activityType: ActivityType
title: string
timeRange: TimeRange
fee: string
location: string
gameplay: string
minParticipants: number
maxParticipants: number
ntpLevel: NTRPRange
TextareaTag: string
autoDegrade: boolean
}
import './index.scss'
// 组件映射器
const componentMap = {
[FieldType.TEXT]: TitleInput,
[FieldType.TIMEINTERVAL]: TimeSelector,
[FieldType.RANGE]: NTRPSlider,
[FieldType.RANGE]: Range,
[FieldType.TEXTAREATAG]: TextareaTag,
[FieldType.NUMBERINTERVAL]: ParticipantsControl,
[FieldType.UPLOADIMAGE]: CoverImageUpload,
@@ -34,8 +22,8 @@ const componentMap = {
}
const PublishForm: React.FC<{
formData: FormData,
onChange: (key: keyof FormData, value: any) => void,
formData: PublishBallFormData,
onChange: (key: keyof PublishBallFormData, value: any) => void,
optionsConfig: FormFieldConfig[] }> = ({ formData, onChange, optionsConfig }) => {
const [coverImages, setCoverImages] = useState<CoverImage[]>([])
const [showStadiumSelector, setShowStadiumSelector] = useState(false)
@@ -53,26 +41,6 @@ const PublishForm: React.FC<{
// 获取人数要求显示文本
const getParticipantsText = () => {
return `最少${formData.minParticipants}人,最多${formData.maxParticipants}`
}
// 处理NTRP范围变化
const handleNTRPChange = (range: NTRPRange) => {
updateFormData('ntpLevel', range)
}
// 处理时间范围变化
const handleTimeRangeChange = (timeRange: TimeRange) => {
updateFormData('timeRange', timeRange)
}
// 处理补充要求变化
const handleAdditionalRequirementsChange = (value: string) => {
updateFormData('additionalRequirements', value)
}
// 处理场馆选择
const handleStadiumSelect = (stadium: Stadium | null) => {
setSelectedStadium(stadium)
@@ -82,10 +50,6 @@ const PublishForm: React.FC<{
setShowStadiumSelector(false)
}
// 处理活动类型变化
const handleActivityTypeChange = (type: ActivityType) => {
updateFormData('activityType', type)
}
@@ -128,7 +92,7 @@ const PublishForm: React.FC<{
...item.props,
...(item.key === 'additionalRequirements' ? { options: item.options } : {})
}
console.log(optionProps, item.label);
console.log(optionProps, item.label, formData[item.key]);
if (item.type === FieldType.UPLOADIMAGE) {
/* 活动封面 */
return <CoverImageUpload
@@ -172,6 +136,7 @@ const PublishForm: React.FC<{
}
<View className='bg-section'>
<Component
label={item.label}
value={formData[item.key]}
onChange={(value) => updateFormData(item.key as keyof FormData, value)}
{...optionProps}