Commit 34d3f09a authored by 张九刚's avatar 张九刚

Merge branch 'feature/20250825md' into 'master'

Feature/20250825md

See merge request !1
parents f6646fad d198c5c1
File deleted
...@@ -2,3 +2,4 @@ unpackage/ ...@@ -2,3 +2,4 @@ unpackage/
dist/ dist/
static/ static/
node_modules/ node_modules/
.DS_Store
\ No newline at end of file
{
"editor.semanticHighlighting.enabled": false,
"files.associations": {
"*.wxml": "html",
"*.wxss": "css",
"*.wxs": "javascript"
},
"editor.tokenColorCustomizations": {
"comments": "#9AA0A6",
"textMateRules": [
{
"scope": [
"comment",
"comment.block",
"comment.block.documentation",
"punctuation.definition.comment"
],
"settings": { "foreground": "#9AA0A6" }
},
{
"scope": [
"comment.block.html",
"punctuation.definition.comment.html",
"comment.block.vue",
"punctuation.definition.comment.vue",
"comment.block.vue-html",
"punctuation.definition.comment.vue-html",
"comment.block.xml",
"punctuation.definition.comment.xml"
],
"settings": { "foreground": "#9AA0A6" }
},
{
"scope": [
"comment.block.js",
"comment.line.double-slash.js",
"punctuation.definition.comment.js",
"comment.block.javascript",
"comment.line.double-slash.javascript",
"punctuation.definition.comment.javascript"
],
"settings": { "foreground": "#9AA0A6" }
},
{
"scope": [
"comment.block.css",
"punctuation.definition.comment.css"
],
"settings": { "foreground": "#9AA0A6" }
}
],
"[Default Dark+]": {
"comments": "#9AA0A6",
"textMateRules": [
{
"scope": [
"comment",
"comment.block",
"comment.block.documentation",
"punctuation.definition.comment",
"comment.block.html",
"punctuation.definition.comment.html",
"comment.block.vue",
"punctuation.definition.comment.vue",
"comment.block.vue-html",
"punctuation.definition.comment.vue-html",
"comment.block.xml",
"punctuation.definition.comment.xml",
"comment.block.js",
"comment.line.double-slash.js",
"punctuation.definition.comment.js",
"comment.block.javascript",
"comment.line.double-slash.javascript",
"punctuation.definition.comment.javascript",
"comment.block.css",
"punctuation.definition.comment.css"
],
"settings": { "foreground": "#9AA0A6" }
}
]
},
"[Default Light+]": {
"comments": "#80868B",
"textMateRules": [
{
"scope": [
"comment",
"comment.block",
"comment.block.documentation",
"punctuation.definition.comment",
"comment.block.html",
"punctuation.definition.comment.html",
"comment.block.vue",
"punctuation.definition.comment.vue",
"comment.block.vue-html",
"punctuation.definition.comment.vue-html",
"comment.block.xml",
"punctuation.definition.comment.xml",
"comment.block.js",
"comment.line.double-slash.js",
"punctuation.definition.comment.js",
"comment.block.javascript",
"comment.line.double-slash.javascript",
"punctuation.definition.comment.javascript",
"comment.block.css",
"punctuation.definition.comment.css"
],
"settings": { "foreground": "#80868B" }
}
]
},
"[Cursor Dark]": {
"comments": "#9AA0A6",
"textMateRules": [
{
"scope": [
"comment",
"comment.block",
"comment.block.documentation",
"punctuation.definition.comment",
"comment.block.html",
"punctuation.definition.comment.html",
"comment.block.vue",
"punctuation.definition.comment.vue",
"comment.block.vue-html",
"punctuation.definition.comment.vue-html",
"comment.block.xml",
"punctuation.definition.comment.xml",
"comment.block.js",
"comment.line.double-slash.js",
"punctuation.definition.comment.js",
"comment.block.javascript",
"comment.line.double-slash.javascript",
"punctuation.definition.comment.javascript",
"comment.block.css",
"punctuation.definition.comment.css"
],
"settings": { "foreground": "#9AA0A6" }
}
]
},
"[Cursor Light]": {
"comments": "#80868B",
"textMateRules": [
{
"scope": [
"comment",
"comment.block",
"comment.block.documentation",
"punctuation.definition.comment",
"comment.block.html",
"punctuation.definition.comment.html",
"comment.block.vue",
"punctuation.definition.comment.vue",
"comment.block.vue-html",
"punctuation.definition.comment.vue-html",
"comment.block.xml",
"punctuation.definition.comment.xml",
"comment.block.js",
"comment.line.double-slash.js",
"punctuation.definition.comment.js",
"comment.block.javascript",
"comment.line.double-slash.javascript",
"punctuation.definition.comment.javascript",
"comment.block.css",
"punctuation.definition.comment.css"
],
"settings": { "foreground": "#80868B" }
}
]
}
},
"editor.semanticTokenColorCustomizations": {
"enabled": false
}
}
...@@ -3,21 +3,12 @@ ...@@ -3,21 +3,12 @@
<view class="popup-content" @click.stop> <view class="popup-content" @click.stop>
<!-- 喂养方式列表 --> <!-- 喂养方式列表 -->
<view class="feed-list"> <view class="feed-list">
<view <view v-for="(item, index) in feedOptions" :key="index" class="feed-item"
v-for="(item, index) in feedOptions" :class="{ selected: selectedIndex === index }" @click="selectFeed(index)">
:key="index"
class="feed-item"
:class="{ selected: selectedIndex === index }"
@click="selectFeed(index)"
>
<!-- 选中背景 --> <!-- 选中背景 -->
<image <image v-if="selectedIndex === index" class="feed-item-bg"
v-if="selectedIndex === index" :src="`${$baseUrl}shengzhangTool/1001/changeFeed/itemBg.png`" mode="aspectFit" />
class="feed-item-bg"
:src="`${$baseUrl}shengzhangTool/1001/changeFeed/itemBg.png`"
mode="aspectFit"
/>
<!-- 喂养方式文本 --> <!-- 喂养方式文本 -->
<text class="feed-text">{{ item.name }}</text> <text class="feed-text">{{ item.name }}</text>
</view> </view>
...@@ -25,30 +16,21 @@ ...@@ -25,30 +16,21 @@
<!-- 底部按钮 --> <!-- 底部按钮 -->
<view class="bottom-buttons"> <view class="bottom-buttons">
<image <image class="cancel-btn" :class="{ 'cancel-btn-active': isCancelPressed }"
class="cancel-btn"
:class="{'cancel-btn-active': isCancelPressed}"
:src="`${$baseUrl}shengzhangTool/1001/changeFeed/cancelBtn.png`" :src="`${$baseUrl}shengzhangTool/1001/changeFeed/cancelBtn.png`"
@touchstart="handleCancelTouchStart" @touchstart="handleCancelTouchStart" @touchend="handleCancelTouchEnd" mode="aspectFit" />
@touchend="handleCancelTouchEnd"
mode="aspectFit" <image class="ok-btn" :class="{ 'ok-btn-active': isOkPressed }"
/> :src="`${$baseUrl}shengzhangTool/1001/changeFeed/okBtn.png`" @touchstart="handleOkTouchStart"
@touchend="handleOkTouchEnd" mode="aspectFit" />
<image
class="ok-btn"
:class="{'ok-btn-active': isOkPressed}"
:src="`${$baseUrl}shengzhangTool/1001/changeFeed/okBtn.png`"
@touchstart="handleOkTouchStart"
@touchend="handleOkTouchEnd"
mode="aspectFit"
/>
</view> </view>
</view> </view>
</view> </view>
</template> </template>
<script setup> <script setup>
import { ref, defineEmits, defineProps, onMounted } from 'vue' import { ref, defineEmits, defineProps, watch, onMounted } from 'vue'
import md from '../md.js'
const props = defineProps({ const props = defineProps({
visible: { visible: {
...@@ -90,6 +72,12 @@ const selectedFeedText = ref('母乳+奶粉混合喂养') ...@@ -90,6 +72,12 @@ const selectedFeedText = ref('母乳+奶粉混合喂养')
const selectFeed = (index) => { const selectFeed = (index) => {
selectIndex.value = index selectIndex.value = index
emit('update:selectedIndex', index) emit('update:selectedIndex', index)
md.sensorPopLogTake({
xcxPopClick: "true",
toolName: "生长曲线",
popName: "喂养方式选择弹窗",
buttonName: feedOptions.value[index].name
});
} }
// 取消按钮事件 // 取消按钮事件
...@@ -109,13 +97,19 @@ const handleOkTouchStart = () => { ...@@ -109,13 +97,19 @@ const handleOkTouchStart = () => {
const handleOkTouchEnd = () => { const handleOkTouchEnd = () => {
isOkPressed.value = false isOkPressed.value = false
md.sensorPopLogTake({
xcxPopClick: "true",
toolName: "生长曲线",
popName: "喂养方式选择弹窗",
buttonName: "确认"
});
const index = selectIndex.value const index = selectIndex.value
const selectedFeed = feedOptions.value[index] const selectedFeed = feedOptions.value[index]
// 发送事件通知主页面 // 发送事件通知主页面
emit('change', selectedFeed, index)//只能传一个参数 emit('change', selectedFeed, index)//只能传一个参数
closePopup()
closePopup("nonePop")
} }
// 点击喂养方式选择 // 点击喂养方式选择
...@@ -127,24 +121,38 @@ const openFeedSelector = () => { ...@@ -127,24 +121,38 @@ const openFeedSelector = () => {
// 处理喂养方式选择变化 // 处理喂养方式选择变化
const onFeedChange = (feedOption, index) => { const onFeedChange = (feedOption, index) => {
isLoadingFeed.value = true isLoadingFeed.value = true
console.log('选择了喂养方式:', feedOption, index) console.log('选择了喂养方式:', feedOption, index)
selectedFeedText.value = feedOption.name selectedFeedText.value = feedOption.name
currentFeedIndex.value = index currentFeedIndex.value = index
// 模拟保存数据 // 模拟保存数据
setTimeout(() => { setTimeout(() => {
isLoadingFeed.value = false isLoadingFeed.value = false
}, 300) }, 300)
} }
const closePopup = () => { const closePopup = (type) => {
if (type !== 'nonePop') {
md.sensorPopLogTake({
xcxPopClick: "true",
toolName: "生长曲线",
popName: "喂养方式选择弹窗",
buttonName: "取消"
});
}
emit('update:visible', false) emit('update:visible', false)
}
onMounted(() => {
})
watch(() => props.visible, (newVal) => {
if (newVal) {
md.sensorPopLogTake({
xcxPopExposure: "true",
toolName: "生长曲线",
popName: "喂养方式选择弹窗"
});
}
})
}
</script> </script>
<style lang="less" scoped> <style lang="less" scoped>
...@@ -173,7 +181,7 @@ onMounted(() => { ...@@ -173,7 +181,7 @@ onMounted(() => {
overflow-y: auto; overflow-y: auto;
padding-left: 30rpx; padding-left: 30rpx;
padding-right: 30rpx; padding-right: 30rpx;
.feed-item { .feed-item {
position: relative; position: relative;
display: flex; display: flex;
...@@ -183,18 +191,18 @@ onMounted(() => { ...@@ -183,18 +191,18 @@ onMounted(() => {
margin-bottom: 20rpx; margin-bottom: 20rpx;
border-radius: 16rpx; border-radius: 16rpx;
background-color: #fff; background-color: #fff;
&.selected { &.selected {
background-color: transparent; background-color: transparent;
} }
.feed-item-bg { .feed-item-bg {
position: absolute; position: absolute;
width: 689rpx; width: 689rpx;
height: 108rpx; height: 108rpx;
z-index: 1; z-index: 1;
} }
.feed-text { .feed-text {
position: relative; position: relative;
z-index: 2; z-index: 2;
...@@ -212,22 +220,22 @@ onMounted(() => { ...@@ -212,22 +220,22 @@ onMounted(() => {
padding-top: 20rpx; padding-top: 20rpx;
padding-left: 30rpx; padding-left: 30rpx;
padding-right: 30rpx; padding-right: 30rpx;
.cancel-btn { .cancel-btn {
width: 334rpx; width: 334rpx;
height: 97rpx; height: 97rpx;
transition: transform 0.1s ease-out; transition: transform 0.1s ease-out;
&.cancel-btn-active { &.cancel-btn-active {
transform: scale(0.95); transform: scale(0.95);
} }
} }
.ok-btn { .ok-btn {
width: 334rpx; width: 334rpx;
height: 97rpx; height: 97rpx;
transition: transform 0.1s ease-out; transition: transform 0.1s ease-out;
&.ok-btn-active { &.ok-btn-active {
transform: scale(0.95); transform: scale(0.95);
} }
...@@ -251,23 +259,22 @@ onMounted(() => { ...@@ -251,23 +259,22 @@ onMounted(() => {
display: flex; display: flex;
align-items: center; align-items: center;
cursor: pointer; // 添加手型光标 cursor: pointer; // 添加手型光标
.feeding-value { .feeding-value {
font-size: 28rpx; font-size: 28rpx;
color: #666; color: #666;
margin-right: 8rpx; margin-right: 8rpx;
} }
.dropdown-icon { .dropdown-icon {
width: 20rpx; width: 20rpx;
height: 20rpx; height: 20rpx;
transition: transform 0.3s ease; // 添加旋转动画 transition: transform 0.3s ease; // 添加旋转动画
} }
// 可选:添加点击反馈效果 // 可选:添加点击反馈效果
&:active { &:active {
opacity: 0.7; opacity: 0.7;
} }
} }
</style> </style>
...@@ -67,6 +67,7 @@ ...@@ -67,6 +67,7 @@
<script setup> <script setup>
import { ref, defineEmits, defineProps, onMounted } from 'vue' import { ref, defineEmits, defineProps, onMounted } from 'vue'
import { useUserStore } from "@/stores/user"; import { useUserStore } from "@/stores/user";
import md from '../md.js'
// const props = defineProps({ // const props = defineProps({
// visible: { // visible: {
...@@ -104,6 +105,12 @@ const handleOkTouchStart = () => { ...@@ -104,6 +105,12 @@ const handleOkTouchStart = () => {
} }
const handleOkTouchEnd = async () => { const handleOkTouchEnd = async () => {
md.sensorPopLogTake({
xcxPopClick: "true",
toolName: "生长曲线",
popName: "切换宝宝弹窗",
buttonName: "确认"
});
isOkPressed.value = false isOkPressed.value = false
const index = selectIndex.value; const index = selectIndex.value;
...@@ -116,11 +123,23 @@ const handleOkTouchEnd = async () => { ...@@ -116,11 +123,23 @@ const handleOkTouchEnd = async () => {
} }
const closePopup = () => { const closePopup = () => {
md.sensorPopLogTake({
xcxPopClick: "true",
toolName: "生长曲线",
popName: "切换宝宝弹窗",
buttonName: "关闭"
});
emit('update:visible', false) emit('update:visible', false)
} }
const selectIndex = ref(0) const selectIndex = ref(0)
const selectBaby = (index) => { const selectBaby = (index) => {
md.sensorPopLogTake({
xcxPopClick: "true",
toolName: "生长曲线",
popName: "切换宝宝弹窗",
buttonName: "宝宝列表"
});
selectIndex.value = index; selectIndex.value = index;
emit('update:selectedIndex', index); emit('update:selectedIndex', index);
} }
...@@ -135,6 +154,11 @@ onMounted(() => { ...@@ -135,6 +154,11 @@ onMounted(() => {
const selectedIndexInList = babyList.value.findIndex(item => item.selected === true) const selectedIndexInList = babyList.value.findIndex(item => item.selected === true)
console.log('选中宝宝的索引:', selectedIndexInList) console.log('选中宝宝的索引:', selectedIndexInList)
selectIndex.value = selectedIndexInList; selectIndex.value = selectedIndexInList;
md.sensorPopLogTake({
xcxPopExposure: "true",
toolName: "生长曲线",
popName: "切换宝宝弹窗"
});
}) })
......
...@@ -27,7 +27,8 @@ ...@@ -27,7 +27,8 @@
</template> </template>
<script setup> <script setup>
import { ref, defineEmits, defineProps } from 'vue' import { ref, defineEmits, defineProps,watch } from 'vue'
import md from '../md.js'
const props = defineProps({ const props = defineProps({
visible: { visible: {
...@@ -67,11 +68,27 @@ const handleOkTouchStart = () => { ...@@ -67,11 +68,27 @@ const handleOkTouchStart = () => {
const handleOkTouchEnd = () => { const handleOkTouchEnd = () => {
isOkPressed.value = false isOkPressed.value = false
closePopup() closePopup()
md.sensorPopLogTake({
xcxPopClick: "true",
toolName: "生长曲线",
popName: "测量方式提示弹窗",
buttonName: "我知道了"
});
} }
const closePopup = () => { const closePopup = () => {
emit('update:visible', false) emit('update:visible', false)
} }
watch(() => props.visible, (newVal) => {
if (newVal) {
md.sensorPopLogTake({
xcxPopExposure: "true",
toolName: "生长曲线",
popName: "测量方式提示弹窗"
});
}
})
</script> </script>
<style lang="less" scoped> <style lang="less" scoped>
......
...@@ -65,7 +65,8 @@ ...@@ -65,7 +65,8 @@
</template> </template>
<script setup> <script setup>
import { ref, defineEmits, defineProps, watch, computed } from 'vue' import { ref, defineEmits, defineProps, watch, computed,onMounted } from 'vue'
import md from '../md.js'
const props = defineProps({ const props = defineProps({
visible: { visible: {
...@@ -107,6 +108,9 @@ const yearRange = computed(() => { ...@@ -107,6 +108,9 @@ const yearRange = computed(() => {
return yearRange return yearRange
}) })
onMounted(() => {
})
// 生成月份范围 (1-12) // 生成月份范围 (1-12)
const monthRange = computed(() => { const monthRange = computed(() => {
...@@ -252,6 +256,12 @@ const handleOkTouchEnd = () => { ...@@ -252,6 +256,12 @@ const handleOkTouchEnd = () => {
} }
const closePopup = () => { const closePopup = () => {
md.sensorPopLogTake({
xcxPopClick: "true",
toolName: "生长曲线",
popName: "选择本次测评日期弹窗",
buttonName: "关闭"
});
// 格式化日期为 YYYY-MM-DD // 格式化日期为 YYYY-MM-DD
const year = currentDate.value.getFullYear() const year = currentDate.value.getFullYear()
const month = String(currentDate.value.getMonth() + 1).padStart(2, '0') const month = String(currentDate.value.getMonth() + 1).padStart(2, '0')
......
...@@ -111,9 +111,9 @@ ...@@ -111,9 +111,9 @@
</template> </template>
<script setup> <script setup>
import { getCurrentInstance } from 'vue' import { getCurrentInstance,onMounted,computed } from 'vue'
import { BABY_CLASS_IMAGES } from './babyClassImages.js' import { BABY_CLASS_IMAGES } from './babyClassImages.js'
import { computed } from 'vue' import md from '../../md.js'
// 获取全局属性 // 获取全局属性
const { proxy } = getCurrentInstance() const { proxy } = getCurrentInstance()
...@@ -144,7 +144,15 @@ const getColor = () => { ...@@ -144,7 +144,15 @@ const getColor = () => {
] ]
return colors[props.currentLevel]; return colors[props.currentLevel];
} }
onMounted(() => {
md.sensorComponentLogTake({
xcxComponentExposure: "true",
pageName: "积分服务页",
componentName: "会员权益",
componentContent: "育儿课程-查看育儿课程"
});
})
// 等级映射常量 // 等级映射常量
const LEVEL_MAP = { const LEVEL_MAP = {
...@@ -165,6 +173,12 @@ const userLevelName = computed(() => LEVEL_MAP[props.userLevel]) ...@@ -165,6 +173,12 @@ const userLevelName = computed(() => LEVEL_MAP[props.userLevel])
const jump = (level) => { const jump = (level) => {
console.log(`跳转到 ${level} 等级页面`) console.log(`跳转到 ${level} 等级页面`)
md.sensorComponentLogTake({
xcxComponentClick: "true",
pageName: "积分服务页",
componentName: "会员权益",
componentContent: "育儿课程-查看育儿课程"
});
// 检查用户等级是否符合要求 // 检查用户等级是否符合要求
// const levelOrder = [0, 1, 2, 3, 4]; // gold, platinum, diamond, starlight, starshine // const levelOrder = [0, 1, 2, 3, 4]; // gold, platinum, diamond, starlight, starshine
// const userLevelIndex = levelOrder.indexOf(props.userLevel); // const userLevelIndex = levelOrder.indexOf(props.userLevel);
......
...@@ -481,6 +481,7 @@ import { getCurrentInstance, reactive, computed, onMounted, watch, onUnmounted } ...@@ -481,6 +481,7 @@ import { getCurrentInstance, reactive, computed, onMounted, watch, onUnmounted }
import { MONTH_GIFT_IMAGES } from './monthGiftImages.js' import { MONTH_GIFT_IMAGES } from './monthGiftImages.js'
import { monthlyGiftIndex, monthlyGiftDrawOne, monthlyGiftDrawAll } from '../../api/monthGift.js' import { monthlyGiftIndex, monthlyGiftDrawOne, monthlyGiftDrawAll } from '../../api/monthGift.js'
import { jump } from '../../utils/index.js' import { jump } from '../../utils/index.js'
import md from '../../md.js'
// import popupJingxuan from '../popup-jingxuan/popup-jingxuan.vue' // import popupJingxuan from '../popup-jingxuan/popup-jingxuan.vue'
// 获取全局属性 // 获取全局属性
...@@ -609,6 +610,12 @@ const closeJingxuanPopup = () => { ...@@ -609,6 +610,12 @@ const closeJingxuanPopup = () => {
} }
const handleCouponClick = async (level) => { const handleCouponClick = async (level) => {
md.sensorComponentLogTake({
xcxComponentClick: "true",
pageName: "积分服务页",
componentName: "会员权益",
componentContent: "月月礼-"+getCouponButtonText(currentLevelName.value)
});
console.log("handleCouponClick level:", level, "state.couponStatus:", state.couponStatus) console.log("handleCouponClick level:", level, "state.couponStatus:", state.couponStatus)
if (state.couponStatus[level] === 'used') { if (state.couponStatus[level] === 'used') {
...@@ -654,6 +661,12 @@ const handleCouponClick = async (level) => { ...@@ -654,6 +661,12 @@ const handleCouponClick = async (level) => {
} }
const handleBuyClick = async (level) => { const handleBuyClick = async (level) => {
md.sensorComponentLogTake({
xcxComponentClick: "true",
pageName: "积分服务页",
componentName: "会员权益",
componentContent: "月月礼-" +getBuyButtonText(currentLevelName.value)
});
console.log(`Clicked buy for ${level}`) console.log(`Clicked buy for ${level}`)
// 检查用户等级是否符合领取条件(优先级最高) // 检查用户等级是否符合领取条件(优先级最高)
...@@ -755,6 +768,12 @@ const handleBuyClick = async (level) => { ...@@ -755,6 +768,12 @@ const handleBuyClick = async (level) => {
const switchTimeSlot = (index) => { const switchTimeSlot = (index) => {
state.selectedTimeSlot = index state.selectedTimeSlot = index
console.log(`切换到时间段: ${state.timeSlots[index].time}`) console.log(`切换到时间段: ${state.timeSlots[index].time}`)
md.sensorComponentLogTake({
xcxComponentExposure: "true",
pageName: "积分服务页",
componentName: "会员权益",
componentContent: "月月礼-" + state.timeSlots[state.selectedTimeSlot].time+"-"+getBuyButtonText(currentLevelName.value)
});
} }
// 获取精选好券按钮文本 // 获取精选好券按钮文本
...@@ -974,10 +993,28 @@ onUnmounted(() => { ...@@ -974,10 +993,28 @@ onUnmounted(() => {
} }
}) })
const initExposure = () => {
md.sensorComponentLogTake({
xcxComponentExposure: "true",
pageName: "积分服务页",
componentName: "会员权益",
componentContent: "月月礼-" + state.timeSlots[state.selectedTimeSlot].time+"-"+getBuyButtonText(currentLevelName.value)
});
md.sensorComponentLogTake({
xcxComponentExposure: "true",
pageName: "积分服务页",
componentName: "会员权益",
componentContent: "月月礼-"+getCouponButtonText(currentLevelName.value)
});
}
// 初始化 // 初始化
onMounted(async () => { onMounted(async () => {
console.log('MonthGift component mounted, current level:', props.currentLevel, props.userLevel) console.log('MonthGift component mounted, current level:', props.currentLevel, props.userLevel)
await fetchMonthlyGiftData() await fetchMonthlyGiftData()
initExposure();
}) })
// 调试函数:打印当前状态 // 调试函数:打印当前状态
......
...@@ -144,8 +144,9 @@ ...@@ -144,8 +144,9 @@
</template> </template>
<script setup> <script setup>
import { getCurrentInstance, computed } from 'vue' import { getCurrentInstance, computed,onMounted } from 'vue'
import { YEAR_GIFT_IMAGES } from './yearGiftImages.js' import { YEAR_GIFT_IMAGES } from './yearGiftImages.js'
import md from '../../md.js'
// 获取全局属性 // 获取全局属性
const { proxy } = getCurrentInstance() const { proxy } = getCurrentInstance()
...@@ -199,9 +200,22 @@ const buttonInfo = computed(() => { ...@@ -199,9 +200,22 @@ const buttonInfo = computed(() => {
}; };
} }
}) })
onMounted(() => {
md.sensorComponentLogTake({
xcxComponentExposure: "true",
pageName: "积分服务页",
componentName: "会员权益",
componentContent: "周岁礼-"+buttonInfo.value.text
});
})
// 按钮点击事件处理 // 按钮点击事件处理
const handleButtonClick = () => { const handleButtonClick = () => {
md.sensorComponentLogTake({
xcxComponentClick: "true",
pageName: "积分服务页",
componentName: "会员权益",
componentContent: "周岁礼-"+buttonInfo.value.text
});
if (buttonInfo.value.action === 'upgrade') { if (buttonInfo.value.action === 'upgrade') {
// 跳转到升级页面 // 跳转到升级页面
uni.navigateTo({ uni.navigateTo({
......
...@@ -47,6 +47,7 @@ ...@@ -47,6 +47,7 @@
<script setup> <script setup>
import { defineProps, defineEmits, onMounted } from 'vue' import { defineProps, defineEmits, onMounted } from 'vue'
import md from '../../md.js'
// 定义组件名称 // 定义组件名称
defineOptions({ defineOptions({
...@@ -105,6 +106,12 @@ const isShowBtn = () => { ...@@ -105,6 +106,12 @@ const isShowBtn = () => {
} }
onMounted(() => { onMounted(() => {
md.sensorComponentLogTake({
xcxComponentExposure: "true",
pageName: "积分服务页",
componentName: "会员权益",
componentContent: "爱本新人礼-去升级"
});
console.log('props.isshowLocksdfsdfsdfsdsf===', props.isshowLock) console.log('props.isshowLocksdfsdfsdfsdsf===', props.isshowLock)
}) })
...@@ -113,6 +120,12 @@ const emit = defineEmits(['upgrade']) ...@@ -113,6 +120,12 @@ const emit = defineEmits(['upgrade'])
// 去升级按钮点击 // 去升级按钮点击
const handleUpgrade = () => { const handleUpgrade = () => {
md.sensorComponentLogTake({
xcxComponentClick: "true",
pageName: "积分服务页",
componentName: "会员权益",
componentContent: "爱本新人礼-去升级"
});
emit('upgrade', { emit('upgrade', {
index: props.index index: props.index
}) })
......
...@@ -44,13 +44,24 @@ ...@@ -44,13 +44,24 @@
</template> </template>
<script setup> <script setup>
import { defineProps, defineEmits } from 'vue' import { defineProps, defineEmits,onMounted } from 'vue'
import md from '../../md.js'
// 定义组件名称 // 定义组件名称
defineOptions({ defineOptions({
name: 'jinjili' name: 'jinjili'
}) })
onMounted(() => {
md.sensorComponentLogTake({
xcxComponentExposure: "true",
pageName: "积分服务页",
componentName: "会员权益",
componentContent: "晋级礼-去升级"
});
})
const getBgName = () => { const getBgName = () => {
if(props.isshowLock){ if(props.isshowLock){
return props.index + "" return props.index + ""
...@@ -94,6 +105,12 @@ const emit = defineEmits(['upgrade']) ...@@ -94,6 +105,12 @@ const emit = defineEmits(['upgrade'])
// 去升级按钮点击 // 去升级按钮点击
const handleUpgrade = () => { const handleUpgrade = () => {
md.sensorComponentLogTake({
xcxComponentClick: "true",
pageName: "积分服务页",
componentName: "会员权益",
componentContent: "晋级礼-去升级"
});
emit('upgrade', { emit('upgrade', {
index: props.index index: props.index
}) })
......
...@@ -35,7 +35,8 @@ ...@@ -35,7 +35,8 @@
</template> </template>
<script setup> <script setup>
import { defineProps, defineEmits } from 'vue' import { defineProps, defineEmits,onMounted } from 'vue'
import md from '../../md.js'
// 定义组件名称 // 定义组件名称
defineOptions({ defineOptions({
...@@ -50,6 +51,14 @@ const props = defineProps({ ...@@ -50,6 +51,14 @@ const props = defineProps({
} }
}) })
onMounted(() => {
md.sensorComponentLogTake({
xcxComponentExposure: "true",
pageName: "积分服务页",
componentName: "会员权益",
componentContent: "免费问诊-立即使用"
});
})
// 定义组件事件 // 定义组件事件
const emit = defineEmits(['doctor-click', 'use-now']) const emit = defineEmits(['doctor-click', 'use-now'])
...@@ -62,9 +71,16 @@ const handleDoctorGridClick = () => { ...@@ -62,9 +71,16 @@ const handleDoctorGridClick = () => {
// 立即使用按钮点击 // 立即使用按钮点击
const handleUseNow = () => { const handleUseNow = () => {
md.sensorComponentLogTake({
xcxComponentClick: "true",
pageName: "积分服务页",
componentName: "会员权益",
componentContent: "免费问诊-立即使用"
});
emit('use-now', { emit('use-now', {
index: props.index index: props.index
}) })
} }
// 颜色配置 // 颜色配置
......
...@@ -62,6 +62,7 @@ ...@@ -62,6 +62,7 @@
import { defineProps, defineEmits, onMounted, ref } from 'vue' import { defineProps, defineEmits, onMounted, ref } from 'vue'
import { showLoading, hideLoading } from '../../utils' import { showLoading, hideLoading } from '../../utils'
import { fetchBirthdayGiftJSON } from '../../api/integral' import { fetchBirthdayGiftJSON } from '../../api/integral'
import md from '../../md.js'
import { useUserStore } from "../../stores/user"; import { useUserStore } from "../../stores/user";
...@@ -146,7 +147,12 @@ const handleUpgrade = async () => { ...@@ -146,7 +147,12 @@ const handleUpgrade = async () => {
index: status1.value, index: status1.value,
userStore:useUserStore() userStore:useUserStore()
}) })
md.sensorComponentLogTake({
xcxComponentClick: "true",
pageName: "积分服务页",
componentName: "会员权益",
componentContent: "生日礼-"+getBtnName()
});
} }
// 待开启按钮点击 // 待开启按钮点击
...@@ -183,7 +189,7 @@ const status1 = ref(0); ...@@ -183,7 +189,7 @@ const status1 = ref(0);
const hasBaby = ref(false); const hasBaby = ref(false);
const islogin = ref(true); const islogin = ref(true);
onMounted(async () => { onMounted(async () => {
const userStore = useUserStore(); const userStore = useUserStore();
const memberInfo = userStore.memberInfo; const memberInfo = userStore.memberInfo;
...@@ -218,6 +224,12 @@ onMounted(async () => { ...@@ -218,6 +224,12 @@ onMounted(async () => {
} }
console.log('data', data); console.log('data', data);
hideLoading(); hideLoading();
md.sensorComponentLogTake({
xcxComponentExposure: "true",
pageName: "积分服务页",
componentName: "会员权益",
componentContent: "生日礼-"+getBtnName()
});
}) })
......
...@@ -45,7 +45,7 @@ ...@@ -45,7 +45,7 @@
import { defineProps, defineEmits, ref, onMounted } from 'vue' import { defineProps, defineEmits, ref, onMounted } from 'vue'
import { showLoading, hideLoading } from '../../utils'; import { showLoading, hideLoading } from '../../utils';
import { fetchActivityStateJSON } from '../../api/integral'; import { fetchActivityStateJSON } from '../../api/integral';
import md from '../../md.js'
const handleUpgrade_daikaiqi = () => { const handleUpgrade_daikaiqi = () => {
uni.showToast({ uni.showToast({
title: '活动暂未开启', title: '活动暂未开启',
...@@ -97,6 +97,12 @@ const emit = defineEmits(['upgrade']) ...@@ -97,6 +97,12 @@ const emit = defineEmits(['upgrade'])
// 去升级按钮点击 // 去升级按钮点击
const handleUpgrade = () => { const handleUpgrade = () => {
md.sensorComponentLogTake({
xcxComponentClick: "true",
pageName: "积分服务页",
componentName: "会员权益",
componentContent: "溯源游-"+(props.isshowLock ? '去升级' : '立即报名')
});
emit('upgrade', { emit('upgrade', {
index: props.index index: props.index
}) })
...@@ -148,6 +154,13 @@ onMounted(async () => { ...@@ -148,6 +154,13 @@ onMounted(async () => {
} }
hideLoading(); hideLoading();
md.sensorComponentLogTake({
xcxComponentExposure: "true",
pageName: "积分服务页",
componentName: "会员权益",
componentContent: "溯源游-"+(props.isshowLock ? '去升级' : '立即报名')
});
}) })
</script> </script>
......
...@@ -46,7 +46,8 @@ ...@@ -46,7 +46,8 @@
</template> </template>
<script setup> <script setup>
import { defineProps, defineEmits } from 'vue' import { defineProps, defineEmits,onMounted } from 'vue'
import md from '../../md.js'
// 定义组件名称 // 定义组件名称
defineOptions({ defineOptions({
...@@ -66,6 +67,16 @@ const props = defineProps({ ...@@ -66,6 +67,16 @@ const props = defineProps({
} }
}) })
onMounted(() => {
md.sensorComponentLogTake({
xcxComponentExposure: "true",
pageName: "积分服务页",
componentName: "会员权益",
componentContent: "转段礼-去升级"
});
})
const getBgName = () => { const getBgName = () => {
if(props.isshowLock){ if(props.isshowLock){
return props.index + "" return props.index + ""
...@@ -96,6 +107,12 @@ const emit = defineEmits(['upgrade']) ...@@ -96,6 +107,12 @@ const emit = defineEmits(['upgrade'])
// 去升级按钮点击 // 去升级按钮点击
const handleUpgrade = () => { const handleUpgrade = () => {
md.sensorComponentLogTake({
xcxComponentClick: "true",
pageName: "积分服务页",
componentName: "会员权益",
componentContent: "转段礼-去升级"
});
emit('upgrade', { emit('upgrade', {
index: props.index index: props.index
}) })
......
...@@ -25,7 +25,8 @@ ...@@ -25,7 +25,8 @@
</template> </template>
<script setup> <script setup>
import { defineProps, defineEmits } from 'vue' import { defineProps, defineEmits,watch } from 'vue'
import md from '../md.js'
// 定义props // 定义props
const props = defineProps({ const props = defineProps({
...@@ -40,8 +41,24 @@ const emit = defineEmits(['close']) ...@@ -40,8 +41,24 @@ const emit = defineEmits(['close'])
// 关闭弹窗 // 关闭弹窗
const closePopup = () => { const closePopup = () => {
md.sensorPopLogTake({
xcxPopClick: "true",
toolName: "生长曲线",
popName: "生长曲线介绍弹窗",
buttonName: "我知道了"
});
emit('close') emit('close')
} }
watch(() => props.visible, (newVal) => {
if (newVal) {
md.sensorPopLogTake({
xcxPopExposure: "true",
toolName: "生长曲线",
popName: "生长曲线介绍弹窗"
});
}
})
</script> </script>
<style lang="less" scoped> <style lang="less" scoped>
......
...@@ -6,7 +6,7 @@ const init = (SENSORS_URL) => { ...@@ -6,7 +6,7 @@ const init = (SENSORS_URL) => {
sensors.setPara({ sensors.setPara({
name: "sensors", name: "sensors",
server_url: SENSORS_URL, server_url: SENSORS_URL,
show_log: true, show_log: false,
autoTrack: { autoTrack: {
appLaunch: true, // 默认为 true,false 则关闭 $MPLaunch 事件采集 appLaunch: true, // 默认为 true,false 则关闭 $MPLaunch 事件采集
appShow: true, // 默认为 true,false 则关闭 $MPShow 事件采集 appShow: true, // 默认为 true,false 则关闭 $MPShow 事件采集
...@@ -62,13 +62,13 @@ const sensorLog = (evt) => { ...@@ -62,13 +62,13 @@ const sensorLog = (evt) => {
trackObj[key] = logObj[key]; trackObj[key] = logObj[key];
} }
if (xcxPage && xcxPage.length > 0) { if (xcxPage && xcxPage.length > 0) {
console.warn("xcxPage", trackObj); // console.warn("xcxPage", trackObj);
sensors.track("xcxPage", { sensors.track("xcxPage", {
...trackObj, ...trackObj,
}); });
} }
if (xcxClick && xcxClick.length > 0) { if (xcxClick && xcxClick.length > 0) {
console.warn("xcxClick", trackObj); // console.warn("xcxClick", trackObj);
sensors.track("xcxClick", { sensors.track("xcxClick", {
...trackObj, ...trackObj,
}); });
...@@ -91,10 +91,101 @@ const sensorLogTake = (logObj) => { ...@@ -91,10 +91,101 @@ const sensorLogTake = (logObj) => {
}; };
sensorLog(evt); sensorLog(evt);
}; };
const sensorComponentLog = (evt) => {
const _dataset = evt.currentTarget.dataset;
const logObj = _dataset.comlog;
if (!logObj) {
return;
}
const { xcxComponentExposure, xcxComponentClick } = logObj;
let trackObj = {};
for (let key in logObj) {
trackObj[key] = logObj[key];
}
if (xcxComponentExposure && xcxComponentExposure.length > 0) {
// console.warn("-----xcxComponentExposure-----", trackObj);
sensors.track("xcxComponentExposure", {
...trackObj,
});
}
if (xcxComponentClick && xcxComponentClick.length > 0) {
// console.warn("-----xcxComponentClick-----", trackObj);
sensors.track("xcxComponentClick", {
...trackObj,
});
}
};
/**
* 主动通过配置数据触发埋点
* @param {*} evt
*/
const sensorComponentLogTake = (logObj) => {
if (!logObj) {
return;
}
const evt = {
currentTarget: {
dataset: {
comlog: logObj,
},
},
};
sensorComponentLog(evt);
};
const sensorPopLog = (evt) => {
const _dataset = evt.currentTarget.dataset;
const logObj = _dataset.poplog;
if (!logObj) {
return;
}
const { xcxPopExposure, xcxPopClick } = logObj;
let trackObj = {};
for (let key in logObj) {
trackObj[key] = logObj[key];
}
if (xcxPopExposure && xcxPopExposure.length > 0) {
// console.warn("-----xcxPopExposure-----", trackObj);
sensors.track("xcxPopExposure", {
...trackObj,
});
}
if (xcxPopClick && xcxPopClick.length > 0) {
// console.warn("-----xcxPopClick-----", trackObj);
sensors.track("xcxPopClick", {
...trackObj,
});
}
};
/**
* 主动通过配置数据触发埋点
* @param {*} evt
*/
const sensorPopLogTake = (logObj) => {
if (!logObj) {
return;
}
const evt = {
currentTarget: {
dataset: {
poplog: logObj,
},
},
};
sensorPopLog(evt);
};
export default { export default {
init, init,
sensors, sensors,
login, login,
sensorLog, sensorLog,
sensorLogTake, sensorLogTake,
sensorComponentLog,
sensorComponentLogTake,
sensorPopLog,
sensorPopLogTake,
}; };
...@@ -3,6 +3,7 @@ ...@@ -3,6 +3,7 @@
{ {
"videoUrl": "https://course.feihe.com/momclub-picture/brandpage/bannerVideo.mp4", "videoUrl": "https://course.feihe.com/momclub-picture/brandpage/bannerVideo.mp4",
"link": {}, "link": {},
"title": "北纬47°黄金种植带",
"url": "brandpage/Banner41.png" "url": "brandpage/Banner41.png"
}, },
{ {
...@@ -11,14 +12,16 @@ ...@@ -11,14 +12,16 @@
"type": 3, "type": 3,
"url": "https://mp.weixin.qq.com/s/0eMxbWB3R_0g06HZPUEj5Q" "url": "https://mp.weixin.qq.com/s/0eMxbWB3R_0g06HZPUEj5Q"
}, },
"title": "飞鹤自由牧场",
"url": "brandpage/Banner42.png" "url": "brandpage/Banner42.png"
}, },
{ {
"link": { "link": {
"extra": {}, "extra": {},
"type": 3, "type": 1,
"url": "https://factory.feihe.com/user/#/web" "url": "/reservation/home/index"
}, },
"title": "飞鹤哈尔滨智能产业园",
"url": "brandpage/Banner44.png" "url": "brandpage/Banner44.png"
} }
], ],
...@@ -26,7 +29,8 @@ ...@@ -26,7 +29,8 @@
"finderUserName": "", "finderUserName": "",
"videoUrl": "brandpage/videoChannel/video2Channel/V1/1.mp4", "videoUrl": "brandpage/videoChannel/video2Channel/V1/1.mp4",
"posterUrl": "", "posterUrl": "",
"feedId": "" "feedId": "",
"title": "品牌故事视频2"
}, },
"product": [ "product": [
[ [
...@@ -477,9 +481,13 @@ ...@@ -477,9 +481,13 @@
"videoUrl": "https://course.feihe.com/momclub-picture/brandpage/banner_1%E6%85%A2%E4%BA%BA%E8%8A%82x%E9%A3%9E%E9%B9%A4%2B-%2B%E5%9C%9FFINAL.mp4", "videoUrl": "https://course.feihe.com/momclub-picture/brandpage/banner_1%E6%85%A2%E4%BA%BA%E8%8A%82x%E9%A3%9E%E9%B9%A4%2B-%2B%E5%9C%9FFINAL.mp4",
"erqiPeizhi": { "erqiPeizhi": {
"ipImg4": "https://course.feihe.com/momclub-picture/brandpage/ip4.png", "ipImg4": "https://course.feihe.com/momclub-picture/brandpage/ip4.png",
"ipTitle3": "视频号",
"title1": "飞鹤产品家族", "title1": "飞鹤产品家族",
"ipTitle4": "小红书",
"title2": "飞鹤品牌IP鹤小飞一家", "title2": "飞鹤品牌IP鹤小飞一家",
"ipTitle1": "毛绒可爱发夹",
"title3": "飞鹤ESG", "title3": "飞鹤ESG",
"ipTitle2": "大容量吨吨桶水杯",
"iphexiaofeiUrl": "https://course.feihe.com/momclub-picture/brandpage/v1_iphexiaofei.png", "iphexiaofeiUrl": "https://course.feihe.com/momclub-picture/brandpage/v1_iphexiaofei.png",
"ipImg1": "https://course.feihe.com/momclub-picture/brandpage/v1_ip1.png", "ipImg1": "https://course.feihe.com/momclub-picture/brandpage/v1_ip1.png",
"ipImg3": "https://course.feihe.com/momclub-picture/brandpage/ip3.png", "ipImg3": "https://course.feihe.com/momclub-picture/brandpage/ip3.png",
...@@ -489,7 +497,8 @@ ...@@ -489,7 +497,8 @@
"finderUserName": "sphgexisAi0pRGm", "finderUserName": "sphgexisAi0pRGm",
"videoUrl": "brandpage/videoChannel/video1Channel/V2/1.mp4", "videoUrl": "brandpage/videoChannel/video1Channel/V2/1.mp4",
"posterUrl": "", "posterUrl": "",
"feedId": "export/UzFfAgtgekIEAQAAAAAABbEMmxr36QAAAAstQy6ubaLX4KHWvLEZgBPEgaJkYSYbLr6JzNPgMJp7tTZCYcYsIpU6Z0fgSnSE" "feedId": "export/UzFfAgtgekIEAQAAAAAABbEMmxr36QAAAAstQy6ubaLX4KHWvLEZgBPEgaJkYSYbLr6JzNPgMJp7tTZCYcYsIpU6Z0fgSnSE",
"title": "品牌故事视频1"
}, },
"esgInfoList": [ "esgInfoList": [
[ [
......
This diff is collapsed.
This source diff could not be displayed because it is too large. You can view the blob instead.
...@@ -217,6 +217,12 @@ const onAdd = () => { ...@@ -217,6 +217,12 @@ const onAdd = () => {
} }
}) })
popup.value.open() popup.value.open()
md.sensorComponentLogTake({
xcxPopExposure: "true",
toolName: "产检提醒",
popName: "选择产检项目弹窗"
});
// 回显数据 // 回显数据
if (listData.value.length > 0) { if (listData.value.length > 0) {
// 回显数据 - 将 listData 中的数据同步到 selectedAirports // 回显数据 - 将 listData 中的数据同步到 selectedAirports
...@@ -224,7 +230,15 @@ const onAdd = () => { ...@@ -224,7 +230,15 @@ const onAdd = () => {
} }
} }
// 关闭项目弹窗 // 关闭项目弹窗
const onPopupClose = () => { const onPopupClose = (type) => {
if (type !== 'nonePop') {
md.sensorPopLogTake({
xcxPopClick: "true",
toolName: "产检提醒",
popName: "选择产检项目弹窗",
buttonName: "关闭"
});
}
wx.setPageStyle({ wx.setPageStyle({
style: { style: {
overflow: 'auto' overflow: 'auto'
...@@ -232,6 +246,7 @@ const onPopupClose = () => { ...@@ -232,6 +246,7 @@ const onPopupClose = () => {
}) })
selectedAirports.value = [] selectedAirports.value = []
popup.value.close() popup.value.close()
} }
// 检查是否已选中 // 检查是否已选中
const isSelected = (id) => { const isSelected = (id) => {
...@@ -246,6 +261,12 @@ const toggleSelect = (airport) => { ...@@ -246,6 +261,12 @@ const toggleSelect = (airport) => {
id: airport.id, id: airport.id,
itemName: airport.itemName itemName: airport.itemName
}); });
md.sensorComponentLogTake({
xcxPopClick: "true",
toolName: "产检提醒",
popName: "选择产检项目弹窗",
buttonName: airport.itemName
});
} else { } else {
selectedAirports.value.splice(index, 1); selectedAirports.value.splice(index, 1);
} }
...@@ -259,7 +280,13 @@ const saveSelection = () => { ...@@ -259,7 +280,13 @@ const saveSelection = () => {
const uniqueMap = new Map(); const uniqueMap = new Map();
combined.forEach(item => uniqueMap.set(item.id, item)); combined.forEach(item => uniqueMap.set(item.id, item));
listData.value = Array.from(uniqueMap.values()); listData.value = Array.from(uniqueMap.values());
onPopupClose(); onPopupClose("nonePop");
md.sensorPopLogTake({
xcxPopClick: "true",
toolName: "产检提醒",
popName: "选择产检项目弹窗",
buttonName: "确认"
});
}; };
// // 移除已选项目 // // 移除已选项目
// const removeSelected = (airport) => { // const removeSelected = (airport) => {
......
...@@ -1885,6 +1885,12 @@ async function completeRecord() { ...@@ -1885,6 +1885,12 @@ async function completeRecord() {
// 显示成功弹窗 // 显示成功弹窗
successPopup.value.open() successPopup.value.open()
md.sensorPopLogTake({
xcxPopExposure: "true",
toolName: "喂养记录",
popName: "添加成功弹窗"
});
...@@ -2406,6 +2412,7 @@ function showAddFoodPopup(categoryName) { ...@@ -2406,6 +2412,7 @@ function showAddFoodPopup(categoryName) {
pageName: "喂养工具首页", pageName: "喂养工具首页",
buttonName: "辅食添加" + categoryName, buttonName: "辅食添加" + categoryName,
}); });
// 防连点检查 // 防连点检查
if (foodSelectionState.value.isAddingFood) { if (foodSelectionState.value.isAddingFood) {
console.log('防连点:添加辅食按钮被阻止') console.log('防连点:添加辅食按钮被阻止')
...@@ -2439,7 +2446,11 @@ function showAddFoodPopup(categoryName) { ...@@ -2439,7 +2446,11 @@ function showAddFoodPopup(categoryName) {
foodSelectionState.value.newFoodItem = '' foodSelectionState.value.newFoodItem = ''
// 显示弹窗 // 显示弹窗
addFoodPopup.value.open() addFoodPopup.value.open()
md.sensorPopLogTake({
xcxPopExposure: "true",
toolName: "喂养记录",
popName: "新增辅食弹窗",
});
// 立即重置防连点状态(弹窗显示后) // 立即重置防连点状态(弹窗显示后)
setTimeout(() => { setTimeout(() => {
foodSelectionState.value.isAddingFood = false foodSelectionState.value.isAddingFood = false
...@@ -2458,6 +2469,12 @@ function toggleCategoryExpansion(categoryName) { ...@@ -2458,6 +2469,12 @@ function toggleCategoryExpansion(categoryName) {
function cancelAddFood() { function cancelAddFood() {
addFoodPopup.value.close() addFoodPopup.value.close()
foodSelectionState.value.newFoodItem = '' foodSelectionState.value.newFoodItem = ''
md.sensorPopLogTake({
xcxPopClick: "true",
toolName: "喂养记录",
popName: "新增辅食弹窗",
buttonName: "取消"
});
} }
function confirmAddFood() { function confirmAddFood() {
...@@ -2465,6 +2482,12 @@ function confirmAddFood() { ...@@ -2465,6 +2482,12 @@ function confirmAddFood() {
console.log('防连点:添加辅食按钮被阻止') console.log('防连点:添加辅食按钮被阻止')
return return
} }
md.sensorPopLogTake({
xcxPopClick: "true",
toolName: "喂养记录",
popName: "新增辅食弹窗",
buttonName: "添加"
});
foodSelectionState.value.isAddingFood = true foodSelectionState.value.isAddingFood = true
console.log('防连点:设置添加辅食状态为true') console.log('防连点:设置添加辅食状态为true')
...@@ -3246,7 +3269,11 @@ async function startPollingRecognitionResult(taskId) { ...@@ -3246,7 +3269,11 @@ async function startPollingRecognitionResult(taskId) {
voiceRecognitionState.value.voiceDateTime = `${year}-${month}-${day} ${hours}:${minutes}:00` voiceRecognitionState.value.voiceDateTime = `${year}-${month}-${day} ${hours}:${minutes}:00`
} }
voiceRecognitionState.value.showResultPage = true voiceRecognitionState.value.showResultPage = true
md.sensorPopLogTake({
xcxPopExposure: "true",
toolName: "喂养记录",
popName: "语音识别结果弹窗"
});
// 显示识别成功提示 // 显示识别成功提示
uni.showToast({ uni.showToast({
title: '语音识别成功', title: '语音识别成功',
...@@ -3402,7 +3429,12 @@ function formatRecordingDuration(seconds) { ...@@ -3402,7 +3429,12 @@ function formatRecordingDuration(seconds) {
function reRecognize() { function reRecognize() {
console.log('重新识别...') console.log('重新识别...')
md.sensorPopLogTake({
xcxPopClick: "true",
toolName: "喂养记录",
popName: "语音识别结果弹窗",
buttonName: "不对,重新识别"
});
// 清理轮询状态 // 清理轮询状态
clearPollingInterval() clearPollingInterval()
...@@ -3429,6 +3461,12 @@ async function completeVoiceRecord() { ...@@ -3429,6 +3461,12 @@ async function completeVoiceRecord() {
if (isSubmitting.value) { if (isSubmitting.value) {
return return
} }
md.sensorPopLogTake({
xcxPopClick: "true",
toolName: "喂养记录",
popName: "语音识别结果弹窗",
buttonName: "完成记录"
});
const detailText = voiceRecognitionState.value.recognizedText.trim() const detailText = voiceRecognitionState.value.recognizedText.trim()
...@@ -3486,6 +3524,11 @@ async function completeVoiceRecord() { ...@@ -3486,6 +3524,11 @@ async function completeVoiceRecord() {
// 显示成功弹窗 // 显示成功弹窗
successPopup.value.open() successPopup.value.open()
md.sensorPopLogTake({
xcxPopExposure: "true",
toolName: "喂养记录",
popName: "添加成功弹窗"
});
} catch (error) { } catch (error) {
console.error('保存语音记录失败:', error) console.error('保存语音记录失败:', error)
// uni.hideLoading() // uni.hideLoading()
...@@ -3543,11 +3586,23 @@ async function onSuccessJump() { ...@@ -3543,11 +3586,23 @@ async function onSuccessJump() {
}, },
}); // 关闭弹窗 }); // 关闭弹窗
successPopup.value.close() successPopup.value.close()
md.sensorPopLogTake({
xcxPopClick: "true",
toolName: "喂养记录",
popName: "添加成功弹窗",
buttonName: "咨询专家"
});
} }
function onSuccessClose() { function onSuccessClose() {
// 关闭弹窗 // 关闭弹窗
successPopup.value.close() successPopup.value.close()
md.sensorPopLogTake({
xcxPopClick: "true",
toolName: "喂养记录",
popName: "添加成功弹窗",
buttonName: "关闭"
});
// 跳转至记录页面 // 跳转至记录页面
uni.navigateTo({ uni.navigateTo({
url: '/pages/feedingRecord/feedingRecord' url: '/pages/feedingRecord/feedingRecord'
......
...@@ -723,9 +723,24 @@ function editRecord(index) { ...@@ -723,9 +723,24 @@ function editRecord(index) {
editingRecord.value = { index, record } editingRecord.value = { index, record }
showEditPopup.value = true showEditPopup.value = true
md.sensorPopLogTake({
xcxPopExposure: "true",
toolName: "喂养记录",
popName: "日历页确认修改内容弹窗"
});
} }
function closeEditPopup() { function closeEditPopup(type) {
if (type !== 'nonePop') {
md.sensorPopLogTake({
xcxPopClick: "true",
toolName: "喂养记录",
popName: "日历页确认修改内容弹窗",
buttonName: "取消"
});
}
showEditPopup.value = false showEditPopup.value = false
editingRecord.value = null editingRecord.value = null
editForm.value = { time: '', type: '', content: '' } editForm.value = { time: '', type: '', content: '' }
...@@ -800,6 +815,12 @@ function onEditTypeChange(event) { ...@@ -800,6 +815,12 @@ function onEditTypeChange(event) {
} }
async function saveEditRecord() { async function saveEditRecord() {
md.sensorPopLogTake({
xcxPopClick: "true",
toolName: "喂养记录",
popName: "日历页确认修改内容弹窗",
buttonName: "保存修改"
});
if (!editForm.value.time || !editForm.value.type) { if (!editForm.value.time || !editForm.value.type) {
uni.showToast({ title: '请填写完整信息', icon: 'none' }) uni.showToast({ title: '请填写完整信息', icon: 'none' })
return return
...@@ -868,7 +889,7 @@ async function saveEditRecord() { ...@@ -868,7 +889,7 @@ async function saveEditRecord() {
icon: 'none' icon: 'none'
}) })
closeEditPopup() closeEditPopup('nonePop')
// 清空缓存,确保获取最新数据 // 清空缓存,确保获取最新数据
clearCache() clearCache()
......
<template> <template>
<view> <view>
<view class="postnatal"> <view class="postnatal">
<!-- 自定义头部 --> <!-- 自定义头部 -->
<!-- <customize-navigation> <!-- <customize-navigation>
<template v-slot:navbar-content> <template v-slot:navbar-content>
<view class="page-top"> <view class="page-top">
...@@ -11,10 +11,10 @@ ...@@ -11,10 +11,10 @@
<view class="page_title">产检提醒</view> <view class="page_title">产检提醒</view>
</view> </view>
</template> </template>
</customize-navigation> --> </customize-navigation> -->
<view class="postnatal-con"> <view class="postnatal-con">
<!-- 轮播图 --> <!-- 轮播图 -->
<swiper class="banner-swiper" :autoplay="true" :circular="true" v-if="bannerList.length > 0 "> <swiper class="banner-swiper" :autoplay="true" :circular="true" v-if="bannerList.length > 0">
<swiper-item v-for="(item, index) in bannerList" :key="index"> <swiper-item v-for="(item, index) in bannerList" :key="index">
<image class="banner-img" :src="`${item.img}`" mode="aspectFill" <image class="banner-img" :src="`${item.img}`" mode="aspectFill"
@click="handleBannerClick(item, index)" /> @click="handleBannerClick(item, index)" />
...@@ -46,7 +46,7 @@ ...@@ -46,7 +46,7 @@
</view> </view>
<!-- 产检记录 --> <!-- 产检记录 -->
<scroll-view class="postnatal-con-record" scroll-y :scroll-top="scrollTop"> <scroll-view class="postnatal-con-record" scroll-y :scroll-top="scrollTop">
<!-- <view class="postnatal-con-record"> --> <!-- <view class="postnatal-con-record"> -->
<view :class="['record-item', `item-${index}`]" <view :class="['record-item', `item-${index}`]"
v-for="({ id, checkupDate, index, pregnancyWeek, status, examinationItems, type }, i) in homeInfo.checkupList" v-for="({ id, checkupDate, index, pregnancyWeek, status, examinationItems, type }, i) in homeInfo.checkupList"
@click="onDetails(id, type)" :key="i"> @click="onDetails(id, type)" :key="i">
...@@ -79,7 +79,7 @@ ...@@ -79,7 +79,7 @@
重点:{{ getProject(examinationItems) }} 重点:{{ getProject(examinationItems) }}
</view> </view>
</view> </view>
<!-- </view> --> <!-- </view> -->
</scroll-view> </scroll-view>
</view> </view>
<!-- 新增产检 --> <!-- 新增产检 -->
...@@ -112,12 +112,13 @@ ...@@ -112,12 +112,13 @@
</view> </view>
</view> </view>
</view> </view>
<!-- 提示弹窗 --> <!-- 提示弹窗 -->
<popup-tip v-if="isTip" type="2" @statusChange="onBabyChange" @close="isTip = false"></popup-tip> <popup-tip v-if="isTip" type="2" @statusChange="onBabyChange" @close="isTip = false"></popup-tip>
<!-- 使用封装后的日期选择器组件 --> <!-- 使用封装后的日期选择器组件 -->
<DatePicker v-model:visible="visible" :default-date="time" @confirm="handleDateConfirm" /> <DatePicker v-model:visible="visible" :default-date="time" @confirm="handleDateConfirm"
/>
</view> </view>
</view> </view>
</template> </template>
...@@ -127,7 +128,8 @@ import { ...@@ -127,7 +128,8 @@ import {
ref, ref,
getCurrentInstance, getCurrentInstance,
onMounted, onMounted,
nextTick nextTick,
watch
} from 'vue' } from 'vue'
import { import {
onLoad, onLoad,
...@@ -193,6 +195,7 @@ const visible = ref(false) ...@@ -193,6 +195,7 @@ const visible = ref(false)
// 时间 // 时间
const time = ref('') const time = ref('')
const isClickClose = ref(false)
// 保存要修改的id // 保存要修改的id
const editId = ref(null) const editId = ref(null)
...@@ -258,7 +261,7 @@ const backHandler = () => { ...@@ -258,7 +261,7 @@ const backHandler = () => {
const handleBannerClick = (item, index) => { const handleBannerClick = (item, index) => {
console.log(item) console.log(item)
let buttonName = ''; let buttonName = '';
switch(index){ switch (index) {
case 0: case 0:
buttonName = '第一张焦点图'; buttonName = '第一张焦点图';
break; break;
...@@ -285,7 +288,7 @@ const handleBannerClick = (item, index) => { ...@@ -285,7 +288,7 @@ const handleBannerClick = (item, index) => {
}) })
} }
} }
// 新增体检 // 新增体检
const onAdd = () => { const onAdd = () => {
...@@ -306,7 +309,14 @@ const onBtn = (type) => { ...@@ -306,7 +309,14 @@ const onBtn = (type) => {
switch (type) { switch (type) {
case 0: case 0:
// 如果授权就不弹出提醒 // 如果授权就不弹出提醒
showPicker.value = isWxNotification.value ? true : false showPicker.value = isWxNotification.value ? true : false
if (showPicker.value) {
md.sensorPopLogTake({
xcxPopExposure: "true",
toolName: "产检提醒",
popName: "设置提醒时间弹窗"
});
}
buttonName = '提醒' buttonName = '提醒'
break; break;
...@@ -334,8 +344,17 @@ const onBtn = (type) => { ...@@ -334,8 +344,17 @@ const onBtn = (type) => {
} }
// 提醒关闭 // 提醒关闭
const close = () => { const close = (type) => {
if (type !== 'nonePop') {
md.sensorPopLogTake({
xcxPopClick: "true",
toolName: "产检提醒",
popName: "设置提醒时间弹窗",
buttonName: "取消"
});
}
showPicker.value = false; showPicker.value = false;
} }
// 选择提醒事件 // 选择提醒事件
const handleChange = (e) => { const handleChange = (e) => {
...@@ -343,10 +362,15 @@ const handleChange = (e) => { ...@@ -343,10 +362,15 @@ const handleChange = (e) => {
} }
// 确认选择 // 确认选择
const handleConfirm = () => { const handleConfirm = () => {
md.sensorPopLogTake({
xcxPopClick: "true",
toolName: "产检提醒",
popName: "设置提醒时间弹窗",
buttonName: "确认"
});
selectedValue.value = options[pickerValue.value].id; selectedValue.value = options[pickerValue.value].id;
console.log(selectedValue.value, homeInfo.value.wxTemplateId, babyId.value) console.log(selectedValue.value, homeInfo.value.wxTemplateId, babyId.value)
close(); close("nonePop");
// 订阅提醒 // 订阅提醒
uni.requestSubscribeMessage({ uni.requestSubscribeMessage({
tmplIds: [homeInfo.value.wxTemplateId], tmplIds: [homeInfo.value.wxTemplateId],
...@@ -359,7 +383,19 @@ const handleConfirm = () => { ...@@ -359,7 +383,19 @@ const handleConfirm = () => {
} }
}) })
} }
watch(visible, (newVal) => {
if (!newVal) {
if (isClickClose.value) {
return
}
md.sensorPopLogTake({
xcxPopClick: "true",
toolName: "产检提醒",
popName: "选择产检时间弹窗",
buttonName: "取消"
});
}
})
// 编辑时间 // 编辑时间
const onEdit = (id, newTime) => { const onEdit = (id, newTime) => {
md.sensorLogTake({ md.sensorLogTake({
...@@ -372,45 +408,61 @@ const onEdit = (id, newTime) => { ...@@ -372,45 +408,61 @@ const onEdit = (id, newTime) => {
time.value = newTime time.value = newTime
visible.value = true visible.value = true
editId.value = id editId.value = id
isClickClose.value = false
md.sensorPopLogTake({
xcxPopExposure: "true",
toolName: "产检提醒",
popName: "选择产检时间弹窗"
});
} }
// 选择日期回调确认 // 选择日期回调确认
const handleDateConfirm = (date) => { const handleDateConfirm = (date) => {
console.log('选择的日期是:', date); console.log('选择的日期是:', date);
time.value = date; time.value = date;
console.log(editId.value, time.value) console.log(editId.value, time.value)
onEditTime() onEditTime()
isClickClose.value = true
md.sensorPopLogTake({
xcxPopClick: "true",
toolName: "产检提醒",
popName: "选择产检时间弹窗",
buttonName: "确认"
});
} }
// 添加计算滚动位置的方法 // 添加计算滚动位置的方法
const scrollToCurrentWeek = async () => { const scrollToCurrentWeek = async () => {
// 确保数据已加载 // 确保数据已加载
if (!homeInfo.value || !homeInfo.value.gestationalWeeks || !homeInfo.value.checkupList) return; if (!homeInfo.value || !homeInfo.value.gestationalWeeks || !homeInfo.value.checkupList) return;
// 找到当前孕周对应的产检项 // 找到当前孕周对应的产检项
const currentItem = homeInfo.value.checkupList.find( const currentItem = homeInfo.value.checkupList.find(
item => item.pregnancyWeek == homeInfo.value.gestationalWeeks item => item.pregnancyWeek == homeInfo.value.gestationalWeeks
); );
if (!currentItem) return; if (!currentItem) return;
// 等待DOM更新 // 等待DOM更新
await nextTick(); await nextTick();
// 创建选择器查询 // 创建选择器查询
const query = uni.createSelectorQuery().in(proxy); const query = uni.createSelectorQuery().in(proxy);
query.select(`.item-${currentItem.index}`).boundingClientRect(); query.select(`.item-${currentItem.index}`).boundingClientRect();
query.select('.postnatal-con-record').boundingClientRect(); query.select('.postnatal-con-record').boundingClientRect();
query.exec((rects) => { query.exec((rects) => {
if (!rects[0] || !rects[1]) return; if (!rects[0] || !rects[1]) return;
const [itemRect, containerRect] = rects; const [itemRect, containerRect] = rects;
// 计算元素在容器内的相对位置 // 计算元素在容器内的相对位置
const position = itemRect.top - containerRect.top; const position = itemRect.top - containerRect.top;
// 设置滚动位置(增加20px的缓冲距离) // 设置滚动位置(增加20px的缓冲距离)
scrollTop.value = position + 20; scrollTop.value = position + 20;
}); });
}; };
// 保存订阅消息 // 保存订阅消息
const getWxNotificationFn = async (notificationDate, wxTemplateId, babyId) => { const getWxNotificationFn = async (notificationDate, wxTemplateId, babyId) => {
...@@ -464,16 +516,16 @@ const getInfoFn = async () => { ...@@ -464,16 +516,16 @@ const getInfoFn = async () => {
uni.setStorageSync('dueDate', data.dueDate) uni.setStorageSync('dueDate', data.dueDate)
// 新增:调用滚动方法 // 新增:调用滚动方法
scrollToCurrentWeek() scrollToCurrentWeek()
} else { } else {
uni.showToast({ uni.showToast({
title: message, title: message,
icon: "none", icon: "none",
}); });
} }
} }
// 获取banner图 // 获取banner图
...@@ -495,43 +547,43 @@ const getSettingFn = () => { ...@@ -495,43 +547,43 @@ const getSettingFn = () => {
success(res) { success(res) {
// console.log(res.authSetting, '授权信息') // console.log(res.authSetting, '授权信息')
console.log(res.subscriptionsSetting, '订阅信息') console.log(res.subscriptionsSetting, '订阅信息')
if(res.subscriptionsSetting.itemSettings){ if (res.subscriptionsSetting.itemSettings) {
isWxNotification.value = false isWxNotification.value = false
console.log("🚀 ~ success ~ isWxNotification111:", isWxNotification.value) console.log("🚀 ~ success ~ isWxNotification111:", isWxNotification.value)
} else { } else {
isWxNotification.value = true isWxNotification.value = true
console.log("🚀 ~ success ~ isWxNotification222:", isWxNotification.value) console.log("🚀 ~ success ~ isWxNotification222:", isWxNotification.value)
} }
} }
}) })
} }
// 提示弹窗回调 // 提示弹窗回调
const onBabyChange= ()=>{ const onBabyChange = () => {
publicFn() publicFn()
} }
// 公共函数 // 公共函数
const publicFn = () => { const publicFn = () => {
console.log("🚀 ~ onShow ~ userStore:", userStore.babyInfo) console.log("🚀 ~ onShow ~ userStore:", userStore.babyInfo)
const babyInfo = userStore.babyInfo const babyInfo = userStore.babyInfo
if(babyInfo && babyInfo.babyStage == 1){ if (babyInfo && babyInfo.babyStage == 1) {
isTip.value = false isTip.value = false
babyId.value = userStore.babyInfo?.content?.id babyId.value = userStore.babyInfo?.content?.id
getSettingFn() getSettingFn()
// 获取banner图 // 获取banner图
postnatalJSONFn() postnatalJSONFn()
// 获取信息 // 获取信息
getInfoFn() getInfoFn()
} else{ } else {
isTip.value = true isTip.value = true
} }
} }
onShow(async () => { onShow(async () => {
await userStore.loadBabyInfo() await userStore.loadBabyInfo()
console.log('宝宝信息加载完成:', userStore.babyInfo) console.log('宝宝信息加载完成:', userStore.babyInfo)
publicFn() publicFn()
}) })
onMounted(() => { onMounted(() => {
isClickClose.value = false
md.sensorLogTake({ md.sensorLogTake({
xcxPage: "小程序页面浏览事件", xcxPage: "小程序页面浏览事件",
pageName: "产检提醒首页" pageName: "产检提醒首页"
...@@ -561,8 +613,9 @@ onMounted(() => { ...@@ -561,8 +613,9 @@ onMounted(() => {
align-items: center; align-items: center;
margin-top: 50rpx; margin-top: 50rpx;
font-weight: 500; font-weight: 500;
flex-shrink: 0; flex-shrink: 0;
height: 32rpx; height: 32rpx;
.info-c { .info-c {
width: 2rpx; width: 2rpx;
height: 22rpx; height: 22rpx;
...@@ -582,7 +635,8 @@ onMounted(() => { ...@@ -582,7 +635,8 @@ onMounted(() => {
display: flex; display: flex;
justify-content: space-between; justify-content: space-between;
margin-bottom: 30rpx; margin-bottom: 30rpx;
flex-shrink: 0; flex-shrink: 0;
.btn-item { .btn-item {
display: flex; display: flex;
align-items: center; align-items: center;
...@@ -813,6 +867,7 @@ onMounted(() => { ...@@ -813,6 +867,7 @@ onMounted(() => {
height: 177rpx; height: 177rpx;
border-radius: 12rpx; border-radius: 12rpx;
overflow: hidden; overflow: hidden;
.banner-img { .banner-img {
width: 100%; width: 100%;
height: 100%; height: 100%;
......
...@@ -459,11 +459,14 @@ const onRemind = () => { ...@@ -459,11 +459,14 @@ const onRemind = () => {
} }
// 如果授权就不弹出提醒 // 如果授权就不弹出提醒
showPicker.value = isWxNotification.value ? true : false showPicker.value = isWxNotification.value ? true : false
} }
// 提醒关闭 // 提醒关闭
const close = () => { const close = () => {
showPicker.value = false; showPicker.value = false;
} }
// 选择提醒事件 // 选择提醒事件
...@@ -472,6 +475,7 @@ const handleChange = (e) => { ...@@ -472,6 +475,7 @@ const handleChange = (e) => {
} }
// 确认选择 // 确认选择
const handleConfirm = () => { const handleConfirm = () => {
selectedValue.value = options[pickerValue.value].id; selectedValue.value = options[pickerValue.value].id;
console.log(selectedValue.value, infoData.value.wxTemplateId, babyId.value) console.log(selectedValue.value, infoData.value.wxTemplateId, babyId.value)
close(); close();
......
...@@ -380,6 +380,11 @@ const showDatePicker = () => { ...@@ -380,6 +380,11 @@ const showDatePicker = () => {
}); });
console.log('显示日期选择器') console.log('显示日期选择器')
md.sensorPopLogTake({
xcxPopExposure: "true",
toolName: "生长曲线",
popName: "选择本次测评日期弹窗"
});
showDatePickerPopup.value = true showDatePickerPopup.value = true
} }
......
...@@ -58,8 +58,13 @@ class ExposureTracker { ...@@ -58,8 +58,13 @@ class ExposureTracker {
const isVisible = this.isElementInViewport(res, scrollTop); const isVisible = this.isElementInViewport(res, scrollTop);
if (isVisible && !value.isExposed) { if (isVisible && !value.isExposed) {
value.isExposed = true; value.isExposed = true;
// 触发埋点 // 触发埋点
md.sensorLogTake(value.logParams); if(value.logParams.xcxComponentExposure){
md.sensorComponentLogTake(value.logParams);
}else{
md.sensorLogTake(value.logParams);
}
} }
}); });
}); });
......
This diff is collapsed.
This diff is collapsed.
...@@ -1769,8 +1769,20 @@ import ShengriliTipPanel from '../components/quanyi/shengriliTipPanel.vue'; ...@@ -1769,8 +1769,20 @@ import ShengriliTipPanel from '../components/quanyi/shengriliTipPanel.vue';
} }
hideLoading(); hideLoading();
initExposure();
}); });
const initExposure = () => {
imgInfos.value.forEach((item, index) => {
md.sensorComponentLogTake({
xcxComponentExposure: "true",
pageName: "积分服务页",
componentName: "会员权益",
componentContent: "会员权益-" + item.name
});
});
}
const initNetData = () => { const initNetData = () => {
console.log('initNetData'); console.log('initNetData');
...@@ -2147,7 +2159,12 @@ import ShengriliTipPanel from '../components/quanyi/shengriliTipPanel.vue'; ...@@ -2147,7 +2159,12 @@ import ShengriliTipPanel from '../components/quanyi/shengriliTipPanel.vue';
pageName: "积分服务页-首屏", pageName: "积分服务页-首屏",
buttonName: `${item.name}`, buttonName: `${item.name}`,
}); });
md.sensorComponentLogTake({
xcxComponentClick: "true",
pageName: "积分服务页",
componentName: "会员权益",
componentContent: "会员权益-" + item.name
});
console.log('selectIdx.value=', selectIdx.value); console.log('selectIdx.value=', selectIdx.value);
// const url = vipQuanyiUrl.value.url; // const url = vipQuanyiUrl.value.url;
......
This diff is collapsed.
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment