hookehuyr

feat(排行榜): 添加助力榜选项并优化区域显示逻辑

refactor(上传): 添加视频审核回调URL参数
style(PointsCollector): 移除调试日志
fix(ActivitiesCover): 更新默认海报图和样式调整
fix(PosterCheckin): 调整底部按钮固定定位
......@@ -170,7 +170,7 @@ const generatePointsData = () => {
do {
attempts++;
if (attempts > maxAttempts) {
console.warn('无法为项目找到不重叠的位置,使用安全位置:', item);
// console.warn('无法为项目找到不重叠的位置,使用安全位置:', item);
// 使用安全的默认位置
x = minX + Math.random() * (maxX - minX);
y = minY + Math.random() * (maxY - minY);
......
......@@ -18,17 +18,21 @@
<!-- 滑动指示器 -->
<view
class="tab-indicator"
:class="{ 'indicator-shanghai': activeTab === 'shanghai' }"
:class="{
'indicator-shanghai': activeTab === 'shanghai',
'indicator-region': activeTab !== 'shanghai' && activeTab !== 'support',
'indicator-support': activeTab === 'support'
}"
></view>
<view
v-for="region in availableRegions.slice(0, 2)"
:key="region.value"
class="tab-item"
:class="{ active: activeTab === region.value }"
@click="switchTab(region.value)"
>
{{ region.text === '上海市' ? '上海榜' : region.text.replace('区', '榜') }}
</view>
v-for="region in availableRegions.slice(0, 3)"
:key="region.value"
class="tab-item"
:class="{ active: activeTab === region.value }"
@click="switchTab(region.value)"
>
{{ getTabDisplayName(region) }}
</view>
</view>
<!-- 排行榜内容 -->
......@@ -154,6 +158,13 @@ const currentDate = ref('')
const switchTab = async (tab) => {
if (activeTab.value === tab) return
// 助力榜暂时没有数据,显示提示
if (tab === 'support') {
// TODO: 助力榜功能待开发
console.log('助力榜功能待开发')
return
}
// 开始切换动画
isContentSwitching.value = true
......@@ -224,27 +235,43 @@ const currentRegionName = computed(() => {
* 计算可用的区域选项
*/
const availableRegions = computed(() => {
// 从current_family.county获取区县信息,优先显示用户区域,然后是上海市
// 固定显示:上海榜、地区榜、助力榜
const regions = [
{ text: '上海市', value: 'shanghai' },
{ text: '地区', value: 'region' },
{ text: '助力', value: 'support' }
]
// 如果有用户区县信息,将地区榜的value设置为用户区县
const currentFamilyCounty = leaderboardData.value?.current_family?.county
if (currentFamilyCounty) {
// 确保county字段为字符串格式进行比较
const userCounty = String(currentFamilyCounty)
// value值需要转成字符串进行比较
const userRegion = shanghaiRegionOptions.value.find(item => item.value === userCounty)
if (userRegion) {
// 用户区域在第一位,上海市在第二位
return [userRegion, { text: '上海市', value: 'shanghai' }]
regions[1] = { text: userRegion.text, value: userCounty }
}
}
// 默认显示黄浦区和上海市
return [
{ text: '黄浦区', value: '310101' },
{ text: '上海市', value: 'shanghai' }
]
return regions
})
/**
* 获取标签页显示名称
* @param {object} region - 区域对象
* @returns {string} 显示名称
*/
const getTabDisplayName = (region) => {
if (region.value === 'shanghai') {
return '上海榜'
} else if (region.value === 'support') {
return '助力榜'
} else if (region.value === 'region' || region.text.includes('区') || region.text.includes('县')) {
return '地区榜'
}
return region.text
}
/**
* 格式化步数显示
* @param {number} steps - 步数
* @returns {string} 格式化后的步数
......@@ -379,7 +406,7 @@ defineExpose({
position: absolute;
top: 8rpx;
left: 8rpx;
width: calc(50% - 8rpx);
width: calc(33.33% - 8rpx);
height: calc(100% - 16rpx);
background: rgba(255, 255, 255, 1);
border-radius: 52rpx;
......@@ -388,8 +415,16 @@ defineExpose({
z-index: 1;
&.indicator-shanghai {
transform: translateX(0%);
}
&.indicator-region {
transform: translateX(100%);
}
&.indicator-support {
transform: translateX(200%);
}
}
.tab-item {
......
......@@ -11,23 +11,24 @@
top: 0;
left: 0;
width: 100vw;
height: calc(100vh - 300rpx); // 减去底部区域的高度,确保背景图不被遮挡
// height: calc(100vh - 260rpx); // 减去底部区域的高度,确保背景图不被遮挡
height: calc(100vh); // 减去底部区域的高度,确保背景图不被遮挡
object-fit: cover;
object-position: top center;
z-index: 1;
}
// 为容器添加背景色,避免下方空白
.activities-cover-container::before {
content: '';
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
background: linear-gradient(180deg, #f0f8ff 0%, #e6f3ff 50%, #ddeeff 100%);
z-index: 0;
}
// .activities-cover-container::before {
// content: '';
// position: absolute;
// top: 0;
// left: 0;
// width: 100%;
// height: 100%;
// background: linear-gradient(180deg, #f0f8ff 0%, #e6f3ff 50%, #ddeeff 100%);
// z-index: 0;
// }
// 分享按钮包装器
.share-button-wrapper {
......@@ -45,15 +46,15 @@
right: 0;
padding: 40rpx;
padding-bottom: 180rpx; // 为底部导航留出空间
background: linear-gradient(
transparent 0%,
rgba(0, 0, 0, 0.1) 20%,
rgba(0, 0, 0, 0.3) 50%,
rgba(0, 0, 0, 0.6) 80%,
rgba(0, 0, 0, 0.8) 100%
);
backdrop-filter: blur(30rpx);
-webkit-backdrop-filter: blur(30rpx);
// background: linear-gradient(
// transparent 0%,
// rgba(0, 0, 0, 0.1) 20%,
// rgba(0, 0, 0, 0.3) 50%,
// rgba(0, 0, 0, 0.6) 80%,
// rgba(0, 0, 0, 0.8) 100%
// );
// backdrop-filter: blur(30rpx);
// -webkit-backdrop-filter: blur(30rpx);
z-index: 5;
// 增加渐变高度,让过渡更自然
......
<!--
* @Date: 2022-09-19 14:11:06
* @LastEditors: hookehuyr hookehuyr@gmail.com
* @LastEditTime: 2025-09-13 09:55:16
* @LastEditTime: 2025-09-15 14:10:11
* @FilePath: /lls_program/src/pages/ActivitiesCover/index.vue
* @Description: 活动海报页面 - 展示活动信息并处理定位授权
-->
......@@ -143,7 +143,7 @@ import { handleSharePageAuth, addShareFlag } from '@/utils/authRedirect'
import { THEME_COLORS } from '@/utils/config';
// 默认海报图
const defaultPoster = 'https://cdn.ipadbiz.cn/lls_prog/images/welcome_3.jpg';
const defaultPoster = 'https://cdn.ipadbiz.cn/lls_prog/images/welcome_5.jpg';
/**
* 活动海报页面组件
* 功能:展示活动信息、处理定位授权、跳转到活动页面
......
<!--
* @Date: 2025-09-01 13:07:52
* @LastEditors: hookehuyr hookehuyr@gmail.com
* @LastEditTime: 2025-09-11 15:42:29
* @LastEditTime: 2025-09-15 15:10:07
* @FilePath: /lls_program/src/pages/FamilyRank/index.vue
* @Description: 文件描述
-->
......@@ -13,16 +13,20 @@
<!-- 滑动指示器 -->
<view
class="tab-indicator"
:class="{ 'indicator-shanghai': activeTab === 'shanghai' }"
:class="{
'indicator-shanghai': activeTab === 'shanghai',
'indicator-region': activeTab !== 'shanghai' && activeTab !== 'support',
'indicator-support': activeTab === 'support'
}"
></view>
<view
v-for="region in availableRegions.slice(0, 2)"
v-for="region in availableRegions.slice(0, 3)"
:key="region.value"
class="tab-item"
:class="{ active: activeTab === region.value }"
@click="switchTab(region.value)"
>
{{ region.text === '上海市' ? '上海榜' : region.text.replace('区', '榜') }}
{{ getTabDisplayName(region) }}
</view>
</view>
</view>
......@@ -180,6 +184,13 @@ const currentDate = ref('')
const switchTab = async (tab) => {
if (activeTab.value === tab) return
// 助力榜暂时没有数据,显示提示
if (tab === 'support') {
// TODO: 助力榜功能待开发
console.log('助力榜功能待开发')
return
}
// 开始切换动画
isContentSwitching.value = true
......@@ -234,18 +245,6 @@ const loadLeaderboardData = async (isInitialLoad = false) => {
if (response.code) {
leaderboardData.value = response.data
currentDate.value = response.data.yesterday
// 只在初始加载时从current_family.county获取区县信息,设置默认tab
if (isInitialLoad && response.data.current_family) {
const currentFamilyCounty = response.data.current_family.county;
if (currentFamilyCounty && String(currentFamilyCounty) !== activeTab.value) {
// 只在county与当前activeTab不同时才设置,确保county字段为字符串格式
activeTab.value = String(currentFamilyCounty)
// 设置activeTab后需要重新加载数据以获取正确的区县排行榜
await loadLeaderboardData(false)
return
}
}
}
} catch (error) {
console.error('获取排行榜数据失败:', error)
......@@ -269,27 +268,43 @@ const currentRegionName = computed(() => {
* 计算可用的区域选项
*/
const availableRegions = computed(() => {
// 从current_family.county获取区县信息,优先显示用户区域,然后是上海市
// 固定显示:上海榜、地区榜、助力榜
const regions = [
{ text: '上海市', value: 'shanghai' },
{ text: '地区', value: 'region' },
{ text: '助力', value: 'support' }
]
// 如果有用户区县信息,将地区榜的value设置为用户区县
const currentFamilyCounty = leaderboardData.value?.current_family?.county
if (currentFamilyCounty) {
// 确保county字段为字符串格式进行比较
const userCounty = String(currentFamilyCounty)
// value值需要转成字符串进行比较
const userRegion = shanghaiRegionOptions.value.find(item => item.value === userCounty)
if (userRegion) {
// 用户区域在第一位,上海市在第二位
return [userRegion, { text: '上海市', value: 'shanghai' }]
regions[1] = { text: userRegion.text, value: userCounty }
}
}
// 默认显示黄浦区和上海市
return [
{ text: '黄浦区', value: '310101' },
{ text: '上海市', value: 'shanghai' }
]
return regions
})
/**
* 获取标签页显示名称
* @param {object} region - 区域对象
* @returns {string} 显示名称
*/
const getTabDisplayName = (region) => {
if (region.value === 'shanghai') {
return '上海榜'
} else if (region.value === 'support') {
return '助力榜'
} else {
// 直接显示区域名称,如"黄浦区"、"杨浦区"等
return region.text
}
}
/**
* 计算前三名数据
*/
const topThreeData = computed(() => {
......@@ -338,7 +353,9 @@ const myRankInfo = computed(() => {
* 页面初始化
*/
onMounted(async () => {
// 直接加载排行榜数据,使用current_county参数获取当前家庭所在区县信息
// 默认选中上海榜
activeTab.value = 'shanghai'
// 加载排行榜数据
await loadLeaderboardData(true)
})
</script>
......@@ -366,7 +383,7 @@ onMounted(async () => {
position: absolute;
top: 8rpx;
left: 8rpx;
width: calc(50% - 8rpx);
width: calc(33.33% - 8rpx);
height: calc(100% - 16rpx);
background: rgba(255, 255, 255, 1);
border-radius: 52rpx;
......@@ -375,8 +392,16 @@ onMounted(async () => {
z-index: 1;
&.indicator-shanghai {
transform: translateX(0%);
}
&.indicator-region {
transform: translateX(100%);
}
&.indicator-support {
transform: translateX(200%);
}
}
.tab-item {
......
......@@ -28,7 +28,7 @@
</view>
<!-- 海报预览区域 - 正常状态 -->
<view v-if="pageState === 'normal'" class="flex-1 mx-4 mb-2 bg-white rounded-lg relative" style="overflow: visible;">
<view v-if="pageState === 'normal'" class="flex-1 mx-4 relative" style="overflow: visible; padding-bottom: 100rpx;">
<view class="h-full relative flex items-center justify-center">
<view v-if="currentPoster.path" class="w-full h-full relative">
<image
......@@ -79,7 +79,7 @@
</view>
<!-- 底部操作按钮 - 仅在正常状态显示 -->
<view v-if="pageState === 'normal'" class="bg-white border-t border-gray-200 p-4 safe-area-bottom">
<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;">
<view class="flex gap-4">
<view
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';
//
const playIcon = 'https://cdn.ipadbiz.cn/lls_prog/icon/play.svg';
const callbackUrl = BASE_URL + '/srv/?f=walk&a=media&t=qiniu_audit_notify'
// 响应式数据
const uploadedFile = ref(null);
......@@ -215,7 +216,7 @@ const chooseMedia = () => {
try {
// 立即上传文件到服务器
const serverUrl = await uploadFileToServer(file.tempFilePath);
const serverUrl = await uploadFileToServer(file.tempFilePath, file.fileType);
// 根据文件类型设置不同的信息,包含服务器URL
if (file.fileType === 'image') {
......@@ -236,7 +237,7 @@ const chooseMedia = () => {
thumbnail: file.thumbTempFilePath,
duration: Math.floor(file.duration),
size: file.size,
name: `video_${Date.now()}.mp4`
name: `video_${Date.now()}.mp4`,
};
}
......@@ -379,10 +380,15 @@ const formatDuration = (seconds) => {
* 上传文件到服务器
* @param {string} filePath - 文件路径
*/
const uploadFileToServer = (filePath) => {
const uploadFileToServer = (filePath, fileType) => {
return new Promise((resolve, reject) => {
// 视频上传需要判断回调
let video_params = ''
if (fileType === 'video') {
video_params = '&callback_rul=' + encodeURIComponent(callbackUrl)
}
Taro.uploadFile({
url: BASE_URL + '/admin/?m=srv&a=upload&image_audit=1',
url: BASE_URL + '/admin/?m=srv&a=upload&image_audit=1' + video_params,
filePath,
name: 'file',
header: {
......@@ -392,7 +398,7 @@ const uploadFileToServer = (filePath) => {
try {
const upload_data = JSON.parse(res.data);
if (upload_data.code === 0 && upload_data.data) {
resolve({ src: upload_data.data.src, qiniu_audit: upload_data.data.audit_result });
resolve({ src: upload_data.data.src, qiniu_audit: upload_data.data.audit_result});
} else {
reject(new Error(upload_data.msg || '服务器错误'));
}
......@@ -441,7 +447,7 @@ const saveMedia = async () => {
media_url: uploadedFile.value.serverUrl,
source_type: pageParams.value.from === 'checkin' ? 'CHECK_IN' : 'COMPANION',
source_id: pageParams.value.id || '0',
qiniu_audit: uploadedFile.value.qiniu_audit || ''
qiniu_audit: uploadedFile.value.qiniu_audit || '',
};
const result = await savePhotoAPI(saveData);
......