是为了使用一个“工具”来完成CURD的绝大部分工作,提供一个可以快速完成功能的小系统。
以下是一个开源框架,Springboot+layui,已经包含组织、用户、菜单、权限、自动生成代码等功能。(fork的,也有部分功能的测试)
https://gitee.com/kelvin11/springboot-plus
E:\gitlab\kelvin\springboot-layui-management
已完成的一个case:E:\tmp\办公\设计\xiandafu-springboot-plus-master\springboot-plus(内部MQTT)
一些查询的cache,给注释掉了
什么是角色数据授权?
数据权限怎么实现的?对应的数字怎么理解?
功能点与菜单权限
功能点与按钮权限
配置了“含”数据权限的菜单,里面的管理功能比如修改等按钮展示不出来
选择“只查看自己”之后,会执行下面的sql
┏━━━━━ Debug [coreRoleFunction._gen_selectByTemplate_page] ━━━
┣ SQL: select * from `core_role_function` where 1=1 and `ROLE_ID`=? and `FUNCTION_ID`=? limit ? , ?
┣ 参数: [174, 185, 0, 1]
┣ 位置: com.ibeetl.admin.console.service.FunctionConsoleService.updateFunctionAccessByRole(FunctionConsoleService.java:140)
┣ 时间: 1ms
┣ 结果: [1]
┗━━━━━ Debug [coreRoleFunction._gen_selectByTemplate_page] ━━━
┏━━━━━ Debug [coreRoleFunction._gen_updateById] ━━━
┣ SQL: update `core_role_function` set `ROLE_ID`=?,`FUNCTION_ID`=?,`DATA_ACCESS_TYPE`=?,`DATA_ACCESS_POLICY`=? where `ID` = ?
┣ 参数: [174, 185, 1, null, 208]
┣ 位置: com.ibeetl.admin.console.service.FunctionConsoleService.updateFunctionAccessByRole(FunctionConsoleService.java:143)
┣ 时间: 2ms
┣ 更新: [1]
┗━━━━━ Debug [coreRoleFunction._gen_updateById] ━━━
然后再进行新增的操作
功能点是菜单和角色权限的基础,想做菜单、菜单权限、数据权限,需要:
背景是数据权限分以下多个可选:
对角色“华邦管理员”,其数据权限“用户列表”,设定为“查看同公司(不含子公司)”
这个case有报错,回头再分析出错原因
只能看到跟自己同一层的用户
此时,如果在“江苏华邦网络科技”这个分公司下新增一个“华邦用户2”,那么可见如下:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jK73rVjI-1592464192855)(C:\Users\Lenovo\AppData\Roaming\Typora\typora-user-images\image-20200611165808572.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tqJBj6uW-1592464192874)(C:\Users\Lenovo\AppData\Roaming\Typora\typora-user-images\image-20200611165901373.png)]
修改数据权限如下图,看执行了什么sql语句
┏━━━━━ Debug [coreRoleFunction._gen_selectByTemplate_page] ━━━
┣ SQL: select * from `core_role_function` where 1=1 and `ROLE_ID`=? and `FUNCTION_ID`=? limit ? , ?
┣ 参数: [174, 2, 0, 1]
┣ 位置: com.ibeetl.admin.console.service.FunctionConsoleService.updateFunctionAccessByRole(FunctionConsoleService.java:140)
┣ 时间: 1ms
┣ 结果: [1]
┗━━━━━ Debug [coreRoleFunction._gen_selectByTemplate_page] ━━━
┏━━━━━ Debug [coreRoleFunction._gen_updateById] ━━━
┣ SQL: update `core_role_function` set `ROLE_ID`=?,`FUNCTION_ID`=?,`DATA_ACCESS_TYPE`=?,`DATA_ACCESS_POLICY`=? where `ID` = ?
┣ 参数: [174, 2, 2, null, 212]
┣ 位置: com.ibeetl.admin.console.service.FunctionConsoleService.updateFunctionAccessByRole(FunctionConsoleService.java:143)
┣ 时间: 10ms
┣ 更新: [1]
┗━━━━━ Debug [coreRoleFunction._gen_updateById] ━━━
就是将core_role_function表中这个id,设置其DATA_ACCESS_TYPE。DATA_ACCESS_TYPE的枚举见上图
就是比如在“用户管理”菜单页面中,有查询“用户列表”的功能(function_id为2,code为user.query),探索是如何生效的。
在DataAccessFunction中
http://ibeetl.com/guide/#/beetlsql/quickstart
======> 考虑beetlsql可能并不是特别常用的ORM框架,替换此框架可能需要比较多的时间(需要改Dao类,Dao类继承了BaseMapper…)
======> 考虑引入Mybatis-plus,对于既有的dao代码不做改造,新功能通过新的mybatis方案实现
综合来看:可能需要熟悉beetlsql来快速实现功能,另外也需要尝试接入mybatis
查询user_console表数据,需要实现以下功能:
@Test
public void testOne() throws Exception {
CoreUser queryTemplateDto = new CoreUser();
queryTemplateDto.setJobType0("JT_01");//JT_01 JT_02;如果不传就没有这个查询条件
LambdaQuery<CoreUser> query = userConsoleDao.createLambdaQuery()
.andLike(CoreUser::getName,"%1%") // 实现功能点3
.andEq(CoreUser::getJobType0, Query.filterEmpty(queryTemplateDto.getJobType0())) // 实现功能点1
.asc(CoreUser::getName); // 实现功能点4
query.page(1, 3); // 实现功能点2
// List userList = query.page(2, 2).getList();
// for (CoreUser user: userList) {
// System.out.println(user);
// }
}
@Test
public void testGenerateCode() throws Exception {
// 或者直接生成java文件
GenConfig config = new GenConfig();
config.preferBigDecimal(true);
config.setPreferDate(true);
sqlManager.genPojoCodeToConsole("test_product");// 快速生成,显示到控制台
}
直接继承BaseMapper即可,注意设置泛型类
@Test
public void testNewPO() {
LambdaQuery<TestProduct> query = testProductDao.createLambdaQuery()
.desc(TestProduct::getDelFlag);
List<TestProduct> productList = query.select();
for (TestProduct tmp : productList) {
System.out.println(tmp.getProductName());
}
}
List<TestMachine> machineList = testMachineDao.execute("SELECT * FROM test_machine WHERE machine_name LIKE ?", "%Dell%");
新建dto类,用来接收查询结果
public class MyMachine{
private String machineName;
public String getMachineName() {
return machineName;
}
public void setMachineName(String machineName) {
this.machineName = machineName;
}
@Override
public String toString() {
return "MyMachine{" +
"machineName='" + machineName + '\'' +
'}';
}
}
在src/main/resource目录下,建testMachine.md文件,内容是
getTestMachineA
===
select * from test_machine
在testMachineDao.java新增getMachineA()方法
@SqlResource("springbootplus.testMachine")
public interface TestMachineDao extends BaseMapper<TestMachine>{
public PageQuery<TestMachine> queryByCondition(PageQuery query);
public void batchDelTestMachineByIds( List<Long> ids);
public List<MyMachine> getTestMachineA();
}
运行测试方法
@RunWith(SpringRunner.class)
@SpringBootTest(classes = {MainApplication.class})// 指定启动类
public class ApplicationTests {
@Autowired
TestMachineDao machineDao;
/**
* 生成PO类的代码
* @throws Exception
*/
@Test
public void testSql() throws Exception {
List<MyMachine> getTestMachineA = machineDao.getTestMachineA();
System.out.println("111");
}
}
目录结构与运行情况截图如下
原则上作者不建议在admin-console或admin-core修改代码。推荐是先自动生成一个项目(其实是module),此module是依赖admin-console和admin-core的,然后导入此module
从新的module启动即可
但是,发现项目目录有点奇怪
所以考虑重新生成一下,然后新module目录选择到当前admin-core的同级目录(目的是git管理比较简单一点,项目代码都在一起)
然后一样,导入module即可,测试启动新项目MainApplication,可访问管理系统
无需额外的配置,可以直接使用LambdaQuery
生成的路径选择在“E:\gitlab\kelvin\springboot-layui-management\springbootplus”,这个就是我新建的项目目录,这样的话,新建出来的文件会自动放在此目录下,需要注意的是自动生成的代码package,分别是dao、entity、service、web这些目录
按此方式,从html&js到controller、service、dao、entity都已经生成好了
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-aqOOfp18-1592464193052)(C:\Users\Lenovo\AppData\Roaming\Typora\typora-user-images\image-20200618091302500.png)]
看后台报错
发现是没有重启服务…重启后即可访问…
有个小问题就是有些字段不需要在页面上展示,比如“增加”的时候,不需要填写“添加时间”和“更新时间”
目前这个还没有看到解决的方法,估计是需要手动修改,毕竟如果不配置展示,就需要在db中改为可空或插入一些默认值,这个可能需要自行实现。