ElementUI之首页导航与左侧菜单

news2024/11/25 16:20:31

目录

一、Mock

1.1 什么是Mock.js

1.2 安装与配置

1.2.1 安装mock.js

1.2.2 引入mock.js

1.3 mock.js使用

1.3.1 定义测试数据文件

1.3.2 mock拦截Ajax请求

1.3.3 界面代码优化

二、总线

2.1 定义

2.2 类型分类

2.3 前期准备

2.4 配置组件与路由关系

2.4.1 配置组件

2.4.2 配置路由关系

2.5 展示效果


一、Mock

1.1 什么是Mock.js

Mock.js 是一个用于生成模拟数据的 JavaScript 库。它可以用于前端和后端开发中,用于创建模拟的接口和数据,以便在开发和测试过程中进行使用。

主要特点和用途如下:

  1. 模拟数据:Mock.js 可以生成各种类型的模拟数据,包括数字、文本、布尔值、数组、对象等。这对于前端开发来说很有用,特别是在没有真实后端接口的情况下。

  2. 模拟接口:可以使用 Mock.js 模拟后端接口的返回数据,这样前端开发人员可以在后端接口尚未完成的情况下进行开发和调试。

  3. 丰富的语法:Mock.js 提供了丰富的语法来定义模拟数据的规则,包括但不限于随机数据、正则表达式、函数生成器等。

  4. 易于使用:Mock.js 使用简单,可以快速集成到现有的项目中,提供快速的模拟数据功能。

 Mock.js 在前端领域风靡的原因有几个:

  1. 模拟数据需求:在前端开发中,经常会遇到需要模拟数据的情况,尤其是在前后端分离的项目中,前端需要独立开发和调试。Mock.js 提供了一种简单而强大的方式来生成模拟数据,填补了前端开发过程中的这一需求。

  2. 提升开发效率:使用 Mock.js 可以快速生成各种类型的模拟数据,无需等待后端接口的完成,可以在前端开发阶段就开始工作。这样可以大大提升了开发效率。

  3. 减少依赖:Mock.js 可以让前端团队在没有实际后端接口的情况下独立进行开发。这减少了前后端开发的依赖性,使得两个团队可以更加独立地工作。

  4. 适应前后端分离:随着前后端分离开发模式的普及,前端需要在后端接口尚未完成时进行开发和调试。Mock.js 提供了一种理想的解决方案,可以帮助前端开发人员模拟出所需的数据。

  5. 丰富的功能:Mock.js 提供了丰富的语法和选项,可以满足各种各样的模拟数据需求,包括但不限于随机数据、正则表达式、函数生成器等。

  6. 社区支持:Mock.js 在前端社区中有着广泛的认可和支持,拥有活跃的社区维护和更新,这也使得它成为了前端开发者的首选工具之一。

1.2 安装与配置

1.2.1 安装mock.js

Win+R输入cmd打开命令提示符,执行以下命令进行mock.js安装,如下:

npm i mockjs -D

注:-D表示只在开发环境中使用。

package.json中有以下代码即安装成功,如下:

安装完成之后,我们需要引入mock.js。

1.2.2 引入mock.js

为了只在开发环境使用mock,而打包到生产环境时自动不使用mock,我们可以在config目录中的dev.env.jsprod.env.js做一个配置,如下:

dev.env.js:

'use strict'
const merge = require('webpack-merge')
const prodEnv = require('./prod.env')

module.exports = merge(prodEnv, {
  NODE_ENV: '"development"',
  MOCK: 'true'
})

prod.env.js:

'use strict'
module.exports = {
  NODE_ENV: '"production"',
  MOCK: 'false'
}

 main.js:

//开发环境下才会引入mockjs
process.env.MOCK && require('@/mock') 

到这里我们引入部分就完成了。

1.3 mock.js使用

1.3.1 定义测试数据文件

在src目录下新建一个mock包,在mock包下定义测试数据文件,目录如下:

 login-mock.js:

// const loginInfo = {
// 	code: -1,
// 	message: '密码错误'
// }

//使用mockjs的模板生成随机数据
const loginInfo = {
	'code|-1-0': 0,
	'message|3-10': 'msg'
}
export default loginInfo;

1.3.2 mock拦截Ajax请求

在src/mock目录下创建index.js,定义拦截路由配置,如下:

