当前位置: 首页 > news >正文

vue开发-从源码开始解读一个智慧园区项目

High level

和之前阅读python项目源码顺序一样

  • 首先了解整体功能和大致结构
  • 然后试图跑通项目
  • 拆解逐步了解
  • 组装之后进行改变和迭代

本次我了解的是一个智慧园区的vue项目。但其实我开始看这个项目之前的前端基础为0,今天白天看了一下相关视频,昨天看了几个vue加flask,也没有js等基础。以下可能很多错误

Roadmap

首先入口是最外面的index.html

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <link rel="icon" type="image/svg+xml" href="/vite.svg" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>天垂智慧</title>
  </head>
  <body>
    <div id="app"></div>
    <script type="module" src="/src/main.js"></script>
  </body>
</html>

可以看到,其主要代码位于/src/main.js
然后就是src里,外部文件一个是main.js,一个是APP.vue

main.js主要是定义了一个app实例

import App from './App.vue'
const app = createApp(App)

所以,其实落在了APP.vue中

<template>
  <router-view />
</template>

<script setup></script>

然后就发现所有页面是通过route的方式组织在一起。
route和昨天刚刚入门的Flask的路由route应该是同样含义。
vue-routers是vue全家桶中的一个组件。在package.json中定义了其版本

"vue-router": "^4.1.5",

其好处

  • 让页面中的部分内容可以无刷新的跳转
  • 可以实现某些需要根据特定逻辑改变页面原本路由的需求

所以进入routes文件夹找到其中的index.js。虽然不能完全看懂,但起基本定义了整个页面的逻辑

// import operationRouter from './operation'

import { createRouter, createWebHashHistory } from 'vue-router'

// 引入物业管理相关的路由页面
import propertyRouter from './property'
//引入数据可视页面相关路由
import visualizationRouter from './visualization'
//引入配置中心页面相关路由
import configurationRouter from './configuration'

const manageroutes = [
       {
              path: '/',
              redirect: '/home'
          },

    {
        path: '/index',
        name: '/index',
        component: () => import('../layout/index.vue'),
        redirect: '/home',
        children: [
            {
                path: '/home',
                name: 'home',
                component: () => import('../views/home/home.vue'),
            },            
            {
                path: '/operation',
                name: 'operation',
                redirect: '/over',
                component: () => import('../views/operation/operation.vue'),
                children:[
                  //文章管理
                  {
                     path: '/article',
                     component: () => import('../views/operation/content/article.vue')
                  },
                  {
                     path: '/comment',
                     component: () => import('../views/operation/content/comment.vue')
                  },          
               ]
            },
        ]
    },

]

// 哈希路由
const router = createRouter({
    // 路由模式
    history: createWebHashHistory(),
    routes: manageroutes,
})
/**
 - 输出对象
 */
export default router;

routers文件夹中其他js文件定义了该页面相关路由。也就是整体逻辑其实是定义在这里的

那么,之后,我们再继续从细节页面中看。components文件夹定义了一些通用设计,导航栏中其他页面则有自己单独的页面位于views文件夹中

components
  • Echart百度开源的可视化
  • commonForm表单
  • header 头部信息,其中定义了click之后的跳转
  • pypaganition 表格换页?
  • operationTable 表格?
views
  • configuration导航中的配置中心
  • home 主页 -> 生产综合
  • operation 运营页-> 智慧应用
  • visualiation 可视化
    其中的子目录vue文件都位于views以上的子文件夹中

vue有个好处是,这个过程,我可以边修改边看效果。这方面比AI舒服多了,基本就像玩机械一样,调一调,注释一下,可以直接看到效果

继续下一步。例如智慧应用的文件,还是从外层开始

// 页面左侧菜单数据
export default{
  name:"operation",
  setup(){
      const menuData = reactive([
    {
      id: 2,
      authName: "预测性维护",
      children: [
        { id: 201, authName: "异常检测", path: "/article" },
        { id: 202, authName: "故障诊断", path: "/comment" },
      ],
    },
    {
      id: 3,
      authName: "视觉应用",
      children: [
        { id: 301, authName: "合同签订管理", path: "/contract" },
        { id: 302, authName: "客户信息管理", path: "/information" },
      ],
    },
    ]);
    const iconList = reactive([
      "Reading", 
      "Briefcase",
      "Avatar",
      "OfficeBuilding",
      "DocumentCopy"
    ]);
    return{
      menuData,
      iconList
    }
  }
}

const handleOpen = (key: string, keyPath: string[]) => {
  console.log(key, keyPath)
}
const handleClose = (key: string, keyPath: string[]) => {
  console.log(key, keyPath)
}

</script>

其中,定义了path,也就是跳转之后的页面,但奇怪一点是不知道为啥中间隔着的一层目录,不知道在哪设置能让程序直接找过去。应该是route文件夹里那些设置

修改

首先,根据我的计划,在预测性维护一页里,我需要前面一个图,下面一个表单。就从可视化那里看看搞一个图。从views里的可视化开始找

<el-menu-item index="AttractionAnalysis">
            <template #title>
              <el-icon><WarnTriangleFilled /></el-icon>
              <span>园区招商分析</span>
            </template>
          </el-menu-item>

从中可以看出,园区招商分析位于AttractionAnalysis,画图的仍位于script

import * as echarts from 'echarts'
   export default{
     mounted(){
         let myChart1=echarts.init(this.$refs.myChart1)
         let dataC1 = [250, 300, 160, 420, 550, 300,120,650,340,500];

let xData = ['1月', '2月','3月','4月','5月','6月','7月','8月','9月','10月',];

var fontColor = '#30eee9';
let a= {
 backgroundColor: 'rgba(1,2,34,0)',
 grid: {
     left: '10%',
     right: '6%',
     top: '10%',
     bottom: '20%',
 },
 legend: {
     data: ['a'],
     textStyle: {
         color: '#A9DDEE',
     },

     orient: 'horizontal',
     icon: 'rect',
     top: '5',
     right: '5%',
     itemGap: 10,
     itemWidth: 10,
     itemHeight: 7,
 },

 tooltip: {
     trigger: 'axis',
     axisPointer: {
         type: 'line',
         lineStyle: {
             color: '#57617B',
         },
     },
 },
 xAxis: {
     type: 'category',
     boundaryGap: false, //顶头显示
     axisLine: {
         show: true,
         lineStyle: {
             color: '#3585d5',
         },
     },

     axisTick: {
         show: false,
         // alignWithLabel: true,
         lineStyle: {
             color: '#3585d5',
         },
     },
     axisLabel: {
         fontSize: 10,
     },
     data: xData,
 },
 yAxis: {
     name: '%',
     type: 'value',
     axisLine: {
         show: true,
         lineStyle: {
             color: '#3585d5',
         },
     },
     splitLine: {
         show: false,
         lineStyle: {
             type: 'dotted',
             color: '#3585d5',
         },
     },
     axisTick: {
         show: false,
     },
     axisLabel: {
         fontSize: 10,
     },
     boundaryGap: false,
 },
 series: [
     {
         name: '项目',
         type: 'line',
         stack: '总量',
         smooth: true,
         symbol: 'none',
         showSymbol: true,
         symbolSize: 40,
         itemStyle: {
             normal: {
                 color: '#71bd27',
                 lineStyle: {
                     color: '#71bd27',
                     width: 3,
                 },
                 areaStyle: {
                     //color: '#94C9EC'
                     color: new echarts.graphic.LinearGradient(0, 1, 0, 0, [
                         {
                             offset: 0.4,
                             color: 'rgba(240, 250, 230,0.1)',
                         },
                         {
                             offset: 1,
                             color: 'rgba(240, 250, 230,0.9)',
                         },
                     ]),
                 },
             },
         },
       
         data: dataC1,
     },
 ],
};
myChart1.setOption(a)

以上部分移植到预测性维护里,但由于看不懂源码,乱往里加,总是出错,先加一点点

export default {
  // lx
mounted(){
  let myChart1=echarts.init(this.$refs.myChart1)
  let dataC1 = [250, 300, 160, 420, 550, 300,120,650,340,500];

},

也就是这里的mount,好像视频都没看到过mount还。加上去了代码,但是却没有显示画图。发现出了template和script外,还要增加一下style里定义显示大小

#myChart1{
          width: 100%;
          height: 160px;
   }

然后就出现了很丑的画面
在这里插入图片描述

相关文章:

  • 接入Twitter和Facebook分享踩坑记录
  • 这次主要的配置
  • 工作5年,没接触过高并发编程,这正常吗?
  • 【微信小程序】带你进入小程序的世界
  • 机器学习-线性回归 二维问题
  • 分享从零开始学习网络设备配置--2.1 交换机基本配置
  • 大数据ClickHouse进阶(九):ClickHouse的From和Sample子句
  • vue3 | HighCharts实战自定义封装之径向条形图
  • Web前端系列技术之Web APIs基础(从基础开始)③
  • 线段树基本操作——建树+单点修改+区间查询
  • python/php/java/nodejs通讯录管理系统vue+elementui
  • 【老生谈算法】matlab实现蒙特卡罗定积分源码——蒙特卡罗定积分
  • 卷积神经网络 - 从全连接层到卷积
  • selenium爬虫如何绕过反爬,看这一篇文章就足够了
  • c语言进阶:冒泡排序函数初步实现到逐步优化
  • [译] 理解数组在 PHP 内部的实现(给PHP开发者的PHP源码-第四部分)
  • go语言学习初探(一)
  • JS函数式编程 数组部分风格 ES6版
  • js写一个简单的选项卡
  • 阿里研究院入选中国企业智库系统影响力榜
  • 构建工具 - 收藏集 - 掘金
  • 汉诺塔算法
  • 聊聊hikari连接池的leakDetectionThreshold
  • 实战:基于Spring Boot快速开发RESTful风格API接口
  • 这几个编码小技巧将令你 PHP 代码更加简洁
  • [Shell 脚本] 备份网站文件至OSS服务(纯shell脚本无sdk) ...
  • FaaS 的简单实践
  • 大数据全解:定义、价值及挑战
  • 树莓派用上kodexplorer也能玩成私有网盘
  • ​力扣解法汇总946-验证栈序列
  • ( 10 )MySQL中的外键
  • (12)目标检测_SSD基于pytorch搭建代码
  • (java)关于Thread的挂起和恢复
  • (附源码)ssm考试题库管理系统 毕业设计 069043
  • (附源码)计算机毕业设计SSM智能化管理的仓库管理
  • (牛客腾讯思维编程题)编码编码分组打印下标题目分析
  • (三)终结任务
  • (一)硬件制作--从零开始自制linux掌上电脑(F1C200S) <嵌入式项目>
  • (转)Unity3DUnity3D在android下调试
  • (转)创业家杂志:UCWEB天使第一步
  • **Java有哪些悲观锁的实现_乐观锁、悲观锁、Redis分布式锁和Zookeeper分布式锁的实现以及流程原理...
  • .net core Swagger 过滤部分Api
  • .NET/C# 检测电脑上安装的 .NET Framework 的版本
  • .net分布式压力测试工具(Beetle.DT)
  • .Net高阶异常处理第二篇~~ dump进阶之MiniDumpWriter
  • .NET开源快速、强大、免费的电子表格组件
  • .NET学习全景图
  • @Conditional注解详解
  • @Repository 注解
  • []常用AT命令解释()
  • [51nod1610]路径计数
  • [BZOJ 3282] Tree 【LCT】
  • [BZOJ4554][TJOI2016HEOI2016]游戏(匈牙利)
  • [C#]winform部署yolov5-onnx模型
  • [codeforces]Checkpoints