h888
Wayne Hsu 3 years ago
parent bfb8895b1b
commit 1beb30a123

@ -1,2 +1 @@
VITE_APP_IMG_URL = 'https://shop.h888.fun/'

@ -3,3 +3,7 @@ VITE_APP_IMG_URL = 'https://shop.h888.fun/'
VITE_APP_API_URL = 'https://shop.h888.fun/appapi/v1' VITE_APP_API_URL = 'https://shop.h888.fun/appapi/v1'
VITE_APP_SSO_URL = 'https://sso.h888.fun/api/v1' VITE_APP_SSO_URL = 'https://sso.h888.fun/api/v1'
VITE_APP_LINE_CLIENT_ID = '1661025693'
VITE_APP_LINE_CLIENT_SECRET = '914cc067cb11ffbd47640de8f3f4a00a'

@ -0,0 +1,9 @@
VITE_APP_IMG_URL = 'https://shop.h888.fun/'
VITE_APP_API_URL = 'https://shop.h888.fun/appapi/v1'
VITE_APP_SSO_URL = 'https://sso.h888.fun/api/v1'
VITE_APP_LINE_CLIENT_ID = '1657876696'
VITE_APP_LINE_CLIENT_SECRET = '2a7930d6143a00ff421812b942cde200'

@ -3,3 +3,7 @@ VITE_APP_IMG_URL = 'https://shop.slash1000.com/'
VITE_APP_API_URL = 'https://shop.slash1000.com/appapi/v1' VITE_APP_API_URL = 'https://shop.slash1000.com/appapi/v1'
VITE_APP_SSO_URL = 'https://sso.slash1000.com/api/v1' VITE_APP_SSO_URL = 'https://sso.slash1000.com/api/v1'
VITE_APP_LINE_CLIENT_ID = '1661025693'
VITE_APP_LINE_CLIENT_SECRET = '914cc067cb11ffbd47640de8f3f4a00a'

@ -0,0 +1,11 @@
VITE_APP_ENV = slash
VITE_APP_IMG_URL = 'https://shop.slash1000.com/'
VITE_APP_API_URL = 'https://shop.slash1000.com/appapi/v1'
VITE_APP_SSO_URL = 'https://sso.slash1000.com/api/v1'
VITE_APP_LINE_CLIENT_ID = '1661025693'
VITE_APP_LINE_CLIENT_SECRET = '914cc067cb11ffbd47640de8f3f4a00a'

1
components.d.ts vendored

