Commit 07fe12483a19bb80ff9fa76dd086562dbde9a9f6

Authored by YunaiV
1 parent 55ee2fca

优化登陆界面,增加手机密码的登陆方式

yudao-vue-ui/pages/auth/login.vue
1 <template> 1 <template>
2 <view class="app"> 2 <view class="app">
  3 + <!-- 左下角的环 -->
3 <view class="left-bottom-sign"></view> 4 <view class="left-bottom-sign"></view>
4 - <view class="back-btn mix-icon icon-guanbi" @click="navBack"></view> 5 + <!-- 右上角的折角 -->
5 <view class="right-top-sign"></view> 6 <view class="right-top-sign"></view>
  7 + <!-- 左上角的 x 关闭 -->
  8 + <view class="back-btn mix-icon icon-guanbi" @click="navBack"></view>
  9 + <!-- 用户协议 -->
6 <view class="agreement center"> 10 <view class="agreement center">
7 <text class="mix-icon icon-xuanzhong" :class="{active: agreement}" @click="checkAgreement"></text> 11 <text class="mix-icon icon-xuanzhong" :class="{active: agreement}" @click="checkAgreement"></text>
8 <text @click="checkAgreement">请认真阅读并同意</text> 12 <text @click="checkAgreement">请认真阅读并同意</text>
9 - <text class="tit" @click="navToAgreementDetail(1)">《用户服务协议》</text>  
10 - <text class="tit" @click="navToAgreementDetail(2)">《隐私权政策》</text> 13 + <text class="title" @click="navToAgreementDetail(1)">《用户服务协议》</text>
  14 + <text class="title" @click="navToAgreementDetail(2)">《隐私权政策》</text>
11 </view> 15 </view>
  16 + <!-- 登录表单 -->
12 <view class="wrapper"> 17 <view class="wrapper">
13 <view class="left-top-sign">LOGIN</view> 18 <view class="left-top-sign">LOGIN</view>
14 - <view class="welcome">  
15 - 欢迎回来!  
16 - </view> 19 + <view class="welcome">手机登录/注册</view>
  20 + <!-- 手机验证码登录 -->
17 <view class="input-content"> 21 <view class="input-content">
18 <view class="input-item"> 22 <view class="input-item">
19 - <text class="tit">手机号码</text> 23 + <text class="title">手机号码</text>
20 <view class="row"> 24 <view class="row">
21 - <input  
22 - v-model="username"  
23 - type="number"  
24 - maxlength="11"  
25 - placeholder="请输入手机号码"  
26 - placeholder-style="color: #909399"  
27 - /> 25 + <input v-model="mobile" type="number" maxlength="11"
  26 + placeholder="请输入手机号码" placeholder-style="color: #909399"/>
28 </view> 27 </view>
29 </view> 28 </view>
30 - <view class="input-item">  
31 - <text class="tit">验证码</text> 29 + <!-- 判断使用验证码还是密码 -->
  30 + <view class="input-item" v-if="loginType == 'code'">
  31 + <text class="title">验证码</text>
  32 + <view class="row">
  33 + <input v-model="code" type="number" maxlength="6"
  34 + placeholder="请输入手机验证码" placeholder-style="color: #909399">
  35 + <mix-code :mobile="mobile" templateCode="SMS_194050994"></mix-code>
  36 + </view>
  37 + </view>
  38 + <view class="input-item" v-else>
  39 + <text class="title">密码</text>
32 <view class="row"> 40 <view class="row">
33 - <input  
34 - v-model="code"  
35 - type="number"  
36 - maxlength="6"  
37 - placeholder="请输入手机验证码"  
38 - placeholder-style="color: #909399"  
39 - />  
40 - <mix-code :mobile="username" templateCode="SMS_194050994"></mix-code> 41 + <input v-model="password" type="password" maxlength="16"
  42 + placeholder="请输入密码" placeholder-style="color: #909399"/>
