可视化Demo(vue3+vite+ts+pinia+express)

1、项目简介

前端技术栈:vue3+vite+ts+pinia
后端技术栈:node+express
demo展示:
在这里插入图片描述

2、后端项目搭建

2.1、创建项目

创建一个node-project文件夹,再在里面创建一个index.ts文件

2.2、依赖安装

cd 进入node-project文件,安装相关依赖插件

npm install ts-node -g						(全局安装ts-node,因为在node环境下无法直接运行ts文件)
npm init -y									(生成一个package.json文件)
npm install @types/node -D					(安装node的声明文件)
npm install express -S
npm install @types/express -D				(安装express的声明文件)
npm install axios -S
tsc --init									(生成一个tsconfig.json配置文件)

2.3、编写index.ts代码

import express, {Express, Router, Request, Response, NextFunction} from 'express'
import axios from 'axios'

const app:Express = express()

app.use('*', (req:Request, res:Response, next:NextFunction) => {
  res.header('Access-Control-Allow-Origin', '*')
  next()
})

// express中Router的作用:
// 为了方便我们更好的根据路由去分模块。避免将所有的路由都写在入口文件中
const router:Router = express.Router()

app.use('/api', router)

// 编写一个简单的get请求接口
router.get('/list', async (req:Request, res:Response) => {
  const result = await axios.post('https://api.inews.qq.com/newsqa/v1/query/inner/publish/modules/list?modules=localCityNCOVDataList,diseaseh5Shelf')
  res.json({
    data: result.data
  })
})

// 开启一个服务,端口号为3333
app.listen(3333, () => {
  console.log('success serve http://localhost:3333')
})

2.4、项目启动

运行ts-node index.ts,启动后端项目
在这里插入图片描述

2.5、接口测试

postman中进行接口测试,数据返回成功
在这里插入图片描述

3、前端项目搭建

3.1、创建项目

运行 npm init vue@latest 搭建前端项目,并安装相关依赖
在这里插入图片描述

3.2、封装接口

在src下新建一个server文件夹,再新建一个index.ts文件,进行简单的接口请求封装

// src/server/index.ts
import axios from 'axios'

const server = axios.create({
  baseURL: 'http://localhost:3333'
})

export const getList = () => server.get('/api/list').then(res => res.data)

3.3、pinia数据处理

在pinia中进行接口请求数据的处理

import { defineStore } from 'pinia'
import { getList } from "@/server";
import type { RootObject } from "@/stores/type";

export const useStore = defineStore({
  id: 'list',
  state: () => ({
    list: <RootObject>{},
  }),
  actions: {
    async getList () {
      let { data } = await getList()
      this.list = data.data
    }
  }
})

3.4、测试接口数据

在App.vue中调用pinia中的getList方法,此时会发生跨域问题

<template>
  <div class="box"></div>
</template>

<script setup lang="ts">
import { useStore } from './stores/index'

const store = useStore()
store.getList()

</script>

在这里插入图片描述

3.5、跨域问题原因、处理

原因:
根据同源策略协议,想要不造成跨域问题,必须同协议、同域名、同端口。其中一个不同都会造成跨域问题。
由于后端服务端口为3333,而前端端口为3000,两者端口号不同造成了跨域问题。

处理方法:
处理跨域的方法有多种,此处我们用的是后端允许任何请求跨域(在2.2中已经书写,若缺失这段代码会出现跨域报错问题)

app.use('*', (req:Request, res:Response, next:NextFunction) => {
  res.header('Access-Control-Allow-Origin', '*')
  next()
})

3.6、地图引入及相关问题处理

3.6.1、echarts地图引入方式
// echarts4的引入方式
import echarts from 'echarts'
// echarts5需要把它的所有api导成一个对象引入
import * as echarts from 'echarts'
3.6.2、地图报错问题

输入地图的相关配置,但此时地图报错

<template>
  <div class="box">
    <div class="box-center" id="china" style="height: 600px; width: 600px"></div>
  </div>
</template>

