手把手教大家在 Spring Boot 中处理 flowable 中的用户和组!
1. 准备工作2. 用户操作
2.1 添加用户
2.2 修改用户
2.3 删除用户
2.4 查询用户
3. 组操作
3.1 添加组
3.2 修改组
3.3 删除组
3.4 查询组
4. 查看表详情
虽然说我们在实际开发中,很少会直接用到 flowable 中的用户体系,但是,也不太可能完全用不到,毕竟官方设计了这个东西,而存在就必然有其合理性,所以,今天松哥还是来和大家聊一聊,在 Spring Boot 项目中,我们如何去添加、删除、修改一个用户或者组。
1. 准备工作
首先我们创建一个 Spring Boot 项目,引入 Web 依赖和 MySQL 驱动,如下:
创建完成之后,我们再手动加入 flowable 依赖,如下:
<dependency>
<groupId>org.flowable</groupId>
<artifactId>flowable-spring-boot-starter</artifactId>
<version>6.7.2</version>
</dependency>
然后在 properties 文件中配置一下数据库连接信息就行了:
spring.datasource.username=root
spring.datasource.password=123
spring.datasource.url=jdbc:mysql:///flowable-idm?serverTimezone=Asia/Shanghai&useSSL=false&nullCatalogMeansCurrent=true
好了,准备工作就算完成了。
2. 用户操作
在 Spring Boot 中,flowable 默认已经给我们配置好了 IdentityService 对象,我们只需要将之注入到项目中就可以使用了。
来看几个例子。
2.1 添加用户
@Autowired
IdentityService identityService;
@Test
void contextLoads() {
UserEntityImpl user = new UserEntityImpl();
user.setId("javaboy");
user.setDisplayName("江南一点雨");
user.setPassword("123");
user.setFirstName("java");
user.setLastName("boy");
user.setEmail("javaboy@qq.com");
user.setRevision();
identityService.saveUser(user);
}
这些字段都很好理解,跟松哥之前说的在网页上添加用户的字段都差不多,需要注意的是 revision 的值为 0 表示这是一个新添加的用户。
添加之后,我们在数据库的 ACT_ID_USER
表中,就可以看到刚刚加入的数据了:
2.2 修改用户
如果是修改用户密码,可以调用如下方法:
@Test
void test02() {
UserEntityImpl user = new UserEntityImpl();
user.setId("javaboy");
user.setPassword("666");
user.setRevision(1);
identityService.updateUserPassword(user);
}
虽然这个方法名是 updateUserPassword,但是实际上这个也能修改其他属性。
这里有一个问题,就是用户用到了乐观锁,所以修改的时候,要自己把 revision 写对了,否则修改会失败,然而我们往往并不记得 revision 是多少,所以好是先查询,后修改,如下:
@Test
void test03() {
User u = identityService.createUserQuery().userId("javaboy").singleResult();
u.setDisplayName("itboy");
identityService.updateUserPassword(u);
}
如果是强行给一个不匹配的 revision,执行的时候会报如下错误:
当然,修改用户的时候也可以调用 saveUser 方法,这个方法会根据用户 id 查询用户,如果用户已经存在,则直接修改(修改 password 之外的其他属性),否则就添加。
2.3 删除用户
这个比较简单,可根据用户 id 删除一个用户:
@Test
void test05() {
identityService.deleteUser("javaboy");
}
2.4 查询用户
查询方式比较丰富,通过用户的各个属性都可以查询,例如可以查询所有姓张的用户:
@Test
void test06() {
List<User> list = identityService.createUserQuery().userDisplayNameLike("张%").orderByUserId().asc().list();
for (User user : list) {
System.out.println("user.getDisplayName() = " + user.getDisplayName());
}
}
查询所有的用户:
@Test
void test07() {
List<User> list = identityService.createUserQuery().list();
for (User user : list) {
System.out.println("user.getId() = " + user.getId());
}
}
当然还有其他方法,包括排序、分页等,基本上见名知意,我就不挨个演示了。
如果你觉得这些方法调用起来费事,那么也可以直接上 SQL,这个底层数据库操作用的 MyBatis,所以这个 SQL 中参数的写法就按照 MyBatis 里边的来即可:
@Test
void test08() {
List<User> list = identityService.createNativeUserQuery().sql("select * from ACT_ID_USER where DISPLAY_NAME_ like #{name}").parameter("name", "李%").list();
for (User user : list) {
System.out.println("user.getId() = " + user.getId());
}
}
有的时候,如果不记得表名,也可以按照如下方式现场根据类名查询该类对应的表名,如下:
@Test
void test08() {
List<User> list = identityService.createNativeUserQuery().sql("select * from "+idmManagementService.getTableName(User.class)+" where DISPLAY_NAME_ like #{name}").parameter("name", "李%").list();
for (User user : list) {
System.out.println("user.getId() = " + user.getId());
}
}
好啦,用户的增删改查差不多就这些,用户的这些搞明白了,接下来的就容易了。
3. 组操作
3.1 添加组
组的属性相对来说少一些,添加方式和 user 比较像:
@Test
void test09() {
GroupEntityImpl g = new GroupEntityImpl();
g.setName("组长");
g.setId("leader");
g.setRevision();
identityService.saveGroup(g);
}
添加之后,组的信息保存在 ACT_ID_GROUP
表中,如下图:
按照松哥之前在 flowable-ui 中给大家演示的,组创建好之后,接下来还要给组添加用户,添加方式如下:
identityService.createMembership("zhangsan", "leader");
identityService.createMembership("lisi", "leader");
这就是设置 zhangsan 和 lisi 是组长(注意用户和组的关联关系表中有外键,所以需要确保两个参数都是真实存在的)。
添加了关联关系之后,我们再去查看 ACT_ID_MEMBERSHIP
表,如下:
掉用如下方法可以删除关联关系:
identityService.deleteMembership("zhangsan","leader");
3.2 修改组
如下,将 id 为 leader 的组名更新为主管,如下:
Group g = identityService.createGroupQuery().groupId("leader").singleResult();
g.setName("主管");
identityService.saveGroup(g);
3.3 删除组
删除组方式如下:
identityService.deleteGroup("leader");
删除组的同时,也会删除掉组和用户之间的关联关系,不过不用担心用户被删除。
3.4 查询组
可以根据 id 或者 name 或者组员信息等去查询组:
//根据 id 查询组信息
Group g1 = identityService.createGroupQuery().groupId("leader").singleResult();
System.out.println("g1.getName() = " + g1.getName());
//根据 name 查询组信息
Group g2 = identityService.createGroupQuery().groupName("组长").singleResult();
System.out.println("g2.getId() = " + g2.getId());
//根据用户查询组信息(组里包含该用户)
List<Group> list = identityService.createGroupQuery().groupMember("zhangsan").list();
for (Group group : list) {
System.out.println("group.getName() = " + group.getName());
}
4. 查看表详情
如果需要查看表详情,可通过如下方式查看:
@Test
void test15() {
//获取系统信息,实际上是读取 ACT_ID_PROPERTY 表的信息
Map<String, String> properties = idmManagementService.getProperties();
System.out.println("properties = " + properties);
//获取表的详细信息
TableMetaData tableMetaData = idmManagementService.getTableMetaData(idmManagementService.getTableName(User.class));
//获取表名
System.out.println("tableMetaData.getTableName() = " + tableMetaData.getTableName());
//获取列名
System.out.println("tableMetaData.getColumnNames() = " + tableMetaData.getColumnNames());
//获取列的类型
System.out.println("tableMetaData.getColumn*() = " + tableMetaData.getColumn*());
}
好啦,差不多就这些内容吧,如果我们想要使用自己的用户体系,又不想抛弃 flowable 的用户,那么可以按照如上方式,在添加系统本地用户的时候,也往 flowable 中添加/更新用户。
相关文章