41 </view> 43 </view>
42 </view> 44 </view>
  45 + <mix-button ref="confirmBtn" text="立即登录" marginTop="60rpx" @onConfirm="login"></mix-button>
  46 + <!-- 切换登陆 -->
  47 + <view class="login-type" v-if="loginType == 'code'" @click="setLoginType('password')">账号密码登录</view>
  48 + <view class="login-type" v-else @click="setLoginType('code')">免密登录</view>
43 </view> 49 </view>
44 - <mix-button ref="confirmBtn" text="登录" marginTop="60rpx" @onConfirm="login"></mix-button>  
45 50
  51 + <!-- 快捷登录 -->
46 <!-- #ifdef APP-PLUS || MP-WEIXIN --> 52 <!-- #ifdef APP-PLUS || MP-WEIXIN -->
47 <view class="other-wrapper"> 53 <view class="other-wrapper">
48 <view class="line center"> 54 <view class="line center">
49 - <text class="tit">快捷登录</text> 55 + <text class="title">快捷登录</text>
50 </view> 56 </view>
51 <view class="list row"> 57 <view class="list row">
52 <!-- #ifdef MP-WEIXIN --> 58 <!-- #ifdef MP-WEIXIN -->
@@ -56,10 +62,6 @@ @@ -56,10 +62,6 @@
56 <!-- #endif --> 62 <!-- #endif -->
57 63
58 <!-- #ifdef APP-PLUS --> 64 <!-- #ifdef APP-PLUS -->
59 - <view v-if="canUseAppleLogin && false" class="item column center" style="width: 180rpx;" @click="loginByApple">  
60 - <image class="icon" src="/static/icon/apple.png"></image>  
61 - <text>Apple登录</text>  
62 - </view>  
63 <view class="item column center" style="width: 180rpx;" @click="loginByWxApp"> 65 <view class="item column center" style="width: 180rpx;" @click="loginByWxApp">
64 <image class="icon" src="/static/icon/login-wx.png"></image> 66 <image class="icon" src="/static/icon/login-wx.png"></image>
65 <text>微信登录</text> 67 <text>微信登录</text>
@@ -70,6 +72,7 @@ @@ -70,6 +72,7 @@
70 <!-- #endif --> 72 <!-- #endif -->
71 </view> 73 </view>
72 74
  75 + <!-- Loading 框 -->