<script setup lang="ts">
import { useStore } from './stores/index'
import * as echarts from 'echarts'
import {onMounted} from "vue";
// import './assets/china.js'

const store = useStore()

onMounted( async () => {
  await store.getList()
  initEcharts()
})

const initEcharts =  () => {
  let data = [
    {
      name: "内蒙古",
      value:[110.3467, 41.4899]
    },
  ]
  const charts = echarts.init(document.querySelector('#china') as HTMLElement)
  charts.setOption({
    geo: {
      // 缺少china对应的json地图数据
      map: "china",
      ...
    },
    series: [
      {
        type: "map",
        map: "china",
        ...
        data: data,
      },
      {
        type: 'scatter',
        coordinateSystem: 'geo',
        ...
        data: data,
      },
    ],
  })
}

</script>

在这里插入图片描述

3.6.3、地图报错问题分析及处理

报错显示缺少地图的相关json数据,我们引入以下china.js文件

(function(root, factory) {
  if (typeof define === 'function' && define.amd) {
    // AMD. Register as an anonymous module.
    define(['exports', 'echarts'], factory);
  } else if (typeof exports === 'object' && typeof exports.nodeName !== 'string') {
    // CommonJS
    factory(exports, require('echarts'));
  } else {
    // Browser globals
    factory({}, root.echarts);
  }
}(this, function(exports, echarts) {
  var log = function(msg) {
    if (typeof console !== 'undefined') {
      console && console.error && console.error(msg);
    }
  }
  if (!echarts) {
    log('ECharts is not Loaded');
    return;
  }
  if (!echarts.registerMap) {
    log('ECharts Map is not loaded')
    return;
  }
  echarts.registerMap('china', {
  ...
  })
}));

引入china.js后依旧报错,显示找不到echarts。
在这里插入图片描述
此时我们翻看china.js文件,发现它是以echarts4的方式引入,导致我们查找不到echarts。需要对china.js文件进行修改如下

import * as echarts from 'echarts'

echarts.registerMap('china', {
  ...
})

4、Json2TsInterface插件

下载途径:谷歌商店进行下载安装
功能:自动返回接口数据的类型规范
在这里插入图片描述

5、源码地址

可视化Demo地址

注:本项目不做任何商业用途,仅供个人练习使用

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Vue 3 是一种用于构建用户界面的 JavaScript 框架,Vite 是一个由 Vue.js 官方团队开发的新一代构建工具,而 TypeScript (TS) 是一个静态类型检查的 JavaScript 超集。Pinia 是一个基于 Vue 3 的状态管理库。 在使用 Vite 创建 Vue 3 项目时,你可以选择使用 TypeScript,这样可以让你的代码更加稳健和可维护。首先,你需要安装 Vite: ``` npm init vite@latest my-vue-project --template vue-ts ``` 这将创建一个名为 `my-vue-project` 的新项目,并使用 Vue 3 和 TypeScript 模板。 接下来,你可以安装 Pinia 来管理你的应用状态: ``` npm install pinia ``` 然后,在你的应用程序中引入 Pinia: ```typescript import { createApp } from 'vue' import { createPinia } from 'pinia' import App from './App.vue' const app = createApp(App) const pinia = createPinia() app.use(pinia) app.mount('#app') ``` 现在你可以在你的组件中使用 Pinia 来管理状态了。例如,创建一个 counter store: ```typescript import { defineStore } from 'pinia' export const useCounterStore = defineStore('counter', { state: () => ({ count: 0, }), actions: { increment() { this.count++ }, decrement() { this.count-- }, }, }) ``` 然后,在你的组件中使用这个 counter store: ```typescript <template> <div> <p>Count: {{ count }}</p> <button @click="increment">Increment</button> <button @click="decrement">Decrement</button> </div> </template> <script> import { useCounterStore } from './stores/counter' export default { name: 'Counter', setup() { const counterStore = useCounterStore() return { count: counterStore.count, increment: counterStore.increment, decrement: counterStore.decrement, } }, } </script> ``` 希望这可以帮助你开始使用 ViteVue 3、TypeScript 和 Pinia 创建应用程序!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值