![](https://img-blog.csdnimg.cn/20201014180756922.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
Vue
文章平均质量分 71
浮游本尊
这个作者很懒,什么都没留下…
展开
-
Can‘t find Python executable “ python“, you can set the PYTHON env variable
右键“我的电脑”(win7系统有的显示是“计算机”)选择“属性”然后选择“高级系统设置”,弹出的“系统属性”界面,选择“高级”里面的“环境变量”的对话框在下面的“系统变量”中找到“Path”,然后点击“编辑”,将Python的安装目录“C:\Python27”填写进去,注意,两个路径之间是用“;”分号隔开的。输入之后点击“确定”即可。原创 2023-02-08 11:44:57 · 1935 阅读 · 0 评论 -
vue create is a Vue CLI 3 only command and you are using Vue CLI 2.9.6.
最近使用vue框架时报了一个错,vue create is a Vue CLI 3 only command and you are using Vue CLI 2.9.6.You may want to run the following to upgrade to Vue CLI 3:这是由于vue的版本存在更新,需要先卸载vue cli2,然后重新安装vue cli 3。原创 2023-02-08 11:34:50 · 2539 阅读 · 0 评论 -
Can‘t find Python executable “ python“, you can set the PYTHON env variable
出现如下情况报错Can‘t find Python executable “ python“, you can set the PYTHON env variable,说明axios所需的插件没有装上。原创 2023-02-08 11:30:50 · 445 阅读 · 0 评论 -
从源码解读vue生命周期
其实和回调是一个概念,当系统执行到某处时,检查是否有hook(钩子),有的话就会执行回调。通俗的说,hook就是在程序运行中,在某个特定的位置,框架的开发者设计好了一个钩子来告诉我们当前程序已经运行到特定的位置了,会触发一个回调函数,并提供给我们,让我们可以在生命周期的特定阶段进行相关业务代码的编写。总的来说,Vue的生命周期可以分为以下八个阶段这个钩子是new Vue()之后触发的第一个钩子,在当前阶段中data、methods、computed以及watch上的数据和方法均不能被访问。这个钩子在实例创建原创 2022-07-08 15:15:48 · 157 阅读 · 0 评论 -
你不知道的WebSocket
WebSocket是HTML5提供的一种浏览器与服务器进行全双工通讯的网络技术,属于应用层协议。它基于TCP传输协议,并复用HTTP的握手通道。浏览器和服务器只需要完成一次握手,两者之间就直接可以创建持久性的连接, 并进行双向数据传输。WebSocket 的出现就解决了半双工通信的弊端。它最大的特点是:服务器可以向客户端主动推动消息,客户端也可以主动向服务器推送消息。WebSocket原理 :客户端向 WebSocket 服务器通知(notify)一个带有所有接收者ID(recipients IDs)的事件原创 2022-07-08 15:14:47 · 127 阅读 · 0 评论 -
浅谈模块化
写这篇文章是因为最近在网上看了很多关于模块化的文章,所以进行总结。Js发展之初,只是为了解决基础的表单验证问题,以及基础的页面交互,代码非常简单,不存在模块化的概念和问题。但是随着ajax的发展,web进入2.0时代,Js成为一门应用非常广泛的语言。这个时候js作为一门嵌入型语言,劣势就展示出来了,没有一个权威的规范,问题总是要解决,在前端发展的这几十年,也就顺势而为的产生了很多的js规范。在最早的js中,想要实现分模块开发,最简单的就是函数,因为函数能形成一个相对封闭的空间,通过函数来实现简单的模块化也是原创 2022-07-08 15:13:17 · 636 阅读 · 0 评论 -
理解前端组件化、模块化、工程化
组件化:把重复的代码提取出来合并成为一个个组件,组件最重要的就是复用,位于框架最底层,其他功能都依赖于组件,可供不同功能使用,独立性强。组件化更多关注UI部分,每个组件有独立的HTML、css、js代码。可以根据需要把它放在页面的任意部位,也可以和其他组件一起形成新的组件。一个页面是各个组件的结合,可以根据需要进行组装。模块化:分属同一功能/业务的代码进行分装,让它成独立的模块,可以独立运行,以页面、功能或其他不同粒度划分程度不同的模块,位于业务框架层,模块间通过接口调用,目的是降低模块间的耦合,由之前的主原创 2022-07-08 15:12:30 · 3866 阅读 · 0 评论 -
如何搭建vue2项目
cli的配置文档链接 https://cli.vuejs.org/config/#typescriptvue是2.X版本 cli是4.0X版本下面需要使用的使用 空格 确定和取消TypeScript 支持使用 TypeScript 书写源码Progressive Web App (PWA) Support PWA 支持。Router 支持 vue-router 。Vuex 支持 vuex 。CSS Pre-processors 支持 CSS 预处理器。Linter / Formatter 支持代原创 2022-07-07 11:07:42 · 360 阅读 · 0 评论 -
微信小程序的底层架构原理,及如何做性能优化
小程序的渲染层和逻辑层分别由2个线程管理:(1)视图层:界面渲染相关的任务全都在 WebView 线程里执行。一个小程序存在多个界面,所以渲染层存在多个 WebView 线程。(2)逻辑层:采用 JsCore 线程运行JS脚本。视图层和逻辑层通过系统层的 WeixinJsBridage 进行通信:逻辑层把数据变化通知到视图层,触发视图层页面更新,视图层把触发的事件通知到逻辑层进行业务处理。把开发者的 JS 逻辑代码放到单独的线程去运行,但在 Webview 线程里,开发者就没法直接操作 DOM。那要怎么去实原创 2022-07-07 11:05:20 · 6617 阅读 · 0 评论 -
五分钟完全弄懂JS闭包
这里先来看一下闭包的定义,分成两个:在计算机科学中和在JavaScript中。在计算机科学中对闭包的定义(维基百科):闭包的概念出现于60年代,最早实现闭包的程序是 Scheme,那么我们就可以理解为什么JavaScript中有闭包:我们再来看一下MDN对JavaScript闭包的解释:那么我的理解和总结:如果我们编写了如下的代码,它一定是形成了闭包的:1、创建GO对象,创建全局执行上下文并压入执行上下文栈中注意:在此之前,是存在内存泄漏的,因为foo函数执行结束了,但是foo函数的AO对象并没有被销毁原创 2022-07-07 11:04:20 · 1269 阅读 · 0 评论 -
JS的内存管理
对于JavaScript来说,会在创建变量(对象,字符串等)时分配内存,并且在不再使用它们时“自动”释放内存,这个自动释放内存的过程称为垃圾回收。因为自动垃圾回收机制的存在,让大多Javascript开发者感觉他们可以不关心内存管理,所以会在一些情况下导致内存泄漏。不管什么样的编程语言,在代码的执行过程中都是需要给它分配内存的,不同的是某些编程语言需要我们自己手动的管理内存,某些编程语言会可以自动帮助我们管理内存:不管以什么样的方式来管理内存,内存的管理都会有如下的生命周期:不同的编程语言对于第一步和第三原创 2022-07-07 11:01:41 · 1281 阅读 · 0 评论 -
浏览器的工作原理与v8引擎
每次学习后,没多久就忘了,所以这次自己记录一下…JavaScript是一门高级的编程语言。那么有高级编程语言,就有低级编程语言,从编程语言发展历史来说,可以划分为三个阶段:但是计算机它本身是不认识这些高级语言的,所以我们的代码最终还是需要被转换成机器指令:那么javaScript代码在浏览器中是如何被执行的?首先当我们输入一个url,这时候我们向服务器发送http请求,服务器收到请求,会把我们请求的数据返回给我们,这个时候我们就接受到了服务器返回给我们的html页面,浏览器会把相应的css文件和js文件下原创 2022-07-07 10:57:54 · 205 阅读 · 0 评论 -
终止已被发出的请求
Axios :主流的、基于 XMLHttpReqeust、promise 的 HTTP 库如何实现 – cancelToken实现思路想要实现取消某个请求,我们需要为该请求配置一个 cancelToken ,然后在外部调用一个 cancel 方法。请求的发送是一个异步过程,最终会执行 xhr.send 方法,xhr 对象提供了 abort 方法,可以把请求取消。因为我们在外部是碰不到 xhr 对象的,所以我们想在执行 cancel 的时候,去执行 xhr.abort 方法。我们在 xhr 异步请求的过程原创 2022-07-07 10:55:47 · 859 阅读 · 0 评论 -
完成记录Completion Record
在控制台进行操作时,我们会发现, var 语句返回值为undefined,由此引发深思…我们在浏览器的控制台输入 abd = 2 时会打印 2,但是输入 var abd = 2 得到的结果却是 undefined,这是什么原因呢?普通语句执行后会得到 [[type]]值为normal的 Completion Record,所以普通语句执行完成之后就继续执行下一条,而只有表示式语句才会有 [[value]]值,不过这个[[value]]对于引擎执行逻辑来说没有什么用处,var语句执行得到的是一个[[vaue]原创 2022-07-07 10:54:28 · 136 阅读 · 0 评论 -
Vue3-CLI和Vite的使用
安装Vue CLI(目前最新的版本是v4.5.13)我们是进行全局安装,这样在任何时候都可以通过vue的命令来创建项目:npm install @vue/cli -g升级Vue CLI: 如果是比较旧的版本,可以通过下面的命令来升级:npm update @vue/cli -g通过Vue的命令来创建项目:vue create 项目的名称Vue CLI的运行原理Webpack是目前整个前端使用最多的构建工具,但是除了webpack之后也有其他的一些构建工具:比如rollup、parcel、gulp、vit原创 2022-07-07 10:53:28 · 2128 阅读 · 0 评论 -
devServer和VueCLI
目前我们开发的代码,为了运行需要有两个操作:这个过程经常操作会影响我们的开发效率,我们希望可以做到当文件发生变化时,可以自动的完成编译和展示;为了完成自动编译,webpack提供了几种可选的方式:webpack给我们提供了watch模式:如何开启watch呢?两种方式:这里我们选择方式二,在package.json的 scripts 中添加一个 watch 的脚本:webpack-dev-server上面的方式可以监听到文件的变化,但是事实上它本身是没有自动刷新浏览器的功能的:安装webpack-dev原创 2022-07-07 10:52:00 · 831 阅读 · 0 评论 -
markdown和富文本聚焦时改变边框的样式(wangEditor、mavon-editor)
首先说一下大致思路:wangEditor、mavon-editor聚焦时,需要给边框加样式,那么怎样才能知道目前是否是聚焦状态呢?这时候就需要了解两个东西:document.activeElement、document.hasFocusJavaScript中可以使用document.activeElement判断某一元素是否获取焦点。或使用hasFocus()方法检测文档内任一元素是否获取焦点。document.activeElementdocument.activeElement获取当前获得焦点的原创 2022-04-25 16:10:45 · 1191 阅读 · 0 评论 -
ES6生成器
什么是生成器?生成器是ES6中新增的一种函数控制、使用的方案,它可以让我们更加灵活的控制函数什么时候继续执行、暂停执行等。平时我们会编写很多的函数,这些函数终止的条件通常是返回值或者发生了异常。生成器函数也是一个函数,但是和普通的函数有一些区别:首先,生成器函数需要在function的后面加一个符号:*其次,生成器函数可以通过yield关键字来控制函数的执行流程:最后,生成器函数的返回值是一个Generator(生成器):生成器事实上是一种特殊的迭代器;MDN:Instead, they原创 2022-04-25 14:54:57 · 672 阅读 · 0 评论 -
ES6迭代器内容详解
什么是迭代器?迭代器(iterator),是确使用户可在容器对象(container,例如链表或数组)上遍访的对象,使用该接口无需关心对象的内部实现细节。其行为像数据库中的光标,迭代器最早出现在1974年设计的CLU编程语言中;在各种编程语言的实现中,迭代器的实现方式各不相同,但是基本都有迭代器,比如Java、Python等;从迭代器的定义我们可以看出来,迭代器是帮助我们对某个数据结构进行遍历的对象。在JavaScript中,迭代器也是一个具体的对象,这个对象需要符合迭代器协议(iterato原创 2022-04-24 09:59:06 · 261 阅读 · 0 评论 -
响应式原理的实现
什么是响应式自动响应数据变量的代码机制,我们就称之为是响应式的通过数据劫持和发布者-订阅者模式来实现。一旦发现属性发生改变就通知订阅者,触发相应的回调,来改变视图。一、Vue3响应式原理的实现下面的步骤是一步步推导,逐步实现出来的过程。第一步:响应式函数的封装// 响应式函数的封装const reactiveFns = []function watchFn(fn) { reactiveFns.push(fn)}const obj = { name: 'fuyou', age原创 2022-04-14 11:08:45 · 870 阅读 · 0 评论 -
柯里化函数
理解JavaScript纯函数函数式编程中有一个非常重要的概念叫纯函数,JavaScript符合函数式编程的范式,所以也有纯函数的概念;在react开发中纯函数是被多次提及的;比如react中组件就被要求像是一个纯函数(为什么是像,因为还有class组件),redux中有一个reducer的概念,也是要求必须是一个纯函数;所以掌握纯函数对于理解很多框架的设计是非常有帮助的;纯函数的维基百科定义:在程序设计中,若一个函数符合以下条件,那么这个函数被称为纯函数:此函数在相同的输入值时,需产生相同的原创 2022-04-11 12:12:16 · 823 阅读 · 0 评论 -
vue3组件化开发、全局与局部组件、父组件和子组件
组件化开发什么是组件化?人们面对复杂问题的处理方式:任何一个人处理信息的逻辑能力都是有限的。所以,当面对一个非常复杂的问题时,我们不太可能一次性搞定一大堆的内容。但是,我们可以将问题进行拆解。如果将一个复杂的问题,拆分成多个可以处理的小问题,再将其放在整体当中,就可以把大的问题解决。组件化也是类似的思想:如果我们将一个页面的所有的处理逻辑全部放在一起,处理起来会变得非常复杂,而且不利于后期的维护管理与扩展。但是如果,我们将一个页面拆分成一个个小的功能可,每个功能块完成属于自己这部分独原创 2022-04-07 10:40:52 · 1032 阅读 · 0 评论 -
TypeScript的泛型和模块化
一、泛型1.1 认识泛型软件工程的主要目的是构建不仅仅明确一致的API,还要让你的代码具有很强的可重用性,比如我们可以通过函数来封装一些API,通过传入不同的函数参数,让函数帮助我们完成不同的操作,但是对于参数的类型是否也可以参数化呢?什么是类型的参数化?我们来提一个需求:封装一个函数,传入一个参数并且返回这个参数。如果我们是TypeScript的思维方式,要考虑这个参数和返回值的类型需要一致:function add(num: number): number{ return num;}原创 2022-04-01 09:35:21 · 303 阅读 · 0 评论 -
TypeScript的类及接口
一、类我们知道类有三大特性:多态、继承、封装。类class的类型 本质上是一个函数; 类本身就指向自己的构造函数。一个类必须有constructor方法,如果没有显示定义,一个空的constructor方法会被默认添加我们在ES6的时候,实例属性都是定义在constructor()方法里面, 在ES7里 我们可以直接将这个属性定义在类的最顶层,其它都不变,去掉this;通过代码我们也可以发现,new类的时候就相当于new构造函数调用类上面的方法就是调用原型上的方法在类的实例上面调用方法,其实原创 2022-04-01 09:34:49 · 1071 阅读 · 0 评论 -
TypeScript的数据类型及函数
一、TS类型注解一种为变量添加类型约束的形式,(什么类型的变量,赋值什么类型的数据,否则会报错)语法类型:var/let/const 变量名:数据类型=值number和Number的区别?虽说在声明的时候,并不会进行报错,但是在设置数据类型注解的时候,尽量使用小写,大部分基本数据类型都是小写的,Number一般代表的是一个类ts中的变量的声明,注意变量名是否重复在ts中使用let声明的变量,会在全局的文件中进行查找,如果有重复的,该变量的声明就会报错(有波浪线),所以在ts文件中底部expor原创 2022-04-01 09:34:10 · 2015 阅读 · 0 评论 -
TypeScript的初步了解
如果有javascript基础,学习TypeScript其实并不难,写这篇文章的目的是记录一下学习ts的过程。因为老是学了之后,就容易忘,好记性不如烂笔头…ts的学习的必要性:新技术的出现都是为了解决原有技术的某个痛点,js很好,这是不可否认的,但它依然有它的不足。背景一、JavaScript的痛点并且随着近几年前端领域的快速发展,让JavaScript迅速被普及和受广大开发者的喜爱,借助于JavaScript本身的强大,也让使用JavaScript开发的人员越来越多。优秀的JavaScript没原创 2022-04-01 09:33:31 · 1152 阅读 · 0 评论 -
Vue项目打包部署总结
由于之前对前端部署上线这一套不清楚,所以这次通过查找多方资料总结一下。使用Vue作先后端分离项目时,一般前端是单独部署,用户访问的也是前端项目地址,所以前端开发人员颇有必要熟悉一下项目部署的流程与各种问题的解决办法了。Vue项目打包部署自己不复杂,不过一些前端可能对服务器接触很少,部署过程当中仍是会遇到这样那样的问题。下方主要描述的是使用nginx服务器代理前端项目的方法以及项目部署的相关问题,内容概览:一、准备工作——服务器和nginx使用1. 准备一台服务器使用linux系统,如果没有服务器,原创 2022-04-01 09:32:31 · 514 阅读 · 0 评论 -
vue3开发的基础语法
认识VueVue (读音 /vjuː/,类似于 view) 是一套用于构建用户界面的渐进式框架。全程是Vue.js或者Vuejs;什么是渐进式框架呢?表示我们可以在项目中一点点来引入和使用Vue,而不一定需要全部使用Vue来开发整个项目;目前Vue在前端处于什么地位?目前前端最流行的是三大框架:Vue、React、Angular。目前需要学习Vue3吗?在2020年的9月19日,万众期待的Vue3终于发布了正式版,命名为“One Piece”。它也带来了很多新的特性:更好的性能、更小的包原创 2022-03-24 11:50:39 · 1772 阅读 · 0 评论 -
this.$nextTick()的使用场景
应用场景需要在视图更新之后,基于新的视图进行操作。this.nextTick()方法主要是用在数据改变,dom改变应用场景中。vue中数据和dom渲染由于是异步的,所以,要让dom结构随数据改变这样的操作都应该放进this.nextTick()方法主要是用在数据改变,dom改变应用场景中。vue中数据和dom渲染由于是异步的,所以,要让dom结构随数据改变这样的操作都应该放进this.nextTick()方法主要是用在数据改变,dom改变应用场景中。vue中数据和dom渲染由于是异步的,所以,要让dom原创 2022-03-14 17:59:07 · 615 阅读 · 0 评论 -
Vue3搭建项目
写这篇文章,主要是因为我记性不太好,所以记录下来,方便以后查看,距离2020 年 9 月 19 号的发布,已经有一年多了,是时候可以学起来了。一、在开始之前,请确保已经正确安装了 node.js(1)如何检查是否安装了node.js在命令提示符面板中,输入命令:node -v,出现版本号即为已安装,如下图。(2)若未安装node.js下载地址 https://nodejs.org/en/download/,选择对应你系统的Node.js版本进行下载。安装步骤不再赘述,直接下一步、下一步,完成。原创 2022-03-14 17:57:26 · 5484 阅读 · 1 评论 -
nuxt与vue的区别
1、路由nuxt按照 pages 文件夹的目录结构自动生成路由http://localhost:3000/user/reg 相当于 去访问 pages文件夹 下的 user文件夹 下的 reg.vuevue需在 src/router/index.js 手动配置路由2、入口页面nuxt页面入口为 layouts/default.vue vue页面入口为 src/App.vue3、nuxt 类似 router-view , nuxt-link 类似 router-link4、webpack配置n原创 2022-03-09 09:54:42 · 11448 阅读 · 0 评论 -
用a-time-picker写一个时间范围选择器
起因使用过ant-design组件库的人基本都知道,它的time-picker组件并不像date-picker组件那样,支持时间范围选择。所以,这个时候就只能自己手动来写一个了。效果当都为空时可校验选择时如果先填写开始时间,则结束时间框前面置灰选择时如果先填写结束时间,则开始时间框后面置灰实现思路其中最关键的是如果限制时间范围不冲突,也就是开始时间一定要早于结束时间,其中包含时,分,秒这里可以利用原生组件的几个方法:这里因为只需要选择时和分,所以先只有时、分的选项进行验证。<原创 2021-11-01 15:09:32 · 3774 阅读 · 2 评论 -
输入URL到页面加载显示完成的过程及三次握手四次挥手
目录一个页面从输入URL到页面加载显示完成,这个过程中发生了什么1.浏览器补全URL地址2.向DNS查询IP地址3.得到IP地址后,建立连接,进行三次握手4.向该IP地址发送请求5.服务器在80端口接收请求,传送相应内容至浏览器6.浏览器解析内容,并继续搜索页面内是否有请求,有的话继续通过IP地址发送至服务器7.接受完从服务器发送至浏览器的内容之后,浏览器渲染网页,把网页内容呈献给用户8.客户端与服务端断开连接,进行四次挥手,每次断开连接前,客户端和服务端都要先进行四次对话才正式断开连接。什么是 TCP 连原创 2021-09-17 17:02:48 · 229 阅读 · 0 评论 -
vue控制台报错Duplicate keys detected: ‘xxxx‘. This may cause an update error.解决方案
vue项目中报了一个这样的错:vue.runtime.esm.js?2b0e:619 [Vue warn]: Duplicate keys detected: ‘47637’. This may cause an update error.虽然不影响使用,但是报错还是得解决的只要一进入该页面,就会出这个红色的错误,网上查了资料,说是v-for循环里,key值可能重复了,所以会报这个错。查看了下,页面果然有v-for循环<div class="b-border-item font12" v-f原创 2021-08-25 11:52:20 · 4085 阅读 · 0 评论 -
前端页面window.print()实现局部打印
近期在做一个需要局部打印页面考试成绩的功能,总体来说有两个思路:dom替换新窗口打印dom替换会导致事件失效,如果重新加载的话又会影响到体验;而新窗口缺因为样式问题也不好解决,都不满足项目的需求,于是把自己的方法贴上来:<template> <div id="printcontent"> //给需要打印的区域一个id <div @click="report">打印考试结果</div> </div></t原创 2021-08-01 12:09:42 · 1173 阅读 · 1 评论 -
vue的 this.$refs 打印为undefined解决办法
当前已收集的Linux安装包版本:段落引用Centos_x86_64(5、6、7、8)原创 2021-07-15 10:07:43 · 10780 阅读 · 2 评论 -
vue实现在页面上导出excel功能
最近需要做一个在页面上导出excel功能,之前以为是前端实现,后来发现有分页,所以让后端来导出会比较方便,下面来详细讲讲,前端导出和后端导出,前端这边该如何实现。一、在不调用后台接口的情况下,将json数据导出到excel表格,代码可直接使用。实现思路:通过将json遍历进行字符串拼接,将字符串输出到csv文件,代码如下:<template> <a-button type="primary" @click="tableToExcel">导出excel</a-butto原创 2021-07-13 15:42:39 · 1208 阅读 · 0 评论 -
nuxt如何配置
目录nuxt项目目录结构Nuxt.config.js配置模式如何选择-SPA/Universalplugins 属性配置区分发布环境,部署cdnnuxt项目目录结构|-- .nuxt // Nuxt自动生成,临时的用于编辑的文件,build|-- assets // 用于组织未编译的静态资源入LESS、SASS 或 JavaScript|-- components原创 2021-06-29 12:13:54 · 4220 阅读 · 1 评论 -
nuxt如何搭建项目
Nuxt.js 是一个基于 Vue.js 的通用应用框架。通过对客户端/服务端基础架构的抽象组织,Nuxt.js 主要关注的是应用的 UI 渲染。我们的目标是创建一个灵活的应用框架,你可以基于它初始化新项目的基础结构代码,或者在已有 Node.js 项目中使用 Nuxt.js。为了快速入门,Nuxt.js 团队创建了脚手架工具 create-nuxt-app。现在以nuxt.js@2.14版本为例,说明如何Nuxt创建项目的。确保安装了 npx(npx 在 NPM 版本 5.2原创 2021-06-24 17:27:22 · 1392 阅读 · 1 评论 -
vue实例生命周期详解
什么是生命周期Vue实例有一个完整的生命周期,也就是从开始创建、初始化数据、编译模板、挂载Dom、渲染→更新→渲染、卸载等一系列过程,我们称这是Vue的生命周期。通俗说就是Vue实例从创建到销毁的过程,就是生命周期。在Vue的整个生命周期中,它提供了一系列的事件,可以让我们在事件触发时注册js方法,可以让我们用自己注册的js方法控制整个大局,在这些事件响应方法中的this直接指向的是vue的实例。生命周期钩子生命周期钩子:就是生命周期事件的别名。生命周期钩子又叫生命周期函数 也叫生命周期事件。原创 2021-04-28 16:20:25 · 395 阅读 · 0 评论