From 81898de75dbf6acbf520c6350572044b59375fff Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=AD=B1=E9=87=8E?= Date: Thu, 18 Sep 2025 22:26:55 +0800 Subject: [PATCH] =?UTF-8?q?=E8=B0=83=E6=95=B4=E5=AD=97=E5=85=B8=E5=8F=8A?= =?UTF-8?q?=E5=8F=91=E5=B8=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/app.ts | 12 +- .../formSchema/publishBallFormSchema.ts | 2 +- src/game_pages/list/index.tsx | 15 +++ .../AiImportPopup/AiImportPopup.tsx | 14 ++- .../FormBasicInfo/FormBasicInfo.tsx | 4 +- .../components/WechatSwitch/WechatSwitch.tsx | 64 +++++++---- src/publish_pages/publishBall/index.tsx | 104 ++++++++++++------ src/publish_pages/publishBall/publishForm.tsx | 2 +- src/services/publishService.ts | 2 +- 9 files changed, 145 insertions(+), 74 deletions(-) diff --git a/src/app.ts b/src/app.ts index c4bcd9a..565dd5f 100644 --- a/src/app.ts +++ b/src/app.ts @@ -2,7 +2,6 @@ import { Component, ReactNode } from "react"; import "./nutui-theme.scss"; import "./app.scss"; import "qweather-icons/font/qweather-icons.css"; -import { useDictionaryStore } from "./store/dictionaryStore"; import { useGlobalStore } from "./store/global"; interface AppProps { @@ -17,7 +16,6 @@ class App extends Component { componentDidMount() { // 初始化字典数据 - this.initDictionaryData(); this.getNavBarHeight(); // this.getLocation() } @@ -26,15 +24,7 @@ class App extends Component { componentDidHide() {} - // 初始化字典数据 - private async initDictionaryData() { - try { - const { fetchDictionary } = useDictionaryStore.getState(); - await fetchDictionary(); - } catch (error) { - console.error("初始化字典数据失败:", error); - } - } + // 获取导航高度 getNavBarHeight = () => { diff --git a/src/config/formSchema/publishBallFormSchema.ts b/src/config/formSchema/publishBallFormSchema.ts index d130a71..7904952 100644 --- a/src/config/formSchema/publishBallFormSchema.ts +++ b/src/config/formSchema/publishBallFormSchema.ts @@ -171,7 +171,7 @@ export const publishBallFormSchema: FormFieldConfig[] = [ } }, { - prop: 'is_wechat_contact', + prop: 'wechat', label: '', type: FieldType.WECHATCONTACT, required: true, diff --git a/src/game_pages/list/index.tsx b/src/game_pages/list/index.tsx index bf7d73e..74c49db 100644 --- a/src/game_pages/list/index.tsx +++ b/src/game_pages/list/index.tsx @@ -12,6 +12,7 @@ import ListContainer from "@/container/listContainer"; import DistanceQuickFilter from "@/components/DistanceQuickFilter"; import { withAuth } from "@/components"; import { updateUserLocation } from "@/services/userService"; +import { useDictionaryStore } from "@/store/dictionaryStore"; const ListPage = () => { @@ -227,6 +228,20 @@ const ListPage = () => { }); }; + // 初始化字典数据 + const initDictionaryData = async () => { + try { + const { fetchDictionary } = useDictionaryStore.getState(); + await fetchDictionary(); + } catch (error) { + console.error("初始化字典数据失败:", error); + } + } + + useEffect(() => { + initDictionaryData() + }, []); + return ( <> {/* 自定义导航 */} diff --git a/src/publish_pages/publishBall/components/AiImportPopup/AiImportPopup.tsx b/src/publish_pages/publishBall/components/AiImportPopup/AiImportPopup.tsx index 9f7c6e0..fcfe444 100644 --- a/src/publish_pages/publishBall/components/AiImportPopup/AiImportPopup.tsx +++ b/src/publish_pages/publishBall/components/AiImportPopup/AiImportPopup.tsx @@ -76,7 +76,7 @@ const AiImportPopup: React.FC = ({ if (Array.isArray(data) && data.length > 0) { setPublishData(data) Taro.navigateTo({ - url: '/publish_pages/publishBall/pages/publishBall?type=ai' + url: '/publish_pages/publishBall/index?type=ai' }) } } @@ -110,11 +110,13 @@ const AiImportPopup: React.FC = ({ } } catch (error) { console.error('选择图片失败:', error) - setUploadFailCount(prev => prev + 1) - Taro.showToast({ - title: '上传失败', - icon: 'error' - }) + if (!(typeof error === 'object' && error.errMsg && error.errMsg.includes('fail cancel'))) { + setUploadFailCount(prev => prev + 1) + Taro.showToast({ + title: '上传失败', + icon: 'error' + }) + } } } diff --git a/src/publish_pages/publishBall/components/FormBasicInfo/FormBasicInfo.tsx b/src/publish_pages/publishBall/components/FormBasicInfo/FormBasicInfo.tsx index 3a2e375..be08e55 100644 --- a/src/publish_pages/publishBall/components/FormBasicInfo/FormBasicInfo.tsx +++ b/src/publish_pages/publishBall/components/FormBasicInfo/FormBasicInfo.tsx @@ -96,8 +96,8 @@ const FormBasicInfo: React.FC = ({ onChange({...value, [key]: ''}); return; } - if (numValue < 0) { - onChange({...value, [key]: '0'}); + if (numValue <= 0) { + onChange({...value, [key]: '1'}); return; } if (numValue > 9999.99) { diff --git a/src/publish_pages/publishBall/components/WechatSwitch/WechatSwitch.tsx b/src/publish_pages/publishBall/components/WechatSwitch/WechatSwitch.tsx index d422422..dae416b 100644 --- a/src/publish_pages/publishBall/components/WechatSwitch/WechatSwitch.tsx +++ b/src/publish_pages/publishBall/components/WechatSwitch/WechatSwitch.tsx @@ -1,50 +1,74 @@ -import React, { useCallback, useState } from 'react' +import React, { useCallback, useState, useEffect } from 'react' import { View, Text, Input } from '@tarojs/components' import { Checkbox } from '@nutui/nutui-react-taro' import styles from './index.module.scss' -interface FormSwitchProps { - value: boolean - onChange: (checked: boolean) => void - subTitle: string - wechatId?: string + +type WechatContactValue = { + is_wechat_contact: boolean + wechat_contact: string + default_wechat_contact: string } -const FormSwitch: React.FC = ({ value, onChange, subTitle, wechatId }) => { +interface FormSwitchProps { + value: WechatContactValue + wechatId: string + onChange: (val: WechatContactValue) => void + subTitle: string +} + +const FormSwitch: React.FC = ({ value, onChange, subTitle }) => { const [editWechat, setEditWechat] = useState(false) const [wechatIdValue, setWechatIdValue] = useState('') - const [wechat, setWechat] = useState(wechatId) + const [defaultWechat, setDefaultWechat] = useState('') + const [isWechatContact, setIsWechatContact] = useState(false) const editWechatId = () => { setEditWechat(true) } const setWechatId = useCallback((e: any) => { - const value = e.target.value - onChange && onChange(value) - setWechatIdValue(value) - }, [onChange]) + const valueStr = e.target.value + onChange && onChange({ is_wechat_contact: isWechatContact, wechat_contact: valueStr, default_wechat_contact: defaultWechat }) + setWechatIdValue(valueStr) + }, [onChange, isWechatContact]) const fillWithPhone = () => { - if (wechat) { - setWechatIdValue(wechat) + if (defaultWechat) { + setWechatIdValue(defaultWechat) } } + const handleChange = (checked: boolean) => { + setIsWechatContact(checked) + onChange({ is_wechat_contact: checked, wechat_contact: wechatIdValue, default_wechat_contact: defaultWechat }) + } + + useEffect(() => { + const { is_wechat_contact, default_wechat_contact } = value || {} as any + if (is_wechat_contact) { + setIsWechatContact(is_wechat_contact) + } + if (default_wechat_contact) { + setDefaultWechat(default_wechat_contact) + } + }, [value]) + + return ( <> handleChange(checked)} /> {subTitle} { - !editWechat && wechatId && ( + !editWechat && ( - 微信号: {wechatId.replace(/(\d{3})(\d{4})(\d{4})/, '$1 $2 $3')} + 微信号: {defaultWechat.replace(/(\d{3})(\d{4})(\d{4})/, '$1 $2 $3')} 修改 ) @@ -55,7 +79,9 @@ const FormSwitch: React.FC = ({ value, onChange, subTitle, wech - 手机号填入:{wechat} + {defaultWechat && ( + 手机号填入:{defaultWechat} + )} ) } diff --git a/src/publish_pages/publishBall/index.tsx b/src/publish_pages/publishBall/index.tsx index 681d9a5..46d51a0 100644 --- a/src/publish_pages/publishBall/index.tsx +++ b/src/publish_pages/publishBall/index.tsx @@ -14,7 +14,7 @@ import images from '@/config/images' import { useUserInfo } from '@/store/userStore' import styles from './index.module.scss' import dayjs from 'dayjs' -import { usePublishBallData, usePublishBallActions } from '@/store/publishBallStore' +import { usePublishBallData } from '@/store/publishBallStore' const defaultFormData: PublishBallFormData = { title: '', @@ -44,8 +44,12 @@ const defaultFormData: PublishBallFormData = { description_tag: [], }, is_substitute_supported: true, - is_wechat_contact: true, - wechat_contact: '' + wechat: { + is_wechat_contact: true, + wechat_contact: '', + default_wechat_contact: '' + } + } const PublishBall: React.FC = () => { @@ -53,7 +57,6 @@ const PublishBall: React.FC = () => { const [isSubmitDisabled, setIsSubmitDisabled] = useState(false) const userInfo = useUserInfo(); const publishAiData = usePublishBallData() - const { clearPublishData } = usePublishBallActions() // 获取页面参数并设置导航标题 const [optionsConfig, setOptionsConfig] = useState(publishBallFormSchema) @@ -251,17 +254,19 @@ const PublishBall: React.FC = () => { if (!isValid) { return } - const { activityInfo, descriptionInfo, timeRange, players, skill_level,image_list, ...rest } = formData[0]; + const { activityInfo, descriptionInfo, timeRange, players, skill_level,image_list,wechat, ...rest } = formData[0]; const options = { ...rest, ...activityInfo, ...descriptionInfo, ...timeRange, max_players: players[1], - current_players: players[0], + min_players: players[0], skill_level_min: skill_level[0], skill_level_max: skill_level[1], - image_list: image_list.map(item => item.url) + image_list: image_list.map(item => item.url), + is_wechat_contact: wechat.is_wechat_contact, + wechat_contact: wechat.wechat_contact || wechat.default_wechat_contact, } const res = await PublishService.createPersonal(options); if (res.code === 0 && res.data) { @@ -274,7 +279,7 @@ const PublishBall: React.FC = () => { // 如果是畅打,则跳转第一个球局详情页,并自动分享 @刘杰 Taro.navigateTo({ // @ts-expect-error: id - url: `/pages/detail/index?id=${(res as any).data?.id || 1}&from=publish&autoShare=1` + url: `/game_pages/detail/index?id=${(res as any).data?.id || 1}&from=publish&autoShare=1` }) } else { Taro.showToast({ @@ -303,7 +308,7 @@ const PublishBall: React.FC = () => { ...descriptionInfo, ...timeRange, max_players: players[1], - current_players: players[0], + min_players: players[0], skill_level_min: skill_level[0], skill_level_max: skill_level[1], image_list: item.image_list.map(img => img.url) @@ -320,7 +325,7 @@ const PublishBall: React.FC = () => { // 如果是畅打,则跳转第一个球局详情页,并自动分享 @刘杰 Taro.navigateTo({ // @ts-expect-error: id - url: `/pages/detail/index?id=${(res as any).data?.[0]?.id || 1}&from=publish&autoShare=1` + url: `/game_pages/detail/index?id=${(res as any).data?.[0]?.id || 1}&from=publish&autoShare=1` }) } else { Taro.showToast({ @@ -330,17 +335,66 @@ const PublishBall: React.FC = () => { } } } + const mergeWithDefault = (data: any): PublishBallFormData => { + const userPhone = (userInfo as any)?.phone || '' + const { start_time, end_time, play_type, price, venue_id, location_name, location, latitude, + longitude, court_type, court_surface, venue_description_tag, venue_description, venue_image_list, + description, description_tag, max_players, min_players, skill_level_max, skill_level_min, + venueDtl + } = data; + let activityInfo = {}; + if (venueDtl) { + const { latitude, longitude } = venueDtl; + activityInfo = { + latitude, + longitude, + } + } + return { + ...defaultFormData, + ...data, + timeRange: { + ...defaultFormData.timeRange, + start_time, + end_time, + }, + activityInfo: { + ...defaultFormData.activityInfo, + ...(play_type ? { play_type } : {}), + ...((price) ? { price } : {}), + ...(venue_id ? { venue_id } : {}), + ...(location_name ? { location_name } : {}), + ...(location ? { location } : {}), + ...(latitude ? { latitude } : {}), + ...(longitude ? { longitude } : {}), + ...(court_type ? { court_type } : {}), + ...(court_surface ? { court_surface } : {}), + ...(venue_description_tag ? { venue_description_tag } : {}), + ...(venue_description ? { venue_description } : {}), + ...(venue_image_list ? { venue_image_list } : {}), + }, + descriptionInfo: { + ...defaultFormData.descriptionInfo, + ...(description ? { description } : {}), + ...(description_tag ? { description_tag } : {}), + }, + ...(skill_level_max && skill_level_min ? { skill_level: [skill_level_min, skill_level_max] } : {}), + ...(max_players && min_players ? { players: [min_players, max_players] } : {}), + wechat: { ...defaultFormData.wechat, default_wechat_contact: userPhone } + } + } const initFormData = () => { const currentInstance = Taro.getCurrentInstance() const params = currentInstance.router?.params + const userPhone = (userInfo as any)?.phone || '' if (params?.type) { const type = params.type as ActivityType if (type === 'individual' || type === 'group') { setActivityType(type) if (type === 'group') { const newFormSchema = publishBallFormSchema.reduce((acc, item) => { - if (item.prop === 'is_wechat_contact') { + if (item.prop === 'wechat') { return acc } if (item.prop === 'image_list') { @@ -365,29 +419,11 @@ const PublishBall: React.FC = () => { Taro.setNavigationBarTitle({ title: '发布' }) - const userPhone = (userInfo as any)?.phone || '' - setFormData([{...defaultFormData, wechat_contact: userPhone }]) + setFormData([{...defaultFormData, wechat: { ...defaultFormData.wechat, default_wechat_contact: userPhone } }]) } } else if (type === 'ai') { // 从 Store 注入 AI 生成的表单 JSON - const mergeWithDefault = (data: PublishBallFormData): PublishBallFormData => { - return { - ...defaultFormData, - ...data, - timeRange: { - ...defaultFormData.timeRange, - ...(data?.timeRange || {}), - }, - activityInfo: { - ...defaultFormData.activityInfo, - ...(data?.activityInfo || {}), - }, - descriptionInfo: { - ...defaultFormData.descriptionInfo, - ...(data?.descriptionInfo || {}), - }, - } - } + if (publishAiData) { if (Array.isArray(publishAiData)) { @@ -399,6 +435,9 @@ const PublishBall: React.FC = () => { } else { setFormData([defaultFormData]) } + Taro.setNavigationBarTitle({ + title: '发布畅打活动' + }) } } } @@ -419,7 +458,6 @@ const PublishBall: React.FC = () => { initFormData() }, []) - console.log(formData, 'formDataformDataformData'); return ( {/* 活动类型切换 */} @@ -497,7 +535,7 @@ const PublishBall: React.FC = () => { activityType === 'individual' && ( 点击确定发布约球,即表示已经同意条款 - Taro.navigateTo({url: '/pages/publishBall/footballRules/index'})}>《约球规则》 + Taro.navigateTo({url: '/publish_pages/publishBall/footballRules/index'})}>《约球规则》 ) } diff --git a/src/publish_pages/publishBall/publishForm.tsx b/src/publish_pages/publishBall/publishForm.tsx index 5c59563..a69f3b9 100644 --- a/src/publish_pages/publishBall/publishForm.tsx +++ b/src/publish_pages/publishBall/publishForm.tsx @@ -174,7 +174,7 @@ const PublishForm: React.FC<{ ...item.props, ...(item.type === FieldType.TEXTAREATAG ? { options: item.options } : {}), ...(item.props?.className ? { className: styles[item.props.className] } : {}), - ...(item.type === FieldType.WECHATCONTACT ? { wechatId: formData.wechat_contact } : {}) + // ...(item.type === FieldType.WECHATCONTACT ? { wechatId: formData.wechat.wechat_contact } : {}) } if (item.type === FieldType.UPLOADIMAGE) { /* 活动封面 */ diff --git a/src/services/publishService.ts b/src/services/publishService.ts index 36731bc..634c9aa 100644 --- a/src/services/publishService.ts +++ b/src/services/publishService.ts @@ -20,7 +20,7 @@ export interface PublishBallData { venue_description?: string // 场地描述 venue_image_list?: string[] // 场地图片 max_players: number // 人数要求 - current_players: number // 人数要求 + min_players: number // 人数要求 skill_level_min: number // 水平要求(NTRP) skill_level_max: number // 水平要求(NTRP) description: string // 备注