Skip to content

Commit 9776dfb

Browse files
committed
refactor(system/client): 优化客户端配置代码
1 parent 0ab31ba commit 9776dfb

9 files changed

Lines changed: 116 additions & 114 deletions

File tree

continew-server/src/main/resources/config/application.yml

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -238,17 +238,23 @@ sa-token:
238238
token-name: Authorization
239239
# 是否启用动态 activeTimeout 功能
240240
dynamic-active-timeout: true
241-
## 提示:请通过页面功能 [系统管理/系统配置/客户端配置] 动态调整 timeout、active-timeout 配置项
242-
## 如果不需要动态配置,请将 dynamic-active-timeout 设为 false,并取消下方 timeout 和 active-timeout 配置的注释,最好再移除相关登录处理代码
241+
## 提示:请通过页面功能 [系统管理/系统配置/客户端配置] 动态调整下方注释的配置项
242+
## 如果不需要动态配置,请取消下方配置注释,再移除相关登录处理代码
243243
# # Token 有效期(单位:秒,默认 30 天,-1 代表永不过期)
244244
# timeout: 86400
245245
# # Token 最低活跃频率(单位:秒,默认 -1,代表不限制,永不冻结。如果 token 超过此时间没有访问系统就会被冻结)
246246
# active-timeout: 1800
247-
# 是否打开自动续签(如果此值为 true,框架会在每次直接或间接调用 getLoginId() 时进行一次过期检查与续签操作)
248-
auto-renew: true
249-
# 是否允许同一账号多地同时登录(为 true 时允许一起登录,为 false 时新登录挤掉旧登录)
250-
is-concurrent: true
251-
# 在多人登录同一账号时,是否共用一个 Token(为 true 时所有登录共用一个 Token,为 false 时每次登录新建一个 Token)
247+
# # 是否打开自动续签(true:每次直接或间接调用 getLoginId() 时进行一次过期检查与续签操作)
248+
# auto-renew: true
249+
# # 是否允许同一账号多地同时登录(true:允许;false:新登录挤掉旧登录)
250+
# is-concurrent: true
251+
# # 顶人下线的范围(ALL_DEVICE_TYPE:所有设备类型端)
252+
# replaced-range: ALL_DEVICE_TYPE
253+
# # 同一账号最大登录数量(-1:不限制,只有在 isConcurrent=true,isShare=false 时才有效)
254+
# max-login-count: -1
255+
# # 溢出人数的下线方式(KICKOUT:踢人下线)
256+
# overflow-logout-mode: KICKOUT
257+
# 在多人登录同一账号时,是否共用一个 Token(true:所有登录共用一个 Token;false:每次登录新建一个 Token)
252258
# 使用 jwt-simple 模式后,is-share 恒等于 false(目前本项目使用 jwt-simple 模式,可通过 sa-token.extension.enableJwt: false 关闭并自行提供 StpLogic 配置)
253259
is-share: false
254260
# 是否输出操作日志

continew-server/src/main/resources/db/changelog/mysql/main_table.sql