@ -17,6 +17,7 @@ declare module '@vue/runtime-core' {
VanCollapse: typeof import('vant/es')['Collapse'] VanCollapse: typeof import('vant/es')['Collapse']
VanCollapseItem: typeof import('vant/es')['CollapseItem'] VanCollapseItem: typeof import('vant/es')['CollapseItem']
VanDatePicker: typeof import('vant/es')['DatePicker'] VanDatePicker: typeof import('vant/es')['DatePicker']
VanDialog: typeof import('vant/es')['Dialog']
VanField: typeof import('vant/es')['Field'] VanField: typeof import('vant/es')['Field']
VanForm: typeof import('vant/es')['Form'] VanForm: typeof import('vant/es')['Form']
VanGrid: typeof import('vant/es')['Grid'] VanGrid: typeof import('vant/es')['Grid']

@ -6,6 +6,8 @@
"scripts": { "scripts": {
"dev": "vite", "dev": "vite",
"build": "vue-tsc && vite build", "build": "vue-tsc && vite build",
"build:h888": "vue-tsc && vite build --mode h888",
"build:slash": "vue-tsc && vite build --mode slash",
"preview": "vite preview" "preview": "vite preview"
}, },
"dependencies": { "dependencies": {

@ -615,11 +615,11 @@ li {
color: #222 color: #222
} }
p { /* p {
font-size: 14px; font-size: 14px;
line-height: 1.5; line-height: 1.5;
color: #222 color: #222
} } */
a { a {
-webkit-transition: 0.5s ease; -webkit-transition: 0.5s ease;
@ -657,51 +657,6 @@ a:focus {
box-shadow: none box-shadow: none
} }
h1 {
font-size: 38px;
line-height: 33px;
text-transform: capitalize;
margin: 0;
color: #222
}
h2 {
font-size: 24px;
line-height: 22px;
margin: 0;
color: #222
}
h3 {
font-size: 20px;
line-height: 16px;
margin: 0;
color: #222
}
h4 {
font-size: 18px;
line-height: 25px;
margin: 0;
color: #222
}
h5 {
font-size: 16px;
line-height: 22px;
margin: 0;
font-weight: 400;
color: #222
}
h6 {
font-size: 14px;
line-height: 19px;
font-weight: 400;
margin: 0;
color: #222
}
.font-base { .font-base {
font-size: 14px !important font-size: 14px !important
} }

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 54 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 110 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 605 KiB

@ -16,15 +16,21 @@
</li> </li>
<li class="footer-item" :class="{active: $route.path=='/card'}"> <li class="footer-item" :class="{active: $route.path=='/card'}">
<router-link to="/card" class="footer-link"> <router-link to="/card" class="footer-link">
<i class="icon-card-account-details icli"></i> <i class="icon-local-convenience-store icli"></i>
<span>立即購買</span> <span>立即購買</span>
</router-link> </router-link>
</li> </li>
<li class="footer-item" :class="{active: $route.path=='/category'}"> <!-- <li class="footer-item" :class="{active: $route.path=='/category'}">
<router-link to="/category" class="footer-link"> <router-link to="/category" class="footer-link">
<i class="icon-cart-variant icli"></i> <i class="icon-cart-variant icli"></i>
<span>線上商店</span> <span>線上商店</span>
</router-link> </router-link>
</li> -->
<li class="footer-item">
<a href="https://card.slash1000.com" class="footer-link">
<i class="icon-card-account-details icli"></i>
<span>電子名片</span>
</a>
</li> </li>
<li class="footer-item" :class="{active: $route.path=='/user/info'}"> <li class="footer-item" :class="{active: $route.path=='/user/info'}">
<router-link to="/user/info" class="footer-link"> <router-link to="/user/info" class="footer-link">

@ -54,13 +54,13 @@
</a> </a>
<a class="arrow" href="###"><i data-feather="chevron-right"></i></a> <a class="arrow" href="###"><i data-feather="chevron-right"></i></a>
</li> </li>
<li @click="$router.push('/category')"> <!-- <li @click="$router.push('/category')">
<a class="nav-link title-color font-sm"> <a class="nav-link title-color font-sm">
<i class="iconly-Home icli"></i> <i class="iconly-Home icli"></i>
<span>線上商店</span> <span>線上商店</span>
</a> </a>
<a class="arrow" href="###"><i data-feather="chevron-right"></i></a> <a class="arrow" href="###"><i data-feather="chevron-right"></i></a>
</li> </li> -->
<li @click="$router.push('/user/info')"> <li @click="$router.push('/user/info')">
<a class="nav-link title-color font-sm"> <a class="nav-link title-color font-sm">
<i class="iconly-Home icli"></i> <i class="iconly-Home icli"></i>

@ -37,7 +37,7 @@
</div> </div>
<h3 class="title-color font-sm">{{ ua.consignee }}</h3> <h3 class="title-color font-sm">{{ ua.consignee }}</h3>
<h3 class="title-color font-sm">{{ ua.tel }}</h3> <h3 class="title-color font-sm">{{ ua.tel }}</h3>
<p class="content-color font-sm">{{ua.city + '' + ua.district + '' + ua.address }}</p> <p class="content-color font-sm">{{ ua.zipcode + ua.city + "" + ua.district + "" + ua.address }}</p>
</div> </div>
<!-- <img src="/src/assets/images/map/map.jpg" alt="map" /> --> <!-- <img src="/src/assets/images/map/map.jpg" alt="map" /> -->
</div> </div>
@ -157,16 +157,16 @@ const addrForm = ref();
const form = ref({ const form = ref({
name: "住家", name: "住家",
consignee: '', consignee: "",
tel: '', tel: "",
city: '', city: "",
district: '', district: "",
zipcode: '', zipcode: "",
address: '', address: "",
is_default: false, is_default: false,
}); });
const selectedValue = ref(["0"]) const selectedValue = ref(["0"]);
onMounted(async () => { onMounted(async () => {
let addrRes = await getUserAddress(); let addrRes = await getUserAddress();
@ -197,6 +197,7 @@ const onConfirm = ({ selectedOptions }) => {
form.value.city = selectedOptions[0].text; form.value.city = selectedOptions[0].text;
form.value.district = selectedOptions[1].text; form.value.district = selectedOptions[1].text;
form.value.zipcode = selectedOptions[1].zipcode;
}; };
const handleSubmit = () => { const handleSubmit = () => {
@ -255,13 +256,13 @@ const handleSetDefault = async (id) => {
} }
}); });
orderStore.shipping = { orderStore.shipping.extra_data = {
shipping_code: "shipping", city: addr.city,
extra_data: { district: addr.district,
zipcode: addr.zipcode,
address: addr.address, address: addr.address,
consignee: addr.consignee, consignee: addr.consignee,
tel: addr.tel, tel: addr.tel,
},
}; };
router.replace("/checkout"); router.replace("/checkout");

@ -1,16 +1,16 @@
<template><!-- Main Start --> <template>
<!-- Main Start -->
<van-tabs v-model:active="active"> <van-tabs v-model:active="active">
<van-tab title="商品"></van-tab> <van-tab title="商品"></van-tab>
<van-tab title="詳情"></van-tab> <van-tab title="詳情"></van-tab>
<!-- <van-tab title="評價"></van-tab> --> <!-- <van-tab title="評價"></van-tab> -->
</van-tabs> </van-tabs>
<main class="main-wrap product-page mb-xxl" v-if="active === 0"> <main class="main-wrap product-page mb-xxl" v-if="active === 0">
<!-- Banner Section Start --> <!-- Banner Section Start -->
<div class="banner-box product-banner"> <div class="banner-box product-banner">
<van-swipe> <van-swipe>
<van-swipe-item v-for="images in goods.goods_gallery" :index="images.img_id"> <van-swipe-item v-for="images in goods.goods_gallery" :index="images.img_id">
<img class="banner_img" :src="images.img_url"> <img class="banner_img" :src="images.img_url" />
</van-swipe-item> </van-swipe-item>
<template #indicator="{ active, total }"> <template #indicator="{ active, total }">
<div class="custom-indicator">{{ active + 1 }}/{{ total }}</div> <div class="custom-indicator">{{ active + 1 }}/{{ total }}</div>
@ -26,46 +26,38 @@
{{ goods.goods_name }} {{ goods.goods_name }}
</div> </div>
<div class="share"> <div class="share">
<van-popover placement="left-start" v-model:show="showPopover"> <van-popover placement="left-start" @open="handleOpenPoppver" v-model:show="showPopover">
<van-grid square clickable :border="false" column-num="4" style="width: 300px;"> <van-grid square clickable :border="false" column-num="4" style="width: 300px">
<van-grid-item @click="showPopover = false"> <van-grid-item @click="handleClickPoppver('qrcode')">
<div class="share-icon"> <div class="share-icon">
<div> <div>
<img src="@/assets/icons/png/qrcode.png" /> <img src="@/assets/icons/png/qrcode.png" />
</div> </div>
<div> <div>QRCoce</div>
QRCoce
</div>
</div> </div>
</van-grid-item> </van-grid-item>
<van-grid-item @click="showPopover = false"> <van-grid-item @click="handleClickPoppver('link')">
<div class="share-icon"> <div class="share-icon">
<div> <div>
<img src="@/assets/icons/png/link.png" /> <img src="@/assets/icons/png/link.png" />
</div> </div>
<div> <div>分享連結</div>
分享連結
</div>
</div> </div>
</van-grid-item> </van-grid-item>
<van-grid-item @click="showPopover = false"> <van-grid-item @click="handleClickPoppver('line')">
<div class="share-icon"> <div class="share-icon">
<div> <div>
<img src="@/assets/icons/png/line.png" /> <img src="@/assets/icons/png/line.png" />
</div> </div>
<div> <div>Line</div>
Line
</div>
</div> </div>
</van-grid-item> </van-grid-item>
<van-grid-item text="QRCoce" @click="showPopover = false"> <van-grid-item text="QRCoce" @click="handleClickPoppver('fb')">
<div class="share-icon"> <div class="share-icon">
<div> <div>
<img src="@/assets/icons/png/Facebook.png" /> <img src="@/assets/icons/png/Facebook.png" />
</div> </div>
<div> <div>FB</div>
FB
</div>
</div> </div>
</van-grid-item> </van-grid-item>
</van-grid> </van-grid>
@ -76,44 +68,90 @@
</div> </div>
</div> </div>
<div class="rating"> <div class="rating">
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" <svg
stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"
class="feather feather-star"> width="24"
height="24"
viewBox="0 0 24 24"
fill="none"
stroke="currentColor"
stroke-width="2"
stroke-linecap="round"
stroke-linejoin="round"
class="feather feather-star"
>
<polygon <polygon
points="12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26 12 2"> points="12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26 12 2"
</polygon> ></polygon>
</svg> </svg>
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" <svg
stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"
class="feather feather-star"> width="24"
height="24"
viewBox="0 0 24 24"
fill="none"
stroke="currentColor"
stroke-width="2"
stroke-linecap="round"
stroke-linejoin="round"
class="feather feather-star"
>
<polygon <polygon
points="12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26 12 2"> points="12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26 12 2"
</polygon> ></polygon>
</svg> </svg>
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" <svg
stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"
class="feather feather-star"> width="24"
height="24"
viewBox="0 0 24 24"
fill="none"
stroke="currentColor"
stroke-width="2"
stroke-linecap="round"
stroke-linejoin="round"
class="feather feather-star"
>
<polygon <polygon
points="12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26 12 2"> points="12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26 12 2"
</polygon> ></polygon>
</svg> </svg>
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" <svg
stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"
class="feather feather-star"> width="24"
height="24"
viewBox="0 0 24 24"
fill="none"
stroke="currentColor"
stroke-width="2"
stroke-linecap="round"
stroke-linejoin="round"
class="feather feather-star"
>
<polygon <polygon
points="12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26 12 2"> points="12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26 12 2"
</polygon> ></polygon>
</svg> </svg>
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" <svg
stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"
class="feather feather-star"> width="24"
height="24"
viewBox="0 0 24 24"
fill="none"
stroke="currentColor"
stroke-width="2"
stroke-linecap="round"
stroke-linejoin="round"
class="feather feather-star"
>
<polygon <polygon
points="12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26 12 2"> points="12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26 12 2"
</polygon> ></polygon>
</svg> </svg>
<span class="font-xs content-color">(150次點擊)</span> <span class="font-xs content-color">({{goods.click_count}}次點擊)</span>
</div> </div>
<div class="price"><span>${{ goods.shop_price }}</span> <div class="price">
<span>${{ goods.shop_price }}</span>
<del>${{ goods.market_price }}</del> <del>${{ goods.market_price }}</del>
<span>{{ discount }}</span> <span>{{ discount }}</span>
</div> </div>
@ -123,10 +161,8 @@
</section> </section>
<!-- Card Data--> <!-- Card Data-->
<card-data v-model="cardData" /> <card-data v-model="cardData" />
<div style="margin: 16px;"> <div style="margin: 16px">
<van-button round block type="primary" @click="addToCart(1, 1)"> <van-button round block type="primary" @click="addToCart(1, 1)"> 立即購買 </van-button>
立即購買
</van-button>
</div> </div>
<!-- Product Section Section End --> <!-- Product Section Section End -->
@ -179,7 +215,8 @@
<section class="check-delivery-section"> <section class="check-delivery-section">
<div class="service-section"> <div class="service-section">
<ul> <ul>
<li class="font-sm content-color"><img src="@/assets/icons/svg/delivery.svg" class="img-fluid" alt="" /> <li class="font-sm content-color">
<img src="@/assets/icons/svg/delivery.svg" class="img-fluid" alt="" />
NFC感應卡片將在三個工作天寄至您的收件地址 NFC感應卡片將在三個工作天寄至您的收件地址
</li> </li>
<!-- <li class="font-sm content-color"><img src="@/assets/icons/svg/payment.svg" class="img-fluid" <!-- <li class="font-sm content-color"><img src="@/assets/icons/svg/payment.svg" class="img-fluid"
@ -193,127 +230,175 @@
</ul> </ul>
</div> </div>
</section> </section>
</main> </main>
<!-- Main End --> <!-- Main End -->
<!-- Main Start --> <!-- Main Start -->
<main class="main-wrap detail-page mb-xxl" v-if="active == 1"> <main class="main-wrap detail-page mb-xxl" v-if="active == 1">
<section class="detail-section" v-html="goods.goods_desc"> <section class="detail-section" v-html="goods.goods_desc"></section>
</section>
</main> </main>
<!-- Main End --> <!-- Main End -->
<!-- 分享二維碼 Start -->
<van-dialog
v-model:show="showShareQrcode"
title="分享二維碼"
:show-cancel-button="true"
cancel-button-text="關閉"
:show-confirm-button="false"
>
<div class="qrcode-block">
<qrcode-vue :value="`https://shop.slash1000.com/m/card?refer=${refer_code}`" size="200" level="M" />
</div>
</van-dialog>
<!-- Main End -->
</template> </template>
<script setup> <script setup>
import Cookies from 'js-cookie'; import Cookies from "js-cookie";
import QrcodeVue from "qrcode.vue";
import { toClipboard } from '@soerenmartius/vue3-clipboard'
import { ref, onMounted, computed } from 'vue' import { ref, onMounted, watch, computed } from "vue";
import { getGoods } from '@/services/goods' import { getGoods } from "@/services/goods";
import { useRoute, useRouter } from 'vue-router' import { useRoute, useRouter } from "vue-router";
import { useCartStore } from "@/store/Cart.js"; import { useCartStore } from "@/store/Cart.js";
import { useUserStore } from "@/store/User.js";
import { storeToRefs } from "pinia"; import { storeToRefs } from "pinia";
import { showToast } from "vant" import { showToast } from "vant";
import 'vant/es/toast/style' import "vant/es/toast/style";
import { addCart } from '@/services/cart' import { addCart } from "@/services/cart";
import CardData from './compoments/CardData.vue' import CardData from "./compoments/CardData.vue";
const route = useRoute() const route = useRoute();
const router = useRouter() const router = useRouter();
const cartStore = useCartStore(); const cartStore = useCartStore();
const userStore = useUserStore();
const active = ref(0) const active = ref(0);
const goods = ref({});
const goods = ref({})
const cardData = ref({ const cardData = ref({
cname: '', cname: "",
ename: '', ename: "",
image: '', image: "",
user_id: Cookies.get('uid')||'' user_id: Cookies.get("uid") || "",
}) });
onMounted(async () => { onMounted(async () => {
let res = await getGoods(1)
let res = await getGoods(1);
if (res.code === 200) { if (res.code === 200) {
goods.value = res.data goods.value = res.data;
} }
}) });
const discount = computed(() => { const discount = computed(() => {
return Math.floor(goods.value.shop_price / goods.value.market_price * 100) return Math.ceil((goods.value.shop_price / goods.value.market_price) * 10);
}) });
const addToCart = async (id, type) => { const addToCart = async (id, type) => {
// //
let goods = { let goods = {
quick: 1, quick: 1,
spec: '', spec: "",
goods_id: id, goods_id: id,
number: 1, number: 1,
parent: 0, parent: 0,
cardInfo: cardData.value cardInfo: cardData.value,
} };
let res = await cartStore.addCart(goods) let res = await cartStore.addCart(goods);
if (!res) { if (!res) {
return showToast('添加失敗!'); return showToast("添加失敗!");
} }
if (type === 0) { if (type === 0) {
showToast('添加成功!'); showToast("添加成功!");
} else { } else {
// //
if (Cookies.get('uid')) { if (Cookies.get("uid")) {
return router.push('/checkout') return router.push("/checkout");
} }
return router.push({ return router.push({
path: '/login', path: "/login",
query: { query: {
redirect: '/checkout' redirect: "/checkout",
} },
}) });
} }
return return;
} };
const goCheckout = async () => { const goCheckout = async () => {
// //
let goods = { let goods = {
quick: 1, quick: 1,
spec: '', spec: "",
goods_id: 1, goods_id: 1,
number: 1, number: 1,
parent: 0, parent: 0,
cardInfo: form.value cardInfo: form.value,
} };
let res = await addCart(goods) let res = await addCart(goods);
if (res.code === 200) { if (res.code === 200) {
// //
if (Cookies.get('uid')) { if (Cookies.get("uid")) {
return router.push('/checkout') return router.push("/checkout");
}
return router.push('/login')
} }
alert('操作錯誤,請重新操作') return router.push("/login");
return
} }
alert("操作錯誤,請重新操作");
return;
};
// //
const showPopover = ref(false); const showPopover = ref(false);
const showShareQrcode = ref(false);
const onSelect = (action) => Toast(action.text); const refer_code = computed(() => {
if (!Cookies.get("uid")) {
return "";
}
return userStore.info.refer_code;
});
const handleOpenPoppver = () => {
//
if (!Cookies.get("uid")) {
return showToast("注意!正式會員分享才能獲得獎勵喔,如果您已是正式會員,請先登入!");
}
};
const handleClickPoppver = (type) => {
const share_url = "https://shop.slash1000.com/m/card?refer=" + refer_code.value;
switch (type) {
case "qrcode":
showShareQrcode.value = true;
break;
case "link":
toClipboard(share_url);
showToast("已放入剪貼簿");
break;
case "line":
window.location.href = "https://social-plugins.line.me/lineit/share?url=" + encodeURI(share_url);
break;
case "fb":
window.open("https://www.facebook.com/share.php?u=" + encodeURI(share_url), "_blank");
break;
default:
break;
}
showPopover.value = false;
};
const onSelect = (action) => Toast(action.text);
</script> </script>
<style lang="less" scoped> <style lang="less" scoped>
@ -371,7 +456,6 @@ const onSelect = (action) => Toast(action.text);
} }
} }
.share-icon { .share-icon {
text-align: center; text-align: center;
div:nth-child(1) { div:nth-child(1) {
@ -381,7 +465,10 @@ const onSelect = (action) => Toast(action.text);
} }
// div:child-nth(2){ // div:child-nth(2){
// } // }
} }
.qrcode-block {
text-align: center;
}
</style> </style>

