首页 > 其他分享 >在Django+Vue3+GraphQL的Blog例子代码中引入Element-Plus UI Framework

在Django+Vue3+GraphQL的Blog例子代码中引入Element-Plus UI Framework

时间:2023-04-13 16:14:27浏览次数:48  
标签:Plus vue Element Blog Framework UI import router Django

Vue3的UI Framework中有Element-Plus、BalmUI、Quasar、PrimeVue、Ant Design Vue等UI Framework.

Element-Plus是Element-UI的Vue3版,Element-UI的使用人数的基数较大,Github上的Star数也较多,就选择了Element-Plus作为这个Blog项目的UI Framework.

UI Framework的好处就是提供了相较裸Html+CSS开发起来更好看和方便一些.

Element-Plus在国内有镜像站点,参看起来速度相对快一些. Element-Plus国内镜像站点.

代码可以从Github上取得https://github.com/magicduan/django_vue_graphql/releases/tag/base_0.2

配置Element-UI开发环境

如果在已有的项目中安装的用包管理器安装最方便了.

 npm install element-plus --save

由于对Element-Plus的组件的使用方法不是很熟练, 按照官网的说明我直接从Element-Plus提供的Vite的快速模版进行启动.

https://github.com/element-plus/element-plus-vite-starter

从Github上下载代码后展开,执行下列命令就可以启动一个Element-Plus的Demo服务了.

npm install
npm run dev

按照前一篇Blog例子代码, 修改vite.config.ts,加入端口配置,将Vue的端口设置为8080

