手拉手带你用 vite2 + vue3 + elementPlus 做个博客尝尝鲜(二)

简介: 这里主要是体验一下 vite2 + vue3 做项目是什么样子的,重点在于 vite2 + vue3 方面的介绍,博客只是一个例子,所以博客的功能比较弱,只实现了几个最基本的功能。

管理类

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里面的代码。 把变化限制在最小的范围内


编码

设计好了之后可以动手编码了,先看一下文件结构:


文件结构

46.png

个人感觉还是比较清晰的。

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 实现的简易的状态管理。

相关文章
|
10天前
|
存储 JavaScript 前端开发
vue3的脚手架模板你真的了解吗?里面有很多值得我们学习的地方!
【10月更文挑战第21天】 vue3的脚手架模板你真的了解吗?里面有很多值得我们学习的地方!
vue3的脚手架模板你真的了解吗?里面有很多值得我们学习的地方!
|
14天前
|
API
vue3知识点:provide 与 inject
vue3知识点:provide 与 inject
28 4
vue3知识点:provide 与 inject
|
14天前
|
API
vue3知识点:readonly 与 shallowReadonly
vue3知识点:readonly 与 shallowReadonly
24 1
vue3知识点:readonly 与 shallowReadonly
|
7天前
|
JavaScript 前端开发 开发者
Vue 3中的Proxy
【10月更文挑战第23天】Vue 3中的`Proxy`为响应式系统带来了更强大、更灵活的功能,解决了Vue 2中响应式系统的一些局限性,同时在性能方面也有一定的提升,为开发者提供了更好的开发体验和性能保障。
20 7
|
8天前
|
前端开发 数据库
芋道框架审批流如何实现(Cloud+Vue3)
芋道框架审批流如何实现(Cloud+Vue3)
28 3
|
7天前
|
JavaScript 数据管理 Java
在 Vue 3 中使用 Proxy 实现数据双向绑定的性能如何?
【10月更文挑战第23天】Vue 3中使用Proxy实现数据双向绑定在多个方面都带来了性能的提升,从更高效的响应式追踪、更好的初始化性能、对数组操作的优化到更优的内存管理等,使得Vue 3在处理复杂的应用场景和大量数据时能够更加高效和稳定地运行。
26 1
|
7天前
|
JavaScript 开发者
在 Vue 3 中使用 Proxy 实现数据的双向绑定
【10月更文挑战第23天】Vue 3利用 `Proxy` 实现了数据的双向绑定,无论是使用内置的指令如 `v-model`,还是通过自定义事件或自定义指令,都能够方便地实现数据与视图之间的双向交互,满足不同场景下的开发需求。
26 1
|
10天前
|
前端开发 JavaScript
简记 Vue3(一)—— setup、ref、reactive、toRefs、toRef
简记 Vue3(一)—— setup、ref、reactive、toRefs、toRef
|
10天前
Vue3 项目的 setup 函数
【10月更文挑战第23天】setup` 函数是 Vue3 中非常重要的一个概念,掌握它的使用方法对于开发高效、灵活的 Vue3 组件至关重要。通过不断的实践和探索,你将能够更好地利用 `setup` 函数来构建优秀的 Vue3 项目。
|
13天前
|
JavaScript Java API
vue3知识点:setup
vue3知识点:setup
27 5