管理类
import webSQLHelp from '../store/websql-help' import { blog, blogForm, blogList, articleList, discuss, discussList } from './blogModel' import blogStateManage from '../model/blogState' // 连接数据库 const help = new webSQLHelp('vite2-blog', 1.0, '测试用的博客数据库') // =====================数据库============================== /** * 建立 vite2-blog 数据库,blog表、discuss表 * @returns 建立数据库和表 */ export const databaseInit = () => { help.createTable('blog', blog()) help.createTable('discuss', discuss()) } /** * 删除:blog表、discuss表 * @returns 删除表 */ export const deleteBlogTable = () => { help.deleteTable('blog') help.deleteTable('discuss') } /** * 博客的管理类 * @returns 添加、修改、获得列表等 */ export const blogManage = () => { // =====================博文============================== /** * 添加新的博文 * @param { object } blog 博文 的 model * @return {*} promise,新博文的ID */ const addNewBlog = (blog) => { return new Promise((resolve, reject) => { const newBlog = {} Object.assign(newBlog, blog, { addTime: new Date(), // 添加时间 viewCount: 0, // 浏览量 agreeCount: 0, // 点赞数量 discussCount: 0 // 讨论数量 }) help.insert('blog', newBlog).then((id) => { resolve(id) }) }) } /** * 修改博文 * @param { object } blog 博文 的 model * @return {*} promise,修改状态 */ const updateBlog = (blog) => { return new Promise((resolve, reject) => { help.update('blog', blog, blog.ID).then((state) => { resolve(state) }) }) } /** * 根据博文ID获取博文,编辑博文、显示博文用 * @param { number } id 博文ID * @returns */ const getArtcileById = (id) => { return new Promise((resolve, reject) => { help.getDataById('blog', id).then((data) => { if (data.length > 0) { resolve(data[0]) } else { console.log('没有找到记录', data) resolve({}) } }) }) } /** * 依据分组ID获取博文列表,编辑博文列表用。 * @param {number} groupId 分组ID * @returns */ const getBlogListByGroupId = (groupId) => { return new Promise((resolve, reject) => { help.select('blog', articleList(), {groupId: [401, groupId]}) .then((data) => { resolve(data) }) }) } // 状态管理 const { getBlogState } = blogStateManage() const blogState = getBlogState() /** * 依据状态,分页查询博文 * @returns 博文列表 */ const getBlogList = () => { // 根据状态设置查询条件和分页条件 const _query = blogState.findQuery || {} _query.state = [401, 2] // 显示发布的博文,设置固定查询条件 return new Promise((resolve, reject) => { help.select('blog', blogList(), _query, blogState.page).then((data) => { resolve(data) }) }) } const getBlogCount = () => { // 根据状态设置查询条件和分页条件 const _query = blogState.findQuery || {} _query.state = [401, 2] // 显示发布的博文,设置固定查询条件 return new Promise((resolve, reject) => { help.getCountByWhere('blog', _query).then((count) => { resolve(count) }) }) } // =====================讨论============================== /** * 添加一个新讨论 * @param {object}} discuss 讨论的model * @returns */ const addDiuss = (discuss) => { return new Promise((resolve, reject) => { const newDiscuss = {} Object.assign(newDiscuss, discuss, { addTime: new Date(), // 添加时间 agreeCount: 0 // 点赞数量 }) help.insert('discuss', newDiscuss).then((id) => { resolve(id) }) }) } /** * 依据博文ID获取讨论列表。 * @param {number} blogId 分组ID * @returns */ const getDiscussListByBlogId = (blogId) => { return new Promise((resolve, reject) => { help.select('discuss', discussList(), {blogId: [401, blogId]}) .then((data) => { resolve(data) }) }) } return { addDiuss, // 添加新讨论 getDiscussListByBlogId, // 依据博文ID获取讨论列表。 addNewBlog, // 添加 新博文 updateBlog, // 修改博文 getArtcileById, // 根据博文ID获取博文 getBlogListByGroupId, // 获取博文列表 getBlogList, // 获取博文列表 getBlogCount // 统计数量 } }
其实应该分成两个类,一个是博文的管理类,一个是讨论的管理类,以后还可以有分组的管理类。现在因为讨论相关的只有两个函数,所以就没有分开。
把需要的功能集中起来,便于管理和复用,减少组件里面的代码,也便于代码的升级更换。比如现在是把数据保存在前端的webSQL里面,那么以后要提交到后端怎么办?只需要在这里改代码即可,不需要修改xxx.vue里面的代码。 把变化限制在最小的范围内。
编码
设计好了之后可以动手编码了,先看一下文件结构:
文件结构
个人感觉还是比较清晰的。
config设置
import { defineConfig } from 'vite' import vue from '@vitejs/plugin-vue' // https://vitejs.dev/config/ export default defineConfig({ plugins: [vue()], base: '/vue3-blog/', // 修改发布网站的目录 build: { outDir: 'blog' // 修改打包的默认文件夹 } })
- base,设置发布网站的目录。
发布的时候默认项目会部署在网站根目录,如果不是根目录的话,可以使用 base 来更改。 - build.outDir 修改默认(dist)的构建输出路径。
其他设置方式可以看这里:https://cn.vitejs.dev/config/,内容非常多。
路由设置
src/router/index.js
import { createRouter, createWebHistory } from 'vue-router' import Home from '../views/home.vue' const routes = [ { path: '/', name: 'home', component: Home }, { path: '/write', name: 'write', component: () => import('../views/write.vue') }, { path: '/blogs/:id', name: 'blogs', props: true, component: () => import('../views/blog.vue') }, { path: '/groups/:groupId', name: 'groups', props: true, component: Home } ] const router = createRouter({ history: createWebHistory(), routes }) export default router
除了 createWebHistory 的参数要去掉之外,没啥变化。路由设置也很简单,只有首页、编写博文、博文详细、分组显示博文这四项。
网页入口
/index.html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8" /> <link rel="icon" href="/favicon.ico" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <title>vite2 + vue3 做的简单的个人博客</title> </head> <body> <div id="app"></div> <script type="module" src="/src/main.js"></script> </body> </html>
非常简洁,我们可以设置一个标题,用 type="module" 的方式加载入口js文件。其他的可以按照需要自行设置。
代码入口
/src/main.js
import { createApp, provide, reactive } from 'vue' import App from './App.vue' import router from './router' // 路由 // UI库 import ElementPlus from 'element-plus' import 'element-plus/lib/theme-chalk/index.css' import 'dayjs/locale/zh-cn' import locale from 'element-plus/lib/locale/lang/zh-cn' // Markdown 编辑插件 import VueMarkdownEditor from '@kangc/v-md-editor' import '@kangc/v-md-editor/lib/style/base-editor.css' import vuepressTheme from '@kangc/v-md-editor/lib/theme/vuepress.js' import '@kangc/v-md-editor/lib/theme/style/vuepress.css' VueMarkdownEditor.use(vuepressTheme) // markdown 显示插件 import VMdPreview from '@kangc/v-md-editor/lib/preview' import '@kangc/v-md-editor/lib/style/preview.css' // 引入你所使用的主题 此处以 github 主题为例 // import githubTheme from '@kangc/v-md-editor/lib/theme/github' VMdPreview.use(vuepressTheme) // 建立数据库 import { databaseInit, deleteBlogTable } from './model/blogManage' // deleteBlogTable() databaseInit() // 注入状态 import { blogState } from './model/blogState' const state = reactive(blogState) createApp(App) .provide('blogState', state) // 注入状态 .use(router) // 路由 .use(ElementPlus, { locale, size: 'small' }) // UI库 .use(VueMarkdownEditor) // markDown编辑器 .use(VMdPreview) // markDown 显示 .mount('#app')
这里的代码稍微有点长,除了常规操作外,还使用了 MarkdownEditor 用于编辑博文,这个部分代码有点多。
然后又加入了设计webSQL数据库的代码,以及自己用 provide 实现的简易的状态管理。