diff --git a/zyplayer-doc-data/src/main/java/com/zyplayer/doc/data/aspect/AuthAspect.java b/zyplayer-doc-data/src/main/java/com/zyplayer/doc/data/aspect/AuthAspect.java index 77693b8b..466327ed 100644 --- a/zyplayer-doc-data/src/main/java/com/zyplayer/doc/data/aspect/AuthAspect.java +++ b/zyplayer-doc-data/src/main/java/com/zyplayer/doc/data/aspect/AuthAspect.java @@ -1,5 +1,6 @@ package com.zyplayer.doc.data.aspect; +import com.google.common.collect.Maps; import com.zyplayer.doc.core.json.DocResponseJson; import com.zyplayer.doc.core.json.HttpConst; import com.zyplayer.doc.core.json.ResponseJson; @@ -14,9 +15,11 @@ import org.aspectj.lang.reflect.MethodSignature; import org.springframework.stereotype.Component; import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.servlet.ModelAndView; import javax.annotation.Resource; import java.lang.reflect.Method; +import java.util.Map; @Aspect @Component @@ -32,13 +35,16 @@ public class AuthAspect { RestController restController = BeanUtil.getAnnotation(pjp, RestController.class); boolean isResponseBody = (restController != null || responseBody != null); + Class> returnType = ((MethodSignature) pjp.getSignature()).getMethod().getReturnType(); DocUserDetails currentUser = DocUserUtil.getCurrentUser(); if (currentUser == null) { String reason = "你访问的内容需要登录,请登录后再试"; if (isResponseBody) { return DocResponseJson.failure(HttpConst.TOKEN_TIMEOUT, reason); - } else { - return authMan.authUrl(); + } else if (returnType.isAssignableFrom(ModelAndView.class)) { + return new ModelAndView("redirect:/static/manage/login.html"); + } else if (returnType.isAssignableFrom(Map.class)) { + return Maps.newHashMap(); } } // 判断权限是否足够 diff --git a/zyplayer-doc-data/src/main/java/com/zyplayer/doc/data/repository/manage/entity/WikiPage.java b/zyplayer-doc-data/src/main/java/com/zyplayer/doc/data/repository/manage/entity/WikiPage.java index aada8b65..d43cd579 100644 --- a/zyplayer-doc-data/src/main/java/com/zyplayer/doc/data/repository/manage/entity/WikiPage.java +++ b/zyplayer-doc-data/src/main/java/com/zyplayer/doc/data/repository/manage/entity/WikiPage.java @@ -1,9 +1,10 @@ package com.zyplayer.doc.data.repository.manage.entity; import com.baomidou.mybatisplus.annotation.IdType; -import java.util.Date; import com.baomidou.mybatisplus.annotation.TableId; + import java.io.Serializable; +import java.util.Date; /** *
@@ -11,7 +12,7 @@ import java.io.Serializable; *
* * @author 暮光:城中城 - * @since 2019-03-09 + * @since 2019-06-05 */ public class WikiPage implements Serializable { @@ -88,6 +89,11 @@ public class WikiPage implements Serializable { */ private Integer delFlag; + /** + * 阅读数 + */ + private Integer viewNum; + public Long getId() { return id; } @@ -186,6 +192,13 @@ public class WikiPage implements Serializable { public void setDelFlag(Integer delFlag) { this.delFlag = delFlag; } + public Integer getViewNum() { + return viewNum; + } + + public void setViewNum(Integer viewNum) { + this.viewNum = viewNum; + } @Override public String toString() { @@ -204,6 +217,7 @@ public class WikiPage implements Serializable { ", updateUserName=" + updateUserName + ", updateTime=" + updateTime + ", delFlag=" + delFlag + + ", viewNum=" + viewNum + "}"; } } diff --git a/zyplayer-doc-data/src/main/java/com/zyplayer/doc/data/repository/support/generator/CodeGenerator.java b/zyplayer-doc-data/src/main/java/com/zyplayer/doc/data/repository/support/generator/CodeGenerator.java index 6e6fe678..3a857a12 100644 --- a/zyplayer-doc-data/src/main/java/com/zyplayer/doc/data/repository/support/generator/CodeGenerator.java +++ b/zyplayer-doc-data/src/main/java/com/zyplayer/doc/data/repository/support/generator/CodeGenerator.java @@ -19,7 +19,7 @@ public class CodeGenerator { final String moduleName = "manage"; // final String[] tableName = { "zyplayer_storage", "auth_info", "user_auth", "user_info" }; // final String[] tableName = { "wiki_space", "wiki_page", "wiki_page_content", "wiki_page_file", "wiki_page_comment", "wiki_page_zan" }; - final String[] tableName = { "user_auth" }; + final String[] tableName = { "wiki_page" }; // 代码生成器 AutoGenerator mpg = new AutoGenerator(); diff --git a/zyplayer-doc-data/src/main/java/com/zyplayer/doc/data/service/manage/impl/WikiPageServiceImpl.java b/zyplayer-doc-data/src/main/java/com/zyplayer/doc/data/service/manage/impl/WikiPageServiceImpl.java index 7d8a6ad0..cd809ebf 100644 --- a/zyplayer-doc-data/src/main/java/com/zyplayer/doc/data/service/manage/impl/WikiPageServiceImpl.java +++ b/zyplayer-doc-data/src/main/java/com/zyplayer/doc/data/service/manage/impl/WikiPageServiceImpl.java @@ -12,7 +12,7 @@ import org.springframework.stereotype.Service; * * * @author 暮光:城中城 - * @since 2019-03-09 + * @since 2019-06-05 */ @Service public class WikiPageServiceImpl extends ServiceImpl- * 前端控制器 - *
- * - * @author 暮光:城中城 - * @since 2018-12-05 - */ -@RestController -@RequestMapping("/auth-info") -public class GeneratorAuthInfoController { - -} diff --git a/zyplayer-doc-manage/src/main/java/com/zyplayer/doc/manage/web/generator/GeneratorUserAuthController.java b/zyplayer-doc-manage/src/main/java/com/zyplayer/doc/manage/web/generator/GeneratorUserAuthController.java deleted file mode 100644 index 6b81179a..00000000 --- a/zyplayer-doc-manage/src/main/java/com/zyplayer/doc/manage/web/generator/GeneratorUserAuthController.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.zyplayer.doc.manage.web.generator; - - -import org.springframework.web.bind.annotation.RequestMapping; - -import org.springframework.web.bind.annotation.RestController; - -/** - *- * 前端控制器 - *
- * - * @author 暮光:城中城 - * @since 2018-12-05 - */ -@RestController -@RequestMapping("/user-auth") -public class GeneratorUserAuthController { - -} diff --git a/zyplayer-doc-manage/src/main/java/com/zyplayer/doc/manage/web/generator/GeneratorUserInfoController.java b/zyplayer-doc-manage/src/main/java/com/zyplayer/doc/manage/web/generator/GeneratorUserInfoController.java deleted file mode 100644 index 3605cc14..00000000 --- a/zyplayer-doc-manage/src/main/java/com/zyplayer/doc/manage/web/generator/GeneratorUserInfoController.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.zyplayer.doc.manage.web.generator; - - -import org.springframework.web.bind.annotation.RequestMapping; - -import org.springframework.web.bind.annotation.RestController; - -/** - *- * 前端控制器 - *
- * - * @author 暮光:城中城 - * @since 2018-12-05 - */ -@RestController -@RequestMapping("/user-info") -public class GeneratorUserInfoController { - -} diff --git a/zyplayer-doc-manage/src/main/java/com/zyplayer/doc/manage/web/generator/GeneratorZyplayerStorageController.java b/zyplayer-doc-manage/src/main/java/com/zyplayer/doc/manage/web/generator/GeneratorZyplayerStorageController.java deleted file mode 100644 index cc3c3661..00000000 --- a/zyplayer-doc-manage/src/main/java/com/zyplayer/doc/manage/web/generator/GeneratorZyplayerStorageController.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.zyplayer.doc.manage.web.generator; - - -import org.springframework.web.bind.annotation.RequestMapping; - -import org.springframework.web.bind.annotation.RestController; - -/** - *- * 前端控制器 - *
- * - * @author 暮光:城中城 - * @since 2018-12-05 - */ -@RestController -@RequestMapping("/zyplayer-storage") -public class GeneratorZyplayerStorageController { - -} diff --git a/zyplayer-doc-manage/src/main/java/com/zyplayer/doc/manage/web/manage/DocSystemController.java b/zyplayer-doc-manage/src/main/java/com/zyplayer/doc/manage/web/manage/DocSystemController.java new file mode 100644 index 00000000..a2d05690 --- /dev/null +++ b/zyplayer-doc-manage/src/main/java/com/zyplayer/doc/manage/web/manage/DocSystemController.java @@ -0,0 +1,34 @@ +package com.zyplayer.doc.manage.web.manage; + +import com.zyplayer.doc.data.aspect.AuthMan; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.servlet.ModelAndView; + +/** + * 使用路劲的方式访问页面 + */ +@AuthMan +@Controller +public class DocSystemController { + + @GetMapping("/doc-wiki") + public ModelAndView wiki() { + return new ModelAndView("/doc-wiki-v2.html"); + } + + @GetMapping("/doc-db") + public ModelAndView db() { + return new ModelAndView("/doc-db.html"); + } + + @GetMapping("/doc-swagger") + public ModelAndView swagger() { + return new ModelAndView("/document.html"); + } + + @GetMapping("/doc-dubbo") + public ModelAndView dubbo() { + return new ModelAndView("/doc-dubbo.html"); + } +} diff --git a/zyplayer-doc-manage/src/main/java/com/zyplayer/doc/manage/web/manage/LoginController.java b/zyplayer-doc-manage/src/main/java/com/zyplayer/doc/manage/web/manage/LoginController.java index e3c261aa..41ed7067 100644 --- a/zyplayer-doc-manage/src/main/java/com/zyplayer/doc/manage/web/manage/LoginController.java +++ b/zyplayer-doc-manage/src/main/java/com/zyplayer/doc/manage/web/manage/LoginController.java @@ -72,6 +72,11 @@ public class LoginController { cookie.setDomain("zyplayer.com"); cookie.setMaxAge(60 * 60 * 24); response.addCookie(cookie); + // 再搞一份当前路劲的cookie + cookie = new Cookie("accessToken", accessToken); + cookie.setPath("/"); + cookie.setMaxAge(60 * 60 * 24); + response.addCookie(cookie); return DocResponseJson.ok(); } diff --git a/zyplayer-doc-manage/src/main/resources/sql/zyplayer_doc_manage.1.0.2.sql b/zyplayer-doc-manage/src/main/resources/sql/zyplayer_doc_manage.1.0.2.sql index a5e71036..4715d53f 100644 --- a/zyplayer-doc-manage/src/main/resources/sql/zyplayer_doc_manage.1.0.2.sql +++ b/zyplayer-doc-manage/src/main/resources/sql/zyplayer_doc_manage.1.0.2.sql @@ -3,6 +3,21 @@ -- 直接存权限名,不搞中间表了 ALTER TABLE `user_auth` ADD COLUMN `auth_custom_suffix` varchar(100) NULL COMMENT '自定义权限结尾'; +INSERT INTO `auth_info`(`auth_name`, `auth_desc`, `can_edit`, `create_uid`, `creation_time`) +VALUES +( 'WIKI_CREATE_PAGE_', '创建wiki文档', 0, 1, '2019-06-04 13:01:20') +,('WIKI_EDIT_PAGE_', '编辑wiki文档', 0, 1, '2019-06-04 13:01:20') +,('WIKI_COMMENT_PAGE_', '评论wiki文档', 0, 1, '2019-06-04 13:01:20') +,('WIKI_DELETE_PAGE_', '删除wiki文档', 0, 1, '2019-06-04 13:01:20') +,('WIKI_PAGE_FILE_UPLOAD_', '上传wiki文档附件', 0, 1, '2019-06-04 13:01:20') +,('WIKI_PAGE_FILE_DELETE_', '删除wiki文档附件', 0, 1, '2019-06-04 13:01:20') +,('WIKI_PAGE_AUTH_MANAGE_', 'wiki权限管理', 0, 1, '2019-06-04 13:01:20') +; + +ALTER TABLE `wiki_page` ADD COLUMN `view_num` int NOT NULL DEFAULT 0 COMMENT '阅读数'; + + + -- 权限的库: diff --git a/zyplayer-doc-manage/src/main/resources/设计/权限设计.xlsx b/zyplayer-doc-manage/src/main/resources/设计/权限设计.xlsx index c4c458c1..4c0eb226 100644 Binary files a/zyplayer-doc-manage/src/main/resources/设计/权限设计.xlsx and b/zyplayer-doc-manage/src/main/resources/设计/权限设计.xlsx differ diff --git a/zyplayer-doc-manage/src/main/webapp/static/manage/login.html b/zyplayer-doc-manage/src/main/webapp/static/manage/login.html index 7b99d59c..c9f58ac3 100644 --- a/zyplayer-doc-manage/src/main/webapp/static/manage/login.html +++ b/zyplayer-doc-manage/src/main/webapp/static/manage/login.html @@ -74,16 +74,22 @@ app.passwordError = "密码不能为空"; return; } - post(ctx + "login", param, function (result) { - console.log(result); - if (result.errCode == 200) { - location.href = ctx + "static/manage/home.html"; - } else { - app.passwordError = "登录失败," + result.errMsg; - } - }, function(){ - // 通过nginx代理之后没端口,但tomcat容器有端口,会跨域异常,但正常登陆了的,直接跳 - location.href = ctx + "static/manage/home.html"; + var returnUrl = common.getParam("returnUrl"); + if (!!returnUrl) { + returnUrl = decodeURI(returnUrl); + } else { + returnUrl = ctx + "static/manage/home.html"; + } + post(ctx + "login", param, function (result) { + console.log(result); + if (result.errCode == 200) { + location.href = returnUrl; + } else { + app.passwordError = "登录失败," + result.errMsg; + } + }, function () { + // 通过nginx代理之后没端口,但tomcat容器有端口,会跨域异常,但正常登陆了的,直接跳 + // location.href = returnUrl; }); }, init: function () { diff --git a/zyplayer-doc-ui/wiki-ui/src/App.vue b/zyplayer-doc-ui/wiki-ui/src/App.vue index f2afe416..7629f3d6 100644 --- a/zyplayer-doc-ui/wiki-ui/src/App.vue +++ b/zyplayer-doc-ui/wiki-ui/src/App.vue @@ -175,28 +175,10 @@ treePathDataMap: new Map(), // 搜索的输入内容 searchKeywords: "", - // 编辑相关 - newPageId: "", - newPageTitle: "", // 页面展示相关 wikiPageList:[], wikiPage: {}, wikiPageExpandedKeys: [], - pageContent: {}, - pageFileList: [], - uploadFileList: [], - uploadFormData: {pageId: 0}, - zanUserDialogVisible: false, - zanUserList: [], - // 评论相关 - commentTextInput: "", - commentList: [], - recommentInfo: {}, - // 页面跳转相关 - initOver: false, - doNotPushState: false, - urlParamPageId: 0, - urlParam: {}, // 升级信息 upgradeInfo: {}, } diff --git a/zyplayer-doc-ui/wiki-ui/src/common/config/apilist.js b/zyplayer-doc-ui/wiki-ui/src/common/config/apilist.js index 95ba5f2e..01f3bde1 100644 --- a/zyplayer-doc-ui/wiki-ui/src/common/config/apilist.js +++ b/zyplayer-doc-ui/wiki-ui/src/common/config/apilist.js @@ -1,6 +1,6 @@ var URL = { - userLogin: '/user/login', - userLogout: '/user/logout', + userLogin: '/login', + userLogout: '/logout', getUserInfo: '/user/getUserInfo', pageUpdate: '/zyplayer-doc-wiki/page/update', pageChangeParent: '/zyplayer-doc-wiki/page/changeParent', @@ -9,6 +9,8 @@ var URL = { pageDetail: '/zyplayer-doc-wiki/page/detail', spaceList: '/zyplayer-doc-wiki/space/list', updateSpace: '/zyplayer-doc-wiki/space/update', + getPageUserAuthList: '/zyplayer-doc-wiki/page/auth/list', + assignPageUserAuth: '/zyplayer-doc-wiki/page/auth/assign', updatePageFile: '/zyplayer-doc-wiki/page/file/update', pageCommentList: '/zyplayer-doc-wiki/page/comment/list', @@ -17,6 +19,7 @@ var URL = { updatePageZan: '/zyplayer-doc-wiki/page/zan/update', commonUpload: '/zyplayer-doc-wiki/common/upload', + getUserBaseInfo: '/zyplayer-doc-wiki/common/user/base', }; var URL1 = {}; diff --git a/zyplayer-doc-ui/wiki-ui/src/common/config/apimix.js b/zyplayer-doc-ui/wiki-ui/src/common/config/apimix.js index 2a91413a..3ec4706c 100644 --- a/zyplayer-doc-ui/wiki-ui/src/common/config/apimix.js +++ b/zyplayer-doc-ui/wiki-ui/src/common/config/apimix.js @@ -5,11 +5,11 @@ var href = window.location.href; var _fn = { href: href, // 这里设置接口域名 - // HOST: 'http://local.zyplayer.com:8083/zyplayer-doc-manage', - // HOST1: 'http://local.zyplayer.com:8083/zyplayer-doc-manage', + HOST: 'http://local.zyplayer.com:8083/zyplayer-doc-manage', + HOST1: 'http://local.zyplayer.com:8083/zyplayer-doc-manage', // 打包时使用下面这两行,文件就放在根目录下,所以当前路劲就好 - HOST: './', - HOST1: './', + // HOST: './', + // HOST1: './', mixUrl: function (host, url) { var p; diff --git a/zyplayer-doc-ui/wiki-ui/src/common/lib/common/common.js b/zyplayer-doc-ui/wiki-ui/src/common/lib/common/common.js index ce652087..6eeeeb7a 100644 --- a/zyplayer-doc-ui/wiki-ui/src/common/lib/common/common.js +++ b/zyplayer-doc-ui/wiki-ui/src/common/lib/common/common.js @@ -23,7 +23,8 @@ export default { global.vue.$message('请求错误:' + res.message); } else if (res.data.errCode == 400) { global.vue.$message('请先登录'); - window.location = apimix.apilist1.HOST + "/static/manage/login.html"; + var href = encodeURI(window.location.href); + window.location = apimix.apilist1.HOST + "/static/manage/login.html?returnUrl=" + href; } else if (res.data.errCode == 402) { global.vue.$router.push("/common/noAuth"); } else if (res.data.errCode !== 200) { diff --git a/zyplayer-doc-ui/wiki-ui/src/common/lib/wangEditor/fonts/w-e-icon.woff b/zyplayer-doc-ui/wiki-ui/src/common/lib/wangEditor/fonts/w-e-icon.woff deleted file mode 100644 index 6dc5b5a3..00000000 Binary files a/zyplayer-doc-ui/wiki-ui/src/common/lib/wangEditor/fonts/w-e-icon.woff and /dev/null differ diff --git a/zyplayer-doc-ui/wiki-ui/src/common/lib/wangEditor/wangEditor.css b/zyplayer-doc-ui/wiki-ui/src/common/lib/wangEditor/wangEditor.css deleted file mode 100644 index 5502c553..00000000 --- a/zyplayer-doc-ui/wiki-ui/src/common/lib/wangEditor/wangEditor.css +++ /dev/null @@ -1,411 +0,0 @@ -.w-e-toolbar, -.w-e-text-container, -.w-e-menu-panel { - padding: 0; - margin: 0; - box-sizing: border-box; -} -.w-e-toolbar *, -.w-e-text-container *, -.w-e-menu-panel * { - padding: 0; - margin: 0; - box-sizing: border-box; -} -.w-e-clear-fix:after { - content: ""; - display: table; - clear: both; -} - -.w-e-toolbar .w-e-droplist { - position: absolute; - left: 0; - top: 0; - background-color: #fff; - border: 1px solid #f1f1f1; - border-right-color: #ccc; - border-bottom-color: #ccc; -} -.w-e-toolbar .w-e-droplist .w-e-dp-title { - text-align: center; - color: #999; - line-height: 2; - border-bottom: 1px solid #f1f1f1; - font-size: 13px; -} -.w-e-toolbar .w-e-droplist ul.w-e-list { - list-style: none; - line-height: 1; -} -.w-e-toolbar .w-e-droplist ul.w-e-list li.w-e-item { - color: #333; - padding: 5px 0; -} -.w-e-toolbar .w-e-droplist ul.w-e-list li.w-e-item:hover { - background-color: #f1f1f1; -} -.w-e-toolbar .w-e-droplist ul.w-e-block { - list-style: none; - text-align: left; - padding: 5px; -} -.w-e-toolbar .w-e-droplist ul.w-e-block li.w-e-item { - display: inline-block; - *display: inline; - *zoom: 1; - padding: 3px 5px; -} -.w-e-toolbar .w-e-droplist ul.w-e-block li.w-e-item:hover { - background-color: #f1f1f1; -} - -@font-face { - font-family: 'w-e-icon'; - src: url(data:application/x-font-woff;charset=utf-8;base64,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) format('truetype'); - font-weight: normal; - font-style: normal; -} -[class^="w-e-icon-"], -[class*=" w-e-icon-"] { - /* use !important to prevent issues with browser extensions that change fonts */ - font-family: 'w-e-icon' !important; - speak: none; - font-style: normal; - font-weight: normal; - font-variant: normal; - text-transform: none; - line-height: 1; - /* Better Font Rendering =========== */ - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; -} -.w-e-icon-close:before { - content: "\f00d"; -} -.w-e-icon-upload2:before { - content: "\e9c6"; -} -.w-e-icon-trash-o:before { - content: "\f014"; -} -.w-e-icon-header:before { - content: "\f1dc"; -} -.w-e-icon-pencil2:before { - content: "\e906"; -} -.w-e-icon-paint-brush:before { - content: "\f1fc"; -} -.w-e-icon-image:before { - content: "\e90d"; -} -.w-e-icon-play:before { - content: "\e912"; -} -.w-e-icon-location:before { - content: "\e947"; -} -.w-e-icon-undo:before { - content: "\e965"; -} -.w-e-icon-redo:before { - content: "\e966"; -} -.w-e-icon-quotes-left:before { - content: "\e977"; -} -.w-e-icon-list-numbered:before { - content: "\e9b9"; -} -.w-e-icon-list2:before { - content: "\e9bb"; -} -.w-e-icon-link:before { - content: "\e9cb"; -} -.w-e-icon-happy:before { - content: "\e9df"; -} -.w-e-icon-bold:before { - content: "\ea62"; -} -.w-e-icon-underline:before { - content: "\ea63"; -} -.w-e-icon-italic:before { - content: "\ea64"; -} -.w-e-icon-strikethrough:before { - content: "\ea65"; -} -.w-e-icon-table2:before { - content: "\ea71"; -} -.w-e-icon-paragraph-left:before { - content: "\ea77"; -} -.w-e-icon-paragraph-center:before { - content: "\ea78"; -} -.w-e-icon-paragraph-right:before { - content: "\ea79"; -} -.w-e-icon-terminal:before { - content: "\f120"; -} -.w-e-icon-page-break:before { - content: "\ea68"; -} -.w-e-icon-cancel-circle:before { - content: "\ea0d"; -} -.w-e-icon-font:before { - content: "\ea5c"; -} -.w-e-icon-text-heigh:before { - content: "\ea5f"; -} - -.w-e-toolbar { - display: -webkit-box; - display: -ms-flexbox; - display: flex; - padding: 0 5px; - /* flex-wrap: wrap; */ - /* 单个菜单 */ -} -.w-e-toolbar .w-e-menu { - position: relative; - text-align: center; - padding: 5px 10px; - cursor: pointer; -} -.w-e-toolbar .w-e-menu i { - color: #999; -} -.w-e-toolbar .w-e-menu:hover i { - color: #333; -} -.w-e-toolbar .w-e-active i { - color: #1e88e5; -} -.w-e-toolbar .w-e-active:hover i { - color: #1e88e5; -} - -.w-e-text-container .w-e-panel-container { - position: absolute; - top: 0; - left: 50%; - border: 1px solid #ccc; - border-top: 0; - box-shadow: 1px 1px 2px #ccc; - color: #333; - background-color: #fff; - /* 为 emotion panel 定制的样式 */ - /* 上传图片的 panel 定制样式 */ -} -.w-e-text-container .w-e-panel-container .w-e-panel-close { - position: absolute; - right: 0; - top: 0; - padding: 5px; - margin: 2px 5px 0 0; - cursor: pointer; - color: #999; -} -.w-e-text-container .w-e-panel-container .w-e-panel-close:hover { - color: #333; -} -.w-e-text-container .w-e-panel-container .w-e-panel-tab-title { - list-style: none; - display: -webkit-box; - display: -ms-flexbox; - display: flex; - font-size: 14px; - margin: 2px 10px 0 10px; - border-bottom: 1px solid #f1f1f1; -} -.w-e-text-container .w-e-panel-container .w-e-panel-tab-title .w-e-item { - padding: 3px 5px; - color: #999; - cursor: pointer; - margin: 0 3px; - position: relative; - top: 1px; -} -.w-e-text-container .w-e-panel-container .w-e-panel-tab-title .w-e-active { - color: #333; - border-bottom: 1px solid #333; - cursor: default; - font-weight: 700; -} -.w-e-text-container .w-e-panel-container .w-e-panel-tab-content { - padding: 10px 15px 10px 15px; - font-size: 16px; - /* 输入框的样式 */ - /* 按钮的样式 */ -} -.w-e-text-container .w-e-panel-container .w-e-panel-tab-content input:focus, -.w-e-text-container .w-e-panel-container .w-e-panel-tab-content textarea:focus, -.w-e-text-container .w-e-panel-container .w-e-panel-tab-content button:focus { - outline: none; -} -.w-e-text-container .w-e-panel-container .w-e-panel-tab-content textarea { - width: 100%; - border: 1px solid #ccc; - padding: 5px; -} -.w-e-text-container .w-e-panel-container .w-e-panel-tab-content textarea:focus { - border-color: #1e88e5; -} -.w-e-text-container .w-e-panel-container .w-e-panel-tab-content input[type=text] { - border: none; - border-bottom: 1px solid #ccc; - font-size: 14px; - height: 20px; - color: #333; - text-align: left; -} -.w-e-text-container .w-e-panel-container .w-e-panel-tab-content input[type=text].small { - width: 30px; - text-align: center; -} -.w-e-text-container .w-e-panel-container .w-e-panel-tab-content input[type=text].block { - display: block; - width: 100%; - margin: 10px 0; -} -.w-e-text-container .w-e-panel-container .w-e-panel-tab-content input[type=text]:focus { - border-bottom: 2px solid #1e88e5; -} -.w-e-text-container .w-e-panel-container .w-e-panel-tab-content .w-e-button-container button { - font-size: 14px; - color: #1e88e5; - border: none; - padding: 5px 10px; - background-color: #fff; - cursor: pointer; - border-radius: 3px; -} -.w-e-text-container .w-e-panel-container .w-e-panel-tab-content .w-e-button-container button.left { - float: left; - margin-right: 10px; -} -.w-e-text-container .w-e-panel-container .w-e-panel-tab-content .w-e-button-container button.right { - float: right; - margin-left: 10px; -} -.w-e-text-container .w-e-panel-container .w-e-panel-tab-content .w-e-button-container button.gray { - color: #999; -} -.w-e-text-container .w-e-panel-container .w-e-panel-tab-content .w-e-button-container button.red { - color: #c24f4a; -} -.w-e-text-container .w-e-panel-container .w-e-panel-tab-content .w-e-button-container button:hover { - background-color: #f1f1f1; -} -.w-e-text-container .w-e-panel-container .w-e-panel-tab-content .w-e-button-container:after { - content: ""; - display: table; - clear: both; -} -.w-e-text-container .w-e-panel-container .w-e-emoticon-container .w-e-item { - cursor: pointer; - font-size: 18px; - padding: 0 3px; - display: inline-block; - *display: inline; - *zoom: 1; -} -.w-e-text-container .w-e-panel-container .w-e-up-img-container { - text-align: center; -} -.w-e-text-container .w-e-panel-container .w-e-up-img-container .w-e-up-btn { - display: inline-block; - *display: inline; - *zoom: 1; - color: #999; - cursor: pointer; - font-size: 60px; - line-height: 1; -} -.w-e-text-container .w-e-panel-container .w-e-up-img-container .w-e-up-btn:hover { - color: #333; -} - -.w-e-text-container { - position: relative; -} -.w-e-text-container .w-e-progress { - position: absolute; - background-color: #1e88e5; - bottom: 0; - left: 0; - height: 1px; -} -.w-e-text { - padding: 0 10px; - overflow-y: scroll; -} -.w-e-text p, -.w-e-text h1, -.w-e-text h2, -.w-e-text h3, -.w-e-text h4, -.w-e-text h5, -.w-e-text table, -.w-e-text pre { - margin: 10px 0; - line-height: 1.5; -} -.w-e-text ul, -.w-e-text ol { - margin: 10px 0 10px 20px; -} -.w-e-text blockquote { - display: block; - border-left: 8px solid #d0e5f2; - padding: 5px 10px; - margin: 10px 0; - line-height: 1.4; - font-size: 100%; - background-color: #f1f1f1; -} -.w-e-text code { - display: inline-block; - *display: inline; - *zoom: 1; - background-color: #f1f1f1; - border-radius: 3px; - padding: 3px 5px; - margin: 0 3px; -} -.w-e-text pre code { - display: block; -} -.w-e-text table { - border-top: 1px solid #ccc; - border-left: 1px solid #ccc; -} -.w-e-text table td, -.w-e-text table th { - border-bottom: 1px solid #ccc; - border-right: 1px solid #ccc; - padding: 3px 5px; -} -.w-e-text table th { - border-bottom: 2px solid #ccc; - text-align: center; -} -.w-e-text:focus { - outline: none; -} -.w-e-text img { - cursor: pointer; -} -.w-e-text img:hover { - box-shadow: 0 0 5px #333; -} diff --git a/zyplayer-doc-ui/wiki-ui/src/common/lib/wangEditor/wangEditor.js b/zyplayer-doc-ui/wiki-ui/src/common/lib/wangEditor/wangEditor.js deleted file mode 100644 index 81d57dcf..00000000 --- a/zyplayer-doc-ui/wiki-ui/src/common/lib/wangEditor/wangEditor.js +++ /dev/null @@ -1,4674 +0,0 @@ -(function (global, factory) { - typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : - typeof define === 'function' && define.amd ? define(factory) : - (global.wangEditor = factory()); -}(this, (function () { 'use strict'; - -/* - poly-fill -*/ - -var polyfill = function () { - - // Object.assign - if (typeof Object.assign != 'function') { - Object.assign = function (target, varArgs) { - // .length of function is 2 - if (target == null) { - // TypeError if undefined or null - throw new TypeError('Cannot convert undefined or null to object'); - } - - var to = Object(target); - - for (var index = 1; index < arguments.length; index++) { - var nextSource = arguments[index]; - - if (nextSource != null) { - // Skip over if undefined or null - for (var nextKey in nextSource) { - // Avoid bugs when hasOwnProperty is shadowed - if (Object.prototype.hasOwnProperty.call(nextSource, nextKey)) { - to[nextKey] = nextSource[nextKey]; - } - } - } - } - return to; - }; - } - - // IE 中兼容 Element.prototype.matches - if (!Element.prototype.matches) { - Element.prototype.matches = Element.prototype.matchesSelector || Element.prototype.mozMatchesSelector || Element.prototype.msMatchesSelector || Element.prototype.oMatchesSelector || Element.prototype.webkitMatchesSelector || function (s) { - var matches = (this.document || this.ownerDocument).querySelectorAll(s), - i = matches.length; - while (--i >= 0 && matches.item(i) !== this) {} - return i > -1; - }; - } -}; - -/* - DOM 操作 API -*/ - -// 根据 html 代码片段创建 dom 对象 -function createElemByHTML(html) { - var div = void 0; - div = document.createElement('div'); - div.innerHTML = html; - return div.children; -} - -// 是否是 DOM List -function isDOMList(selector) { - if (!selector) { - return false; - } - if (selector instanceof HTMLCollection || selector instanceof NodeList) { - return true; - } - return false; -} - -// 封装 document.querySelectorAll -function querySelectorAll(selector) { - var result = document.querySelectorAll(selector); - if (isDOMList(result)) { - return result; - } else { - return [result]; - } -} - -// 记录所有的事件绑定 -var eventList = []; - -// 创建构造函数 -function DomElement(selector) { - if (!selector) { - return; - } - - // selector 本来就是 DomElement 对象,直接返回 - if (selector instanceof DomElement) { - return selector; - } - - this.selector = selector; - var nodeType = selector.nodeType; - - // 根据 selector 得出的结果(如 DOM,DOM List) - var selectorResult = []; - if (nodeType === 9) { - // document 节点 - selectorResult = [selector]; - } else if (nodeType === 1) { - // 单个 DOM 节点 - selectorResult = [selector]; - } else if (isDOMList(selector) || selector instanceof Array) { - // DOM List 或者数组 - selectorResult = selector; - } else if (typeof selector === 'string') { - // 字符串 - selector = selector.replace('/\n/mg', '').trim(); - if (selector.indexOf('<') === 0) { - // 如设置标题
'), - type: 'list', // droplist 以列表形式展示 - list: [{ $elem: $('正文
'), value: '' }], - onClick: function onClick(value) { - // 注意 this 是指向当前的 Head 对象 - _this._command(value); - } - }); -} - -// 原型 -Head.prototype = { - constructor: Head, - - // 执行命令 - _command: function _command(value) { - var editor = this.editor; - - var $selectionElem = editor.selection.getSelectionContainerElem(); - if (editor.$textElem.equal($selectionElem)) { - // 不能选中多行来设置标题,否则会出现问题 - // 例如选中的是
xxx
yyy
来设置标题,设置之后会成为字号
'), - type: 'list', // droplist 以列表形式展示 - list: [{ $elem: $('x-small'), value: '1' }, { $elem: $('small'), value: '2' }, { $elem: $('normal'), value: '3' }, { $elem: $('large'), value: '4' }, { $elem: $('x-large'), value: '5' }, { $elem: $('xx-large'), value: '6' }], - onClick: function onClick(value) { - // 注意 this 是指向当前的 FontSize 对象 - _this._command(value); - } - }); -} - -// 原型 -FontSize.prototype = { - constructor: FontSize, - - // 执行命令 - _command: function _command(value) { - var editor = this.editor; - editor.cmd.do('fontSize', value); - } -}; - -/* - menu - fontName -*/ - -// 构造函数 -function FontName(editor) { - var _this = this; - - this.editor = editor; - this.$elem = $(''); - this.type = 'droplist'; - - // 当前是否 active 状态 - this._active = false; - - // 获取配置的字体 - var config = editor.config; - var fontNames = config.fontNames || []; - - // 初始化 droplist - this.droplist = new DropList(this, { - width: 100, - $title: $('字体
'), - type: 'list', // droplist 以列表形式展示 - list: fontNames.map(function (fontName) { - return { $elem: $('' + fontName + ''), value: fontName }; - }), - onClick: function onClick(value) { - // 注意 this 是指向当前的 FontName 对象 - _this._command(value); - } - }); -} - -// 原型 -FontName.prototype = { - constructor: FontName, - - _command: function _command(value) { - var editor = this.editor; - editor.cmd.do('fontName', value); - } -}; - -/* - panel -*/ - -var emptyFn = function emptyFn() {}; - -// 记录已经显示 panel 的菜单 -var _isCreatedPanelMenus = []; - -// 构造函数 -function Panel(menu, opt) { - this.menu = menu; - this.opt = opt; -} - -// 原型 -Panel.prototype = { - constructor: Panel, - - // 显示(插入DOM) - show: function show() { - var _this = this; - - var menu = this.menu; - if (_isCreatedPanelMenus.indexOf(menu) >= 0) { - // 该菜单已经创建了 panel 不能再创建 - return; - } - - var editor = menu.editor; - var $body = $('body'); - var $textContainerElem = editor.$textContainerElem; - var opt = this.opt; - - // panel 的容器 - var $container = $(''); - var width = opt.width || 300; // 默认 300px - $container.css('width', width + 'px').css('margin-left', (0 - width) / 2 + 'px'); - - // 添加关闭按钮 - var $closeBtn = $(''); - $container.append($closeBtn); - $closeBtn.on('click', function () { - _this.hide(); - }); - - // 准备 tabs 容器 - var $tabTitleContainer = $('设置列表
'), - type: 'list', // droplist 以列表形式展示 - list: [{ $elem: $(' 有序列表'), value: 'insertOrderedList' }, { $elem: $(' 无序列表'), value: 'insertUnorderedList' }], - onClick: function onClick(value) { - // 注意 this 是指向当前的 List 对象 - _this._command(value); - } - }); -} - -// 原型 -List.prototype = { - constructor: List, - - // 执行命令 - _command: function _command(value) { - var editor = this.editor; - var $textElem = editor.$textElem; - editor.selection.restoreSelection(); - if (editor.cmd.queryCommandState(value)) { - return; - } - editor.cmd.do(value); - - // 验证列表是否被包裹在之内 - var $selectionElem = editor.selection.getSelectionContainerElem(); - if ($selectionElem.getNodeName() === 'LI') { - $selectionElem = $selectionElem.parent(); - } - if (/^ol|ul$/i.test($selectionElem.getNodeName()) === false) { - return; - } - if ($selectionElem.equal($textElem)) { - // 证明是顶级标签,没有被
包裹 - return; - } - var $parent = $selectionElem.parent(); - if ($parent.equal($textElem)) { - // $parent 是顶级标签,不能删除 - return; - } - - $selectionElem.insertAfter($parent); - $parent.remove(); - }, - - // 试图改变 active 状态 - tryChangeActive: function tryChangeActive(e) { - var editor = this.editor; - var $elem = this.$elem; - if (editor.cmd.queryCommandState('insertUnOrderedList') || editor.cmd.queryCommandState('insertOrderedList')) { - this._active = true; - $elem.addClass('w-e-active'); - } else { - this._active = false; - $elem.removeClass('w-e-active'); - } - } -}; - -/* - menu - justify -*/ -// 构造函数 -function Justify(editor) { - var _this = this; - - this.editor = editor; - this.$elem = $('
'); - this.type = 'droplist'; - - // 当前是否 active 状态 - this._active = false; - - // 初始化 droplist - this.droplist = new DropList(this, { - width: 100, - $title: $('对齐方式
'), - type: 'list', // droplist 以列表形式展示 - list: [{ $elem: $(' 靠左'), value: 'justifyLeft' }, { $elem: $(' 居中'), value: 'justifyCenter' }, { $elem: $(' 靠右'), value: 'justifyRight' }], - onClick: function onClick(value) { - // 注意 this 是指向当前的 List 对象 - _this._command(value); - } - }); -} - -// 原型 -Justify.prototype = { - constructor: Justify, - - // 执行命令 - _command: function _command(value) { - var editor = this.editor; - editor.cmd.do(value); - } -}; - -/* - menu - Forecolor -*/ -// 构造函数 -function ForeColor(editor) { - var _this = this; - - this.editor = editor; - this.$elem = $(''); - this.type = 'droplist'; - - // 获取配置的颜色 - var config = editor.config; - var colors = config.colors || []; - - // 当前是否 active 状态 - this._active = false; - - // 初始化 droplist - this.droplist = new DropList(this, { - width: 120, - $title: $('文字颜色
'), - type: 'inline-block', // droplist 内容以 block 形式展示 - list: colors.map(function (color) { - return { $elem: $(''), value: color }; - }), - onClick: function onClick(value) { - // 注意 this 是指向当前的 ForeColor 对象 - _this._command(value); - } - }); -} - -// 原型 -ForeColor.prototype = { - constructor: ForeColor, - - // 执行命令 - _command: function _command(value) { - var editor = this.editor; - editor.cmd.do('foreColor', value); - } -}; - -/* - menu - BackColor -*/ -// 构造函数 -function BackColor(editor) { - var _this = this; - - this.editor = editor; - this.$elem = $(''); - this.type = 'droplist'; - - // 获取配置的颜色 - var config = editor.config; - var colors = config.colors || []; - - // 当前是否 active 状态 - this._active = false; - - // 初始化 droplist - this.droplist = new DropList(this, { - width: 120, - $title: $('背景色
'), - type: 'inline-block', // droplist 内容以 block 形式展示 - list: colors.map(function (color) { - return { $elem: $(''), value: color }; - }), - onClick: function onClick(value) { - // 注意 this 是指向当前的 BackColor 对象 - _this._command(value); - } - }); -} - -// 原型 -BackColor.prototype = { - constructor: BackColor, - - // 执行命令 - _command: function _command(value) { - var editor = this.editor; - editor.cmd.do('backColor', value); - } -}; - -/* - menu - quote -*/ -// 构造函数 -function Quote(editor) { - this.editor = editor; - this.$elem = $(''); - this.type = 'click'; - - // 当前是否 active 状态 - this._active = false; -} - -// 原型 -Quote.prototype = { - constructor: Quote, - - onClick: function onClick(e) { - var editor = this.editor; - var $selectionElem = editor.selection.getSelectionContainerElem(); - var nodeName = $selectionElem.getNodeName(); - - if (!UA.isIE()) { - if (nodeName === 'BLOCKQUOTE') { - // 撤销 quote - editor.cmd.do('formatBlock', ''); - } else { - // 转换为 quote - editor.cmd.do('formatBlock', '
'); - } - return; - } - - // IE 中不支持 formatBlock,要用其他方式兼容 - var content = void 0, - $targetELem = void 0; - if (nodeName === 'P') { - // 将 P 转换为 quote - content = $selectionElem.text(); - $targetELem = $('' + content + ''); - $targetELem.insertAfter($selectionElem); - $selectionElem.remove(); - return; - } - if (nodeName === 'BLOCKQUOTE') { - // 撤销 quote - content = $selectionElem.text(); - $targetELem = $('' + content + '
'); - $targetELem.insertAfter($selectionElem); - $selectionElem.remove(); - } - }, - - tryChangeActive: function tryChangeActive(e) { - var editor = this.editor; - var $elem = this.$elem; - var reg = /^BLOCKQUOTE$/i; - var cmdValue = editor.cmd.queryCommandValue('formatBlock'); - if (reg.test(cmdValue)) { - this._active = true; - $elem.addClass('w-e-active'); - } else { - this._active = false; - $elem.removeClass('w-e-active'); - } - } -}; - -/* - menu - code -*/ -// 构造函数 -function Code(editor) { - this.editor = editor; - this.$elem = $(''); - this.type = 'panel'; - - // 当前是否 active 状态 - this._active = false; -} - -// 原型 -Code.prototype = { - constructor: Code, - - onClick: function onClick(e) { - var editor = this.editor; - var $startElem = editor.selection.getSelectionStartElem(); - var $endElem = editor.selection.getSelectionEndElem(); - var isSeleEmpty = editor.selection.isSelectionEmpty(); - var selectionText = editor.selection.getSelectionText(); - var $code = void 0; - - if (!$startElem.equal($endElem)) { - // 跨元素选择,不做处理 - editor.selection.restoreSelection(); - return; - } - if (!isSeleEmpty) { - // 选取不是空,用包裹即可 - $code = $('' + selectionText + ''); - editor.cmd.do('insertElem', $code); - editor.selection.createRangeByElem($code, false); - editor.selection.restoreSelection(); - return; - } - - // 选取是空,且没有夸元素选择,则插入- if (this._active) { - // 选中状态,将编辑内容 - this._createPanel($startElem.html()); - } else { - // 未选中状态,将创建内容 - this._createPanel(); - } - }, - - _createPanel: function _createPanel(value) { - var _this = this; - - // value - 要编辑的内容 - value = value || ''; - var type = !value ? 'new' : 'edit'; - var textId = getRandom('texxt'); - var btnId = getRandom('btn'); - - var panel = new Panel(this, { - width: 500, - // 一个 Panel 包含多个 tab - tabs: [{ - // 标题 - title: '插入代码', - // 模板 - tpl: '\n \n \n', - // 事件绑定 - events: [ - // 插入代码 - { - selector: '#' + btnId, - type: 'click', - fn: function fn() { - var $text = $('#' + textId); - var text = $text.val() || $text.html(); - text = replaceHtmlSymbol(text); - if (type === 'new') { - // 新插入 - _this._insertCode(text); - } else { - // 编辑更新 - _this._updateCode(text); - } - - // 返回 true,表示该事件执行完之后,panel 要关闭。否则 panel 不会关闭 - return true; - } - }] - } // first tab end - ] // tabs end - }); // new Panel end - - // 显示 panel - panel.show(); - - // 记录属性 - this.panel = panel; - }, - - // 插入代码 - _insertCode: function _insertCode(value) { - var editor = this.editor; - editor.cmd.do('insertHTML', '' + value + ''); - }, - - // 更新代码 - _updateCode: function _updateCode(value) { - var editor = this.editor; - var $selectionELem = editor.selection.getSelectionContainerElem(); - if (!$selectionELem) { - return; - } - $selectionELem.html(value); - editor.selection.restoreSelection(); - }, - - // 试图改变 active 状态 - tryChangeActive: function tryChangeActive(e) { - var editor = this.editor; - var $elem = this.$elem; - var $selectionELem = editor.selection.getSelectionContainerElem(); - if (!$selectionELem) { - return; - } - var $parentElem = $selectionELem.parent(); - if ($selectionELem.getNodeName() === 'CODE' && $parentElem.getNodeName() === 'PRE') { - this._active = true; - $elem.addClass('w-e-active'); - } else { - this._active = false; - $elem.removeClass('w-e-active'); - } - } -}; - -/* - menu - emoticon -*/ -// 构造函数 -function Emoticon(editor) { - this.editor = editor; - this.$elem = $(''); - this.type = 'panel'; - - // 当前是否 active 状态 - this._active = false; -} - -// 原型 -Emoticon.prototype = { - constructor: Emoticon, - - onClick: function onClick() { - this._createPanel(); - }, - - _createPanel: function _createPanel() { - var _this = this; - - var editor = this.editor; - var config = editor.config; - // 获取表情配置 - var emotions = config.emotions || []; - - // 创建表情 dropPanel 的配置 - var tabConfig = []; - emotions.forEach(function (emotData) { - var emotType = emotData.type; - var content = emotData.content || []; - - // 这一组表情最终拼接出来的 html - var faceHtml = ''; - - // emoji 表情 - if (emotType === 'emoji') { - content.forEach(function (item) { - if (item) { - faceHtml += '' + item + ''; - } - }); - } - // 图片表情 - if (emotType === 'image') { - content.forEach(function (item) { - var src = item.src; - var alt = item.alt; - if (src) { - // 加一个 data-w-e 属性,点击图片的时候不再提示编辑图片 - faceHtml += '
'; - } - }); - } - - tabConfig.push({ - title: emotData.title, - tpl: '
' + faceHtml + '', - events: [{ - selector: 'span.w-e-item', - type: 'click', - fn: function fn(e) { - var target = e.target; - var $target = $(target); - var nodeName = $target.getNodeName(); - - var insertHtml = void 0; - if (nodeName === 'IMG') { - // 插入图片 - insertHtml = $target.parent().html(); - } else { - // 插入 emoji - insertHtml = '' + $target.html() + ''; - } - - _this._insert(insertHtml); - // 返回 true,表示该事件执行完之后,panel 要关闭。否则 panel 不会关闭 - return true; - } - }] - }); - }); - - var panel = new Panel(this, { - width: 300, - height: 200, - // 一个 Panel 包含多个 tab - tabs: tabConfig - }); - - // 显示 panel - panel.show(); - - // 记录属性 - this.panel = panel; - }, - - // 插入表情 - _insert: function _insert(emotHtml) { - var editor = this.editor; - editor.cmd.do('insertHTML', emotHtml); - } -}; - -/* - menu - table -*/ -// 构造函数 -function Table(editor) { - this.editor = editor; - this.$elem = $(''); - this.type = 'panel'; - - // 当前是否 active 状态 - this._active = false; -} - -// 原型 -Table.prototype = { - constructor: Table, - - onClick: function onClick() { - if (this._active) { - // 编辑现有表格 - this._createEditPanel(); - } else { - // 插入新表格 - this._createInsertPanel(); - } - }, - - // 创建插入新表格的 panel - _createInsertPanel: function _createInsertPanel() { - var _this = this; - - // 用到的 id - var btnInsertId = getRandom('btn'); - var textRowNum = getRandom('row'); - var textColNum = getRandom('col'); - - var panel = new Panel(this, { - width: 250, - // panel 包含多个 tab - tabs: [{ - // 标题 - title: '插入表格', - // 模板 - tpl: '\n', - // 事件绑定 - events: [{ - // 点击按钮,插入表格 - selector: '#' + btnInsertId, - type: 'click', - fn: function fn() { - var rowNum = parseInt($('#' + textRowNum).val()); - var colNum = parseInt($('#' + textColNum).val()); - - if (rowNum && colNum && rowNum > 0 && colNum > 0) { - // form 数据有效 - _this._insert(rowNum, colNum); - } - - // 返回 true,表示该事件执行完之后,panel 要关闭。否则 panel 不会关闭 - return true; - } - }] - } // first tab end - ] // tabs end - }); // panel end - - // 展示 panel - panel.show(); - - // 记录属性 - this.panel = panel; - }, - - // 插入表格 - _insert: function _insert(rowNum, colNum) { - // 拼接 table 模板 - var r = void 0, - c = void 0; - var html = '\n \u521B\u5EFA\n \n \u884C\n \n \u5217\u7684\u8868\u683C\n
\n \n'; - for (r = 0; r < rowNum; r++) { - html += '
'; - if (r === 0) { - for (c = 0; c < colNum; c++) { - html += ' '; - } - html += ''; - } - } else { - for (c = 0; c < colNum; c++) { - html += ' '; - } - } - html += ' '; - - // 执行命令 - var editor = this.editor; - editor.cmd.do('insertHTML', html); - - // 防止 firefox 下出现 resize 的控制点 - editor.cmd.do('enableObjectResizing', false); - editor.cmd.do('enableInlineTableEditing', false); - }, - - // 创建编辑表格的 panel - _createEditPanel: function _createEditPanel() { - var _this2 = this; - - // 可用的 id - var addRowBtnId = getRandom('add-row'); - var addColBtnId = getRandom('add-col'); - var delRowBtnId = getRandom('del-row'); - var delColBtnId = getRandom('del-col'); - var delTableBtnId = getRandom('del-table'); - - // 创建 panel 对象 - var panel = new Panel(this, { - width: 320, - // panel 包含多个 tab - tabs: [{ - // 标题 - title: '编辑表格', - // 模板 - tpl: '
\n \n ', - // 事件绑定 - events: [{ - // 增加行 - selector: '#' + addRowBtnId, - type: 'click', - fn: function fn() { - _this2._addRow(); - // 返回 true,表示该事件执行完之后,panel 要关闭。否则 panel 不会关闭 - return true; - } - }, { - // 增加列 - selector: '#' + addColBtnId, - type: 'click', - fn: function fn() { - _this2._addCol(); - // 返回 true,表示该事件执行完之后,panel 要关闭。否则 panel 不会关闭 - return true; - } - }, { - // 删除行 - selector: '#' + delRowBtnId, - type: 'click', - fn: function fn() { - _this2._delRow(); - // 返回 true,表示该事件执行完之后,panel 要关闭。否则 panel 不会关闭 - return true; - } - }, { - // 删除列 - selector: '#' + delColBtnId, - type: 'click', - fn: function fn() { - _this2._delCol(); - // 返回 true,表示该事件执行完之后,panel 要关闭。否则 panel 不会关闭 - return true; - } - }, { - // 删除表格 - selector: '#' + delTableBtnId, - type: 'click', - fn: function fn() { - _this2._delTable(); - // 返回 true,表示该事件执行完之后,panel 要关闭。否则 panel 不会关闭 - return true; - } - }] - }] - }); - // 显示 panel - panel.show(); - }, - - // 获取选中的单元格的位置信息 - _getLocationData: function _getLocationData() { - var result = {}; - var editor = this.editor; - var $selectionELem = editor.selection.getSelectionContainerElem(); - if (!$selectionELem) { - return; - } - var nodeName = $selectionELem.getNodeName(); - if (nodeName !== 'TD' && nodeName !== 'TH') { - return; - } - - // 获取 td index - var $tr = $selectionELem.parent(); - var $tds = $tr.children(); - var tdLength = $tds.length; - $tds.forEach(function (td, index) { - if (td === $selectionELem[0]) { - // 记录并跳出循环 - result.td = { - index: index, - elem: td, - length: tdLength - }; - return false; - } - }); - - // 获取 tr index - var $tbody = $tr.parent(); - var $trs = $tbody.children(); - var trLength = $trs.length; - $trs.forEach(function (tr, index) { - if (tr === $tr[0]) { - // 记录并跳出循环 - result.tr = { - index: index, - elem: tr, - length: trLength - }; - return false; - } - }); - - // 返回结果 - return result; - }, - - // 增加行 - _addRow: function _addRow() { - // 获取当前单元格的位置信息 - var locationData = this._getLocationData(); - if (!locationData) { - return; - } - var trData = locationData.tr; - var $currentTr = $(trData.elem); - var tdData = locationData.td; - var tdLength = tdData.length; - - // 拼接即将插入的字符串 - var newTr = document.createElement('tr'); - var tpl = '', - i = void 0; - for (i = 0; i < tdLength; i++) { - tpl += ''; - } - newTr.innerHTML = tpl; - // 插入 - $(newTr).insertAfter($currentTr); - }, - - // 增加列 - _addCol: function _addCol() { - // 获取当前单元格的位置信息 - var locationData = this._getLocationData(); - if (!locationData) { - return; - } - var trData = locationData.tr; - var tdData = locationData.td; - var tdIndex = tdData.index; - var $currentTr = $(trData.elem); - var $trParent = $currentTr.parent(); - var $trs = $trParent.children(); - - // 遍历所有行 - $trs.forEach(function (tr) { - var $tr = $(tr); - var $tds = $tr.children(); - var $currentTd = $tds.get(tdIndex); - var name = $currentTd.getNodeName().toLowerCase(); - - // new 一个 td,并插入 - var newTd = document.createElement(name); - $(newTd).insertAfter($currentTd); - }); - }, - - // 删除行 - _delRow: function _delRow() { - // 获取当前单元格的位置信息 - var locationData = this._getLocationData(); - if (!locationData) { - return; - } - var trData = locationData.tr; - var $currentTr = $(trData.elem); - $currentTr.remove(); - }, - - // 删除列 - _delCol: function _delCol() { - // 获取当前单元格的位置信息 - var locationData = this._getLocationData(); - if (!locationData) { - return; - } - var trData = locationData.tr; - var tdData = locationData.td; - var tdIndex = tdData.index; - var $currentTr = $(trData.elem); - var $trParent = $currentTr.parent(); - var $trs = $trParent.children(); - - // 遍历所有行 - $trs.forEach(function (tr) { - var $tr = $(tr); - var $tds = $tr.children(); - var $currentTd = $tds.get(tdIndex); - // 删除 - $currentTd.remove(); - }); - }, - - // 删除表格 - _delTable: function _delTable() { - var editor = this.editor; - var $selectionELem = editor.selection.getSelectionContainerElem(); - if (!$selectionELem) { - return; - } - var $table = $selectionELem.parentUntil('table'); - if (!$table) { - return; - } - $table.remove(); - }, - - // 试图改变 active 状态 - tryChangeActive: function tryChangeActive(e) { - var editor = this.editor; - var $elem = this.$elem; - var $selectionELem = editor.selection.getSelectionContainerElem(); - if (!$selectionELem) { - return; - } - var nodeName = $selectionELem.getNodeName(); - if (nodeName === 'TD' || nodeName === 'TH') { - this._active = true; - $elem.addClass('w-e-active'); - } else { - this._active = false; - $elem.removeClass('w-e-active'); - } - } -}; - -/* - menu - video -*/ -// 构造函数 -function Video(editor) { - this.editor = editor; - this.$elem = $(''); - this.type = 'panel'; - - // 当前是否 active 状态 - this._active = false; -} - -// 原型 -Video.prototype = { - constructor: Video, - - onClick: function onClick() { - this._createPanel(); - }, - - _createPanel: function _createPanel() { - var _this = this; - - // 创建 id - var textValId = getRandom('text-val'); - var btnId = getRandom('btn'); - - // 创建 panel - var panel = new Panel(this, { - width: 350, - // 一个 panel 多个 tab - tabs: [{ - // 标题 - title: '插入视频', - // 模板 - tpl: ' \n \n \n', - // 事件绑定 - events: [{ - selector: '#' + btnId, - type: 'click', - fn: function fn() { - var $text = $('#' + textValId); - var val = $text.val().trim(); - - // 测试用视频地址 - // - - if (val) { - // 插入视频 - _this._insert(val); - } - - // 返回 true,表示该事件执行完之后,panel 要关闭。否则 panel 不会关闭 - return true; - } - }] - } // first tab end - ] // tabs end - }); // panel end - - // 显示 panel - panel.show(); - - // 记录属性 - this.panel = panel; - }, - - // 插入视频 - _insert: function _insert(val) { - var editor = this.editor; - editor.cmd.do('insertHTML', val + ''); - } -}; - -/* - menu - img -*/ -// 构造函数 -function Image(editor) { - this.editor = editor; - var imgMenuId = getRandom('w-e-img'); - this.$elem = $(''); - editor.imgMenuId = imgMenuId; - this.type = 'panel'; - - // 当前是否 active 状态 - this._active = false; -} - -// 原型 -Image.prototype = { - constructor: Image, - - onClick: function onClick() { - var editor = this.editor; - var config = editor.config; - if (config.qiniu) { - return; - } - if (this._active) { - this._createEditPanel(); - } else { - this._createInsertPanel(); - } - }, - - _createEditPanel: function _createEditPanel() { - var editor = this.editor; - - // id - var width30 = getRandom('width-30'); - var width50 = getRandom('width-50'); - var width100 = getRandom('width-100'); - var delBtn = getRandom('del-btn'); - - // tab 配置 - var tabsConfig = [{ - title: '编辑图片', - tpl: '
\n \n ', - events: [{ - selector: '#' + width30, - type: 'click', - fn: function fn() { - var $img = editor._selectedImg; - if ($img) { - $img.css('max-width', '30%'); - } - // 返回 true,表示该事件执行完之后,panel 要关闭。否则 panel 不会关闭 - return true; - } - }, { - selector: '#' + width50, - type: 'click', - fn: function fn() { - var $img = editor._selectedImg; - if ($img) { - $img.css('max-width', '50%'); - } - // 返回 true,表示该事件执行完之后,panel 要关闭。否则 panel 不会关闭 - return true; - } - }, { - selector: '#' + width100, - type: 'click', - fn: function fn() { - var $img = editor._selectedImg; - if ($img) { - $img.css('max-width', '100%'); - } - // 返回 true,表示该事件执行完之后,panel 要关闭。否则 panel 不会关闭 - return true; - } - }, { - selector: '#' + delBtn, - type: 'click', - fn: function fn() { - var $img = editor._selectedImg; - if ($img) { - $img.remove(); - } - // 返回 true,表示该事件执行完之后,panel 要关闭。否则 panel 不会关闭 - return true; - } - }] - }]; - - // 创建 panel 并显示 - var panel = new Panel(this, { - width: 300, - tabs: tabsConfig - }); - panel.show(); - - // 记录属性 - this.panel = panel; - }, - - _createInsertPanel: function _createInsertPanel() { - var editor = this.editor; - var uploadImg = editor.uploadImg; - var config = editor.config; - - // id - var upTriggerId = getRandom('up-trigger'); - var upFileId = getRandom('up-file'); - var linkUrlId = getRandom('link-url'); - var linkBtnId = getRandom('link-btn'); - - // tabs 的配置 - var tabsConfig = [{ - title: '上传图片', - tpl: '\n', - events: [{ - // 触发选择图片 - selector: '#' + upTriggerId, - type: 'click', - fn: function fn() { - var $file = $('#' + upFileId); - var fileElem = $file[0]; - if (fileElem) { - fileElem.click(); - } else { - // 返回 true 可关闭 panel - return true; - } - } - }, { - // 选择图片完毕 - selector: '#' + upFileId, - type: 'change', - fn: function fn() { - var $file = $('#' + upFileId); - var fileElem = $file[0]; - if (!fileElem) { - // 返回 true 可关闭 panel - return true; - } - - // 获取选中的 file 对象列表 - var fileList = fileElem.files; - if (fileList.length) { - uploadImg.uploadImg(fileList); - } - - // 返回 true 可关闭 panel - return true; - } - }] - }, // first tab end - { - title: '网络图片', - tpl: '\n \n\n \n\n \n \n', - events: [{ - selector: '#' + linkBtnId, - type: 'click', - fn: function fn() { - var $linkUrl = $('#' + linkUrlId); - var url = $linkUrl.val().trim(); - - if (url) { - uploadImg.insertLinkImg(url); - } - - // 返回 true 表示函数执行结束之后关闭 panel - return true; - } - }] - } // second tab end - ]; // tabs end - - // 判断 tabs 的显示 - var tabsConfigResult = []; - if ((config.uploadImgShowBase64 || config.uploadImgServer || config.customUploadImg) && window.FileReader) { - // 显示“上传图片” - tabsConfigResult.push(tabsConfig[0]); - } - if (config.showLinkImg) { - // 显示“网络图片” - tabsConfigResult.push(tabsConfig[1]); - } - - // 创建 panel 并显示 - var panel = new Panel(this, { - width: 300, - tabs: tabsConfigResult - }); - panel.show(); - - // 记录属性 - this.panel = panel; - }, - - // 试图改变 active 状态 - tryChangeActive: function tryChangeActive(e) { - var editor = this.editor; - var $elem = this.$elem; - if (editor._selectedImg) { - this._active = true; - $elem.addClass('w-e-active'); - } else { - this._active = false; - $elem.removeClass('w-e-active'); - } - } -}; - -/* - 所有菜单的汇总 -*/ - -// 存储菜单的构造函数 -var MenuConstructors = {}; - -MenuConstructors.bold = Bold; - -MenuConstructors.head = Head; - -MenuConstructors.fontSize = FontSize; - -MenuConstructors.fontName = FontName; - -MenuConstructors.link = Link; - -MenuConstructors.italic = Italic; - -MenuConstructors.redo = Redo; - -MenuConstructors.strikeThrough = StrikeThrough; - -MenuConstructors.underline = Underline; - -MenuConstructors.undo = Undo; - -MenuConstructors.list = List; - -MenuConstructors.justify = Justify; - -MenuConstructors.foreColor = ForeColor; - -MenuConstructors.backColor = BackColor; - -MenuConstructors.quote = Quote; - -MenuConstructors.code = Code; - -MenuConstructors.emoticon = Emoticon; - -MenuConstructors.table = Table; - -MenuConstructors.video = Video; - -MenuConstructors.image = Image; - -/* - 菜单集合 -*/ -// 构造函数 -function Menus(editor) { - this.editor = editor; - this.menus = {}; -} - -// 修改原型 -Menus.prototype = { - constructor: Menus, - - // 初始化菜单 - init: function init() { - var _this = this; - - var editor = this.editor; - var config = editor.config || {}; - var configMenus = config.menus || []; // 获取配置中的菜单 - - // 根据配置信息,创建菜单 - configMenus.forEach(function (menuKey) { - var MenuConstructor = MenuConstructors[menuKey]; - if (MenuConstructor && typeof MenuConstructor === 'function') { - // 创建单个菜单 - _this.menus[menuKey] = new MenuConstructor(editor); - } - }); - - // 添加到菜单栏 - this._addToToolbar(); - - // 绑定事件 - this._bindEvent(); - }, - - // 添加到菜单栏 - _addToToolbar: function _addToToolbar() { - var editor = this.editor; - var $toolbarElem = editor.$toolbarElem; - var menus = this.menus; - var config = editor.config; - // config.zIndex 是配置的编辑区域的 z-index,菜单的 z-index 得在其基础上 +1 - var zIndex = config.zIndex + 1; - objForEach(menus, function (key, menu) { - var $elem = menu.$elem; - if ($elem) { - // 设置 z-index - $elem.css('z-index', zIndex); - $toolbarElem.append($elem); - } - }); - }, - - // 绑定菜单 click mouseenter 事件 - _bindEvent: function _bindEvent() { - var menus = this.menus; - var editor = this.editor; - objForEach(menus, function (key, menu) { - var type = menu.type; - if (!type) { - return; - } - var $elem = menu.$elem; - var droplist = menu.droplist; - var panel = menu.panel; - - // 点击类型,例如 bold - if (type === 'click' && menu.onClick) { - $elem.on('click', function (e) { - if (editor.selection.getRange() == null) { - return; - } - menu.onClick(e); - }); - } - - // 下拉框,例如 head - if (type === 'droplist' && droplist) { - $elem.on('mouseenter', function (e) { - if (editor.selection.getRange() == null) { - return; - } - // 显示 - droplist.showTimeoutId = setTimeout(function () { - droplist.show(); - }, 200); - }).on('mouseleave', function (e) { - // 隐藏 - droplist.hideTimeoutId = setTimeout(function () { - droplist.hide(); - }, 0); - }); - } - - // 弹框类型,例如 link - if (type === 'panel' && menu.onClick) { - $elem.on('click', function (e) { - e.stopPropagation(); - if (editor.selection.getRange() == null) { - return; - } - // 在自定义事件中显示 panel - menu.onClick(e); - }); - } - }); - }, - - // 尝试修改菜单状态 - changeActive: function changeActive() { - var menus = this.menus; - objForEach(menus, function (key, menu) { - if (menu.tryChangeActive) { - setTimeout(function () { - menu.tryChangeActive(); - }, 100); - } - }); - } -}; - -/* - 粘贴信息的处理 -*/ - -// 获取粘贴的纯文本 -function getPasteText(e) { - var clipboardData = e.clipboardData || e.originalEvent && e.originalEvent.clipboardData; - var pasteText = void 0; - if (clipboardData == null) { - pasteText = window.clipboardData && window.clipboardData.getData('text'); - } else { - pasteText = clipboardData.getData('text/plain'); - } - - return replaceHtmlSymbol(pasteText); -} - -// 获取粘贴的html -function getPasteHtml(e, filterStyle, ignoreImg) { - var clipboardData = e.clipboardData || e.originalEvent && e.originalEvent.clipboardData; - var pasteText = void 0, - pasteHtml = void 0; - if (clipboardData == null) { - pasteText = window.clipboardData && window.clipboardData.getData('text'); - } else { - pasteText = clipboardData.getData('text/plain'); - pasteHtml = clipboardData.getData('text/html'); - } - if (!pasteHtml && pasteText) { - pasteHtml = '' + replaceHtmlSymbol(pasteText) + '
'; - } - if (!pasteHtml) { - return; - } - - // 过滤word中状态过来的无用字符 - var docSplitHtml = pasteHtml.split('