即时通讯(WebSocket)在项目里面很常见,例如消息通知,实时翻译,语音转译等等。本框架在集成了 WebSocket 的基础上,实现了简单的消息通知以及角标统计功能,并且对于集成的 WebSocket 功能做了抽象优化,后续你可以自己实现自己的 WebSocket 功能。
消息通知
框架已经实现了简单的消息通知功能,并且加上了实时通知,这需要前端先连接上服务器,然后,服务端会向前端推送消息。
即时通讯(WebSocket)在项目里面很常见,例如消息通知,实时翻译,语音转译等等。本框架在集成了 WebSocket 的基础上,实现了简单的消息通知以及角标统计功能,并且对于集成的 WebSocket 功能做了抽象优化,后续你可以自己实现自己的 WebSocket 功能。
框架已经实现了简单的消息通知功能,并且加上了实时通知,这需要前端先连接上服务器,然后,服务端会向前端推送消息。
在实际开发过程中,如果有涉及到和第三方的对接,我们会提供一些接口出去,但是,如果有很多对接方,那么,后续升级接口,就会导致接口的版本问题,所以,这边建议写接口的时候呢,加上版本号,
对接旧接口的继续使用,不会影响,新接口的,则需要加上更高的版本号,这样,当对接方升级的时候,就会自动使用新的接口,而不会影响到旧接口的使用。
.
`-- controller
|-- v1
| `-- SysUserController.java
|-- v2
| `-- SysUserController.java
`-- v3
`-- SysUserController.java
角色权限控制(RBAC)是一种基于角色的权限控制方式,它将用户分配给不同的角色,每个角色都有一组权限,用户只能访问自己角色所拥有的权限。
角色是权限控制中的核心概念,它表示一组权限。
权限是角色所拥有的权限,它表示用户可以执行的操作。
菜单权限表示用户可以查看的菜单。
在前端来看表示用户可以点击哪些按钮进行操作,在后端来看表示用户可以访问哪些接口进行操作。

相关信息
为了解决系统数据权限范围过滤问题,可以使用 @DataScope 注解,目前开发了基础版本,后续会陆续完善。
在使用注解前,需要了解,什么是数据权限,数据权限,即,基于用户/角色 关联绑定的部门,管理区域等一系列有父子级关系,或者无父子级关系的有标签性质的数据,单纯因为 用户/角色 关联了这些数据,用户再去访问/操作其他和这些权限关联的数据的时候,过滤掉 用户/角色 没有关联对应的权限数据的数据的操作,我们可以称之为数据权限过滤。在通常情况下,我们过滤数据权限,会写大量的过滤 sql ,或者大量的过滤逻,这里我们总结了这些过滤逻辑的通用情况下的操作,这里编写成了注解
相关信息
如果前端就知道了有后期更新数据库类型的可能性,便可以在开发的过程就做就好兼容性,方便后续直接切换数据库
这里兼容主要是基于 mybatis-plus 提供的便利性
这里,我在 spring-taybct-tool-mybatis 模块里面做了 Mybatis-plus 的基础配置,配置里面就有加入了方言的配置
@Bean
public DatabaseIdProvider databaseIdProvider() {
VendorDatabaseIdProvider databaseIdProvider = new VendorDatabaseIdProvider();
Properties properties = new Properties();
properties.put("Oracle", "oracle");
properties.put("MySQL", "mysql");
properties.setProperty("PostgreSQL", "postgresql");
properties.setProperty("DB2", "db2");
properties.setProperty("SQL Server", "sqlserver");
databaseIdProvider.setProperties(properties);
return databaseIdProvider;
}
相关信息
强制登出用户的时候,需要处理用户缓存,或者修改了角色,需要强制拿出这些角色相关的用户的话,需要开发人员自行决定是否要这样做。下面这两个配置类,需要放在 system 模块下
@Component
@RequiredArgsConstructor
public class LoginCacheClear implements ILoginCacheClear {
final RedisTemplate<Object, Object> redisTemplate;
@Override
public void accept(Collection<SysUser> sysUsers) {
redisTemplate.delete(sysUsers.stream()
.map(user -> Arrays.asList(
//TODO 这里有多少种登录方式就得加多少种,用户名,包含了邮箱
CacheConstants.OAuth.USERNAME + "::" +user.getUsername(),
CacheConstants.OAuth.OPENID + "::" + user.getUsername(),
CacheConstants.OAuth.PHONE + "::" + user.getPhone(),
CacheConstants.OAuth.USERID + "::" + user.getId()
))
.flatMap(Collection::stream)
.collect(Collectors.toSet()));
}
}
相关信息
我们在做数据库操作,写 xml sql 语句的时候,一些通用的参数,或者我们想添加一个并不是实体类里面有的参数,我们的处理方式可能是加一个 VO,或者 DTO 类来实现,或者是在方法里面多写一些的参数,但是,其实可以把这些参数,通过 MyBatis 拦截器的方式添加到参数里面,然后就可以在 XML 里面调用来写动态 SQL 了,框架使用了 MyBatisExtraParamsInterceptor 拦截器用来添加额外参数
相关信息
在项目开发中如果需要让程序自动在某个时刻去执行一些命令,就需要使用到任务调度
引入依赖 spring-taybct-tool-scheduling
<!--任务调度-->
<dependency>
<groupId>io.github.mangocrisp</groupId>
<artifactId>spring-taybct-tool-scheduling</artifactId>
</dependency>