新增模板相关功能

This commit is contained in:
Sh1yu
2023-08-24 09:28:16 +08:00
parent e393a71a93
commit ffbbe33a9f
24 changed files with 1442 additions and 518 deletions

View File

@@ -0,0 +1,24 @@
package com.zyplayer.doc.data.repository.manage.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import java.io.Serializable;
import java.util.Date;
@Data
@TableName("wiki_page_template")
public class WikiPageTemplate implements Serializable {
@TableId(value = "id" , type = IdType.AUTO)
private Long id;
private Long spaceId;
private Long pageId;
private String tagName;
private Boolean shareStatus;
private Date created;
private Long createUserId;
private String createUser;
private Integer yn;
}

View File

@@ -2,10 +2,14 @@ package com.zyplayer.doc.data.repository.manage.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.zyplayer.doc.data.repository.manage.entity.WikiPage;
import com.zyplayer.doc.data.repository.manage.entity.WikiPageTemplate;
import com.zyplayer.doc.data.repository.manage.vo.WikiPageTemplateInfoVo;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.annotations.Update;
import java.util.List;
/**
* <p>
* Mapper 接口
@@ -24,6 +28,9 @@ public interface WikiPageMapper extends BaseMapper<WikiPage> {
@Select("select max(seq_no) from wiki_page where space_id = #{spaceId} and parent_id=#{parentId} and del_flag=0")
Integer getLastSeq(@Param("spaceId") Long spaceId, @Param("parentId") Long parentId);
@Select("SELECT a.*,b.tag_name AS tags,b.share_status as shareStatus from wiki_page a left join wiki_page_template b on a.space_id =b.space_id and a.id = b.page_id where a.del_flag = 0 and a.space_id =#{spaceId}")
List<WikiPageTemplateInfoVo> getWikiPageTemplateInfos(@Param("spaceId") Long spaceId);
void updateChildrenSeq(@Param("spaceId") Long spaceId, @Param("parentId") Long parentId);
}

View File

@@ -0,0 +1,30 @@
package com.zyplayer.doc.data.repository.manage.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.zyplayer.doc.data.repository.manage.entity.WikiPage;
import com.zyplayer.doc.data.repository.manage.entity.WikiPageTemplate;
import com.zyplayer.doc.data.repository.manage.vo.WikiPageTemplateInfoVo;
import com.zyplayer.doc.data.repository.manage.vo.WikiTemplateTagVo;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.annotations.Update;
import java.util.List;
/**
* <p>
* Mapper 接口
* </p>
*
* @author 暮光:城中城
* @since 2019-03-09
*/
public interface WikiPageTemplateMapper extends BaseMapper<WikiPageTemplate> {
List<WikiPageTemplateInfoVo> getAllTemplate(@Param("user") Long user, @Param("name") String name, @Param("share") boolean share, @Param("tags") List tags, @Param("pageNum") Long pageNum);
List<WikiTemplateTagVo> getAllTags(@Param("user") Long user,@Param("open") boolean open);
Long getAllTemplateCount(@Param("user") Long user, @Param("name") String name, @Param("share") boolean share, @Param("tags") List tags);
}

View File

@@ -0,0 +1,123 @@
package com.zyplayer.doc.data.repository.manage.vo;
import com.zyplayer.doc.data.repository.manage.entity.WikiPage;
import lombok.Data;
import java.util.Date;
import java.util.List;
@Data
public class WikiPageTemplateInfoVo{
private Long id;
/**
* 空间ID
*/
private Long spaceId;
/**
* 名字
*/
private String name;
/**
* 父ID
*/
private Long parentId;
/**
* 节点类型 0=有子节点 1=终节点
*/
private Integer nodeType;
/**
* 赞的数量
*/
private Integer zanNum;
/**
* 编辑类型 0=可编辑 1=不允许编辑
*/
private Integer editType;
/**
* 是否收藏 0=否 1=是
*/
private Integer favorite;
/**
* 创建人ID
*/
private Long createUserId;
/**
* 创建人名字
*/
private String createUserName;
/**
* 创建时间
*/
private Date createTime;
/**
* 修改人ID
*/
private Long updateUserId;
/**
* 修改人名字
*/
private String updateUserName;
/**
* 修改时间
*/
private Date updateTime;
/**
* 0=有效 1=删除
*/
private Integer delFlag;
/**
* 阅读数
*/
private Integer viewNum;
/**
* 顺序
*/
private Integer seqNo;
/**
* 编辑框类型 1=HTML 2=Markdown
*/
private Integer editorType;
/**
* 模板分享状态 0=个人模板 1=共享模板
*/
private Integer shareStatus;
/**
* 模板ID
*/
private Integer templateId;
/**
* 标签
*/
private String tags;
/**
* 标题
*/
private String title;
/**
* 模板的内容
*/
private String content;
}

View File

@@ -0,0 +1,19 @@
package com.zyplayer.doc.data.repository.manage.vo;
import lombok.Data;
import java.util.Date;
@Data
public class WikiTemplateTagVo {
/**
* 是否展示
*/
private boolean show = true;
/**
* 标签名
*/
private String tagName;
}

View File

@@ -2,6 +2,9 @@ package com.zyplayer.doc.data.service.manage;
import com.zyplayer.doc.data.repository.manage.entity.WikiPage;
import com.baomidou.mybatisplus.extension.service.IService;
import com.zyplayer.doc.data.repository.manage.vo.WikiPageTemplateInfoVo;
import java.util.List;
/**
* <p>
@@ -16,4 +19,6 @@ public interface WikiPageService extends IService<WikiPage> {
void changeParent(WikiPage wikiPage, Integer beforeSeq, Integer afterSeq);
void deletePage(WikiPage wikiPage);
public List<WikiPageTemplateInfoVo> wikiPageTemplateInfos(Long spaceId);
}

View File

@@ -0,0 +1,28 @@
package com.zyplayer.doc.data.service.manage;
import com.baomidou.mybatisplus.extension.service.IService;
import com.zyplayer.doc.data.repository.manage.entity.WikiPage;
import com.zyplayer.doc.data.repository.manage.entity.WikiPageTemplate;
import com.zyplayer.doc.data.repository.manage.vo.WikiPageTemplateInfoVo;
import com.zyplayer.doc.data.repository.manage.vo.WikiTemplateTagVo;
import org.apache.ibatis.annotations.Param;
import java.util.List;
/**
* <p>
* 服务类
* </p>
*
* @author 暮光:城中城
* @since 2019-03-09
*/
public interface WikiPageTemplateService extends IService<WikiPageTemplate> {
public List<WikiTemplateTagVo> getAllTags( Long user, boolean open);
WikiPageTemplate getWikiPageTemplateBySpaceAndPage(Long spaceId, Long pageId);
List<WikiPageTemplateInfoVo> filterAll(Long user, String name, boolean open, List<String> tags, Long pageNum);
Long total(Long user, String name, boolean open, List<String> tags);
}

View File

@@ -8,6 +8,7 @@ import com.zyplayer.doc.data.config.security.DocUserUtil;
import com.zyplayer.doc.data.repository.manage.entity.UserMessage;
import com.zyplayer.doc.data.repository.manage.entity.WikiPage;
import com.zyplayer.doc.data.repository.manage.mapper.WikiPageMapper;
import com.zyplayer.doc.data.repository.manage.vo.WikiPageTemplateInfoVo;
import com.zyplayer.doc.data.repository.support.consts.DocSysType;
import com.zyplayer.doc.data.repository.support.consts.UserMsgType;
import com.zyplayer.doc.data.service.manage.UserMessageService;
@@ -91,4 +92,8 @@ public class WikiPageServiceImpl extends ServiceImpl<WikiPageMapper, WikiPage> i
this.deletePageAndSon(wikiPage);
}
}
public List<WikiPageTemplateInfoVo> wikiPageTemplateInfos(Long spaceId){
return wikiPageMapper.getWikiPageTemplateInfos(spaceId);
}
}

View File

@@ -0,0 +1,48 @@
package com.zyplayer.doc.data.service.manage.impl;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.zyplayer.doc.data.repository.manage.entity.WikiPageTemplate;
import com.zyplayer.doc.data.repository.manage.mapper.WikiPageTemplateMapper;
import com.zyplayer.doc.data.repository.manage.vo.WikiPageTemplateInfoVo;
import com.zyplayer.doc.data.repository.manage.vo.WikiTemplateTagVo;
import com.zyplayer.doc.data.service.manage.WikiPageTemplateService;
import org.apache.commons.lang3.StringUtils;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
public class WikiPageTemplateServiceImpl extends ServiceImpl<WikiPageTemplateMapper, WikiPageTemplate> implements WikiPageTemplateService {
@Override
public List<WikiTemplateTagVo> getAllTags(Long user, boolean open) {
List<WikiTemplateTagVo> all = getBaseMapper().getAllTags(user,open);
return all;
}
@Override
public WikiPageTemplate getWikiPageTemplateBySpaceAndPage(Long spaceId, Long pageId) {
QueryWrapper queryWrapper = new QueryWrapper();
queryWrapper.eq("space_id", spaceId);
queryWrapper.eq("page_id", pageId);
WikiPageTemplate template = getBaseMapper().selectOne(queryWrapper);
return template;
}
@Override
public List<WikiPageTemplateInfoVo> filterAll(Long user, String name, boolean open, List<String> tags, Long pageNum) {
Long offset = 0L;
if (null != pageNum && pageNum != 0L) {
offset = (pageNum - 1) * 8;
}
List<WikiPageTemplateInfoVo> all = getBaseMapper().getAllTemplate(user, StringUtils.isBlank(name) ? null : "%" + name + "%", open, tags, offset);
return all;
}
@Override
public Long total(Long user, String name, boolean open, List<String> tags) {
Long num = getBaseMapper().getAllTemplateCount(user, name, open, tags);
return num;
}
}

View File

@@ -0,0 +1,42 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.zyplayer.doc.data.repository.manage.mapper.WikiPageTemplateMapper">
<select id="getAllTemplate" resultType="com.zyplayer.doc.data.repository.manage.vo.WikiPageTemplateInfoVo">
SELECT a.*,b.tag_name As tags,b.share_status as shareStatus,c.content,b.id as templateId from wiki_page a
left join wiki_page_template b on a.space_id = b.space_id and a.id = b.page_id
left join wiki_page_content c on a.id = c.page_id
<include refid="queryTemplateByCondition"></include>
order by b.id
limit 8 offset #{pageNum}
</select>
<select id="getAllTemplateCount" resultType="java.lang.Long">
SELECT count(*) from wiki_page a
LEFT JOIN wiki_page_template b on a.space_id = b.space_id and a.id = b.page_id
left join wiki_page_content c on a.id = c.page_id
<include refid="queryTemplateByCondition"></include>
</select>
<select id="getAllTags" resultType="com.zyplayer.doc.data.repository.manage.vo.WikiTemplateTagVo">
select DISTINCT tag_name
from wiki_page_template
where tag_name is not null
and tag_name != ''
and share_status = #{open}
<if test="!open">
and create_user_id = #{user}
</if>
</select>
<sql id="queryTemplateByCondition">
where del_flag = 0 and b.id is not null
and b.share_status = #{share}
<if test="!share">
and b.create_user_id = #{user}
</if>
<if test="name != null and name != ''">
and a.name like #{name}
</if>
<if test="tags != null and tags.size >0 ">
and b.tag_name in
<foreach collection="tags" open="(" close=")" item="item" separator=",">#{item}</foreach>
</if>
</sql>
</mapper>

