소스 검색

Notices

通知公告
MaxKey 4 년 전
부모
커밋
031970d00d
94개의 변경된 파일1855개의 추가작업 그리고 19개의 파일을 삭제
  1. 12 0
      maxkey-core/src/main/java/org/maxkey/configuration/ApplicationConfig.java
  2. 153 0
      maxkey-core/src/main/java/org/maxkey/domain/Notices.java
  3. 36 16
      maxkey-core/src/main/java/org/maxkey/web/WebXssRequestFilter.java
  4. 33 0
      maxkey-persistence/src/main/java/org/maxkey/persistence/mapper/NoticesMapper.java
  5. 45 0
      maxkey-persistence/src/main/java/org/maxkey/persistence/service/NoticesService.java
  6. 36 0
      maxkey-persistence/src/main/resources/org/maxkey/persistence/mapper/xml/mysql/NoticesMapper.xml
  7. 140 0
      maxkey-web-manage/src/main/java/org/maxkey/web/contorller/NoticesController.java
  8. 6 1
      maxkey-web-manage/src/main/resources/messages/message.properties
  9. 5 1
      maxkey-web-manage/src/main/resources/messages/message_en.properties
  10. 5 0
      maxkey-web-manage/src/main/resources/messages/message_zh_CN.properties
  11. 49 0
      maxkey-web-manage/src/main/resources/static/ckeditor5/LICENSE.md
  12. 68 0
      maxkey-web-manage/src/main/resources/static/ckeditor5/README.md
  13. 4 0
      maxkey-web-manage/src/main/resources/static/ckeditor5/build/ckeditor.js
  14. 0 0
      maxkey-web-manage/src/main/resources/static/ckeditor5/build/ckeditor.js.map
  15. 1 0
      maxkey-web-manage/src/main/resources/static/ckeditor5/build/translations/af.js
  16. 0 0
      maxkey-web-manage/src/main/resources/static/ckeditor5/build/translations/ar.js
  17. 1 0
      maxkey-web-manage/src/main/resources/static/ckeditor5/build/translations/ast.js
  18. 0 0
      maxkey-web-manage/src/main/resources/static/ckeditor5/build/translations/az.js
  19. 0 0
      maxkey-web-manage/src/main/resources/static/ckeditor5/build/translations/bg.js
  20. 1 0
      maxkey-web-manage/src/main/resources/static/ckeditor5/build/translations/ca.js
  21. 0 0
      maxkey-web-manage/src/main/resources/static/ckeditor5/build/translations/cs.js
  22. 0 0
      maxkey-web-manage/src/main/resources/static/ckeditor5/build/translations/da.js
  23. 1 0
      maxkey-web-manage/src/main/resources/static/ckeditor5/build/translations/de-ch.js
  24. 0 0
      maxkey-web-manage/src/main/resources/static/ckeditor5/build/translations/de.js
  25. 1 0
      maxkey-web-manage/src/main/resources/static/ckeditor5/build/translations/el.js
  26. 0 0
      maxkey-web-manage/src/main/resources/static/ckeditor5/build/translations/en-au.js
  27. 0 0
      maxkey-web-manage/src/main/resources/static/ckeditor5/build/translations/en-gb.js
  28. 0 0
      maxkey-web-manage/src/main/resources/static/ckeditor5/build/translations/en.js
  29. 1 0
      maxkey-web-manage/src/main/resources/static/ckeditor5/build/translations/eo.js
  30. 0 0
      maxkey-web-manage/src/main/resources/static/ckeditor5/build/translations/es.js
  31. 0 0
      maxkey-web-manage/src/main/resources/static/ckeditor5/build/translations/et.js
  32. 1 0
      maxkey-web-manage/src/main/resources/static/ckeditor5/build/translations/eu.js
  33. 0 0
      maxkey-web-manage/src/main/resources/static/ckeditor5/build/translations/fa.js
  34. 0 0
      maxkey-web-manage/src/main/resources/static/ckeditor5/build/translations/fi.js
  35. 0 0
      maxkey-web-manage/src/main/resources/static/ckeditor5/build/translations/fr.js
  36. 0 0
      maxkey-web-manage/src/main/resources/static/ckeditor5/build/translations/gl.js
  37. 1 0
      maxkey-web-manage/src/main/resources/static/ckeditor5/build/translations/gu.js
  38. 0 0
      maxkey-web-manage/src/main/resources/static/ckeditor5/build/translations/he.js
  39. 0 0
      maxkey-web-manage/src/main/resources/static/ckeditor5/build/translations/hi.js
  40. 0 0
      maxkey-web-manage/src/main/resources/static/ckeditor5/build/translations/hr.js
  41. 0 0
      maxkey-web-manage/src/main/resources/static/ckeditor5/build/translations/hu.js
  42. 0 0
      maxkey-web-manage/src/main/resources/static/ckeditor5/build/translations/id.js
  43. 0 0
      maxkey-web-manage/src/main/resources/static/ckeditor5/build/translations/it.js
  44. 0 0
      maxkey-web-manage/src/main/resources/static/ckeditor5/build/translations/ja.js
  45. 0 0
      maxkey-web-manage/src/main/resources/static/ckeditor5/build/translations/km.js
  46. 0 0
      maxkey-web-manage/src/main/resources/static/ckeditor5/build/translations/kn.js
  47. 0 0
      maxkey-web-manage/src/main/resources/static/ckeditor5/build/translations/ko.js
  48. 0 0
      maxkey-web-manage/src/main/resources/static/ckeditor5/build/translations/ku.js
  49. 0 0
      maxkey-web-manage/src/main/resources/static/ckeditor5/build/translations/lt.js
  50. 0 0
      maxkey-web-manage/src/main/resources/static/ckeditor5/build/translations/lv.js
  51. 0 0
      maxkey-web-manage/src/main/resources/static/ckeditor5/build/translations/nb.js
  52. 0 0
      maxkey-web-manage/src/main/resources/static/ckeditor5/build/translations/ne.js
  53. 0 0
      maxkey-web-manage/src/main/resources/static/ckeditor5/build/translations/nl.js
  54. 0 0
      maxkey-web-manage/src/main/resources/static/ckeditor5/build/translations/no.js
  55. 1 0
      maxkey-web-manage/src/main/resources/static/ckeditor5/build/translations/oc.js
  56. 0 0
      maxkey-web-manage/src/main/resources/static/ckeditor5/build/translations/pl.js
  57. 0 0
      maxkey-web-manage/src/main/resources/static/ckeditor5/build/translations/pt-br.js
  58. 1 0
      maxkey-web-manage/src/main/resources/static/ckeditor5/build/translations/pt.js
  59. 0 0
      maxkey-web-manage/src/main/resources/static/ckeditor5/build/translations/ro.js
  60. 0 0
      maxkey-web-manage/src/main/resources/static/ckeditor5/build/translations/ru.js
  61. 1 0
      maxkey-web-manage/src/main/resources/static/ckeditor5/build/translations/si.js
  62. 0 0
      maxkey-web-manage/src/main/resources/static/ckeditor5/build/translations/sk.js
  63. 1 0
      maxkey-web-manage/src/main/resources/static/ckeditor5/build/translations/sl.js
  64. 0 0
      maxkey-web-manage/src/main/resources/static/ckeditor5/build/translations/sq.js
  65. 0 0
      maxkey-web-manage/src/main/resources/static/ckeditor5/build/translations/sr-latn.js
  66. 0 0
      maxkey-web-manage/src/main/resources/static/ckeditor5/build/translations/sr.js
  67. 0 0
      maxkey-web-manage/src/main/resources/static/ckeditor5/build/translations/sv.js
  68. 0 0
      maxkey-web-manage/src/main/resources/static/ckeditor5/build/translations/th.js
  69. 0 0
      maxkey-web-manage/src/main/resources/static/ckeditor5/build/translations/tk.js
  70. 0 0
      maxkey-web-manage/src/main/resources/static/ckeditor5/build/translations/tr.js
  71. 1 0
      maxkey-web-manage/src/main/resources/static/ckeditor5/build/translations/tt.js
  72. 0 0
      maxkey-web-manage/src/main/resources/static/ckeditor5/build/translations/ug.js
  73. 0 0
      maxkey-web-manage/src/main/resources/static/ckeditor5/build/translations/uk.js
  74. 0 0
      maxkey-web-manage/src/main/resources/static/ckeditor5/build/translations/vi.js
  75. 0 0
      maxkey-web-manage/src/main/resources/static/ckeditor5/build/translations/zh.js
  76. 41 0
      maxkey-web-manage/src/main/resources/static/ckeditor5/package.json
  77. 165 0
      maxkey-web-manage/src/main/resources/static/ckeditor5/sample/index.html
  78. 465 0
      maxkey-web-manage/src/main/resources/static/ckeditor5/sample/styles.css
  79. 53 0
      maxkey-web-manage/src/main/resources/static/ckeditor5/src/ckeditor.js
  80. 96 0
      maxkey-web-manage/src/main/resources/static/ckeditor5/webpack.config.js
  81. 6 0
      maxkey-web-manage/src/main/resources/templates/views/layout/sidenav.ftl
  82. 124 0
      maxkey-web-manage/src/main/resources/templates/views/notices/noticeAdd.ftl
  83. 123 0
      maxkey-web-manage/src/main/resources/templates/views/notices/noticeUpdate.ftl
  84. 130 0
      maxkey-web-manage/src/main/resources/templates/views/notices/noticesList.ftl
  85. 7 0
      maxkey-web-maxkey/src/main/java/org/maxkey/web/contorller/AppListController.java
  86. 13 0
      maxkey-web-maxkey/src/main/java/org/maxkey/web/endpoint/IndexEndpoint.java
  87. 1 0
      maxkey-web-maxkey/src/main/resources/application-http.properties
  88. 1 0
      maxkey-web-maxkey/src/main/resources/application-https.properties
  89. 2 0
      maxkey-web-maxkey/src/main/resources/messages/message.properties
  90. 1 0
      maxkey-web-maxkey/src/main/resources/messages/message_en.properties
  91. 2 0
      maxkey-web-maxkey/src/main/resources/messages/message_zh_CN.properties
  92. 1 1
      maxkey-web-maxkey/src/main/resources/templates/views/index.ftl
  93. 6 0
      maxkey-web-maxkey/src/main/resources/templates/views/main/appList.ftl
  94. 13 0
      maxkey-web-maxkey/src/main/resources/templates/views/notices.ftl

+ 12 - 0
maxkey-core/src/main/java/org/maxkey/configuration/ApplicationConfig.java

