wiki增加历史版本功能,原创使用git方式管理wiki历史版本和查看,修改评论展示区域,修改布局

This commit is contained in:
暮光:城中城
2020-09-06 10:32:31 +08:00
parent 85bbfd1233
commit 5cd766762a
33 changed files with 1225 additions and 133 deletions

View File

@@ -14,7 +14,7 @@ import com.zyplayer.doc.data.repository.support.consts.UserMsgType;
import com.zyplayer.doc.data.service.manage.*;
import com.zyplayer.doc.wiki.controller.vo.UserPageAuthVo;
import com.zyplayer.doc.wiki.framework.consts.WikiAuthType;
import com.zyplayer.doc.wiki.service.WikiPageAuthService;
import com.zyplayer.doc.wiki.service.common.WikiPageAuthService;
import org.apache.commons.collections.CollectionUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

View File

@@ -68,15 +68,16 @@ public class WikiPageCommentController {
wrapper.eq("del_flag", 0);
wrapper.eq("page_id", pageComment.getPageId());
wrapper.eq(pageComment.getParentId() != null, "parent_id", pageComment.getParentId());
List<WikiPageComment> authList = wikiPageCommentService.list(wrapper);
Map<Long, List<WikiPageComment>> listMap = authList.stream().filter(val -> val.getParentId() != null)
.collect(Collectors.groupingBy(WikiPageComment::getParentId));
List<WikiPageCommentVo> commentList = authList.stream().filter(val -> val.getParentId() == null)
.map(val -> mapper.map(val, WikiPageCommentVo.class)).collect(Collectors.toList());
for (WikiPageCommentVo commentVo : commentList) {
commentVo.setCommentList(listMap.get(commentVo.getId()));
}
return DocResponseJson.ok(commentList);
List<WikiPageComment> pageCommentList = wikiPageCommentService.list(wrapper);
// 取消二级评论,全展示在一级
// Map<Long, List<WikiPageComment>> listMap = pageCommentList.stream().filter(val -> val.getParentId() != null)
// .collect(Collectors.groupingBy(WikiPageComment::getParentId));
// List<WikiPageCommentVo> commentList = pageCommentList.stream().filter(val -> val.getParentId() == null)
// .map(val -> mapper.map(val, WikiPageCommentVo.class)).collect(Collectors.toList());
// for (WikiPageCommentVo commentVo : commentList) {
// commentVo.setCommentList(listMap.get(commentVo.getId()));
// }
return DocResponseJson.ok(pageCommentList);
}
@PostMapping("/delete")

View File

@@ -25,7 +25,8 @@ import com.zyplayer.doc.data.utils.CacheUtil;
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.service.WikiPageAuthService;
import com.zyplayer.doc.wiki.service.common.WikiPageAuthService;
import com.zyplayer.doc.wiki.service.git.GitService;
import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import org.dozer.Mapper;
@@ -73,6 +74,8 @@ public class WikiPageController {
@Resource
UserMessageService userMessageService;
@Resource
GitService gitService;
@Resource
Mapper mapper;
@Autowired(required = false)
EsWikiPageService esWikiPageService;
@@ -278,6 +281,8 @@ public class WikiPageController {
} else {
logger.warn("未开启elasticsearch服务建议开启");
}
// 提交历史版本记录
gitService.commitAndAddHistory(wikiPage.getId(), content);
return DocResponseJson.ok(wikiPage);
}

View File

@@ -2,7 +2,6 @@ package com.zyplayer.doc.wiki.controller;
import cn.hutool.core.date.DateTime;
import cn.hutool.core.util.RandomUtil;
import com.alibaba.fastjson.JSON;
import com.zyplayer.doc.core.annotation.AuthMan;
import com.zyplayer.doc.core.json.DocResponseJson;
import com.zyplayer.doc.core.json.ResponseJson;
@@ -18,7 +17,7 @@ import com.zyplayer.doc.data.service.manage.UserMessageService;
import com.zyplayer.doc.data.service.manage.WikiPageFileService;
import com.zyplayer.doc.data.service.manage.WikiPageService;
import com.zyplayer.doc.data.service.manage.WikiSpaceService;
import com.zyplayer.doc.wiki.service.WikiPageAuthService;
import com.zyplayer.doc.wiki.service.common.WikiPageAuthService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;

