当前位置: 首页 > news >正文

重庆沙坪坝企业网站建设联系电话搜索引擎优化的报告

重庆沙坪坝企业网站建设联系电话,搜索引擎优化的报告,网站地图制作怎么做,建筑公司网站设计功能实现 ‍ 规则转换为 SQL 片段‍ 规则解析 首先我们来构造一个典型的规则,包括两个条件组,每个组由两个条件组成,由且与或两种逻辑关系,如下图: 然后看看生成的规则,如下: {"filt…

功能实现

规则转换为 SQL 片段‍

规则解析

首先我们来构造一个典型的规则,包括两个条件组,每个组由两个条件组成,由且与或两种逻辑关系,如下图:

然后看看生成的规则,如下:

{"filters": [{"conditions": [{"property": "paramName","value": "1"},{"operator": "contains","property": "paramKey","value": "password"}],"logicalOperator": "and"},{"conditions": [{"property": "paramValue","value": "1"},{"operator": "empty","property": "orderNo"}],"logicalOperator": "or"}],"logicalOperator": "and"
}

最后,分析其数据结构,可以分成三层。

  1. 最外层是一个对象,由两个属性组成,一是 filters,条件组集合;二是 logicalOperator,逻辑关系(and或者or)。
  2. filter 对象自身,同样由两个属性组成,一是 conditions,条件集合;;二是 logicalOperator,逻辑关系。
  3. condition 对象,由三个属性组成,一是 property,属性;二是 operator,操作符;三是 value,值。若为相等操作,则操作符属性可省略。


同时,对于数值类,日期类,可能进行区间查询,筛选器生成的规则中,condition 对象仍有三个属性组成不变,只是 value 值变成了一个两元素的数组,如:

{"operator":"between","property":"age","value":[18,60]}

对象构建

我们在视图对象层 vo 中创建规则对应的数据对象,遵循由内到外的方式来构建。
首先是最内层的筛选条件,属性和操作符是固化的,值可能是单元素,也可能为数组,类型可能是字符串,也可能是数值。对于前端 js,属于非强类型语言,可以灵活设置,但对于后端强类型的 java,需要将其设置为 Object 类型,进行二次解析。

package tech.abc.platform.entityconfig.vo;import lombok.Data;/*** 数据筛选条件** @author wqliu* @date 2024-08-06*/
@Data
public class DataFilterConditionVO {/*** 属性*/private String property;/*** 操作*/private String operator;/*** 值*/private Object value;}

然后是中间层,数据筛选组,如下:

package tech.abc.platform.entityconfig.vo;import lombok.Data;import java.util.List;/*** 数据筛选组** @author wqliu* @date 2024-08-06*/
@Data
public class DataFilterGroupVO {/*** 数据筛选条件集合*/private List<DataFilterConditionVO> conditions;/*** 逻辑操作*/private String logicalOperator;
}

最后是最外层的规则,如下:

package tech.abc.platform.entityconfig.vo;import lombok.Data;import java.util.List;/*** 数据筛选规则** @author wqliu* @date 2024-08-06*/
@Data
public class DataFilterRuleVO {/*** 数据筛选组集合*/private List<DataFilterGroupVO> filters;/*** 逻辑操作*/private String logicalOperator;
}

数据传递

在规则配置页面,再加一个按钮,将规则传给后端,如下:

前端代码如下:

    // 生成SQL片段generateSqlPart() {// 先调用一次生成规则,避免配置调整了规则未同步this.generateRule()// 调用后端服务转换this.api.generateSqlPart(this.entityData.modelId, this.entityData.rule).then((res) => {this.entityData.sqlPart = res.data})}
// 实体模型数据权限
export const entityModelDataPermission = Object.assign({}, COMMON_METHOD, {serveUrl: '/' + moduleName + '/' + 'entityModelDataPermission' + '/',// 获取实体模型完整属性列表getOrInit(modelId) {return request.get({ url: this.serveUrl + 'getOrInit', params: { modelId } })},// 生成sql片段generateSqlPart(entityModelId, rule) {return request.post({ url: this.serveUrl + entityModelId + '/generateSqlPart', data: rule })}
})

后端控制器如下:

    /*** 生成SQL片段*/@PostMapping("/{id}/generateSqlPart")@SystemLog(value = "实体模型数据权限-生成SQL片段")@PreAuthorize("hasPermission(null,'entityconfig:entityModelDataPermission:generateSqlPart')")public ResponseEntity<Result> generateSqlPart(@PathVariable("id") String id, @RequestBody String rule) {String sqlPart = entityModelDataPermissionService.generateSqlPart(id, rule);return ResultUtil.success(sqlPart);}

我们尝试使用 FastJson,将字符串解析成对象,后端服务如下:

 @Overridepublic String generateSqlPart(String id, String rule) {DataFilterRuleVO dataFilterRule = JSON.parseObject(rule, DataFilterRuleVO.class);return "";}

进入调试模式,查看数据,已完成解析工作,如下:

转换处理

接下来,我们开始最复杂的转换处理,同样遵循由简单到复杂的情况。
首先,最简单的,只有一个逻辑组,组中只有一个条件,如下:

转换方法如下:

   @Overridepublic String generateSqlPart(String id, String rule) {String result = "";// 转换数据DataFilterRuleVO dataFilterRule = JSON.parseObject(rule, DataFilterRuleVO.class);// 获取组集合List<DataFilterGroupVO> dataFilterGroupList = dataFilterRule.getFilters();// 遍历组集合for (DataFilterGroupVO dataFilterGroup : dataFilterGroupList) {// 获取条件集合List<DataFilterConditionVO> conditionList = dataFilterGroup.getConditions();// 遍历条件集合for (DataFilterConditionVO condition : conditionList) {// 获取字段名,命名风格驼峰转换成下划线String fieldName = CommonUtil.camelToUnderline(condition.getProperty());// 获取操作String operator = condition.getOperator();if (StringUtils.isEmpty(operator)) {operator = "=";}Object value = condition.getValue();result = fieldName + " " + operator + " '" + value + "'";}}return result;}

转换结果:

可以看到,输出了预期的 sql 片段。‍

启用数据权限组件

调整 Mybatisplus 的插件配置,增加数据权限插件,如下图所示:

注意,数据权限插件是后期新增的功能,要求 mybatisplus 的版本不能太低,建议 mybatis-plus-boot-starter 的版本使用 3.5.4。

其中数据权限处理器,需要自行实现,如下:

package tech.abc.platform.framework.extension;import com.baomidou.mybatisplus.extension.plugins.handler.MultiDataPermissionHandler;
import lombok.extern.slf4j.Slf4j;
import net.sf.jsqlparser.JSQLParserException;
import net.sf.jsqlparser.expression.Expression;
import net.sf.jsqlparser.parser.CCJSqlParserUtil;
import net.sf.jsqlparser.schema.Table;
import org.apache.commons.lang3.StringUtils;
import tech.abc.platform.common.exception.SessionExpiredException;
import tech.abc.platform.common.utils.SpringUtil;
import tech.abc.platform.common.utils.UserUtil;
import tech.abc.platform.entityconfig.service.EntityModelDataPermissionService;/*** 数据权限处理器** @author wqliu* @date 2024-08-03*/
@Slf4j
public class MyDataPermissionHandler implements MultiDataPermissionHandler {/*** 数据权限配置表名称*/public static final String DATA_PERMISSION_CONFIG_TABLE_NAME = "cfg_entity_model_data_permission";@Overridepublic Expression getSqlSegment(Table table, Expression where, String mappedStatementId) {// 数据权限相关的 SQL 片段String tableName = table.getName();// 排除数据权限配置表,否则会导致死循环if (tableName.equals(DATA_PERMISSION_CONFIG_TABLE_NAME)) {return null;}// 获取数据权限 SQL 片段EntityModelDataPermissionService entityModelDataPermissionService = SpringUtil.getBean(EntityModelDataPermissionService.class);String sqlSegment = entityModelDataPermissionService.getDataPermissionSqlPart(tableName);if (sqlSegment != null) {String userId = "";// 登录阶段,获取不到当前用户信息,视为不做数据权限过滤try {userId = UserUtil.getId();} catch (SessionExpiredException e) {return null;}sqlSegment = StringUtils.replace(sqlSegment, "{@CurrentUserId@}", userId);try {return CCJSqlParserUtil.parseCondExpression(sqlSegment);} catch (JSQLParserException e) {log.error("数据权限 SQL 片段解析失败", e);return null;}} else {return null;}}
}

这里有几个需要特别注意的点:

  1. 需要将数据权限配置表排除,否则会导致死循环引发堆栈溢出。
  2. 通过平台的工具类 UserUtil 来获取到当前用户信息,但在系统登录环节,尚未完成认证,会抛出会话超时异常,同样需要忽略,否则会影响正常系统登录。
  3. 在本环节中,可以将平台约定预置的运行期变量,如当前用户标识、当前用户所在部门等,替换为真实的运行数据,如 sqlSegment = StringUtils.replace(sqlSegment, “{@CurrentUserId@}”, userId);

查看效果

访问平台的系统参数菜单,执行查询操作,如下图:

可以看到,数据权限过滤已经发挥了作用,控制台打印输出的 sql,无论是获取分页的 sql,还是最终执行的 sql,都自动追加了数据权限过滤的 SQL 片段,如下:

==>  Preparing: SELECT COUNT(*) AS total FROM sys_param WHERE delete_flag = 'NO' AND param_value = '10'
==> Parameters: 
<==    Columns: total
<==        Row: 2
<==      Total: 1
==>  Preparing: SELECT id, param_name, param_key, param_value, order_no, delete_flag, create_id, create_time, update_id, update_time, version FROM sys_param WHERE delete_flag = 'NO' AND param_value = '10' ORDER BY order_no ASC LIMIT ?
==> Parameters: 10(Long)
<==    Columns: id, param_name, param_key, param_value, order_no, delete_flag, create_id, create_time, update_id, update_time, version
<==        Row: 1158917826028863489, 用户登录最多输错次数, PASSWORD_INPUT_ERROR_TIMES, 10, 004, NO, 1, 2019-08-07 09:48:36, 1, 2020-08-26 03:21:29, 5
<==        Row: 1158917976734400513, 账号锁定自动解锁时间间隔(分), ACCOUNT_UNLOCK_INTERVAL, 10, 005, NO, 1, 2019-08-07 09:49:12, , 2023-03-24 10:47:21, 3
<==      Total: 2

小结

至此,已完成了数据权限的整体框架开发,但也只是框架,各环节还有大量的工作需要完善,主要包括以下几点:

  1. 配置规则时需要增加用户、部门、角色等维度
  2. 将数据筛选器生成的各种场景下的复杂规则转换为 SQL 片段
  3. 读取平台运行时变量,替换掉预置的用户、部门等占位符

开源平台资料

平台名称:一二三开发平台
简介: 企业级通用开发平台
设计资料:[csdn专栏]
开源地址:[Gitee]
开源协议:MIT
如果您在阅读本文时获得了帮助或受到了启发,希望您能够喜欢并收藏这篇文章,为它点赞~
请在评论区与我分享您的想法和心得,一起交流学习,不断进步,遇见更加优秀的自己!

http://www.hkea.cn/news/643220/

相关文章:

  • 淘宝网网站建设的需求分析百度会员登录入口
  • 建网站的专业公司推广网站多少钱
  • 网站不去公安局备案自己怎么搭建网站
  • 外贸网站建设入门深圳网络推广哪家
  • 网站模板资源公司网站推广
  • 广东省建设教育协会官方网站首页html简单网页代码
  • 个人网站意义阿里指数官网最新版本
  • 网站开发方式有哪四种搜索引擎优化课程总结
  • 申请做网站、论坛版主app推广接单
  • 青海网站建设广州seo优化推广
  • 物流公司网站制作模板上海网站关键词排名
  • 广西建设人才网搜索引擎优化的目标
  • 比汉斯设计网站素材图片搜索识图入口
  • php网站架设教程英雄联盟韩国
  • 做毕设好的网站百度客服电话24小时
  • 上海手机网站建设电话咨询seo综合查询系统
  • wordpress 4.6 中文版沈阳seo
  • 文件管理软件天津搜索引擎优化
  • 九亭网站建设全国疫情高峰时间表最新
  • 青岛网站建设公司武汉seo收费
  • mvc网站建设的实验报告怎么做优化
  • 有官网建手机网站千锋教育培训多少钱费用
  • b2c交易模式的网站有哪些百度营销客户端
  • flash 学习网站重庆网站seo多少钱
  • 年终总结ppt模板免费下载网站小红书seo排名规则
  • 自己架设网站口碑营销的产品有哪些
  • 湖北省网站备案最快几天天津百度推广排名优化
  • app在线开发制作平台seo网络优化前景怎么样
  • 商务网站的基本情况网站建设工作总结
  • 山西建设厅网站网络销售怎么聊客户