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

【Vue篇】重剑无锋:面经PC项目工程化实战面经全解

目录

引言

一、项目功能演示

1. 目标

2. 项目收获

二、项目创建目录初始化

vue-cli 建项目

三、ESlint代码规范及手动修复

1. JavaScript Standard Style 规范说明

2. 代码规范错误

3. 手动修正

四、通过eslint插件来实现自动修正

五、调整初始化目录结构

1. 删除文件

2. 修改文件

3. 新增目录

六、vant组件库及Vue周边的其他组件库

七、全部导入和按需导入的区别

八、全部导入

九、按需导入

十、项目中的vw适配

十一、路由配置-一级路由

一级路由

十二、路由配置-tabbar标签页

​编辑

vant-ui.js 引入组件

十三、路由配置-配置主题色

十四、路由配置-二级路由

十五、登录静态布局

​编辑

十六、登录表单中的细节分析

十七、注册静态布局

十八、request模块 - axios封装

十九、封装api接口 - 注册功能

二十、toast 轻提示

二十一、响应拦截器统一处理错误提示

二十二、封装api接口 - 登录功能

二十三、local模块 - 本地存储


引言

📱 基于Vue CLI 5 + Vant 2.x构建企业级H5应用,涵盖脚手架搭建、组件化开发、vw移动端适配、Axios封装、权限管理等核心场景。

​​【技术亮点】​​
✅ 工程化规范:ESLint智能纠错 + Prettier自动格式化
✅ 性能优化:Vant组件按需加载 + Viewport动态适配方案
✅ 进阶实践:Token鉴权体系、API模块化封装、路由守卫
✅ 生产级技巧:全局错误拦截、本地缓存加密、异常监控策略

从零实现登录注册、文章收藏、个人中心等完整业务链路,打通组件库深度集成、移动端适配、接口安全等18个关键技术点。适合Vue新手突破Demo局限,助力中阶开发者掌握工程化真谛,开启高效开发新维度。

接口文档地址:https://www.apifox.cn/apidoc/project-934563/api-20384515

一、项目功能演示

1. 目标

启动准备好的代码,演示移动端面经内容,明确功能模块

2. 项目收获

二、项目创建目录初始化

vue-cli 建项目

1.安装脚手架 (已安装)

npm i @vue/cli -g

2.创建项目

vue create hm-vant-h5
  • 选项
Vue CLI v5.0.8
? Please pick a preset:Default ([Vue 3] babel, eslint)Default ([Vue 2] babel, eslint)
> Manually select features     选自定义
  • 手动选择功能

  • 选择vue的版本
  3.x
> 2.x
  • 是否使用history模式

  • 选择css预处理

  • 选择eslint的风格 (eslint 代码规范的检验工具,检验代码是否符合规范)
  • 比如:const age = 18; => 报错!多加了分号!后面有工具,一保存,全部格式化成最规范的样子

  • 选择校验的时机 (直接回车)

  • 选择配置文件的生成方式 (直接回车)

  • 是否保存预设,下次直接使用? => 不保存,输入 N

  • 等待安装,项目初始化完成

  • 启动项目
npm run serve

三、ESlint代码规范及手动修复

代码规范:一套写代码的约定规则。

例如:赋值符号的左右是否需要空格?一句结束是否是要加;?…

没有规矩不成方圆

ESLint:是一个代码检查工具,用来检查你的代码是否符合指定的规则(你和你的团队可以自行约定一套规则)。在创建项目时,我们使用的是 JavaScript Standard Style 代码风格的规则。

1. JavaScript Standard Style 规范说明

建议把:https://standardjs.com/rules-zhcn.html 看一遍,然后在写的时候, 遇到错误就查询解决。

下面是这份规则中的一小部分:

  • 字符串使用单引号 – 需要转义的地方除外
  • 无分号 – 这没什么不好。不骗你!
  • 关键字后加空格 if (condition) { ... }
  • 函数名后加空格 function name (arg) { ... }
  • 坚持使用全等 === 摒弃 == 一但在需要检查 null || undefined 时可以使用 obj == null

2. 代码规范错误

如果你的代码不符合standard的要求,eslint会跳出来刀子嘴,豆腐心地提示你。

下面我们在main.js中随意做一些改动:添加一些空行,空格。

import Vue from 'vue'
import App from './App.vue'import './styles/index.less'
import router from './router'
Vue.config.productionTip = falsenew Vue ( {render: h => h(App),router
}).$mount('#app')

按下保存代码之后:

你将会看在控制台中输出如下错误:

eslint 是来帮助你的。心态要好,有错,就改。

3. 手动修正

根据错误提示来一项一项手动修正。

如果你不认识命令行中的语法报错是什么意思,你可以根据错误代码(func-call-spacing, space-in-parens,…)去 ESLint 规则列表中查找其具体含义。

打开 ESLint 规则表,使用页面搜索(Ctrl + F)这个代码,查找对该规则的一个释义。

四、通过eslint插件来实现自动修正

  1. eslint会自动高亮错误显示
  2. 通过配置,eslint会自动帮助我们修复错误
  • 如何安装

  • 如何配置