View File

@@ -0,0 +1,81 @@
package com.zyplayer.doc.wiki.controller;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.zyplayer.doc.core.annotation.AuthMan;
import com.zyplayer.doc.core.json.DocResponseJson;
import com.zyplayer.doc.core.json.ResponseJson;
import com.zyplayer.doc.data.config.security.DocUserDetails;
import com.zyplayer.doc.data.config.security.DocUserUtil;
import com.zyplayer.doc.data.repository.manage.entity.*;
import com.zyplayer.doc.data.repository.support.consts.UserMsgSysType;
import com.zyplayer.doc.data.repository.support.consts.UserMsgType;
import com.zyplayer.doc.data.service.manage.*;
import com.zyplayer.doc.wiki.framework.consts.SpaceType;
import com.zyplayer.doc.wiki.service.git.GitService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
import java.util.List;
/**
* 文档控制器
*
* @author 暮光:城中城
* @since 2019年2月17日
*/
@AuthMan
@RestController
@RequestMapping("/zyplayer-doc-wiki/page/history")
public class WikiPageHistoryController {
private static Logger logger = LoggerFactory.getLogger(WikiPageHistoryController.class);
@Resource
WikiPageHistoryService wikiPageHistoryService;
@Resource
WikiSpaceService wikiSpaceService;
@Resource
WikiPageService wikiPageService;
@Resource
GitService gitService;
@PostMapping("/list")
public ResponseJson<List<WikiPageHistory>> list(Long pageId, Integer pageNum) {
DocUserDetails currentUser = DocUserUtil.getCurrentUser();
WikiPage wikiPageSel = wikiPageService.getById(pageId);
WikiSpace wikiSpaceSel = wikiSpaceService.getById(wikiPageSel.getSpaceId());
// 私人空间
if (SpaceType.isOthersPrivate(wikiSpaceSel.getType(), currentUser.getUserId(), wikiSpaceSel.getCreateUserId())) {
return DocResponseJson.warn("您没有权限查看该空间的文章详情!");
}
UpdateWrapper<WikiPageHistory> wrapper = new UpdateWrapper<>();
wrapper.eq("page_id", pageId);
wrapper.eq("del_flag", 0);
IPage<WikiPageHistory> page = new Page<>(pageNum, 20, false);
wikiPageHistoryService.page(page, wrapper);
return DocResponseJson.ok(page);
}
@PostMapping("/detail")
public ResponseJson<Object> detail(Long id) {
WikiPageHistory wikiPageHistory = wikiPageHistoryService.getById(id);
if (wikiPageHistory == null) {
return DocResponseJson.warn("未找到相关记录");
}
DocUserDetails currentUser = DocUserUtil.getCurrentUser();
WikiPage wikiPageSel = wikiPageService.getById(wikiPageHistory.getPageId());
WikiSpace wikiSpaceSel = wikiSpaceService.getById(wikiPageSel.getSpaceId());
// 私人空间
if (SpaceType.isOthersPrivate(wikiSpaceSel.getType(), currentUser.getUserId(), wikiSpaceSel.getCreateUserId())) {
return DocResponseJson.warn("您没有权限查看该空间的文章详情!");
}
String pageHistory = gitService.getPageHistory(wikiPageHistory.getGitCommitId(), wikiPageHistory.getPageId());
return DocResponseJson.ok(pageHistory);
}
}

View File

@@ -1,4 +1,4 @@
package com.zyplayer.doc.wiki.service;
package com.zyplayer.doc.wiki.service.common;
import com.zyplayer.doc.data.config.security.DocUserUtil;
import com.zyplayer.doc.data.repository.manage.entity.WikiSpace;

View File

