From 29118ae78c202f4e1f54f3220a69304f2149a97a Mon Sep 17 00:00:00 2001
From: MichelleChung <1242874891@qq.com>
Date: 星期一, 23 十月 2023 09:28:11 +0800
Subject: [PATCH] !433 更新登录日志以及在线用户展示信息 * update 更新登录日志, 在线用户展示信息(增加 客户端, 设备类型)

---
 ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/model/LoginUser.java            |   10 +++
 script/sql/update/update_5.1.0-5.1.1.sql                                                                    |    3 +
 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysUserOnline.java                       |   10 +++
 ruoyi-admin/src/main/java/org/dromara/web/service/impl/SocialAuthStrategy.java                              |    2 
 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysLogininforVo.java                  |   13 ++++
 script/sql/ry_vue_5.X.sql                                                                                   |    2 
 ruoyi-admin/src/main/java/org/dromara/web/service/impl/EmailAuthStrategy.java                               |    2 
 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysLogininforBo.java                  |   10 +++
 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysLogininforServiceImpl.java      |   17 +++++
 script/sql/sqlserver/sqlserver_ry_vue_5.X.sql                                                               |   14 ++++
 ruoyi-common/ruoyi-common-satoken/src/main/java/org/dromara/common/satoken/listener/UserActionListener.java |    2 
 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysLogininfor.java                       |   10 +++
 ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/dto/UserOnlineDTO.java          |   10 +++
 script/sql/update/oracle/update_5.1.0-5.1.1.sql                                                             |    5 +
 script/sql/postgres/postgres_ry_vue_5.X.sql                                                                 |    4 +
 script/sql/update/sqlserver/update_5.1.0-5.1.1.sql                                                          |   19 ++++++
 ruoyi-admin/src/main/java/org/dromara/web/service/impl/XcxAuthStrategy.java                                 |    2 
 script/sql/oracle/oracle_ry_vue_5.X.sql                                                                     |    4 +
 ruoyi-admin/src/main/java/org/dromara/web/service/impl/PasswordAuthStrategy.java                            |    2 
 ruoyi-admin/src/main/java/org/dromara/web/service/impl/SmsAuthStrategy.java                                 |    2 
 script/sql/update/postgres/update_5.1.0-5.1.1.sql                                                           |    5 +
 21 files changed, 148 insertions(+), 0 deletions(-)

diff --git a/ruoyi-admin/src/main/java/org/dromara/web/service/impl/EmailAuthStrategy.java b/ruoyi-admin/src/main/java/org/dromara/web/service/impl/EmailAuthStrategy.java
index c284e3d..edb12c9 100644
--- a/ruoyi-admin/src/main/java/org/dromara/web/service/impl/EmailAuthStrategy.java
+++ b/ruoyi-admin/src/main/java/org/dromara/web/service/impl/EmailAuthStrategy.java
@@ -60,6 +60,8 @@
         loginService.checkLogin(LoginType.EMAIL, tenantId, user.getUserName(), () -> !validateEmailCode(tenantId, email, emailCode));
         // 姝ゅ鍙牴鎹櫥褰曠敤鎴风殑鏁版嵁涓嶅悓 鑷鍒涘缓 loginUser 灞炴�т笉澶熺敤缁ф壙鎵╁睍灏辫浜�
         LoginUser loginUser = loginService.buildLoginUser(user);
+        loginUser.setClientKey(client.getClientKey());
+        loginUser.setDeviceType(client.getDeviceType());
         SaLoginModel model = new SaLoginModel();
         model.setDevice(client.getDeviceType());
         // 鑷畾涔夊垎閰� 涓嶅悓鐢ㄦ埛浣撶郴 涓嶅悓 token 鎺堟潈鏃堕棿 涓嶈缃粯璁よ蛋鍏ㄥ眬 yml 閰嶇疆
