easypan前端学习

news2024/11/19 1:29:31

文章目录

  • 前端项目
    • node 版本
    • node镜像
    • 构建项目
      • 创建项目
      • 安装项目所有依赖
    • 图片资源网站
    • encodeURI & decodeURI
    • app.config.globalProperties与getCurrentInstance
    • Object.assign
    • vue-cookies
      • 安装vue-cookies
    • 使用vue-cookies
    • router.currentRoute
    • preserve log
    • import.meta.env
    • Request.js
    • 热更新问题
    • vue3动态组件
    • vuex4命名空间
    • 二级菜单界面控制
    • defineExpose暴露组件的方法
    • 图片url加随机数,防止浏览器缓存
    • Table封装,slot相关
      • Table.vue
      • FileList.vue
    • vue3样式穿透
    • prop单向数据流
    • ref引用组件或dom 与 v-if/show
    • @mouseenter & @mouseleave监听鼠标移入移出事件
    • el-table和el-input在一起,获取焦点方法失效问题
    • 路由子组件通知父组件实现
      • 可以使用provide/inject的机制
        • Framework.vue
        • Main.vue
      • 可以直接在<router-view @kk="kk"/>绑定事件监听
        • Framework.vue
        • Main.vue
      • 可以使用\<router-view />的组件写法
        • Framework.vue
        • Main.vue
    • el-popver 点击触发和使用方法触发
    • 文件上传逻辑转移

前端项目

node 版本

v16.20.0
node历史下载地址:https://nodejs.org/download/release/v16.20.0/

node镜像

npm config get registry
# 返回: https://registry.npmmirror.com/
# 如果不是这个那么设置镜像 
# npm config set registry https://registry.npmmirror.com

构建项目

创建项目

npm init vite@latest easypan-front

安装项目所有依赖

npm install 
@highlightjs/vue-plugin
@moefe/vue-aplayer
aplayer 
axios 
docx-preview 
dplayer 
element-plus 
highlight.js 
js-md5 
sass 
sass-loader 
spark-md5 
vue-clipboard3 
vue-cookies 
vue-pdf-embed 
vue-router 
vue3-pdfjs 
xlsx 
--save

图片资源网站

可以免费下载图片: undraw

encodeURI & decodeURI

encodeURI()、encodeURIComponent()区别及使用场景

# 输出:http://www.baidu.com?query=a%201&car4(%5E
encodeURI('http://www.baidu.com?query=a 1&car4(^') 

# 输出:http://www.baidu.com?query=a 1&car4(^
decodeURI('http://www.baidu.com?query=a%201&car4(%5E')

app.config.globalProperties与getCurrentInstance

// 挂载到全局
app.config.globalProperties.Request = Request

// 使用
import { getCurrentInstance } from "vue";

const {proxy} = getCurrentInstance()

proxy.Request(..)

Object.assign

Object.assign详解

vue-cookies

vue-cookies使用方法,vue中使用获取cookie

安装vue-cookies

npm i vue-cookies -D

使用vue-cookies

import VueCookies from 'vue-cookies'

// 存入
// 		其实存入的时候就是 encodeURIComponent(JSON.stringify({'nickName':'zzhua'}))
// 		可以使用JSON.parse(decodeURIComponent(encodeURIComponent(JSON.stringify({'nickName':'zzhua'})))) 解析出来
VueCookies.set('userInfo', {'nickName':'zzhua'})

// 获取
let userInfo = VueCookies.get('userInfo')

// 移除
VueCookies.remove('userInfo')

// 获取所有的key
VueCookies.keys()

// cookie中是否存在指定的key
VueCookies.isKey()

// httpOnly默认为true打对号√情况下,禁止javascript操作cookie,导致获取不到,可以让后端设置false;

router.currentRoute

获取当前的路由

preserve log

可以在浏览器的控制台勾选preserve log,在页面跳转时,可以保留记录页面跳转前的请求

import.meta.env

vue3+vite中开发环境与生产环境全局变量配置指南

