前端面试真题(第一集)
目录标题
- 1、跨域问题及解决方法
- 同源策略
- 生产环境解决方案
- 开发环境解决方案
- 其他解决方案
- 2、组件间通信方式
- Vue2中的组件通信方式
- Vue3中的组件通信方式
- 通用注意事项
- 3、微信小程序生命周期
- 微信小程序原生生命周期
- UniApp生命周期
- 4、微信小程序授权登录流程
- 登录流程
- 手机号获取
- 5、防抖与节流
- 防抖(Debounce)示例
- 节流(Throttle)示例
- 注意事项
- 拓展
1、跨域问题及解决方法
同源策略
同源策略是浏览器的重要安全机制,限制来自不同源的文档或脚本进行交互。"同源"指协议、域名、端口完全相同。该策略会阻止跨域AJAX请求、Cookie访问等行为,但允许嵌入资源(如<img>
、<script>
标签)。
生产环境解决方案
① CORS(跨域资源共享)
CORS是W3C标准,通过HTTP头部实现跨域访问控制。后端需配置响应头:服务器在响应头中设置 Access-Control-Allow-Origin 允许特定域或所有域(*)访问。需处理预检请求(OPTIONS)。
Access-Control-Allow-Origin: https://example.com
Access-Control-Allow-Methods: GET, POST, PUT
Access-Control-Allow-Headers: Content-Type
示例Node.js实现:
// 中间件设置CORS头
// Node.js Express示例
const express = require('express');
const app = express();// 中间件设置CORS头
app.use((req, res, next) => {// 允许的源(实际项目应配置允许的具体域名)res.header('Access-Control-Allow-Origin', 'https://your-client-domain.com'); // 允许的HTTP方法res.header('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE');// 允许的请求头res.header('Access-Control-Allow-Headers', 'Content-Type, Authorization');// 允许携带cookie(需前端同时设置withCredentials)res.header('Access-Control-Allow-Credentials', 'true');// 预检请求缓存时间res.header('Access-Control-Max-Age', '86400');next();
});// 处理OPTIONS预检请求
app.options('*', (req, res) => {res.sendStatus(200);
});app.listen(3000, () => console.log('Server running with CORS enabled'));
② Nginx反向代理
通过Nginx将不同域的请求代理到同源地址:
server {listen 80;server_name your-domain.com;location /api/ {# 反向代理到实际后端服务proxy_pass http://backend-service:3000;# 添加CORS头add_header 'Access-Control-Allow-Origin' '$http_origin';add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';add_header 'Access-Control-Allow-Headers' 'DNT,User-Agent,X-Requested-With,Content-Type';# 处理OPTIONS预检请求if ($request_method = 'OPTIONS') {add_header 'Access-Control-Max-Age' 1728000;add_header 'Content-Type' 'text/plain; charset=utf-8';add_header 'Content-Length' 0;return 204;}}
}
开发环境解决方案
代理服务器
Vite/webpack等工具支持代理设置(vite.config.js示例):
以下是对 vue.config.js
文件中代理配置的详细代码注释:
代理配置代码注释
// vue.config.js
module.exports = {// 开发服务器配置devServer: {// 代理配置proxy: {// 代理规则名称,可以自定义,这里使用 '/api' 作为示例'/api': {// 目标服务器地址,这里是后端服务的实际地址target: 'http://localhost:3000',// 是否修改请求头中的host为目标URL// 设置为true时,请求头中的host会改为target的域名changeOrigin: true,// 路径重写规则pathRewrite: {// 正则表达式,匹配请求路径中的/api前缀并替换为空字符串// 例如:/api/user => /user'^/api': ''}}}}
}
配置说明
target
: 指定后端API服务器的地址,所有匹配的请求都会被转发到该地址。changeOrigin
: 修改请求头中的host
字段为目标URL。某些后端服务可能会验证host
字段,开启此选项可避免被拦截。pathRewrite
: 重写请求路径,常用于去除或替换前缀。^/api
表示匹配以/api
开头的路径,替换为空字符串后,实际请求的路径将不再包含/api
。
使用场景示例
假设前端请求/api/users
,代理会将请求转发到http://localhost:3000/users
(路径中的/api
被移除)。
其他解决方案
① JSONP
利用<script>
标签不受同源限制的特性,仅支持GET请求:
function handleResponse(data) {console.log(data);
}
const script = document.createElement('script');
script.src = 'https://api.example.com/data?callback=handleResponse';
document.body.appendChild(script);
② WebSocket 协议代码注释
WebSocket 协议允许客户端与服务器建立双向通信通道,不受同源策略限制。以下代码注释详细说明了其使用方法:
// 创建 WebSocket 连接,协议为 wss(WebSocket Secure)
const socket = new WebSocket('wss://example.com');// 监听来自服务器的消息事件
socket.onmessage = (event) => {// 将接收到的数据(event.data)解析为 JSON 对象并打印console.log(JSON.parse(event.data));
};
postMessage 跨窗口通信代码注释
postMessage
是一种跨窗口通信的 API,允许不同源窗口之间安全传递数据:
// 发送方代码
// 向父窗口(window.parent)发送数据 'data',目标源为 'https://target-origin.com'
window.parent.postMessage('data', 'https://target-origin.com');// 接收方代码
// 监听 'message' 事件
window.addEventListener('message', (event) => {// 验证消息来源是否为可信源 'https://trusted-origin.com'if (event.origin === 'https://trusted-origin.com') {// 打印接收到的数据console.log(event.data);}
});
③ document.domain 的基本概念
document.domain
是浏览器同源策略(Same-Origin Policy)中的一个属性,允许具有相同顶级域名的子域之间通过脚本进行通信。通过设置该属性,子域可以放宽同源限制,实现跨子域的数据交互。
适用场景
- 父子域通信:例如
a.example.com
需要与b.example.com
共享数据。 - 跨子域窗口操作:如
iframe
嵌入不同子域的页面时访问彼此的内容。 - 仅限于同一顶级域名(如
.com
、.org
),且需双方页面主动设置相同值。
代码示例与注释
// 假设当前页面为 a.example.com,需与 b.example.com 通信
// 将文档域设置为顶级域名,允许跨子域访问
document.domain = 'example.com';// 验证是否设置成功
console.log(document.domain); // 输出: example.com
注意事项
- 仅适用于子域间通信:无法用于完全不同的域名(如
example.com
与other.com
)。 - 需双方页面同步设置:通信的双方必须同时设置相同的
document.domain
值。 - 安全性限制:现代浏览器可能要求域名包含有效的公共后缀(如
example.com
而非自定义的localhost
)。
总结
CORS需后端配合,简单请求与预检请求的处理逻辑不同。
JSONP仅支持GET请求,安全性较低。
生产环境中避免使用 Access-Control-Allow-Origin: *,应指定具体域名。
大部分浏览器仍支持 document.domain
,但部分新版本可能限制其使用。 优先考虑 PostMessage
或 CORS
等更安全的方案。
2、组件间通信方式
在Vue2和Vue3中,组件间通信方式既有共性也有差异。以下是常见方法的分类和实现示例:
Vue2中的组件通信方式
**Props / $emit**
父组件通过props
向子组件传递数据,子组件通过$emit
触发事件通知父组件。
<!-- 父组件 -->
<template><ChildComponent :message="parentMsg" @update="handleUpdate"/>
</template><script>
export default {data() {return { parentMsg: 'Hello' }},methods: {handleUpdate(val) {this.parentMsg = val}}
}
</script><!-- 子组件 -->
<script>
export default {props: ['message'],methods: {sendMessage() {this.$emit('update', 'New message')}}
}
</script>
$parent / $children
直接访问父/子组件实例(不推荐,破坏组件封装性)。
// 子组件中访问父组件
this.$parent.someMethod()// 父组件中访问子组件
this.$children[0].someMethod()
$refs
通过引用直接操作子组件。
<template><ChildComponent ref="child"/>
</template><script>
export default {methods: {callChildMethod() {this.$refs.child.someMethod()}}
}
</script>
Event Bus
创建一个中央事件总线。
// eventBus.js
import Vue from 'vue'
export const EventBus = new Vue()// 组件A
EventBus.$emit('event-name', data)// 组件B
EventBus.$on('event-name', data => {})
Vuex
状态管理库,适合复杂应用。
// store.js
export default new Vuex.Store({state: { count: 0 },mutations: {increment(state) {state.count++}}
})// 组件中使用
this.$store.commit('increment')
Vue3中的组件通信方式
Props / emits
Vue3中更规范的写法,需要显式声明emits
。
父传子基础数据传递
<!-- Parent.vue -->
<template><Child title="用户信息" :userData="user" />
</template><script setup>
import { ref } from 'vue'
const user = ref({ name: '张三', age: 25 })
</script><!-- Child.vue -->
<script setup>
defineProps({title: String,userData: Object
})
</script>
子传父事件触发
<!-- Parent.vue -->
<template><Counter @increment="handleIncrement" />
</template><script setup>
const handleIncrement = (step) => {console.log('收到步长:', step)
}
</script><!-- Counter.vue -->
<script setup>
const emit = defineEmits(['increment'])
const clickHandler = () => {emit('increment', 5)
}
</script>
provide / inject
跨层级组件通信。
// 祖先组件
import { provide } from 'vue'
provide('key', value)// 后代组件
import { inject } from 'vue'
const value = inject('key')
mitt
替代Event Bus的方案。
// event.js
import mitt from 'mitt'
export const emitter = mitt()// 组件A
emitter.emit('event', data)// 组件B
emitter.on('event', data => {})
Pinia
Vue3推荐的状态管理库。
// store.js
export const useStore = defineStore('main', {state: () => ({ count: 0 }),actions: {increment() {this.count++}}
})// 组件中使用
const store = useStore()
store.increment()
Teleport
DOM结构层面的"通信"。
<teleport to="#modal-container"><ModalComponent/>
</teleport>
通用注意事项
- 简单父子通信优先使用
props/emits
- 跨层级通信考虑
provide/inject
- 全局状态管理在复杂场景下使用Vuex(Pinia)
- 事件总线适用于小型应用,但要注意及时清理监听
- Vue3的组合式API提供了更灵活的代码组织方式
3、微信小程序生命周期
微信小程序原生生命周期
微信小程序的生命周期分为应用级、页面级和组件级三种。
应用生命周期
App({
onLaunch(options) {}, // 初始化时触发,全局只触发一次
onShow(options) {}, // 小程序启动或从后台进入前台时触发
onHide() {}, // 小程序从前台进入后台时触发
onError(error) {}, // 脚本错误或API调用失败时触发
onPageNotFound(res) {} // 页面不存在时触发
})
页面生命周期
Page({
data: {}, // 页面初始数据
onLoad(options) {}, // 页面加载时触发,一个页面只调用一次
onShow() {}, // 页面显示/切入前台时触发
onReady() {}, // 页面初次渲染完成时触发
onHide() {}, // 页面隐藏/切入后台时触发
onUnload() {}, // 页面卸载时触发
onPullDownRefresh() {}, // 下拉刷新时触发
onReachBottom() {}, // 页面上拉触底时触发
onShareAppMessage() {} // 用户点击右上角转发时触发
})
组件生命周期
Component({
lifetimes: {
attached() {}, // 组件实例进入页面节点树时触发
detached() {}, // 组件实例被从页面节点树移除时触发
},
pageLifetimes: {
show() {}, // 组件所在页面显示时触发
hide() {} // 组件所在页面隐藏时触发
}
})
UniApp生命周期
UniApp支持微信小程序的生命周期,同时扩展了Vue的生命周期。
应用生命周期
export default {
onLaunch(options) {}, // 初始化时触发
onShow(options) {}, // 启动或从后台进入前台时触发
onHide() {}, // 从前台进入后台时触发
globalData: {} // 全局数据
}
页面生命周期
export default {
data() { return {} },
onLoad(options) {}, // 页面加载时触发
onShow() {}, // 页面显示时触发
onReady() {}, // 页面初次渲染完成时触发
onHide() {}, // 页面隐藏时触发
onUnload() {}, // 页面卸载时触发
onPullDownRefresh() {}, // 下拉刷新时触发
onReachBottom() {}, // 页面上拉触底时触发
onShareAppMessage() {}, // 用户点击右上角转发时触发
methods: {} // 自定义方法
}
组件生命周期
export default {
props: {},
data() { return {} },
created() {}, // 组件实例刚创建时触发
mounted() {}, // 组件挂载到DOM时触发
destroyed() {}, // 组件销毁时触发
methods: {}
}
生命周期执行顺序
原生小程序页面首次加载时:
onLoad → onShow → onReady
UniApp页面首次加载时:
onLoad → onShow → created → mounted → onReady
组件挂载时:
原生:attached
UniApp:created → mounted
注意事项
- 原生小程序的onLoad和onShow参数包含场景值scene,而UniApp需要通过uni.getLaunchOptionsSync()获取。
- UniApp的页面生命周期与Vue组件生命周期共存,但微信小程序原生组件没有created等Vue生命周期。
- 跨平台开发时建议优先使用UniApp生命周期,如需使用平台特定生命周期,需通过条件编译实现。
4、微信小程序授权登录流程
登录流程
- 自动调用wx.login获取临时code(无需用户授权)
- 用户点击按钮触发wx.getUserProfile获取用户信息(需用户授权)
- 将code和用户加密数据发送到后端换取token
- 保存token和用户信息到本地存储
手机号获取
- 用户点击特殊按钮(open-type=“getPhoneNumber”)触发
- 通过事件对象获取加密数据
- 发送到后端解密获取真实手机号
- 保存手机号到本地存储
uniapp+vue3实现:
<script setup>
import { ref } from 'vue'
import { onLoad } from '@dcloudio/uni-app'const userInfo = ref(null)
const phoneNumber = ref('')
const token = ref('')// 微信登录
const handleLogin = async () => {try {// 1. 获取登录凭证const loginRes = await uni.login()// 2. 获取用户信息(需用户主动触发)const userRes = await uni.getUserProfile({desc: '用于完善会员资料',lang: 'zh_CN'})// 3. 调用后端登录接口const { data } = await uni.request({url: 'YOUR_API_URL/login',method: 'POST',data: {code: loginRes.code,rawData: userRes.rawData,encryptedData: userRes.encryptedData,iv: userRes.iv,signature: userRes.signature}})// 4. 保存登录状态if(data.code === 200) {token.value = data.tokenuserInfo.value = userRes.userInfouni.setStorageSync('token', data.token)uni.setStorageSync('userInfo', userRes.userInfo)uni.showToast({ title: '登录成功' })}} catch (error) {uni.showToast({ title: '登录失败', icon: 'error' })}
}// 获取手机号
const getPhoneNumber = async (e) => {if(!e.detail.code) returntry {const { data } = await uni.request({url: 'YOUR_API_URL/getPhone',method: 'POST',data: { code: e.detail.code }})if(data.code === 200) {phoneNumber.value = data.phoneuni.setStorageSync('phoneNumber', data.phone)}} catch (error) {uni.showToast({ title: '获取手机号失败', icon: 'none' })}
}
</script><template><view class="container"><button @click="handleLogin">微信登录</button><button open-type="getPhoneNumber" @getphonenumber="getPhoneNumber">获取手机号</button></view>
</template>
微信小程序原生实现
// app.js
App({globalData: {userInfo: null,phoneNumber: '',token: ''}
})// pages/login/login.js
Page({data: {loading: false,userInfo: null,phoneNumber: '',token: wx.getStorageSync('token') || ''},onLoad() {if (this.data.token) {this.setData({userInfo: wx.getStorageSync('userInfo')})}},handleLogin() {this.setData({ loading: true })wx.login({success: (res) => {if (res.code) {this._code = res.codewx.getUserProfile({desc: '用于完善会员资料',lang: 'zh_CN',success: (userRes) => {this._requestLogin(userRes)},fail: (err) => {console.error('获取用户信息失败', err)this.setData({ loading: false })}})}},fail: (err) => {console.error('登录失败', err)this.setData({ loading: false })}})},_requestLogin(userRes) {wx.request({url: 'https://your-api.com/login',method: 'POST',data: {code: this._code,rawData: userRes.rawData,encryptedData: userRes.encryptedData,iv: userRes.iv},success: (res) => {if (res.data.code === 200) {this.setData({token: res.data.token,userInfo: userRes.userInfo})wx.setStorageSync('token', res.data.token)wx.setStorageSync('userInfo', userRes.userInfo)}},complete: () => {this.setData({ loading: false })}})},handleGetPhone(e) {if (!e.detail.code) returnif (!this.data.token) returnwx.request({url: 'https://your-api.com/getPhone',method: 'POST',data: { code: e.detail.code },success: (res) => {if (res.data.code === 200) {this.setData({ phoneNumber: res.data.phone })wx.setStorageSync('phoneNumber', res.data.phone)}}})}
})
pages/login/login.wxml
<view class="container"><button bindtap="handleLogin" disabled="{{loading}}"type="primary">{{loading ? '登录中...' : '微信登录'}}</button><button open-type="getPhoneNumber" bindgetphonenumber="handleGetPhone"disabled="{{!token}}"type="primary"style="margin-top: 20px;">获取手机号</button><view wx:if="{{userInfo}}" class="user-info"><image src="{{userInfo.avatarUrl}}" mode="aspectFill"></image><text>{{userInfo.nickName}}</text></view><view wx:if="{{phoneNumber}}" class="phone-info"><text>手机号: {{phoneNumber}}</text></view>
</view>
5、防抖与节流
防抖(Debounce)和节流(Throttle)都是用于优化高频率执行事件的技术,特别是在浏览器环境中处理用户交互(如滚动、输入、调整窗口大小等)时非常有用。
防抖(Debounce)示例
防抖适用于频繁触发的事件(如输入框搜索),只在最后一次操作后延迟执行。
<template><input @input="handleInput" placeholder="输入搜索内容" />
</template><script>
import { debounce } from 'lodash-es';export default {methods: {// 使用lodash的debouncehandleInput: debounce(function(event) {console.log('防抖处理:', event.target.value);// 实际搜索逻辑}, 500),// 手动实现防抖manualDebounce(event) {if (this.timeout) clearTimeout(this.timeout);this.timeout = setTimeout(() => {console.log('手动防抖:', event.target.value);}, 500);}},beforeDestroy() {clearTimeout(this.timeout); // 清除定时器}
};
</script>
节流(Throttle)示例
节流适用于连续触发但需要限制频率的事件(如滚动、窗口大小调整)。
<template><div @scroll="handleScroll" style="height: 200px; overflow-y: scroll"><div style="height: 1000px">滚动区域</div></div>
</template><script>
import { throttle } from 'lodash-es';export default {methods: {// 使用lodash的throttlehandleScroll: throttle(function(event) {console.log('节流滚动事件:', event.target.scrollTop);}, 300),// 手动实现节流manualThrottle(event) {if (!this.throttleFlag) {this.throttleFlag = true;setTimeout(() => {console.log('手动节流:', event.target.scrollTop);this.throttleFlag = false;}, 300);}}},data() {return {throttleFlag: false};}
};
</script>
注意事项
性能优化:推荐使用 lodash-es 的 debounce 或 throttle,避免重复创建函数实例。
生命周期:在 beforeDestroy 或 unmounted 钩子中清除定时器,防止内存泄漏。
Vue 3:在 Composition API 中可结合 onUnmounted 清理:
<script setup>
import { ref, onUnmounted } from 'vue';
import { debounce } from 'lodash-es';const inputValue = ref('');
const debouncedSearch = debounce(() => {console.log('搜索:', inputValue.value);
}, 500);onUnmounted(() => {debouncedSearch.cancel(); // 取消lodash的防抖
});
</script>
拓展
安装 lodash-es 的方法
在 Vue 项目中安装 lodash-es 可以通过 npm 或 yarn 进行安装,以下是具体步骤。
npm install lodash-es
或者使用 yarn:
yarn add lodash-es
使用 lodash-es
安装完成后,可以在 Vue 项目中按需引入 lodash-es 的功能模块。
import { debounce, throttle } from 'lodash-es';
按需加载优化
为了减少打包体积,可以通过 babel 插件 babel-plugin-lodash 实现按需加载。
npm install babel-plugin-lodash --save-dev
然后在 babel.config.js 中配置:
module.exports = {plugins: ['lodash']
};
全局引入(可选)
如果需要全局使用 lodash-es,可以在 Vue 项目的入口文件(如 main.js)中引入并挂载到 Vue 原型上。
import _ from 'lodash-es';
Vue.prototype._ = _;
之后在组件中可以通过 this._ 调用 lodash 的方法。
this._.debounce(() => {// 你的逻辑
}, 300);
注意事项
lodash-es 是 lodash 的 ES 模块版本,更适合现代前端项目。
按需加载可以有效减小打包体积,提升性能。
全局引入会增加打包体积,建议仅在必要时使用。
相关文章:

前端面试真题(第一集)
目录标题 1、跨域问题及解决方法同源策略生产环境解决方案开发环境解决方案其他解决方案 2、组件间通信方式Vue2中的组件通信方式Vue3中的组件通信方式通用注意事项 3、微信小程序生命周期微信小程序原生生命周期UniApp生命周期 4、微信小程序授权登录流程登录流程手机号获取 5…...
电脑安装系统蓝屏的原因
1. 内存故障 原因:内存条接触不良、损坏或兼容性问题(如不同品牌 / 频率的内存混用)。表现:蓝屏代码可能包含 MEMORY_MANAGEMENT、PAGE_FAULT_IN_NONPAGED_AREA 等。排查方法: 重新插拔内存条,清理金手指灰…...

TDengine 高级功能——流计算
简介 在时序数据的处理中,经常要对原始数据进行清洗、预处理,再使用时序数据库进行长久的储存,而且经常还需要使用原始的时序数据通过计算生成新的时序数据。在传统的时序数据解决方案中,常常需要部署 Kafka、Flink 等流处理系统…...
expect程序交互学习
文章目录 一、初级语法学习二、例子 一、初级语法学习 1.使用expect进行ssh另一台机器 [rootlocalhost ~]# yum install -y expect #先安装expect [rootlocalhost ~]# vim expect1.sh #!/usr/bin/expect spawn ssh root192.168.68.244 expect {"yes/no" {send "…...

05.字母异位词分组
题意理解 🧠 什么是“字母异位词”? 字母异位词是指由相同的字母组成,只是排列顺序不同的单词。 比如: "eat" 和 "tea" 是异位词,它们都包含 e、a 和 t。"ate" 也是它们的异位词。但…...

Mac查看MySQL版本的命令
通过 Homebrew 查看(如果是用 Homebrew 安装的) brew info mysql 会显示你安装的版本、路径等信息。 你的终端输出显示:你并没有安装 MySQL,只是查询了 brew 中的 MySQL 安装信息。我们一起来看下重点: 🧾…...

【.net core】【watercloud】树形组件combotree导入及调用
源码下载:combotree: 基于layui及zTree的树下拉框组件 链接中提供了组件的基本使用方法 框架修改内容 1.文件导入(路径可更具自身情况自行设定) 解压后将文件夹放在图示路径下,修改文件夹名称为combotree 2.设置路径(设置layu…...
[Java 基础]面向对象-封装
封装是构建健壮、可维护和安全软件的基础。 什么是封装? 想象一下你的手机。你不需要知道手机内部复杂的电路、芯片和各种组件是如何协同工作的,你只需要知道如何使用屏幕、按键或触摸操作来打电话、发短信或玩游戏。手机的内部细节被“包裹”起来&…...

2021 RoboCom 世界机器人开发者大赛-高职组(复赛)解题报告 | 珂学家
前言 题解 2021 RoboCom 世界机器人开发者大赛-高职组(复赛)解题报告。 模拟题为主,包含进制转换等等。 最后一题,是对向量/自定义类型,重定义小于操作符。 7-1 人工智能打招呼 分值: 15分 考察点: 分支判定&…...
Python趣学篇:Pygame实现3D星空穿越动画
名人说:路漫漫其修远兮,吾将上下而求索。—— 屈原《离骚》 创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 专栏介绍:《Python星球日记》🪐 目录 一、项目概览与技术栈二、核心技术原理解析1. 透视投影:让3D世界"压扁"到2D屏幕2. Z轴深度:创造…...
基于Web的安全漏洞分析与修复平台设计与实现
基于Web的安全漏洞分析与修复平台设计与实现 摘要 随着信息化进程的加快,Web系统和企业IT架构愈发复杂,安全漏洞频发已成为影响系统安全运行的主要因素。为解决传统漏洞扫描工具定位不准确、修复建议不完善、响应周期长等问题,本文设计并实…...

34.1STM32下的can总线实现知识(区分linux)_csdn
看过我之前的文章就知道,正点原子下的linux中CAN总线并没有讲的很明白,都是系统自带的! 这里我找到江科大学长的can总线的讲解视频! CAN总线入门教程-全面细致 面包板教学 多机通信_哔哩哔哩_bilibili 在这里我也会一步一步讲解CA…...
相机Camera日志分析之二十四:高通相机Camx 基于预览1帧的process_capture_request三级日志分析详解
【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了:相机Camera日志分析之二十三:高通相机Camx 基于预览1帧的process_capture_request二级日志分析详解 这一篇我们开始讲: 相机Camera日志分析之二十四:高通相机Camx 基于预览1帧的process_capture_req…...
Linux 内核中 skb_dst_drop 的深入解析:路由缓存管理与版本实现差异
引言 在 Linux 内核网络子系统中,sk_buff(简称 SKB)是数据包在内核态流转的核心数据结构。为了高效处理网络数据包的路由选择,内核通过 dst_entry 结构体缓存路由信息,而 skb_dst_drop 函数则是管理这些路由缓存引用的关键工具。本文将从作用、实现原理、内核版本差异等多…...
考研系列—操作系统:冲刺笔记(4-5章)
目录 第四章 文件管理 1.真题总结文件管理方式 (1)目录文件的FCB就是“目录名-目录地址” (2)普通文件的FCB (3)区分索引文件、顺序文件、索引分配 (4)文件的物理结构 ①连续分配方式 ②链接分配 ③索引分配-使用索引表(一个文件对应一张索引表!!!) 计算考点:超级…...
功能管理:基于 ABP 的 Feature Management 实现动态开关
🚀 功能管理:基于 ABP 的 Feature Management 实现动态开关 📚 目录 🚀 功能管理:基于 ABP 的 Feature Management 实现动态开关📚 一、背景分析🧩 二、核心功能设计2.1 定义 Feature 常量与分组…...

2025年想冲网安方向,该考华为安全HCIE还是CISSP?
打算2025年往网络安全方向转,现在考证是不是来得及?考啥证? 说实话,网络安全这几年热得发烫,但热归热,入门门槛也不低,想进这个赛道,技术、项目经验、证书,缺一不可。 …...
ES6 深克隆与浅克隆详解:原理、实现与应用场景
ES6 深克隆与浅克隆详解:原理、实现与应用场景 一、克隆的本质与必要性 在 JavaScript 中,数据分为两大类型: 基本类型:Number、String、Boolean、null、undefined、Symbol、BigInt引用类型:Object、Array、Functio…...
Go Gin框架深度解析:高性能Web开发实践
Go Gin框架深度解析:高性能Web开发实践 Gin框架核心特性概览 Gin是用Go语言编写的高性能Web框架,以其闪电般的路由性能(基于httprouter)和极简的API设计著称: package mainimport "github.com…...
mybatis 参数绑定错误示范(1)
采用xml形式的mybatis 错误示例: server伪代码为: Map<String, Object> findMapNew MapUtil.<String, Object>builder().put("applyUnit", appUnit).put("planYear", year ! null ? year : -1).put("code&quo…...
每天掌握一个Linux命令 - rpm
Linux 命令工具 rpm 使用指南 Linux 命令工具 rpm 使用指南一、工具概述二、安装方式1. 系统预装2. 源码编译安装(极少场景) 三、核心功能四、基础用法1. 安装软件包2. 升级软件包3. 查询软件包信息4. 卸载软件包5. 验证文件完整性 五、进阶操作1. 批量操…...
常见的MySQL索引类型
在MySQL中,索引是用来提高数据库查询效率的一种数据结构。根据不同的使用场景和需求,MySQL提供了多种类型的索引,每种索引都有其特定的应用场景和优化效果。下面是一些常见的MySQL索引类型: 1. B-Tree索引: 这是最常…...
01串(二进制串)与集合之间存在天然的对应关系 ← bitset
【集合的二进制表示】 ● 01 串(二进制串)与集合之间存在天然的对应关系。对应机理为每个二进制位可以表示集合中一个元素的存在(1)或不存在(0)。例如,集合 {a, b, c} 的子集 {a, c} 可以表示…...

153页PPT麦肯锡咨询流程管理及企业五年发展布局构想与路径规划
麦肯锡咨询的流程管理以其高度结构化、数据驱动和结果导向的核心特点著称,旨在为客户提供清晰、可行且价值最大化的解决方案。其典型流程可概括为以下几个关键阶段:下载资料请查看文章中图片右下角信息 问题界定与结构化: 这是流程的基石。麦…...

[特殊字符] 革命性AI提示词优化平台正式开源!
AI时代最强大的Prompt工程师已经到来! 你是否还在为写不出高质量提示词而头疼?是否羡慕那些能够驾驭AI、让ChatGPT、Claude乖乖听话的"提示词大师"?今天,我们为你带来一个颠覆性的解决方案——TokenAI Auto-Prompt&…...

我的概要设计模板(以图书管理系统为例)
一、总述 1.1 需求或目标 随着数字化阅读普及,传统图书馆管理方式效率低下、资源检索不便。为提升图书管理效率,方便读者借阅与查询,公司计划开发 “在线图书管理系统”,实现图书的电子化管理、快速检索、在线借阅等功能&#x…...
【使用】【经验】docker 清理未使用的镜像的命令
docker images prune在 Docker 中清理未使用的镜像(包括悬空镜像和完全未被引用的镜像),可以使用以下命令: 1. 删除所有悬空镜像(推荐常用) docker image prune悬空镜像 (dangling images) 是指…...

DrissionPage爬虫包实战分享
一、爬虫 1.1 爬虫解释 爬虫简单的说就是模拟人的浏览器行为,简单的爬虫是request请求网页信息,然后对html数据进行解析得到自己需要的数据信息保存在本地。 1.2 爬虫的思路 # 1.发送请求 # 2.获取数据 # 3.解析数据 # 4.保存数据 1.3 爬虫工具 Dris…...

iptables实战案例
目录 一、实验拓扑 二、网络规划 三、实验要求 四、环境准备 1.firewall (1)配置防火墙各大网卡IP并禁用 firewall和selinux (2)打开firewall路由转发 2.PC1(内网) (1)配置防…...
机器学习与深度学习07-随机森林01
目录 前文回顾1.随机森林的定义2.随机森林中的过拟合3.随机森林VS单一决策树4.随机森林的随机性 前文回顾 上一篇文章链接:地址 1.随机森林的定义 随机森林(Random Forest)是一种集成学习算法,用于解决分类和回归问题。它基于决…...