index.js:

import Mock from 'mockjs' //引入mockjs,npm已安装
import action from '@/api/action' //引入请求地址

//全局设置:设置所有ajax请求的超时时间,模拟网络传输耗时
Mock.setup({
	// timeout: 400  //延时400s请求到数据
	timeout: 200 - 400 //延时200-400s请求到数据
})

//引登陆的测试数据,并添加至mockjs
import loginInfo from '@/mock/json/login-mock.js'
let s1 = action.getFullPath('SYSTEM_USER_DOLOGIN')
Mock.mock(s1, "post", loginInfo)
// Mock.mock(s1, /post|get/i, loginInfo)

1.3.3 界面代码优化

由于此次展示无需用到后端代码,所以博主就将昨天前后端交互用到的后端代码给备注了,换上了正常前后端分离开发所用的mock.js代码,如下:

Login.vue:

<template>
	<div class="login-wrap">
		<el-form class="login-container">
			<h1 class="title">用户登录</h1>
			<el-form-item label="">
				<el-input type="text" v-model="username" placeholder="登录账号" autocomplete="off"></el-input>
			</el-form-item>
			<el-form-item label="">
				<el-input type="password" v-model="password" placeholder="登录密码" autocomplete="off"></el-input>
			</el-form-item>
			<el-form-item>
				<el-button type="primary" style="width:100%;" @click="doSubmit()">提交</el-button>
			</el-form-item>
			<el-row style="text-align: center;margin-top:-10px">
				<el-link type="primary">忘记密码</el-link>
				<el-link type="primary" @click="gotoRegister()">用户注册</el-link>
			</el-row>
		</el-form>
	</div>
</template>

<script>
  import axios from 'axios'
  import qs from 'qs'
export default {
  name: 'Login',
  data () {
    return {
      username: '',
      password: ''
    }
  },
  methods:{
    gotoRegister(){
      this.$router.push('/Register');
    },
    doSubmit(){
      let url = this.axios.urls.SYSTEM_USER_DOLOGIN;
      let params = {
        username: this.username,
        password: this.password
      };

      // axios.get(url, {
      //   params: params
      // }).then(r => {
      //   console.log(r);
      //   if (r.data.success) {
      //     this.$message({
      //       message: r.data.msg,
      //       type: 'success'
      //     });
      //   } else {
      //     this.$message.error(r.data.msg);
      //   }
      // }).catch(e => {
      // });

      axios.post(url,params).then(r => {
        console.log(r);
        // if (r.data.success) {
        //   this.$message({
        //     message: r.data.msg,
        //     type: 'success'
        //   });
        // } else {
        //   this.$message.error(r.data.msg);
        // }
        this.$message({
          message: r.data.message,
          type: r.data.code == 0 ? 'success' : 'error'
        });
      }).catch(e => {
      });
    }
  }
}
</script>


<style scoped>
	.login-wrap {
		box-sizing: border-box;
		width: 100%;
		height: 100%;
		padding-top: 10%;
    background-image: url('~@/assets/绿叶.jpg'); /* 使用背景图片的路径 */
		background-repeat: no-repeat;
		background-position: center right;
		background-size: 100%;
	}
.login-container {
	border-radius: 10px;
	margin: 0px auto;
	width: 350px;
	padding: 30px 35px 15px 35px;
	background: #fff;
	border: 1px solid #eaeaea;
	text-align: left;
	box-shadow: 0 0 20px 2px rgba(0, 0, 0, 0.1);
}

.title {
	margin: 0px auto 40px auto;
	text-align: center;
	color: #505458;
}
</style>

接着运行代码,测试结果如下:

二、总线

2.1 定义

在Java中,术语"总线"通常用于描述计算机体系结构或硬件架构中的概念。在计算机系统中,总线是一组物理线路或电子信道,用于传输数据、控制信号和地址信息在计算机内部的各个组件之间进行通信。

2.2 类型分类

总线在计算机体系结构中扮演了关键的角色,它连接了中央处理器(CPU)、内存、外部设备和其他组件,允许它们之间进行数据传输和交互。总线可分为三个主要类型:

  1. 数据总线(Data Bus):用于传输数据信息。它允许不同的设备(如CPU和内存)之间交换数据。

  2. 地址总线(Address Bus):用于指定内存或其他设备的物理地址。通过地址总线,CPU可以识别和访问特定的存储位置。

  3. 控制总线(Control Bus):用于传输控制信号,如读/写操作、时钟信号和中断信号等。控制总线控制计算机的各个部分相互之间的操作和同步。