@ -3,10 +3,18 @@
<main class="main-wrap order-success-page mb-xxl"> <main class="main-wrap order-success-page mb-xxl">
<!-- Banner Section Start --> <!-- Banner Section Start -->
<section class="banner-section"> <section class="banner-section">
<template v-if="code === '200'">
<div class="content-wrap"> <div class="content-wrap">
<h1 class="font-lg title-color">感謝您的購買</h1> <h1 class="font-lg title-color">感謝您的購買</h1>
<p class="font-sm content-color">您的訂單已成功下達您的訂單編號為#{{ order_sn }}</p> <p class="font-sm content-color">您的訂單已成功下達您的訂單編號為#{{ order_sn }}</p>
</div> </div>
</template>
<template v-else>
<div class="content-wrap">
<h1 class="font-lg title-color">金流付款失敗</h1>
<p class="font-sm content-color">您的訂單編號為#{{ order_sn }},請重新下單</p>
</div>
</template>
<div v-if="paycode == 'eccvs'"> <div v-if="paycode == 'eccvs'">
<div class="divTable greenTable"> <div class="divTable greenTable">
<div class="divTableBody"> <div class="divTableBody">
@ -58,22 +66,13 @@
import { onMounted } from "vue"; import { onMounted } from "vue";
import { useRoute } from "vue-router"; import { useRoute } from "vue-router";
// import { linePay } from '@/services/order'
const route = useRoute(); const route = useRoute();
const code = route.query.code;
const order_sn = route.query.order_sn; const order_sn = route.query.order_sn;
const paycode = route.query.paycode; const paycode = route.query.paycode;
onMounted(async () => { onMounted(async () => {});
if (order_sn) {
// let res = await linePay({order_sn})
// if(res.code === 200){
// window.location.href = res.data.info.paymentUrl.web
// }
// console.log('res',res.data.paymentUrl.web)
}
});
</script> </script>
<style lang="less" scoped> <style lang="less" scoped>

