构建前端用户系统之登录退出

前端页面中难免会有一些静态HTML文件, 这时就会遇到用户状态的判断问题, 于是想到使用js的ajax请求来处理整个前端用户相关的东东...
版本一

思路是在页面中指定位置预留一个js钩子, 然后在页面加载完成后向后端发送ajax请求, 判断用户是否登录, 并写到钩子里相应文本. 于是版本一产生了...

(function($){
var user = window.user = {};

// 用户数据
user.data = {};

// 用户状态, 0未登录, 非0则视为已登录, 可扩展为用户等级
user.status = 0;

/**
* 初始化
* @return {object} user对象
*/
user.init = function(){
//负责从后端ajax请求用户是否登录, 如果已登录则返回用户相关信息, 否则视为未登录
//请求完成后改变用户的status状态, 并把用户信息写入到user.data上

$.get("后端url", function(res){
if(res.error === 0){//返回值同后端协定
user.status = 1;
user.data.userName = res.data.userName;//模拟用户名
} else {
user.status = 0;
user.data = {};
}

//渲染状态到页面
user._renderHTML();
}, ‘json‘);

//模拟惰性方法以防止页面多次使用
user.init = function(){
return user;
}

return user;
}

/**
* 用户登录
* @param {Function} callback 回调
* @return {object} user对象
*/
user.login = function(callback){
if("function" === typeof callback){
if(user.status !== 0){//如果用户已登录则直接运行回调, 参数为用户数据
callback.call(user, user.data);
} else {
//未登录时弹出用户登录层,让其登录, 登录完成后刷新当前页面, 当然也可以像 youku 一样不刷新页面, 但要做的工作非常多, 这里不解释
}
}

return user;
}

/**
* 渲染用户状态到页面, 当前为模拟用
*/
user._renderHTML = function(){
var html;

if(user.status !== 0){//已登录
html = ‘您好 ‘+ user.data.userName +‘ , <a href="#">退出</a>‘;
} else {
html = ‘请先登录<a href="#">登录</a>‘;
}

$("#J_bar_html").html(html);
}
}(jQuery));

页面中可以这么干:

<a href="javascript:;" id="J_set_fav">点击收藏</a>
<script type="text/javascript">
user.init();//初始化用户

$("#J_set_fav").on("click", function(){
user.login(function(){//回调必须是登录状态下使用, 如果没有登录会执行画出登录框让用户登录
alert("正在收藏");
});
});
</script>

  

版本二

于是页面中可能需要判断用户是否登录, 还有退出登录, 在版本一的基础上添加 检查和退出方法, 但这些退出和检查只是依据后端的返回值, 且退出只是前端静态退出, 当然你也可以向后端发送ajax

/**
* 前端退出
* @return {object} user对象
*/
user.exit = function(){
user.status = 0;
user.data = {};
user._renderHTML();//重置下页面状态
return user;
}

/**
* 检查用户是否已经登录
* @return {boolean} true为登录, false为未登录
*/
user.check = function(){
return user.status !== 0;
}

  

经过以上代码后前端的登录退出就基本完成了, 但由于每次都要请求后端, 而这个请求是异步的, 如果返回响应时间过长, 那么在这个时间段使用 user.login, user.check 是不正确的, 因为是在ajax完成后才能正确的设置用户的登录状态, 这也好比domReady事件一样, dom树都没有建立成功就使用dom对象了, 就报错了啊... 于是她有domReady, 咱有userReady...于是版本三产生了...
版本三

在版本二的基础上添加 ready 事件, 确保必须在用户初始完成后才执行代码...

var isReady = false,//用户是否初始完毕
readyList = [];//初始化回调列表

/**
* 渲染用户状态到页面, 当前为模拟用
*/
user._renderHTML = function(){
// ...
runList();//因为已经渲染完页面了, 可以执行ready回调事件了
}

/**
* 用户ready事件
* @param {Function} callback 初始完成后回调
* @return {object} user对象
*/
user.ready = function(callback){
if("function" === typeof(callback)){
if(isReady){//如果已经初始完毕
callback.call(user, user.data);
} else {//没有的话则追加到回调列表
readyList.push({
callback: callback
});
}
}

return user;
}

/**
* 执行回调事件
*/
function runList (){
var i = 0,
len = readyList.length;
if(len > 0){
for(;i<len;i++){
readyList.callback && readyList.callback.call(user, user.data);
}
}

isReady = true;//设置为已经初始完毕
readyList.length = 0;//重置回调
runList = $.noop;//惰性方法
}

  

这样来使用以确保必须在用户判断结束后才绑定事件, 从而解决误判断带来的用户体验丢失:

<a href="javascript:;" id="J_set_fav">点击收藏</a>
<script type="text/javascript">
user.init();//初始化用户

user.ready(function(){
if(user.check()){alert("已登录");} else {alert("未登录");}
$("#J_set_fav").on("click", function(){
user.login(function(){//回调必须是登录状态下使用, 如果没有登录会执行画出登录框让用户登录
alert("正在收藏");
});
});
});
</script>

  

整个前端登录, 退出大概架构就是这样了, 当然还可以对接第三方登录, 注册等方法. 还可以扩展出一些用户相关的操作, 如: 收藏啊, 添加关注啊等等.

注: 只是代码思路, 具体代码可优化, 可精简, 且跟据实际情况订制不同的功能.

构建前端用户系统之登录退出

时间: 2024-10-10 14:42:52

