wiki 工程重构

This commit is contained in:
simple321vip
2023-03-25 23:58:10 +08:00
parent e875c917ba
commit d7f16629f6
8 changed files with 518 additions and 533 deletions
+5 -5
View File
@@ -29,7 +29,7 @@ export default [
}
},
{
url: '/auth/api/v1/author/blog/0001',
url: '/auth/api/v1/author/wiki/0001',
method: 'delete',
response: () => {
return {
@@ -49,8 +49,8 @@ export default [
},
},
{
url: '/auth/api/v1/author/blog/content',
method: 'PUT',
url: '/auth/api/v1/author/wiki',
method: 'POST',
response: () => {
return {
bid: "0003",
@@ -62,8 +62,8 @@ export default [
},
},
{
url: '/auth/api/v1/author/blog/content',
method: 'POST',
url: '/auth/api/v1/author/wiki',
method: 'PUT',
response: () => {
return {
bid: "0003",
+36 -35
View File
@@ -2,13 +2,13 @@ import { MockMethod } from 'vite-plugin-mock'
export default [
{
url: '/wiki/api/v1/author/blog/list',
url: '/wiki/api/v1/author/wiki/list',
method: 'get',
response: ({ body, query }) => {
response: ({ }) => {
return [
{
btId: "001",
btName: "your world---",
btName: "",
blog_list: [
{
bid: "0001",
@@ -43,7 +43,7 @@ export default [
},
{
btId: "002",
btName: "my world",
btName: "",
blog_list: [
{
bid: "0003",
@@ -64,7 +64,7 @@ export default [
},
{
btId: "003",
btName: "my world",
btName: "",
blog_list: [
{
bid: "0003",
@@ -87,8 +87,28 @@ export default [
}
},
{
url: '/wiki/api/v1/author/blog_types',
url: '/wiki/api/v1/author/wiki/type', // create wikiType
method: 'post',
response: () => {
return {
btId: "001",
btName: "your world---",
blog_list: [
{
bid: "0001",
title: "one",
content: "nothing",
btId: "001",
order: 0,
},
],
order: 2,
}
}
},
{
url: '/wiki/api/v1/author/wiki/type', // update wikiType
method: 'put',
response: () => {
return [
{
@@ -137,35 +157,7 @@ export default [
}
},
{
url: '/wiki/api/v1/author/blog_type',
method: 'put',
response: () => {
return {
btId: "001",
btName: "your world---",
blog_list: [
{
bid: "0001",
title: "one",
content: "nothing",
btId: "001",
order: 0,
},
],
order: 2,
}
}
},
{
url: '/wiki/api/v1/author/blog_type',
method: 'post',
response: () => {
return {
}
}
},
{
url: '/wiki/api/v1/author/blog_type',
url: '/wiki/api/v1/author/wiki/type', // delete wikiType
method: 'delete',
response: ({ body, query }) => {
return [
@@ -214,4 +206,13 @@ export default [
]
}
},
{
url: '/wiki/api/v1/author/wiki/type/sort',
method: 'post',
response: () => {
return {
}
}
},
] as MockMethod[]
+108 -99
View File
@@ -4,112 +4,121 @@ const headers = {
'Content-Type': 'application/json;charsetset=UTF-8'
}
const createWikiType = (data: Object) => {
return service({
url: '/wiki/api/v1/author/wiki/type',
method: 'POST',
headers: headers,
data: data
})
}
const removeWikiType = (data: Object) => {
return service({
url: '/wiki/api/v1/author/wiki/type',
method: 'DELETE',
headers: headers,
data: data
})
}
const updateWikiType = (data: Object) => {
return service({
url: '/wiki/api/v1/author/wiki/type',
method: 'PUT',
headers: headers,
data: data
})
}
const getWikiType = (btId: string) => {
return service({
url: '/wiki/api/v1/author/wiki/type/' + btId,
method: 'GET',
headers: headers,
})
}
const sortWikiType = (data: Object) => {
return service({
url: '/wiki/api/v1/author/wiki/type/sort',
method: 'POST',
headers: headers,
data: data
})
}
const createWiki = (data: Object) => {
return service({
url: '/wiki/api/v1/author/wiki',
method: 'POST',
headers: headers,
data: data
})
}
const deleteWiki = (data: Object) => {
return service({
url: '/wiki/api/v1/author/wiki',
method: 'DELETE',
headers: headers,
data: data
})
}
const updateWiki = (data: Object) => {
return service({
url: '/wiki/api/v1/author/wiki',
method: 'PUT',
headers: headers,
data: data
})
}
const getWiki = (id: string) => {
return service({
url: '/wiki/api/v1/author/wiki/' + id,
method: 'GET',
headers: headers,
})
}
const sortWiki = (data: Object, btId: string) => {
return service({
url: '/wiki/api/v1/author/wiki/sort' + btId,
method: 'POST',
headers: headers,
data: data
})
}
const countWiki = () => {
return service({
url: '/wiki/api/v1/reader/wiki/count',
method: 'GET',
headers: headers,
})
}
const listAll = () => {
return service({
url: '/wiki/api/v1/author/blog/list',
url: '/wiki/api/v1/author/wiki/list',
method: 'GET',
headers: headers
})
}
const updateBtName = (data: Object) => {
return service({
url: '/wiki/api/v1/author/blog_type',
method: 'POST',
headers: headers,
data: data
})
}
const putBlogType = (data: Object) => {
return service({
url: '/wiki/api/v1/author/blog_type',
method: 'PUT',
headers: headers,
data: data
})
}
const removeBlogType = (data: Object) => {
return service({
url: '/wiki/api/v1/author/blog_type',
method: 'DELETE',
headers: headers,
data: data
})
}
const sortBlogTypes = (data: Object) => {
return service({
url: '/wiki/api/v1/author/blog_types',
method: 'POST',
headers: headers,
data: data
})
}
const getContent = (id: string) => {
return service({
url: '/wiki/api/v1/author/blog/content/' + id,
method: 'GET',
headers: headers,
})
}
const putBlog = (postData: Object) => {
return service({
url: '/wiki/api/v1/author/blog/content',
method: 'PUT',
headers: headers,
data: postData
})
}
const updateContent = (post_data: Object) => {
return service({
url: '/wiki/api/v1/author/blog/content',
method: 'POST',
headers: headers,
data: post_data
})
}
const deleteContent = (bid: string, delete_data: Object) => {
return service({
url: '/wiki/api/v1/author/blog/' + bid,
method: 'DELETE',
headers: headers,
data: delete_data
})
}
const sortBlogs = (data: Object, btId: string) => {
return service({
url: '/wiki/api/v1/author/blogs/' + btId,
method: 'POST',
headers: headers,
data: data
})
}
const countBlogs = () => {
return service({
url: '/wiki/api/v1/reader/blogs/count',
method: 'GET',
headers: headers,
})
}
export {
createWikiType,
removeWikiType,
updateWikiType,
getWikiType,
sortWikiType,
createWiki,
deleteWiki,
updateWiki,
getWiki,
sortWiki,
countWiki,
listAll,
updateBtName,
putBlogType,
removeBlogType,
sortBlogTypes,
getContent,
putBlog,
updateContent,
deleteContent,
sortBlogs,
countBlogs
}
+42 -3
View File
@@ -20,9 +20,48 @@ type DataTimeline = {
}
type Event = {
event_date: string,
reminder_date: string,
title: string,
event_info: string,
info: string,
type: string[],
}
export { Tenant, Theme, DataTimeline, Event }
interface Wiki {
bid: string
btId: string
title: string
blog_prex: string
autosave_control: string
content: string
order: number
}
const wiki = (data: any) => {
const { bid, btId, content, title, order } = data
return {
bid: bid,
btId: btId,
content: content,
title: title,
order: order
} as Wiki
}
interface WikiType {
btId: string
btName: string
blogs: Wiki[]
order: number
}
const wikiType = (data: any) => {
const { btId, btName, order } = data
return {
btId: btId,
btName: btName,
blogs: [],
order: order,
} as WikiType
}
export { Tenant, Theme, DataTimeline, Event, Wiki, wiki, WikiType, wikiType }
+12
View File
@@ -0,0 +1,12 @@
import { h } from 'vue'
import { ElMessage } from 'element-plus'
const setErrorMessage = (msg: string) => {
ElMessage({
message: h('p', null, [
h('i', { style: 'color: teal' }, msg),
]),
})
}
export { setErrorMessage }
+299 -379
View File
@@ -15,14 +15,14 @@
<draggable :list="blogTypes" ghost-class="ghost" handle=".move" animation="300" :force-fallback="true" itemKey=""
filter=".forbid" chosen-class="chosenClass" :fallback-class="true" :fallback-on-body="true"
:touch-start-threshold="50" :fallback-tolerance="50" @start="onStartBlogType" @end="sortBlogType" group="group1"
:touch-start-threshold="50" :fallback-tolerance="50" @start="onStartBlogType" @end="onSortWikiType" group="group1"
:move="onMove">
<template #item="{ element }">
<div class="item">
<label class="move"></label>
<p class="bt-input" @click="onclickTypeTab(element.order)">{{ element.btName }}</p>
<p class="bt-input" @click="onclickTypeTab(element)">{{ element.btName }}</p>
<div>
<el-button class="operate_button" :icon="Setting" size="small" v-show="checkedBlogIndex == element.order"
<el-button class="operate_button" :icon="Setting" size="small" v-show="showWikiTypeIcon(element)"
@click="handleCreateBlogType()" />
</div>
</div>
@@ -39,18 +39,18 @@
</div>
<div class="b_section" :style="bWholeStyle" v-show="collapsible[1] == 0">
<div class="item_header">
<el-button class="item_header_button" :disabled="isclicked" @click="insertBlog">增加一个博客</el-button>
<el-button class="item_header_button" :disabled="isclicked" @click="onCreateWiki">增加一个博客</el-button>
</div>
<draggable :list="blogTypes[checkedBlogIndex].blogs" ghost-class="ghost" handle=".move" animation="300"
:force-fallback="true" itemKey="" filter=".forbid" chosen-class="chosenClass" :fallback-class="true"
:fallback-on-body="true" :touch-start-threshold="50" :fallback-tolerance="50" @start="onStartBlog" @end="sortBlog"
group="group2" :move="onMove">
<draggable :list="checkedWikiType.blogs" ghost-class="ghost" handle=".move" animation="300" :force-fallback="true"
itemKey="" filter=".forbid" chosen-class="chosenClass" :fallback-class="true" :fallback-on-body="true"
:touch-start-threshold="50" :fallback-tolerance="50" @start="onStartBlog" @end="onSortWiki" group="group2"
:move="onMove">
<template #item="{ element }">
<div class="item">
<label class="move"></label>
<p class="bt-input" @click="onclickBlogTab(element)">{{ element.title }}</p>
<div>
<el-button class="operate_button" v-show="checkedIndex == element.order" :icon="Delete" size="small"
<el-button class="operate_button" v-show="showWikiIcon(element)" :icon="Delete" size="small"
@click="deleteDialogVisible = true" />
</div>
</div>
@@ -61,12 +61,11 @@
<div class="c_section">
<div class="title_style">
<el-input v-model="blogTypes[checkedBlogIndex].blogs[checkedIndex].title" @keyup.enter.native="saveTitle"
@blur="saveTitle">
<el-input v-model="checkedWiki.title" @keyup.enter.native="onUpdateTitle" @blur="onUpdateTitle">
</el-input>
</div>
<div :style="cWholeStyle">
<md-editor theme="light" v-model="current_blog.content" @save="saveContent" @upload-img="onUploadImg"
<md-editor theme="light" v-model="checkedWiki.content" @save="onUpdateContent" @upload-img="onUploadImg"
:style="{ height: innerHeight }" />
</div>
</div>
@@ -78,35 +77,35 @@
<template #footer>
<span class="dialog-footer">
<el-button @click="blogTypeCreateDialogVisible = false">取消</el-button>
<el-button type="primary" @click="insertBlogType">确认</el-button>
<el-button type="primary" @click="onCreateWikiType">确认</el-button>
</span>
</template>
</el-dialog>
<!-- edit and delete blogtype dialog -->
<el-dialog v-model="blogTypeEditDialogVisible" title="博客分类 Setting" width="30%">
你正在对 {{ blogTypes[checkedBlogIndex].btName }}进行操作
你正在对 {{ checkedWikiType.btName }}进行操作
<div style="display: flex; margin: 10px">
<el-button type="primary" @click="saveBlogType()">修改</el-button>
<el-button type="primary" @click="onUpdateWikiType()">修改</el-button>
<el-input v-model="btName">
</el-input>
</div>
<div style="display: flex; margin: 10px">
<el-button type="danger" @click="deleteBlogType()">删除</el-button>
<el-input v-model="deleteBtName" :placeholder="'请输入 ' + blogTypes[checkedBlogIndex].btName + ' 进行删除'">
<el-button type="danger" @click="deleteWikiType()">删除</el-button>
<el-input v-model="deleteBtName" :placeholder="'请输入 ' + checkedWikiType.btName + ' 进行删除'">
</el-input>
</div>
</el-dialog>
<!-- delete blog dialog -->
<el-dialog v-model="deleteDialogVisible" title="删除博客" width="30%">
你正在对 {{ blogTypes[checkedBlogIndex].blogs[checkedIndex].title }}
你正在对 {{ checkedWiki.title }}
<el-input v-model="btName" :placeholder="'请输入<删除>'">
</el-input>
<template #footer>
<span class="dialog-footer">
<el-button @click="deleteDialogVisible = false">取消</el-button>
<el-button type="primary" @click="deleteBlog">确认</el-button>
<el-button type="primary" @click="onDeleteWiki">确认</el-button>
</span>
</template>
</el-dialog>
@@ -119,89 +118,302 @@ import $moment from "moment"
import MdEditor from 'md-editor-v3'
import { CaretRight, CaretLeft, Setting, Delete } from "@element-plus/icons-vue"
import 'md-editor-v3/lib/style.css'
import { h } from 'vue'
import { ElMessage } from 'element-plus'
import { Wiki, WikiType, wiki, wikiType } from "../../entity"
import { setErrorMessage } from "../../utils/common"
import {
updateBtName,
updateContent,
createWikiType,
removeWikiType,
updateWikiType,
getWikiType,
sortWikiType,
createWiki,
deleteWiki,
updateWiki,
getWiki,
sortWiki,
listAll,
putBlogType,
removeBlogType,
getContent,
putBlog,
deleteContent,
sortBlogTypes,
sortBlogs
} from '../../api/blog'
import { copy } from '../../utils/copyutil'
import draggable from "vuedraggable"
interface Blog {
bid: string
btId: string
title: string
blog_prex: string
autosave_control: string
content: string
order: number
}
interface BlogType {
btId: string
btName: string
blogs: Blog[]
order: number
}
const blogTypes = reactive<BlogType[]>([])
const blogTypeCreateDialogVisible = ref(false)
const blogTypeEditDialogVisible = ref(false)
const deleteDialogVisible = ref(false)
let checkedIndex = ref<number>(0)
let checkedBlogIndex = ref<number>(0)
let isclicked = ref(false)
let isReady = ref(false)
// tmp btName for create, edit, delete
let btName = ref("")
let deleteBtName = ref("")
let current_blog = reactive({
bid: "",
content: "",
})
const blogTypes = reactive<WikiType[]>([])
const checkedWikiType = reactive<WikiType>(wikiType({
btId: "",
btName: "",
blogs: [],
order: 0
}))
const checkedWiki = reactive<Wiki>({} as Wiki)
// FUNCTION DEFINITION
/**
* FUNCTION DEFINITION LIST
* {@link onCreateWikiType 创建 wiki Type}
* {@link deleteWikiType 删除 wiki Type}
* {@link onUpdateWikiType 更新 wiki Type}
* {@link onCreateWiki 创建wiki}
* {@link onDeleteWiki 删除wiki}
* {@link onUpdateContent 修改Wiki文本内容}
* {@link onUpdateTitle 修改Wikititle}
* {@link onclickTypeTab 点击type Tag触发}
* {@link onclickBlogTab 点击wiki Tag触发}
* {@link handleCreateBlogType }
* {@link getTestData 初始数据加载}
*
*/
const showWikiTypeIcon = (data: any) => {
return checkedWikiType.btId == data.btId
}
const showWikiIcon = (data: any) => {
return checkedWiki.bid == data.bid
}
/**
* create blogType
*/
const onCreateWikiType = () => {
if (btName.value == "") {
blogTypeCreateDialogVisible.value = false
return
}
const data = {
btName: btName.value,
}
createWikiType(data).then(response => {
const blog_type = wikiType(response.data)
blogTypes.push(blog_type)
response.data.blog_list.forEach((item: any) => {
const blog = wiki(item)
blog_type.blogs.push(blog as Wiki)
})
copy(checkedWikiType, blog_type)
copy(checkedWiki, blog_type.blogs[0])
}).catch(() => {
setErrorMessage("创建博客分类失败")
}).finally(() => {
btName.value = ""
blogTypeCreateDialogVisible.value = false
})
}
const deleteWikiType = () => {
if (deleteBtName.value == checkedWikiType.btName) {
const data = {
btId: checkedWikiType.btId
}
removeWikiType(data).then((response) => {
blogTypes.length = 0
response.data.forEach((element: any) => {
const wiki_Type = wikiType(element)
element.blog_list.forEach((item: any) => {
const blog = wiki(item)
wiki_Type.blogs.push(blog)
})
blogTypes.push(wiki_Type)
})
copy(checkedWikiType, blogTypes[0])
copy(checkedWiki, blogTypes[0].blogs[0])
blogTypeEditDialogVisible.value = false
})
} else {
blogTypeEditDialogVisible.value = false
}
}
/**
* edit blogType
*/
const onUpdateWikiType = () => {
if (checkedWikiType.btName == "") {
blogTypeEditDialogVisible.value = false
return
}
const query = {
btId: checkedWikiType.btId,
btName: checkedWikiType.btName,
}
updateWikiType(query).catch(() => {
setErrorMessage("文章保存失败")
}).finally(() => {
blogTypeEditDialogVisible.value = false
})
}
/**
* ブログ新規作成
*/
const onCreateWiki = () => {
isclicked.value = true
const data = {
btId: checkedWikiType.btId,
title: $moment().format("YYYY-MM-DD"),
}
createWiki(data).then(response => {
const blog = wiki(response.data)
checkedWikiType.blogs.push(blog)
copy(checkedWiki, blog)
isclicked.value = false
})
}
/**
* ブログ削除
*/
const onDeleteWiki = async () => {
if (btName.value == "删除") {
let delete_data = {
bid: checkedWiki.bid,
btId: checkedWiki.btId
}
await deleteWiki(delete_data).then(response => {
checkedWikiType.blogs.length = 0
response.data.blog_list.forEach((item: any) => {
const blog = wiki(item)
checkedWikiType.blogs.push(blog)
})
copy(checkedWiki, checkedWikiType.blogs[0])
}).finally(() => {
deleteDialogVisible.value = false
btName.value = ""
})
}
}
/**
* Blog内容修正
*/
const onUpdateContent = async () => {
const query = {
bid: checkedWiki.bid,
content: checkedWiki.content
}
updateWiki(query).catch(() => {
setErrorMessage("文章保存失败")
})
}
/**
* Blogタイトル修正
*/
const onUpdateTitle = () => {
const query = {
bid: checkedWiki.bid,
title: checkedWiki.title
}
updateWiki(query).then(() => {
}).catch(() => {
setErrorMessage("文章标题保存失败")
})
}
/**
* 点击 【博客分类】
* @param wikiType BlogType
*/
const onclickTypeTab = async (wikiType: WikiType) => {
if (wikiType.btId == checkedWikiType.btId) {
return
}
deleteBtName.value = ""
await getWikiType(wikiType.btId).then(response => {
wikiType.blogs.length = 0
response.data.blog_list.forEach((item: any) => {
const blog = wiki(item)
wikiType.blogs.push(blog)
})
copy(checkedWikiType, wikiType)
copy(checkedWiki, wikiType.blogs[0])
}).catch(err => {
console.log(err)
})
}
/**
* 点击 【博客】
* @param w Blog
*/
const onclickBlogTab = (w: Wiki) => {
deleteBtName.value = ""
if (w.bid == checkedWiki.bid) {
return
}
getWiki(w.bid).then(response => {
copy(checkedWiki, wiki(response.data))
}).catch((err) => {
setErrorMessage(err)
})
}
/**
* @desc wiki 分类排序
*
*/
const onSortWikiType = async () => {
const sortData: string[] = []
blogTypes.forEach((blogType: WikiType) => {
sortData.push(blogType.btId)
})
sortWikiType({ btIds: sortData }).catch(() => {
setErrorMessage("分类排序失败")
})
}
/**
* @desc wikiソート機能
*
*/
const onSortWiki = async () => {
const sortData: string[] = []
checkedWikiType.blogs.forEach((blog: Wiki) => {
sortData.push(blog.bid)
})
sortWiki({ bIds: sortData }, checkedWikiType.btId).catch(() => {
setErrorMessage("blog排序失败")
})
}
const handleCreateBlogType = () => {
blogTypeEditDialogVisible.value = true
}
/**
* Blog一覧取得
*/
const getTestData = async () => {
await listAll().then(response => {
response.data.sort((x: any, y: any) => { x.order - y.order })
response.data.forEach((element: any) => {
const blog_type: BlogType = {
btId: element.btId,
btName: element.btName,
blogs: [],
order: element.order
}
const blog_type = wikiType(element)
element.blog_list.forEach((item: any) => {
const blog: Blog = {
bid: item.bid,
btId: item.btId,
title: item.title,
blog_prex: item.blog_prex,
autosave_control: item.autosave_control,
content: item.content,
order: item.order
}
const blog = wiki(item)
blog_type.blogs.push(blog)
})
blogTypes.push(blog_type)
})
isReady.value = true
checkedBlogIndex.value = blogTypes[0].order
checkedIndex.value = 0
console.log(blogTypes[0].blogs[0])
copy(current_blog, blogTypes[0].blogs[0])
copy(checkedWikiType, blogTypes[0])
copy(checkedWiki, blogTypes[0].blogs[0])
})
// TODO 需要优化部分
@@ -212,319 +424,27 @@ const getTestData = async () => {
*
*/
let old_blog = {
bid: current_blog.bid,
content: current_blog.content,
bid: checkedWiki.bid,
content: checkedWiki.content,
}
setInterval(async () => {
if (current_blog.bid == old_blog.bid) {
if (old_blog.content == current_blog.content) {
if (checkedWiki.bid == old_blog.bid) {
if (old_blog.content == checkedWiki.content) {
return
}
await saveContent().then(() => {
old_blog.content = current_blog.content
await updateWiki({
bid: checkedWiki.bid,
content: checkedWiki.content
}).then(() => {
old_blog.content = checkedWiki.content
})
} else {
old_blog.bid = current_blog.bid
old_blog.content = current_blog.content
old_blog.bid = checkedWiki.bid
old_blog.content = checkedWiki.content
}
}, 5000)
}
/**
* BlogTypeを選べる
* @param order
*/
const onclickTypeTab = (order: number) => {
const bid = blogTypes[order].blogs[0].bid
deleteBtName.value = ""
getContent(bid).then(response => {
blogTypes[order].blogs[0].content = response.data.content
checkedBlogIndex.value = order
checkedIndex.value = 0
copy(current_blog, blogTypes[checkedBlogIndex.value].blogs[0])
})
}
const onclickBlogTab = (blog: Blog) => {
deleteBtName.value = ""
if (blog.order == checkedIndex.value) {
return
}
getContent(blog.bid).then(response => {
checkedIndex.value = blog.order
blogTypes[checkedBlogIndex.value].blogs[checkedIndex.value].content = response.data.content
copy(current_blog, blog)
}).catch(() => {
checkedIndex.value = blog.order
})
}
/**
* Blog内容修正
*/
const saveContent = async () => {
const query = {
bid: current_blog.bid,
content: current_blog.content
}
updateContent(query).then(() => {
}).catch(() => {
ElMessage({
message: h('p', null, [
h('i', { style: 'color: teal' }, "文章保存失败"),
]),
})
})
}
/**
* Blogタイトル修正
*/
const saveTitle = () => {
const query = {
bid: current_blog.bid,
title: blogTypes[checkedBlogIndex.value].blogs[checkedIndex.value].title
}
updateContent(query).then(() => {
}).catch(() => {
ElMessage({
message: h('p', null, [
h('i', { style: 'color: teal' }, "文章标题保存失败"),
]),
})
})
}
/**
* ブログ新規作成
*/
const insertBlog = () => {
isclicked.value = true
const data = {
btId: blogTypes[checkedBlogIndex.value].btId,
title: $moment().format("YYYY-MM-DD"),
order: blogTypes[checkedBlogIndex.value].blogs.length
}
putBlog(data).then(response => {
const { bid, btid, title, content, order, autosave_control } = response.data
const blog = {
bid: bid,
btId: btid,
title: title,
blog_prex: "",
content: content,
autosave_control: autosave_control,
order: order
} as Blog
blogTypes[checkedBlogIndex.value].blogs.push(blog)
checkedIndex.value = order
isclicked.value = false
copy(current_blog, blog)
})
}
/**
* ブログ削除
*/
const deleteBlog = () => {
if (btName.value == "删除") {
let delete_data = {
btId: blogTypes[checkedBlogIndex.value].btId
}
deleteContent(blogTypes[checkedBlogIndex.value].blogs[checkedIndex.value].bid, delete_data).then(response => {
blogTypes[checkedBlogIndex.value].blogs.length = 0
response.data.blog_list.forEach((item: any) => {
const blog: Blog = {
bid: item.bid,
btId: item.btId,
title: item.title,
blog_prex: item.blog_prex,
autosave_control: item.autosave_control,
content: item.content,
order: item.order
}
blogTypes[checkedBlogIndex.value].blogs.push(blog)
})
checkedIndex.value = 0
copy(current_blog, blogTypes[checkedBlogIndex.value].blogs[0])
deleteDialogVisible.value = false
btName.value = ""
}).catch(() => {
deleteDialogVisible.value = false
btName.value = ""
})
}
}
const handleCreateBlogType = () => {
btName.value = blogTypes[checkedBlogIndex.value].btName
blogTypeEditDialogVisible.value = true
deleteBtName.value = ""
}
/**
* create blogType
*/
const insertBlogType = () => {
if (btName.value == "") {
blogTypeCreateDialogVisible.value = false
return
}
const data = {
btName: btName.value,
order: blogTypes.length
}
putBlogType(data).then(response => {
const blog_type: BlogType = {
btId: response.data.btId,
btName: response.data.btName,
blogs: [],
order: response.data.order
}
response.data.blog_list.forEach((item: any) => {
const blog: Blog = {
bid: item.bid,
btId: item.btId,
title: item.title,
blog_prex: item.blog_prex,
autosave_control: item.autosave_control,
content: item.content,
order: item.order
}
blog_type.blogs.push(blog)
})
blogTypes.push(blog_type)
checkedBlogIndex.value = response.data.order
checkedIndex.value = blog_type.blogs[0].order
copy(current_blog, blogTypes[checkedBlogIndex.value].blogs[0])
blogTypeCreateDialogVisible.value = false
btName.value = ""
})
}
/**
* edit blogType
*/
const saveBlogType = () => {
if (btName.value == "") {
blogTypeEditDialogVisible.value = false
return
}
const query = {
btId: blogTypes[checkedBlogIndex.value].btId,
btName: btName.value,
}
updateBtName(query).then(() => {
blogTypes[checkedBlogIndex.value].btName = btName.value
blogTypeEditDialogVisible.value = false
btName.value = ""
}).catch(() => {
btName.value = ""
blogTypeEditDialogVisible.value = false
})
}
const deleteBlogType = () => {
if (deleteBtName.value == blogTypes[checkedBlogIndex.value].btName) {
const data = {
btId: blogTypes[checkedBlogIndex.value].btId
}
removeBlogType(data).then((response) => {
blogTypes.length = 0
response.data.forEach((element: any) => {
const blog_type: BlogType = {
btId: element.btId,
btName: element.btName,
blogs: [],
order: element.order
}
element.blog_list.forEach((item: any) => {
const blog: Blog = {
bid: item.bid,
btId: item.btId,
title: item.title,
blog_prex: item.blog_prex,
autosave_control: item.autosave_control,
content: item.content,
order: item.order
}
blog_type.blogs.push(blog)
})
blogTypes.push(blog_type)
})
checkedBlogIndex.value = 0
checkedIndex.value = 0
copy(current_blog, blogTypes[0].blogs[0])
blogTypeEditDialogVisible.value = false
})
} else {
blogTypeEditDialogVisible.value = false
}
}
const sortBlogType = () => {
const sortData: BlogType[] = []
blogTypes.forEach((blogType: BlogType, index) => {
if (blogType.btId == id.value) {
checkedBlogIndex.value = index
}
if (blogType.order != index) {
sortData.push({
btId: blogType.btId,
btName: blogType.btName,
blogs: [],
order: index
})
blogType.order = index
}
})
sortBlogTypes(sortData).then(() => {
}).catch(() => {
ElMessage({
message: h('p', null, [
h('i', { style: 'color: teal' }, "分类排序失败"),
]),
})
})
}
/**
* @desc wikiソート機能
*
*/
const sortBlog = () => {
const sortData: any[] = []
blogTypes[checkedBlogIndex.value].blogs.forEach((blog: Blog, index) => {
if (blog.bid == id.value) {
checkedIndex.value = index
}
if (index != blog.order) {
sortData.push({
bid: blog.bid,
order: index
})
blog.order = index
}
})
sortBlogs(sortData, blogTypes[checkedBlogIndex.value].btId).then(() => {
}).catch(() => {
ElMessage({
message: h('p', null, [
h('i', { style: 'color: teal' }, "blog排序失败"),
]),
})
})
}
// Created 段階の関数呼び出す処理
getTestData()
@@ -532,7 +452,7 @@ getTestData()
window.addEventListener('keydown', async function (event) {
if (event.ctrlKey && event.key == "s") {
event.preventDefault();
saveContent()
onUpdateContent()
}
})
@@ -560,11 +480,11 @@ const onUploadProcess = (e: number) => {
const id = ref("")
const onStartBlogType = () => {
console.log("开始拖拽");
id.value = blogTypes[checkedBlogIndex.value].btId
// id.value = blogTypes[checkedWikiTypeIndex.value].btId
};
const onStartBlog = () => {
id.value = blogTypes[checkedBlogIndex.value].blogs[checkedIndex.value].bid
// id.value = blogTypes[checkedWikiTypeIndex.value].blogs[checkedWikiIndex.value].bid
}
const onMove = (e: any) => {
+9 -8
View File
@@ -20,21 +20,21 @@
</el-calendar>
<span>待办事项</span>
<el-table :data="eventDataList">
<el-table-column property="event_date" label="Date" width="150" />
<el-table-column property="reminder_date" label="Date" width="150" />
<el-table-column property="title" label="title" width="200" />
<el-table-column property="event_info" label="eventInfo" />
<el-table-column property="reminder_info" label="eventInfo" />
</el-table>
<el-dialog v-model="dialogFormVisible" title="待办事项">
<el-form :model="form">
<el-form-item label="日期" :label-width="formLabelWidth">
<span>{{ form.event_date }}</span>
<span>{{ form.reminder_date }}</span>
</el-form-item>
<el-form-item label="title" :label-width="formLabelWidth">
<el-input v-model="form.title" autocomplete="off" />
</el-form-item>
<el-form-item label="eventInfo" :label-width="formLabelWidth">
<el-input v-model="form.event_info" autocomplete="off" type="textarea" />
<el-input v-model="form.reminder_info" autocomplete="off" type="textarea" />
</el-form-item>
<el-form-item label="alert" :label-width="formLabelWidth">
<el-checkbox-group v-model="checkedalerts" :min="0" :max="2">
@@ -73,9 +73,10 @@ const holidays = reactive<any>({})
const eventDataList = reactive<Event[]>([])
const eventDataObject = reactive<any>({})
const form = reactive({
event_date: '',
reminder_date: '',
title: '',
event_info: '',
reminder_info: '',
})
// -- REF OBJECT --
const value = ref(new Date())
@@ -89,7 +90,7 @@ const alerts = ['email', 'messageBox', '手机短信', '微信通知']
// -- EVENT DEFINITION
const onclick = (date: Date) => {
form.event_date = toLocalDate(date)
form.reminder_date = toLocalDate(date)
dialogFormVisible.value = true
}
@@ -129,7 +130,7 @@ onMounted(async () => {
eventDataList.length = 0
response.data.forEach((record: Event) => {
eventDataList.push(record)
eventDataObject[record.event_date] = record.title
eventDataObject[record.reminder_date] = record.title
})
})
isComponentActive.value = true
+7 -4
View File
@@ -106,7 +106,7 @@ import EchartsLine from '@/view/dashboard/dashboardCharts/index.vue'
import DashboardTable from '@/view/dashboard/dashboardTable/index.vue'
import { useRouter } from 'vue-router'
import { useWeatherInfo } from '@/service/weather'
import { countBlogs } from "@/api/blog"
import { countWiki } from "@/api/blog"
import { bookmarks_count } from "@/api/bookmark"
// -- IMPORT --
@@ -146,9 +146,9 @@ const toolCards = ref([
bg: 'rgba(185, 192, 255,.3)'
},
{
label: '代码生成器',
label: 'scrum',
icon: 'cpu',
name: 'autoCode',
name: 'scrum',
color: '#ffd666',
bg: 'rgba(255, 214, 102,.3)'
},
@@ -182,6 +182,9 @@ const toTarget = (name: string) => {
case 'wiki':
window.open('https://www.violin-home.cn/docs#/guan/', '_blank')
break;
case 'scrum':
window.open('https://www.leangoo.com/kanban/board_list?#/home/list', '_blank')
break;
}
}
@@ -192,7 +195,7 @@ setInterval(() => {
time.value = $moment().format("YYYY年MM月DD日 HH:mm:ss")
}, 1000)
countBlogs().then((resp) => {
countWiki().then((resp) => {
const data = resp.data
statistics.value.wiki_count = data.count
})