資料修改及社群分享

dev
Wayne 3 years ago
parent 920ff46f8c
commit bdcac9a8d8

@ -1,4 +1,4 @@
NODE_ENV = production
NODE_ENV = development
VITE_ENV = stage

Binary file not shown.

@ -19,6 +19,9 @@
"lodash": "^4.17.21",
"moment": "^2.29.4",
"nprogress": "^0.2.0",
"pinia": "^2.1.7",
"pinia-plugin-persist": "^1.0.0",
"pinia-plugin-persistedstate": "^3.2.0",
"pwacompat": "^2.0.17",
"qrcode.vue": "^3.4.1",
"register-service-worker": "^1.7.2",

@ -15,7 +15,11 @@
// import { useStore } from 'vuex'
// const store = useStore()
// import { useUserStore } from '@/store/user'
// const userStore = useUserStore();
// userStore.getUserData();
</script>
<style lang="less">

@ -0,0 +1,14 @@
import ajax from "./ajax";
//通訊錄
export const getUserData = async (params) =>
ajax(`/User/getUser`, params, "POST");
export const updateUserExtra = async (params) =>
ajax(`/User/updateUserExtra`, params, "POST");
export const updateUserLink = async (params) =>
ajax(`/User/updateUserLink`, params, "POST");
export const updateUserAddon = async (params) =>
ajax(`/User/updateUserAddon`, {nfc_addon:params}, "POST");

