소스 검색

backup and restore kanban

sunyj 8 년 전
부모
커밋
54aad548bc

+ 2 - 0
kanban-auth/src/main/java/com/uas/kanban/SecurityConfiguration.java

@@ -41,6 +41,8 @@ public class SecurityConfiguration extends WebMvcConfigurerAdapter {
         securityInterceptor.addAdminPatterns("/panel/save*/**", "/panel/update*/**", "/panel/delete*/**");
         // 看板设计
         securityInterceptor.addAdminPatterns("/kanban/**", "/board");
+        // 看板历史记录
+        securityInterceptor.addAdminPatterns("/kanbanHistory/**");
         // 参数
         securityInterceptor.addAdminPatterns("/parameter/save*/**", "/parameter/update*/**",
                 "/parameter/delete*/**");

+ 107 - 0
kanban-console/src/main/java/com/uas/kanban/controller/KanbanHistoryController.java

@@ -0,0 +1,107 @@
+package com.uas.kanban.controller;
+
+import com.uas.kanban.annotation.NotEmpty;
+import com.uas.kanban.base.BaseController;
+import com.uas.kanban.exception.OperationException;
+import com.uas.kanban.model.KanbanHistory;
+import com.uas.kanban.service.KanbanHistoryService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+
+import javax.servlet.http.HttpServletRequest;
+import java.util.List;
+
+/**
+ * 看板历史记录
+ *
+ * @author sunyj
+ * @since 2017/12/13 9:18
+ */
+@Controller
+@RequestMapping("/kanbanHistory")
+public class KanbanHistoryController extends BaseController<KanbanHistory> {
+
+    @Autowired
+    private KanbanHistoryService kanbanHistoryService;
+
+    @Override
+    public KanbanHistory save(@NotEmpty("json") String json, HttpServletRequest request) throws OperationException {
+        return super.save(json, request);
+    }
+
+    @Override
+    public KanbanHistory savePart(@NotEmpty("json") String json, HttpServletRequest request) throws OperationException {
+        throw new OperationException("不支持的操作");
+    }
+
+    @Override
+    public int update(@NotEmpty("json") String json, HttpServletRequest request) throws IllegalArgumentException, OperationException {
+        throw new OperationException("不支持的操作");
+    }
+
+    @Override
+    public int updatePart(@NotEmpty("json") String json, HttpServletRequest request) throws IllegalArgumentException, OperationException {
+        throw new OperationException("不支持的操作");
+    }
+
+    @Override
+    public int deleteAll(HttpServletRequest request) throws OperationException {
+        throw new OperationException("不支持的操作");
+    }
+
+    /**
+     * 获取指定看板的历史记录
+     *
+     * @param kanbanCode 看板 code
+     * @param request    request
+     * @return 历史记录
+     */
+    @RequestMapping("/get/byKanban/{kanbanCode}")
+    @ResponseBody
+    public List<KanbanHistory> getByKanbanCode(@PathVariable("kanbanCode") String kanbanCode, HttpServletRequest request) {
+        return kanbanHistoryService.findByKanbanCode(kanbanCode);
+    }
+
+    /**
+     * 删除指定看板的历史记录
+     *
+     * @param kanbanCode 看板 code
+     * @param request    request
+     * @return 删除的数据条数
+     */
+    @RequestMapping("/delete/byKanban/{kanbanCode}")
+    @ResponseBody
+    public int deleteByKanbanCode(@PathVariable("kanbanCode") String kanbanCode, HttpServletRequest request) {
+        return kanbanHistoryService.deleteByKanbanCode(kanbanCode);
+    }
+
+    /**
+     * 保存指定看板的历史记录
+     *
+     * @param kanbanCode  看板 code
+     * @param description 关于此次记录的描述
+     * @param request     request
+     * @return 历史记录
+     */
+    @RequestMapping("/backup/byKanban/{kanbanCode}")
+    @ResponseBody
+    public KanbanHistory backup(@PathVariable("kanbanCode") String kanbanCode, String description, HttpServletRequest request) {
+        return kanbanHistoryService.backup(kanbanCode, description, false);
+    }
+
+    /**
+     * 根据备份的历史记录恢复看板
+     *
+     * @param code    历史记录 code
+     * @param request request
+     * @return 更新的数据条数
+     */
+    @RequestMapping("/restore/{code}")
+    @ResponseBody
+    public int restore(@PathVariable("code") String code, HttpServletRequest request) throws OperationException {
+        return kanbanHistoryService.restore(code);
+    }
+}

+ 44 - 0
kanban-console/src/main/java/com/uas/kanban/dao/KanbanHistoryDao.java

@@ -0,0 +1,44 @@
+package com.uas.kanban.dao;
+
+import com.uas.kanban.annotation.NotEmpty;
+import com.uas.kanban.base.BaseDao;
+import com.uas.kanban.model.KanbanHistory;
+import org.mongodb.morphia.query.Query;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+
+/**
+ * 看板历史记录
+ *
+ * @author sunyj
+ * @since 2017/12/13 8:38
+ */
+@Component
+public class KanbanHistoryDao extends BaseDao<KanbanHistory> {
+
+    /**
+     * 获取指定看板的历史记录
+     *
+     * @param kanbanCode 看板 code
+     * @return 历史记录
+     */
+    public List<KanbanHistory> findByKanbanCode(@NotEmpty("kanbanCode") String kanbanCode) {
+        Query<KanbanHistory> query = createQuery();
+        query.filter("kanbanCode", kanbanCode);
+        query.filter("autoSaved", false);
+        return find(query);
+    }
+
+    /**
+     * 删除指定看板的历史记录
+     *
+     * @param kanbanCode 看板 code
+     * @return 删除的数据条数
+     */
+    public int deleteByKanbanCode(@NotEmpty("kanbanCode") String kanbanCode) {
+        Query<KanbanHistory> query = createQuery();
+        query.filter("kanbanCode", kanbanCode);
+        return delete(query);
+    }
+}

+ 105 - 0
kanban-console/src/main/java/com/uas/kanban/model/KanbanHistory.java

@@ -0,0 +1,105 @@
+package com.uas.kanban.model;
+
+import com.alibaba.fastjson.JSONObject;
+import com.uas.kanban.annotation.CollectionProperty;
+import com.uas.kanban.annotation.FieldProperty;
+import com.uas.kanban.base.BaseEntity;
+import org.mongodb.morphia.annotations.Entity;
+
+/**
+ * 看板历史记录
+ *
+ * @author sunyj
+ * @since 2017/12/12 18:47
+ */
+@Entity
+@CollectionProperty(simpleName = "看板历史记录")
+public class KanbanHistory extends BaseEntity {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 看板 code {@link Panel}
+     */
+    @FieldProperty(nullable = false)
+    private String kanbanCode;
+
+    /**
+     * 描述
+     */
+    private String description;
+
+    /**
+     * 是否是自动备份
+     */
+    @FieldProperty(nullable = false)
+    private Boolean autoSaved;
+
+    /**
+     * 看板
+     */
+    @FieldProperty(nullable = false)
+    private JSONObject kanban;
+
+    public String getKanbanCode() {
+        return kanbanCode;
+    }
+
+    public void setKanbanCode(String kanbanCode) {
+        this.kanbanCode = kanbanCode;
+    }
+
+    public String getDescription() {
+        return description;
+    }
+
+    public void setDescription(String description) {
+        this.description = description;
+    }
+
+    public Boolean getAutoSaved() {
+        return autoSaved;
+    }
+
+    public void setAutoSaved(Boolean autoSaved) {
+        this.autoSaved = autoSaved;
+    }
+
+    public JSONObject getKanban() {
+        return kanban;
+    }
+
+    public void setKanban(JSONObject kanban) {
+        this.kanban = kanban;
+    }
+
+    @Override
+    public String toString() {
+        return "KanbanHistory{" +
+                "kanbanCode='" + kanbanCode + '\'' +
+                ", description='" + description + '\'' +
+                ", autoSaved=" + autoSaved +
+                ", kanban=" + kanban +
+                "} " + super.toString();
+    }
+
+    /**
+     * 获取看板
+     * 对于 kanban 的操作需注意,因为通过该方法得到的 kanban 与 this.kanban
+     * 实际上是两个独立的对象,所以更改了返回值 kanban 之后,需要重新调用该方法以便应用更改
+     */
+    public Kanban fromKanban() {
+        return kanban == null ? null : kanban.toJavaObject(Kanban.class);
+    }
+
+    /**
+     * 设置看板
+     * 对于 kanban 的操作需注意,因为该方法的参数 kanban 与 this.kanban
+     * 实际上是两个独立的对象,更改参数 kanban 之后,需要重新调用该方法以便应用更改
+     */
+    public void toKanban(Kanban kanban) {
+        if (kanban != null) {
+            this.kanban = JSONObject.parseObject(JSONObject.toJSONString(kanban));
+        }
+    }
+}

+ 50 - 0
kanban-console/src/main/java/com/uas/kanban/service/KanbanHistoryService.java

@@ -0,0 +1,50 @@
+package com.uas.kanban.service;
+
+import com.uas.kanban.annotation.NotEmpty;
+import com.uas.kanban.exception.OperationException;
+import com.uas.kanban.model.KanbanHistory;
+
+import java.util.List;
+
+/**
+ * 看板历史记录
+ *
+ * @author sunyj
+ * @since 2017/12/13 8:43
+ */
+public interface KanbanHistoryService {
+
+    /**
+     * 获取指定看板的历史记录
+     *
+     * @param kanbanCode 看板 code
+     * @return 历史记录
+     */
+    List<KanbanHistory> findByKanbanCode(@NotEmpty("kanbanCode") String kanbanCode);
+
+    /**
+     * 删除指定看板的历史记录
+     *
+     * @param kanbanCode 看板 code
+     * @return 删除的数据条数
+     */
+    int deleteByKanbanCode(@NotEmpty("kanbanCode") String kanbanCode);
+
+    /**
+     * 保存指定看板的历史记录
+     *
+     * @param kanbanCode  看板 code
+     * @param description 关于此次记录的描述
+     * @param autoSave    是否为自动保存
+     * @return 历史记录
+     */
+    KanbanHistory backup(@NotEmpty("kanbanCode") String kanbanCode, String description, Boolean autoSave);
+
+    /**
+     * 根据备份的历史记录恢复看板
+     *
+     * @param code 历史记录 code
+     * @return 更新的数据条数
+     */
+    int restore(@NotEmpty("code") String code) throws OperationException;
+}

+ 66 - 0
kanban-console/src/main/java/com/uas/kanban/service/impl/KanbanHistoryServiceImpl.java

@@ -0,0 +1,66 @@
+package com.uas.kanban.service.impl;
+
+import com.alibaba.fastjson.JSONObject;
+import com.uas.kanban.annotation.NotEmpty;
+import com.uas.kanban.base.BaseService;
+import com.uas.kanban.dao.KanbanDao;
+import com.uas.kanban.dao.KanbanHistoryDao;
+import com.uas.kanban.exception.OperationException;
+import com.uas.kanban.model.Kanban;
+import com.uas.kanban.model.KanbanHistory;
+import com.uas.kanban.service.KanbanHistoryService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+/**
+ * 看板历史记录
+ *
+ * @author sunyj
+ * @since 2017/12/13 8:47
+ */
+@Service
+public class KanbanHistoryServiceImpl extends BaseService<KanbanHistory> implements KanbanHistoryService {
+
+    @Autowired
+    private KanbanHistoryDao kanbanHistoryDao;
+
+    @Autowired
+    private KanbanDao kanbanDao;
+
+    @Autowired
+    private KanbanServiceImpl kanbanService;
+
+    @Override
+    public List<KanbanHistory> findByKanbanCode(@NotEmpty("kanbanCode") String kanbanCode) {
+        return kanbanHistoryDao.findByKanbanCode(kanbanCode);
+    }
+
+    @Override
+    public int deleteByKanbanCode(@NotEmpty("kanbanCode") String kanbanCode) {
+        return kanbanHistoryDao.deleteByKanbanCode(kanbanCode);
+    }
+
+    @Override
+    public KanbanHistory backup(@NotEmpty("kanbanCode") String kanbanCode, String description, Boolean autoSave) {
+        Kanban kanban = kanbanDao.checkExist(kanbanCode);
+        autoSave = autoSave == null ? false : autoSave;
+        KanbanHistory kanbanHistory = new KanbanHistory();
+        kanbanHistory.setKanbanCode(kanbanCode);
+        kanbanHistory.setDescription(description);
+        kanbanHistory.setAutoSaved(autoSave);
+        kanbanHistory.toKanban(kanban);
+        return kanbanHistoryDao.save(kanbanHistory);
+    }
+
+    @Override
+    public int restore(@NotEmpty("code") String code) throws OperationException {
+        KanbanHistory kanbanHistory = kanbanHistoryDao.checkExist(code);
+        try {
+            return kanbanService.update(JSONObject.toJSONString(kanbanHistory.getKanban()));
+        } catch (IllegalArgumentException | OperationException e) {
+            throw new IllegalStateException("恢复失败", e);
+        }
+    }
+}

+ 12 - 0
kanban-console/src/main/webapp/WEB-INF/views/console.html

@@ -79,6 +79,18 @@
             <br/>
             <li><a target="_blank">kanban/get/byPanel/4EC2735D343</a></li>
         </ol>
+        <strong><li class="title">看板历史记录</li></strong>
+        <ol>
+            <li><a target="_blank">kanbanHistory/delete/4EC2735D343</a></li>
+            <li><a target="_blank">kanbanHistory/delete/byCodes?codes=53E04542411&codes=53E04631812</a></li>
+            <li><a target="_blank">kanbanHistory/get/4EC2735D343</a></li>
+            <li><a target="_blank">kanbanHistory/get?page=1&size=10</a></li>
+            <br/>
+            <li><a target="_blank">kanbanHistory/get/byKanban/4EC2735D343</a></li>
+            <li><a target="_blank">kanbanHistory/delete/byKanban/4EC2735D343</a></li>
+            <li><a target="_blank">kanbanHistory/backup/byKanban/4EC2735D343?description=备份测试</a></li>
+            <li><a target="_blank">kanbanHistory/restore/4EC2735D343</a></li>
+        </ol>
         <strong><li class="title">面板实例</li></strong>
         <ol>
             <li><a target="_blank">panelInstance/update?json={"code":"50C2C15A411","parameters":[{"code":"5061DFD0811","type":"String","defaultOptionalValueIndex":1,"inputMode":"DropDownBox","name":"参数1","optionalValues":["值1","值2"],"value":"值2", "panelCode": "4EC2735D343"},{"code":"5061E8A3812","type":"Number","defaultOptionalValueIndex":1,"inputMode":"DropDownBox","name":"参数2","optionalValues":[12,32],"value":12.0, "panelCode": "4EC2735D343"}],"panelCode":"50C01D61F19","userCode":"50C01D61F11","switchFrequency":5000,"refreshFrequency":5000}</a></li>