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

Vue:Vue3-TypeScript-Pinia-Vite-pnpm / 基础项目 / 20240807

一、项目技术栈 / 依赖

序号技术栈版本解释
1node20.14.0
2vue

3.4.31

3vite

5.3.4

4TypeScript

5.2.2

5

@types/node

22.0.2

解决TypeScript项目中缺少对应模块的类型定义文件的问题
6

element-plus

2.7.8

ui组建
7

@types/js-cookie
js-cookie

3.0.6
3.0.5

8

sass

1.77.8

9

husky

8.0.0

10chalk

5.3.0

11axios1.7.3
12

vue-router

4.4.2

............

二、创建项目

2.1、创建项目

pnpm create vite

2.2、输入项目名字

2.3、选择TypeScript 

2.4、Enter/回车后 

2.5、项目创建成功-目录

2.6、安装依赖

pnpm install

2.7、启动项目

pnpm run dev

2.8、启动成功 

三、public目录下的文件可以直接访问

四、vite.config.ts 配置alias

import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
import { resolve } from 'path'// https://vitejs.dev/config/
export default defineConfig({plugins: [vue()],resolve: {alias: {'@': resolve(__dirname, 'src'),'@assets': resolve(__dirname, 'src/assets')}}
})

@

@assets 

经测试,@、@assets 两个 alias 均使用成功。

五、Element-plus

pnpm add element-plus

安装后在src/main.ts引入并使用

import { createApp } from 'vue'
import './style.css'
import App from './App.vue'
import ElementPlus from 'element-plus'
import 'element-plus/dist/index.css'const app = createApp(App)
app.use(ElementPlus)
app.mount('#app')

 

 六、使用pinia

 nuxt3:使用pinia_nuxt3使用pinia-CSDN博客

七、使用cookie

pnpm add @types/js-cookie
pnpm add js-cookie
// 页面引入
import cookie from 'js-cookie'
<script setup lang="ts">
import cookie from 'js-cookie'
import HelloWorld from './components/HelloWorld.vue'cookie.set('name', 'snow')
const name: string | undefined = cookie.get('name')
console.log('10name', name)
</script>

测试成功: 

八、使用 Tailwind CSS

Tailwind CSS:基础使用/vue3+ts+Tailwind_tailwind中文文档-CSDN博客

九、使用sass

9.1、安装sass

pnpm add sass

9.2、变量文件 assets/scss/variables.scss

// 颜色变量
$primary-color: #42b983; // 主题色
$text-color: #333; // 文本颜色
$border-color: #ddd; // 边框颜色// 字体样式变量
$font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif;
$font-size-base: 16px;
$line-height-base: 1.5;// 间距变量
$padding-base: 10px;
$margin-base: 20px;// 布局变量
$container-max-widths: (sm: 540px,md: 720px,lg: 960px,xl: 1140px,xxl: 1320px
);// 组件样式变量
$button-padding: 10px 15px;
$button-border-radius: 4px;
$button-background-color: $primary-color;// 图标和图像变量
$logo-url: '/images/logo.png';// 媒体查询断点
$screen-xs-min: 600px;
$screen-sm-min: 992px;
$screen-md-min: 1200px;
$screen-lg-min: 1920px;

9.3、vite.config.ts配置

