tansci-boot/magic-script-skill/references/faq.md

178 lines
5.9 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 常见问题
## 如何配置JSON日期的格式
使用`Jackson`的配置如下(`Spring Boot`默认使用`Jackson`)
```yaml
spring:
jackson:
time-zone: GMT+8
date-format: yyyy-MM-dd HH:mm:ss
```
## 出现找不到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`中的参数
## 如何获取PathVariable中的参数
脚本中使用`PathVariableName`或`path.xxxx`获取`PathVariable`中的参数
SQL中使用`#{PathVariableName}`或`#{path.xxx}`获取`PathVariable`中的参数
## 如何获取上传的文件
利用Request模块
```javascript
import request;
request.getFile('name');
```
## 如何获取提交的数组参数
利用Request模块
```javascript
import request;
return request.getValues('name');
```
## 如何给接口添加权限
一般情况采用`拦截器`实现。在`接口选项`中配置`permisson`或`role`或自定义选项,随后在拦截器中实现:
```java
@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(无权限){
return new JsonBean<>(403,"无权访问");
}
return null;
}
}
```
## 如何给UI添加权限
请参考[自定义UI鉴权](https://www.ssssssss.org/magic-api/pages/security/operation/)
## ${}和#{}的区别
主要区别在于`${}`用于拼接SQL(会产生SQL注入问题)`#{}`会替换成占位符不会产生SQL注入问题这里的区别与`Mybatis`一致
## 如何循环拼接参数
两种办法:
- `in (#{ids})`的语法会自动对集合参数展开
```javascript
var ids = [1,2,3,4,5,6];
return db.select('select * from sys_user where id in(#{ids})');
//会自动变成select * from sys_user where id in(?,?,?,?,?,?)
```
- 循环拼接SQL
```javascript
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代码如下
```java
@Bean
public MagicDynamicDataSource magicDynamicDataSource(){
MagicDynamicDataSource dynamicDataSource = new MagicDynamicDataSource();
dynamicDataSource.setDefault(ds1);
dynamicDataSource.add("slave",ds2);
return dynamicDataSource;
}
```
脚本中使用:
```javascript
db.select('select * from sys_user'); //使用默认数据源
db.slave.select('select * from sys_user'); //使用slave数据源
```
## SQL执行报错java.sql.SQLFeatureNotSupportedException: null
原因druid版本过低升级至最新版后即可。
## 如何自定义返回结果
- 通过配置文件进行配置,具体参考[spring-boot配置](https://www.ssssssss.org/magic-api/pages/config/spring-boot/)
- 通过`自定义JSON结果`,具体定义方法查看[自定义JSON结果](https://www.ssssssss.org/magic-api/pages/base/response/)
- 通过`自定义拦截器`拦截返回自己想要的格式,具体定义方法查看[自定义拦截器](https://www.ssssssss.org/magic-api/pages/senior/interceptor/)
- 通过`spring`的拦截器返回想要的格式,如`ResponseBodyAdvice``HandlerMethodReturnValueHandler`这种方式目前会影响到UI,故不推荐使用)
## 页面加载缓慢
由于`monaco-editor`编辑器比较大,建议开启压缩静态资源
```yaml
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](https://gitee.com/ssssssss-team/magic-api/issues) 或加群700818216反馈
## 无法DEBUG或无法查看日志
由于`DEBUG`和日志是依赖于`WebSocket`实现的,所以需要`WebSocket`支持。
- 请检查`Web`容器是否支持`WebSocket`,如果不支持需要引入对应依赖或更换支持`WebSocket`的`Web`容器
- 请检查是否使用了`nginx`之类的代理,如果使用了,需要对配置其支持`WebSocket`,样例如下:
```nginx
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可以这么写
```javascript
var sql = """
insert into img_table(img)
values(#{img::sql('blob')})
""";
```