前端面试真题(第一集)

news2025/7/27 5:37:49

目录标题

  • 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.comother.com)。
  • 需双方页面同步设置:通信的双方必须同时设置相同的 document.domain 值。
  • 安全性限制:现代浏览器可能要求域名包含有效的公共后缀(如 example.com 而非自定义的 localhost)。

总结
CORS需后端配合,简单请求与预检请求的处理逻辑不同。
JSONP仅支持GET请求,安全性较低。
生产环境中避免使用 Access-Control-Allow-Origin: *,应指定具体域名。
大部分浏览器仍支持 document.domain,但部分新版本可能限制其使用。 优先考虑 PostMessageCORS 等更安全的方案。


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.token
      userInfo.value = userRes.userInfo
      uni.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) return
  
  try {
    const { data } = await uni.request({
      url: 'YOUR_API_URL/getPhone',
      method: 'POST',
      data: { code: e.detail.code }
    })
    
    if(data.code === 200) {
      phoneNumber.value = data.phone
      uni.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.code
          wx.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) return
    if (!this.data.token) return
    
    wx.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的debounce
    handleInput: 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的throttle
    handleScroll: 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 模块版本,更适合现代前端项目。
按需加载可以有效减小打包体积,提升性能。
全局引入会增加打包体积,建议仅在必要时使用。


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

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

相关文章

TDengine 高级功能——流计算

简介 在时序数据的处理中&#xff0c;经常要对原始数据进行清洗、预处理&#xff0c;再使用时序数据库进行长久的储存&#xff0c;而且经常还需要使用原始的时序数据通过计算生成新的时序数据。在传统的时序数据解决方案中&#xff0c;常常需要部署 Kafka、Flink 等流处理系统…

05.字母异位词分组

题意理解 &#x1f9e0; 什么是“字母异位词”&#xff1f; 字母异位词是指由相同的字母组成&#xff0c;只是排列顺序不同的单词。 比如&#xff1a; "eat" 和 "tea" 是异位词&#xff0c;它们都包含 e、a 和 t。"ate" 也是它们的异位词。但…

Mac查看MySQL版本的命令

通过 Homebrew 查看&#xff08;如果是用 Homebrew 安装的&#xff09; brew info mysql 会显示你安装的版本、路径等信息。 你的终端输出显示&#xff1a;你并没有安装 MySQL&#xff0c;只是查询了 brew 中的 MySQL 安装信息。我们一起来看下重点&#xff1a; &#x1f9fe…

【.net core】【watercloud】树形组件combotree导入及调用

源码下载:combotree: 基于layui及zTree的树下拉框组件 链接中提供了组件的基本使用方法 框架修改内容 1.文件导入&#xff08;路径可更具自身情况自行设定&#xff09; 解压后将文件夹放在图示路径下&#xff0c;修改文件夹名称为combotree 2.设置路径&#xff08;设置layu…

2021 RoboCom 世界机器人开发者大赛-高职组(复赛)解题报告 | 珂学家

前言 题解 2021 RoboCom 世界机器人开发者大赛-高职组&#xff08;复赛&#xff09;解题报告。 模拟题为主&#xff0c;包含进制转换等等。 最后一题&#xff0c;是对向量/自定义类型&#xff0c;重定义小于操作符。 7-1 人工智能打招呼 分值: 15分 考察点: 分支判定&…

34.1STM32下的can总线实现知识(区分linux)_csdn

看过我之前的文章就知道&#xff0c;正点原子下的linux中CAN总线并没有讲的很明白&#xff0c;都是系统自带的&#xff01; 这里我找到江科大学长的can总线的讲解视频&#xff01; CAN总线入门教程-全面细致 面包板教学 多机通信_哔哩哔哩_bilibili 在这里我也会一步一步讲解CA…

2025年想冲网安方向,该考华为安全HCIE还是CISSP?

打算2025年往网络安全方向转&#xff0c;现在考证是不是来得及&#xff1f;考啥证&#xff1f; 说实话&#xff0c;网络安全这几年热得发烫&#xff0c;但热归热&#xff0c;入门门槛也不低&#xff0c;想进这个赛道&#xff0c;技术、项目经验、证书&#xff0c;缺一不可。 …

153页PPT麦肯锡咨询流程管理及企业五年发展布局构想与路径规划

麦肯锡咨询的流程管理以其高度结构化、数据驱动和结果导向的核心特点著称&#xff0c;旨在为客户提供清晰、可行且价值最大化的解决方案。其典型流程可概括为以下几个关键阶段&#xff1a;下载资料请查看文章中图片右下角信息 问题界定与结构化&#xff1a; 这是流程的基石。麦…

[特殊字符] 革命性AI提示词优化平台正式开源!

AI时代最强大的Prompt工程师已经到来&#xff01; 你是否还在为写不出高质量提示词而头疼&#xff1f;是否羡慕那些能够驾驭AI、让ChatGPT、Claude乖乖听话的"提示词大师"&#xff1f;今天&#xff0c;我们为你带来一个颠覆性的解决方案——TokenAI Auto-Prompt&…

我的概要设计模板(以图书管理系统为例)

一、总述 1.1 需求或目标 随着数字化阅读普及&#xff0c;传统图书馆管理方式效率低下、资源检索不便。为提升图书管理效率&#xff0c;方便读者借阅与查询&#xff0c;公司计划开发 “在线图书管理系统”&#xff0c;实现图书的电子化管理、快速检索、在线借阅等功能&#x…

DrissionPage爬虫包实战分享

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

iptables实战案例

目录 一、实验拓扑 二、网络规划 三、实验要求 四、环境准备 1.firewall &#xff08;1&#xff09;配置防火墙各大网卡IP并禁用 firewall和selinux &#xff08;2&#xff09;打开firewall路由转发 2.PC1&#xff08;内网&#xff09; &#xff08;1&#xff09;配置防…

Google AI 模式下的SEO革命:生成式搜索优化(GEO)与未来营销策略

一、搜索范式转变&#xff1a;从链接引导到答案交付 Google自2023年起逐步推出AI搜索功能&#xff0c;经历了SGE&#xff08;Search Generative Experience&#xff09;和Gemini阶段&#xff0c;最终在2025年全面上线了「AI Mode」搜索模式。与此同时&#xff0c;也保留了一种过…

SpringBoot中缓存@Cacheable出错

SpringBoot中使用Cacheable: 错误代码&#xff1a; Cacheable(value "FrontAdvertiseVOList", keyGenerator "cacheKey") Override public List<FrontAdvertiseVO> getFrontAdvertiseVOList(Integer count) {return this.list(Wrappers.<Adve…

iOS UIActivityViewController 组头处理

0x00 情形一 - (void)shareAction1 {// 当前 View 转成图片UIImage *image [self snapshotImage:self.view];NSArray *activityItems [image];UIActivityViewController *activityVC [[UIActivityViewController alloc] initWithActivityItems:activityItems applicationAc…

《TCP/IP 详解 卷1:协议》第3章:链路层

以太网和IEEE802局域网/城域网标准 IEEE802局域网/城域网标准 IEEE 802 是一组由 IEEE&#xff08;电气与电子工程师协会&#xff09;定义的局域网和城域网通信标准系列&#xff0c;涵盖了从物理层到链路层的多个网络技术。其中&#xff1a; IEEE 802.3 定义的是传统的以太网…

Elasticsearch从安装到实战、kibana安装以及自定义IK分词器/集成整合SpringBoot详细的教程(二)

package com.test.xulk.es.entity.mapper;import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.test.xulk.es.entity.Hotel;public interface HotelMapper extends BaseMapper<Hotel> { }集成Springboot 项目里面 官方地址&#xff1a; Elasticsearch …

数据库管理-第333期 Oracle 23ai:RAC打补丁完全不用停机(20250604)

数据库管理333期 2025-06-04 数据库管理-第333期 Oracle 23ai&#xff1a;RAC打补丁完全不用停机&#xff08;20250604&#xff09;1 概念2 要求3 操作流程4 转移失败处理总结 数据库管理-第333期 Oracle 23ai&#xff1a;RAC打补丁完全不用停机&#xff08;20250604&#xff0…

【DAY39】图像数据与显存

内容来自浙大疏锦行python打卡训练营 浙大疏锦行 知识点&#xff1a; 图像数据的格式&#xff1a;灰度和彩色数据模型的定义显存占用的4种地方 模型参数梯度参数优化器参数数据批量所占显存神经元输出中间状态 batchisize和训练的关系 作业&#xff1a;今日代码较少&#xff0…

AI代码库问答引擎Folda-Scan

简介 什么是 Folda-Scan &#xff1f; Folda-Scan 是一款革命性的智能项目问答工具&#xff0c; 完全在浏览器中本地运行 。它使用高级语义矢量化将您的代码库转变为对话伙伴&#xff0c;使代码理解和 AI 协作变得前所未有的简单和安全。其采用尖端的 Web 技术和 AI 算法构建&…