总线的存在简化了计算机系统内部通信的复杂性。在Java中,虽然你不能直接控制硬件的总线,但你可以通过Java编程语言和相关的库和框架来与底层硬件进行交互和通信。

例如,在Java中,你可以使用网络编程库(如Java Socket)与其他计算机或设备进行数据通信;或者使用串口通信库(如RXTX)与外部设备进行串口通信。这些库和框架提供了抽象层,使得与硬件总线进行通信变得更加方便和易于实现。

2.3 前期准备

依需用到案例展示,我们需要用到三个组件和部分图片搭建页面,如下:

三个组件分别如下:

AppMain.vue:

<template>
	<el-container class="main-container">
		<el-aside v-bind:class="asideClass">
			<LeftNav></LeftNav>
		</el-aside>
		<el-container>
			<el-header class="main-header">
				<TopNav></TopNav>
			</el-header>
			<el-main class="main-center">Main</el-main>
		</el-container>
	</el-container>
</template>

<script>
	// 导入组件
	import TopNav from '@/components/TopNav.vue'
	import LeftNav from '@/components/LeftNav.vue'

	// 导出模块
	export default {
    components:{
      TopNav,LeftNav
    },
		data(){
      return{
          asideClass:'main-aside'
      }
    },
    created(){
      this.$root.Bus.$on('xxx',v=>{
        this.asideClass = v ? 'main-aside-collapsed' : 'main-aside';
      });
    }
	};
</script>
<style scoped>
	.main-container {
		height: 100%;
		width: 100%;
		box-sizing: border-box;
	}

	.main-aside-collapsed {
		/* 在CSS中,通过对某一样式声明! important ,可以更改默认的CSS样式优先级规则,使该条样式属性声明具有最高优先级 */
		width: 64px !important;
		height: 100%;
		background-color: #334157;
		margin: 0px;
	}

	.main-aside {
		width: 240px !important;
		height: 100%;
		background-color: #334157;
		margin: 0px;
	}

	.main-header,
	.main-center {
		padding: 0px;
		border-left: 2px solid #333;
	}
</style>

LeftNav.vue:

<template>
	<el-menu default-active="2" class="el-menu-vertical-demo" @open="handleOpen" @close="handleClose" background-color="#334157"
	 text-color="#fff" active-text-color="#ffd04b" :collapse="collapsed">
		<!-- <el-menu default-active="2" :collapse="collapsed" collapse-transition router :default-active="$route.path" unique-opened class="el-menu-vertical-demo" background-color="#334157" text-color="#fff" active-text-color="#ffd04b"> -->
		<div class="logobox">
			<img class="logoimg" src="../assets/img/logo.png" alt="">
		</div>
		<el-submenu index="1">
			<template slot="title">
				<i class="el-icon-location"></i>
				<span>导航一</span>
			</template>
			<el-menu-item-group>
				<template slot="title">分组一</template>
				<el-menu-item index="1-1">选项1</el-menu-item>
				<el-menu-item index="1-2">选项2</el-menu-item>
			</el-menu-item-group>
			<el-menu-item-group title="分组2">
				<el-menu-item index="1-3">选项3</el-menu-item>
			</el-menu-item-group>
			<el-submenu index="1-4">
				<template slot="title">选项4</template>
				<el-menu-item index="1-4-1">选项1</el-menu-item>
			</el-submenu>
		</el-submenu>
		<el-menu-item index="2">
			<i class="el-icon-menu"></i>
			<span slot="title">导航二</span>
		</el-menu-item>
		<el-menu-item index="3" disabled>
			<i class="el-icon-document"></i>
			<span slot="title">导航三</span>
		</el-menu-item>
		<el-menu-item index="4">
			<i class="el-icon-setting"></i>
			<span slot="title">导航四</span>
		</el-menu-item>
	</el-menu>
</template>
<script>
	export default {
		data(){
		  return{
		      collapsed:false
		  }
		},
    created(){
      this.$root.Bus.$on('xxx',v=>{
        this.collapsed = v;
      });
    }
	}