Request.js

axios的response.config是什么(就是请求的时候传入的配置对象)
& response.config.responseType & axios的request中的config配置自定义属性(都是同一个config,并且可以手动往里面设置自定义属性)

axios的onUploadProgress

import axios from 'axios'

import { ElLoading } from 'element-plus'
import router from '@/router'

import Message from '../utils/Message'

const contentTypeForm = 'application/x-www-form-urlencoded;charset=UTF-8'
const contentTypeJson = 'application/json'
//arraybuffer	ArrayBuffer对象
//blob	Blob对象
//document	Documnet对象
//json	JavaScript object, parsed from a JSON string returned by the server
//text	DOMString
const responseTypeJson = "json"

let loading = null;
const instance = axios.create({
    baseURL: '/api',
    timeout: -1,
});
//请求前拦截器
instance.interceptors.request.use(
    (config) => {
        if (config.showLoading) {
            loading = ElLoading.service({
                lock: true,
                text: '加载中......',
                background: 'rgba(0, 0, 0, 0.0)',
            });
        }
        return config;
    },
    (error) => {
        if (config.showLoading && loading) {
            loading.close();
        }
        Message.error("请求发送失败");
        return Promise.reject("请求发送失败");
    }
);
//请求后拦截器
instance.interceptors.response.use(
    (response) => {
        // 这里的response.config是什么? todo, 感觉应该就是axios发起请求前传入的配置对象
        const { showLoading, errorCallback, showError = true, responseType } = response.config;
        if (showLoading && loading) {
            loading.close()
        }
        const responseData = response.data;
        // 获取到响应类型是response.config.responseType todo
        if (responseType == "arraybuffer" || responseType == "blob") {
            return responseData;
        }
        //正常请求
        if (responseData.code == 200) {
            return responseData;
        } else if (responseData.code == 901) {
            //登录超时
            // 登录超时跳转到登录前, 对当前路径进行uri编码, 记录此路径到url上
            router.push("/login?redirectUrl=" + encodeURI(router.currentRoute.value.path));
            return Promise.reject({ showError: false, msg: "登录超时" });
        } else {
            //其他错误
            if (errorCallback) {
                errorCallback(responseData.info);
            }
            return Promise.reject({ showError: showError, msg: responseData.info });
        }
    },
    (error) => {
        // error里面也可以拿到config吗? todo
        if (error.config.showLoading && loading) {
            loading.close();
        }
        return Promise.reject({ showError: true, msg: "网络异常" })
    }
);

const request = (config) => {
    const { url, params, dataType, showLoading = true, responseType = responseTypeJson } = config;
    let contentType = contentTypeForm;
    let formData = new FormData();// 创建form对象
    for (let key in params) {
        formData.append(key, params[key] == undefined ? "" : params[key]);
    }
    if (dataType != null && dataType == 'json') {
        contentType = contentTypeJson;
    }
    let headers = {
        'Content-Type': contentType,
        'X-Requested-With': 'XMLHttpRequest',
    }

    return instance.post(url, formData, {
        onUploadProgress: (event) => {
            if (config.uploadProgressCallback) {
                config.uploadProgressCallback(event);
            }
        },
        responseType: responseType, // responsType是axios中已定义的配置选项
        headers: headers,
        showLoading: showLoading,
        errorCallback: config.errorCallback,
        showError: config.showError
    }).catch(error => {
        console.log(error);
        if (error.showError) {
            Message.error(error.msg);
        }
        return null;
    });
};

export default request;

热更新问题

路由中使用import导入的组件所写的路径一定要注意大小写,否则热更新会没用,见:vue3+vite热更新失效问题

vue3动态组件

vue3动态组件的is不能写字符串,要直接写组件的引用

vuex4命名空间

命名空间文档

二级菜单界面控制

defineExpose暴露组件的方法

图片url加随机数,防止浏览器缓存

Table封装,slot相关

Table.vue