@@ -79,6 +79,10 @@ public class ApplicationConfig {
     @Value("${maxkey.maxkey.uri}")
     private String maxKeyUri;
     
+    @Value("${maxkey.notices.visible:false}")
+    private boolean noticesVisible;
+    
+    
     public int getPort() {
         return port;
     }
@@ -206,6 +210,14 @@ public class ApplicationConfig {
 		this.sessionTimeout = sessionTimeout;
 	}
 
+	public boolean isNoticesVisible() {
+		return noticesVisible;
+	}
+
+	public void setNoticesVisible(boolean noticesVisible) {
+		this.noticesVisible = noticesVisible;
+	}
+
 	@Override
     public String toString() {
         StringBuilder builder = new StringBuilder();

+ 153 - 0
maxkey-core/src/main/java/org/maxkey/domain/Notices.java

@@ -0,0 +1,153 @@
+package org.maxkey.domain;
+
+import java.io.Serializable;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+import javax.persistence.Table;
+
+import org.apache.mybatis.jpa.persistence.JpaBaseDomain;
+
+@Entity
+@Table(name = "MXK_NOTICES")
+public class Notices  extends JpaBaseDomain implements Serializable {
+
+    /**
+	 * 
+	 */
+	private static final long serialVersionUID = -652272084068874816L;
+	
+	@Id
+    @Column
+    @GeneratedValue(strategy = GenerationType.AUTO, generator = "uuid")
+    protected String id;
+    /**
+     * 
+     */
+    @Column
+    private String title;
+
+    @Column
+    private String content;
+    
+    @Column
+    private int status;
+
+    @Column
+    protected String createdBy;
+    @Column
+    protected String createdDate;
+    @Column
+    protected String modifiedBy;
+    @Column
+    protected String modifiedDate;
+    @Column
+    protected String description;
+    
+    
+	public Notices() {
+
+	}
+
+	public String getId() {
+		return id;
+	}
+
+	public void setId(String id) {
+		this.id = id;
+	}
+
+	public String getTitle() {
+		return title;
+	}
+
+	public void setTitle(String title) {
+		this.title = title;
+	}
+
+	public String getContent() {
+		return content;
+	}
+
+	public void setContent(String content) {
+		this.content = content;
+	}
+
+	public int getStatus() {
+		return status;
+	}
+
+	public void setStatus(int status) {
+		this.status = status;
+	}
+
+	public String getCreatedBy() {
+		return createdBy;
+	}
+
+	public void setCreatedBy(String createdBy) {
+		this.createdBy = createdBy;
+	}
+
+	public String getCreatedDate() {
+		return createdDate;
+	}
+
+	public void setCreatedDate(String createdDate) {
+		this.createdDate = createdDate;
+	}
+
+	public String getModifiedBy() {
+		return modifiedBy;
+	}
+
+	public void setModifiedBy(String modifiedBy) {
+		this.modifiedBy = modifiedBy;
+	}
+
+	public String getModifiedDate() {
+		return modifiedDate;
+	}
+
+	public void setModifiedDate(String modifiedDate) {
+		this.modifiedDate = modifiedDate;
+	}
+
+	public String getDescription() {
+		return description;
+	}
+
+	public void setDescription(String description) {
+		this.description = description;
+	}
+
+	@Override
+	public String toString() {
+		StringBuilder builder = new StringBuilder();
+		builder.append("Notices [id=");
+		builder.append(id);
+		builder.append(", title=");
+		builder.append(title);
+		builder.append(", content=");
+		builder.append(content);
+		builder.append(", status=");
+		builder.append(status);
+		builder.append(", createdBy=");
+		builder.append(createdBy);
+		builder.append(", createdDate=");
+		builder.append(createdDate);
+		builder.append(", modifiedBy=");
+		builder.append(modifiedBy);
+		builder.append(", modifiedDate=");
+		builder.append(modifiedDate);
+		builder.append(", description=");
+		builder.append(description);
+		builder.append("]");
+		return builder.toString();
+	}
+    
+    
+}

+ 36 - 16
maxkey-core/src/main/java/org/maxkey/web/WebXssRequestFilter.java

@@ -2,11 +2,13 @@ package org.maxkey.web;
 
 import java.io.IOException;
 import java.util.Enumeration;
+import java.util.concurrent.ConcurrentHashMap;
 
 import javax.servlet.FilterChain;
 import javax.servlet.ServletException;
 import javax.servlet.ServletRequest;
 import javax.servlet.ServletResponse;
+import javax.servlet.http.HttpServletRequest;
 
 import org.apache.commons.text.StringEscapeUtils;
 import org.slf4j.Logger;
@@ -17,26 +19,44 @@ public class WebXssRequestFilter  extends GenericFilterBean {
 
 	final static Logger _logger = LoggerFactory.getLogger(GenericFilterBean.class);	
 	
+	final static ConcurrentHashMap <String,String> skipUrlMap = new  ConcurrentHashMap <String,String>();
+	
+	static {
+		skipUrlMap.put("/notices/add", "");
+		skipUrlMap.put("/notices/update", "");
+	}
+	
 	@Override
-	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
+	public void doFilter(ServletRequest servletRequest, ServletResponse response, FilterChain chain)
 			throws IOException, ServletException {
 		_logger.trace("WebXssRequestFilter");
+		
 		boolean isWebXss = false;
-        Enumeration<String> parameterNames = request.getParameterNames();
-        while (parameterNames.hasMoreElements()) {
-          String key = (String) parameterNames.nextElement();
-          String value = request.getParameter(key);
-          _logger.trace("parameter name "+key +" , value " + value);
-          String tempValue = value;
-          if(!StringEscapeUtils.escapeHtml4(tempValue).equals(value)
-        		  ||tempValue.toLowerCase().indexOf("script")>-1
-        		  ||tempValue.toLowerCase().replace(" ", "").indexOf("eval(")>-1) {
-        	  isWebXss = true;
-        	  _logger.error("parameter name "+key +" , value " + value 
-        			  		+ ", contains dangerous content ! ");
-        	  break;
-          }
-        }
+		HttpServletRequest request= ((HttpServletRequest)servletRequest);
+		String requestURI=request.getRequestURI();
+		_logger.trace("getContextPath " +request.getContextPath());
+		_logger.trace("getRequestURL " + ((HttpServletRequest)request).getRequestURI());
+		_logger.trace("URL " +requestURI.substring(request.getContextPath().length()));
+		
+		if(skipUrlMap.containsKey(requestURI.substring(request.getContextPath().length()))) {
+			isWebXss = false;
+		}else {
+	        Enumeration<String> parameterNames = request.getParameterNames();
+	        while (parameterNames.hasMoreElements()) {
+	          String key = (String) parameterNames.nextElement();
+	          String value = request.getParameter(key);
+	          _logger.trace("parameter name "+key +" , value " + value);
+	          String tempValue = value;
+	          if(!StringEscapeUtils.escapeHtml4(tempValue).equals(value)
+	        		  ||tempValue.toLowerCase().indexOf("script")>-1
+	        		  ||tempValue.toLowerCase().replace(" ", "").indexOf("eval(")>-1) {
+	        	  isWebXss = true;
+	        	  _logger.error("parameter name "+key +" , value " + value 
+	        			  		+ ", contains dangerous content ! ");
+	        	  break;
+	          }
+	        }
+		}
         if(!isWebXss) {
         	chain.doFilter(request, response);
         }  

+ 33 - 0
maxkey-persistence/src/main/java/org/maxkey/persistence/mapper/NoticesMapper.java

@@ -0,0 +1,33 @@
+/*
+ * Copyright [2021] [MaxKey of copyright http://www.maxkey.top]
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ 
+
+/**
+ * 
+ */
+package org.maxkey.persistence.mapper;
+
+import org.apache.mybatis.jpa.persistence.IJpaBaseMapper;
+import org.maxkey.domain.Notices;
+
+/**
+ * @author Crystal.sea
+ *
+ */
+public  interface NoticesMapper extends IJpaBaseMapper<Notices> {
+
+    public Notices queryLastedNotices();
+}

+ 45 - 0
maxkey-persistence/src/main/java/org/maxkey/persistence/service/NoticesService.java

@@ -0,0 +1,45 @@
+/*
+ * Copyright [2021] [MaxKey of copyright http://www.maxkey.top]
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ 
+
+package org.maxkey.persistence.service;
+
+import org.apache.mybatis.jpa.persistence.JpaBaseService;
+import org.maxkey.domain.Notices;
+import org.maxkey.persistence.mapper.NoticesMapper;
+import org.springframework.stereotype.Repository;
+
+@Repository
+public class NoticesService  extends JpaBaseService<Notices>{
+
+	public NoticesService() {
+		super(NoticesMapper.class);
+	}
+
+	/* (non-Javadoc)
+	 * @see com.connsec.db.service.BaseService#getMapper()
+	 */
+	@Override
+	public NoticesMapper getMapper() {
+		// TODO Auto-generated method stub
+		return (NoticesMapper)super.getMapper();
+	}
+	
+	
+	public Notices queryLastedNotices() {
+		return getMapper().queryLastedNotices();
+	}
+}

+ 36 - 0
maxkey-persistence/src/main/resources/org/maxkey/persistence/mapper/xml/mysql/NoticesMapper.xml

@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="org.maxkey.persistence.mapper.NoticesMapper">
+
+	<sql id="where_statement">
+    	<if test="id != null and id != ''">
+			AND	ID	=	#{id}
+		</if> 
+		<if test="title != null and title != ''">
+			AND TITLE  LIKE  '%${title}%'
+		</if> 
+    </sql>
+    
+	
+	
+	<select id="queryPageResults" parameterType="Notices" resultType="Notices">
+		SELECT
+			*
+		FROM
+			MXK_NOTICES
+		WHERE
+			 (1=1)	
+		<include refid="where_statement"/>
+		ORDER BY  MODIFIEDDATE DESC
+	</select>
+	
+	<select id="queryLastedNotices" parameterType="Notices" resultType="Notices">
+		SELECT
+			*
+		FROM
+			MXK_NOTICES
+		ORDER BY  MODIFIEDDATE DESC
+		LIMIT 1
+	</select>
+	
+</mapper>

+ 140 - 0
maxkey-web-manage/src/main/java/org/maxkey/web/contorller/NoticesController.java

@@ -0,0 +1,140 @@
+/*
+ * Copyright [2020] [MaxKey of copyright http://www.maxkey.top]
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ 
+
+package org.maxkey.web.contorller;
+
+import org.apache.mybatis.jpa.persistence.JpaPageResults;
+import org.maxkey.constants.ConstantsOperateMessage;
+import org.maxkey.domain.Notices;
+import org.maxkey.persistence.service.NoticesService;
+import org.maxkey.web.WebContext;
+import org.maxkey.web.message.Message;
+import org.maxkey.web.message.MessageType;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.ModelAttribute;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+import org.springframework.web.servlet.ModelAndView;
+
+
+@Controller
+@RequestMapping(value={"/notices"})
+public class NoticesController {
+	final static Logger _logger = LoggerFactory.getLogger(NoticesController.class);
+	
+	@Autowired
+	@Qualifier("noticesService")
+	NoticesService noticesService;
+
+	@RequestMapping(value={"/list"})
+	public ModelAndView noticesList(){
+		return new ModelAndView("notices/noticesList");
+	}
+
+	
+	@RequestMapping(value = { "/grid" })
+	@ResponseBody
+	public JpaPageResults<Notices> queryDataGrid(@ModelAttribute("notices") Notices notice) {
+		_logger.debug(""+notice);
+		return noticesService.queryPageResults(notice);
+	}
+
+	
+	@RequestMapping(value = { "/forwardAdd" })
+	public ModelAndView forwardAdd() {
+		return new ModelAndView("notices/noticeAdd");
+	}
+	
+	@RequestMapping(value = { "/forwardUpdate/{id}" })
+	public ModelAndView forwardUpdate(@PathVariable("id") String id) {
+		ModelAndView modelAndView=new ModelAndView("notices/noticeUpdate");
+		Notices notice=noticesService.get(id);
+		modelAndView.addObject("model",notice);
+		return modelAndView;
+	}
+	
+	@ResponseBody
+	@RequestMapping(value={"/add"})
+	public Message insert(@ModelAttribute("notice")Notices notice) {
+		_logger.debug("-Add  :" + notice);
+		
+		if (noticesService.insert(notice)) {
+			return  new Message(WebContext.getI18nValue(ConstantsOperateMessage.INSERT_SUCCESS),MessageType.success);
+			
+		} else {
+			return  new Message(WebContext.getI18nValue(ConstantsOperateMessage.INSERT_SUCCESS),MessageType.error);
+		}
+		
+	}
+	
+	/**
+	 * 查询
+	 * @param role
+	 * @return
+	 */
+	@ResponseBody
+	@RequestMapping(value={"/query"}) 
+	public Message query(@ModelAttribute("notice")Notices notice) {
+		_logger.debug("-query  :" + notice);
+		if (noticesService.load(notice)!=null) {
+			return  new Message(WebContext.getI18nValue(ConstantsOperateMessage.INSERT_SUCCESS),MessageType.success);
+			
+		} else {
+			return  new Message(WebContext.getI18nValue(ConstantsOperateMessage.INSERT_ERROR),MessageType.error);
+		}
+		
+	}
+	
+	/**
+	 * 修改
+	 * @param role
+	 * @return
+	 */
+	@ResponseBody
+	@RequestMapping(value={"/update"})  
+	public Message update(@ModelAttribute("notice")Notices notice) {
+		_logger.debug("-update  notice :" + notice);
+		
+		if (noticesService.update(notice)) {
+			return  new Message(WebContext.getI18nValue(ConstantsOperateMessage.UPDATE_SUCCESS),MessageType.success);
+			
+		} else {
+			return  new Message(WebContext.getI18nValue(ConstantsOperateMessage.UPDATE_ERROR),MessageType.error);
+		}
+		
+	}
+	
+
+	@ResponseBody
+	@RequestMapping(value={"/delete"})
+	public Message delete(@ModelAttribute("notice")Notices notice) {
+		_logger.debug("-delete  notice :" + notice);
+		
+		if (noticesService.remove(notice.getId())) {
+			return  new Message(WebContext.getI18nValue(ConstantsOperateMessage.DELETE_SUCCESS),MessageType.success);
+			
+		} else {
+			return  new Message(WebContext.getI18nValue(ConstantsOperateMessage.DELETE_SUCCESS),MessageType.error);
+		}
+		
+	}
+}

+ 6 - 1
maxkey-web-manage/src/main/resources/messages/message.properties

@@ -525,6 +525,10 @@ import.template.download=\u4e0b\u8f7d\u6a21\u677f
 import.update.exist=\u66f4\u65b0\u5b58\u5728\u6570\u636e
 import.tip=\u63d0\u793a\uff1a\u4ec5\u5141\u8bb8\u5bfc\u5165\u201cxls\u201d\u6216\u8005\u201cxlsx\u201d\u683c\u5f0f\u7684\u6587\u4ef6 
 
+#Notices
+notices.title=\u6807\u9898
+notices.content=\u5185\u5BB9
+
 navs.system=\u7cfb\u7edf
 navs.home=\u9996\u9875
 navs.orgs=\u673a\u6784\u7ba1\u7406
@@ -544,4 +548,5 @@ navs.roles=\u89d2\u8272\u7ba1\u7406
 navs.role.member=\u89d2\u8272\u7528\u6237
 navs.role.permissions=\u89d2\u8272\u6743\u9650\u7ba1\u7406
 navs.resources=\u8d44\u6e90\u7ba1\u7406
-navs.adapters=\u9002\u914D\u5668\u6CE8\u518C
+navs.adapters=\u9002\u914D\u5668\u6CE8\u518C
+navs.notices=\u901A\u77E5\u516C\u544A

+ 5 - 1
maxkey-web-manage/src/main/resources/messages/message_en.properties

@@ -524,6 +524,9 @@ import.template.download=Download Template
 import.update.exist=Update Exist Data
 import.tip=Tip\uff1aolny Import \u201cxls\u201d or \u201cxlsx\u201d file\u3002
 
+#Notices
+notices.title=name
+notices.content=content
 
 navs.system=System
 navs.home=Home
@@ -544,4 +547,5 @@ navs.roles=Roles
 navs.role.member=RoleMember
 navs.role.permissions=Permissions
 navs.resources=Resources
-navs.adapters=Adapters
+navs.adapters=Adapters
+navs.notices=Notices

+ 5 - 0
maxkey-web-manage/src/main/resources/messages/message_zh_CN.properties

@@ -525,6 +525,10 @@ import.template.download=\u4e0b\u8f7d\u6a21\u677f
 import.update.exist=\u66f4\u65b0\u5b58\u5728\u6570\u636e
 import.tip=\u63d0\u793a\uff1a\u4ec5\u5141\u8bb8\u5bfc\u5165\u201cxls\u201d\u6216\u8005\u201cxlsx\u201d\u683c\u5f0f\u7684\u6587\u4ef6 
 
+#Notices
+notices.title=\u6807\u9898
+notices.content=\u5185\u5BB9
+
 navs.system=\u7cfb\u7edf
 navs.home=\u9996\u9875
 navs.orgs=\u673a\u6784\u7ba1\u7406
@@ -545,3 +549,4 @@ navs.role.member=\u89d2\u8272\u7528\u6237
 navs.role.permissions=\u89d2\u8272\u6743\u9650\u7ba1\u7406
 navs.resources=\u8d44\u6e90\u7ba1\u7406
 navs.adapters=\u9002\u914D\u5668\u6CE8\u518C
+navs.notices=\u901A\u77E5\u516C\u544A

+ 49 - 0
maxkey-web-manage/src/main/resources/static/ckeditor5/LICENSE.md

@@ -0,0 +1,49 @@
+Software License Agreement
+==========================
+
+Copyright (c) 2014-2021, CKSource - Frederico Knabben. All rights reserved.
+
+Online builder code samples are licensed under the terms of the MIT License (see Appendix A):
+
+	http://en.wikipedia.org/wiki/MIT_License
+
+CKEditor 5 collaboration features are only available under a commercial license. [Contact us](https://ckeditor.com/contact/) for more details.
+
+Free 30-days trials of CKEditor 5 collaboration features are available:
+ * https://ckeditor.com/collaboration/ - Real-time collaboration (with all features).
+ * https://ckeditor.com/collaboration/comments/ - Inline comments feature (without real-time collaborative editing).
+ * https://ckeditor.com/collaboration/track-changes/ - Track changes feature (without real-time collaborative editing).
+
+Trademarks
+----------
+
+CKEditor is a trademark of CKSource - Frederico Knabben. All other brand
+and product names are trademarks, registered trademarks or service
+marks of their respective holders.
+
+---
+
+Appendix A: The MIT License
+---------------------------
+
+The MIT License (MIT)
+
+Copyright (c) 2014-2021, CKSource - Frederico Knabben
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.

+ 68 - 0
maxkey-web-manage/src/main/resources/static/ckeditor5/README.md

@@ -0,0 +1,68 @@
+# CKEditor 5 editor generated with the online builder
+
+This repository presents a CKEditor 5 editor build generated by the [Online builder tool](https://ckeditor.com/ckeditor-5/online-builder)
+
+## Quick start
+
+1. Open the `sample/index.html` page in the browser.
+
+If you picked the real-time collaboration plugins:
+
+2. Fill the dialog with correct token, websocket and upload URL endpoints. If you do not have these yet or do not know their meaning, [contact us](https://ckeditor.com/contact/).
+
+3. Copy the URL and share it or paste in another tab to enjoy real-time collaborative editing.
+
+If you picked the non-real-time collaboration plugins:
+
+2. Fill the prompt with the license key. If you do not have the license key yet [contact us](https://ckeditor.com/contact/).
+
+## Configuring build
+
+Changes like changing toolbar items, changing order of icons or customizing plugin configurations should be relatively easy to make. Open the `sample/index.html` file and edit the script that initialized the CKEditor 5. Save the file and refresh the browser. That's all.
+
+*Note:* If you have any problems with browser caching use the `Ctrl + R` or `Cmd + R` shortcut depending on your system.
+
+However if you want to remove or add a plugin to the build you need to follow the next step of this guide.
+
+Note that it is also possible to go back to the [Online builder tool](https://ckeditor.com/ckeditor-5/online-builder) and pick other set of plugins. But we encourage you to try the harder way and to learn the principles of Node.js and CKEditor 5 ecosystems that will allow you to do more cool things in the future!
+
+### Installation
+
+In order to rebuild the application you need to install all dependencies first. To do it, open the terminal in the project directory and type:
+
+```
+npm install
+```
+
+Make sure that you have the `node` and `npm` installed first. If not, then follow the instructions on the [Node.js documentation page](https://nodejs.org/en/).
+
+### Adding or removing plugins
+
+Now you can install additional plugin in the build. Just follow the [Adding a plugin to an editor tutorial](https://ckeditor.com/docs/ckeditor5/latest/builds/guides/integration/installing-plugins.html#adding-a-plugin-to-an-editor)
+
+### Rebuilding editor
+
+If you have already done the [Installation](#installation) and [Adding or removing plugins](#adding-or-removing-plugins) steps, you're ready to rebuild the editor by running the following command:
+
+```
+npm run build
+```
+
+This will build the CKEditor 5 to the `build` directory. You can open your browser and you should be able to see the changes you've made in the code. If not, then try to refresh also the browser cache by typing `Ctrl + R` or `Cmd + R` depending on your system.
+
+## What's next?
+
+Follow the guides available on https://ckeditor.com/docs/ckeditor5/latest/framework/index.html and enjoy the document editing.
+
+## FAQ
+| Where is the place to report bugs and feature requests?
+
+You can create an issue on https://github.com/ckeditor/ckeditor5/issues including the build id - `ejuf0r2j7w54-jfha1cexgplv`. Make sure that the question / problem is unique, please look for a possibly asked questions in the search box. Duplicates will be closed.
+
+| Where can I learn more about the CKEditor 5 framework?
+
+Here: https://ckeditor.com/docs/ckeditor5/latest/framework/
+
+| Is it possible to use online builder with common frameworks like React, Vue or Angular?
+
+Not yet, but it these integrations will be available at some point in the future.

파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 4 - 0
maxkey-web-manage/src/main/resources/static/ckeditor5/build/ckeditor.js


파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 0 - 0
maxkey-web-manage/src/main/resources/static/ckeditor5/build/ckeditor.js.map


+ 1 - 0
maxkey-web-manage/src/main/resources/static/ckeditor5/build/translations/af.js

@@ -0,0 +1 @@
+(function(n){const a=n["af"]=n["af"]||{};a.dictionary=Object.assign(a.dictionary||{},{"Block quote":"Blok-aanhaling",Bold:"Vetgedruk",Cancel:"Kanselleer",Italic:"Skuinsgedruk",Save:"Berg"});a.getPluralForm=function(n){return n!=1}})(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));

파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 0 - 0
maxkey-web-manage/src/main/resources/static/ckeditor5/build/translations/ar.js


+ 1 - 0
maxkey-web-manage/src/main/resources/static/ckeditor5/build/translations/ast.js

@@ -0,0 +1 @@
+(function(e){const a=e["ast"]=e["ast"]||{};a.dictionary=Object.assign(a.dictionary||{},{"%0 of %1":"",Aquamarine:"",Black:"",Blue:"",Bold:"Negrina","Bulleted List":"Llista con viñetes",Cancel:"Encaboxar","Centered image":"","Change image text alternative":"","Dim grey":"",Downloadable:"","Dropdown toolbar":"","Edit block":"","Edit link":"","Editor toolbar":"","Enter image caption":"","Full size image":"Imaxen a tamañu completu",Green:"",Grey:"","Image toolbar":"","image widget":"complementu d'imaxen",Italic:"Cursiva","Left aligned image":"","Light blue":"","Light green":"","Light grey":"",Link:"Enllazar","Link URL":"URL del enllaz",Next:"","Numbered List":"Llista numberada","Open in a new tab":"","Open link in new tab":"",Orange:"",Previous:"",Purple:"",Red:"",Redo:"Refacer","Rich Text Editor":"Editor de testu arriquecíu","Rich Text Editor, %0":"Editor de testu arriquecíu, %0","Right aligned image":"",Save:"Guardar","Show more items":"","Side image":"Imaxen llateral","Text alternative":"","This link has no URL":"",Turquoise:"",Undo:"Desfacer",Unlink:"Desenllazar",White:"",Yellow:""});a.getPluralForm=function(e){return e!=1}})(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));

파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 0 - 0
maxkey-web-manage/src/main/resources/static/ckeditor5/build/translations/az.js


파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 0 - 0
maxkey-web-manage/src/main/resources/static/ckeditor5/build/translations/bg.js


+ 1 - 0
maxkey-web-manage/src/main/resources/static/ckeditor5/build/translations/ca.js

@@ -0,0 +1 @@
+(function(a){const e=a["ca"]=a["ca"]||{};e.dictionary=Object.assign(e.dictionary||{},{"Block quote":"Cita de bloc",Bold:"Negreta",Cancel:"Cancel·lar","Choose heading":"Escull capçalera",Heading:"Capçalera","Heading 1":"Capçalera 1","Heading 2":"Capçalera 2","Heading 3":"Capçalera 3","Heading 4":"","Heading 5":"","Heading 6":"",Italic:"Cursiva",Paragraph:"Pàrraf",Save:"Desar"});e.getPluralForm=function(a){return a!=1}})(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));

파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 0 - 0
maxkey-web-manage/src/main/resources/static/ckeditor5/build/translations/cs.js


파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 0 - 0
maxkey-web-manage/src/main/resources/static/ckeditor5/build/translations/da.js


+ 1 - 0
maxkey-web-manage/src/main/resources/static/ckeditor5/build/translations/de-ch.js

@@ -0,0 +1 @@
+(function(e){const l=e["de-ch"]=e["de-ch"]||{};l.dictionary=Object.assign(l.dictionary||{},{"%0 of %1":"",Aquamarine:"",Black:"","Block quote":"Blockzitat",Blue:"",Column:"Spalte","Delete column":"Spalte löschen","Delete row":"Zeile löschen","Dim grey":"","Dropdown toolbar":"","Edit block":"","Editor toolbar":"",Green:"",Grey:"","Header column":"Kopfspalte","Header row":"Kopfspalte","Insert column left":"","Insert column right":"","Insert row above":"Zeile oben einfügen","Insert row below":"Zeile unten einfügen","Insert table":"Tabelle einfügen","Light blue":"","Light green":"","Light grey":"","Merge cell down":"Zelle unten verbinden","Merge cell left":"Zelle links verbinden","Merge cell right":"Zele rechts verbinden","Merge cell up":"Zelle oben verbinden","Merge cells":"Zellen verbinden",Next:"",Orange:"",Previous:"",Purple:"",Red:"",Redo:"Wiederherstellen","Rich Text Editor":"Rich-Text-Edito","Rich Text Editor, %0":"Rich-Text-Editor, %0",Row:"Zeile","Select column":"","Select row":"","Show more items":"","Split cell horizontally":"Zelle horizontal teilen","Split cell vertically":"Zelle vertikal teilen","Table toolbar":"",Turquoise:"",Undo:"Rückgängig",White:"",Yellow:""});l.getPluralForm=function(e){return e!=1}})(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));

파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 0 - 0
maxkey-web-manage/src/main/resources/static/ckeditor5/build/translations/de.js


+ 1 - 0
maxkey-web-manage/src/main/resources/static/ckeditor5/build/translations/el.js

@@ -0,0 +1 @@
+(function(e){const i=e["el"]=e["el"]||{};i.dictionary=Object.assign(i.dictionary||{},{"%0 of %1":"",Aquamarine:"",Black:"","Block quote":"Περιοχή παράθεσης",Blue:"",Bold:"Έντονη","Bulleted List":"Λίστα κουκκίδων",Cancel:"Ακύρωση","Centered image":"","Change image text alternative":"Αλλαγή εναλλακτικού κείμενου","Choose heading":"Επιλέξτε κεφαλίδα","Dim grey":"",Downloadable:"","Dropdown toolbar":"","Edit block":"","Edit link":"","Editor toolbar":"","Enter image caption":"Λεζάντα","Full size image":"Εικόνα πλήρης μεγέθους",Green:"",Grey:"",Heading:"Κεφαλίδα","Heading 1":"Κεφαλίδα 1","Heading 2":"Κεφαλίδα 2","Heading 3":"Κεφαλίδα 3","Heading 4":"","Heading 5":"","Heading 6":"","Image toolbar":"","image widget":"",Italic:"Πλάγια","Left aligned image":"","Light blue":"","Light green":"","Light grey":"",Link:"Σύνδεσμος","Link URL":"Διεύθυνση συνδέσμου",Next:"","Numbered List":"Αριθμημένη λίστα","Open in a new tab":"","Open link in new tab":"",Orange:"",Paragraph:"Παράγραφος",Previous:"",Purple:"",Red:"",Redo:"Επανάληψη","Rich Text Editor":"Επεξεργαστής Πλούσιου Κειμένου","Rich Text Editor, %0":"Επεξεργαστής Πλούσιου Κειμένου, 0%","Right aligned image":"",Save:"Αποθήκευση","Show more items":"","Side image":"","Text alternative":"Εναλλακτικό κείμενο","This link has no URL":"",Turquoise:"",Undo:"Αναίρεση",Unlink:"Αφαίρεση συνδέσμου",White:"",Yellow:""});i.getPluralForm=function(e){return e!=1}})(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));

파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 0 - 0
maxkey-web-manage/src/main/resources/static/ckeditor5/build/translations/en-au.js


파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 0 - 0
maxkey-web-manage/src/main/resources/static/ckeditor5/build/translations/en-gb.js


파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 0 - 0
maxkey-web-manage/src/main/resources/static/ckeditor5/build/translations/en.js


+ 1 - 0
maxkey-web-manage/src/main/resources/static/ckeditor5/build/translations/eo.js

@@ -0,0 +1 @@
+(function(e){const i=e["eo"]=e["eo"]||{};i.dictionary=Object.assign(i.dictionary||{},{"%0 of %1":"",Aquamarine:"",Black:"",Blue:"",Bold:"grasa","Bulleted List":"Bula Listo",Cancel:"Nuligi","Centered image":"","Change image text alternative":"Ŝanĝu la alternativan tekston de la bildo","Choose heading":"Elektu ĉapon","Dim grey":"",Downloadable:"","Dropdown toolbar":"","Edit block":"","Edit link":"","Editor toolbar":"","Enter image caption":"Skribu klarigon pri la bildo","Full size image":"Bildo kun reala dimensio",Green:"",Grey:"",Heading:"Ĉapo","Heading 1":"Ĉapo 1","Heading 2":"Ĉapo 2","Heading 3":"Ĉapo 3","Heading 4":"","Heading 5":"","Heading 6":"","Image toolbar":"","image widget":"bilda fenestraĵo",Italic:"kursiva","Left aligned image":"","Light blue":"","Light green":"","Light grey":"",Link:"Ligilo","Link URL":"URL de la ligilo",Next:"","Numbered List":"Numerita Listo","Open in a new tab":"","Open link in new tab":"",Orange:"",Paragraph:"Paragrafo",Previous:"",Purple:"",Red:"",Redo:"Refari","Rich Text Editor":"Redaktilo de Riĉa Teksto","Rich Text Editor, %0":"Redaktilo de Riĉa Teksto, %0","Right aligned image":"",Save:"Konservi","Show more items":"","Side image":"Flanka biildo","Text alternative":"Alternativa teksto","This link has no URL":"",Turquoise:"",Undo:"Malfari",Unlink:"Malligi",White:"",Yellow:""});i.getPluralForm=function(e){return e!=1}})(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));

파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 0 - 0
maxkey-web-manage/src/main/resources/static/ckeditor5/build/translations/es.js


파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 0 - 0
maxkey-web-manage/src/main/resources/static/ckeditor5/build/translations/et.js


+ 1 - 0
maxkey-web-manage/src/main/resources/static/ckeditor5/build/translations/eu.js

@@ -0,0 +1 @@
+(function(e){const a=e["eu"]=e["eu"]||{};a.dictionary=Object.assign(a.dictionary||{},{"%0 of %1":"",Aquamarine:"",Black:"","Block quote":"Aipua",Blue:"",Bold:"Lodia","Bulleted List":"Buletdun zerrenda",Cancel:"Utzi","Centered image":"Zentratutako irudia","Change image text alternative":"Aldatu irudiaren ordezko testua","Choose heading":"Aukeratu izenburua","Dim grey":"",Downloadable:"","Dropdown toolbar":"","Edit block":"","Edit link":"","Editor toolbar":"","Enter image caption":"Sartu irudiaren epigrafea","Full size image":"Tamaina osoko irudia",Green:"",Grey:"",Heading:"Izenburua","Heading 1":"Izenburua 1","Heading 2":"Izenburua 2","Heading 3":"Izenburua 3","Heading 4":"","Heading 5":"","Heading 6":"","Image toolbar":"","image widget":"irudi widgeta",Italic:"Etzana","Left aligned image":"Ezkerrean lerrokatutako irudia","Light blue":"","Light green":"","Light grey":"",Link:"Esteka","Link URL":"Estekaren URLa",Next:"","Numbered List":"Zenbakidun zerrenda","Open in a new tab":"","Open link in new tab":"",Orange:"",Paragraph:"Paragrafoa",Previous:"",Purple:"",Red:"",Redo:"Berregin","Rich Text Editor":"Testu aberastuaren editorea","Rich Text Editor, %0":"Testu aberastuaren editorea, %0","Right aligned image":"Eskuinean lerrokatutako irudia",Save:"Gorde","Show more items":"","Side image":"Alboko irudia","Text alternative":"Ordezko testua","This link has no URL":"",Turquoise:"",Undo:"Desegin",Unlink:"Desestekatu",White:"",Yellow:""});a.getPluralForm=function(e){return e!=1}})(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));

파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 0 - 0
maxkey-web-manage/src/main/resources/static/ckeditor5/build/translations/fa.js


파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 0 - 0
maxkey-web-manage/src/main/resources/static/ckeditor5/build/translations/fi.js


파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 0 - 0
maxkey-web-manage/src/main/resources/static/ckeditor5/build/translations/fr.js


파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 0 - 0
maxkey-web-manage/src/main/resources/static/ckeditor5/build/translations/gl.js


+ 1 - 0
maxkey-web-manage/src/main/resources/static/ckeditor5/build/translations/gu.js

@@ -0,0 +1 @@
+(function(n){const o=n["gu"]=n["gu"]||{};o.dictionary=Object.assign(o.dictionary||{},{"Block quote":" વિચાર ટાંકો",Bold:"ઘાટુ - બોલ્ડ્",Italic:"ત્રાંસુ - ઇટલિક્"});o.getPluralForm=function(n){return n!=1}})(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));

파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 0 - 0
maxkey-web-manage/src/main/resources/static/ckeditor5/build/translations/he.js


파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 0 - 0
maxkey-web-manage/src/main/resources/static/ckeditor5/build/translations/hi.js


파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 0 - 0
maxkey-web-manage/src/main/resources/static/ckeditor5/build/translations/hr.js


파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 0 - 0
maxkey-web-manage/src/main/resources/static/ckeditor5/build/translations/hu.js


파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 0 - 0
maxkey-web-manage/src/main/resources/static/ckeditor5/build/translations/id.js


파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 0 - 0
maxkey-web-manage/src/main/resources/static/ckeditor5/build/translations/it.js


파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 0 - 0
maxkey-web-manage/src/main/resources/static/ckeditor5/build/translations/ja.js


파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 0 - 0
maxkey-web-manage/src/main/resources/static/ckeditor5/build/translations/km.js


파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 0 - 0
maxkey-web-manage/src/main/resources/static/ckeditor5/build/translations/kn.js


파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 0 - 0
maxkey-web-manage/src/main/resources/static/ckeditor5/build/translations/ko.js


파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 0 - 0
maxkey-web-manage/src/main/resources/static/ckeditor5/build/translations/ku.js


파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 0 - 0
maxkey-web-manage/src/main/resources/static/ckeditor5/build/translations/lt.js


파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 0 - 0
maxkey-web-manage/src/main/resources/static/ckeditor5/build/translations/lv.js


파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 0 - 0
maxkey-web-manage/src/main/resources/static/ckeditor5/build/translations/nb.js


파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 0 - 0
maxkey-web-manage/src/main/resources/static/ckeditor5/build/translations/ne.js


파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 0 - 0
maxkey-web-manage/src/main/resources/static/ckeditor5/build/translations/nl.js


파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 0 - 0
maxkey-web-manage/src/main/resources/static/ckeditor5/build/translations/no.js


+ 1 - 0
maxkey-web-manage/src/main/resources/static/ckeditor5/build/translations/oc.js

@@ -0,0 +1 @@
+(function(n){const a=n["oc"]=n["oc"]||{};a.dictionary=Object.assign(a.dictionary||{},{Bold:"Gras",Cancel:"Anullar",Italic:"Italica",Save:"Enregistrar"});a.getPluralForm=function(n){return n>1}})(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));

파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 0 - 0
maxkey-web-manage/src/main/resources/static/ckeditor5/build/translations/pl.js


파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 0 - 0
maxkey-web-manage/src/main/resources/static/ckeditor5/build/translations/pt-br.js


+ 1 - 0
maxkey-web-manage/src/main/resources/static/ckeditor5/build/translations/pt.js

@@ -0,0 +1 @@
+(function(e){const a=e["pt"]=e["pt"]||{};a.dictionary=Object.assign(a.dictionary||{},{"%0 of %1":"",Aquamarine:"",Black:"",Blue:"",Bold:"Negrito","Bulleted List":"Lista não ordenada",Cancel:"Cancelar","Centered image":"Imagem centrada","Change image text alternative":"","Choose heading":"","Dim grey":"",Downloadable:"","Dropdown toolbar":"","Edit block":"","Edit link":"","Editor toolbar":"","Enter image caption":"Indicar legenda da imagem","Full size image":"Imagem em tamanho completo",Green:"",Grey:"",Heading:"Cabeçalho","Heading 1":"Cabeçalho 1","Heading 2":"Cabeçalho 2","Heading 3":"Cabeçalho 3","Heading 4":"","Heading 5":"","Heading 6":"","Image toolbar":"","image widget":"módulo de imagem",Italic:"Itálico","Left aligned image":"","Light blue":"","Light green":"","Light grey":"",Link:"Hiperligação","Link URL":"URL da ligação",Next:"","Numbered List":"Lista ordenada","Open in a new tab":"","Open link in new tab":"",Orange:"",Paragraph:"Parágrafo",Previous:"",Purple:"",Red:"",Redo:"Refazer","Rich Text Editor":"Editor de texto avançado","Rich Text Editor, %0":"Editor de texto avançado, %0","Right aligned image":"",Save:"Guardar","Show more items":"","Side image":"Imagem lateral","Text alternative":"Texto alternativo","This link has no URL":"",Turquoise:"",Undo:"Desfazer",Unlink:"Desligar",White:"",Yellow:""});a.getPluralForm=function(e){return e!=1}})(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));