</script>
<style>
	.el-menu-vertical-demo:not(.el-menu--collapse) {
		width: 240px;
		min-height: 400px;
	}

	.el-menu-vertical-demo:not(.el-menu--collapse) {
		border: none;
		text-align: left;
	}

	.el-menu-item-group__title {
		padding: 0px;
	}

	.el-menu-bg {
		background-color: #1f2d3d !important;
	}

	.el-menu {
		border: none;
	}

	.logobox {
		height: 40px;
		line-height: 40px;
		color: #9d9d9d;
		font-size: 20px;
		text-align: center;
		padding: 20px 0px;
	}

	.logoimg {
		height: 40px;
	}
</style>

TopNav.vue:

<template>
	<!-- <el-menu :default-active="activeIndex2" class="el-menu-demo" mode="horizontal" @select="handleSelect" background-color="#545c64"
	 text-color="#fff" active-text-color="#ffd04b">
		<el-menu-item index="1">处理中心</el-menu-item>
		<el-submenu index="2">
			<template slot="title">我的工作台</template>
			<el-menu-item index="2-1">选项1</el-menu-item>
			<el-menu-item index="2-2">选项2</el-menu-item>
			<el-menu-item index="2-3">选项3</el-menu-item>
			<el-submenu index="2-4">
				<template slot="title">选项4</template>
				<el-menu-item index="2-4-1">选项1</el-menu-item>
				<el-menu-item index="2-4-2">选项2</el-menu-item>
				<el-menu-item index="2-4-3">选项3</el-menu-item>
			</el-submenu>
		</el-submenu>

		<el-menu-item index="3" disabled>消息中心</el-menu-item>
		<el-menu-item index="4"><a href="https://www.ele.me" target="_blank">订单管理</a></el-menu-item>
	</el-menu> -->
	<el-menu class="el-menu-demo" mode="horizontal" background-color="#334157" text-color="#fff" active-text-color="#fff">
		<el-button class="buttonimg">
			<img class="showimg" :src="collapsed?imgshow:imgsq" @click="doToggle()">
		</el-button>
		<el-submenu index="2" class="submenu">
			<template slot="title">超级管理员</template>
			<el-menu-item index="2-1">设置</el-menu-item>
			<el-menu-item index="2-2">个人中心</el-menu-item>
			<el-menu-item @click="exit()" index="2-3">退出</el-menu-item>
		</el-submenu>
	</el-menu>
</template>

<script>
	export default {
		data(){
		  return {
		      collapsed:false,
          imgshow:require('@/assets/img/show.png'),
          imgsq:require('@/assets/img/sq.png')
		  }
		}
    ,methods:{
      doToggle(){
        this.collapsed = ! this.collapsed;
        //this.$emit()
        //将是否折叠变量放入总线
        this.$root.Bus.$emit('xxx',this.collapsed);
      },
      exit(){
        this.$router.push("/");
      }
    }
	}
</script>

<style scoped>
	.el-menu-vertical-demo:not(.el-menu--collapse) {
		border: none;
	}

	.submenu {
		float: right;
	}

	.buttonimg {
		height: 60px;
		background-color: transparent;
		border: none;
	}

	.showimg {
		width: 26px;
		height: 26px;
		position: absolute;
		top: 17px;
		left: 17px;
	}

	.showimg:active {
		border: none;
	}
</style>

图片目录结构如下:

2.4 配置组件与路由关系

接下来就是要想让我们的组件能够成功展示,我们需要去配置他们路由的一些关系,如下,

2.4.1 配置组件

在router包下加入以下代码,如下:

import AppMain from '@/components/AppMain'
import LeftNav from '@/components/LeftNav'
import TopNav from '@/components/TopNav'

2.4.2 配置路由关系

在router包下加入以下代码,如下:

{
    path: '/AppMain',
    name: 'AppMain',
    component: AppMain,
    children: [
      {
        path: '/LeftNav',
        name: 'LeftNav',
        component: LeftNav
      },
      {
        path: '/TopNav',
        name: 'TopNav',
        component: TopNav
      }
    ]
  }]

main.js:

// The Vue build version to load with the `import` command
// (runtime-only or standalone) has been set in webpack.base.conf with an alias.
import Vue from 'vue'
//开发环境下才会引入mockjs
process.env.MOCK && require('@/mock')
// 新添加1
import ElementUI from 'element-ui'
// 新添加2,避免后期打包样式不同,要放在import App from './App';之前
import 'element-ui/lib/theme-chalk/index.css'

