Springboot+layui+代碼生成全套forked

1. 目標

是爲了使用一個“工具”來完成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)

2. 組織架構、用戶、角色、權限梳理

一些查詢的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] ━━━

2.1. 用戶與角色

然後再進行新增的操作

2.2. 功能點、角色、菜單、角色功能授權、角色數據授權

功能點是菜單和角色權限的基礎,想做菜單、菜單權限、數據權限,需要:

  1. 先建立對應的功能點。如果是想建菜單,那麼需要先建一個功能點(ps:“功能地址”是菜單地址,“功能類型”是普通功能)
  2. 菜單項新增。“菜單地址”選擇對應的功能點;“菜單類型”如果是“導航”,那麼代表的是此項下有下一級菜單,如果是“菜單”代表是實際的菜單級別頁面。
  3. 在“角色功能授權”,授權角色可以訪問的功能點,那麼功能點對應的菜單也就可見了
  4. 在“角色數據授權”,如果功能點的“功能類型”是“含數據權限”,那麼在給角色授權完功能點之後,可以在“角色數據授權”進一步設置功能點的數據權限,詳細功能參考下一小節內容。

2.3. 角色數據授權

背景是數據權限分以下多個可選:

對角色“華邦管理員”,其數據權限“用戶列表”,設定爲“查看同公司(不含子公司)”

2.3.1. 角色數據授權(頁面配置)

2.3.1.1. 只查看自己 — 有異常

這個case有報錯,回頭再分析出錯原因

2.3.1.2. 查看同公司(不含子公司)

2.3.1.3. 同結構

只能看到跟自己同一層的用戶

此時,如果在“江蘇華邦網絡科技”這個分公司下新增一個“華邦用戶2”,那麼可見如下:

2.3.1.4. 部門和子部門下所有

2.3.1.5. 所有機構

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-jK73rVjI-1592464192855)(C:\Users\Lenovo\AppData\Roaming\Typora\typora-user-images\image-20200611165808572.png)]

2.3.1.6. 集團下所有 — 有異常

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-tqJBj6uW-1592464192874)(C:\Users\Lenovo\AppData\Roaming\Typora\typora-user-images\image-20200611165901373.png)]

2.3.1.7. 母公司

2.3.1.8. 集團部門

2.3.2. 角色數據授權(怎麼更新Update)

修改數據權限如下圖,看執行了什麼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的枚舉見上圖

2.3.3. 角色數據授權,是怎麼生效的?

就是比如在“用戶管理”菜單頁面中,有查詢“用戶列表”的功能(function_id爲2,code爲user.query),探索是如何生效的。

在DataAccessFunction中

3. beetl相關技術-SQL

http://ibeetl.com/guide/#/beetlsql/quickstart

======> 考慮beetlsql可能並不是特別常用的ORM框架,替換此框架可能需要比較多的時間(需要改Dao類,Dao類繼承了BaseMapper…)

======> 考慮引入Mybatis-plus,對於既有的dao代碼不做改造,新功能通過新的mybatis方案實現

綜合來看:可能需要熟悉beetlsql來快速實現功能,另外也需要嘗試接入mybatis

3.1. 嘗試寫一個beetlsql分頁查詢功能

查詢user_console表數據,需要實現以下功能:

  1. 根據構建的CoreUser對象,動態的設置查詢條件(爲null的不作爲查詢條件,不爲null的纔會查詢)
  2. 分頁查詢,每頁3條,查詢第1頁
  3. 模糊查詢,CoreUser中name包含“1”的用戶查出來
  4. 根據用戶姓名升序排序
    解決思路:通過LambdaQuery來進行查詢(或者是考慮通過BaseMapper來實現----這種方式作者不推薦了)
    @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<CoreUser> userList = query.page(2, 2).getList();
//        for (CoreUser user: userList) {
//            System.out.println(user);
//        }
    }

3.2. 新表:生成PO、創建Dao、執行查詢流程

3.2.1. 生成PO

    @Test
    public void testGenerateCode() throws Exception {
        // 或者直接生成java文件
        GenConfig config = new GenConfig();
        config.preferBigDecimal(true);
        config.setPreferDate(true);
        sqlManager.genPojoCodeToConsole("test_product");// 快速生成,顯示到控制檯
    }

3.2.2. 創建Dao

直接繼承BaseMapper即可,注意設置泛型類

3.2.3. 執行查詢

@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());
        }

    }

3.3. 自定義sql查詢

3.3.1. 查詢單表

List<TestMachine> machineList = testMachineDao.execute("SELECT * FROM test_machine WHERE machine_name LIKE ?", "%Dell%");

3.3.2. 查詢返回特定POJO

  • 新建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");
        }
    
    }
    
  • 目錄結構與運行情況截圖如下

4. 生成子系統

原則上作者不建議在admin-console或admin-core修改代碼。推薦是先自動生成一個項目(其實是module),此module是依賴admin-console和admin-core的,然後導入此module

4.1. 生成新模塊

4.2. 導入模塊module

從新的module啓動即可

但是,發現項目目錄有點奇怪

所以考慮重新生成一下,然後新module目錄選擇到當前admin-core的同級目錄(目的是git管理比較簡單一點,項目代碼都在一起)

然後一樣,導入module即可,測試啓動新項目MainApplication,可訪問管理系統

4.3. 在子系統中做一個查詢接口

無需額外的配置,可以直接使用LambdaQuery

5. 生成頁面+service+dao+PO

5.1. 自動生成代碼

生成的路徑選擇在“E:\gitlab\kelvin\springboot-layui-management\springbootplus”,這個就是我新建的項目目錄,這樣的話,新建出來的文件會自動放在此目錄下,需要注意的是自動生成的代碼package,分別是dao、entity、service、web這些目錄

按此方式,從html&js到controller、service、dao、entity都已經生成好了

5.2. 新建“機器管理”功能點

5.3. 新建“機器管理”菜單

5.4. 訪問“機器管理”頁面

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-aqOOfp18-1592464193052)(C:\Users\Lenovo\AppData\Roaming\Typora\typora-user-images\image-20200618091302500.png)]

看後臺報錯

發現是沒有重啓服務…重啓後即可訪問…

有個小問題就是有些字段不需要在頁面上展示,比如“增加”的時候,不需要填寫“添加時間”和“更新時間”

目前這個還沒有看到解決的方法,估計是需要手動修改,畢竟如果不配置展示,就需要在db中改爲可空或插入一些默認值,這個可能需要自行實現。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章