週六日雙休又由於家裏忽然來了一個新夥伴一隻小藍貓因此就沒有對我本身搭的框架作進一步操做前端
可是今天上班由於要用外網作數據導入以致於有空完成了登陸功能,寫的很簡陋可是之後你們拿去用換爲本身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是啥樣的
諾~直接被踢下線了 ~就是這樣的啦 今天就這樣啦 以前沒有寫過權限如今設計了一個簡單的 ~稍後發上來請各位大佬提提意見~謝謝