diff --git a/ruoyi-admin/src/main/java/org/dromara/web/service/impl/PasswordAuthStrategy.java b/ruoyi-admin/src/main/java/org/dromara/web/service/impl/PasswordAuthStrategy.java
index 401dfb2..46bd566 100644
--- a/ruoyi-admin/src/main/java/org/dromara/web/service/impl/PasswordAuthStrategy.java
+++ b/ruoyi-admin/src/main/java/org/dromara/web/service/impl/PasswordAuthStrategy.java
@@ -70,6 +70,8 @@
         loginService.checkLogin(LoginType.PASSWORD, tenantId, username, () -> !BCrypt.checkpw(password, user.getPassword()));
         // 姝ゅ鍙牴鎹櫥褰曠敤鎴风殑鏁版嵁涓嶅悓 鑷鍒涘缓 loginUser
         LoginUser loginUser = loginService.buildLoginUser(user);
+        loginUser.setClientKey(client.getClientKey());
+        loginUser.setDeviceType(client.getDeviceType());
         SaLoginModel model = new SaLoginModel();
         model.setDevice(client.getDeviceType());
         // 鑷畾涔夊垎閰� 涓嶅悓鐢ㄦ埛浣撶郴 涓嶅悓 token 鎺堟潈鏃堕棿 涓嶈缃粯璁よ蛋鍏ㄥ眬 yml 閰嶇疆
diff --git a/ruoyi-admin/src/main/java/org/dromara/web/service/impl/SmsAuthStrategy.java b/ruoyi-admin/src/main/java/org/dromara/web/service/impl/SmsAuthStrategy.java
index 3fd0569..0ddb753 100644
--- a/ruoyi-admin/src/main/java/org/dromara/web/service/impl/SmsAuthStrategy.java
+++ b/ruoyi-admin/src/main/java/org/dromara/web/service/impl/SmsAuthStrategy.java
@@ -60,6 +60,8 @@
         loginService.checkLogin(LoginType.SMS, tenantId, user.getUserName(), () -> !validateSmsCode(tenantId, phonenumber, smsCode));
         // 姝ゅ鍙牴鎹櫥褰曠敤鎴风殑鏁版嵁涓嶅悓 鑷鍒涘缓 loginUser 灞炴�т笉澶熺敤缁ф壙鎵╁睍灏辫浜�
         LoginUser loginUser = loginService.buildLoginUser(user);
+        loginUser.setClientKey(client.getClientKey());
+        loginUser.setDeviceType(client.getDeviceType());
         SaLoginModel model = new SaLoginModel();
         model.setDevice(client.getDeviceType());
         // 鑷畾涔夊垎閰� 涓嶅悓鐢ㄦ埛浣撶郴 涓嶅悓 token 鎺堟潈鏃堕棿 涓嶈缃粯璁よ蛋鍏ㄥ眬 yml 閰嶇疆
diff --git a/ruoyi-admin/src/main/java/org/dromara/web/service/impl/SocialAuthStrategy.java b/ruoyi-admin/src/main/java/org/dromara/web/service/impl/SocialAuthStrategy.java
index d0d4b43..2b055df 100644
--- a/ruoyi-admin/src/main/java/org/dromara/web/service/impl/SocialAuthStrategy.java
+++ b/ruoyi-admin/src/main/java/org/dromara/web/service/impl/SocialAuthStrategy.java
@@ -97,6 +97,8 @@
 
         // 姝ゅ鍙牴鎹櫥褰曠敤鎴风殑鏁版嵁涓嶅悓 鑷鍒涘缓 loginUser 灞炴�т笉澶熺敤缁ф壙鎵╁睍灏辫浜�
         LoginUser loginUser = loginService.buildLoginUser(user);
+        loginUser.setClientKey(client.getClientKey());
+        loginUser.setDeviceType(client.getDeviceType());
         SaLoginModel model = new SaLoginModel();
         model.setDevice(client.getDeviceType());
         // 鑷畾涔夊垎閰� 涓嶅悓鐢ㄦ埛浣撶郴 涓嶅悓 token 鎺堟潈鏃堕棿 涓嶈缃粯璁よ蛋鍏ㄥ眬 yml 閰嶇疆