// 当保存的时候,eslint自动帮我们修复错误
"editor.codeActionsOnSave": {"source.fixAll": true
},
// 保存代码,不自动格式化
"editor.formatOnSave": false
  • 注意:eslint的配置文件必须在根目录下,这个插件才能才能生效。打开项目必须以根目录打开,一次打开一个项目
  • 注意:使用了eslint校验之后,把vscode带的那些格式化工具全禁用了 Beatify

settings.json 参考

{"window.zoomLevel": 2,"workbench.iconTheme": "vscode-icons","editor.tabSize": 2,"emmet.triggerExpansionOnTab": true,// 当保存的时候,eslint自动帮我们修复错误"editor.codeActionsOnSave": {"source.fixAll": true},// 保存代码,不自动格式化"editor.formatOnSave": false
}

五、调整初始化目录结构

为了更好的实现后面的操作,我们把整体的目录结构做一些调整。

目标:

  1. 删除初始化的一些默认文件
  2. 修改没删除的文件
  3. 新增我们需要的目录结构

1. 删除文件

  • src/assets/logo.png
  • src/components/HelloWorld.vue
  • src/views/AboutView.vue
  • src/views/HomeView.vue

2. 修改文件

main.js 不需要修改

router/index.js删除默认的路由配置

import Vue from 'vue'
import VueRouter from 'vue-router'Vue.use(VueRouter)const routes = [
]const router = new VueRouter({routes
})export default router

App.vue

<template><div id="app"><router-view/></div>
</template>

3. 新增目录

  • src/api 目录
    • 存储接口模块 (发送ajax请求接口的模块)
  • src/utils 目录
    • 存储一些工具模块 (自己封装的方法)

目录效果如下:

六、vant组件库及Vue周边的其他组件库

组件库:第三方封装好了很多很多的组件,整合到一起就是一个组件库。

https://vant-contrib.gitee.io/vant/v2/#/zh-CN/

比如日历组件、键盘组件、打分组件、登录组件等

组件库并不是唯一的,常用的组件库还有以下几种:

pc: element-ui element-plus iview ant-design

移动:vant-ui Mint UI (饿了么) Cube UI (滴滴)

七、全部导入和按需导入的区别

目标:明确 全部导入 和 按需导入 的区别

区别:

1.全部导入会引起项目打包后的体积变大,进而影响用户访问网站的性能

2.按需导入只会导入你使用的组件,进而节约了资源

八、全部导入

  • 安装vant-ui
yarn add vant@latest-v2
// 或者 npm i vant@latest-v2
  • 在main.js中
import Vant from 'vant';
import 'vant/lib/index.css';
// 把vant中所有的组件都导入了
Vue.use(Vant)
  • 即可使用
<van-button type="primary">主要按钮</van-button>
<van-button type="info">信息按钮</van-button>

vant-ui提供了很多的组件,全部导入,会导致项目打包变得很大。

九、按需导入

  • 安装vant-ui
npm i vant@latest-v2  或  yarn add vant@latest-v2
  • 安装一个插件
npm i babel-plugin-import -D
  • babel.config.js中配置
module.exports = {presets: ['@vue/cli-plugin-babel/preset'],plugins: [['import', {libraryName: 'vant',libraryDirectory: 'es',style: true}, 'vant']]
}
  • 按需加载,在main.js
import { Button, Icon } from 'vant'Vue.use(Button)
Vue.use(Icon)
  • app.vue中进行测试
<van-button type="primary">主要按钮</van-button>
<van-button type="info">信息按钮</van-button>
<van-button type="default">默认按钮</van-button>
<van-button type="warning">警告按钮</van-button>
<van-button type="danger">危险按钮</van-button>
  • 把引入组件的步骤抽离到单独的js文件中比如 utils/vant-ui.js
import { Button, Icon } from 'vant'Vue.use(Button)
Vue.use(Icon)

main.js中进行导入

// 导入按需导入的配置文件
import '@/utils/vant-ui'

十、项目中的vw适配

官方说明:https://vant-contrib.gitee.io/vant/v2/#/zh-CN/advanced-usage

yarn add postcss-px-to-viewport@1.1.1 -D
  • 项目根目录, 新建postcss的配置文件postcss.config.js
// postcss.config.js
module.exports = {plugins: {'postcss-px-to-viewport': {viewportWidth: 375,},},
};

viewportWidth:设计稿的视口宽度

  1. vant-ui中的组件就是按照375的视口宽度设计的
  2. 恰好面经项目中的设计稿也是按照375的视口宽度设计的,所以此时 我们只需要配置375就可以了
  3. 如果设计稿不是按照375而是按照750的宽度设计,那此时这个值该怎么填呢?

十一、路由配置-一级路由

但凡是单个页面,独立展示的,都是一级路由

路由设计:

  • 登录页 (一级) Login
  • 注册页(一级) Register
  • 文章详情页(一级) Detail
  • 首页(一级) Layout
    • 面经(二级)Article
    • 收藏(二级)Collect
    • 喜欢(二级)Like
    • 我的(二级)My

一级路由

router/index.js配置一级路由, 一级views组件于准备好的中直接 CV 即可

import Vue from 'vue'
import VueRouter from 'vue-router'
import Login from '@/views/Login'
import Register from '@/views/Register'
import Detail from '@/views/Detail'
import Layout from '@/views/Layout'
Vue.use(VueRouter)const router = new VueRouter({routes: [{ path: '/login', component: Login },{ path: '/register', component: Register },{ path: '/article/:id', component: Detail },{path: '/',component: Layout}]
})
export default router