파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 0 - 0
maxkey-web-manage/src/main/resources/static/ckeditor5/build/translations/ro.js


파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 0 - 0
maxkey-web-manage/src/main/resources/static/ckeditor5/build/translations/ru.js


+ 1 - 0
maxkey-web-manage/src/main/resources/static/ckeditor5/build/translations/si.js

@@ -0,0 +1 @@
+(function(e){const i=e["si"]=e["si"]||{};i.dictionary=Object.assign(i.dictionary||{},{Bold:"තදකුරු","Bulleted List":"බුලටිත ලැයිස්තුව","Centered image":"","Change image text alternative":"","Enter image caption":"","Full size image":"","Image toolbar":"","image widget":"",Italic:"ඇලකුරු","Left aligned image":"","Numbered List":"අංකිත ලැයිස්තුව",Redo:"නැවත කරන්න","Right aligned image":"","Side image":"","Text alternative":"",Undo:"අහෝසි කරන්න"});i.getPluralForm=function(e){return e!=1}})(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));

파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 0 - 0
maxkey-web-manage/src/main/resources/static/ckeditor5/build/translations/sk.js


+ 1 - 0
maxkey-web-manage/src/main/resources/static/ckeditor5/build/translations/sl.js

@@ -0,0 +1 @@
+(function(a){const e=a["sl"]=a["sl"]||{};e.dictionary=Object.assign(e.dictionary||{},{"%0 of %1":"",Aquamarine:"Akvamarin",Black:"Črna","Block quote":"Blokiraj citat",Blue:"Modra",Bold:"Krepko",Cancel:"Prekliči","Choose heading":"Izberi naslov","Dim grey":"Temno siva","Dropdown toolbar":"","Edit block":"","Editor toolbar":"",Green:"Zelena",Grey:"Siva",Heading:"Naslov","Heading 1":"Naslov 1","Heading 2":"Naslov 2","Heading 3":"Naslov 3","Heading 4":"Naslov 4","Heading 5":"Naslov 5","Heading 6":"Naslov 6",Italic:"Poševno","Light blue":"Svetlo modra","Light green":"Svetlo zelena","Light grey":"Svetlo siva",Next:"",Orange:"Oranžna",Paragraph:"Odstavek",Previous:"",Purple:"Vijolična",Red:"Rdeča","Rich Text Editor":"","Rich Text Editor, %0":"",Save:"Shrani","Show more items":"",Turquoise:"Turkizna",White:"Bela",Yellow:"Rumena"});e.getPluralForm=function(a){return a%100==1?0:a%100==2?1:a%100==3||a%100==4?2:3}})(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));

