# 常见问题

# 如何获取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中的参数

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

# 如何获取上传的文件

利用Request模块

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

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

利用Request模块

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

# 如何打印SQL语句

JdbcTemplate的打印SQL语句方式一样

logging:
  level:
    org:
      springframework:
        jdbc:
          core:
            JdbcTemplate: DEBUG #打印SQL
            StatementCreatorUtils: TRACE  #打印SQL参数
1
2
3
4
5
6
7
8

# 如何给接口添加权限

一般情况采用拦截器实现 在接口选项中添加

{
  "permission" : "sys:user:view"
}
1
2
3

拦截器实现:

@Component
@Order(1)   //拦截器顺序
public class PermissionInterceptor implements RequestInterceptor {

    @Override
    public Object preHandle(ApiInfo info, MagicScriptContext context) {
        // 获取配置的接口选项属性
        Object permissionCode = info.getOptionValue('permission');
        // 执行自己的代码逻辑进行判断是否有权限
        // ....
        if(无权限){
            return new JsonBean<>(-2,"无权访问");
        }
        // 放行
        return null;
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

# 如何给UI添加权限

采用拦截器实现

@Component
public class UIPermissionInterceptor implements RequestInterceptor {
    @Override
    public boolean allowVisit(HttpServletRequest request, Authorization authorization) {
        // 这里可以根据实际情况进行修改
        // 不允许执行删除和保存方法
        return authorization != Authorization.DELETE && authorization != Authorization.SAVE;
    }
}
1
2
3
4
5
6
7
8
9

# 对于UI界面如何使用Token鉴权

目前不可以,请改用Cookie的方式鉴权。

# ${}和#{}的区别

主要区别在于${}用于拼接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})'); 
1
2
3
  • 循环拼接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);
1
2
3
4
5
6
7
8
9

# 多数据源如何配置

编写java代码如下:

@Bean
public DynamicDataSource dynamicDataSource(){
    DynamicDataSource dynamicDataSource = new DynamicDataSource();
    // 设置默认数据源(默认数据源一定要设置,且名称必须是null)
    dynamicDataSource.put(null,ds1);
    dynamicDataSource.put("slave",ds2);
    return dynamicDataSource;
}
1
2
3
4
5
6
7
8

脚本中使用:

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

# 运行时如何动态增删改数据源

需要将DynamicDataSource对象注入进来,通过操作该对象的putdelete等方法进行操作

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

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

# 如何自定义返回结果

  • 通过自定义JSON结果,具体定义方法查看自定义JSON结果
  • 通过自定义拦截器拦截返回自己想要的格式,具体定义方法查看自定义拦截器
  • 通过spring的拦截器返回想要的格式,如ResponseBodyAdviceHandlerMethodReturnValueHandler(这种方式目前会影响到UI,故不推荐使用)