清理 App.vue

<template><div id="app"><router-view/></div>
</template><script>
export default {created () {}
}
</script>

十二、路由配置-tabbar标签页

https://vant-contrib.gitee.io/vant/v2/#/zh-CN/tabbar

vant-ui.js 引入组件

import { Button, Icon, Tabbar, TabbarItem } from 'vant'
Vue.use(Tabbar)
Vue.use(TabbarItem)

layout.vue

  1. 复制官方代码
  2. 修改显示文本及显示的图标
<template><div class="layout-page">首页架子 - 内容区域 <van-tabbar><van-tabbar-item icon="notes-o">面经</van-tabbar-item><van-tabbar-item icon="star-o">收藏</van-tabbar-item><van-tabbar-item icon="like-o">喜欢</van-tabbar-item><van-tabbar-item icon="user-o">我的</van-tabbar-item></van-tabbar></div>
</template>

十三、路由配置-配置主题色

整体网站风格,其实都是橙色的,可以通过变量覆盖的方式,制定主题色

https://vant-contrib.gitee.io/vant/v2/#/zh-CN/theme

babel.config.js 制定样式路径

module.exports = {presets: ['@vue/cli-plugin-babel/preset'],plugins: [['import', {libraryName: 'vant',libraryDirectory: 'es',// 指定样式路径style: (name) => `${name}/style/less`}, 'vant']]
}

vue.config.js 覆盖变量

const { defineConfig } = require('@vue/cli-service')
module.exports = defineConfig({transpileDependencies: true,css: {loaderOptions: {less: {lessOptions: {modifyVars: {// 直接覆盖变量'blue': '#FA6D1D',},},},},},
})

重启服务器生效!

十四、路由配置-二级路由

1.router/index.js配置二级路由

在准备好的代码中去复制对应的组件即可

import Vue from 'vue'
import VueRouter from 'vue-router'
import Login from '@/views/Login'
import Register from '@/views/Register'
import Detail from '@/views/Detail'
import Layout from '@/views/Layout'import Like from '@/views/Like'
import Article from '@/views/Article'
import Collect from '@/views/Collect'
import User from '@/views/User'
Vue.use(VueRouter)const router = new VueRouter({routes: [{ path: '/login', component: Login },{ path: '/register', component: Register },{ path: '/article/:id', component: Detail },{ path: '/',component: Layout,redirect: '/article',children: [{ path: 'article', component: Article },{ path: 'like', component: Like },{ path: 'collect', component: Collect },{ path: 'user', component: User }]}]
})export default router

2.layout.vue 配置路由出口, 配置 tabbar

<template><div class="layout-page">//路由出口<router-view></router-view> <van-tabbar route><van-tabbar-item to="/article" icon="notes-o">面经</van-tabbar-item><van-tabbar-item to="/collect" icon="star-o">收藏</van-tabbar-item><van-tabbar-item to="/like" icon="like-o">喜欢</van-tabbar-item><van-tabbar-item to="/user" icon="user-o">我的</van-tabbar-item></van-tabbar></div>
</template>

十五、登录静态布局

使用组件

  • van-nav-bar
  • van-form
  • van-field
  • van-button

vant-ui.js 注册

import Vue from 'vue'
import {NavBar,Form,Field
} from 'vant'
Vue.use(NavBar)
Vue.use(Form)
Vue.use(Field)

Login.vue 使用

<template><div class="login-page"><!-- 导航栏部分 --><van-nav-bar title="面经登录" /><!-- 一旦form表单提交了,就会触发submit,可以在submit事件中根据拿到的表单提交信息,发送axios请求--><van-form @submit="onSubmit"><!-- 输入框组件 --><!-- \w 字母数字_   \d 数字0-9 --><van-fieldv-model="username"name="username"label="用户名"placeholder="用户名":rules="[{ required: true, message: '请填写用户名' },{ pattern: /^\w{5,}$/, message: '用户名至少包含5个字符' }]"/><van-fieldv-model="password"type="password"name="password"label="密码"placeholder="密码":rules="[{ required: true, message: '请填写密码' },{ pattern: /^\w{6,}$/, message: '密码至少包含6个字符' }]"/><div style="margin: 16px"><van-button block type="info" native-type="submit">提交</van-button></div></van-form></div>
</template><script>
export default {name: 'LoginPage',data () {return {username: 'zhousg',password: '123456'}},methods: {onSubmit (values) {console.log('submit', values)}}
}
</script>

login.vue添加 router-link 标签(跳转到注册)

<template><div class="login-page"><van-nav-bar title="面经登录" /><van-form @submit="onSubmit">...</van-form><router-link class="link" to="/register">注册账号</router-link></div>
</template>

login.vue调整样式

<style lang="less" scoped>
.link {color: #069;font-size: 12px;padding-right: 20px;float: right;
}
</style>

十六、登录表单中的细节分析

  1. @submit事件:当点击提交按钮时会自动触发submit事件
  2. v-model双向绑定:会自动把v-model后面的值和文本框中的值进行双向绑定
  3. name属性:收集的key的值,要和接口文档对应起来
  4. label:输入的文本框的title
  5. :rules: 表单的校验规则
  6. placeholder: 文本框的提示语

十七、注册静态布局

Register.vue

<template><div class="login-page"><van-nav-bar title="面经注册" /><van-form @submit="onSubmit"><van-fieldv-model="username"name="username"label="用户名"placeholder="用户名":rules="[{ required: true, message: '请填写用户名' },{ pattern: /^\w{5,}$/, message: '用户名至少包含5个字符' }]"/><van-fieldv-model="password"type="password"name="password"label="密码"placeholder="密码":rules="[{ required: true, message: '请填写密码' },{ pattern: /^\w{6,}$/, message: '密码至少包含6个字符' }]"/><div style="margin: 16px"><van-button block type="primary" native-type="submit">注册</van-button></div></van-form><router-link class="link" to="/login">有账号,去登录</router-link></div>
</template><script>
export default {name: 'Register-Page',data () {return {username: '',password: ''}},methods: {onSubmit (values) {console.log('submit', values)}}
}
</script><style lang="less" scoped>
.link {color: #069;font-size: 12px;padding-right: 20px;float: right;
}
</style>

十八、request模块 - axios封装

接口文档地址:https://apifox.com/apidoc/project-934563/api-20384515

基地址:http://interview-api-t.itheima.net/h5/

目标:将 axios 请求方法,封装到 request 模块

我们会使用 axios 来请求后端接口, 一般都会对 axios 进行一些配置 (比如: 配置基础地址,请求响应拦截器等等)

一般项目开发中, 都会对 axios 进行基本的二次封装, 单独封装到一个模块中, 便于使用

  • 安装 axios
npm i axios

新建 utils/request.js 封装 axios 模块

利用 axios.create 创建一个自定义的 axios 来使用

http://www.axios-js.com/zh-cn/docs/#axios-create-config

/* 封装axios用于发送请求 */
import axios from 'axios'// 创建一个新的axios实例
const request = axios.create({baseURL: 'http://interview-api-t.itheima.net/h5/',timeout: 5000
})// 添加请求拦截器
request.interceptors.request.use(function (config) {// 在发送请求之前做些什么return config
}, function (error) {// 对请求错误做些什么return Promise.reject(error)
})// 添加响应拦截器
request.interceptors.response.use(function (response) {// 对响应数据做点什么return response.data
}, function (error) {// 对响应错误做点什么return Promise.reject(error)
})export default request
  • 注册测试
// 监听表单的提交,形参中:可以获取到输入框的值
async onSubmit (values) {console.log('submit', values)const res = await request.post('/user/register', values)console.log(res)
}

十九、封装api接口 - 注册功能

1.目标:将请求封装成方法,统一存放到 api 模块,与页面分离

2.原因:

以前的模式:

  • 页面中充斥着请求代码,
  • 可阅读性不高
  • 相同的请求没有复用请求没有统一管理

3.期望:

  • 请求与页面逻辑分离
  • 相同的请求可以直接复用请求
  • 进行了统一管理

4.具体实现

新建 api/user.js 提供注册 Api 函数

import request from '@/utils/request'// 注册接口
export const register = (data) => {return request.post('/user/register', data)
}

register.vue页面中调用测试

methods: {async onSubmit (values) {// 往后台发送注册请求了await register(values)alert('注册成功')this.$router.push('/login')}
}

二十、toast 轻提示

https://vant-contrib.gitee.io/vant/v2/#/zh-CN/toast

两种使用方式

  • 组件内js文件内 导入,调用
import { Toast } from 'vant';
Toast('提示内容');
  • 组件内通过this直接调用

main.js

import { Toast } from 'vant';
Vue.use(Toast)
this.$toast('提示内容')

代码演示

this.$toast.loading({message:'拼命加载中...',forbidClick:true
})
try{await register(values)this.$toast.success('注册成功')this.$router.push('/login')
}catch(e){this.$toast.fail('注册失败')
}

二十一、响应拦截器统一处理错误提示

响应拦截器是咱们拿到数据的第一个“数据流转站”

import { Toast } from 'vant'...// 添加响应拦截器
request.interceptors.response.use(function (response) {// 对响应数据做点什么return response.data
}, function (error) {if (error.response) {// 有错误响应, 提示错误提示Toast(error.response.data.message)}// 对响应错误做点什么return Promise.reject(error)
})

二十二、封装api接口 - 登录功能

api/user.js 提供登录 Api 函数

// 登录接口
export const login = (data) => {return request.post('/user/login', data)
}

login.vue 登录功能

import { login } from '@/api/user'methods: {async onSubmit (values) {const { data } = await login(values)this.$toast.success('登录成功')localStorage.setItem('vant-mobile-exp-token', data.token)this.$router.push('/')}
}

二十三、local模块 - 本地存储

新建 utils/storage.js

const KEY = 'vant-mobile-exp-token'// 直接用按需导出,可以导出多个
// 获取
export const getToken = () => {return localStorage.getItem(KEY)
}// 设置
export const setToken = (newToken) => {localStorage.setItem(KEY, newToken)
}// 删除
export const delToken = () => {localStorage.removeItem(KEY)
}

登录完成存储token到本地

import { login } from '@/api/user'
import { setToken } from '@/utils/storage'methods: {async onSubmit (values) {const { data } = await login(values)setToken(data.token)this.$toast.success('登录成功')this.$router.push('/')}
}

 📜 以上便是 ​​【Vue篇】重剑无锋:面经PC工程化全解​​ 的九阳真经!此番修行,你已参透:
✨ ​​重剑锻造术​​:CLI铸剑炉、Vant组件淬火、vw视界归一
✨ ​​架构布阵道​​:模块化乾坤阵、API御剑术、路由守卫结界
✨ ​​实战破敌策​​:Token鉴权金钟罩、Axios拦截暗器、Storage秘卷封存
🔍 ​​剑招存疑​​?文中若有「内力滞涩」之处,欢迎诸位侠客在评论区「剑气刻石」,共研工程化剑意!
💡 ​​登峰问道​​?若遇「构建迷雾」未散,或陷「性能瓶颈」困局,速速执剑相询,你我共破迷障!
🗡️ 你的每一式 ​​🔥点赞|🏮收藏|🚀分享​​ ,皆为铸就「前端玄铁重剑」的千锤之力!

 

相关文章:

【Vue篇】重剑无锋:面经PC项目工程化实战面经全解

目录 引言 一、项目功能演示 1. 目标 2. 项目收获 二、项目创建目录初始化 vue-cli 建项目 三、ESlint代码规范及手动修复 1. JavaScript Standard Style 规范说明 2. 代码规范错误 3. 手动修正 四、通过eslint插件来实现自动修正 五、调整初始化目录结构 1. 删除…...

JVM参数详解与实战案例指南(AI)

JVM参数详解与实战案例指南 一、JVM参数概述与分类 JVM参数是控制Java虚拟机运行时行为的关键配置项&#xff0c;合理设置这些参数可以显著提升应用性能。根据功能和稳定性&#xff0c;JVM参数主要分为三类&#xff1a; 标准参数&#xff1a;所有JVM实现都必须支持&#xff…...

C++通过空间配置器实现简易String类

C实现简易String类 在C中&#xff0c;使用空间配置器&#xff08;allocator&#xff09;实现自定义string类需要管理内存分配、释放及对象构造/析构。 #include <memory> #include <algorithm> #include <cstring> #include <stdexcept> #include &l…...

MyBatis:简化数据库操作的持久层框架

1、什么是Mybatis? MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由 apachesoftwarefoundation 迁移到了google code,由谷歌托管,并且改名为MyBatis 。 2013年11月迁移到Github。 iBATIS一词来源于“internet”和“abatis”的组合,是一个基于Java的持久层框…...

Spring Boot集成Spring AI与Milvus实现智能问答系统

在Spring Boot中集成Spring AI与Milvus实现智能问答系统 引言 随着人工智能技术的快速发展&#xff0c;越来越多的企业开始探索如何将AI能力集成到现有系统中。本文将介绍如何在Spring Boot项目中集成Spring AI和向量数据库Milvus&#xff0c;构建一个高效的智能问答系统。 …...

软件工程(六):一致性哈希算法

哈希算法 定义 哈希算法是一种将任意长度的输入&#xff08;如字符串、文件等&#xff09;转换为固定长度输出的算法&#xff0c;这个输出称为“哈希值”或“摘要”。 常见的哈希算法 哈希算法哈希位数特点MD5128位快速&#xff0c;但已不安全SHA-1160位安全性提高&#xf…...

Linux内存分页管理详解

Linux内存分页管理详解:原理、实现与实际应用 目录 Linux内存分页管理详解:原理、实现与实际应用 一、引言 二、内存分页机制概述 1. 虚拟地址与物理地址的划分 2. 分页的基本原理 三、虚拟地址到物理地址的转换 1. 地址转换流程 2. 多级页表的遍历 四、多级页表的…...

work-platform阅读

Redis存储的是字节数据&#xff0c;所以任何对象想要存进redis&#xff0c;都要转化成字节。对象转化为字节流的过程&#xff0c;叫序列化&#xff0c;反之&#xff0c;叫反序列化 Redis 序列化详解及高性能实践-CSDN博客https://blog.csdn.net/zhangkunls/article/details/14…...

在 Excel xll 自动注册操作 中使用东方仙盟软件————仙盟创梦IDE

windows 命令 "C:\Program Files\Microsoft Office\root\Office16\EXCEL.EXE" /X "C:\Path\To\仙盟.xll" excel 注册 Application.RegisterXLL "XLMAPI.XLL" 重点代码解析 excel 命令模式 [ExcelCommand(Description "使用参数")] …...

微调后的模型保存与加载

在Hugging Face Transformers库中&#xff0c;微调后的模型保存与加载方式因微调方法&#xff08;如常规微调或参数高效微调&#xff09;而异。 一、常规微调模型的保存与加载 1、 保存完整模型 使用 save_pretrained() 方法可将整个模型&#xff08;包含权重、配置、分词器…...

PostgreSQL 日常维护

目录 一、基本使用 1、登录数据库 2、数据库操作 &#xff08;1&#xff09;列出库 &#xff08;2&#xff09;创建库 &#xff08;3&#xff09;删除库 &#xff08;4&#xff09;切换库 &#xff08;5&#xff09;查看库大小 3、数据表操作 &#xff08;1&#xff…...

Ntfs!ATTRIBUTE_RECORD_HEADER结构$INDEX_ROOT=0x90的一个例子

Ntfs!ATTRIBUTE_RECORD_HEADER结构$INDEX_ROOT0x90的一个例子 1: kd> dx -id 0,0,899a2278 -r1 ((Ntfs!_FILE_RECORD_SEGMENT_HEADER *)0xc431a400) ((Ntfs!_FILE_RECORD_SEGMENT_HEADER *)0xc431a400) : 0xc431a400 [Type: _FILE_RECORD_SEGMENT_HEADER …...

leetcode hot100刷题日记——7.最大子数组和

class Solution { public:int maxSubArray(vector<int>& nums) {//方法一&#xff1a;动态规划//dp[i]表示以i下标结尾的数组的最大子数组和//那么在i0时&#xff0c;dp[0]nums[0]//之后要考虑的就是我们要不要把下一个数加进来&#xff0c;如果下一个数加进来会使结…...

LlamaIndex

1、大语言模型开发框架的价值是什么? SDK:Software Development Kit,它是一组软件工具和资源的集合,旨在帮助开发者创建、测试、部署和维护应用程序或软件。 所有开发框架(SDK)的核心价值,都是降低开发、维护成本。 大语言模型开发框架的价值,是让开发者可以更方便地…...

下一代电子电气架构(EEA)的关键技术

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 钝感力的“钝”,不是木讷、迟钝,而是直面困境的韧劲和耐力,是面对外界噪音的通透淡然。 生活中有两种人,一种人格外在意别人的眼光;另一种人无论…...

CSDN gitcode代码推送

当我使用用户名密码时一直无法推送&#xff0c;报下面这个错误 找了半天才知道&#xff0c; 他这个git不能用账号密码推送代码&#xff0c;idea弹出来的用户名&#xff0c;就是你头像旁边这个&#xff0c;没有符号 密码需要你创建一个令牌 这个令牌才是你要填写的密码&#x…...

中级统计师-统计学基础知识-第五章 相关分析

第一节 相关关系 1. 函数关系 vs 相关关系 函数关系 定义&#xff1a;变量间存在严格确定性的对应关系&#xff08;如 y f ( x ) y f(x) yf(x)&#xff09;例子&#xff1a;本金 x x x 与利息收入 y x 0.027 x y x 0.027x yx0.027x特点&#xff1a;一一对应&#xff…...

OpenCV CUDA模块图像过滤------用于创建一个最大值盒式滤波器(Max Box Filter)函数createBoxMaxFilter()

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 createBoxMaxFilter()函数创建的是一个 最大值滤波器&#xff08;Maximum Filter&#xff09;&#xff0c;它对图像中每个像素邻域内的像素值取最…...

OpenCv高阶(十五)——EigenFace人脸识别

文章目录 前言一、EigenFace人脸识别原理二、EigenFace人脸识别代码1、导入OpenCV和NumPy库2、数据加载与预处理部分3、创建与训练EigenFace模型部分4、预测与结果输出部分5、可视化部分&#xff1a;在测试图像上叠加识别结果 总结 前言 人脸识别作为生物特征识别技术的重要分…...

Linux系统下nslookup命令的基本使用

Linux系统下 nslookup命令的基本使用 引言一、nslookup介绍二、使用帮助三、 基本使用方法1. 查询域名对应的IP地址2. 查询特定的DNS记录类型3. 使用特定的DNS服务器进行查询4. 交互模式 四、注意事项五、总结 引言 在网络管理中&#xff0c;DNS&#xff08;域名系统&#xff…...

【笔记】PyCharm 中创建Poetry解释器

#工作记录 在使用 PyCharm 进行 Python 项目开发时&#xff0c;为项目配置合适的 Python 解释器至关重要。Poetry 作为一款强大的依赖管理和打包工具&#xff0c;能帮助我们更便捷地管理项目的依赖项与虚拟环境。下面将详细记录在 PyCharm 中创建 Poetry 解释器的步骤。 前提条…...

Qwen 3技术报告详细解读

近日&#xff0c;Qwen 3系列大模型正式发布&#xff0c;涵盖从0.6B到235B参数的多个规模版本&#xff0c;包括6个Dense模型和2个混合专家&#xff08;MoE&#xff09;模型。本文将从模型架构、预训练策略、后训练优化等方面进行全面解读&#xff0c;帮助读者深入理解Qwen 3的技…...

leetcode 螺旋矩阵 java

官方还得是官方&#xff01; class Solution {public List<Integer> spiralOrder(int[][] matrix) {int l 0, r matrix[0].length - 1;int t 0, b matrix.length - 1;int x 0;List<Integer> res new ArrayList<>();while (true) {for (int i l; i …...

Spring Boot 项目中 Redis 存储 Session 对象序列化处理

目录 一、为什么需要序列化处理二、Spring Boot 集成 Redis 存储 Session2.1 添加依赖2.2 配置 Redis 三、自定义序列化和反序列化3.1 创建序列化配置类3.2 测试序列化和反序列化 四、其他序列化方式4.1 使用 JdkSerializationRedisSerializer4.2 使用 StringRedisSerializer 五…...

军工与航空航天特种PCB精密制造:猎板如何定义行业技术新标准?

一、军工与航空航天PCB的极限挑战 在低轨卫星载荷、战机航电系统等场景中&#xff0c;特种PCB需同时满足三大核心指标&#xff1a; ​​极端环境耐受性​​&#xff1a;工作温度横跨-55℃至200℃&#xff0c;承受20G机械振动与100krad辐射剂量&#xff0c;盐雾腐蚀测试超过50…...

springboot+vue实现鲜花商城系统源码(带用户协同过滤个性化推荐算法)

今天教大家如何设计一个 鲜花商城 , 基于目前主流的技术&#xff1a;前端vue3&#xff0c;后端springboot。学习完这个项目&#xff0c;你将来找工作开发实际项目都会又很大帮助。文章最后部分还带来的项目的部署教程。 系统有着基于用户的协同过滤推荐算法&#xff0c;还有保证…...

MyBatis 关联映射与多表查询实战教程

一、关联查询基础 1. 连接类型与选择 LEFT JOIN(左连接)SELECT u.*, r.role_name FROM User u LEFT JOIN user_role ur ON u.id = ur.uid LEFT JOIN Role r ON ur.rid = r.id;- **规则**:以左表为主,保留左表所有记录,右表无匹配时填充`NULL`。 - **场景**:查询主体…...

【AI流程应用】智能知识库搭建与实战应用

JeecgBoot 平台的 AIGC 功能模块&#xff0c;是一套类似 Dify 的 AIGC应用开发平台 知识库问答 子系统&#xff0c;是一款基于 LLM 大语言模型 AI 应用平台和 RAG 的知识库问答系统。 其直观的界面结合了 AI 流程编排、RAG 管道、知识库管理、模型管理、对接向量库、实时运行可…...

微店平台店铺商品接口开发指南

微店API获取店铺所有商品实现方案 以下是使用微店开放平台API获取店铺所有商品的完整实现代码&#xff0c;包含请求封装、分页处理和错误处理机制。 点击获取key和secret from weidian_api import WeidianAPI # 配置你的微店应用凭证 APP_KEY "your_app_key" APP_…...

springboot3+vue3融合项目实战-大事件文章管理系统-更新文章分类和增加文章分类优化-分组校验

因为我们之前在category实体类里面增加了notnull注解&#xff0c;而之前新增文章分类模块新增文章是不需要id的&#xff0c;而id是由数据库自动分配的&#xff0c;这就导致不能新增文章了&#xff0c;所以我们要进行分组校验 思路如下&#xff1a; 我们更改category代码&…...

Vue.js教学第九章:Vue动态与异步组件,高效开发全攻略

Vue 组件的动态与异步:探索高效开发路径 在 Vue.js 开发领域中,组件的动态与异步加载机制是构建复杂且高性能前端应用的关键策略。本研究深入探究 Vue 中动态组件与异步组件的原理、用法及性能优化实践,旨在为开发者提供全面且深入的技术指引,助力其在实际项目中高效运用。…...

CVE-2018-1270源码分析与漏洞复现(spring-messaging 表达式注入)

漏洞概述 CVE-2018-1270 是 Spring 框架中的一个高危远程代码执行&#xff08;RCE&#xff09;漏洞&#xff0c;影响版本为 Spring Framework 5.0–5.0.4 和 4.3–4.3.14。攻击者通过构造包含恶意 SpEL&#xff08;Spring Expression Language&#xff09;表达式的 STOMP&…...

DevOps学习回顾03-ops三部曲之配置管理(CM)

快速回顾 Ops 中配置管理的一些常见的方式&#xff0c;以及一些配置文件常见的组织形式 参考来源 极客时间-全栈工程师修炼指南-OPS三部曲之配置管理 什么是配置管理&#xff1f;–IBM 五大最流行的配置管理工具 为啥需要配置管理&#xff1f; CM 的主要目标是控制复杂系统…...

二进制编码、定点数与浮点数

1. 二进制编码 1.1. 字符串的表示&#xff0c;从编码到数字 不仅数值可以用二进制表示&#xff0c;字符乃至更多的信息都能用二进制表示。最典型的例子就是字符串&#xff08;Character String&#xff09;。最早计算机只需要使用英文字符&#xff0c;加上数字和一些特殊符号…...

CentOS:搭建国内软件repository,以实现自动yum网络安装

centosgit仓库_寂寞沙冷州的技术博客_51CTO博客 yum 很慢 centos yum安装慢_mob64ca1417b0c6的技术博客_51CTO博客 yum配置&#xff0c;文件&#xff0c;命令详解-CSDN博客 yum仓库简介_yum库是什么-CSDN博客 rootwww:/etc/yum.repos.d# pwd /etc/yum.repos.d ###创建下面这个.…...

C# AOP编程

AOP(面向切片编程的概念我这里就不介绍了&#xff0c;这里先介绍一下C#中的AOP编程框架。 1.AOP的分类 .net下支持AOP的框架很多&#xff0c;搜了一下有&#xff1a;PostSharp、AspectInjector、Fody 、Castle Windsor、Spring.NET、Ninject、Unity等&#xff0c;实现的方式主要…...

【Element UI排序】JavaScript 的表格排序sortable=“custom“和 @sort-change

目录 一、elementUI排序功能实际案例二、 实例2三、 实例3 Sortable — 是一个 JavaScript 库&#xff0c;用于在现代浏览器和触摸设备上对拖放列表进行重新排序。 一、elementUI排序功能实际案例 表格每一项中加上sortable&#xff0c;可以展示排序的小图标。 在列中设置so…...

使用Jenkins部署nodejs前端项目

1. 安装node环境 1.1 下载 https://nodejs.org/zh-cn/download 1.2 解压到安装目录 tar -xJvf node-v22.15.1-linux-x64.tar.xz mv node-v22.15.1-linux-x64 /home/soft/ mv node-v22.15.1-linux-x64/ node22原本计划安装 node22和node18&#xff0c;但是CentOS7.9 GLIBCXX …...

阿里云域名 绑定 华为云服务器ip

阿里云&#xff08;万网&#xff09;域名转入华为云域名图文教程 上-云社区-华为云 阿里云&#xff08;万网&#xff09;域名转入华为云域名图文教程-云社区-华为云 在阿里云备案了域名&#xff0c;解析到华为云服务器&#xff0c;不在同一个服务商这样可以使用么&#xff1f…...

在局域网(LAN)中查看设备的 IP 地址

在局域网&#xff08;LAN&#xff09;中查看设备的 IP 地址&#xff0c;可以使用以下几种方法&#xff1a; 方法 1&#xff1a;使用 ipconfig&#xff08;Windows&#xff09; 1. 打开 CMD&#xff1a; 按 Win R&#xff0c;输入 cmd&#xff0c;回车。 2. 输入命令&#…...

第3周作业-1层隐藏层的神经网络分类二维数据

文章目录 ***1层隐藏层的神经网络分类二维数据***1. 导入包2. 数据集2.1 导入数据集2.2 查看数据集图案2.3 查看数据集维度 3. Logistic回归3.1 Logistic回归简介3.2 Logistic回归模型3.3 绘制边界 4. 神经网络模型4.1 神经网络简介4.2 神经网络数学模型4.3 建立神经网络方法4.…...

中天智能装备科技有限公司:智能仓储领域的卓越之选​

在仓储智能化转型的时代浪潮中&#xff0c;中天智能装备科技有限公司以深厚的技术积淀与创新实力&#xff0c;成为众多企业迈向高效仓储的理想合作伙伴。无论是自动化立体库的精准搭建&#xff0c;还是 AGV 系统的智能部署&#xff0c;中天都以专业姿态为行业树立标杆。​ 硬核…...

Linux nbd 网络块设备(2)-内核实现

Linux nbd网络块设备(2)-内核实现 关注我&#xff0c;一起学习吧&#xff0c;后续持续更新内核相关 1. 概述&#xff1a; 内核linux/drivers/block/nbd.c 是nbd 网络设备的底层驱动实现逻辑。本文主要介绍nbd 设备注册及I/O请求的处理逻辑。 2. nbd 设备的初始化&#xff1…...

Python输出与输入

White graces&#xff1a;个人主页 &#x1f649;专栏推荐:Java入门知识&#x1f649; &#x1f439;今日诗词:吟怀未许老重阳&#xff0c;霜雪无端入鬓长&#x1f439; ⛳️点赞 ☀️收藏⭐️关注&#x1f4ac;卑微小博主&#x1f64f; ⛳️点赞 ☀️收藏⭐️关注&#x1f4…...

【C语言】复习~数组和指针

数组和指针 1.字符指针 char* 使用方法一&#xff1a; 使用方法二&#xff1a; 这里本质上是把常量字符串的首地址放到了指针变量pstr里面 看下面的面试题 str3和str4指向的是同一个常量字符串&#xff0c;c/c会把常量字符串存储到一个单独的内存区域&#xff0c; 当几…...

rocketmq优先级控制 + 并发度控制

背景 最近在做大模型的项目&#xff0c;算法部门提供的文档解析接口&#xff0c; 并发度为1&#xff0c; 业务这边需要在ai问答和上传文档时进行解析和向量化&#xff0c;文档解析只能单线程跑&#xff0c;问答的文档解析需要高优先级处理。 采用 rocketmq 做文档上传和解析的…...

从0开始学linux韦东山教程第四章问题小结(2)

本人从0开始学习linux&#xff0c;使用的是韦东山的教程&#xff0c;在跟着课程学习的情况下的所遇到的问题的总结,理论虽枯燥但是是基础。说实在的越看视频越感觉他讲的有点乱后续将以他的新版PDF手册为中心&#xff0c;视频作为辅助理解的工具。参考手册为嵌入式Linux应用开发…...

洛谷P1226 【模板】快速幂

题目来源 P1226 【模板】快速幂 - 洛谷 题目描述 给你三个整数 a,b,p&#xff0c;求 abmodp。 输入格式 输入只有一行三个整数&#xff0c;分别代表 a,b,p。 输出格式 输出一行一个字符串 a^b mod ps&#xff0c;其中 a,b,p 分别为题目给定的值&#xff0c; s 为运算结果…...

自动点焊机:在多类电池生产中筑牢质量与效率根基

在电池制造产业飞速发展的当下&#xff0c;焊接作为电池组装的关键环节&#xff0c;其质量与效率直接影响着电池的性能与安全性。自动点焊机凭借其高效、精准、稳定的特性&#xff0c;在电动工具电池、扭扭车电池、储能电池包、滑板车电池以及电动车电池等多个电池制造领域大放…...

信息系统项目管理师考前练习1

以下是结合《信息系统项目管理师教程》(第5版)核心考点和当前行业热点的20道选择题押题,涵盖重点知识和新兴趋势,供考前冲刺练习: 项目生命周期模型选择 在敏捷开发项目中,客户需求频繁变更,且团队希望快速交付最小可行产品(MVP),最适合采用的生命周期模型是: A. …...