View File

@@ -441,6 +441,18 @@ CREATE TABLE `backup_task` (
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '备份任务信息';
CREATE TABLE `wiki_page_template` (
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '模板信息逐渐',
`space_id` bigint(20) NULL DEFAULT NULL COMMENT '空间id',
`page_id` bigint(20) NULL DEFAULT NULL COMMENT '模板挂载文档id',
`tag_name` varchar(200) CHARACTER SET utf8mb4 NULL DEFAULT NULL COMMENT '标签信息',
`share_status` tinyint(1) NULL DEFAULT NULL COMMENT '模板公开状态0-个人模板1-公共模板)',
`created` datetime NULL DEFAULT NULL COMMENT '创建时间',
`create_user_id` bigint(20) NULL DEFAULT NULL COMMENT '创建人id',
`create_user` varchar(200) CHARACTER SET utf8mb4 NULL DEFAULT NULL COMMENT '创建人名称',
`yn` tinyint(1) NOT NULL default '1',
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COMMENT = '模板信息表';
-- -------------------插入必要的数据-------------------
-- 用户信息
INSERT INTO `user_info` (id, user_no, password, user_name, email, del_flag, creation_time, update_time, sex)

View File

@@ -36,5 +36,9 @@ export default {
openPageList: (data) => request({url: '/zyplayer-doc-wiki/open-api/page/list', method: 'post', data: Qs.stringify(data)}),
openSpaceInfo: (data) => request({url: '/zyplayer-doc-wiki/open-api/space/info', method: 'post', data: Qs.stringify(data)}),
openPageNews: (data) => request({url: '/zyplayer-doc-wiki/open-api/page/news', method: 'post', data: Qs.stringify(data)}),
addTemplate: (data) => request({url: '/zyplayer-doc-wiki/template/add', method: 'post', data: Qs.stringify(data)}),
getTemplate: (data) => request({url: '/zyplayer-doc-wiki/template/filterAll', method: 'post', data: Qs.stringify(data,{arrayFormat:"indices",allowDots:true})}),
useTemplate: (data) => request({url: '/zyplayer-doc-wiki/template/use', method: 'post', data: Qs.stringify(data)}),
getTags: (data) => request({url: '/zyplayer-doc-wiki/template/allTags', method: 'post', data: Qs.stringify(data)}),
xxxxxxxxxxxx: (data) => request({url: 'update', method: 'post', data: Qs.stringify(data)}),
}

View File

@@ -21,6 +21,10 @@
</el-icon>
创建文件夹
</a-menu-item>
<a-menu-item key="4" @click="createWikiByTemplate(props.funcId)">
<BuildOutlined/>
从模板创建
</a-menu-item>
<a-menu-item key="3">
<el-tooltip content="支持MDZIP格式图片和MD文件请放到同级目录并配置同级相对路径" placement="right-start" :show-after="300">
<a-upload
@@ -55,11 +59,13 @@
import {ElMessage} from 'element-plus'
import pageApi from '../../assets/api/page'
import axios from "axios";
import { BuildOutlined } from '@ant-design/icons-vue';
let router = useRouter();
let uploadFileUrl = ref(import.meta.env.VITE_APP_BASE_API + '/zyplayer-doc-wiki/page/file/upload');
let fileList = ref([]);
let emit = defineEmits(['choosePageIdFunc', 'doGetPageList'])
let emit = defineEmits(['choosePageIdFunc', 'doGetPageList','createWikiByTemplate'])
let props = defineProps({
choiceSpace: Number,
choosePageId: Number,
@@ -105,6 +111,10 @@
emit('choosePageIdFunc', id)
}
const createWikiByTemplate = (id) => {
emit('createWikiByTemplate', id)
}
const createWiki = (editorType, parentId) => {
if (props.choiceSpace > 0) {
let name = "新建文档"

View File

@@ -18,6 +18,7 @@
:choosePageId="choosePageId"
:nowPageId = "nowPageId"
:funcId = "0"
@createWikiByTemplate="createWikiByTemplate"
@choosePageIdFunc="choosePageIdFunc"
@doGetPageList="doGetPageList"
/>
@@ -36,10 +37,13 @@
<el-icon-document/>
</el-icon>
<!--标题-->
<el-tooltip :content="data.tags" placement="top-start" :show-after="500">
<a-tag color="#f50" v-if="data.shareStatus !== undefined">{{filterShareStatus(data.shareStatus)}}</a-tag>
</el-tooltip>
<a-input v-if="data.renaming" v-model:value="data.name" class="rename-input" placeholder="请输入文档名称" @blur="doRename(node,data)" @click.stop/>
<span v-else style="vertical-align: middle;">
<el-tooltip :content="node.label" placement="top-start" :show-after="1000">{{ node.label }}</el-tooltip>
</span>
<span v-else style="vertical-align: middle;margin-right: 5px">
<el-tooltip :content="node.label" placement="top-start" :show-after="700">{{ node.label }}</el-tooltip>
</span>
<!--操作-->
<div class="page-action-box" :class="data.renaming?'renaming':''" @click.stop>
<AddMenu
@@ -47,6 +51,7 @@
:choosePageId="choosePageId"
:nowPageId = "nowPageId"
:funcId = "data.id"
@createWikiByTemplate="createWikiByTemplate"
@choosePageIdFunc="choosePageIdFunc"
@doGetPageList="doGetPageList"
/>
@@ -60,13 +65,17 @@
</el-icon>
重命名
</a-menu-item>
<a-menu-item key="1" @click="deleteWikiPage">
<a-menu-item key="1" @click="deleteWikiPage(data.shareStatus)">
<el-icon class="clickAddIcon" style="margin-right: 5px">
<svg width="1em" height="1em" viewBox="0 0 48 48" fill="none"><path d="M9 10V44H39V10H9Z" fill="none" stroke="currentColor" stroke-width="4" stroke-linejoin="round"></path><path d="M20 20V33" stroke="currentColor" stroke-width="4" stroke-linecap="round" stroke-linejoin="round"></path><path d="M28 20V33" stroke="currentColor" stroke-width="4" stroke-linecap="round" stroke-linejoin="round"></path><path d="M4 10H44" stroke="currentColor" stroke-width="4" stroke-linecap="round" stroke-linejoin="round"></path><path d="M16 10L19.289 4H28.7771L32 10H16Z" fill="none" stroke="currentColor" stroke-width="4" stroke-linejoin="round"></path></svg>
</el-icon>
删除
</a-menu-item>
<a-sub-menu key="2" title="移动文档" >
<template #icon>
<BlockOutlined />
</template>
<a-menu-item key="3" @click="openMoveMenu(false)">
<el-icon class="clickAddIcon" style="margin-right: 5px">
<DocumentCopy/>
@@ -80,6 +89,10 @@
迁移文档
</a-menu-item>
</a-sub-menu>
<a-menu-item key="5" @click="openTemplateCreate(data.shareStatus !== undefined)" v-if="data.editorType !== 0">
<BuildOutlined />
设为模板
</a-menu-item>
</a-menu>
</template>
</a-dropdown>
@@ -164,6 +177,7 @@
</el-main>
</el-container>
</el-container>
<templateManage ref="templateManageRef" :pageId="choosePageId" :spaceId="choiceSpace" @doGetPageList="doGetPageList" />
<create-space ref="createSpaceRef" @success="loadSpaceList"></create-space>
<a-modal
v-model:open="visibleMoveMenu"
@@ -211,6 +225,7 @@
import userApi from '../../assets/api/user'
import pageApi from '../../assets/api/page'
import CreateSpace from '../space/CreateSpace'
import TemplateManage from '../template/TemplateManage'
import RightResize from './RightResize.vue'
import AddMenu from './AddMenu.vue'
import LeftSidebar from './LeftSidebar.vue'
@@ -219,7 +234,7 @@
import {useStoreUserData} from "@/store/userData";
import {useStorePageData} from "@/store/pageData";
import { defineComponent } from 'vue';
import { DownOutlined } from '@ant-design/icons-vue';
import { DownOutlined,BuildOutlined,BlockOutlined } from '@ant-design/icons-vue';
let route = useRoute();
let router = useRouter();
@@ -257,6 +272,7 @@
let visibleMoveMenu = ref(false);
let onlyMoveMode = ref(false);
let aModalWaiting = ref(false);
let templateManageRef=ref(null)
watch(()=>nowPageId ,()=>{
leftSideBarDir.value.assisSetCurrentKey();
@@ -287,6 +303,22 @@
getSelfUserInfo()
});
const openTemplateCreate = (exsit) =>{
templateManageRef.value.showTemplateCreate(exsit)
}
const createWikiByTemplate = () =>{
templateManageRef.value.showTemplateManage()
}
const filterShareStatus = (data) =>{
if (data === 1){
return '公共模板'
}
return '个人模板'
}
const openMoveMenu = (onlyMove) =>{
onlyMoveMode.value = onlyMove
visibleMoveMenu.value =true
@@ -326,8 +358,13 @@
moveToWikiPageList.value = []
}
const deleteWikiPage = () => {
ElMessageBox.confirm('确定要删除此页面及其所有子页面吗?', '提示', {
const deleteWikiPage = (share) => {
let msg = '确定要删除此页面及其所有子页面吗?'
if (share !== undefined){
msg='选中的页面是:' +filterShareStatus(share)+'删除后无法使用此模板! 确定要删除此页面及其所有子页面吗?'
}
ElMessageBox.confirm(msg, '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning',

View File

@@ -0,0 +1,324 @@
<template>
<div class="template-manage">
<el-dialog title="设置为模板" v-model="newTemplateDialogVisible" width="600px" :close-on-click-modal="false">
<el-form label-width="100px" :model="templateNewForm">
<el-form-item label="模板标签">
<el-input v-model="templateNewForm.tagName"></el-input>
</el-form-item>
<el-form-item label="是否公开">
<el-switch v-model="templateNewForm.shareStatus" inactive-text="个人模板" :inactive-value="0"
active-text="公共模板" :active-value="1"></el-switch>
</el-form-item>
<el-form-item>
<el-button type="primary" v-if="exsit" @click="onNewTemplateSubmit">保存修改</el-button>
<el-button type="primary" v-else @click="onNewTemplateSubmit">立即创建</el-button>
<el-button @click="onNewTemplateCancel">取消</el-button>
</el-form-item>
</el-form>
</el-dialog>
<a-modal
v-model:open="templateChooseDialogVisible"
title="模板库"
width="100%"
wrapClassName="full-modal"
:confirm-loading="aModalWaiting"
:destroyOnClose=true
:closable=true>
<div>
<el-switch v-model="open" inactive-text="个人模板" :inactive-value="0" active-text="公共模板" :active-value="1"
@change="filterByOpen"></el-switch>
<a-divider type="vertical"/>
<el-input v-model="name" style="width: 30%" @change="filterByName"></el-input>
</div>
<a-divider>模板标签</a-divider>
<a-checkable-tag v-for="tag in tags" @click="filterByTags(tag.tagName,tag.show)" v-model:checked="tag.show"
style="margin: 5px" size="big">{{tag.tagName}}
</a-checkable-tag>
<a-divider/>
<a-list :grid="{gutter:1,column:4,xs:1,sm:1,md:2,lg:2,xl:4,xxl:4}" :data-source="templateList">
<template #renderItem="{item}">
<a-list-item>
<a-card :title="item.name">
<a-tag color="#f50">{{filterShareStatus(item.shareStatus)}}</a-tag>
<a-tag color="#87d068">{{item.tags}}</a-tag>
<br/>
{{item.createUserName}}
<br/>
{{item.createTime}}
<template #actions>
<el-tooltip effect="dark" content="转到原文档" placement="top">
<AimOutlined @click="turnToSource(item)"/>
</el-tooltip>
<el-tooltip effect="dark" content="预览模板" placement="top">
<BorderOutlined @click="showPreview(item)"/>
</el-tooltip>`
<el-tooltip effect="dark" content="使用模板" placement="top">
<AlertOutlined @click="chooseTemplate(item)"/>
</el-tooltip>
</template>
</a-card>
</a-list-item>
</template>
</a-list>
<a-pagination simple v-model:current="nowTemplateNum" :total="totalTemplate" style="float: right"
:page-size="8" :hide-on-single-page=true @change="pageUpDown"></a-pagination>
<template #footer/>
</a-modal>
<a-modal
v-model:open="previewVisible"
title="模板预览"
width="100%"
wrapClassName="full-modal"
:destroyOnClose=true
:closable=true>
<el-row>
<div ref="pageContentRef" class="wiki-page-content">
<div v-html="pageShowDetail" class="markdown-body" v-if="editorType.value === 2" v-highlight></div>
<div v-html="pageShowDetail" class="wang-editor-body" v-else></div>
</div>
</el-row>
<template #footer/>
</a-modal>
</div>
</template>
<script setup>
import {
onBeforeUnmount,
ref,
onMounted,
watch,
defineProps,
nextTick,
defineEmits,
defineExpose,
computed
} from 'vue';
import {AlertOutlined, AimOutlined, BorderOutlined} from '@ant-design/icons-vue';
import {onBeforeRouteUpdate, useRouter, useRoute} from "vue-router";
import {ElMessageBox, ElMessage} from 'element-plus'
import pageApi from '../../assets/api/page'
import {mavonEditor} from 'mavon-editor'
import 'mavon-editor/dist/markdown/github-markdown.min.css'
import 'mavon-editor/dist/css/index.css'
let emit = defineEmits('doGetPageList');
let router = useRouter()
let nowTemplateNum = ref(1)
let totalTemplate = ref(0)
let exsit = ref(false)
let props = defineProps({
pageId: Number,
spaceId: Number
})
let templateNewForm = ref({
pageId: 0,
spaceId: 0,
tagName: '',
shareStatus: false
})
let newTemplateDialogVisible = ref(false);
const showTemplateCreate = (exsited) => {
exsit.value = exsited
templateNewForm.value = {
pageId: props.pageId,
spaceId: props.spaceId,
tagName: '',
shareStatus: false
}
newTemplateDialogVisible.value = true
}
const filterShareStatus = (data) => {
if (data === 1) {
return '公共模板'
}
return '个人模板'
}
const onNewTemplateSubmit = () => {
pageApi.addTemplate(templateNewForm.value).then((json) => {
ElMessage.success('模板记录成功')
emit('doGetPageList', null)
})
newTemplateDialogVisible.value = false
}
const onNewTemplateCancel = () => {
newTemplateDialogVisible.value = false
}
let templateChooseDialogVisible = ref(false)
let previewVisible = ref(false)
let aModalWaiting = ref(false)
let tags = ref([])
let filterTags = ref([])
let open = ref(false)
let name = ref('')
let templateList = ref()
let editorType = ref(1)
const showTemplateManage = () => {
templateChooseDialogVisible.value = true
filterTags.value = [{show: true, tagName: ''}]
totalTemplate.value = 0
nowTemplateNum.value = 1
templateList.value = []
filterByOpen()
}
const chooseTemplate = (item) => {
pageApi.useTemplate({
spaceId: props.spaceId,
parentId: props.pageId,
templateId: item.templateId
}).then((json) => {
templateChooseDialogVisible.value = false
emit('doGetPageList', null)
ElMessage.success('创建成功')
router.push({
path: '/page/edit',
query: {parentId: props.pageId, pageId: json.data.id}
})
})
}
const turnToSource = (item) => {
templateChooseDialogVisible.value = false
router.push({
path: '/page/show',
query: {spaceId: item.spaceId, pageId: item.id}
})
}
const pageUpDown = () => {
templateList.value = []
pageApi.getTemplate({
name: name.value,
open: open.value,
tags: filterTags.value,
pageNum: nowTemplateNum.value
}).then((json) => {
totalTemplate.value = json.total || 0
templateList.value = json.data || []
})
}
const simpleQryTemplate = () => {
templateList.value = []
pageApi.getTemplate({
name: name.value,
open: open.value,
tags: filterTags.value,
}).then((json) => {
totalTemplate.value = json.total || 0
templateList.value = json.data || []
nowTemplateNum.value = 1
})
}
const filterByOpen = () => {
pageApi.getTags({open: open.value}).then((json) => {
tags.value = json.data || []
filterTags.value = json.data || []
simpleQryTemplate()
})
}
const filterByTags = () => {
filterTags.value = tags.value.filter((item) => {
return item.show
})
if (filterTags.value.length === 0) {
filterTags.value = ['']
}
setTimeout(simpleQryTemplate(), 200)
}
const filterByName = () => {
simpleQryTemplate()
}
let pageShowDetail = ref('')
let pageContentRef = ref(null)
const showPreview = (item) => {
editorType.value = item.editorType
if (item.editorType === 1) {
pageShowDetail.value = item.content
}
if (item.editorType === 2) {
pageShowDetail.value = mavonEditor.getMarkdownIt().render(item.content)
}
setTimeout(previewPageImage(), 500);
previewVisible.value = true
}
const previewPageImage = () => {
const imgArr = []
if (pageContentRef.value !== undefined || pageContentRef.value !== '') {
return
}
const imgSelector = pageContentRef.value.querySelectorAll('img')
imgSelector.forEach((item, index) => {
imgArr.push(item.src)
item.onclick = () => {
previewInitialIndex.value = index
showImagePreviewList.value = imgArr
showImagePreview.value = true
}
})
}
defineExpose({showTemplateCreate, showTemplateManage});
</script>
<style>
.template-manage .wiki-page-content {
margin-top: 5px;
height: calc(100vh);
overflow: hidden;
position: relative
}
.template-manage .markdown-body table {
display: table;
}
.template-manage .wiki-page-content img {
cursor: pointer;
max-width: 100%;
}
.template-manage .wiki-page-content img:hover {
box-shadow: 0 2px 6px 0 rgba(0, 0, 0, 0.3);
}
</style>
<style lang="less">
.full-modal {
.ant-modal {
max-width: 100%;
top: 0;
padding-bottom: 0;
margin: 0;
}
.ant-modal-content {
display: flex;
flex-direction: column;
height: calc(100vh);
overflow: auto;
position: relative
}
.ant-modal-body {
flex: 1;
}
}
</style>
<style lang="scss">
.template-manage {
height: 100%;
overflow: hidden;
.wiki-page-content {
ol {
list-style: decimal;
}
ul {
list-style: disc;
}
}
}
</style>

View File

@@ -14,6 +14,7 @@ import com.zyplayer.doc.data.repository.manage.mapper.WikiPageContentMapper;
import com.zyplayer.doc.data.repository.manage.mapper.WikiPageMapper;
import com.zyplayer.doc.data.repository.manage.param.SearchByEsParam;
import com.zyplayer.doc.data.repository.manage.vo.SpaceNewsVo;
import com.zyplayer.doc.data.repository.manage.vo.WikiPageTemplateInfoVo;
import com.zyplayer.doc.data.repository.support.consts.DocSysType;
import com.zyplayer.doc.data.repository.support.consts.UserMsgType;
import com.zyplayer.doc.data.service.manage.*;
@@ -57,477 +58,484 @@ import java.util.stream.Collectors;
@RequiredArgsConstructor
public class WikiPageController {
private final WikiPageService wikiPageService;
private final WikiPageContentService wikiPageContentService;
private final WikiPageContentMapper wikiPageContentMapper;
private final WikiPageFileService wikiPageFileService;
private final WikiPageZanService wikiPageZanService;
private final WikiSpaceService wikiSpaceService;
private final WikiPageAuthService wikiPageAuthService;
private final WikiPageUploadService wikipageUploadService;
private final UserMessageService userMessageService;
private final WikiPageHistoryService wikiPageHistoryService;
private final WikiPageMapper wikiPageMapper;
private final WikiPageCommentService wikiPageCommentService;
private final WikiPageService wikiPageService;
private final WikiPageContentService wikiPageContentService;
private final WikiPageContentMapper wikiPageContentMapper;
private final WikiPageFileService wikiPageFileService;
private final WikiPageZanService wikiPageZanService;
private final WikiSpaceService wikiSpaceService;
private final WikiPageAuthService wikiPageAuthService;
private final WikiPageUploadService wikipageUploadService;
private final UserMessageService userMessageService;
private final WikiPageHistoryService wikiPageHistoryService;
private final WikiPageMapper wikiPageMapper;
private final WikiPageCommentService wikiPageCommentService;
private final WikiPageTemplateService wikiPageTemplateService;
@PostMapping("/list")
public ResponseJson<List<WikiPageVo>> list(WikiPage wikiPage) {
DocUserDetails currentUser = DocUserUtil.getCurrentUser();
WikiSpace wikiSpaceSel = wikiSpaceService.getById(wikiPage.getSpaceId());
// 私人空间
if (SpaceType.isOthersPrivate(wikiSpaceSel.getType(), currentUser.getUserId(), wikiSpaceSel.getCreateUserId())) {
return DocResponseJson.warn("您没有权限查看该空间的文章列表!");
}
@PostMapping("/list")
public ResponseJson<List<WikiPageVo>> list(WikiPage wikiPage) {
DocUserDetails currentUser = DocUserUtil.getCurrentUser();
WikiSpace wikiSpaceSel = wikiSpaceService.getById(wikiPage.getSpaceId());
// 私人空间
if (SpaceType.isOthersPrivate(wikiSpaceSel.getType(), currentUser.getUserId(), wikiSpaceSel.getCreateUserId())) {
return DocResponseJson.warn("您没有权限查看该空间的文章列表!");
}
UpdateWrapper<WikiPage> wrapper = new UpdateWrapper<>();
wrapper.eq("del_flag", 0);
wrapper.eq("space_id", wikiPage.getSpaceId());
List<WikiPage> wikiPageList = wikiPageService.list(wrapper);
Map<Long, List<WikiPageVo>> listMap = wikiPageList.stream().map(WikiPageVo::new).collect(Collectors.groupingBy(WikiPageVo::getParentId));
List<WikiPageVo> nodePageList = listMap.get(0L);
if (CollectionUtils.isNotEmpty(nodePageList)) {
nodePageList = nodePageList.stream().sorted(Comparator.comparingInt(WikiPageVo::getSeqNo)).collect(Collectors.toList());
this.setChildren(listMap, nodePageList, "");
}
return DocResponseJson.ok(nodePageList);
}
List<WikiPageTemplateInfoVo> wikiPageList = wikiPageService.wikiPageTemplateInfos(wikiPage.getSpaceId());
Map<Long, List<WikiPageVo>> listMap = wikiPageList.stream().map(WikiPageVo::new).collect(Collectors.groupingBy(WikiPageVo::getParentId));
List<WikiPageVo> nodePageList = listMap.get(0L);
if (CollectionUtils.isNotEmpty(nodePageList)) {
nodePageList = nodePageList.stream().sorted(Comparator.comparingInt(WikiPageVo::getSeqNo)).collect(Collectors.toList());
this.setChildren(listMap, nodePageList, "");
}
return DocResponseJson.ok(nodePageList);
}
@PostMapping("/detail")
public ResponseJson<WikiPageContentVo> detail(WikiPage wikiPage) {
DocUserDetails currentUser = DocUserUtil.getCurrentUser();
WikiPage wikiPageSel = wikiPageService.getById(wikiPage.getId());
// 页面已删除
if (wikiPageSel == null || Objects.equals(wikiPageSel.getDelFlag(), 1)) {
return DocResponseJson.warn("该页面不存在或已删除!");
}
WikiSpace wikiSpaceSel = wikiSpaceService.getById(wikiPageSel.getSpaceId());
// 空间已删除
if (wikiSpaceSel == null || Objects.equals(wikiSpaceSel.getDelFlag(), 1)) {
return DocResponseJson.warn("该页面不存在或已删除!");
}
// 私人空间
if (SpaceType.isOthersPrivate(wikiSpaceSel.getType(), currentUser.getUserId(), wikiSpaceSel.getCreateUserId())) {
return DocResponseJson.warn("您没有权限查看该空间的文章详情!");
}
UpdateWrapper<WikiPageContent> wrapper = new UpdateWrapper<>();
wrapper.eq("page_id", wikiPage.getId());
WikiPageContent pageContent = wikiPageContentService.getOne(wrapper);
@PostMapping("/detail")
public ResponseJson<WikiPageContentVo> detail(WikiPage wikiPage) {
DocUserDetails currentUser = DocUserUtil.getCurrentUser();
WikiPage wikiPageSel = wikiPageService.getById(wikiPage.getId());
// 页面已删除
if (wikiPageSel == null || Objects.equals(wikiPageSel.getDelFlag(), 1)) {
return DocResponseJson.warn("该页面不存在或已删除!");
}
WikiSpace wikiSpaceSel = wikiSpaceService.getById(wikiPageSel.getSpaceId());
// 空间已删除
if (wikiSpaceSel == null || Objects.equals(wikiSpaceSel.getDelFlag(), 1)) {
return DocResponseJson.warn("该页面不存在或已删除!");
}
// 私人空间
if (SpaceType.isOthersPrivate(wikiSpaceSel.getType(), currentUser.getUserId(), wikiSpaceSel.getCreateUserId())) {
return DocResponseJson.warn("您没有权限查看该空间的文章详情!");
}
UpdateWrapper<WikiPageContent> wrapper = new UpdateWrapper<>();
wrapper.eq("page_id", wikiPage.getId());
WikiPageContent pageContent = wikiPageContentService.getOne(wrapper);
UpdateWrapper<WikiPageFile> wrapperFile = new UpdateWrapper<>();
wrapperFile.eq("page_id", wikiPage.getId());
wrapperFile.eq("del_flag", 0);
List<WikiPageFile> pageFiles = wikiPageFileService.list(wrapperFile);
for (WikiPageFile pageFile : pageFiles) {
pageFile.setFileUrl("zyplayer-doc-wiki/common/file?uuid=" + pageFile.getUuid());
}
UpdateWrapper<WikiPageZan> wrapperZan = new UpdateWrapper<>();
wrapperZan.eq("page_id", wikiPage.getId());
wrapperZan.eq("create_user_id", currentUser.getUserId());
wrapperZan.eq("yn", 1);
WikiPageZan pageZan = wikiPageZanService.getOne(wrapperZan);
WikiPageContentVo vo = new WikiPageContentVo();
vo.setWikiPage(wikiPageSel);
vo.setPageContent(pageContent);
vo.setFileList(pageFiles);
vo.setSelfZan((pageZan != null) ? 1 : 0);
vo.setSelfUserId(currentUser.getUserId());
// 上传附件、编辑、权限设置、删除 的权限
String canEdit = wikiPageAuthService.canEdit(wikiSpaceSel, wikiPageSel.getEditType(), wikiPageSel.getId(), currentUser.getUserId());
String canDelete = wikiPageAuthService.canDelete(wikiSpaceSel, wikiPageSel.getEditType(), wikiPageSel.getId(), currentUser.getUserId());
String canUploadFile = wikiPageAuthService.canUploadFile(wikiSpaceSel, wikiPageSel.getId(), currentUser.getUserId());
String canDeleteFile = wikiPageAuthService.canDeleteFile(wikiSpaceSel, wikiPageSel.getId(), currentUser.getUserId());
String canConfigAuth = wikiPageAuthService.canConfigAuth(wikiSpaceSel, wikiPageSel.getId(), currentUser.getUserId());
vo.setCanEdit((canEdit == null) ? 1 : 0);
vo.setCanDelete((canDelete == null) ? 1 : 0);
vo.setCanDeleteFile((canDeleteFile == null) ? 1 : 0);
vo.setCanUploadFile((canUploadFile == null) ? 1 : 0);
vo.setCanConfigAuth((canConfigAuth == null) ? 1 : 0);
// 高并发下会有覆盖问题,但不重要~
Integer viewNum = Optional.ofNullable(wikiPageSel.getViewNum()).orElse(0);
WikiPage wikiPageUp = new WikiPage();
wikiPageUp.setId(wikiPageSel.getId());
wikiPageUp.setViewNum(viewNum + 1);
wikiPageService.updateById(wikiPageUp);
// 修改返回值里的查看数+1
wikiPageSel.setViewNum(viewNum + 1);
return DocResponseJson.ok(vo);
}
UpdateWrapper<WikiPageFile> wrapperFile = new UpdateWrapper<>();
wrapperFile.eq("page_id", wikiPage.getId());
wrapperFile.eq("del_flag", 0);
List<WikiPageFile> pageFiles = wikiPageFileService.list(wrapperFile);
for (WikiPageFile pageFile : pageFiles) {
pageFile.setFileUrl("zyplayer-doc-wiki/common/file?uuid=" + pageFile.getUuid());
}
UpdateWrapper<WikiPageZan> wrapperZan = new UpdateWrapper<>();
wrapperZan.eq("page_id", wikiPage.getId());
wrapperZan.eq("create_user_id", currentUser.getUserId());
wrapperZan.eq("yn", 1);
WikiPageZan pageZan = wikiPageZanService.getOne(wrapperZan);
WikiPageContentVo vo = new WikiPageContentVo();
vo.setWikiPage(wikiPageSel);
vo.setPageContent(pageContent);
vo.setFileList(pageFiles);
vo.setSelfZan((pageZan != null) ? 1 : 0);
vo.setSelfUserId(currentUser.getUserId());
// 上传附件、编辑、权限设置、删除 的权限
String canEdit = wikiPageAuthService.canEdit(wikiSpaceSel, wikiPageSel.getEditType(), wikiPageSel.getId(), currentUser.getUserId());
String canDelete = wikiPageAuthService.canDelete(wikiSpaceSel, wikiPageSel.getEditType(), wikiPageSel.getId(), currentUser.getUserId());
String canUploadFile = wikiPageAuthService.canUploadFile(wikiSpaceSel, wikiPageSel.getId(), currentUser.getUserId());
String canDeleteFile = wikiPageAuthService.canDeleteFile(wikiSpaceSel, wikiPageSel.getId(), currentUser.getUserId());
String canConfigAuth = wikiPageAuthService.canConfigAuth(wikiSpaceSel, wikiPageSel.getId(), currentUser.getUserId());
vo.setCanEdit((canEdit == null) ? 1 : 0);
vo.setCanDelete((canDelete == null) ? 1 : 0);
vo.setCanDeleteFile((canDeleteFile == null) ? 1 : 0);
vo.setCanUploadFile((canUploadFile == null) ? 1 : 0);
vo.setCanConfigAuth((canConfigAuth == null) ? 1 : 0);
// 高并发下会有覆盖问题,但不重要~
Integer viewNum = Optional.ofNullable(wikiPageSel.getViewNum()).orElse(0);
WikiPage wikiPageUp = new WikiPage();
wikiPageUp.setId(wikiPageSel.getId());
wikiPageUp.setViewNum(viewNum + 1);
wikiPageService.updateById(wikiPageUp);
// 修改返回值里的查看数+1
wikiPageSel.setViewNum(viewNum + 1);
return DocResponseJson.ok(vo);
}
@PostMapping("/changeParent")
public ResponseJson<Object> changeParent(WikiPage wikiPage, Integer beforeSeq, Integer afterSeq) {
DocUserDetails currentUser = DocUserUtil.getCurrentUser();
WikiPage wikiPageSel = wikiPageService.getById(wikiPage.getId());
// 编辑权限判断
WikiSpace wikiSpaceSel = wikiSpaceService.getById(wikiPageSel.getSpaceId());
String canEdit = wikiPageAuthService.canEdit(wikiSpaceSel, wikiPageSel.getEditType(), wikiPageSel.getId(), currentUser.getUserId());
if (canEdit != null) {
return DocResponseJson.warn(canEdit);
}
WikiPage wikiPageUp = new WikiPage();
wikiPageUp.setId(wikiPage.getId());
wikiPageUp.setParentId(wikiPage.getParentId());
wikiPageUp.setUpdateTime(new Date());
wikiPageUp.setUpdateUserId(currentUser.getUserId());
wikiPageUp.setUpdateUserName(currentUser.getUsername());
wikiPageService.changeParent(wikiPageUp, beforeSeq, afterSeq);
return DocResponseJson.ok();
}
@PostMapping("/changeParent")
public ResponseJson<Object> changeParent(WikiPage wikiPage, Integer beforeSeq, Integer afterSeq) {
DocUserDetails currentUser = DocUserUtil.getCurrentUser();
WikiPage wikiPageSel = wikiPageService.getById(wikiPage.getId());
// 编辑权限判断
WikiSpace wikiSpaceSel = wikiSpaceService.getById(wikiPageSel.getSpaceId());
String canEdit = wikiPageAuthService.canEdit(wikiSpaceSel, wikiPageSel.getEditType(), wikiPageSel.getId(), currentUser.getUserId());
if (canEdit != null) {
return DocResponseJson.warn(canEdit);
}
WikiPage wikiPageUp = new WikiPage();
wikiPageUp.setId(wikiPage.getId());
wikiPageUp.setParentId(wikiPage.getParentId());
wikiPageUp.setUpdateTime(new Date());
wikiPageUp.setUpdateUserId(currentUser.getUserId());
wikiPageUp.setUpdateUserName(currentUser.getUsername());
wikiPageService.changeParent(wikiPageUp, beforeSeq, afterSeq);
return DocResponseJson.ok();
}
@PostMapping("/delete")
public ResponseJson<Object> delete(Long pageId) {
DocUserDetails currentUser = DocUserUtil.getCurrentUser();
WikiPage wikiPageSel = wikiPageService.getById(pageId);
// 删除权限判断
WikiSpace wikiSpaceSel = wikiSpaceService.getById(wikiPageSel.getSpaceId());
String canDelete = wikiPageAuthService.canDelete(wikiSpaceSel, wikiPageSel.getEditType(), wikiPageSel.getId(), currentUser.getUserId());
if (canDelete != null) {
return DocResponseJson.warn(canDelete);
}
// 执行删除
WikiPage wikiPage = new WikiPage();
wikiPage.setId(pageId);
wikiPage.setDelFlag(1);
wikiPage.setName(wikiPageSel.getName());
wikiPage.setUpdateTime(new Date());
wikiPage.setUpdateUserId(currentUser.getUserId());
wikiPage.setUpdateUserName(currentUser.getUsername());
wikiPageService.deletePage(wikiPage);
return DocResponseJson.ok();
}
@PostMapping("/delete")
public ResponseJson<Object> delete(Long pageId) {
DocUserDetails currentUser = DocUserUtil.getCurrentUser();
WikiPage wikiPageSel = wikiPageService.getById(pageId);
// 删除权限判断
WikiSpace wikiSpaceSel = wikiSpaceService.getById(wikiPageSel.getSpaceId());
String canDelete = wikiPageAuthService.canDelete(wikiSpaceSel, wikiPageSel.getEditType(), wikiPageSel.getId(), currentUser.getUserId());
if (canDelete != null) {
return DocResponseJson.warn(canDelete);
}
// 执行删除
WikiPage wikiPage = new WikiPage();
wikiPage.setId(pageId);
wikiPage.setDelFlag(1);
wikiPage.setName(wikiPageSel.getName());
wikiPage.setUpdateTime(new Date());
wikiPage.setUpdateUserId(currentUser.getUserId());
wikiPage.setUpdateUserName(currentUser.getUsername());
wikiPageService.deletePage(wikiPage);
QueryWrapper queryWrapper = new QueryWrapper();
queryWrapper.eq("space_id", wikiPageSel.getSpaceId());
queryWrapper.eq("page_id", wikiPageSel.getId());
wikiPageTemplateService.remove(queryWrapper);
return DocResponseJson.ok();
}
@PostMapping("/update")
public ResponseJson<Object> update(WikiPage wikiPage, String content, String preview) {
Object info = wikipageUploadService.update(wikiPage, content, preview);
if (null != info){
if (info instanceof WikiPage){
return DocResponseJson.ok(info);
}
return DocResponseJson.warn((String) info);
}
return DocResponseJson.warn("状态异常");
}
@PostMapping("/update")
public ResponseJson<Object> update(WikiPage wikiPage, String content, String preview) {
Object info = wikipageUploadService.update(wikiPage, content, preview);
if (null != info) {
if (info instanceof WikiPage) {
return DocResponseJson.ok(info);
}
return DocResponseJson.warn((String) info);
}
return DocResponseJson.warn("状态异常");
}
public boolean isLassoDoll(WikiPage wikiPage, String moveToPageId){
if (!"".equals(moveToPageId)){
long tatrgetId = Long.parseLong(moveToPageId);
if (wikiPage.getId().equals(tatrgetId)){
return true;
}
UpdateWrapper<WikiPage> wrapper = new UpdateWrapper<>();
wrapper.eq("parent_id", wikiPage.getId());
wrapper.eq("space_id", wikiPage.getSpaceId());
//处理子节点也需要进行移动
List<WikiPage> wikiPageList = wikiPageService.list(wrapper);
for (WikiPage page : wikiPageList) {
if(isLassoDoll(page,moveToPageId)){
return true;
}
}
}
return false;
}
public boolean isLassoDoll(WikiPage wikiPage, Long moveToPageId) {
if (0L != moveToPageId) {
if (wikiPage.getId() == moveToPageId) {
return true;
}
UpdateWrapper<WikiPage> wrapper = new UpdateWrapper<>();
wrapper.eq("parent_id", wikiPage.getId());
wrapper.eq("space_id", wikiPage.getSpaceId());
//处理子节点也需要进行移动
List<WikiPage> wikiPageList = wikiPageService.list(wrapper);
for (WikiPage page : wikiPageList) {
if (isLassoDoll(page, moveToPageId)) {
return true;
}
}
}
return false;
}
@PostMapping("/move")
public ResponseJson<Object> move(WikiPage wikiPage, String moveToPageId, String moveToSpaceId) {
if (isLassoDoll(wikiPage,moveToPageId)){
return DocResponseJson.warn("不能移动自己到自己或自己的子节点下");
}
DocUserDetails currentUser = DocUserUtil.getCurrentUser();
//获取原page信息
WikiPage wikiPageSel = wikiPageService.getById(wikiPage.getId());
wikiPageSel.setSpaceId(Long.parseLong(moveToSpaceId));
wikiPageSel.setParentId(Long.parseLong(moveToPageId));
wikiPageSel.setUpdateTime(new Date());
wikiPageSel.setUpdateUserId(currentUser.getUserId());
wikiPageSel.setUpdateUserName(currentUser.getUsername());
wikiPageService.updateById(wikiPageSel);
UpdateWrapper<WikiPage> wrapper = new UpdateWrapper<>();
wrapper.eq("parent_id", wikiPage.getId());
wrapper.eq("space_id", wikiPage.getSpaceId());
//处理子节点也需要进行移动
List<WikiPage> wikiPageList = wikiPageService.list(wrapper);
for (WikiPage page : wikiPageList) {
move(page,wikiPageSel.getId()+"",moveToSpaceId);
}
// 给相关人发送消息
UserMessage userMessage = userMessageService.createUserMessage(currentUser, wikiPageSel.getId(), wikiPageSel.getName(), DocSysType.WIKI, UserMsgType.WIKI_PAGE_MOVE);
userMessageService.addWikiMessage(userMessage);
return DocResponseJson.ok();
}
@PostMapping("/move")
public ResponseJson<Object> move(WikiPage wikiPage, Long moveToPageId, Long moveToSpaceId) {
if (isLassoDoll(wikiPage, moveToPageId)) {
return DocResponseJson.warn("不能移动自己到自己或自己的子节点下");
}
DocUserDetails currentUser = DocUserUtil.getCurrentUser();
//获取原page信息
WikiPage wikiPageSel = wikiPageService.getById(wikiPage.getId());
wikiPageSel.setSpaceId(moveToSpaceId);
wikiPageSel.setParentId(moveToPageId);
wikiPageSel.setUpdateTime(new Date());
wikiPageSel.setUpdateUserId(currentUser.getUserId());
wikiPageSel.setUpdateUserName(currentUser.getUsername());
wikiPageService.updateById(wikiPageSel);
QueryWrapper queryWrapper = new QueryWrapper();
queryWrapper.eq("page_id",wikiPage.getId());
queryWrapper.eq("space_id",wikiPage.getSpaceId());
WikiPageTemplate bindTemplate = wikiPageTemplateService.getOne(queryWrapper);
bindTemplate.setSpaceId(moveToSpaceId);
wikiPageTemplateService.updateById(bindTemplate);
UpdateWrapper<WikiPage> wrapper = new UpdateWrapper<>();
wrapper.eq("parent_id", wikiPage.getId());
wrapper.eq("space_id", wikiPage.getSpaceId());
//处理子节点也需要进行移动
List<WikiPage> wikiPageList = wikiPageService.list(wrapper);
for (WikiPage page : wikiPageList) {
move(page, wikiPageSel.getId() , moveToSpaceId);
}
// 给相关人发送消息
UserMessage userMessage = userMessageService.createUserMessage(currentUser, wikiPageSel.getId(), wikiPageSel.getName(), DocSysType.WIKI, UserMsgType.WIKI_PAGE_MOVE);
userMessageService.addWikiMessage(userMessage);
return DocResponseJson.ok();
}
@PostMapping("/copy")
public ResponseJson<Object> copy(WikiPage wikiPage, String moveToPageId, String moveToSpaceId) {
if (isLassoDoll(wikiPage,moveToPageId)){
return DocResponseJson.warn("不能移动自己到自己或自己的子节点下");
}
DocUserDetails currentUser = DocUserUtil.getCurrentUser();
//获取原page信息
WikiPage wikiPageSel = wikiPageService.getById(wikiPage.getId());
Integer lastSeq = wikiPageMapper.getLastSeq(wikiPage.getSpaceId(), Long.parseLong(moveToPageId));
lastSeq = Optional.ofNullable(lastSeq).orElse(99999);
wikiPageSel.setSeqNo(lastSeq + 1);
wikiPageSel.setId(null);
wikiPageSel.setSpaceId(Long.parseLong(moveToSpaceId));
wikiPageSel.setParentId(Long.parseLong(moveToPageId));
wikiPageSel.setCreateTime(new Date());
wikiPageSel.setUpdateTime(new Date());
wikiPageSel.setCreateUserId(currentUser.getUserId());
wikiPageSel.setCreateUserName(currentUser.getUsername());
wikiPageService.save(wikiPageSel);
// 重置当前分支的所有节点seq值
wikiPageMapper.updateChildrenSeq(wikiPage.getSpaceId(), Long.parseLong(moveToPageId));
// 详情处理
UpdateWrapper<WikiPageContent> wrapper = new UpdateWrapper<>();
wrapper.eq("page_id", wikiPage.getId());
WikiPageContent pageContent = wikiPageContentService.getOne(wrapper);
pageContent.setId(null);
pageContent.setPageId(wikiPageSel.getId());
pageContent.setCreateTime(new Date());
pageContent.setCreateUserId(currentUser.getUserId());
pageContent.setCreateUserName(currentUser.getUsername());
wikiPageContentService.save(pageContent);
//文件
UpdateWrapper<WikiPageFile> wrapperFile = new UpdateWrapper<>();
wrapperFile.eq("page_id", wikiPageSel.getId());
List<WikiPageFile> pageFiles = wikiPageFileService.list(wrapperFile);
for (WikiPageFile pageFile : pageFiles) {
pageFile.setId(null);
pageFile.setUuid(IdUtil.simpleUUID());
pageFile.setPageId(wikiPageSel.getId());
wikiPageFileService.save(pageFile);
}
//点赞
UpdateWrapper<WikiPageZan> wrapperZan = new UpdateWrapper<>();
wrapperZan.eq("page_id", wikiPage.getId());
List<WikiPageZan> list = wikiPageZanService.list(wrapperZan);
for (WikiPageZan wikiPageZan : list) {
wikiPageZan.setId(null);
wikiPageZan.setPageId(wikiPageSel.getId());
wikiPageZanService.save(wikiPageZan);
}
//评论
UpdateWrapper<WikiPageComment> commentWrapper = new UpdateWrapper<>();
commentWrapper.eq("page_id", wikiPageSel.getId());
List<WikiPageComment> pageCommentList = wikiPageCommentService.list(commentWrapper);
for (WikiPageComment wikiPageComment : pageCommentList) {
wikiPageComment.setId(null);
wikiPageComment.setPageId(wikiPageSel.getId());
wikiPageCommentService.save(wikiPageComment);
}
//处理子节点也需要进行复制
UpdateWrapper<WikiPage> childWrapper = new UpdateWrapper<>();
childWrapper.eq("parent_id", wikiPage.getId());
childWrapper.eq("space_id", wikiPage.getSpaceId());
List<WikiPage> wikiPageList = wikiPageService.list(childWrapper);
for (WikiPage page : wikiPageList) {
copy(page,wikiPageSel.getId()+"",moveToSpaceId);
}
// 给相关人发送消息
UserMessage userMessage = userMessageService.createUserMessage(currentUser, wikiPageSel.getId(), wikiPageSel.getName(), DocSysType.WIKI, UserMsgType.WIKI_PAGE_COPY);
userMessageService.addWikiMessage(userMessage);
return DocResponseJson.ok();
}
@PostMapping("/copy")
public ResponseJson<Object> copy(WikiPage wikiPage, Long moveToPageId, Long moveToSpaceId) {
if (isLassoDoll(wikiPage, moveToPageId)) {
return DocResponseJson.warn("不能移动自己到自己或自己的子节点下");
}
DocUserDetails currentUser = DocUserUtil.getCurrentUser();
//获取原page信息
WikiPage wikiPageSel = wikiPageService.getById(wikiPage.getId());
Integer lastSeq = wikiPageMapper.getLastSeq(wikiPage.getSpaceId(), moveToPageId);
lastSeq = Optional.ofNullable(lastSeq).orElse(99999);
wikiPageSel.setSeqNo(lastSeq + 1);
wikiPageSel.setId(null);
wikiPageSel.setSpaceId(moveToSpaceId);
wikiPageSel.setParentId(moveToPageId);
wikiPageSel.setCreateTime(new Date());
wikiPageSel.setUpdateTime(new Date());
wikiPageSel.setCreateUserId(currentUser.getUserId());
wikiPageSel.setCreateUserName(currentUser.getUsername());
wikiPageService.save(wikiPageSel);
// 重置当前分支的所有节点seq值
wikiPageMapper.updateChildrenSeq(wikiPage.getSpaceId(), moveToPageId);
// 详情处理
UpdateWrapper<WikiPageContent> wrapper = new UpdateWrapper<>();
wrapper.eq("page_id", wikiPage.getId());
WikiPageContent pageContent = wikiPageContentService.getOne(wrapper);
pageContent.setId(null);
pageContent.setPageId(wikiPageSel.getId());
pageContent.setCreateTime(new Date());
pageContent.setCreateUserId(currentUser.getUserId());
pageContent.setCreateUserName(currentUser.getUsername());
wikiPageContentService.save(pageContent);
//文件
UpdateWrapper<WikiPageFile> wrapperFile = new UpdateWrapper<>();
wrapperFile.eq("page_id", wikiPageSel.getId());
List<WikiPageFile> pageFiles = wikiPageFileService.list(wrapperFile);
for (WikiPageFile pageFile : pageFiles) {
pageFile.setId(null);
pageFile.setUuid(IdUtil.simpleUUID());
pageFile.setPageId(wikiPageSel.getId());
wikiPageFileService.save(pageFile);
}
//点赞
UpdateWrapper<WikiPageZan> wrapperZan = new UpdateWrapper<>();
wrapperZan.eq("page_id", wikiPage.getId());
List<WikiPageZan> list = wikiPageZanService.list(wrapperZan);
for (WikiPageZan wikiPageZan : list) {
wikiPageZan.setId(null);
wikiPageZan.setPageId(wikiPageSel.getId());
wikiPageZanService.save(wikiPageZan);
}
//评论
UpdateWrapper<WikiPageComment> commentWrapper = new UpdateWrapper<>();
commentWrapper.eq("page_id", wikiPageSel.getId());
List<WikiPageComment> pageCommentList = wikiPageCommentService.list(commentWrapper);
for (WikiPageComment wikiPageComment : pageCommentList) {
wikiPageComment.setId(null);
wikiPageComment.setPageId(wikiPageSel.getId());
wikiPageCommentService.save(wikiPageComment);
}
//处理子节点也需要进行复制
UpdateWrapper<WikiPage> childWrapper = new UpdateWrapper<>();
childWrapper.eq("parent_id", wikiPage.getId());
childWrapper.eq("space_id", wikiPage.getSpaceId());
List<WikiPage> wikiPageList = wikiPageService.list(childWrapper);
for (WikiPage page : wikiPageList) {
copy(page, wikiPageSel.getId(), moveToSpaceId);
}
// 给相关人发送消息
UserMessage userMessage = userMessageService.createUserMessage(currentUser, wikiPageSel.getId(), wikiPageSel.getName(), DocSysType.WIKI, UserMsgType.WIKI_PAGE_COPY);
userMessageService.addWikiMessage(userMessage);
return DocResponseJson.ok();
}
@PostMapping("/rename")
public ResponseJson<Object> rename(WikiPage wikiPage) {
DocUserDetails currentUser = DocUserUtil.getCurrentUser();
if (StringUtils.isBlank(wikiPage.getName())) {
return DocResponseJson.warn("标题不能为空!");
}
if (StringUtils.isBlank(wikiPage.getId()+"")) {
return DocResponseJson.warn("不能为新建的文档改名!");
}
Long pageId = wikiPage.getId();
Long spaceId = wikiPage.getSpaceId();
WikiPage wikiPageSel = wikiPageService.getById(pageId);
// 编辑权限判断
WikiSpace wikiSpaceSel = wikiSpaceService.getById(wikiPageSel.getSpaceId());
String canEdit = wikiPageAuthService.canEdit(wikiSpaceSel, wikiPageSel.getEditType(), wikiPageSel.getId(), currentUser.getUserId());
if (canEdit != null) {
return DocResponseJson.warn(canEdit);
}
spaceId = wikiPageSel.getSpaceId();
WikiPage oldWikiPage = wikiPageService.getById(pageId);
oldWikiPage.setName(wikiPage.getName());
wikiPage.setUpdateTime(new Date());
wikiPage.setUpdateUserId(currentUser.getUserId());
wikiPage.setUpdateUserName(currentUser.getUsername());
wikiPageService.updateById(oldWikiPage);
UpdateWrapper<WikiPageContent> wrapper = new UpdateWrapper<>();
wrapper.eq("page_id", wikiPage.getId());
WikiPageContent pageContent = wikiPageContentService.getOne(wrapper);
// 给相关人发送消息
UserMessage userMessage = userMessageService.createUserMessage(currentUser, wikiPageSel.getId(), wikiPageSel.getName(), DocSysType.WIKI, UserMsgType.WIKI_PAGE_UPDATE);
userMessageService.addWikiMessage(userMessage);
try {
// 创建历史记录
wikiPageHistoryService.saveRecord(spaceId, wikiPage.getId(), pageContent.getContent());
} catch (ConfirmException e) {
return DocResponseJson.warn(e.getMessage());
}
return DocResponseJson.ok(wikiPage);
}
@PostMapping("/rename")
public ResponseJson<Object> rename(WikiPage wikiPage) {
DocUserDetails currentUser = DocUserUtil.getCurrentUser();
if (StringUtils.isBlank(wikiPage.getName())) {
return DocResponseJson.warn("标题不能为空!");
}
if (StringUtils.isBlank(wikiPage.getId() + "")) {
return DocResponseJson.warn("不能为新建的文档改名!");
}
Long pageId = wikiPage.getId();
Long spaceId = wikiPage.getSpaceId();
WikiPage wikiPageSel = wikiPageService.getById(pageId);
// 编辑权限判断
WikiSpace wikiSpaceSel = wikiSpaceService.getById(wikiPageSel.getSpaceId());
String canEdit = wikiPageAuthService.canEdit(wikiSpaceSel, wikiPageSel.getEditType(), wikiPageSel.getId(), currentUser.getUserId());
if (canEdit != null) {
return DocResponseJson.warn(canEdit);
}
spaceId = wikiPageSel.getSpaceId();
WikiPage oldWikiPage = wikiPageService.getById(pageId);
oldWikiPage.setName(wikiPage.getName());
wikiPage.setUpdateTime(new Date());
wikiPage.setUpdateUserId(currentUser.getUserId());
wikiPage.setUpdateUserName(currentUser.getUsername());
wikiPageService.updateById(oldWikiPage);
UpdateWrapper<WikiPageContent> wrapper = new UpdateWrapper<>();
wrapper.eq("page_id", wikiPage.getId());
WikiPageContent pageContent = wikiPageContentService.getOne(wrapper);
// 给相关人发送消息
UserMessage userMessage = userMessageService.createUserMessage(currentUser, wikiPageSel.getId(), wikiPageSel.getName(), DocSysType.WIKI, UserMsgType.WIKI_PAGE_UPDATE);
userMessageService.addWikiMessage(userMessage);
try {
// 创建历史记录
wikiPageHistoryService.saveRecord(spaceId, wikiPage.getId(), pageContent.getContent());
} catch (ConfirmException e) {
return DocResponseJson.warn(e.getMessage());
}
return DocResponseJson.ok(wikiPage);
}
@PostMapping("/unlock")
public ResponseJson<Object> unlock(Long pageId) {
String lockKey = CachePrefix.WIKI_LOCK_PAGE + pageId;
DocUserDetails pageLockUser = CacheUtil.get(lockKey);
if (pageLockUser != null) {
DocUserDetails currentUser = DocUserUtil.getCurrentUser();
if (Objects.equals(pageLockUser.getUserId(), currentUser.getUserId())) {
CacheUtil.remove(lockKey);
}
}
return DocResponseJson.ok();
}
@PostMapping("/unlock")
public ResponseJson<Object> unlock(Long pageId) {
String lockKey = CachePrefix.WIKI_LOCK_PAGE + pageId;
DocUserDetails pageLockUser = CacheUtil.get(lockKey);
if (pageLockUser != null) {
DocUserDetails currentUser = DocUserUtil.getCurrentUser();
if (Objects.equals(pageLockUser.getUserId(), currentUser.getUserId())) {
CacheUtil.remove(lockKey);
}
}
return DocResponseJson.ok();
}
@PostMapping("/lock")
public ResponseJson<Object> editLock(Long pageId) {
DocUserDetails currentUser = DocUserUtil.getCurrentUser();
String lockKey = CachePrefix.WIKI_LOCK_PAGE + pageId;
DocUserDetails pageLockUser = CacheUtil.get(lockKey);
if (pageLockUser != null) {
if (!Objects.equals(pageLockUser.getUserId(), currentUser.getUserId())) {
return DocResponseJson.warn("当前页面正在被:" + pageLockUser.getUsername() + " 编辑");
}
}
CacheUtil.put(lockKey, new DocUserDetails(currentUser.getUserId(), currentUser.getUsername()));
return DocResponseJson.ok();
}
@PostMapping("/lock")
public ResponseJson<Object> editLock(Long pageId) {
DocUserDetails currentUser = DocUserUtil.getCurrentUser();
String lockKey = CachePrefix.WIKI_LOCK_PAGE + pageId;
DocUserDetails pageLockUser = CacheUtil.get(lockKey);
if (pageLockUser != null) {
if (!Objects.equals(pageLockUser.getUserId(), currentUser.getUserId())) {
return DocResponseJson.warn("当前页面正在被:" + pageLockUser.getUsername() + " 编辑");
}
}
CacheUtil.put(lockKey, new DocUserDetails(currentUser.getUserId(), currentUser.getUsername()));
return DocResponseJson.ok();
}
@PostMapping("/searchByEs")
public ResponseJson<Object> searchByEs(SearchByEsParam param) {
param.setNewsType(1);
return this.news(param);
}
@PostMapping("/searchByEs")
public ResponseJson<Object> searchByEs(SearchByEsParam param) {
param.setNewsType(1);
return this.news(param);
}
@PostMapping("/download")
public ResponseJson<Object> download(Long pageId, HttpServletResponse response) {
DocUserDetails currentUser = DocUserUtil.getCurrentUser();
WikiPage wikiPageSel = wikiPageService.getById(pageId);
// 页面已删除
if (wikiPageSel == null || Objects.equals(wikiPageSel.getDelFlag(), 1)) {
return DocResponseJson.warn("该页面不存在或已删除!");
}
WikiSpace wikiSpaceSel = wikiSpaceService.getById(wikiPageSel.getSpaceId());
// 空间已删除
if (wikiSpaceSel == null || Objects.equals(wikiSpaceSel.getDelFlag(), 1)) {
return DocResponseJson.warn("该页面不存在或已删除!");
}
// 私人空间
if (SpaceType.isOthersPrivate(wikiSpaceSel.getType(), currentUser.getUserId(), wikiSpaceSel.getCreateUserId())) {
return DocResponseJson.warn("您没有权限查看该空间的文章详情!");
}
UpdateWrapper<WikiPageContent> wrapper = new UpdateWrapper<>();
wrapper.eq("page_id", pageId);
WikiPageContent pageContent = wikiPageContentService.getOne(wrapper);
if (pageContent == null || StringUtils.isBlank(pageContent.getContent())) {
return DocResponseJson.warn("文档内容为空,不能导出!");
}
try {
String content = pageContent.getContent();
String fileName = URLEncoder.encode(wikiPageSel.getName(), "UTF-8");
content = "<!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.01 Strict//EN\" \"http://www.w3.org/TR/html4/strict.dtd\">\n" +
"<html lang=\"zh\">\n" +
"<head>\n" +
"<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\" />\n" +
"<title>" + fileName + "</title>\n" +
"</head>\n" +
"<body>" +
content +
"</body>\n" +
"</html>";
// 写入流
response.setCharacterEncoding("utf-8");
response.setContentType("application/vnd.ms-excel");
response.setHeader("Content-disposition", "attachment;filename=" + fileName + ".docx");
ServletOutputStream outputStream = response.getOutputStream();
WordprocessingMLPackage wordMLPackage = WordprocessingMLPackage.createPackage();
MainDocumentPart mdp = wordMLPackage.getMainDocumentPart();
mdp.addAltChunk(AltChunkType.Xhtml, content.getBytes(StandardCharsets.UTF_8));
mdp.convertAltChunks();
XmlUtils.marshaltoString(wordMLPackage.getMainDocumentPart().getJaxbElement(), true, true);
wordMLPackage.save(outputStream);
outputStream.close();
return DocResponseJson.ok();
} catch (Exception e) {
e.printStackTrace();
}
return DocResponseJson.warn("导出失败");
}
@PostMapping("/download")
public ResponseJson<Object> download(Long pageId, HttpServletResponse response) {
DocUserDetails currentUser = DocUserUtil.getCurrentUser();
WikiPage wikiPageSel = wikiPageService.getById(pageId);
// 页面已删除
if (wikiPageSel == null || Objects.equals(wikiPageSel.getDelFlag(), 1)) {
return DocResponseJson.warn("该页面不存在或已删除!");
}
WikiSpace wikiSpaceSel = wikiSpaceService.getById(wikiPageSel.getSpaceId());
// 空间已删除
if (wikiSpaceSel == null || Objects.equals(wikiSpaceSel.getDelFlag(), 1)) {
return DocResponseJson.warn("该页面不存在或已删除!");
}
// 私人空间
if (SpaceType.isOthersPrivate(wikiSpaceSel.getType(), currentUser.getUserId(), wikiSpaceSel.getCreateUserId())) {
return DocResponseJson.warn("您没有权限查看该空间的文章详情!");
}
UpdateWrapper<WikiPageContent> wrapper = new UpdateWrapper<>();
wrapper.eq("page_id", pageId);
WikiPageContent pageContent = wikiPageContentService.getOne(wrapper);
if (pageContent == null || StringUtils.isBlank(pageContent.getContent())) {
return DocResponseJson.warn("文档内容为空,不能导出!");
}
try {
String content = pageContent.getContent();
String fileName = URLEncoder.encode(wikiPageSel.getName(), "UTF-8");
content = "<!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.01 Strict//EN\" \"http://www.w3.org/TR/html4/strict.dtd\">\n" +
"<html lang=\"zh\">\n" +
"<head>\n" +
"<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\" />\n" +
"<title>" + fileName + "</title>\n" +
"</head>\n" +
"<body>" +
content +
"</body>\n" +
"</html>";
// 写入流
response.setCharacterEncoding("utf-8");
response.setContentType("application/vnd.ms-excel");
response.setHeader("Content-disposition", "attachment;filename=" + fileName + ".docx");
ServletOutputStream outputStream = response.getOutputStream();
WordprocessingMLPackage wordMLPackage = WordprocessingMLPackage.createPackage();
MainDocumentPart mdp = wordMLPackage.getMainDocumentPart();
mdp.addAltChunk(AltChunkType.Xhtml, content.getBytes(StandardCharsets.UTF_8));
mdp.convertAltChunks();
XmlUtils.marshaltoString(wordMLPackage.getMainDocumentPart().getJaxbElement(), true, true);
wordMLPackage.save(outputStream);
outputStream.close();
return DocResponseJson.ok();
} catch (Exception e) {
e.printStackTrace();
}
return DocResponseJson.warn("导出失败");
}
@PostMapping("/news")
public ResponseJson<Object> news(SearchByEsParam param) {
// 空间不是自己的
Map<Long, WikiSpace> wikiSpaceMap = this.getCanVisitWikiSpace(param.getSpaceId());
if (wikiSpaceMap.isEmpty()) {
return DocResponseJson.ok();
}
param.setSpaceIds(new ArrayList<>(wikiSpaceMap.keySet()));
String keywords = param.getKeywords();
if (StringUtils.isNotBlank(keywords)) {
param.setKeywords("%" + keywords + "%");
}
// 分页查询
List<SpaceNewsVo> spaceNewsVoList = wikiPageContentMapper.getNewsList(param);
if (spaceNewsVoList == null || spaceNewsVoList.isEmpty()) {
return DocResponseJson.ok();
}
spaceNewsVoList.forEach(val -> {
val.setSpaceName(wikiSpaceMap.get(val.getSpaceId()).getName());
String preview = val.getPreviewContent();
if (preview != null) {
if (preview.length() > 200) {
preview = preview.substring(0, 200);
}
if (keywords != null) {
preview = StringUtils.replaceIgnoreCase(preview, keywords, "<span style=\"color:red\">" + keywords + "</span>");
}
}
val.setPreviewContent(preview);
String pageTitle = val.getPageTitle();
if (pageTitle != null && keywords != null) {
pageTitle = StringUtils.replaceIgnoreCase(pageTitle, keywords, "<span style=\"color:red\">" + keywords + "</span>");
}
val.setPageTitle(pageTitle);
});
return DocResponseJson.ok(spaceNewsVoList);
}
@PostMapping("/news")
public ResponseJson<Object> news(SearchByEsParam param) {
// 空间不是自己的
Map<Long, WikiSpace> wikiSpaceMap = this.getCanVisitWikiSpace(param.getSpaceId());
if (wikiSpaceMap.isEmpty()) {
return DocResponseJson.ok();
}
param.setSpaceIds(new ArrayList<>(wikiSpaceMap.keySet()));
String keywords = param.getKeywords();
if (StringUtils.isNotBlank(keywords)) {
param.setKeywords("%" + keywords + "%");
}
// 分页查询
List<SpaceNewsVo> spaceNewsVoList = wikiPageContentMapper.getNewsList(param);
if (spaceNewsVoList == null || spaceNewsVoList.isEmpty()) {
return DocResponseJson.ok();
}
spaceNewsVoList.forEach(val -> {
val.setSpaceName(wikiSpaceMap.get(val.getSpaceId()).getName());
String preview = val.getPreviewContent();
if (preview != null) {
if (preview.length() > 200) {
preview = preview.substring(0, 200);
}
if (keywords != null) {
preview = StringUtils.replaceIgnoreCase(preview, keywords, "<span style=\"color:red\">" + keywords + "</span>");
}
}
val.setPreviewContent(preview);
String pageTitle = val.getPageTitle();
if (pageTitle != null && keywords != null) {
pageTitle = StringUtils.replaceIgnoreCase(pageTitle, keywords, "<span style=\"color:red\">" + keywords + "</span>");
}
val.setPageTitle(pageTitle);
});
return DocResponseJson.ok(spaceNewsVoList);
}
private Map<Long, WikiSpace> getCanVisitWikiSpace(Long spaceId) {
DocUserDetails currentUser = DocUserUtil.getCurrentUser();
List<WikiSpace> spaceList;
// 空间不是自己的
if (spaceId == null || spaceId <= 0) {
QueryWrapper<WikiSpace> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("del_flag", 0);
queryWrapper.ne("type", SpaceType.privateSpace);
spaceList = wikiSpaceService.list(queryWrapper);
} else {
WikiSpace wikiSpaceSel = wikiSpaceService.getById(spaceId);
if (SpaceType.isOthersPrivate(wikiSpaceSel.getType(), currentUser.getUserId(), wikiSpaceSel.getCreateUserId())) {
return Collections.emptyMap();
}
spaceList = Collections.singletonList(wikiSpaceSel);
}
return spaceList.stream().collect(Collectors.toMap(WikiSpace::getId, val -> val));
}
private Map<Long, WikiSpace> getCanVisitWikiSpace(Long spaceId) {
DocUserDetails currentUser = DocUserUtil.getCurrentUser();
List<WikiSpace> spaceList;
// 空间不是自己的
if (spaceId == null || spaceId <= 0) {
QueryWrapper<WikiSpace> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("del_flag", 0);
queryWrapper.ne("type", SpaceType.privateSpace);
spaceList = wikiSpaceService.list(queryWrapper);
} else {
WikiSpace wikiSpaceSel = wikiSpaceService.getById(spaceId);
if (SpaceType.isOthersPrivate(wikiSpaceSel.getType(), currentUser.getUserId(), wikiSpaceSel.getCreateUserId())) {
return Collections.emptyMap();
}
spaceList = Collections.singletonList(wikiSpaceSel);
}
return spaceList.stream().collect(Collectors.toMap(WikiSpace::getId, val -> val));
}
private void setChildren(Map<Long, List<WikiPageVo>> listMap, List<WikiPageVo> nodePageList, String path) {
if (nodePageList == null || listMap == null) {
return;
}
for (WikiPageVo page : nodePageList) {
String nowPath = path + "/" + page.getName();
page.setPath(nowPath);
List<WikiPageVo> wikiPageVos = listMap.get(page.getId());
if (CollectionUtils.isNotEmpty(wikiPageVos)) {
wikiPageVos = wikiPageVos.stream().sorted(Comparator.comparingInt(WikiPageVo::getSeqNo)).collect(Collectors.toList());
page.setChildren(wikiPageVos);
this.setChildren(listMap, wikiPageVos, nowPath);
}
}
}
private void setChildren(Map<Long, List<WikiPageVo>> listMap, List<WikiPageVo> nodePageList, String path) {
if (nodePageList == null || listMap == null) {
return;
}
for (WikiPageVo page : nodePageList) {
String nowPath = path + "/" + page.getName();
page.setPath(nowPath);
List<WikiPageVo> wikiPageVos = listMap.get(page.getId());
if (CollectionUtils.isNotEmpty(wikiPageVos)) {
wikiPageVos = wikiPageVos.stream().sorted(Comparator.comparingInt(WikiPageVo::getSeqNo)).collect(Collectors.toList());
page.setChildren(wikiPageVos);
this.setChildren(listMap, wikiPageVos, nowPath);
}
}
}
}

View File

@@ -0,0 +1,156 @@
package com.zyplayer.doc.wiki.controller;
import cn.hutool.core.util.IdUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.zyplayer.doc.core.annotation.AuthMan;
import com.zyplayer.doc.core.exception.ConfirmException;
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.manage.mapper.WikiPageContentMapper;
import com.zyplayer.doc.data.repository.manage.mapper.WikiPageMapper;
import com.zyplayer.doc.data.repository.manage.param.SearchByEsParam;
import com.zyplayer.doc.data.repository.manage.vo.SpaceNewsVo;
import com.zyplayer.doc.data.repository.manage.vo.WikiPageTemplateInfoVo;
import com.zyplayer.doc.data.repository.manage.vo.WikiTemplateTagVo;
import com.zyplayer.doc.data.repository.support.consts.DocSysType;
import com.zyplayer.doc.data.repository.support.consts.UserMsgType;
import com.zyplayer.doc.data.service.manage.*;
import com.zyplayer.doc.data.utils.CachePrefix;
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.WikiPageUploadService;
import com.zyplayer.doc.wiki.service.common.WikiPageAuthService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import org.docx4j.XmlUtils;
import org.docx4j.openpackaging.packages.WordprocessingMLPackage;
import org.docx4j.openpackaging.parts.WordprocessingML.AltChunkType;
import org.docx4j.openpackaging.parts.WordprocessingML.MainDocumentPart;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
import java.util.*;
import java.util.stream.Collectors;
/**
* 文档控制器
*
* @author 暮光:城中城
* @author Sh1yu
* @since 2019年2月17日
*/
@Slf4j
@AuthMan
@RestController
@RequestMapping("/zyplayer-doc-wiki/template")
@RequiredArgsConstructor
public class WikiPageTemplateController {
private final WikiPageService wikiPageService;
private final WikiPageContentService wikiPageContentService;
private final WikiPageUploadService wikipageUploadService;
private final WikiPageTemplateService wikiPageTemplateService;
private final WikiPageFileService wikiPageFileService;
@PostMapping("/add")
public ResponseJson<Object> addTemplate(WikiPageTemplate wikiPageTemplate) {
WikiPageTemplate exist = wikiPageTemplateService.getWikiPageTemplateBySpaceAndPage(wikiPageTemplate.getSpaceId(), wikiPageTemplate.getPageId());
if (null == exist) {
DocUserDetails currentUser = DocUserUtil.getCurrentUser();
if (wikiPageTemplate.getTagName().equals("")) {
wikiPageTemplate.setTagName("无标签");
}
wikiPageTemplate.setCreated(new Date());
wikiPageTemplate.setCreateUser(currentUser.getUsername());
wikiPageTemplate.setCreateUserId(currentUser.getUserId());
wikiPageTemplateService.save(wikiPageTemplate);
} else {
exist.setTagName(wikiPageTemplate.getTagName());
exist.setShareStatus(wikiPageTemplate.getShareStatus());
wikiPageTemplateService.updateById(exist);
}
return DocResponseJson.ok();
}
@PostMapping("/allTags")
public ResponseJson<Object> allTags(boolean open) {
DocUserDetails currentUser = DocUserUtil.getCurrentUser();
List<WikiTemplateTagVo> allTags = wikiPageTemplateService.getAllTags(currentUser.getUserId(),open);
return DocResponseJson.ok(allTags);
}
@PostMapping("/filterAll")
public ResponseJson<Object> filterAll(String name, boolean open, HttpServletRequest request, Long pageNum) {
DocUserDetails currentUser = DocUserUtil.getCurrentUser();
List tagList = new ArrayList();
Set<Map.Entry<String, String[]>> entries = request.getParameterMap().entrySet();
entries.forEach(param -> {
if (param.getKey().contains("].tagName") && !"".equals(param.getValue()[0])) {
tagList.add(param.getValue()[0]);
}
});
if (tagList.size() < 1) {
tagList.add("");
}
List<WikiPageTemplateInfoVo> wikiPageTemplateInfoVos = wikiPageTemplateService.filterAll(currentUser.getUserId(), name, open, tagList, pageNum);
Long total = wikiPageTemplateService.total(currentUser.getUserId(), name, open, tagList);
DocResponseJson<Object> ok = DocResponseJson.ok(wikiPageTemplateInfoVos);
ok.setTotal(total);
return ok;
}
@PostMapping("/use")
public ResponseJson<Object> use(Long spaceId, Long parentId, String templateId) {
WikiPageTemplate template = wikiPageTemplateService.getById(templateId);
WikiPage wikiTemplatePage = wikiPageService.getById(template.getPageId());
WikiPage wikiPage = new WikiPage();
wikiPage.setParentId(parentId);
wikiPage.setSpaceId(spaceId);
wikiPage.setEditorType(wikiTemplatePage.getEditorType());
wikiPage.setName(wikiTemplatePage.getName() + "副本");
QueryWrapper queryWrapper = new QueryWrapper();
queryWrapper.eq("page_id", wikiTemplatePage.getId());
WikiPageContent pageContent = wikiPageContentService.getOne(queryWrapper);
UpdateWrapper<WikiPageFile> wrapperFile = new UpdateWrapper<>();
wrapperFile.eq("page_id", wikiTemplatePage.getId());
List<WikiPageFile> pageFiles = wikiPageFileService.list(wrapperFile);
String content = pageContent.getContent();
for (WikiPageFile pageFile : pageFiles) {
pageFile.setId(null);
String uuid = IdUtil.simpleUUID();
content.replace(pageFile.getUuid(),uuid);
pageFile.setUuid(uuid);
}
Object info = wikipageUploadService.update(wikiPage, content, content);
if (null != info) {
if (info instanceof WikiPage) {
for (WikiPageFile pageFile : pageFiles) {
pageFile.setPageId(((WikiPage)info).getId());
wikiPageFileService.save(pageFile);
}
return DocResponseJson.ok(info);
}
DocResponseJson.warn((String) info);
}
return DocResponseJson.ok("状态异常");
}
}

View File

@@ -1,6 +1,7 @@
package com.zyplayer.doc.wiki.controller.vo;
import com.zyplayer.doc.data.repository.manage.entity.WikiPage;
import com.zyplayer.doc.data.repository.manage.vo.WikiPageTemplateInfoVo;
import lombok.Data;
import java.util.Date;
@@ -102,9 +103,27 @@ public class WikiPageVo {
*/
private Integer editorType;
/**
* 路径
*/
private String path;
/**
* 子节点
*/
private List<WikiPageVo> children;
/**
* 模板类型 0个人模板 1共享模板
*/
private Integer shareStatus;
/**
* 模板标签
*/
private String tags;
public WikiPageVo(WikiPage wikiPage) {
this.id = wikiPage.getId();
this.spaceId = wikiPage.getSpaceId();
@@ -125,4 +144,27 @@ public class WikiPageVo {
this.editorType = wikiPage.getEditorType();
}
public WikiPageVo(WikiPageTemplateInfoVo wikiPageTemplate) {
this.id = wikiPageTemplate.getId();
this.spaceId = wikiPageTemplate.getSpaceId();
this.name = wikiPageTemplate.getName();
this.parentId = wikiPageTemplate.getParentId();
this.nodeType = wikiPageTemplate.getNodeType();
this.zanNum = wikiPageTemplate.getZanNum();
this.editType = wikiPageTemplate.getEditType();
this.createUserId = wikiPageTemplate.getCreateUserId();
this.createUserName = wikiPageTemplate.getCreateUserName();
this.createTime = wikiPageTemplate.getCreateTime();
this.updateUserId = wikiPageTemplate.getUpdateUserId();
this.updateUserName = wikiPageTemplate.getUpdateUserName();
this.updateTime = wikiPageTemplate.getUpdateTime();
this.delFlag = wikiPageTemplate.getDelFlag();
this.viewNum = wikiPageTemplate.getViewNum();
this.seqNo = wikiPageTemplate.getSeqNo();
this.editorType = wikiPageTemplate.getEditorType();
this.tags = wikiPageTemplate.getTags();
this.shareStatus = wikiPageTemplate.getShareStatus();
}
}

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -5,13 +5,13 @@
<link rel="icon" href="./wiki-logo.png" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>WIKI文档管理系统</title>
<script type="module" crossorigin src="./assets/main-38b62da0.js"></script>
<script type="module" crossorigin src="./assets/main-6c7d4034.js"></script>
<link rel="modulepreload" crossorigin href="./assets/highlight.js-1b0b64aa.js">
<link rel="modulepreload" crossorigin href="./assets/vue-650a4d10.js">
<link rel="modulepreload" crossorigin href="./assets/vendor-312b3cf5.js">
<link rel="modulepreload" crossorigin href="./assets/vant-6dbc81d6.js">
<link rel="modulepreload" crossorigin href="./assets/vendor-01cc9007.js">
<link rel="modulepreload" crossorigin href="./assets/vant-9a21188e.js">
<link rel="modulepreload" crossorigin href="./assets/wangeditor-564d5916.js">
<link rel="stylesheet" href="./assets/style.13e54fdd.css">
<link rel="stylesheet" href="./assets/style.355d9310.css">
</head>
<body>
<div id="app"></div>