From 76e30f065ae25328f9e4c27b1374605580523f43 Mon Sep 17 00:00:00 2001 From: tamguo Date: Thu, 15 Nov 2018 11:47:12 +0800 Subject: [PATCH] =?UTF-8?q?=E5=90=88=E5=B9=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../tamguo/web/member/DocumentController.java | 6 +- .../web/member/HistoryDocController.java | 91 +++ .../main/resources/static/fonts/notosans.css | 128 ++++ .../src/main/resources/static/js/editor.js | 2 +- .../static/mergely/editor/editor.css | 85 +++ .../resources/static/mergely/editor/editor.js | 699 ++++++++++++++++++ .../mergely/editor/images/arrow-down-v.png | Bin 0 -> 274 bytes .../mergely/editor/images/arrow-left-v.png | Bin 0 -> 243 bytes .../mergely/editor/images/arrow-right-v.png | Bin 0 -> 238 bytes .../mergely/editor/images/arrow-up-v.png | Bin 0 -> 288 bytes .../static/mergely/editor/images/download.png | Bin 0 -> 294 bytes .../static/mergely/editor/images/swap.png | Bin 0 -> 329 bytes .../editor/lib/farbtastic/farbtastic.css | 51 ++ .../editor/lib/farbtastic/farbtastic.js | 367 +++++++++ .../mergely/editor/lib/tipsy/jquery.tipsy.js | 258 +++++++ .../static/mergely/editor/lib/tipsy/tipsy.css | 25 + .../static/mergely/editor/lib/wicked-ui.css | 152 ++++ .../static/mergely/editor/lib/wicked-ui.js | 288 ++++++++ .../static/mergely/lib/codemirror.css | 334 +++++++++ .../static/mergely/lib/codemirror.min.js | 5 + .../resources/static/mergely/lib/mergely.css | 45 ++ .../static/mergely/lib/mergely.min.js | 7 + .../static/mergely/lib/searchcursor.js | 131 ++++ .../templates/member/book/compare.html | 140 ++++ .../resources/templates/member/book/edit.html | 2 +- .../templates/member/book/history.html | 129 ++++ .../modules/book/model/DocumentEntity.java | 7 + .../service/impl/DocumentServiceImpl.java | 3 + 28 files changed, 2952 insertions(+), 3 deletions(-) create mode 100644 tamguo-bms/src/main/java/com/tamguo/web/member/HistoryDocController.java create mode 100644 tamguo-bms/src/main/resources/static/fonts/notosans.css create mode 100644 tamguo-bms/src/main/resources/static/mergely/editor/editor.css create mode 100644 tamguo-bms/src/main/resources/static/mergely/editor/editor.js create mode 100644 tamguo-bms/src/main/resources/static/mergely/editor/images/arrow-down-v.png create mode 100644 tamguo-bms/src/main/resources/static/mergely/editor/images/arrow-left-v.png create mode 100644 tamguo-bms/src/main/resources/static/mergely/editor/images/arrow-right-v.png create mode 100644 tamguo-bms/src/main/resources/static/mergely/editor/images/arrow-up-v.png create mode 100644 tamguo-bms/src/main/resources/static/mergely/editor/images/download.png create mode 100644 tamguo-bms/src/main/resources/static/mergely/editor/images/swap.png create mode 100644 tamguo-bms/src/main/resources/static/mergely/editor/lib/farbtastic/farbtastic.css create mode 100644 tamguo-bms/src/main/resources/static/mergely/editor/lib/farbtastic/farbtastic.js create mode 100644 tamguo-bms/src/main/resources/static/mergely/editor/lib/tipsy/jquery.tipsy.js create mode 100644 tamguo-bms/src/main/resources/static/mergely/editor/lib/tipsy/tipsy.css create mode 100644 tamguo-bms/src/main/resources/static/mergely/editor/lib/wicked-ui.css create mode 100644 tamguo-bms/src/main/resources/static/mergely/editor/lib/wicked-ui.js create mode 100644 tamguo-bms/src/main/resources/static/mergely/lib/codemirror.css create mode 100644 tamguo-bms/src/main/resources/static/mergely/lib/codemirror.min.js create mode 100644 tamguo-bms/src/main/resources/static/mergely/lib/mergely.css create mode 100644 tamguo-bms/src/main/resources/static/mergely/lib/mergely.min.js create mode 100644 tamguo-bms/src/main/resources/static/mergely/lib/searchcursor.js create mode 100644 tamguo-bms/src/main/resources/templates/member/book/compare.html create mode 100644 tamguo-bms/src/main/resources/templates/member/book/history.html diff --git a/tamguo-bms/src/main/java/com/tamguo/web/member/DocumentController.java b/tamguo-bms/src/main/java/com/tamguo/web/member/DocumentController.java index 3076433..bfe0b04 100644 --- a/tamguo-bms/src/main/java/com/tamguo/web/member/DocumentController.java +++ b/tamguo-bms/src/main/java/com/tamguo/web/member/DocumentController.java @@ -194,6 +194,9 @@ public class DocumentController { } } + /** + * 移除文件 + */ @RequestMapping(value = "removeFile" , method = RequestMethod.POST) @ResponseBody public Result removeFile(String id) { @@ -202,6 +205,7 @@ public class DocumentController { } catch (Exception e) { return Result.result(1, null, "删除失败"); } - return Result.successResult("删除成功"); + return Result.result(0, null, "删除成功"); } + } diff --git a/tamguo-bms/src/main/java/com/tamguo/web/member/HistoryDocController.java b/tamguo-bms/src/main/java/com/tamguo/web/member/HistoryDocController.java new file mode 100644 index 0000000..d245a14 --- /dev/null +++ b/tamguo-bms/src/main/java/com/tamguo/web/member/HistoryDocController.java @@ -0,0 +1,91 @@ +package com.tamguo.web.member; + +import java.util.Arrays; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +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.RequestMethod; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.servlet.ModelAndView; + +import com.baomidou.mybatisplus.mapper.Condition; +import com.tamguo.common.utils.Result; +import com.tamguo.modules.book.model.DocumentEntity; +import com.tamguo.modules.book.model.enums.DocumentStatusEnum; +import com.tamguo.modules.book.service.IDocumentService; + +@Controller +@RequestMapping(value="member/document") +public class HistoryDocController { + + private Logger logger = LoggerFactory.getLogger(getClass()); + @Autowired + private IDocumentService iDocumentService; + + /** + * 历史记录 + */ + @SuppressWarnings("unchecked") + @RequestMapping(value = "history" , method = RequestMethod.POST) + public ModelAndView history(String id , ModelAndView model) { + model.setViewName("member/book/history"); + DocumentEntity document = iDocumentService.selectById(id); + model.addObject("document", document); + model.addObject("historyList", iDocumentService.selectList(Condition.create().eq("batch_no", document.getBatchNo()).eq("status", DocumentStatusEnum.HISTORY.getValue()).orderDesc(Arrays.asList("create_date")))); + return model; + } + + /** + * 删除 + */ + @RequestMapping(value = "history/delete" , method = RequestMethod.POST) + @ResponseBody + public Result delete(String id) { + try { + iDocumentService.deleteById(id); + } catch (Exception e) { + logger.error(e.getMessage() , e); + return Result.failResult("删除失败!"); + } + return Result.successResult("删除成功!"); + } + + /** + * 恢复 + */ + @SuppressWarnings("unchecked") + @RequestMapping(value = "history/restore" , method = RequestMethod.POST) + @ResponseBody + public Result restore(String id) { + try { + DocumentEntity history = iDocumentService.selectById(id); + + String content = history.getContent(); + String markdown = history.getMarkdown(); + DocumentEntity document = iDocumentService.selectOne(Condition.create().eq("batch_no", history.getBatchNo()).eq("status", DocumentStatusEnum.NORMAL.getValue())); + document.setContent(content); + document.setMarkdown(markdown); + document.setCover("no"); + iDocumentService.modify(document); + return Result.successResult(document); + } catch (Exception e) { + logger.error(e.getMessage() , e); + return Result.failResult("恢复失败!"); + } + } + + @SuppressWarnings("unchecked") + @RequestMapping(value = "history/compare/{id}" , method = RequestMethod.POST) + @ResponseBody + public ModelAndView compare(@PathVariable String id , ModelAndView model) { + model.setViewName("member/book/compare"); + DocumentEntity history = iDocumentService.selectById(id); + model.addObject("history", history); + model.addObject("document", iDocumentService.selectOne(Condition.create().eq("status", DocumentStatusEnum.NORMAL.getValue()).eq("batch_no", history.getBatchNo()))); + return model; + } +} diff --git a/tamguo-bms/src/main/resources/static/fonts/notosans.css b/tamguo-bms/src/main/resources/static/fonts/notosans.css new file mode 100644 index 0000000..a6b6d74 --- /dev/null +++ b/tamguo-bms/src/main/resources/static/fonts/notosans.css @@ -0,0 +1,128 @@ +/* cyrillic-ext */ +@font-face { + font-family: 'Noto Sans'; + font-style: normal; + font-weight: 400; + src: local('Noto Sans'), local('NotoSans'), url(notosans/v6/C7bP6N8yXZ-PGLzbFLtQKRJtnKITppOI_IvcXXDNrsc.woff2) format('woff2'); + unicode-range: U+0460-052F, U+20B4, U+2DE0-2DFF, U+A640-A69F; +} +/* cyrillic */ +@font-face { + font-family: 'Noto Sans'; + font-style: normal; + font-weight: 400; + src: local('Noto Sans'), local('NotoSans'), url(notosans/v6/iLJc6PpCnnbQjYc1Jq4v0xJtnKITppOI_IvcXXDNrsc.woff2) format('woff2'); + unicode-range: U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; +} +/* devanagari */ +@font-face { + font-family: 'Noto Sans'; + font-style: normal; + font-weight: 400; + src: local('Noto Sans'), local('NotoSans'), url(notosans/v6/5pCv5Yz4eMu9gmvX8nNhfRJtnKITppOI_IvcXXDNrsc.woff2) format('woff2'); + unicode-range: U+02BC, U+0900-097F, U+1CD0-1CF6, U+1CF8-1CF9, U+200B-200D, U+20A8, U+20B9, U+25CC, U+A830-A839, U+A8E0-A8FB; +} +/* greek-ext */ +@font-face { + font-family: 'Noto Sans'; + font-style: normal; + font-weight: 400; + src: local('Noto Sans'), local('NotoSans'), url(notosans/v6/gEkd0pn-sMtQ_P4HUpi6WBJtnKITppOI_IvcXXDNrsc.woff2) format('woff2'); + unicode-range: U+1F00-1FFF; +} +/* greek */ +@font-face { + font-family: 'Noto Sans'; + font-style: normal; + font-weight: 400; + src: local('Noto Sans'), local('NotoSans'), url(notosans/v6/iPF-u8L1qkTPHaKjvXERnxJtnKITppOI_IvcXXDNrsc.woff2) format('woff2'); + unicode-range: U+0370-03FF; +} +/* vietnamese */ +@font-face { + font-family: 'Noto Sans'; + font-style: normal; + font-weight: 400; + src: local('Noto Sans'), local('NotoSans'), url(notosans/v6/mTzVK0-EJOCaJiOPeaz-hxJtnKITppOI_IvcXXDNrsc.woff2) format('woff2'); + unicode-range: U+0102-0103, U+1EA0-1EF9, U+20AB; +} +/* latin-ext */ +@font-face { + font-family: 'Noto Sans'; + font-style: normal; + font-weight: 400; + src: local('Noto Sans'), local('NotoSans'), url(notosans/v6/erE3KsIWUumgD1j_Ca-V-xJtnKITppOI_IvcXXDNrsc.woff2) format('woff2'); + unicode-range: U+0100-024F, U+1E00-1EFF, U+20A0-20AB, U+20AD-20CF, U+2C60-2C7F, U+A720-A7FF; +} +/* latin */ +@font-face { + font-family: 'Noto Sans'; + font-style: normal; + font-weight: 400; + src: local('Noto Sans'), local('NotoSans'), url(notosans/v6/LeFlHvsZjXu2c3ZRgBq9nFtXRa8TVwTICgirnJhmVJw.woff2) format('woff2'); + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2212, U+2215; +} +/* cyrillic-ext */ +@font-face { + font-family: 'Noto Sans'; + font-style: normal; + font-weight: 700; + src: local('Noto Sans Bold'), local('NotoSans-Bold'), url(notosans/v6/PIbvSEyHEdL91QLOQRnZ16-j2U0lmluP9RWlSytm3ho.woff2) format('woff2'); + unicode-range: U+0460-052F, U+20B4, U+2DE0-2DFF, U+A640-A69F; +} +/* cyrillic */ +@font-face { + font-family: 'Noto Sans'; + font-style: normal; + font-weight: 700; + src: local('Noto Sans Bold'), local('NotoSans-Bold'), url(notosans/v6/PIbvSEyHEdL91QLOQRnZ15X5f-9o1vgP2EXwfjgl7AY.woff2) format('woff2'); + unicode-range: U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; +} +/* devanagari */ +@font-face { + font-family: 'Noto Sans'; + font-style: normal; + font-weight: 700; + src: local('Noto Sans Bold'), local('NotoSans-Bold'), url(notosans/v6/PIbvSEyHEdL91QLOQRnZ10Tj6bCwSDA5u__Fbjwz3f0.woff2) format('woff2'); + unicode-range: U+02BC, U+0900-097F, U+1CD0-1CF6, U+1CF8-1CF9, U+200B-200D, U+20A8, U+20B9, U+25CC, U+A830-A839, U+A8E0-A8FB; +} +/* greek-ext */ +@font-face { + font-family: 'Noto Sans'; + font-style: normal; + font-weight: 700; + src: local('Noto Sans Bold'), local('NotoSans-Bold'), url(notosans/v6/PIbvSEyHEdL91QLOQRnZ1xWV49_lSm1NYrwo-zkhivY.woff2) format('woff2'); + unicode-range: U+1F00-1FFF; +} +/* greek */ +@font-face { + font-family: 'Noto Sans'; + font-style: normal; + font-weight: 700; + src: local('Noto Sans Bold'), local('NotoSans-Bold'), url(notosans/v6/PIbvSEyHEdL91QLOQRnZ16aRobkAwv3vxw3jMhVENGA.woff2) format('woff2'); + unicode-range: U+0370-03FF; +} +/* vietnamese */ +@font-face { + font-family: 'Noto Sans'; + font-style: normal; + font-weight: 700; + src: local('Noto Sans Bold'), local('NotoSans-Bold'), url(notosans/v6/PIbvSEyHEdL91QLOQRnZ1_8zf_FOSsgRmwsS7Aa9k2w.woff2) format('woff2'); + unicode-range: U+0102-0103, U+1EA0-1EF9, U+20AB; +} +/* latin-ext */ +@font-face { + font-family: 'Noto Sans'; + font-style: normal; + font-weight: 700; + src: local('Noto Sans Bold'), local('NotoSans-Bold'), url(notosans/v6/PIbvSEyHEdL91QLOQRnZ1z0LW-43aMEzIO6XUTLjad8.woff2) format('woff2'); + unicode-range: U+0100-024F, U+1E00-1EFF, U+20A0-20AB, U+20AD-20CF, U+2C60-2C7F, U+A720-A7FF; +} +/* latin */ +@font-face { + font-family: 'Noto Sans'; + font-style: normal; + font-weight: 700; + src: local('Noto Sans Bold'), local('NotoSans-Bold'), url(notosans/v6/PIbvSEyHEdL91QLOQRnZ1-gdm0LZdjqr5-oayXSOefg.woff2) format('woff2'); + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2212, U+2215; +} \ No newline at end of file diff --git a/tamguo-bms/src/main/resources/static/js/editor.js b/tamguo-bms/src/main/resources/static/js/editor.js index f006f71..800e93a 100644 --- a/tamguo-bms/src/main/resources/static/js/editor.js +++ b/tamguo-bms/src/main/resources/static/js/editor.js @@ -306,7 +306,7 @@ window.documentHistory = function() { shadeClose: true, shade: 0.8, area: ['700px','80%'], - content: window.historyURL + "?identify=" + window.book.identify + "&doc_id=" + window.selectNode.id, + content: window.historyURL + "?id=" + window.selectNode.id, end : function () { if(window.SelectedId){ var selected = {node:{ diff --git a/tamguo-bms/src/main/resources/static/mergely/editor/editor.css b/tamguo-bms/src/main/resources/static/mergely/editor/editor.css new file mode 100644 index 0000000..bc784c9 --- /dev/null +++ b/tamguo-bms/src/main/resources/static/mergely/editor/editor.css @@ -0,0 +1,85 @@ +body { margin: 0; } +#banner { background: transparent url(images/banner.png); width: 33px; height: 30px; position: absolute; left: 3px; top: 3px; } +.wicked-menu { font-family: 'Noto Sans', sans-serif; margin: 2px 0 2px 40px; } +.wicked-menu a.link { margin-left: 10px; } +.ui-widget { font-size:13px; } + +/* color dialog */ +#dialog-colors { } +#dialog-colors label { width: 85px; display: inline-block; font-weight: bold; padding: 5px; } +#dialog-colors input[type=text] { width: 70px; border: 1px solid #444; float:right; } +#dialog-colors fieldset { -webkit-border-radius: 2px; -moz-border-radius: 2px; border-radius: 2px; border: 1px solid #ccc; width: 222px; padding-right: 15px; } + +/* import dialog */ +#dialog-upload label { font-weight: bold; display: inline-block; width: 80px; line-height: 1.5em; } +.no-title .ui-dialog-titlebar { display:none; } +.no-title .ui-dialog-content { padding: 0; } +#file-lhs-progress, +#file-rhs-progress { height: 22px; width: 240px; vertical-align: middle; line-height: 1.5em; display: none; } +.progress-label { float: left; width: 100%; color: #fff; font-weight: bold; font-size: .8em; padding-left: 10px; } + +/* icons */ +.icon-undo { background-image: url(images/undo.png); } +.icon-redo { background-image: url(images/redo.png); } +.icon-save { background-image: url(images/download.png); } +.icon-check { background-image: url(images/check.png); } +.icon-import { background-image: url(images/upload.png); } +.icon-swap { background-image: url(images/swap.png); } +.icon-arrow-right { background-image: url(images/arrow-right.png); } +.icon-arrow-right-v { background-image: url(images/arrow-right-v.png); } +.icon-arrow-right-vv { background-image: url(images/arrow-right-vv.png); } +.icon-arrow-left-v { background-image: url(images/arrow-left-v.png); } +.icon-arrow-left-vv { background-image: url(images/arrow-left-vv.png); } +.icon-arrow-up { background-image: url(images/arrow-up-v.png); } +.icon-arrow-down { background-image: url(images/arrow-down-v.png); } +.icon-x-mark { background-image: url(images/x-mark.png); } +.icon-share { background-image: url(images/share.png); } + + +.tipsy-inner { + padding: 8px; + text-align: center; + max-width: 250px; + font-family: arial, sans-serif; + font-weight: bold; + font-size: 1.2em; +} + +.find { + position: absolute; + top: 0px; + right: 0px; + z-index: 4; + padding: 10px 20px 10px 10px; + background-color: #f5f5f5; + float: right; + border-left: 1px solid #ccc; + border-bottom: 1px solid #ccc; + border-bottom-left-radius: 10px; + max-height: 26px; + -webkit-box-shadow: rgba(0, 0, 0, .2) 0 2px 4px 0; + -moz-box-shadow: rgba(0, 0, 0, .2) 0 2px 4px 0; + box-shadow: rgba(0, 0, 0, .2) 0 2px 4px 0; + display: none; +} +.find > button { + padding: 3px 0px; + border: 1px solid #ccc; + border-radius: 3px; + height: 25px; + width: 26px; + vertical-align: top; + cursor: pointer; +} +.find > button:hover { + background-color: #f5f5f5; + border: 1px solid #aaa; +} + +.find > button > span.icon { + width: 16px; + height: 16px; + display: inline-block; + text-align: center; + background-position: center center; +} diff --git a/tamguo-bms/src/main/resources/static/mergely/editor/editor.js b/tamguo-bms/src/main/resources/static/mergely/editor/editor.js new file mode 100644 index 0000000..96e694c --- /dev/null +++ b/tamguo-bms/src/main/resources/static/mergely/editor/editor.js @@ -0,0 +1,699 @@ +$(document).ready(function() { + function getParameters() { + var parameters = {}; + window.location.search.substr(1).split('&').forEach(function(pair) { + if (pair === '') return; + var parts = pair.split('='); + if (parts.length === 2 && parts[1].search(/^(true|1)$/i) >= 0) { + parameters[parts[0]] = true; + } + else if (parts.length === 2 && parts[1].search(/^(false|0)$/i) >= 0) { + parameters[parts[0]] = false; + } + else parameters[parts[0]] = parts[1] && decodeURIComponent(parts[1].replace(/\+/g, ' ')); + }); + return { + get: function(name, defaultValue) { + if (parameters.hasOwnProperty(name)) return parameters[name]; + return defaultValue; + } + }; + } + var parameters = getParameters(); + if (parameters.get('test', false)) { + var li = $('
  • Tests
  • '); + var ul = $('