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

Vite创建vue3+ts+pinia+vant项目起步流程

pnpm介绍&安装

本质上他是一个包管理工具,和npm/yarn没有区别,主要优势在于

  • 包安装速度极快
  • 磁盘空间利用效率高

安装:

npm i pnpm -g

使用:

npm命令pnpm等效
npm installpnpm install
npm i axiospnpm add axios
npm i webpack -Dpnpm add webpack -D
npm run devpnpm dev

小结:

  • pnpm 是一个高效的包管理工具,使用和npm和yarn基本相同

1、项目创建

使用 create-vue 脚手架创建项目

create-vue,即官方的项目脚手架工具,提供了搭建基于 Vite且 TypeScript 就绪的 Vue 项目的选项。

步骤:

  1. 执行创建命令
pnpm create vue
# or
npm init vue@latest
# or
yarn create vue
  1. 选择项目依赖内容
✔ Project name: … patients-h5-100
✔ Add TypeScript? … No / `Yes`
✔ Add JSX Support? … `No` / Yes
✔ Add Vue Router for Single Page Application development? … No / `Yes`
✔ Add Pinia for state management? … No / `Yes`
✔ Add Vitest for Unit Testing? … `No` / Yes
✔ Add Cypress for both Unit and End-to-End testing? … `No` / Yes
✔ Add ESLint for code quality? … No / `Yes`
✔ Add Prettier for code formatting? … No / `Yes`Scaffolding project in /Users/zhousg/Desktop/patient-h5-100...Done. Now run:cd patient-h5-100pnpm installpnpm lintpnpm dev

2、项目准备工作

vscode插件安装

安装:项目开发需要的一些插件

必装:

  • Vue Language Features (Volar) 语法高亮,代码提示, volar支持setup语法糖,官方推荐vue3使用
  • TypeScript Vue Plugin (Volar) vvue3中更好的ts提示, 让Ts服务知道.vue文件
  • Eslint 代码风格校验

注意

  • vscode 安装了 Prettier 插件的可以先 禁用,或者关闭保存自动格式化功能,避免和项目的 Eslint 风格冲突。
  • (Volar为vue3开发)(vetur主要是vue2)Volar和vetur不能共存

可选:

  • gitLens 代码git提交记录提示
  • json2ts json自动转ts类型
  • Error Lens 行内错误提示 💡

提示:

大中型项目建议开启 TS托管模式 , 更好更快的类型提示。

更高效的开启TS托管模式 (Take Over Mode(托管模式),TS服务性能更好)

什么是托管模式,vscode内置了一套ts服务,volar也提供了一套ts服务,所以需要开启托管模式,让ts性能提示更加高效,只需要下面两步即可,1.关闭vscode内置的TS服务,2.使用Volar提供的TS服务

vscode 插件中搜索 @builtin ty,在当前工作区禁用ts服务后,重启vscode即可。

在这里插入图片描述

查看ts已托管成功,重启后vscode工具栏下方有这个提示即可

在这里插入图片描述

这里就相当于告诉vscode,你不需要提供ts服务了,我找个人(volar插件)来替你服务,即所谓的托管。

eslint 预制配置