@@ -0,0 +1,133 @@
package com.zyplayer.doc.wiki.service.git;
import cn.hutool.core.io.FileUtil;
import com.zyplayer.doc.data.config.security.DocUserDetails;
import com.zyplayer.doc.data.config.security.DocUserUtil;
import com.zyplayer.doc.data.repository.manage.entity.WikiPageHistory;
import com.zyplayer.doc.data.service.manage.WikiPageHistoryService;
import org.apache.commons.collections.CollectionUtils;
import org.eclipse.jgit.api.Git;
import org.eclipse.jgit.api.Status;
import org.eclipse.jgit.api.errors.GitAPIException;
import org.eclipse.jgit.lib.ObjectId;
import org.eclipse.jgit.lib.ObjectLoader;
import org.eclipse.jgit.lib.Repository;
import org.eclipse.jgit.revwalk.RevCommit;
import org.eclipse.jgit.revwalk.RevWalk;
import org.eclipse.jgit.treewalk.TreeWalk;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import javax.annotation.PostConstruct;
import javax.annotation.Resource;
import java.io.File;
import java.io.IOException;
import java.util.Date;
import java.util.Set;
/**
* git管理相关服务
*
* @author 暮光:城中城
* @since 2020年9月5日
*/
@Service
public class GitService {
private static Logger logger = LoggerFactory.getLogger(GitService.class);
@Value("${zyplayer.doc.wiki.git-file-path:''}")
private String gitFilePath;
@Resource
WikiPageHistoryService wikiPageHistoryService;
/**
* 提交和写历史记录
*/
public void commitAndAddHistory(Long pageId, String content) {
String commitId = this.writeAndCommit(pageId, content);
// 保存历史记录
if (commitId != null) {
DocUserDetails currentUser = DocUserUtil.getCurrentUser();
WikiPageHistory entity = new WikiPageHistory();
entity.setPageId(pageId);
entity.setCreateTime(new Date());
entity.setDelFlag(0);
entity.setGitCommitId(commitId);
entity.setCreateUserId(currentUser.getUserId());
entity.setCreateUserName(currentUser.getUsername());
wikiPageHistoryService.save(entity);
}
}
/**
* 把内容写入文件并提交git
*/
private synchronized String writeAndCommit(Long pageId, String content) {
try {
// 初始化git仓库
File dirFile = new File(this.getGitPath());
Git git = Git.init().setGitDir(dirFile).setDirectory(dirFile.getParentFile()).call();
// 修改文件内容
FileUtil.writeString(content, this.getGitPagePath(pageId), "utf-8");
// git提交
if (git.status().call().isClean()) {
logger.info("no changed");
return null;
}
git.add().addFilepattern(".").call();
Status status = git.status().call();
Set<String> missing = status.getMissing();
if (CollectionUtils.isNotEmpty(missing)) {
for (String f : missing) {
logger.info("missing file: {}", f);
git.rm().addFilepattern(f).call();
}
}
Set<String> removed = status.getRemoved();
if (CollectionUtils.isNotEmpty(removed)) {
for (String f : removed) {
logger.info("remove file: {}", f);
git.rm().addFilepattern(f).call();
}
}
RevCommit commit = git.commit().setMessage("commit").call();
logger.info("commit id: {}", commit.getName());
return commit.getName();
} catch (Exception e) {
logger.error("git仓库提交失败", e);
}
return null;
}
public String getPageHistory(String objId, Long pageId) {
try {
Git git = Git.open(new File(this.getGitPath()));
Repository repository = git.getRepository();
RevCommit revCommit = new RevWalk(repository).parseCommit(ObjectId.fromString(objId));
TreeWalk treeWalk = TreeWalk.forPath(repository, this.getGitPageFile(pageId), revCommit.getTree());
treeWalk.setRecursive(false);
ObjectId blobId = treeWalk.getObjectId(0);
ObjectLoader loader = repository.open(blobId);
return new String(loader.getBytes());
} catch (Exception e) {
logger.error("获取git文件内容失败", e);
return null;
}
}
private String getGitPath() {
return gitFilePath + "/.git";
}
private String getGitPageFile(Long pageId) {
return pageId + ".txt";
}
private String getGitPagePath(Long pageId) {
return gitFilePath + "/" + this.getGitPageFile(pageId);
}
}

View File

