feat(排行榜): 添加助力榜选项并优化区域显示逻辑
refactor(上传): 添加视频审核回调URL参数 style(PointsCollector): 移除调试日志 fix(ActivitiesCover): 更新默认海报图和样式调整 fix(PosterCheckin): 调整底部按钮固定定位
Showing
7 changed files
with
140 additions
and
73 deletions
| ... | @@ -170,7 +170,7 @@ const generatePointsData = () => { | ... | @@ -170,7 +170,7 @@ const generatePointsData = () => { |
| 170 | do { | 170 | do { |
| 171 | attempts++; | 171 | attempts++; |
| 172 | if (attempts > maxAttempts) { | 172 | if (attempts > maxAttempts) { |
| 173 | - console.warn('无法为项目找到不重叠的位置,使用安全位置:', item); | 173 | + // console.warn('无法为项目找到不重叠的位置,使用安全位置:', item); |
| 174 | // 使用安全的默认位置 | 174 | // 使用安全的默认位置 |
| 175 | x = minX + Math.random() * (maxX - minX); | 175 | x = minX + Math.random() * (maxX - minX); |
| 176 | y = minY + Math.random() * (maxY - minY); | 176 | y = minY + Math.random() * (maxY - minY); | ... | ... |
| ... | @@ -18,16 +18,20 @@ | ... | @@ -18,16 +18,20 @@ |
| 18 | <!-- 滑动指示器 --> | 18 | <!-- 滑动指示器 --> |
| 19 | <view | 19 | <view |
| 20 | class="tab-indicator" | 20 | class="tab-indicator" |
| 21 | - :class="{ 'indicator-shanghai': activeTab === 'shanghai' }" | 21 | + :class="{ |
| 22 | + 'indicator-shanghai': activeTab === 'shanghai', | ||
| 23 | + 'indicator-region': activeTab !== 'shanghai' && activeTab !== 'support', | ||
| 24 | + 'indicator-support': activeTab === 'support' | ||
| 25 | + }" | ||
| 22 | ></view> | 26 | ></view> |
| 23 | <view | 27 | <view |
| 24 | - v-for="region in availableRegions.slice(0, 2)" | 28 | + v-for="region in availableRegions.slice(0, 3)" |
| 25 | :key="region.value" | 29 | :key="region.value" |
| 26 | class="tab-item" | 30 | class="tab-item" |
| 27 | :class="{ active: activeTab === region.value }" | 31 | :class="{ active: activeTab === region.value }" |
| 28 | @click="switchTab(region.value)" | 32 | @click="switchTab(region.value)" |
| 29 | > | 33 | > |
| 30 | - {{ region.text === '上海市' ? '上海榜' : region.text.replace('区', '榜') }} | 34 | + {{ getTabDisplayName(region) }} |
| 31 | </view> | 35 | </view> |
| 32 | </view> | 36 | </view> |
| 33 | 37 | ||
| ... | @@ -154,6 +158,13 @@ const currentDate = ref('') | ... | @@ -154,6 +158,13 @@ const currentDate = ref('') |
| 154 | const switchTab = async (tab) => { | 158 | const switchTab = async (tab) => { |
| 155 | if (activeTab.value === tab) return | 159 | if (activeTab.value === tab) return |
| 156 | 160 | ||
| 161 | + // 助力榜暂时没有数据,显示提示 | ||
| 162 | + if (tab === 'support') { | ||
| 163 | + // TODO: 助力榜功能待开发 | ||
| 164 | + console.log('助力榜功能待开发') | ||
| 165 | + return | ||
| 166 | + } | ||
| 167 | + | ||
| 157 | // 开始切换动画 | 168 | // 开始切换动画 |
| 158 | isContentSwitching.value = true | 169 | isContentSwitching.value = true |
| 159 | 170 | ||
| ... | @@ -224,27 +235,43 @@ const currentRegionName = computed(() => { | ... | @@ -224,27 +235,43 @@ const currentRegionName = computed(() => { |
| 224 | * 计算可用的区域选项 | 235 | * 计算可用的区域选项 |
| 225 | */ | 236 | */ |
| 226 | const availableRegions = computed(() => { | 237 | const availableRegions = computed(() => { |
| 227 | - // 从current_family.county获取区县信息,优先显示用户区域,然后是上海市 | 238 | + // 固定显示:上海榜、地区榜、助力榜 |
| 239 | + const regions = [ | ||
| 240 | + { text: '上海市', value: 'shanghai' }, | ||
| 241 | + { text: '地区', value: 'region' }, | ||
| 242 | + { text: '助力', value: 'support' } | ||
| 243 | + ] | ||
| 244 | + | ||
| 245 | + // 如果有用户区县信息,将地区榜的value设置为用户区县 | ||
| 228 | const currentFamilyCounty = leaderboardData.value?.current_family?.county | 246 | const currentFamilyCounty = leaderboardData.value?.current_family?.county |
| 229 | if (currentFamilyCounty) { | 247 | if (currentFamilyCounty) { |
| 230 | - // 确保county字段为字符串格式进行比较 | ||
| 231 | const userCounty = String(currentFamilyCounty) | 248 | const userCounty = String(currentFamilyCounty) |
| 232 | - // value值需要转成字符串进行比较 | ||
| 233 | const userRegion = shanghaiRegionOptions.value.find(item => item.value === userCounty) | 249 | const userRegion = shanghaiRegionOptions.value.find(item => item.value === userCounty) |
| 234 | if (userRegion) { | 250 | if (userRegion) { |
| 235 | - // 用户区域在第一位,上海市在第二位 | 251 | + regions[1] = { text: userRegion.text, value: userCounty } |
| 236 | - return [userRegion, { text: '上海市', value: 'shanghai' }] | ||
| 237 | } | 252 | } |
| 238 | } | 253 | } |
| 239 | 254 | ||
| 240 | - // 默认显示黄浦区和上海市 | 255 | + return regions |
| 241 | - return [ | ||
| 242 | - { text: '黄浦区', value: '310101' }, | ||
| 243 | - { text: '上海市', value: 'shanghai' } | ||
| 244 | - ] | ||
| 245 | }) | 256 | }) |
| 246 | 257 | ||
| 247 | /** | 258 | /** |
| 259 | + * 获取标签页显示名称 | ||
| 260 | + * @param {object} region - 区域对象 | ||
| 261 | + * @returns {string} 显示名称 | ||
| 262 | + */ | ||
| 263 | +const getTabDisplayName = (region) => { | ||
| 264 | + if (region.value === 'shanghai') { | ||
| 265 | + return '上海榜' | ||
| 266 | + } else if (region.value === 'support') { | ||
| 267 | + return '助力榜' | ||
| 268 | + } else if (region.value === 'region' || region.text.includes('区') || region.text.includes('县')) { | ||
| 269 | + return '地区榜' | ||
| 270 | + } | ||
| 271 | + return region.text | ||
| 272 | +} | ||
| 273 | + | ||
| 274 | +/** | ||
| 248 | * 格式化步数显示 | 275 | * 格式化步数显示 |
| 249 | * @param {number} steps - 步数 | 276 | * @param {number} steps - 步数 |
| 250 | * @returns {string} 格式化后的步数 | 277 | * @returns {string} 格式化后的步数 |
| ... | @@ -379,7 +406,7 @@ defineExpose({ | ... | @@ -379,7 +406,7 @@ defineExpose({ |
| 379 | position: absolute; | 406 | position: absolute; |
| 380 | top: 8rpx; | 407 | top: 8rpx; |
| 381 | left: 8rpx; | 408 | left: 8rpx; |
| 382 | - width: calc(50% - 8rpx); | 409 | + width: calc(33.33% - 8rpx); |
| 383 | height: calc(100% - 16rpx); | 410 | height: calc(100% - 16rpx); |
| 384 | background: rgba(255, 255, 255, 1); | 411 | background: rgba(255, 255, 255, 1); |
| 385 | border-radius: 52rpx; | 412 | border-radius: 52rpx; |
| ... | @@ -388,8 +415,16 @@ defineExpose({ | ... | @@ -388,8 +415,16 @@ defineExpose({ |
| 388 | z-index: 1; | 415 | z-index: 1; |
| 389 | 416 | ||
| 390 | &.indicator-shanghai { | 417 | &.indicator-shanghai { |
| 418 | + transform: translateX(0%); | ||
| 419 | + } | ||
| 420 | + | ||
| 421 | + &.indicator-region { | ||
| 391 | transform: translateX(100%); | 422 | transform: translateX(100%); |
| 392 | } | 423 | } |
| 424 | + | ||
| 425 | + &.indicator-support { | ||
| 426 | + transform: translateX(200%); | ||
| 427 | + } | ||
| 393 | } | 428 | } |
| 394 | 429 | ||
| 395 | .tab-item { | 430 | .tab-item { | ... | ... |
| ... | @@ -11,23 +11,24 @@ | ... | @@ -11,23 +11,24 @@ |
| 11 | top: 0; | 11 | top: 0; |
| 12 | left: 0; | 12 | left: 0; |
| 13 | width: 100vw; | 13 | width: 100vw; |
| 14 | - height: calc(100vh - 300rpx); // 减去底部区域的高度,确保背景图不被遮挡 | 14 | + // height: calc(100vh - 260rpx); // 减去底部区域的高度,确保背景图不被遮挡 |
| 15 | + height: calc(100vh); // 减去底部区域的高度,确保背景图不被遮挡 | ||
| 15 | object-fit: cover; | 16 | object-fit: cover; |
| 16 | object-position: top center; | 17 | object-position: top center; |
| 17 | z-index: 1; | 18 | z-index: 1; |
| 18 | } | 19 | } |
| 19 | 20 | ||
| 20 | // 为容器添加背景色,避免下方空白 | 21 | // 为容器添加背景色,避免下方空白 |
| 21 | -.activities-cover-container::before { | 22 | +// .activities-cover-container::before { |
| 22 | - content: ''; | 23 | +// content: ''; |
| 23 | - position: absolute; | 24 | +// position: absolute; |
| 24 | - top: 0; | 25 | +// top: 0; |
| 25 | - left: 0; | 26 | +// left: 0; |
| 26 | - width: 100%; | 27 | +// width: 100%; |
| 27 | - height: 100%; | 28 | +// height: 100%; |
| 28 | - background: linear-gradient(180deg, #f0f8ff 0%, #e6f3ff 50%, #ddeeff 100%); | 29 | +// background: linear-gradient(180deg, #f0f8ff 0%, #e6f3ff 50%, #ddeeff 100%); |
| 29 | - z-index: 0; | 30 | +// z-index: 0; |
| 30 | -} | 31 | +// } |
| 31 | 32 | ||
| 32 | // 分享按钮包装器 | 33 | // 分享按钮包装器 |
| 33 | .share-button-wrapper { | 34 | .share-button-wrapper { |
| ... | @@ -45,15 +46,15 @@ | ... | @@ -45,15 +46,15 @@ |
| 45 | right: 0; | 46 | right: 0; |
| 46 | padding: 40rpx; | 47 | padding: 40rpx; |
| 47 | padding-bottom: 180rpx; // 为底部导航留出空间 | 48 | padding-bottom: 180rpx; // 为底部导航留出空间 |
| 48 | - background: linear-gradient( | 49 | + // background: linear-gradient( |
| 49 | - transparent 0%, | 50 | + // transparent 0%, |
| 50 | - rgba(0, 0, 0, 0.1) 20%, | 51 | + // rgba(0, 0, 0, 0.1) 20%, |
| 51 | - rgba(0, 0, 0, 0.3) 50%, | 52 | + // rgba(0, 0, 0, 0.3) 50%, |
| 52 | - rgba(0, 0, 0, 0.6) 80%, | 53 | + // rgba(0, 0, 0, 0.6) 80%, |
| 53 | - rgba(0, 0, 0, 0.8) 100% | 54 | + // rgba(0, 0, 0, 0.8) 100% |
| 54 | - ); | 55 | + // ); |
| 55 | - backdrop-filter: blur(30rpx); | 56 | + // backdrop-filter: blur(30rpx); |
| 56 | - -webkit-backdrop-filter: blur(30rpx); | 57 | + // -webkit-backdrop-filter: blur(30rpx); |
| 57 | z-index: 5; | 58 | z-index: 5; |
| 58 | 59 | ||
| 59 | // 增加渐变高度,让过渡更自然 | 60 | // 增加渐变高度,让过渡更自然 | ... | ... |
| 1 | <!-- | 1 | <!-- |
| 2 | * @Date: 2022-09-19 14:11:06 | 2 | * @Date: 2022-09-19 14:11:06 |
| 3 | * @LastEditors: hookehuyr hookehuyr@gmail.com | 3 | * @LastEditors: hookehuyr hookehuyr@gmail.com |
| 4 | - * @LastEditTime: 2025-09-13 09:55:16 | 4 | + * @LastEditTime: 2025-09-15 14:10:11 |
| 5 | * @FilePath: /lls_program/src/pages/ActivitiesCover/index.vue | 5 | * @FilePath: /lls_program/src/pages/ActivitiesCover/index.vue |
| 6 | * @Description: 活动海报页面 - 展示活动信息并处理定位授权 | 6 | * @Description: 活动海报页面 - 展示活动信息并处理定位授权 |
| 7 | --> | 7 | --> |
| ... | @@ -143,7 +143,7 @@ import { handleSharePageAuth, addShareFlag } from '@/utils/authRedirect' | ... | @@ -143,7 +143,7 @@ import { handleSharePageAuth, addShareFlag } from '@/utils/authRedirect' |
| 143 | import { THEME_COLORS } from '@/utils/config'; | 143 | import { THEME_COLORS } from '@/utils/config'; |
| 144 | 144 | ||
| 145 | // 默认海报图 | 145 | // 默认海报图 |
| 146 | -const defaultPoster = 'https://cdn.ipadbiz.cn/lls_prog/images/welcome_3.jpg'; | 146 | +const defaultPoster = 'https://cdn.ipadbiz.cn/lls_prog/images/welcome_5.jpg'; |
| 147 | /** | 147 | /** |
| 148 | * 活动海报页面组件 | 148 | * 活动海报页面组件 |
| 149 | * 功能:展示活动信息、处理定位授权、跳转到活动页面 | 149 | * 功能:展示活动信息、处理定位授权、跳转到活动页面 | ... | ... |
| 1 | <!-- | 1 | <!-- |
| 2 | * @Date: 2025-09-01 13:07:52 | 2 | * @Date: 2025-09-01 13:07:52 |
| 3 | * @LastEditors: hookehuyr hookehuyr@gmail.com | 3 | * @LastEditors: hookehuyr hookehuyr@gmail.com |
| 4 | - * @LastEditTime: 2025-09-11 15:42:29 | 4 | + * @LastEditTime: 2025-09-15 15:10:07 |
| 5 | * @FilePath: /lls_program/src/pages/FamilyRank/index.vue | 5 | * @FilePath: /lls_program/src/pages/FamilyRank/index.vue |
| 6 | * @Description: 文件描述 | 6 | * @Description: 文件描述 |
| 7 | --> | 7 | --> |
| ... | @@ -13,16 +13,20 @@ | ... | @@ -13,16 +13,20 @@ |
| 13 | <!-- 滑动指示器 --> | 13 | <!-- 滑动指示器 --> |
| 14 | <view | 14 | <view |
| 15 | class="tab-indicator" | 15 | class="tab-indicator" |
| 16 | - :class="{ 'indicator-shanghai': activeTab === 'shanghai' }" | 16 | + :class="{ |
| 17 | + 'indicator-shanghai': activeTab === 'shanghai', | ||
| 18 | + 'indicator-region': activeTab !== 'shanghai' && activeTab !== 'support', | ||
| 19 | + 'indicator-support': activeTab === 'support' | ||
| 20 | + }" | ||
| 17 | ></view> | 21 | ></view> |
| 18 | <view | 22 | <view |
| 19 | - v-for="region in availableRegions.slice(0, 2)" | 23 | + v-for="region in availableRegions.slice(0, 3)" |
| 20 | :key="region.value" | 24 | :key="region.value" |
| 21 | class="tab-item" | 25 | class="tab-item" |
| 22 | :class="{ active: activeTab === region.value }" | 26 | :class="{ active: activeTab === region.value }" |
| 23 | @click="switchTab(region.value)" | 27 | @click="switchTab(region.value)" |
| 24 | > | 28 | > |
| 25 | - {{ region.text === '上海市' ? '上海榜' : region.text.replace('区', '榜') }} | 29 | + {{ getTabDisplayName(region) }} |
| 26 | </view> | 30 | </view> |
| 27 | </view> | 31 | </view> |
| 28 | </view> | 32 | </view> |
| ... | @@ -180,6 +184,13 @@ const currentDate = ref('') | ... | @@ -180,6 +184,13 @@ const currentDate = ref('') |
| 180 | const switchTab = async (tab) => { | 184 | const switchTab = async (tab) => { |
| 181 | if (activeTab.value === tab) return | 185 | if (activeTab.value === tab) return |
| 182 | 186 | ||
| 187 | + // 助力榜暂时没有数据,显示提示 | ||
| 188 | + if (tab === 'support') { | ||
| 189 | + // TODO: 助力榜功能待开发 | ||
| 190 | + console.log('助力榜功能待开发') | ||
| 191 | + return | ||
| 192 | + } | ||
| 193 | + | ||
| 183 | // 开始切换动画 | 194 | // 开始切换动画 |
| 184 | isContentSwitching.value = true | 195 | isContentSwitching.value = true |
| 185 | 196 | ||
| ... | @@ -234,18 +245,6 @@ const loadLeaderboardData = async (isInitialLoad = false) => { | ... | @@ -234,18 +245,6 @@ const loadLeaderboardData = async (isInitialLoad = false) => { |
| 234 | if (response.code) { | 245 | if (response.code) { |
| 235 | leaderboardData.value = response.data | 246 | leaderboardData.value = response.data |
| 236 | currentDate.value = response.data.yesterday | 247 | currentDate.value = response.data.yesterday |
| 237 | - | ||
| 238 | - // 只在初始加载时从current_family.county获取区县信息,设置默认tab | ||
| 239 | - if (isInitialLoad && response.data.current_family) { | ||
| 240 | - const currentFamilyCounty = response.data.current_family.county; | ||
| 241 | - if (currentFamilyCounty && String(currentFamilyCounty) !== activeTab.value) { | ||
| 242 | - // 只在county与当前activeTab不同时才设置,确保county字段为字符串格式 | ||
| 243 | - activeTab.value = String(currentFamilyCounty) | ||
| 244 | - // 设置activeTab后需要重新加载数据以获取正确的区县排行榜 | ||
| 245 | - await loadLeaderboardData(false) | ||
| 246 | - return | ||
| 247 | - } | ||
| 248 | - } | ||
| 249 | } | 248 | } |
| 250 | } catch (error) { | 249 | } catch (error) { |
| 251 | console.error('获取排行榜数据失败:', error) | 250 | console.error('获取排行榜数据失败:', error) |
| ... | @@ -269,27 +268,43 @@ const currentRegionName = computed(() => { | ... | @@ -269,27 +268,43 @@ const currentRegionName = computed(() => { |
| 269 | * 计算可用的区域选项 | 268 | * 计算可用的区域选项 |
| 270 | */ | 269 | */ |
| 271 | const availableRegions = computed(() => { | 270 | const availableRegions = computed(() => { |
| 272 | - // 从current_family.county获取区县信息,优先显示用户区域,然后是上海市 | 271 | + // 固定显示:上海榜、地区榜、助力榜 |
| 272 | + const regions = [ | ||
| 273 | + { text: '上海市', value: 'shanghai' }, | ||
| 274 | + { text: '地区', value: 'region' }, | ||
| 275 | + { text: '助力', value: 'support' } | ||
| 276 | + ] | ||
| 277 | + | ||
| 278 | + // 如果有用户区县信息,将地区榜的value设置为用户区县 | ||
| 273 | const currentFamilyCounty = leaderboardData.value?.current_family?.county | 279 | const currentFamilyCounty = leaderboardData.value?.current_family?.county |
| 274 | if (currentFamilyCounty) { | 280 | if (currentFamilyCounty) { |
| 275 | - // 确保county字段为字符串格式进行比较 | ||
| 276 | const userCounty = String(currentFamilyCounty) | 281 | const userCounty = String(currentFamilyCounty) |
| 277 | - // value值需要转成字符串进行比较 | ||
| 278 | const userRegion = shanghaiRegionOptions.value.find(item => item.value === userCounty) | 282 | const userRegion = shanghaiRegionOptions.value.find(item => item.value === userCounty) |
| 279 | if (userRegion) { | 283 | if (userRegion) { |
| 280 | - // 用户区域在第一位,上海市在第二位 | 284 | + regions[1] = { text: userRegion.text, value: userCounty } |
| 281 | - return [userRegion, { text: '上海市', value: 'shanghai' }] | ||
| 282 | } | 285 | } |
| 283 | } | 286 | } |
| 284 | 287 | ||
| 285 | - // 默认显示黄浦区和上海市 | 288 | + return regions |
| 286 | - return [ | ||
| 287 | - { text: '黄浦区', value: '310101' }, | ||
| 288 | - { text: '上海市', value: 'shanghai' } | ||
| 289 | - ] | ||
| 290 | }) | 289 | }) |
| 291 | 290 | ||
| 292 | /** | 291 | /** |
| 292 | + * 获取标签页显示名称 | ||
| 293 | + * @param {object} region - 区域对象 | ||
| 294 | + * @returns {string} 显示名称 | ||
| 295 | + */ | ||
| 296 | +const getTabDisplayName = (region) => { | ||
| 297 | + if (region.value === 'shanghai') { | ||
| 298 | + return '上海榜' | ||
| 299 | + } else if (region.value === 'support') { | ||
| 300 | + return '助力榜' | ||
| 301 | + } else { | ||
| 302 | + // 直接显示区域名称,如"黄浦区"、"杨浦区"等 | ||
| 303 | + return region.text | ||
| 304 | + } | ||
| 305 | +} | ||
| 306 | + | ||
| 307 | +/** | ||
| 293 | * 计算前三名数据 | 308 | * 计算前三名数据 |
| 294 | */ | 309 | */ |
| 295 | const topThreeData = computed(() => { | 310 | const topThreeData = computed(() => { |
| ... | @@ -338,7 +353,9 @@ const myRankInfo = computed(() => { | ... | @@ -338,7 +353,9 @@ const myRankInfo = computed(() => { |
| 338 | * 页面初始化 | 353 | * 页面初始化 |
| 339 | */ | 354 | */ |
| 340 | onMounted(async () => { | 355 | onMounted(async () => { |
| 341 | - // 直接加载排行榜数据,使用current_county参数获取当前家庭所在区县信息 | 356 | + // 默认选中上海榜 |
| 357 | + activeTab.value = 'shanghai' | ||
| 358 | + // 加载排行榜数据 | ||
| 342 | await loadLeaderboardData(true) | 359 | await loadLeaderboardData(true) |
| 343 | }) | 360 | }) |
| 344 | </script> | 361 | </script> |
| ... | @@ -366,7 +383,7 @@ onMounted(async () => { | ... | @@ -366,7 +383,7 @@ onMounted(async () => { |
| 366 | position: absolute; | 383 | position: absolute; |
| 367 | top: 8rpx; | 384 | top: 8rpx; |
| 368 | left: 8rpx; | 385 | left: 8rpx; |
| 369 | - width: calc(50% - 8rpx); | 386 | + width: calc(33.33% - 8rpx); |
| 370 | height: calc(100% - 16rpx); | 387 | height: calc(100% - 16rpx); |
| 371 | background: rgba(255, 255, 255, 1); | 388 | background: rgba(255, 255, 255, 1); |
| 372 | border-radius: 52rpx; | 389 | border-radius: 52rpx; |
| ... | @@ -375,8 +392,16 @@ onMounted(async () => { | ... | @@ -375,8 +392,16 @@ onMounted(async () => { |
| 375 | z-index: 1; | 392 | z-index: 1; |
| 376 | 393 | ||
| 377 | &.indicator-shanghai { | 394 | &.indicator-shanghai { |
| 395 | + transform: translateX(0%); | ||
| 396 | + } | ||
| 397 | + | ||
| 398 | + &.indicator-region { | ||
| 378 | transform: translateX(100%); | 399 | transform: translateX(100%); |
| 379 | } | 400 | } |
| 401 | + | ||
| 402 | + &.indicator-support { | ||
| 403 | + transform: translateX(200%); | ||
| 404 | + } | ||
| 380 | } | 405 | } |
| 381 | 406 | ||
| 382 | .tab-item { | 407 | .tab-item { | ... | ... |
| ... | @@ -28,7 +28,7 @@ | ... | @@ -28,7 +28,7 @@ |
| 28 | </view> | 28 | </view> |
| 29 | 29 | ||
| 30 | <!-- 海报预览区域 - 正常状态 --> | 30 | <!-- 海报预览区域 - 正常状态 --> |
| 31 | - <view v-if="pageState === 'normal'" class="flex-1 mx-4 mb-2 bg-white rounded-lg relative" style="overflow: visible;"> | 31 | + <view v-if="pageState === 'normal'" class="flex-1 mx-4 relative" style="overflow: visible; padding-bottom: 100rpx;"> |
| 32 | <view class="h-full relative flex items-center justify-center"> | 32 | <view class="h-full relative flex items-center justify-center"> |
| 33 | <view v-if="currentPoster.path" class="w-full h-full relative"> | 33 | <view v-if="currentPoster.path" class="w-full h-full relative"> |
| 34 | <image | 34 | <image |
| ... | @@ -79,7 +79,7 @@ | ... | @@ -79,7 +79,7 @@ |
| 79 | </view> | 79 | </view> |
| 80 | 80 | ||
| 81 | <!-- 底部操作按钮 - 仅在正常状态显示 --> | 81 | <!-- 底部操作按钮 - 仅在正常状态显示 --> |
| 82 | - <view v-if="pageState === 'normal'" class="bg-white border-t border-gray-200 p-4 safe-area-bottom"> | 82 | + <view v-if="pageState === 'normal'" class="bg-white border-t border-gray-200 p-4 safe-area-bottom" style="position: fixed; bottom: 0; left: 0; right: 0;"> |
| 83 | <view class="flex gap-4"> | 83 | <view class="flex gap-4"> |
| 84 | <view | 84 | <view |
| 85 | class="flex-1 bg-gradient-to-r from-orange-400 to-orange-500 text-white py-3 px-6 rounded-lg font-medium shadow-lg active:scale-95 transition-transform duration-150 flex items-center justify-center gap-2" | 85 | class="flex-1 bg-gradient-to-r from-orange-400 to-orange-500 text-white py-3 px-6 rounded-lg font-medium shadow-lg active:scale-95 transition-transform duration-150 flex items-center justify-center gap-2" | ... | ... |
| ... | @@ -151,6 +151,7 @@ import { savePhotoAPI } from '@/api/photo'; | ... | @@ -151,6 +151,7 @@ import { savePhotoAPI } from '@/api/photo'; |
| 151 | 151 | ||
| 152 | // | 152 | // |
| 153 | const playIcon = 'https://cdn.ipadbiz.cn/lls_prog/icon/play.svg'; | 153 | const playIcon = 'https://cdn.ipadbiz.cn/lls_prog/icon/play.svg'; |
| 154 | +const callbackUrl = BASE_URL + '/srv/?f=walk&a=media&t=qiniu_audit_notify' | ||
| 154 | 155 | ||
| 155 | // 响应式数据 | 156 | // 响应式数据 |
| 156 | const uploadedFile = ref(null); | 157 | const uploadedFile = ref(null); |
| ... | @@ -215,7 +216,7 @@ const chooseMedia = () => { | ... | @@ -215,7 +216,7 @@ const chooseMedia = () => { |
| 215 | 216 | ||
| 216 | try { | 217 | try { |
| 217 | // 立即上传文件到服务器 | 218 | // 立即上传文件到服务器 |
| 218 | - const serverUrl = await uploadFileToServer(file.tempFilePath); | 219 | + const serverUrl = await uploadFileToServer(file.tempFilePath, file.fileType); |
| 219 | 220 | ||
| 220 | // 根据文件类型设置不同的信息,包含服务器URL | 221 | // 根据文件类型设置不同的信息,包含服务器URL |
| 221 | if (file.fileType === 'image') { | 222 | if (file.fileType === 'image') { |
| ... | @@ -236,7 +237,7 @@ const chooseMedia = () => { | ... | @@ -236,7 +237,7 @@ const chooseMedia = () => { |
| 236 | thumbnail: file.thumbTempFilePath, | 237 | thumbnail: file.thumbTempFilePath, |
| 237 | duration: Math.floor(file.duration), | 238 | duration: Math.floor(file.duration), |
| 238 | size: file.size, | 239 | size: file.size, |
| 239 | - name: `video_${Date.now()}.mp4` | 240 | + name: `video_${Date.now()}.mp4`, |
| 240 | }; | 241 | }; |
| 241 | } | 242 | } |
| 242 | 243 | ||
| ... | @@ -379,10 +380,15 @@ const formatDuration = (seconds) => { | ... | @@ -379,10 +380,15 @@ const formatDuration = (seconds) => { |
| 379 | * 上传文件到服务器 | 380 | * 上传文件到服务器 |
| 380 | * @param {string} filePath - 文件路径 | 381 | * @param {string} filePath - 文件路径 |
| 381 | */ | 382 | */ |
| 382 | -const uploadFileToServer = (filePath) => { | 383 | +const uploadFileToServer = (filePath, fileType) => { |
| 383 | return new Promise((resolve, reject) => { | 384 | return new Promise((resolve, reject) => { |
| 385 | + // 视频上传需要判断回调 | ||
| 386 | + let video_params = '' | ||
| 387 | + if (fileType === 'video') { | ||
| 388 | + video_params = '&callback_rul=' + encodeURIComponent(callbackUrl) | ||
| 389 | + } | ||
| 384 | Taro.uploadFile({ | 390 | Taro.uploadFile({ |
| 385 | - url: BASE_URL + '/admin/?m=srv&a=upload&image_audit=1', | 391 | + url: BASE_URL + '/admin/?m=srv&a=upload&image_audit=1' + video_params, |
| 386 | filePath, | 392 | filePath, |
| 387 | name: 'file', | 393 | name: 'file', |
| 388 | header: { | 394 | header: { |
| ... | @@ -392,7 +398,7 @@ const uploadFileToServer = (filePath) => { | ... | @@ -392,7 +398,7 @@ const uploadFileToServer = (filePath) => { |
| 392 | try { | 398 | try { |
| 393 | const upload_data = JSON.parse(res.data); | 399 | const upload_data = JSON.parse(res.data); |
| 394 | if (upload_data.code === 0 && upload_data.data) { | 400 | if (upload_data.code === 0 && upload_data.data) { |
| 395 | - resolve({ src: upload_data.data.src, qiniu_audit: upload_data.data.audit_result }); | 401 | + resolve({ src: upload_data.data.src, qiniu_audit: upload_data.data.audit_result}); |
| 396 | } else { | 402 | } else { |
| 397 | reject(new Error(upload_data.msg || '服务器错误')); | 403 | reject(new Error(upload_data.msg || '服务器错误')); |
| 398 | } | 404 | } |
| ... | @@ -441,7 +447,7 @@ const saveMedia = async () => { | ... | @@ -441,7 +447,7 @@ const saveMedia = async () => { |
| 441 | media_url: uploadedFile.value.serverUrl, | 447 | media_url: uploadedFile.value.serverUrl, |
| 442 | source_type: pageParams.value.from === 'checkin' ? 'CHECK_IN' : 'COMPANION', | 448 | source_type: pageParams.value.from === 'checkin' ? 'CHECK_IN' : 'COMPANION', |
| 443 | source_id: pageParams.value.id || '0', | 449 | source_id: pageParams.value.id || '0', |
| 444 | - qiniu_audit: uploadedFile.value.qiniu_audit || '' | 450 | + qiniu_audit: uploadedFile.value.qiniu_audit || '', |
| 445 | }; | 451 | }; |
| 446 | 452 | ||
| 447 | const result = await savePhotoAPI(saveData); | 453 | const result = await savePhotoAPI(saveData); | ... | ... |
-
Please register or login to post a comment