.eslintrc.cjs文件
加入如下配置,覆盖原有的eslint配置

  rules: {'prettier/prettier': ['warn',{singleQuote: true,//单引号semi: false,//没有分号printWidth: 80,//行宽度80字符trailingComma: 'none',//没有对象数组最后一个逗号endOfLine: 'auto'//换行字符串自动(系统不一样换行符号不一样)}],//新手在组件命名的时候不够规范,根据官方风格指南,除了根组件(App.vue)外,// 自定义组件名称应该由多单词组成,防止和html标签冲突。'vue/multi-word-component-names': ['warn',{ignores: ['index']}],// 允许对 props 进行解构'vue/no-setup-props-destructure': ['off'],// 添加未定义变量错误提示'no-undef': 'error'}
  • 格式:单引号,没有分号,行宽度80字符,没有对象数组最后一个逗号,换行字符串自动(系统不一样换行符号不一样)
  • vue 组件需要大驼峰命名,除去 index 之外,App 是默认支持的
  • 允许对 props 进行解构,我们会开启解构保持响应式的语法糖

执行:

# 修复格式
pnpm lint

vscode 开启 eslint 自动修复

    "editor.codeActionsOnSave": {"source.fixAll": true,},

提示安装Eslint且配置保存修复,不要开启默认的自动保存格式化

代码检查工作流

提交代码前做代码检查 -使用husky这个git hooks工具(husky相当于是git的钩子)

husky [ˈhʌski] 哈士奇

eslint只能修复代码的风格,不能修复代码的错误,此时提交代码比较危险

怎么做?安装husky工具(这个工具是在commit提交文件之前检查代码是否有问题的和git一起用)

  1. 初始化git仓库,执行git init即可

  2. 初始化husky工具配置,执行

    pnpm dlx husky-init && pnpm install
    
  3. 修改 .husky/pre-commit 文件,添加pnpm lint 这个命令

    在这里插入图片描述

pnpm lint是全量检查,突然添加就会有耗时问题和检查历史遗留问题,所以最好只检查修改的文件,在暂存区做lint校验(git add .的时候把文件提交到了暂存区),在commit命令之前去执行

如何只检查暂存区代码?

  1. 安装lint-staged

    pnpm i lint-staged -D
    
  2. 配置 package.json

    {// ... 省略 ..."lint-staged": {"*.{js,ts,vue}": ["eslint --fix"]}
    }
    
    {"scripts": {// ... 省略 ..."lint-staged": "lint-staged"}
    }
    
  3. 修改 .husky/pre-commit 文件

    pnpm lint-staged
    
  4. 图示

    在这里插入图片描述

在这里插入图片描述

项目结构调整

了解:每一个目录结构的作用

./src├── assets        `静态资源,图片...`├── components    `通用组件`├── composables   `组合功能通用函数`├── icons         `svg图标`├── router        `路由`│   └── index.ts├── services      `接口服务API`├── stores        `状态仓库`├── styles        `样式`│   └── main.scss├── types         `TS类型`├── utils         `工具函数`├── views         `页面`├── main.ts       `入口文件`└──App.vue       `根组件`

assets, components, stores, views 清空文件夹

composables, icons, services, styles/main.scss, types, utils 新建文件夹

router/index.ts, main.ts, App.vue 修改

router/index.ts

import { createRouter, createWebHistory } from 'vue-router'const router = createRouter({history: createWebHistory(import.meta.env.BASE_URL),routes: []
})export default router

main.ts

import { createApp } from 'vue'
import { createPinia } from 'pinia'import App from './App.vue'
import router from './router'//导入新创建的全局样式文件
import './styles/main.scss'const app = createApp(App)app.use(createPinia())
app.use(router)app.mount('#app')

App.vue

<script setup lang="ts"></script><template><div>App</div>
</template><style scoped></style>

项目使用sass预处理器,安装sass,即可支持scss语法:

pnpm add sass -D

导入 main.ts 作为全局样式

import './styles/main.scss'

路由代码解析

import { createRouter, createWebHistory } from 'vue-router'// createRouter 创建路由实例,===> new VueRouter()
// history 是路由模式,hash模式,history模式
// createWebHistory() 是开启history模块   http://xxx/user
// createWebHashHistory() 是开启hash模式    http://xxx/#/user// vite 的配置 import.meta.env.BASE_URL 是路由的基准地址,默认是 ’/‘
// https://vitejs.dev/guide/build.html#public-base-path
// 如果将来你部署的域名路径是:http://xxx/my-path/user
// vite.config.ts  添加配置  base: my-path,路由这就会加上 my-path 前缀了const router = createRouter({history: createWebHistory(import.meta.env.BASE_URL),routes: []
})export default router
  1. 创建路由实例由 createRouter 实现
  2. 路由模式
    • history 模式使用 createWebHistory()
    • hash 模式使用 createWebHashHistory()
    • 参数是基础路径,默认/

扩展:import.meta.env.BASE_URL

import.meta 是 JavaScript 模块暴露的描述模块的信息对象

在这里插入图片描述

env.BASE_URL 是Vite 环境变量

在这里插入图片描述

3、移动端项目基础架构要做的工作

在这里插入图片描述

4、构建界面

vant组件库

文档

安装:

# Vue 3 项目,安装最新版 Vant
npm i vant
# 通过 yarn 安装
yarn add vant
# 通过 pnpm 安装
pnpm add vant

引入组件 - vant 自动引入组件,并按需引入组件的样式:

在基于 vitewebpackvue-cli 的项目中使用 Vant 时,可以使用 unplugin-vue-components 插件,它可以自动引入组件。

Vant 官方基于 unplugin-vue-components 提供了自动导入样式的解析器 @vant/auto-import-resolver,两者可以配合使用。

  1. 安装插件

    # 通过 npm 安装
    npm i @vant/auto-import-resolver unplugin-vue-components -D# 通过 yarn 安装
    yarn add @vant/auto-import-resolver unplugin-vue-components -D# 通过 pnpm 安装
    pnpm add @vant/auto-import-resolver unplugin-vue-components -D# 通过 bun 安装
    bun add @vant/auto-import-resolver unplugin-vue-components -D
    
  2. 配置插件

    如果是基于 vite 的项目,在 vite.config.js 文件中配置插件:

    import vue from '@vitejs/plugin-vue';
    import Components from 'unplugin-vue-components/vite';
    import { VantResolver } from '@vant/auto-import-resolver';export default {plugins: [vue(),Components({resolvers: [VantResolver()],}),],
    };
    
  3. 使用组件

    <template><van-button type="primary" />
    </template>
    
  4. 引入函数组件的样式

    Vant 中有个别组件是以函数的形式提供的,包括 ToastDialogNotifyImagePreview 组件。在使用函数组件时,unplugin-vue-components 无法解析自动注册组件,导致 @vant/auto-import-resolver 无法解析样式,因此需要手动引入样式。

    // Toast
    import { showToast } from 'vant';
    import 'vant/es/toast/style';// Dialog
    import { showDialog } from 'vant';
    import 'vant/es/dialog/style';// Notify
    import { showNotify } from 'vant';
    import 'vant/es/notify/style';// ImagePreview
    import { showImagePreview } from 'vant';
    import 'vant/es/image-preview/style';
    

移动端适配

实现:使用 vw 完成移动端适配

文档

安装:

npm install postcss-px-to-viewport -D
# or
yarn add -D postcss-px-to-viewport
# or
pnpm add -D postcss-px-to-viewport

配置: postcss.config.js

// eslint-disable-next-line no-undef
module.exports = {plugins: {'postcss-px-to-viewport': {// 设备宽度375计算vw的值viewportWidth: 375,},},
};

测试:

在这里插入图片描述

  • 有一个控制台警告可忽略,或者使用 postcss-px-to-viewport-8-plugin 代替当前插件

css变量主题定制

实现:使用css变量定制项目主题,和修改vant主题

官方文档

  • 全局变量:使用场景:项目主题

    :root {/* 全局css变量 */--main: #999;--cp-primary: #16C2A3;/* 覆盖vant主体色 */--van-primary-color: var(--cp-primary);
    }a {/* 使用变量 */color: var(--main)
    }
    
  • 局部变量:使用场景:组件变量

    .footer {/* 局部变量 */--footer-color: green;
    }.footer {/* 只能在footer下使用 */color: var(--footer-color);
    }
    
  • 如何覆盖vant的主题色:找到主题色的变量名,覆盖即可

    styles/main.scss
    注意:为什么要写两个重复的 :root?
    由于 vant 中的主题变量也是在 :root 下声明的,所以在有些情况下会由于优先级的问题无法成功覆盖。通过 :root:root 可以显式地让你所写内容的优先级更高一些,从而确保主题变量的成功覆盖。

    :root:root {// 问诊患者:色板--cp-primary: #16C2A3;--cp-plain: #EAF8F6;--cp-orange: #FCA21C;--cp-text1: #121826;--cp-text2: #3C3E42;--cp-text3: #6F6F6F;--cp-tag: #848484;--cp-dark: #979797;--cp-tip: #C3C3C5;--cp-disable: #D9DBDE;--cp-line: #EDEDED;--cp-bg: #F6F7F9;--cp-price: #EB5757;// 覆盖vant主题色--van-primary-color: var(--cp-primary);
    }
    

    App.vue

    <script setup lang="ts"></script><template><!-- 验证vant颜色被覆盖 --><van-button type="primary">按钮</van-button><a href="#">123</a>
    </template><style scoped lang="scss">
    // 使用 css 变量
    a {color: var(--cp-primary);
    }
    </style>
    

    补充内容

1、css变量

有的网站都会有自己的主题色,例如饿了么:

在这里插入图片描述

所以很多元素都会用到这些颜色,例如某些字体颜色,弹框提示颜色等等。

如果每次用到的时候,都使用十六进制的颜色表示,那么效率十分低,并且如果万一有一天需要更换主题颜色,那么一个一个更改,是十分繁琐的。

为了解决以上问题,css引入了变量。

var() 函数用于插入 CSS 变量的值。全局变量可以在整个文档进行访问使用,局部变量只能在声明它的选择器内部使用

例如:

        /* 全局变量 */:root {--main-color: red;}/* 局部变量 */.footer {--footer-color: green;}

:root声明的是全局变量,如果是一个自定义属性-- 作为前缀,使用时比如: var(–main-color)就和red相等。

好处:

  1. 可维护性
    如果没有CSS变量需要手动改变大量的属性值,使用批量处理查找和替换,可能会影响其他样式规则。使用CSS变量只用改变定义时的值。
  2. 提高CSS可读性
    可以通过变量名判断属性内容

注意事项:使用CSS变量要注意大小写敏感,不要把长度的变量用于颜色属性等。

2、实例

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title><style>/* 全局变量可以在整个文档进行访问使用 */:root {--main-color: red;}/* 局部变量只能在声明它的选择器内部使用 */.footer {--footer-color: green;}.main {color: var(--main-color);	/* √ 生效 */background-color: var(--footer-color);	/* × 不生效 */}.footer {color: var(--main-color);	/* √ 生效 */background-color: var(--footer-color);	/* √ 生效 */}</style>
</head><body><div class="main">main</div><br /><div class="footer">footer</div>
</body></html>

在这里插入图片描述

5、状态管理

用户状态仓库

完成:用户信息仓库创建,提供用户信息,修改用信息,删除用户信息的方法

  • 请求工具需要携带token,访问权限控制需要token,所以用户信息仓库先完成

需求:

  • 用户信息仓库创建
  • 提供用户信息
  • 修改用信息的方法
  • 删除用信息的方法

在这里插入图片描述

代码:

types/user.d.ts

// 用户信息
export type User = {// token令牌token: string// 用户IDid: string// 用户名称account: string// 手机号mobile: string// 头像avatar: string
}

stores/user.ts

import { ref } from 'vue'
import { defineStore } from 'pinia'
import type { User } from '@/types/user'export const useUserStore = defineStore('cp-user', () => {// 1.用户信息状态const user = ref<User>()// 2.设置用户信息函数const setUser = (u: User) => {user.value = u}// 3.删除用户信息的函数const delUser = () => {user.value = undefined}return {user,setUser,delUser}
})

测试App.vue

<script setup lang="ts">
import { useUserStore } from '@/stores/user'
import type { User } from './types/user'const store = useUserStore()const login = () => {const user: User = {token: 'xxx',id: '1',account: 'xxx',mobile: 'xxx',avatar: 'xxx'}store.setUser(user)
}
const logout = () => {store.delUser()
}
</script><template><div>{{ store.user }}<van-button type="primary" @click="login">登录</van-button><van-button type="primary" @click="logout">退出</van-button></div>
</template><style scoped lang="scss"></style>

小结:

  • pinia存储这个数据的意义?
    • 数据共享,提供给项目中任何位置使用
  • 如果存储了数据,刷新页面后数据还在吗?
    • 不在,现在仅仅是js内存中,需要进行本地存储(持久化)

数据持久化

掌握:使用 pinia-plugin-persistedstate 实现pinia仓库状态持久化,且完成测试

参考文档

在这里插入图片描述

  • 安装

    pnpm i pinia-plugin-persistedstate
    # or
    npm i pinia-plugin-persistedstate
    # or
    yarn add pinia-plugin-persistedstate
    
  • main.ts

    import persist from 'pinia-plugin-persistedstate'
    const app = createApp(App)app.use(createPinia().use(persist))
    
  • 配置 stores/user.ts

    import { ref } from 'vue'
    import { defineStore } from 'pinia'
    import type { User } from '@/types/user'export const useUserStore = defineStore('cp-user',() => {// 1.用户信息状态const user = ref<User>()// 2.设置用户信息函数const setUser = (u: User) => {user.value = u}// 3.删除用户信息的函数const delUser = () => {user.value = undefined}return {user,setUser,delUser}},{// 开启本地持久化persist: true}
    )
    
  • 测试 App.vue

    <script setup lang="ts">
    import { useUserStore } from '@/stores/user'
    import type { User } from './types/user'const store = useUserStore()const login = () => {const user: User = {token: 'xxx',id: '1',account: 'xxx',mobile: 'xxx',avatar: 'xxx'}store.setUser(user)
    }
    const logout = () => {store.delUser()
    }
    </script><template><div>{{ store.user }}<van-button type="primary" @click="login">登录</van-button><van-button type="primary" @click="logout">退出</van-button></div>
    </template><style scoped lang="scss"></style>

stores统一导出

如何统一管理?

  1. pinia 独立维护

    • 现在:初始化代码在 main.ts 中,仓库代码在 stores中,代码分散职能不单一

    • 优化:由 stores 统一维护,在 stores/index.ts 中完成 pinia 初始化,交付 main.ts 使用

  2. 仓库 统一导出

    • 现在:使用一个仓库 import { useUserStore } from ./stores/user.ts 不同仓库路径不一致

    • 优化:由 stores/index.ts 统一导出,导入路径统一 ./stores,而且仓库维护在 stores/modules 中

抽取pinia实例代码,职能单一

stores/index

import { createPinia } from 'pinia'
import persist from 'pinia-plugin-persistedstate'// 创建pinia实例
const pinia = createPinia()
// 使用pinia插件
pinia.use(persist)
// 导出pinia实例,给main使用
export default pinia

main.ts

import { createApp } from 'vue'
import pinia from './stores'
import App from './App.vue'
import router from './router'
import './styles/main.scss'const app = createApp(App)app.use(pinia)
app.use(router)
app.mount('#app')

统一导出,代码简洁,入口唯一

stores/index

import { createPinia } from 'pinia'
import persist from 'pinia-plugin-persistedstate'// 创建pinia实例
const pinia = createPinia()
// 使用pinia插件
pinia.use(persist)
// 导出pinia实例,给main使用
export default pinia// import { useUserStore } from './modules/user'
// export { useUserStore }
export * from './modules/user'

App.vue

-import { useUserStore } from './stores/user'
+import { useUserStore } from './stores'

6、数据交互

请求工具

在这里插入图片描述

axios配置

创建axios实例

基准地址,超时时间

请求拦截器

携带 token

响应拦截器

业务失败处理,摘取核心响应数据,401处理

业务失败处理&摘取核心响应数据

业务失败处理:

  1. 如何判断业务失败?code 不是 10000
  2. 失败后需要做什么?弹出轻提示,此时返回一个失败的 promise,传递code给catch

摘取核心响应数据:

  1. 现在结果 ===> { data: 响应数据 }
  2. 期望结果 ===> 响应数据

在这里插入图片描述

响应失败-token无效401处理

在这里插入图片描述

代码

实现:token请求头携带,错误响应处理,摘取核心响应数据, 401错误处理

utils/request.ts

模板代码:

import axios from 'axios'const instance = axios.create({// TODO 1. 基础地址,超时时间
})instance.interceptors.request.use((config) => {// TODO 2. 携带tokenreturn config},(err) => Promise.reject(err)
)instance.interceptors.response.use((res) => {// TODO 3. 处理业务失败// TODO 4. 摘取核心响应数据return res},(err) => {// TODO 5. 处理401错误return Promise.reject(err)}
)export default instance

代码实现:

import { useUserStore } from '@/stores'
import axios, { AxiosError } from 'axios'
import router from '@/router'
import { showToast } from 'vant'
import 'vant/es/toast/style'const instance = axios.create({// 1. 基础地址,超时时间baseURL: 'https://consult-api.itheima.net/',timeout: 10000
})instance.interceptors.request.use((config) => {// 2. 携带tokenconst store = useUserStore()if (store.user?.token && config.headers) {config.headers.Authorization = `Bearer ${store.user.token}`}return config},(err) => Promise.reject(err)
)instance.interceptors.response.use((res) => {// 3. 处理业务失败// 后台约定,响应成功,但是code不是10000,是业务逻辑失败if (res.data.code !== 10000) {// 错误提示showToast(res.data.message || '业务失败')// 返回错误的promise// 传入code将来catch的时候可以使用(res.data包含code)return Promise.reject(res.data)}// 4. 摘取核心响应数据return res.data},(err: AxiosError) => {// 5. 处理401错误if (err.response?.status === 401) {// 删除用户信息const store = useUserStore()store.delUser()// 跳转登录,带上接口失效所在页面的地址,登录完成后回跳使用router.push({path: '/login',query: { returnUrl: router.currentRoute.value.fullPath }})}return Promise.reject(err)}
)export default instance

请求函数

函数封装

简化传参逻辑

在这里插入图片描述

添加类型

设置响应数据类型

在这里插入图片描述

扩展:为什么使用axios.request()泛型第二个参数?

在这里插入图片描述

代码

实现:导出一个通用的请求工具函数,支持设置响应数据类型

utils/request.ts

import { useUserStore } from '@/stores'
import axios, { AxiosError, type Method } from 'axios'
import router from '@/router'
import { showToast } from 'vant'
import 'vant/es/toast/style'const instance = axios.create({// 1. 基础地址,超时时间baseURL: 'https://consult-api.itheima.net/',timeout: 10000
})instance.interceptors.request.use((config) => {// 2. 携带tokenconst store = useUserStore()if (store.user?.token && config.headers) {config.headers.Authorization = `Bearer ${store.user.token}`}return config},(err) => Promise.reject(err)
)instance.interceptors.response.use((res) => {// 3. 处理业务失败// 后台约定,响应成功,但是code不是10000,是业务逻辑失败if (res.data.code !== 10000) {// 错误提示showToast(res.data.message || '业务失败')// 返回错误的promise// 传入code将来catch的时候可以使用(res.data包含code)return Promise.reject(res.data)}// 4. 摘取核心响应数据return res.data},(err: AxiosError) => {// 5. 处理401错误if (err.response?.status === 401) {// 删除用户信息const store = useUserStore()store.delUser()// 跳转登录,带上接口失效所在页面的地址,登录完成后回跳使用router.push({path: '/login',query: { returnUrl: router.currentRoute.value.fullPath }})}return Promise.reject(err)}
)export default instance// 请求工具函数
type Data<T> = {code: numbermessage: stringdata: T
}
export const request = <T>(url: string,method: Method = 'GET',submitData?: object
) => {// 参数:地址,请求方式,提交的数据// 返回:promisereturn instance.request<any, Data<T>>({url,method,[method.toUpperCase() === 'GET' ? 'params' : 'data']: submitData})
}

测试:

<script setup lang="ts">
import { request } from '@/utils/request'
import type { User } from './types/user'
import { useUserStore } from './stores'const store = useUserStore()
const login = async () => {const res = await request<User>('/login/password', 'POST', {mobile: '13211112222',password: 'abc12345'})store.setUser(res.data)
}
</script><template><van-button type="primary" @click="login">登录</van-button>
</template>

相关文章:

Vite创建vue3+ts+pinia+vant项目起步流程

pnpm介绍&安装 本质上他是一个包管理工具&#xff0c;和npm/yarn没有区别&#xff0c;主要优势在于 包安装速度极快磁盘空间利用效率高 安装&#xff1a; npm i pnpm -g使用&#xff1a; npm命令pnpm等效npm installpnpm installnpm i axiospnpm add axiosnpm i webpa…...

JVM 类的加载子系统

文章目录 类的加载过程加载阶段链接阶段初始化 类的加载器测试代码中获取对应的加载器获取加载器加载的路径不同类对应的加载器自定义加载器自定义加载器的方式 获取类的加载器的方式双亲委派机制双亲委派机制的好处 Java 的 SPI 机制1. 接口定义2. 具体实现3. 配置 META-INF/s…...

什么是1024程序员节

一年一度专属于程序员的节日“1024程序员节”要到来了&#xff0c;相信有很多的小伙伴跟我一样&#xff0c;对这个节日非常的熟悉&#xff0c;但也有一下小伙伴对这个节日非常陌生&#xff0c;没事&#xff0c;下面由我来讲解一下1024程序员节。 目录 节日背景 节日由来 社…...

spark获取hadoop服务token

spark 作业一直卡在accepted 问题现象问题排查1.查看yarn app日志2.问题分析与原因 问题现象 通过yarn-cluster模式提交spark作业&#xff0c;客户端日志一直卡在submit app&#xff0c;没有运行 问题排查 1.查看yarn app日志 appid已生成&#xff0c;通过yarn查看app状态为…...

Simulink 最基础教程(一)

1.1基本概念 一个典型的Simulink模型大致如上图这样&#xff1a; 1&#xff09;模块 block&#xff1a;图中画圈的那些&#xff0c;每个模块可以完成一些特定的任务&#xff0c;类似MATLAB中函数的概念。软件提供了很多模块&#xff0c;当然也可以自定义新的模块 2&#xff0…...

微信小程序:单行输入和多行输入组件

微信小程序提供了两种输入类型的输入框组件&#xff0c;分别是单行输入框 <input> 和多行输入框 <textarea>。 1. 单行输入组件&#xff08;input&#xff09; 单行输入框 <input> <input> 是一个用于收集用户输入的组件&#xff0c;主要用于收集单行…...

1024程序员

听说今天可以拿勋章&#xff0c;嘿嘿...

【Segment Anything Model】八:修改SAM源码做分类任务

🍉 博主微信 cvxiayixiao 🍓 【Segment Anything Model】计算机视觉检测分割任务专栏。 链接 🍑 【公开数据集预处理】特别是医疗公开数据集的接受和预处理,提供代码讲解。链接 🍈 【opencv+图像处理】opencv代码库讲解,结合图像处理知识,不仅仅是调库。链接 文章目…...

Java后端开发——实现登录验证程序

一、实现一个简单登录验证程序 实现一个简单的用户登录验证程序&#xff0c;如果用户名是 abc &#xff0c;密码是 123&#xff0c;则显示欢迎用户的信息&#xff0c;否则显示“用户名或密码不正确”。 【分析】 该案例采用 JSP 页面只完成提交信息和验证结果的显示&#xff…...

CSS高频面试题

1.行内元素有哪些?块级元素有哪些?空元素有哪些&#xff1f;CSS的盒模型? 块级元素&#xff1a;div, p, h1-h6,form, ul ,li行内元素&#xff1a;a, b, br, span, i, input, select行内块级元素&#xff1a;img , input空元素&#xff1a;即没有内容的HTML元素&#xff0c;…...

解决matlab报错“输入参数的数目不足”

报错语句&#xff1a;tanh((peakNums-parameter)/2) 报错提示&#xff1a;输入参数的数目不足 运行环境&#xff1a;matlab2021b 分析原因&#xff1a; 当执行peakNums - parameter时&#xff0c;如果peakNums和parameter都是向量&#xff0c;那么这并不一定意味着会得到对应…...

使用python_opencv比较图像差异/使用python_opencv找出两张图像的差异范围

目录 1 创建conda环境 2 安装python库 2.1 报错 ModuleNotFoundError: No module named numpy 3 image_diff.py...

NOIP2023模拟1联测22 爆炸

NOIP2023模拟1联测22 爆炸 题目大意 ​ 自己看 思路 当一个炸弹被引爆后&#xff0c;它的方向是固定的。如果被竖着引爆&#xff0c;那么应该选择横着引爆&#xff0c;否则选择竖着引爆&#xff0c;这是显然 的。 考虑对于每个炸弹 ( i , j ) (i , j) (i,j) 将第 i i i 行…...

http post协议实现简单的rpc协议,WireShark抓包分析

文章目录 1.http 客户端-RPC客户端1.http 服务端-RPC服务端3.WireShark抓包分析3.1客户端到服务端的HTTP/JSON报文3.2服务端到客户端的HTTP/JSON报文 1.http 客户端-RPC客户端 import json import requests# 定义 RPC 客户端类 class RPCClient:def __init__(self, server_url…...

1024程序员节

一年一年真快啊&#xff0c;...

嵌入式--->怎样选择编译语言,C C++或是Rust?

C 老牌语言&#xff0c;不可替代&#xff0c;速度和资源占用都是嵌入式领域着重考虑的 Rust 作为新生语言&#xff0c;已经成长到可以和C进行竞争的地步&#xff0c;不论是速度还是资源占用看&#xff0c;还是安全性 C 嵌入式开发使用C的思想&#xff0c;可以极大地简化代码&am…...

一起学数据结构(12)——归并排序的实现

1. 归并排序原理&#xff1a; 归并排序的大概原理如下图所示&#xff1a; 从图中可以看出&#xff0c;归并排序的整体思路就是把已给数组不断分成左右两个区间&#xff0c;当这个区间中的数据数量到达一定数值时&#xff0c;便返回去进行排序&#xff0c;整体的结构类似二叉树…...

读书笔记之《敏捷测试从零开始》(一)

大家好&#xff0c;我是rainbowzhou。 子曰&#xff1a;学而时习之&#xff0c;不亦说乎&#xff1f;今天我想和大家分享一本测试书籍——《敏捷测试从零开始》。以下为我的读书笔记&#xff1a; 精彩片段摘录&#xff1a; 焦虑往往来自于对比&#xff0c;当你在自己的圈子里面…...

视频亮度太低了,如何调高

充足、均匀、稳定的光亮对于视频制作是至关重要的&#xff0c;在现实生活中&#xff0c;不可预见的天气变化和拍摄地方的阴暗常常给我们留下暗淡无光的视频片段。 如果你的视频太暗想知道如何使它变亮&#xff0c;且又不知道使用哪个工具&#xff0c;那你无需担心&#xff0c;因…...

Xubuntu16.04系统中安装create_ap创建无线AP

1.背景说明 在Xubuntu16.04系统的设备上安装无线WIFI模块后&#xff0c;想通过设备自身的无线AP&#xff0c;进行和外部设备的连接&#xff0c;需要安装create_ap软件&#xff0c;并设置无线AP的名称和密码&#xff0c;并设置为开机自启动。 create_ap是一个用于在Linux系统上创…...

SpringBoot-17-MyBatis动态SQL标签之常用标签

文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…...

谷歌浏览器插件

项目中有时候会用到插件 sync-cookie-extension1.0.0&#xff1a;开发环境同步测试 cookie 至 localhost&#xff0c;便于本地请求服务携带 cookie 参考地址&#xff1a;https://juejin.cn/post/7139354571712757767 里面有源码下载下来&#xff0c;加在到扩展即可使用FeHelp…...

设计模式和设计原则回顾

设计模式和设计原则回顾 23种设计模式是设计原则的完美体现,设计原则设计原则是设计模式的理论基石, 设计模式 在经典的设计模式分类中(如《设计模式:可复用面向对象软件的基础》一书中),总共有23种设计模式,分为三大类: 一、创建型模式(5种) 1. 单例模式(Sing…...

逻辑回归:给不确定性划界的分类大师

想象你是一名医生。面对患者的检查报告&#xff08;肿瘤大小、血液指标&#xff09;&#xff0c;你需要做出一个**决定性判断**&#xff1a;恶性还是良性&#xff1f;这种“非黑即白”的抉择&#xff0c;正是**逻辑回归&#xff08;Logistic Regression&#xff09;** 的战场&a…...

Admin.Net中的消息通信SignalR解释

定义集线器接口 IOnlineUserHub public interface IOnlineUserHub {/// 在线用户列表Task OnlineUserList(OnlineUserList context);/// 强制下线Task ForceOffline(object context);/// 发布站内消息Task PublicNotice(SysNotice context);/// 接收消息Task ReceiveMessage(…...

.Net框架,除了EF还有很多很多......

文章目录 1. 引言2. Dapper2.1 概述与设计原理2.2 核心功能与代码示例基本查询多映射查询存储过程调用 2.3 性能优化原理2.4 适用场景 3. NHibernate3.1 概述与架构设计3.2 映射配置示例Fluent映射XML映射 3.3 查询示例HQL查询Criteria APILINQ提供程序 3.4 高级特性3.5 适用场…...

MFC内存泄露

1、泄露代码示例 void X::SetApplicationBtn() {CMFCRibbonApplicationButton* pBtn GetApplicationButton();// 获取 Ribbon Bar 指针// 创建自定义按钮CCustomRibbonAppButton* pCustomButton new CCustomRibbonAppButton();pCustomButton->SetImage(IDB_BITMAP_Jdp26)…...

YSYX学习记录(八)

C语言&#xff0c;练习0&#xff1a; 先创建一个文件夹&#xff0c;我用的是物理机&#xff1a; 安装build-essential 练习1&#xff1a; 我注释掉了 #include <stdio.h> 出现下面错误 在你的文本编辑器中打开ex1文件&#xff0c;随机修改或删除一部分&#xff0c;之后…...

CMake 从 GitHub 下载第三方库并使用

有时我们希望直接使用 GitHub 上的开源库,而不想手动下载、编译和安装。 可以利用 CMake 提供的 FetchContent 模块来实现自动下载、构建和链接第三方库。 FetchContent 命令官方文档✅ 示例代码 我们将以 fmt 这个流行的格式化库为例,演示如何: 使用 FetchContent 从 GitH…...

深入解析C++中的extern关键字:跨文件共享变量与函数的终极指南

&#x1f680; C extern 关键字深度解析&#xff1a;跨文件编程的终极指南 &#x1f4c5; 更新时间&#xff1a;2025年6月5日 &#x1f3f7;️ 标签&#xff1a;C | extern关键字 | 多文件编程 | 链接与声明 | 现代C 文章目录 前言&#x1f525;一、extern 是什么&#xff1f;&…...