@@ -0,0 +1,81 @@
//package com.zyplayer.doc.wiki.service.git;
//
//import org.apache.commons.collections.CollectionUtils;
//import org.eclipse.jgit.api.Git;
//import org.eclipse.jgit.api.Status;
//import org.eclipse.jgit.api.errors.GitAPIException;
//import org.eclipse.jgit.lib.ObjectId;
//import org.eclipse.jgit.lib.ObjectLoader;
//import org.eclipse.jgit.lib.Repository;
//import org.eclipse.jgit.revwalk.RevCommit;
//import org.eclipse.jgit.revwalk.RevWalk;
//import org.eclipse.jgit.treewalk.TreeWalk;
//import org.slf4j.Logger;
//import org.slf4j.LoggerFactory;
//
//import java.io.File;
//import java.util.Set;
//
//public class GitTest {
// private static Logger logger = LoggerFactory.getLogger(GitTest.class);
//
// private static final String LOCAL_PATH = "d:/zyplayerDoc/wikiGitFiles/.git";
//
// /**
// * 提交
// */
// private static String commitFiles() {
// try {
// Git git = Git.open(new File(LOCAL_PATH));
// if (git.status().call().isClean()) {
// logger.info("no changed");
// return null;
// }
// git.add().addFilepattern(".").call();
// Status status = git.status().call();
// Set<String> missing = status.getMissing();
// if (CollectionUtils.isNotEmpty(missing)) {
// for (String f : missing) {
// logger.info("missing file: {}", f);
// git.rm().addFilepattern(f).call();
// }
// }
// Set<String> removed = status.getRemoved();
// if (CollectionUtils.isNotEmpty(removed)) {
// for (String f : removed) {
// logger.info("remove file: {}", f);
// git.rm().addFilepattern(f).call();
// }
// }
// RevCommit commit = git.commit().setMessage("commit").call();
// logger.info("commit id: {}", commit.getName());
// return commit.getName();
// } catch (Exception e) {
// e.printStackTrace();
// }
// return null;
// }
//
// private static void init() throws GitAPIException {
// File dirFile = new File(LOCAL_PATH);
// Git.init().setGitDir(dirFile).setDirectory(dirFile.getParentFile()).call();
// }
//
// private static void getFile(String objId, String entryPath) throws Exception {
// Git git = Git.open(new File(LOCAL_PATH));
// Repository repository = git.getRepository();
// RevCommit revCommit = new RevWalk(repository).parseCommit(ObjectId.fromString(objId));
// TreeWalk treeWalk = TreeWalk.forPath(repository, entryPath, revCommit.getTree());
// treeWalk.setRecursive(false);
// ObjectId blobId = treeWalk.getObjectId(0);
// ObjectLoader loader = repository.open(blobId);
// String fileContent = new String(loader.getBytes());
// logger.info("fileContent: {}", fileContent);
// }
//
// public static void main(String[] args) throws Exception {
//// init();
//// commitFiles();
// getFile("b47305c88251b7473928640b1f5346b40bb7387e", "14.txt");
// }
//}

View File

@@ -1 +0,0 @@
body,html{margin:0;padding:0}#app,.el-container,.el-menu,.global-layout-vue,body,html{height:100%}.el-header{background-color:#1d4e89!important;color:#333;line-height:40px;text-align:right;height:40px!important}.icon-collapse{float:left;font-size:25px;color:#aaa;margin-top:8px;cursor:pointer}.icon-collapse:hover{color:#eee}.head-icon{margin-right:15px;font-size:16px;cursor:pointer;color:#fff}.header-user-message .page-info-box{text-align:right;margin-top:10px}#app[data-v-8f7ddbbc],body[data-v-8f7ddbbc],html[data-v-8f7ddbbc]{margin:0;padding:0;height:100%}pre[data-v-8f7ddbbc]{margin:0;white-space:pre-wrap;font-size:14px;font-family:auto}.el-menu[data-v-8f7ddbbc]{-webkit-box-sizing:border-box;box-sizing:border-box;border-right:0;margin-right:3px}.el-header[data-v-8f7ddbbc]{background-color:#409eff;color:#333;line-height:40px;text-align:right;height:40px!important}.doc-body-box[data-v-8f7ddbbc]{overflow-x:hidden;overflow-y:auto;width:100%;padding:10px;border-left:1px solid #f1f1f1;-webkit-box-sizing:border-box;box-sizing:border-box}.el-tree[data-v-8f7ddbbc]{margin-right:3px}.logo[data-v-8f7ddbbc]{border-bottom:1px solid #f1f1f1;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;padding:5px 10px;width:260px;height:40px;line-height:40px;font-size:25px;color:#666;text-align:center}.icon-collapse[data-v-8f7ddbbc]{float:left;font-size:25px;color:#aaa;cursor:pointer;position:fixed}.icon-collapse[data-v-8f7ddbbc]:hover{color:#ccc}.comment-box .head[data-v-8f7ddbbc]{float:left;background-color:#ccc;border-radius:50%;margin-right:10px;width:45px;height:45px;line-height:45px;text-align:center;color:#fff}.build-info[data-v-8f7ddbbc]{position:fixed;bottom:0;left:0;background:#fafafa;width:240px;text-align:center;padding:5px 0;color:#aaa;font-size:12px}.build-info span[data-v-8f7ddbbc]{color:#4183c4;cursor:pointer}