<template>
  <div>
    <el-table
      ref="dataTable"
      :data="dataSource.list || []"
      :height="tableHeight"
      :stripe="options.stripe"
      :border="options.border"
      header-row-class-name="table-header-row"
      highlight-current-row
      @row-click="handleRowClick"
      @selection-change="handleSelectionChange"
    >
      <!--selection选择框-->
      <el-table-column
        v-if="options.selectType && options.selectType == 'checkbox'"
        type="selection"
        width="50"
        align="center"
      ></el-table-column>
      <!--序号-->
      <el-table-column
        v-if="options.showIndex"
        label="序号"
        type="index"
        width="60"
        align="center"
      ></el-table-column>
      <!--数据列-->
      <template v-for="(column, index) in columns">
        <template v-if="column.scopedSlots">
          <el-table-column
            :key="index"
            :prop="column.prop"
            :label="column.label"
            :align="column.align || 'left'"
            :width="column.width"
          >
            <template #default="scope">
              <slot
                :name="column.scopedSlots"
                :index="scope.$index"
                :row="scope.row"
              >
              </slot>
            </template>
          </el-table-column>
        </template>
        <template v-else>
          <el-table-column
            :key="index"
            :prop="column.prop"
            :label="column.label"
            :align="column.align || 'left'"
            :width="column.width"
            :fixed="column.fixed"
          >
          </el-table-column>
        </template>
      </template>
    </el-table>
    <!-- 分页 -->
    <div class="pagination" v-if="showPagination">
      <el-pagination
        v-if="dataSource.totalCount"
        background
        :total="dataSource.totalCount"
        :page-sizes="[15, 30, 50, 100]"
        :page-size="dataSource.pageSize"
        :current-page.sync="dataSource.pageNo"
        :layout="layout"
        @size-change="handlePageSizeChange"
        @current-change="handlePageNoChange"
        style="text-align: right"
      ></el-pagination>
    </div>
  </div>
</template>
<script setup>
import { ref, computed } from "vue";

const emit = defineEmits(["rowSelected", "rowClick"]);
const props = defineProps({
  dataSource: Object,
  showPagination: {
    type: Boolean,
    default: true,
  },
  showPageSize: {
    type: Boolean,
    default: true,
  },
  options: {
    type: Object,
    default: {
      extHeight: 0,
      showIndex: false,
    },
  },
  columns: Array,
  fetch: Function, // 获取数据的函数
  initFetch: {
    type: Boolean,
    default: true,
  },
});

const layout = computed(() => {
  return `total, ${
    props.showPageSize ? "sizes" : ""
  }, prev, pager, next, jumper`;
});
//顶部 60 , 内容区域距离顶部 20, 内容上下内间距 15*2  分页区域高度 46
const topHeight = 60 + 20 + 30 + 46;

const tableHeight = ref(
  props.options.tableHeight
    ? props.options.tableHeight
    : window.innerHeight - topHeight - props.options.extHeight
);

//初始化
const init = () => {
  if (props.initFetch && props.fetch) {
    props.fetch();
  }
};
init();

const dataTable = ref();
//清除选中
const clearSelection = () => {
  dataTable.value.clearSelection();
};

//设置行选中
const setCurrentRow = (rowKey, rowValue) => {
  let row = props.dataSource.list.find((item) => {
    return item[rowKey] === rowValue;
  });
  dataTable.value.setCurrentRow(row);
};
//将子组件暴露出去,否则父组件无法调用
defineExpose({ setCurrentRow, clearSelection });

//行点击
const handleRowClick = (row) => {
  emit("rowClick", row);
};

//多选
const handleSelectionChange = (row) => {
  emit("rowSelected", row);
};

//切换每页大小
const handlePageSizeChange = (size) => {
  props.dataSource.pageSize = size;
  props.dataSource.pageNo = 1;
  props.fetch();
};
// 切换页码
const handlePageNoChange = (pageNo) => {
  props.dataSource.pageNo = pageNo;
  props.fetch();
};
</script>
<style lang="scss" scoped>
.pagination {
  padding-top: 10px;
  padding-right: 10px;
}
.el-pagination {
  justify-content: right;
}

