會員資料頁面修改

dev
DESKTOP-8UQ1PPR\09158 3 years ago
parent 1b16d983ea
commit d374e3c57e

@ -4,9 +4,9 @@ VITE_ENV = development
VITE_APP_BASE_URL = https://utel.zltest.com.tw
VITE_APP_LINE_LIFF_ID = 1656907652-p38ddKzQ
VITE_APP_LINE_LIFF_ID = 2000917272-PBWoXdOl
VITE_APP_SEND_URL = https://liff.line.me/1656907652-VJq33Pdg
VITE_APP_SEND_URL = https://liff.line.me/2000917272-PBWoXdOl
VITE_APP_API_URL = https://utel.zltest.com.tw/appapi/v1

@ -1,18 +1,31 @@
@charset "UTF-8";
@import url("https://fonts.googleapis.com/css2?family=Montserrat:ital,wght@0,300;0,400;0,500;0,600;0,700;0,800;0,900;1,300;1,400;1,500;1,600;1,700;1,800;1,900&family=Open+Sans:ital,wght@0,300;0,400;0,600;0,700;0,800;1,300;1,400;1,600;1,700;1,800&family=Raleway:ital,wght@0,100;0,200;0,300;0,400;0,500;0,600;0,700;0,800;0,900;1,100;1,200;1,300;1,400;1,500;1,600;1,700;1,800;1,900&display=swap");
.text-skyBlue {
.text-lightBlue {
color: #b2c4ce !important;
}
.bg-skyBlue {
.bg-lightBlue {
background-color: #b2c4ce !important;
}
.bd-skyBlue {
.bd-lightBlue {
border-style: solid;
border-color: #b2c4ce !important;
}
.text-skyBlue {
color: #5b7b94 !important;
}
.bg-skyBlue {
background-color: #5b7b94 !important;
}
.bd-skyBlue {
border-style: solid;
border-color: #5b7b94 !important;
}
.text-moBlue {
color: #486499 !important;
}
@ -39,17 +52,17 @@
border-color: #345068 !important;
}
.text-pink {
color: #fdebeb !important;
.text-lightPink {
color: #f1e6e2 !important;
}
.bg-pink {
background-color: #fdebeb !important;
.bg-lightPink {
background-color: #f1e6e2 !important;
}
.bd-pink {
.bd-lightPink {
border-style: solid;
border-color: #fdebeb !important;
border-color: #f1e6e2 !important;
}
.text-cherry {
@ -298,23 +311,33 @@ h1, h2, h3, h4, h5, h6 {
margin: 0;
}
.btn-outline-earthGold, .btn-outline-tomatoRed, .btn-outline-limeGreen, .btn-outline-cherry, .btn-outline-pink, .btn-outline-darkBlue, .btn-outline-moBlue, .btn-outline-skyBlue, .btn-earthGold, .btn-tomatoRed, .btn-limeGreen, .btn-cherry, .btn-pink, .btn-darkBlue, .btn-moBlue, .btn-skyBlue {
.btn-outline-earthGold, .btn-outline-tomatoRed, .btn-outline-limeGreen, .btn-outline-cherry, .btn-outline-lightPink, .btn-outline-darkBlue, .btn-outline-moBlue, .btn-outline-skyBlue, .btn-outline-lightBlue, .btn-earthGold, .btn-tomatoRed, .btn-limeGreen, .btn-cherry, .btn-lightPink, .btn-darkBlue, .btn-moBlue, .btn-skyBlue, .btn-lightBlue {
border-radius: 3px;
}
.limit.btn-outline-earthGold, .limit.btn-outline-tomatoRed, .limit.btn-outline-limeGreen, .limit.btn-outline-cherry, .limit.btn-outline-pink, .limit.btn-outline-darkBlue, .limit.btn-outline-moBlue, .limit.btn-outline-skyBlue, .limit.btn-earthGold, .limit.btn-tomatoRed, .limit.btn-limeGreen, .limit.btn-cherry, .limit.btn-pink, .limit.btn-darkBlue, .limit.btn-moBlue, .limit.btn-skyBlue {
.limit.btn-outline-earthGold, .limit.btn-outline-tomatoRed, .limit.btn-outline-limeGreen, .limit.btn-outline-cherry, .limit.btn-outline-lightPink, .limit.btn-outline-darkBlue, .limit.btn-outline-moBlue, .limit.btn-outline-skyBlue, .limit.btn-outline-lightBlue, .limit.btn-earthGold, .limit.btn-tomatoRed, .limit.btn-limeGreen, .limit.btn-cherry, .limit.btn-lightPink, .limit.btn-darkBlue, .limit.btn-moBlue, .limit.btn-skyBlue, .limit.btn-lightBlue {
width: 200px;
}
.btn-skyBlue {
.btn-lightBlue {
border: 1px solid #b2c4ce !important;
color: #fff;
background-color: #b2c4ce;
}
.btn-skyBlue:hover {
.btn-lightBlue:hover {
color: #fff;
background-color: #93acba;
}
.btn-skyBlue {
border: 1px solid #5b7b94 !important;
color: #fff;
background-color: #5b7b94;
}
.btn-skyBlue:hover {
color: #fff;
background-color: #486174;
}
.btn-moBlue {
border: 1px solid #486499 !important;
color: #fff;
@ -335,14 +358,14 @@ h1, h2, h3, h4, h5, h6 {
background-color: #233646;
}
.btn-pink {
border: 1px solid #fdebeb !important;
.btn-lightPink {
border: 1px solid #f1e6e2 !important;
color: #fff;
background-color: #fdebeb;
background-color: #f1e6e2;
}
.btn-pink:hover {
.btn-lightPink:hover {
color: #fff;
background-color: #f8bdbd;
background-color: #e0c8c0;
}
.btn-cherry {
@ -385,20 +408,33 @@ h1, h2, h3, h4, h5, h6 {
background-color: #ab8753;
}
.btn-outline-skyBlue {
.btn-outline-lightBlue {
border: 1px solid #b2c4ce;
color: #b2c4ce;
background-color: transparent;
background-color: #fff;
}
.btn-outline-lightBlue:hover {
color: #fff;
background-color: #b2c4ce;
}
.btn-outline-skyBlue {
border: 1px solid #5b7b94;
color: #5b7b94;
background-color: transparent;
background-color: #fff;
}
.btn-outline-skyBlue:hover {
color: #fff;
background-color: #b2c4ce;
background-color: #5b7b94;
}
.btn-outline-moBlue {
border: 1px solid #486499;
color: #486499;
background-color: transparent;
background-color: #fff;
}
.btn-outline-moBlue:hover {
color: #fff;
@ -409,26 +445,29 @@ h1, h2, h3, h4, h5, h6 {
border: 1px solid #345068;
color: #345068;
background-color: transparent;
background-color: #fff;
}
.btn-outline-darkBlue:hover {
color: #fff;
background-color: #345068;
}
.btn-outline-pink {
border: 1px solid #fdebeb;
color: #fdebeb;
.btn-outline-lightPink {
border: 1px solid #f1e6e2;
color: #f1e6e2;
background-color: transparent;
background-color: #fff;
}
.btn-outline-pink:hover {
.btn-outline-lightPink:hover {
color: #fff;
background-color: #fdebeb;
background-color: #f1e6e2;
}
.btn-outline-cherry {
border: 1px solid #E31D64;
color: #E31D64;
background-color: transparent;
background-color: #fff;
}
.btn-outline-cherry:hover {
color: #fff;
@ -439,6 +478,7 @@ h1, h2, h3, h4, h5, h6 {
border: 1px solid #94ac5e;
color: #94ac5e;
background-color: transparent;
background-color: #fff;
}
.btn-outline-limeGreen:hover {
color: #fff;
@ -449,6 +489,7 @@ h1, h2, h3, h4, h5, h6 {
border: 1px solid #f85d5d;
color: #f85d5d;
background-color: transparent;
background-color: #fff;
}
.btn-outline-tomatoRed:hover {
color: #fff;
@ -459,6 +500,7 @@ h1, h2, h3, h4, h5, h6 {
border: 1px solid #BC9F75;
color: #BC9F75;
background-color: transparent;
background-color: #fff;
}
.btn-outline-earthGold:hover {
color: #fff;
@ -498,10 +540,109 @@ h1, h2, h3, h4, h5, h6 {
display: none;
}
.home {
background-color: #f1e6e2;
/* ========================================= vant ============================================= */
.van-field__label {
position: relative;
font-weight: bold;
}
.van-field__label:before {
position: absolute;
left: -8px;
}
.van-tabs {
padding: 20px 0 0px;
}
.van-tabs .van-tabs__wrap {
height: initial;
}
.van-tabs .van-tabs__wrap .van-tabs__nav {
padding: 0;
background-color: transparent;
}
.van-tabs .van-tabs__wrap .van-tabs__nav .van-tab.van-tab--active .tab_item {
color: #345068;
}
.van-tabs .van-tabs__wrap .van-tabs__nav .van-tab .tab_item {
display: -webkit-box;
display: -ms-flexbox;
display: flex;
-webkit-box-align: center;
-ms-flex-align: center;
align-items: center;
-webkit-box-orient: vertical;
-webkit-box-direction: normal;
-ms-flex-direction: column;
flex-direction: column;
color: #5b7b94;
}
.van-tabs .van-tabs__wrap .van-tabs__nav .van-tabs__line {
bottom: 0;
background: #345068;
}
.van-cell-group {
border-radius: 5px;
overflow: hidden;
}
.van-cell-group .van-cell::after {
border-bottom: 1px #e3e3e3 solid;
-webkit-transform: none;
transform: none;
}
/* ========================================= stage ============================================= */
.content {
padding: 15px 0;
background-color: #b2c4ce;
}
.card {
border: none;
margin-bottom: 15px;
}
.card .card-body {
padding: 5px 15px;
}
.card .card-body .item {
position: relative;
display: -webkit-box;
display: -ms-flexbox;
display: flex;
-webkit-box-pack: justify;
-ms-flex-pack: justify;
justify-content: space-between;
-webkit-box-align: center;
-ms-flex-align: center;
align-items: center;
width: 100%;
font-size: 15px;
}
.card .card-body .item + .item {
border-top: 1px solid #e3e3e3;
}
.card .card-body .item .left {
-webkit-box-flex: 0;
-ms-flex: 0 0 auto;
flex: 0 0 auto;
padding: 8px 0;
font-weight: bold;
}
.card .card-body .item .right {
-webkit-box-flex: 1;
-ms-flex: 1 0 0px;
flex: 1 0 0;
color: #666;
}
.card .card-body .item .right a {
color: #666;
}
.card .card-body .item i, .card .card-body .item svg {
color: #839eb6;
margin-right: 6px;
}
/* ========================================= other ============================================= */
.imgCnt {
position: relative;
overflow: hidden;
@ -511,8 +652,6 @@ h1, h2, h3, h4, h5, h6 {
height: 100%;
-o-object-fit: cover;
object-fit: cover;
-webkit-transition: all 0.3s;
transition: all 0.3s;
}
/*!

@ -1,144 +0,0 @@
.my-account {
position: relative;
width: 100%;
padding: 20px 15px;
}
.my-account .avatar {
display: -webkit-box;
display: -ms-flexbox;
display: flex;
-webkit-box-pack: justify;
-ms-flex-pack: justify;
justify-content: space-between;
-webkit-box-align: center;
-ms-flex-align: center;
align-items: center;
}
.my-account .avatar .left {
display: -webkit-box;
display: -ms-flexbox;
display: flex;
-webkit-box-align: center;
-ms-flex-align: center;
align-items: center;
-webkit-box-flex: 1;
-ms-flex: 1 0 0px;
flex: 1 0 0;
}
.my-account .avatar .left .imgCnt {
width: 80px;
height: 80px;
min-width: 80px;
border-radius: 50%;
border: 2px #fff solid;
overflow: hidden;
margin-right: 15px;
}
.my-account .avatar .left .imgCnt img {
width: 100%;
height: 100%;
-o-object-fit: cover;
object-fit: cover;
}
.my-account .avatar .left .info .name {
font-weight: bold;
color: #303a47;
}
.my-account .avatar .left .info .conpany {
margin-top: 5px;
}
.my-account .avatar .right {
-webkit-box-flex: 0;
-ms-flex: 0 0 auto;
flex: 0 0 auto;
}
.my-account .recommend {
display: -webkit-box;
display: -ms-flexbox;
display: flex;
-webkit-box-pack: justify;
-ms-flex-pack: justify;
justify-content: space-between;
-webkit-box-align: center;
-ms-flex-align: center;
align-items: center;
padding: 20px 0 10px;
}
.my-account .recommend .btn {
display: -webkit-box;
display: -ms-flexbox;
display: flex;
-webkit-box-pack: center;
-ms-flex-pack: center;
justify-content: center;
-webkit-box-align: center;
-ms-flex-align: center;
align-items: center;
-webkit-box-orient: vertical;
-webkit-box-direction: normal;
-ms-flex-direction: column;
flex-direction: column;
width: 30%;
height: 100px;
background-color: #fff;
border-radius: 0;
}
.my-account .recommend .btn .img {
font-size: 35px;
line-height: 45px;
color: #345068;
}
.my-account .recommend .btn .text {
font-size: 16px;
font-weight: bold;
color: #345068;
}
.content {
padding: 15px;
background-color: #b2c4ce;
}
.content .card {
border: none;
margin-bottom: 15px;
}
.content .card .card-body {
padding: 5px 15px;
}
.content .card .card-body .item {
position: relative;
display: -webkit-box;
display: -ms-flexbox;
display: flex;
-webkit-box-pack: justify;
-ms-flex-pack: justify;
justify-content: space-between;
-webkit-box-align: center;
-ms-flex-align: center;
align-items: center;
width: 100%;
font-size: 15px;
}
.content .card .card-body .item + .item {
border-top: 1px solid #e3e3e3;
}
.content .card .card-body .item .left {
-webkit-box-flex: 0;
-ms-flex: 0 0 auto;
flex: 0 0 auto;
padding: 8px 0;
font-weight: bold;
}
.content .card .card-body .item .right {
-webkit-box-flex: 1;
-ms-flex: 1 0 0px;
flex: 1 0 0;
color: #666;
}
.content .card .card-body .item .right a {
color: #666;
}
.content .card .card-body .item i, .content .card .card-body .item svg {
color: #839eb6;
margin-right: 6px;
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 28 KiB

After

Width:  |  Height:  |  Size: 17 KiB

@ -16,10 +16,11 @@ $radius: (
//
$basicColor: (
skyBlue:#b2c4ce,
lightBlue:#b2c4ce,
skyBlue:#5b7b94,
moBlue:#486499,
darkBlue:#345068,
pink:#fdebeb,
lightPink:#f1e6e2,
cherry:#E31D64,
mintGreen:#f2f8e7,
limeGreen:#94ac5e,
@ -31,10 +32,11 @@ $basicColor: (
$textArr:
(lightBlue, map-get($basicColor, lightBlue)),
(skyBlue, map-get($basicColor, skyBlue)),
(moBlue, map-get($basicColor, moBlue)),
(darkBlue, map-get($basicColor, darkBlue)),
(pink, map-get($basicColor, pink)),
(lightPink, map-get($basicColor, lightPink)),
(cherry, map-get($basicColor, cherry)),
(mintGreen, map-get($basicColor, mintGreen)),
(limeGreen, map-get($basicColor, limeGreen)),

@ -1,8 +1,9 @@
$normalArr:
(lightBlue, #fff, map-get($basicColor, lightBlue), map-get($basicColor, lightBlue)),
(skyBlue, #fff, map-get($basicColor, skyBlue), map-get($basicColor, skyBlue)),
(moBlue, #fff, map-get($basicColor, moBlue), map-get($basicColor, moBlue)),
(darkBlue, #fff, map-get($basicColor, darkBlue), map-get($basicColor, darkBlue)),
(pink, #fff, map-get($basicColor, pink), map-get($basicColor, pink)),
(lightPink, #fff, map-get($basicColor, lightPink), map-get($basicColor, lightPink)),
(cherry, #fff, map-get($basicColor, cherry), map-get($basicColor, cherry)),
(limeGreen, #fff, map-get($basicColor, limeGreen), map-get($basicColor, limeGreen)),
(tomatoRed, #fff, map-get($basicColor, tomatoRed), map-get($basicColor, tomatoRed)),
@ -10,10 +11,11 @@ $normalArr:
;
$outlineArr:
(lightBlue, 1px, map-get($basicColor, lightBlue), transparent, map-get($basicColor, lightBlue)),
(skyBlue, 1px, map-get($basicColor, skyBlue), transparent, map-get($basicColor, skyBlue)),
(moBlue, 1px, map-get($basicColor, moBlue), transparent, map-get($basicColor, moBlue)),
(darkBlue, 1px, map-get($basicColor, darkBlue), transparent, map-get($basicColor, darkBlue)),
(pink, 1px, map-get($basicColor, pink), transparent, map-get($basicColor, pink)),
(lightPink, 1px, map-get($basicColor, lightPink), transparent, map-get($basicColor, lightPink)),
(cherry, 1px, map-get($basicColor, cherry), transparent, map-get($basicColor, cherry)),
(limeGreen, 1px, map-get($basicColor, limeGreen), transparent, map-get($basicColor, limeGreen)),
(tomatoRed, 1px, map-get($basicColor, tomatoRed), transparent, map-get($basicColor, tomatoRed)),
@ -32,6 +34,7 @@ $outlineArr:
@each $class, $bdWidth, $color, $bgColor, $bdColor in $outlineArr {
.btn-outline-#{"" + $class} {
@include outlineBtn($bdWidth, $color, $bgColor, $bdColor);
background-color: #fff;
}
}

@ -2,10 +2,102 @@
display: none;
}
.home{
background-color: #f1e6e2;
/* ========================================= vant ============================================= */
.van-field__label{
position: relative;
font-weight: bold;
&:before{
position: absolute;
left:-8px;
}
}
.van-tabs{
padding:20px 0 0px;
.van-tabs__wrap{
height:initial;
.van-tabs__nav{
padding:0;
background-color: transparent;
.van-tab{
&.van-tab--active{
.tab_item{
color: #345068;
}
}
.tab_item{
display: flex;
align-items: center;
flex-direction: column;
color: #5b7b94;
}
}
.van-tabs__line{
bottom:0;
background: #345068;
}
}
}
}
.van-cell-group{
border-radius: 5px;
overflow: hidden;
.van-cell{
&::after{
border-bottom:1px #e3e3e3 solid;
transform: none;
}
}
}
/* ========================================= stage ============================================= */
.content{
padding: 15px 0;
background-color: #b2c4ce;
}
.card {
border: none;
// border-radius: 0;
margin-bottom: 15px;
.card-body{
padding: 5px 15px;
.item {
position: relative;
display: flex;
justify-content: space-between;
align-items: center;
width:100%;
font-size: 15px;
&+.item{
border-top: 1px solid #e3e3e3;
}
.left{
flex: 0 0 auto;
padding: 8px 0;
font-weight: bold;
}
.right{
flex: 1 0 0;
color: #666;
a{
color: #666;
}
}
i,svg{
color: #839eb6;
margin-right: 6px;
}
}
}
}
/* ========================================= other ============================================= */
.imgCnt{
position: relative;
overflow: hidden;
@ -13,6 +105,14 @@
width:100%;
height:100%;
object-fit: cover;
transition: all .3s;
}
}

@ -1,109 +0,0 @@
.my-account {
position: relative;
width: 100%;
padding: 20px 15px;
.avatar{
display: flex;
justify-content: space-between;
align-items: center;
.left{
display: flex;
align-items: center;
flex: 1 0 0;
.imgCnt{
width:80px;
height: 80px;
min-width: 80px;
border-radius: 50%;
border:2px #fff solid;
overflow: hidden;
margin-right: 15px;
img{
width:100%;
height: 100%;
object-fit: cover;
}
}
.info{
.name{
font-weight: bold;
color: #303a47;
}
.conpany{
margin-top: 5px;
}
}
}
.right{
flex: 0 0 auto;
}
}
.recommend{
display: flex;
justify-content: space-between;
align-items: center;
padding: 20px 0 10px;
.btn{
display: flex;
justify-content: center;
align-items: center;
flex-direction: column;
width:30%;
height: 100px;
background-color: #fff;
border-radius: 0;
.img{
font-size: 35px;
line-height: 45px;
color: #345068;
}
.text{
font-size: 16px;
font-weight: bold;
color: #345068;
}
}
}
}
.content{
padding: 15px;
background-color: #b2c4ce;
.card {
border: none;
// border-radius: 0;
margin-bottom: 15px;
.card-body{
padding: 5px 15px;
.item {
position: relative;
display: flex;
justify-content: space-between;
align-items: center;
width:100%;
font-size: 15px;
&+.item{
border-top: 1px solid #e3e3e3;
}
.left{
flex: 0 0 auto;
padding: 8px 0;
font-weight: bold;
}
.right{
flex: 1 0 0;
color: #666;
a{
color: #666;
}
}
i,svg{
color: #839eb6;
margin-right: 6px;
}
}
}
}
}

@ -245,11 +245,13 @@ const handleLogout = () => {
</script>
<template>
<div class="home" v-cloak>
<div class="header">
<h4 class="uname">UTEL電子名片系統</h4>
<a href="javascript:;"><h5 class="umoney phone">歡迎來到會員中心</h5></a>
</div>
<div class="home bg-lightPink" v-cloak>
<van-nav-bar class="bg-darkBlue py-3">
<template #title>
<h4 class="text-white mb-1"><strong>UTEL電子名片系統</strong></h4>
<a href="javascript:;"><h5 class="text-gray">歡迎來到會員中心</h5></a>
</template>
</van-nav-bar>
<van-notice-bar
color="#ffffff"
@ -282,8 +284,8 @@ const handleLogout = () => {
/>
</div>
<div class="info">
<h4 class="name">{{ userInfo.real_name }}</h4>
<h6 class="conpany">{{ userInfo.company }}</h6>
<h3 class="name">{{ userInfo.real_name }}</h3>
<h5 class="conpany">{{ userInfo.company }}</h5>
</div>
</div>
<div class="right">
@ -297,15 +299,15 @@ const handleLogout = () => {
</div>
<div class="recommend">
<div class="btn btn-outline-skyBlue" @click="router.push('/shop')">
<div class="btn btn-outline-lightBlue" @click="router.push('/shop')">
<div class="img"><i class="fa-solid fa-cart-arrow-down"></i></div>
<div class="text">立即開通</div>
</div>
<div class="btn btn-outline-skyBlue" @click="goCardEdit">
<div class="btn btn-outline-lightBlue" @click="goCardEdit">
<div class="img"><i class="fa-solid fa-id-card"></i></div>
<div class="text">商務卡片</div>
</div>
<div class="btn btn-outline-skyBlue">
<div class="btn btn-outline-lightBlue">
<div class="img"><i class="fa-solid fa-address-book"></i></div>
<div class="text">通訊錄</div>
</div>
@ -536,7 +538,6 @@ const handleLogout = () => {
</template>
<style src="@/assets/css/main.css"></style>
<style src="@/assets/css/page/index.css"></style>
<style lang="less" scoped>
.wrapper {
@ -581,4 +582,73 @@ const handleLogout = () => {
}
}
}
.my-account {
position: relative;
width: 100%;
padding: 20px 15px;
.avatar{
display: flex;
justify-content: space-between;
align-items: center;
.left{
display: flex;
align-items: center;
flex: 1 0 0;
.imgCnt{
width:80px;
height: 80px;
min-width: 80px;
border-radius: 50%;
border:2px #fff solid;
overflow: hidden;
margin-right: 15px;
img{
width:100%;
height: 100%;
object-fit: cover;
}
}
.info{
.name{
font-weight: bold;
color: #303a47;
}
.conpany{
margin-top: 5px;
}
}
}
.right{
flex: 0 0 auto;
}
}
.recommend{
display: flex;
justify-content: space-between;
align-items: center;
padding: 20px 0 10px;
.btn{
display: flex;
justify-content: center;
align-items: center;
flex-direction: column;
width:30%;
height: 100px;
background-color: #fff;
border-radius: 0;
.img{
font-size: 35px;
line-height: 45px;
color: #345068;
}
.text{
font-size: 16px;
font-weight: bold;
color: #345068;
}
}
}
}
</style>

@ -1,4 +1,4 @@
<script>
<script setup>
import _ from 'lodash'
import axios from 'axios'
@ -18,360 +18,342 @@ import { getUserInfo , updateCard , getMovie } from '@/api'
const URL = window.URL || window.webkitURL;
export default {
name: 'EditForm',
components: {
Footer,
Cropper
},
async setup(){
const store = useStore()
const router = useRouter()
const form = ref({addon:[]})
const fileList = ref([]);
const myCrop = ref(null)
const active = ref(0)
const showChangeIcon = ref(false)
const crop = ref({
show: false,
img: null,
})
const validatorUrl = (val) => {
if(val.length>0){
return /(https?:\/\/|line:\/\/|tel:|mailto:)\S+/.test(val)
}else{
return true
}
};
const validatorTel = (val) => {
if(val.length>0){
return /(\d{2,3}-?|\(\d{2,3}\))\d{3,4}-?\d{4}/.test(val)
}else{
return true
}
};
// 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)
}
const store = useStore()
const router = useRouter()
const onCrop = () => {
const { canvas } = myCrop.value.getResult();
if (canvas) {
const imgFile = new FormData();
canvas.toBlob(async (blob) => {
let ufile = new File([blob], "image.jpg");
imgFile.append("user_id", form.value.user_id)
imgFile.append("fileType", "IMAGE")
imgFile.append('file', ufile)
crop.value.show = false
showLoadingToast({
duration: 0,
message: '圖片上傳中...',
forbidClick: true,
});
let res = await axios.post(
`${import.meta.env.VITE_APP_API_URL}/user/uploadAvatar`,
imgFile,
{
}
)
if (res.data.code == 200) {
form.value.avatar = res.data.data
showSuccessToast('上傳成功');
}else{
showToast.fail('上傳失敗');
}
}, 'image/jpeg');
}
return
}
const form = ref({addon:[]})
const onClose = () =>{
crop.value.show = false
}
const afterRead = async(file, name) => {
crop.value.show = true
const ofile = file.file
crop.value.img = URL.createObjectURL(ofile);
// crop.value.img = ofile
return
};
const onAddBtn = () => {
if(form.value.addon){
form.value.addon.push({icon:'',name:'',link:''})
}else{
form.value.addon = [{icon:'',name:'',link:''}]
}
}
const fileList = ref([]);
const onDelBtn = (index) => {
form.value.addon.splice(index, 1)
}
const myCrop = ref(null)
const tabActive = ref(0)
const tabItemObj = ref([
{title:"基本資料",icon:"fa-id-card-clip"},
{title:"社群分享",icon:"fa-share-nodes"},
{title:"人脈資訊",icon:"fa-gem"},
{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)
}else{
return true
}
};
const onMoveBtn = (type, index) => {
if (type === 0) {
if (index !== 0) {
[form.value.addon[index], form.value.addon[index - 1]] = [form.value.addon[index - 1], form.value.addon[index]]
}
} else {
if (index + 1 !== form.value.addon.length) {
[form.value.addon[index + 1], form.value.addon[index]] = [form.value.addon[index], form.value.addon[index + 1]]
}
}
const validatorTel = (val) => {
if(val.length>0){
return /(\d{2,3}-?|\(\d{2,3}\))\d{3,4}-?\d{4}/.test(val)
}else{
return true
}
};
// 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)
}
const onCrop = () => {
const { canvas } = myCrop.value.getResult();
if (canvas) {
const imgFile = new FormData();
canvas.toBlob(async (blob) => {
let ufile = new File([blob], "image.jpg");
imgFile.append("user_id", form.value.user_id)
imgFile.append("fileType", "IMAGE")
imgFile.append('file', ufile)
crop.value.show = false
showLoadingToast({
duration: 0,
message: '圖片上傳中...',
forbidClick: true,
});
let res = await axios.post(
`${import.meta.env.VITE_APP_API_URL}/user/uploadAvatar`,
imgFile,
{
}
)
if (res.data.code == 200) {
form.value.avatar = res.data.data
showSuccessToast('上傳成功');
}else{
showToast.fail('上傳失敗');
}
}, 'image/jpeg');
}
return
}
const onClose = () =>{
crop.value.show = false
}
const onSubmit = async () => {
showLoadingToast({
duration: 0,
message: '資料更新中...',
forbidClick: true,
});
let res = await updateCard(form.value)
if(res.code===200){
showSuccessToast('更新成功')
store.commit('user/setUserInfo',form.value)
router.push('/')
}else{
showToast.fail('更新失敗')
}
};
return {
form,
fileList,
crop,
myCrop,
active,
showChangeIcon,
onAddBtn,
onDelBtn,
onMoveBtn,
validatorUrl,
validatorTel,
onCrop,
onClose,
afterRead,
onSubmit
const afterRead = async(file, name) => {
crop.value.show = true
const ofile = file.file
crop.value.img = URL.createObjectURL(ofile);
// crop.value.img = ofile
return
};
const onAddBtn = () => {
if(form.value.addon){
form.value.addon.push({icon:'',name:'',link:''})
}else{
form.value.addon = [{icon:'',name:'',link:''}]
}
}
const onDelBtn = (index) => {
form.value.addon.splice(index, 1)
}
const onMoveBtn = (type, index) => {
if (type === 0) {
if (index !== 0) {
[form.value.addon[index], form.value.addon[index - 1]] = [form.value.addon[index - 1], form.value.addon[index]]
}
} else {
if (index + 1 !== form.value.addon.length) {
[form.value.addon[index + 1], form.value.addon[index]] = [form.value.addon[index], form.value.addon[index + 1]]
}
}
}
const onSubmit = async () => {
showLoadingToast({
duration: 0,
message: '資料更新中...',
forbidClick: true,
});
let res = await updateCard(form.value)
if(res.code===200){
showSuccessToast('更新成功')
store.commit('user/setUserInfo',form.value)
router.push('/')
}else{
showToast.fail('更新失敗')
}
};
</script>
<template>
<div class="member-container">
<van-nav-bar title="個人資料修改" right-text="" @click-right="$router.push('/')" />
<van-tabs :lazy-render="true" v-model:active="active">
<van-tab title="基本資料">
</van-tab>
<van-tab title="更多連結">
<div class="member bg-lightPink">
<van-nav-bar class="bg-skyBlue py-1" left-arrow @click-left="$router.push('/')">
<template #title>
<h5 class="text-white mb-1"><strong>會員資料</strong></h5>
</template>
<template #left>
<h4><i class="fa-solid fa-angle-left text-white" :style="{opacity:0.5}"></i></h4>
</template>
</van-nav-bar>
<van-tabs class="van-tabs" :lazy-render="true" v-model:active="tabActive">
<van-tab v-for="(item, index) in tabItemObj">
<template #title>
<div class="tab_item">
<i :class="`fa-solid ${item.icon} fa-2x mb-1`"></i>
<p class="mb-3">{{item.title}}</p>
</div>
</template>
</van-tab>
</van-tabs>
<van-form @submit="onSubmit">
<van-cell-group inset v-show="active === 0">
<van-field
v-model="form.real_name"
label="姓名"
name="pattern"
placeholder="請輸入您的姓名"
:rules="[{ required: true, message: '姓名為必填' }]"
/>
<van-field
v-model="form.company"
label="公司名稱"
name=""
placeholder="請輸入您的公司名稱"
:rules="[{ required: true, message: '公司名稱必填' }]"
/>
<van-field
v-model="form.title"
label="職稱"
name=""
placeholder="請輸入您的職稱"
/>
<van-field
v-model="form.phone"
label="手機"
name=""
type="tel"
placeholder="Ex. 0900000001 不要有空格"
:rules="[{ required: true, message: '手機號必填' },{ pattern: /\d{10}/ , message: '手機號格式錯誤' }]"
/>
<van-field
v-model="form.tel"
label="市話"
name=""
type="tel"
placeholder="請輸入您的市話"
:rules="[{ validator: validatorTel, message: '市話格式不正確,Ex. 02xxxx or 02-xxxx' }]"
/>
<van-field
v-model="form.email"
label="Email"
name=""
placeholder="請輸入您的Email"
:rules="[{ required: true, message: 'Email必填' },{ pattern: /^([\w\.\-]){1,64}\@([\w\.\-]){1,64}/ , message: 'Email格式錯誤' }]"
/>
<van-field
v-model="form.address"
label="住址"
name=""
placeholder="請輸入您的地址"
/>
<van-field
v-model="form.url"
label="網址"
name=""
placeholder="請輸入您的網址"
:rules="[{ validator: validatorUrl, message: '網址格式不正確,Ex. http://' }]"
/>
<van-field
v-model="form.line"
label="Line"
name=""
placeholder="請輸入您的Line ID"
/>
<van-field
v-model="form.facebook"
label="Facebook"
name=""
placeholder="請輸入您的臉書連結"
/>
<van-field
v-model="form.ig"
label="IG"
name=""
placeholder="請輸入您的IG ID"
/>
<van-field
v-model="form.youtube"
label="YouTube"
name=""
placeholder="請輸入您的Youtube連結"
/>
<van-field
v-model="form.mark"
rows="3"
autosize
label="簡介"
type="textarea"
maxlength="100"
placeholder="請輸入簡介"
show-word-limit
/>
<van-uploader
:after-read="afterRead"
:max-count="1"
name="averter"
>
<div class="upload-main">
<img class="upload-img" :src="form.avatar" alt="">
<p>上傳圖片</p>
</div>
</van-uploader>
</van-cell-group>
<van-cell-group inset v-show="active === 1" v-for="(v,idx) in form.addon" :key="idx">
<div class="act-btn">
<van-button type="primary" icon="arrow-up" plain hairline @click="onMoveBtn(0,idx)"></van-button>
<van-button type="primary" icon="arrow-down" plain hairline @click="onMoveBtn(1,idx)"></van-button>
<van-button type="danger" icon="delete-o" plain hairline @click="onDelBtn(idx)"></van-button>
<div class="content">
<van-cell-group v-show="tabActive === 0">
<van-form @submit="onSubmit">
<van-uploader :after-read="afterRead" :max-count="1" name="averter" class="my-4">
<div class="upload-main">
<img
class="upload-img"
:src="form.avatar"
alt=""
v-if="form.avatar"
/>
<img
class="upload-img"
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 type="primary" size="small">上傳檔案</van-button>
</div>
</div>
</van-uploader>
<van-field
v-model="form.real_name"
label="姓名"
name="pattern"
placeholder="請輸入您的姓名"
:rules="[{ required: true, message: '姓名為必填' }]"
/>
<van-field
v-model="form.company"
label="公司名稱"
name=""
placeholder="請輸入您的公司名稱"
:rules="[{ required: true, message: '公司名稱必填' }]"
/>
<van-field
v-model="form.title"
label="職稱"
name=""
placeholder="請輸入您的職稱"
/>
<van-field
v-model="form.phone"
label="手機"
name=""
type="tel"
placeholder="Ex. 0900000001 不要有空格"
:rules="[{ required: true, message: '手機號必填' },{ pattern: /\d{10}/ , message: '手機號格式錯誤' }]"
/>
<van-field
v-model="form.tel"
label="市話"
name=""
type="tel"
placeholder="請輸入您的市話"
:rules="[{ validator: validatorTel, message: '市話格式不正確,Ex. 02xxxx or 02-xxxx' }]"
/>
<van-field
v-model="form.email"
label="Email"
name=""
placeholder="請輸入您的Email"
:rules="[{ required: true, message: 'Email必填' },{ pattern: /^([\w\.\-]){1,64}\@([\w\.\-]){1,64}/ , message: 'Email格式錯誤' }]"
/>
<van-field
v-model="form.address"
label="住址"
name=""
placeholder="請輸入您的地址"
/>
<van-field
v-model="form.url"
label="網址"
name=""
placeholder="請輸入您的網址"
:rules="[{ validator: validatorUrl, message: '網址格式不正確,Ex. http://' }]"
/>
<van-field
v-model="form.line"
label="Line"
name=""
placeholder="請輸入您的Line ID"
/>
<van-field
v-model="form.facebook"
label="Facebook"
name=""
placeholder="請輸入您的臉書連結"
/>
<van-field
v-model="form.ig"
label="IG"
name=""
placeholder="請輸入您的IG ID"
/>
<van-field
v-model="form.youtube"
label="YouTube"
name=""
placeholder="請輸入您的Youtube連結"
/>
<van-field
v-model="form.mark"
rows="3"
autosize
label="簡介"
type="textarea"
maxlength="100"
placeholder="請輸入簡介"
show-word-limit
/>
<van-button round block type="primary" native-type="submit">
送出
</van-button>
</van-form>
</van-cell-group>
<van-cell-group v-show="tabActive === 1" v-for="(v,idx) in form.addon" :key="idx">
<div class="text-center">
<van-button type="primary" icon="arrow-up" plain hairline @click="onMoveBtn(0,idx)"></van-button>
<van-button type="primary" icon="arrow-down" plain hairline @click="onMoveBtn(1,idx)"></van-button>
<van-button type="danger" icon="delete-o" plain hairline @click="onDelBtn(idx)"></van-button>
</div>
<van-field
label="名稱"
name=""
v-model="form.addon[idx].name"
placeholder="按鈕名稱"
/>
<van-field
label="連結"
name=""
v-model="form.addon[idx].link"
placeholder="按鈕連結"
/>
<div class="add-btn" @click="onAddBtn">
<van-button type="success" plain hairline>新增按鈕</van-button>
</div>
</van-cell-group>
<van-cell-group v-show="tabActive === 2">
</van-cell-group>
<van-cell-group v-show="tabActive === 3">
</van-cell-group>
</div>
<!-- <div class="field">
<div class="label">圖示</div>
<div class="content"><i class="iconfont icon-home"></i><span style="padding: 0 10px" @click="showChangeIcon=true"></span></div>
</div> -->
<van-field
label="名稱"
name=""
v-model="form.addon[idx].name"
placeholder="按鈕名稱"
/>
<van-field
label="連結"
name=""
v-model="form.addon[idx].link"
placeholder="按鈕連結"
/>
</van-cell-group>
<div class="add-btn" v-show="active === 1" @click="onAddBtn">
<van-button type="success" plain hairline>新增按鈕</van-button>
</div>
<div style="margin: 16px;">
<van-button round block type="primary" native-type="submit">
送出
</van-button>
</div>
</van-form>
<van-popup v-model:show="showChangeIcon">
<div class="icon-list">
<div class="icon-item">
<i class="iconfont icon-home" style="font-size: 40px"></i>
</div>
<div class="icon-item">
<i class="iconfont icon-home" style="font-size: 40px"></i>
</div>
<div class="icon-item">
<i class="iconfont icon-home" style="font-size: 40px"></i>
</div>
<div class="icon-item">
<i class="iconfont icon-home" style="font-size: 40px"></i>
</div>
<div class="icon-item">
<i class="iconfont icon-home" style="font-size: 40px"></i>
</div>
<div class="icon-item">
<i class="iconfont icon-home" style="font-size: 40px"></i>
</div>
<div class="icon-item">
<i class="iconfont icon-home" style="font-size: 40px"></i>
</div>
<div class="icon-item">
</div>
</div>
</van-popup>
<Footer/>
<!-- <Footer/> -->
<van-overlay :show="crop.show" @click="crop.show = false" />
<div class="cropper-section" v-if="crop.show">
<div class="crop-area">
<cropper
class="cropper"
ref="myCrop"
:src="crop.img"
:stencil-props="{
aspectRatio: 1/1
}"
:auto-zoom="true"
/>
<cropper
class="cropper"
ref="myCrop"
:src="crop.img"
:stencil-props="{
aspectRatio: 1/1
}"
:auto-zoom="true"
/>
</div>
<div class="crop-btn">
<van-button type="primary" size="small" plain @click="onClose"></van-button>
@ -382,25 +364,24 @@ export default {
</div>
</template>
<style src="@/assets/css/main.css"></style>
<style lang="less" scoped>
.container{
padding-bottom: 30px;
}
.title{
font-size: 20px;
text-align: center;
.upload-main{
display: flex;
justify-content: center;
align-items: center;
}
.upload-img{
width: 80px;
aspect-ratio: 1/1;
border-radius: 50%;
}
.cropper {
height: 300px;
// width: 300px;
background: #DDD;
height: 300px;
// width: 300px;
background: #DDD;
}
.cropper-section{
@ -409,8 +390,8 @@ export default {
text-align: center;
top: 50px;
// left: 0;
height: 350px;
width: 100%;
height: 350px;
width: 100%;
max-width: 500px;
background: #DDD;
z-index: 8888;
@ -423,39 +404,5 @@ export default {
background-color: #666;
text-align: center;
}
}
.act-btn{
text-align: center;
}
.add-btn{
margin: 0 16px;
padding: 10px 16px;
}
.field{
display: flex;
// margin: 0 16px;
padding: 10px 16px;
.label{
width: var(--van-field-label-width);
margin-right: var(--van-field-label-margin-right);
color: var(--van-field-label-color);
}
}
.icon-list{
display: flex;
width: 280px;
flex-wrap: wrap;
justify-content: center;
align-items: center;
.icon-item{
// flex:1;
width: 70px;
text-align: center;
}
}
</style>

@ -0,0 +1,461 @@
<script>
import _ from 'lodash'
import axios from 'axios'
import { ref , nextTick} 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 { useRouter } from 'vue-router'
import { showToast } from 'vant'
import { showLoadingToast,showSuccessToast } from 'vant';
import { getUserInfo , updateCard , getMovie } from '@/api'
const URL = window.URL || window.webkitURL;
export default {
name: 'EditForm',
components: {
Footer,
Cropper
},
async setup(){
const store = useStore()
const router = useRouter()
const form = ref({addon:[]})
const fileList = ref([]);
const myCrop = ref(null)
const active = ref(0)
const showChangeIcon = ref(false)
const crop = ref({
show: false,
img: null,
})
const validatorUrl = (val) => {
if(val.length>0){
return /(https?:\/\/|line:\/\/|tel:|mailto:)\S+/.test(val)
}else{
return true
}
};
const validatorTel = (val) => {
if(val.length>0){
return /(\d{2,3}-?|\(\d{2,3}\))\d{3,4}-?\d{4}/.test(val)
}else{
return true
}
};
// 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)
}
const onCrop = () => {
const { canvas } = myCrop.value.getResult();
if (canvas) {
const imgFile = new FormData();
canvas.toBlob(async (blob) => {
let ufile = new File([blob], "image.jpg");
imgFile.append("user_id", form.value.user_id)
imgFile.append("fileType", "IMAGE")
imgFile.append('file', ufile)
crop.value.show = false
showLoadingToast({
duration: 0,
message: '圖片上傳中...',
forbidClick: true,
});
let res = await axios.post(
`${import.meta.env.VITE_APP_API_URL}/user/uploadAvatar`,
imgFile,
{
}
)
if (res.data.code == 200) {
form.value.avatar = res.data.data
showSuccessToast('上傳成功');
}else{
showToast.fail('上傳失敗');
}
}, 'image/jpeg');
}
return
}
const onClose = () =>{
crop.value.show = false
}
const afterRead = async(file, name) => {
crop.value.show = true
const ofile = file.file
crop.value.img = URL.createObjectURL(ofile);
// crop.value.img = ofile
return
};
const onAddBtn = () => {
if(form.value.addon){
form.value.addon.push({icon:'',name:'',link:''})
}else{
form.value.addon = [{icon:'',name:'',link:''}]
}
}
const onDelBtn = (index) => {
form.value.addon.splice(index, 1)
}
const onMoveBtn = (type, index) => {
if (type === 0) {
if (index !== 0) {
[form.value.addon[index], form.value.addon[index - 1]] = [form.value.addon[index - 1], form.value.addon[index]]
}
} else {
if (index + 1 !== form.value.addon.length) {
[form.value.addon[index + 1], form.value.addon[index]] = [form.value.addon[index], form.value.addon[index + 1]]
}
}
}
const onSubmit = async () => {
showLoadingToast({
duration: 0,
message: '資料更新中...',
forbidClick: true,
});
let res = await updateCard(form.value)
if(res.code===200){
showSuccessToast('更新成功')
store.commit('user/setUserInfo',form.value)
router.push('/')
}else{
showToast.fail('更新失敗')
}
};
return {
form,
fileList,
crop,
myCrop,
active,
showChangeIcon,
onAddBtn,
onDelBtn,
onMoveBtn,
validatorUrl,
validatorTel,
onCrop,
onClose,
afterRead,
onSubmit
}
}
}
</script>
<template>
<div class="member-container">
<van-nav-bar title="個人資料修改" right-text="" @click-right="$router.push('/')" />
<van-tabs :lazy-render="true" v-model:active="active">
<van-tab title="基本資料">
</van-tab>
<van-tab title="更多連結">
</van-tab>
</van-tabs>
<van-form @submit="onSubmit">
<van-cell-group inset v-show="active === 0">
<van-field
v-model="form.real_name"
label="姓名"
name="pattern"
placeholder="請輸入您的姓名"
:rules="[{ required: true, message: '姓名為必填' }]"
/>
<van-field
v-model="form.company"
label="公司名稱"
name=""
placeholder="請輸入您的公司名稱"
:rules="[{ required: true, message: '公司名稱必填' }]"
/>
<van-field
v-model="form.title"
label="職稱"
name=""
placeholder="請輸入您的職稱"
/>
<van-field
v-model="form.phone"
label="手機"
name=""
type="tel"
placeholder="Ex. 0900000001 不要有空格"
:rules="[{ required: true, message: '手機號必填' },{ pattern: /\d{10}/ , message: '手機號格式錯誤' }]"
/>
<van-field
v-model="form.tel"
label="市話"
name=""
type="tel"
placeholder="請輸入您的市話"
:rules="[{ validator: validatorTel, message: '市話格式不正確,Ex. 02xxxx or 02-xxxx' }]"
/>
<van-field
v-model="form.email"
label="Email"
name=""
placeholder="請輸入您的Email"
:rules="[{ required: true, message: 'Email必填' },{ pattern: /^([\w\.\-]){1,64}\@([\w\.\-]){1,64}/ , message: 'Email格式錯誤' }]"
/>
<van-field
v-model="form.address"
label="住址"
name=""
placeholder="請輸入您的地址"
/>
<van-field
v-model="form.url"
label="網址"
name=""
placeholder="請輸入您的網址"
:rules="[{ validator: validatorUrl, message: '網址格式不正確,Ex. http://' }]"
/>
<van-field
v-model="form.line"
label="Line"
name=""
placeholder="請輸入您的Line ID"
/>
<van-field
v-model="form.facebook"
label="Facebook"
name=""
placeholder="請輸入您的臉書連結"
/>
<van-field
v-model="form.ig"
label="IG"
name=""
placeholder="請輸入您的IG ID"
/>
<van-field
v-model="form.youtube"
label="YouTube"
name=""
placeholder="請輸入您的Youtube連結"
/>
<van-field
v-model="form.mark"
rows="3"
autosize
label="簡介"
type="textarea"
maxlength="100"
placeholder="請輸入簡介"
show-word-limit
/>
<van-uploader
:after-read="afterRead"
:max-count="1"
name="averter"
>
<div class="upload-main">
<img class="upload-img" :src="form.avatar" alt="">
<p>上傳圖片</p>
</div>
</van-uploader>
</van-cell-group>
<van-cell-group inset v-show="active === 1" v-for="(v,idx) in form.addon" :key="idx">
<div class="act-btn">
<van-button type="primary" icon="arrow-up" plain hairline @click="onMoveBtn(0,idx)"></van-button>
<van-button type="primary" icon="arrow-down" plain hairline @click="onMoveBtn(1,idx)"></van-button>
<van-button type="danger" icon="delete-o" plain hairline @click="onDelBtn(idx)"></van-button>
</div>
<!-- <div class="field">
<div class="label">圖示</div>
<div class="content"><i class="iconfont icon-home"></i><span style="padding: 0 10px" @click="showChangeIcon=true"></span></div>
</div> -->
<van-field
label="名稱"
name=""
v-model="form.addon[idx].name"
placeholder="按鈕名稱"
/>
<van-field
label="連結"
name=""
v-model="form.addon[idx].link"
placeholder="按鈕連結"
/>
</van-cell-group>
<div class="add-btn" v-show="active === 1" @click="onAddBtn">
<van-button type="success" plain hairline>新增按鈕</van-button>
</div>
<div style="margin: 16px;">
<van-button round block type="primary" native-type="submit">
送出
</van-button>
</div>
</van-form>
<van-popup v-model:show="showChangeIcon">
<div class="icon-list">
<div class="icon-item">
<i class="iconfont icon-home" style="font-size: 40px"></i>
</div>
<div class="icon-item">
<i class="iconfont icon-home" style="font-size: 40px"></i>
</div>
<div class="icon-item">
<i class="iconfont icon-home" style="font-size: 40px"></i>
</div>
<div class="icon-item">
<i class="iconfont icon-home" style="font-size: 40px"></i>
</div>
<div class="icon-item">
<i class="iconfont icon-home" style="font-size: 40px"></i>
</div>
<div class="icon-item">
<i class="iconfont icon-home" style="font-size: 40px"></i>
</div>
<div class="icon-item">
<i class="iconfont icon-home" style="font-size: 40px"></i>
</div>
<div class="icon-item">
</div>
</div>
</van-popup>
<Footer/>
<van-overlay :show="crop.show" @click="crop.show = false" />
<div class="cropper-section" v-if="crop.show">
<div class="crop-area">
<cropper
class="cropper"
ref="myCrop"
:src="crop.img"
:stencil-props="{
aspectRatio: 1/1
}"
:auto-zoom="true"
/>
</div>
<div class="crop-btn">
<van-button type="primary" size="small" plain @click="onClose"></van-button>
<van-button type="success" size="small" plain @click="onCrop"></van-button>
</div>
</div>
</div>
</template>
<style lang="less" scoped>
.container{
padding-bottom: 30px;
}
.title{
font-size: 20px;
text-align: center;
}
.upload-img{
width: 80px;
}
.cropper {
height: 300px;
// width: 300px;
background: #DDD;
}
.cropper-section{
margin: 0 auto;
position: fixed;
text-align: center;
top: 50px;
// left: 0;
height: 350px;
width: 100%;
max-width: 500px;
background: #DDD;
z-index: 8888;
.crop-area{
margin: 5 auto;
width: 100%;
height: 330px;
}
.crop-btn{
background-color: #666;
text-align: center;
}
}
.act-btn{
text-align: center;
}
.add-btn{
margin: 0 16px;
padding: 10px 16px;
}
.field{
display: flex;
// margin: 0 16px;
padding: 10px 16px;
.label{
width: var(--van-field-label-width);
margin-right: var(--van-field-label-margin-right);
color: var(--van-field-label-color);
}
}
.icon-list{
display: flex;
width: 280px;
flex-wrap: wrap;
justify-content: center;
align-items: center;
.icon-item{
// flex:1;
width: 70px;
text-align: center;
}
}
</style>

@ -1,153 +1,3 @@
<template>
<div class="reg-container">
<van-nav-bar :title="title" />
<van-form @submit="onSubmit">
<van-cell-group inset>
<van-field
v-model="form.real_name"
label="姓名"
name="pattern"
required
placeholder="請輸入您的姓名"
:rules="[{ required: true, message: '姓名為必填' }]"
/>
<van-field
v-model="form.company"
label="公司名稱"
name=""
required
placeholder="請輸入您的公司名稱"
:rules="[{ required: true, message: '公司名稱必填' }]"
/>
<van-field
v-model="form.title"
label="職稱"
name=""
placeholder="請輸入您的職稱"
/>
<van-field
v-model="form.phone"
label="手機"
name=""
required
placeholder="Ex. 0900000001 不要有空格"
:rules="[
{ required: true, message: '手機號必填' },
{ pattern: /\d{10}/, message: '手機號格式錯誤' },
]"
/>
<van-field
v-model="form.tel"
label="市話"
name=""
placeholder="請輸入您的市話"
/>
<van-field
v-model="form.email"
label="Email"
name=""
required
placeholder="請輸入您的Email"
:rules="[
{ required: true, message: 'Email必填' },
{
pattern: /^([\w\.\-]){1,64}\@([\w\.\-]){1,64}/,
message: 'Email格式錯誤',
},
]"
/>
<van-field
v-model="form.address"
label="住址"
name=""
placeholder="請輸入您的地址"
/>
<van-field
v-model="form.url"
label="網址"
name=""
placeholder="請輸入您的網址"
:rules="[
{ validator: validatorUrl, message: '網址格式不正確,Ex. http://' },
]"
/>
<van-field
v-model="form.line"
label="Line"
name=""
placeholder="請輸入您的Line ID"
/>
<van-field
v-model="form.facebook"
label="Facebook"
name=""
placeholder="請輸入您的臉書連結"
/>
<van-field
v-model="form.ig"
label="IG"
name=""
placeholder="請輸入您的IG ID"
/>
<van-field
v-model="form.youtube"
label="YouTube"
name=""
placeholder="請輸入您的Youtube連結"
/>
<van-uploader :after-read="afterRead" :max-count="1" name="averter">
<div class="upload-main">
<img
class="upload-img"
:src="form.avatar"
alt=""
v-if="form.avatar"
/>
<img
class="upload-img"
src="@/assets/images/upload.jpg"
alt=""
v-else
/>
<p>上傳圖片,預設為Line頭像</p>
</div>
</van-uploader>
</van-cell-group>
<div style="margin: 16px">
<van-button round block type="primary" native-type="submit">
送出註冊
</van-button>
<br />
<van-button round block type="default" @click="leaveReg">
以後在說
</van-button>
</div>
</van-form>
<van-overlay :show="crop.show" @click="crop.show = false" />
<div class="cropper-section" v-if="crop.show">
<div class="crop-area">
<cropper
class="cropper"
ref="myCrop"
:src="crop.img"
:stencil-props="{
aspectRatio: 1 / 1,
}"
:auto-zoom="true"
/>
</div>
<div class="crop-btn">
<van-button type="primary" size="small" plain @click="onClose"
>取消</van-button
>
<van-button type="success" size="small" plain @click="onCrop"
>剪裁</van-button
>
</div>
</div>
</div>
</template>
<script setup>
import axios from "axios";
@ -259,7 +109,7 @@ const onSubmit = async () => {
}
const profile = await liff.getProfile();
let checkRes = await checkLineId(profile.userId);
if (checkRes.code !== 200) {
@ -282,7 +132,7 @@ const onSubmit = async () => {
token: id_token,
...form.value,
});
console.log(regRes.code,"regRes.code")
if (regRes.code === 500) {
if (liff.isLoggedIn()) {
liff.logout();
@ -301,26 +151,185 @@ const onSubmit = async () => {
};
</script>
<template>
<div class="reg-container bg-lightPink">
<van-nav-bar class="bg-skyBlue py-1" :title="title" />
<div class="content">
<van-form @submit="onSubmit">
<van-cell-group inset class="text-center">
<van-uploader :after-read="afterRead" :max-count="1" name="averter" class="my-4">
<div class="upload-main">
<img
class="upload-img"
:src="form.avatar"
alt=""
v-if="form.avatar"
/>
<img
class="upload-img"
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 type="primary" size="small">上傳檔案</van-button>
</div>
</div>
</van-uploader>
<van-field
v-model="form.real_name"
label="姓名"
name="pattern"
required
placeholder="請輸入您的姓名"
:rules="[{ required: true, message: '姓名為必填' }]"
/>
<van-field
v-model="form.company"
label="公司名稱"
name=""
required
placeholder="請輸入您的公司名稱"
:rules="[{ required: true, message: '公司名稱必填' }]"
/>
<van-field
v-model="form.title"
label="職稱"
name=""
placeholder="請輸入您的職稱"
/>
<van-field
v-model="form.phone"
label="手機"
name=""
required
placeholder="Ex. 0900000001 不要有空格"
:rules="[
{ required: true, message: '手機號必填' },
{ pattern: /\d{10}/, message: '手機號格式錯誤' },
]"
/>
<van-field
v-model="form.tel"
label="市話"
name=""
placeholder="請輸入您的市話"
/>
<van-field
v-model="form.email"
label="Email"
name=""
required
placeholder="請輸入您的Email"
:rules="[
{ required: true, message: 'Email必填' },
{
pattern: /^([\w\.\-]){1,64}\@([\w\.\-]){1,64}/,
message: 'Email格式錯誤',
},
]"
/>
<van-field
v-model="form.address"
label="住址"
name=""
placeholder="請輸入您的地址"
/>
<van-field
v-model="form.url"
label="網址"
name=""
placeholder="請輸入您的網址"
:rules="[
{ validator: validatorUrl, message: '網址格式不正確,Ex. http://' },
]"
/>
<van-field
v-model="form.line"
label="Line"
name=""
placeholder="請輸入您的Line ID"
/>
<van-field
v-model="form.facebook"
label="Facebook"
name=""
placeholder="請輸入您的臉書連結"
/>
<van-field
v-model="form.ig"
label="IG"
name=""
placeholder="請輸入您的IG ID"
/>
<van-field
v-model="form.youtube"
label="YouTube"
name=""
placeholder="請輸入您的Youtube連結"
/>
</van-cell-group>
<div class="m-3 d-flex">
<van-button round block class="btn-skyBlue rounded-pill mx-1" @click="leaveReg">
以後在說
</van-button>
<van-button round block class="btn-darkBlue rounded-pill mx-1" native-type="submit">
送出註冊
</van-button>
<br />
</div>
</van-form>
</div>
<van-overlay :show="crop.show" @click="crop.show = false" />
<div class="cropper-section" v-if="crop.show">
<div class="crop-area">
<cropper
class="cropper"
ref="myCrop"
:src="crop.img"
:stencil-props="{
aspectRatio: 1 / 1,
}"
:auto-zoom="true"
/>
</div>
<div class="crop-btn">
<van-button type="primary" size="small" plain @click="onClose">
取消
</van-button>
<van-button type="success" size="small" plain @click="onCrop">
剪裁
</van-button>
</div>
</div>
</div>
</template>
<style src="@/assets/css/main.css"></style>
<style lang="less" scoped>
.container {
padding-bottom: 30px;
}
.title {
font-size: 20px;
text-align: center;
.upload-main{
display: flex;
justify-content: center;
align-items: center;
}
.upload-img {
.upload-img{
width: 80px;
aspect-ratio: 1/1;
border-radius: 50%;
}
.cropper {
height: 300px;
// width: 300px;
background: #ddd;
background: #DDD;
}
.cropper-section {
.cropper-section{
margin: 0 auto;
position: fixed;
text-align: center;
@ -329,14 +338,14 @@ const onSubmit = async () => {
height: 350px;
width: 100%;
max-width: 500px;
background: #ddd;
background: #DDD;
z-index: 8888;
.crop-area {
.crop-area{
margin: 5 auto;
width: 100%;
height: 330px;
}
.crop-btn {
.crop-btn{
background-color: #666;
text-align: center;
}

Loading…
Cancel
Save