From 5a4513e40a619eea6e8131e5a35a61399ac45c79 Mon Sep 17 00:00:00 2001 From: devezhao-mbp Date: Fri, 23 Aug 2019 02:35:34 +0800 Subject: [PATCH] revision details --- .../server/service/OperatingContext.java | 2 +- .../server/service/base/RecordMerger.java | 20 ++++--- .../service/base/RevisionHistoryObserver.java | 2 +- .../admin/audit/RevisionHistoryControll.java | 39 +++++++++++++- src/main/webapp/admin/audit/recycle-bin.jsp | 6 --- .../webapp/admin/audit/revision-history.jsp | 11 ++-- src/main/webapp/admin/system-general.jsp | 9 ++-- src/main/webapp/assets/css/rb-page.css | 14 +++++ .../assets/js/entityhub/recycle-bin.jsx | 4 +- .../assets/js/entityhub/revision-history.jsx | 50 +++++++++++++++-- src/main/webapp/assets/js/rb-components.jsx | 54 +++++++++++-------- 11 files changed, 159 insertions(+), 52 deletions(-) diff --git a/src/main/java/com/rebuild/server/service/OperatingContext.java b/src/main/java/com/rebuild/server/service/OperatingContext.java index ac1bf4211..b7d7fba39 100644 --- a/src/main/java/com/rebuild/server/service/OperatingContext.java +++ b/src/main/java/com/rebuild/server/service/OperatingContext.java @@ -89,7 +89,7 @@ public class OperatingContext { * @return */ public Record getAnyRecord() { - return getBeforeRecord() != null ? getBeforeRecord() : getAfterRecord(); + return getAfterRecord() != null ? getAfterRecord() : getBeforeRecord(); } /** diff --git a/src/main/java/com/rebuild/server/service/base/RecordMerger.java b/src/main/java/com/rebuild/server/service/base/RecordMerger.java index 7ffa0b146..c42e60c6c 100644 --- a/src/main/java/com/rebuild/server/service/base/RecordMerger.java +++ b/src/main/java/com/rebuild/server/service/base/RecordMerger.java @@ -28,9 +28,9 @@ import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.rebuild.server.RebuildException; import com.rebuild.server.metadata.EntityHelper; +import com.rebuild.server.metadata.MetadataHelper; import com.rebuild.utils.JSONUtils; import org.apache.commons.collections4.map.CaseInsensitiveMap; -import org.apache.commons.lang.StringUtils; import java.util.Map; @@ -64,7 +64,7 @@ public class RecordMerger { } Entity entity = beforeRecord != null ? beforeRecord.getEntity() : afterRecord.getEntity(); - Map merged = new CaseInsensitiveMap<>(); + Map merged = new CaseInsensitiveMap<>(); if (beforeRecord != null) { JSONObject beforeSerialize = (JSONObject) beforeRecord.serialize(); @@ -78,7 +78,7 @@ public class RecordMerger { if (NullValue.is(beforeVal)) { beforeVal = null; } - merged.put(field, new String[]{ beforeVal == null ? null : JSON.toJSONString(beforeVal), null }); + merged.put(field, new Object[]{ beforeVal, null }); } } @@ -95,15 +95,15 @@ public class RecordMerger { continue; } - String[] mergedValue = merged.computeIfAbsent(field, k -> new String[]{null, null}); - mergedValue[1] = afterVal == null ? null : JSON.toJSONString(afterVal); + Object[] mergedValue = merged.computeIfAbsent(field, k -> new Object[]{null, null}); + mergedValue[1] = afterVal; } } JSONArray array = new JSONArray(); - for (Map.Entry e : merged.entrySet()) { - String[] val = e.getValue(); - if (StringUtils.isEmpty(val[0]) && StringUtils.isEmpty(val[1])) { + for (Map.Entry e : merged.entrySet()) { + Object[] val = e.getValue(); + if (val[0] == null && val[1] == null) { continue; } @@ -125,6 +125,10 @@ public class RecordMerger { String fieldName = field.getName(); return EntityHelper.ModifiedOn.equalsIgnoreCase(fieldName) || EntityHelper.ModifiedBy.equalsIgnoreCase(fieldName) + || EntityHelper.CreatedOn.equalsIgnoreCase(fieldName) + || EntityHelper.CreatedBy.equalsIgnoreCase(fieldName) + || EntityHelper.QuickCode.equalsIgnoreCase((fieldName)) + || MetadataHelper.isApprovalField(fieldName) || field.getType() == FieldType.PRIMARY; } } diff --git a/src/main/java/com/rebuild/server/service/base/RevisionHistoryObserver.java b/src/main/java/com/rebuild/server/service/base/RevisionHistoryObserver.java index 945d48e0e..af3066944 100644 --- a/src/main/java/com/rebuild/server/service/base/RevisionHistoryObserver.java +++ b/src/main/java/com/rebuild/server/service/base/RevisionHistoryObserver.java @@ -101,7 +101,7 @@ public class RevisionHistoryObserver extends OperatingObserver { JSON revisionContent = new RecordMerger(before).merge(after); record.setString("revisionContent", revisionContent.toJSONString()); } else { - record.setString("revisionContent", JSONUtils.EMPTY_OBJECT_STR); + record.setString("revisionContent", JSONUtils.EMPTY_ARRAY_STR); } OperatingContext source = RobotTriggerObserver.getTriggerSource(); diff --git a/src/main/java/com/rebuild/web/admin/audit/RevisionHistoryControll.java b/src/main/java/com/rebuild/web/admin/audit/RevisionHistoryControll.java index 138d38303..75f3bcdb1 100644 --- a/src/main/java/com/rebuild/web/admin/audit/RevisionHistoryControll.java +++ b/src/main/java/com/rebuild/web/admin/audit/RevisionHistoryControll.java @@ -18,12 +18,21 @@ along with this program. If not, see . package com.rebuild.web.admin.audit; +import cn.devezhao.persist4j.Entity; +import cn.devezhao.persist4j.engine.ID; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.rebuild.server.Application; +import com.rebuild.server.metadata.MetadataHelper; +import com.rebuild.server.metadata.entity.EasyMeta; import com.rebuild.web.BaseEntityControll; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.servlet.ModelAndView; import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; import java.io.IOException; /** @@ -37,7 +46,35 @@ import java.io.IOException; public class RevisionHistoryControll extends BaseEntityControll { @RequestMapping("revision-history") - public ModelAndView pageLogging(HttpServletRequest request) throws IOException { + public ModelAndView pageLogging() throws IOException { return createModelAndView("/admin/audit/revision-history.jsp"); } + + @RequestMapping("revision-history/details") + public void details(HttpServletRequest request, HttpServletResponse response) throws IOException { + ID id = getIdParameterNotNull(request, "id"); + Object[] rev = Application.createQueryNoFilter( + "select revisionContent,belongEntity from RevisionHistory where revisionId = ?") + .setParameter(1, id) + .unique(); + + JSONArray data = JSON.parseArray((String) rev[0]); + + // 字段名称 + if (MetadataHelper.containsEntity((String) rev[1])) { + Entity entity = MetadataHelper.getEntity((String) rev[1]); + for (Object o : data) { + JSONObject item = (JSONObject) o; + String field = item.getString("field"); + if (entity.containsField(field)) { + field = EasyMeta.getLabel(entity.getField(field)); + } else { + field = "[" + field.toUpperCase() + "]"; + } + item.put("field", field); + } + } + + writeSuccess(response, data); + } } diff --git a/src/main/webapp/admin/audit/recycle-bin.jsp b/src/main/webapp/admin/audit/recycle-bin.jsp index 1a301a726..f4d7c3a3e 100644 --- a/src/main/webapp/admin/audit/recycle-bin.jsp +++ b/src/main/webapp/admin/audit/recycle-bin.jsp @@ -4,12 +4,6 @@ <%@ include file="/_include/Head.jsp"%> 回收站 -
+
diff --git a/src/main/webapp/admin/system-general.jsp b/src/main/webapp/admin/system-general.jsp index e791fbe79..f3c27b2aa 100644 --- a/src/main/webapp/admin/system-general.jsp +++ b/src/main/webapp/admin/system-general.jsp @@ -70,15 +70,16 @@
-
关于 REBUILD
+
关于
-

版本 <%=Application.VER%>

+

版本 <%=Application.VER%>

+

授权 开源社区版 (非商业用途)

-
本软件系统使用 GPL-3.0 许可。请遵循许可协议。
+
REBUILD 使用 GPL3.0 与 商业授权 双重许可,请遵循许可协议。
diff --git a/src/main/webapp/assets/css/rb-page.css b/src/main/webapp/assets/css/rb-page.css index 1c315b6e6..6dcac6e8e 100644 --- a/src/main/webapp/assets/css/rb-page.css +++ b/src/main/webapp/assets/css/rb-page.css @@ -94,6 +94,20 @@ html.admin .admin-show.row { text-decoration: underline; } +.badge.text-id { + font-weight: normal; + color: #777; +} + +a.badge.text-id { + color: #4285f4; + cursor: pointer; +} + +a.badge.text-id:hover { + border-color: #4285f4; +} + .btn { min-height: 2.8rem; min-width: 98px; diff --git a/src/main/webapp/assets/js/entityhub/recycle-bin.jsx b/src/main/webapp/assets/js/entityhub/recycle-bin.jsx index ef486198f..4467e8ea1 100644 --- a/src/main/webapp/assets/js/entityhub/recycle-bin.jsx +++ b/src/main/webapp/assets/js/entityhub/recycle-bin.jsx @@ -95,8 +95,8 @@ class DataList extends React.Component { // eslint-disable-next-line react/display-name CellRenders.renderSimple = function (v, s, k) { - if (k.endsWith('.channelWith')) v = v ? (关联删除 {v.toUpperCase()}) : '直接删除' - else if (k.endsWith('.recordId')) v = {v.toUpperCase()} + if (k.endsWith('.channelWith')) v = v ? (关联删除 {v.toUpperCase()}) : '直接删除' + else if (k.endsWith('.recordId')) v = {v.toUpperCase()} else if (k.endsWith('.belongEntity')) v = _entities[v] || `[${v.toUpperCase()}]` return
{v || ''}
} diff --git a/src/main/webapp/assets/js/entityhub/revision-history.jsx b/src/main/webapp/assets/js/entityhub/revision-history.jsx index 1dca115db..7f94515ff 100644 --- a/src/main/webapp/assets/js/entityhub/revision-history.jsx +++ b/src/main/webapp/assets/js/entityhub/revision-history.jsx @@ -38,7 +38,7 @@ class DataList extends React.Component { super(props) } render() { - return this._List = c} config={ListConfig} uncheckbox={true}> + return this._List = c} config={ListConfig}> } componentDidMount() { @@ -56,6 +56,8 @@ class DataList extends React.Component { this._belongEntity = select2 this._recordName = input + + $('.J_details').click(() => this.showDetails()) } queryList() { @@ -72,13 +74,55 @@ class DataList extends React.Component { } this._List.search(JSON.stringify(q), true) } + + showDetails() { + let ids = this._List.getSelectedIds() + if (!ids || ids.length === 0) return + renderRbcomp() + } } // eslint-disable-next-line react/display-name CellRenders.renderSimple = function (v, s, k) { - if (k.endsWith('.channelWith')) v = v ? (关联操作 {v.toUpperCase()}) : '直接操作' - else if (k.endsWith('.recordId')) v = {v.toUpperCase()} + if (k.endsWith('.channelWith')) v = v ? (关联操作 {v.toUpperCase()}) : '直接操作' + else if (k.endsWith('.recordId')) v = {v.toUpperCase()} else if (k.endsWith('.belongEntity')) v = _entities[v] || `[${v.toUpperCase()}]` else if (k.endsWith('.revisionType')) v = RevTypes[v] || '未知' return
{v || ''}
} + +class DlgDetails extends RbAlert { + constructor(props) { + super(props) + } + renderContent() { + if (!this.state.data) return + if (this.state.data.length === 0) return
无变更详情
+ + return + + + + + + + + + {this.state.data.map((item) => { + return + + + + + })} + +
字段变更前变更后
{item.field}
{item.before || 空值}
{item.after || 空值}
+ } + componentDidMount() { + super.componentDidMount() + + $.get(`${rb.baseUrl}/admin/audit/revision-history/details?id=${this.props.id}`, (res) => { + this.setState({ data: res.data || [] }) + }) + } +} \ No newline at end of file diff --git a/src/main/webapp/assets/js/rb-components.jsx b/src/main/webapp/assets/js/rb-components.jsx index 57b5ec71f..603009db1 100644 --- a/src/main/webapp/assets/js/rb-components.jsx +++ b/src/main/webapp/assets/js/rb-components.jsx @@ -155,6 +155,24 @@ class RbAlert extends React.Component { this.state = { disable: false } } render() { + let style = {} + if (this.props.width) style.maxWidth = ~~this.props.width + return ( +
this._dlg = c} tabIndex={this.state.tabIndex || -1}> +
+
+
+ +
+
+ {this.renderContent()} +
+
+
+
+ ) + } + renderContent() { let icon = this.props.type === 'danger' ? 'alert-triangle' : 'help-outline' if (this.props.type === 'warning') icon = 'alert-circle-o' if (this.props.type === 'primary') icon = 'info-outline' @@ -165,34 +183,24 @@ class RbAlert extends React.Component { let cancel = (this.props.cancel || this.hide).bind(this) let confirm = (this.props.confirm || this.hide).bind(this) - return ( -
this._dlg = c} tabIndex={this.state.tabIndex || -1}> -
-
-
- -
-
-
- {this.props.showIcon === false ? null : -
- } - {this.props.title &&

{this.props.title}

} -
{content}
-
- - -
-
-
-
-
+ + return
+ {this.props.showIcon === false ? null : +
+ } + {this.props.title &&

{this.props.title}

} +
{content}
+
+ +
- ) +
} + componentDidMount() { $(this._dlg).modal({ show: true, keyboard: true }) } + hide() { let root = $(this._dlg) root.modal('hide')