空间首页增加列表查询,编辑查看优化

This commit is contained in:
暮光:城中城
2019-06-14 20:46:53 +08:00
parent 494149fad2
commit a61b100768
13 changed files with 430 additions and 53 deletions

View File

@@ -17,6 +17,7 @@
<maven.compiler.source>${java.version}</maven.compiler.source>
<maven.compiler.target>${java.version}</maven.compiler.target>
<fastjson.version>1.2.53</fastjson.version>
<pagehelper.version>4.1.6</pagehelper.version>
</properties>
<dependencies>
@@ -35,5 +36,10 @@
<artifactId>fastjson</artifactId>
<version>${fastjson.version}</version>
</dependency>
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper</artifactId>
<version>${pagehelper.version}</version>
</dependency>
</dependencies>
</project>

View File

@@ -3,6 +3,7 @@ package com.zyplayer.doc.core.json;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.serializer.SerializeConfig;
import com.alibaba.fastjson.serializer.SimpleDateFormatSerializer;
import com.github.pagehelper.PageInfo;
import io.swagger.annotations.ApiModelProperty;
import javax.servlet.http.HttpServletResponse;
@@ -25,13 +26,21 @@ public class DocResponseJson<T> implements ResponseJson<T> {
@ApiModelProperty(value = "返回值说明")
private String errMsg;
@ApiModelProperty(value = "返回数据")
private T data;
private Object data;
@ApiModelProperty(value = "总数")
private Long total;
@ApiModelProperty(value = "当前页数")
private Integer pageNum;
@ApiModelProperty(value = "每页条数")
private Integer pageSize;
@ApiModelProperty(value = "总页数")
private Integer totalPage;
public DocResponseJson() {
this.errCode = 200;
}
public DocResponseJson(T data) {
public DocResponseJson(Object data) {
this.setData(data);
this.errCode = 200;
}
@@ -42,7 +51,7 @@ public class DocResponseJson<T> implements ResponseJson<T> {
this.errMsg = errMsg;
}
public DocResponseJson(int errCode, String errMsg, T data) {
public DocResponseJson(int errCode, String errMsg, Object data) {
super();
this.setData(data);
this.errCode = errCode;
@@ -70,13 +79,56 @@ public class DocResponseJson<T> implements ResponseJson<T> {
this.errMsg = errMsg;
}
public T getData() {
public Long getTotal() {
return total;
}
public void setTotal(Long total) {
this.total = total;
}
public Integer getPageNum() {
return pageNum;
}
public void setPageNum(Integer pageNum) {
this.pageNum = pageNum;
}
public Integer getPageSize() {
return pageSize;
}
public void setPageSize(Integer pageSize) {
this.pageSize = pageSize;
}
public Integer getTotalPage() {
return totalPage;
}
public void setTotalPage(Integer totalPage) {
this.totalPage = totalPage;
}
public Object getData() {
return data;
}
public void setData(T data) {
public void setData(Object data) {
if (null != data) {
if (data instanceof PageInfo) {
PageInfo<?> pageInfo = (PageInfo<?>) data;
this.data = pageInfo.getList();
this.total = pageInfo.getTotal();
this.pageNum = pageInfo.getPageNum();
this.pageSize = pageInfo.getPageSize();
this.totalPage = pageInfo.getPages();
} else {
this.data = data;
}
}
}
/**
* 提示语
@@ -119,7 +171,7 @@ public class DocResponseJson<T> implements ResponseJson<T> {
* @return
*/
public static <T> DocResponseJson<T> ok() {
return new DocResponseJson<T>();
return new DocResponseJson<>();
}
/**
@@ -129,11 +181,11 @@ public class DocResponseJson<T> implements ResponseJson<T> {
* @since 2018年8月7日
* @return
*/
public static <T> DocResponseJson<T> ok(T data) {
public static <T> DocResponseJson<T> ok(Object data) {
if (data == null) {
return DocResponseJson.ok();
}
DocResponseJson<T> responseJson = new DocResponseJson<T>();
DocResponseJson<T> responseJson = new DocResponseJson<>();
responseJson.setData(data);
return responseJson;
}

View File

@@ -5,6 +5,7 @@ import com.atomikos.icatch.jta.UserTransactionManager;
import com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor;
import com.baomidou.mybatisplus.extension.plugins.PerformanceInterceptor;
import com.baomidou.mybatisplus.extension.spring.MybatisSqlSessionFactoryBean;
import com.github.pagehelper.PageHelper;
import com.zyplayer.doc.data.repository.support.interceptor.SqlLogInterceptor;
import org.apache.ibatis.plugin.Interceptor;
import org.mybatis.spring.annotation.MapperScan;
@@ -32,12 +33,24 @@ public class MybatisPlusConfig {
* sql日志
**/
private static final SqlLogInterceptor SQL_LOG_INTERCEPTOR;
/**
* MYSQL 分页
**/
private static final PageHelper MYSQL_PAGE_HELPER;
static {
{
MYSQL_PAGE_HELPER = new PageHelper();
Properties properties = new Properties();
properties.setProperty("dialect", "mysql");
MYSQL_PAGE_HELPER.setProperties(properties);
}
{
SQL_LOG_INTERCEPTOR = new SqlLogInterceptor();
Properties properties = new Properties();
SQL_LOG_INTERCEPTOR.setProperties(properties);
}
}
/**
* 分布式事务配置
@@ -116,7 +129,7 @@ public class MybatisPlusConfig {
public MybatisSqlSessionFactoryBean manageSqlSessionFactory() throws Exception {
MybatisSqlSessionFactoryBean sqlSessionFactoryBean = new MybatisSqlSessionFactoryBean();
sqlSessionFactoryBean.setDataSource(manageDatasource());
sqlSessionFactoryBean.setPlugins(new Interceptor[]{SQL_LOG_INTERCEPTOR});
sqlSessionFactoryBean.setPlugins(new Interceptor[]{SQL_LOG_INTERCEPTOR, MYSQL_PAGE_HELPER});
PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
sqlSessionFactoryBean.setMapperLocations(resolver.getResources("classpath:/mapper/manage/*Mapper.xml"));

View File

@@ -1,9 +1,10 @@
package com.zyplayer.doc.data.repository.manage.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import java.util.Date;
import com.baomidou.mybatisplus.annotation.TableId;
import java.io.Serializable;
import java.util.Date;
/**
* <p>
@@ -63,6 +64,11 @@ public class WikiPageContent implements Serializable {
*/
private Date updateTime;
/**
* 预览内容
*/
private String preview;
public Long getId() {
return id;
}
@@ -141,4 +147,12 @@ public class WikiPageContent implements Serializable {
", updateTime=" + updateTime +
"}";
}
public String getPreview() {
return preview;
}
public void setPreview(String preview) {
this.preview = preview;
}
}

View File

@@ -18,6 +18,7 @@ ALTER TABLE `wiki_page` ADD COLUMN `seq_no` int NOT NULL DEFAULT 0 COMMENT '顺
-- 初始化seq
UPDATE wiki_page SET seq_no=id WHERE del_flag=0;
ALTER TABLE `wiki_page_content` ADD COLUMN `preview` varchar(1024) NULL COMMENT '预览内容';
-- 全新的库:

View File

@@ -275,7 +275,7 @@
}
}
app.doGetPageList(null);
app.$router.push({path: '/home'});
app.$router.push({path: '/home', query: {spaceId: data}});
}
},
loadSpaceList() {
@@ -294,6 +294,7 @@
app.nowClickPath = {spaceId: spaceId};
app.choiceSpace = spaceId;
app.doGetPageList(null);
app.$router.push({path: '/home', query: {spaceId: spaceId}});
}
});
},

