Browse Source

finish logic for mine

tid1867
刘嘉炜 3 months ago
parent
commit
4725a19a27
  1. 1
      src/js/api.js
  2. 3
      src/pages.json
  3. 58
      src/pages/menu/forth.vue
  4. 25
      src/subpackage/authorization/components/user_info/iconfont.css
  5. 132
      src/subpackage/authorization/components/user_info/impower.vue
  6. 357
      src/subpackage/authorization/components/user_info/tuniaoui-wx-user-info.vue
  7. 2
      src/subpackage/authorization/js/api.js

1
src/js/api.js

@ -169,6 +169,7 @@ API['party'] = {
API['mine'] = { API['mine'] = {
userCurrent:`${ORIGIN}/user/current`, //获取账户信息, (不要传品牌id) userCurrent:`${ORIGIN}/user/current`, //获取账户信息, (不要传品牌id)
unbindAssistant:`${ORIGIN}/admin/user/unbindAssistant"`, // 解绑退出
} }
export default { ORIGIN, API }; export default { ORIGIN, API };

3
src/pages.json

@ -17,7 +17,8 @@
"mine-header": "view", "mine-header": "view",
"bottom-logo": "view", "bottom-logo": "view",
"line-tab": "view", "line-tab": "view",
"authorization-login": "view"
"authorization-login": "view",
"authorization-user": "view"
} }
} }
}, },

58
src/pages/menu/forth.vue