diff --git a/ruoyi-admin/src/main/java/org/dromara/web/service/impl/XcxAuthStrategy.java b/ruoyi-admin/src/main/java/org/dromara/web/service/impl/XcxAuthStrategy.java
index 7096f13..5016e5b 100644
--- a/ruoyi-admin/src/main/java/org/dromara/web/service/impl/XcxAuthStrategy.java
+++ b/ruoyi-admin/src/main/java/org/dromara/web/service/impl/XcxAuthStrategy.java
@@ -54,6 +54,8 @@
         loginUser.setUsername(user.getUserName());
         loginUser.setNickname(user.getNickName());
         loginUser.setUserType(user.getUserType());
+        loginUser.setClientKey(client.getClientKey());
+        loginUser.setDeviceType(client.getDeviceType());
         loginUser.setOpenid(openid);
 
         SaLoginModel model = new SaLoginModel();
diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/dto/UserOnlineDTO.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/dto/UserOnlineDTO.java
index 0e8def8..43d8c3c 100644
--- a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/dto/UserOnlineDTO.java
+++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/dto/UserOnlineDTO.java
@@ -35,6 +35,16 @@
     private String userName;
 
     /**
+     * 瀹㈡埛绔�
+     */
+    private String clientKey;
+
+    /**
+     * 璁惧绫诲瀷
+     */
+    private String deviceType;
+
+    /**
      * 鐧诲綍IP鍦板潃
      */
     private String ipaddr;
diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/model/LoginUser.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/model/LoginUser.java
index 6626268..e267124 100644
--- a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/model/LoginUser.java
+++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/model/LoginUser.java
@@ -113,6 +113,16 @@
     private Long roleId;
 
     /**
+     * 瀹㈡埛绔�
+     */
+    private String clientKey;
+
+    /**
+     * 璁惧绫诲瀷
+     */
+    private String deviceType;
+
+    /**
      * 鑾峰彇鐧诲綍id
      */
     public String getLoginId() {
diff --git a/ruoyi-common/ruoyi-common-satoken/src/main/java/org/dromara/common/satoken/listener/UserActionListener.java b/ruoyi-common/ruoyi-common-satoken/src/main/java/org/dromara/common/satoken/listener/UserActionListener.java
index 11245e0..80034f1 100644
--- a/ruoyi-common/ruoyi-common-satoken/src/main/java/org/dromara/common/satoken/listener/UserActionListener.java
+++ b/ruoyi-common/ruoyi-common-satoken/src/main/java/org/dromara/common/satoken/listener/UserActionListener.java
@@ -49,6 +49,8 @@
             dto.setLoginTime(System.currentTimeMillis());
             dto.setTokenId(tokenValue);
             dto.setUserName(user.getUsername());
+            dto.setClientKey(user.getClientKey());
+            dto.setDeviceType(user.getDeviceType());
             dto.setDeptName(user.getDeptName());
             if(tokenConfig.getTimeout() == -1) {
                 RedisUtils.setCacheObject(CacheConstants.ONLINE_TOKEN_KEY + tokenValue, dto);
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysLogininfor.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysLogininfor.java
index f08dd61..c57dc0a 100644
--- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysLogininfor.java
+++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysLogininfor.java
@@ -38,6 +38,16 @@
     private String userName;
 
     /**
+     * 瀹㈡埛绔�
+     */
+    private String clientKey;
+
+    /**
+     * 璁惧绫诲瀷
+     */
+    private String deviceType;
+
+    /**
      * 鐧诲綍鐘舵�� 0鎴愬姛 1澶辫触
      */
     private String status;
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysUserOnline.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysUserOnline.java
index fca680a..6def906 100644
--- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysUserOnline.java
+++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysUserOnline.java
@@ -27,6 +27,16 @@
     private String userName;
 
     /**
+     * 瀹㈡埛绔�
+     */
+    private String clientKey;
+
+    /**
+     * 璁惧绫诲瀷
+     */
+    private String deviceType;
+
+    /**
      * 鐧诲綍IP鍦板潃
      */
     private String ipaddr;
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysLogininforBo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysLogininforBo.java
index 564f86b..4646162 100644
--- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysLogininforBo.java
+++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysLogininforBo.java
@@ -34,6 +34,16 @@
     private String userName;
 
     /**
+     * 瀹㈡埛绔�
+     */
+    private String clientKey;
+
+    /**
+     * 璁惧绫诲瀷
+     */
+    private String deviceType;
+
+    /**
      * 鐧诲綍IP鍦板潃
      */
     private String ipaddr;
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysLogininforVo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysLogininforVo.java
index cf9720e..de19aea 100644
--- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysLogininforVo.java
+++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysLogininforVo.java
@@ -46,6 +46,19 @@
     private String userName;
 
     /**
+     * 瀹㈡埛绔�
+     */
+    @ExcelProperty(value = "瀹㈡埛绔�")
+    private String clientKey;
+
+    /**
+     * 璁惧绫诲瀷
+     */
+    @ExcelProperty(value = "璁惧绫诲瀷", converter = ExcelDictConvert.class)
+    @ExcelDictFormat(dictType = "sys_device_type")
+    private String deviceType;
+
+    /**
      * 鐧诲綍鐘舵�侊紙0鎴愬姛 1澶辫触锛�
      */
     @ExcelProperty(value = "鐧诲綍鐘舵��", converter = ExcelDictConvert.class)
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysLogininforServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysLogininforServiceImpl.java
index d1c071e..d215d59 100644
--- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysLogininforServiceImpl.java
+++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysLogininforServiceImpl.java
@@ -1,5 +1,6 @@
 package org.dromara.system.service.impl;
 
+import cn.hutool.core.util.ObjectUtil;
 import cn.hutool.http.useragent.UserAgent;
 import cn.hutool.http.useragent.UserAgentUtil;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
@@ -12,10 +13,14 @@
 import org.dromara.common.core.utils.ServletUtils;
 import org.dromara.common.core.utils.StringUtils;
 import org.dromara.common.core.utils.ip.AddressUtils;
+import org.dromara.common.satoken.utils.LoginHelper;
+import org.dromara.system.domain.SysClient;
 import org.dromara.system.domain.SysLogininfor;
 import org.dromara.system.domain.bo.SysLogininforBo;
 import org.dromara.system.domain.vo.SysLogininforVo;
+import org.dromara.system.mapper.SysClientMapper;
 import org.dromara.system.mapper.SysLogininforMapper;
+import org.dromara.system.service.ISysClientService;
 import org.dromara.system.service.ISysLogininforService;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
@@ -41,6 +46,8 @@
 
     private final SysLogininforMapper baseMapper;
 
+    private final ISysClientService clientService;
+
     /**
      * 璁板綍鐧诲綍淇℃伅
      *
@@ -52,6 +59,12 @@
         HttpServletRequest request = logininforEvent.getRequest();
         final UserAgent userAgent = UserAgentUtil.parse(request.getHeader("User-Agent"));
         final String ip = ServletUtils.getClientIP(request);
+        // 瀹㈡埛绔俊鎭�
+        String clientid = request.getHeader(LoginHelper.CLIENT_KEY);
+        SysClient client = null;
+        if (StringUtils.isNotBlank(clientid)) {
+            client = clientService.queryByClientId(clientid);
+        }
 
         String address = AddressUtils.getRealAddressByIP(ip);
         StringBuilder s = new StringBuilder();
@@ -70,6 +83,10 @@
         SysLogininforBo logininfor = new SysLogininforBo();
         logininfor.setTenantId(logininforEvent.getTenantId());
         logininfor.setUserName(logininforEvent.getUsername());
+        if (ObjectUtil.isNotNull(client)) {
+            logininfor.setClientKey(client.getClientKey());
+            logininfor.setDeviceType(client.getDeviceType());
+        }
         logininfor.setIpaddr(ip);
         logininfor.setLoginLocation(address);
         logininfor.setBrowser(browser);
diff --git a/script/sql/oracle/oracle_ry_vue_5.X.sql b/script/sql/oracle/oracle_ry_vue_5.X.sql
index ecab07c..1100fa9 100644
--- a/script/sql/oracle/oracle_ry_vue_5.X.sql
+++ b/script/sql/oracle/oracle_ry_vue_5.X.sql
@@ -925,6 +925,8 @@
   info_id         number(20)     not null,
   tenant_id       varchar2(20)   default '000000',
   user_name       varchar2(50)   default '',
+  client_key      varchar2(32)   default '',
+  device_type     varchar2(32)   default '',
   ipaddr          varchar2(128)  default '',
   login_location  varchar2(255)  default '',
   browser         varchar2(50)   default '',
@@ -942,6 +944,8 @@
 comment on column sys_logininfor.info_id        is '璁块棶ID';
 comment on column sys_logininfor.tenant_id      is '绉熸埛缂栧彿';
 comment on column sys_logininfor.user_name      is '鐧诲綍璐﹀彿';
+comment on column sys_logininfor.client_key     is '瀹㈡埛绔�';
+comment on column sys_logininfor.device_type    is '璁惧绫诲瀷';
 comment on column sys_logininfor.ipaddr         is '鐧诲綍IP鍦板潃';
 comment on column sys_logininfor.login_location is '鐧诲綍鍦扮偣';
 comment on column sys_logininfor.browser        is '娴忚鍣ㄧ被鍨�';
diff --git a/script/sql/postgres/postgres_ry_vue_5.X.sql b/script/sql/postgres/postgres_ry_vue_5.X.sql
index 5992e6a..48860dc 100644
--- a/script/sql/postgres/postgres_ry_vue_5.X.sql
+++ b/script/sql/postgres/postgres_ry_vue_5.X.sql
@@ -946,6 +946,8 @@
     info_id        int8,
     tenant_id      varchar(20)  default '000000'::varchar,
     user_name      varchar(50)  default ''::varchar,
+    client_key     varchar(32)  default ''::varchar,
+    device_type    varchar(32)  default ''::varchar,
     ipaddr         varchar(128) default ''::varchar,
     login_location varchar(255) default ''::varchar,
     browser        varchar(50)  default ''::varchar,
@@ -963,6 +965,8 @@
 comment on column sys_logininfor.info_id        is '璁块棶ID';
 comment on column sys_logininfor.tenant_id      is '绉熸埛缂栧彿';
 comment on column sys_logininfor.user_name      is '鐢ㄦ埛璐﹀彿';
+comment on column sys_logininfor.client_key     is '瀹㈡埛绔�';
+comment on column sys_logininfor.device_type    is '璁惧绫诲瀷';
 comment on column sys_logininfor.ipaddr         is '鐧诲綍IP鍦板潃';
 comment on column sys_logininfor.login_location is '鐧诲綍鍦扮偣';
 comment on column sys_logininfor.browser        is '娴忚鍣ㄧ被鍨�';
diff --git a/script/sql/ry_vue_5.X.sql b/script/sql/ry_vue_5.X.sql
index 596dd41..09f15ff 100644
--- a/script/sql/ry_vue_5.X.sql
+++ b/script/sql/ry_vue_5.X.sql
@@ -699,6 +699,8 @@
     info_id        bigint(20)     not null                  comment '璁块棶ID',
     tenant_id      varchar(20)    default '000000'          comment '绉熸埛缂栧彿',
     user_name      varchar(50)    default ''                comment '鐢ㄦ埛璐﹀彿',
+    client_key     varchar(32)    default ''                comment '瀹㈡埛绔�',
+    device_type    varchar(32)    default ''                comment '璁惧绫诲瀷',
     ipaddr         varchar(128)   default ''                comment '鐧诲綍IP鍦板潃',
     login_location varchar(255)   default ''                comment '鐧诲綍鍦扮偣',
     browser        varchar(50)    default ''                comment '娴忚鍣ㄧ被鍨�',
diff --git a/script/sql/sqlserver/sqlserver_ry_vue_5.X.sql b/script/sql/sqlserver/sqlserver_ry_vue_5.X.sql
index f16edb1..2045c58 100644
--- a/script/sql/sqlserver/sqlserver_ry_vue_5.X.sql
+++ b/script/sql/sqlserver/sqlserver_ry_vue_5.X.sql
@@ -1383,6 +1383,8 @@
     info_id        bigint                      NOT NULL,
     tenant_id      nvarchar(20)  DEFAULT ('000000') NULL,
     user_name      nvarchar(50)  DEFAULT ''    NULL,
+    client_key     nvarchar(32)  DEFAULT ''    NULL,
+    device_type    nvarchar(32)  DEFAULT ''    NULL,
     ipaddr         nvarchar(128) DEFAULT ''    NULL,
     login_location nvarchar(255) DEFAULT ''    NULL,
     browser        nvarchar(50)  DEFAULT ''    NULL,
@@ -1421,6 +1423,18 @@
     'COLUMN', N'user_name'
 GO
 EXEC sys.sp_addextendedproperty
+    'MS_Description', N'瀹㈡埛绔�' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'sys_logininfor',
+    'COLUMN', N'client_key'
+GO
+EXEC sys.sp_addextendedproperty
+    'MS_Description', N'璁惧绫诲瀷' ,
+    'SCHEMA', N'dbo',
+    'TABLE', N'sys_logininfor',
+    'COLUMN', N'device_type'
+GO
+EXEC sys.sp_addextendedproperty
     'MS_Description', N'鐧诲綍IP鍦板潃' ,
     'SCHEMA', N'dbo',
     'TABLE', N'sys_logininfor',
diff --git a/script/sql/update/oracle/update_5.1.0-5.1.1.sql b/script/sql/update/oracle/update_5.1.0-5.1.1.sql
new file mode 100644
index 0000000..5382583
--- /dev/null
+++ b/script/sql/update/oracle/update_5.1.0-5.1.1.sql
@@ -0,0 +1,5 @@
+ALTER TABLE sys_logininfor ADD (client_key VARCHAR(32) DEFAULT '');
+COMMENT ON COLUMN sys_logininfor.client_key IS '瀹㈡埛绔�';
+
+ALTER TABLE sys_logininfor ADD (device_type VARCHAR(32) DEFAULT '');
+COMMENT ON COLUMN sys_logininfor.device_type IS '璁惧绫诲瀷';
diff --git a/script/sql/update/postgres/update_5.1.0-5.1.1.sql b/script/sql/update/postgres/update_5.1.0-5.1.1.sql
new file mode 100644
index 0000000..29f5507
--- /dev/null
+++ b/script/sql/update/postgres/update_5.1.0-5.1.1.sql
@@ -0,0 +1,5 @@
+ALTER TABLE sys_logininfor ADD client_key varchar(32) default ''::varchar;
+COMMENT ON COLUMN sys_logininfor.client_key IS '瀹㈡埛绔�';
+
+ALTER TABLE sys_logininfor ADD device_type varchar(32) default ''::varchar;
+COMMENT ON COLUMN sys_logininfor.device_type IS '璁惧绫诲瀷';
diff --git a/script/sql/update/sqlserver/update_5.1.0-5.1.1.sql b/script/sql/update/sqlserver/update_5.1.0-5.1.1.sql
new file mode 100644
index 0000000..2238536
--- /dev/null
+++ b/script/sql/update/sqlserver/update_5.1.0-5.1.1.sql
@@ -0,0 +1,19 @@
+ALTER TABLE sys_logininfor ADD client_key nvarchar(32) DEFAULT '' NULL
+GO
+
+EXEC sp_addextendedproperty
+    'MS_Description', N'瀹㈡埛绔�',
+    'SCHEMA', N'dbo',
+    'TABLE', N'sys_logininfor',
+    'COLUMN', N'client_key'
+GO
+
+ALTER TABLE sys_logininfor ADD device_type nvarchar(32) DEFAULT '' NULL
+GO
+
+EXEC sp_addextendedproperty
+    'MS_Description', N'璁惧绫诲瀷',
+    'SCHEMA', N'dbo',
+    'TABLE', N'sys_logininfor',
+    'COLUMN', N'device_type'
+GO
diff --git a/script/sql/update/update_5.1.0-5.1.1.sql b/script/sql/update/update_5.1.0-5.1.1.sql
new file mode 100644
index 0000000..5383fe6
--- /dev/null
+++ b/script/sql/update/update_5.1.0-5.1.1.sql
@@ -0,0 +1,3 @@
+ALTER TABLE sys_logininfor
+    ADD COLUMN client_key VARCHAR(32)  NULL DEFAULT NULL COMMENT '瀹㈡埛绔�' AFTER `user_type`,
+    ADD COLUMN device_type VARCHAR(32) NULL DEFAULT NULL COMMENT '璁惧绫诲瀷' AFTER `client_key`;

--
Gitblit v1.9.3