@ -79,13 +79,21 @@
</li> </li>
</ul> </ul>
</div> </div>
<div v-show="showExtra" class="shipping-data"> <div class="shipping-data">
<div v-show="showExtra">
<template v-if="shippingData.shipping_code == 'shipping'"> <template v-if="shippingData.shipping_code == 'shipping'">
<div> <div>
<ul> <ul>
<li>收件人{{ shippingData.extra_data.consignee }}</li> <li>收件人{{ shippingData.extra_data.consignee }}</li>
<li> {{ shippingData.extra_data.tel }}</li> <li> {{ shippingData.extra_data.tel }}</li>
<li> {{ shippingData.extra_data.city + shippingData.extra_data.district + shippingData.extra_data.address }}</li> <li>
{{
shippingData.extra_data.zipcode +
shippingData.extra_data.city +
shippingData.extra_data.district +
shippingData.extra_data.address
}}
</li>
</ul> </ul>
</div> </div>
</template> </template>
@ -104,7 +112,8 @@
</ul> </ul>
</div> </div>
</template> </template>
<div> </div>
<div v-show="orderStore.shipping.shipping_id">
<van-button type="success" size="mini" @click="changeShipping"></van-button> <van-button type="success" size="mini" @click="changeShipping"></van-button>
</div> </div>
</div> </div>
@ -162,6 +171,47 @@
<!-- Accordion End --> <!-- Accordion End -->
</div> </div>
<!-- Payment Method Accordian End --> <!-- Payment Method Accordian End -->
<div class="accordion" id="accordionShipping">
<!-- Accordion Start -->
<div class="accordion-item">
<h2 class="accordion-header" id="headingTwo">
<button
class="accordion-button font-md title-color"
type="button"
data-bs-toggle="collapse"
aria-expanded="true"
data-bs-target="#bonus"
aria-controls="bonus"
>
優惠代碼
</button>
</h2>
<div
id="bonus"
class="accordion-collapse collapse show"
aria-labelledby="headingOne"
data-bs-parent="#accordionBonus"
>
<div class="accordion-body">
<div class="input-box">
<input
type="text"
placeholder="請輸入優惠代碼"
v-model="bonus.sn"
class="form-control"
/>
</div>
<div class="bonus-desc">
{{ bonus.name }}
<span v-if="bonus.number > 0"
>數量: {{ bonus.number }} 剩下: {{ bonus.remain }} </span
>
</div>
</div>
</div>
</div>
<!-- Accordion End -->
</div>
</section> </section>
<!-- Payment Section End --> <!-- Payment Section End -->
@ -203,14 +253,17 @@
<!-- Main End --> <!-- Main End -->
<!-- Footer Start --> <!-- Footer Start -->
<footer class="footer-wrap footer-button"> <footer class="footer-wrap footer-button">
<a href="javascript:void(0);" class="font-md" @click="handleFinish"></a> <!-- <el-button type="primary" color="#0baf9a" disabled ></el-button> -->
<van-button type="success" color="#0baf9a" @click="handleFinish" block :loading="btnLoading"
>完成訂單</van-button
>
</footer> </footer>
<!-- Footer End --> <!-- Footer End -->
</template> </template>
<script setup> <script setup>
import _ from "lodash"; import _ from "lodash";
import { ref, reactive, onMounted, computed } from "vue"; import { ref, reactive, onMounted, computed, watch } from "vue";
import { useCartStore } from "@/store/Cart"; import { useCartStore } from "@/store/Cart";
import { useOrderStore } from "@/store/Order"; import { useOrderStore } from "@/store/Order";
import { storeToRefs } from "pinia"; import { storeToRefs } from "pinia";
@ -222,6 +275,7 @@ import { addOrder } from "@/services/order";
import { getPayments } from "@/services/payment"; import { getPayments } from "@/services/payment";
import { getShippings, getUserDefaultCvs } from "@/services/shipping"; import { getShippings, getUserDefaultCvs } from "@/services/shipping";
import { getUserDefaultAddress } from "@/services/user"; import { getUserDefaultAddress } from "@/services/user";
import { checkBonusSn } from "@/services/bonus";
import router from "@/router"; import router from "@/router";
@ -250,6 +304,7 @@ const logisticType = {
4: "OK", 4: "OK",
}; };
const btnLoading = ref(false);
onMounted(async () => { onMounted(async () => {
cartToOrder(); cartToOrder();
@ -265,18 +320,57 @@ onMounted(async () => {
} }
}); });
const bonus = reactive({
name: "沒有優惠劵",
sn: "",
number: 0,
remain: 0,
});
//
const handleCheckBonusSn = async () => {
if (bonus.sn.length !== 10) {
bonus.name = "沒有優惠劵";
bonus.number = 0;
bonus.remain = 0;
orderStore.discount = 0;
return;
}
let res = await checkBonusSn(bonus.sn);
if (res.code === 200) {
orderStore.bonus_sn = bonus.sn;
bonus.name = res.data.type_name;
bonus.remain = res.data.remain_number;
bonus.number = res.data.bonus_number;
//res.data% %
if (res.data.type_money.slice(-1) === "%") {
orderStore.discount = ((100 - res.data.type_money.slice(0, -1)) / 100) * orderStore.sum_amount;
} else {
orderStore.discount = res.data;
}
} else {
showToast(res.data);
}
};
watch(() => bonus.sn, _.debounce(handleCheckBonusSn, 500));
// //
const cartToOrder = () => { const cartToOrder = () => {
if (cartStore.cartItems.length === 0) {
console.log('cardItem',cartStore.cartItems); showToast("購物車中沒有商品,請先加入商品");
return router.push("/card");
}
items.value = cartStore.cartItems; items.value = cartStore.cartItems;
//goods_id1,orderextension_codeslashcard //goods_id1,orderextension_codeslashcard
let is_slashcard = items.value.find((item) => item.goods_id === 1); let is_slashcard = items.value.find((item) => item.goods_id === 1);
if (is_slashcard) { if (is_slashcard) {
orderStore.extension_code = 'slashcard'; orderStore.extension_code = "slashcard";
} }
}; };
@ -287,12 +381,15 @@ const selectShipping = async (value) => {
switch (value.shipping_code) { switch (value.shipping_code) {
case "shipping": case "shipping":
let resAddr = await getUserDefaultAddress(); let resAddr = await getUserDefaultAddress();
console.log(resAddr.data);
if (resAddr.code === 200) { if (resAddr.code === 200) {
orderStore.shipping = { orderStore.shipping = {
shipping_code: value.shipping_code, shipping_code: value.shipping_code,
shipping_id: value.shipping_id, shipping_id: value.shipping_id,
shipping_fee: 0, shipping_fee: 0,
extra_data: { extra_data: {
zipcode: resAddr.data.zipcode,
address: resAddr.data.address, address: resAddr.data.address,
city: resAddr.data.city, city: resAddr.data.city,
district: resAddr.data.district, district: resAddr.data.district,
@ -379,12 +476,30 @@ const selectPayment = (value) => {
// //
const handleFinish = async () => { const handleFinish = async () => {
let order = orderStore.$state; let order = orderStore.$state;
if (!order.shipping.shipping_id) {
return showToast("請選擇配送方式");
}
if (order.payment.pay_id === null) {
return showToast("請選擇付款方式");
}
if (JSON.stringify(order.shipping.extra_data) == "{}") {
return showToast("請選擇配送地址");
}
if (order.goodsItems.length === 0) {
showToast("購物車中沒有商品,請先加入商品");
router.push("/card");
}
order = { ...order, goods_amount: orderStore.sum_amount, order_amount: orderStore.total_amount }; order = { ...order, goods_amount: orderStore.sum_amount, order_amount: orderStore.total_amount };
btnLoading.value = true;
try {
let res = await addOrder(order); let res = await addOrder(order);
if (res.code === 200) { if (res.code === 200) {
// //
cartStore.clearCart(); cartStore.clearCart();
orderStore.$reset();
// window.location.href = res.data.info.paymentUrl.web // window.location.href = res.data.info.paymentUrl.web
// console.log('resdata',res.data) // console.log('resdata',res.data)
return router.replace({ return router.replace({
@ -395,6 +510,12 @@ const handleFinish = async () => {
}, },
}); });
} }
} catch (err) {
btnLoading.value = false;
return
}
btnLoading.value = false;
return showToast("操作失敗"); return showToast("操作失敗");
}; };
@ -456,12 +577,14 @@ const detail = computed(() => {
// //
.shipping-data { .shipping-data {
width: 100%;
display: flex; display: flex;
padding: 10px 15px; padding: 10px 15px;
align-items: center; align-items: center;
justify-content: space-between; justify-content: space-between;
div:nth-child(1) { div:nth-child(1) {
flex: 1; flex: 1;
width: 100%;
// padding: 10px 0; // padding: 10px 0;
// border-bottom: 1px #cacaca solid; // border-bottom: 1px #cacaca solid;
} }
@ -473,4 +596,12 @@ const detail = computed(() => {
} }
} }
} }
.footer-wrap {
background-color: initial;
}
.bonus-desc {
padding: 0 10px;
}
</style> </style>

@ -151,22 +151,33 @@ const detail = computed(() => {
}); });
const goCheckOut = async () => { const goCheckOut = async () => {
if (Cookies.get("token")) { //
router.push("/checkout"); if (Cookies.get('uid')) {
} else { return router.push('/checkout')
showConfirmDialog({
title: "是否先登入會員",
message: "您目前尚未登入會員,是否先登入會員",
confirmButtonText: "登入會員",
cancelButtonText: "暱名購買",
})
.then(() => {
router.push("/login");
})
.catch(() => {
router.push("/checkout");
});
} }
return router.push({
path: '/login',
query: {
redirect: '/checkout'
}
})
// if (Cookies.get("token")) {
// router.push("/checkout");
// } else {
// showConfirmDialog({
// title: "",
// message: "",
// confirmButtonText: "",
// cancelButtonText: "",
// })
// .then(() => {
// router.push("/login");
// })
// .catch(() => {
// router.push("/checkout");
// });
// }
}; };
</script> </script>

@ -86,6 +86,9 @@ onMounted(async () => {
break; break;
case "linepay": case "linepay":
default: default:
if(pay_code === "cod") {
return
}
let res = await payment({ order_sn, pay_code }); let res = await payment({ order_sn, pay_code });
if (res.code === 200) { if (res.code === 200) {
//fromformContainersubmit //fromformContainersubmit

@ -316,7 +316,7 @@ onMounted(async () => {
}); });
const discount = computed(() => { const discount = computed(() => {
return Math.floor((goods.value.shop_price / goods.value.market_price) * 100); return Math.ceil((goods.value.shop_price / goods.value.market_price) * 10);
}); });
const addToCart = async (id, type) => { const addToCart = async (id, type) => {

@ -9,10 +9,7 @@
</van-swipe-item> </van-swipe-item>
</van-swipe> </van-swipe>
<div class="feature"> <div class="feature">
<img src="@/assets/images/feature01.png" alt="特色介紹"> <img src="@/assets/images/home.png" alt="特色介紹">
</div>
<div class="feature">
<img src="@/assets/images/feature02.png" alt="應用領域">
</div> </div>
<div class="company"> <div class="company">
<div> <div>

@ -54,7 +54,7 @@ import { ref, watch, onUnmounted } from "vue";
import { useRoute, useRouter } from "vue-router"; import { useRoute, useRouter } from "vue-router";
import { useShopStore } from "@/store/Shop" import { useShopStore } from "@/store/Shop";
import { showToast } from "vant"; import { showToast } from "vant";
import "vant/es/toast/style"; import "vant/es/toast/style";
@ -64,7 +64,7 @@ import { login, sendVerify } from "@/services/auth";
const route = useRoute(); const route = useRoute();
const router = useRouter(); const router = useRouter();
const shopStore = useShopStore() const shopStore = useShopStore();
const form = ref({ const form = ref({
username: "", username: "",
@ -77,7 +77,7 @@ const countdown = ref(0);
const handleGetVerify = async () => { const handleGetVerify = async () => {
if (!showGetVerifyBtn.value) { if (!showGetVerifyBtn.value) {
return return;
} }
if (!form.value.username) { if (!form.value.username) {
return showToast({ return showToast({
@ -175,15 +175,22 @@ const handleLogin = async () => {
router.push({ name: "Register", query: { type: "mobile" } }); router.push({ name: "Register", query: { type: "mobile" } });
} else { } else {
showToast({ showToast({
message: '登入失敗', message: "登入失敗",
duration: 1000, duration: 1000,
}); });
} }
}; };
const handleLineLogin = async () => { const handleLineLogin = async () => {
const client_id = "1657876696"; const client_id = import.meta.env.VITE_APP_LINE_CLIENT_ID;
const redirect_uri = "https://" + shopStore.domain + "/m/linelogin/"; //domainlocalhost
let redirect_uri = "";
if (shopStore.domain.includes("localhost")) {
redirect_uri = "http://" + shopStore.domain + ":5173/m/linelogin";
} else {
redirect_uri = "https://" + shopStore.domain + "/m/linelogin";
}
let link = "https://access.line.me/oauth2/v2.1/authorize?"; let link = "https://access.line.me/oauth2/v2.1/authorize?";
link = link + "response_type=code"; link = link + "response_type=code";
link += "&client_id=" + client_id; link += "&client_id=" + client_id;

@ -22,12 +22,20 @@ const code = route.query.code
if(!code){ if(!code){
router.replace('/login') router.replace('/login')
}else{ }else{
//domainlocalhost
let redirect_uri = "";
if (shopStore.domain.includes("localhost")) {
redirect_uri = "http://" + shopStore.domain + ":5173/m/linelogin";
} else {
redirect_uri = "https://" + shopStore.domain + "/m/linelogin";
}
axios.post('https://api.line.me/oauth2/v2.1/token',{ axios.post('https://api.line.me/oauth2/v2.1/token',{
grant_type: 'authorization_code', grant_type: 'authorization_code',
code: code, code: code,
redirect_uri: 'https://' + shopStore.domain + '/m/linelogin/', redirect_uri: redirect_uri,
client_id: '1657876696', client_id: import.meta.env.VITE_APP_LINE_CLIENT_ID,
client_secret: '2a7930d6143a00ff421812b942cde200' client_secret: import.meta.env.VITE_APP_LINE_CLIENT_SECRET,
},{ },{
headers: { headers: {
'content-type': 'application/x-www-form-urlencoded' 'content-type': 'application/x-www-form-urlencoded'

@ -114,10 +114,10 @@ const finished = ref(false);
const refreshing = ref(false); const refreshing = ref(false);
onMounted(async() => { onMounted(async() => {
let res = await getUserAccInfo(); // let res = await getUserAccInfo();
if(res.code === 200){ // if(res.code === 200){
accInfo.value = res.data; // accInfo.value = res.data;
} // }
}); });
const onLoad = async ()=>{ const onLoad = async ()=>{
@ -160,6 +160,14 @@ const form = ref({
}); });
const onSubmit = async () => { const onSubmit = async () => {
if(form.value.amount < 1000){
showToast("提領金額最少為1000");
return;
}
if(form.value.amount > accInfo.value.user_money){
showToast("提領金額不足,您目前可提領的金額為" + accInfo.value.user_money);
return;
}
let res = await addUserAccount(form.value); let res = await addUserAccount(form.value);
if (res.code === 200) { if (res.code === 200) {
showToast("申請成功,請等待管理員審核撥款"); showToast("申請成功,請等待管理員審核撥款");

@ -0,0 +1,66 @@
<template>
<!-- Header Start -->
<header class="header">
<div class="logo-wrap">
<i class="icon-arrow-left-bold-box icli" @click="$router.push('/user/info')"></i>
<h1 class="title-color font-md">提領帳戶</h1>
</div>
</header>
<!-- Header End -->
<!-- Main Start -->
<main class="main-wrap setting-page mb-xxl">
<!-- Form Section Start -->
<van-form @submit="onSubmit">
<van-cell-group inset>
<van-field v-model="form.bank_name" name="bank_name" placeholder="銀行名稱" />
<van-field v-model="form.bank_code" name="bank_code" placeholder="銀行代碼" />
<van-field v-model="form.bank_account" name="bank_account" placeholder="銀行帳號" />
</van-cell-group>
<div style="margin: 16px">
<van-button round block color="#0baf9a" native-type="submit" :disabled="btnDisable"> 提交 </van-button>
</div>
</van-form>
<!-- Form Section End -->
</main>
<!-- Main End -->
</template>
<script setup>
import { ref, onMounted } from "vue";
import { getUserBank,updateUserBank } from "@/services/user";
import { showToast } from "vant";
import router from "@/router";
const form = ref({
bank_name: "",
bank_code: "",
bank_account: "",
});
const btnDisable = ref(false);
onMounted(async () => {
let res = await getUserBank();
// console.log('res',res.code)
if (res.code === 200) {
form.value = res.data;
console.log(form.value)
}
});
const onSubmit = async () => {
btnDisable.value = true;
let res = await updateUserBank(form.value);
if(res.code === 200){
showToast('操作成功');
return router.back();
}
showToast(res.data);
btnDisable.value = false;
};
</script>
<style lang="less" scoped></style>

@ -5,12 +5,12 @@
<div class="user-panel"> <div class="user-panel">
<div class="media"> <div class="media">
<a href="javascript:void(0)"> <a href="javascript:void(0)">
<img :src="userInfo.headimg" alt="avatar" /> <img :src="userInfo.headimg || defaultAvatar" alt="avatar" />
</a> </a>
<div class="media-body"> <div class="media-body">
<a href="javascript:void(0)" class="title-color"> <a href="javascript:void(0)" class="title-color">
{{ userInfo.line_name }} {{ userInfo.line_name }}
<span class="content-color font-sm">非會員</span> <span class="content-color font-sm">{{ userInfo.is_validated?'Slash會員[可分銷]':'一般會員[不可分銷]' }}</span>
</a> </a>
</div> </div>
<div class="media-right" @click="$router.push('/user/setting')"> <div class="media-right" @click="$router.push('/user/setting')">
@ -111,6 +111,15 @@
<i class="icon-chevron-right"></i> <i class="icon-chevron-right"></i>
</a> </a>
</li> </li>
<li @click="$router.push('/user/bank')">
<a class="nav-link title-color font-sm">
<i class="icon-bank icli"></i>
<span>提領帳戶</span>
</a>
<a class="arrow">
<i class="icon-chevron-right"></i>
</a>
</li>
</ul> </ul>
<!-- Navigation End --> <!-- Navigation End -->
<button class="log-out" data-bs-toggle="offcanvas" data-bs-target="#confirmation" aria-controls="confirmation" @click="handleLogout"> <button class="log-out" data-bs-toggle="offcanvas" data-bs-target="#confirmation" aria-controls="confirmation" @click="handleLogout">
@ -134,10 +143,11 @@ import { useShopStore } from '@/store/Shop'
import { getUserInfo } from '@/services/user' import { getUserInfo } from '@/services/user'
import { showToast } from 'vant'; import { showToast } from 'vant';
import defaultAvatar from '@/assets/images/avatar/avatar.png'
(async ()=>{ // (async ()=>{
await liff.init({ liffId: '1657782615-qGK9WQ5m' }); // await liff.init({ liffId: '1657782615-qGK9WQ5m' });
})() // })()
const router = useRouter() const router = useRouter()
@ -145,6 +155,7 @@ const shopStore = useShopStore()
const userInfo = ref({}) const userInfo = ref({})
onMounted(async () => { onMounted(async () => {
let res = await getUserInfo() let res = await getUserInfo()
@ -178,7 +189,7 @@ const onError = () => {
width: 100%; width: 100%;
} }
.media-right{ .media-right{
width: 100%; // width: 100%;
vertical-align: text-top; vertical-align: text-top;
text-align: right; text-align: right;
i{ i{

@ -46,14 +46,14 @@
<!-- Catagories Tabs End --> <!-- Catagories Tabs End -->
<!-- Tab Content Start --> <!-- Tab Content Start -->
<section class="tab-content ratio2_1" id="pills-tabContent"> <div class="tab-content ratio2_1" id="pills-tabContent">
<!-- Catagories Content Start --> <!-- Catagories Content Start -->
<div class="tab-pane fade show active" id="catagories1" role="tabpanel" aria-labelledby="catagories1-tab"> <div class="tab-pane fade show active" id="catagories1" role="tabpanel" aria-labelledby="catagories1-tab">
<!-- Order Box Start --> <!-- Order Box Start -->
<div class="order-box" v-for="(order,index) in orderList" :key="order.order_id"> <div class="order-box" v-for="(order,index) in orderList" :key="order.order_id">
<div class="media"> <div class="media">
<a href="order-detail.html" class="content-box"> <a href="order-detail.html" class="content-box">
<h2 class="font-sm title-color">訂單編號: #{{ order.order_sn }} , <br/>日期: {{ order.add_time }}</h2> <h2 class="font-sm title-color">訂單編號: #{{ order.order_sn }} <br/>日期: {{ order.add_time }}</h2>
<p class="font-xs content-color"> <p class="font-xs content-color">
</p> </p>
@ -67,7 +67,7 @@
</div> </div>
<div class="bottom-content"> <div class="bottom-content">
<!-- <a href="javascript:;" class="title-color font-sm fw-600"> 再買一次 </a> --> <!-- <a href="javascript:;" class="title-color font-sm fw-600"> 再買一次 </a> -->
<a href="javascript:void(0)" class="give-rating content-color font-sm"> {{ orderStatus[order.order_status] }}</a> <a href="javascript:void(0)" class="give-rating content-color font-sm"> {{ order.status }}</a>
<div class="rating"> <div class="rating">
<i data-feather="star"></i> <i data-feather="star"></i>
<i data-feather="star"></i> <i data-feather="star"></i>
@ -82,7 +82,7 @@
</div> </div>
<!-- Catagories Content End --> <!-- Catagories Content End -->
</section> </div>
<!-- Tab Content End --> <!-- Tab Content End -->
</main> </main>
<!-- Main End --> <!-- Main End -->

@ -12,8 +12,6 @@
<main class="main-wrap about-us-page mb-xxl"> <main class="main-wrap about-us-page mb-xxl">
<!-- 分潤獎金 Section Start --> <!-- 分潤獎金 Section Start -->
<section class="bonus-section"> <section class="bonus-section">
<h2 class="title-color font-md">分銷獎金</h2>
<div>目前累積金額 ${{ shareInfo.l1_num * 400 }}</div>
<div class="css-table"> <div class="css-table">
<div class="css-tr"> <div class="css-tr">
<div class="css-td">推薦人數</div> <div class="css-td">推薦人數</div>
@ -26,13 +24,12 @@
<div class="css-td">{{shareInfo.tran_rate}}%</div> <div class="css-td">{{shareInfo.tran_rate}}%</div>
</div> </div>
</div> </div>
<div @click="showRecommand">()</div>
</section> </section>
<!-- 分潤獎金 Section End --> <!-- 分潤獎金 Section End -->
<!-- 分潤獎金 Section Start --> <!-- 分潤獎金 Section Start -->
<section class="profit-section"> <section class="profit-section">
<h2 class="title-color font-md">分潤獎金</h2>
<div>目前累積金額 ${{ shareInfo.l2_num * 50 + shareInfo.l3_num * 30 + shareInfo.l4_num * 20 }}</div>
<div class="css-table"> <div class="css-table">
<div class="css-tr"> <div class="css-tr">
<div class="css-td">二級人數</div> <div class="css-td">二級人數</div>
@ -57,6 +54,9 @@
import { ref, onMounted } from 'vue' import { ref, onMounted } from 'vue'
import { getShareInfo } from '@/services/user' import { getShareInfo } from '@/services/user'
import { useRouter } from 'vue-router'
const router = useRouter();
const shareInfo = ref({}) const shareInfo = ref({})
onMounted(async ()=>{ onMounted(async ()=>{
@ -66,6 +66,10 @@ onMounted(async ()=>{
shareInfo.value = res.data shareInfo.value = res.data
} }
}) })
const showRecommand = () => {
router.push('/user/share/recommand')
}
</script> </script>
<style lang="less" scoped> <style lang="less" scoped>

@ -0,0 +1,111 @@
<template>
<!-- Header Start -->
<header class="header">
<div class="logo-wrap">
<i class="icon-arrow-left-bold-box icli" @click="$router.back()"></i>
<h1 class="title-color font-md">推薦會員</h1>
</div>
</header>
<!-- Header End -->
<!-- Main Start -->
<main class="main-wrap about-us-page mb-xxl">
<!-- 會員列表 Section Start -->
<div class="recommand-section">
<van-pull-refresh v-model="refreshing" @refresh="onRefresh">
<van-list
v-model:loading="loading"
:finished="finished"
finished-text="沒有更多了"
@load="onLoad"
>
<!-- <van-cell v-for="item in list" :key="item" :title="item">
aaa bbb
</van-cell> -->
<div class="recommand-cell">
<div class="userid">會員編號</div>
<div class="name">會員名稱</div>
<div class="status">會員狀態</div>
</div>
<div class="recommand-cell" v-for="item in list" :key="item">
<div class="userid">{{ item.sso_user_id }}</div>
<div class="name">{{ item.real_name }}</div>
<div class="status">{{ item.is_validated }}</div>
</div>
</van-list>
</van-pull-refresh>
</div>
<!-- 分潤獎金 Section End -->
</main>
<!-- Main End -->
</template>
<script setup>
import { ref, onMounted } from "vue";
import { getRecommandList } from "@/services/user";
const list = ref([]);
const loading = ref(false);
const finished = ref(false);
const refreshing = ref(false);
const page = ref(1);
onMounted(async () => {
// let res = await getRecommandList();
// if(res.code === 200){
// list.value = res.data;
// }
});
const onLoad = async () => {
if (refreshing.value) {
page.value = 1;
list.value = [];
refreshing.value = false;
}
let res = await getRecommandList(page.value);
if (res.code === 200) {
//res.datalist array
list.value.push(...res.data.data);
// list.value.push(res.data);
page.value += 1;
}
loading.value = false;
if (list.value.length == res.data.total) {
finished.value = true;
}
};
const onRefresh = async () =>{
finished.value = false;
loading.value = true;
onLoad();
}
</script>
<style lang="less" scoped>
.recommand-cell {
display: flex;
justify-content: start;
height: 44px;
.userid {
width: 33%;
// text-align: center;
}
.name {
width: 33%;
text-align: center;
}
.status {
width: 33%;
text-align: center;
}
}
</style>

@ -17,41 +17,25 @@
<!-- Login Form Start --> <!-- Login Form Start -->
<form class="custom-form" @submit.prevent="onSubmit"> <form class="custom-form" @submit.prevent="onSubmit">
<h1 class="font-md title-color fw-600">加入會員</h1> <h1 class="font-md title-color fw-600">加入會員</h1>
<div class="input-box"> <div class="input-box" v-if="$route.query.type !== 'mobile'">
<input type="text" placeholder="真實姓名" v-model="form.name" required class="form-control" /> <input type="text" placeholder="行動電話" v-model="form.phone" required class="form-control" />
<i class="icon-cellphone icli"></i> <i class="icon-cellphone icli"></i>
</div> </div>
<template v-if="isRegister">
<div class="input-box"> <div class="input-box">
<input type="text" placeholder="行動電話" v-model="form.phone" required class="form-control" /> <input type="text" placeholder="真實姓名" v-model="form.name" required class="form-control" />
<i class="icon-cellphone icli"></i> <i class="icon-account icli"></i>
</div> </div>
<!-- <div class="input-box"> <div class="input-box">
<input type="text" placeholder="Email" v-model="form.email" required class="form-control" /> <input type="text" placeholder="Email" v-model="form.email" required class="form-control" />
<i class="icon-cellphone icli"></i> <i class="icon-email icli"></i>
</div> --> </div>
<!-- Password Input start -->
<!-- <div class="input-box">
<input type="password" placeholder="登入密碼" required class="form-control" />
<i class="icon-lock icli showHidePassword"></i>
</div> -->
<!-- Password Input End -->
<button type="submit" class="btn-solid">送出註冊</button> <button type="submit" class="btn-solid">送出註冊</button>
<!-- <span class="content-color font-sm d-block text-center fw-600">已經有帳號了? <router-link to="/login" class="underline">登入 </router-link></span> --> </template>
<template v-else>
<button type="text" class="btn-solid" @click.prevent="onCheckPhone">驗證手機號碼</button>
</template>
</form> </form>
<!-- Login Form End -->
<!-- Social Section Start -->
<!-- <div class="socila-section">
<span>
<span class="font-sm fw-600 font-theme"> Or login with </span>
</span>
<div class="social-wrap">
<a href="javascript:void(0)" class="font-md title-color fw-600"><img src="@/assets/icons/png/phone.png" alt="phone" /> Continue with Phone </a>
<a href="https://accounts.google.com/ServiceLogin" class="font-md title-color fw-600"><img src="@/assets/icons/png/google.png" alt="phone" /> Continue with Google </a>
</div>
</div> -->
<!-- Social Section End --> <!-- Social Section End -->
</section> </section>
<!-- Login Section End --> <!-- Login Section End -->
@ -66,11 +50,11 @@ import Cookies from "js-cookie";
import { ref } from "vue"; import { ref } from "vue";
import { useRouter, useRoute } from "vue-router"; import { useRouter, useRoute } from "vue-router";
import { useShopStore } from '@/store/Shop' import { useShopStore } from "@/store/Shop";
import { showToast, showLoadingToast } from "vant"; import { showToast, showLoadingToast } from "vant";
import { register } from "@/services/auth"; import { register, checkPhone } from "@/services/auth";
const URL = window.URL || window.webkitURL; const URL = window.URL || window.webkitURL;
@ -79,18 +63,52 @@ const router = useRouter();
const shopStore = useShopStore(); const shopStore = useShopStore();
const isRegister = ref(route.query.type == "mobile" ? true : false);
const form = ref({ const form = ref({
phone: "", phone: "",
real_name: "",
email: "",
}); });
const onCheckPhone = async () => {
if (form.value.phone.length == 10) {
let { id_token } = JSON.parse(sessionStorage.getItem("reg"));
let res = await checkPhone({ token: id_token, phone: form.value.phone });
if (res.code === 200) {
showToast("您已是會員,已幫您綁定手機號碼");
Cookies.set("token", res.data.token, {
expires: 365,
domain: sso_domain.value,
});
Cookies.set("uid", res.data.uid, {
expires: 365,
domain: sso_domain.value,
});
router.push("/");
} else if (res.code === 201) {
showToast("您是我們的新會員,請輸入基本資料");
isRegister.value = true;
} else if (res.code === 202) {
showToast("該手機號已綁定Line帳號,請使用Line登入或更換手機號碼");
router.push('/login')
} else if (res.code === 401) {
showToast("line 登入已過期");
return router.push("/login");
}
} else {
showToast("手機號碼格式錯誤");
}
};
const onSubmit = async () => { const onSubmit = async () => {
let token = ''; let token = "";
if (route.query.type == "line") { if (route.query.type == "line") {
let { id_token } = JSON.parse(sessionStorage.getItem("reg")) let { id_token } = JSON.parse(sessionStorage.getItem("reg"));
token = id_token token = id_token;
} else { } else {
token = sessionStorage.getItem("reg") token = sessionStorage.getItem("reg");
} }
showLoadingToast({ showLoadingToast({
@ -99,6 +117,10 @@ const onSubmit = async () => {
forbidClick: true, forbidClick: true,
}); });
if (Cookies.get("refer_code")) {
form.value.refer_code = Cookies.get("refer_code");
}
let regRes = await register({ token, type: route.query.type, ...form.value }); let regRes = await register({ token, type: route.query.type, ...form.value });
if (regRes.code === 500) { if (regRes.code === 500) {
showToast("line 登入已過期"); showToast("line 登入已過期");

@ -106,6 +106,12 @@ let routes = [
meta: {isAuth: true}, meta: {isAuth: true},
component: ()=> import("../pages/My/Share/Index.vue") component: ()=> import("../pages/My/Share/Index.vue")
}, },
{
path: 'share/recommand',
name: 'UserShareRecommand',
meta: {isAuth: true},
component: ()=> import("../pages/My/Share/recommand.vue")
},
{ {
path: 'setting', path: 'setting',
name: 'UserSetting', name: 'UserSetting',
@ -139,6 +145,11 @@ let routes = [
name: 'Address', name: 'Address',
component: ()=> import("../pages/Address/Index.vue") component: ()=> import("../pages/Address/Index.vue")
}, },
{
path: '/user/bank',
name: 'UserBank',
component: ()=> import("../pages/My/Bank/Index.vue")
},
] ]
const router = createRouter({ const router = createRouter({

@ -12,6 +12,10 @@ export function login(params){
return request('/auth/login','post',params, {requestBase:'sso'}) return request('/auth/login','post',params, {requestBase:'sso'})
} }
export function checkPhone(params){
return request('/auth/checkPhone','post',params, {requestBase:'sso'})
}
export function sendVerify(username){ export function sendVerify(username){
return request('/auth/sendVerify','post', {username},{requestBase:'sso'}) return request('/auth/sendVerify','post', {username},{requestBase:'sso'})
} }

@ -0,0 +1,5 @@
import { request } from '@/utils/request'
export function checkBonusSn(bonus_sn) {
return request('/bonus/check','post',{bonus_sn})
}

@ -47,3 +47,15 @@ export function getUserAccInfo() {
export function getShareInfo() { export function getShareInfo() {
return request('/user/getShareInfo', 'get') return request('/user/getShareInfo', 'get')
} }
export function getUserBank() {
return request('/user/getBank', 'get')
}
export function updateUserBank(params) {
return request('/user/updateBank', 'post', params)
}
export function getRecommandList(page) {
return request('/user/getRecommandList', 'get', {page})
}

@ -20,11 +20,13 @@ export const useOrderStore = defineStore('order', {
}, },
goodsItems: [], goodsItems: [],
discount: 0, discount: 0,
bonus_sn: '',
extension_code: '', extension_code: '',
} }
}, },
getters: { getters: {
total_amount() { total_amount() {
return this.sum_amount + this.shipping.shipping_fee + this.payment.pay_fee - this.discount return this.sum_amount + this.shipping.shipping_fee + this.payment.pay_fee - this.discount
// return this.sum_amount + this.shipping.shipping_fee + this.payment.pay_fee - this.discount // return this.sum_amount + this.shipping.shipping_fee + this.payment.pay_fee - this.discount
}, },

@ -35,7 +35,6 @@ export async function initStore() {
} else { } else {
domain = hostname; domain = hostname;
} }
console.log('domain', domain)
shopStore.domain = hostname shopStore.domain = hostname
shopStore.sso_domain = domain shopStore.sso_domain = domain
} }

@ -10,7 +10,7 @@ import "nprogress/nprogress.css";
const ajax = axios.create({ const ajax = axios.create({
baseURL: import.meta.env.VITE_APP_API_URL, baseURL: import.meta.env.VITE_APP_API_URL,
withCredentials: true, withCredentials: true,
timeout: 5000 timeout: 30000
}) })
export const request = (url, method = 'GET', params = {}, config = {}) => { export const request = (url, method = 'GET', params = {}, config = {}) => {
@ -58,10 +58,11 @@ ajax.interceptors.response.use(
if (error.response) { if (error.response) {
switch (error.response.status) { switch (error.response.status) {
case 401: case 401:
Cookies.remove('token', { expires: 30, domain: useShopStore.sso_domain }) let shopStore = useShopStore()
Cookies.remove('uid', { expires: 30, domain: useShopStore.sso_domain }) Cookies.remove('token', { expires: 365, domain: shopStore.sso_domain })
Cookies.remove('uid', { expires: 365, domain: shopStore.sso_domain })
router.replace({ return router.replace({
path: '/login', path: '/login',
query: { redirect: router.currentRoute.fullPath } query: { redirect: router.currentRoute.fullPath }
}) })
@ -70,6 +71,9 @@ ajax.interceptors.response.use(
if (error.code === 'ERR_NETWORK') { if (error.code === 'ERR_NETWORK') {
return showToast('網路錯誤,請檢查是否上網') return showToast('網路錯誤,請檢查是否上網')
} }
if (error.code === 'ECONNABORTED') {
showToast('網路逾時,請重試')
}
return Promise.reject(error); return Promise.reject(error);
} }
) )

@ -29,5 +29,8 @@ export default defineConfig({
}, },
css: { css: {
},
build: {
outDir: ['slash'].includes(vite.meta.env.VITE_APP_ENV)?'../build/m':'./dist'
} }
}) })

Loading…
Cancel
Save