@ -8,7 +8,7 @@
:name="userInfo.actual_name" :name="userInfo.actual_name"
:account="userInfo.mobile" :account="userInfo.mobile"
:photo="userInfo.avatar_url" :photo="userInfo.avatar_url"
@click:update="updateUser"
></mine-header> ></mine-header>
<block v-if="menuPackageLoaded"> <block v-if="menuPackageLoaded">
<line-tab :icon-num='0'> <line-tab :icon-num='0'>
@ -39,11 +39,12 @@
<!-- <line-tab :icon-num='4'>总后台(<text class="fm-txt">{{ deadData.backstageLink }}<text class="ft-copy" @click="copyLink(deadData.backstageLink)">复制</text></text>)</line-tab> --> <!-- <line-tab :icon-num='4'>总后台(<text class="fm-txt">{{ deadData.backstageLink }}<text class="ft-copy" @click="copyLink(deadData.backstageLink)">复制</text></text>)</line-tab> -->
<line-tab :icon-num='5' @click="toComplaint">投诉建议</line-tab> <line-tab :icon-num='5' @click="toComplaint">投诉建议</line-tab>
<line-tab :icon-num='6' v-if="loginState">解绑退出</line-tab>
<line-tab :icon-num='6' v-if="loginState" @click="unBindBtn">解绑退出</line-tab>
</block> </block>
<bottom-logo></bottom-logo> <bottom-logo></bottom-logo>
<authorization-login ref="authorizationLogin"></authorization-login> <authorization-login ref="authorizationLogin"></authorization-login>
<authorization-user ref="authorizationUser"></authorization-user>
</view> </view>
</template> </template>
@ -52,6 +53,7 @@ import mineHeader from "@/subpackage/menu/components/mine/header.vue";
import lineTab from "@/subpackage/menu/components/mine/line_tab.vue"; import lineTab from "@/subpackage/menu/components/mine/line_tab.vue";
import bottomLogo from "@/subpackage/menu/components/bottom_logo.vue"; import bottomLogo from "@/subpackage/menu/components/bottom_logo.vue";
import authorizationLogin from "@/subpackage/authorization/components/login.vue"; import authorizationLogin from "@/subpackage/authorization/components/login.vue";
import authorizationUser from "@/subpackage/authorization/components/user_info/impower.vue";
import { routeTo, debounce, showLoad, hideLoad, showModal, showNone, jsonStr } from "@/utils/util.js"; import { routeTo, debounce, showLoad, hideLoad, showModal, showNone, jsonStr } from "@/utils/util.js";
import { mapGetters } from 'vuex'; import { mapGetters } from 'vuex';
import { servers } from '../../js/server'; import { servers } from '../../js/server';
@ -62,6 +64,7 @@ export default {
lineTab, lineTab,
bottomLogo, bottomLogo,
authorizationLogin, authorizationLogin,
authorizationUser,
}, },
data(){ data(){
return { return {
@ -87,19 +90,70 @@ export default {
if(this.loginState)this.getUserInfo(); if(this.loginState)this.getUserInfo();
}, },
methods: { methods: {
//
unBindBtn: debounce(function(){
let { userInfo } = this;
if(!userInfo?.id)return showModal({ content: '用户信息有误' })
showModal({
content: '您确定要解绑退出吗?',
showCancel: true,
success: mRes=>{
if(mRes.confirm)this.unBindReq(userInfo.id);
}
})
}, 300, true),
//
unBindReq(user_id){
showLoad();
return servers.post({
url: API.mine.unbindAssistant,
data: { user_id },
isDefaultGet: false,
})
.then(res => {
hideLoad();
let _data = res?.data || {};
if(_data.code === 0){
showNone('操作成功!');
setTimeout(() => {
this.$store.commit('setLoginState', { loginState: false });
routeTo(`/pages/login/login`,'rL');
}, 1000);
console.log('pages menu unBindReq res --->', _data);
}else{
return Promise.reject(_data);
}
})
.catch(err => {
hideLoad();
showModal({ content: err?.message || '操作失败!' });
console.warn('pages menu unBindReq err --->', err);
// return Promise.reject(err);
})
},
//
updateUser(){
this.$refs?.authorizationUser?.show?.({ success: this.getUserInfo });
},
//
toMiniProgram(appid){ toMiniProgram(appid){
uni.navigateToMiniProgram({ appId: appid }); uni.navigateToMiniProgram({ appId: appid });
}, },
//
toWebView(url){ toWebView(url){
routeTo(`/pages/web_view/web_view?src=${jsonStr(url)}`, 'nT'); routeTo(`/pages/web_view/web_view?src=${jsonStr(url)}`, 'nT');
}, },
//
copyLink(url){ copyLink(url){
uni.setClipboardData({ data: url }); uni.setClipboardData({ data: url });
}, },
//
toComplaint(){ toComplaint(){
let { brand_id } = this; let { brand_id } = this;
routeTo(`/subpackage/message/pages/complaint/list?brand_id=${brand_id}`, 'nT'); routeTo(`/subpackage/message/pages/complaint/list?brand_id=${brand_id}`, 'nT');
}, },
//
loginBtn(){ loginBtn(){
this.$refs?.authorizationLogin?.alert?.({ this.$refs?.authorizationLogin?.alert?.({
success: ()=>{ success: ()=>{

25
src/subpackage/authorization/components/user_info/iconfont.css

@ -0,0 +1,25 @@
@charset "UTF-8";
@font-face {
font-family: "tuniaoFont"; /* Project id 3784643 */
src:
url('data:application/x-font-woff2;charset=utf-8;base64,d09GMgABAAAAAAN8AAsAAAAAB4gAAAMvAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHFQGYACDBgqCQIIdATYCJAMMCwgABCAFhH8HPRuYBiMRpmvPIfurAzsYPj7DCVbrRAmElfXCs4V6xacO8aHO69VXu54tTy8h0hcJ7ufgieY+3+xscrn9B8wKQQFBywplLZCw9SwcOyZ5pKsoAQAbcICJTr7AjPPqr06NRkeIAemFpXv8cje1+/LkuLvD789WJZUANjOe9F76qptDOSMUui/Ua0WQKpZGXaqf5hHZdAD6x8tRJtRKtQd7j5UKkk6lWywYkGADCZBnGLugJd6CAI4GOjH956Ep4k7imdNkYTGFAkm2nJyPrBNwA7YhWwgQ/K4bLXITD8wl8xxuBN+XwyYJwOAp5jFjOwNbPNwd3l3WiyFAv3sCBLjcAB6gQM3GjLLSbJpDo1ANiqsiFiX7WAQzqTcMA06j/pb/eAbEx8yMAaAChg3sDjs6COwub8IAoAD4PEZkA7iAZClPKdicmJLc2OiZcQC3cV613sc3Ab9W7YItQtio9YgdKGjgr+ANlbg5gPvXFacv8IyvKTH4pcjV7VIcfnuIAUd3VCbxcCIKj++rvr/hpx/iwxd4/5mxDXeILbBp2+ByMIlGMuQEU3gjiVaMcXk8Dn2gWo5wuRwuIldLRqRwWogvmCRXE9/kSvrVQP4iFDVWRSbRakMk/AtcBYVpO6rpah1V9J/m/Wt+q8WfsOV+S5KFTGD5dwW9KFstZUs5smuYK3V495zwUG+r/Izf0PWtbWj/HUQsAL9u+cGK8NCiAgRnaRJ49fqljrxWc4PaKs4pQwBlMLUeAzgcEGLakvg5nCZ3zgTBkZzAEEUuFEeJyMrq4BGhGT6OPjiqGd4eIZkLKGKjgTKuAAgpPIAhjmdQUngnsrJdeKTxBz4pkgjHjJQeFqFMXv8PQqg0QP+F2cbAdoHqFmaM52jYlcbNoeTq4CtPkjzHAE1Zl0QvFEjGmp9fY6vKwBI9kOvIuQhJ4kJWy0k1dVXFVXcpbfTmIIRKA/RfmG0M7G1T3cKM8VwMXGlEnR1KY0uU+CTJnM1ODk1ZdxJdSOjYdGOp+TW2k6szsNg8qIvIuQipetFCVstpQCB1lcXHXUl5ZOpfdBvgMI9QMaJi8TZdzLS36K8/ueDZOWMAAA==') format('woff2'),
url('//at.alicdn.com/t/c/font_3784643_5jru9pe5fad.woff?t=1669045092678') format('woff'),
url('//at.alicdn.com/t/c/font_3784643_5jru9pe5fad.ttf?t=1669045092678') format('truetype');
}
[class*='tn-icon-'] {
font-family: 'tuniaoFont' !important;
font-style: normal;
-webkit-font-smoothing: antialiased;
text-align: center;
text-decoration: none;
}
.tn-icon-close:before {
content: "\e74d";
}
.tn-icon-camera-fill:before {
content: "\e75d";
}

132
src/subpackage/authorization/components/user_info/impower.vue

@ -0,0 +1,132 @@
<template>
<wx-user-info-modal
v-model="showAuthorizationModal"
@updated="updatedUserInfoEvent"
:isModal="isModal"
:alway="alway"
></wx-user-info-modal>
</template>
<script>
import WxUserInfoModal from './tuniaoui-wx-user-info.vue';
import { AUTHOR_API } from '../../js/api';
import servers from '../../js/server';
import { showModal, jsonPar, showLoad, hideLoad } from '@/utils/util';
export default {
components: { WxUserInfoModal },
props: {
isModal: {
type: Boolean,
default: true
},
alway: {
type: Boolean,
default: false
}
},
watch: {
showAuthorizationModal(nVal, oVal){
let { initData } = this;
if(!nVal&&oVal)initData?.close();
}
},
data() {
return {
showAuthorizationModal: false,
initData: {},
}
},
methods: {
show(data){
this.showAuthorizationModal = true;
this.initData = data;
},
hide(){
this.showAuthorizationModal = false;
},
//
async updatedUserInfoEvent(info) {
let { initData, userEdit } = this;
try{
let _imgUrl = await this.uploadImg(info.avatar);
let _editObj = { nickname: info.nickname, avatar_url: _imgUrl };
await userEdit(_editObj);
initData?.success?.(_editObj);
}catch(err){
console.warn('authorize components user info impower updatedUserInfoEvent err --->', err)
initData?.fail?.(err);
}
},
//
async uploadImg(url){
try{
showLoad();
let _imgInfo = await servers.uploadFile({
url: AUTHOR_API.zs_user_avatar,
filePath: url,
});
if(_imgInfo.statusCode != 200)throw(_imgInfo);
let _imgRes = jsonPar(_imgInfo.data);
if(_imgRes.code != 0)throw(_imgRes);
hideLoad();
return _imgRes.data.url || '';
}catch(err){
hideLoad();
showModal({ content: err?.errMsg ?? err?.message ?? '上传图片失败!' });
console.warn('authorize components user info impower uploadImg err --->', err)
return Promise.reject(err);
}
},
//
userEdit({ nickname, avatar_url }){
showLoad();
return servers.post({
url: AUTHOR_API.changeAvatar,
data: { nickname, avatar_url },
isDefaultGet: false,
})
.then(res => {
hideLoad();
let _data = res?.data || {};
if(_data.code === 0){
console.log('userEdit res--->', _data);
return _data?.data;
}else{
return Promise.reject(_data);
}
})
.catch(err => {
hideLoad();
showModal({ content: err.message || '操作失败!' });
console.warn('authorize components user info impower userEdit err --->', err);
return Promise.reject(err);
})
},
//
refreshUserInfo(){
return servers.post({
url: ATR_API.userCurrent,
data: {},
isDefaultGet: false,
})
.then(res => {
let _data = res?.data || {};
if(_data.code === 0){
uni.setStorageSync('userInfo', _data?.data);
this.$store.commit('refreshUserInfo', _data?.data);
return _data?.data;
}else{
return Promise.reject(_data);
}
})
.catch(err => {
console.warn('authorize components user info impower refreshUserInfo err --->', err);
// return Promise.reject(err);
})
}
}
}
</script>
<style lang="scss">
</style>

357
src/subpackage/authorization/components/user_info/tuniaoui-wx-user-info.vue

@ -0,0 +1,357 @@
<template>
<view
v-if="openModal || alway"
class="wx-authorization-modal"
:class="{ 'modal-class': isModal }"
>
<view
class="wam__mask"
@touchmove.prevent=""
@tap.stop="closeModal"
></view>
<!-- 内容区域 -->
<view class="wam__wrapper">
<!-- 关闭按钮 -->
<view class="wam__close-btn" @tap.stop="closeModal">
<text class="tn-icon-close"></text>
</view>
<!-- 标题 -->
<view class="wam__title">获取您的昵称头像</view>
<!-- tips -->
<view class="wam__sub-title">
获取用户头像昵称主要用于向用户提供具有辨识度的用户中心界面
</view>
<!-- 头像选择 -->
<view class="wam__avatar">
<view class="button-shadow">
<button
class="button"
open-type="chooseAvatar"
@chooseavatar="chooseAvatarEvent"
>
<view v-if="userInfo.avatar" class="avatar__image">
<image class="image" :src="userInfo.avatar" mode="aspectFill"></image>
</view>
<view v-else class="avatar__empty">
<!-- <image class="image" src="https://cdn.nlark.com/yuque/0/2022/jpeg/280373/1668928062708-assets/web-upload/764843cf-055a-4cb6-b5d3-dca528b33fd4.jpeg" mode="aspectFill"></image> -->
</view>
<view class="avatar--icon">
<view class="tn-icon-camera-fill"></view>
</view>
</button>
</view>
</view>
<!-- 昵称输入 -->
<view class="wam__nickname">
<view class="nickname__data">
<input class="input" type="nickname" v-model="userInfo.nickname" placeholder="请输入昵称" placeholder-style="color: #AAAAAA;">
</view>
</view>
<!-- 保存按钮 -->
<view
class="wam__submit-btn"
:class="[{
'disabled': !userInfo.avatar || !userInfo.nickname
}]"
hover-class="tn-btn-hover-class"
:hover-stay-time="150"
@tap.stop="submitUserInfo"
>
</view>
</view>
</view>
</template>
<script>
export default {
options: {
// Vue(shadow)
virtualHost: true
},
props: {
value: {
type: Boolean,
default: false
},
isModal: {
type: Boolean,
default: true
},
alway: {
type: Boolean,
default: false
}
},
data() {
return {
openModal: false,
userInfo: {
avatar: '',
nickname: ''
}
}
},
watch: {
value: {
handler(val) {
this.openModal = val
},
immediate: true
}
},
methods: {
//
chooseAvatarEvent(e) {
this.userInfo.avatar = e.detail.avatarUrl
},
//
submitUserInfo() {
//
if (!this.userInfo.avatar || !this.userInfo.nickname) {
return uni.showToast({
icon: 'none',
title: '请选择头像和输入用户信息'
})
}
//
this.$emit('updated', this.userInfo)
},
//
closeModal() {
this.$emit('input', false)
},
}
}
</script>
<style lang="scss" scoped>
@import './iconfont.css';
.modal-class{
position: fixed;
left: 0;
top: 0;
width: 100vw;
height: 100vh;
z-index: 99998;
.wam {
&__mask {
display: block !important;
position: absolute;
left: 0;
top: 0;
width: 100%;
height: 100%;
background-color: rgba(0, 0, 0, 0.5);
opacity: 0;
animation: showMask 0.25s ease 0.1s forwards;
}
&__close-btn {
display: block !important;
display: none;
position: absolute;
top: 30rpx;
right: 30rpx;
z-index: 99999;
}
&__wrapper{
position: absolute;
left: 0;
bottom: 0;
width: 100%;
transform-origin: center bottom;
transform: scaleY(0);
animation: showWrapper 0.25s ease 0.1s forwards;
z-index: 99999;
}
}
}
.wx-authorization-modal {
// view {
// box-sizing: border-box;
// }
.image {
width: 100%;
height: 100%;
border-radius: inherit;
}
.wam {
/* mask */
&__mask {
display: none;
}
/* close-btn */
&__close-btn {
display: none;
}
/* wrapper */
&__wrapper {
background-color: #FFFFFF;
border-radius: 20rpx 20rpx 0rpx 0rpx;
padding: 40rpx;
padding-top: 60rpx;
padding-bottom: 40rpx;
padding-bottom: calc(constant(safe-area-inset-bottom) + 40rpx);
padding-bottom: calc(env(safe-area-inset-bottom) + 40rpx);
}
/* title */
&__title {
font-size: 34rpx;
}
/* sub-title */
&__sub-title {
font-size: 26rpx;
color: #AAAAAA;
margin-top: 16rpx;
padding-bottom: 30rpx;
}
/* 头像选择 */
&__avatar {
width: 100%;
margin-top: 30rpx;
display: flex;
align-items: center;
justify-content: center;
.button-shadow {
border: 8rpx solid rgba(255,255,255,0.05);
box-shadow: 0rpx 0rpx 80rpx 0rpx rgba(0, 0, 0, 0.15);
border-radius: 50%;
}
.button {
position: relative;
width: 160rpx;
height: 160rpx;
border-radius: 50%;
overflow: visible;
background-image: repeating-linear-gradient(45deg, #E4E9EC, #F8F7F8);
color: #FFFFFF;
background-color: transparent;
padding: 0;
margin: 0;
font-size: inherit;
line-height: inherit;
border: none;
&::after {
border: none;
}
}
.avatar {
&__empty, &__image {
width: 100%;
height: 100%;
border-radius: inherit;
}
&--icon {
position: absolute;
right: -10rpx;
bottom: -6rpx;
width: 60rpx;
height: 60rpx;
// transform: translate(50%, 50%);
background-color: #1D2541;
color: #FFFFFF;
border-radius: 50%;
border: 6rpx solid #FFFFFF;
line-height: 1;
font-size: 36rpx;
display: flex;
align-items: center;
justify-content: center;
}
}
}
/* 昵称 */
&__nickname {
margin-top: 40rpx;
.nickname {
&__data {
margin-top: 16rpx;
width: 100%;
padding: 26rpx 20rpx;
border-radius: 10rpx;
background-color: #F8F7F8;
.input {
color: #080808;
}
}
}
}
/* 保存按钮 */
&__submit-btn {
width: 100%;
background-color: $mColor;
color: #FFFFFF;
margin-top: 60rpx;
border-radius: 10rpx;
padding: 25rpx;
font-size: 32rpx;
display: flex;
align-items: center;
justify-content: center;
&.disabled {
background-color: #E6E6E6;
}
}
}
}
.tn-btn-hover-class {
box-shadow: inset 10rpx 2rpx 40rpx 0rpx rgba(0, 0, 0, 0.05);
}
@keyframes showMask {
0% {
opacity: 0;
}
100% {
opacity: 1;
}
}
@keyframes showWrapper {
0% {
transform: scaleY(0);
}
100% {
transform: scaleY(1);
}
}
</style>

2
src/subpackage/authorization/js/api.js

@ -2,6 +2,8 @@ import { ORIGIN } from '@/js/api';
export const AUTHOR_API = { export const AUTHOR_API = {
wechatMiniAppLoginAndSync: `${ORIGIN}/assistant/WechatMiniAppGetToken`, // 小程序授权获取token,为空就登录 wechatMiniAppLoginAndSync: `${ORIGIN}/assistant/WechatMiniAppGetToken`, // 小程序授权获取token,为空就登录
zs_user_avatar:`${ORIGIN}/upload/file/zs_user_avatar`, // 头像图片上传
changeAvatar: `${ORIGIN}/admin/assistant/changeAvatar`, // 修改用户头像、昵称
} }
export default AUTHOR_API; export default AUTHOR_API;
Loading…
Cancel
Save