feat: 开发中...
This commit is contained in:
@@ -1,8 +1,8 @@
|
|||||||
package cn.hamster3.application.blog.vo;
|
package cn.hamster3.application.blog.vo;
|
||||||
|
|
||||||
|
import jakarta.validation.constraints.NotNull;
|
||||||
import lombok.AllArgsConstructor;
|
import lombok.AllArgsConstructor;
|
||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
import org.jetbrains.annotations.NotNull;
|
|
||||||
import org.springframework.data.domain.Page;
|
import org.springframework.data.domain.Page;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
@@ -13,22 +13,27 @@ public class PageableVO<T> {
|
|||||||
/**
|
/**
|
||||||
* 当前查询页码
|
* 当前查询页码
|
||||||
*/
|
*/
|
||||||
private int pageNumber;
|
@NotNull
|
||||||
|
private Integer pageNumber;
|
||||||
/**
|
/**
|
||||||
* 当前查询页面大小
|
* 当前查询页面大小
|
||||||
*/
|
*/
|
||||||
private int pageSize;
|
@NotNull
|
||||||
|
private Integer pageSize;
|
||||||
/**
|
/**
|
||||||
* 总元素数量
|
* 总元素数量
|
||||||
*/
|
*/
|
||||||
private long totalElements;
|
@NotNull
|
||||||
|
private Long totalElements;
|
||||||
/**
|
/**
|
||||||
* 总页码
|
* 总页码
|
||||||
*/
|
*/
|
||||||
private int totalPage;
|
@NotNull
|
||||||
|
private Integer totalPage;
|
||||||
/**
|
/**
|
||||||
* 当前查询内容
|
* 当前查询内容
|
||||||
*/
|
*/
|
||||||
|
@NotNull
|
||||||
private List<T> elements;
|
private List<T> elements;
|
||||||
|
|
||||||
@NotNull
|
@NotNull
|
||||||
|
@@ -46,5 +46,4 @@ public class ResponseVO<T> {
|
|||||||
public static <T> ResponseVO<T> notFound() {
|
public static <T> ResponseVO<T> notFound() {
|
||||||
return new ResponseVO<>(404, "Not Found", null);
|
return new ResponseVO<>(404, "Not Found", null);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@@ -1,5 +1,6 @@
|
|||||||
package cn.hamster3.application.blog.vo.attach;
|
package cn.hamster3.application.blog.vo.attach;
|
||||||
|
|
||||||
|
import jakarta.validation.constraints.NotNull;
|
||||||
import lombok.AllArgsConstructor;
|
import lombok.AllArgsConstructor;
|
||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
|
|
||||||
@@ -9,8 +10,12 @@ import java.util.UUID;
|
|||||||
@Data
|
@Data
|
||||||
@AllArgsConstructor
|
@AllArgsConstructor
|
||||||
public class AttachInfoResponseVO {
|
public class AttachInfoResponseVO {
|
||||||
|
@NotNull
|
||||||
private Long id;
|
private Long id;
|
||||||
|
@NotNull
|
||||||
private UUID creator;
|
private UUID creator;
|
||||||
|
@NotNull
|
||||||
private Date createTime;
|
private Date createTime;
|
||||||
|
@NotNull
|
||||||
private Date updateTime;
|
private Date updateTime;
|
||||||
}
|
}
|
||||||
|
@@ -3,6 +3,7 @@ package cn.hamster3.application.blog.vo.blog;
|
|||||||
import cn.hamster3.application.blog.vo.user.UserInfoResponseVO;
|
import cn.hamster3.application.blog.vo.user.UserInfoResponseVO;
|
||||||
import lombok.AllArgsConstructor;
|
import lombok.AllArgsConstructor;
|
||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
|
import jakarta.validation.constraints.NotNull;
|
||||||
|
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
@@ -10,17 +11,27 @@ import java.util.Set;
|
|||||||
@Data
|
@Data
|
||||||
@AllArgsConstructor
|
@AllArgsConstructor
|
||||||
public class BlogInfoResponseVO {
|
public class BlogInfoResponseVO {
|
||||||
|
@NotNull
|
||||||
private Long id;
|
private Long id;
|
||||||
|
@NotNull
|
||||||
private String title;
|
private String title;
|
||||||
|
@NotNull
|
||||||
private String abstracts;
|
private String abstracts;
|
||||||
// private String password;
|
@NotNull
|
||||||
private String content;
|
private String content;
|
||||||
|
@NotNull
|
||||||
private Boolean top;
|
private Boolean top;
|
||||||
|
@NotNull
|
||||||
private Boolean publish;
|
private Boolean publish;
|
||||||
|
@NotNull
|
||||||
private Set<String> tags;
|
private Set<String> tags;
|
||||||
// private List<BlogAttachEntity> attachEntities;
|
// private List<BlogAttachEntity> attachEntities;
|
||||||
|
@NotNull
|
||||||
private UserInfoResponseVO creator;
|
private UserInfoResponseVO creator;
|
||||||
|
@NotNull
|
||||||
private UserInfoResponseVO updater;
|
private UserInfoResponseVO updater;
|
||||||
|
@NotNull
|
||||||
private Date createTime;
|
private Date createTime;
|
||||||
|
@NotNull
|
||||||
private Date updateTime;
|
private Date updateTime;
|
||||||
}
|
}
|
||||||
|
@@ -1,5 +1,6 @@
|
|||||||
package cn.hamster3.application.blog.vo.setting;
|
package cn.hamster3.application.blog.vo.setting;
|
||||||
|
|
||||||
|
import jakarta.validation.constraints.NotNull;
|
||||||
import lombok.AllArgsConstructor;
|
import lombok.AllArgsConstructor;
|
||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
|
|
||||||
@@ -8,8 +9,12 @@ import java.util.Date;
|
|||||||
@Data
|
@Data
|
||||||
@AllArgsConstructor
|
@AllArgsConstructor
|
||||||
public class SettingInfoResponseVO {
|
public class SettingInfoResponseVO {
|
||||||
|
@NotNull
|
||||||
private String id;
|
private String id;
|
||||||
|
@NotNull
|
||||||
private String content;
|
private String content;
|
||||||
|
@NotNull
|
||||||
private Date createTime;
|
private Date createTime;
|
||||||
|
@NotNull
|
||||||
private Date updateTime;
|
private Date updateTime;
|
||||||
}
|
}
|
||||||
|
@@ -1,5 +1,6 @@
|
|||||||
package cn.hamster3.application.blog.vo.setting;
|
package cn.hamster3.application.blog.vo.setting;
|
||||||
|
|
||||||
|
import jakarta.validation.constraints.NotNull;
|
||||||
import lombok.AllArgsConstructor;
|
import lombok.AllArgsConstructor;
|
||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
import lombok.NoArgsConstructor;
|
import lombok.NoArgsConstructor;
|
||||||
@@ -8,5 +9,6 @@ import lombok.NoArgsConstructor;
|
|||||||
@NoArgsConstructor
|
@NoArgsConstructor
|
||||||
@AllArgsConstructor
|
@AllArgsConstructor
|
||||||
public class SettingUpdateRequireVO {
|
public class SettingUpdateRequireVO {
|
||||||
|
@NotNull
|
||||||
private String content;
|
private String content;
|
||||||
}
|
}
|
||||||
|
@@ -1,6 +1,7 @@
|
|||||||
package cn.hamster3.application.blog.vo.user;
|
package cn.hamster3.application.blog.vo.user;
|
||||||
|
|
||||||
import cn.hamster3.application.blog.constant.UserRole;
|
import cn.hamster3.application.blog.constant.UserRole;
|
||||||
|
import jakarta.validation.constraints.NotNull;
|
||||||
import lombok.AllArgsConstructor;
|
import lombok.AllArgsConstructor;
|
||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
|
|
||||||
@@ -10,12 +11,18 @@ import java.util.UUID;
|
|||||||
@Data
|
@Data
|
||||||
@AllArgsConstructor
|
@AllArgsConstructor
|
||||||
public class UserInfoResponseVO {
|
public class UserInfoResponseVO {
|
||||||
|
@NotNull
|
||||||
private UUID id;
|
private UUID id;
|
||||||
|
@NotNull
|
||||||
private String email;
|
private String email;
|
||||||
|
@NotNull
|
||||||
private String nickname;
|
private String nickname;
|
||||||
|
@NotNull
|
||||||
private UserRole role;
|
private UserRole role;
|
||||||
// private List<BlogEntity> blogEntities;
|
// private List<BlogEntity> blogEntities;
|
||||||
// private List<AttachEntity> attachEntities;
|
// private List<AttachEntity> attachEntities;
|
||||||
|
@NotNull
|
||||||
private Date createTime;
|
private Date createTime;
|
||||||
|
@NotNull
|
||||||
private Date updateTime;
|
private Date updateTime;
|
||||||
}
|
}
|
||||||
|
91
blog-frontend/src/components/BlogCardComponent.vue
Normal file
91
blog-frontend/src/components/BlogCardComponent.vue
Normal file
@@ -0,0 +1,91 @@
|
|||||||
|
<script setup lang="ts">
|
||||||
|
import router from "@/router";
|
||||||
|
|
||||||
|
import type { BlogInfoResponseVO } from "@/swagger";
|
||||||
|
|
||||||
|
const props = defineProps<{
|
||||||
|
blog: BlogInfoResponseVO;
|
||||||
|
}>();
|
||||||
|
|
||||||
|
function showBlog() {
|
||||||
|
router.push("/blog/" + props.blog.id + "/read/");
|
||||||
|
}
|
||||||
|
|
||||||
|
function showCreator() {
|
||||||
|
console.log("showCreator");
|
||||||
|
}
|
||||||
|
|
||||||
|
function showUpdater() {
|
||||||
|
console.log("showUpdater");
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<template>
|
||||||
|
<el-card class="blog-card">
|
||||||
|
<template #header>
|
||||||
|
<div class="blog-card-header">
|
||||||
|
<p @click="showBlog" class="blog-card-title">{{ blog.title }}</p>
|
||||||
|
<div>
|
||||||
|
<p>
|
||||||
|
<el-avatar :size="24" src="/favicon.ico" />
|
||||||
|
{{ blog.creator?.nickname }}
|
||||||
|
</p>
|
||||||
|
<p @click="showCreator" class="blog-card-creater">
|
||||||
|
{{ " 发表于:" + blog.updateTime?.toLocaleString() }}
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
<div class="blog-card-body">
|
||||||
|
<div class="blog-card-abstract" v-html="blog.abstracts"></div>
|
||||||
|
<div class="blog-card-footer">
|
||||||
|
<div @click="showUpdater">
|
||||||
|
<p>
|
||||||
|
{{ " 最后修改于:" + blog.updateTime?.toLocaleString() }}
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</el-card>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<style scoped>
|
||||||
|
.blog-card {
|
||||||
|
width: 100%;
|
||||||
|
cursor: pointer;
|
||||||
|
}
|
||||||
|
|
||||||
|
.blog-card-header {
|
||||||
|
display: flex;
|
||||||
|
justify-content: space-between;
|
||||||
|
align-items: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
.blog-card-header :hover {
|
||||||
|
text-decoration: underline;
|
||||||
|
}
|
||||||
|
|
||||||
|
.blog-card-title {
|
||||||
|
font-size: x-large;
|
||||||
|
}
|
||||||
|
|
||||||
|
.blog-card-creater {
|
||||||
|
font-size: medium;
|
||||||
|
}
|
||||||
|
|
||||||
|
.blog-card-abstract {
|
||||||
|
font-size: medium;
|
||||||
|
margin-bottom: 20px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.blog-card-footer {
|
||||||
|
padding-top: 20px;
|
||||||
|
border: 1px solid #ccc;
|
||||||
|
border-bottom-width: 0;
|
||||||
|
border-left-width: 0;
|
||||||
|
border-right-width: 0;
|
||||||
|
}
|
||||||
|
.blog-card-footer :hover {
|
||||||
|
text-decoration: underline;
|
||||||
|
}
|
||||||
|
</style>
|
@@ -1,75 +0,0 @@
|
|||||||
<script setup lang="ts">
|
|
||||||
import router from "@/router";
|
|
||||||
|
|
||||||
import type { BlogInfoResponseVO } from "@/swagger";
|
|
||||||
|
|
||||||
const props = defineProps<{
|
|
||||||
blog: BlogInfoResponseVO;
|
|
||||||
}>();
|
|
||||||
|
|
||||||
function showBlog() {
|
|
||||||
router.push("/blog/" + props.blog.id + "/read/");
|
|
||||||
}
|
|
||||||
|
|
||||||
function showCreator() {
|
|
||||||
console.log("showCreator");
|
|
||||||
}
|
|
||||||
|
|
||||||
function showUpdater() {
|
|
||||||
console.log("showUpdater");
|
|
||||||
}
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<template>
|
|
||||||
<el-card class="blog-card">
|
|
||||||
<template #header>
|
|
||||||
<div class="blog-card-header">
|
|
||||||
<p @click="showBlog">{{ blog.title }}</p>
|
|
||||||
<p @click="showCreator">
|
|
||||||
<el-avatar :size="24" src="/favicon.ico" />
|
|
||||||
{{
|
|
||||||
blog.creator?.nickname +
|
|
||||||
" 发表于:" +
|
|
||||||
blog.updateTime?.toLocaleString()
|
|
||||||
}}
|
|
||||||
</p>
|
|
||||||
</div>
|
|
||||||
</template>
|
|
||||||
<div class="blog-card-content" v-html="blog.content"></div>
|
|
||||||
<div class="blog-card-footer">
|
|
||||||
<p @click="showUpdater">
|
|
||||||
<el-avatar :size="24" src="/favicon.ico" />
|
|
||||||
{{
|
|
||||||
blog.updater?.nickname +
|
|
||||||
" 最后修改于:" +
|
|
||||||
blog.updateTime?.toLocaleString()
|
|
||||||
}}
|
|
||||||
</p>
|
|
||||||
</div>
|
|
||||||
</el-card>
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<style scoped>
|
|
||||||
.blog-card {
|
|
||||||
width: 100%;
|
|
||||||
cursor: pointer;
|
|
||||||
}
|
|
||||||
|
|
||||||
.blog-card-header {
|
|
||||||
display: flex;
|
|
||||||
justify-content: space-between;
|
|
||||||
align-items: center;
|
|
||||||
}
|
|
||||||
|
|
||||||
.blog-card-header :hover {
|
|
||||||
text-decoration: underline;
|
|
||||||
}
|
|
||||||
|
|
||||||
.blog-card-footer :hover {
|
|
||||||
text-decoration: underline;
|
|
||||||
}
|
|
||||||
|
|
||||||
.item {
|
|
||||||
margin-bottom: 18px;
|
|
||||||
}
|
|
||||||
</style>
|
|
@@ -43,6 +43,7 @@ function onSelectMenu(index: string) {
|
|||||||
mode="horizontal"
|
mode="horizontal"
|
||||||
:ellipsis="false"
|
:ellipsis="false"
|
||||||
@select="onSelectMenu"
|
@select="onSelectMenu"
|
||||||
|
class="blog-header-menu"
|
||||||
>
|
>
|
||||||
<el-menu-item index="/">
|
<el-menu-item index="/">
|
||||||
{{ siteSetting.title }}
|
{{ siteSetting.title }}
|
||||||
|
@@ -22,23 +22,23 @@ export interface AttachInfoResponseVO {
|
|||||||
* @type {number}
|
* @type {number}
|
||||||
* @memberof AttachInfoResponseVO
|
* @memberof AttachInfoResponseVO
|
||||||
*/
|
*/
|
||||||
id?: number;
|
id: number;
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
* @type {string}
|
* @type {string}
|
||||||
* @memberof AttachInfoResponseVO
|
* @memberof AttachInfoResponseVO
|
||||||
*/
|
*/
|
||||||
creator?: string;
|
creator: string;
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
* @type {Date}
|
* @type {Date}
|
||||||
* @memberof AttachInfoResponseVO
|
* @memberof AttachInfoResponseVO
|
||||||
*/
|
*/
|
||||||
createTime?: Date;
|
createTime: Date;
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
* @type {Date}
|
* @type {Date}
|
||||||
* @memberof AttachInfoResponseVO
|
* @memberof AttachInfoResponseVO
|
||||||
*/
|
*/
|
||||||
updateTime?: Date;
|
updateTime: Date;
|
||||||
}
|
}
|
||||||
|
@@ -23,65 +23,65 @@ export interface BlogInfoResponseVO {
|
|||||||
* @type {number}
|
* @type {number}
|
||||||
* @memberof BlogInfoResponseVO
|
* @memberof BlogInfoResponseVO
|
||||||
*/
|
*/
|
||||||
id?: number;
|
id: number;
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
* @type {string}
|
* @type {string}
|
||||||
* @memberof BlogInfoResponseVO
|
* @memberof BlogInfoResponseVO
|
||||||
*/
|
*/
|
||||||
title?: string;
|
title: string;
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
* @type {string}
|
* @type {string}
|
||||||
* @memberof BlogInfoResponseVO
|
* @memberof BlogInfoResponseVO
|
||||||
*/
|
*/
|
||||||
abstracts?: string;
|
abstracts: string;
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
* @type {string}
|
* @type {string}
|
||||||
* @memberof BlogInfoResponseVO
|
* @memberof BlogInfoResponseVO
|
||||||
*/
|
*/
|
||||||
content?: string;
|
content: string;
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
* @type {boolean}
|
* @type {boolean}
|
||||||
* @memberof BlogInfoResponseVO
|
* @memberof BlogInfoResponseVO
|
||||||
*/
|
*/
|
||||||
top?: boolean;
|
top: boolean;
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
* @type {boolean}
|
* @type {boolean}
|
||||||
* @memberof BlogInfoResponseVO
|
* @memberof BlogInfoResponseVO
|
||||||
*/
|
*/
|
||||||
publish?: boolean;
|
publish: boolean;
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
* @type {Array<string>}
|
* @type {Array<string>}
|
||||||
* @memberof BlogInfoResponseVO
|
* @memberof BlogInfoResponseVO
|
||||||
*/
|
*/
|
||||||
tags?: Array<string>;
|
tags: Array<string>;
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
* @type {UserInfoResponseVO}
|
* @type {UserInfoResponseVO}
|
||||||
* @memberof BlogInfoResponseVO
|
* @memberof BlogInfoResponseVO
|
||||||
*/
|
*/
|
||||||
creator?: UserInfoResponseVO;
|
creator: UserInfoResponseVO;
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
* @type {UserInfoResponseVO}
|
* @type {UserInfoResponseVO}
|
||||||
* @memberof BlogInfoResponseVO
|
* @memberof BlogInfoResponseVO
|
||||||
*/
|
*/
|
||||||
updater?: UserInfoResponseVO;
|
updater: UserInfoResponseVO;
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
* @type {Date}
|
* @type {Date}
|
||||||
* @memberof BlogInfoResponseVO
|
* @memberof BlogInfoResponseVO
|
||||||
*/
|
*/
|
||||||
createTime?: Date;
|
createTime: Date;
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
* @type {Date}
|
* @type {Date}
|
||||||
* @memberof BlogInfoResponseVO
|
* @memberof BlogInfoResponseVO
|
||||||
*/
|
*/
|
||||||
updateTime?: Date;
|
updateTime: Date;
|
||||||
}
|
}
|
||||||
|
@@ -23,29 +23,29 @@ export interface PageableVOAttachInfoResponseVO {
|
|||||||
* @type {number}
|
* @type {number}
|
||||||
* @memberof PageableVOAttachInfoResponseVO
|
* @memberof PageableVOAttachInfoResponseVO
|
||||||
*/
|
*/
|
||||||
page?: number;
|
pageNumber: number;
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
* @type {number}
|
* @type {number}
|
||||||
* @memberof PageableVOAttachInfoResponseVO
|
* @memberof PageableVOAttachInfoResponseVO
|
||||||
*/
|
*/
|
||||||
size?: number;
|
pageSize: number;
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
* @type {number}
|
* @type {number}
|
||||||
* @memberof PageableVOAttachInfoResponseVO
|
* @memberof PageableVOAttachInfoResponseVO
|
||||||
*/
|
*/
|
||||||
totalElements?: number;
|
totalElements: number;
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
* @type {number}
|
* @type {number}
|
||||||
* @memberof PageableVOAttachInfoResponseVO
|
* @memberof PageableVOAttachInfoResponseVO
|
||||||
*/
|
*/
|
||||||
totalPage?: number;
|
totalPage: number;
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
* @type {Array<AttachInfoResponseVO>}
|
* @type {Array<AttachInfoResponseVO>}
|
||||||
* @memberof PageableVOAttachInfoResponseVO
|
* @memberof PageableVOAttachInfoResponseVO
|
||||||
*/
|
*/
|
||||||
elements?: Array<AttachInfoResponseVO>;
|
elements: Array<AttachInfoResponseVO>;
|
||||||
}
|
}
|
||||||
|
@@ -23,29 +23,29 @@ export interface PageableVOBlogInfoResponseVO {
|
|||||||
* @type {number}
|
* @type {number}
|
||||||
* @memberof PageableVOBlogInfoResponseVO
|
* @memberof PageableVOBlogInfoResponseVO
|
||||||
*/
|
*/
|
||||||
page?: number;
|
pageNumber: number;
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
* @type {number}
|
* @type {number}
|
||||||
* @memberof PageableVOBlogInfoResponseVO
|
* @memberof PageableVOBlogInfoResponseVO
|
||||||
*/
|
*/
|
||||||
size?: number;
|
pageSize: number;
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
* @type {number}
|
* @type {number}
|
||||||
* @memberof PageableVOBlogInfoResponseVO
|
* @memberof PageableVOBlogInfoResponseVO
|
||||||
*/
|
*/
|
||||||
totalElements?: number;
|
totalElements: number;
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
* @type {number}
|
* @type {number}
|
||||||
* @memberof PageableVOBlogInfoResponseVO
|
* @memberof PageableVOBlogInfoResponseVO
|
||||||
*/
|
*/
|
||||||
totalPage?: number;
|
totalPage: number;
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
* @type {Array<BlogInfoResponseVO>}
|
* @type {Array<BlogInfoResponseVO>}
|
||||||
* @memberof PageableVOBlogInfoResponseVO
|
* @memberof PageableVOBlogInfoResponseVO
|
||||||
*/
|
*/
|
||||||
elements?: Array<BlogInfoResponseVO>;
|
elements: Array<BlogInfoResponseVO>;
|
||||||
}
|
}
|
||||||
|
@@ -23,29 +23,29 @@ export interface PageableVOSettingInfoResponseVO {
|
|||||||
* @type {number}
|
* @type {number}
|
||||||
* @memberof PageableVOSettingInfoResponseVO
|
* @memberof PageableVOSettingInfoResponseVO
|
||||||
*/
|
*/
|
||||||
page?: number;
|
pageNumber: number;
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
* @type {number}
|
* @type {number}
|
||||||
* @memberof PageableVOSettingInfoResponseVO
|
* @memberof PageableVOSettingInfoResponseVO
|
||||||
*/
|
*/
|
||||||
size?: number;
|
pageSize: number;
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
* @type {number}
|
* @type {number}
|
||||||
* @memberof PageableVOSettingInfoResponseVO
|
* @memberof PageableVOSettingInfoResponseVO
|
||||||
*/
|
*/
|
||||||
totalElements?: number;
|
totalElements: number;
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
* @type {number}
|
* @type {number}
|
||||||
* @memberof PageableVOSettingInfoResponseVO
|
* @memberof PageableVOSettingInfoResponseVO
|
||||||
*/
|
*/
|
||||||
totalPage?: number;
|
totalPage: number;
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
* @type {Array<SettingInfoResponseVO>}
|
* @type {Array<SettingInfoResponseVO>}
|
||||||
* @memberof PageableVOSettingInfoResponseVO
|
* @memberof PageableVOSettingInfoResponseVO
|
||||||
*/
|
*/
|
||||||
elements?: Array<SettingInfoResponseVO>;
|
elements: Array<SettingInfoResponseVO>;
|
||||||
}
|
}
|
||||||
|
@@ -23,29 +23,29 @@ export interface PageableVOUserInfoResponseVO {
|
|||||||
* @type {number}
|
* @type {number}
|
||||||
* @memberof PageableVOUserInfoResponseVO
|
* @memberof PageableVOUserInfoResponseVO
|
||||||
*/
|
*/
|
||||||
page?: number;
|
pageNumber: number;
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
* @type {number}
|
* @type {number}
|
||||||
* @memberof PageableVOUserInfoResponseVO
|
* @memberof PageableVOUserInfoResponseVO
|
||||||
*/
|
*/
|
||||||
size?: number;
|
pageSize: number;
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
* @type {number}
|
* @type {number}
|
||||||
* @memberof PageableVOUserInfoResponseVO
|
* @memberof PageableVOUserInfoResponseVO
|
||||||
*/
|
*/
|
||||||
totalElements?: number;
|
totalElements: number;
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
* @type {number}
|
* @type {number}
|
||||||
* @memberof PageableVOUserInfoResponseVO
|
* @memberof PageableVOUserInfoResponseVO
|
||||||
*/
|
*/
|
||||||
totalPage?: number;
|
totalPage: number;
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
* @type {Array<UserInfoResponseVO>}
|
* @type {Array<UserInfoResponseVO>}
|
||||||
* @memberof PageableVOUserInfoResponseVO
|
* @memberof PageableVOUserInfoResponseVO
|
||||||
*/
|
*/
|
||||||
elements?: Array<UserInfoResponseVO>;
|
elements: Array<UserInfoResponseVO>;
|
||||||
}
|
}
|
||||||
|
@@ -22,23 +22,23 @@ export interface SettingInfoResponseVO {
|
|||||||
* @type {string}
|
* @type {string}
|
||||||
* @memberof SettingInfoResponseVO
|
* @memberof SettingInfoResponseVO
|
||||||
*/
|
*/
|
||||||
id?: string;
|
id: string;
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
* @type {string}
|
* @type {string}
|
||||||
* @memberof SettingInfoResponseVO
|
* @memberof SettingInfoResponseVO
|
||||||
*/
|
*/
|
||||||
content?: string;
|
content: string;
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
* @type {Date}
|
* @type {Date}
|
||||||
* @memberof SettingInfoResponseVO
|
* @memberof SettingInfoResponseVO
|
||||||
*/
|
*/
|
||||||
createTime?: Date;
|
createTime: Date;
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
* @type {Date}
|
* @type {Date}
|
||||||
* @memberof SettingInfoResponseVO
|
* @memberof SettingInfoResponseVO
|
||||||
*/
|
*/
|
||||||
updateTime?: Date;
|
updateTime: Date;
|
||||||
}
|
}
|
||||||
|
@@ -22,5 +22,5 @@ export interface SettingUpdateRequireVO {
|
|||||||
* @type {string}
|
* @type {string}
|
||||||
* @memberof SettingUpdateRequireVO
|
* @memberof SettingUpdateRequireVO
|
||||||
*/
|
*/
|
||||||
content?: string;
|
content: string;
|
||||||
}
|
}
|
||||||
|
@@ -22,37 +22,37 @@ export interface UserInfoResponseVO {
|
|||||||
* @type {string}
|
* @type {string}
|
||||||
* @memberof UserInfoResponseVO
|
* @memberof UserInfoResponseVO
|
||||||
*/
|
*/
|
||||||
id?: string;
|
id: string;
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
* @type {string}
|
* @type {string}
|
||||||
* @memberof UserInfoResponseVO
|
* @memberof UserInfoResponseVO
|
||||||
*/
|
*/
|
||||||
email?: string;
|
email: string;
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
* @type {string}
|
* @type {string}
|
||||||
* @memberof UserInfoResponseVO
|
* @memberof UserInfoResponseVO
|
||||||
*/
|
*/
|
||||||
nickname?: string;
|
nickname: string;
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
* @type {string}
|
* @type {string}
|
||||||
* @memberof UserInfoResponseVO
|
* @memberof UserInfoResponseVO
|
||||||
*/
|
*/
|
||||||
role?: UserInfoResponseVORoleEnum;
|
role: UserInfoResponseVORoleEnum;
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
* @type {Date}
|
* @type {Date}
|
||||||
* @memberof UserInfoResponseVO
|
* @memberof UserInfoResponseVO
|
||||||
*/
|
*/
|
||||||
createTime?: Date;
|
createTime: Date;
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
* @type {Date}
|
* @type {Date}
|
||||||
* @memberof UserInfoResponseVO
|
* @memberof UserInfoResponseVO
|
||||||
*/
|
*/
|
||||||
updateTime?: Date;
|
updateTime: Date;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@@ -1,5 +1,5 @@
|
|||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
import { ref, shallowRef } from "vue";
|
import { onMounted, reactive, ref, shallowRef } from "vue";
|
||||||
import { useRoute } from "vue-router";
|
import { useRoute } from "vue-router";
|
||||||
|
|
||||||
import "@wangeditor/editor/dist/css/style.css";
|
import "@wangeditor/editor/dist/css/style.css";
|
||||||
@@ -10,62 +10,159 @@ import type {
|
|||||||
IEditorConfig,
|
IEditorConfig,
|
||||||
} from "@wangeditor/editor";
|
} from "@wangeditor/editor";
|
||||||
|
|
||||||
import { api } from "@/api";
|
import { api, globalStore } from "@/api";
|
||||||
import type { BlogInfoResponseVO } from "@/swagger";
|
import type { BlogInfoResponseVO, BlogUpdateRequireVO } from "@/swagger";
|
||||||
|
import { ElMessage } from "element-plus";
|
||||||
|
import router from "@/router";
|
||||||
|
|
||||||
const editorRef = shallowRef();
|
const editorRef = shallowRef();
|
||||||
const toolbarConfig: IToolbarConfig = {};
|
const toolbarConfig: IToolbarConfig = {};
|
||||||
const editorConfig: IEditorConfig = {};
|
const editorConfig: IEditorConfig = {};
|
||||||
const content = ref<string>("<p>hello</p>");
|
|
||||||
|
|
||||||
const handleCreated = (editor: IDomEditor) => {
|
const editBlog = reactive<BlogUpdateRequireVO>({
|
||||||
editorRef.value = editor; // 记录 editor 实例,重要!
|
title: "",
|
||||||
};
|
content: "",
|
||||||
const blogInfo = ref<BlogInfoResponseVO>();
|
tags: [],
|
||||||
|
});
|
||||||
|
let tags = ref<string>();
|
||||||
|
const blogID = parseInt(useRoute().params.id.toString());
|
||||||
|
|
||||||
const blogID = useRoute().params.id.toString();
|
onMounted(() => {
|
||||||
if (blogID) {
|
if (blogID) {
|
||||||
api.BlogController.getBlogInfo(parseInt(blogID)).then((resp) => {
|
api.BlogController.getBlogInfo(blogID).then((resp) => {
|
||||||
|
const vo = resp.data;
|
||||||
|
if (vo.code === 200) {
|
||||||
|
const blog = vo.content;
|
||||||
|
editBlog.title = blog?.title ?? "";
|
||||||
|
editBlog.abstracts = blog?.abstracts;
|
||||||
|
editBlog.tags = blog?.tags ?? [];
|
||||||
|
editBlog.top = blog?.top;
|
||||||
|
editBlog.publish = blog?.publish;
|
||||||
|
editBlog.content = blog?.content ?? "";
|
||||||
|
tags.value = blog?.tags.toString();
|
||||||
|
} else {
|
||||||
|
ElMessage({
|
||||||
|
type: "error",
|
||||||
|
message: "加载博文内容失败:" + vo.msg,
|
||||||
|
});
|
||||||
|
location.pathname = "/";
|
||||||
|
console.log("not login!");
|
||||||
|
}
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
ElMessage({
|
||||||
|
type: "error",
|
||||||
|
message: "加载博文内容失败!",
|
||||||
|
});
|
||||||
|
location.pathname = "/";
|
||||||
|
console.log("not login!");
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
function saveBlog() {
|
||||||
|
api.BlogController.updateBlog(editBlog, blogID).then((resp) => {
|
||||||
const vo = resp.data;
|
const vo = resp.data;
|
||||||
blogInfo.value = vo.content || {};
|
if (vo.code === 200) {
|
||||||
|
ElMessage({
|
||||||
|
type: "success",
|
||||||
|
message: "更新博文成功!",
|
||||||
|
});
|
||||||
|
console.log("update blog " + blogID + " success!");
|
||||||
|
router.push("/blog/" + blogID + "/read/");
|
||||||
|
} else {
|
||||||
|
ElMessage({
|
||||||
|
type: "error",
|
||||||
|
message: "更新博文失败: " + vo.msg,
|
||||||
|
});
|
||||||
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function cancelSave() {
|
||||||
|
router.push("/blog/" + blogID + "/read/");
|
||||||
|
}
|
||||||
|
|
||||||
|
function handleCreated(editor: IDomEditor) {
|
||||||
|
editorRef.value = editor; // 记录 editor 实例,重要!
|
||||||
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<template>
|
<template>
|
||||||
<el-form> </el-form>
|
<el-container class="edit-container">
|
||||||
<Toolbar
|
<el-aside class="edit-content-side">
|
||||||
class="editor-toolbar"
|
<div class="edit-content-toolbar">
|
||||||
:editor="editorRef"
|
<Toolbar
|
||||||
:defaultConfig="toolbarConfig"
|
:editor="editorRef"
|
||||||
mode="default"
|
:defaultConfig="toolbarConfig"
|
||||||
/>
|
mode="default"
|
||||||
<div class="editor">
|
/>
|
||||||
<Editor
|
</div>
|
||||||
v-model="content"
|
<el-scrollbar class="edit-content-scrollbar">
|
||||||
:defaultConfig="editorConfig"
|
<Editor
|
||||||
mode="default"
|
v-model="editBlog.content"
|
||||||
@onCreated="handleCreated"
|
:defaultConfig="editorConfig"
|
||||||
/>
|
mode="default"
|
||||||
</div>
|
@onCreated="handleCreated"
|
||||||
|
/>
|
||||||
|
</el-scrollbar>
|
||||||
|
</el-aside>
|
||||||
|
<el-main>
|
||||||
|
<el-form :model="editBlog">
|
||||||
|
<el-form-item label="博文标题">
|
||||||
|
<el-input
|
||||||
|
placeholder="博文标题"
|
||||||
|
maxlength="128"
|
||||||
|
show-word-limit
|
||||||
|
v-model="editBlog.title"
|
||||||
|
/>
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="博文摘要">
|
||||||
|
<el-input
|
||||||
|
placeholder="博文摘要"
|
||||||
|
maxlength="512"
|
||||||
|
show-word-limit
|
||||||
|
type="textarea"
|
||||||
|
v-model="editBlog.abstracts"
|
||||||
|
/>
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="标签">
|
||||||
|
<el-input placeholder="用 '|' 隔开" v-model="tags" />
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="是否置顶">
|
||||||
|
<el-switch v-model="editBlog.top" />
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="是否公开">
|
||||||
|
<el-switch v-model="editBlog.publish" />
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item>
|
||||||
|
<el-button type="primary" @click="saveBlog">保存</el-button>
|
||||||
|
<el-button @click="cancelSave">取消</el-button>
|
||||||
|
</el-form-item>
|
||||||
|
</el-form>
|
||||||
|
</el-main>
|
||||||
|
</el-container>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<style scoped>
|
<style scoped>
|
||||||
.editor-div {
|
.edit-container {
|
||||||
height: 100%;
|
height: 100%;
|
||||||
|
padding: 0 20px 0 20px;
|
||||||
|
margin: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.edit-content-side {
|
||||||
|
height: 100%;
|
||||||
|
width: 80%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.edit-content-toolbar {
|
||||||
|
height: 80px;
|
||||||
border: 1px solid #ccc;
|
border: 1px solid #ccc;
|
||||||
|
border-top-width: 0;
|
||||||
}
|
}
|
||||||
|
.edit-content-scrollbar {
|
||||||
.editor-toolbar {
|
height: calc(100% - 80px);
|
||||||
border-bottom: 1px solid #ccc;
|
border: 1px solid #ccc;
|
||||||
height: auto;
|
border-bottom: 0;
|
||||||
}
|
|
||||||
|
|
||||||
.editor-scrollbar {
|
|
||||||
height: 100%;
|
|
||||||
}
|
|
||||||
|
|
||||||
.editor {
|
|
||||||
height: 80%;
|
|
||||||
}
|
}
|
||||||
</style>
|
</style>
|
||||||
|
@@ -2,7 +2,7 @@
|
|||||||
import { ref } from "vue";
|
import { ref } from "vue";
|
||||||
import { useRoute } from "vue-router";
|
import { useRoute } from "vue-router";
|
||||||
|
|
||||||
import { api } from "@/api";
|
import { api, globalStore } from "@/api";
|
||||||
import router from "@/router";
|
import router from "@/router";
|
||||||
import type { BlogInfoResponseVO } from "@/swagger";
|
import type { BlogInfoResponseVO } from "@/swagger";
|
||||||
|
|
||||||
@@ -12,7 +12,7 @@ const blogID = useRoute().params.id.toString();
|
|||||||
if (blogID) {
|
if (blogID) {
|
||||||
api.BlogController.getBlogInfo(parseInt(blogID)).then((resp) => {
|
api.BlogController.getBlogInfo(parseInt(blogID)).then((resp) => {
|
||||||
const vo = resp.data;
|
const vo = resp.data;
|
||||||
blogInfo.value = vo.content || {};
|
blogInfo.value = vo.content;
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -30,19 +30,20 @@ function deleteBlog() {
|
|||||||
<el-header class="blog-header">
|
<el-header class="blog-header">
|
||||||
<el-row :gutter="20">
|
<el-row :gutter="20">
|
||||||
<el-col :span="4">
|
<el-col :span="4">
|
||||||
<h1>{{ blogInfo?.creator?.nickname }}</h1>
|
<p>{{ blogInfo?.creator.nickname }}</p>
|
||||||
</el-col>
|
</el-col>
|
||||||
<el-col :span="16">
|
<el-col :span="16">
|
||||||
<h1 class="blog-title">{{ blogInfo?.title }}</h1>
|
<h1 class="blog-title">{{ blogInfo?.title }}</h1>
|
||||||
</el-col>
|
</el-col>
|
||||||
<el-col :span="4">
|
<el-col :span="4" v-if="globalStore.currentUserInfo?.role === 'ADMIN'">
|
||||||
<el-button type="primary" @click="editBlog">编辑</el-button>
|
<el-button type="primary" @click="editBlog">编辑</el-button>
|
||||||
<el-button type="danger" @click="deleteBlog">删除</el-button>
|
<el-button type="danger" @click="deleteBlog">删除</el-button>
|
||||||
</el-col>
|
</el-col>
|
||||||
</el-row>
|
</el-row>
|
||||||
</el-header>
|
</el-header>
|
||||||
<el-main class="blog-main">
|
<el-main class="blog-main">
|
||||||
<el-scrollbar class="blog-content" v-html="blogInfo?.content">
|
<el-scrollbar class="blog-content">
|
||||||
|
<div v-html="blogInfo?.content"></div>
|
||||||
</el-scrollbar>
|
</el-scrollbar>
|
||||||
</el-main>
|
</el-main>
|
||||||
</el-container>
|
</el-container>
|
||||||
@@ -63,8 +64,13 @@ function deleteBlog() {
|
|||||||
text-align: center;
|
text-align: center;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.blog-author {
|
||||||
|
font-size: x-large;
|
||||||
|
white-space: nowrap;
|
||||||
|
}
|
||||||
|
|
||||||
.blog-title {
|
.blog-title {
|
||||||
font-size: xx-large;
|
font-size: x-large;
|
||||||
}
|
}
|
||||||
|
|
||||||
.blog-content {
|
.blog-content {
|
||||||
@@ -74,5 +80,6 @@ function deleteBlog() {
|
|||||||
|
|
||||||
.blog-main {
|
.blog-main {
|
||||||
width: 100%;
|
width: 100%;
|
||||||
|
padding: 0;
|
||||||
}
|
}
|
||||||
</style>
|
</style>
|
||||||
|
@@ -2,7 +2,7 @@
|
|||||||
import { reactive } from "vue";
|
import { reactive } from "vue";
|
||||||
|
|
||||||
import { api } from "@/api";
|
import { api } from "@/api";
|
||||||
import BlogComponent from "@/components/BlogComponent.vue";
|
import BlogCardComponent from "@/components/BlogCardComponent.vue";
|
||||||
import type { BlogInfoResponseVO } from "@/swagger";
|
import type { BlogInfoResponseVO } from "@/swagger";
|
||||||
|
|
||||||
let page = 0;
|
let page = 0;
|
||||||
@@ -17,13 +17,12 @@ function load() {
|
|||||||
item.updateTime = new Date(item?.updateTime ?? 0);
|
item.updateTime = new Date(item?.updateTime ?? 0);
|
||||||
blogs.push(item);
|
blogs.push(item);
|
||||||
}
|
}
|
||||||
console.log(page);
|
if (page?.elements.length ?? 0 > 0) {
|
||||||
if (page?.elements?.length ?? 0 > 0) {
|
|
||||||
console.log(
|
console.log(
|
||||||
"loaded page " +
|
"loaded page " +
|
||||||
page?.page +
|
page?.pageNumber +
|
||||||
" for element count: " +
|
" for element count: " +
|
||||||
page?.elements?.length
|
page?.elements.length
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@@ -35,7 +34,7 @@ function load() {
|
|||||||
<el-scrollbar style="overflow: auto">
|
<el-scrollbar style="overflow: auto">
|
||||||
<ul class="infinite-list" v-infinite-scroll="load">
|
<ul class="infinite-list" v-infinite-scroll="load">
|
||||||
<li v-for="blog in blogs" :key="blog.id" class="infinite-list-item">
|
<li v-for="blog in blogs" :key="blog.id" class="infinite-list-item">
|
||||||
<BlogComponent :blog="blog"></BlogComponent>
|
<BlogCardComponent :blog="blog" v-if="blog.publish"></BlogCardComponent>
|
||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
</el-scrollbar>
|
</el-scrollbar>
|
||||||
|
@@ -13,7 +13,7 @@ const form = reactive<{
|
|||||||
});
|
});
|
||||||
|
|
||||||
const onSubmit = () => {
|
const onSubmit = () => {
|
||||||
api.UserController.register(form).then((resp) => {
|
api.UserController.registerUser(form).then((resp) => {
|
||||||
let vo = resp.data;
|
let vo = resp.data;
|
||||||
if (vo.code === 200) {
|
if (vo.code === 200) {
|
||||||
console.log("register success!");
|
console.log("register success!");
|
||||||
|
Reference in New Issue
Block a user