:deep .el-table__cell {
  padding: 4px 0px;
}
</style>

FileList.vue

<div class="file-list">
   <Table
     :columns="columns"
     :showPagination="true"
     :dataSource="tableData"
     :fetch="loadDataList"
     :initFetch="false"
     :options="tableOptions"
     @rowSelected="rowSelected"
   >
     <template #fileName="{ index, row }">
       <div
         class="file-item"
         @mouseenter="showOp(row)"
         @mouseleave="cancelShowOp(row)"
       >
         <template
           v-if="(row.fileType == 3 || row.fileType == 1) && row.status == 2"
         >
           <icon :cover="row.fileCover" :width="32"></icon>
         </template>
         <template v-else>
           <icon v-if="row.folderType == 0" :fileType="row.fileType"></icon>
           <icon v-if="row.folderType == 1" :fileType="0"></icon>
         </template>
         <span class="file-name" v-if="!row.showEdit" :title="row.fileName">
           <span @click="preview(row)">{{ row.fileName }}</span>
           <span v-if="row.status == 0" class="transfer-status">转码中</span>
           <span v-if="row.status == 1" class="transfer-status transfer-fail"
             >转码失败</span
           >
         </span>
         <div class="edit-panel" v-if="row.showEdit">
           <el-input
             v-model.trim="row.fileNameReal"
             :maxLength="190"
             @keyup.enter="saveNameEdit(index)"
           >
             <template #suffix>{{ row.fileSuffix }}</template>
           </el-input>
           <span
             :class="[
               'iconfont icon-right1',
               row.fileNameReal ? '' : 'not-allow',
             ]"
             @click="saveNameEdit(index)"
           ></span>
           <span
             class="iconfont icon-error"
             @click="cancelNameEdit(index)"
           ></span>
         </div>
         <span class="op">
           <template v-if="row.showOp && row.fileId">
             <span
               class="iconfont icon-download"
               @click="download(row)"
               v-if="row.folderType == 0"
               >下载</span
             >
             <span class="iconfont icon-del" @click="delFile(row)"
               >删除</span
             >
           </template>
         </span>
       </div>
     </template>
     <template #fileSize="{ index, row }">
       <span v-if="row.fileSize">
         {{ proxy.Utils.sizeToStr(row.fileSize) }}</span
       >
     </template>
   </Table>
</div>

vue3样式穿透

:deep .docx-wrapper > section.docx {
	margin-bottom: 0px;
}

prop单向数据流

父组件传给子组件的属性,子组件不能直接改这个传过来的属性,但是如果这个属性值是个对象,是可以在子组件间中直接改这个对象中的属性的,这并不违背prop单向数据流

ref引用组件或dom 与 v-if/show

  • v-if:当flag为true的时候,divRef是有值的;当flag为false的时候,divRef是undefined/null(刚开始是undefined,后面就是null了)
  • v-show:divRef都有值
<template>

    <div class="main">
        Main
        <el-button @click="flag = !flag">切换flag - {{ flag }}</el-button>
        <el-button @click="logRef">获取divRef</el-button>
        <div v-if="flag" ref="divRef">测试divRef</div>
    </div>
    
</template>

<script setup>

    import { ref,reactive } from 'vue'

    let flag = ref(false)

    const divRef = ref()

    function logRef () {
        console.log(divRef.value);
    }
</script>

<style lang="scss">
    
</style>

@mouseenter & @mouseleave监听鼠标移入移出事件

el-table和el-input在一起,获取焦点方法失效问题

发现不能使用v-show,而是要使用v-if,猜测:我觉得应该是使用v-show的话,使用editNameRef就会引用到多个组件,而vue3中引入多个组件的用法在此中的源码的写法本身就不对,因此拿不到对应的组件,而使用v-if的话,就只有一个组件,因此能拿到唯一的组件,因此就能调用focus方法了

路由子组件通知父组件实现

