周六日双休又由于家里忽然来了一个新伙伴一只小蓝猫因此就没有对我本身搭的框架作进一步操做前端
可是今天上班由于要用外网作数据导入以致于有空完成了登陆功能,写的很简陋可是之后你们拿去用换为本身jquery
的逻辑就OK了 废话很少说 开搞~ajax
在这里我是使用的Email和password 来作登陆的你们酌情改本身用的时候浏览器
[HttpPost] public JsonResult Logion(string Email, string Pwd) { //判断帐号密码是否输入正确 UserInfo list = Base.DB.Context.From<UserInfo>().Where(us => us.Email == Email && us.Pwd == Pwd).ToList().FirstOrDefault(); //若是Conut大于0登录成功反之登陆失败 if (list != null) { SignalR.ServerHub1 SignalR = new SignalR.ServerHub1(); SignalR.IsLogin(list.Name); //登录成功存个Session Session["Info"] = list; Session["name"] = list.Name; return Json("OK"); } else return Json("NO"); }
里面的Base.DB 是由于Dos.ORM建立的数据上下文 DOS.ROM 使用很简单配置也简单 这里就不给你们讲配置啦一百度就出来了就这样框架
可是!!!!!!!!重点来了 咱们确定不会但愿咱们的系统如此的Low(虽然这个登陆判断是很Low的)ide
咱们如今要作的就是一个帐号只容许一个设备登陆 !!!!!是否是很炫酷 可是我猜必定还有人听不明白spa
因此白话说明一下(就是第二个登陆帐号的人第一个帐号会被迫下线 酷吧~很少说直接上逻辑)设计
由于要实时的知道我是否在线~你们必定会想到ajax长连接或者套接字等等等~~~不少code
可是咱们这里要使用的是微软的类库SignalR 哇这个是真的厉害哦 很少说直接开始~server
就是这个了下载引用 ~引用啥呢 我这里觉得本身仍是一个菜鸟呢 因此我就给你们展现出大家能够复制粘贴直接用的代码~锵锵锵~
@*SignalR*@ <script src="~/Scripts/jquery.signalR-2.3.0.min.js"></script> <script src="@Url.Content("~/signalr/hubs")"></script>
引用JS 我在登陆这里引用的吼~
再看我以前的登陆之中的代码~
就是这里咱们要看的东西来了 引入JS接下来开始配置
打开咱们项目生成的Startup配置类
接下来建立集线器
不废话了 直接上集线器代码
[HubName("ChatsHub")] public class ServerHub1 : Hub { IHubContext context = GlobalHost.ConnectionManager.GetHubContext<ServerHub1>(); public static List<UserInfos> OnlineUsers = new List<UserInfos>(); // 在线用户列表 /// <summary> /// 客户端链接的时候调用 /// </summary> /// <returns></returns> public override Task OnConnected() { Trace.WriteLine("客户端链接成功"); return base.OnConnected(); } /// <summary> /// 登陆连线 /// </summary> /// <param name="userName">用户名</param> public void Connect(string userName) { var connnectId = Context.ConnectionId; var items = OnlineUsers.Where(x => x.UserName == userName).ToList(); foreach (var item in items) { Clients.AllExcept(connnectId).onUserDisconnected(item.ConnectionId, item.UserName); } OnlineUsers.RemoveAll(x => x.UserName == userName); //添加在线人员 OnlineUsers.Add(new UserInfos { ConnectionId = connnectId, UserName = userName, LoginTime = DateTime.Now }); //上线通知 //context.Clients.All.loginNotice(connnectId, userName); ////全部客户端同步在线用户 //context.Clients.All.contactsNotice(JsonConvert.SerializeObject(OnlineUsers)); } /// <summary> /// 若是重复登陆,让其强制退出 /// </summary> /// <param name="Username">Username</param> public void IsLogin(string Username) { UserInfos fromUser = OnlineUsers.FirstOrDefault(x => x.UserName == Username); //若是此用户在线那么直接发送消息 if (fromUser != null) { // send to context.Clients.Client(fromUser.ConnectionId).forceexit("账号在其余客户端登陆,当前账号退出!"); } } } public class UserInfos { /// <summary> /// 链接ID /// </summary> public string ConnectionId { get; set; } /// <summary> /// 用户ID /// </summary> public string UserID { get; set; } /// <summary> /// 用户名 /// </summary> public string UserName { get; set; } /// <summary> /// 登陆时间 /// </summary> public DateTime LoginTime { get; set; } }
逻辑也很简单其实就是登录的时候将信息加入实体类里面而后 后一个登录的查一下前面在线的是否存在当前用户若是再则踢出
前端代码:
//强制退出 AcSignalr.client.forceexit = function (Message) { alert(Message); window.location = "/Home/Logion"; }; var AcSignalr = $.connection.ChatsHub; $.connection.hub.start().done(function () { //登陆连线 AcSignalr.server.connect($("#UserName").val()); });
好基本实现就是这样子了 直接上效果
Admin登陆进去了 如今使用IE去登录这个帐号咱们来看一下效果
再来看看谷歌浏览器下的Admin是啥样的
诺~直接被踢下线了 ~就是这样的啦 今天就这样啦 以前没有写过权限如今设计了一个简单的 ~稍后发上来请各位大佬提提意见~谢谢