java-mall-app/member/member/bindphone.vue
2025-04-24 15:47:08 +08:00

685 lines
18 KiB
Vue

<template>
<!-- #ifdef MP-WEIXIN -->
<view class="content" v-if="!userInfo.user_mobile">
<!-- 头部logo -->
<view class="header">
<image :src="logo"></image>
</view>
<view class="btn_box"
><button
open-type="getPhoneNumber"
@getphonenumber="getPhoneNumber"
class="login-but"
>
微信手机快捷登录
</button></view
>
</view>
<view class="page" v-else>
<view class="m-cells m-cells-form">
<view class="m-cell">
<view class="m-cell-hd"
><label class="u-label">{{ __("手机号码") }}</label></view
>
<view class="m-cell-bd" style="display: inherit">
<block v-if="userInfo.user_mobile && Phone == userInfo.user_mobile">
<view style="width: 400rpx; height: 48rpx"
>{{ user_intl }}{{ Phone }}</view
>
</block>
<block v-else-if="langSetComplete">
<!-- 国家区号 -->
<picker
mode="selector"
@change="onIntlChange"
:value="mode_index"
:range="langLists"
range-key="name"
style="width: 80rpx; text-align: center"
>
<view class="country-int-code" style="color: #000000">{{
user_intl
}}</view>
</picker>
<input
class="u-input"
type="number"
style="width: 400rpx; height: 48rpx"
v-model="Phone"
:placeholder="__('请输入手机号码')"
maxlength="11"
@input="inputphone"
/>
</block>
</view>
<view v-if="!isPhone" class="m-cell-ft">
<view class="m-icon-warn uni-icon uni-icon-info" type="warn"></view>
</view>
</view>
<view class="m-cell">
<view class="m-cell-hd"
><label class="u-label">{{ __("登录密码") }}</label></view
>
<view class="m-cell-bd"
><input
class="u-input"
type="text"
v-model="password"
:placeholder="__('可在其它终端通过手机及密码登录')"
@input="onInputPassword"
/></view>
<view v-if="!isPassword" class="m-cell-ft">
<view class="m-icon-warn uni-icon uni-icon-info" type="warn"></view>
</view>
</view>
<view class="m-cell m-cell-vcode">
<view class="m-cell-hd"
><label class="u-label">{{ __("验证码") }}</label></view
>
<view class="m-cell-bd"
><input
class="u-input"
type="number"
:placeholder="__('请输入验证码')"
maxlength="6"
@input="inputcode"
/></view>
<view v-if="!isCode" class="m-cell-ft">
<view class="m-icon-warn uni-icon uni-icon-info" type="warn"></view>
</view>
<view v-if="isSend" @tap="sendmessage" class="m-vcode-btn">{{
btntext
}}</view>
<view v-else class="m-vcode-btn">{{ btntext }}</view>
</view>
</view>
<view class="btn_box"
><button class="u-btn u-btn-default" @tap="submitdata">
{{ __("保存") }}
</button></view
>
<view class="content" v-if="false">
<view>
<button @click="openCodeDialog">
{{
__(
"发送验证码 - 保存按钮 - 根据手机号发送验证码 - 填写验证码后直接提交"
)
}}
</button>
<view>{{ sprintf(__("验证码为:%s"), code) }}</view>
</view>
<verifycode-dialog
:show="showCodeDialog"
:len="6"
:autoCountdown="true"
:phone="'139****7978'"
v-on:change="change"
></verifycode-dialog>
</view>
</view>
<!-- #endif -->
<!-- #ifndef MP-WEIXIN -->
<view class="page">
<view class="m-cells m-cells-form">
<view class="m-cell">
<view class="m-cell-hd"
><label class="u-label">{{ __("手机号码") }}</label></view
>
<view class="m-cell-bd" style="display: inherit">
<block v-if="userInfo.user_mobile && Phone == userInfo.user_mobile">
<view style="width: 400rpx; height: 48rpx"
>{{ user_intl }}{{ Phone }}</view
>
</block>
<block v-else-if="langSetComplete">
<!-- 国家区号 -->
<picker
mode="selector"
@change="onIntlChange"
:value="mode_index"
:range="langLists"
range-key="name"
style="width: 80rpx; text-align: center"
>
<view class="country-int-code" style="color: #000000">{{
user_intl
}}</view>
</picker>
<input
class="u-input"
type="number"
style="width: 400rpx; height: 48rpx"
v-model="Phone"
:placeholder="__('请输入手机号码')"
maxlength="11"
@input="inputphone"
/>
</block>
</view>
<view v-if="!isPhone" class="m-cell-ft">
<view class="m-icon-warn uni-icon uni-icon-info" type="warn"></view>
</view>
</view>
<view class="m-cell">
<view class="m-cell-hd"
><label class="u-label">{{ __("登录密码") }}</label></view
>
<view class="m-cell-bd"
><input
class="u-input"
type="text"
v-model="password"
:placeholder="__('可在其它终端通过手机及密码登录')"
@input="onInputPassword"
/></view>
<view v-if="!isPassword" class="m-cell-ft">
<view class="m-icon-warn uni-icon uni-icon-info" type="warn"></view>
</view>
</view>
<view class="m-cell m-cell-vcode">
<view class="m-cell-hd"
><label class="u-label">{{ __("验证码") }}</label></view
>
<view class="m-cell-bd"
><input
class="u-input"
type="number"
:placeholder="__('请输入验证码')"
maxlength="6"
@input="inputcode"
/></view>
<view v-if="!isCode" class="m-cell-ft">
<view class="m-icon-warn uni-icon uni-icon-info" type="warn"></view>
</view>
<view v-if="isSend" @tap="sendmessage" class="m-vcode-btn">{{
btntext
}}</view>
<view v-else class="m-vcode-btn">{{ btntext }}</view>
</view>
</view>
<view class="btn_box"
><button class="u-btn u-btn-default" @tap="submitdata">
{{ __("保存") }}
</button></view
>
<view class="content" v-if="false">
<view>
<button @click="openCodeDialog">
{{
__(
"发送验证码 - 保存按钮 - 根据手机号发送验证码 - 填写验证码后直接提交"
)
}}
</button>
<view>{{ sprintf(__("验证码为:%s"), code) }}</view>
</view>
<verifycode-dialog
:show="showCodeDialog"
:len="6"
:autoCountdown="true"
:phone="'139****7978'"
v-on:change="change"
></verifycode-dialog>
</view>
</view>
<!-- #endif -->
</template>
<script>
import { mapState, mapMutations } from "vuex";
import verifycodeDialog from "../../components/verifycode-dialog/verifycode-dialog.vue";
export default {
name: "asset",
data: function () {
return {
logo: "",
mode_index: 0,
user_intl: "",
Phone: "",
password: "",
Code: "",
btntext: this.__("发送"),
isSend: true,
isPhone: true,
sendTime: 120,
isCode: true,
isPassword: true,
setDefaultLang: false,
langSetComplete: false,
showCodeDialog: false,
code: "1231",
langLists: [],
};
},
components: {
verifycodeDialog,
},
computed: {
...mapState([
"Config",
"StateCode",
"notice",
"plantformInfo",
"shopInfo",
"userInfo",
"hasLogin",
]),
},
onLoad: function (options) {
uni.setNavigationBarTitle({
title: this.__("绑定手机"),
});
var that = this;
// 未设置手机号时,显示
if (!this.userInfo.user_mobile) {
that.setData({
setDefaultLang: true,
});
}
that.initLang();
that.setData({
user_intl: that.getUserIntl(that.userInfo.user_intl),
Phone: that.userInfo.user_mobile,
});
if (this.userInfo.user_mobile) {
that.$.setNavigationBarTitle({
title: this.__("修改密码"),
});
}
// #ifdef MP-WEIXIN
uni.setNavigationBarTitle({
title: this.__("绑定手机"),
});
// #endif
setTimeout(() => {
this.getPlantformInfo((plantformInfo) => {
this.logo = plantformInfo.logo;
});
}, 200);
},
methods: {
...mapMutations([
"login",
"logout",
"getPlantformInfo",
"forceUserInfo",
"getUserInfo",
]),
initLang() {
var that = this;
let lists = [];
for (let idx in this.Lang.data.items) {
lists.push({
id: this.Lang.data.items[idx].currency_id,
name:
this.Lang.data.items[idx].label +
"(+" +
this.Lang.data.items[idx].currency_id +
")",
});
console.info(
this.Lang.data.items[idx].currency_id,
this.Lang.data.items[idx].label
);
if (that.setDefaultLang && idx == this.mode_index) {
this.user_intl = "+" + this.Lang.data.items[idx].currency_id;
}
}
that.setData({
langLists: lists,
langSetComplete: true,
});
},
getPhoneNumber: function (e) {
var that = this;
that.$.request({
url: this.Config.URL.wx.get_user_phone_number,
data: {
code: e.detail.code,
},
dataType: "json",
success: function (data, status, msg, code) {
if (status == 200) {
that.$.confirm(that.__("手机号绑定成功!"));
that.cleanCache();
that.login(data);
setTimeout(() => that.$.backpage(1), 2000);
}
},
});
},
getPhoneNumber: function (e) {
var that = this;
// 允许授权
if (typeof e.detail.code !== "undefined") {
//调用接口利用 e.detail.encryptedData, e.detail.iv 信息来解密手机号
that.$.request({
url: this.Config.URL.wx.get_user_phone_number,
data: {
code: e.detail.code,
},
dataType: "json",
success: function (userInfo, status, msg, code) {
if (status == 200) {
that.$.request({
url: that.Config.URL.user.overview,
success: function (data, status, msg, code) {
userInfo = Object.assign(userInfo, data.member_info);
//that.cleanCache();
that.login(userInfo);
setTimeout(() => that.$.backpage(1), 2000);
},
});
} else {
that.$.confirm(msg);
}
},
});
} else {
that.$.confirm(that.__("请允许手机授权!"));
}
},
cleanCache: function (e) {
var that = this;
const language = uni.getStorageSync("selang");
that.$.storage.clear();
//如果不在允许的语言内,可重置
uni.setStorageSync("selang", language);
// #ifdef MP-WEIXIN
var info = that.$.storage.info();
// #endif
//退出登录
that.logout(true);
},
getUserIntl: function (userInfoIntl) {
let that = this;
if (that.setDefaultLang) {
return that.user_intl;
}
if (that.user_intl.length > 1) {
return that.user_intl;
}
return that.user_intl + userInfoIntl;
},
onIntlChange: function (e) {
var that = this;
var index = e.detail.value;
this.setData({
mode_index: e.detail.value,
user_intl: "+" + this.langLists[index].id,
});
},
change: function (res) {
if (res.type == 1) {
this.code = res.code;
this.showCodeDialog = false;
} else if (res.type == -1) {
this.code = this.__("请输入验证码");
this.showCodeDialog = false;
} else {
setTimeout(function () {
res.resendCall();
}, 3000);
}
},
openCodeDialog: function () {
this.showCodeDialog = true;
},
inputphone: function (e) {
let that = this;
this.setData({
Phone: e.detail.value,
});
if (that.$.isNull(e.detail.value)) {
this.setData({
isPhone: false,
});
} else {
if (that.$.tel(e.detail.value, this.user_intl)) {
this.setData({
isPhone: true,
});
} else {
this.setData({
isPhone: false,
});
}
}
},
onInputPassword: function (e) {},
inputcode: function (e) {
let that = this;
this.setData({
Code: e.detail.value,
}),
that.$.isNull(e.detail.value)
? this.setData({
isCode: false,
})
: this.setData({
isCode: true,
});
},
sendmessage: function () {
let that = this;
//console.info(this.Phone)
if (that.$.isNull(this.Phone)) {
this.setData({
isPhone: false,
});
} else if (that.$.tel(this.Phone, this.user_intl)) {
if (false && this.Phone && this.Phone == this.userInfo.user_mobile)
that.$.confirm(that.__("你已经绑定过该手机!"));
else if (this.isSend) {
this.setData({
isSend: false,
});
var t = this.sendTime;
var params = {
user_intl: that.user_intl,
mobile: that.user_intl + this.Phone,
};
that.$.request({
url: this.Config.URL.account.get_mobile_checkcode,
data: params,
success: function (data, status, msg, code) {
if (status == 200) {
var r = setInterval(function () {
t > 0
? that.setData({
btntext: t-- + "s",
})
: (that.setData({
isSend: true,
sendTime: 120,
btntext: that.__("重新发送"),
}),
clearInterval(r));
}, 1e3);
} else {
that.setData({
isSend: true,
}),
that.$.alert(msg);
}
},
});
}
} else {
this.setData({
isPhone: false,
});
}
},
submitdata: function () {
let that = this;
if (that.$.isNull(this.Phone))
this.setData({
isPhone: false,
});
else if (that.$.tel(this.Phone, this.user_intl))
if (false && this.Phone == this.userInfo.user_mobile) {
that.$.confirm(that.__("你目前已经绑定该手机!"));
} else if (that.$.isNull(this.Code))
this.setData({
isCode: false,
});
else if (that.$.isNull(this.password)) {
this.setData({
isPassword: false,
});
} else {
var params = {
mobile: that.user_intl + this.Phone,
password: this.password,
auth_code: this.Code,
user_intl: that.user_intl,
};
that.$.request({
url: this.Config.URL.account.bind_mobile,
data: params,
success: function (data, status, msg, code) {
if (status == 200) {
let userInfo = {};
if (data.commonResult) {
userInfo = data.commonResult;
var id = that.$.setStorageSync("uid", userInfo.user_id);
var key = that.$.setStorageSync("ukey", userInfo.key);
// 如果切换新账号重新登陆
that.$.request({
url: that.Config.URL.user.overview,
success: function (data, status, msg, code) {
userInfo = Object.assign(userInfo, data.member_info);
//that.cleanCache();
that.login(userInfo);
that.$.showModal(that.__("操作成功"), function () {
that.$.backpage(1);
});
},
});
} else {
userInfo["as"] = 1;
that.login(userInfo);
that.$.showModal(that.__("操作成功"), function () {
that.$.backpage(1);
});
}
} else {
that.$.confirm(msg);
}
},
});
}
else
this.setData({
isPhone: false,
});
},
},
};
</script>
<style lang="scss">
@import "../../styles/_variables.scss";
.content {
display: flex;
flex-direction: column;
justify-content: center;
/* margin-top: 128rpx; */
}
/* 头部 logo */
.header {
width: 161rpx;
height: 161rpx;
box-shadow: 0rpx 0rpx 60rpx 0rpx rgba(0, 0, 0, 0.1);
border-radius: 50%;
background-color: $main-skin-color;
/*
margin-top: 80rpx;
margin-bottom: 60rpx;
*/
margin-top: 40rpx;
margin-bottom: 20rpx;
margin-left: auto;
margin-right: auto;
image {
width: 161rpx;
height: 161rpx;
border-radius: 50%;
}
}
.m-cell-vcode {
padding-top: 0;
padding-right: 0;
padding-bottom: 0;
}
.m-vcode-img {
width: 216rpx;
height: 88rpx;
}
.btn_box {
padding: 20rpx;
}
.m-code {
right: 210rpx;
}
.m-vcode-btn {
width: 150rpx;
text-align: center;
}
.login-but {
background-color: red;
color: white;
}
</style>