Lines changed: 16 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -341,18 +341,22 @@ CREATE TABLE IF NOT EXISTS `sys_file` (
341341
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='文件表';
342342

343343
CREATE TABLE IF NOT EXISTS `sys_client` (
344-
`id` bigint(20) AUTO_INCREMENT COMMENT 'ID',
345-
`client_id` varchar(50) NOT NULL COMMENT '客户端ID',
346-
`client_type` varchar(50) NOT NULL COMMENT '客户端类型',
347-
`auth_type` json NOT NULL COMMENT '认证类型',
348-
`active_timeout` bigint(20) DEFAULT -1 COMMENT 'Token最低活跃频率(单位:秒,-1:不限制,永不冻结)',
349-
`timeout` bigint(20) DEFAULT 2592000 COMMENT 'Token有效期(单位:秒,-1:永不过期)',
350-
`status` tinyint(1) UNSIGNED NOT NULL DEFAULT 1 COMMENT '状态(1:启用;2:禁用)',
351-
`create_user` bigint(20) NOT NULL COMMENT '创建人',
352-
`create_time` datetime NOT NULL COMMENT '创建时间',
353-
`update_user` bigint(20) DEFAULT NULL COMMENT '修改人',
354-
`update_time` datetime DEFAULT NULL COMMENT '修改时间',
355-
`deleted` bigint(20) NOT NULL DEFAULT 0 COMMENT '是否已删除(0:否;id:是)',
344+
`id` bigint(20) AUTO_INCREMENT COMMENT 'ID',
345+
`client_id` varchar(50) NOT NULL COMMENT '客户端ID',
346+
`client_type` varchar(50) NOT NULL COMMENT '客户端类型',
347+
`auth_type` json NOT NULL COMMENT '认证类型',
348+
`active_timeout` bigint(20) NOT NULL DEFAULT -1 COMMENT 'Token最低活跃频率(单位:秒,-1:不限制,永不冻结)',
349+
`timeout` bigint(20) NOT NULL DEFAULT 2592000 COMMENT 'Token有效期(单位:秒,-1:永不过期)',
350+
`is_concurrent` bit(1) NOT NULL DEFAULT b'1' COMMENT '是否允许同一账号多地同时登录(true:允许;false:新登录挤掉旧登录)',
351+
`replaced_range` varchar(20) DEFAULT NULL COMMENT '顶人下线的范围(CURR_DEVICE_TYPE:当前客户端类型;ALL_DEVICE_TYPE:所有客户端类型)',
352+
`max_login_count` int NOT NULL DEFAULT -1 COMMENT '同一账号最大登录数量(-1:不限制,只有在 isConcurrent=true,isShare=false 时才有效)',
353+
`overflow_logout_mode` varchar(20) DEFAULT NULL COMMENT '溢出人数的下线方式(LOGOUT:注销下线;KICKOUT:踢人下线;REPLACED:顶人下线)',
354+
`status` tinyint(1) UNSIGNED NOT NULL DEFAULT 1 COMMENT '状态(1:启用;2:禁用)',
355+
`create_user` bigint(20) NOT NULL COMMENT '创建人',
356+
`create_time` datetime NOT NULL COMMENT '创建时间',
357+
`update_user` bigint(20) DEFAULT NULL COMMENT '修改人',
358+
`update_time` datetime DEFAULT NULL COMMENT '修改时间',
359+
`deleted` bigint(20) NOT NULL DEFAULT 0 COMMENT '是否已删除(0:否;id:是)',
356360
PRIMARY KEY (`id`),
357361
UNIQUE INDEX `uk_client_id`(`client_id`, `deleted`),
358362
INDEX `idx_create_user`(`create_user`),
@@ -399,11 +403,3 @@ CREATE TABLE IF NOT EXISTS `sys_sms_log` (
399403
INDEX `idx_config_id`(`config_id`),
400404
INDEX `idx_create_user`(`create_user`)
401405
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='短信日志表';
402-
403-
-- changeset KAI:20251125-01
404-
-- comment 追加sys_client表字段
405-
ALTER TABLE `sys_client`
406-
ADD COLUMN `is_concurrent` tinyint(1) UNSIGNED NOT NULL DEFAULT 0 COMMENT '是否允许同一账号多地同时登录',
407-
ADD COLUMN `max_login_count` int NOT NULL DEFAULT -1 COMMENT '同一账号最大登录数量,-1代表不限',
408-
ADD COLUMN `replaced_range` varchar(20) DEFAULT 'ALL_DEVICE_TYPE' COMMENT '顶人下线的范围(CURR_DEVICE_TYPE=当前设备类型端;ALL_DEVICE_TYPE=所有设备类型端)',
409-
ADD COLUMN `overflow_logout_mode` varchar(20) DEFAULT 'KICKOUT' COMMENT '溢出人数的注销方式(LOGOUT=注销下线;KICKOUT=踢人下线;REPLACED=顶人下线)';

continew-server/src/main/resources/db/changelog/postgresql/main_table.sql

Lines changed: 33 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -566,37 +566,45 @@ COMMENT ON COLUMN "sys_file"."deleted" IS '是否已删除(0:否
566566
COMMENT ON TABLE "sys_file" IS '文件表';
567567

568568
CREATE TABLE IF NOT EXISTS "sys_client" (
569-
"id" int8 NOT NULL,
570-
"client_id" varchar(50) NOT NULL,
571-
"client_type" varchar(50) NOT NULL,
572-
"auth_type" json NOT NULL,
573-
"active_timeout" int8 NOT NULL DEFAULT -1,
574-
"timeout" int8 NOT NULL DEFAULT 2592000,
575-
"status" int2 NOT NULL DEFAULT 1,
576-
"create_user" int8 NOT NULL,
577-
"create_time" timestamp NOT NULL,
578-
"update_user" int8 DEFAULT NULL,
579-
"update_time" timestamp DEFAULT NULL,
580-
"deleted" int8 NOT NULL DEFAULT 0,
569+
"id" int8 NOT NULL,
570+
"client_id" varchar(50) NOT NULL,
571+
"client_type" varchar(50) NOT NULL,
572+
"auth_type" json NOT NULL,
573+
"active_timeout" int8 NOT NULL DEFAULT -1,
574+
"timeout" int8 NOT NULL DEFAULT 2592000,
575+
"is_concurrent" bool NOT NULL DEFAULT true,
576+
"replaced_range" varchar(20) DEFAULT NULL,
577+
"max_login_count" int4 NOT NULL DEFAULT -1,
578+
"overflow_logout_mode" varchar(20) DEFAULT NULL,
579+
"status" int2 NOT NULL DEFAULT 1,
580+
"create_user" int8 NOT NULL,
581+
"create_time" timestamp NOT NULL,
582+
"update_user" int8 DEFAULT NULL,
583+
"update_time" timestamp DEFAULT NULL,
584+
"deleted" int8 NOT NULL DEFAULT 0,
581585
PRIMARY KEY ("id")
582586
);
583587
CREATE UNIQUE INDEX "uk_client_client_id" ON "sys_client" ("client_id");
584588
CREATE INDEX "idx_client_create_user" ON "sys_client" ("create_user");
585589
CREATE INDEX "idx_client_update_user" ON "sys_client" ("update_user");
586590
CREATE INDEX "idx_client_deleted" ON "sys_client" ("deleted");
587-
COMMENT ON COLUMN "sys_client"."id" IS 'ID';
588-
COMMENT ON COLUMN "sys_client"."client_id" IS '客户端ID';
589-
COMMENT ON COLUMN "sys_client"."client_type" IS '客户端类型';
590-
COMMENT ON COLUMN "sys_client"."auth_type" IS '认证类型';
591-
COMMENT ON COLUMN "sys_client"."active_timeout" IS 'Token最低活跃频率(单位:秒,-1:不限制,永不冻结)';
592-
COMMENT ON COLUMN "sys_client"."timeout" IS 'Token有效期(单位:秒,-1:永不过期)';
593-
COMMENT ON COLUMN "sys_client"."status" IS '状态(1:启用;2:禁用)';
594-
COMMENT ON COLUMN "sys_client"."create_user" IS '创建人';
595-
COMMENT ON COLUMN "sys_client"."create_time" IS '创建时间';
596-
COMMENT ON COLUMN "sys_client"."update_user" IS '修改人';
597-
COMMENT ON COLUMN "sys_client"."update_time" IS '修改时间';
598-
COMMENT ON COLUMN "sys_client"."deleted" IS '是否已删除(0:否;id:是)';
599-
COMMENT ON TABLE "sys_client" IS '客户端表';
591+
COMMENT ON COLUMN "sys_client"."id" IS 'ID';
592+
COMMENT ON COLUMN "sys_client"."client_id" IS '客户端ID';
593+
COMMENT ON COLUMN "sys_client"."client_type" IS '客户端类型';
594+
COMMENT ON COLUMN "sys_client"."auth_type" IS '认证类型';
595+
COMMENT ON COLUMN "sys_client"."active_timeout" IS 'Token最低活跃频率(单位:秒,-1:不限制,永不冻结)';
596+
COMMENT ON COLUMN "sys_client"."timeout" IS 'Token有效期(单位:秒,-1:永不过期)';
597+
COMMENT ON COLUMN "sys_client"."is_concurrent" IS '是否允许同一账号多地同时登录(true:允许;false:新登录挤掉旧登录)';
598+
COMMENT ON COLUMN "sys_client"."replaced_range" IS '顶人下线的范围(CURR_DEVICE_TYPE:当前客户端类型;ALL_DEVICE_TYPE:所有客户端类型)';
599+
COMMENT ON COLUMN "sys_client"."max_login_count" IS '同一账号最大登录数量(-1:不限制,只有在 isConcurrent=true,isShare=false 时才有效)';
600+
COMMENT ON COLUMN "sys_client"."overflow_logout_mode" IS '溢出人数的下线方式(LOGOUT:注销下线;KICKOUT:踢人下线;REPLACED:顶人下线)';
601+
COMMENT ON COLUMN "sys_client"."status" IS '状态(1:启用;2:禁用)';
602+
COMMENT ON COLUMN "sys_client"."create_user" IS '创建人';
603+
COMMENT ON COLUMN "sys_client"."create_time" IS '创建时间';
604+
COMMENT ON COLUMN "sys_client"."update_user" IS '修改人';
605+
COMMENT ON COLUMN "sys_client"."update_time" IS '修改时间';
606+
COMMENT ON COLUMN "sys_client"."deleted" IS '是否已删除(0:否;id:是)';
607+
COMMENT ON TABLE "sys_client" IS '客户端表';
600608

601609
CREATE TABLE IF NOT EXISTS "sys_sms_config" (
602610
"id" int8 NOT NULL,
@@ -666,16 +674,3 @@ COMMENT ON COLUMN "sys_sms_log"."res_msg" IS '返回数据';
666674
COMMENT ON COLUMN "sys_sms_log"."create_user" IS '创建人';
667675
COMMENT ON COLUMN "sys_sms_log"."create_time" IS '创建时间';
668676
COMMENT ON TABLE "sys_sms_log" IS '短信日志表';
669-
670-
-- changeset kai:20251125-01
671-
-- comment 追加sys_client表字段
672-
ALTER TABLE "sys_client"
673-
ADD COLUMN "is_concurrent" bool NOT NULL DEFAULT false,
674-
ADD COLUMN "max_login_count" int4 NOT NULL DEFAULT -1,
675-
ADD COLUMN "replaced_range" varchar(20) NOT NULL DEFAULT 'ALL_DEVICE_TYPE',
676-
ADD COLUMN "overflow_logout_mode" varchar(20) NOT NULL DEFAULT 'KICKOUT';
677-
678-
COMMENT ON COLUMN "sys_client"."is_concurrent" IS '是否允许同一账号多地同时登录';
679-
COMMENT ON COLUMN "sys_client"."max_login_count" IS '同一账号最大登录数量,-1代表不限';
680-
COMMENT ON COLUMN "sys_client"."replaced_range" IS '顶人下线的范围(CURR_DEVICE_TYPE=当前设备类型端;ALL_DEVICE_TYPE=所有设备类型端)';
681-
COMMENT ON COLUMN "sys_client"."overflow_logout_mode" IS '溢出人数的注销方式(LOGOUT=注销下线;KICKOUT=踢人下线;REPLACED=顶人下线)';

continew-system/src/main/java/top/continew/admin/auth/AbstractLoginHandler.java

Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -112,33 +112,37 @@ protected LoginResp authenticate(UserDO user, ClientResp client) {
112112
return roles;
113113
}, threadPoolTaskExecutor);
114114
CompletableFuture<Integer> passwordExpirationDaysFuture = CompletableFuture.supplyAsync(() -> optionService
115-
.getValueByCode2Int(PASSWORD_EXPIRATION_DAYS.name()), threadPoolTaskExecutor);
115+
.getValueByCode2Int(PASSWORD_EXPIRATION_DAYS.name()), threadPoolTaskExecutor);
116116
CompletableFuture.allOf(permissionFuture, roleFuture, passwordExpirationDaysFuture);
117117
UserContext userContext = new UserContext(permissionFuture.join(), roleFuture
118-
.join(), passwordExpirationDaysFuture.join());
118+
.join(), passwordExpirationDaysFuture.join());
119119
BeanUtil.copyProperties(user, userContext);
120120
// 设置登录配置参数
121121
SaLoginParameter loginParameter = new SaLoginParameter();
122122
loginParameter.setActiveTimeout(client.getActiveTimeout());
123123
loginParameter.setTimeout(client.getTimeout());
124124
loginParameter.setDeviceType(client.getClientType());
125125
loginParameter.setExtra(CLIENT_ID, client.getClientId());
126-
// 设置并发登录相关参数
126+
// 设置并发登录配置参数
127127
loginParameter.setIsConcurrent(client.getIsConcurrent());
128+
if (Boolean.FALSE.equals(client.getIsConcurrent())) {
129+
loginParameter.setReplacedRange(SaReplacedRange.valueOf(client.getReplacedRange().getValue()));
130+
}
128131
loginParameter.setMaxLoginCount(client.getMaxLoginCount());
129-
loginParameter.setOverflowLogoutMode(SaLogoutMode.valueOf(client.getOverflowLogoutMode().getValue()));
130-
loginParameter.setReplacedRange(SaReplacedRange.valueOf(client.getReplacedRange().getValue()));
132+
if (client.getMaxLoginCount() != -1) {
133+
loginParameter.setOverflowLogoutMode(SaLogoutMode.valueOf(client.getOverflowLogoutMode().getValue()));
134+
}
131135
userContext.setClientType(client.getClientType());
132136
userContext.setClientId(client.getClientId());
133137
userContext.setTenantId(tenantId);
134138
// 登录并缓存用户信息
135139
StpUtil.login(userContext.getId(), loginParameter.setExtraData(BeanUtil
136-
.beanToMap(new UserExtraContext(ServletUtils.getRequest()))));
140+
.beanToMap(new UserExtraContext(ServletUtils.getRequest()))));
137141
UserContextHolder.setContext(userContext);
138142
return LoginResp.builder()
139-
.token(StpUtil.getTokenValue())
140-
.tenantId(TenantContextHolder.isTenantEnabled() ? TenantContextHolder.getTenantId() : null)
141-
.build();
143+
.token(StpUtil.getTokenValue())
144+
.tenantId(TenantContextHolder.isTenantEnabled() ? TenantContextHolder.getTenantId() : null)
145+
.build();
142146
}
143147