View File

@@ -7,6 +7,7 @@ var URL = {
pageList: '/zyplayer-doc-wiki/page/list',
updatePage: '/zyplayer-doc-wiki/page/update',
pageDetail: '/zyplayer-doc-wiki/page/detail',
pageNews: '/zyplayer-doc-wiki/page/news',
spaceList: '/zyplayer-doc-wiki/space/list',
updateSpace: '/zyplayer-doc-wiki/space/update',
getPageUserAuthList: '/zyplayer-doc-wiki/page/auth/list',

View File

@@ -1,39 +1,121 @@
<template>
<div style="padding: 10px;">
<div style="max-width: 800px;margin: 0 auto;">
<el-select v-model="searchParam.newsType" v-on:change="getSpacePageNews" placeholder="请选择查看方式" style="float: right;z-index: 1;">
<el-option :label="val" :value="index+1" v-for="(val, index) in newsTypes"></el-option>
</el-select>
<el-tabs value="first">
<el-tab-pane :label="newsTypes[searchParam.newsType-1]" name="first">
<div v-if="spacePageNews.length <= 0" class="empty-news">暂无数据</div>
<div v-else class="line-box" v-for="item in spacePageNews">
<div class="line-title">
<span class="text-link">{{item.createUserName}}</span> 发布于 <span class="text-link">{{item.spaceName}}</span>
</div>
<div class="page-preview-box" v-on:click="showPageDetail(item)">
<div class="page-preview-title">{{item.pageTitle}}</div>
<div class="page-preview-content">{{item.previewContent}}</div>
<div>
<div style="margin-top: 30px;color: #666; text-align: center; font-size: 30px;">欢迎使用在线文档</div>
<div style="margin-top: 30px;color: #666; text-align: center;">
{{nowSpaceShow.name}}
<span v-show="nowSpaceShow.spaceExplain && nowSpaceShow.spaceExplain.length > 0"> · {{nowSpaceShow.spaceExplain}}</span>
<span><img src="../../assets/img/zan.png" class="zan-img"> {{item.zanNum}} </span>
<span><i class="el-icon-view view-img"></i> {{item.viewNum}} </span>
<span>{{item.updateTime||item.createTime}}</span>
</div>
</div>
</div>
</el-tab-pane>
</el-tabs>
<div class="page-info-box">
<el-pagination
@size-change="handleSizeChange"
@current-change="handleCurrentChange"
:page-sizes="[20, 50, 100]"
:page-size="20"
:current-page="searchParam.pageNum"
layout="prev, pager, next, jumper, sizes, total"
:total="totalCount"
>
</el-pagination>
</div>
</div>
</div>
</template>
<script>
import toast from '../../common/lib/common/toast'
import global from '../../common/config/global'
var app;
export default {
data() {
return {
nowSpaceShow: {
name: '',
spaceExplain: '',
}
totalCount: 0,
searchParam: {
spaceId: '',
newsType: 1,
pageNum: 1,
pageSize: 20,
},
spacePageNews:[],
newsTypes:["最近更新", "最新创建", "查看最多", "点赞最多", "查看+点赞最多"],
};
},
beforeRouteUpdate(to, from, next) {
this.initQueryParam(to);
next();
},
mounted: function () {
// this.getUserInfo();
this.initQueryParam(this.$route);
app = this;
},
methods: {
getUserInfo: function () {
// this.common.post(this.apilist1.getUserInfo, {}, function (json) {});
getSpacePageNews() {
this.common.post(this.apilist1.pageNews, this.searchParam, function (json) {
app.spacePageNews = json.data || [];
app.totalCount = json.total;
});
},
sendMsgToParent: function () {
// global.vue.$app.sendMsgToParent("xxx");
handleSizeChange(val) {
this.searchParam.pageSize = val;
this.getSpacePageNews();
},
showPageDetail(row) {
this.nowClickPath = {spaceId: row.spaceId, pageId: row.pageId};
this.$router.push({path: '/page/show', query: this.nowClickPath});
},
handleCurrentChange(val) {
this.searchParam.pageNum = val;
this.getSpacePageNews();
},
initQueryParam(to) {
this.searchParam = {
spaceId: to.query.spaceId,
newsType: 1,
pageNum: 1,
pageSize: 20,
};
if (!!this.searchParam.spaceId) {
this.getSpacePageNews();
}
},
}
}
</script>
<style>
.empty-news{text-align: center;padding: 100px;}
.text-link {
color: #444;
/*cursor: pointer;*/
/*font-weight: bold;*/
}
.line-box{color: #666;border-bottom: 1px solid #eee;padding: 20px 0;}
.line-title{font-size: 14px;}
.page-preview-box{cursor: pointer;}
.page-preview-title{font-size: 20px;margin: 10px 0 5px 0;color: #000;}
.page-preview-content{font-size: 16px;margin-bottom: 5px;}
.zan-img{vertical-align: middle;margin-top: -3px;}
.view-img{font-size: 16px;color: #666;}
.page-info-box{text-align: right;margin: 20px 0 50px 0;}
</style>

View File

@@ -63,12 +63,17 @@
toast.warn("标题不能为空");
return;
}
var preview = this.editor.txt.text();
if (preview.length > 200) {
preview = preview.substring(0, 200) + '...';
}
var param = {
spaceId: app.parentPath.spaceId,
parentId: parentId,
id: app.wikiPage.id,
name: app.newPageTitle,
content: this.editor.txt.html()
content: this.editor.txt.html(),
preview: preview,
};
this.common.post(this.apilist1.updatePage, param, function (json) {
toast.success("保存成功!");

View File

@@ -253,7 +253,7 @@
this.common.post(this.apilist1.updatePage, param, function (json) {
// 重新加载左侧列表,跳转到展示页面
global.vue.$app.doGetPageList(null);
app.$router.push({path: '/home'});
app.$router.push({path: '/home', query: {spaceId: app.nowClickPath.spaceId}});
});
});
},

View File

@@ -1,14 +1,19 @@
package com.zyplayer.doc.wiki.controller;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
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.core.annotation.AuthMan;
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.WikiPageMapper;
import com.zyplayer.doc.data.service.manage.*;
import com.zyplayer.doc.wiki.controller.param.SpaceNewsParam;
import com.zyplayer.doc.wiki.controller.vo.SpaceNewsVo;
import com.zyplayer.doc.wiki.controller.vo.WikiPageContentVo;
import com.zyplayer.doc.wiki.controller.vo.WikiPageVo;
import com.zyplayer.doc.wiki.framework.consts.SpaceType;
@@ -150,10 +155,11 @@ public class WikiPageController {
}
@PostMapping("/update")
public ResponseJson<Object> update(WikiPage wikiPage, String content) {
public ResponseJson<Object> update(WikiPage wikiPage, String content, String preview) {
DocUserDetails currentUser = DocUserUtil.getCurrentUser();
WikiPageContent pageContent = new WikiPageContent();
pageContent.setContent(content);
pageContent.setPreview(preview);
Integer delFlag = Optional.ofNullable(wikiPage.getDelFlag()).orElse(0);
if (delFlag == 0 && StringUtils.isBlank(wikiPage.getName())) {
return DocResponseJson.warn("标题不能为空!");
@@ -212,6 +218,56 @@ public class WikiPageController {
return DocResponseJson.ok(wikiPage);
}
@PostMapping("/news")
public ResponseJson<Object> news(SpaceNewsParam param) {
DocUserDetails currentUser = DocUserUtil.getCurrentUser();
// 空间不是自己的
Long spaceId = param.getSpaceId();
if (spaceId == null || spaceId <= 0) {
return DocResponseJson.ok();
}
WikiSpace wikiSpaceSel = wikiSpaceService.getById(spaceId);
if (SpaceType.isOthersPrivate(wikiSpaceSel.getType(), currentUser.getUserId(), wikiSpaceSel.getCreateUserId())) {
return DocResponseJson.ok();
}
QueryWrapper<WikiPage> wrapper = new QueryWrapper<>();
wrapper.eq("space_id", spaceId);
wrapper.eq("del_flag", 0);
wrapper.orderByDesc(param.getNewsType() == 1, "update_time");
wrapper.orderByDesc(param.getNewsType() == 2, "create_time");
wrapper.orderByDesc(param.getNewsType() == 3, "view_num");
wrapper.orderByDesc(param.getNewsType() == 4, "zan_num");
wrapper.orderByDesc(param.getNewsType() == 5, "view_num+zan_num");
// 分页查询
PageHelper.startPage(param.getPageNum(), param.getPageSize(), true);
List<WikiPage> pageList = wikiPageService.list(wrapper);
PageInfo<WikiPage> pageListPageInfo = new PageInfo<>(pageList);
if (pageList == null || pageList.isEmpty()) {
return DocResponseJson.ok(pageListPageInfo);
}
List<Long> pageIds = pageList.stream().map(WikiPage::getId).collect(Collectors.toList());
QueryWrapper<WikiPageContent> contentWrapper = new QueryWrapper<>();
contentWrapper.in("page_id", pageIds);
contentWrapper.select("page_id", "preview");
List<WikiPageContent> pageContentList = wikiPageContentService.list(contentWrapper);
Map<Long, String> contentMap = pageContentList.stream()
.filter(val -> val.getPreview() != null)
.collect(Collectors.toMap(WikiPageContent::getPageId, WikiPageContent::getPreview));
List<SpaceNewsVo> pageVoList = new LinkedList<>();
pageList.forEach(val -> {
SpaceNewsVo spaceNewsVo = mapper.map(val, SpaceNewsVo.class);
spaceNewsVo.setSpaceName(wikiSpaceSel.getName());
spaceNewsVo.setPreviewContent(contentMap.get(val.getId()));
spaceNewsVo.setPageTitle(val.getName());
spaceNewsVo.setPageId(val.getId());
pageVoList.add(spaceNewsVo);
});
DocResponseJson<Object> responseJson = DocResponseJson.ok(pageListPageInfo);
responseJson.setData(pageVoList);
return responseJson;
}
private void setChildren(Map<Long, List<WikiPageVo>> listMap, List<WikiPageVo> nodePageList, String path) {
if (nodePageList == null || listMap == null) {
return;

View File

@@ -0,0 +1,40 @@
package com.zyplayer.doc.wiki.controller.param;
public class SpaceNewsParam {
private Long spaceId;
private Integer newsType;
private Integer pageNum;
private Integer pageSize;
public Integer getPageNum() {
return pageNum;
}
public void setPageNum(Integer pageNum) {
this.pageNum = pageNum;
}
public Integer getPageSize() {
return pageSize;
}
public void setPageSize(Integer pageSize) {
this.pageSize = pageSize;
}
public Long getSpaceId() {
return spaceId;
}
public void setSpaceId(Long spaceId) {
this.spaceId = spaceId;
}
public Integer getNewsType() {
return newsType;
}
public void setNewsType(Integer newsType) {
this.newsType = newsType;
}
}

View File

@@ -0,0 +1,106 @@
package com.zyplayer.doc.wiki.controller.vo;
import java.util.Date;
public class SpaceNewsVo {
private Long spaceId;
private Long pageId;
private Integer zanNum;
private Integer viewNum;
private String createUserName;
private String updateUserName;
private Date createTime;
private Date updateTime;
private String spaceName;
private String pageTitle;
private String previewContent;
public Long getPageId() {
return pageId;
}
public void setPageId(Long pageId) {
this.pageId = pageId;
}
public Integer getZanNum() {
return zanNum;
}
public void setZanNum(Integer zanNum) {
this.zanNum = zanNum;
}
public Integer getViewNum() {
return viewNum;
}
public void setViewNum(Integer viewNum) {
this.viewNum = viewNum;
}
public String getCreateUserName() {
return createUserName;
}
public void setCreateUserName(String createUserName) {
this.createUserName = createUserName;
}
public String getUpdateUserName() {
return updateUserName;
}
public void setUpdateUserName(String updateUserName) {
this.updateUserName = updateUserName;
}
public Date getCreateTime() {
return createTime;
}
public void setCreateTime(Date createTime) {
this.createTime = createTime;
}
public Date getUpdateTime() {
return updateTime;
}
public void setUpdateTime(Date updateTime) {
this.updateTime = updateTime;
}
public String getSpaceName() {
return spaceName;
}
public void setSpaceName(String spaceName) {
this.spaceName = spaceName;
}
public String getPageTitle() {
return pageTitle;
}
public void setPageTitle(String pageTitle) {
this.pageTitle = pageTitle;
}
public String getPreviewContent() {
return previewContent;
}
public void setPreviewContent(String previewContent) {
this.previewContent = previewContent;
}
public Long getSpaceId() {
return spaceId;
}
public void setSpaceId(Long spaceId) {
this.spaceId = spaceId;
}
}