파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 0 - 0
maxkey-web-manage/src/main/resources/static/ckeditor5/build/translations/sq.js


파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 0 - 0
maxkey-web-manage/src/main/resources/static/ckeditor5/build/translations/sr-latn.js


파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 0 - 0
maxkey-web-manage/src/main/resources/static/ckeditor5/build/translations/sr.js


파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 0 - 0
maxkey-web-manage/src/main/resources/static/ckeditor5/build/translations/sv.js


파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 0 - 0
maxkey-web-manage/src/main/resources/static/ckeditor5/build/translations/th.js


파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 0 - 0
maxkey-web-manage/src/main/resources/static/ckeditor5/build/translations/tk.js


파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 0 - 0
maxkey-web-manage/src/main/resources/static/ckeditor5/build/translations/tr.js


+ 1 - 0
maxkey-web-manage/src/main/resources/static/ckeditor5/build/translations/tt.js

@@ -0,0 +1 @@
+(function(n){const t=n["tt"]=n["tt"]||{};t.dictionary=Object.assign(t.dictionary||{},{Bold:"Калын",Cancel:"",Italic:"",Redo:"Кабатла",Save:"Сакла",Undo:""});t.getPluralForm=function(n){return 0}})(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));

파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 0 - 0
maxkey-web-manage/src/main/resources/static/ckeditor5/build/translations/ug.js