Framework.vue中通过路由出口<router-view/>,展示了Main.vue组件,但是现在需要Main.vue组件中去调用Framework.vue组件中的方法,可以有以下几种做法

可以使用provide/inject的机制

Framework.vue

<template>
	<div>
	
		framework.vue
		
		<router-view/>
		
	</div>
	
<template>

<script>

import { ref, reactive, getCurrentInstance, nextTick, watch, provide } from 'vue'

provide('testFun',()=>{
    console.log('framework testFun()..');
})
</script>

Main.vue

<template>
	<div class="main">
	
       <el-button @click="testFun">tt</el-button>
              
    </div>
	
<template>

<script>

	import { ref,reactive, nextTick, inject } from 'vue'
    
    let testFun = inject('testFun')

</script>

可以直接在<router-view @kk=“kk”/>绑定事件监听

Framework.vue

<template>
	<div>
	
		framework.vue
		
		<router-view @kk="kk"/>
		
	</div>
	
<template>

<script>

import { ref, reactive, getCurrentInstance, nextTick, watch, provide } from 'vue'

const kk = () =>{
    console.log('kk');
}
</script>

Main.vue

<template>

    <div class="main">
    
       <el-button @click="testKK">KK</el-button>
       
    </div>
    
</template>

<script setup>

    import { ref,reactive, nextTick, inject } from 'vue'

    const emit = defineEmits([
        'kk'
    ])

    const testKK = ()=>{
        emit('kk')
    }
    

</script>

<style lang="scss"></style>

可以使用<router-view />的组件写法

Framework.vue

<template>
	<div>
	
		framework.vue
		
		<router-view v-slot:="{Component,route}">
           <component @kk="kk" :is="Component" :key="route.path"/>
         </router-view>
		
	</div>
	
<template>

<script>

import { ref, reactive, getCurrentInstance, nextTick, watch, provide } from 'vue'

const kk = () =>{
    console.log('kk');
}
</script>

Main.vue

<template>

    <div class="main">
    
       <el-button @click="testKK">KK</el-button>
       
    </div>
    
</template>

<script setup>

    import { ref,reactive, nextTick, inject } from 'vue'

    const emit = defineEmits([
        'kk'
    ])

    const testKK = ()=>{
        emit('kk')
    }
    

</script>

<style lang="scss"></style>

el-popver 点击触发和使用方法触发

  • 下面2个按钮都能触发popver的显示
    在这里插入图片描述
<template>
    <div class="main">
    
        <!-- 这里可以直接使用v-model:visible = popoverShow-->
        <!-- 经过测试, 发现:点击reference的触发按钮,
                                  当popover未显示的时候, 会触发update:visible事件(携带的参数是true);
                                  当popover显示的时候,会触发update:visible事件(携带的参数是false) ,并且触发了2次

                           点击下面的触发按钮,
                           		  只有当popover未显示的时候,才会触发update:visible事件(携带的参数是false) ,并且触发了2次
             -->
        <el-popover :visible="popoverShow" @update:visible="value => popoverShow = value" placement="bottom" trigger="click">
        
            <template #reference>
                <el-button>触发</el-button>
            </template>
            
            <template #default>
                halo~
            </template>
            
        </el-popover>

        <el-button @click="popoverShow = true">触发</el-button>
    </div>
</template>

<script setup>

    import { ref,reactive, nextTick, inject } from 'vue'
    
    const popoverShow = ref(false)

</script>

<style lang="scss">
    
</style>

文件上传逻辑转移

Main.vue组件(路由子组件)中负责选择文件,触发Framework.vue组件的addFile方法,并且把file这个blob传过来了,然后在Framework.vue组件中,主动的显示el-popver组件(el-popover的插槽中放入了Uploader.vue组件),最后调用这个Uploader.vue组件的上传方法(并且传入file这个blob),完成文件上传逻辑的转移。

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

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

相关文章

QPaint绘制图形

