< template >
< view class = "loginBack" >
< view class = "loginForm" >
< view class = "welcomeLogin" > 欢迎登录 < / view >
< view class = "tip" > yoga < / view >
< view class = "formregion" >
< uni -forms :model ="form" ref = "uForm" >
< uni -forms -item prop = "phonenumber" >
< uni -easyinput type = "number" placeholder = "请输入手机号码" v -model = " form.phonenumber " @blur ="zhhandleBlur" :inputBorder ="false" :clearable ="false" :placeholderStyle ="placeholderStyle" / >
< / u n i - f o r m s - i t e m >
< uni -forms -item prop = "password" >
< uni -easyinput type = "password" placeholder = "请输入密码" v -model = " form.password " @blur ="mmhandleBlur" maxlength = "12" :inputBorder ="false" :clearable ="false" :placeholderStyle ="placeholderStyle" / >
< / u n i - f o r m s - i t e m >
< uni -forms -item prop = "code" >
< uni -easyinput type = "text" placeholder = "请输入验证码" v -model .trim = " form.code " :inputBorder ="false" :clearable ="false" :placeholderStyle ="placeholderStyle" / >
< image :src ="checkimg" class = "checkimg" mode = "scaleToFill" > < / image >
< view class = "codebtn" @click ="getcode" > 看 不 清 ? < / view >
< / u n i - f o r m s - i t e m >
< button type = "primary" class = "logincla" @click ="loginpwdDo" > 登 录 < / button >
< view v-if ="iflogin" class="loginno" > 登 录 中 .. < / view >
< view class = "regcon" >
<!-- < view class = "regtxt" @click ="gotopwd" > 修 改 密 码 < / view >
< view class = "regtxtl" > < / view > -- >
< view class = "regtxtr" @click ="gotoregister" > 注 册 账 号 → < / view >
< / view >
< / u n i - f o r m s >
< / view >
< u -toast ref = "uToast" / >
< / view >
< / view >
< / template >
< script >
//#ifdef APP-PLUS
// const jpushModule = uni.requireNativePlugin('JG-JPush');
//#endif
import { myCache } from '../../utils/utils.js' ;
export default {
data ( ) {
return {
checkimg : require ( "@/static/image/check.jpg" ) ,
placeholderStyle : "font-size: 28rpx;color: #c3c4c6; text" ,
form : {
phonenumber : "" ,
password : "" ,
code : "" ,
uuid : "" ,
registerId : "" , // 设备id
position : "123.357586,41.862907" , // 默认拾取 三朵兰瑜伽默认坐标
} ,
iflogin : false ,
gcj02 : "1" ,
address : '' ,
longitude : '' , // 经度
latitude : '' , // 维度
}
} ,
onLoad ( ) {
this . getcheckImg ( ) ;
this . getsystemInfo ( ) ;
this . getPosition ( ) ;
} ,
methods : {
gotoregister ( ) {
// 注册账号
uni . navigateTo ( {
url : ` /pages/login/register `
} ) ;
} ,
gotopwd ( ) {
// 修改密码
uni . navigateTo ( {
url : ` /pages/user/pwdset `
} ) ;
} ,
// 获取定位
getPosition ( ) {
const _this = this ;
uni . getLocation ( {
type : 'gcj02' , //'gcj02','wgs84', // 返回的坐标类型, wgs84 表示国际标准的经纬度
geocode : true ,
success : function ( res ) {
console . log ( res ) ;
console . log ( '当前位置的经度:' + res . longitude ) ;
console . log ( '当前位置的纬度:' + res . latitude ) ;
_this . form . position = res . latitude + ',' + res . longitude ;
_this . $forceUpdate ( ) ;
} ,
fail : function ( err ) {
console . log ( '获取位置失败:' + err . errMsg ) ;
uni . showModal ( {
title : '提示' ,
content : '请在设置中开启定位服务,注册默认地址信息!' ,
showCancel : false ,
success : function ( res ) {
if ( res . confirm ) {
console . log ( '用户点击确定' ) ;
// #ifdef APP-PLUS
// 跳转到设置页面
plus . device . vendor = 'apple' ; // 如果是iOS系统
if ( plus . os . name == 'iOS' ) {
plus . runtime . openURL ( 'prefs:root=LOCATION_SERVICES' ) ;
} else {
plus . runtime . openURL ( 'package:' + plus . android . runtimeMainActivity ( ) ) ;
}
// #endif
}
}
} ) ;
_this . form . position = "123.357586,41.862907" ;
_this . $forceUpdate ( ) ;
}
} ) ;
} ,
// 获取设备信息
getsystemInfo ( ) {
const info = uni . getSystemInfoSync ( ) ;
const platform = info . platform ; // 手机安卓还是苹果
if ( info . platform === 'ios' ) {
// ios
console . log ( 'iOS 设备唯一标识:' , info . deviceId ) ;
}
else {
//安卓
console . log ( '设备信息ID:' , info . deviceId ) ;
}
this . form . registerId = info . deviceId ;
this . $forceUpdate ( ) ;
// const iosApp = info.platform;
console . log ( 'iOS 设备名称:' , info . model ) ;
console . log ( 'iOS 系统版本:' , info . system ) ;
console . log ( 'iOS 设备唯一标识:' , info . deviceId ) ;
console . log ( 'iOS 设备像素比:' , info . devicePixelRatio ) ;
console . log ( 'iOS 设备屏幕宽度:' , info . screenWidth ) ;
console . log ( 'iOS 设备屏幕高度:' , info . screenHeight ) ;
console . log ( 'iOS 设备方向:' , info . deviceOrientation ) ;
// uni.showModal({
// title: '提示',
// content: info.deviceId,
// success(res) {
// if (res.confirm) {
// console.log('用户点击了确定');
// } else if (res.cancel) {
// console.log('用户点击了取消');
// }
// }
// });
} ,
async getcheckImg ( ) {
// 验证图片信息
const { data : res } = await uni . $http . get ( '/captchaImage' ) ;
if ( res && res . img && res . uuid ) {
this . checkimg = 'data:image/png;base64,' + res . img ;
this . form . uuid = res . uuid ;
this . $forceUpdate ( ) ;
}
} ,
// 判断密码是否合规
mmhandleBlur ( e ) {
console . log ( e )
if ( e . detail . value && e . detail . value . length < 6 ) {
// if(e.detail.value&&!this.checkMM(e.detail.value)){
// '密码必须是由6-20位长度的字母、数字组成, 请核实! ',
// '密码必须是8-20位字符至少包括大写字母、小写字母、数字、特殊符号中3种以上, 请核实! '
// this.$refs.uToast.show({
// title: "密码必须是6-20位字符至少包括英文、数字、特殊符号中2种以上, 请核实! ",
// type: 'error',
// duration: 2000
// });
}
} ,
// 校验密码
checkMM ( mm ) {
// if (!(/^(?!([a-zA-Z]+|\d+)$)[a-zA-Z\d]{6,20}$/.test(mm))) {
// // if (!(/((^(?=.*[a-z])(?=.*[A-Z])(?=.*[^A-Za-z0-9])[\da-zA-Z_\W]{8,20}$)|(^(?=.*\d)(?=.*[A-Z])(?=.*[^A-Za-z0-9])[\da-zA-Z_\W]{8,20}$)|(^(?=.*\d)(?=.*[a-z])(?=.*[^A-Za-z0-9])[\da-zA-Z_\W]{8,20}$)|(^(?=.*\d)(?=.*[a-z])(?=.*[A-Z])[\da-zA-Z_\W]{8,20}$))/.test(mm))) {
// return false;
// }
return true ;
} ,
// 判断手机号码是否合法
zhhandleBlur ( e ) {
console . log ( e )
// 判断手机号码是否合法
if ( ! this . $u . test . mobile ( e . detail . value ) ) {
this . $refs . uToast . show ( {
title : '手机号码输入错误,请核实!' ,
type : 'warning' ,
duration : 2000
} ) ;
}
} ,
async getcode ( ) {
uni . showLoading ( {
title : '验证码请求中...'
} ) ;
const { data : res } = await uni . $http . get ( '/captchaImage' ) ;
console . log ( res ) ;
if ( res && res . img && res . uuid ) {
this . checkimg = 'data:image/png;base64,' + res . img ;
this . form . uuid = res . uuid ;
this . $forceUpdate ( ) ;
}
else {
this . $refs . uToast . show ( {
title : "验证码请求失败!请重试!" ,
type : 'error' ,
duration : 2000
} ) ;
}
} ,
// 校验手机号码
checkPhone ( phone ) {
if ( ! ( /^1[3456789]\d{9}$/ . test ( phone ) ) ) {
return false ;
}
return true ;
} ,
//地图选择地址
chooseLocation ( ) {
var _this = this ;
uni . chooseLocation ( {
success : ( data ) => {
console . log ( data )
_this . gcj02 = "1" ;
var adrname = ( ( data . name === undefined || data . name === null ) ? '' : data . name ) ;
_this . address = ( ( data . address === undefined || data . address === null ) ? '' : data . address ) + adrname ;
_this . latitude = data . latitude ;
_this . longitude = data . longitude ;
_this . form . position = _this . latitude + ',' + _this . longitude ;
_this . $forceUpdate ( ) ;
} ,
fail : ( Error ) => {
_this . gcj02 = "1" ;
_this . address = "" ;
_this . latitude = "" ;
_this . longitude = "" ;
_this . form . position = "" ;
_this . $forceUpdate ( ) ;
}
} ) ;
} ,
login ( ) {
// 测试
// myCache('token', "12345678");
// myCache('user', {
// phonenumber:"测试人",
// userid:"1",
// userphone:"18900000001",
// avatar:"/static/image/girl.jpg"
// });
// this.$refs.uToast.show({
// title: '登录成功',
// type: 'success',
// isTab: true,
// duration: 2000,
// url: '/pages/index/index'
// });
// 正式
this . loginpwdDo ( ) ;
} ,
// 密码登录
async loginpwdDo ( ) {
// 手机号码 密码是否输入
if ( ! this . form . phonenumber ) {
this . $refs . uToast . show ( {
title : "请输入手机号码!" ,
type : 'warn' ,
duration : 2000
} ) ;
return false ;
}
if ( ! this . form . password ) {
this . $refs . uToast . show ( {
title : "请输入密码!" ,
type : 'warn' ,
duration : 2000
} ) ;
return false ;
}
if ( ! this . form . code ) {
this . $refs . uToast . show ( {
title : "请输入验证码!" ,
type : 'warn' ,
duration : 2000
} ) ;
return false ;
}
uni . setStorageSync ( 'iftoken' , "1" ) ;
uni . showLoading ( {
title : '正在登录...'
} ) ;
const { data : res } = await uni . $http . post ( '/api/login' , this . form ) ;
if ( res && res . code == "200" ) {
uni . setStorageSync ( "loginindex" , "1" ) ;
uni . setStorageSync ( "token" , res . token ) ;
// 保存用户登录信息
this . getUserInfo ( ) ;
// 保护用户门店信息
this . loadshop ( ) ;
this . $refs . uToast . show ( {
title : '登录成功' ,
type : 'success' ,
isTab : true ,
duration : 2000 ,
url : '/pages/index/index'
} ) ;
}
else {
if ( res . msg == '验证码错误' ) {
// 重新获取验证码
this . getcode ( ) ;
}
// uni.setStorageSync('token', this.form.uuid);
this . $refs . uToast . show ( {
title : res . msg ? res . msg : "此账号登录失败!请重试!" ,
type : 'error' ,
duration : 2000
} ) ;
}
} ,
// 验证码登录
async getUserInfo ( ) {
var _this = this ;
const { data : res } = await uni . $http . get ( '/api/getInfo' ) ;
if ( res && res . appLoginUser ) {
var user = res . appLoginUser ;
myCache ( 'user' , {
userid : user . userId ,
nickName : user . nickName ,
username : user . userName ,
userphone : user . phoneNumber ,
avatar : user . avatar
} ) ;
myCache ( 'userInfo' , user ) ;
myCache ( 'phone' , user . phoneNumber ) ;
}
if ( res && res . visitStore ) {
var shop = res . visitStore ;
myCache ( 'shop' , shop ) ;
myCache ( 'myshop' , shop . storeName ) ;
myCache ( 'myshopid' , shop . id ) ;
// var shoplist=[shop]
// myCache('shoplist',shoplist);
}
} ,
async loadshop ( ) {
// 获取门店
const { data : res } = await uni . $http . post ( '/api/index/getStores' ) ;
if ( res . data && res . data . length > 0 ) {
myCache ( 'shoplist' , res . data ) ;
}
} ,
async getUserShopList ( ) {
var _this = this ;
const { data : res } = await uni . $http . get ( '/api/getStoreList' ) ;
console . log ( res ) ;
if ( res && res . appLoginUser ) {
var user = res . appLoginUser ;
myCache ( 'user' , {
userid : user . userId ,
nickName : user . nickName ,
username : user . userName ,
userphone : user . phoneNumber ,
avatar : user . avatar
} ) ;
myCache ( 'userInfo' , user ) ;
myCache ( 'phone' , user . phoneNumber ) ;
}
if ( res && res . visitStore ) {
var shop = res . visitStore ;
myCache ( 'shop' , shop ) ;
myCache ( 'myshop' , shop . storeName ) ;
myCache ( 'myshopid' , shop . id ) ;
var shoplist = [ shop ]
myCache ( 'shoplist' , shoplist ) ;
}
} ,
}
}
< / script >
< style >
< / style >
< style lang = "scss" scoped >
: : v - deep . u - checkbox _ _label {
color : # bdbfc1
}
: : v - deep . uni - easyinput _ _content - input {
width : 500 rpx ;
height : 80 rpx ;
background : # fff ;
box - shadow : 0 rpx 12 rpx 64 rpx 2 rpx rgba ( 137 , 150 , 95 , 0.3 ) ;
border - radius : 254 rpx 254 rpx 254 rpx 254 rpx ;
}
: : v - deep . uni - easyinput _ _content {
border - radius : 254 rpx 254 rpx 254 rpx 254 rpx ;
text - indent : 20 rpx ;
}
. lttxt {
font - size : 30 rpx ;
font - family : PingFang SC , PingFang SC ;
font - weight : 400 ;
color : # 333333 ;
line - height : 38 rpx ;
height : 45 rpx ;
margin : 30 rpx auto ;
text - align : center ;
}
. timetxt {
position : absolute ;
top : 20 rpx ;
right : 28 rpx ;
display : block ;
font - size : 36 rpx ;
color : # 00 a89b ;
line - height : 38 rpx ;
height : 45 rpx ;
margin - left : 50 rpx ;
}
. checkimg {
position : absolute ;
top : 14 rpx ;
right : 130 rpx ;
width : 150 rpx ;
height : 50 rpx ;
}
. codebtn {
position : absolute ;
top : 12 rpx ;
right : 20 rpx ;
display : block ;
color : # 00 a89b ;
height : 60 rpx ;
line - height : 60 rpx ;
font - size : 26 rpx ;
padding : 0 10 rpx ;
}
. regcon {
display : flex ;
flex - direction : row ;
align - items : center ;
justify - content : center ;
margin - top : 36 rpx ;
. regtxt {
color : # 00 a89b ;
font - size : 28 rpx ;
display : flex ;
align - items : center ;
}
. regtxtl {
color : # 00 a89b ;
width : 2 rpx ;
height : 26 rpx ;
font - size : 26 rpx ;
margin - left : 10 rpx ;
margin - right : 10 rpx ;
border - right : 1 rpx solid # 00 a89b ;
display : flex ;
align - items : center ;
}
. regtxtr {
color : # 00 a89b ;
height : 28 rpx ;
font - size : 28 rpx ;
display : flex ;
align - items : center ;
margin - right : 10 rpx ;
}
}
. loginno {
display : block ;
background - color : rgba ( 137 , 150 , 95 , 0.3 ) ;
width : 100 % ;
line - height : 2 ;
margin - top : 30 rpx ;
border - radius : 12 rpx ;
font - size : 30 rpx ;
text - align : center ;
box - sizing : border - box ;
}
. logincla {
display : block ;
background - color : # 00 A99A ;
width : 100 % ;
line - height : 2 ;
}
. loginBack {
color : # fff ;
height : 100 vh ;
padding : 60 rpx 50 rpx 200 rpx 50 rpx ;
width : 100 % ;
overflow : hidden ;
background - size : 100 % 100 % ;
background - image : url ( '../../static/image/lgbg.jpg' ) ;
. inpuIcon {
width : 46 rpx ;
height : 46 rpx ;
margin - right : 30 rpx ;
}
. formregion {
width : 100 % ;
padding : 30 px 50 rpx ;
background - color : # fff ;
border - radius : 10 px ;
margin - top : 20 rpx ;
position : relative ;
display : block ;
overflow : hidden ;
. logo {
position : absolute ;
top : - 20 rpx ;
left : 0 ;
width : 100 % ;
display : flex ;
flex - direction : column ;
align - items : center ;
justify - content : center ;
}
. define {
width : 120 rpx ;
height : 120 rpx ;
}
}
}
. welcomeLogin {
font - size : 30 rpx ;
letter - spacing : 2 rpx ;
padding : 20 rpx 0 10 rpx ;
margin : 0 auto ;
width : 100 % ;
}
. tip {
font - weight : 600 ;
font - size : 42 rpx ;
letter - spacing : 4 rpx ;
padding : 0 0 40 rpx 0 ;
}
< / style >