파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 0 - 0
maxkey-web-manage/src/main/resources/static/ckeditor5/build/translations/uk.js


파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 0 - 0
maxkey-web-manage/src/main/resources/static/ckeditor5/build/translations/vi.js


파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 0 - 0
maxkey-web-manage/src/main/resources/static/ckeditor5/build/translations/zh.js


+ 41 - 0
maxkey-web-manage/src/main/resources/static/ckeditor5/package.json

@@ -0,0 +1,41 @@
+{
+  "name": "ckeditor5-custom-build",
+  "author": "CKSource",
+  "description": "A custom CKEditor 5 build made by the CKEditor 5 online builder.",
+  "version": "0.0.1",
+  "license": "SEE LICENSE IN LICENSE.md",
+  "private": true,
+  "main": "./build/ckeditor.js",
+  "devDependencies": {
+    "@ckeditor/ckeditor5-autoformat": "^27.0.0",
+    "@ckeditor/ckeditor5-basic-styles": "^27.0.0",
+    "@ckeditor/ckeditor5-block-quote": "^27.0.0",
+    "@ckeditor/ckeditor5-cloud-services": "^27.0.0",
+    "@ckeditor/ckeditor5-dev-utils": "^24.4.2",
+    "@ckeditor/ckeditor5-dev-webpack-plugin": "^24.4.2",
+    "@ckeditor/ckeditor5-editor-classic": "^27.0.0",
+    "@ckeditor/ckeditor5-essentials": "^27.0.0",
+    "@ckeditor/ckeditor5-heading": "^27.0.0",
+    "@ckeditor/ckeditor5-image": "^27.0.0",
+    "@ckeditor/ckeditor5-indent": "^27.0.0",
+    "@ckeditor/ckeditor5-link": "^27.0.0",
+    "@ckeditor/ckeditor5-list": "^27.0.0",
+    "@ckeditor/ckeditor5-media-embed": "^27.0.0",
+    "@ckeditor/ckeditor5-paragraph": "^27.0.0",
+    "@ckeditor/ckeditor5-paste-from-office": "^27.0.0",
+    "@ckeditor/ckeditor5-table": "^27.0.0",
+    "@ckeditor/ckeditor5-theme-lark": "^27.0.0",
+    "@ckeditor/ckeditor5-typing": "^27.0.0",
+    "css-loader": "^5.2.0",
+    "postcss": "^8.2.8",
+    "postcss-loader": "^4.2.0",
+    "raw-loader": "^4.0.2",
+    "style-loader": "^2.0.0",
+    "terser-webpack-plugin": "^4.2.3",
+    "webpack": "^4.46.0",
+    "webpack-cli": "^4.5.0"
+  },
+  "scripts": {
+    "build": "webpack --mode production"
+  }
+}

+ 165 - 0
maxkey-web-manage/src/main/resources/static/ckeditor5/sample/index.html

@@ -0,0 +1,165 @@
+<!DOCTYPE html><!--
+	Copyright (c) 2014-2021, CKSource - Frederico Knabben. All rights reserved.
+	This file is licensed under the terms of the MIT License (see LICENSE.md).
+-->
+
+<html lang="en" dir="ltr"></html>
+<head>
+	<title>CKEditor 5 ClassicEditor build</title>
+	<meta charset="UTF-8">
+	<meta name="viewport" content="width=device-width, initial-scale=1">
+	<link rel="icon" type="image/png" href="https://c.cksource.com/a/1/logos/ckeditor5.png">
+	<link rel="stylesheet" type="text/css" href="styles.css">
+</head>
+<body data-editor="ClassicEditor" data-collaboration="false">
+	<header>
+		<div class="centered">
+			<h1><a href="https://ckeditor.com/ckeditor-5/" target="_blank" rel="noopener noreferrer"><img src="https://c.cksource.com/a/1/logos/ckeditor5.svg" alt="CKEditor 5 logo">CKEditor 5</a></h1>
+			<nav>
+				<ul>
+					<li><a href="https://ckeditor.com/docs/ckeditor5/" target="_blank" rel="noopener noreferrer">Documentation</a></li>
+					<li><a href="https://ckeditor.com/" target="_blank" rel="noopener noreferrer">Website</a></li>
+				</ul>
+			</nav>
+		</div>
+	</header>
+	<main>
+		<div class="message">
+			<div class="centered">
+				<h2>CKEditor 5 online builder demo - ClassicEditor build</h2>
+			</div>
+		</div>
+		<div class="centered">
+			<div class="row row-editor">
+				<div class="editor">
+					<h2>Bilingual Personality Disorder</h2>
+					<figure class="image image-style-side"><img src="https://c.cksource.com/a/1/img/docs/sample-image-bilingual-personality-disorder.jpg">
+						<figcaption>One language, one person.</figcaption>
+					</figure>
+					<p>
+						This may be the first time you hear about this made-up disorder but
+						it actually isn’t so far from the truth. Even the studies that were conducted almost half a century show that
+						<strong>the language you speak has more effects on you than you realise</strong>.
+					</p>
+					<p>
+						One of the very first experiments conducted on this topic dates back to 1964.
+						<a href="https://www.researchgate.net/publication/9440038_Language_and_TAT_content_in_bilinguals">In the experiment</a>
+						designed by linguist Ervin-Tripp who is an authority expert in psycholinguistic and sociolinguistic studies,
+						adults who are bilingual in English in French were showed series of pictures and were asked to create 3-minute stories.
+						In the end participants emphasized drastically different dynamics for stories in English and French.
+					</p>
+					<p>
+						Another ground-breaking experiment which included bilingual Japanese women married to American men in San Francisco were
+						asked to complete sentences. The goal of the experiment was to investigate whether or not human feelings and thoughts
+						are expressed differently in <strong>different language mindsets</strong>.
+						<Here>is a sample from the the experiment:</Here>
+					</p>
+					<table>
+						<thead>
+							<tr>
+								<th></th>
+								<th>English</th>
+								<th>Japanese</th>
+							</tr>
+						</thead>
+						<tbody>
+							<tr>
+								<td>Real friends should</td>
+								<td>Be very frank</td>
+								<td>Help each other</td>
+							</tr>
+							<tr>
+								<td>I will probably become</td>
+								<td>A teacher</td>
+								<td>A housewife</td>
+							</tr>
+							<tr>
+								<td>When there is a conflict with family</td>
+								<td>I do what I want</td>
+								<td>It's a time of great unhappiness</td>
+							</tr>
+						</tbody>
+					</table>
+					<p>
+						More recent <a href="https://books.google.pl/books?id=1LMhWGHGkRUC">studies</a> show, the language a person speaks affects
+						their cognition, behaviour, emotions and hence <strong>their personality</strong>.
+						This shouldn’t come as a surprise
+						<a href="https://en.wikipedia.org/wiki/Lateralization_of_brain_function">since we already know</a> that different regions
+						of the brain become more active depending on the person’s activity at hand. Since structure, information and especially
+						<strong>the culture</strong> of languages varies substantially and the language a person speaks is an essential element of daily life.
+					</p>
+				</div>
+			</div></div>
+		</div>
+	</main>
+	<footer>
+		<p><a href="https://ckeditor.com/ckeditor-5/" target="_blank" rel="noopener">CKEditor 5</a>
+			– Rich text editor of tomorrow, available today
+		</p>
+		<p>Copyright © 2003-2021,
+			<a href="https://cksource.com/" target="_blank" rel="noopener">CKSource</a>
+			– Frederico Knabben. All rights reserved.
+		</p>
+	</footer>
+	<script src="../build/ckeditor.js"></script>
+	<script>ClassicEditor
+			.create( document.querySelector( '.editor' ), {
+				
+				toolbar: {
+					items: [
+						'heading',
+						'|',
+						'bold',
+						'italic',
+						'link',
+						'bulletedList',
+						'numberedList',
+						'|',
+						'outdent',
+						'indent',
+						'|',
+						'blockQuote',
+						'insertTable',
+						'mediaEmbed',
+						'undo',
+						'redo'
+					]
+				},
+				language: 'zh-cn',
+				image: {
+					toolbar: [
+						'imageTextAlternative',
+						'imageStyle:full',
+						'imageStyle:side'
+					]
+				},
+				table: {
+					contentToolbar: [
+						'tableColumn',
+						'tableRow',
+						'mergeTableCells'
+					]
+				},
+				licenseKey: '',
+				
+				
+			} )
+			.then( editor => {
+				window.editor = editor;
+		
+				
+				
+				
+		
+				
+				
+				
+			} )
+			.catch( error => {
+				console.error( 'Oops, something went wrong!' );
+				console.error( 'Please, report the following error on https://github.com/ckeditor/ckeditor5/issues with the build id and the error stack trace:' );
+				console.warn( 'Build id: ejuf0r2j7w54-jfha1cexgplv' );
+				console.error( error );
+			} );
+	</script>
+</body>

+ 465 - 0
maxkey-web-manage/src/main/resources/static/ckeditor5/sample/styles.css