流程 继承QWidget类&#xff0c;重写paintEvent方法&#xff0c;在其中使用QPainter进行绘图。 举例 创建项目&#xff0c;项目结构如下&#xff1a; // widget.h#ifndef WIDGET_H #define WIDGET_H#include <QWidget>QT_BEGIN_NAMESPACE namespace Ui { class Widget…

TypeScript ~ TS 掌握编译文件配置项 ⑥

作者 : SYFStrive 博客首页 : HomePage &#x1f4dc;&#xff1a; TypeScript ~ TS &#x1f4cc;&#xff1a;个人社区&#xff08;欢迎大佬们加入&#xff09; &#x1f449;&#xff1a;社区链接&#x1f517; &#x1f4cc;&#xff1a;觉得文章不错可以点点关注 &…

git 上传下载

文章目录 gitee/GitHub 是用来做什么的&#xff1f;什么时候需要学习上传项目到 gitee&#xff1f;为什么要将本地项目上传到 gitee&#xff1f;创建 gitee 仓库&#xff1a;在本地新建一个项目将仓库拉取到本地使用 idea 实现项目的上传下载gitee 仓库查看 下面我就来为大家介…

第六章 习题(6789B)【计算机系统结构】

第六章 习题【计算机系统结构】 前言推荐第六章 习题678911 最后 前言 2023-6-24 10:43:46 以下内容源自《【计算机系统结构】》 仅供学习交流使用 推荐 第五章 作业&#xff08;149A&#xff09;【计算机系统结构】 答案参考&#xff1a; https://www.docin.com/p-28456…

LVDS (Low Voltage Differential Signaling)基础知识

