HBuilder mui登录和访问控制教程

HBuilder mui登录和访问控制教程

mui中提供了登录的模板页,但是对于登录后各个页面的访问控制,刷新等并没有官方的推荐方案。我在这里简单说一种初级的解决方案吧,肯定有不足指出,欢迎批评指正。

第一节中创建移动APP项目的时候选择的是"mui项目",只引入了默认的js和css等文件,没有登录模板。要使用默认登录模板,可以创建的时候选择"mui登录模板"。现在创建一个名为muiLogin的"mui登录模板"项目:
在这里插入图片描述
可以看到这次多了不少东西。通过manifest.json可以发现,入口文件时login.html,我们就从login.html开始。

从plusReady函数开始看起。
在这里插入图片描述
先通过.preload预加载了main.html(就是mui,这是个闭包函数,mui作为参数$传进来的,详情百度JavaScript 闭包)。

toMain跳转主页面更新用户信息
然后是一个跳转到主页面的toMain函数,可以看到这里监听了main页面的loaded事件,当main加载完毕后,这里就将标志向量main_loaded_flag置为true,toMain中循环判断这个变量,当这里为true时,触发main的show事件,然后在main中,show事件的响应函数从app.getState()中读取用户名,显示在界面。这就完成了用户登录后主界面的用户名显示。

app.getState和app.setState
上面用到了app.getState(),这是定义在js/app.js中的,不妨去看下都做了什么。
在这里插入图片描述
在这里插入图片描述
可以看到这两个是对localStorage的存取做了封装,是一个字典对象,这是个很不错的想法,可以将用户登录后的所有状态信息记录在state里面,包括用户信息,是否自动登录,用户余额,订单列表页的最新和最旧ID等都保存下来,用户注销后直接把state置为null就可以了,再次登录后再设置state。

上面的登录就是这样做的,登录成功后保存用户信息在state里面,然后触发涉及用户的main页面的事件,main页面里自定义事件的响应函数可以从state里读取信息并更新。

登录部分
登录这里先判断了是否运行自动登录以及是否设置了手势解锁。然后按情况决定是手势解锁还是直接登录或者显示登录界面。

点击登录按钮后,会调用app的login函数验证登录信息,验证正确就会调用toMain跳转到主页面。

访问控制
登陆部分很明了,但是大部分app是允许用户在不登录的情况下浏览部分页面的,如果用户访问的页面需要登录再自动跳转到登录页面。

这里就需要对登录验证做个封装,毕竟每次验证页面的时候,都从state里面判断一下用户是否登录了,以及是否允许自动登录,自动登录是否成功,是否显示登录界面是件很麻烦的事。

在这里插入图片描述

我们希望达到这种效果,如果用户点击"我的"页面,通过以下代码自动进行访问控制:
mui(’#my’)[0].addEventListener(‘tap’,function(){
app.loginRequired(function(){
mui.openWindow({
url:‘my.html’,
id:‘my’
});
});
});

只多了一行:app.loginRequired,如果某个页面需要登录才能访问,就把登录后执行的代码作为回调函数传给app.loginRequired,由它进行自动登录和登录不成功的跳转。
/**

  • 要求登陆后才能执行回调函数
  • @param {Object} callback 已登录或自动登录成功执行,否则跳转到登录界面
    */
    owner.loginRequired=function(callback){
    var state=owner.getState();
    if(state.isLogin){//已登录,直接执行
    callback();
    }else{
    owner.tryAutoLogin(function(data){
    if(data.Code==1){//自动登录成功则执行回调函数
    callback();
    }else{//自动登录失败,显示登录页面
    var v=plus.webview.getWebviewById(‘login’);
    if(!v){
    mui.toast(‘error:cannot find login’);
    }else{
    v.show(‘slide-in-right’,300);
    }
    }
    });
    }
    };

    为了确保上面能找到登录页面,需要先预加载login页面,由于主页面是main,不再是login了,可以在main里面预加载login.html,然后这里就会找到login的webview