View File

@@ -0,0 +1 @@
::-webkit-scrollbar{width:6px;height:9px;-webkit-appearance:none}::-webkit-scrollbar-thumb{background:#ddd;border-radius:10px}::-webkit-scrollbar-track-piece{background:#eee}body,html{margin:0;padding:0}#app,.el-container,.el-menu,.global-layout-vue,body,html{height:100%}.el-header{background-color:#1d4e89!important;color:#333;line-height:40px;text-align:right;height:40px!important}.icon-collapse{float:left;font-size:25px;color:#aaa;margin-top:8px;cursor:pointer}.icon-collapse:hover{color:#eee}.head-icon{margin-right:15px;font-size:16px;cursor:pointer;color:#fff}.header-user-message .page-info-box{text-align:right;margin-top:10px}#app[data-v-8f7ddbbc],body[data-v-8f7ddbbc],html[data-v-8f7ddbbc]{margin:0;padding:0;height:100%}pre[data-v-8f7ddbbc]{margin:0;white-space:pre-wrap;font-size:14px;font-family:auto}.el-menu[data-v-8f7ddbbc]{-webkit-box-sizing:border-box;box-sizing:border-box;border-right:0;margin-right:3px}.el-header[data-v-8f7ddbbc]{background-color:#409eff;color:#333;line-height:40px;text-align:right;height:40px!important}.doc-body-box[data-v-8f7ddbbc]{overflow-x:hidden;overflow-y:auto;width:100%;padding:10px;border-left:1px solid #f1f1f1;-webkit-box-sizing:border-box;box-sizing:border-box}.el-tree[data-v-8f7ddbbc]{margin-right:3px}.logo[data-v-8f7ddbbc]{border-bottom:1px solid #f1f1f1;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;padding:5px 10px;width:260px;height:40px;line-height:40px;font-size:25px;color:#666;text-align:center}.icon-collapse[data-v-8f7ddbbc]{float:left;font-size:25px;color:#aaa;cursor:pointer;position:fixed}.icon-collapse[data-v-8f7ddbbc]:hover{color:#ccc}.comment-box .head[data-v-8f7ddbbc]{float:left;background-color:#ccc;border-radius:50%;margin-right:10px;width:45px;height:45px;line-height:45px;text-align:center;color:#fff}.build-info[data-v-8f7ddbbc]{position:fixed;bottom:0;left:0;background:#fafafa;width:240px;text-align:center;padding:5px 0;color:#aaa;font-size:12px}.build-info span[data-v-8f7ddbbc]{color:#4183c4;cursor:pointer}

View File

@@ -1 +0,0 @@
.page-show-vue{width:80%;margin:0 auto;padding:20px 0}.page-show-vue .icon-collapse{float:left;font-size:25px;color:#aaa;margin-top:8px;cursor:pointer}.page-show-vue .icon-collapse:hover{color:#eee}.page-show-vue .wiki-title{font-size:20px;text-align:center;font-weight:700}.page-show-vue .create-user-time{margin-right:20px}.page-show-vue .wiki-author{font-size:14px;color:#888;padding:20px 0;height:40px;line-height:40px}.page-show-vue .wiki-content{font-size:14px}.page-show-vue .wiki-content.w-e-text{overflow-y:auto}.page-show-vue .wiki-content.w-e-text img{cursor:auto}.page-show-vue .wiki-content.w-e-text img:hover{-webkit-box-shadow:unset;box-shadow:unset}.page-show-vue .upload-page-file .el-upload-list{display:none}.page-show-vue .is-link{color:#1e88e5;cursor:pointer}.page-show-vue #newPageContentDiv .w-e-text-container{height:600px!important}.page-show-vue .comment-box .head{float:left;background-color:#ccc;border-radius:50%;margin-right:10px;width:45px;height:45px;line-height:45px;text-align:center;color:#fff}

View File

@@ -0,0 +1 @@
.page-show-vue{height:100%}.page-show-vue .icon-collapse{float:left;font-size:25px;color:#aaa;margin-top:8px;cursor:pointer}.page-show-vue .icon-collapse:hover{color:#eee}.page-show-vue .wiki-title{font-size:20px;text-align:center;font-weight:700}.page-show-vue .create-user-time{margin-right:20px}.page-show-vue .wiki-author{font-size:14px;color:#888;padding:20px 0;height:40px;line-height:40px}.page-show-vue .wiki-content{font-size:14px}.page-show-vue .wiki-content.w-e-text{overflow-y:auto}.page-show-vue .wiki-content.w-e-text img{cursor:auto}.page-show-vue .wiki-content.w-e-text img:hover{-webkit-box-shadow:unset;box-shadow:unset}.page-show-vue .upload-page-file .el-upload-list{display:none}.page-show-vue .is-link{color:#1e88e5;cursor:pointer}.page-show-vue #newPageContentDiv .w-e-text-container{height:600px!important}.page-show-vue .head{float:left;background-color:#ccc;border-radius:50%;margin-right:10px;width:45px;height:45px;line-height:45px;text-align:center;color:#fff}.page-show-vue .el-tabs__header{margin:0}.page-show-vue .el-tabs__nav-wrap{padding:0 20px}.page-show-vue .close-action-tab{position:absolute;right:15px;top:12px;cursor:pointer;z-index:1}.page-show-vue .action-tab-box{height:calc(100vh - 120px);overflow:auto;padding:20px 10px}.page-show-vue .action-box-empty{text-align:center;padding-top:30px;color:#888;font-size:14px}.page-show-vue .history-item{height:55px;line-height:25px;cursor:pointer;vertical-align:middle}.page-show-vue .history-loading-status{margin-left:5px;color:#888}.page-show-vue .el-timeline{-webkit-padding-start:0;padding-inline-start:0}.page-show-vue .comment-user-name{margin-bottom:10px}.page-show-vue .comment-content{padding:0;color:#666;margin:0;white-space:pre-wrap;word-wrap:break-word;line-height:20px}.page-show-vue .comment-input-box{position:absolute;bottom:0;width:100%;background:#fff;border-top:1px solid #f1f1f1}.page-show-vue .comment-input-box textarea{resize:none;width:100%;-webkit-box-sizing:border-box;box-sizing:border-box;border:0;outline:none!important;padding:10px}.page-show-vue .comment-card .comment-user-name .el-icon-delete{color:#888;font-size:13px;cursor:pointer;float:right;display:none}.page-show-vue .comment-card:hover .comment-user-name .el-icon-delete{display:inline-block}

View File

@@ -1 +1 @@
<!DOCTYPE html><html lang=en><head><meta charset=utf-8><meta http-equiv=X-UA-Compatible content="IE=edge"><meta name=viewport content="width=device-width,initial-scale=1"><link rel=icon href=favicon-wiki.png><title>WIKI文档管理系统</title><link href=css/chunk-009efa60.c1509684.css rel=prefetch><link href=css/chunk-0741282a.1750663f.css rel=prefetch><link href=css/chunk-27da65ce.80051123.css rel=prefetch><link href=css/chunk-32cc5643.5a5b2ca1.css rel=prefetch><link href=css/chunk-34407190.57bbfb51.css rel=prefetch><link href=css/chunk-4b763d50.7e74e765.css rel=prefetch><link href=css/chunk-5544a2b8.17d2b8a1.css rel=prefetch><link href=css/chunk-578c28a7.83c6d32d.css rel=prefetch><link href=css/chunk-5dc97978.ec6236ec.css rel=prefetch><link href=js/chunk-009efa60.dbe73c24.js rel=prefetch><link href=js/chunk-0741282a.d128d142.js rel=prefetch><link href=js/chunk-27da65ce.e6f0653d.js rel=prefetch><link href=js/chunk-2d207ece.20edf665.js rel=prefetch><link href=js/chunk-2d20f55a.217546ad.js rel=prefetch><link href=js/chunk-32cc5643.fcf57a84.js rel=prefetch><link href=js/chunk-34407190.69ced152.js rel=prefetch><link href=js/chunk-4b763d50.80332c84.js rel=prefetch><link href=js/chunk-5544a2b8.8d8ead6e.js rel=prefetch><link href=js/chunk-578c28a7.54a578cc.js rel=prefetch><link href=js/chunk-5dc97978.1238356c.js rel=prefetch><link href=css/app.027f7b0c.css rel=preload as=style><link href=css/chunk-vendors.43fc3011.css rel=preload as=style><link href=js/app.f824fe0e.js rel=preload as=script><link href=js/chunk-vendors.4d2ae4cf.js rel=preload as=script><link href=css/chunk-vendors.43fc3011.css rel=stylesheet><link href=css/app.027f7b0c.css rel=stylesheet></head><body><noscript><strong>We're sorry but zyplayer-wiki-ui doesn't work properly without JavaScript enabled. Please enable it to continue.</strong></noscript><div id=app></div><script src=js/chunk-vendors.4d2ae4cf.js></script><script src=js/app.f824fe0e.js></script></body></html>
<!DOCTYPE html><html lang=en><head><meta charset=utf-8><meta http-equiv=X-UA-Compatible content="IE=edge"><meta name=viewport content="width=device-width,initial-scale=1"><link rel=icon href=favicon-wiki.png><title>WIKI文档管理系统</title><link href=css/chunk-009efa60.c1509684.css rel=prefetch><link href=css/chunk-0741282a.1750663f.css rel=prefetch><link href=css/chunk-27da65ce.febce5f7.css rel=prefetch><link href=css/chunk-32cc5643.5a5b2ca1.css rel=prefetch><link href=css/chunk-34407190.57bbfb51.css rel=prefetch><link href=css/chunk-4b763d50.7e74e765.css rel=prefetch><link href=css/chunk-5544a2b8.17d2b8a1.css rel=prefetch><link href=css/chunk-578c28a7.83c6d32d.css rel=prefetch><link href=css/chunk-5dc97978.ec6236ec.css rel=prefetch><link href=js/chunk-009efa60.9b21a8c7.js rel=prefetch><link href=js/chunk-0741282a.d128d142.js rel=prefetch><link href=js/chunk-27da65ce.08eb4051.js rel=prefetch><link href=js/chunk-2d207ece.20edf665.js rel=prefetch><link href=js/chunk-2d20f55a.217546ad.js rel=prefetch><link href=js/chunk-32cc5643.fcf57a84.js rel=prefetch><link href=js/chunk-34407190.69ced152.js rel=prefetch><link href=js/chunk-4b763d50.80332c84.js rel=prefetch><link href=js/chunk-5544a2b8.a272f03c.js rel=prefetch><link href=js/chunk-578c28a7.54a578cc.js rel=prefetch><link href=js/chunk-5dc97978.1238356c.js rel=prefetch><link href=css/app.d1dc89b9.css rel=preload as=style><link href=css/chunk-vendors.43fc3011.css rel=preload as=style><link href=js/app.8b362cf3.js rel=preload as=script><link href=js/chunk-vendors.4d2ae4cf.js rel=preload as=script><link href=css/chunk-vendors.43fc3011.css rel=stylesheet><link href=css/app.d1dc89b9.css rel=stylesheet></head><body><noscript><strong>We're sorry but zyplayer-wiki-ui doesn't work properly without JavaScript enabled. Please enable it to continue.</strong></noscript><div id=app></div><script src=js/chunk-vendors.4d2ae4cf.js></script><script src=js/app.8b362cf3.js></script></body></html>

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long