@ -2,6 +2,9 @@ import { createApp } from "vue";
import App from "./App.vue";
import router from "./router";
import store from "./store";
import { createPinia } from 'pinia'
import piniaPluginPersistedstate from 'pinia-plugin-persistedstate'
import liff from '@line/liff';
import { VueClipboard } from "@soerenmartius/vue3-clipboard";
@ -17,9 +20,11 @@ liff.init({
window.liff = liff;
const vue = createApp(App);
const pinia = createPinia();
pinia.use(piniaPluginPersistedstate);
// 將LIFF實例提供給應用
vue.use(VueClipboard);
vue.use(pinia);
vue.use(store).use(router).mount("#app");
}).catch((error) => {

@ -1,37 +1,41 @@
import { defineStore } from 'pinia'
import { getUserInfo, setUserTpl, toggleSendWithAD } from "@/api";
import { getUserData } from "@/api/user";
import { toggleSendWithAD } from "@/api";
export const useUserStore = defineStore('user', {
state: () => {
return {
userInfo: null,
userData: {
is_send_ad: 0,
},
}
},
getters: {
},
actions: {
async getUserInfo(context) {
var res = await getUserInfo();
async getUserData() {
console.log('store get userData');
var res = await getUserData();
if (res.code === 200) {
context.commit("setUserInfo", res.data);
this.userData = res.data
}
},
async setSendWithAd(payload){
let res = await toggleSendWithAD(payload);
if (res.code === 200) {
this.userData.is_send_ad = payload
return true;
}
return false;
}
// async setUserTpl(context, payload) {
// var res = await setUserTpl(payload);
// if (res.code === 200) {
// context.commit("setTpl", payload);
// }
// },
// async setSendWithAd(context, payload) {
// console.log('payload', payload);
// let res = await toggleSendWithAD(payload);
// if (res.code === 200) {
// context.commit("setSendWithAd", payload);
// return true;
// }
// return false;
// }
}
},
persist: true
})

@ -6,6 +6,7 @@ import { toClipboard } from "@soerenmartius/vue3-clipboard";
import { ref, computed, onBeforeMount } from "vue";
import { useRoute, useRouter } from "vue-router";
import { useStore } from "vuex";
import { useUserStore } from '@/store/user';
import { showToast, showSuccessToast, showConfirmDialog } from "vant";
import 'vant/es/toast/style';
@ -14,10 +15,14 @@ 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 store = useStore();
const userStore = useUserStore();
const showShare = ref(false);
const showNfcQrcode = ref(false);
@ -110,6 +115,8 @@ onBeforeMount(async () => {
store.dispatch("user/getUserInfo");
await userStore.getUserData();
handleAD();
});
@ -130,16 +137,17 @@ const noticeClick = (num) => {
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();
console.log('res',res)
if (res.code === 200) {
adData.value = res.data;
if (sessionStorage.getItem("isAdShow") == null) {
@ -170,14 +178,7 @@ const onUpdateValue = (newValue) => {
confirmButtonText: "確認",
cancelButtonText: "取消",
}).then(() => {
// let res = toggleSendWithAD(newValue);
// if (res.code === 200) {
// showToast("");
// } else {
// showToast("");
// }
store.dispatch("user/setSendWithAd", newValue);
let res = userStore.setSendWithAd(newValue)
}).catch(() => {
// on cancel
@ -185,8 +186,9 @@ const onUpdateValue = (newValue) => {
};
const userInfo = computed(() => {
return store.state.user.userInfo;
return userStore.userData;
});
const nfcurl = computed(() => {
@ -237,10 +239,12 @@ const doShare = () => {
};
const bindTggo = () => {
console.log(userInfo.value);
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 = () => {
@ -252,16 +256,17 @@ const handleLogout = () => {
sessionStorage.removeItem("isAdShow");
router.push("/login");
};
</script>
<template>
<div class="home page" v-cloak>
<van-nav-bar
class="bg-darkBlue py-3"
>
<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>
<a href="javascript:;">
<h5 class="text-gray">歡迎來到會員中心</h5>
</a>
</template>
<template #right>
<div class="btn btn-sm text-skyBlue" @click="handleLogout">
@ -270,35 +275,23 @@ const handleLogout = () => {
</template>
</van-nav-bar>
<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)"
>
<!-- 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.line_picture || import('@/assets/images/user.jpg')"
/>
<img :src="userInfo.avatar || noUserImg" />
</div>
<div class="info">
<h3 class="name">{{ userInfo.real_name }}</h3>
@ -356,11 +349,13 @@ const handleLogout = () => {
</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>
<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>
<template #button><van-button size="small" class="bg-tomatoRed text-white border-0"
@click="doCopy">複製連結</van-button></template>
</van-field>
</van-cell-group>
@ -410,78 +405,48 @@ const handleLogout = () => {
<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"
/>
<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>
<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>
<!-- <Footer /> -->
<van-dialog
v-model:show="showNfcQrcode"
title="電子名片二維碼"
:show-cancel-button="true"
cancel-button-text="關閉"
:show-confirm-button="false"
>
<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)' }"
>
<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 秒"
/>
<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"
<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>
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
><i class="fa-solid fa-fw fa-link"></i> 前往連結</van-button
>
<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>
@ -498,6 +463,7 @@ const handleLogout = () => {
align-items: center;
flex-direction: column;
height: 100%;
.clip {
position: absolute;
display: flex;
@ -511,6 +477,7 @@ const handleLogout = () => {
cursor: pointer;
z-index: 1005;
}
.top {
position: relative;
display: flex;
@ -518,16 +485,19 @@ const handleLogout = () => {
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;
@ -539,14 +509,17 @@ const handleLogout = () => {
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;
@ -555,31 +528,37 @@ const handleLogout = () => {
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;
@ -589,11 +568,13 @@ const handleLogout = () => {
height: 100px;
background-color: #fff;
border-radius: 0;
.img {
font-size: 35px;
line-height: 45px;
color: #345068;
}
.text {
font-size: 16px;
font-weight: bold;
@ -603,5 +584,4 @@ const handleLogout = () => {
}
}
}
</style>

@ -2,20 +2,24 @@
import _ from 'lodash'
import axios from 'axios'
import { ref , nextTick, onBeforeMount} from 'vue'
import { ref, onBeforeMount, onMounted } from 'vue'
import { Cropper } from 'vue-advanced-cropper';
import 'vue-advanced-cropper/dist/style.css';
// import Footer from '@/components/Footer.vue'
import { useStore } from 'vuex'
import { useUserStore } from '@/store/user'
import { useRouter } from 'vue-router'
import { showToast } from 'vant'
import { showLoadingToast,showSuccessToast } from 'vant';
import { showToast, showFailToast, showLoadingToast, showSuccessToast } from 'vant';
import { getUserInfo, updateUserInfo, updateCard, searchConnection, addUserFavi, setUserNfcTpl } from '@/api'
import { updateUserExtra, updateUserLink, updateUserAddon } from '@/api/user';
import imgTp1 from '@/assets/images/tp/tp_1.jpg'
import imgTp2 from '@/assets/images/tp/tp_2.jpg'
import imgTp3 from '@/assets/images/tp/tp_3.jpg'
@ -24,9 +28,13 @@ import imgTp4 from '@/assets/images/tp/tp_4.jpg'
const URL = window.URL || window.webkitURL;
const store = useStore()
const userStore = useUserStore()
const router = useRouter()
const form = ref({ addon: [] })
const uInfoForm = ref({ addon: [] })
const genderChecked = ref()
@ -38,6 +46,7 @@ const fileList = ref([]);
const myCrop = ref(null)
const tabActive = ref(0)
const tabItemObj = ref([
{ title: "基本資料", icon: "fa-id-card-clip" },
{ title: "社群分享", icon: "fa-share-nodes" },
@ -45,11 +54,6 @@ const tabItemObj = ref([
{ title: "版型設定", icon: "fa-layer-group" }
]);
const crop = ref({
show: false,
img: null,
})
const validatorUrl = (val) => {
if (val.length > 0) {
return /(https?:\/\/|line:\/\/|tel:|mailto:)\S+/.test(val)
@ -66,19 +70,27 @@ const validatorTel = (val) => {
}
};
// START:
// onMounted(async ()=>{
const crop = ref({
show: false,
img: null,
})
onMounted(async () => {
let userRes = await getUserInfo()
if (userRes.code === 200) {
form.value = userRes.data
} else {
}
// })
if (userRes.data.nfc_addon && (userRes.data.nfc_addon.length > 0)) {
form.value.addon = JSON.parse(userRes.data.nfc_addon)
}
console.log(form,"form")
})
const onCrop = () => {
const { canvas } = myCrop.value.getResult();
@ -203,17 +215,53 @@ const userExtraSubmit = async (values) => {
// message: '...',
// forbidClick: true,
// });
console.log("test",values);
let res = await updateUserInfo(values)
let res = await updateUserExtra(values)
if (res.code === 200) {
showSuccessToast('更新成功')
store.commit('user/setUserInfo',values)
router.push('/member')
// router.push('/member')
} else {
showToast.fail('更新失敗')
showFailToast('更新失敗')
}
};
// END:
// START:
const userLinkSubmit = async (values) => {
// showLoadingToast({
// duration: 0,
// message: '...',
// forbidClick: true,
// });
let res = await updateUserLink(values)
if (res.code === 200) {
showSuccessToast('更新成功')
// router.push('/member')
} else {
showFailToast('更新失敗')
}
};
const userAddonSubmit = async (values) => {
// showLoadingToast({
// duration: 0,
// message: '...',
// forbidClick: true,
// });
console.log(form.value.addon)
let res = await updateUserAddon(form.value.addon)
if (res.code === 200) {
showSuccessToast('更新成功')
} else {
showFailToast('更新失敗')
}
};
// END:
// START:
const search = ref({
@ -326,127 +374,48 @@ onBeforeMount(async () => {
<div class="text-center p-4">
<van-uploader :after-read="afterRead" :max-count="1" name="avatar" class="mb-4">
<div class="upload-main">
<img
class="upload-img avatar"
:src="form.avatar"
alt=""
v-if="form.avatar"
/>
<img
class="upload-img avatar"
src="@/assets/images/upload.jpg"
alt=""
v-else
/>
<img class="upload-img avatar" :src="form.avatar" alt="" v-if="form.avatar" />
<img class="upload-img avatar" src="@/assets/images/upload.jpg" alt="" v-else />
<div class="ml-3">
<p class="text-skyBlue mb-2">上傳圖片預設為Line頭像</p>
<van-button class="btn-darkBlue" icon="plus" block size="small">上傳檔案</van-button>
</div>
</div>
</van-uploader>
<van-field
v-model="form.mark"
rows="3"
type="textarea"
maxlength="100"
name="mark"
placeholder="請輸入100字以內的簡介"
show-word-limit
:style="{border:'1px #e3e3e3 solid',borderRadius:'6px'}"
/>
<van-field v-model="form.mark" rows="3" type="textarea" maxlength="100" name="mark" placeholder="請輸入100字以內的簡介"
show-word-limit :style="{ border: '1px #e3e3e3 solid', borderRadius: '6px' }" />
</div>
<van-field
v-model="form.real_name"
label="姓名"
name="real_name"
placeholder="請輸入您的姓名"
:rules="[{ required: true, message: '姓名為必填' }]"
/>
<van-field
v-model="form.company"
label="公司名稱"
name="company"
placeholder="請輸入您的公司名稱"
:rules="[{ required: true, message: '公司名稱必填' }]"
/>
<van-field
v-model="form.title"
label="職稱"
name="title"
placeholder="請輸入您的職稱"
/>
<van-field
v-model="form.phone"
label="手機"
name="phone"
type="tel"
placeholder="Ex. 0900000001 不要有空格"
:rules="[{ required: true, message: '手機號必填' },{ pattern: /\d{10}/ , message: '手機號格式錯誤' }]"
/>
<van-field
v-model="form.tel"
label="市話"
name="tel"
type="tel"
placeholder="請輸入您的市話"
:rules="[{ validator: validatorTel, message: '市話格式不正確,Ex. 02xxxx or 02-xxxx' }]"
/>
<van-field
v-model="form.email"
label="Email"
name="email"
placeholder="請輸入您的Email"
:rules="[{ required: true, message: 'Email必填' },{ pattern: /^([\w\.\-]){1,64}\@([\w\.\-]){1,64}/ , message: 'Email格式錯誤' }]"
/>
<van-field
v-model="form.address"
label="住址"
name="address"
placeholder="請輸入您的地址"
/>
<van-field
v-model="form.age"
label="年齡"
name="age"
placeholder="請輸入您的年齡"
/>
<van-field v-model="form.real_name" label="姓名" name="real_name" placeholder="請輸入您的姓名"
:rules="[{ required: true, message: '姓名為必填' }]" />
<van-field v-model="form.company" label="公司名稱" name="company" placeholder="請輸入您的公司名稱"
:rules="[{ required: true, message: '公司名稱必填' }]" />
<van-field v-model="form.title" label="職稱" name="title" placeholder="請輸入您的職稱" />
<van-field v-model="form.phone" label="手機" name="phone" type="tel" placeholder="Ex. 0900000001 不要有空格"
:rules="[{ required: true, message: '手機號必填' }, { pattern: /\d{10}/, message: '手機號格式錯誤' }]" />
<van-field v-model="form.tel" label="市話" name="tel" type="tel" placeholder="請輸入您的市話"
:rules="[{ validator: validatorTel, message: '市話格式不正確,Ex. 02xxxx or 02-xxxx' }]" />
<van-field v-model="form.email" label="Email" name="email" placeholder="請輸入您的Email"
:rules="[{ required: true, message: 'Email必填' }, { pattern: /^([\w\.\-]){1,64}\@([\w\.\-]){1,64}/, message: 'Email格式錯誤' }]" />
<van-field v-model="form.address" label="住址" name="address" placeholder="請輸入您的地址" />
<van-field v-model="form.age" label="年齡" name="age" placeholder="請輸入您的年齡" />
<van-field name="sex" label="性別">
<template #input>
<van-radio-group
v-model="genderChecked"
direction="horizontal"
checked-color="#345068"
>
<van-radio-group v-model="genderChecked" direction="horizontal" checked-color="#345068">
<van-radio name="0"></van-radio>
<van-radio name="1"></van-radio>
</van-radio-group>
</template>
</van-field>
<van-field
v-model="form.area"
label="區域"
name="area"
placeholder="請選擇縣市區域"
/>
<van-field
v-model="form.work"
label="工作性質"
name="work"
placeholder="請選擇工作性質"
/>
<van-field v-model="form.area" label="區域" name="area" placeholder="請選擇縣市區域" />
<van-field v-model="form.work" label="工作性質" name="work" placeholder="請選擇工作性質" />
<van-field readonly>
<template #label>是否公開<br />資料搜尋</template>
<template #input>
<van-switch
v-model="searchChecked"
@update:model-value="searchOnUpdateValue"
size="18px"
active-color="#345068"
inactive-color="#888888"
/>
<van-switch v-model="searchChecked" @update:model-value="searchOnUpdateValue" size="18px"
active-color="#345068" inactive-color="#888888" />
</template>
</van-field>
@ -460,88 +429,44 @@ onBeforeMount(async () => {
</van-form>
</van-cell-group>
<van-cell-group inset>
<van-cell-group inset v-if="userStore.userData.level === 3">
<van-form @submit="userExtraSubmit">
<van-cell class="text-center bg-lightPink py-3">
<template #title>
<h6 class="text-darkBlue"><strong>人脈資訊</strong></h6>
<div style="text-align: center;">
下面為客製型會員專屬提供被搜尋
</div>
</template>
</van-cell>
<van-field
v-model="form.introduction"
name="introduction"
placeholder="請輸入簡短的自我介紹"
label-align="top"
>
<van-field v-model="form.introduction" name="introduction" placeholder="請輸入簡短的自我介紹" label-align="top">
<template #label>
<i class="fa-solid fa-gem text-darkBlue"></i> 一句話介紹自己
</template>
</van-field>
<van-divider
:style="{
<van-divider :style="{
color: '#345068',
borderColor: '#345068',
padding: '0 16px',
}"
><strong>貴人資源共享</strong></van-divider
>
<div style="text-align: center;">
下面為客製型會員專屬提供被搜尋
</div>
}"><strong>貴人資源共享</strong></van-divider>
<van-collapse v-model="resourceActive" accordion>
<van-collapse-item title="工商簡介" name="3">
<van-field
v-model="form.exchange"
rows="3"
type="textarea"
name="exchange"
maxlength="100"
placeholder="請填寫工商簡介"
show-word-limit
/>
<van-field
v-model="form.exchange_link"
label="分享網址:"
name="exchange_link"
placeholder="需求連結"
/>
<van-field v-model="form.exchange" rows="3" type="textarea" name="exchange" maxlength="100"
placeholder="請填寫工商簡介" show-word-limit />
<van-field v-model="form.exchange_link" label="分享網址:" name="exchange_link" placeholder="需求連結" />
</van-collapse-item>
<van-collapse-item title="我能分享的資源" name="1">
<van-field
v-model="form.supply"
rows="3"
type="textarea"
maxlength="100"
name="supply"
placeholder="請填寫能分享的資源"
show-word-limit
/>
<van-field
v-model="form.supply_link"
label="分享網址:"
name="supply_link"
placeholder="分享網址"
:rules="[{ validator: validatorUrl, message: '網址格式不正確,Ex. http://' }]"
/>
<van-field v-model="form.supply" rows="3" type="textarea" maxlength="100" name="supply"
placeholder="請填寫能分享的資源" show-word-limit />
<van-field v-model="form.supply_link" label="分享網址:" name="supply_link" placeholder="分享網址"
:rules="[{ validator: validatorUrl, message: '網址格式不正確,Ex. http://' }]" />
</van-collapse-item>
<van-collapse-item title="我需要的資源" name="2">
<van-field
v-model="form.demand"
rows="3"
type="textarea"
maxlength="100"
name="demand"
placeholder="請填寫需要的的資源"
show-word-limit
/>
<van-field
v-model="form.demand_link"
label="分享網址:"
name="demand_link"
placeholder="需求連結"
/>
<van-field v-model="form.demand" rows="3" type="textarea" maxlength="100" name="demand"
placeholder="請填寫需要的的資源" show-word-limit />
<van-field v-model="form.demand_link" label="分享網址:" name="demand_link" placeholder="需求連結" />
</van-collapse-item>
</van-collapse>
@ -556,43 +481,14 @@ onBeforeMount(async () => {
<div class="content cnt1" v-show="tabActive === 1">
<van-cell-group inset>
<van-form @submit="onSubmit">
<van-field
v-model="form.nfcurl"
label="個人網頁"
name=""
placeholder="請輸入您的個人網頁"
/>
<van-field
v-model="form.line"
label="Line"
name=""
placeholder="請輸入您的Line ID"
/>
<van-field
v-model="form.facebook"
label="Facebook"
name=""
placeholder="請輸入您的Facebook"
/>
<van-field
v-model="form.ig"
label="IG"
name=""
placeholder="請輸入您的IG"
/>
<van-field
v-model="form.youTube"
label="YouTube"
name=""
placeholder="請輸入您的YouTube"
/>
<van-field
v-model="form.wechat"
label="WeChat"
name=""
placeholder="請輸入您的WeChat"
/>
<van-form @submit="userLinkSubmit">
<van-field v-model="form.url" label="個人網頁" name="url" placeholder="請輸入您的個人網頁" />
<van-field v-model="form.line" label="Line" name="line" placeholder="請輸入您的Line ID" />
<van-field v-model="form.facebook" label="Facebook" name="facebook" placeholder="請輸入您的Facebook" />
<van-field v-model="form.ig" label="IG" name="ig" placeholder="請輸入您的IG" />
<van-field v-model="form.youTube" label="YouTube" name="youtube" placeholder="請輸入您的YouTube" />
<van-field v-model="form.wechat" label="WeChat" name="wechat" placeholder="請輸入您的WeChat" />
<van-field v-model="form.tiktok" label="Tiktok" name="tiktok" placeholder="請輸入您的Tiktok" />
<div class="px-5 py-4">
<van-button block class="btn-darkBlue" native-type="submit">
@ -603,7 +499,7 @@ onBeforeMount(async () => {
</van-cell-group>
<van-cell-group inset>
<van-form @submit="onSubmit">
<van-form @submit="userAddonSubmit">
<van-cell class="bg-lightPink">
<template #title>
<h6 class="text-darkBlue"><strong>相關連結</strong></h6>
@ -617,26 +513,20 @@ onBeforeMount(async () => {
<van-field v-for="(item, idx) in form.addon" :key="idx">
<template #label>
<van-field
v-model="item.name"
name=""
maxlength="10"
placeholder="請輸入您的連結名稱"
:rules="[{ required: true, message: '連結名稱必填' }]"
/>
<van-field v-model="item.name" name="" maxlength="10" placeholder="請輸入您的連結名稱"
:rules="[{ required: true, message: '連結名稱必填' }]" />
</template>
<template #input>
<van-field
v-model="item.link"
name=""
placeholder="請輸入您的按鈕連結"
:rules="[{ required: true, message: '按鈕連結必填' }]"
/>
<van-field v-model="item.link" name="" placeholder="請輸入您的按鈕連結"
:rules="[{ required: true, message: '按鈕連結必填' }]" />
</template>
<template #button>
<van-button size="small" class="ml-1 btn-tomatoRed" icon="delete-o" hairline @click="onDelBtn(idx)"></van-button>
<van-button size="small" class="ml-1 btn-skyBlue" icon="arrow-up" hairline @click="onMoveBtn(0,idx)"></van-button>
<van-button size="small" class="ml-1 btn-skyBlue" icon="arrow-down" plain hairline @click="onMoveBtn(1,idx)"></van-button>
<van-button size="small" class="ml-1 btn-tomatoRed" icon="delete-o" hairline
@click="onDelBtn(idx)"></van-button>
<van-button size="small" class="ml-1 btn-skyBlue" icon="arrow-up" hairline
@click="onMoveBtn(0, idx)"></van-button>
<van-button size="small" class="ml-1 btn-skyBlue" icon="arrow-down" plain hairline
@click="onMoveBtn(1, idx)"></van-button>
</template>
</van-field>
@ -674,43 +564,22 @@ onBeforeMount(async () => {
<div class="content cnt2" v-show="tabActive === 2">
<van-cell-group inset>
<van-row align="center">
<van-col span="8">
<van-field
v-model="tab2result"
is-link
readonly
name="picker"
:border="false"
placeholder="請選擇"
@click="tab2showPicker = true"
/>
<van-col span="12">
<van-field v-model="tab2result" is-link readonly name="picker" :border="false" placeholder="請選擇"
@click="tab2showPicker = true" />
<van-popup v-model:show="tab2showPicker" position="bottom">
<van-picker
:columns="tab2columns"
@confirm="tab2OnConfirm"
@cancel="tab2showPicker = false"
/>
<van-picker :columns="tab2columns" @confirm="tab2OnConfirm" @cancel="tab2showPicker = false" />
</van-popup>
</van-col>
<van-col span="16">
<van-search
v-model="search.keyword"
placeholder="請輸入搜尋關鍵字"
@search="tab2OnSearch"
/>
<van-col span="12">
<van-search v-model="search.keyword" placeholder="請輸入搜尋關鍵字" @search="tab2OnSearch" />
</van-col>
</van-row>
</van-cell-group>
<van-cell-group inset>
<van-list
v-model:loading="loading"
:finished="finished"
finished-text="没有更多了"
@load="tab2ListonLoad"
class="accordion"
id="accordion"
>
<van-list v-model:loading="loading" :finished="finished" finished-text="" @load="tab2ListonLoad"
class="accordion" id="accordion">
<!-- <van-cell v-for="item in list" :key="item" :title="item" > -->
<!-- <van-cell v-for="item in tab2list" :key="item" :title="item">
<template #title>
@ -737,10 +606,13 @@ onBeforeMount(async () => {
</div>
</div>
<div class="right">
<van-button size="normal" class="border-0" data-toggle="collapse" :href="`#c${index}`" role="button" aria-expanded="false" :aria-controls="`c${index}`">
<van-button size="normal" class="border-0" data-toggle="collapse" :href="`#c${index}`" role="button"
aria-expanded="false" :aria-controls="`c${index}`">
<h5><i class="fa-solid fa-layer-group text-darkBlue"></i></h5>
</van-button>
<van-button size="normal" class="border-0" @click="handleAddFavi(item.user_id)"><h5><i class="fa-solid fa-comment-medical text-darkBlue"></i></h5></van-button>
<van-button size="normal" class="border-0" @click="handleAddFavi(item.user_id)">
<h5><i class="fa-solid fa-comment-medical text-darkBlue"></i></h5>
</van-button>
</div>
<div class="bottom collapse" :id="`c${index}`" data-parent="#accordion">
<h6 class="text-darkBlue"><strong>我能分享的資源</strong></h6>
@ -770,12 +642,7 @@ onBeforeMount(async () => {
</van-cell>
<div class="block">
<van-image
width="100%"
position="top"
fit="cover"
:src="imgTp1"
/>
<van-image width="100%" position="top" fit="cover" :src="imgTp1" />
</div>
<div class="d-flex justify-content-center py-3">
@ -794,9 +661,7 @@ onBeforeMount(async () => {
<van-col span="12" v-for="(item, index) in tab3list" :key="index">
<div class="imgBtn" :data-id="index">
<div class="imgCnt">
<van-image
:src="imgTp1"
/>
<van-image :src="imgTp1" />
</div>
</div>
</van-col>
@ -810,15 +675,9 @@ onBeforeMount(async () => {
<h5 class="text-center mt-3">檔案裁切上傳</h5>
<div class="cropper-section">
<div class="crop-area">
<cropper
class="cropper"
ref="myCrop"
:src="crop.img"
:stencil-props="{
<cropper class="cropper" ref="myCrop" :src="crop.img" :stencil-props="{
aspectRatio: 1 / 1,
}"
:auto-zoom="true"
/>
}" :auto-zoom="true" />
</div>
<van-button round class="btn-tomatoRed rounded-pill w-50 mt-3" size="small" @click="onCrop">
裁切確認
@ -841,10 +700,12 @@ onBeforeMount(async () => {
padding: 15px 0;
margin: 0 15px;
border-bottom: 1px #e3e3e3 solid;
.left {
flex: 1 0 0%;
display: flex;
align-items: center;
.avatar {
width: 55px;
min-width: 55px;
@ -852,19 +713,23 @@ onBeforeMount(async () => {
border-radius: 50%;
margin-right: 10px;
overflow: hidden;
img {
width: 100%;
height: 100%;
object-fit: cover;
}
}
.name {
font-weight: bold;
}
}
.right {
flex: 0 0 auto;
}
.bottom {
flex: 1 0 100%;
border: 1px #e3e3e3 solid;
@ -872,6 +737,7 @@ onBeforeMount(async () => {
padding: 0 10px;
margin: 0;
transition: all .2s;
&.show {
padding: 10px;
margin: 5px 0;
@ -890,6 +756,7 @@ onBeforeMount(async () => {
overflow: hidden;
overflow-y: auto;
}
.imgBtn {
padding: 10px;
margin: 10px;
@ -899,12 +766,16 @@ onBeforeMount(async () => {
cursor: pointer;
transform: scale(1);
transition: all .3s;
&.active,&:hover{
&.active,
&:hover {
transform: scale(1.02);
}
.imgCnt {
width: 100%;
height: 150px;
img {
width: 100%;
height: 100%;

@ -1,41 +1,26 @@
<script setup>
import { ref } from 'vue'
import { useStore } from 'vuex'
import { Toast } from 'vant'
// import Footer from '@/components/Footer.vue'
import { setUserLevel } from '@/api'
import { useRouter } from 'vue-router'
import { getSiteConfig } from '@/api'
const store = useStore()
const router = useRouter()
const shopContent = ref('')
let res = await getSiteConfig()
console.log(res)
if (res.code === 200) {
store.commit('setSiteConfig',res.data)
shopContent.value = res.data.shop_content
} else {
showToast('系統錯誤')
router.push('/home')
}
shopContent.value=store.state.config.shop_content
const setlevel = async (level)=>{
// let res = await setUserLevel(level)
// store.commit('user/setLevel',level)
// showToast('')
// router.push('/')
// window.location.href = 'http://www.tggo.com.tw/book.cgi?user=omo'
}
</script>
<template>
@ -59,22 +44,25 @@ const setlevel = async (level)=>{
.main-section {
width: 100%;
}
.recommend {
width: 100%;
padding-top: 2%;
}
.recommend ul {
width: 100%;
display: flex;
flex-wrap: wrap;
justify-content: space-between;
}
.recommend ul li {
width: 48%;
flex-direction: column;
margin: 1%;
img {
width: 100%;
}
}
</style>
}</style>

@ -7,16 +7,121 @@
resolved "https://registry.npmjs.org/@antfu/utils/-/utils-0.7.6.tgz"
integrity sha512-pvFiLP2BeOKA/ZOS6jxx4XhKzdVLHDhGlFEaZ2flWWYf2xOqVniqpk38I04DFRyz+L0ASggl7SkItTc+ZLju4w==
"@babel/parser@^7.15.8", "@babel/parser@^7.23.0":
"@babel/parser@^7.23.0":
version "7.23.0"
resolved "https://registry.npmjs.org/@babel/parser/-/parser-7.23.0.tgz"
integrity sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw==
"@esbuild/android-arm64@0.18.20":
version "0.18.20"
resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.18.20.tgz#984b4f9c8d0377443cc2dfcef266d02244593622"
integrity sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==
"@esbuild/android-arm@0.18.20":
version "0.18.20"
resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.18.20.tgz#fedb265bc3a589c84cc11f810804f234947c3682"
integrity sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==
"@esbuild/android-x64@0.18.20":
version "0.18.20"
resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.18.20.tgz#35cf419c4cfc8babe8893d296cd990e9e9f756f2"
integrity sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==
"@esbuild/darwin-arm64@0.18.20":
version "0.18.20"
resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.18.20.tgz#08172cbeccf95fbc383399a7f39cfbddaeb0d7c1"
integrity sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==
"@esbuild/darwin-x64@0.18.20":
version "0.18.20"
resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.18.20.tgz#d70d5790d8bf475556b67d0f8b7c5bdff053d85d"
integrity sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==
"@esbuild/freebsd-arm64@0.18.20":
version "0.18.20"
resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.20.tgz#98755cd12707f93f210e2494d6a4b51b96977f54"
integrity sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==
"@esbuild/freebsd-x64@0.18.20":
version "0.18.20"
resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.18.20.tgz#c1eb2bff03915f87c29cece4c1a7fa1f423b066e"
integrity sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==
"@esbuild/linux-arm64@0.18.20":
version "0.18.20"
resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.18.20.tgz#bad4238bd8f4fc25b5a021280c770ab5fc3a02a0"
integrity sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==
"@esbuild/linux-arm@0.18.20":
version "0.18.20"
resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.18.20.tgz#3e617c61f33508a27150ee417543c8ab5acc73b0"
integrity sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==
"@esbuild/linux-ia32@0.18.20":
version "0.18.20"
resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.18.20.tgz#699391cccba9aee6019b7f9892eb99219f1570a7"
integrity sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==
"@esbuild/linux-loong64@0.18.20":
version "0.18.20"
resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.18.20.tgz#e6fccb7aac178dd2ffb9860465ac89d7f23b977d"
integrity sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==
"@esbuild/linux-mips64el@0.18.20":
version "0.18.20"
resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.18.20.tgz#eeff3a937de9c2310de30622a957ad1bd9183231"
integrity sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==
"@esbuild/linux-ppc64@0.18.20":
version "0.18.20"
resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.18.20.tgz#2f7156bde20b01527993e6881435ad79ba9599fb"
integrity sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==
"@esbuild/linux-riscv64@0.18.20":
version "0.18.20"
resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.18.20.tgz#6628389f210123d8b4743045af8caa7d4ddfc7a6"
integrity sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==
"@esbuild/linux-s390x@0.18.20":
version "0.18.20"
resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.18.20.tgz#255e81fb289b101026131858ab99fba63dcf0071"
integrity sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==
"@esbuild/linux-x64@0.18.20":
version "0.18.20"
resolved "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.18.20.tgz"
integrity sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==
"@esbuild/netbsd-x64@0.18.20":
version "0.18.20"
resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.18.20.tgz#30e8cd8a3dded63975e2df2438ca109601ebe0d1"
integrity sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==
"@esbuild/openbsd-x64@0.18.20":
version "0.18.20"
resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.18.20.tgz#7812af31b205055874c8082ea9cf9ab0da6217ae"
integrity sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==
"@esbuild/sunos-x64@0.18.20":
version "0.18.20"
resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.18.20.tgz#d5c275c3b4e73c9b0ecd38d1ca62c020f887ab9d"
integrity sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==
"@esbuild/win32-arm64@0.18.20":
version "0.18.20"
resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.18.20.tgz#73bc7f5a9f8a77805f357fab97f290d0e4820ac9"
integrity sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==
"@esbuild/win32-ia32@0.18.20":
version "0.18.20"
resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.18.20.tgz#ec93cbf0ef1085cc12e71e0d661d20569ff42102"
integrity sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==
"@esbuild/win32-x64@0.18.20":
version "0.18.20"
resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.18.20.tgz#786c5f41f043b07afb1af37683d7c33668858f6d"
integrity sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==
"@jridgewell/gen-mapping@^0.3.0":
version "0.3.3"
resolved "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz"
@ -596,7 +701,7 @@
"@nodelib/fs.stat" "2.0.5"
run-parallel "^1.1.9"
"@nodelib/fs.stat@^2.0.2", "@nodelib/fs.stat@2.0.5":
"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2":
version "2.0.5"
resolved "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz"
integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==
@ -650,7 +755,7 @@
resolved "https://registry.npmjs.org/@types/estree/-/estree-1.0.3.tgz"
integrity sha512-CS2rOaoQ/eAgAfcTfq6amKG7bsN+EMcgGY4FAFQdvSj2y1ixvOZTUA9mOtCai7E1SYu283XNw7urKK30nP3wkQ==
"@types/node@*", "@types/node@^18.0.0", "@types/node@>= 14":
"@types/node@*", "@types/node@^18.0.0":
version "18.18.6"
resolved "https://registry.npmjs.org/@types/node/-/node-18.18.6.tgz"
integrity sha512-wf3Vz+jCmOQ2HV1YUJuCWdL64adYxumkrxtc+H1VUQlnQI04+5HtH+qZCOE21lBE7gIrt+CwX2Wv8Acrw5Ak6w==
@ -765,7 +870,7 @@
"@vue/compiler-ssr" "3.3.6"
"@vue/shared" "3.3.6"
"@vue/shared@^3.0.0", "@vue/shared@3.3.6":
"@vue/shared@3.3.6", "@vue/shared@^3.0.0":
version "3.3.6"
resolved "https://registry.npmjs.org/@vue/shared/-/shared-3.3.6.tgz"
integrity sha512-Xno5pEqg8SVhomD0kTSmfh30ZEmV/+jZtyh39q6QflrjdJCXah5lrnOLi9KB6a5k5aAHXMXjoMnxlzUkCNfWLQ==
@ -800,7 +905,7 @@ asn1@~0.2.3:
dependencies:
safer-buffer "~2.1.0"
assert-plus@^1.0.0, assert-plus@1.0.0:
assert-plus@1.0.0, assert-plus@^1.0.0:
version "1.0.0"
resolved "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz"
integrity sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==
@ -1010,6 +1115,13 @@ debounce@^1.2.0:
resolved "https://registry.npmjs.org/debounce/-/debounce-1.2.1.tgz"
integrity sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug==
debug@2.6.9:
version "2.6.9"
resolved "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz"
integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==
dependencies:
ms "2.0.0"
debug@^3.2.6:
version "3.2.7"
resolved "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz"
@ -1024,16 +1136,9 @@ debug@^4.3.4:
dependencies:
ms "2.1.2"
debug@2.6.9:
version "2.6.9"
resolved "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz"
integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==
dependencies:
ms "2.0.0"
deepmerge@^4.2.2:
version "4.3.1"
resolved "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz"
resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.3.1.tgz#44b5f2147cd3b00d4b56137685966f26fd25dd4a"
integrity sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==
define-data-property@^1.1.1:
@ -1128,7 +1233,7 @@ extend@~3.0.2:
resolved "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz"
integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==
extsprintf@^1.2.0, extsprintf@1.3.0:
extsprintf@1.3.0, extsprintf@^1.2.0:
version "1.3.0"
resolved "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz"
integrity sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==
@ -1205,6 +1310,11 @@ form-data@~2.3.2:
combined-stream "^1.0.6"
mime-types "^2.1.12"
fsevents@~2.3.2:
version "2.3.3"
resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6"
integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==
function-bind@^1.1.2:
version "1.1.2"
resolved "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz"
@ -1327,13 +1437,6 @@ http-signature@~1.2.0:
jsprim "^1.2.2"
sshpk "^1.7.0"
iconv-lite@^0.6.3:
version "0.6.3"
resolved "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz"
integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==
dependencies:
safer-buffer ">= 2.1.2 < 3.0.0"
iconv-lite@0.4.24:
version "0.4.24"
resolved "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz"
@ -1341,6 +1444,13 @@ iconv-lite@0.4.24:
dependencies:
safer-buffer ">= 2.1.2 < 3"
iconv-lite@^0.6.3:
version "0.6.3"
resolved "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz"
integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==
dependencies:
safer-buffer ">= 2.1.2 < 3.0.0"
ieee754@^1.2.1:
version "1.2.1"
resolved "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz"
@ -1351,7 +1461,7 @@ image-size@~0.5.0:
resolved "https://registry.npmjs.org/image-size/-/image-size-0.5.5.tgz"
integrity sha512-6TDAlDPZxUFCv+fuOkIoXT/V/f3Qbq8e37p+YOiYrUv3v9cc3/6x78VdfPgFVaB9dZYeLUfKgHRebpkm/oP2VQ==
inherits@^2.0.3, inherits@2.0.4:
inherits@2.0.4, inherits@^2.0.3:
version "2.0.4"
resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz"
integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==
@ -1457,7 +1567,7 @@ jsprim@^1.2.2:
json-schema "0.4.0"
verror "1.10.0"
less@*, less@^4.2.0:
less@^4.2.0:
version "4.2.0"
resolved "https://registry.npmjs.org/less/-/less-4.2.0.tgz"
integrity sha512-P3b3HJDBtSzsXUl0im2L7gTO5Ubg8mEN6G8qoTS77iXxXX4Hvu4Qj540PZDvQ8V6DmX6iXo98k7Md0Cm1PrLaA==
@ -1551,11 +1661,6 @@ moment@^2.29.4:
resolved "https://registry.npmjs.org/moment/-/moment-2.29.4.tgz"
integrity sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w==
ms@^2.1.1:
version "2.1.3"
resolved "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz"
integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==
ms@2.0.0:
version "2.0.0"
resolved "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz"
@ -1566,6 +1671,11 @@ ms@2.1.2:
resolved "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz"
integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==
ms@^2.1.1:
version "2.1.3"
resolved "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz"
integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==
nanoid@^3.3.6:
version "3.3.6"
resolved "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz"
@ -1675,6 +1785,26 @@ pify@^4.0.1:
resolved "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz"
integrity sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==
pinia-plugin-persist@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/pinia-plugin-persist/-/pinia-plugin-persist-1.0.0.tgz#fc696f225527f30bd5955109fafadd43c725e888"
integrity sha512-M4hBBd8fz/GgNmUPaaUsC29y1M09lqbXrMAHcusVoU8xlQi1TqgkWnnhvMikZwr7Le/hVyMx8KUcumGGrR6GVw==
dependencies:
vue-demi "^0.12.1"
pinia-plugin-persistedstate@^3.2.0:
version "3.2.0"
resolved "https://registry.yarnpkg.com/pinia-plugin-persistedstate/-/pinia-plugin-persistedstate-3.2.0.tgz#9932ca2ae88aa6c0d6763bebc6447d7bd1f097d0"
integrity sha512-tZbNGf2vjAQcIm7alK40sE51Qu/m9oWr+rEgNm/2AWr1huFxj72CjvpQcIQzMknDBJEkQznCLAGtJTIcLKrKdw==
pinia@^2.1.7:
version "2.1.7"
resolved "https://registry.yarnpkg.com/pinia/-/pinia-2.1.7.tgz#4cf5420d9324ca00b7b4984d3fbf693222115bbc"
integrity sha512-+C2AHFtcFqjPih0zpYuvof37SFxMQ7OEG2zV9jRI12i9BOy3YQVAHwdKtyyc8pDcDyIc33WCIsZaCFWU7WWxGQ==
dependencies:
"@vue/devtools-api" "^6.5.0"
vue-demi ">=0.14.5"
pngjs@^3.3.3:
version "3.4.0"
resolved "https://registry.npmjs.org/pngjs/-/pngjs-3.4.0.tgz"
@ -1719,11 +1849,6 @@ qrcode.vue@^3.4.1:
resolved "https://registry.npmjs.org/qrcode.vue/-/qrcode.vue-3.4.1.tgz"
integrity sha512-wq/zHsifH4FJ1GXQi8/wNxD1KfQkckIpjK1KPTc/qwYU5/Bkd4me0w4xZSg6EXk6xLBkVDE0zxVagewv5EMAVA==
qs@~6.5.2:
version "6.5.3"
resolved "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz"
integrity sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==
qs@6.11.0:
version "6.11.0"
resolved "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz"
@ -1731,6 +1856,11 @@ qs@6.11.0:
dependencies:
side-channel "^1.0.4"
qs@~6.5.2:
version "6.5.3"
resolved "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz"
integrity sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==
queue-microtask@^1.2.2:
version "1.2.3"
resolved "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz"
@ -1814,7 +1944,7 @@ reusify@^1.0.4:
resolved "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz"
integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==
rollup@^1.20.0||^2.0.0||^3.0.0||^4.0.0, rollup@^3.27.1:
rollup@^3.27.1:
version "3.29.4"
resolved "https://registry.npmjs.org/rollup/-/rollup-3.29.4.tgz"
integrity sha512-oWzmBZwvYrU0iJHtDmhsm662rC15FRXmcjCk1xD771dFDx5jJ02ufAQQTn0etB2emNk4J9EZg/yWKpsn9BWGRw==
@ -1833,7 +1963,7 @@ safe-buffer@^5.0.1, safe-buffer@^5.1.2, safe-buffer@~5.2.0:
resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz"
integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==
safer-buffer@^2.0.2, safer-buffer@^2.1.0, "safer-buffer@>= 2.1.2 < 3", "safer-buffer@>= 2.1.2 < 3.0.0", safer-buffer@~2.1.0:
"safer-buffer@>= 2.1.2 < 3", "safer-buffer@>= 2.1.2 < 3.0.0", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0:
version "2.1.2"
resolved "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz"
integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==
@ -1878,7 +2008,7 @@ setprototypeof@1.2.0:
shvl@^2.0.3:
version "2.0.3"
resolved "https://registry.npmjs.org/shvl/-/shvl-2.0.3.tgz"
resolved "https://registry.yarnpkg.com/shvl/-/shvl-2.0.3.tgz#eb4bd37644f5684bba1fc52c3010c96fb5e6afd1"
integrity sha512-V7C6S9Hlol6SzOJPnQ7qzOVEWUQImt3BNmmzh40wObhla3XOYMe4gGiYzLrJd5TFa+cI2f9LKIRJTTKZSTbWgw==
side-channel@^1.0.4:
@ -1948,7 +2078,7 @@ supports-preserve-symlinks-flag@^1.0.0:
resolved "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz"
integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==
terser@^5.24.0, terser@^5.4.0:
terser@^5.24.0:
version "5.24.0"
resolved "https://registry.npmjs.org/terser/-/terser-5.24.0.tgz"
integrity sha512-ZpGR4Hy3+wBEzVEnHvstMvqpD/nABNelQn/z2r0fjVWGQsN3bpOLzQlqDxmb4CDZnXq5lpjnQ+mHQLAOpfM5iw==
@ -2097,7 +2227,7 @@ verror@1.10.0:
core-util-is "1.0.2"
extsprintf "^1.2.0"
vite@^4.0.0, vite@^4.4.5:
vite@^4.4.5:
version "4.5.0"
resolved "https://registry.npmjs.org/vite/-/vite-4.5.0.tgz"
integrity sha512-ulr8rNLA6rkyFAlVWw2q5YJ91v098AFQ2R0PRFwPzREXOUJQPtFUG0t+/ZikhaOCDqFoDhN6/v8Sq0o4araFAw==
@ -2122,6 +2252,16 @@ vue-cropper@^0.6.4:
resolved "https://registry.npmjs.org/vue-cropper/-/vue-cropper-0.6.4.tgz"
integrity sha512-U3bm17Li/Xwfw2t3pr8/hFE/tYhvwIWqepHK9IFC1TnX1KFd64VyfCD9nMBhPY91RyvMC6jSQgT/DyDNKuTpIQ==
vue-demi@>=0.14.5:
version "0.14.6"
resolved "https://registry.yarnpkg.com/vue-demi/-/vue-demi-0.14.6.tgz#dc706582851dc1cdc17a0054f4fec2eb6df74c92"
integrity sha512-8QA7wrYSHKaYgUxDA5ZC24w+eHm3sYCbp0EzcDwKqN3p6HqtTCGR/GVsPyZW92unff4UlcSh++lmqDWN3ZIq4w==
vue-demi@^0.12.1:
version "0.12.5"
resolved "https://registry.yarnpkg.com/vue-demi/-/vue-demi-0.12.5.tgz#8eeed566a7d86eb090209a11723f887d28aeb2d1"
integrity sha512-BREuTgTYlUr0zw0EZn3hnhC3I6gPWv+Kwh4MCih6QcAeaTlaIX0DwOVN0wHej7hSvDPecz4jygy/idsgKfW58Q==
vue-router@^4.2.5:
version "4.2.5"
resolved "https://registry.npmjs.org/vue-router/-/vue-router-4.2.5.tgz"
@ -2129,7 +2269,7 @@ vue-router@^4.2.5:
dependencies:
"@vue/devtools-api" "^6.5.0"
vue@^3.0.0, vue@^3.2.0, vue@^3.2.25, vue@^3.3.4, "vue@2 || 3", vue@3.3.6:
vue@^3.3.4:
version "3.3.6"
resolved "https://registry.npmjs.org/vue/-/vue-3.3.6.tgz"
integrity sha512-jJIDETeWJnoY+gfn4ZtMPMS5KtbP4ax+CT4dcQFhTnWEk8xMupFyQ0JxL28nvT/M4+p4a0ptxaV2WY0LiIxvRg==
@ -2142,13 +2282,13 @@ vue@^3.0.0, vue@^3.2.0, vue@^3.2.25, vue@^3.3.4, "vue@2 || 3", vue@3.3.6:
vuex-persistedstate@^4.1.0:
version "4.1.0"
resolved "https://registry.npmjs.org/vuex-persistedstate/-/vuex-persistedstate-4.1.0.tgz"
resolved "https://registry.yarnpkg.com/vuex-persistedstate/-/vuex-persistedstate-4.1.0.tgz#127165f85f5b4534fb3170a5d3a8be9811bd2a53"
integrity sha512-3SkEj4NqwM69ikJdFVw6gObeB0NHyspRYMYkR/EbhR0hbvAKyR5gksVhtAfY1UYuWUOCCA0QNGwv9pOwdj+XUQ==
dependencies:
deepmerge "^4.2.2"
shvl "^2.0.3"
"vuex@^3.0 || ^4.0.0-rc", vuex@^4.1.0:
vuex@^4.1.0:
version "4.1.0"
resolved "https://registry.npmjs.org/vuex/-/vuex-4.1.0.tgz"
integrity sha512-hmV6UerDrPcgbSy9ORAtNXDr9M4wlNP4pEFKye4ujJF8oqgFFuxDCdOLS3eNoRTtq5O3hoBDh9Doj1bQMYHRbQ==

Loading…
Cancel
Save