@@ -0,0 +1,465 @@
+/**
+ * @license Copyright (c) 2014-2021, CKSource - Frederico Knabben. All rights reserved.
+ * This file is licensed under the terms of the MIT License (see LICENSE.md).
+ */
+
+ :root {
+	--ck-sample-base-spacing: 2em;
+	--ck-sample-color-white: #fff;
+	--ck-sample-color-green: #279863;
+	--ck-sample-color-blue: #1a9aef;
+	--ck-sample-container-width: 1285px;
+	--ck-sample-sidebar-width: 350px;
+	--ck-sample-editor-min-height: 400px;
+	--ck-sample-editor-z-index: 10;
+}
+
+/* --------- EDITOR STYLES  ---------------------------------------------------------------------------------------- */
+
+.editor__editable,
+/* Classic build. */
+main .ck-editor[role='application'] .ck.ck-content,
+/* Decoupled document build. */
+.ck.editor__editable[role='textbox'],
+.ck.ck-editor__editable[role='textbox'],
+/* Inline & Balloon build. */
+.ck.editor[role='textbox'] {
+	width: 100%;
+	background: #fff;
+	font-size: 1em;
+	line-height: 1.6em;
+	min-height: var(--ck-sample-editor-min-height);
+	padding: 1.5em 2em;
+}
+
+.ck.ck-editor__editable {
+	background: #fff;
+	border: 1px solid hsl(0, 0%, 70%);
+	width: 100%;
+}
+
+.ck.ck-editor {
+	/* To enable toolbar wrapping. */
+	width: 100%;
+	overflow-x: hidden;
+}
+
+/* Because of sidebar `position: relative`, Edge is overriding the outline of a focused editor. */
+.ck.ck-editor__editable {
+	position: relative;
+	z-index: var(--ck-sample-editor-z-index);
+}
+
+/* --------- DECOUPLED (DOCUMENT) BUILD. ---------------------------------------------*/
+body[data-editor='DecoupledDocumentEditor'] .document-editor__toolbar {
+	width: 100%;
+}
+
+body[ data-editor='DecoupledDocumentEditor'] .collaboration-demo__editable,
+body[ data-editor='DecoupledDocumentEditor'] .row-editor .editor {
+	width: 18.5cm;
+	height: 100%;
+	min-height: 26.25cm;
+	padding: 1.75cm 1.5cm;
+	margin: 2.5rem;
+	border: 1px hsl( 0, 0%, 82.7% ) solid;
+	background-color: var(--ck-sample-color-white);
+	box-shadow: 0 0 5px hsla( 0, 0%, 0%, .1 );
+}
+
+body[ data-editor='DecoupledDocumentEditor'] .row-editor {
+	display: flex;
+	position: relative;
+	justify-content: center;
+	overflow-y: auto;
+	background-color: #f2f2f2;
+	border: 1px solid hsl(0, 0%, 77%);
+}
+
+body[data-editor='DecoupledDocumentEditor'] .sidebar {
+	background: transparent;
+	border: 0;
+	box-shadow: none;
+}
+
+/* --------- COMMENTS & TRACK CHANGES FEATURE ---------------------------------------------------------------------- */
+.sidebar {
+	padding: 0 15px;
+	position: relative;
+	min-width: var(--ck-sample-sidebar-width);
+	max-width: var(--ck-sample-sidebar-width);
+	font-size: 20px;
+	border: 1px solid hsl(0, 0%, 77%);
+	background: hsl(0, 0%, 98%);
+	border-left: 0;
+	overflow: hidden;
+	min-height: 100%;
+	flex-grow: 1;
+}
+
+/* Do not inherit styles related to the editable editor content. See line 25.*/
+.sidebar .ck-content[role='textbox'],
+.ck.ck-annotation-wrapper .ck-content[role='textbox'] {
+	min-height: unset;
+	width: unset;
+	padding: 0;
+	background: transparent;
+}
+
+.sidebar.narrow {
+	min-width: 60px;
+	flex-grow: 0;
+}
+
+.sidebar.hidden {
+	display: none !important;
+}
+
+#sidebar-display-toggle {
+	position: absolute;
+	z-index: 1;
+	width: 30px;
+	height: 30px;
+	text-align: center;
+	left: 15px;
+	top: 30px;
+	border: 0;
+	padding: 0;
+	color: hsl( 0, 0%, 50% );
+	transition: 250ms ease color;
+	background-color: transparent;
+}
+
+#sidebar-display-toggle:hover {
+	color: hsl( 0, 0%, 30% );
+	cursor: pointer;
+}
+
+#sidebar-display-toggle:focus,
+#sidebar-display-toggle:active {
+	outline: none;
+	border: 1px solid #a9d29d;
+}
+
+#sidebar-display-toggle svg {
+	fill: currentColor;
+}
+
+/* --------- COLLABORATION FEATURES (USERS) ------------------------------------------------------------------------ */
+.row-presence {
+	width: 100%;
+	border: 1px solid hsl(0, 0%, 77%);
+	border-bottom: 0;
+	background: hsl(0, 0%, 98%);
+	padding: var(--ck-spacing-small);
+
+	/* Make `border-bottom` as `box-shadow` to not overlap with the editor border. */
+	box-shadow: 0 1px 0 0 hsl(0, 0%, 77%);
+
+	/* Make `z-index` bigger than `.editor` to properly display tooltips. */
+	z-index: 20;
+}
+
+.ck.ck-presence-list {
+    flex: 1;
+    padding: 1.25rem .75rem;
+}
+
+.presence .ck.ck-presence-list__counter {
+	order: 2;
+	margin-left: var(--ck-spacing-large)
+}
+
+/* --------- REAL TIME COLLABORATION FEATURES (SHARE TOPBAR CONTAINER) --------------------------------------------- */
+.collaboration-demo__row {
+	display: flex;
+	position: relative;
+	justify-content: center;
+	overflow-y: auto;
+	background-color: #f2f2f2;
+	border: 1px solid hsl(0, 0%, 77%);
+}
+
+body[ data-editor='InlineEditor'] .collaboration-demo__row {
+	border: 0;
+}
+
+.collaboration-demo__container {
+	max-width: var(--ck-sample-container-width);
+	margin: 0 auto;
+	padding: 1.25rem;
+}
+
+.presence, .collaboration-demo__row {
+	transition: .2s opacity;
+}
+
+.collaboration-demo__topbar {
+	background: #fff;
+	border: 1px solid var(--ck-color-toolbar-border);
+    display: flex;
+    justify-content: space-between;
+    align-items: center;
+    border-bottom: 0;
+    border-radius: 4px 4px 0 0;
+}
+
+.collaboration-demo__topbar .btn {
+	margin-right: 1em;
+	outline-offset: 2px;
+	outline-width: 2px;
+	background-color: var( --ck-sample-color-blue );
+}
+
+.collaboration-demo__topbar .btn:focus,
+.collaboration-demo__topbar .btn:hover {
+	border-color: var( --ck-sample-color-blue );
+}
+
+.collaboration-demo__share {
+	display: flex;
+	align-items: center;
+	padding: 1.25rem .75rem
+}
+
+.collaboration-demo__share-description p {
+	margin: 0;
+	font-weight: bold;
+	font-size: 0.9em;
+}
+
+.collaboration-demo__share input {
+	height: auto;
+	font-size: 0.9em;
+	min-width: 220px;
+	margin: 0 10px;
+	border-radius: 4px;
+	border: 1px solid var(--ck-color-toolbar-border)
+}
+
+.collaboration-demo__share button,
+.collaboration-demo__share input {
+	height: 40px;
+	padding: 5px 10px;
+}
+
+.collaboration-demo__share button {
+	position: relative;
+}
+
+.collaboration-demo__share button:focus {
+	outline: none;
+}
+
+.collaboration-demo__share button[data-tooltip]::before,
+.collaboration-demo__share button[data-tooltip]::after {
+	position: absolute;
+    visibility: hidden;
+    opacity: 0;
+    pointer-events: none;
+    transition: all .15s cubic-bezier(.5,1,.25,1);
+	z-index: 1;
+}
+
+.collaboration-demo__share button[data-tooltip]::before {
+	content: attr(data-tooltip);
+    padding: 5px 15px;
+    border-radius: 3px;
+    background: #111;
+    color: #fff;
+    text-align: center;
+    font-size: 11px;
+	top: 100%;
+    left: 50%;
+    margin-top: 5px;
+    transform: translateX(-50%);
+}
+
+.collaboration-demo__share button[data-tooltip]::after {
+    content: '';
+	border: 5px solid transparent;
+    width: 0;
+    font-size: 0;
+    line-height: 0;
+	top: 100%;
+    left: 50%;
+    transform: translateX(-50%);
+    border-bottom: 5px solid #111;
+	border-top: none;
+}
+
+.collaboration-demo__share button[data-tooltip]:hover:before,
+.collaboration-demo__share button[data-tooltip]:hover:after {
+	visibility: visible;
+    opacity: 1;
+}
+
+.collaboration-demo--ready {
+	overflow: visible;
+	height: auto;
+}
+
+.collaboration-demo--ready .presence,
+.collaboration-demo--ready .collaboration-demo__row {
+	opacity: 1;
+}
+
+/* --------- PAGINATION FEATURE ------------------------------------------------------------------------------------ */
+
+/* Pagination view line must be stacked at least at the same level as the editor,
+   otherwise it will be hidden underneath. */
+.ck.ck-pagination-view-line {
+	z-index: var(--ck-sample-editor-z-index);
+}
+
+/* --------- SAMPLE GENERIC STYLES (not related to CKEditor) ------------------------------------------------------- */
+body, html {
+	padding: 0;
+	margin: 0;
+
+	font-family: sans-serif, Arial, Verdana, "Trebuchet MS", "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol";
+	font-size: 16px;
+	line-height: 1.5;
+}
+
+body {
+	height: 100%;
+	color: #2D3A4A;
+}
+
+body * {
+	box-sizing: border-box;
+}
+
+a {
+	color: #38A5EE;
+}
+
+header .centered {
+	display: flex;
+	flex-flow: row nowrap;
+	justify-content: space-between;
+	align-items: center;
+	min-height: 8em;
+}
+
+header h1 a {
+	font-size: 20px;
+	display: flex;
+	align-items: center;
+	color: #2D3A4A;
+	text-decoration: none;
+}
+
+header h1 img {
+	display: block;
+	height: 64px;
+}
+
+header nav ul {
+	margin: 0;
+	padding: 0;
+	list-style-type: none;
+}
+
+header nav ul li {
+	display: inline-block;
+}
+
+header nav ul li + li {
+	margin-left: 1em;
+}
+
+header nav ul li a {
+	font-weight: bold;
+	text-decoration: none;
+	color: #2D3A4A;
+}
+
+header nav ul li a:hover {
+	text-decoration: underline;
+}
+
+main .message {
+	padding: 0 0 var(--ck-sample-base-spacing);
+	background: var(--ck-sample-color-green);
+	color: var(--ck-sample-color-white);
+}
+
+main .message::after {
+	content: "";
+	z-index: -1;
+	display: block;
+	height: 10em;
+	width: 100%;
+	background: var(--ck-sample-color-green);
+	position: absolute;
+	left: 0;
+}
+
+main .message h2 {
+	position: relative;
+	padding-top: 1em;
+	font-size: 2em;
+}
+
+.centered {
+	/* Hide overlapping comments. */
+	overflow: hidden;
+	max-width: var(--ck-sample-container-width);
+	margin: 0 auto;
+	padding: 0 var(--ck-sample-base-spacing);
+}
+
+.row {
+	display: flex;
+	position: relative;
+}
+
+.btn {
+	cursor: pointer;
+	padding: 8px 16px;
+	font-size: 1rem;
+	user-select: none;
+	border-radius: 4px;
+	transition: color .2s ease-in-out,background-color .2s ease-in-out,border-color .2s ease-in-out,opacity .2s ease-in-out;
+	background-color: var(--ck-sample-color-button-blue);
+	border-color: var(--ck-sample-color-button-blue);
+	color: var(--ck-sample-color-white);
+	display: inline-block;
+}
+
+.btn--tiny {
+	padding: 6px 12px;
+	font-size: .8rem;
+}
+
+footer {
+	margin: calc(2*var(--ck-sample-base-spacing)) var(--ck-sample-base-spacing);
+	font-size: .8em;
+	text-align: center;
+	color: rgba(0,0,0,.4);
+}
+
+/* --------- RWD --------------------------------------------------------------------------------------------------- */
+@media screen and ( max-width: 800px ) {
+	:root {
+		--ck-sample-base-spacing: 1em;
+	}
+
+	header h1 {
+		width: 100%;
+	}
+
+	header h1 img {
+		height: 40px;
+	}
+
+	header nav ul {
+		text-align: right;
+	}
+
+	main .message h2 {
+		font-size: 1.5em;
+	}
+}

