From fbd6ef5f83cdb041368d8cdb99f9d16f41f59ede Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9A=AE=E5=85=89=EF=BC=9A=E5=9F=8E=E4=B8=AD=E5=9F=8E?= <806783409@qq.com> Date: Fri, 21 Jun 2019 21:05:34 +0800 Subject: [PATCH] =?UTF-8?q?=E5=90=8C=E4=B8=80=E4=B8=AA=E9=A1=B5=E9=9D=A2?= =?UTF-8?q?=E5=8F=AA=E8=83=BD=E4=B8=80=E4=B8=AA=E4=BA=BA=E7=BC=96=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../data/config/security/DocUserDetails.java | 5 +++ .../repository/manage/entity/WikiPage.java | 30 +++++++++++++++-- .../sql/zyplayer_doc_manage.1.0.2.sql | 24 +++++++++++++- .../wiki-ui/src/common/config/apilist.js | 2 ++ .../wiki-ui/src/common/lib/common/common.js | 21 ++++++++++++ .../wiki-ui/src/views/page/Edit.vue | 32 +++++++++++++++++++ .../wiki-ui/src/views/page/Show.vue | 11 +++++-- .../wiki/controller/WikiPageController.java | 29 +++++++++++++++++ .../framework/consts/WikiCachePrefix.java | 5 +++ 9 files changed, 154 insertions(+), 5 deletions(-) create mode 100644 zyplayer-doc-wiki/src/main/java/com/zyplayer/doc/wiki/framework/consts/WikiCachePrefix.java diff --git a/zyplayer-doc-data/src/main/java/com/zyplayer/doc/data/config/security/DocUserDetails.java b/zyplayer-doc-data/src/main/java/com/zyplayer/doc/data/config/security/DocUserDetails.java index 5cd303d5..eeacaa61 100644 --- a/zyplayer-doc-data/src/main/java/com/zyplayer/doc/data/config/security/DocUserDetails.java +++ b/zyplayer-doc-data/src/main/java/com/zyplayer/doc/data/config/security/DocUserDetails.java @@ -49,6 +49,11 @@ public class DocUserDetails { this.authorities = authorities; } + public DocUserDetails(Long userId, String username) { + this.userId = userId; + this.username = username; + } + public DocUserDetails(Long userId, String username, String password, boolean enabled) { super(); this.userId = userId; 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 eced80ce..aa113c76 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 @@ -8,7 +8,7 @@ import java.util.Date; /** *
- * + * *
* * @author 暮光:城中城 @@ -99,6 +99,16 @@ public class WikiPage implements Serializable { */ private Integer seqNo; + /** + * 当前正在编辑的用户ID + */ + private Integer nowEditUserId; + + /** + * 当前正在编辑的用户名 + */ + private Integer nowEditUserName; + public Long getId() { return id; } @@ -211,7 +221,23 @@ public class WikiPage implements Serializable { public void setSeqNo(Integer seqNo) { this.seqNo = seqNo; } - + + public Integer getNowEditUserId() { + return nowEditUserId; + } + + public void setNowEditUserId(Integer nowEditUserId) { + this.nowEditUserId = nowEditUserId; + } + + public Integer getNowEditUserName() { + return nowEditUserName; + } + + public void setNowEditUserName(Integer nowEditUserName) { + this.nowEditUserName = nowEditUserName; + } + @Override public String toString() { return "WikiPage{" + 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 a6409c42..912acc1f 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 @@ -21,7 +21,17 @@ UPDATE wiki_page SET seq_no=id WHERE del_flag=0; ALTER TABLE `wiki_page_content` ADD COLUMN `preview` varchar(1024) NULL COMMENT '预览内容'; ALTER TABLE `wiki_page_file` ADD COLUMN `download_num` int NOT NULL DEFAULT 0 COMMENT '下载次数'; - +CREATE TABLE `wiki_page_history` ( + `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键自增ID', + `page_id` bigint(20) DEFAULT NULL COMMENT '页面ID', + `content` mediumtext COMMENT '本次文章内容', + `create_user_id` bigint(20) DEFAULT NULL COMMENT '创建人ID', + `create_user_name` varchar(20) DEFAULT NULL COMMENT '创建人名字', + `create_time` datetime DEFAULT NULL COMMENT '创建时间', + `del_flag` tinyint(4) NOT NULL DEFAULT '0' COMMENT '删除标记 0=正常 1=已删除', + PRIMARY KEY (`id`) USING BTREE, + KEY `idx_page_id` (`page_id`) USING BTREE COMMENT '页面ID索引' +) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC; @@ -308,6 +318,18 @@ CREATE TABLE `zyplayer_storage` ( UNIQUE INDEX `key`(`doc_key`) USING BTREE COMMENT 'key唯一索引' ) ENGINE = InnoDB AUTO_INCREMENT = 6 CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '存储网页上相关的数据' ROW_FORMAT = Compact; +DROP TABLE IF EXISTS `wiki_page_history`; +CREATE TABLE `wiki_page_history` ( + `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键自增ID', + `page_id` bigint(20) DEFAULT NULL COMMENT '页面ID', + `content` mediumtext COMMENT '本次文章内容', + `create_user_id` bigint(20) DEFAULT NULL COMMENT '创建人ID', + `create_user_name` varchar(20) DEFAULT NULL COMMENT '创建人名字', + `create_time` datetime DEFAULT NULL COMMENT '创建时间', + `del_flag` tinyint(4) NOT NULL DEFAULT '0' COMMENT '删除标记 0=正常 1=已删除', + PRIMARY KEY (`id`) USING BTREE, + KEY `idx_page_id` (`page_id`) USING BTREE COMMENT '页面ID索引' +) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC; -- ---------------------------- -- Records of zyplayer_storage -- ---------------------------- 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 85ac4c73..9c842e8d 100644 --- a/zyplayer-doc-ui/wiki-ui/src/common/config/apilist.js +++ b/zyplayer-doc-ui/wiki-ui/src/common/config/apilist.js @@ -9,6 +9,8 @@ var URL = { pageDetail: '/zyplayer-doc-wiki/page/detail', pageDelete: '/zyplayer-doc-wiki/page/delete', pageNews: '/zyplayer-doc-wiki/page/news', + pageLock: '/zyplayer-doc-wiki/page/lock', + pageUnlock: '/zyplayer-doc-wiki/page/unlock', spaceList: '/zyplayer-doc-wiki/space/list', updateSpace: '/zyplayer-doc-wiki/space/update', getPageUserAuthList: '/zyplayer-doc-wiki/page/auth/list', 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 bb8428b0..7e71c303 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 @@ -52,6 +52,27 @@ export default { this.validateResult(res); }); }, + postNonCheck: function (url, param, callback) { + param = param || {}; + param.accessToken = this.getAccessToken(); + global.vue.axios({ + method: "post", + url: url, + headers: {'Content-type': 'application/x-www-form-urlencoded'}, + data: Qs.stringify(param), + withCredentials: true, + }).then((res) => { + console.log("ok", res); + if (typeof callback == 'function') { + callback(res.data); + } + }).catch((res) => { + console.log("error", res); + if (typeof callback == 'function') { + callback(res.data); + } + }); + }, /** * 返回不为空的字符串,为空返回def */ diff --git a/zyplayer-doc-ui/wiki-ui/src/views/page/Edit.vue b/zyplayer-doc-ui/wiki-ui/src/views/page/Edit.vue index 63e84825..eb6aa04b 100644 --- a/zyplayer-doc-ui/wiki-ui/src/views/page/Edit.vue +++ b/zyplayer-doc-ui/wiki-ui/src/views/page/Edit.vue @@ -23,6 +23,13 @@ import global from '../../common/config/global' import WangEditor from 'wangeditor' + window.onunload = function () { + app.unlockPage(); + }; + window.onbeforeunload = function () { + app.unlockPage(); + }; + var app; export default { data() { @@ -32,8 +39,12 @@ newPageTitle: "", parentPath: {}, wikiPage: {}, + isUnlock: false, }; }, + destroyed: function () { + this.unlockPage(); + }, beforeRouteUpdate(to, from, next) { this.initQueryParam(to); next(); @@ -47,12 +58,22 @@ changeToRootPath() { app.parentPath = {spaceId: this.parentPath.spaceId}; }, + unlockPage() { + // 防止各种事件重复调这个接口,只需要调一次就好了 + if (this.isUnlock) { + return; + } + this.isUnlock = true; + var param = {pageId: app.parentPath.pageId}; + this.common.post(this.apilist1.pageUnlock, param, function (json) {}); + }, createWikiCancel() { this.$confirm('确定要取消编辑吗?您编辑的内容将不会被保存哦~', '提示', { confirmButtonText: '确定', cancelButtonText: '继续编辑', type: 'warning' }).then(() => { + app.unlockPage(); app.$router.back(); }); }, @@ -114,6 +135,17 @@ } else { this.cleanPage(); } + var param = {pageId: app.parentPath.pageId}; + this.common.postNonCheck(this.apilist1.pageLock, param, function (json) { + if (json.errCode !== 200) { + app.$alert(json.errMsg || '未知错误', '错误', { + confirmButtonText: '确定', + callback: () => { + app.$router.back(); + } + }); + } + }); }, initEditor() { this.editor = new WangEditor('#newPageContentDiv'); diff --git a/zyplayer-doc-ui/wiki-ui/src/views/page/Show.vue b/zyplayer-doc-ui/wiki-ui/src/views/page/Show.vue index 8a161ff1..3f4a393f 100644 --- a/zyplayer-doc-ui/wiki-ui/src/views/page/Show.vue +++ b/zyplayer-doc-ui/wiki-ui/src/views/page/Show.vue @@ -183,7 +183,10 @@ }, methods: { editWiki() { - this.$router.push({path: '/page/edit', query: this.parentPath}); + var param = {pageId: app.parentPath.pageId}; + this.common.post(this.apilist1.pageLock, param, function (json) { + app.$router.push({path: '/page/edit', query: app.parentPath}); + }); }, getSearchUserList(query) { if (query == '') { @@ -320,6 +323,10 @@ this.recommentInfo = {}; }, submitPageComment() { + if (app.commentTextInput.length <= 0) { + toast.error("请输入评论内容"); + return; + } var param = { pageId: app.wikiPage.id, content: app.commentTextInput, parentId: app.recommentInfo.id @@ -332,7 +339,7 @@ }); }, uploadFileError(err) { - toast.success("上传失败," + err); + toast.error("上传失败," + err); }, uploadFileSuccess(response) { this.common.validateResult({data: response}, function () { diff --git a/zyplayer-doc-wiki/src/main/java/com/zyplayer/doc/wiki/controller/WikiPageController.java b/zyplayer-doc-wiki/src/main/java/com/zyplayer/doc/wiki/controller/WikiPageController.java index 6a83047e..17e093ce 100644 --- a/zyplayer-doc-wiki/src/main/java/com/zyplayer/doc/wiki/controller/WikiPageController.java +++ b/zyplayer-doc-wiki/src/main/java/com/zyplayer/doc/wiki/controller/WikiPageController.java @@ -12,12 +12,14 @@ import com.zyplayer.doc.data.config.security.DocUserUtil; import com.zyplayer.doc.data.repository.manage.entity.*; import com.zyplayer.doc.data.repository.manage.mapper.WikiPageMapper; import com.zyplayer.doc.data.service.manage.*; +import com.zyplayer.doc.data.utils.CacheUtil; import com.zyplayer.doc.wiki.controller.param.SpaceNewsParam; import com.zyplayer.doc.wiki.controller.vo.SpaceNewsVo; import com.zyplayer.doc.wiki.controller.vo.WikiPageContentVo; import com.zyplayer.doc.wiki.controller.vo.WikiPageVo; import com.zyplayer.doc.wiki.framework.consts.SpaceType; import com.zyplayer.doc.wiki.framework.consts.WikiAuthType; +import com.zyplayer.doc.wiki.framework.consts.WikiCachePrefix; import org.apache.commons.collections.CollectionUtils; import org.apache.commons.lang3.StringUtils; import org.dozer.Mapper; @@ -253,6 +255,33 @@ public class WikiPageController { return DocResponseJson.ok(wikiPage); } + @PostMapping("/unlock") + public ResponseJson