import App from './App'
import router from './router'

import axios from '@/api/http'
import VueAxios from 'vue-axios'

Vue.use(VueAxios,axios)
// 新添加3
Vue.use(ElementUI)
Vue.config.productionTip = false

/* eslint-disable no-new */
new Vue({
  el: '#app',
  router,
  data(){
    return{
      Bus:new Vue()
    }
  },
  components: { App },
  template: '<App/>'
})

2.5 展示效果

 展示代码效果如下:


最后使用ElementUI之首页导航与左侧菜单就到这里,祝大家在敲代码的路上一路通畅!

感谢大家的观看 !

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1040464.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

计算机毕业设计 基于微信小程序的校园商铺系统的设计与实现 Java实战项目 附源码+文档+视频讲解

博主介绍&#xff1a;✌从事软件开发10年之余&#xff0c;专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精…

2023 “华为杯” 中国研究生数学建模竞赛(A题)深度剖析|数学建模完整代码+建模过程全解全析

华为杯数学建模A题 当大家面临着复杂的数学建模问题时&#xff0c;你是否曾经感到茫然无措&#xff1f;作为2021年美国大学生数学建模比赛的O奖得主&#xff0c;我为大家提供了一套优秀的解题思路&#xff0c;让你轻松应对各种难题。 让我们一起看看研赛的A题呀&#xff01; …

络安全开发和音视频开发哪个方向更有前景?

网络安全开发和音视频开发哪个方向更有前景&#xff1f; 随着互联网和移动互联网的飞速发展&#xff0c;音视频应用已经成为人们日常生活和工作中不可或缺的一部分。 从视频会议、在线教育、直播、短视频到游戏&#xff0c;音视频技术的应用场景越来越广泛&#xff0c;市场需求…

面试必杀技:Jmeter性能测试攻略大全(第二弹)

1. JMeter介绍与安装 JMeter介绍 JMeter是Apache组织开发的基于Java的压力测试工具。具有开源免费、框架灵活、多平台支持等优势。除了压力测试外&#xff0c;JMeter也可以应用的接口测试上。JMeter下载、安装及启动 下载&#xff1a; 访问JMeter官网&#xff1a;https://j…

机器学习——seaborn实用画图方法简介

0、seaborn简介: 前言:下面的总结只是介绍seaborn有哪些方法和属性,至于具体使用,通过下面给出的名称稍作查找即可。重点应该关注本文介绍的seaborn的使用方法seaborn与机器学习的关系: 知识图谱 0.1、了解即可的知识: seaborn:在matplotlib的基础上画一些更好看的图,在…

快速排序与代码

快速排序&#xff08;Quicksort&#xff09;是一种常用的排序算法&#xff0c;它基于分治的思想。 时间复杂度&#xff1a;O&#xff08;nlogn&#xff09; 空间复杂度&#xff1a;O&#xff08;logn&#xff09; 快速排序的基本思想如下&#xff1a; 选择一个元素作为基准&a…

Android Jetpack组件架构 :LiveData的使用和原理

Android Jetpack组件架构&#xff1a; LiveDate的使用和原理 导言 继Lifecycle组件之后我们接下来要介绍的就是LiveDate组件&#xff0c;所谓LiveDate字面意思上就是有声明的数据&#xff0c;当数据有改动时该组件可以感知到这个操作并将该事件通知到其观察者&#xff0c;这样…

STM32单片机入门学习(四)-蜂鸣器

蜂鸣器接线 低平蜂鸣器&#xff0c;低电平发声&#xff0c;高电平不发声&#xff0c; 三个排针&#xff0c;VCC接3.3v&#xff0c;GND接地&#xff0c;I/O接A0口&#xff0c;如图&#xff1a; 蜂鸣器代码&#xff1a;响一秒停半秒 #include "stm32f10x.h" #includ…

SQL server 创建存储过程

SQL Server如何创建存储过程 存储过程&#xff1a; 可以理解为完成特定功能的一组 SQL 语句集&#xff0c;存储在数据库中&#xff0c;经过第一次编译&#xff0c;之后的运行不需要再次编译&#xff0c;用户通过指定存储过程的名字并给出参数&#xff08;如果该存储过程带有参数…