构建前端用户系统之登录退出的相关文章

Atitit.用户权限服务 登录退出功能

参数说明 /com.attilax/user/loginOut.jsp?url="+url Utype=mer 作者::  ★(attilax)>>>   绰号:老哇的爪子 ( 全名::Attilax Akbar Al Rapanui 阿提拉克斯 阿克巴 阿尔 拉帕努伊 ) 汉字名:艾龙,  EMAIL:[email protected] 转载请注明来源: http://www.cnblogs.com/attilax/ <script type="text/ja

在不同域中各个系统拥有自已独立的用户系统时的单点登录问题

我们在实现业务中经常会碰到多个系统各自有各自的用户登录系统,而且这些系统是各自运行在各自的域下,所以要实现这些系统用户的单点登录就是个问题了,所以自己想了一个方案希望看看是否可行. 1.sso站点必须是单独一个站点. 我把sso单独设立一下站点,这个站点可以单独一个域名,主要存放各个系统的用户信息及登录的cookie信息. 2.保证各个系统的用户数据一致性和独立性. 各个系统拥有自己的用户数据表相互独立.每一个系统的CUD(创建,更新,删除)时都会触发其它系统的CUD.那么这里有个问题也会出现:

ajax接口之一:登录退出系统

为了方便BS或手机端访问系统,扩展功能,我们在平台中,支持了ajax接口,通过服务端编程和客户端javascript配合,可以实现登录系统,获取信息,调用服务等功能.接下来的系统主题将说明如何使用这些接口开发B/S或手机端界面.一.系统主要接口说明: 系统中目前主要有两个ashx文件,WebHandler.ashx和WebLogin.ashx两个文件接口,实现ajax的访问.1.WebHandler.ashx,通过它可以调用服务端系统服务和扩展服务,配合服务端扩展服务功能,我们可以实现数据访问和

linux学习之路之ACL的使用和查看系统上登录的用户的命令使用

我们知道文件的访问权限的是根据文件的属主.属组和其他用户这三种来设置,而ACL是提供这三种之外的更加细部的权限设定.ACL可以对单一用户和目录及文件来设置权限,这对于需要特殊的权限来说很有帮助.在之前谈到的SUID和SGID这些特殊权限,不过这些特殊权限和ACL相比,ACL可以对特定的用户来设定更加细部的权限,而SUID和SGID则是对于多个用户或者一组用户来说比较合适. 在谈ACL的使用之前,我们先一起来谈谈用户访问文件时的顺序是如何进行的?在这里暂时不讨论有关SElinux的使用. 在没有使

ubuntu系统root登录

ubuntu系统root登录,root用户登录的话,可以直接输入sudo su直接登录root用户 然后从网上收集的linux命令: 系统信息 arch 显示机器的处理器架构(1) uname -m 显示机器的处理器架构(2) uname -r 显示正在使用的内核版本 dmidecode -q 显示硬件系统部件 - (SMBIOS / DMI) hdparm -i /dev/hda 罗列一个磁盘的架构特性 hdparm -tT /dev/sda 在磁盘上执行测试性读取操作 cat /proc/c

Linux监控篇—Centos7.4下构建zabbix监测系统

Centos7.4-构建zabbix监测系统 目录第一部分 实验环境第二部分 配置服务器端第三部分 配置被控端(被监控服务器)第四部分 配置邮件报警功能第五部分 测试验证邮件报警 第一部分 实验环境 Linux服务端一台IP地址:192.168.80.10需要软件:php-bcmath-5.4.16-42.el7.x86_64php-mbstring-5.4.16-42.el7.x86_64注意:需要公网环境(可以上外网),网上下载最新版本的zabbix服务从微软客户端下载字体(楷体)到本机 L

某系统单点登录性能测试诊断分析优化过程

某系统单点登录性能测试诊断分析优化过程 原因说明 下面描述的是前段时间协助本地一家上市IT公司做产品技术选型时对他们的技术框架进行性能测试与优化过程记录,因测试过程中涉及数据库选型和各类问题的监控分析优化,篇幅比较大,本次主要是描述在同样基础软硬件下.同样应用工程包和框架.同样数据量下,针对MYSQL环境下进行单点登录压力测试的结果过程记录. 初始环境配置 测试内容 1.            用户登录,首页查看,退出 2.  某业务交易新增.查询.删除.上传文件 3.  业务审批流程创建.提交

.NET 统一用户管理 -- 单点登录

单点登录 前言 本篇做为.Net 统一用户管理的系列文章的开山之作,主要说一个单点登录是怎么实现的,以及为啥要统一用户管理. 单点登录(Single Sign On),简称为 SSO,是目前比较流行的企业业务整合的解决方案之一.SSO的定义是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统. 单点登录实现步骤         1.系统A 发送 用户名 和密码到统一验证模块 2.统一验证模块验证密码和账号是否正确,正确返回一个OpenId 3. 系统A 将OpenId写入Coo

思道OA之ASP.NET OA系统单点登录集成技术

思道OA开发版支持第三方集成,可以第三方的各种管理系统.校园数字化系统.统一认证,进行单点集成登录. (一)第三方系统单点登录到OA系统 下载源码 步骤1: web.config添加以下代码,允许匿名用户访问/sso.aspx,默认开发版已经添加, 将sso.aspx放置到OA目录Webroot下. <location path="sso.aspx"> <system.web> <authorization> <allow users=&quo