From b14985d8dd98abd8487ba7e075a7f711878530ce Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=9D=B0?= Date: Sun, 24 Aug 2025 23:48:02 +0800 Subject: [PATCH] feat: upload cover not over yet --- src/app.config.ts | 2 +- src/components/UploadCover/index.scss | 127 ++++++++++++++ src/components/UploadCover/index.tsx | 122 ++++++++++++- .../UploadCover/upload-from-wx.scss | 11 ++ src/components/UploadCover/upload-from-wx.tsx | 47 +++++ .../UploadCover/upload-source-popup.scss | 156 +++++++++++++++++ .../UploadCover/upload-source-popup.tsx | 161 ++++++++++++++++++ src/components/index.ts | 20 ++- src/config/images.js | 9 +- src/pages/detail/index.scss | 14 +- src/pages/detail/index.tsx | 13 +- src/pages/publishBall/publishForm.tsx | 24 +-- src/scss/images.scss | 15 +- src/services/detailApi.ts | 41 +++++ src/services/httpService.ts | 23 +-- src/services/publishService.ts | 68 +++++++- src/services/uploadFiles.ts | 75 ++++++++ .../icon-arrow-left.svg | 0 .../icon-logo-go.svg} | 0 src/static/emptyStatus/comment-empty.png | Bin 0 -> 11448 bytes src/static/emptyStatus/comment-failed.png | Bin 0 -> 17514 bytes src/static/emptyStatus/publish-empty.png | Bin 0 -> 13137 bytes src/static/emptyStatus/publish-failed.png | Bin 0 -> 17756 bytes .../publishBall/icon-circle-select-arrow.svg | 3 + .../publishBall/icon-circle-select-ring.svg | 3 + .../publishBall/icon-circle-unselect.svg | 3 + 26 files changed, 881 insertions(+), 56 deletions(-) create mode 100644 src/components/UploadCover/upload-from-wx.scss create mode 100644 src/components/UploadCover/upload-from-wx.tsx create mode 100644 src/components/UploadCover/upload-source-popup.scss create mode 100644 src/components/UploadCover/upload-source-popup.tsx create mode 100644 src/services/detailApi.ts create mode 100644 src/services/uploadFiles.ts rename src/static/{publishBall => detail}/icon-arrow-left.svg (100%) rename src/static/{publishBall/icon-logo-go!.svg => detail/icon-logo-go.svg} (100%) create mode 100644 src/static/emptyStatus/comment-empty.png create mode 100644 src/static/emptyStatus/comment-failed.png create mode 100644 src/static/emptyStatus/publish-empty.png create mode 100644 src/static/emptyStatus/publish-failed.png create mode 100644 src/static/publishBall/icon-circle-select-arrow.svg create mode 100644 src/static/publishBall/icon-circle-select-ring.svg create mode 100644 src/static/publishBall/icon-circle-unselect.svg diff --git a/src/app.config.ts b/src/app.config.ts index 29bdd35..6ea5cc9 100644 --- a/src/app.config.ts +++ b/src/app.config.ts @@ -3,7 +3,7 @@ export default defineAppConfig({ 'pages/login/index/index', 'pages/login/verification/index', 'pages/login/terms/index', - // 'pages/publishBall/index', + 'pages/publishBall/index', // 'pages/mapDisplay/index', // 'pages/list/index', 'pages/index/index', diff --git a/src/components/UploadCover/index.scss b/src/components/UploadCover/index.scss index e69de29..ff76d06 100644 --- a/src/components/UploadCover/index.scss +++ b/src/components/UploadCover/index.scss @@ -0,0 +1,127 @@ +@use '~@/scss/images.scss' as img; +@use '~@/scss/themeColor.scss' as theme; + +.upload-cover-root { + display: flex; + width: 100%; + height: 112px; + margin-bottom: 8px; + position: relative; + align-items: flex-end; + + &.upload-cover-act-center { + justify-content: center; + } + + .upload-cover-act { + display: flex; + width: 108px; + height: 108px; + padding: 16px 12px 10px 12px; + margin-top: 4px; + box-sizing: border-box; + flex-direction: column; + justify-content: center; + align-items: center; + gap: 8px; + border-radius: 20px; + border: 1px dashed rgba(0, 0, 0, 0.12); + background: theme.$page-background-color; + box-shadow: 0 4px 36px 0 rgba(0, 0, 0, 0.06); + z-index: 1; + + .upload-cover-act-icon { + width: 20px; + height: 20px; + } + + .upload-cover-text { + color: var(--Labels-Secondary, var(--Labels-Secondary, rgba(60, 60, 67, 0.60))); + font-feature-settings: 'liga' off, 'clig' off; + font-family: "PingFang SC"; + font-size: 12px; + font-style: normal; + font-weight: 500; + line-height: 20px; /* 166.667% */ + } + } + + .cover-image-list-container { + position: absolute; + left: 114px; + top: 0; + width: calc(100% - 114px); + overflow-x: scroll; + height: 112px; + + &.full { + left: 0; + width: 100%; + } + + .cover-image-list { + width: auto; + height: 112px; + display: flex; + gap: 6px; + justify-content: flex-start; + align-items: flex-end; + flex-wrap: nowrap; + flex-shrink: 0; + flex-grow: 0; + + .cover-image-item { + display: flex; + width: 108px; + height: 108px; + flex-direction: column; + justify-content: center; + align-items: center; + gap: 8px; + border-radius: 20px; + position: relative; + border: 1px solid rgba(0, 0, 0, 0.12); + box-sizing: border-box; + + .cover-image-item-image { + width: 100%; + height: 100%; + aspect-ratio: 1/1; + border-radius: 20px; + } + + .cover-image-item-delete { + position: absolute; + top: -4px; + right: -4px; + width: 16px; + height: 16px; + } + } + } + } +} + +.upload-source-popup-container { + width: 100%; + height: auto; + display: flex; + flex-direction: column; + padding: 26px 0; + box-sizing: border-box; +} + +.upload-source-popup-item { + display: flex; + width: 100%; + height: 56px; + padding: 16px 24px; + box-sizing: border-box; + justify-content: center; + align-items: center; + border-bottom: 1px solid rgba(0, 0, 0, 0.12); + + &:last-child { + border-bottom: none; + } +} \ No newline at end of file diff --git a/src/components/UploadCover/index.tsx b/src/components/UploadCover/index.tsx index 426b037..5698f0a 100644 --- a/src/components/UploadCover/index.tsx +++ b/src/components/UploadCover/index.tsx @@ -1,22 +1,128 @@ -import React, { useState } from 'react' -import { Popup } from "@nutui/nutui-react-taro"; +import React, { useCallback, useState } from 'react' +import { Image, View, Text } from '@tarojs/components' +import img from '../../config/images' +import UploadSourcePopup from './upload-source-popup' +import UploadFromWx from './upload-from-wx' +import { CommonPopup } from '../' import './index.scss' +import { uploadFileResponseData } from '@/services/uploadFiles' -export default function UploadCover(props) { - const { value = [], onChange = () => {} } = props +export type sourceType = 'album' | 'history' | 'preset' + +export type source = sourceType[] + +export type CoverImageValue = { + id: string + url: string + tempFilePath?: string +} + +export interface UploadCoverProps { + value: CoverImageValue[] + onChange: (value: CoverImageValue[] | ((prev: CoverImageValue[]) => CoverImageValue[]) +) => void + source: source + maxCount: number +} + +// const values = [ +// 'http://bimwe.oss-cn-shanghai.aliyuncs.com/front/ball/images/1a35ebbf-2361-44da-b338-7608561d0b31.png', +// 'http://bimwe.oss-cn-shanghai.aliyuncs.com/front/ball/images/cf5a82ba-90af-4138-a1b3-9119adcde9e0.png', +// 'http://bimwe.oss-cn-shanghai.aliyuncs.com/front/ball/images/49d7cdf0-b03c-4a0f-91c6-e7778080cfcd.png' +// ] + +const mergeCoverImages = (value: CoverImageValue[], images: CoverImageValue[]) => { + console.log(value, images, 11111) + // 根据id来更新url, 如果id不存在,则添加到value中 + const newImages = images + const updatedValue = value.map(item => { + const index = images.findIndex(image => image.id === item.id) + if (index !== -1) { + newImages.splice(index, 1) + return { ...item, url: images[index].url } + } + return item + }) + return [...updatedValue, ...newImages] +} + +export default function UploadCover(props: UploadCoverProps) { + const { + value = [], + onChange = () => void 0, + source = ['album', 'history', 'preset'], + maxCount = 9, + } = props const [visible, setVisible] = useState(false) + const onAdd = useCallback((images: CoverImageValue[]) => { + onChange(prev => mergeCoverImages(prev, images)) + setVisible(false) + }, [value]) + + const onWxAdd = useCallback((images: CoverImageValue[], onFileUploaded: Promise<{ id: string, data: uploadFileResponseData }[]>) => { + onAdd(images) + onFileUploaded.then(res => { + console.log(res, 11111) + onAdd(res.map(item => ({ + id: item.id, + url: item.data.file_path, + }))) + }) + }, [onAdd]) + const onDelete = (image: CoverImageValue) => { + onChange(value.filter(item => item.id !== image.id)) + } + return ( <> - setVisible(false)} round - closeable + position="bottom" + hideFooter > -
-
上传封面
+ + { + source.map((item) => { + return ( + + { + item === 'album' ? ( + + ) : ( + + ) + } + + ) + }) + } + + +
+ {value.length < maxCount && ( +
setVisible(true)}> + +
添加活动封面
+
+ )} +
+
+ { + value.map((item) => { + return ( + + + onDelete(item)} /> + + ) + }) + } +
+
); diff --git a/src/components/UploadCover/upload-from-wx.scss b/src/components/UploadCover/upload-from-wx.scss new file mode 100644 index 0000000..195c5b6 --- /dev/null +++ b/src/components/UploadCover/upload-from-wx.scss @@ -0,0 +1,11 @@ +.upload-from-wx-text { + width: 100%; + height: 56px; + padding: 16px 24px; + box-sizing: border-box; + font-size: 14px; + font-style: normal; + font-weight: 500; + line-height: 24px; + text-align: center; +} \ No newline at end of file diff --git a/src/components/UploadCover/upload-from-wx.tsx b/src/components/UploadCover/upload-from-wx.tsx new file mode 100644 index 0000000..05c0351 --- /dev/null +++ b/src/components/UploadCover/upload-from-wx.tsx @@ -0,0 +1,47 @@ +import React from 'react' +import { View, Text } from '@tarojs/components' +import Taro from '@tarojs/taro' +import uploadApi from '@/services/uploadFiles' +import './upload-from-wx.scss' +import { CoverImageValue } from '.' +import { uploadFileResponseData } from '@/services/uploadFiles' + +export interface UploadFromWxProps { + onAdd: (images: CoverImageValue[], onFileUploaded: Promise<{ id: string, data: uploadFileResponseData }[]>) => void + maxCount: number +} + +export default function UploadFromWx(props: UploadFromWxProps) { + const { + onAdd = () => void 0, + maxCount = 9, // calc from parent + } = props + const handleImportFromWx = () => { + Taro.chooseImage({ + count: maxCount, + sizeType: ['original', 'compressed'], + sourceType: ['album', 'camera'], + }).then(async (res) => { + // TODO: compress image + // TODO: cropping image to const size + let count = 0 + const files = res.tempFiles.map(item => ({ + filePath: item.path, + description: 'test', + tags: 'test', + is_public: 1 as unknown as 0 | 1, + id: (Date.now() + count++).toString(), + })) + const onFileUploaded = uploadApi.batchUpload(files) + onAdd(res.tempFiles.map(item => ({ + id: Date.now().toString(), + url: item.path, + })), onFileUploaded) // TODO: add loading state + }) + } + return ( + + 从相册添加 + + ) +} \ No newline at end of file diff --git a/src/components/UploadCover/upload-source-popup.scss b/src/components/UploadCover/upload-source-popup.scss new file mode 100644 index 0000000..999c934 --- /dev/null +++ b/src/components/UploadCover/upload-source-popup.scss @@ -0,0 +1,156 @@ +@use '~@/scss/themeColor.scss' as theme; + +.upload-source-popup-text { + width: 100%; + height: 56px; + padding: 16px 24px; + box-sizing: border-box; + font-size: 14px; + font-style: normal; + font-weight: 500; + line-height: 24px; + text-align: center; +} + +.upload-popup { + width: 100%; + padding: 26px 0; + box-sizing: border-box; + + .upload-popup-title { + display: flex; + padding: 18px 20px 10px 20px; + align-items: center; + align-self: stretch; + font-family: "PingFang SC"; + font-size: 16px; + font-style: normal; + font-weight: 500; + line-height: 24px; /* 150% */ + letter-spacing: -0.23px; + } + + .upload-popup-scroll-view { + max-height: calc(100vh - 260px); + overflow-y: auto; + + .upload-popup-image-list { + width: 100%; + padding: 0 16px; + box-sizing: border-box; + display: grid; + grid-template-columns: repeat(3, 1fr); + gap: 10px 10px; + + .upload-popup-image-item { + aspect-ratio: 1/1; + border-radius: 9px; + border: 1px solid rgba(0, 0, 0, 0.12); + box-sizing: border-box; + background: rgba(0, 0, 0, 0.06); + margin: 0; + position: relative; + + &:not(.selected) { + &.disabled { + opacity: 0.5; + pointer-events: none; + cursor: not-allowed; + } + } + + .upload-popup-image-item-image { + width: 100%; + height: 100%; + border-radius: 9px; + margin: 0; + } + + .upload-popup-image-item-select { + position: absolute; + top: 5px; + right: 5px; + width: 14px; + height: 14px; + color: #fff; + border-radius: 50%; + display: flex; + align-items: center; + justify-content: center; + + &.selected { + background: rgba(0, 0, 0, 0.5); + + .select-image-icon { + width: 7px; + height: 7px; + } + } + } + + .select-image-icon { + width: 14px; + height: 14px; + } + } + } + + .upload-popup-image-list-empty { + width: 100%; + height: 60vh; + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + gap: 20px; + } + + .upload-popup-image-list-empty-image { + width: 80%; + aspect-ratio: 4/3; + height: auto; + } + + .upload-popup-image-list-empty-text { + font-size: 16px; + font-style: normal; + font-weight: 500; + line-height: 24px; /* 150% */ + letter-spacing: -0.23px; + } + } + + .upload-popup-footer { + display: flex; + width: 100%; + height: 62px; + padding: 8px 10px 10px 10px; + box-sizing: border-box; + justify-content: center; + align-items: flex-start; + gap: 8px; + + .upload-popup-footer-cancel, .upload-popup-footer-confirm { + font-feature-settings: 'liga' off, 'clig' off; + font-family: "PingFang SC"; + box-sizing: border-box; + height: 44px; + border-radius: 12px; + border: 1px solid rgba(0, 0, 0, 0.12); + flex: 1; + } + + .upload-popup-footer-cancel { + background: theme.$page-background-color; + } + + .upload-popup-footer-confirm { + background: theme.$primary-color; + color: rgba(255, 255, 255, 0.5); + + &.active { + color: #fff; + } + } + } +} \ No newline at end of file diff --git a/src/components/UploadCover/upload-source-popup.tsx b/src/components/UploadCover/upload-source-popup.tsx new file mode 100644 index 0000000..ccb156f --- /dev/null +++ b/src/components/UploadCover/upload-source-popup.tsx @@ -0,0 +1,161 @@ +import React, { useState, useEffect } from 'react' +import { Image, View, Text, ScrollView, Button } from '@tarojs/components' +import Taro from '@tarojs/taro' +import img from '../../config/images' +import publishService from '../../services/publishService' +import { CommonPopup } from '../' +import emptyStatus from '../../static/emptyStatus/publish-empty.png' + +import './upload-source-popup.scss' + +type SourceType = 'history' | 'preset' + +type ImageItem = { + id: string + url: string + tempFilePath?: string +} + +interface UploadImageProps { + sourceType: SourceType + onAdd: (images: ImageItem[]) => void + maxCount: number +} + +const sourceMap = new Map([ + ['history', '历史图库'], + ['preset', '预设图库'] +]) + +const checkImageSelected = (images: ImageItem[], image: ImageItem) => { + return images.some(item => item.id === image.id) +} + +export default function UploadImage(props: UploadImageProps) { + const { + sourceType = 'history', + onAdd = () => void 0, + maxCount = 9, + } = props + const [visible, setVisible] = useState(false) + const [images, setImages] = useState([]) + const [selectedImages, setSelectedImages] = useState([]) + + const handleImageClick = (image: ImageItem) => { + if (checkImageSelected(selectedImages, image)) { + setSelectedImages(selectedImages.filter(item => item.id !== image.id)) + } else if (!outOfMax) { + setSelectedImages([...selectedImages, image]) + } else { + Taro.showToast({ + title: `最多选择${maxCount}张图片`, + icon: 'none' + }) + } + } + + useEffect(() => { + if (visible) { + publishService.getPictures({ + pageOption: { + page: 1, + pageSize: 100, + }, + seachOption: { + tag: '', + resource_type: 'image', + dateRange: [], + }, + }).then(res => { + if (res.success) { + setImages(res.data.data.rows.map(item => ({ + id: Date.now().toString(), + url: item.thumbnail_url, + }))) + } else { + // TODO: 显示错误信息 + Taro.showToast({ + title: res.message, + icon: 'none' + }) + } + }) + } else { + setSelectedImages([]) + } + }, [visible]) + + const handleConfirm = () => { + if (selectedImages.length > 0) { + onAdd(selectedImages) + setVisible(false) + } else { + Taro.showToast({ + title: '请选择图片', + icon: 'none' + }) + } + } + + const outOfMax = selectedImages.length >= maxCount + + return ( + <> + setVisible(false)} + round + hideFooter + position='bottom' + > + + {sourceMap.get(sourceType)} + {/* TODO: 分页 加载更多 */} + {/* TODO: 图片加载失败 */} + {/* TODO: 图片加载中 */} + + {images.length > 0 ? ( + + {images.map(item => { + const isSelected = checkImageSelected(selectedImages, item) + return ( + handleImageClick(item)}> + + + {isSelected ? ( + + ) : ( + + )} + + + ) + })} + + ) : ( + + + 暂无内容 + + )} + + {images.length > 0 ? ( + + + + + ) : ( + + + + )} + + + setVisible(true)}>{sourceMap.get(sourceType)}选取 + + ); +}; + diff --git a/src/components/index.ts b/src/components/index.ts index cc5f816..6adf6c5 100644 --- a/src/components/index.ts +++ b/src/components/index.ts @@ -9,19 +9,21 @@ import { SelectStadium, StadiumDetail } from './SelectStadium' import TimeSelector from './TimeSelector' import TitleInput from './TitleInput' import CommonPopup from './CommonPopup' +import UploadCover from './UploadCover' -export { - ActivityTypeSwitch, - TextareaTag, +export { + ActivityTypeSwitch, + TextareaTag, FormSwitch, - ImageUpload, + ImageUpload, FormBasicInfo, - Range, - NumberInterval, - SelectStadium, - TimeSelector, + Range, + NumberInterval, + SelectStadium, + TimeSelector, TitleInput, StadiumDetail, - CommonPopup + CommonPopup, + UploadCover } diff --git a/src/config/images.js b/src/config/images.js index 2c7d7b0..7d8921a 100644 --- a/src/config/images.js +++ b/src/config/images.js @@ -8,8 +8,8 @@ export default { ICON_COST: require('@/static/publishBall/icon-cost.svg'), ICON_TIPS: require('@/static/publishBall/icon-tips.svg'), ICON_ARROW_RIGHT: require('@/static/publishBall/icon-arrow-right.svg'), - ICON_ARROW_LEFT: require('@/static/publishBall/icon-arrow-left.svg'), - ICON_LOGO_GO: require('@/static/publishBall/icon-logo-go.svg'), + ICON_ARROW_LEFT: require('@/static/detail/icon-arrow-left.svg'), + ICON_LOGO_GO: require('@/static/detail/icon-logo-go.svg'), ICON_SEARCH: require('@/static/publishBall/icon-search.svg'), ICON_MAP: require('@/static/publishBall/icon-map.svg'), ICON_STADIUM: require('@/static/publishBall/icon-stadium.svg'), @@ -18,5 +18,8 @@ export default { ICON_HEART_CIRCLE: require('@/static/publishBall/icon-heartcircle.png'), ICON_ADD: require('@/static/publishBall/icon-add.svg'), ICON_COPY: require('@/static/publishBall/icon-arrow-right.svg'), - ICON_DELETE: require('@/static/publishBall/icon-delete.svg') + ICON_DELETE: require('@/static/publishBall/icon-delete.svg'), + ICON_CIRCLE_UNSELECT: require('@/static/publishBall/icon-circle-unselect.svg'), + ICON_CIRCLE_SELECT: require('@/static/publishBall/icon-circle-select-ring.svg'), + ICON_CIRCLE_SELECT_ARROW: require('@/static/publishBall/icon-circle-select-arrow.svg'), } \ No newline at end of file diff --git a/src/pages/detail/index.scss b/src/pages/detail/index.scss index ce17fc4..267fa4a 100644 --- a/src/pages/detail/index.scss +++ b/src/pages/detail/index.scss @@ -1,3 +1,5 @@ +@use '~@/scss/images.scss' as img; + .detail-page { width: 100%; height: 100%; @@ -24,6 +26,10 @@ display: flex; align-items: center; + .detail-navigator-back { + border-right: 1px solid #444; + } + .detail-navigator-back, .detail-navigator-icon { height: 20px; width: 50%; @@ -31,7 +37,13 @@ display: flex; justify-content: center; - & > svg { + & > .detail-navigator-back-icon { + width: 20px; + height: 20px; + color: #fff; + } + + & > .detail-navigator-logo-icon { width: 20px; height: 20px; color: #fff; diff --git a/src/pages/detail/index.tsx b/src/pages/detail/index.tsx index 7c94d32..7693a67 100644 --- a/src/pages/detail/index.tsx +++ b/src/pages/detail/index.tsx @@ -9,6 +9,7 @@ import { useUserStats, useUserActions } from '../../store/userStore' +import img from '../../config/images' import { getTextColorOnImage } from '../../utils/processImage' import './index.scss' @@ -66,18 +67,10 @@ function Index() { - - - - + - - - - - - + {/* 我的自定义标题 */} diff --git a/src/pages/publishBall/publishForm.tsx b/src/pages/publishBall/publishForm.tsx index cc7e1cc..eaae5bb 100644 --- a/src/pages/publishBall/publishForm.tsx +++ b/src/pages/publishBall/publishForm.tsx @@ -2,7 +2,7 @@ import React, { useState } from 'react' import { View, Text } from '@tarojs/components' import Taro from '@tarojs/taro' -import { ImageUpload, Range, TimeSelector, TextareaTag, SelectStadium, NumberInterval, TitleInput, FormBasicInfo, FormSwitch } from '../../components' +import { ImageUpload, Range, TimeSelector, TextareaTag, SelectStadium, NumberInterval, TitleInput, FormBasicInfo, FormSwitch, UploadCover } from '../../components' import { type Stadium, type CoverImage } from '../../components/index.types' import { FormFieldConfig, FieldType } from '../../config/formSchema/publishBallFormSchema' import { PublishBallFormData } from '../../../types/publishBall'; @@ -21,17 +21,21 @@ const componentMap = { [FieldType.CHECKBOX]: FormSwitch, } -const PublishForm: React.FC<{ - formData: PublishBallFormData, - onChange: (key: keyof PublishBallFormData, value: any, index?: number) => void, +const PublishForm: React.FC<{ + formData: PublishBallFormData, + onChange: (key: keyof PublishBallFormData, value: any, index?: number) => void, optionsConfig: FormFieldConfig[] }> = ({ formData, onChange, optionsConfig }) => { const [coverImages, setCoverImages] = useState([]) const [showStadiumSelector, setShowStadiumSelector] = useState(false) const [selectedStadium, setSelectedStadium] = useState(null) // 处理封面图片变化 - const handleCoverImagesChange = (images: CoverImage[]) => { - setCoverImages(images) + const handleCoverImagesChange = (fn: (images: CoverImage[]) => CoverImage[]) => { + if (fn instanceof Function) { + setCoverImages(fn(coverImages)) + } else { + setCoverImages(fn) + } } // 更新表单数据 @@ -80,7 +84,7 @@ const PublishForm: React.FC<{ // TODO: 实现提交逻辑 console.log('提交数据:', { coverImages, formData }) - + Taro.showToast({ title: '发布成功', icon: 'success' @@ -102,8 +106,8 @@ const PublishForm: React.FC<{ console.log(optionProps, item.label, formData[item.key]); if (item.type === FieldType.UPLOADIMAGE) { /* 活动封面 */ - return @@ -149,7 +153,7 @@ const PublishForm: React.FC<{ value={formData[item.key]} onChange={(value) => updateFormData(item.key as keyof PublishBallFormData, value)} {...optionProps} - placeholder={item.placeholder} + placeholder={item.placeholder} /> diff --git a/src/scss/images.scss b/src/scss/images.scss index 32d40b4..a863e16 100644 --- a/src/scss/images.scss +++ b/src/scss/images.scss @@ -16,7 +16,20 @@ $-images: ( 'icon-personal': '/publishBall/icon-personal.svg', 'icon-changda': '/publishBall/icon-changda.svg', 'icon-cost': '/publishBall/icon-cost.svg', - 'icon-remove': '/publishBall/icon-remove.svg' + 'icon-remove': '/publishBall/icon-remove.svg', + 'icon-arrow-left': '/detail/icon-arrow-left.svg', + 'icon-logo-go': '/detail/icon-logo-go.svg', + 'icon-search': '/publishBall/icon-search.svg', + 'icon-map': '/publishBall/icon-map.svg', + 'icon-stadium': '/publishBall/icon-stadium.svg', + 'icon-arrow-small': '/publishBall/icon-arrow-small.svg', + 'icon-map-search': '/publishBall/icon-map-search.svg', + 'icon-heartcircle': '/publishBall/icon-heartcircle.png', + 'icon-copy': '/publishBall/icon-arrow-right.svg', + 'icon-delete': '/publishBall/icon-delete.svg', + 'icon-circle-unselect': '/publishBall/icon-circle-unselect.svg', + 'icon-circle-select-ring': '/publishBall/icon-circle-select-ring.svg', + 'icon-circle-select-arrow': '/publishBall/icon-circle-select-arrow.svg', ) !default; // 图片获取函数 diff --git a/src/services/detailApi.ts b/src/services/detailApi.ts new file mode 100644 index 0000000..e971bf0 --- /dev/null +++ b/src/services/detailApi.ts @@ -0,0 +1,41 @@ +import httpService from './httpService' +import type { ApiResponse } from './httpService' + +// 用户接口 +export interface GameDetail { + id: number, + title: string, + venue_id: number, + creator_id: number, + game_date: string, + start_time: string, + end_time: string, + max_participants: number, + current_participants: number, + ntrp_level: string, + play_style: string, + description: string, + status: string, + created_at: string, + updated_at: string, +} + +// 响应接口 +export interface Response { + code: string + message: string + data: GameDetail +} + +// 发布球局类 +class GameDetailService { + // 用户登录 + async getDetail(id: number): Promise> { + return httpService.post('/games/detail', { id }, { + showLoading: true, + }) + } +} + +// 导出认证服务实例 +export default new GameDetailService() \ No newline at end of file diff --git a/src/services/httpService.ts b/src/services/httpService.ts index 9b7a5fd..fcee8f3 100644 --- a/src/services/httpService.ts +++ b/src/services/httpService.ts @@ -15,6 +15,7 @@ export interface RequestConfig { needAuth?: boolean // 是否需要token认证 showLoading?: boolean // 是否显示加载提示 loadingText?: string // 加载提示文本 + showToast?: boolean // 是否显示toast } // 响应数据接口 @@ -58,7 +59,7 @@ class HttpService { // 构建完整URL private buildUrl(url: string, params?: Record): string { const fullUrl = url.startsWith('http') ? url : `${this.baseURL}${url}` - + if (params) { const searchParams = new URLSearchParams() Object.entries(params).forEach(([key, value]) => { @@ -69,7 +70,7 @@ class HttpService { const queryString = searchParams.toString() return queryString ? `${fullUrl}?${queryString}` : fullUrl } - + return fullUrl } @@ -95,7 +96,7 @@ class HttpService { const logMethod = console[level] || console.log const timestamp = new Date().toLocaleTimeString() - + if (data) { logMethod(`[${timestamp}] HTTP ${level.toUpperCase()}: ${message}`, data) } else { @@ -165,9 +166,9 @@ class HttpService { // 处理业务错误 private handleBusinessError(data: any): void { const message = data.message || '操作失败' - + this.log('error', `业务错误: ${message}`, data) - + Taro.showToast({ title: message, icon: 'none', @@ -187,7 +188,7 @@ class HttpService { } = config const fullUrl = this.buildUrl(url, method === 'GET' ? params : undefined) - + this.log('info', `发起请求: ${method} ${fullUrl}`, { data: method !== 'GET' ? data : undefined, params: method === 'GET' ? params : undefined @@ -223,18 +224,18 @@ class HttpService { return this.handleResponse(response) } catch (error) { this.log('error', '请求失败', error) - + // 在模拟模式下返回模拟数据 if (envConfig.enableMock && isDevelopment()) { this.log('info', '使用模拟数据') return this.getMockResponse(url, method) } - + Taro.showToast({ title: '网络连接失败', icon: 'none' }) - + throw error } finally { // 隐藏加载提示 @@ -247,7 +248,7 @@ class HttpService { // 获取模拟数据 private getMockResponse(url: string, method: string): ApiResponse { this.log('info', `返回模拟数据: ${method} ${url}`) - + return { code: 200, success: true, @@ -323,4 +324,4 @@ class HttpService { } // 导出HTTP服务实例 -export default new HttpService() \ No newline at end of file +export default new HttpService() \ No newline at end of file diff --git a/src/services/publishService.ts b/src/services/publishService.ts index 9e73c87..db87e42 100644 --- a/src/services/publishService.ts +++ b/src/services/publishService.ts @@ -16,6 +16,12 @@ export interface PublishBallData { description: string, } +export interface createGameData extends PublishBallData { + status: string, + created_at: string, + updated_at: string, +} + // 响应接口 export interface Response { code: string @@ -23,16 +29,74 @@ export interface Response { data: any } +// export type SourceType = 'history' | 'preset' + +export interface getPicturesReq { + pageOption: { + page: number, + pageSize: number, + }, + seachOption: { + tag: string, + resource_type: string, + dateRange: string[], + }, +} + +export interface getPicturesRes { + code: number, + message: string, + data: { + rows: [ + { + user_id: string, + resource_type: string, + file_name: string, + original_name: string, + file_path: string, + file_url: string, + file_size: number, + mime_type: string, + width: number, + height: number, + duration: number, + thumbnail_url: string, + is_public: string, + tags: string[], + description: string, + view_count: number, + download_count: number, + status: string, + last_modify_time: string, + } + ], + count: number, + page: number, + pageSize: number, + totalPages: number, + } +} + +function delay(ms: number) { + return new Promise(resolve => setTimeout(resolve, ms)) +} // 发布球局类 class PublishService { // 用户登录 - async createPersonal(data: PublishBallData): Promise> { + async createPersonal(data: PublishBallData): Promise> { return httpService.post('/games/create', data, { showLoading: true, loadingText: '发布中...' }) } + + async getPictures(req: getPicturesReq): Promise> { + return httpService.post('/gallery/sys_img_list', req, { + showLoading: true, + showToast: false, + }) + } } // 导出认证服务实例 -export default new PublishService() \ No newline at end of file +export default new PublishService() \ No newline at end of file diff --git a/src/services/uploadFiles.ts b/src/services/uploadFiles.ts new file mode 100644 index 0000000..ba5a2eb --- /dev/null +++ b/src/services/uploadFiles.ts @@ -0,0 +1,75 @@ +import httpService from './httpService' +import type { ApiResponse } from './httpService' +import Taro from '@tarojs/taro' +import envConfig from '@/config/env' + +// 用户接口 +export interface UploadFilesData { + id: string, + filePath: string, + description?: string, + tags?: string, + is_public?: 0 | 1, +} + +// {"code":0,"message":"请求成功!","data":{"tags":["test"],"create_time":"2025-08-24 22:51:03","last_modify_time":"2025-08-24 22:51:03","duration":"0","thumbnail_url":"","view_count":"0","download_count":"0","id":16,"user_id":1,"resource_type":"image","file_name":"front/ball/images/63f56978-ffe9-4397-b897-8aca6f4fdcd8.png","original_name":"QyoUvEsLG6ci57c7e25cca0845dafed3ee1fde07876d.png","file_path":"http://bimwe.oss-cn-shanghai.aliyuncs.com/front/ball/images/63f56978-ffe9-4397-b897-8aca6f4fdcd8.png","file_url":"http://bimwe.oss-cn-shanghai.aliyuncs.com/front/ball/images/63f56978-ffe9-4397-b897-8aca6f4fdcd8.png","file_size":17756,"mime_type":"image/png","description":"test","is_public":"1","status":"active","width":0,"height":0,"uploadInfo":{"success":true,"name":"front/ball/images/63f56978-ffe9-4397-b897-8aca6f4fdcd8.png","path":"http://bimwe.oss-cn-shanghai.aliyuncs.com/front/ball/images/63f56978-ffe9-4397-b897-8aca6f4fdcd8.png","ossPath":"http://bimwe.oss-cn-shanghai.aliyuncs.com/front/ball/images/63f56978-ffe9-4397-b897-8aca6f4fdcd8.png","fileType":"image/png","fileSize":17756,"originalName":"QyoUvEsLG6ci57c7e25cca0845dafed3ee1fde07876d.png","suffix":"png","storagePath":"front/ball/images/63f56978-ffe9-4397-b897-8aca6f4fdcd8.png"}}} + +export interface uploadFileResponse { + code: number, + message: string, + data: uploadFileResponseData, +} + +export interface uploadFileResponseData { + id: number, + user_id: number, + file_name: string, + original_name: string, + file_path: string, + file_url: string, + file_size: number, + resource_type: string, + mime_type: string, + description: string, + tags: string[], + is_public: string, + view_count: number, + download_count: number, + created_at: string, + updated_at: string, +} + +function delay(ms: number) { + return new Promise(resolve => setTimeout(resolve, ms)) +} +// 发布球局类 +class UploadApi { + async upload(req: UploadFilesData): Promise<{ id: string, data: uploadFileResponseData }> { + // return httpService.post('/files/upload', req, { + // showLoading: true, + // }) + const { id, ...rest } = req + return Taro.uploadFile({ + url: `${envConfig.apiBaseURL}/api/gallery/upload`, + filePath: rest.filePath, + name: 'file', + formData: { + description: rest.description, + tags: rest.tags, + is_public: rest.is_public, + } + }).then(res => { + return { + id, + data: JSON.parse(res.data).data, + } + }) + } + + async batchUpload(req: UploadFilesData[]): Promise<{ id: string, data: uploadFileResponseData }[]> { + return Promise.all(req.map(item => this.upload(item))) + } +} + +// 导出认证服务实例 +export default new UploadApi() \ No newline at end of file diff --git a/src/static/publishBall/icon-arrow-left.svg b/src/static/detail/icon-arrow-left.svg similarity index 100% rename from src/static/publishBall/icon-arrow-left.svg rename to src/static/detail/icon-arrow-left.svg diff --git a/src/static/publishBall/icon-logo-go!.svg b/src/static/detail/icon-logo-go.svg similarity index 100% rename from src/static/publishBall/icon-logo-go!.svg rename to src/static/detail/icon-logo-go.svg diff --git a/src/static/emptyStatus/comment-empty.png b/src/static/emptyStatus/comment-empty.png new file mode 100644 index 0000000000000000000000000000000000000000..ebe1e82b55a2c9711be88cc74a7272831256a8a5 GIT binary patch literal 11448 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 ZDf#2V?e34V;>KreYN+X|qLpo5{4eYdy(0hs literal 0 HcmV?d00001 diff --git a/src/static/emptyStatus/comment-failed.png b/src/static/emptyStatus/comment-failed.png new file mode 100644 index 0000000000000000000000000000000000000000..4c6ff523883e909d34b42471525a0af941bb84b8 GIT binary patch literal 17514 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 M6f}_Kau%=tAOE*o1^@s6 literal 0 HcmV?d00001 diff --git a/src/static/emptyStatus/publish-failed.png b/src/static/emptyStatus/publish-failed.png new file mode 100644 index 0000000000000000000000000000000000000000..09b8777c904af9c4871d68e1509046629226a236 GIT binary patch literal 17756 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 + + \ No newline at end of file diff --git a/src/static/publishBall/icon-circle-select-ring.svg b/src/static/publishBall/icon-circle-select-ring.svg new file mode 100644 index 0000000..61d19c5 --- /dev/null +++ b/src/static/publishBall/icon-circle-select-ring.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/src/static/publishBall/icon-circle-unselect.svg b/src/static/publishBall/icon-circle-unselect.svg new file mode 100644 index 0000000..aae86ec --- /dev/null +++ b/src/static/publishBall/icon-circle-unselect.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file