GF_FILTER = field -> {
+ if (field instanceof EasyField) {
+ DisplayType dt = ((EasyField) field).getDisplayType();
+ return !(dt == DisplayType.TEXT
+ || dt == DisplayType.DATE || dt == DisplayType.DATETIME
+ || dt == DisplayType.CLASSIFICATION || dt == DisplayType.REFERENCE);
+ }
+ return false;
+ };
+
+ // type = type+REF
+ private static void paddingType2(JSONArray fields, Entity entity) {
+ for (Object o : fields) {
+ JSONObject item = (JSONObject) o;
+ String type = item.getString("type");
+ if (DisplayType.REFERENCE.name().equals(type)) {
+ String type2 = type + ":" + item.getJSONArray("ref").get(0);
+ item.put("type", type2);
+ } else if (DisplayType.CLASSIFICATION.name().equals(type)) {
+ Field clazz = MetadataHelper.getLastJoinField(entity, item.getString("name"));
+ String type2 = type + ":" + EasyMetaFactory.valueOf(clazz).getExtraAttr(EasyFieldConfigProps.CLASSIFICATION_USE);
+ item.put("type", type2);
+ }
}
- return build;
}
}
diff --git a/src/main/java/com/rebuild/web/robot/trigger/TriggerAdminController.java b/src/main/java/com/rebuild/web/robot/trigger/TriggerAdminController.java
index f295dcd91..5932962cd 100644
--- a/src/main/java/com/rebuild/web/robot/trigger/TriggerAdminController.java
+++ b/src/main/java/com/rebuild/web/robot/trigger/TriggerAdminController.java
@@ -21,7 +21,6 @@ import com.rebuild.core.metadata.easymeta.EasyMetaFactory;
import com.rebuild.core.service.trigger.ActionFactory;
import com.rebuild.core.service.trigger.ActionType;
import com.rebuild.core.service.trigger.TriggerAction;
-import com.rebuild.core.support.CommonsLock;
import com.rebuild.core.support.License;
import com.rebuild.core.support.i18n.Language;
import com.rebuild.utils.JSONUtils;
@@ -58,7 +57,7 @@ public class TriggerAdminController extends BaseController {
HttpServletResponse response) throws IOException {
ID configId = ID.valueOf(id);
Object[] config = Application.createQuery(
- "select belongEntity,actionType,when,whenFilter,actionContent,priority,name,whenTimer from RobotTriggerConfig where configId = ?")
+ "select belongEntity,actionType,when,whenFilter,actionContent,priority,name,whenTimer,isDisabled from RobotTriggerConfig where configId = ?")
.setParameter(1, configId)
.unique();
if (config == null) {
@@ -87,7 +86,7 @@ public class TriggerAdminController extends BaseController {
mv.getModel().put("actionContent", config[4]);
mv.getModel().put("priority", config[5]);
mv.getModel().put("name", config[6]);
- mv.getModel().put("lockedUser", JSON.toJSONString(CommonsLock.getLockedUserFormat(configId)));
+ mv.getModel().put("isDisabled", config[8] == null ? false : config[8]);
return mv;
}
@@ -119,22 +118,28 @@ public class TriggerAdminController extends BaseController {
public Object[][] triggerList(HttpServletRequest request) {
String belongEntity = getParameter(request, "entity");
String q = getParameter(request, "q");
- String sql = "select configId,belongEntity,belongEntity,name,isDisabled,modifiedOn,when,actionType,configId,priority,actionContent from RobotTriggerConfig" +
+ String sql = "select configId,belongEntity,belongEntity,name,isDisabled,modifiedOn,when,actionType,priority,actionContent from RobotTriggerConfig" +
" where (1=1) and (2=2)" +
" order by modifiedOn desc, name";
Object[][] array = ConfigCommons.queryListOfConfig(sql, belongEntity, q);
for (Object[] o : array) {
o[7] = Language.L(ActionType.valueOf((String) o[7]));
- o[8] = CommonsLock.getLockedUserFormat((ID) o[8]);
-
// 目标实体
- o[10] = tryParseTargetEntity((String) o[10], (String) o[1]);
+ o[9] = tryParseTargetEntity((String) o[9], (String) o[1], true);
}
return array;
}
- private String tryParseTargetEntity(String config, String sourceEntity) {
+ /**
+ * 尝试解析目标实体
+ *
+ * @param config
+ * @param sourceEntity
+ * @param useLabel
+ * @return
+ */
+ public static String tryParseTargetEntity(String config, String sourceEntity, boolean useLabel) {
if (!JSONUtils.wellFormat(config)) return null;
JSONObject configJson = JSON.parseObject(config);
@@ -145,9 +150,9 @@ public class TriggerAdminController extends BaseController {
else if (targetEntity.contains(".")) targetEntity = targetEntity.split("\\.")[1];
if (MetadataHelper.containsEntity(targetEntity)) {
- return EasyMetaFactory.getLabel(targetEntity);
+ return useLabel ? EasyMetaFactory.getLabel(targetEntity) : targetEntity;
} else {
- return String.format("[%s]", targetEntity.toUpperCase());
+ return useLabel ? String.format("[%s]", targetEntity.toUpperCase()) : null;
}
}
@@ -162,9 +167,9 @@ public class TriggerAdminController extends BaseController {
targetEntity = cb.getString("target");
if (MetadataHelper.containsEntity(targetEntity)) {
- return EasyMetaFactory.getLabel(targetEntity);
+ return useLabel ? EasyMetaFactory.getLabel(targetEntity) : targetEntity;
} else {
- return String.format("[%s]", targetEntity.toUpperCase());
+ return useLabel ? String.format("[%s]", targetEntity.toUpperCase()) : null;
}
}
diff --git a/src/main/java/com/rebuild/web/user/signup/SignUpController.java b/src/main/java/com/rebuild/web/user/signup/SignUpController.java
index 34df8c156..2b5276ab4 100644
--- a/src/main/java/com/rebuild/web/user/signup/SignUpController.java
+++ b/src/main/java/com/rebuild/web/user/signup/SignUpController.java
@@ -52,14 +52,16 @@ import java.io.IOException;
@RequestMapping("/user/")
public class SignUpController extends BaseController {
+ private static final Object RRL_LOCK = new Object();
+
// 基于邮箱的限流
- private static final RequestRateLimiter RRL_EMAIL = RateLimiters.createRateLimiter(
+ private static final RequestRateLimiter RRL_4EMAIL = RateLimiters.createRateLimiter(
new int[] { 60, 600, 3600 },
- new int[] { 3, 5, 10 });
+ new int[] { 2, 6, 12 });
// 基于IP的限流
- private static final RequestRateLimiter RRL_IP = RateLimiters.createRateLimiter(
+ private static final RequestRateLimiter RRL_4IP = RateLimiters.createRateLimiter(
new int[] { 60, 600, 3600 },
- new int[] { 15, 50, 100 });
+ new int[] { 20, 60, 120 });
// 注册
@@ -86,12 +88,14 @@ public class SignUpController extends BaseController {
return RespBody.errorl("邮箱已存在");
}
- if (RRL_EMAIL.overLimitWhenIncremented("email:" + email)) {
- throw new DefinedException(Language.L("请求过于频繁,请稍后重试"));
- }
- String remoteIp = ServletUtils.getRemoteAddr(request);
- if (RRL_IP.overLimitWhenIncremented("ip:" + remoteIp)) {
- throw new DefinedException(Language.L("请求过于频繁,请稍后重试"));
+ synchronized (RRL_LOCK) {
+ if (RRL_4EMAIL.overLimitWhenIncremented("email:" + email)) {
+ throw new DefinedException(Language.L("请求过于频繁,请稍后重试"));
+ }
+ String remoteIp = ServletUtils.getRemoteAddr(request);
+ if (RRL_4IP.overLimitWhenIncremented("ip:" + remoteIp)) {
+ throw new DefinedException(Language.L("请求过于频繁,请稍后重试"));
+ }
}
String vcode = VerfiyCode.generate(email, 1);
@@ -109,6 +113,10 @@ public class SignUpController extends BaseController {
@PostMapping("signup-confirm")
public RespBody signupConfirm(HttpServletRequest request) {
+ if (!RebuildConfiguration.getBool(ConfigurationItem.OpenSignUp)) {
+ return RespBody.errorl("管理员未开放公开注册");
+ }
+
JSONObject data = (JSONObject) ServletUtils.getRequestJson(request);
String email = data.getString("email");
@@ -188,8 +196,10 @@ public class SignUpController extends BaseController {
return RespBody.errorl("无效邮箱地址");
}
- if (RRL_EMAIL.overLimitWhenIncremented("email:" + email)) {
- throw new DefinedException(Language.L("请求过于频繁,请稍后重试"));
+ synchronized (RRL_LOCK) {
+ if (RRL_4EMAIL.overLimitWhenIncremented("email:" + email)) {
+ throw new DefinedException(Language.L("请求过于频繁,请稍后重试"));
+ }
}
String vcode = VerfiyCode.generate(email, 2);
diff --git a/src/main/resources/application-bean.xml b/src/main/resources/application-bean.xml
index c80e45e2e..c71b27893 100644
--- a/src/main/resources/application-bean.xml
+++ b/src/main/resources/application-bean.xml
@@ -29,6 +29,9 @@
+
+
+
diff --git a/src/main/resources/application-dev.yml b/src/main/resources/application-dev.yml
index 218ba2295..ad286d64c 100644
--- a/src/main/resources/application-dev.yml
+++ b/src/main/resources/application-dev.yml
@@ -28,4 +28,3 @@ rebuild:
server.servlet.context-path: /rebuild
spring.thymeleaf.cache: false
spring.main.banner-mode: console
-spring.devtools.restart.trigger-file: .trigger
diff --git a/src/main/resources/i18n/lang.zh_CN.json b/src/main/resources/i18n/lang.zh_CN.json
index 3df91be92..05c03579b 100644
--- a/src/main/resources/i18n/lang.zh_CN.json
+++ b/src/main/resources/i18n/lang.zh_CN.json
@@ -711,7 +711,7 @@
"密码":"密码",
"密码不能小于 6 位":"密码不能小于 6 位",
"密码不能小于 6 位,且必须包含数字和大小写字母":"密码不能小于 6 位,且必须包含数字和大小写字母",
- "密码不能小于 8 位,且必须包含数字和大小写字母及特殊字符":"密码不能小于 8 位,且必须包含数字和大小写字母及特殊字符",
+ "密码不能小于 10 位,且必须包含数字和大小写字母及特殊字符":"密码不能小于 10 位,且必须包含数字和大小写字母及特殊字符",
"密码将重置为 **%s** 是否确认?":"密码将重置为 **%s** 是否确认?",
"密码错误":"密码错误",
"对比图":"对比图",
@@ -875,7 +875,7 @@
"操作内容":"操作内容",
"操作失败,请稍后重试":"操作失败,请稍后重试",
"操作成功":"操作成功",
- "支持 Excel 或 CSV 文件,文件格式请 [参考文档](https://getrebuild.com/docs/admin/entity/field-classification#%E5%88%86%E7%B1%BB%E6%95%B0%E6%8D%AE)":"支持 Excel 或 CSV 文件,文件格式请 [参考文档](https://getrebuild.com/docs/admin/entity/field-classification#%E5%88%86%E7%B1%BB%E6%95%B0%E6%8D%AE)",
+ "支持 Excel 或 CSV 文件,文件格式请 [参考文档](https://getrebuild.com/docs/admin/entity/field-classification#%E4%BB%8E%E6%96%87%E4%BB%B6%E5%AF%BC%E5%85%A5)":"支持 Excel 或 CSV 文件,文件格式请 [参考文档](https://getrebuild.com/docs/admin/entity/field-classification#%E4%BB%8E%E6%96%87%E4%BB%B6%E5%AF%BC%E5%85%A5)",
"支持 MySQL 5.6 或以上版本":"支持 MySQL 5.6 或以上版本",
"支持 Redis 3.2 或以上版本":"支持 Redis 3.2 或以上版本",
"支持内置变量,内置变量包括 `{YYYYMMDD}` (年月日) `{HHIISS}` (时分秒) `{0000}` (自增数字)":"支持内置变量,内置变量包括 `{YYYYMMDD}` (年月日) `{HHIISS}` (时分秒) `{0000}` (自增数字)",
@@ -1445,7 +1445,6 @@
"请至少选择 1 个显示列":"请至少选择 1 个显示列",
"请设置条件":"请设置条件",
"请赋予用户除管理员权限以外的所有权限":"请赋予用户除管理员权限以外的所有权限",
- "请输入 %s":"请输入 %s",
"请输入任务标题":"请输入任务标题",
"请输入分类名称":"请输入分类名称",
"请输入动态内容":"请输入动态内容",
@@ -1473,7 +1472,6 @@
"请输入面板名称":"请输入面板名称",
"请输入项目名称":"请输入项目名称",
"请输入验证码":"请输入验证码",
- "请选择 %s":"请选择 %s",
"请选择 %s 的源字段":"请选择 %s 的源字段",
"请选择%s给谁":"请选择%s给谁",
"请选择主实体":"请选择主实体",
@@ -1508,7 +1506,7 @@
"读取":"读取",
"谁可以发起这个审批":"谁可以发起这个审批",
"调用成功":"调用成功",
- "调用量 (30 天)":"调用量 (30 天)",
+ "调用量 (90 天)":"调用量 (90 天)",
"负责人拥有对任务的管理权限":"负责人拥有对任务的管理权限",
"赛邮 SUBMAIL":"赛邮 SUBMAIL",
"赞":"赞",
@@ -1664,7 +1662,7 @@
"验证码已发送至你的邮箱":"验证码已发送至你的邮箱",
"验证码无效":"验证码无效",
"验证码错误":"验证码错误",
- "高 (最低8位,必须同时包含数字、字母、特殊字符)":"高 (最低8位,必须同时包含数字、字母、特殊字符)",
+ "高 (最低10位,必须同时包含数字、字母、特殊字符)":"高 (最低10位,必须同时包含数字、字母、特殊字符)",
"高级功能":"高级功能",
"高级控制":"高级控制",
"高级查询":"高级查询",
@@ -2727,5 +2725,112 @@
"系统即将开始维护,暂时禁止登录":"系统即将开始维护,暂时禁止登录",
"本月..":"本月..",
"指定..天":"指定..天",
- "本周..":"本周.."
+ "本周..":"本周..",
+ "永久":"永久",
+ "同步更新":"同步更新",
+ "查看位置":"查看位置",
+ "内容粗体":"内容粗体",
+ "执行内容/结果":"执行内容/结果",
+ "批量审批完成。成功 %d 条,失败 %d 条":"批量审批完成。成功 %d 条,失败 %d 条",
+ "无法获取位置":"无法获取位置",
+ "客户端不支持":"客户端不支持",
+ "同步删除":"同步删除",
+ "点击文件名保存":"点击文件名保存",
+ "谁能使用这个报表":"谁能使用这个报表",
+ "输入手机或邮箱,多个请使用逗号分开":"输入手机或邮箱,多个请使用逗号分开",
+ "预计执行时间 (最多显示近 9 次)":"预计执行时间 (最多显示近 9 次)",
+ "在线预览":"在线预览",
+ "执行顺序":"执行顺序",
+ "发布位置":"发布位置",
+ "批量审批":"批量审批",
+ "数据库语句执行超时":"数据库语句执行超时",
+ "通过规则匹配":"通过规则匹配",
+ "转换条件":"转换条件",
+ "已允许获取位置":"已允许获取位置",
+ "获取位置":"获取位置",
+ "未被允许推送通知":"未被允许推送通知",
+ "表单引用":"表单引用",
+ "全部粗体":"全部粗体",
+ "请选择%s":"请选择%s",
+ "手机版菜单样式":"手机版菜单样式",
+ "免费版不支持引用表单功能 [(查看详情)](https://getrebuild.com/docs/rbv-features)":"免费版不支持引用表单功能 [(查看详情)](https://getrebuild.com/docs/rbv-features)",
+ "技术细节":"技术细节",
+ "符合聚合数据条件的记录才会被聚合":"符合聚合数据条件的记录才会被聚合",
+ "选择内部接收用户":"选择内部接收用户",
+ "在线模板编辑器":"在线模板编辑器",
+ "默认粗体":"默认粗体",
+ "请求地址":"请求地址",
+ "启用后会推送全部字段/数据(包括明细实体),否则将仅推送修改的字段/数据":"启用后会推送全部字段/数据(包括明细实体),否则将仅推送修改的字段/数据",
+ "在顶部显示":"在顶部显示",
+ "请再次确认审批数据范围和审批结果。开始审批吗?":"请再次确认审批数据范围和审批结果。开始审批吗?",
+ "去重连接":"去重连接",
+ "导出格式":"导出格式",
+ "允许批量":"允许批量",
+ "暂无成员":"暂无成员",
+ "永久有效":"永久有效",
+ "详情模式选项":"详情模式选项",
+ "已做审批":"已做审批",
+ "允许批量审批":"允许批量审批",
+ "已允许推送通知":"已允许推送通知",
+ "包括获取您的位置信息,以及通知推送":"包括获取您的位置信息,以及通知推送",
+ "明细加载失败,请稍后重试":"明细加载失败,请稍后重试",
+ "不允许批量审批":"不允许批量审批",
+ "手动输入":"手动输入",
+ "暂无使用用户":"暂无使用用户",
+ "推送通知":"推送通知",
+ "客户端权限":"客户端权限",
+ "目标实体/记录匹配规则":"目标实体/记录匹配规则",
+ "明细显示在下方":"明细显示在下方",
+ "主角色":"主角色",
+ "留空表示所有用户均可使用":"留空表示所有用户均可使用",
+ "EXCEL 列表":"EXCEL 列表",
+ "批量":"批量",
+ "页面布局":"页面布局",
+ "无效审批状态":"无效审批状态",
+ "请设置过滤条件":"请设置过滤条件",
+ "请设置高级表达式":"请设置高级表达式",
+ "成功":"成功",
+ "适合页面":"适合页面",
+ "仅处于待你审批,且允许批量审批的记录才能审批成功":"仅处于待你审批,且允许批量审批的记录才能审批成功",
+ "上传文件。需要 %s 个":"上传文件。需要 %s 个",
+ "定位失败":"定位失败",
+ "所有用户":"所有用户",
+ "副字段显示":"副字段显示",
+ "清除缓存":"清除缓存",
+ "仍旧导入 (新建)":"仍旧导入 (新建)",
+ "转换后同步更新":"转换后同步更新",
+ "请选择审批结果":"请选择审批结果",
+ "表达式返回了非布尔值,这会导致触发器执行错误。是否继续?":"表达式返回了非布尔值,这会导致触发器执行错误。是否继续?",
+ "编号":"编号",
+ "使用用户":"使用用户",
+ "未激活":"未激活",
+ "%s个维度 %s个数值":"%s个维度 %s个数值",
+ "转换后同步删除":"转换后同步删除",
+ "无效模板文件 (无法读取模板文件)":"无效模板文件 (无法读取模板文件)",
+ "请输入%s":"请输入%s",
+ "没有任何符合批量审批条件的记录":"没有任何符合批量审批条件的记录",
+ "引用字段":"引用字段",
+ "符合转换条件的记录才允许被转换":"符合转换条件的记录才允许被转换",
+ "在线模板":"在线模板",
+ "编辑数据列表":"编辑数据列表",
+ "在侧栏显示":"在侧栏显示",
+ "启用后调用返回结果必须为 `SUCCESS`,否则将视为调用失败":"启用后调用返回结果必须为 `SUCCESS`,否则将视为调用失败",
+ "查询面板":"查询面板",
+ "保存并返回":"保存并返回",
+ "查看 HTML":"查看 HTML",
+ "默认字体":"默认字体",
+ "你提交的 %s 已审批通过":"你提交的 %s 已审批通过",
+ "悼念模式":"悼念模式",
+ "免费版不支持 WORD 模板功能 [(查看详情)](https://getrebuild.com/docs/rbv-features)":"免费版不支持 WORD 模板功能 [(查看详情)](https://getrebuild.com/docs/rbv-features)",
+ "表达式可能存在错误,这会导致触发器执行错误。是否继续?":"表达式可能存在错误,这会导致触发器执行错误。是否继续?",
+ "90天":"90天",
+ "触发过程":"触发过程",
+ "免费版不支持批量审批功能 [(查看详情)](https://getrebuild.com/docs/rbv-features)":"免费版不支持批量审批功能 [(查看详情)](https://getrebuild.com/docs/rbv-features)",
+ "加载更多":"加载更多",
+ "调用量":"调用量",
+ "非审核人":"非审核人",
+ "仅更新不要新建":"仅更新不要新建",
+ "输入内容":"输入内容",
+ "定位中":"定位中",
+ "查看 PDF":"查看 PDF"
}
\ No newline at end of file
diff --git a/src/main/resources/logback.xml b/src/main/resources/logback.xml
index c2e7e96e1..def9dfeed 100644
--- a/src/main/resources/logback.xml
+++ b/src/main/resources/logback.xml
@@ -30,8 +30,9 @@
-
-
-
+
+
+
+
diff --git a/src/main/resources/metadata-conf.xml b/src/main/resources/metadata-conf.xml
index 1cc7246a6..78146bf7d 100644
--- a/src/main/resources/metadata-conf.xml
+++ b/src/main/resources/metadata-conf.xml
@@ -358,6 +358,7 @@
+
@@ -430,6 +431,7 @@
+
diff --git a/src/main/resources/poi/excelStyle.css b/src/main/resources/poi/excelStyle.css
new file mode 100644
index 000000000..2384c75f4
--- /dev/null
+++ b/src/main/resources/poi/excelStyle.css
@@ -0,0 +1,55 @@
+.excelDefaults {
+ background-color: white;
+ color: black;
+ text-decoration: none;
+ direction: ltr;
+ text-transform: none;
+ text-indent: 0;
+ letter-spacing: 0;
+ word-spacing: 0;
+ white-space: pre-wrap;
+ unicode-bidi: normal;
+ background-image: none;
+ text-shadow: none;
+ list-style-image: none;
+ list-style-type: none;
+ padding: 0;
+ margin: 0;
+ border-collapse: collapse;
+ vertical-align: bottom;
+ font-style: normal;
+ font-family: sans-serif;
+ font-variant: normal;
+ font-weight: normal;
+ font-size: 10pt;
+ text-align: right;
+ table-layout: fixed;
+ word-wrap: break-word;
+ overflow-wrap: break-word;
+}
+
+.excelDefaults td {
+ padding: 1px 5px;
+ border: 1px solid silver;
+}
+
+.excelDefaults .colHeader {
+ background-color: silver;
+ font-weight: bold;
+ border: 1px solid black;
+ text-align: center;
+ padding: 1px 5px;
+}
+
+.excelDefaults .rowHeader {
+ background-color: silver;
+ font-weight: bold;
+ border: 1px solid black;
+ text-align: right;
+ padding: 1px 5px;
+}
+
+.excelDefaults .colHeader,
+.excelDefaults .rowHeader {
+ display: none;
+}
\ No newline at end of file
diff --git a/src/main/resources/scripts/db-init.sql b/src/main/resources/scripts/db-init.sql
index 10c8a258d..99fd5195a 100644
--- a/src/main/resources/scripts/db-init.sql
+++ b/src/main/resources/scripts/db-init.sql
@@ -521,9 +521,11 @@ create table if not exists `revision_history` (
`REVISION_ON` timestamp not null default current_timestamp comment '操作时间',
`CHANNEL_WITH` char(20) comment '变更渠道 (空为直接, 否则为关联)',
`IP_ADDR` varchar(100) comment 'IP 地址',
+ `AUTO_ID` bigint(20) not null auto_increment comment '保证顺序',
primary key (`REVISION_ID`),
- index IX0_revision_history (`BELONG_ENTITY`, `REVISION_TYPE`, `REVISION_BY`, `REVISION_ON`),
- index IX1_revision_history (`RECORD_ID`, `CHANNEL_WITH`)
+ unique index AIX0_revision_history (`AUTO_ID`),
+ index IX1_revision_history (`BELONG_ENTITY`, `REVISION_TYPE`, `REVISION_BY`, `REVISION_ON`),
+ index IX2_revision_history (`RECORD_ID`, `CHANNEL_WITH`)
)Engine=InnoDB;
-- ************ Entity [SmsendLog] DDL ************
@@ -616,6 +618,7 @@ create table if not exists `feeds` (
`RELATED_RECORD` char(20) comment '相关记录',
`SCHEDULE_TIME` timestamp null default null comment '日程时间',
`SCOPE` varchar(20) default 'ALL' comment '可见范围 (ALL/SELF/$TeamID)',
+ `AUTO_LOCATION` varchar(100) comment '发布位置',
`CREATED_BY` char(20) not null comment '创建人',
`CREATED_ON` timestamp not null default current_timestamp comment '创建时间',
`MODIFIED_ON` timestamp not null default current_timestamp comment '修改时间',
@@ -883,4 +886,4 @@ insert into `project_plan_config` (`CONFIG_ID`, `PROJECT_ID`, `PLAN_NAME`, `SEQ`
-- DB Version (see `db-upgrade.sql`)
insert into `system_config` (`CONFIG_ID`, `ITEM`, `VALUE`)
- values ('021-9000000000000001', 'DBVer', 52);
+ values ('021-9000000000000001', 'DBVer', 54);
diff --git a/src/main/resources/scripts/db-upgrade.sql b/src/main/resources/scripts/db-upgrade.sql
index 6e2aa7bbc..f31b5956e 100644
--- a/src/main/resources/scripts/db-upgrade.sql
+++ b/src/main/resources/scripts/db-upgrade.sql
@@ -1,6 +1,15 @@
-- Database upgrade scripts for rebuild 1.x and 2.x
-- Each upgraded starts with `-- #VERSION`
+-- #54 (v3.5)
+alter table `feeds`
+ add column `AUTO_LOCATION` varchar(100) comment '发布位置';
+
+-- #53 (v3.5)
+alter table `revision_history`
+ add column `AUTO_ID` bigint(20) not null auto_increment comment '保证顺序',
+ add unique index AIX90_revision_history (`AUTO_ID`);
+
-- #52 (v3.4)
-- ************ Entity [ShortUrl] DDL ************
create table if not exists `short_url` (
diff --git a/src/main/resources/web/_include/footer.html b/src/main/resources/web/_include/footer.html
index 17ff2371d..d5f9c1cd6 100644
--- a/src/main/resources/web/_include/footer.html
+++ b/src/main/resources/web/_include/footer.html
@@ -1,5 +1,5 @@
-
+
@@ -9,12 +9,12 @@
-
+
-
-
+
+
diff --git a/src/main/resources/web/_include/header.html b/src/main/resources/web/_include/header.html
index f85159b68..86273f60b 100644
--- a/src/main/resources/web/_include/header.html
+++ b/src/main/resources/web/_include/header.html
@@ -6,18 +6,20 @@
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -29,7 +31,7 @@
-
+
@@ -40,4 +42,15 @@
+
diff --git a/src/main/resources/web/_include/nav-left-admin.html b/src/main/resources/web/_include/nav-left-admin.html
index 314e8c9e2..9ac5433d8 100644
--- a/src/main/resources/web/_include/nav-left-admin.html
+++ b/src/main/resources/web/_include/nav-left-admin.html
@@ -61,10 +61,13 @@
[[${bundle.L('数据导入')}]]
-
- [[${bundle.L('外部表单')}]]
+
+ [[${bundle.L('数据同步')}]]
- [[${bundle.L('高级功能')}]]
+
+ [[${bundle.L('外部表单')}]]
+
+ [[${bundle.L('更多功能')}]]
[[${bundle.L('项目')}]]
diff --git a/src/main/resources/web/admin/audit/recycle-bin.html b/src/main/resources/web/admin/audit/recycle-bin.html
index c4cb705a9..a39d2337f 100644
--- a/src/main/resources/web/admin/audit/recycle-bin.html
+++ b/src/main/resources/web/admin/audit/recycle-bin.html
@@ -25,7 +25,7 @@
@@ -61,6 +63,7 @@
entity: ['Department', '[[${entityLabel}]]', '[[${entityIcon}]]'],
recordId: '[[${id}]]',
onViewEditable: false,
+ forceSubView: true,
}
diff --git a/src/main/resources/web/admin/bizuser/role-privileges.html b/src/main/resources/web/admin/bizuser/role-privileges.html
index b10d93ed2..fb38d81b7 100644
--- a/src/main/resources/web/admin/bizuser/role-privileges.html
+++ b/src/main/resources/web/admin/bizuser/role-privileges.html
@@ -86,6 +86,18 @@
.table.table-priv td > a.cp:hover {
color: #4285f4;
}
+
+ .nav-tabs li {
+ position: relative;
+ }
+ .nav-tabs .badge {
+ position: absolute;
+ top: -1px;
+ right: -1px;
+ font-size: 0.8462rem;
+ font-weight: normal;
+ line-height: 1.2;
+ }
@@ -129,6 +141,7 @@
+
diff --git a/src/main/resources/web/admin/bizuser/user-view.html b/src/main/resources/web/admin/bizuser/user-view.html
index adc858bfa..363921941 100644
--- a/src/main/resources/web/admin/bizuser/user-view.html
+++ b/src/main/resources/web/admin/bizuser/user-view.html
@@ -5,11 +5,11 @@
[[${bundle.L('用户')}]]
@@ -59,7 +65,8 @@
[[${bundle.L('名称')}]] |
- [[${bundle.L('应用实体')}]] |
+ [[${bundle.L('应用实体')}]] |
+ [[${bundle.L('使用用户')}]] |
[[${bundle.L('启用')}]] |
[[${bundle.L('修改时间')}]] |
|
diff --git a/src/main/resources/web/admin/integration/apis-manager.html b/src/main/resources/web/admin/integration/apis-manager.html
index 07e16384e..85ed17781 100644
--- a/src/main/resources/web/admin/integration/apis-manager.html
+++ b/src/main/resources/web/admin/integration/apis-manager.html
@@ -4,6 +4,70 @@
[[${bundle.L('API 密钥')}]]
+
@@ -60,5 +124,7 @@
+
+