ブログ一時保存

This commit is contained in:
simple321vip
2022-04-24 23:13:47 +08:00
parent e966d15e5e
commit 6e5d90d613
9 changed files with 306 additions and 99 deletions
+130
View File
@@ -343,6 +343,15 @@
"integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==",
"dev": true
},
"ansi-styles": {
"version": "4.3.0",
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
"integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
"dev": true,
"requires": {
"color-convert": "^2.0.1"
}
},
"asap": {
"version": "2.0.6",
"resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz",
@@ -394,6 +403,16 @@
"get-intrinsic": "^1.0.2"
}
},
"chalk": {
"version": "4.1.2",
"resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
"integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
"dev": true,
"requires": {
"ansi-styles": "^4.1.0",
"supports-color": "^7.1.0"
}
},
"character-parser": {
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/character-parser/-/character-parser-2.2.0.tgz",
@@ -413,6 +432,21 @@
"tiny-emitter": "^2.0.0"
}
},
"color-convert": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
"integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
"dev": true,
"requires": {
"color-name": "~1.1.4"
}
},
"color-name": {
"version": "1.1.4",
"resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
"integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
"dev": true
},
"constantinople": {
"version": "4.0.1",
"resolved": "https://registry.npmjs.org/constantinople/-/constantinople-4.0.1.tgz",
@@ -441,6 +475,15 @@
"resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.0.tgz",
"integrity": "sha512-JLC809s6Y948/FuCZPm5IX8rRhQwOiyMb2TfVVQEixG7P8Lm/gt5S7yoQZmC8x1UehI9Pb7sksEt4xx14m+7Ug=="
},
"debug": {
"version": "4.3.4",
"resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
"integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
"dev": true,
"requires": {
"ms": "2.1.2"
}
},
"delegate": {
"version": "3.2.0",
"resolved": "https://registry.npmjs.org/delegate/-/delegate-3.2.0.tgz",
@@ -502,6 +545,15 @@
"resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz",
"integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg=="
},
"echarts": {
"version": "5.3.2",
"resolved": "https://registry.npmjs.org/echarts/-/echarts-5.3.2.tgz",
"integrity": "sha512-LWCt7ohOKdJqyiBJ0OGBmE9szLdfA9sGcsMEi+GGoc6+Xo75C+BkcT/6NNGRHAWtnQl2fNow05AQjznpap28TQ==",
"requires": {
"tslib": "2.3.0",
"zrender": "5.3.1"
}
},
"element-plus": {
"version": "2.1.7",
"resolved": "https://registry.npmjs.org/element-plus/-/element-plus-2.1.7.tgz",
@@ -740,6 +792,17 @@
"resolved": "https://registry.npmjs.org/from/-/from-0.1.7.tgz",
"integrity": "sha1-g8YK/Fi5xWmXAH7Rp2izqzA6RP4="
},
"fs-extra": {
"version": "10.1.0",
"resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz",
"integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==",
"dev": true,
"requires": {
"graceful-fs": "^4.2.0",
"jsonfile": "^6.0.1",
"universalify": "^2.0.0"
}
},
"fsevents": {
"version": "2.3.2",
"resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz",
@@ -770,6 +833,12 @@
"delegate": "^3.1.2"
}
},
"graceful-fs": {
"version": "4.2.10",
"resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz",
"integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==",
"dev": true
},
"has": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
@@ -778,6 +847,12 @@
"function-bind": "^1.1.1"
}
},
"has-flag": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
"integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
"dev": true
},
"has-symbols": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz",
@@ -856,6 +931,16 @@
"integrity": "sha512-H8jvkz1O50L3dMZCsLqiuB2tA7muqbSg1AtGEkN0leAqGjsUzDJir3Zwr02BhqdcITPg3ei3mZ+HjMocAknhhg==",
"dev": true
},
"jsonfile": {
"version": "6.1.0",
"resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz",
"integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==",
"dev": true,
"requires": {
"graceful-fs": "^4.1.6",
"universalify": "^2.0.0"
}
},
"jstransformer": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/jstransformer/-/jstransformer-1.0.0.tgz",
@@ -928,6 +1013,12 @@
"resolved": "https://registry.npmjs.org/moment/-/moment-2.29.2.tgz",
"integrity": "sha512-UgzG4rvxYpN15jgCmVJwac49h9ly9NurikMWGPdVxm8GZD6XjkKPxDTjQQ43gtGgnV3X0cAyWDdP2Wexoquifg=="
},
"ms": {
"version": "2.1.2",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
"integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
"dev": true
},
"nanoid": {
"version": "3.3.2",
"resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.2.tgz",
@@ -1221,6 +1312,15 @@
"through": "~2.3.4"
}
},
"supports-color": {
"version": "7.2.0",
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
"integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
"dev": true,
"requires": {
"has-flag": "^4.0.0"
}
},
"supports-preserve-symlinks-flag": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz",
@@ -1254,6 +1354,11 @@
"integrity": "sha1-zCAOqyYT9BZtJ/+a/HylbUnfbrQ=",
"dev": true
},
"tslib": {
"version": "2.3.0",
"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.0.tgz",
"integrity": "sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg=="
},
"type-fest": {
"version": "2.12.2",
"resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.12.2.tgz",
@@ -1265,6 +1370,12 @@
"integrity": "sha512-yNIatDa5iaofVozS/uQJEl3JRWLKKGJKh6Yaiv0GLGSuhpFJe7P3SbHZ8/yjAHRQwKRoA6YZqlfjXWmVzoVSMw==",
"dev": true
},
"universalify": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz",
"integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==",
"dev": true
},
"upath": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/upath/-/upath-2.0.1.tgz",
@@ -1284,6 +1395,17 @@
"rollup": "^2.59.0"
}
},
"vite-plugin-compression": {
"version": "0.5.1",
"resolved": "https://registry.npmjs.org/vite-plugin-compression/-/vite-plugin-compression-0.5.1.tgz",
"integrity": "sha512-5QJKBDc+gNYVqL/skgFAP81Yuzo9R+EAf19d+EtsMF/i8kFUpNi3J/H01QD3Oo8zBQn+NzoCIFkpPLynoOzaJg==",
"dev": true,
"requires": {
"chalk": "^4.1.2",
"debug": "^4.3.3",
"fs-extra": "^10.0.0"
}
},
"void-elements": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/void-elements/-/void-elements-3.1.0.tgz",
@@ -1512,6 +1634,14 @@
"resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
"integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
"dev": true
},
"zrender": {
"version": "5.3.1",
"resolved": "https://registry.npmjs.org/zrender/-/zrender-5.3.1.tgz",
"integrity": "sha512-7olqIjy0gWfznKr6vgfnGBk7y4UtdMvdwFmK92vVQsQeDPyzkHW1OlrLEKg6GHz1W5ePf0FeN1q2vkl/HFqhXw==",
"requires": {
"tslib": "2.3.0"
}
}
}
}
+2
View File
@@ -14,6 +14,7 @@
"axios": "^0.26.1",
"clipboard": "^2.0.10",
"copy-to-clipboard": "^3.3.1",
"echarts": "^5.3.2",
"element-plus": "^2.1.7",
"js-cookie": "^3.0.1",
"lodash": "^4.17.21",
@@ -35,6 +36,7 @@
"@vitejs/plugin-vue": "^2.3.0",
"typescript": "^4.5.4",
"vite": "^2.9.0",
"vite-plugin-compression": "^0.5.1",
"vue-tsc": "^0.29.8"
}
}
+50 -9
View File
@@ -18,20 +18,19 @@ const get_blog = (params: any) => {
})
}
const get_user_blogs = (params: Object) => {
const listAll = () => {
return request({
url: '/blog',
url: '/author/blog/list',
method: 'get',
params: params,
paramsSerializer: (params) => {
return Qs.stringify(params, { arrayFormat: 'repeat' })
},
headers: {
'Content-Type': 'application/json;charsetset=UTF-8'
}
})
}
const update_blog_type = (params: Object) => {
const updateBtName = (params: Object) => {
return request({
url: '/blog/update_blog_type',
url: '/author/blog/update_blog_type',
method: 'post',
headers: {
'Content-Type': 'application/json;charsetset=UTF-8'
@@ -51,5 +50,47 @@ const insert_blog_type = (params: Object) => {
})
}
const getContent = (id: string) => {
return request({
url: '/author/blog/' + id + '/content',
method: 'get',
headers: {
'Content-Type': 'application/json;charsetset=UTF-8'
}
})
}
export { get_blogs, get_blog, get_user_blogs, update_blog_type, insert_blog_type }
const newBlog = (params: Object) => {
return request({
url: '/author/blog/createContent',
method: 'post',
headers: {
'Content-Type': 'application/json;charsetset=UTF-8'
},
data: params
})
}
const updateContent = (params: Object) => {
return request({
url: '/author/blog/updateContent',
method: 'post',
headers: {
'Content-Type': 'application/json;charsetset=UTF-8'
},
data: params
})
}
const deleteContent = (params: string) => {
return request({
url: '/author/blog/delete/' + params,
method: 'get',
headers: {
'Content-Type': 'application/json;charsetset=UTF-8'
}
})
}
export { get_blogs, get_blog, listAll, updateBtName, insert_blog_type, getContent, newBlog, updateContent, deleteContent }
+8 -7
View File
@@ -1,14 +1,15 @@
type Blog = {
blog_id: string,
blog_type_id: string,
blog_type_name: string,
blog_title: string,
blog_prex: string
bid: string,
btId: string,
btName: string,
title: string,
blog_prex: string,
content: string
}
type BlogType = {
blog_type_id: string,
blog_type_name: string,
btId: string,
btName: string,
blog_list: Blog[]
}
+19 -31
View File
@@ -16,51 +16,40 @@ import { getToken, getUser } from './utils/auth'
import { User } from './entity/index'
const whiteList = ['/login']
let url = window.location.href
console.log(url)
if (url != 'http://localhost:3000/') {
// if(url.search("blog=") != -1) {
// let blog = {
// blog_id: url.split("=")[1]
// }
// router.push({
// path: '/feedback',
// query: blog
// })
// }
if (url.search("edit_blog=") != -1) {
let blog = {
blog_id: url.split("=")[1]
}
router.push({
path: '/BlogEditer',
query: blog
})
}
}
/**
* ルーター監視
* 1、トーケン取得
* 2、トーケンなし場合はログイン画面に遷移
* 3、トーケンあり場合:
*  既にログイン場合はデフォルト /  に遷移
*  
*/
router.beforeEach((to, from, next) => {
console.log(from.path, to.path)
const token = getToken()
if (typeof token === 'string') {
if (to.path === '/login') {
if (token) {
switch (to.path) {
case '/login':
next('/')
}
} else if (to.path === '/') {
break;
case '/':
const user = <User>(JSON.parse(getUser() as string))
console.log(user)
if (user) {
if (url.search("edit_blog") != -1) {
next('/BlogEditer')
} else {
router.push({
path: '/home',
query: user
})
}
} else {
break;
default:
next()
}
} else {
if (whiteList.includes(to.path)) {
next()
@@ -69,7 +58,6 @@ router.beforeEach((to, from, next) => {
}
}
})
+1 -2
View File
@@ -3,8 +3,7 @@ import { getToken } from '../utils/auth'
const service = axios.create(
{
baseURL: 'http://localhost:8081',
// baseURL: 'http://49.233.4.79:8081',
baseURL: import.meta.env.VITE_APP_URL as string,
timeout: 5000
}
)
+47 -35
View File
@@ -1,31 +1,29 @@
<template>
<div class="blog_editer">
<div class="tab_list">
<Tab :row_key="item.blog_type_id" :checked="handleCheck(item.blog_type_id)" :tab_text="item.blog_type_name"
checked_color="" over_color="" leave_color="" @on-click="saveType"
@click="onclickTypeTab(item.blog_type_id, index)" v-for="(item, index) in data_type_list">
<Tab :row_key="item.btId" :checked="handleCheck(item.btId)" :tab_text="item.btName" checked_color="" over_color=""
leave_color="" @on-click="saveType" @click="onclickTypeTab(item.btId, index)"
v-for="(item, index) in blog_type_list">
</Tab>
</div>
<div>
<Tab :row_key="item.blog_type_id" :checked="handleCheck(item.blog_type_id)" :tab_text="item.blog_type_name"
checked_color="" over_color="" leave_color="" @on-click="saveBlog"
@click="onclickBlogTab(item.blog_type_id, index)"
v-for="(item, index) in data_type_list[checkedIndex].blog_list">
<Tab :row_key="item.bid" :checked="handleCheck(item.bid)" :tab_text="item.title" checked_color="" over_color=""
leave_color="" @on-click="saveTitle" @click="onclickBlogTab(item.bid, index)"
v-for="(item, index) in blog_type_list[checkedIndex].blog_list">
</Tab>
</div>
<div>
<md-editor v-model="text" />
<md-editor v-model="blog_type_list[checkedIndex].blog_list[checkedBlogIndex].content" @save="saveContent" />
</div>
</div>
</template>
<script setup lang="ts">
import { reactive, ref } from 'vue';
import MdEditor from 'md-editor-v3';
import 'md-editor-v3/lib/style.css';
import { get_user_blogs } from '../../api/blog'
import { reactive, ref } from 'vue'
import MdEditor from 'md-editor-v3'
import 'md-editor-v3/lib/style.css'
import { Blog, BlogType } from '../../entity/index'
import { update_blog_type, insert_blog_type } from '../../api/blog'
import { updateBtName, updateContent, insert_blog_type, listAll } from '../../api/blog'
import Tab from '../../components/common/Tab.vue'
let text = ref<string>("")
@@ -36,34 +34,35 @@ type Tab = {
let type_tab = reactive<Tab>(<Tab>{
id: '1'
})
let blog_tab = reactive<Tab>(<Tab>{
id: '1'
})
let bid = ref("")
const data_type_list = reactive<BlogType[]>([])
let checkedIndex = ref<number>(0)
let checkedBlogIndex = ref<number>(0)
const blog_type_list = reactive<BlogType[]>([])
get_user_blogs({}).then(response => {
listAll().then(response => {
console.log(response)
response.data.forEach((element: any) => {
const blog_type: BlogType = {
blog_type_id: element.blog_type_id,
blog_type_name: element.blog_type_id,
btId: element.btId,
btName: element.btName,
blog_list: []
}
element.blog_list.forEach((item: any) => {
const blog: Blog = {
blog_id: item.blog_id,
blog_type_id: item.blog_type_id,
blog_type_name: item.blog_type_name,
blog_title: item.blog_title,
blog_prex: item.blog_prex
bid: item.bid,
btId: item.btId,
btName: item.btName,
title: item.title,
blog_prex: item.blog_prex,
content: item.content
}
blog_type.blog_list.push(blog)
});
blog_type_list.push(blog_type)
});
bid.value = blog_type_list[0].blog_list[0].bid
text.value = blog_type_list[0].blog_list[0].content
}).then(() => {
if (blog_type_list.length == 0) {
const data = {
@@ -72,8 +71,8 @@ get_user_blogs({}).then(response => {
insert_blog_type(data).then(response => {
if (response.data) {
blog_type_list.push({
blog_type_id: response.data.blog_type_id,
blog_type_name: response.data.blog_type_id,
btId: response.data.btId,
btName: response.data.btNmae,
blog_list: []
})
}
@@ -85,16 +84,28 @@ const handleCheck = (id: string) => {
}
const saveType = (params: any) => {
const query = {
blog_type_id: params.id,
blog_type_name: params.name
btId: params.id,
btName: params.name
}
update_blog_type(query).then(response => {
updateBtName(query).then(response => {
})
}
const saveBlog = (params: any) => {
console.log(params)
update_blog_type(1).then(response => {
const saveTitle = (params: any) => {
const query = {
bid: params.id,
title: params.name
}
updateContent(query).then(response => {
})
}
const saveContent = () => {
const query = {
bid: bid.value,
content: text.value
}
updateContent(query).then(response => {
})
}
@@ -103,7 +114,8 @@ const onclickTypeTab = (id: string, index: number) => {
type_tab.id = id
}
const onclickBlogTab = (id: string, index: number) => {
blog_tab.id = id
bid.value = id
checkedBlogIndex.value = index
}
</script>
+38 -3
View File
@@ -1,7 +1,12 @@
<template>
<el-button @click="openBlogEditer">++++++</el-button>
<el-button @click="openBlogEditer">进入博客小作坊</el-button>
<el-button @click="test">获取博客内容</el-button>
<el-button @click="test1">新增博客</el-button>
<el-button @click="test2">更新博客</el-button>
<el-button @click="test3">削除博客</el-button>
<div class="blog_list" v-for="item in data_list">
<h3 style="cursor: pointer;" @click="openBlog">{{ item.blog_title }}</h3>
<h3 style="cursor: pointer;" @click="openBlog">{{ item.title }}</h3>
<span style="font-size: 12px;">{{ item.blog_prex }}</span>
</div>
@@ -10,7 +15,7 @@
<script setup lang="ts">
import { reactive, ref } from 'vue';
import { get_blogs } from '../../api/blog'
import { get_blogs, getContent, newBlog, updateContent, deleteContent } from '../../api/blog'
import router from '../../router/index'
import { Blog, BlogType } from '../../entity/index'
@@ -42,6 +47,36 @@ const openBlogEditer = () => {
});
window.open(href, '_blank');
}
const test = () => {
getContent('123456').then(response => {
console.log(response)
})
}
const test1 = () => {
const params = {
blog_type_id: "2808000",
title: "dddddddd"
}
newBlog(params).then(response => {
console.log(response)
})
}
const test2 = () => {
const params = {
bid: "22222",
title: "22222222222",
content: "dddddddddddddddddddddddddddd"
}
updateContent(params).then(response => {
console.log(response)
})
}
const test3 = () => {
deleteContent('22222').then(response => {
console.log(response)
})
}
</script>
<style>
+4 -5
View File
@@ -1,16 +1,15 @@
import { defineConfig, loadEnv } from 'vite'
import vue from '@vitejs/plugin-vue'
import viteCompression from 'vite-plugin-compression';
// https://vitejs.dev/config/
// export default defineConfig({
// plugins: [vue()]
// })
// https://vitejs.cn/guide/env-and-mode.html#env-files
export default defineConfig(({ mode }) => {
const env = loadEnv(mode, __dirname)
return {
plugins: [
vue(),
// this is a gzip plugin to generate the .js.gz file
viteCompression()
],
base: env.VITE_RES_URL
}