export default defineConfig({
....
  server:{
    port:8080
  },
....

使用npm 安装vue-router、apollo-client

npm install vue-router@4
npm install --save graphql graphql-tag @apollo/client
npm install --save @vue/apollo-composable

 

迁移代码

由于是后安装的vue-router,缺省的vue-router 没有设置, 建立与Frontend相同的目录

src/router
src/views

将Blog项目中的Frontend中相关的代码Copy进入对应目录

src/router/index.ts
src/views/AllPosts.vue
src/views/AuthorView.vue
src/views/PostsByTag.vue
src/views/PostView.vue
src/componets/AuthorLink.vue
src/componets/PostLis.vue

修改顶部菜单BaseHeader.vue

Element-UI模版提供的是顶菜单+左工具栏的UI模版, src/compoments/layout/BaseHeader.vue 为顶部菜单, BaseSide.vue为左边菜单.

这里我们修改BaseHeader.vue,修改后菜单项为

MyBlog --> HomeView.vue
Posts 
   All Posts --> All Posts
   Add Post //将来实现
   Delete Post//将来实现
Tag ->根据Backend端的取得Tag的种类动态生成Tag菜单
HelloWord -->对应原Element-UI的Helloworld的例子

由于需要根据BackEnd端的Tag查询结果动态生成Tag,我们为BaseHeader.vue加入Props :tagItems

Baseheader.vue代码具体修改如下:

<script setup lang="ts" >
import { toggleDark } from '~/composables';
import { ref } from 'vue';
const props = defineProps({
  tagItems:{type:Array,required:true, default:[]}
})

const msg = ref("/hello/\"Hello Vue 3.0 + Element Plus + Vite\"")

</script>
<template>
  <el-menu class="el-menu-demo" mode="horizontal" :router= true>
    <el-menu-item index="/">My Blog</el-menu-item>
    <el-sub-menu index="2">
      <template #title>Posts</template>
      <el-menu-item index="/posts">All Posts</el-menu-item>
      <el-menu-item index="2-1">Add Post</el-menu-item>
      <el-menu-item index="2-2">Delete Post</el-menu-item>
      <el-sub-menu index="2-4">
        <template #title>...</template>
        <el-menu-item index="2-4-1">item one</el-menu-item>
        <el-menu-item index="2-4-2">item two</el-menu-item>
        <el-menu-item index="2-4-3">item three</el-menu-item>
      </el-sub-menu>
    </el-sub-menu>

    <el-sub-menu v-if="tagItems.length" index="tags" >
      <template #title>Tags</template>
      <el-menu-item v-for="tagInfo in tagItems" :index="tagInfo.path">
        {{ tagInfo.name }}
      </el-menu-item>
    </el-sub-menu>
    <el-menu-item v-else :index="tags" disabled>Tags</el-menu-item>

    <el-menu-item :index="msg" >HelloVue</el-menu-item>

    <el-menu-item h="full" @click="toggleDark()">
      <button class="border-none w-full bg-transparent cursor-pointer" style="height: var(--ep-menu-item-height);">
        <i inline-flex i="dark:ep-moon ep-sunny" />
      </button>
    </el-menu-item>
  </el-menu>
</template>

 其中需要注意的几点:

  • 将菜单项与vue-router结合起来,菜单项的index属性为router/index.ts中设置的URL path, 需要设置el-menu
    :router= true
  • HelloWorld.vue 其中需要属性msg,为了在菜单中进行配置,我们需要在index.ts中将HelloWord.vue的URL的prop设置为true
  
const router = createRouter({
...  
    {
      path: '/hello/:msg',
      name: 'HellowWorld',
      component: () => import("../components/HelloWorld.vue"),
      props: true  
    },
...

将HelloWorld.vue Component的Prop属性作为参数来传递

修改App.vue

在App.vue中加入从Backend通过GraphQL取Tags的代码, 将Tags数组传递给BaseHeader.vue,将<HelloWord .../>改为<routerview/>

<script setup lang="ts">
import HomeView from './views/HomeView.vue';
import HelloWorld from './components/HelloWorld.vue';
import gql from 'graphql-tag';
import { useQuery } from '@vue/apollo-composable';
import { computed } from '@vue/reactivity';

const {result,loading,error} =  useQuery(gql`
  query getTags{
    tags {
          name
    }
  }
`)

const tags = computed(()=>{
  let tagsArray = []
  if (result.value){
    result.value?.tags.forEach(tagName => {
      let tagInfo = {path:"/tag/"+tagName.name,name:tagName.name}
      tagsArray.push(tagInfo)
    });
  }
  return tagsArray

})

</script>
<template>
  <el-config-provider namespace="ep" >
    <BaseHeader :tagItems="tags"/>
    <div style="display: flex">
      <BaseSide />
      <div>
        <!-- <HelloWorld msg="Hello Vue 3.0 + Element Plus + Vite" @changeTags ='changTags'/>  -->
        <RouterView/> 
      </div>
    </div>
  </el-config-provider>
</template>

<style>
#app {
  text-align: center;
  color: var(--ep-text-color-primary);
}

.element-plus-logo {
  width: 50%;
}
</style>

在Backend中加入Tags的查询

backend/blog/scheme/py

class Query(graphene.ObjectType):
    ....
    tags = graphene.List(TagType)
    .....
    def resolve_tags(root,info):
        return (
            models.Tag.objects.all()
        )

 

修改main.ts加入router,Apollo相关的代码

import { DefaultApolloClient } from '@vue/apollo-composable'
import { ApolloClient, createHttpLink, InMemoryCache } from '@apollo/client/core'

// HTTP connection to the API
const httpLink = createHttpLink({
  uri: 'http://localhost:8000/graphql',
})

// Cache implementation
const cache = new InMemoryCache()

// Create the apollo client
const apolloClient = new ApolloClient({
  link: httpLink,
  cache,
})

const app = createApp({
    setup () {
      provide(DefaultApolloClient, apolloClient)
    },
  
    render: () => h(App),
  })

app.use(router)

 

至此blog相关的代码迁移完成, 可以完成Posts List等操作了,但是页面相对不太好看,下一步我们使用Element-UI的控件进行对应改造即可.

使用Element-UI改造Posts等相关的Vue

在技术打通之后,UI的改造就是细心+审美的工作了,按照我自己的意思进行了修改,具体的修改就不赘述了,直接参考代码即可.

 

标签:Plus,vue,Element,Blog,Framework,UI,import,router,Django
From: https://www.cnblogs.com/magicduan/p/17315028.html

相关文章

  • No qualifying bean of type ‘org.springframework.transaction.PlatformTransaction
    今天在ssm项目中遇到一个问题Noqualifyingbeanoftype'org.springframework.transaction.PlatformTransactionManager'available:expectedsinglematchingbeanbutfound2:这个问题产生的原因在于项目中配置了多个数据源,而代码中启用了事务@Transactional注解,导致事......
  • 【D02】Bootstrap免费精选模板推荐,附上Django中使用模板教程
    前端模板-AnchorUIKIT前言今天介绍一款制作精良、开源、免费的Bootstrap模板——AnchorUIKIT该模板使用的是Bootstrapv4版本本文将介绍如何在Django中导入该模板的静态资源包并使用介绍官方文档Anchor-afreeBootstrapUIKit(bootcss.com)预览官方文档......
  • django admin 自定义添加单独行 增加数据统计功能
    需求:需要在某个页面单独增加一行,以便统计这一行的金额进行汇总显示,具体操作如下不建议直接修改change_list.html,所以扩展template admin.py中对应的admin.ModelAdmin中添加:#1.如果你改了template的名称,这里可以对应修改,否则默认即可change_list_template='admin/chang......
  • django 1.8 官方文档翻译:2-1-1 模型语法
    模型模型是你的数据的唯一的、权威的信息源。它包含你所储存数据的必要字段和行为。通常,每个模型对应数据库中唯一的一张表。基础:每个模型都是django.db.models.Model的一个Python子类。模型的每个属性都表示数据库中的一个字段。Django提供一套自动生成的用于数据库访问的API;详......
  • django 1.8 官方文档翻译: 2-6-2 遗留的数据库
    Django文档协作翻译小组人手紧缺,有兴趣的朋友可以加入我们,完全公益性质。交流群:467338606将遗留数据库整合到Django虽然Django最适合用来开发新的应用,但也可以将它整合到遗留的数据库中。Django包含了很多工具,尽可能自动化解决这类问题。这篇文章假设你了解Django的基础部分,它们在......
  • django 1.8 官方文档翻译: 3-1-2 编写视图
    Django文档协作翻译小组人手紧缺,有兴趣的朋友可以加入我们,完全公益性质。交流群:467338606编写视图一个视图函数,或者简短来说叫做视图,是一个简单的Python函数,它接受web请求,并且返回web响应。响应可以是一张网页的HTML内容,一个重定向,一个404错误,一个XML文档,或者一张图片…是任何东......
  • django 1.8 官方文档翻译: 2-6-3 提供初始数据
    Django文档协作翻译小组人手紧缺,有兴趣的朋友可以加入我们,完全公益性质。交流群:467338606为模型提供初始数据当你首次建立一个应用的时候,为你的数据库预先安装一些硬编码的数据,是很有用处的。有几种方法可以让Django自动创建这些数据:你可以通过fixtures提供初始数据,或者提供一个......
  • django 1.8 官方文档翻译: 2-6-4 数据库访问优化
    Django文档协作翻译小组人手紧缺,有兴趣的朋友可以加入我们,完全公益性质。交流群:467338606数据库访问优化Django的数据库层提供了很多方法来帮助开发者充分的利用他们的数据库。这篇文档收集了相关文档的一些链接,添加了大量提示,并且按照优化数据库使用的步骤的概要来组织。性能优先......
  • django 1.8 官方文档翻译: 3-4-2 内建显示视图
    Django文档协作翻译小组人手紧缺,有兴趣的朋友可以加入我们,完全公益性质。交流群:467338606基于类的内建通用视图编写Web应用可能是单调的,因为你需要不断的重复某一种模式。Django尝试从model和template层移除一些单调的情况,但是Web开发者依然会在view(视图)层经历这种厌烦。Django......
  • django 1.8 官方文档翻译: 4-2-4 人性化
    Django文档协作翻译小组人手紧缺,有兴趣的朋友可以加入我们,完全公益性质。交流群:467338606django.contrib.humanize一系列Django的模板过滤器,有助于向数据添加“人文关怀”。把’django.contrib.humanize’添加到INSTALLED_APPS设置来激活这些过滤器。执行以上步骤之后,在模板中使......