看到里面调用了一个tryAutoLogin的自动登录函数,这个函数尝试用保存在state中的上次登录信息自动ajax请求服务器登录。
/**

  • 尝试自动登录

  • @param {Function} callback 回调函数,接收一个字典参数data,data.Code>0表示登录成功
    /
    owner.tryAutoLogin=function (callback){
    var state=owner.getState();
    if(state.isLogin){
    callback({Code:1});
    return;
    }
    var user=JSON.parse(localStorage.getItem(’$user’));
    //需要在登录或注册成功时将用户信息保存在localStorage中
    var settings=owner.getSettings();
    if (settings.autoLogin&&user&&user.name) {
    owner.login(user,callback);
    }else{
    callback({Code:-1});
    }
    }

    tryAutoLogin的主要工作就是判断是否允许自动登录,如果允许就调用login方法尝试登录,并将回调函数也传递过去。
    /
    *

  • 用户登录
    **/
    owner.login = function(loginInfo, callback) {
    callback = callback || $.noop;
    loginInfo.Method=‘Login’;//告诉服务器执行哪个函数
    KaTeX parse error: Expected '}', got 'EOF' at end of input: …orage.setItem('user’, JSON.stringify(loginInfo));

             //通知资金变动页面刷新
             var moneyChange=plus.webview.getWebviewById('moneyChange');
             if(moneyChange){
                 mui.fire(moneyChange,'show');
             }
             //通知其他用户相关页面更新
         }
         callback(data);
     },
     error:function(msg){
         callback({
             Code:-3,
             Msg:'无法连接到服务器'
         });
     }
    

    });
    };

    login函数中有一句是defaultState,这个就是存储的默认用户状态,用户注销再次登录后就应该用这个替换上次用户的状态。防止信息错乱。

通过以上三个函数,就完成了页面登录的自动验证和访问控制,使得整体逻辑比较清晰,代码如有bug欢迎指正。

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
好的,下面是一个简单的注册和登录页面的示例代码,使用了Hbuilder提供的mui框架: ``` <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>注册和登录页面</title> <meta name="viewport" content="width=device-width, initial-scale=1"> <link rel="stylesheet" href="https://cdn.bootcss.com/mui/3.7.1/css/mui.min.css"> <script src="https://cdn.bootcss.com/mui/3.7.1/js/mui.min.js"></script> <script src="https://cdn.bootcss.com/jquery/3.4.1/jquery.min.js"></script> </head> <body> <!-- 注册页面 --> <div id="register" class="mui-content"> <form class="mui-input-group"> <div class="mui-input-row"> <label>用户名</label> <input id="reg-username" type="text" placeholder="请输入用户名"> </div> <div class="mui-input-row"> <label>密码</label> <input id="reg-password" type="password" placeholder="请输入密码"> </div> <div class="mui-input-row"> <label>确认密码</label> <input id="reg-confirm-password" type="password" placeholder="请再次输入密码"> </div> <div class="mui-button-row"> <button id="btn-register" type="button" class="mui-btn mui-btn-primary">注册</button> </div> </form> </div> <!-- 登录页面 --> <div id="login" class="mui-content"> <form class="mui-input-group"> <div class="mui-input-row"> <label>用户名</label> <input id="login-username" type="text" placeholder="请输入用户名"> </div> <div class="mui-input-row"> <label>密码</label> <input id="login-password" type="password" placeholder="请输入密码"> </div> <div class="mui-button-row"> <button id="btn-login" type="button" class="mui-btn mui-btn-primary">登录</button> </div> </form> </div> <script> mui.init(); // 注册按钮点击事件 $('#btn-register').click(function() { var username = $('#reg-username').val(); var password = $('#reg-password').val(); var confirmPassword = $('#reg-confirm-password').val(); if (username == '' || password == '' || confirmPassword == '') { mui.alert('用户名和密码不能为空'); return; } if (password != confirmPassword) { mui.alert('两次输入的密码不一致'); return; } // 发送注册请求 $.ajax({ url: '/register', type: 'POST', data: { username: username, password: password }, success: function(data) { if (data.code == 0) { mui.alert('注册成功'); // 注册成功后跳转到登录页面 mui.openWindow({ url: '#login', id: 'login' }); } else { mui.alert(data.message); } }, error: function(xhr, textStatus, errorThrown) { mui.alert('注册失败:' + errorThrown); } }); }); // 登录按钮点击事件 $('#btn-login').click(function() { var username = $('#login-username').val(); var password = $('#login-password').val(); if (username == '' || password == '') { mui.alert('用户名和密码不能为空'); return; } // 发送登录请求 $.ajax({ url: '/login', type: 'POST', data: { username: username, password: password }, success: function(data) { if (data.code == 0) { mui.alert('登录成功'); // 登录成功后跳转到首页 mui.openWindow({ url: '/index', id: 'index' }); } else { mui.alert(data.message); } }, error: function(xhr, textStatus, errorThrown) { mui.alert('登录失败:' + errorThrown); } }); }); </script> </body> </html> ``` 解释一下代码: 1. 页面使用了mui框架,包含了一个注册页面和一个登录页面; 2. 注册页面包括用户名、密码和确认密码三个输入框和一个注册按钮,点击注册按钮后会发送POST请求到服务器的/register接口; 3. 登录页面包括用户名、密码两个输入框和一个登录按钮,点击登录按钮后会发送POST请求到服务器的/login接口; 4. 注册和登录请求都是用jQuery的$.ajax方法发送的,成功后会弹出提示框,失败后也会弹出提示框; 5. 注册成功后会自动跳转到登录页面,登录成功后会自动跳转到首页。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

云草桑

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值