+ 53 - 0
maxkey-web-manage/src/main/resources/static/ckeditor5/src/ckeditor.js

@@ -0,0 +1,53 @@
+/**
+ * @license Copyright (c) 2014-2021, CKSource - Frederico Knabben. All rights reserved.
+ * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
+ */
+import ClassicEditor from '@ckeditor/ckeditor5-editor-classic/src/classiceditor.js';
+import Autoformat from '@ckeditor/ckeditor5-autoformat/src/autoformat.js';
+import BlockQuote from '@ckeditor/ckeditor5-block-quote/src/blockquote.js';
+import Bold from '@ckeditor/ckeditor5-basic-styles/src/bold.js';
+import CloudServices from '@ckeditor/ckeditor5-cloud-services/src/cloudservices.js';
+import Essentials from '@ckeditor/ckeditor5-essentials/src/essentials.js';
+import Heading from '@ckeditor/ckeditor5-heading/src/heading.js';
+import Image from '@ckeditor/ckeditor5-image/src/image.js';
+import ImageCaption from '@ckeditor/ckeditor5-image/src/imagecaption.js';
+import ImageStyle from '@ckeditor/ckeditor5-image/src/imagestyle.js';
+import ImageToolbar from '@ckeditor/ckeditor5-image/src/imagetoolbar.js';
+import Indent from '@ckeditor/ckeditor5-indent/src/indent.js';
+import Italic from '@ckeditor/ckeditor5-basic-styles/src/italic.js';
+import Link from '@ckeditor/ckeditor5-link/src/link.js';
+import List from '@ckeditor/ckeditor5-list/src/list.js';
+import MediaEmbed from '@ckeditor/ckeditor5-media-embed/src/mediaembed.js';
+import Paragraph from '@ckeditor/ckeditor5-paragraph/src/paragraph.js';
+import PasteFromOffice from '@ckeditor/ckeditor5-paste-from-office/src/pastefromoffice';
+import Table from '@ckeditor/ckeditor5-table/src/table.js';
+import TableToolbar from '@ckeditor/ckeditor5-table/src/tabletoolbar.js';
+import TextTransformation from '@ckeditor/ckeditor5-typing/src/texttransformation.js';
+
+class Editor extends ClassicEditor {}
+
+// Plugins to include in the build.
+Editor.builtinPlugins = [
+	Autoformat,
+	BlockQuote,
+	Bold,
+	CloudServices,
+	Essentials,
+	Heading,
+	Image,
+	ImageCaption,
+	ImageStyle,
+	ImageToolbar,
+	Indent,
+	Italic,
+	Link,
+	List,
+	MediaEmbed,
+	Paragraph,
+	PasteFromOffice,
+	Table,
+	TableToolbar,
+	TextTransformation
+];
+
+export default Editor;

+ 96 - 0
maxkey-web-manage/src/main/resources/static/ckeditor5/webpack.config.js

@@ -0,0 +1,96 @@
+/**
+ * @license Copyright (c) 2014-2021, CKSource - Frederico Knabben. All rights reserved.
+ * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
+ */
+
+'use strict';
+
+/* eslint-env node */
+
+const path = require( 'path' );
+const webpack = require( 'webpack' );
+const { bundler, styles } = require( '@ckeditor/ckeditor5-dev-utils' );
+const CKEditorWebpackPlugin = require( '@ckeditor/ckeditor5-dev-webpack-plugin' );
+const TerserWebpackPlugin = require( 'terser-webpack-plugin' );
+
+module.exports = {
+	devtool: 'source-map',
+	performance: { hints: false },
+
+	entry: path.resolve( __dirname, 'src', 'ckeditor.js' ),
+
+	output: {
+		// The name under which the editor will be exported.
+		library: 'ClassicEditor',
+
+		path: path.resolve( __dirname, 'build' ),
+		filename: 'ckeditor.js',
+		libraryTarget: 'umd',
+		libraryExport: 'default'
+	},
+
+	optimization: {
+		minimizer: [
+			new TerserWebpackPlugin( {
+				sourceMap: true,
+				terserOptions: {
+					output: {
+						// Preserve CKEditor 5 license comments.
+						comments: /^!/
+					}
+				},
+				extractComments: false
+			} )
+		]
+	},
+
+	plugins: [
+		new CKEditorWebpackPlugin( {
+			// UI language. Language codes follow the https://en.wikipedia.org/wiki/ISO_639-1 format.
+			// When changing the built-in language, remember to also change it in the editor's configuration (src/ckeditor.js).
+			language: 'zh-cn',
+			additionalLanguages: 'all'
+		} ),
+		new webpack.BannerPlugin( {
+			banner: bundler.getLicenseBanner(),
+			raw: true
+		} )
+	],
+
+	module: {
+		rules: [
+			{
+				test: /\.svg$/,
+				use: [ 'raw-loader' ]
+			},
+			{
+				test: /\.css$/,
+				use: [
+					{
+						loader: 'style-loader',
+						options: {
+							injectType: 'singletonStyleTag',
+							attributes: {
+								'data-cke': true
+							}
+						}
+					},
+					{
+						loader: 'css-loader'
+					},
+					{
+						loader: 'postcss-loader',
+						options: {
+							postcssOptions: styles.getPostCssConfig( {
+								themeImporter: {
+									themePath: require.resolve( '@ckeditor/ckeditor5-theme-lark' )
+								},
+								minify: true
+							} )
+						}
+					},
+				]
+			}
+		]
+	}
+};

+ 6 - 0
maxkey-web-manage/src/main/resources/templates/views/layout/sidenav.ftl

@@ -90,6 +90,12 @@
              </a>
            </li>
            <li>
+             <a class="side-nav-menu" href="<@base />/notices/list/">
+                <@locale code="navs.notices"/>  
+                <span class="fa fa-fw fa-bell"></span>
+             </a>
+           </li>
+           <li>
              <a class="side-nav-menu" href="<@base />/apps/adapters/list/">
                 <@locale code="navs.adapters"/>  
                 <span class="fa fa-fw fa-chain"></span>

+ 124 - 0
maxkey-web-manage/src/main/resources/templates/views/notices/noticeAdd.ftl

@@ -0,0 +1,124 @@
+<!DOCTYPE HTML>
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+	<#include  "../layout/header.ftl"/>
+	<#include  "../layout/common.cssjs.ftl"/>
+<style   type="text/css">
+  .table th, .table td {
+    padding: .2rem;
+    vertical-align: middle;
+  }
+	.ck-content {
+   		min-height: 300px;
+	}
+</style>
+<script type="text/javascript">
+
+</script>
+</head>
+<body>
+<form id="actionForm"  method="post" type="label" autoclose="true"  action="<@base/>/notices/add"  class="needs-validation" novalidate>
+	<table border="0" cellpadding="0" cellspacing="0" class="table table-bordered" >
+		<tbody>
+			<tr style="display:none">
+				<th><@locale code="common.text.id" />:</th>
+				<td nowrap>
+					<input type="text" id="id" name="id" class="form-control" title="" value=""  />
+				</td>
+			</tr>
+			<tr>
+				<th><@locale code="notices.title" />:</th>
+				<td nowrap>
+					<input type="text" id="title" name="title" class="form-control" title="" value=""  required="" />
+				</td>
+			</tr>
+			<tr>
+				<th><@locale code="notices.content" />:</th>
+				<td nowrap  >
+					<textarea name="content" class="editor"></textarea>
+				</td>
+			</tr>
+			<tr>
+                <th><@locale code="common.text.description" />:</th>
+                <td nowrap>
+                    <textarea id="description" name="description" class="form-control"  rows="2" cols="20"></textarea>
+                </td>
+            </tr>
+			
+			<tr>
+				<td nowrap colspan="2" class="center">
+					<input id="_method" type="hidden" name="_method"  value="post"/>
+					<input  id="status" type="hidden" name="status"  value="1"/>
+		    		<input class="button btn btn-primary mr-3"  id="submitBtn" type="submit" value="<@locale code="button.text.save" />">
+	  				<input class="button btn btn-secondary mr-3"  id="closeBtn"   type="button" value="<@locale code="button.text.cancel" />"> 
+				</td>
+			</tr>
+		</tbody>
+	</table>
+</form>
+	<script src="<@base />/static/ckeditor5/build/ckeditor.js"></script>
+	<script>ClassicEditor
+			.create( document.querySelector( '.editor' ), {
+				
+				toolbar: {
+					items: [
+						'heading',
+						'|',
+						'bold',
+						'italic',
+						'link',
+						'bulletedList',
+						'numberedList',
+						'|',
+						'outdent',
+						'indent',
+						'|',
+						'blockQuote',
+						'insertTable',
+						'mediaEmbed',
+						'undo',
+						'redo'
+					]
+				},
+				language: 'zh-cn',
+				image: {
+					toolbar: [
+						'imageTextAlternative',
+						'imageStyle:full',
+						'imageStyle:side'
+					]
+				},
+				table: {
+					contentToolbar: [
+						'tableColumn',
+						'tableRow',
+						'mergeTableCells'
+					]
+				},
+				licenseKey: '',
+				
+				
+			} )
+			.then( editor => {
+				window.editor = editor;
+		
+				
+				
+				
+		
+				
+				
+				
+			} )
+			.catch( error => {
+				console.error( 'Oops, something went wrong!' );
+				console.error( 'Please, report the following error on https://github.com/ckeditor/ckeditor5/issues with the build id and the error stack trace:' );
+				console.warn( 'Build id: ejuf0r2j7w54-jfha1cexgplv' );
+				console.error( error );
+			} );
+	</script>
+<div id="orgContent" class="menuContent" style="display:none; position: absolute;">
+	<ul id="orgsTree" class="ztree" style="margin-top:0; width:180px; height: 300px;"></ul>
+</div>
+</body>
+</html>

+ 123 - 0
maxkey-web-manage/src/main/resources/templates/views/notices/noticeUpdate.ftl

@@ -0,0 +1,123 @@
+<!DOCTYPE HTML>
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+	<#include  "../layout/header.ftl"/>
+	<#include  "../layout/common.cssjs.ftl"/>
+<style   type="text/css">
+  .table th, .table td {
+    padding: .2rem;
+    vertical-align: middle;
+  }
+  	.ck-content {
+   		min-height: 300px;
+	}
+</style>
+<script type="text/javascript">
+
+</script>
+</head>
+<body>
+<form id="actionForm"  method="post" type="label" autoclose="true"  action="<@base/>/notices/update"  class="needs-validation" novalidate>
+	 <table  border="0" cellpadding="0" cellspacing="0" class="table table-bordered">
+		<tbody>
+		<tr style="display:none">
+			<th><@locale code="common.text.id" />:</th>
+			<td nowrap>
+				<input id="id" type="text" readonly name="id"  class="form-control"   value="${model.id}"/>
+			</td>
+		</tr>
+		<tr>
+			<th><@locale code="notices.title" />:</th>
+			<td nowrap>
+				<input type="text" id="title" name="title" class="form-control" title="" value="${model.title!}"  required="" />
+			</td>
+		</tr>
+		<tr>
+				<th><@locale code="notices.content" />:</th>
+				<td nowrap>
+					<textarea name="content" class="editor">${model.content!}</textarea>
+				</td>
+		</tr>
+		<tr>
+                <th><@locale code="common.text.description" />:</th>
+                <td nowrap>
+                	<textarea id="description" name="description" class="form-control"  rows="2" cols="20">${model.description!}</textarea>
+                </td>
+            </tr>
+		<tr>
+			<td nowrap colspan="2"  class="center">
+				<input id="_method" type="hidden" name="_method"  value="post"/>
+				<input id="status" type="hidden" name="status"  value="1"/>
+	    		<input class="button btn btn-primary mr-3"  id="submitBtn" type="submit" value="<@locale code="button.text.save" />">
+  				<input class="button btn btn-secondary mr-3"  id="closeBtn"   type="button" value="<@locale code="button.text.cancel" />">	 
+			</td>
+		</tr>
+		</tbody>
+	  </table>
+</form>
+	<script src="<@base />/static/ckeditor5/build/ckeditor.js"></script>
+	<script>ClassicEditor
+			.create( document.querySelector( '.editor' ), {
+				
+				toolbar: {
+					items: [
+						'heading',
+						'|',
+						'bold',
+						'italic',
+						'link',
+						'bulletedList',
+						'numberedList',
+						'|',
+						'outdent',
+						'indent',
+						'|',
+						'blockQuote',
+						'insertTable',
+						'mediaEmbed',
+						'undo',
+						'redo'
+					]
+				},
+				language: 'zh-cn',
+				image: {
+					toolbar: [
+						'imageTextAlternative',
+						'imageStyle:full',
+						'imageStyle:side'
+					]
+				},
+				table: {
+					contentToolbar: [
+						'tableColumn',
+						'tableRow',
+						'mergeTableCells'
+					]
+				},
+				licenseKey: '',
+				
+				
+			} )
+			.then( editor => {
+				window.editor = editor;
+		
+				
+				
+				
+		
+				
+				
+				
+			} )
+			.catch( error => {
+				console.error( 'Oops, something went wrong!' );
+				console.error( 'Please, report the following error on https://github.com/ckeditor/ckeditor5/issues with the build id and the error stack trace:' );
+				console.warn( 'Build id: ejuf0r2j7w54-jfha1cexgplv' );
+				console.error( error );
+			} );
+	</script>
+<div id="orgContent" class="menuContent" style="display:none; position: absolute;">
+	<ul id="orgsTree" class="ztree" style="margin-top:0; width:180px; height: 300px;"></ul>
+</div>
+</body>
+</html>