import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
import { resolve } from 'path'// https://vitejs.dev/config/
export default defineConfig({plugins: [vue()],resolve: {alias: {'@': resolve(__dirname, 'src'),'@assets': resolve(__dirname, 'src/assets')}},css: {// 这里的配置将应用于所有CSS/Sass/Less等预处理器文件preprocessorOptions: {scss: {additionalData: `@import "@/assets/scss/variables.scss";` // 全局引入变量// 或者你可以通过Vue的<style scoped src="...">来引入全局样式// 如果你不需要进行特别的Sass配置,这个对象可以留空}}}
})

9.4、App.vue文件使用全局变量,进行测试

<template><div class="name">snow</div>
</template><style scoped lang="scss">
.name {color: $primary-color;
}
</style>

测试成功

十、使用ESLint

配置文件 - ESLint - 插件化的 JavaScript 代码检查工具

Configuration Migration Guide - ESLint - Pluggable JavaScript Linter

工程化-vue3+ts:代码检测工具 ESLint_expected to return a value at the end of arrow fun-CSDN博客

十一、使用husky / V.9.1.4  +  ESLint

配置文件 - ESLint - 插件化的 JavaScript 代码检查工具

vue3+ts:约定式提交(git husky + gitHooks)_vue husky hook-CSDN博客

项目中使用 Husky 可以帮助你自动地在 Git 钩子(如 pre-commit、pre-push 等)上执行一些脚本,比如代码格式化、linting、测试等,从而确保代码质量。 同时,如果你打算在提交前运行 ESLint 或 Prettier,也需要安装husky。

pnpm add husky
npx husky-init

.husky/pre-commit 文件,增加 pnpm run eslint:fix,这样在提交代码前会先进行ESLint检查。

十二、使用router

12.1、安装router

pnpm add vue-router

12.2、在src目录下创建目录和文件routers/index.ts

// 引入创建路由管理器 引入创建路由模式 history模式
import { createRouter, createWebHistory, RouteRecordRaw } from 'vue-router'
import Snow from '../views/snow/index.vue';// 引入路由各页面配置
const routes:Array<RouteRecordRaw> = [{path: '/',redirect: '/snow'},{path: '/index',redirect: '/snow'},{path: '/snow',name: 'snow',component: Snow},{path: '/star',component: ()=>import('../views/star/index.vue')},
]
// 创建路由管理器 模式和路由
const router = createRouter({history: createWebHistory(),routes
})export default router

12.3、src/views/snow/index.vue

<template><div class="container"><!-- 水平、垂直 居中 --><!-- <div class="flex"><div class="flex_item"></div></div> --><div class="flex"><div class="flex_item">1</div><div class="flex_item">2</div><div class="flex_item">3</div><div class="flex_item">4</div><div class="flex_item">5</div><div class="flex_item">6</div><div class="flex_item">7</div></div></div>
</template><script setup lang="ts">
import cookie from 'js-cookie'
const name:string | undefined = cookie.get('name');
console.log('10name', name)
</script><style scoped lang="scss">
.container{// .flex{//   display: flex;//   justify-content: center; // 水平居中//   align-items: center; // 垂直居中//   width: 200px;//   height: 200px;//   background: #ff0000;//   &_item{//     width: 50px;//     height: 50px;//     background: #b3de1b;//   }// }.flex{display: flex;width: 200px;height: 200px;background: #ff0000;&_item{width: 50px;height: 50px;background: #b3de1b;flex-shrink: 0; // 表示Flex项目在空间不足时的缩小比例。flex-shrink的默认值为1,数值越大,缩小比例越多,设置为 0 不缩放 。}}
}
</style>

12.4、src/main.ts

12.5、src/App.vue

<template><router-view></router-view>
</template>
<script setup lang="ts">
</script>
<style scoped>
</style>

12.6、测试成功

十三、本地代理,配置proxy,配置多环境 / env

vue3+vite:本地代理,配置proxy_vue3代理服务器proxy配置-CSDN博客

13.1、vite.config.ts

import { defineConfig, loadEnv } from 'vite'
import vue from '@vitejs/plugin-vue'
import { resolve } from 'path'// https://vitejs.dev/config/
export default defineConfig({plugins: [vue()],resolve: {alias: {'@': resolve(__dirname, 'src'),'@assets': resolve(__dirname, 'src/assets')}},// 开发服务器配置server: {host: '0.0.0.0', // 允许本机port: 3022, // 设置端口open: false, // 设置服务启动时自动打开浏览器hmr: true, // 开启热更新// cors: true, // 允许跨域// 请求代理proxy: {'/m-staff-center': { // 匹配请求路径,localhost:3000/m-staff-center,如果只是匹配/那么就访问到网站首页了target: loadEnv(process.argv[process.argv.length-1], './env').VITE_SERVER_NAME, // 代理的目标地址changeOrigin: true, // 开发模式,默认的origin是真实的 origin:localhost:3000 代理服务会把origin修改为目标地址}}},css: {// 这里的配置将应用于所有CSS/Sass/Less等预处理器文件preprocessorOptions: {scss: {additionalData: `@import "@/assets/scss/variables.scss";` // 全局引入变量// 或者你可以通过Vue的<style scoped src="...">来引入全局样式// 如果你不需要进行特别的Sass配置,这个对象可以留空}}},
})

13.2、env文件 

env/env.dev 其他同理

# 请求接口地址
VITE_REQUEST_BASE_URL = '/m-abc-center/api/v1'
VITE_SERVER_NAME = 'https://md.abc.com.cn/'
# VITE开头的变量才会被暴露出去

env/index.d.ts

/** 扩展环境变量import.meta.env */
interface ImportMetaEnv {VITE_REQUEST_BASE_URL: string,VITE_SERVER_NAME: string
}

13.3、package.json/script配置

十四、 封装axios请求

14.1、安装axios

pnpm add axios

14.2、目录结构

14.3、src/api/http/axios.ts

import instance from "./index"
/*** @param {String} method  请求的方法:get、post、delete、put* @param {String} url     请求的url:* @param {Object} data    请求的参数* @param {Object} config  请求的配置* @returns {Promise}     返回一个promise对象,其实就相当于axios请求数据的返回值*/
const axios = async ({method,url,data,config
}: any): Promise<any> => {method = method.toLowerCase();if (method == 'post') {return instance.post(url, data, { ...config })} else if (method == 'get') {return instance.get(url, {params: data,...config})} else if (method == 'delete') {return instance.delete(url, {params: data,...config})} else if (method == 'put') {return instance.put(url, data, { ...config })} else {console.error('未知的method' + method)return false}
}
export {axios
}

14.4、src/api/http/index.ts

    import axios from 'axios'import cookie from 'js-cookie'//创建axios的一个实例 const instance = axios.create({// baseURL: import.meta.env.VITE_RES_URL, //接口统一域名timeout: 6000, //设置超时headers: {'Content-Type': 'application/json;charset=UTF-8;',}})//请求拦截器 instance.interceptors.request.use((config: any) => {// 每次发送请求之前判断是否存在token,如果存在,则统一在http请求的header都加上token,不用每次请求都手动添加了const token = `Bearer ${cookie.get('token')}`console.log('16', token)token && (config.headers.Authorization = token)//若请求方式为post,则将data参数转为JSON字符串if (config.method === 'post') {config.data = JSON.stringify(config.data);} else if(config.method === 'get'){console.log('21', config)}return config;}, (error: any) =>// 对请求错误做些什么Promise.reject(error));//响应拦截器instance.interceptors.response.use((response: any) => {//响应成功console.log('响应成功');return response.data;}, (error: any) => {console.log(error)//响应错误if (error.response && error.response.status) {const status = error.response.statusconsole.log(status);return Promise.reject(error);}return Promise.reject(error);});export default instance;

14.5、 src/api/modules/m-abc-center.ts

import { axios } from "../http/axios"
import * as T from '../types/types'export const getUser = (data: T.userParams) => {return axios({method: "get",url: "/m-abc-center/api/v1/abc/abc",data,config: {timeout: 10000}})
}

14.6、src/api/types/types.ts

export interface userParams {keyword: string
}

14.7、页面使用及测试

<template><div class="container"></div>
</template><script setup lang="ts">
import { getUser } from "@/api/modules/m-abc-center.ts";
let params = {keyword:"snow",
}
getUser(params).then((res: any)=>{console.log('4res', res)
})
</script><style scoped lang="scss">
</style>

14.8、测试成功

十五、接口挂载到全局属性上

15.1、 src/api/modules/m-abc-center.ts

export default ({axios}:any) => ({getUser(data: T.userParams) {return axios({url: '',data,method: "get"})},getUser2(data: T.userParams) {return axios({url: '',data,method: "get"})},
})

15.2、src/api/index.ts

import { axios } from './http/axios'
const files:any = import.meta.glob("./modules/*.ts", {eager: true}) // 导入文件
const api:any = {}
const apiGenerators:any = [] // modules目录下文件内容的数组,每一个文件是一个{}
for (const key in files) {if (Object.prototype.hasOwnProperty.call(files, key)) {apiGenerators.push(files[key].default || files[key])}
}
apiGenerators.forEach((generator:any) => {const apiInstance = generator({ // 创建axios实例axios})for (const apiName in apiInstance) {if (apiInstance.hasOwnProperty(apiName)) { // 通过名称找到定义的接口地址api[apiName] = apiInstance[apiName]}}
})export { api }

15.3、src/main.ts

import { createApp } from 'vue'
import './style.css'
import App from './App.vue'
import ElementPlus from 'element-plus'
import 'element-plus/dist/index.css'
import router from "./routers/index"
import { api } from './api/index'const app = createApp(App)
app.use(ElementPlus)
app.use(router)
app.config.globalProperties.$api = api
app.mount('#app')

15.4、页面使用及测试

<template><div class="container"></div>
</template><script setup lang="ts">
let params = {keyword:"snow",
}
import { getCurrentInstance } from 'vue'
let internalInstance = getCurrentInstance();
let Api = internalInstance && internalInstance.appContext.config.globalProperties.$api
Api.getUser(params).then((res: any)=>{console.log('17res', res)
})
</script><style scoped lang="scss">
</style>

测试成功 

十六、UnoCSS / 原子化CSS

Unocss(原子化css) 使用(vue3 + vite + ts)-CSDN博客

即时按需:UnoCSS的加载和渲染速度非常快,可以立即进行使用。它不需要预先编译,使得样式可以在需要时动态地生成。

原子级CSS:UnoCSS使用原子级CSS样式的概念,即通过将样式属性定义为独立的类来构建页面。每个类都只包含一项或几项样式属性,可以在组件中灵活地组合和应用这些类,以实现细粒度的样式控制。

轻量化和高性能:UnoCSS通过仅传递实际使用的样式属性,减小生成的CSS文件的体积,从而优化页面的加载速度,并减少不必要的网络传输和运行时的样式计算。

十七、vue-global-api

17.1、vue-global-api - npm-网址

17.2、使用前

<script setup>
import { ref, computed, watch } from 'vue'const counter = ref(0)const doubled = computed(() => counter.value * 2)watch(doubled, (v) => {console.log('New value: ' + v)
})
</script>

17.3、使用后

<script setup>
const counter = ref(0)const doubled = computed(() => counter.value * 2)watch(doubled, (v) => {console.log('New value: ' + v)
})
</script>

十八、layout 布局

vue3 + ts: layout布局_vue3 layout-CSDN博客

十九、directives

vue3:自定义指令_vue3自定义指令-CSDN博客

二十、vue3 - ts - lerna

架构-单一代码库-monorepo-lerna(8.0.0):lerna-pnpm-vue3-vite-ts 实践 / 用于管理包含多个软件包(package)的 JavaScript 项目_lerna8-CSDN博客

二十一、rollup 插件

vue3-vite-ts:编写Rollup插件并使用 / 优化构建过程_vite 中 rollup-plugin-dts-CSDN博客

二十二、vue3 + three.js

WebGL-Vue3-TS-Threejs:基础练习 / Javascript 3D library / demo-CSDN博客

二十三、多语言

vue3-ts-vite:Google 多语言调试 / 网页中插入谷歌翻译元素 / 翻译_google-translate-element-CSDN博客

二十四、storybook

vue3-ts-storybook:理解storybook、实践 / 前端组件库-CSDN博客

二十五、多页面应用

vue3-ts-vite:vue 项目 配置 多页面应用_vite多页面配置-CSDN博客

二十六、TinyMCE

vue3.3-TinyMCE:TinyMCE富文本编辑器基础使用_tinymce中文文档-CSDN博客

二十七、shims-vue.d.ts

vue3+ts:shims-vue.d.ts-CSDN博客

二十八、keepalive

vue3-ts:keepalive 列表页到详情,详情回到列表,列表恢复离开时的状态_vue3 从列表到详情-CSDN博客

二十九、qiankun

微前端-qiankun:vue3-vite 接入 vue3、nuxt3、vue2、nuxt2等子应用_qiankun.js-CSDN博客

三十、生命周期

vue3:生命周期(onErrorCaptured)-CSDN博客

三十一、vue2与vue3的区别

vue:vue2与vue3的区别_vue版本-CSDN博客

三十二、uuid

vue3 + ts:使用uuid_vue3 uuid-CSDN博客

三十三、watch

vue3 + ts:watch(immediate、deep、$watch)_vue3 watch immediate-CSDN博客

三十四、slot

vue:匿名slot、具名slot、作用域slot(技术栈Vue3 + TS)_具名插槽-CSDN博客

三十五、prettier 

vue3-ts:husky + prettier / 代码格式化工具-CSDN博客

三十六、Stylelint

https://blog.csdn.net/snowball_li/article/details/141025848

三十七、Commitlint

工程化:Commitlint / 规范化Git提交消息格式_commitlint 规范-CSDN博客

三十八、TypeScript

TypeScript:熟练掌握TypeScript_typescript 学习-CSDN博客

Vue3-TypeScript-Threejs:导入外部的glb格式3D模型_threejs 导入3d模型-CSDN博客

三十九、过程记录

记录一、找不到模块“path”或其相应的类型声明

报错信息“找不到模块‘path’或其相应的类型声明”通常意味着你的TypeScript项目中缺少对应模块的类型定义文件。

解决:

pnpm add @types/node

安装后问题解决

记录二、Module '"c:/gkht/project/m-basic-vue3-pc/m-basic-vue3-pc/src/components/HelloWorld.vue"' has no default export.Vetur(1192)

新项目有一条红色的波浪线,很难受 

解决:

根据提示信息可以知道是Vetur的提示信息。

查找资料后,

viscode插件 Vetur(v0.35.0)不支持最新写法 卸载 并 安装 Volar 插件,使用Volar插件代替Vetur

但是,本文时间20240802 Volar被弃用了,改用了  Vue - Official

问题得到解决 

记录三、lint-staged干啥的

lint-staged是一个在git暂存文件上运行linters的工具,‌它的主要作用是提高代码质量和开发效率。‌lint-staged通过自动化代码检查过程,‌可以显著提升开发效率并维护代码一致性。‌这个工具特别适用于前端开发,‌因为它能够过滤出Git代码暂存区的文件,‌只对这些文件进行lint检查,‌避免了全量文件的检查,‌从而提高了性能并减少了误操作的可能性。‌此外,‌lint-staged的使用可以整合到开发流程中,‌为开发者提供更流畅、‌更可靠的编码体验

记录四、报错 error Parsing error: Unexpected token :

使用 ESLint 9.0 时遇到“Parsing error: Unexpected token :”这类错误,通常是因为 ESLint 配置不正确或者没有正确解析 TypeScript 文件。

确保已经安装了 @typescript-eslint/parser 和 @typescript-eslint/eslint-plugin。这两个包是 ESLint 对 TypeScript 支持的核心。

记录五、TypeError: (intermediate value).globEager is not a function

由 import.meta.globEager(参数)改为 import.meta.glob(参数, {eager: true})

记录六、理解 import.meta.glob

import.meta.glob 是一个在 Vite、Snowpack 等现代前端构建工具中提供的特殊功能,它允许你基于 Glob 模式动态地导入多个模块。这个功能特别有用,当你需要基于文件系统的结构来动态地加载多个模块时,比如在一个 Vue、React 或其他前端框架的应用中,你可能需要导入一个目录下所有的组件或模块。 

import.meta.glob 返回一个对象,其键是匹配到的文件路径(相对于当前文件),值是动态导入的模块。但是,默认情况下,这些模块是懒加载的,即它们只会在被实际请求时才会被加载。

当你将 {eager: true} 作为第二个参数传递给 import.meta.glob 时,它会改变这个行为,使得所有匹配的模块在调用 import.meta.glob 时立即被加载(即非懒加载)。

// 假设你有一个目录 `./components/`,里面包含了多个 Vue 组件  
// 你想要在应用启动时立即加载这些组件  // 使用 Vite 或支持 import.meta.glob 的构建工具  
const modules = import.meta.glob('./components/*.vue', { eager: true });  // modules 现在是一个对象,其键是组件文件的路径,值是已解析的模块  
// 你可以遍历这个对象来访问这些组件  
for (const path in modules) {  // 注意:由于模块是立即加载的,你可以直接访问 modules[path] 来获取模块导出的内容  // 例如,如果组件默认导出了一个 Vue 组件,你可以这样做:  const component = modules[path].default;  // 现在你可以将 component 用作 Vue 组件或其他用途  
}  // 但是,请注意,由于所有组件都是立即加载的,这可能会影响你的应用的初始加载时间  
// 因此,请谨慎使用 {eager: true}

记录七、files[key].default为什么有的是命名导出有的是default

 解答

// 正确的默认导出  
export default function myFunction() {  // ...  
}  // 只有命名导出  
export function myNamedFunction() {  // ...  
}

记录八、Cannot find module '@/api/modules/m-abc-center.ts'

解决:增加一个声明

src/vite-env.d.ts

declare module "@/api/modules/m-abc-center.ts"

记录九、vite-env.d.ts的作用是什么

vite-env.d.ts(或有时简称为env.d.ts)是一个TypeScript声明文件,它在Vite项目中扮演着重要的角色。以下是vite-env.d.ts的主要作用:

序号作用解释
1声明环境变量类型vite-env.d.ts`文件通常用于声明项目中使用的环境变量类型。在Vite项目中,环境变量是在构建过程中进行动态替换的,而`vite-env.d.ts`则为这些环境变量提供了类型定义,使得TypeScript能够理解这些变量的类型,并在代码中使用时提供类型检查和智能提示。
2提高代码安全性通过为环境变量提供明确的类型定义,vite-env.d.ts帮助开发者在编写代码时避免类型错误,从而提高代码的类型安全性和可维护性。例如,如果某个环境变量被声明为字符串类型,那么TypeScript就会在编译时检查该变量的使用是否符合字符串类型的规范。
3支持全局类型声明vite-env.d.ts文件还可以用于声明全局类型。在TypeScript中,全局类型声明通常用于定义那些在整个项目中都可用的类型,比如全局变量、全局函数等。通过在vite-env.d.ts中声明这些全局类型,开发者可以在项目的任何位置使用它们,而无需在每个文件中都进行重复声明。
4引入其他类型的声明文件vite-env.d.ts文件中,开发者还可以使用/// <reference types="..." />指令来引入其他类型声明文件。这有助于将多个类型声明文件组织在一起,使得项目的类型定义更加清晰和易于管理。

/// <reference types="vite/client" />  interface ImportMetaEnv {  readonly VITE_API_URL: string;  // 其他环境变量...  
}  interface ImportMeta {  readonly env: ImportMetaEnv;  
}declare module "@/api/modules/m-abc-center.ts"

记录十、Vue 3项目中的.vue文件类型声明

declare module '*.vue' {  import type { DefineComponent } from 'vue'  const component: DefineComponent<{}, {}, any>  export default component  
}

在Vue 3与TypeScript结合使用时,由于.vue文件不是标准的TypeScript文件(它们包含模板、脚本和样式),因此TypeScript默认无法理解这些文件的结构。为了解决这个问题,我们需要通过声明文件来告诉TypeScript如何理解.vue文件中的组件。

四十、欢迎交流指正

四十一、参考链接

小程序-uni-app:uni-app-base项目基础配置及使用 / uni-app+vue3+ts+vite+vscode_uniapp-CSDN博客

nuxt3:我们开始吧-开发-配置-部署-CSDN博客

从 vue 源码看问题 —— 你真的了解 Vue 全局 Api 吗?_vue-global-api-CSDN博客

Vue 开发必须知道的36个技巧(小结)_vue.js_脚本之家

https://juejin.cn/post/7354298118236864566

Documentation - ESLint - Pluggable JavaScript Linter

配置文件 - ESLint - 插件化的 JavaScript 代码检查工具

vue3+ts+vite集成eslint

vue3:vue3+vite+ts+pinia_vue3+ts+vite+pinia项目-CSDN博客

https://juejin.cn/post/7038597045644427295

相关文章:

Vue:Vue3-TypeScript-Pinia-Vite-pnpm / 基础项目 / 20240807

一、项目技术栈 / 依赖 序号技术栈版本解释1node20.14.02vue 3.4.31 3vite 5.3.4 4TypeScript 5.2.2 5 types/node 22.0.2 解决TypeScript项目中缺少对应模块的类型定义文件的问题6 element-plus 2.7.8 ui组建7 types/js-cookie js-cookie 3.0.6 3.0.5 8 sass 1.77.8 9 hu…...

windows Qt 录屏 录音

启动录屏录音&#xff1a; connect(&m_Process, &QProcess::readyReadStandardOutput, [&]() {qDebug() << "Standard output:" << QString::fromLocal8Bit(m_Process.readAllStandardOutput()); });connect(&m_Process, &QProcess…...

AAC中的ADTS格式分析

&#x1f60e; 作者介绍&#xff1a;欢迎来到我的主页&#x1f448;&#xff0c;我是程序员行者孙&#xff0c;一个热爱分享技术的制能工人。计算机本硕&#xff0c;人工制能研究生。公众号&#xff1a;AI Sun&#xff08;领取大厂面经等资料&#xff09;&#xff0c;欢迎加我的…...

iOS内存管理---MRC vs ARC

系列文章目录 iOS基础—Block iOS基础—Protocol iOS基础—KVC vs KVO iOS网络—AFNetworking iOS网络—NSURLSession iOS内存管理—MRC vs ARC iOS基础—Category vs Extension iOS基础—多线程&#xff1a;GCD、NSThread、NSOperation iOS基础—常用三方库&#xff1a;Mason…...

【数学分析笔记】第1章第1节:集合(2)

这节我自己补了一些内容&#xff0c;要不然听不太懂陈纪修老师讲的 1. 集合与映射 1.3 子集与真子集 假如有 S \textbf{S} S和 T \textbf{T} T两个集合&#xff0c;其中&#xff0c; S \textbf{S} S的所有元素都属于 T \textbf{T} T&#xff0c;则称 S \textbf{S} S是 T \te…...

大话设计模式:七大设计原则

目录 一、单一职责原则&#xff08;‌Single Responsibility Principle, SRP&#xff09;‌ 二、开放封闭原则&#xff08;‌Open-Closed Principle, OCP&#xff09; 三、依赖倒置原则&#xff08;‌Dependency Inversion Principle, DIP&#xff09; 四、里氏替换原则&am…...

利用多商家AI智能名片小程序提升消费者参与度与个性化体验:重塑零售行业的忠诚策略

摘要&#xff1a;在数字化浪潮席卷全球的今天&#xff0c;零售行业正经历着前所未有的变革。消费者对于购物体验的需求日益多样化、个性化&#xff0c;而零售商则面临着如何将一次性购物者转化为品牌忠诚者的巨大挑战。多商家AI智能名片小程序作为一种新兴的数字营销工具&#…...

Scala 闭包

Scala 闭包 Scala 闭包是一个非常重要的概念&#xff0c;它允许我们创建可以在稍后某个时间点执行的功能片段。闭包是一个函数&#xff0c;它捕获了封闭范围内的变量&#xff0c;即使在函数外部&#xff0c;这些变量也可以在函数内部使用。这使得闭包成为处理异步操作、回调和…...

前端JS总结(中)

目录 前言 正文 对象&#xff1a; 分类&#xff1a; 自定义对象&#xff1a; 内置对象&#xff1a; 重点&#xff1a; 常用内置对象&#xff1a; 字符串对象&#xff1a;String 获取字符串长度&#xff1a; 大小写转换&#xff1a; 获取某个字符&#xff1a; 截取字…...

elasticsearch的match_phrase匹配及其可能导致的查询问题

目录 1.match_phrase使用介绍 2.规避可能产生的查询问题 解决方式 一.查询和索引分词器一致&#xff0c;即都使用max_word或者都使用smart 二.使用slop增加匹配的容忍度 3.参考文档 1.match_phrase使用介绍 elasticsearch的match_phrase查询是全文查询&#xff0c;主要用…...

C++快速理解之继承

一、继承和派生 1.是什么&#xff1f; C 中的继承是类与类之间的关系&#xff0c;与现实世界中的继承类似 例如&#xff1a;儿子继承父亲的财产 继承&#xff08;Inheritance&#xff09;可以理解为一个类从另一个类获取成员变量和成员函数的过程 例如&#xff1a; 类B继承…...

Node.JS - 基础(Express)

目录 A. 简介 B. 下载,安装 C. 启动服务,查看文件结构 A. 简介 Express 是一个基于 Node.js 平台的极简、灵活的 Web 应用开发框架&#xff0c;它提供了一系列强大的功能来构建 Web 应用程序和 API。 一、Express 的基本特点 简洁的路由系统&#xff1a; Express 的路由系…...

I/O复用

I/O复用使得程序能够同时监听多个文件描述符&#xff0c;这对提高程序的性能至关重要。 举个例子&#xff1a; 就好比你天天玩手机&#xff0c;你妈为了监控你&#xff0c;在你房间安装了一个监控&#xff0c;这个监控可以实时监控你的一举一动&#xff0c;并上传到你妈手机上…...

【验证可用】解决安装SQL Server数据库时,报错“启用 windows 功能 NetFx3 时出错,错误代码:-2146498298......“的问题

目录 背景一. 报错信息1.1 报错的图片信息1.2 报错的文字信息 二. 解决报错2.1 下载 NetFx3.cab 文件2.2 执行命令 三. SQL Server 修复安装 背景 一次在阿里云服务器安装 SQL Server 2012时&#xff0c;系统报错了&#xff0c;导致安装进行不下去…通过在网上查找了多种解决方…...

STM32的SDIO接口详解

目录 1. 定义与兼容性 2. SDIO时钟 3. SDIO命令与响应 4. SDIO块数据传输 5. SDIO控制器的硬件结构 6.代码实现 1.SD初始化 2.测试SD卡的读取 3.测试SD卡的写入 STM32的SDIO&#xff08;Secure Digital Input/Output&#xff0c;安全数字输入输出&#xff09;接口是一…...

docker容器常用指令,dockerfile

docker&#xff1a;容器&#xff0c;主要是解决环境迁移的问题&#xff0c;将环境放入docker中&#xff0c;打包成镜像。 docker的基本组成&#xff1a;镜像(image)&#xff0c;容器(container)&#xff0c;仓库(repository)。镜像相当于类&#xff0c;容器相当于类的实例对象…...

C语言学习笔记 Day11(指针--下)

Day11 内容梳理&#xff1a; 目录 Chapter 7 指针 7.6 指针 & 函数 &#xff08;1&#xff09;形参改变实参的值 &#xff08;2&#xff09;字符数组作为函数参数 1&#xff09;合并字符串 2&#xff09;删掉字符串中空格 &#xff08;3&#xff09;指针作为函数返…...

(24)(24.2) Minim OSD快速安装指南(二)

文章目录 前言 6 MinimOSD-extra NG 7 替代硬件 前言 本文简要介绍了如何连接电路板。有关更多详细说明&#xff0c;请参阅 MinimOSD 项目维基(MinimOSD Project wiki)。 6 MinimOSD-extra NG 该项目位于此处(here)&#xff1b;文档位于此处(here)&#xff1b;支撑线位于此…...

GD32 MCU碰到IIC总线卡死怎么办?

大家在使用MCU IIC通信时&#xff0c;若碰到设备复位或者总线干扰等情况&#xff0c;可能会导致IIC总线卡死&#xff0c;表现上总线上SDA或者SCL其中一根线为低电平&#xff0c;IIC总线一直处于busy状态。此时若代码上一直等待总线空闲&#xff0c;则可能导致软件死机&#xff…...

算法——动态规划:0/1 背包问题

文章目录 一、问题描述二、解决方案1. DP 状态的设计2. 状态转移方程3. 算法复杂度4. 举例5. 实现6. 滚动数组6.1 两行实现6.2 单行实现6.3 优缺点 三、总结 一、问题描述 问题的抽象&#xff1a;给定 n n n 种物品和一个背包&#xff0c;第 i i i 个物品的体积为 c i c_i …...

又是奇瑞,“统一下班时间”过去不久,最近又整新活了...

奇瑞 345 345 可不是奇瑞的汽车型号&#xff0c;而是奇瑞 7 月份会议文章中提出的新策略。 简单来说&#xff0c;要提高加班效率&#xff0c;实现 3 个人干 5 个人活&#xff0c;拿 4 个人的工资&#xff0c;要把员工当成家人一样看待&#xff0c;要对他们的健康幸福负责。 前面…...

ubuntu24.04lts cmake编译 opencv4.5.4 contrib的一些问题

编译之前一定要安装好必须的库&#xff0c;否则即使提示编译成功&#xff0c;调用opencv后也可能会有问题 sudo apt-get update sudo apt-get upgradesudo apt-get install -y g sudo apt-get install -y cmake sudo apt-get install -y make sudo apt-get install…...

大数据面试SQL(三):每分钟在线直播人数

文章目录 每分钟在线直播人数 一、题目 二、分析 三、SQL实战 四、样例数据参考 每分钟在线直播人数 一、题目 有如下数据记录直播平台主播上播及下播时间&#xff0c;根据该数据计算出平台每分钟的在线直播人数。 这里用主播名称做统计&#xff0c;前提是主播名称唯一…...

python中执行mysql操作并将python脚本共享

mysql下载路径&#xff1a; ​​​​​​MySQL :: MySQL Community Downloads [root2 ~]# vim py001.py a3 b4 print(ab) print(a**2b**2) [root2 ~]# python py001.py 7 25 [root2 ~]# python3 >>> import random >>> random <module rando…...

HTTP、HTTPS、SOCKS5三种协议特点

在互联网通信中&#xff0c;HTTP、HTTPS和SOCKS5是三种至关重要的协议&#xff0c;它们各自具有独特的特点和应用场景。本文将详细探讨这三种协议的特点&#xff0c;帮助读者更好地理解它们在网络通信中的作用。 一、HTTP协议特点 HTTP&#xff08;Hypertext Transfer Protoc…...

在ubuntu、centos、openEuler安装Docker

目录 ubuntu、centos、openEuler安装Docker 1.在 Ubuntu 上安装 Docker 1. 1 更新软件包 1. 2 安装必要的依赖 1.3 添加 Docker 的 GPG 密钥 1.4 添加 Docker 仓库 1.5 更新软件包 1.6 安装 Docker 1.7 启动并启用 Docker 服务 1.8 验证安装 1.9 运行测试容器 1.10…...

公共命名空间的例子3

有这样一个句子 用x语言解释[12*3]。 在x语言中&#xff0c;不符合“先乘除后加减”&#xff0c;这个句子应该怎样解释呢&#xff1f; 第一步&#xff0c;进行词法分析&#xff0c;目的是识别出注释和字符串&#xff0c;其中可能包括任意符号&#xff0c;干扰编译过程。 第二步…...

【云存储】SDS软件定义存储,数据存储的类型与技术方案(块/文件/对象,Ceph、RBD等)

【云存储】SDS软件定义存储&#xff0c;数据存储的类型与技术方案&#xff08;块/文件/对象&#xff0c;Ceph、RBD等&#xff09; 文章目录 1、分布式存储架构&#xff08;软件定义存储SDS&#xff0c;超融合基础架构HCI&#xff09;2、存储类型&#xff08;块存储&#xff0c;…...

第31课 Scratch入门篇:小画家(舞台上画画)

小画家(舞台上画画) 故事背景: 在舞台上选择画笔和颜色,进行画画 程序原理: 这节课我们继续练习画笔功能,通过画笔功能我们设计一个小画板,碰到哪种颜色画笔就切换成哪种颜色。 开始编程 1、绘制一大一小的黑色圆形,小的命名为画笔,大的圆形命名为black(黑色) 2、鼠…...

QT UI界面之ListView

文章目录 概述源码怎么用代码qt design 小结 概述 本来把布局文件那块写了一遍&#xff0c;但是看看都跟之前那篇差不多&#xff0c;就换了一个稍微有点难度的&#xff0c;也很常用的listview来写了。来看看&#xff0c;有什么好玩的。 源码 先看下源码&#xff0c;如下&…...