以文本方式查看主题

-  Foxtable(狐表)  (http://foxtable.net/bbs/index.asp)
--  专家坐堂  (http://foxtable.net/bbs/list.asp?boardid=2)
----  [分享]新手,分享一个防止多人重复登录的方法  (http://foxtable.net/bbs/dispbbs.asp?boardid=2&id=59360)

--  作者:mxm121
--  发布时间:2014/11/3 1:16:00
--  [分享]新手,分享一个防止多人重复登录的方法
功能比较简单 就是不允许一个用户在多地或者在一台电脑上重复登录 功能实现了 但不一定是最好的方法,在论坛上搜了下,没有特满意或者有些我看不懂,于是花了一晚上搞了个,希望大家提提意见

代码中有个用插入代码框括出来的应该写成cmd.Conne ctio nNa me = "sql"但是论坛有问题,这段代码直接专程cmd.C的输出了


创建了一个用户登录状态表

图片点击可在新窗口打开查看此主题相关图片如下:无标题.jpg
图片点击可在新窗口打开查看

在afteropenproject添加如下代码,每次登录添加一条记录,同时将同用户名的其它登录记录的state置0

\'--------------------添加用户登录状态表,用以限制客户端同时只能登录一次-----------------------
Dim cmd As New SQLCommand
Dim dt As Date
cmd.Conne ctio nNa me = "sql"           ‘论坛有问题,直接贴出来会变成cmd.C 使用的时候把空格去掉
cmd.CommandText = "Select GetDate()"
dt = cmd.ExecuteScalar()

\'----------------生成登录状态编号, 便于后续查找-----------------
Dim i As String = DataTables("用户登录状态表").sqlCompute("max(Num)")
Dim idx As Integer
If i > "" Then
    idx=i+1
Else
    idx=1
End If
\'----------------生成登录状态编号, 便于后续查找-----------------
_login_num = Format(idx,"0000")


With Tables("用户登录状态表")                \'将新登录用户信息写入
    .AddNew
    .Current("Num") = Format(idx,"0000")
    .Current("user_ID") = User.Name
    .Current("computer_ID") = ComputerId
    .Current("login_time") = dt
    .Current("refresh_time") = dt
    .Current("state") = 1
    .Current.save
End With

\'查找登录信息中用户名与登录名相同的记录,将所有不属于本次登录的记录state置0
Dim drs As List(of DataRow)  = DataTables("用户登录状态表").SQLSelect("user_ID = \'" & user.Name & "\'")
If drs IsNot Nothing Then
    For Each dr As DataRow In drs
        If dr("login_time") <> dt Then            ‘只要登录名相同,登录时间和本次不一样的 全都置0
            dr("state") = 0
            dr.Save()
        End If
    Next
End If


做一个计划管理  我设置的10秒查询 如果发现自己的登录信息state被置0 则强行退出  如果state为1 则刷新时间 

Dim dr As DataRow = DataTables("用户登录状态表").SQLFind("Num = \'" & _login_num & "\'")
If dr IsNot Nothing Then
    If dr("state") = "1" Then
        Dim cmd As New SQLCommand
        Dim dt As Date
        cmd.Conne ctio nNa me = "sql"           ‘论坛有问题,直接贴出来会变成cmd.C 使用的时候把空格去掉
        cmd.CommandText = "Select GetDate()"
        dt = cmd.ExecuteScalar()
        dr("refresh_time") = dt
        dr.Save
    Else
        MyTimers("查询用户登录状态").Enabled = False \'防止不停跳出提示窗口
        Messagebox.show("账号:" & user.Name & " 在其它地方登录,系统将被强行退出,如有异常,请联系管理员","提示",MessageBoxButtons.OK,MessageBoxIcon.Information)
        Syscmd.Project.Exit(False)
    End If
Else
    Messagebox.show("账号:" & user.Name & " 由于登录状态信息不存在,系统将被强行退出,请重新登录系统,如有异常,请联系管理员","提示",MessageBoxButtons.OK,MessageBoxIcon.Information)
    Syscmd.Project.Exit(False)
End If

If User.Type = UserTypeEnum.Developer Then
    DataTables("用户登录状态表").LoadFilter = ""
    DataTables("用户登录状态表").Load
End If

在beforcloseproject添加如下代码  用来清除正常退出或者强制退出的本次登录生成的记录  同时将属于同用户登录的其它记录中state为0的(不正常退出)的记录都清除

\'删除本次登录状态记录
Dim dr As DataRow = DataTables("用户登录状态表").SQLFind("Num = \'" & _login_num & "\'")
If dr IsNot Nothing Then
    dr.Delete
    dr.Save
End If

\'查询是否有状态记录用户名等于本次登录用户名且state为0的记录,如果有则清除,以此消除非正常退出留下的记录
Dim drs As List(of DataRow)  = DataTables("用户登录状态表").SQLSelect("user_ID = \'" & user.Name & "\'")
If drs IsNot Nothing Then
    For Each dr1 As DataRow In drs
        If dr1("state") = "0" Then
            dr1.Delete
            dr1.Save()
        End If
    Next
End If
[此贴子已经被作者于2014-11-3 15:53:28编辑过]

--  作者:mxm121
--  发布时间:2014/11/3 1:27:00
--  
在计划管理里 开发者会定期刷新这个表 通过表也可以当作查看当前登录系统用户的信息 

这个表稍微修改一下,也可以作为登录日志 refresh_time 就是退出时间   computer_ID可以记录哪台机器登录的

--  作者:lyfxybc
--  发布时间:2014/11/3 7:03:00
--  

好东西,顶


--  作者:飞飞
--  发布时间:2014/11/3 8:36:00
--  
 10秒的频率太高了,局域网还行,互联网会有问题
--  作者:Bin
--  发布时间:2014/11/3 8:40:00
--  
间隔改长点,减少资源消耗.    赞一个,谢谢分享
--  作者:九易六
--  发布时间:2014/11/3 15:50:00
--  

大体看了一下,思路很棒。先顶一下,回头慢慢看。


--  作者:qianqian1530
--  发布时间:2014/11/19 21:07:00
--  
 用不着这么 麻烦吧...   在用户表里添加个 登录列, 当用户登录的时候 变成1, 退出,或者 非正常退出的时候,改成0, 不就可以了么?
--  作者:998168
--  发布时间:2014/11/19 22:54:00
--  
以下是引用qianqian1530在2014-11-19 21:07:00的发言:
 用不着这么 麻烦吧...   在用户表里添加个 登录列, 当用户登录的时候 变成1, 退出,或者 非正常退出的时候,改成0, 不就可以了么?
非正常退出,改成0 说得这么轻松啊,比如突然断电了你还让电脑怎么改成0呢?


--  作者:tennis
--  发布时间:2014/11/20 7:05:00
--  
本案例确实大家都用到会有需求,如果foxtable本身于项目属性增加进去(true/false),那该有多好.
[此贴子已经被作者于2014-11-20 7:05:54编辑过]

--  作者:cpyh
--  发布时间:2016/9/9 16:25:00
--  
mark