+ 130 - 0
maxkey-web-manage/src/main/resources/templates/views/notices/noticesList.ftl

@@ -0,0 +1,130 @@
+<!DOCTYPE HTML>
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+	<#include  "../layout/header.ftl"/>
+	<#include  "../layout/common.cssjs.ftl"/>
+	<script type="text/javascript">	
+		function dynamicFormatter(value, row, index){
+	  		return value=='0'? '<@locale code="common.text.no" />':'<@locale code="common.text.yes" />';
+		};
+	</script>
+</head>
+<body> 
+<div class="app header-default side-nav-dark">
+<div class="layout">
+	<div class="header navbar">
+		<#include  "../layout/top.ftl"/>
+	</div>
+	
+	<div class="col-md-3 sidebar-nav side-nav" >
+ 		<#include  "../layout/sidenav.ftl"/>
+	</div>
+	<div class="page-container">
+	
+	<div class="main-content">
+		<div class="container-fluid">
+			<div class="breadcrumb-wrapper row">
+				<div class="col-12 col-lg-3 col-md-6">
+					<h4 class="page-title"><@locale code="navs.notices"/></h4>
+				</div>
+				<div class="col-12 col-lg-9 col-md-6">
+					<ol class="breadcrumb float-right">
+						<li><a href="<@base/>/main"><@locale code="navs.home"/></a></li>
+						<li class="active">/ <@locale code="navs.notices"/></li>
+					</ol>
+				</div>
+			</div>
+		</div>
+		<div class="container-fluid">
+			<div class="content-wrapper row">
+			<div class="col-12 grid-margin">
+				<div class="card">
+					<div class="card-body">
+		
+			<table  class="table table-bordered">
+ 				<tr>
+		 			<td width="120px"><@locale code="notices.title"/>:</td>
+		 			<td width="375px">
+		 				<form id="basic_search_form">
+			 				<input class="form-control" type="text" name="title"  style ="width:150px;float:left;">
+			 				<input  class="button btn btn-primary mr-3"    id="searchBtn" type="button" size="50" value="<@locale code="button.text.search"/>">
+				 			<!--<input  class="button btn btn-secondary"  id="advancedSearchExpandBtn" type="button" size="50"  value="<@locale code="button.text.expandsearch"/>" expandValue="<@locale code="button.text.expandsearch"/>"  collapseValue="<@locale code="button.text.collapsesearch"/>">
+					 		-->
+					 	</form>
+		 			</td>
+		 			<td colspan="2">
+		 				<div id="tool_box_right">
+		 					 <input class="button btn btn-success mr-3" id="addBtn" type="button" value="<@locale code="button.text.add"/>" 
+						 		    wurl="<@base/>/notices/forwardAdd"
+						 		    wwidth="700"
+						 		    wheight="550"
+					 		    	target="window">	    	
+					 		    	
+					 	<input class="button btn btn-info mr-3 " id="modifyBtn" type="button" value="<@locale code="button.text.edit"/>" 
+					 				wurl="<@base/>/notices/forwardUpdate"
+					 				wwidth="700"
+						 		    wheight="550"
+					 		    	target="window"> 
+					 		    	
+					 	<input class="button btn btn-danger mr-3 "  id="deleteBtn" type="button" value="<@locale code="button.text.delete"/>"
+					 				wurl="<@base/>/notices/delete" />
+						</div>
+		 			</td>
+		 		</tr>
+		 	</table>
+		
+		 		
+ 	</div>
+ 	
+ 	<div id="advanced_search">
+ 		<form id="advanced_search_form">
+	 		
+	 	</form>
+ 	</div>
+		<table  data-url="<@base/>/notices/grid"
+			id="datagrid"
+				data-toggle="table"
+				data-classes="table table-bordered table-hover table-striped"
+				data-click-to-select="true"
+				data-pagination="true"
+				data-total-field="records"
+				data-page-list="[10, 25, 50, 100]"
+				data-search="false"
+				data-locale="zh-CN"
+				data-query-params="dataGridQueryParams"
+				data-query-params-type="pageSize"
+				data-side-pagination="server">
+		<thead>
+			<tr>
+				<th data-checkbox="true"></th>
+				<th data-sortable="true" data-field="id"   data-visible="false">Id</th>
+				<th data-field="title"><@locale code="notices.title"/></th>
+				<th data-field="modifiedDate" data-visible="true"><@locale code="common.text.modifieddate"/></th>
+				<th data-field="description"><@locale code="common.text.description"/></th>
+				<th data-field="createdBy"    data-visible="false"><@locale code="common.text.createdby"/></th>
+				<th data-field="createdDate"  data-visible="false"><@locale code="common.text.createddate"/></th>
+				<th data-field="modifiedBy"   data-visible="false"><@locale code="common.text.modifiedby"/></th>
+				<th data-field="modifiedDate" data-visible="false"><@locale code="common.text.modifieddate"/></th>
+	
+			</tr>
+		</thead>
+	</table>
+	
+	
+</div>
+					</div>
+</div>
+	<footer class="content-footer">
+		<#include  "../layout/footer.ftl"/>
+	</footer>
+	</div>
+	
+	</div>
+</div>
+
+<div id="preloader">
+<div class="loader" id="loader-1"></div>
+</div>
+
+</body>
+</html>

+ 7 - 0
maxkey-web-maxkey/src/main/java/org/maxkey/web/contorller/AppListController.java

@@ -19,6 +19,8 @@ package org.maxkey.web.contorller;
 
 import java.security.Principal;
 import java.util.List;
+
+import org.maxkey.configuration.ApplicationConfig;
 import org.maxkey.constants.ConstantsOperateMessage;
 import org.maxkey.constants.ConstantsProtocols;
 import org.maxkey.crypto.ReciprocalUtils;
@@ -53,6 +55,9 @@ public class AppListController {
     static final Logger _logger = LoggerFactory.getLogger(AppListController.class);
 
     @Autowired
+  	protected ApplicationConfig applicationConfig;
+    
+    @Autowired
     private UserInfoService userInfoService;
 
     @Autowired
@@ -72,6 +77,7 @@ public class AppListController {
         ModelAndView modelAndView = new ModelAndView("main/appList");
         userInfoService.updateGridList(gridList);
         modelAndView.addObject("appList", queryAccessableApps());
+        modelAndView.addObject("noticesVisible", applicationConfig.isNoticesVisible());
         return modelAndView;
     }
 
@@ -79,6 +85,7 @@ public class AppListController {
     public ModelAndView appConfigList() {
         ModelAndView modelAndView = new ModelAndView("main/appConfigList");
         modelAndView.addObject("appList", queryAccessableApps());
+        
         return modelAndView;
     }
 

+ 13 - 0
maxkey-web-maxkey/src/main/java/org/maxkey/web/endpoint/IndexEndpoint.java

@@ -32,6 +32,7 @@ import org.springframework.beans.factory.annotation.Qualifier;
 import org.springframework.stereotype.Controller;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.servlet.ModelAndView;
+import org.maxkey.persistence.service.NoticesService;
 
 /**
  * Index
@@ -43,6 +44,9 @@ public class IndexEndpoint {
 	private static Logger _logger = LoggerFactory.getLogger(IndexEndpoint.class);
 	
 	@Autowired
+	NoticesService noticesService;
+	
+	@Autowired
   	@Qualifier("applicationConfig")
   	ApplicationConfig applicationConfig;
 	@RequestMapping(value={"/forwardindex"})
@@ -71,4 +75,13 @@ public class IndexEndpoint {
 		return  new ModelAndView("index");
 		
 	}
+	
+	@RequestMapping(value={"/lastedNotices"})
+	public ModelAndView lastedNotices() {
+		_logger.debug("notices /notices.");
+		ModelAndView modelAndView = new ModelAndView("notices");
+		modelAndView.addObject("notice", noticesService.queryLastedNotices());
+		return  modelAndView;
+		
+	}
 }

+ 1 - 0
maxkey-web-maxkey/src/main/resources/application-http.properties

@@ -189,6 +189,7 @@ maxkey.login.remeberme.validity=0
 #to default application web site
 maxkey.login.default.uri=appList
 maxkey.ipaddress.whitelist=false
+maxkey.notices.visible=false
 
 ############################################################################ 
 #Kerberos Login configuration                                              #

+ 1 - 0
maxkey-web-maxkey/src/main/resources/application-https.properties

@@ -189,6 +189,7 @@ maxkey.login.remeberme.validity=0
 #to default application web site
 maxkey.login.default.uri=appList
 maxkey.ipaddress.whitelist=false
+maxkey.notices.visible=false
 
 ############################################################################ 
 #Kerberos Login configuration                                              #

+ 2 - 0
maxkey-web-maxkey/src/main/resources/messages/message.properties

@@ -270,3 +270,5 @@ navs.audit=\u5ba1\u8ba1
 navs.audit.login=\u767b\u5f55\u65e5\u5fd7
 navs.audit.signon=\u8bbf\u95ee\u65e5\u5fd7
 navs.audit.operation=\u64cd\u4f5c\u65e5\u5fd7
+
+home.notices=\u901A\u77E5\u516C\u544A

+ 1 - 0
maxkey-web-maxkey/src/main/resources/messages/message_en.properties

@@ -271,3 +271,4 @@ navs.audit=Audit
 navs.audit.login=Login
 navs.audit.signon=Sign-on
 navs.audit.operation=Operation
+home.notices=Notices

+ 2 - 0
maxkey-web-maxkey/src/main/resources/messages/message_zh_CN.properties

@@ -270,3 +270,5 @@ navs.audit=\u5ba1\u8ba1
 navs.audit.login=\u767b\u5f55\u65e5\u5fd7
 navs.audit.signon=\u8bbf\u95ee\u65e5\u5fd7
 navs.audit.operation=\u64cd\u4f5c\u65e5\u5fd7
+
+home.notices=\u901A\u77E5\u516C\u544A

+ 1 - 1
maxkey-web-maxkey/src/main/resources/templates/views/index.ftl

@@ -1,5 +1,5 @@
 <!DOCTYPE HTML >
-<html xmlns="http://www.w3.org/1999/xhtml">
+<html>
 	<head>
 		<meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />
 		<title>MaxKey</title>

+ 6 - 0
maxkey-web-maxkey/src/main/resources/templates/views/main/appList.ftl

@@ -3,6 +3,12 @@
 <head>
 	<#include  "../layout/header.ftl"/>
 	<#include  "../layout/common.cssjs.ftl"/>
+	<!--notices -->
+	<#if noticesVisible >
+	<script>
+		window.open('<@base/>/lastedNotices','<@locale code="home.notices"/>','width=300,height=300');
+	</script>
+	</#if>
 </head>
 <body>
 <#include  "../layout/top.ftl"/>

+ 13 - 0
maxkey-web-maxkey/src/main/resources/templates/views/notices.ftl

@@ -0,0 +1,13 @@
+<!DOCTYPE HTML >
+<html>
+	<head>
+		<meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />
+		<title>${notice.title}</title>
+		<base href="<@base />"/>
+        <link rel="shortcut icon" type="image/x-icon" href="<@base />/static/images/favicon.ico"/>
+		<link type="text/css" rel="stylesheet" href="<@base url="/style.css"/>" />
+	</head>
+	<body>
+		${notice.content}
+	</body>
+</html>

이 변경점에서 너무 많은 파일들이 변경되어 몇몇 파일들은 표시되지 않았습니다.