【Vue】模板语法与指令
个人主页:Guiat
归属专栏:Vue
文章目录
- 1. Vue 模板语法基础
- 1.1 文本插值
- 1.2 原始 HTML
- 1.3 属性绑定
- 2. Vue 指令系统
- 2.1 条件渲染
- 2.2 列表渲染
- 2.3 事件处理
- 2.4 表单输入绑定
- 3. 计算属性与侦听器
- 3.1 计算属性
- 3.2 侦听器
- 4. 类与样式绑定
- 4.1 绑定 HTML 类
- 4.2 绑定内联样式
- 5. 条件渲染进阶
- 5.1 v-if 与模板
- 6. 列表渲染进阶
- 6.1 数组变更检测
- 6.2 过滤和排序
- 7. 事件处理进阶
- 7.1 事件修饰符详解
- 7.2 按键修饰符
正文
1. Vue 模板语法基础
Vue 模板语法允许开发者以声明式的方式将数据渲染到 DOM。
1.1 文本插值
<div id="app"><!-- 基本文本插值 --><p>{{ message }}</p><!-- 表达式支持 --><p>{{ message.split('').reverse().join('') }}</p><!-- 数学运算 --><p>{{ count + 1 }}</p><!-- 三元表达式 --><p>{{ isActive ? '激活' : '未激活' }}</p>
</div><script>const app = Vue.createApp({data() {return {message: 'Hello Vue!',count: 10,isActive: true}}}).mount('#app')
</script>
1.2 原始 HTML
<div id="app"><!-- 文本插值会将HTML转义 --><p>{{ rawHtml }}</p><!-- v-html 指令用于输出原始HTML --><p v-html="rawHtml"></p>
</div><script>const app = Vue.createApp({data() {return {rawHtml: '<span style="color: red">这是红色文本</span>'}}}).mount('#app')
</script>
1.3 属性绑定
<div id="app"><!-- 绑定HTML属性 --><div v-bind:id="dynamicId">动态ID元素</div><!-- 简写语法 --><img :src="imageSrc" :alt="imageAlt"><!-- 布尔属性 --><button :disabled="isButtonDisabled">按钮</button><!-- 动态绑定多个属性 --><div v-bind="objectOfAttrs">多属性绑定</div>
</div><script>const app = Vue.createApp({data() {return {dynamicId: 'my-element',imageSrc: 'https://example.com/image.jpg',imageAlt: '示例图片',isButtonDisabled: true,objectOfAttrs: {id: 'container',class: 'wrapper',style: 'color: blue'}}}}).mount('#app')
</script>
2. Vue 指令系统
2.1 条件渲染
<div id="app"><!-- v-if 条件渲染 --><h1 v-if="awesome">Vue 很棒!</h1><h1 v-else>哦不 😢</h1><!-- v-if/v-else-if/v-else 链 --><div v-if="type === 'A'">A类型</div><div v-else-if="type === 'B'">B类型</div><div v-else-if="type === 'C'">C类型</div><div v-else>未知类型</div><!-- v-show 切换元素的显示状态 --><h1 v-show="isVisible">使用v-show控制显示</h1>
</div><script>const app = Vue.createApp({data() {return {awesome: true,type: 'B',isVisible: true}}}).mount('#app')
</script>
2.2 列表渲染
<div id="app"><!-- 基本列表渲染 --><ul><li v-for="item in items" :key="item.id">{{ item.name }}</li></ul><!-- 带索引的列表渲染 --><ul><li v-for="(item, index) in items" :key="item.id">{{ index }} - {{ item.name }}</li></ul><!-- 对象属性遍历 --><ul><li v-for="(value, key, index) in userObject" :key="key">{{ index }}. {{ key }}: {{ value }}</li></ul><!-- 遍历数字范围 --><span v-for="n in 10" :key="n">{{ n }} </span>
</div><script>const app = Vue.createApp({data() {return {items: [{ id: 1, name: '苹果' },{ id: 2, name: '香蕉' },{ id: 3, name: '橙子' }],userObject: {name: '张三',age: 30,city: '上海'}}}}).mount('#app')
</script>
2.3 事件处理
<div id="app"><!-- 基本事件绑定 --><button v-on:click="counter++">点击计数: {{ counter }}</button><!-- 简写语法 --><button @click="greet">问候</button><!-- 内联处理器 --><button @click="say('你好', $event)">说你好</button><!-- 事件修饰符 --><a @click.stop.prevent="handleLink">阻止默认行为并停止传播</a><!-- 按键修饰符 --><input @keyup.enter="submitForm"><!-- 系统修饰键 --><div @click.ctrl="handleCtrlClick">Ctrl + 点击</div>
</div><script>const app = Vue.createApp({data() {return {counter: 0}},methods: {greet() {alert('你好,Vue!')},say(message, event) {alert(message)console.log(event)},handleLink() {console.log('链接被点击,但默认行为被阻止')},submitForm() {console.log('表单提交')},handleCtrlClick() {console.log('Ctrl + 点击被触发')}}}).mount('#app')
</script>
2.4 表单输入绑定
<div id="app"><!-- 文本输入 --><input v-model="message" placeholder="编辑我"><p>消息: {{ message }}</p><!-- 多行文本 --><textarea v-model="description" placeholder="多行输入"></textarea><p>描述: {{ description }}</p><!-- 复选框 --><input type="checkbox" id="checkbox" v-model="checked"><label for="checkbox">{{ checked ? '已选中' : '未选中' }}</label><!-- 多个复选框 --><div><input type="checkbox" id="apple" value="苹果" v-model="checkedFruits"><label for="apple">苹果</label><input type="checkbox" id="banana" value="香蕉" v-model="checkedFruits"><label for="banana">香蕉</label><input type="checkbox" id="orange" value="橙子" v-model="checkedFruits"><label for="orange">橙子</label></div><p>选中的水果: {{ checkedFruits }}</p><!-- 单选按钮 --><div><input type="radio" id="one" value="一" v-model="picked"><label for="one">一</label><input type="radio" id="two" value="二" v-model="picked"><label for="two">二</label></div><p>选中的值: {{ picked }}</p><!-- 选择框 --><select v-model="selected"><option disabled value="">请选择</option><option>北京</option><option>上海</option><option>广州</option></select><p>选中的城市: {{ selected }}</p><!-- 修饰符 --><input v-model.lazy="lazyMessage" placeholder="失焦时才更新"><p>Lazy消息: {{ lazyMessage }}</p><input v-model.number="age" type="number" placeholder="自动转为数字"><p>年龄: {{ age }} (类型: {{ typeof age }})</p><input v-model.trim="trimmedMessage" placeholder="自动去除首尾空格"><p>去除空格后: "{{ trimmedMessage }}"</p>
</div><script>const app = Vue.createApp({data() {return {message: '',description: '',checked: false,checkedFruits: [],picked: '',selected: '',lazyMessage: '',age: 0,trimmedMessage: ''}}}).mount('#app')
</script>
3. 计算属性与侦听器
3.1 计算属性
<div id="app"><!-- 原始数据 --><p>原始消息: "{{ message }}"</p><!-- 计算属性 --><p>反转消息: "{{ reversedMessage }}"</p><!-- 方法调用 (每次重新渲染都会调用) --><p>方法反转: "{{ reverseMessage() }}"</p><!-- 带缓存的计算属性 --><p>全名: {{ fullName }}</p><button @click="firstName = '李'">修改姓</button><button @click="lastName = '四'">修改名</button>
</div><script>const app = Vue.createApp({data() {return {message: 'Hello Vue!',firstName: '张',lastName: '三'}},computed: {// 计算属性会基于其依赖进行缓存reversedMessage() {console.log('计算属性被执行')return this.message.split('').reverse().join('')},// 带getter和setter的计算属性fullName: {get() {return this.firstName + this.lastName},set(newValue) {const names = newValue.split(' ')this.firstName = names[0]this.lastName = names[names.length - 1]}}},methods: {// 方法不会缓存reverseMessage() {console.log('方法被调用')return this.message.split('').reverse().join('')}}}).mount('#app')
</script>
3.2 侦听器
<div id="app"><p>问一个问题: <input v-model="question"></p><p>{{ answer }}</p><p>姓: <input v-model="firstName">名: <input v-model="lastName"></p><p>全名: {{ fullName }}</p><!-- 深度监听示例 --><button @click="updateUserInfo">更新用户信息</button><pre>{{ user }}</pre>
</div><script>const app = Vue.createApp({data() {return {question: '',answer: '请输入问题',firstName: '张',lastName: '三',fullName: '张三',user: {name: '李四',address: {city: '北京'}}}},watch: {// 简单侦听器question(newQuestion, oldQuestion) {if (newQuestion.includes('?')) {this.getAnswer()}},// 侦听多个属性变化firstName(newVal) {this.fullName = newVal + this.lastName},lastName(newVal) {this.fullName = this.firstName + newVal},// 深度侦听对象变化user: {handler(newVal) {console.log('用户信息变化了', newVal)},deep: true // 深度监听},// 立即执行的侦听器'user.name': {handler(newVal) {console.log('用户名变化了', newVal)},immediate: true // 立即执行一次}},methods: {getAnswer() {this.answer = '思考中...'setTimeout(() => {this.answer = '这是一个很好的问题!'}, 1000)},updateUserInfo() {this.user.address.city = '上海'}}}).mount('#app')
</script>
4. 类与样式绑定
4.1 绑定 HTML 类
<div id="app"><!-- 对象语法 --><div :class="{ active: isActive, 'text-danger': hasError }">对象语法绑定类</div><!-- 数组语法 --><div :class="[activeClass, errorClass]">数组语法绑定类</div><!-- 数组中使用对象 --><div :class="[isActive ? activeClass : '', { error: hasError }]">混合语法绑定类</div><!-- 组件上使用 --><my-component :class="{ active: isActive }"></my-component>
</div><script>const app = Vue.createApp({data() {return {isActive: true,hasError: false,activeClass: 'active',errorClass: 'text-danger'}},components: {'my-component': {template: '<p class="base-class">组件</p>'// 最终渲染: <p class="base-class active">组件</p>}}}).mount('#app')
</script>
4.2 绑定内联样式
<div id="app"><!-- 对象语法 --><div :style="{ color: activeColor, fontSize: fontSize + 'px' }">对象语法绑定样式</div><!-- 直接绑定对象 --><div :style="styleObject">绑定样式对象</div><!-- 数组语法 --><div :style="[baseStyles, overridingStyles]">数组语法绑定多个样式对象</div><!-- 自动添加前缀 --><div :style="{ display: ['-webkit-box', '-ms-flexbox', 'flex'] }">自动添加浏览器前缀</div>
</div><script>const app = Vue.createApp({data() {return {activeColor: 'red',fontSize: 18,styleObject: {color: 'blue',backgroundColor: '#f0f0f0',padding: '10px'},baseStyles: {fontWeight: 'bold',letterSpacing: '1px'},overridingStyles: {color: 'green',textDecoration: 'underline'}}}}).mount('#app')
</script>
5. 条件渲染进阶
5.1 v-if 与模板
<div id="app"><!-- 使用template元素包裹多个元素 --><template v-if="loginType === 'username'"><label>用户名</label><input placeholder="输入用户名" key="username-input"></template><template v-else><label>邮箱</label><input placeholder="输入邮箱" key="email-input"></template><button @click="toggleLoginType">切换登录类型</button><!-- v-if vs v-show --><h1 v-if="showWithIf">v-if: 条件为真时才渲染</h1><h1 v-show="showWithShow">v-show: 始终渲染但条件为假时隐藏</h1><button @click="toggleShow">切换显示</button>
</div><script>const app = Vue.createApp({data() {return {loginType: 'username',showWithIf: true,showWithShow: true}},methods: {toggleLoginType() {this.loginType = this.loginType === 'username' ? 'email' : 'username'},toggleShow() {this.showWithIf = !this.showWithIfthis.showWithShow = !this.showWithShow}}}).mount('#app')
</script>
6. 列表渲染进阶
6.1 数组变更检测
<div id="app"><ul><li v-for="(item, index) in items" :key="item.id">{{ item.name }} - {{ item.price }}元<button @click="removeItem(index)">删除</button></li></ul><div><input v-model="newItemName" placeholder="商品名称"><input v-model.number="newItemPrice" type="number" placeholder="价格"><button @click="addItem">添加商品</button></div><button @click="sortItems">按价格排序</button><button @click="reverseItems">反转列表</button>
</div><script>const app = Vue.createApp({data() {return {items: [{ id: 1, name: '苹果', price: 5 },{ id: 2, name: '香蕉', price: 3 },{ id: 3, name: '橙子', price: 6 }],newItemName: '',newItemPrice: 0,nextId: 4}},methods: {addItem() {if (this.newItemName && this.newItemPrice > 0) {this.items.push({id: this.nextId++,name: this.newItemName,price: this.newItemPrice})this.newItemName = ''this.newItemPrice = 0}},removeItem(index) {this.items.splice(index, 1)},sortItems() {// 变更方法: 会触发视图更新this.items.sort((a, b) => a.price - b.price)},reverseItems() {// 变更方法: 会触发视图更新this.items.reverse()},updateItem(index) {// 非变更方法: 需要替换数组才能触发更新// this.items[index].price += 1 // 不会触发视图更新// 正确的方式:this.items[index] = { ...this.items[index], price: this.items[index].price + 1 }// 或者使用 Vue.set 或 this.$set (Vue 2)}}}).mount('#app')
</script>
6.2 过滤和排序
<div id="app"><input v-model="searchQuery" placeholder="搜索..."><ul><li v-for="item in filteredItems" :key="item.id">{{ item.name }} - {{ item.price }}元</li></ul><div><button @click="sortOrder = 'asc'">价格升序</button><button @click="sortOrder = 'desc'">价格降序</button><button @click="sortOrder = 'none'">原始顺序</button></div>
</div><script>const app = Vue.createApp({data() {return {items: [{ id: 1, name: '苹果', price: 5 },{ id: 2, name: '香蕉', price: 3 },{ id: 3, name: '橙子', price: 6 },{ id: 4, name: '葡萄', price: 8 }],searchQuery: '',sortOrder: 'none'}},computed: {filteredItems() {// 先过滤let result = this.itemsif (this.searchQuery) {const query = this.searchQuery.toLowerCase()result = result.filter(item => item.name.toLowerCase().includes(query))}// 再排序if (this.sortOrder !== 'none') {result = [...result].sort((a, b) => {return this.sortOrder === 'asc' ? a.price - b.price : b.price - a.price})}return result}}}).mount('#app')
</script>
7. 事件处理进阶
7.1 事件修饰符详解
<div id="app"><!-- 阻止单击事件继续传播 --><a @click.stop="doThis">阻止冒泡</a><!-- 提交事件不再重载页面 --><form @submit.prevent="onSubmit"><input type="text"><button type="submit">提交</button></form><!-- 修饰符可以串联 --><a @click.stop.prevent="doThat">阻止默认行为和冒泡</a><!-- 只有修饰符 --><form @submit.prevent><input type="text"><button type="submit">阻止默认提交</button></form><!-- 添加事件监听器时使用事件捕获模式 --><div @click.capture="doThis">捕获模式<button @click="childClick">子元素</button></div><!-- 只当在 event.target 是当前元素自身时触发处理函数 --><div @click.self="doThat">只有点击这里才触发<button>点击我不会触发父元素事件</button></div><!-- 点击事件将只会触发一次 --><button @click.once="doOnce">只触发一次</button><!-- 滚动事件的默认行为 (滚动) 将立即发生,不等待完成 --><div @scroll.passive="onScroll">被动监听的滚动区域</div>
</div><script>const app = Vue.createApp({methods: {doThis() {console.log('doThis 被调用')},doThat() {console.log('doThat 被调用')},onSubmit() {console.log('表单提交')},childClick() {console.log('子元素被点击')},doOnce() {console.log('这个处理函数只会触发一次')},onScroll() {console.log('滚动中...')}}}).mount('#app')
</script>
7.2 按键修饰符
<div id="app"><!-- 按下Enter键时调用 --><input @keyup.enter="submit"><!-- 按下Tab键时调用 --><input @keyup.tab="handleTab"><!-- 按下Delete键时调用 --><input @keyup.delete="handleDelete"><!-- 按下Esc键时调用 --><input @keyup.esc="handleEscape"><!-- 按下空格键时调用 --><input @keyup.space="handleSpace"><!-- 按下上方向键时调用 --><input @keyup.up="handleUp"><!-- 按下Page Down键时调用 --><input @keyup.page-down="handlePageDown"><!-- 组合按键 --><input @keyup.alt.enter="handleAltEnter"><!-- Ctrl + 点击 --><div @click.ctrl="handleCtrlClick">Ctrl + Click</div><!-- 精确的系统修饰符 --><button @click.ctrl.exact="onCtrlClick">仅当按下Ctrl时</button><button @click.exact="onClickWithoutModifiers">没有任何系统修饰符</button>
</div><script>const app = Vue.createApp({methods: {submit() {console.log('提交表单')},handleTab() {console.log('Tab键被按下')},handleDelete() {console.log('Delete键被按下')},handleEscape() {console.log('Esc键被按下')},handleSpace() {console.log('空格键被按下')},handleUp() {console.log('上方向键被按下')},handlePageDown() {console.log('Page Down键被按下')},handleAltEnter() {console.log('Alt + Enter被按下')},handleCtrlClick() {console.log('Ctrl + Click被触发')},onCtrlClick() {console.log('仅当按下Ctrl时触发')},onClickWithoutModifiers() {console.log('没有任何系统修饰符时触发')}}}).mount('#app')
</script>
结语
感谢您的阅读!期待您的一键三连!欢迎指正!
相关文章:
【Vue】模板语法与指令
个人主页:Guiat 归属专栏:Vue 文章目录 1. Vue 模板语法基础1.1 文本插值1.2 原始 HTML1.3 属性绑定 2. Vue 指令系统2.1 条件渲染2.2 列表渲染2.3 事件处理2.4 表单输入绑定 3. 计算属性与侦听器3.1 计算属性3.2 侦听器 4. 类与样式绑定4.1 绑定 HTML 类…...
Python语法系列博客 · 第5期[特殊字符] 模块与包的导入:构建更大的程序结构
上一期小练习解答(第4期回顾) ✅ 练习1:判断偶数函数 def is_even(num):return num % 2 0print(is_even(4)) # True print(is_even(5)) # False✅ 练习2:求平均值 def avg(*scores):return sum(scores) / len(scores)print(…...
HashMap 初步理解 put 操作流程 HashMap 的线程安全问题
一、HashMap 核心原理 HashMap 是 Java 中最常用的哈希表实现,基于 数组 链表/红黑树 的复合结构,核心特性如下: 哈希函数 键的哈希值通过 hashCode() 计算,并通过扰动函数优化分布:static final int hash(Object ke…...
服务治理-服务发现和负载均衡
第一步:引入依赖 第二步:配置地址 改写购物车服务的代码 负载均衡成功实现。 假如有一个服务挂了,比如说8081,cart-service能不能正常访问,感知到。 再重新启动8081端口。 不管服务宕机也好,还是服务刚启动…...
GNU,GDB,GCC,G++是什么?与其他编译器又有什么关系?
文章目录 前言1. GNU和他的工具1.1 gcc与g1.2 gdb 2.Windows的Mingw/MSVC3.LLVM的clang/clang4.Make/CMake 前言 在开始之前我们先放一段Hello World:hello.c #include <stdio.h>int main() {printf("Hello World");return 0; }然后就是一段老生常…...
定制一款国密浏览器(9):SM4 对称加密算法
上一章介绍了 SM3 算法的移植要点,本章介绍对称加密算法 SM4 的移植要点。 SM4 算法相对 SM3 算法来说复杂一些,但还是比较简单的算法,详细算法说明参考《GMT 0002-2012 SM4分组密码算法》这份文档。铜锁开源项目的实现代码在 sm4.c 文件中,直接拿过来编译就可以。 但需要…...
kafka集群认证
1、安装Kerberos(10.10.10.168) yum install krb5-server krb5-workstation krb5-libs -y 查看版本 klist -V Kerberos 5 version 1.20.1 编辑/etc/hosts 10.10.10.168 ms1 10.10.10.150 ms2 10.10.10.110 ms3 vim /etc/krb5.conf # Configuration snippets ma…...
Mermaid 是什么,为什么适合AI模型和markdown
什么是 Mermaid? Mermaid 是一个基于 JavaScript 的开源绘图和图表工具,允许用户通过简单的文本语法创建图表。它支持生成流程图、时序图、类图、甘特图等多种类型的可视化内容,并直接从类似 Markdown 的代码中渲染。Mermaid 因其与 Markdow…...
为什么信号完整性对于高速连接器设计至关重要?
外部连接器通过在各种电子元件和系统之间可靠地传输数据而不损失保真度来保持信号完整性。在本文中,我们将讨论信号完整性的重要性,回顾高速部署挑战,并重点介绍各种连接器设计策略,以防止失真和降级。 了解连接器信号完整性挑战…...
【FFmpeg从入门到精通】第三章-FFmpeg转封装
1 音视频文件转MP4格式 在互联网常见的格式中,跨平台最好的应该是MP4文件,因为MP4文件既可以在PC平台的 Flashplayer 中播放,又可以在移动平台的 Android、ios 等平台中进行播放,而且使用系统默认的播放器即可播放,因…...
PG数据库推进医疗AI向量搜索优化路径研究(2025年3月修订版)
PG数据库推进医疗AI向量搜索优化路径研究 一、医疗 AI 向量搜索的发展现状与挑战 1.1 医疗数据特征与检索需求 医疗数据作为推动医疗领域进步与创新的关键要素,具有鲜明且复杂的特征。从多模态角度看,医疗数据涵盖了结构化数据,如患者基本信息、检验检查报告中的数值结果;…...
Android 下拉栏中的禁用摄像头和麦克风隐藏
Android 下拉栏中的禁用摄像头和麦克风隐藏 文章目录 Android 下拉栏中的禁用摄像头和麦克风隐藏一、前言二、下拉框中的禁用摄像头和麦克风隐藏实现1、设置支持属性为false2、修改代码 三、其他1、下拉栏中的禁用摄像头和麦克风隐藏小结2、 Android SensorPrivacyService ps&a…...
阿里云Clickhouse 冷热数据分层存储 实战记录
一、 背景 某业务Clickhouse库月数据增长超过2.5T,云上Clickhouse容量并不是无限的,单节点有32T上限,而业务已使用一半以上,依此速度,半年内就将达到上限。 与业务讨论,大致有以下几种解决思路:…...
ARINC818-实现
1.编码和解码;分隔符插入和删除;空闲idle字符插入 2.视频TX和RX接口:可以设计为流传输和帧同步传输 3.传输媒介:光纤或者铜缆 4.链路支持fc 1x,2x,3x,5x,6x,8x 上图中N有限制,N不能允许ADVB帧负载和填充长度不超过2112…...
OpenStack Yoga版安装笔记(23)Swift安装
一、官方文档 Object Storage Install Guide — Swift 2.29.3.dev5 documentation 二、环境准备 之前的实验,已经有controller, compute1, block1节点,并已经完成Keystone、Glance、Nova、Neutron、Cinder等主要OpenStack Service的安装。 此处新增…...
MySql 三大日志(redolog、undolog、binlog)详解
:费解的开关
审题: 本题需要我们将多组测试用例中拉灯数小于等于6的最小拉灯数输出,若拉灯数最小值仍大于6,则输出-1 思路: 方法一:二进制枚举 首先我们先分析一下基本特性: 1.所有的灯不可能重复拉:若拉的数…...
2025.04.19-阿里淘天春招算法岗笔试-第三题
📌 点击直达笔试专栏 👉《大厂笔试突围》 💻 春秋招笔试突围在线OJ 👉 笔试突围OJ 03. 数值平衡之道 问题描述 LYA 是一位精通树形数据结构的数学家,她有一棵包含 n n n...
单片机毕业设计选题物联网计算机电气电子类
题目一:基于单片机的PM2.5空气质量检测仪器 选 1.用到ADC0832模数转换芯片,数据更加精准。 2.使用夏普传感器的GP2Y1010AUOF粉尘传感器实时检测空气中的PM2.5值并通过1602显示出来,检测准确。 3.LCD1602液晶第一行 前面显示测到的PM2.5…...
TDOA解算——牛顿迭代法|以4个基站的三维空间下TDOA定位为背景,使用牛顿迭代法解算。附完整代码,订阅专栏后可复制粘贴
本问所介绍的代码通过TDOA(到达时间差)方法,结合牛顿迭代算法,实现了三维空间内目标位置的定位。系统包含1个主锚点和3个副锚点,通过测量信号到达各基站的时间差计算距离差,最终迭代求解目标坐标。订阅专栏后可以获得完整的MATLAB代码,粘贴到空脚本中即可运行 文章目录 …...
海量聊天数据处理:基于Spring Boot与SharingJDBC的分库分表策略及ClickHouse冷热数据分离
引言 随着互联网应用的快速发展,每天产生的聊天记录数量级已经达到了惊人的程度。以2000万条/天为例,一年下来就是大约7.3亿条记录。如此庞大的数据量给数据库的设计和管理带来了前所未有的挑战。本文将探讨如何使用SharingJDBC整合Spring Boot技术来实…...
网络开发基础(游戏)之 Socket API
Socket简介 Socket (套接字)是网络编程的基础,在 C# 中通过 System.Net.Sockets 命名空间提供了一套完整的 API 来实现网络通信。 网络上的两个程序通过一个双向的通信连接实现数据交换, 这个连接的一端称为一个Socket。 一个Socket包含了进行网络通信必…...
在 Amazon Graviton 上运行大语言模型:CPU 推理性能实测与调优指南
引言 在生成式 AI 浪潮中,GPU 常被视为大模型推理的唯一选择。然而,随着 ARM 架构的崛起和量化技术的成熟,CPU 推理的性价比逐渐凸显。本文基于 Amazon Graviton 系列实例与 llama.cpp 工具链,实测了 Llama 3、DeepSeek 等模型的…...
基于尚硅谷FreeRTOS视频笔记——15—系统配制文件说明与数据规范
目录 配置函数 INCLUDE函数 config函数 数据类型 命名规范 函数与宏 配置函数 官网上可以查找 最核心的就是 config和INCLUDE INCLUDE函数 这些就是裁剪的函数 它们使用一个ifndef。如果定义了,就如果定义了这个宏定义,那么代码就生效。 通过ifn…...
Nacos 使用了什么日志框架?如何配置和查看日志?
Nacos 使用的日志框架 Nacos 主要使用 SLF4j (Simple Logging Facade for Java) 作为日志门面(API),并选择 Logback 作为其底层的日志实现。 SLF4j: 这是一个日志抽象层,允许开发者在代码中使用统一的接口进行日志记录ÿ…...
【基于Fluent+Python耦合的热管理数字孪生系统开发:新能源产品开发的硬核技术实践】
引言:热管理数字孪生的技术革命 在新能源领域(如动力电池、储能系统、光伏逆变器等),热管理是决定产品性能与安全的核心问题。传统热设计依赖实验与仿真割裂的流程,而数字孪生技术通过实时数据驱动与动态建模…...
【工具变量】A股上市公司信息披露质量KV指数测算数据集(含do代码 1991-2024年)
KV指数(Key Value Index)作为评估信息披露质量的关键指标,在证券市场,尤其是A股市场上市公司信息披露监管与评估中占据重要地位。该指数通过系统化、定量化的方法,对企业发布的信息进行全面剖析与打分,精准…...
【ELF2学习板】利用OpenMP采用多核并行技术提升FFTW的性能
目录 引言 OpenMP简介 编译OpenMP支持的FFTW库 部署与测试 测试程序 程序部署 测试结果 结语 引言 在前面已经介绍了在ELF2开发板上运行FFTW计算FFT。今天尝试利用RK3588的多核运算能力来加速FFT运算。FFTW利用多核能力可以考虑使用多线程或者OpenMP。今天介绍一下Ope…...
打靶日记 zico2: 1
一、探测靶机IP(进行信息收集) 主机发现 arp-scan -lnmap -sS -sV -T5 -p- 192.168.10.20 -A二、进行目录枚举 发现dbadmin目录下有个test_db.php 进入后发现是一个登录界面,尝试弱口令,结果是admin,一试就出 得到加…...
【技术派后端篇】 Redis 实现用户活跃度排行榜
在各类互联网应用中,排行榜是一个常见的功能需求,它能够直观地展示用户的表现或贡献情况,提升用户的参与感和竞争意识。在技术派项目中,也引入了用户活跃度排行榜,该排行榜主要基于 Redis 的 ZSET 数据结构来实现。接下…...
MySql Innodb详细解读
参考文档:https://www.cnblogs.com/acatsmiling/p/18424729 一、数据存储:从磁盘到内存的"黑帮走私" 1. 物理结构:表空间与页的江湖规矩 表空间(Tablespace): 所有InnoDB数据存在表空间里&…...
每日两道leetcode
399. 除法求值 - 力扣(LeetCode) 题目 给你一个变量对数组 equations 和一个实数值数组 values 作为已知条件,其中 equations[i] [Ai, Bi] 和 values[i] 共同表示等式 Ai / Bi values[i] 。每个 Ai 或 Bi 是一个表示单个变量的字符串。 …...
在RK3588上使用哪个流媒体服务器合适
在RK3588平台上选择合适的流媒体服务器时,需考虑其ARM Cortex-A76/A55架构、硬件编解码能力(如支持H.264/H.265/AV1解码)以及Linux/Android系统支持。以下是推荐的方案: 1. 轻量级方案:GStreamer RTSP 适用场景&…...
分享一个DeepSeek+自建知识库实现人工智能,智能回答高级用法。
这个是我自己搞的DeepSeek大模型自建知识库相结合到一起实现了更强大的回答问题能力还有智能资源推荐等功能。如果感兴趣的小伙伴可以联系进行聊聊,这个成品已经有了实现了,所以可以融入到你的项目,或者毕设什么的还可以去参加比赛等等。 1.项…...
PyTorch 深度学习实战(38):注意力机制全面解析(从Seq2Seq到Transformer)
在上一篇文章中,我们探讨了分布式训练实战。本文将深入解析注意力机制的完整发展历程,从最初的Seq2Seq模型到革命性的Transformer架构。我们将使用PyTorch实现2个关键阶段的注意力机制变体,并在机器翻译任务上进行对比实验。 一、注意力机制演…...
Android Studio 获取配置资源与第三方包信息详解
文章目录 Android Studio 获取配置资源与第三方包信息详解一、获取资源文件中的配置1. 获取颜色值Java 中获取:Kotlin 中获取: 2. 获取字符串Java 中获取:Kotlin 中获取: 3. 获取尺寸值Java 中获取:Kotlin 中获取&…...
【网络初识】从零开始彻底了解网络编程(一)
本篇博客给大家带来的是网络的知识点. 🐎文章专栏: JavaEE初阶 🚀若有问题 评论区见 ❤ 欢迎大家点赞 评论 收藏 分享 如果你不知道分享给谁,那就分享给薯条. 你们的支持是我不断创作的动力 . 王子,公主请阅🚀 要开心要快乐顺便进步 一. 网络…...
Vivado比特流生成、下载及板级验证操作步骤
1. 前期准备 安装Vivado软件:确保Vivado开发环境已正确安装并配置。创建工程: 打开Vivado,点击“Create Project”新建工程。设置工程名称(例如“led_flow”)和路径。选择目标FPGA型号(例如XC7A35TFFG484&…...
【Flutter DevTools】性能优化的瑞士军刀
一、性能分析:帧率与资源监控 1.1 帧率监控(Performance面板) 通过Performance面板可实时捕获应用的渲染流水线数据。开发者点击"Record"按钮后,DevTools会以时间轴形式展示每一帧的构建、布局、绘制耗时。当帧率低于…...
使用Redis实现实时排行榜
为了实现一个实时排行榜系统,我们可以使用Redis的有序集合(ZSet),其底层通常是使用跳跃表实现的。有序集合允许我们按照分数(score)对成员(member)进行排序,因此非常适合…...
HTML5 应用程序缓存:原理、实践与演进
在 Web 技术的发展历程中,HTML5 引入的应用程序缓存(Application Cache)曾是提升 Web 应用离线体验的重要技术。它允许 Web 应用进行缓存,使用户在没有因特网连接时也能访问应用,为 Web 应用带来了显著的优势。然而&am…...
Compose笔记(十七)--AsyncImage
这一节了解一下Compose中的AsyncImage的使用,AsyncImage是由 Coil库提供的一个用于异步加载图片的组件。它支持加载网络图片、本地图片资源,并提供了占位符、错误处理、过渡动画等功能,简单介绍如下: API 1. model 含义:指定要加…...
Python语法系列博客 · 第7期[特殊字符] 列表推导式与字典推导式:更优雅地处理数据结构
上一期小练习解答(第6期回顾) ✅ 练习1:统计文件行数 with open("data.txt", "r", encoding"utf-8") as f:lines f.readlines()print(f"总行数:{len(lines)}")✅ 练习2:反…...
Redis--主从复制
目录 一、配置 1.1 建立复制 1.2 断开复制 1.3 安全性 1.4 只读 1.5 传输延迟 二、拓扑 2.1 一主一从结构 2.2 一主多从结构 2.3 树形主从结构 在分布式系统中为了解决单点问题,通常会把数据复制多个副本部署到其他服务器,满足故障恢 复和负载均衡等需求…...
FPGA练习———DDS波形发生器
简介:使用DDS波形发生器可以在fpga上生成方波、正弦波等波形,其具体方法是计算相位的变化,然后根据数据表的数值进行数模转化改变波形。 DDS的第一步是生成一个相位加法器 相位加法器 在生成一个波,例如正弦波时,我们…...
力扣面试150题-- 存在重复元素 II和最长连续序列
Day 26 题目描述 思路 定义一个map用来存放每个元素以及它对应的序号从前向后遍历数组如果该元素存在于map(说明满足了重复元素的条件),用当前元素的序号值减去map中存放的序号值(因为是从前遍历的所以当前元素序号一定大于存放…...
卸载Anaconda并保留虚拟环境,重装Anaconda并还原之前的虚拟环境
参考 https://blog.csdn.net/qq_63611690/article/details/134560333 该博文是虚拟环境和Anaconda安装路径在一起 我的是虚拟环境早就搞到了别的盘 问题描述 我之前把Anaconda安装到了C盘,随之时间推移,C盘占用空间越来越大。我想把Anaconda卸载重装…...
ArcGIS及其组件抛出 -- “Sorry, this application cannot run under a Virtual Machine.“
产生背景: 使用的是“破解版本”或“被套壳过”的非官方 ArcGIS 版本 破解版本作者为了防止: 被研究破解方式 被自动化抓包/提权/逆向 被企业环境中部署多机使用 通常会加入**“虚拟化环境检测阻断运行”机制** 原因解释: 说明你当前运…...
Ubuntu 25.04 “Plucky Puffin” 正式发布
Ubuntu 25.04 “Plucky Puffin” 于 2025 年 4 月 17 日正式发布。这是一个短期支持版本,只支持到 2026 年 1 月1。以下是该版本的一些主要新变化: 内核与系统:采用 Linux 6.14 内核;systemd v257.4 带来重要上游更新,…...
2. ubuntu20.04 和VS Code实现 ros的输出 (C++,Python)
本节对应赵虚左ROS书籍的1.4.2 1)创建工作空间 mkdir -p catkin_ws/src cd catkin_ws catkin_make 2) 终端进入VS Code code . 3) vscoe 的基本配置 3.1)修改.vscode/tasks.json ,修改内容如下: { // 有关 tasks.json 格式的文档,请参见…...