73 <mix-loading v-if="isLoading"></mix-loading> 76 <mix-loading v-if="isLoading"></mix-loading>
74 </view> 77 </view>
75 </template> 78 </template>
@@ -78,58 +81,63 @@ @@ -78,58 +81,63 @@
78 import {checkStr} from '@/common/js/util' 81 import {checkStr} from '@/common/js/util'
79 import loginMpWx from './mixin/login-mp-wx.js' 82 import loginMpWx from './mixin/login-mp-wx.js'
80 import loginAppWx from './mixin/login-app-wx.js' 83 import loginAppWx from './mixin/login-app-wx.js'
81 - import loginApple from './mixin/login-apple.js'  
82 export default{ 84 export default{
83 - mixins: [loginMpWx, loginAppWx, loginApple], 85 + mixins: [loginMpWx, loginAppWx],
84 data(){ 86 data(){
85 return { 87 return {
86 - canUseAppleLogin: false,  
87 - agreement: true,  
88 - username: '', 88 + loginType: 'code', // 登录方式,code 验证码;password 密码
  89 + mobile: '',
89 code: '', 90 code: '',
  91 + password: '',
  92 + agreement: true,
90 } 93 }
91 }, 94 },
92 onLoad() { 95 onLoad() {
93 - console.log(1);  
94 }, 96 },
95 methods: { 97 methods: {
96 loginSuccessCallBack(data){ 98 loginSuccessCallBack(data){
97 - this.$util.msg('登陆成功'); 99 + this.$util.msg('登录成功');
98 this.$store.commit('setToken', data); 100 this.$store.commit('setToken', data);
99 setTimeout(()=>{ 101 setTimeout(()=>{
100 uni.navigateBack(); 102 uni.navigateBack();
101 }, 1000) 103 }, 1000)
102 }, 104 },
103 - //手机号登录 105 + // 手机号登录
104 async login(){ 106 async login(){
105 - if(!this.agreement){ 107 + // 参数校验
  108 + if (!this.agreement){
106 this.$util.msg('请阅读并同意用户服务及隐私协议'); 109 this.$util.msg('请阅读并同意用户服务及隐私协议');
107 this.$refs.confirmBtn.stop(); 110 this.$refs.confirmBtn.stop();
108 return; 111 return;
109 } 112 }
110 - const {username, code} = this;  
111 - if(!checkStr(username, 'mobile')){ 113 + const {mobile, code, password} = this;
  114 + if (!checkStr(mobile, 'mobile')){
112 this.$util.msg('请输入正确的手机号码'); 115 this.$util.msg('请输入正确的手机号码');
113 this.$refs.confirmBtn.stop(); 116 this.$refs.confirmBtn.stop();
114 return; 117 return;
115 } 118 }
116 - if(!checkStr(code, 'mobileCode')){ 119 + if (!checkStr(code, 'mobileCode')) {
117 this.$util.msg('验证码错误'); 120 this.$util.msg('验证码错误');
118 this.$refs.confirmBtn.stop(); 121 this.$refs.confirmBtn.stop();
119 return; 122 return;
120 } 123 }
121 - const res = await this.$request('user', 'login', {username,code}); 124 +
  125 + // 执行登陆
  126 + const res = await this.$request('user', 'login', {mobile,code});
122 this.$refs.confirmBtn.stop(); 127 this.$refs.confirmBtn.stop();
123 128
124 - if(res.status === 1){ 129 + if (res.status === 1){
125 this.loginSuccessCallBack(res.data); 130 this.loginSuccessCallBack(res.data);
126 - }else{ 131 + } else{
127 this.$util.msg(res.msg); 132 this.$util.msg(res.msg);
128 } 133 }
129 }, 134 },
130 navBack(){ 135 navBack(){
131 uni.navigateBack(); 136 uni.navigateBack();
132 }, 137 },
  138 + setLoginType(loginType) {
  139 + this.loginType = loginType;
  140 + },
133 //同意协议 141 //同意协议
134 checkAgreement(){ 142 checkAgreement(){
135 this.agreement = !this.agreement; 143 this.agreement = !this.agreement;
@@ -154,7 +162,7 @@ @@ -154,7 +162,7 @@
154 } 162 }
155 </style> 163 </style>
156 <style scoped lang='scss'> 164 <style scoped lang='scss'>
157 - .app{ 165 + .app {
158 padding-top: 15vh; 166 padding-top: 15vh;
159 position:relative; 167 position:relative;
160 width: 100vw; 168 width: 100vw;
@@ -162,12 +170,20 @@ @@ -162,12 +170,20 @@
162 overflow: hidden; 170 overflow: hidden;
163 background: #fff; 171 background: #fff;
164 } 172 }
165 - .wrapper{ 173 + .wrapper {
166 position:relative; 174 position:relative;
167 z-index: 90; 175 z-index: 90;
168 padding-bottom: 40rpx; 176 padding-bottom: 40rpx;
  177 + .welcome {
  178 + position:relative;
  179 + left: 50rpx;
  180 + top: -90rpx;
  181 + font-size: 46rpx;
  182 + color: #555;
  183 + text-shadow: 1px 0px 1px rgba(0,0,0,.3);
  184 + }
169 } 185 }
170 - .back-btn{ 186 + .back-btn {
171 position:absolute; 187 position:absolute;
172 left: 20rpx; 188 left: 20rpx;
173 top: calc(var(--status-bar-height) + 20rpx); 189 top: calc(var(--status-bar-height) + 20rpx);
@@ -176,18 +192,25 @@ @@ -176,18 +192,25 @@
176 font-size: 32rpx; 192 font-size: 32rpx;
177 color: #606266; 193 color: #606266;
178 } 194 }
179 - .left-top-sign{ 195 + .left-top-sign {
180 font-size: 120rpx; 196 font-size: 120rpx;
181 color: #f8f8f8; 197 color: #f8f8f8;
182 position:relative; 198 position:relative;
183 left: -12rpx; 199 left: -12rpx;
184 } 200 }
185 - .right-top-sign{ 201 + .left-bottom-sign {
  202 + position: absolute;
  203 + left: -270rpx;
  204 + bottom: -320rpx;
  205 + border: 100rpx solid #d0d1fd;
  206 + border-radius: 50%;
  207 + padding: 180rpx;
  208 + }
  209 + .right-top-sign {
186 position:absolute; 210 position:absolute;
187 top: 80rpx; 211 top: 80rpx;
188 right: -30rpx; 212 right: -30rpx;
189 z-index: 95; 213 z-index: 95;
190 -  
191 &:before, &:after{ 214 &:before, &:after{
192 display:block; 215 display:block;
193 content:""; 216 content:"";
@@ -207,56 +230,49 @@ @@ -207,56 +230,49 @@
207 border-top-left-radius: 50px; 230 border-top-left-radius: 50px;
208 } 231 }
209 } 232 }
210 - .left-bottom-sign{  
211 - position:absolute;  
212 - left: -270rpx;  
213 - bottom: -320rpx;  
214 - border: 100rpx solid #d0d1fd;  
215 - border-radius: 50%;  
216 - padding: 180rpx;  
217 - }  
218 - .welcome{  
219 - position:relative;  
220 - left: 50rpx;  
221 - top: -90rpx;  
222 - font-size: 46rpx;  
223 - color: #555;  
224 - text-shadow: 1px 0px 1px rgba(0,0,0,.3);  
225 - }  
226 - .input-content{ 233 +
  234 + /** 手机登录部分 */
  235 + .input-content {
227 padding: 0 60rpx; 236 padding: 0 60rpx;
228 - }  
229 - .input-item{  
230 - display:flex;  
231 - flex-direction: column;  
232 - align-items:flex-start;  
233 - justify-content: center;  
234 - padding: 0 30rpx;  
235 - background: #f8f6fc;  
236 - height: 120rpx;  
237 - border-radius: 4px;  
238 - margin-bottom: 50rpx;  
239 -  
240 - &:last-child{  
241 - margin-bottom: 0;  
242 - }  
243 - .row{  
244 - width: 100%; 237 + .input-item {
  238 + display:flex;
  239 + flex-direction: column;
  240 + align-items:flex-start;
  241 + justify-content: center;
  242 + padding: 0 30rpx;
  243 + background: #f8f6fc;
  244 + height: 120rpx;
  245 + border-radius: 4px;
  246 + margin-bottom: 50rpx;
  247 + &:last-child{
  248 + margin-bottom: 0;
  249 + }
  250 + .row{
  251 + width: 100%;
  252 + }
  253 + .title{
  254 + height: 50rpx;
  255 + line-height: 56rpx;
  256 + font-size: 26rpx;
  257 + color: #606266;
  258 + }
  259 + input {
  260 + flex: 1;
  261 + height: 60rpx;
  262 + font-size: 30rpx;
  263 + color: #303133;
  264 + width: 100%;
  265 + }
245 } 266 }
246 - .tit{  
247 - height: 50rpx;  
248 - line-height: 56rpx;  
249 - font-size: 26rpx;  
250 - color: #606266; 267 + .login-type {
  268 + display: flex;
  269 + justify-content: flex-end;
  270 + font-size: 13px;
  271 + color: #40a2ff;
  272 + margin-top: 20rpx;
251 } 273 }
252 - input{  
253 - flex: 1;  
254 - height: 60rpx;  
255 - font-size: 30rpx;  
256 - color: #303133;  
257 - width: 100%;  
258 - }  
259 } 274 }
  275 +
260 /* 其他登录方式 */ 276 /* 其他登录方式 */
261 .other-wrapper{ 277 .other-wrapper{
262 display: flex; 278 display: flex;
@@ -264,11 +280,9 @@ @@ -264,11 +280,9 @@
264 align-items: center; 280 align-items: center;
265 padding-top: 20rpx; 281 padding-top: 20rpx;
266 margin-top: 80rpx; 282 margin-top: 80rpx;
267 -  
268 .line{ 283 .line{
269 margin-bottom: 40rpx; 284 margin-bottom: 40rpx;
270 -  
271 - .tit{ 285 + .title {
272 margin: 0 32rpx; 286 margin: 0 32rpx;
273 font-size: 24rpx; 287 font-size: 24rpx;
274 color: #606266; 288 color: #606266;
@@ -285,7 +299,6 @@ @@ -285,7 +299,6 @@
285 color: #606266; 299 color: #606266;
286 background-color: #fff; 300 background-color: #fff;
287 border: 0; 301 border: 0;
288 -  
289 &:after{ 302 &:after{
290 border: 0; 303 border: 0;
291 } 304 }
@@ -305,18 +318,16 @@ @@ -305,18 +318,16 @@
305 height: 90rpx; 318 height: 90rpx;
306 font-size: 24rpx; 319 font-size: 24rpx;
307 color: #999; 320 color: #999;
308 -  
309 .mix-icon{ 321 .mix-icon{
310 font-size: 36rpx; 322 font-size: 36rpx;
311 color: #ccc; 323 color: #ccc;
312 margin-right: 8rpx; 324 margin-right: 8rpx;
313 margin-top: 1px; 325 margin-top: 1px;
314 -  
315 &.active{ 326 &.active{
316 color: $base-color; 327 color: $base-color;
317 } 328 }
318 } 329 }
319 - .tit{ 330 + .title {
320 color: #40a2ff; 331 color: #40a2ff;
321 } 332 }
322 } 333 }
yudao-vue-ui/pages/auth/mixin/login-apple.js deleted
1 -export default{  
2 - onLoad() {  
3 - if(this.systemInfo.platform !== 'ios'){  
4 - return;  
5 - }  
6 - const systemVersion = +this.systemInfo.system.split('.')[0];  
7 - if(systemVersion >= 13){  
8 - this.canUseAppleLogin = true;  
9 - }  
10 - },  
11 - methods: {  
12 - //苹果登录  
13 - async loginByApple(){  
14 - /* if(!this.canUseAppleLogin){  
15 - this.$util.msg('系统版本过低,无法使用苹果登录');  
16 - return;  
17 - } */  
18 - if(!this.agreement){  
19 - this.$util.msg('请阅读并同意用户服务及隐私协议');  
20 - this.$refs.confirmBtn.stop();  
21 - return;  
22 - }  
23 - uni.login({  
24 - provider: 'apple',  
25 - success: loginRes=> {  
26 - // 登录成功  
27 - uni.getUserInfo({  
28 - provider: 'apple',  
29 - success: async userRes=> {  
30 - console.log(userRes);  
31 - const response = await this.$request('user', 'loginByApple', {  
32 - authorizationCode: userRes.userInfo.authorizationCode,  
33 - identityToken: userRes.userInfo.identityToken  
34 - }, {  
35 - showLoading: true  
36 - });  
37 - console.log(response);  
38 - //注销苹果登录  
39 - this.appleLogout();  
40 - console.log(response);  
41 - if(response.status === 0){  
42 - this.$util.msg(response.msg);  
43 - return;  
44 - }  
45 - if(response.hasBindMobile && response.data.token){  
46 - this.loginSuccessCallBack({  
47 - token: response.data.token,  
48 - tokenExpired: response.data.tokenExpired  
49 - });  
50 - }else{  
51 - this.navTo('/pages/auth/bindMobile?type=apple&data='+JSON.stringify(response.data))  
52 - }  
53 - }  
54 - })  
55 - },  
56 - fail: err=> {  
57 - console.log(err);  
58 - this.$util.msg('登录失败');  
59 - this.appleLogout();  
60 - }  
61 - })  
62 - },  
63 - appleLogout(){  
64 - plus.oauth.getServices(oauthRes=>{  
65 - const oIndex = oauthRes.findIndex(oItem=> oItem.id === 'apple');  
66 - oauthRes[oIndex].logout(loRes => {  
67 - console.log('appleLogout success=> ', loRes);  
68 - }, loErr => {  
69 - console.log('appleLogout error=> ', loErr);  
70 - })  
71 - })  
72 - }  
73 - }  
74 -}  
75 -  
76 -  
77 -  
78 -  
79 -  
80 -  
81 -  
82 -  
83 -