spring源码解析——IOC之自定义标签解析

概述 之前我们已经介绍了spring中默认标签的解析&#xff0c;解析来我们将分析自定义标签的解析&#xff0c;我们先回顾下自定义标签解析所使用的方法&#xff0c;如下图所示&#xff1a; 我们看到自定义标签的解析是通过BeanDefinitionParserDelegate.parseCustomElement(ele…

Neo4j-双向关系

概述 这是GraphAware中关于双向关系的解释。 网址链接Modelling Data in Neo4j: Bidirectional Relationships | GraphAware 定向关系 Neo4j中的关系必须有一个语义化的类型和方向。 没有方向关系是模棱两可的&#xff0c;上面A队打败B队&#xff0c;如果没有方向&#xff0c…

PTE深度了解(一)

目录 PTE模板开始大审查吗&#xff1f;我的模板还能用吗&#xff1f; 使用模版&#xff0c;不会额外扣你分 类型一&#xff08;前20秒说模版&#xff09; 类型二&#xff08;老实巴交&#xff09; 类型三&#xff08;就是都说简单句&#xff09; 1.查重复 2.增加内容分识…

算法经济:数据驱动的新智能世界

随着计算机技术和信息科学的发展&#xff0c;以及云计算、大数据、区块链、人工智能等先进技术的融合&#xff0c;一场关于“数据”的革命正在全球范围内蓬勃展开。这种现象被称为“算法经济”&#xff0c;它是以数据为驱动、算法为核心的新的经济形态。 首先&#xff0c;我们需…

代码随想录day49:动态规划part10

121.买卖股票的最佳时机 贪心&#xff1a; class Solution { public:int maxProfit(vector<int>& prices) {int low INT_MAX;int result 0;for (int i 0; i < prices.size(); i) {low min(low, prices[i]); // 取最左最小价格result max(result, prices[i…

Java抽象类、接口

1.抽象类 1.abstract修饰符可以用来修饰方法也可以修饰类,如果修饰方法,那么该方法就是抽象方法;如果修饰类那么该类就是抽象类。2.抽象类中可以没有抽象方法,但是有抽象方法的类一定要声明为抽象类3.抽象类,不能使用new关键字来创建对象,它是用来让子类继承的4.抽象方法,只有…

supervisor守护python进程报FATAL错 spawn error

出现问题 我们在使用supervisor守护使用虚拟python环境的时候可能会碰到如下的报错内容。 touchFish FATAL Exited too quickly (process log may have details)当我们使用sudo supervisorctl status查看这个进程的状态的时候&#xff0c;有可能还会返回包含一个spawn er…

小程序中如何导出会员卡的档案信息

对于医院、美容院等特殊商家&#xff0c;可能需要在给会员添加一些档案。例如今天客户是什么情况&#xff0c;做了什么服务&#xff0c;解决了什么问题。添加这些档案后&#xff0c;系统会保存这些信息&#xff0c;供下次来的时候使用&#xff0c;或者为商家日后做营销提供依据…

基于Java+SpringBoot+Vue+Element的OA系统的设计和实现

基于JavaSpringBootVueElement的OA系统的设计和实现 源码传送入口前言主要技术系统设计功能截图数据库设计代码论文目录订阅经典源码专栏Java项目精品实战案例《500套》 源码获取 源码传送入口 前言 在Internet高速发展的今天&#xff0c;我们生活的各个领域都涉及到计算机的…

Python3 如何实现 websocket 服务?

Python 实现 websocket 服务很简单&#xff0c;有很多的三方包可以用&#xff0c;我从网上大概找到三种常用的包&#xff1a;websocket、websockets、Flask-Sockets。 但这些包很多都“年久失修”&#xff0c; 比如 websocket 在 2010 年就不维护了。 而 Flask-Sockets 也在 2…

Linux文件出现“M-oM-;M-?” ^M 等情况

1、当在编辑linux系统的文件时&#xff0c;会出现如下情况&#xff1a; 解决方法&#xff1a;单个文件可以使用vim 进行修改&#xff0c;shift :&#xff0c; 然后 set nobomb 2、当文件出现每一行末尾^M的情况&#xff1a; 解决方法&#xff1a;使用vi的替换功能。启动vi&am…