Commit 67e3f569 authored by 张九刚's avatar 张九刚

feat: copyback

parent d177b5a6
......@@ -3,20 +3,11 @@
<view class="popup-content" @click.stop>
<!-- 喂养方式列表 -->
<view class="feed-list">
<view
v-for="(item, index) in feedOptions"
:key="index"
class="feed-item"
:class="{ selected: selectedIndex === index }"
@click="selectFeed(index)"
>
<view v-for="(item, index) in feedOptions" :key="index" class="feed-item"
:class="{ selected: selectedIndex === index }" @click="selectFeed(index)">
<!-- 选中背景 -->
<image
v-if="selectedIndex === index"
class="feed-item-bg"
:src="`${$baseUrl}shengzhangTool/1001/changeFeed/itemBg.png`"
mode="aspectFit"
/>
<image v-if="selectedIndex === index" class="feed-item-bg"
:src="`${$baseUrl}shengzhangTool/1001/changeFeed/itemBg.png`" mode="aspectFit" />
<!-- 喂养方式文本 -->
<text class="feed-text">{{ item.name }}</text>
......@@ -25,30 +16,21 @@
<!-- 底部按钮 -->
<view class="bottom-buttons">
<image
class="cancel-btn"
:class="{'cancel-btn-active': isCancelPressed}"
<image class="cancel-btn" :class="{ 'cancel-btn-active': isCancelPressed }"
:src="`${$baseUrl}shengzhangTool/1001/changeFeed/cancelBtn.png`"
@touchstart="handleCancelTouchStart"
@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"
/>
@touchstart="handleCancelTouchStart" @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" />
</view>
</view>
</view>
</template>
<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({
visible: {
......@@ -109,12 +91,18 @@ const handleOkTouchStart = () => {
const handleOkTouchEnd = () => {
isOkPressed.value = false
md.sensorPopLogTake({
xcxPopClick: "true",
toolName: "生长曲线",
popName: "喂养方式选择弹窗",
buttonName: "确认"
});
const index = selectIndex.value
const selectedFeed = feedOptions.value[index]
// 发送事件通知主页面
emit('change', selectedFeed, index)//只能传一个参数
closePopup()
}
......@@ -139,10 +127,23 @@ const onFeedChange = (feedOption, index) => {
}
const closePopup = () => {
md.sensorPopLogTake({
xcxPopClick: "true",
toolName: "生长曲线",
popName: "喂养方式选择弹窗",
buttonName: "取消"
});
emit('update:visible', false)
}
onMounted(() => {
watch(() => props.visible, (newVal) => {
if (newVal) {
md.sensorPopLogTake({
xcxPopExposure: "true",
toolName: "生长曲线",
popName: "喂养方式选择弹窗"
});
}
})
</script>
......@@ -270,4 +271,3 @@ onMounted(() => {
}
}
</style>
......@@ -67,6 +67,7 @@
<script setup>
import { ref, defineEmits, defineProps, onMounted } from 'vue'
import { useUserStore } from "@/stores/user";
import md from '../md.js'
// const props = defineProps({
// visible: {
......@@ -104,6 +105,12 @@ const handleOkTouchStart = () => {
}
const handleOkTouchEnd = async () => {
md.sensorPopLogTake({
xcxPopClick: "true",
toolName: "生长曲线",
popName: "切换宝宝弹窗",
buttonName: "确认"
});
isOkPressed.value = false
const index = selectIndex.value;
......@@ -116,11 +123,23 @@ const handleOkTouchEnd = async () => {
}
const closePopup = () => {
md.sensorPopLogTake({
xcxPopClick: "true",
toolName: "生长曲线",
popName: "切换宝宝弹窗",
buttonName: "关闭"
});
emit('update:visible', false)
}
const selectIndex = ref(0)
const selectBaby = (index) => {
md.sensorPopLogTake({
xcxPopClick: "true",
toolName: "生长曲线",
popName: "切换宝宝弹窗",
buttonName: "宝宝列表"
});
selectIndex.value = index;
emit('update:selectedIndex', index);
}
......@@ -135,6 +154,11 @@ onMounted(() => {
const selectedIndexInList = babyList.value.findIndex(item => item.selected === true)
console.log('选中宝宝的索引:', selectedIndexInList)
selectIndex.value = selectedIndexInList;
md.sensorPopLogTake({
xcxPopExposure: "true",
toolName: "生长曲线",
popName: "切换宝宝弹窗"
});
})
......
......@@ -27,7 +27,8 @@
</template>
<script setup>
import { ref, defineEmits, defineProps } from 'vue'
import { ref, defineEmits, defineProps,watch } from 'vue'
import md from '../md.js'
const props = defineProps({
visible: {
......@@ -67,11 +68,27 @@ const handleOkTouchStart = () => {
const handleOkTouchEnd = () => {
isOkPressed.value = false
closePopup()
md.sensorPopLogTake({
xcxPopClick: "true",
toolName: "生长曲线",
popName: "测量方式提示弹窗",
buttonName: "我知道了"
});
}
const closePopup = () => {
emit('update:visible', false)
}
watch(() => props.visible, (newVal) => {
if (newVal) {
md.sensorPopLogTake({
xcxPopExposure: "true",
toolName: "生长曲线",
popName: "测量方式提示弹窗"
});
}
})
</script>
<style lang="less" scoped>
......
......@@ -65,7 +65,8 @@
</template>
<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({
visible: {
......@@ -107,6 +108,9 @@ const yearRange = computed(() => {
return yearRange
})
onMounted(() => {
})
// 生成月份范围 (1-12)
const monthRange = computed(() => {
......@@ -252,6 +256,12 @@ const handleOkTouchEnd = () => {
}
const closePopup = () => {
md.sensorPopLogTake({
xcxPopClick: "true",
toolName: "生长曲线",
popName: "选择本次测评日期弹窗",
buttonName: "关闭"
});
// 格式化日期为 YYYY-MM-DD
const year = currentDate.value.getFullYear()
const month = String(currentDate.value.getMonth() + 1).padStart(2, '0')
......
......@@ -25,7 +25,8 @@
</template>
<script setup>
import { defineProps, defineEmits } from 'vue'
import { defineProps, defineEmits,watch } from 'vue'
import md from '../md.js'
// 定义props
const props = defineProps({
......@@ -40,8 +41,24 @@ const emit = defineEmits(['close'])
// 关闭弹窗
const closePopup = () => {
md.sensorPopLogTake({
xcxPopClick: "true",
toolName: "生长曲线",
popName: "生长曲线介绍弹窗",
buttonName: "我知道了"
});
emit('close')
}
watch(() => props.visible, (newVal) => {
if (newVal) {
md.sensorPopLogTake({
xcxPopExposure: "true",
toolName: "生长曲线",
popName: "生长曲线介绍弹窗"
});
}
})
</script>
<style lang="less" scoped>
......
......@@ -135,6 +135,49 @@ const sensorComponentLogTake = (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 {
init,
sensors,
......@@ -143,4 +186,6 @@ export default {
sensorLogTake,
sensorComponentLog,
sensorComponentLogTake,
sensorPopLog,
sensorPopLogTake,
};
......@@ -1885,6 +1885,12 @@ async function completeRecord() {
// 显示成功弹窗
successPopup.value.open()
md.sensorPopLogTake({
xcxPopExposure: "true",
toolName: "喂养记录",
popName: "添加成功弹窗"
});
......@@ -2406,6 +2412,7 @@ function showAddFoodPopup(categoryName) {
pageName: "喂养工具首页",
buttonName: "辅食添加" + categoryName,
});
// 防连点检查
if (foodSelectionState.value.isAddingFood) {
console.log('防连点:添加辅食按钮被阻止')
......@@ -2439,7 +2446,11 @@ function showAddFoodPopup(categoryName) {
foodSelectionState.value.newFoodItem = ''
// 显示弹窗
addFoodPopup.value.open()
md.sensorPopLogTake({
xcxPopExposure: "true",
toolName: "喂养记录",
popName: "新增辅食弹窗",
});
// 立即重置防连点状态(弹窗显示后)
setTimeout(() => {
foodSelectionState.value.isAddingFood = false
......@@ -2458,6 +2469,12 @@ function toggleCategoryExpansion(categoryName) {
function cancelAddFood() {
addFoodPopup.value.close()
foodSelectionState.value.newFoodItem = ''
md.sensorPopLogTake({
xcxPopClick: "true",
toolName: "喂养记录",
popName: "新增辅食弹窗",
buttonName: "取消"
});
}
function confirmAddFood() {
......@@ -2465,6 +2482,12 @@ function confirmAddFood() {
console.log('防连点:添加辅食按钮被阻止')
return
}
md.sensorPopLogTake({
xcxPopClick: "true",
toolName: "喂养记录",
popName: "新增辅食弹窗",
buttonName: "添加"
});
foodSelectionState.value.isAddingFood = true
console.log('防连点:设置添加辅食状态为true')
......@@ -3246,7 +3269,11 @@ async function startPollingRecognitionResult(taskId) {
voiceRecognitionState.value.voiceDateTime = `${year}-${month}-${day} ${hours}:${minutes}:00`
}
voiceRecognitionState.value.showResultPage = true
md.sensorPopLogTake({
xcxPopExposure: "true",
toolName: "喂养记录",
popName: "语音识别结果弹窗"
});
// 显示识别成功提示
uni.showToast({
title: '语音识别成功',
......@@ -3402,7 +3429,12 @@ function formatRecordingDuration(seconds) {
function reRecognize() {
console.log('重新识别...')
md.sensorPopLogTake({
xcxPopClick: "true",
toolName: "喂养记录",
popName: "语音识别结果弹窗",
buttonName: "不对,重新识别"
});
// 清理轮询状态
clearPollingInterval()
......@@ -3429,6 +3461,12 @@ async function completeVoiceRecord() {
if (isSubmitting.value) {
return
}
md.sensorPopLogTake({
xcxPopClick: "true",
toolName: "喂养记录",
popName: "语音识别结果弹窗",
buttonName: "完成记录"
});
const detailText = voiceRecognitionState.value.recognizedText.trim()
......@@ -3486,6 +3524,11 @@ async function completeVoiceRecord() {
// 显示成功弹窗
successPopup.value.open()
md.sensorPopLogTake({
xcxPopExposure: "true",
toolName: "喂养记录",
popName: "添加成功弹窗"
});
} catch (error) {
console.error('保存语音记录失败:', error)
// uni.hideLoading()
......@@ -3543,11 +3586,23 @@ async function onSuccessJump() {
},
}); // 关闭弹窗
successPopup.value.close()
md.sensorPopLogTake({
xcxPopClick: "true",
toolName: "喂养记录",
popName: "添加成功弹窗",
buttonName: "关闭"
});
}
function onSuccessClose() {
// 关闭弹窗
successPopup.value.close()
md.sensorPopLogTake({
xcxPopClick: "true",
toolName: "喂养记录",
popName: "添加成功弹窗",
buttonName: "咨询专家"
});
// 跳转至记录页面
uni.navigateTo({
url: '/pages/feedingRecord/feedingRecord'
......
......@@ -723,9 +723,21 @@ function editRecord(index) {
editingRecord.value = { index, record }
showEditPopup.value = true
md.sensorPopLogTake({
xcxPopExposure: "true",
toolName: "喂养记录",
popName: "日历页确认修改内容弹窗"
});
}
function closeEditPopup() {
md.sensorPopLogTake({
xcxPopClick: "true",
toolName: "喂养记录",
popName: "日历页确认修改内容弹窗",
buttonName: "取消"
});
showEditPopup.value = false
editingRecord.value = null
editForm.value = { time: '', type: '', content: '' }
......@@ -800,6 +812,12 @@ function onEditTypeChange(event) {
}
async function saveEditRecord() {
md.sensorPopLogTake({
xcxPopClick: "true",
toolName: "喂养记录",
popName: "日历页确认修改内容弹窗",
buttonName: "保存修改"
});
if (!editForm.value.time || !editForm.value.type) {
uni.showToast({ title: '请填写完整信息', icon: 'none' })
return
......
......@@ -11,10 +11,10 @@
<view class="page_title">产检提醒</view>
</view>
</template>
</customize-navigation> -->
</customize-navigation> -->
<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">
<image class="banner-img" :src="`${item.img}`" mode="aspectFill"
@click="handleBannerClick(item, index)" />
......@@ -258,7 +258,7 @@ const backHandler = () => {
const handleBannerClick = (item, index) => {
console.log(item)
let buttonName = '';
switch(index){
switch (index) {
case 0:
buttonName = '第一张焦点图';
break;
......@@ -307,6 +307,13 @@ const onBtn = (type) => {
case 0:
// 如果授权就不弹出提醒
showPicker.value = isWxNotification.value ? true : false
if (showPicker.value) {
md.sensorPopLogTake({
xcxPopExposure: "true",
toolName: "产检提醒",
popName: "设置提醒时间弹窗"
});
}
buttonName = '提醒'
break;
......@@ -336,6 +343,12 @@ const onBtn = (type) => {
// 提醒关闭
const close = () => {
showPicker.value = false;
md.sensorPopLogTake({
xcxPopClick: "true",
toolName: "产检提醒",
popName: "设置提醒时间弹窗",
buttonName: "取消"
});
}
// 选择提醒事件
const handleChange = (e) => {
......@@ -495,7 +508,7 @@ const getSettingFn = () => {
success(res) {
// console.log(res.authSetting, '授权信息')
console.log(res.subscriptionsSetting, '订阅信息')
if(res.subscriptionsSetting.itemSettings){
if (res.subscriptionsSetting.itemSettings) {
isWxNotification.value = false
console.log("🚀 ~ success ~ isWxNotification111:", isWxNotification.value)
} else {
......@@ -506,14 +519,14 @@ const getSettingFn = () => {
})
}
// 提示弹窗回调
const onBabyChange= ()=>{
const onBabyChange = () => {
publicFn()
}
// 公共函数
const publicFn = () => {
console.log("🚀 ~ onShow ~ userStore:", userStore.babyInfo)
const babyInfo = userStore.babyInfo
if(babyInfo && babyInfo.babyStage == 1){
if (babyInfo && babyInfo.babyStage == 1) {
isTip.value = false
babyId.value = userStore.babyInfo?.content?.id
getSettingFn()
......@@ -521,7 +534,7 @@ const publicFn = () => {
postnatalJSONFn()
// 获取信息
getInfoFn()
} else{
} else {
isTip.value = true
}
}
......@@ -563,6 +576,7 @@ onMounted(() => {
font-weight: 500;
flex-shrink: 0;
height: 32rpx;
.info-c {
width: 2rpx;
height: 22rpx;
......@@ -583,6 +597,7 @@ onMounted(() => {
justify-content: space-between;
margin-bottom: 30rpx;
flex-shrink: 0;
.btn-item {
display: flex;
align-items: center;
......@@ -813,6 +828,7 @@ onMounted(() => {
height: 177rpx;
border-radius: 12rpx;
overflow: hidden;
.banner-img {
width: 100%;
height: 100%;
......
......@@ -459,11 +459,14 @@ const onRemind = () => {
}
// 如果授权就不弹出提醒
showPicker.value = isWxNotification.value ? true : false
}
// 提醒关闭
const close = () => {
showPicker.value = false;
}
// 选择提醒事件
......@@ -472,6 +475,7 @@ const handleChange = (e) => {
}
// 确认选择
const handleConfirm = () => {
selectedValue.value = options[pickerValue.value].id;
console.log(selectedValue.value, infoData.value.wxTemplateId, babyId.value)
close();
......
......@@ -380,6 +380,11 @@ const showDatePicker = () => {
});
console.log('显示日期选择器')
md.sensorPopLogTake({
xcxPopExposure: "true",
toolName: "生长曲线",
popName: "选择本次测评日期弹窗"
});
showDatePickerPopup.value = true
}
......
......@@ -274,7 +274,8 @@
<view id="fourthScreen" class="bottomlink">
<image class="bottombg" :src="$baseUrl + 'homepage/bottombg.png'"></image>
<view class="box">
<image class="icon" :id="'bottomLink' + index" v-for="(icon, index) in bottomLinkList" :key="index" :data-log="{
<image class="icon" :id="'bottomLink' + index" v-for="(icon, index) in bottomLinkList" :key="index"
:data-log="{
xcxClick: '首页-四屏页面点击',
pageName: '首页-四屏',
buttonName: `${qrNameList[index]}`
......@@ -566,7 +567,7 @@ export default {
md.sensorComponentLogTake({
xcxComponentExposure: "true",
pageName: "首页",
componentName: "焦点图",
componentName: "首页banner",
componentContent: this.swiperList[0]?.title || ''
});
......@@ -705,8 +706,7 @@ export default {
jumpLink(link, videoUrl, index, evt) {
if (evt) {
md.sensorLog(evt);
if(evt.currentTarget.dataset.comlog)
{
if (evt.currentTarget.dataset.comlog) {
md.sensorComponentLog(evt);
}
}
......@@ -890,7 +890,7 @@ export default {
md.sensorComponentLogTake({
xcxComponentExposure: "true",
pageName: "首页",
componentName: "焦点图",
componentName: "首页banner",
componentContent: this.swiperList[e.detail.current].title
});
},
......@@ -1003,6 +1003,12 @@ export default {
},
imagePopupJump() {
md.sensorPopLogTake({
xcxPopClick: "true",
toolName: "首页",
popName: this.popupImageObj.title || "北纬47°鲜活溯源之旅",
buttonName: this.popupImageObj.btnName || "立即寻宝"
});
jump({
type: this.popupImageObj.jumpType,
url: this.popupImageObj.jumpUrl,
......@@ -1010,6 +1016,11 @@ export default {
});
},
showImagePopup() {
md.sensorPopLogTake({
xcxPopExposure: "true",
toolName: "首页",
popName: this.popupImageObj.title || "北纬47°鲜活溯源之旅"
});
this.$refs.imagePopup.open('center');
},
closePop1() {
......
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