magic-api magic-api
首页
  • 快速入门
  • 基础教程
  • 权限配置
  • 高级应用
  • 开发插件
  • 模块
  • 函数
  • 扩展
  • Gitee (opens new window)
  • Github (opens new window)
  • 演示 (opens new window)
  • SpringBoot配置
  • 编辑器配置
  • 2.x更新日志
  • 1.x更新日志
  • 0.x更新日志
常见问题
💖支持
交流群
首页
  • 快速入门
  • 基础教程
  • 权限配置
  • 高级应用
  • 开发插件
  • 模块
  • 函数
  • 扩展
  • Gitee (opens new window)
  • Github (opens new window)
  • 演示 (opens new window)
  • SpringBoot配置
  • 编辑器配置
  • 2.x更新日志
  • 1.x更新日志
  • 0.x更新日志
常见问题
💖支持
交流群
  • 2.x版本更新日志
  • 1.x版本更新日志
  • 0.x版本更新日志
  • 常见问题
    • 赞助支持
    • 交流群
    • 其它
    mxd
    2022-01-30
    目录

    常见问题

    # 如何配置JSON日期的格式

    使用Jackson的配置如下(Spring Boot默认使用Jackson):

    spring:
      jackson:
        time-zone: GMT+8
        date-format: yyyy-MM-dd HH:mm:ss
    

    对于LocalDateTime配置

    @Bean 
    public Jackson2ObjectMapperBuilderCustomizer jackson2ObjectMapperBuilderCustomizer() {
        LocalDateTimeSerializer localDateTimeSerializer = new LocalDateTimeSerializer(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
        return builder -> builder.serializerByType(LocalDateTime.class, localDateTimeSerializer); 
    }
    

    其它的自行参考json框架配置

    # 出现找不到db模块的错误

    目前已知两种情况:

    • 未配置数据源
    • 未引用spring-boot-starter-jdbc

    # 如何获取RequestBody中的参数

    脚本中使用body.xxx获取RequestBody中的参数 SQL中使用#{body.xxx}或${body.xxx}获取RequestBody中的参数

    # 如何获取Header中的参数

    脚本中使用header.xxx获取Header中的参数 SQL中使用#{header.xxx}或${header.xxx}获取Header中的参数

    # 如何获取Cookie中的参数

    脚本使用cookie.xxx获取Cookie中的参数 SQL中使用#{cookie.xxx}或${cookie.xxx}获取Cookie中的参数

    # 如何获取Session中的参数

    脚本中使用session.xxx获取Session中的参数 SQL中使用#{session.xxx}或{session.xxx}获取Session中的参数

    # 如何获取PathVariable中的参数

    脚本中使用PathVariableName或path.xxxx获取PathVariable中的参数 SQL中使用#{PathVariableName}或#{path.xxx}获取PathVariable中的参数

    # 如何获取上传的文件

    利用Request模块

    import request;
    request.getFile('name');
    

    # 如何获取提交的数组参数

    利用Request模块

    import request;
    return request.getValues('name');
    

    # 如何给接口添加权限

    一般情况采用拦截器实现 在接口选项中配置permisson或role或自定义选项 随后在拦截器实现:

    @Component
    @Order(1)   //拦截器顺序
    public class PermissionInterceptor implements RequestInterceptor {
    
        @Override
        public Object preHandle(ApiInfo info, MagicScriptContext context, MagicHttpServletRequest request, MagicHttpServletResponse response) {
            // 获取配置的接口选项属性
            String permissionCode = info.getOptionValue(Options.PERMISSION);
            // 执行自己的代码逻辑进行判断是否有权限
            // ....
            if(无权限){
            	// 需要注意的是,拦截器返回的不会走ResultProvider。
                return new JsonBean<>(403,"无权访问");
            }
            // 放行
            return null;
        }
    }
    

    # 如何给UI添加权限

    请参考自定义UI鉴权

    # ${}和#{}的区别

    主要区别在于${}用于拼接SQL(会产生SQL注入问题),#{}会替换成占位符(不会产生SQL注入问题),这里的区别与Mybatis一致

    # 如何循环拼接参数

    两种办法:

    • in (#{ids})的语法会自动对集合参数展开
    var ids = [1,2,3,4,5,6];
    //会自动变成select * from sys_user where id in(?,?,?,?,?,?)
    return db.select('select * from sys_user where id in(#{ids})'); 
    
    • 循环拼接SQL
    var list = [1,2,3,4,5];
    var sql = "select * from sys_user where ";
    for(index,item in list){
        sql = sql + 'id = #{list['+index+']}';
        if(index + 1 < list.size()){
            sql = sql + ' or ';
        }   
    }
    return db.select(sql);
    

    # 多数据源如何配置

    编写java代码如下:

    @Bean
    public MagicDynamicDataSource magicDynamicDataSource(){
        MagicDynamicDataSource dynamicDataSource = new MagicDynamicDataSource();
        // 设置默认数据源(默认数据源一定要设置)
        dynamicDataSource.setDefault(ds1);
        dynamicDataSource.add("slave",ds2);
        return dynamicDataSource;
    }
    

    脚本中使用:

    db.select('select * from sys_user');  //使用默认数据源
    db.slave.select('select * from sys_user');  //使用slave数据源
    

    # SQL执行报错java.sql.SQLFeatureNotSupportedException: null

    原因:druid版本过低,升级至最新版后即可

    # 如何自定义返回结果

    • 通过配置文件进行配置,具体参考spring-boot配置
    • 通过自定义JSON结果,具体定义方法查看自定义JSON结果
    • 通过自定义拦截器拦截返回自己想要的格式,具体定义方法查看自定义拦截器
    • 通过spring的拦截器返回想要的格式,如ResponseBodyAdvice,HandlerMethodReturnValueHandler(这种方式目前会影响到UI,故不推荐使用)

    # 页面加载缓慢

    由于monaco-editor编辑器比较大,建议开启压缩静态资源

    server.compression.enabled=true #启用压缩
    server.compression.min-response-size=256 #大于256kb时压缩
    

    # 脚本内容被转义

    出现这种情况,请检查自身项目是否有XSS一类的过滤器,需要把UI界面对应的后台接口排除掉即可

    # 执行测试无响应

    目前已知有两种情况

    • 使用了Spring Boot 2.3.5版本,升级至2.3.6解决
    • 使用了nginx代理,加一条配置proxy_buffering off;解决

    # 访问UI404

    • 请检查访问路径是否正确
    • 请检查magic-editor包是否被引入
    • 如果是拉源码运行,则需要编译一下前端。
    • 如果以上确定没问题,请检查应用中是否有关于mvc的配置,如果有请检查是否是extends WebMvcConfigurationSupport的形式,是的话,改成implements WebMvcConfigurer的形式。
    • 如以上问题均不存在,请提ISSUE (opens new window) 或加群700818216 (opens new window)反馈

    # 无法DEBUG或无法查看日志

    • 由于DEBUG和日志是依赖于WebSocket实现的,所以需要WebSocket支持
    • 请检查Web容器是否支持WebSocket,如果不支持,需要引入对应依赖或更换支持WebSocket的Web容器
    • 请检查是否使用了nginx之类的代理,如果使用了,需要对配置其支持WebSocket,样例如下:
    location /magic/web/console {
        proxy_pass http://localhost:9999;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_read_timeout 900s;
    }
    

    # 保存图片(Blob)数据到数据库

    ​ 假设将图片的二进制数据传输到body.img中, sql可以这么写

    var sql = """
    	insert into img_table(
        	img 
        )
    	values(
        	#{img::sql('blob')}
        )
    """;
    

    ​ ::sql用法参考 类型转换

    上次更新: 2023-04-16 02:27:32
    0.x版本更新日志
    赞助支持

    ← 0.x版本更新日志 赞助支持→

    Theme by Vdoing | Copyright © 2020-2023 ssssssss.org | MIT License
    • 跟随系统
    • 浅色模式
    • 深色模式
    • 阅读模式
    ×