144148
/**

continew-system/src/main/java/top/continew/admin/system/enums/LogoutModeEnum.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@
2424
* 注销模式枚举
2525
*
2626
* @author KAI
27-
* @since 2025-10-28 14:04
27+
* @since 2025/10/28 14:04
2828
*/
2929
@Getter
3030
@RequiredArgsConstructor
@@ -47,5 +47,4 @@ public enum LogoutModeEnum implements BaseEnum<String> {
4747

4848
private final String value;
4949
private final String description;
50-
5150
}

continew-system/src/main/java/top/continew/admin/system/enums/ReplacedRangeEnum.java

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -24,23 +24,22 @@
2424
* 顶人下线的范围枚举
2525
*
2626
* @author KAI
27-
* @since 2025-10-28 14:05
27+
* @since 2025/10/28 14:05
2828
*/
2929
@Getter
3030
@RequiredArgsConstructor
3131
public enum ReplacedRangeEnum implements BaseEnum<String> {
3232

3333
/**
34-
* 当前指定的设备类型端
34+
* 当前客户端类型
3535
*/
36-
CURR_DEVICE_TYPE("CURR_DEVICE_TYPE", "当前指定的设备类型端"),
36+
CURR_DEVICE_TYPE("CURR_DEVICE_TYPE", "当前客户端类型"),
3737

3838
/**
39-
* 所有设备类型端
39+
* 所有客户端类型
4040
*/
41-
ALL_DEVICE_TYPE("ALL_DEVICE_TYPE", "所有设备类型端");
41+
ALL_DEVICE_TYPE("ALL_DEVICE_TYPE", "所有客户端类型");
4242

4343
private final String value;
4444
private final String description;
45-
4645
}

