You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

584 lines
17 KiB

<script setup>
import moment from "moment";
import QrcodeVue from "qrcode.vue";
import { toClipboard } from "@soerenmartius/vue3-clipboard";
import { ref, computed, onBeforeMount } from "vue";
import { useRoute, useRouter } from "vue-router";
import { useUserStore } from '@/store/user';
import { showToast, showSuccessToast, showConfirmDialog } from "vant";
import 'vant/es/toast/style';
import { Dialog } from "vant";
import { login, bindCard, getMovie, getMarquee } from "@/api";
import noUserImg from '@/assets/images/upload.jpg'
const router = useRouter();
const route = useRoute();
const userStore = useUserStore();
const showShare = ref(false);
const showNfcQrcode = ref(false);
const checked = ref(true);
const imageUrl = ref(import.meta.env.VITE_APP_BASE_URL);
const is_due = ref(false);
onBeforeMount(async () => {
const liff = window.liff;
try {
if (!liff.isLoggedIn()) liff.login({ redirectUri: window.location.href });
} catch (err) {
console.log(`liff.state init error ${err}`);
showToast("登入失敗。請聯絡管理員");
router.push("/login");
}
if (!sessionStorage.getItem("token")) {
const profile = await liff.getProfile();
const id_token = liff.getIDToken();
let loginRes = await login({ line_id: profile.userId, token: id_token });
if (loginRes.code === 200) {
if (route.query.act === "openright") {
showToast("您已經是本站會員");
}
sessionStorage.setItem("token", loginRes.data.token);
sessionStorage.setItem("uid", loginRes.data.uid);
} else if (loginRes.code === 202) {
if (route.query.act === "openright") {
if (route.query.verify) {
//詢問是否綁定
Dialog.confirm({
title: "卡片綁定",
message: "確認是否綁定這張卡片",
})
.then(async () => {
//確認綁定
let bindRes = await bindCard({
uid: loginRes.data.uid,
verify: route.query.verify,
});
if (bindRes.code === 200) {
showSuccessToast("綁定成功");
} else {
showToast.fail("綁定失敗");
}
})
.catch(() => { });
}
}
sessionStorage.setItem("token", loginRes.data.token);
sessionStorage.setItem("uid", loginRes.data.uid);
} else if (loginRes.code === 201) {
if (route.query.act === "openright") {
if (route.query.verify) {
router.push({
path: "/register",
query: {
verify: route.query.verify,
},
});
return;
}
} else if (route.query.aid) {
router.push({
path: "/register",
query: {
aid: route.query.aid,
},
});
return;
} else {
showToast("請先註冊成為本站會員");
return router.push({
path: "/register",
query: { refer: route.query.refer },
});
}
} else {
showToast("登入失敗。請聯絡管理員");
router.push("/login");
}
}
await userStore.getUserData();
handleAD();
});
/**
* title : 首頁廣告
* fixed : wayne
* date : 2023/10/26
*/
const noticeData = ref([]);
const adData = ref({});
const noticeClick = (num) => {
let url = noticeData.value[num].ad_link;
window.open(url, "_blank");
};
const handleAD = async () => {
if(userInfo.value.status === 1){
return;
}
let res;
res = await getMarquee();
if (res.code === 200) {
noticeData.value = res.data;
}
res = await getMovie();
if (res.code === 200) {
adData.value = res.data;
if (sessionStorage.getItem("isAdShow") == null) {
popShow.value = true;
}
}
};
// sessionStorage.setItem("isAdShow",false);
const popShow = ref(false);
const modalClose = ref(false);
const closeShow = () => {
sessionStorage.setItem("isAdShow", userInfo.value.level_name);
modalClose.value = true;
};
// 使用computed, 因為不能確認userInfo.value.is_send_ad是否有得到
// const adSwitchStatus = ref(Boolean(userInfo.value.is_send_ad));
const adSwitchStatus = computed(() => {
return Boolean(userInfo.value.is_send_ad);
});
const onUpdateValue = (newValue) => {
showConfirmDialog({
title: "提醒確認",
message: "是否切換開關?",
confirmButtonText: "確認",
cancelButtonText: "取消",
}).then(() => {
let res = userStore.setSendWithAd(newValue)
}).catch(() => {
// on cancel
});
};
const userInfo = computed(() => {
return userStore.userData;
});
const nfcurl = computed(() => {
return encodeURI(userStore.userData.ufcurl);
});
const overdue = computed(() => {
if (userStore.userData.overdue_time > 0) {
return moment
.unix(userStore.userData.overdue_time)
.format("YYYY-MM-DD");
} else {
return "無期限";
}
});
const goCardEdit = () => {
// if (userInfo.value.nc_type < 2) {
if (userInfo.value.level < 2) {
router.push("/card/notice");
} else {
router.push("/card/edit");
}
};
const onSelect = (option) => {
showToast(option.name);
showShare.value = false;
};
const handleShowNfc = () => {
showNfcQrcode.value = true;
};
const doCopy = () => {
toClipboard(userInfo.value.nfcurl);
showToast("已放入剪貼簿");
};
const doCopyUid = () => {
toClipboard(userInfo.value.user_id);
showToast("已放入剪貼簿");
};
const doShare = () => {
toClipboard(`https://liff.line.me/${import.meta.env.VITE_APP_LINE_LIFF_ID}/?aid=${userInfo.value.user_id}`)
showToast("已放入剪貼簿");
};
const bindTggo = () => {
if (userInfo.value.uniqid) {
let url = `https://www.tggo.com.tw/u.cgi?&mnm=mybinding&ncode=${userInfo.value.uniqid}&name=${userInfo.value.real_name}&openExternalBrowser=1`;
window.open(url, "_blank");
return;
}
showToast('您的帳號尚未綁定感應卡');
};
const handleLogout = () => {
if (liff.isLoggedIn()) {
liff.logout();
}
sessionStorage.removeItem("token");
sessionStorage.removeItem("uid");
sessionStorage.removeItem("isAdShow");
router.push("/login");
};
</script>
<template>
<div class="home page" v-cloak>
<van-nav-bar class="bg-darkBlue py-3">
<template #title>
<h4 class="text-white mb-1"><strong>UTEL電子名片系統</strong></h4>
<a href="javascript:;">
<h5 class="text-gray">歡迎來到會員中心</h5>
</a>
</template>
<template #right>
<div class="btn btn-sm text-skyBlue" @click="handleLogout">
<h4><i class="fa fa-sign-out" aria-hidden="true"></i></h4>
</div>
</template>
</van-nav-bar>
<!-- START: 跑馬燈 -->
<template v-if="userInfo.status !== 1">
<van-notice-bar color="#ffffff" background="#e05338" left-icon="volume" mode="link" :scrollable="true">
<van-swipe class="notice-swipe" :touchable="false" :show-indicators="false">
<van-swipe-item v-for="(item, key, index) in noticeData" :key="index" @click="noticeClick(key)">
{{ item.ad_title }}
</van-swipe-item>
</van-swipe>
</van-notice-bar>
</template>
<!-- END: 跑馬燈 -->
<div class="my-account">
<div class="avatar">
<div class="left">
<div class="imgCnt shadow-sm">
<img :src="userInfo.avatar || noUserImg" />
</div>
<div class="info">
<h3 class="name">{{ userInfo.real_name }}</h3>
<h5 class="conpany">{{ userInfo.company }}</h5>
</div>
</div>
<div class="right">
<div class="btn btn-sm text-darkBlue" @click="doShare">
<h4><i class="fa-solid fa-share-from-square"></i></h4>
</div>
</div>
</div>
<div class="recommend">
<div class="btn btn-outline-lightBlue shadow-sm" @click="router.push('/shop')">
<div class="img"><i class="fa-solid fa-cart-arrow-down"></i></div>
<div class="text">立即開通</div>
</div>
<div class="btn btn-outline-lightBlue shadow-sm" @click="goCardEdit">
<div class="img"><i class="fa-solid fa-id-card"></i></div>
<div class="text">商務卡片</div>
</div>
<div class="btn btn-outline-lightBlue shadow-sm" @click="router.push('/address')">
<div class="img"><i class="fa-solid fa-address-book"></i></div>
<div class="text">通訊錄</div>
</div>
</div>
</div>
<div class="bwtFlex px-3 mb-2">
<h5 class="font-weight-bold text-darkBlue">會員資料</h5>
<a href="javascript:;" @click="router.push('/member')">
<h5><i class="fa-solid fa-sliders text-darkBlue"></i></h5>
</a>
</div>
<div class="content" v-if="userInfo">
<van-cell-group inset>
<van-field :model-value="userInfo.create_time" input-align="right" readonly>
<template #label><i class="fa-regular fa-fw fa-calendar-days"></i> 建立日期</template>
</van-field>
<van-field :model-value="userInfo.user_id" input-align="right" readonly>
<template #label><i class="fa-solid fa-fw fa-fingerprint"></i> 會員編號</template>
<template #button>
<van-button size="small" @click="doCopyUid">
<i class="fa-regular fa-copy"></i>
</van-button>
</template>
</van-field>
<van-field :model-value="userInfo.level_name" input-align="right" readonly>
<template #label><i class="fa-solid fa-fw fa-layer-group"></i> 會員等級</template>
</van-field>
<van-field :model-value="overdue" input-align="right" readonly>
<template #label><i class="fa-regular fa-fw fa-calendar-check"></i> 使用期限</template>
</van-field>
<van-field input-align="right" readonly>
<template #label><i class="fa-solid fa-fw fa-qrcode"></i> QRcode</template>
<template #button><van-button size="small" class="bg-darkBlue text-white border-0"
@click="handleShowNfc">開啟掃描</van-button></template>
</van-field>
<van-field input-align="right" readonly>
<template #label><i class="fa-solid fa-fw fa-link"></i> 名片連結</template>
<template #button><van-button size="small" class="bg-tomatoRed text-white border-0"
@click="doCopy">複製連結</van-button></template>
</van-field>
</van-cell-group>
<van-cell-group inset>
<van-field :model-value="userInfo.title" input-align="right" readonly>
<template #label><i class="fa-regular fa-fw fa-building"></i> 職稱</template>
</van-field>
<van-field :model-value="userInfo.phone" input-align="right" readonly>
<template #label><i class="fa-solid fa-fw fa-mobile-retro"></i> 手機</template>
</van-field>
<van-field :model-value="userInfo.tel" input-align="right" readonly>
<template #label><i class="fa-solid fa-fw fa-phone"></i> 市話</template>
</van-field>
<van-field :model-value="userInfo.email" input-align="right" readonly>
<template #label><i class="fa-regular fa-fw fa-envelope"></i> Email</template>
</van-field>
<van-field :model-value="userInfo.address" input-align="right" readonly>
<template #label><i class="fa-solid fa-fw fa-location-dot"></i> 住址</template>
</van-field>
</van-cell-group>
<van-cell-group inset>
<van-field input-align="right" class="longText" readonly>
<template #label><i class="fa-solid fa-fw fa-user-tie"></i> 授權商務卡片編輯</template>
<template #button>
<van-button size="small" @click="$router.push('/auth/auth')">
授權
</van-button>
</template>
</van-field>
<van-field input-align="right" class="longText" readonly>
<template #label><i class="fa-regular fa-fw fa-handshake"></i> 代客編輯商務卡片</template>
<template #button>
<van-button size="small" @click="$router.push('/auth/getauth')">
編輯
</van-button>
</template>
</van-field>
<van-field input-align="right" class="longText" readonly>
<template #label><i class="fa-solid fa-fw fa-award"></i> 綁定UTel淘金購會員</template>
<template #button>
<van-button size="small" @click="bindTggo">
點擊後前往綁定
</van-button>
</template>
</van-field>
<van-field input-align="right" class="longText" readonly>
<template #label><i class="fa-regular fa-fw fa-paper-plane"></i> 發送名片帶廣告</template>
<template #input>
<van-switch v-model="adSwitchStatus" @update:model-value="onUpdateValue" size="18px" active-color="#345068"
inactive-color="#888888" />
</template>
</van-field>
</van-cell-group>
<div class="px-3">
<van-button size="normal" block class="bg-darkBlue text-white border-0" @click="router.push('/send')">
<h5><i class="fa-regular fa-fw fa-paper-plane"></i> 發送名片</h5>
</van-button>
</div>
</div>
<van-dialog v-model:show="showNfcQrcode" title="電子名片二維碼" :show-cancel-button="true" cancel-button-text="關閉"
:show-confirm-button="false">
<div class="qrcode text-center pt-3">
<qrcode-vue :value="userInfo.nfcurl" :size="200" level="M" />
</div>
</van-dialog>
<van-overlay :show="popShow" z-index="1000" :style="{ background: 'rgba(0, 0, 0, .85)' }">
<div class="wrapper" @click.stop>
<div class="clip">
<van-icon :style="{ display: 'none', marginRight: '5px' }" @click="popShow = false"
:class="{ 'd-block': modalClose }" name="cross" size="15" />
<van-count-down :style="{ color: '#fff' }" @finish="closeShow" :auto-start="true" :time="adData.play_sec * 1000"
format="ss 秒" />
</div>
<div class="top">
<iframe width="100%" height="100%" :src="imageUrl + adData.ad_movie" title="YouTube video player"
autoplay="true" frameborder="0" controls="0"
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share"
allowfullscreen></iframe>
</div>
<div class="bottom">
<h5 class="title">{{ adData.ad_title }}</h5>
<h6 class="desc ellipsis e3">{{ adData.ad_desc }}</h6>
<van-button type="light" :url="adData.ad_link" block v-if="adData.ad_link">
<i class="fa-solid fa-fw fa-link"></i> 前往連結
</van-button>
</div>
</div>
</van-overlay>
</div>
</template>
<style src="@/assets/css/main.css"></style>
<style lang="less" scoped>
.home {
.wrapper {
display: flex;
justify-content: center;
align-items: center;
flex-direction: column;
height: 100%;
.clip {
position: absolute;
display: flex;
align-items: center;
color: #ffffff;
background-color: rgba(#000000, 0.8);
top: 5px;
right: 5px;
margin-left: auto;
padding: 10px;
cursor: pointer;
z-index: 1005;
}
.top {
position: relative;
display: flex;
align-items: center;
width: 100%;
flex: 1 0 0;
}
.bottom {
position: relative;
width: 100%;
flex: 0 0 auto;
padding: 15px;
.title {
color: #ffffff;
font-weight: bold;
margin-bottom: 15px;
}
.desc {
color: #ffffff;
margin-bottom: 30px;
}
}
}
.my-account {
position: relative;
width: 100%;
padding: 20px 25px;
.avatar {
display: flex;
justify-content: space-between;
align-items: center;
.left {
display: flex;
align-items: center;
flex: 1 0 0;
.imgCnt {
width: 80px;
height: 80px;
min-width: 80px;
border-radius: 50%;
border: 2px #fff solid;
overflow: hidden;
margin-right: 15px;
img {
width: 100%;
height: 100%;
object-fit: cover;
}
}
.info {
.name {
font-weight: bold;
color: #303a47;
}
.conpany {
margin-top: 5px;
}
}
}
.right {
flex: 0 0 auto;
}
}
.recommend {
display: flex;
justify-content: space-between;
align-items: center;
padding: 20px 0 10px;
.btn {
display: flex;
justify-content: center;
align-items: center;
flex-direction: column;
width: 30%;
height: 100px;
background-color: #fff;
border-radius: 0;
.img {
font-size: 35px;
line-height: 45px;
color: #345068;
}
.text {
font-size: 16px;
font-weight: bold;
color: #345068;
}
}
}
}
}
</style>