From 978151a53aaf3053f676856316fa900354e53f92 Mon Sep 17 00:00:00 2001 From: bf109f <13848692+bf109f@user.noreply.gitee.com> Date: Sun, 17 Dec 2023 15:40:42 +0800 Subject: [PATCH 1/4] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E6=9D=83=E9=99=90?= =?UTF-8?q?=E5=A4=84=E7=90=86=E7=BB=9F=E4=B8=80=E5=85=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mybatisflex/core/dialect/IDialect.java | 28 +++++++++++++++++++ .../mybatisflex/core/dialect/OperateType.java | 22 +++++++++++++++ .../core/dialect/impl/CommonsDialectImpl.java | 20 +++++++++---- 3 files changed, 65 insertions(+), 5 deletions(-) create mode 100644 mybatis-flex-core/src/main/java/com/mybatisflex/core/dialect/OperateType.java diff --git a/mybatis-flex-core/src/main/java/com/mybatisflex/core/dialect/IDialect.java b/mybatis-flex-core/src/main/java/com/mybatisflex/core/dialect/IDialect.java index 9d993fb5..1d4e40d1 100644 --- a/mybatis-flex-core/src/main/java/com/mybatisflex/core/dialect/IDialect.java +++ b/mybatis-flex-core/src/main/java/com/mybatisflex/core/dialect/IDialect.java @@ -91,4 +91,32 @@ public interface IDialect { String forSelectEntityListByIds(TableInfo tableInfo, Object[] primaryValues); + /** + * 权限处理 + * + * @param queryWrapper queryWrapper + * @param operateType 操作类型 + */ + default void prepareAuth(QueryWrapper queryWrapper, OperateType operateType) { + } + + /** + * 权限处理 + * + * @param schema schema + * @param tableName 表名 + * @param sql sql + * @param operateType 操作类型 + */ + default void prepareAuth(String schema, String tableName, StringBuilder sql, OperateType operateType) { + } + + /** + * 权限处理 + * @param tableInfo tableInfo + * @param sql sql + * @param operateType 操作类型 + */ + default void prepareAuth(TableInfo tableInfo, StringBuilder sql, OperateType operateType) { + } } diff --git a/mybatis-flex-core/src/main/java/com/mybatisflex/core/dialect/OperateType.java b/mybatis-flex-core/src/main/java/com/mybatisflex/core/dialect/OperateType.java new file mode 100644 index 00000000..ee19f331 --- /dev/null +++ b/mybatis-flex-core/src/main/java/com/mybatisflex/core/dialect/OperateType.java @@ -0,0 +1,22 @@ +package com.mybatisflex.core.dialect; + +/** + * 操作类型 + */ +public enum OperateType { + /** + * 查询 + */ + SELECT, + + /** + * 更新 + */ + UPDATE, + + /** + * 删除 + */ + DELETE, + ; +} diff --git a/mybatis-flex-core/src/main/java/com/mybatisflex/core/dialect/impl/CommonsDialectImpl.java b/mybatis-flex-core/src/main/java/com/mybatisflex/core/dialect/impl/CommonsDialectImpl.java index 165f8b44..d423d3a2 100644 --- a/mybatis-flex-core/src/main/java/com/mybatisflex/core/dialect/impl/CommonsDialectImpl.java +++ b/mybatis-flex-core/src/main/java/com/mybatisflex/core/dialect/impl/CommonsDialectImpl.java @@ -18,6 +18,7 @@ package com.mybatisflex.core.dialect.impl; import com.mybatisflex.core.dialect.IDialect; import com.mybatisflex.core.dialect.KeywordWrap; import com.mybatisflex.core.dialect.LimitOffsetProcessor; +import com.mybatisflex.core.dialect.OperateType; import com.mybatisflex.core.exception.FlexExceptions; import com.mybatisflex.core.exception.locale.LocalizedFormats; import com.mybatisflex.core.logicdelete.LogicDeleteManager; @@ -164,6 +165,7 @@ public class CommonsDialectImpl implements IDialect { } sql.append(wrap(primaryKeys[i])).append(EQUALS_PLACEHOLDER); } + prepareAuth(schema, table, sql, OperateType.DELETE); return sql.toString(); } @@ -205,11 +207,13 @@ public class CommonsDialectImpl implements IDialect { sql.append(wrap(primaryKeys[0])).append(EQUALS_PLACEHOLDER); } } + prepareAuth(schema, table, sql, OperateType.DELETE); return sql.toString(); } @Override public String forDeleteByQuery(QueryWrapper queryWrapper) { + prepareAuth(queryWrapper, OperateType.DELETE); return buildDeleteSql(queryWrapper); } @@ -252,12 +256,13 @@ public class CommonsDialectImpl implements IDialect { } sql.append(wrap(primaryKeys[i])).append(EQUALS_PLACEHOLDER); } - + prepareAuth(schema, table, sql, OperateType.UPDATE); return sql.toString(); } @Override public String forUpdateByQuery(QueryWrapper queryWrapper, Row row) { + prepareAuth(queryWrapper, OperateType.UPDATE); StringBuilder sqlBuilder = new StringBuilder(); Set modifyAttrs = RowCPI.getModifyAttrs(row); @@ -332,11 +337,13 @@ public class CommonsDialectImpl implements IDialect { } sql.append(wrap(primaryKeys[i])).append(EQUALS_PLACEHOLDER); } + prepareAuth(schema, table, sql, OperateType.SELECT); return sql.toString(); } @Override public String forSelectByQuery(QueryWrapper queryWrapper) { + prepareAuth(queryWrapper, OperateType.SELECT); return buildSelectSql(queryWrapper); } @@ -664,6 +671,7 @@ public class CommonsDialectImpl implements IDialect { //租户ID tableInfo.buildTenantCondition(sql, tenantIdArgs, this); + prepareAuth(tableInfo, sql, OperateType.DELETE); return sql.toString(); } @@ -723,7 +731,7 @@ public class CommonsDialectImpl implements IDialect { sql.append(BRACKET_RIGHT).append(AND).append(buildLogicNormalCondition(logicDeleteColumn, tableInfo)); tableInfo.buildTenantCondition(sql, tenantIdArgs, this); - + prepareAuth(tableInfo, sql, OperateType.DELETE); return sql.toString(); } @@ -738,6 +746,7 @@ public class CommonsDialectImpl implements IDialect { } + prepareAuth(queryWrapper, OperateType.DELETE); //逻辑删除 List queryTables = CPI.getQueryTables(queryWrapper); List joinTables = CPI.getJoinTables(queryWrapper); @@ -823,12 +832,13 @@ public class CommonsDialectImpl implements IDialect { sql.append(AND).append(wrap(versionColumn)).append(EQUALS).append(versionValue); } - + prepareAuth(tableInfo, sql, OperateType.UPDATE); return sql.toString(); } @Override public String forUpdateEntityByQuery(TableInfo tableInfo, Object entity, boolean ignoreNulls, QueryWrapper queryWrapper) { + prepareAuth(queryWrapper, OperateType.UPDATE); StringBuilder sqlBuilder = new StringBuilder(); Set updateColumns = tableInfo.obtainUpdateColumns(entity, ignoreNulls, true); @@ -916,7 +926,7 @@ public class CommonsDialectImpl implements IDialect { //多租户 Object[] tenantIdArgs = tableInfo.buildTenantIdArgs(); tableInfo.buildTenantCondition(sql, tenantIdArgs, this); - + prepareAuth(tableInfo, sql, OperateType.SELECT); return sql.toString(); } @@ -972,7 +982,7 @@ public class CommonsDialectImpl implements IDialect { //多租户 tableInfo.buildTenantCondition(sql, tenantIdArgs, this); - + prepareAuth(tableInfo, sql, OperateType.SELECT); return sql.toString(); } From 31a58c8b7fb3c6833a36b306cc5ecc0b98c7bf8e Mon Sep 17 00:00:00 2001 From: bf109f <13848692+bf109f@user.noreply.gitee.com> Date: Sun, 17 Dec 2023 20:28:18 +0800 Subject: [PATCH 2/4] =?UTF-8?q?=E6=9D=83=E9=99=90=E5=85=A5=E5=8F=A3?= =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E5=8D=95=E5=85=83=E6=B5=8B=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/mybatisflex/coretest/Account.java | 12 +++ .../com/mybatisflex/coretest/AuthTest.java | 96 +++++++++++++++++++ .../mybatisflex/coretest/LambdaSqlTest.java | 2 + .../coretest/auth/AuthDialectImpl.java | 34 +++++++ 4 files changed, 144 insertions(+) create mode 100644 mybatis-flex-core/src/test/java/com/mybatisflex/coretest/AuthTest.java create mode 100644 mybatis-flex-core/src/test/java/com/mybatisflex/coretest/auth/AuthDialectImpl.java diff --git a/mybatis-flex-core/src/test/java/com/mybatisflex/coretest/Account.java b/mybatis-flex-core/src/test/java/com/mybatisflex/coretest/Account.java index 39a665af..2ba5372e 100644 --- a/mybatis-flex-core/src/test/java/com/mybatisflex/coretest/Account.java +++ b/mybatis-flex-core/src/test/java/com/mybatisflex/coretest/Account.java @@ -42,6 +42,11 @@ public class Account { @Column(isLogicDelete = true) private Boolean isDelete; + /** + * 创建人 + */ + private String insertUserId; + public Long getId() { return id; @@ -99,4 +104,11 @@ public class Account { isDelete = delete; } + public String getInsertUserId() { + return insertUserId; + } + + public void setInsertUserId(String insertUserId) { + this.insertUserId = insertUserId; + } } diff --git a/mybatis-flex-core/src/test/java/com/mybatisflex/coretest/AuthTest.java b/mybatis-flex-core/src/test/java/com/mybatisflex/coretest/AuthTest.java new file mode 100644 index 00000000..35f521b9 --- /dev/null +++ b/mybatis-flex-core/src/test/java/com/mybatisflex/coretest/AuthTest.java @@ -0,0 +1,96 @@ +package com.mybatisflex.coretest; + +import com.mybatisflex.core.dialect.DbType; +import com.mybatisflex.core.dialect.DialectFactory; +import com.mybatisflex.core.dialect.IDialect; +import com.mybatisflex.core.query.QueryWrapper; +import com.mybatisflex.core.row.Row; +import com.mybatisflex.core.row.RowKey; +import com.mybatisflex.core.row.RowUtil; +import com.mybatisflex.core.table.TableInfoFactory; +import com.mybatisflex.coretest.auth.AuthDialectImpl; +import org.junit.Before; +import org.junit.Test; + +import static com.mybatisflex.coretest.table.AccountTableDef.ACCOUNT; + +/** + * 权限测试 + * @author zhang + * @since 2023/12/17 + */ +public class AuthTest { + + private IDialect dialect; + + @Before + public void init() { + DialectFactory.registerDialect(DbType.MYSQL, new AuthDialectImpl()); + dialect = DialectFactory.getDialect(); + } + + @Test + public void test() { + // 1.单个删除 + assert "DELETE FROM `tb_account` WHERE `id` = ? AND `insert_user_id` = 1" + .equals(dialect.forDeleteById(ACCOUNT.getSchema(), ACCOUNT.getTableName(), new String[]{ACCOUNT.ID.getName()})); + // 2.批量删除 + assert "DELETE FROM `tb_account` WHERE `id` = ? AND `insert_user_id` = 1" + .equals(dialect.forDeleteBatchByIds(ACCOUNT.getSchema(), ACCOUNT.getTableName(), new String[]{ACCOUNT.ID.getName()}, new Object[]{1L})); + // 3.查询 + QueryWrapper deleteWrapper = + QueryWrapper.create(new Account()).where(ACCOUNT.ID.eq(1)); + assert "DELETE FROM `tb_account` WHERE `id` = ? AND `sex` = ? AND `is_normal` = ? AND `insert_user_id` = ?" + .equals(dialect.forDeleteByQuery(deleteWrapper)); + // 4.更新 + assert "UPDATE `tb_account` SET `age` = ? WHERE `id` = ? AND `insert_user_id` = 1" + .equals(dialect.forUpdateById(ACCOUNT.getSchema(), ACCOUNT.getTableName(), + Row.ofKey(RowKey.AUTO).set(ACCOUNT.AGE, 18))); + // 5.更新 + Row row = new Row(); + row.set(ACCOUNT.AGE, 18); + QueryWrapper updateWrapper = + QueryWrapper.create(new Account()).where(ACCOUNT.ID.eq(1)); + assert "UPDATE `tb_account` SET `age` = ? WHERE `id` = ? AND `sex` = ? AND `is_normal` = ? AND `insert_user_id` = ?" + .equals(dialect.forUpdateByQuery(updateWrapper, row)); + // 6.ID查询 + assert "SELECT * FROM `tb_account` WHERE `id` = ? AND `insert_user_id` = 1" + .equals(dialect.forSelectOneById(ACCOUNT.getSchema(), ACCOUNT.getTableName(), new String[]{ACCOUNT.ID.getName()}, new Object[]{1L})); + QueryWrapper queryWrapper = + QueryWrapper.create().select(ACCOUNT.ALL_COLUMNS).where(ACCOUNT.ID.eq(1)); + // 7.query查询 + assert "SELECT * FROM WHERE `id` = ? AND `insert_user_id` = ?" + .equals(dialect.forSelectByQuery(queryWrapper)); + // 8.删除 + assert "UPDATE `tb_account` SET `is_delete` = 1 WHERE `id` = ? AND `is_delete` = 0 AND `insert_user_id` = 1" + .equals(dialect.forDeleteEntityById(TableInfoFactory.ofEntityClass(Account.class))); + // 9.批量删除 + assert "UPDATE `tb_account` SET `is_delete` = 1 WHERE (`id` = ? ) AND `is_delete` = 0 AND `insert_user_id` = 1" + .equals(dialect.forDeleteEntityBatchByIds(TableInfoFactory.ofEntityClass(Account.class), new String[]{ACCOUNT.ID.getName()})); + // 10.query删除 + assert "UPDATE `tb_account` SET `is_delete` = 1 WHERE `id` = ? AND `insert_user_id` = ? AND `insert_user_id` = ?" + .equals(dialect.forDeleteEntityBatchByQuery(TableInfoFactory.ofEntityClass(Account.class), queryWrapper)); + // 11.更新 + Account account = new Account(); + account.setAge(18); + assert "UPDATE `tb_account` SET `sex` = ? , `age` = ? , `is_normal` = ? WHERE `id` = ? AND `is_delete` = 0 AND `insert_user_id` = 1" + .equals(dialect.forUpdateEntity(TableInfoFactory.ofEntityClass(Account.class), account, true)); + // 12.更新 + assert "UPDATE `tb_account` SET `sex` = ? , `age` = ? , `is_normal` = ? WHERE `id` = ? AND `insert_user_id` = ? AND `insert_user_id` = ? AND `insert_user_id` = ?" + .equals(dialect.forUpdateEntityByQuery(TableInfoFactory.ofEntityClass(Account.class), account, true, queryWrapper)); + // 13.ID查询 + assert "SELECT * FROM `tb_account` WHERE `id` = ? AND `is_delete` = 0 AND `insert_user_id` = 1" + .equals(dialect.forSelectOneEntityById(TableInfoFactory.ofEntityClass(Account.class))); + // 14.查询 + assert "SELECT `id`, `user_name`, `birthday`, `sex`, `age`, `is_normal`, `is_delete`, `insert_user_id` FROM `tb_account` WHERE (`id` = ? ) AND `is_delete` = 0 AND `insert_user_id` = 1" + .equals(dialect.forSelectEntityListByIds(TableInfoFactory.ofEntityClass(Account.class), new String[]{ACCOUNT.ID.getName()})); + } + + @Test + public void testWrapper() { + // (为什么打印的sql是这样的 DELETE FROM WHERE `id` = ? AND `insert_user_id` = ?) + QueryWrapper deleteWrapper = + QueryWrapper.create().where(ACCOUNT.ID.eq(1)); + System.out.println(dialect.forDeleteByQuery(deleteWrapper)); + } +} diff --git a/mybatis-flex-core/src/test/java/com/mybatisflex/coretest/LambdaSqlTest.java b/mybatis-flex-core/src/test/java/com/mybatisflex/coretest/LambdaSqlTest.java index c05afe87..1047d91a 100644 --- a/mybatis-flex-core/src/test/java/com/mybatisflex/coretest/LambdaSqlTest.java +++ b/mybatis-flex-core/src/test/java/com/mybatisflex/coretest/LambdaSqlTest.java @@ -111,6 +111,7 @@ public class LambdaSqlTest { " ` ac `.` age `,\n" + " ` ac `.` is_normal `,\n" + " ` ac `.` is_delete `,\n" + + " ` ac `.` insert_user_id `,\n" + " ` ar `.` title `,\n" + " ` ar `.` content `\n" + "FROM\n" + @@ -138,6 +139,7 @@ public class LambdaSqlTest { " ` ac `.` age `,\n" + " ` ac `.` is_normal `,\n" + " ` ac `.` is_delete `,\n" + + " ` ac `.` insert_user_id `,\n" + " ` ar `.*\n" + "FROM\n" + " ` tb_account ` AS ` ac `\n" + diff --git a/mybatis-flex-core/src/test/java/com/mybatisflex/coretest/auth/AuthDialectImpl.java b/mybatis-flex-core/src/test/java/com/mybatisflex/coretest/auth/AuthDialectImpl.java new file mode 100644 index 00000000..ac936a9f --- /dev/null +++ b/mybatis-flex-core/src/test/java/com/mybatisflex/coretest/auth/AuthDialectImpl.java @@ -0,0 +1,34 @@ +package com.mybatisflex.coretest.auth; + +import com.mybatisflex.core.dialect.OperateType; +import com.mybatisflex.core.dialect.impl.CommonsDialectImpl; +import com.mybatisflex.core.query.QueryWrapper; +import com.mybatisflex.core.table.TableInfo; + +import static com.mybatisflex.core.constant.SqlConsts.AND; +import static com.mybatisflex.core.constant.SqlConsts.EQUALS; +import static com.mybatisflex.coretest.table.AccountTableDef.ACCOUNT; + +/** + * 权限处理 + */ +public class AuthDialectImpl extends CommonsDialectImpl { + + @Override + public void prepareAuth(QueryWrapper queryWrapper, OperateType operateType) { + queryWrapper.and(ACCOUNT.INSERT_USER_ID.eq(1)); + super.prepareAuth(queryWrapper, operateType); + } + + @Override + public void prepareAuth(String schema, String tableName, StringBuilder sql, OperateType operateType) { + sql.append(AND).append(wrap("insert_user_id")).append(EQUALS).append(1); + super.prepareAuth(schema, tableName, sql, operateType); + } + + @Override + public void prepareAuth(TableInfo tableInfo, StringBuilder sql, OperateType operateType) { + sql.append(AND).append(wrap("insert_user_id")).append(EQUALS).append(1); + super.prepareAuth(tableInfo, sql, operateType); + } +} From 211ae4cd87f9c8d22ee1e61d4bd79de145fad3cd Mon Sep 17 00:00:00 2001 From: bf109f <13848692+bf109f@user.noreply.gitee.com> Date: Sun, 17 Dec 2023 21:47:03 +0800 Subject: [PATCH 3/4] =?UTF-8?q?=E6=9D=83=E9=99=90=E5=85=A5=E5=8F=A3?= =?UTF-8?q?=E5=8D=95=E5=85=83=E6=B5=8B=E8=AF=95=E4=BF=AE=E6=94=B9=20?= =?UTF-8?q?=E4=BD=BF=E7=94=A8=E5=8D=95=E7=8B=AC=E7=9A=84=E8=A1=A8=E6=B5=8B?= =?UTF-8?q?=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/mybatisflex/coretest/Account.java | 13 ---- .../com/mybatisflex/coretest/AuthTest.java | 69 ++++++++++--------- .../mybatisflex/coretest/LambdaSqlTest.java | 2 - .../coretest/auth/AuthDialectImpl.java | 21 ++++-- .../mybatisflex/coretest/auth/Project.java | 64 +++++++++++++++++ 5 files changed, 116 insertions(+), 53 deletions(-) create mode 100644 mybatis-flex-core/src/test/java/com/mybatisflex/coretest/auth/Project.java diff --git a/mybatis-flex-core/src/test/java/com/mybatisflex/coretest/Account.java b/mybatis-flex-core/src/test/java/com/mybatisflex/coretest/Account.java index 2ba5372e..e8cc1199 100644 --- a/mybatis-flex-core/src/test/java/com/mybatisflex/coretest/Account.java +++ b/mybatis-flex-core/src/test/java/com/mybatisflex/coretest/Account.java @@ -42,11 +42,6 @@ public class Account { @Column(isLogicDelete = true) private Boolean isDelete; - /** - * 创建人 - */ - private String insertUserId; - public Long getId() { return id; @@ -103,12 +98,4 @@ public class Account { public void setDelete(Boolean delete) { isDelete = delete; } - - public String getInsertUserId() { - return insertUserId; - } - - public void setInsertUserId(String insertUserId) { - this.insertUserId = insertUserId; - } } diff --git a/mybatis-flex-core/src/test/java/com/mybatisflex/coretest/AuthTest.java b/mybatis-flex-core/src/test/java/com/mybatisflex/coretest/AuthTest.java index 35f521b9..e636b2f2 100644 --- a/mybatis-flex-core/src/test/java/com/mybatisflex/coretest/AuthTest.java +++ b/mybatis-flex-core/src/test/java/com/mybatisflex/coretest/AuthTest.java @@ -6,12 +6,14 @@ import com.mybatisflex.core.dialect.IDialect; import com.mybatisflex.core.query.QueryWrapper; import com.mybatisflex.core.row.Row; import com.mybatisflex.core.row.RowKey; -import com.mybatisflex.core.row.RowUtil; import com.mybatisflex.core.table.TableInfoFactory; import com.mybatisflex.coretest.auth.AuthDialectImpl; +import com.mybatisflex.coretest.auth.Project; +import com.mybatisflex.coretest.auth.table.ProjectTableDef; import org.junit.Before; import org.junit.Test; +import static com.mybatisflex.coretest.auth.table.ProjectTableDef.PROJECT; import static com.mybatisflex.coretest.table.AccountTableDef.ACCOUNT; /** @@ -32,58 +34,57 @@ public class AuthTest { @Test public void test() { // 1.单个删除 - assert "DELETE FROM `tb_account` WHERE `id` = ? AND `insert_user_id` = 1" - .equals(dialect.forDeleteById(ACCOUNT.getSchema(), ACCOUNT.getTableName(), new String[]{ACCOUNT.ID.getName()})); + assert "DELETE FROM `tb_project` WHERE `id` = ? AND `insert_user_id` = 1" + .equals(dialect.forDeleteById(PROJECT.getSchema(), PROJECT.getTableName(), new String[]{PROJECT.ID.getName()})); // 2.批量删除 - assert "DELETE FROM `tb_account` WHERE `id` = ? AND `insert_user_id` = 1" - .equals(dialect.forDeleteBatchByIds(ACCOUNT.getSchema(), ACCOUNT.getTableName(), new String[]{ACCOUNT.ID.getName()}, new Object[]{1L})); + assert "DELETE FROM `tb_project` WHERE `id` = ? AND `insert_user_id` = 1" + .equals(dialect.forDeleteBatchByIds(PROJECT.getSchema(), PROJECT.getTableName(), new String[]{PROJECT.ID.getName()}, new Object[]{1L})); // 3.查询 QueryWrapper deleteWrapper = - QueryWrapper.create(new Account()).where(ACCOUNT.ID.eq(1)); - assert "DELETE FROM `tb_account` WHERE `id` = ? AND `sex` = ? AND `is_normal` = ? AND `insert_user_id` = ?" + QueryWrapper.create(new Project()).where(PROJECT.ID.eq(1)); + assert "DELETE FROM `tb_project` WHERE `id` = ? AND `insert_user_id` = ?" .equals(dialect.forDeleteByQuery(deleteWrapper)); // 4.更新 - assert "UPDATE `tb_account` SET `age` = ? WHERE `id` = ? AND `insert_user_id` = 1" - .equals(dialect.forUpdateById(ACCOUNT.getSchema(), ACCOUNT.getTableName(), - Row.ofKey(RowKey.AUTO).set(ACCOUNT.AGE, 18))); + assert "UPDATE `tb_project` SET `name` = ? WHERE `id` = ? AND `insert_user_id` = 1" + .equals(dialect.forUpdateById(PROJECT.getSchema(), PROJECT.getTableName(), + Row.ofKey(RowKey.AUTO).set(PROJECT.NAME, "项目"))); // 5.更新 Row row = new Row(); - row.set(ACCOUNT.AGE, 18); + row.set(PROJECT.NAME, "项目"); QueryWrapper updateWrapper = - QueryWrapper.create(new Account()).where(ACCOUNT.ID.eq(1)); - assert "UPDATE `tb_account` SET `age` = ? WHERE `id` = ? AND `sex` = ? AND `is_normal` = ? AND `insert_user_id` = ?" + QueryWrapper.create(new Project()).where(PROJECT.ID.eq(1)); + assert "UPDATE `tb_project` SET `name` = ? WHERE `id` = ? AND `insert_user_id` = ?" .equals(dialect.forUpdateByQuery(updateWrapper, row)); // 6.ID查询 - assert "SELECT * FROM `tb_account` WHERE `id` = ? AND `insert_user_id` = 1" - .equals(dialect.forSelectOneById(ACCOUNT.getSchema(), ACCOUNT.getTableName(), new String[]{ACCOUNT.ID.getName()}, new Object[]{1L})); - QueryWrapper queryWrapper = - QueryWrapper.create().select(ACCOUNT.ALL_COLUMNS).where(ACCOUNT.ID.eq(1)); + assert "SELECT * FROM `tb_project` WHERE `id` = ? AND `insert_user_id` = 1" + .equals(dialect.forSelectOneById(PROJECT.getSchema(), PROJECT.getTableName(), new String[]{PROJECT.ID.getName()}, new Object[]{1L})); + QueryWrapper queryWrapper = QueryWrapper.create(new Project()).where(PROJECT.ID.eq(1)); // 7.query查询 - assert "SELECT * FROM WHERE `id` = ? AND `insert_user_id` = ?" + assert "SELECT `id`, `name`, `insert_user_id`, `is_delete` FROM `tb_project` WHERE `id` = ? AND `insert_user_id` = ?" .equals(dialect.forSelectByQuery(queryWrapper)); // 8.删除 - assert "UPDATE `tb_account` SET `is_delete` = 1 WHERE `id` = ? AND `is_delete` = 0 AND `insert_user_id` = 1" - .equals(dialect.forDeleteEntityById(TableInfoFactory.ofEntityClass(Account.class))); + assert "UPDATE `tb_project` SET `is_delete` = 1 WHERE `id` = ? AND `is_delete` = 0 AND `insert_user_id` = 1" + .equals(dialect.forDeleteEntityById(TableInfoFactory.ofEntityClass(Project.class))); // 9.批量删除 - assert "UPDATE `tb_account` SET `is_delete` = 1 WHERE (`id` = ? ) AND `is_delete` = 0 AND `insert_user_id` = 1" - .equals(dialect.forDeleteEntityBatchByIds(TableInfoFactory.ofEntityClass(Account.class), new String[]{ACCOUNT.ID.getName()})); + assert "UPDATE `tb_project` SET `is_delete` = 1 WHERE (`id` = ? ) AND `is_delete` = 0 AND `insert_user_id` = 1" + .equals(dialect.forDeleteEntityBatchByIds(TableInfoFactory.ofEntityClass(Project.class), new String[]{PROJECT.ID.getName()})); // 10.query删除 - assert "UPDATE `tb_account` SET `is_delete` = 1 WHERE `id` = ? AND `insert_user_id` = ? AND `insert_user_id` = ?" - .equals(dialect.forDeleteEntityBatchByQuery(TableInfoFactory.ofEntityClass(Account.class), queryWrapper)); + assert "UPDATE `tb_project` SET `is_delete` = 1 WHERE `id` = ? AND `insert_user_id` = ? AND `insert_user_id` = ?" + .equals(dialect.forDeleteEntityBatchByQuery(TableInfoFactory.ofEntityClass(Project.class), queryWrapper)); // 11.更新 - Account account = new Account(); - account.setAge(18); - assert "UPDATE `tb_account` SET `sex` = ? , `age` = ? , `is_normal` = ? WHERE `id` = ? AND `is_delete` = 0 AND `insert_user_id` = 1" - .equals(dialect.forUpdateEntity(TableInfoFactory.ofEntityClass(Account.class), account, true)); + Project project = new Project(); + project.setName("项目名称"); + assert "UPDATE `tb_project` SET `name` = ? WHERE `id` = ? AND `is_delete` = 0 AND `insert_user_id` = 1" + .equals(dialect.forUpdateEntity(TableInfoFactory.ofEntityClass(Project.class), project, true)); // 12.更新 - assert "UPDATE `tb_account` SET `sex` = ? , `age` = ? , `is_normal` = ? WHERE `id` = ? AND `insert_user_id` = ? AND `insert_user_id` = ? AND `insert_user_id` = ?" - .equals(dialect.forUpdateEntityByQuery(TableInfoFactory.ofEntityClass(Account.class), account, true, queryWrapper)); + assert "UPDATE `tb_project` SET `name` = ? WHERE `id` = ? AND `insert_user_id` = ? AND `insert_user_id` = ? AND `insert_user_id` = ?" + .equals(dialect.forUpdateEntityByQuery(TableInfoFactory.ofEntityClass(Project.class), project, true, queryWrapper)); // 13.ID查询 - assert "SELECT * FROM `tb_account` WHERE `id` = ? AND `is_delete` = 0 AND `insert_user_id` = 1" - .equals(dialect.forSelectOneEntityById(TableInfoFactory.ofEntityClass(Account.class))); + assert "SELECT * FROM `tb_project` WHERE `id` = ? AND `is_delete` = 0 AND `insert_user_id` = 1" + .equals(dialect.forSelectOneEntityById(TableInfoFactory.ofEntityClass(Project.class))); // 14.查询 - assert "SELECT `id`, `user_name`, `birthday`, `sex`, `age`, `is_normal`, `is_delete`, `insert_user_id` FROM `tb_account` WHERE (`id` = ? ) AND `is_delete` = 0 AND `insert_user_id` = 1" - .equals(dialect.forSelectEntityListByIds(TableInfoFactory.ofEntityClass(Account.class), new String[]{ACCOUNT.ID.getName()})); + assert "SELECT `id`, `name`, `insert_user_id`, `is_delete` FROM `tb_project` WHERE (`id` = ? ) AND `is_delete` = 0 AND `insert_user_id` = 1" + .equals(dialect.forSelectEntityListByIds(TableInfoFactory.ofEntityClass(Project.class), new String[]{PROJECT.ID.getName()})); } @Test diff --git a/mybatis-flex-core/src/test/java/com/mybatisflex/coretest/LambdaSqlTest.java b/mybatis-flex-core/src/test/java/com/mybatisflex/coretest/LambdaSqlTest.java index 1047d91a..c05afe87 100644 --- a/mybatis-flex-core/src/test/java/com/mybatisflex/coretest/LambdaSqlTest.java +++ b/mybatis-flex-core/src/test/java/com/mybatisflex/coretest/LambdaSqlTest.java @@ -111,7 +111,6 @@ public class LambdaSqlTest { " ` ac `.` age `,\n" + " ` ac `.` is_normal `,\n" + " ` ac `.` is_delete `,\n" + - " ` ac `.` insert_user_id `,\n" + " ` ar `.` title `,\n" + " ` ar `.` content `\n" + "FROM\n" + @@ -139,7 +138,6 @@ public class LambdaSqlTest { " ` ac `.` age `,\n" + " ` ac `.` is_normal `,\n" + " ` ac `.` is_delete `,\n" + - " ` ac `.` insert_user_id `,\n" + " ` ar `.*\n" + "FROM\n" + " ` tb_account ` AS ` ac `\n" + diff --git a/mybatis-flex-core/src/test/java/com/mybatisflex/coretest/auth/AuthDialectImpl.java b/mybatis-flex-core/src/test/java/com/mybatisflex/coretest/auth/AuthDialectImpl.java index ac936a9f..f57ca08c 100644 --- a/mybatis-flex-core/src/test/java/com/mybatisflex/coretest/auth/AuthDialectImpl.java +++ b/mybatis-flex-core/src/test/java/com/mybatisflex/coretest/auth/AuthDialectImpl.java @@ -2,12 +2,16 @@ package com.mybatisflex.coretest.auth; import com.mybatisflex.core.dialect.OperateType; import com.mybatisflex.core.dialect.impl.CommonsDialectImpl; +import com.mybatisflex.core.query.CPI; +import com.mybatisflex.core.query.QueryTable; import com.mybatisflex.core.query.QueryWrapper; import com.mybatisflex.core.table.TableInfo; +import java.util.List; + import static com.mybatisflex.core.constant.SqlConsts.AND; import static com.mybatisflex.core.constant.SqlConsts.EQUALS; -import static com.mybatisflex.coretest.table.AccountTableDef.ACCOUNT; +import static com.mybatisflex.coretest.auth.table.ProjectTableDef.PROJECT; /** * 权限处理 @@ -16,19 +20,28 @@ public class AuthDialectImpl extends CommonsDialectImpl { @Override public void prepareAuth(QueryWrapper queryWrapper, OperateType operateType) { - queryWrapper.and(ACCOUNT.INSERT_USER_ID.eq(1)); + List queryTables = CPI.getQueryTables(queryWrapper); + for (QueryTable queryTable : queryTables) { + if (PROJECT.getTableName().equals(queryTable.getName())) { + queryWrapper.and(PROJECT.INSERT_USER_ID.eq(1)); + } + } super.prepareAuth(queryWrapper, operateType); } @Override public void prepareAuth(String schema, String tableName, StringBuilder sql, OperateType operateType) { - sql.append(AND).append(wrap("insert_user_id")).append(EQUALS).append(1); + if (PROJECT.getTableName().equals(tableName)) { + sql.append(AND).append(wrap("insert_user_id")).append(EQUALS).append(1); + } super.prepareAuth(schema, tableName, sql, operateType); } @Override public void prepareAuth(TableInfo tableInfo, StringBuilder sql, OperateType operateType) { - sql.append(AND).append(wrap("insert_user_id")).append(EQUALS).append(1); + if (PROJECT.getTableName().equals(tableInfo.getTableName())) { + sql.append(AND).append(wrap("insert_user_id")).append(EQUALS).append(1); + } super.prepareAuth(tableInfo, sql, operateType); } } diff --git a/mybatis-flex-core/src/test/java/com/mybatisflex/coretest/auth/Project.java b/mybatis-flex-core/src/test/java/com/mybatisflex/coretest/auth/Project.java new file mode 100644 index 00000000..ef18b9ec --- /dev/null +++ b/mybatis-flex-core/src/test/java/com/mybatisflex/coretest/auth/Project.java @@ -0,0 +1,64 @@ +package com.mybatisflex.coretest.auth; + +import com.mybatisflex.annotation.Column; +import com.mybatisflex.annotation.Id; +import com.mybatisflex.annotation.NoneListener; +import com.mybatisflex.annotation.Table; + +/** + * 权限测试类 + * + * @author zhang + * @since 2023-12-17 + */ +@Table(value = "tb_project", onUpdate = NoneListener.class) +public class Project { + + @Id + private Long id; + + /** + * 项目名称 + */ + private String name; + + /** + * 创建人 + */ + private String insertUserId; + + @Column(isLogicDelete = true) + private Boolean isDelete; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getInsertUserId() { + return insertUserId; + } + + public void setInsertUserId(String insertUserId) { + this.insertUserId = insertUserId; + } + + public Boolean getDelete() { + return isDelete; + } + + public void setDelete(Boolean delete) { + isDelete = delete; + } +} From d1fb7207e8aaf785f6717bb62210e0be8b7c37c6 Mon Sep 17 00:00:00 2001 From: bf109f <13848692+bf109f@user.noreply.gitee.com> Date: Sun, 17 Dec 2023 21:50:46 +0800 Subject: [PATCH 4/4] =?UTF-8?q?=E5=8D=95=E5=85=83=E6=B5=8B=E8=AF=95?= =?UTF-8?q?=E7=A9=BA=E6=8C=87=E9=92=88=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/mybatisflex/coretest/auth/AuthDialectImpl.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/mybatis-flex-core/src/test/java/com/mybatisflex/coretest/auth/AuthDialectImpl.java b/mybatis-flex-core/src/test/java/com/mybatisflex/coretest/auth/AuthDialectImpl.java index f57ca08c..7081c796 100644 --- a/mybatis-flex-core/src/test/java/com/mybatisflex/coretest/auth/AuthDialectImpl.java +++ b/mybatis-flex-core/src/test/java/com/mybatisflex/coretest/auth/AuthDialectImpl.java @@ -21,6 +21,9 @@ public class AuthDialectImpl extends CommonsDialectImpl { @Override public void prepareAuth(QueryWrapper queryWrapper, OperateType operateType) { List queryTables = CPI.getQueryTables(queryWrapper); + if (queryTables == null || queryTables.isEmpty()) { + return; + } for (QueryTable queryTable : queryTables) { if (PROJECT.getTableName().equals(queryTable.getName())) { queryWrapper.and(PROJECT.INSERT_USER_ID.eq(1));