LVDS(Low Voltage Differential Signaling&#xff09;: 是一种小振幅差分信号技术&#xff0c;它使用非常低的幅度信号 (250mV~450mv&#xff09;通过一对平行的 PCB 走线或平衡电缆传输数据。 在两条平行的差分信号线上流经的电流及电压振幅相反&#xff0c;噪声信号同时耦…

小鱼C python - 集合的练习

题一&#xff1a;用字典实现集合的去重特性 1. 生成100个1&#xff5e;100的随机值 思路&#xff1a; 1. range 范围 2. random.randint(a,b) import random x [] for I in range(100):x.append(random.randint(1,100)) print(x) 2. x和y的交集 思路&#xff1a;1.遍历x,…

通过 pGina 对 Windows 设备进行管理

文章目录 前言1、环境信息1.1、服务器端1.2、客户端 2、pGina 安装及配置2.1、下载并安装2.2、配置2.3、模拟测试2.4、Windows 远程登录测试 总结 前言 对 Windows 设备进行管理&#xff0c;一般是通过 AD 进行的&#xff0c;但是这玩意儿是收费的&#xff0c;而且还挺贵。有没…

SpringSecurity(二):自定义认证(源码+落地实现)。

自定义认证 自定义资源权限规则资源分类自定义资源权限规则为什么我们要自定义呢&#xff1f;如何去覆盖呢&#xff1f;WebSecurityConfigurerAdapter它是干什么用的实例 自定义登录界面步骤源码解析 自定义登录成功处理&#xff08;前后端分离的情况&#xff09;项目环境succe…

Axure中使用echarts图标

第一步&#xff1a;axure中防一个矩形框 第二步&#xff1a;将矩形框命名为Demo 这步很重要&#xff0c;后续会引用这个名字 第三步&#xff1a;打开Echarts示例&#xff0c;选择需要的样式&#xff0c;并调整数值 Examples - Apache ECharts 第四步&#xff1a;代码准备 需…

Windows10host文件修改方法

1、首先打开“此电脑”&#xff0c;定位到&#xff1a; C:\Windows\System32\drivers\etc 2、使用鼠标右键单击“hosts”&#xff0c;弹出来的菜单中选择“属性” 3、弹出“文件属性”窗口后单击“上方的”安全“栏”。 选中“ALL APPLICATON PACKAGES”后单击“编辑” 4、同…

Jmeter核心结构和运行原理(1)

Jmeter核心结构和运行原理 一、Jmeter核心结构和运行原理1、JMeter核心结构2、JMeter的体系结构3、JMeter运行原理a、GUI模式&#xff1a;b、非GUI模式&#xff1a;c、单机模式&#xff1a;d、分布式模式 一、Jmeter核心结构和运行原理 1、JMeter核心结构 测试计划 线程组 配…

MongoDB基本使用(一)

MongoDB基本使用 Nosql简介 NoSQL(NoSQL Not Only SQL )&#xff0c;意即”不仅仅是SQL”。 在现代的计算系统上每天网络上都会产生庞大的数据量&#xff0c; 这些数据有很大一部分是由关系数据库管理系统&#xff08;RDBMS&#xff09;来处理。 1970年 E.F.Codd’s提出的关系…

总结910

目标规划&#xff1a; 月目标&#xff1a;6月&#xff08;线性代数强化9讲&#xff0c;考研核心词过三遍&#xff09; 周目标&#xff1a;线性代数强化5讲&#xff0c;英语背3篇文章并回诵&#xff0c;检测 每日规划 今日已做 1.早上回顾之前背诵的文章 2.写自我总结&#…

Java 中常见的数据结构

数据结构简介 数据结构是计算机科学中用于组织和存储数据的一种方式或方法。它定义了不同数据元素之间的关系&#xff0c;以及对这些数据元素进行操作和访问的规则和技术。 数据结构可以用来描述问题的抽象模型&#xff0c;并提供处理该问题的操作和算法。它可以通过逻辑和物…

wpf增加系统托盘图标

使用系统托盘&#xff0c;可以为用户提供一个简便快捷的操作习惯。 wpf中增加系统托盘图标有2种 第一种&#xff0c;使用Hardcodet.NotifyIcon.Wpf开源组件 1.建立一个wpf程序 2.安装Hardcodet.NotifyIcon.Wpf 3.增加图片 图片选择资源&#xff0c;否则获取不到路径 4.界面…

TypeScript - 函数(上)

目录 1、介绍 2、函数类型表达式 3、呼叫签名 4、构造签名 5、泛型函数 6、推论 7、约束 8、使用约束值 9、指定类型参数 1、介绍 函数是JavaScript应用程序的基础。 它帮助你实现抽象层&#xff0c;模拟类&#xff0c;信息隐藏和模块。 在TypeScript里&#xff0c…

Linux——进程的概念

task_struct task_struct 是linux下管理进程的结构&#xff0c;称为PCB&#xff0c;进程控制块。linux所有的指令本质上都是一个进程。进程 task_struct 进程的数据、代码、可执行程序&#xff0c;有属性、有内容。 进程是系统的工作单元。系统由多个进程组成&#xff0c;包…

Linux定时任务--crontab

linux内置了cron进程&#xff0c;cron搭配shell脚本&#xff0c;就可以完成特定的需求&#xff0c;有定时任务的效果。 crontab指令即cron table的简写&#xff0c;相关的配置文件目录如下&#xff1a; /var/spool/cron/ 目录下存放的是每个用户包括root的crontab任务&#xf…

论文笔记--On the Sentence Embeddings from Pre-trained Language Models

论文笔记--On the Sentence Embeddings from Pre-trained Language Models 1. 文章简介2. 文章概括3 文章重点技术3.1 BERT模型的语义相似度能力分析3.2 Anistropic各向异性3.3 BERT-flow3.4 Flow-based model 4. 文章亮点5. 原文传送门6. References 1. 文章简介 标题&#x…

树莓派Pico|RP2040简介|PINOUT|点灯示例

文章目录 一、Pico简介&#xff1a;二、几个比较重要的git仓库&#xff1a;三、使用前必读&#xff1a;四、PINOUT五、点灯一、如何安装固件二.安装Thonny编程环境配置三、点亮板载的LED灯Pico点亮板载LED灯的代码&#xff1a;PicoW点亮板载LED灯的代码&#xff1a; 一、Pico简…