手拉手带你用 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 实现的简易的状态管理。

相关文章
|
2月前
|
缓存 JavaScript UED
Vue3中v-model在处理自定义组件双向数据绑定时有哪些注意事项?
在使用`v-model`处理自定义组件双向数据绑定时,要仔细考虑各种因素,确保数据的准确传递和更新,同时提供良好的用户体验和代码可维护性。通过合理的设计和注意事项的遵循,能够更好地发挥`v-model`的优势,实现高效的双向数据绑定效果。
163 64
|
2月前
|
JavaScript 前端开发 API
Vue 3 中 v-model 与 Vue 2 中 v-model 的区别是什么?
总的来说,Vue 3 中的 `v-model` 在灵活性、与组合式 API 的结合、对自定义组件的支持等方面都有了明显的提升和改进,使其更适应现代前端开发的需求和趋势。但需要注意的是,在迁移过程中可能需要对一些代码进行调整和适配。
141 60
|
26天前
|
JavaScript API 数据处理
vue3使用pinia中的actions,需要调用接口的话
通过上述步骤,您可以在Vue 3中使用Pinia和actions来管理状态并调用API接口。Pinia的简洁设计使得状态管理和异步操作更加直观和易于维护。无论是安装配置、创建Store还是在组件中使用Store,都能轻松实现高效的状态管理和数据处理。
97 3
|
2月前
|
JavaScript 前端开发 API
从Vue 2到Vue 3的演进
从Vue 2到Vue 3的演进
86 17
|
2月前
|
JavaScript 前端开发 API
Vue.js响应式原理深度解析:从Vue 2到Vue 3的演进
Vue.js响应式原理深度解析:从Vue 2到Vue 3的演进
101 17
|
2月前
|
前端开发 JavaScript 测试技术
Vue3中v-model在处理自定义组件双向数据绑定时,如何避免循环引用?
Web 组件化是一种有效的开发方法,可以提高项目的质量、效率和可维护性。在实际项目中,要结合项目的具体情况,合理应用 Web 组件化的理念和技术,实现项目的成功实施和交付。通过不断地探索和实践,将 Web 组件化的优势充分发挥出来,为前端开发领域的发展做出贡献。
57 8
|
2月前
|
存储 JavaScript 数据管理
除了provide/inject,Vue3中还有哪些方式可以避免v-model的循环引用?
需要注意的是,在实际开发中,应根据具体的项目需求和组件结构来选择合适的方式来避免`v-model`的循环引用。同时,要综合考虑代码的可读性、可维护性和性能等因素,以确保系统的稳定和高效运行。
52 1
|
2月前
|
JavaScript
Vue3中使用provide/inject来避免v-model的循环引用
`provide`和`inject`是 Vue 3 中非常有用的特性,在处理一些复杂的组件间通信问题时,可以提供一种灵活的解决方案。通过合理使用它们,可以帮助我们更好地避免`v-model`的循环引用问题,提高代码的质量和可维护性。
58 1
|
2月前
|
JavaScript
在 Vue 3 中,如何使用 v-model 来处理自定义组件的双向数据绑定?
需要注意的是,在实际开发中,根据具体的业务需求和组件设计,可能需要对上述步骤进行适当的调整和优化,以确保双向数据绑定的正确性和稳定性。同时,深入理解 Vue 3 的响应式机制和组件通信原理,将有助于更好地运用 `v-model` 实现自定义组件的双向数据绑定。
|
2月前
|
存储 JavaScript 前端开发
vue3的脚手架模板你真的了解吗?里面有很多值得我们学习的地方!
【10月更文挑战第21天】 vue3的脚手架模板你真的了解吗?里面有很多值得我们学习的地方!
vue3的脚手架模板你真的了解吗?里面有很多值得我们学习的地方!