continew-system/src/main/java/top/continew/admin/system/model/entity/ClientDO.java

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -69,22 +69,22 @@ public class ClientDO extends BaseDO {
6969
private Long timeout;
7070

7171
/**
72-
* 是否允许同一账号多地同时登录 (为 true 时允许一起登录, 为 false 时新登录挤掉旧登录
72+
* 是否允许同一账号多地同时登录true:允许;false:新登录挤掉旧登录
7373
*/
7474
private Boolean isConcurrent;
7575

7676
/**
77-
* 同一账号最大登录数量,-1代表不限 (只有在 isConcurrent=true, isShare=false 时此配置项才有意义)
77+
* 顶人下线的范围
7878
*/
79-
private int maxLoginCount;
79+
private ReplacedRangeEnum replacedRange;
8080

8181
/**
82-
* isConcurrent=false 时,顶人下线的范围 (CURR_DEVICE_TYPE=当前指定的设备类型端, ALL_DEVICE_TYPE=所有设备类型端)
82+
* 同一账号最大登录数量(-1:不限制,只有在 isConcurrent=true,isShare=false 时才有效)
8383
*/
84-
private ReplacedRangeEnum replacedRange;
84+
private Integer maxLoginCount;
8585

8686
/**
87-
* 溢出 maxLoginCount 的客户端,将以何种方式注销下线 (LOGOUT=注销下线, KICKOUT=踢人下线, REPLACED=顶人下线)
87+
* 溢出人数的下线方式
8888
*/
8989
private LogoutModeEnum overflowLogoutMode;
9090

0 commit comments

Comments
 (0)