Vue | (三)使用Vue脚手架(中)| 尚硅谷Vue2.0+Vue3.0全套教程
文章目录
- 📚Todo-list 案例
- 🐇组件化编码流程(通用)
- 🐇实现静态组件
- 🐇展示动态数据
- 🐇交互
- ⭐️添加一个todo
- ⭐️todo勾选实现
- ⭐️删除功能实现
- ⭐️底部统计功能实现
- ⭐️底部全选功能实现
- ⭐️底部一键清除功能实现
- 📚案例小结
- 📚浏览器本地存储
- 📚TodoList本地存储
学习链接:尚硅谷Vue2.0+Vue3.0全套教程丨vuejs从入门到精通,本文对应p70-p79,博客参考尚硅谷公开笔记,补充记录实操。
📚Todo-list 案例
🐇组件化编码流程(通用)
- 实现静态组件:抽取组件,使用组件实现静态页面效果。
- 展示动态数据:
- 数据的类型、名称是什么?
- 数据保存在哪个组件?
- 交互——从绑定事件监听开始。
🐇实现静态组件

-
组件名:不要和原有标签名冲突(不管大小写,例如Header),开发中也一般不用
MyHeader,Vue鼓励采用UserHeade.vue类似命名。 -
注册好先搭结构,链接好层级关系(关注地址的正确链接)
<!-- App.vue --> <script>import UserHeader from './components/UserHeader.vue'import UserList from './components/UserList'import UserFooter from './components/UserFooter'export default {name:'App',components:{UserHeader,UserList,UserFooter}} </script><!-- UserList.vue --> <script>import UserItem from '../components/UserItem'export default {name:'UserList',components:{UserItem}} </script> -
样式套用:
- 先都放到
App.vue里,然后再拆,先拆结构,再拆样式。 - 拆结构的时候,
App.vue里的结构剪切后,要连带着补上标签,防忘。 - 拆样式的时候,在特定vue对应样式可补上
scoped,放冲突。

- 先都放到

🐇展示动态数据
- 数据的类型、名称是什么? 一堆数据用数组,每个数据里的属性用对象。

- 数据保存在哪个组件? 那个组件要展示就给谁,即谁用给谁——UserList。
- 【重要】链接上数据发送
:demo='xxx'和接收props:[demo]。
UserList.vue关键部分<template><ul class="todo-main"><UserItem v-for="todoObj in todos" :key="todoObj.id" :fasong="todoObj"></UserItem></ul> </template><script>import UserItem from '../components/UserItem.vue'export default {name:'UserList',components:{UserItem},data(){return{todos:[{id:'001',title:'吃早饭',done:true},{id:'002',title:'睡午觉',done:false},{id:'003',title:'散散步',done:true},]}}} </script>UserItem.vue关键部分<template><li><label><input type="checkbox" :checked="fasong.done"/><span>{{fasong.title}}</span></label><button class="btn btn-danger" style="display:none">删除</button></li> </template><script>export default {name:'UserItem',// 声明接收发送内容props:['fasong']} </script>- 目前的设置是数据都放List且暂时还都合理。

🐇交互
⭐️添加一个todo
- id自动生成借助
nanoid库

- 遇到的问题:按暂时的知识量,兄弟vue(header和list)之间的数据传输很难办——解决办法:把数据交给“爹”
App.vue。具体通过爹提前给儿传一个函数(props也可以传函数),然后儿把数据借助函数传给爹实现。


-
UserList.vue关键部分<template><ul class="todo-main"><UserItem v-for="todoObj in todos" :key="todoObj.id" :fasong="todoObj"></UserItem></ul> </template><script>import UserItem from '../components/UserItem.vue'export default {name:'UserList',components:{UserItem},props:['todos']} </script> -
UserHeader.vue关键部分<template><div class="todo-header"><input type="text" placeholder="请输入你的任务名称,按回车键确认" @keyup.enter="add"/></div> </template><script>import {nanoid} from 'nanoid'export default {name:'UserHeader',props:['addTodo'],methods:{add(e){// 将用户输入包装成为一个todo对象const todoObj = {id:nanoid(),title:e.target.value,done:false}this.addTodo(todoObj)}}} </script> -
App.vue关键部分<template><div id="root"><div class="todo-container"><div class="todo-wrap"><UserHeader :addTodo="addTodo"></UserHeader><UserList :todos="todos"></UserList><UserFooter></UserFooter></div></div></div> </template><!-- App.vue --> <script>import UserHeader from './components/UserHeader.vue'import UserList from './components/UserList'import UserFooter from './components/UserFooter'export default {name:'App',components:{UserHeader,UserList,UserFooter},data(){return{todos:[{id:'001',title:'吃早饭',done:true},{id:'002',title:'睡午觉',done:false},{id:'003',title:'散散步',done:true},]}},methods:{addTodo(todoObj){this.todos.unshift(todoObj)}}} </script>

- 进一步完善:添加完后输入框清空。
add(e){// 将用户输入包装成为一个todo对象const todoObj = {id:nanoid(),title:e.target.value,done:false}this.addTodo(todoObj)e.target.value = '' }


- 进一步完善:输入框必须有输入才能提交,这里不借助event,而是通过
v-model完成数据读取。<template><div class="todo-header"><input type="text" placeholder="请输入你的任务名称,按回车键确认" v-model="title" @keyup.enter="add"/></div> </template><script>import {nanoid} from 'nanoid'export default {name:'UserHeader',props:['addTodo'],methods:{add(){// 校验数据if(!this.title) return alert('输入不能为空')// 将用户输入包装成为一个todo对象const todoObj = {id:nanoid(),title:this.title,done:false}// 通知APP组件去添加一个todo对象this.addTodo(todoObj)// 清空输入this.title = ''}}} </script>- 这时会出现以下警告,而且清空失效。

- 修改(给
title定义)<script>import {nanoid} from 'nanoid'export default {name:'UserHeader',props:['addTodo'],data(){return{title:""}},methods:{add(){// 校验数据if(!this.title) return alert('输入不能为空')// 将用户输入包装成为一个todo对象const todoObj = {id:nanoid(),title:this.title,done:false}// 通知APP组件去添加一个todo对象this.addTodo(todoObj)// 清空输入this.title = ''}}} </script>
- 这时会出现以下警告,而且清空失效。


- 其他注意点:函数命名不能重复(
add、addtodo)。
⭐️todo勾选实现
- 现在可以勾选,但是vue实际的数据是没有变化的。

- 关键点:
- 数据在哪,关于数据的操作就在哪——在
App.vue里定义函数。 App.vue对Item.vue是爷爷对孙子的关系,相关传输要先给他爸List.vue,再由他爸给他(现阶段)。
- 数据在哪,关于数据的操作就在哪——在
UserItem.vue关键代码<template><li><label><input type="checkbox" :checked="fasong.done" @change="handleCheck(fasong.id)"/><span>{{fasong.title}}</span></label><button class="btn btn-danger" style="display:none">删除</button></li> </template><script>export default {name:'UserItem',// 声明接收发送内容props:['fasong','checkTodo'],methods:{handleCheck(id){// 通知App组件将对应的todo对象的done值取反this.checkTodo(id)}}} </script>UserList.vue关键代码<template><ul class="todo-main"><UserItem v-for="todoObj in todos" :key="todoObj.id" :fasong="todoObj" :checkTodo="checkTodo"></UserItem></ul> </template><script>import UserItem from '../components/UserItem.vue'export default {name:'UserList',components:{UserItem},props:['todos','checkTodo']} </script>App.vue关键代码<template><div id="root"><div class="todo-container"><div class="todo-wrap"><UserHeader :addTodo="addTodo"></UserHeader><UserList :todos="todos" :checkTodo="checkTodo"></UserList><UserFooter></UserFooter></div></div></div></template><!-- App.vue --> <script>import UserHeader from './components/UserHeader.vue'import UserList from './components/UserList'import UserFooter from './components/UserFooter'export default {name:'App',components:{UserHeader,UserList,UserFooter},data(){return{todos:[{id:'001',title:'吃早饭',done:true},{id:'002',title:'睡午觉',done:false},{id:'003',title:'散散步',done:true},]}},methods:{// 数据在哪,对数据的操作就在哪// 添加一个todoaddTodo(todoObj){this.todos.unshift(todoObj)},// 勾选or取消勾选一个todocheckTodo(id){this.todos.forEach((todo)=>{if(todo.id === id) todo.done = !todo.done})}}} </script>


- 用
v-model实现:就是在上一个功能实现的基础上,忽略本功能实现的之前代码,只将:checked="fasong.done"改为v-model="fasong.done",但这里已经和视频有出入,即vue版本更新后,这个方法不可行,会报错(本质是props只读):

⭐️删除功能实现
- 在Item里加一个鼠标悬浮效果
li:hover{background-color: #ddd }
- 让删除按钮悬浮出现:结构里的内联style
style="display:none"删掉,添加悬浮条件(前边默认设置为none)li:hover button{display: block; }
- 交互实现:点击按钮,拿到id,把对应id的事件删除。
- 这里依旧注意函数名称设置问题,不要用默认名称,会混乱会报错!
- 依旧是
App.vue对Item.vue是爷爷对孙子的关系,相关传输要先给他爸List.vue,再由他爸给他(现阶段)
-
UserItem.vue关键代码<template><li><label><input type="checkbox" :checked="fasong.done" @change="handleCheck(fasong.id)"/><span>{{fasong.title}}</span></label><button class="btn btn-danger" @click="handleDelete(fasong.id)">删除</button></li> </template><script>export default {name:'UserItem',// 声明接收发送内容props:['fasong','checkTodo','deleteTodo'],methods:{// 勾选or取消勾选handleCheck(id){// 通知App组件将对应的todo对象的done值取反this.checkTodo(id)},// 删除handleDelete(id){if(confirm('确定删除吗?')){// 通知App组件删除this.deleteTodo(id)}}}} </script> -
UserList.vue关键代码<template><ul class="todo-main"><UserItem v-for="todoObj in todos" :key="todoObj.id" :fasong="todoObj" :checkTodo="checkTodo":deleteTodo="deleteTodo"></UserItem></ul> </template><script>import UserItem from '../components/UserItem.vue'export default {name:'UserList',components:{UserItem},props:['todos','checkTodo','deleteTodo']} </script> -
App.vue关键代码<template><div id="root"><div class="todo-container"><div class="todo-wrap"><UserHeader :addTodo="addTodo"></UserHeader><UserList :todos="todos" :checkTodo="checkTodo" :deleteTodo="deleteTodo"></UserList><UserFooter></UserFooter></div></div></div></template><!-- App.vue --> <script>import UserHeader from './components/UserHeader.vue'import UserList from './components/UserList'import UserFooter from './components/UserFooter'export default {name:'App',components:{UserHeader,UserList,UserFooter},data(){return{todos:[{id:'001',title:'吃早饭',done:true},{id:'002',title:'睡午觉',done:false},{id:'003',title:'散散步',done:true},]}},methods:{// 数据在哪,对数据的操作就在哪// 添加一个todoaddTodo(todoObj){this.todos.unshift(todoObj)},// 勾选or取消勾选一个todocheckTodo(id){this.todos.forEach((todo)=>{if(todo.id === id) todo.done = !todo.done})},// 删除一个tododeleteTodo(id){// this.todos = this.todos.filter((todo)=>{// return todo.id !== id// })// 精简写法this.todos = this.todos.filter(todo => todo.id != id)}}} </script>

⭐️底部统计功能实现
- 把
todos传给Footer,在App.vue添加<UserFooter :todos="todos"></UserFooter>。 UserFooter.vue- 读取
todos.length作为全部数值显示。 - 计算属性,算
done为true的数量。
<template><div class="todo-footer"><label><input type="checkbox"/></label><span><span>已完成{{doneTotal}}</span> / 全部{{todos.length}}</span><button class="btn btn-danger">清除已完成任务</button></div> </template><script>export default {name:'UserFooter',props:['todos'],computed:{doneTotal(){// 法一// let i = 0// this.todos.forEach((todo)=>{// if(todo.done) i++// })// return i// 法二return this.todos.reduce((pre,current)=> pre + (current.done ? 1 : 0),0)}}} </script>
- 读取
⭐️底部全选功能实现
- 考虑实际情境的细节优化。
- 同样也是对todos的操作写到
App.vue。 App.vue关键代码<template><div id="root"><div class="todo-container"><div class="todo-wrap"><UserHeader :addTodo="addTodo"></UserHeader><UserList :todos="todos" :checkTodo="checkTodo" :deleteTodo="deleteTodo"></UserList><UserFooter :todos="todos" :checkAllTodo="checkAllTodo"></UserFooter></div></div></div></template><!-- App.vue --> <script>import UserHeader from './components/UserHeader.vue'import UserList from './components/UserList'import UserFooter from './components/UserFooter'export default {name:'App',components:{UserHeader,UserList,UserFooter},data(){return{todos:[{id:'001',title:'吃早饭',done:true},{id:'002',title:'睡午觉',done:false},{id:'003',title:'散散步',done:true},]}},methods:{// 数据在哪,对数据的操作就在哪// 添加一个todoaddTodo(todoObj){this.todos.unshift(todoObj)},// 勾选or取消勾选一个todocheckTodo(id){this.todos.forEach((todo)=>{if(todo.id === id) todo.done = !todo.done})},// 删除一个tododeleteTodo(id){// this.todos = this.todos.filter((todo)=>{// return todo.id !== id// })// 精简写法this.todos = this.todos.filter(todo => todo.id != id)},// 全选or取消全选checkAllTodo(done){this.todos.forEach((todo)=>{todo.done = done})}}} </script>UserFooter.vue关键代码<template><div class="todo-footer" v-show="total"><label><input type="checkbox" :checked="isAll" @change="checkAll"/></label><span><span>已完成{{doneTotal}}</span> / 全部{{total}}</span><button class="btn btn-danger">清除已完成任务</button></div> </template><script>export default {name:'UserFooter',props:['todos','checkAllTodo'],computed:{total(){return this.todos.length},doneTotal(){// 法一// let i = 0// this.todos.forEach((todo)=>{// if(todo.done) i++// })// return i// 法二return this.todos.reduce((pre,current)=> pre + (current.done ? 1 : 0),0)},isAll(){return this.doneTotal === this.total && this.total > 0}},methods:{checkAll(e){this.checkAllTodo(e.target.checked)}}} </script>

- 优化
UserFooter.vue:借助v-model及计算属性(之前v-model失效是因为绑到props了)。<template><div class="todo-footer" v-show="total"><label><input type="checkbox" v-model="isAll"/></label><span><span>已完成{{doneTotal}}</span> / 全部{{total}}</span><button class="btn btn-danger">清除已完成任务</button></div> </template><script>export default {name:'UserFooter',props:['todos','checkAllTodo'],computed:{total(){return this.todos.length},doneTotal(){return this.todos.reduce((pre,current)=> pre + (current.done ? 1 : 0),0)},isAll:{get(){return this.doneTotal === this.total && this.total > 0},set(value){this.checkAllTodo(value)}}}} </script>
⭐️底部一键清除功能实现
App.vue部分<template><div id="root"><div class="todo-container"><div class="todo-wrap"><UserHeader :addTodo="addTodo"></UserHeader><UserList :todos="todos" :checkTodo="checkTodo" :deleteTodo="deleteTodo"></UserList><UserFooter :todos="todos" :checkAllTodo="checkAllTodo" :clearAllTodo="clearAllTodo"></UserFooter></div></div></div></template><!-- App.vue --> <script>import UserHeader from './components/UserHeader.vue'import UserList from './components/UserList'import UserFooter from './components/UserFooter'export default {name:'App',components:{UserHeader,UserList,UserFooter},data(){return{todos:[{id:'001',title:'吃早饭',done:true},{id:'002',title:'睡午觉',done:false},{id:'003',title:'散散步',done:true},]}},methods:{// 数据在哪,对数据的操作就在哪// 添加一个todoaddTodo(todoObj){this.todos.unshift(todoObj)},// 勾选or取消勾选一个todocheckTodo(id){this.todos.forEach((todo)=>{if(todo.id === id) todo.done = !todo.done})},// 删除一个tododeleteTodo(id){// this.todos = this.todos.filter((todo)=>{// return todo.id !== id// })// 精简写法this.todos = this.todos.filter(todo => todo.id != id)},// 全选or取消全选checkAllTodo(done){this.todos.forEach((todo)=>{todo.done = done})},// 清除所有已经完成的todoclearAllTodo(){this.todos = this.todos.filter((todo)=>{return !todo.done})}}} </script>UserFooter.vue部分<template><div class="todo-footer" v-show="total"><label><input type="checkbox" v-model="isAll"/></label><span><span>已完成{{doneTotal}}</span> / 全部{{total}}</span><button class="btn btn-danger" @click="clearAll">清除已完成任务</button></div> </template><script>export default {name:'UserFooter',props:['todos','checkAllTodo','clearAllTodo'],computed:{total(){return this.todos.length},doneTotal(){return this.todos.reduce((pre,current)=> pre + (current.done ? 1 : 0),0)},isAll:{get(){return this.doneTotal === this.total && this.total > 0},set(value){this.checkAllTodo(value)}}},methods:{clearAll(){this.clearAllTodo()}}} </script>

📚案例小结
-
组件化编码流程:
- 拆分静态组件:组件要按照功能点拆分,命名不要与html元素冲突。
- 实现动态组件:考虑好数据的存放位置,数据是一个组件在用,还是一些组件在用:
- 一个组件在用:放在组件自身即可。
- 一些组件在用:放在他们共同的父组件上(状态提升)。
- 实现交互:从绑定事件开始。
-
props适用于:
- 父组件 ==> 子组件 通信
- 子组件 ==> 父组件 通信(要求父先给子一个函数)
-
使用
v-model时要切记:v-model绑定的值不能是props传过来的值,因为props是不可以修改的!
📚浏览器本地存储
-
浏览器的搜索历史就是借助了本地存储。
-
存储内容大小一般支持5MB左右(不同浏览器可能还不一样)
-
浏览器端通过
Window.sessionStorage和Window.localStorage属性来实现本地存储机制。 -
相关API:
xxxxxStorage.setItem('key', 'value');:该方法接受一个键和值作为参数,会把键值对添加到存储中,如果键名存在,则更新其对应的值。xxxxxStorage.getItem('person');:该方法接受一个键名作为参数,返回键名对应的值。xxxxxStorage.removeItem('key');:该方法接受一个键名作为参数,并把该键名从存储中删除。xxxxxStorage.clear():该方法会清空存储中的所有数据。
-
备注:
- SessionStorage存储的内容会随着浏览器窗口关闭而消失。
- LocalStorage存储的内容,需要手动清除才会消失。
xxxxxStorage.getItem(xxx)如果xxx对应的value获取不到,那么getItem的返回值是null。JSON.parse(null)的结果依然是null。
localStorage.html<!DOCTYPE html> <html><head><meta charset="UTF-8" /><title>localStorage</title></head><body><h2>localStorage</h2><button onclick="saveData()">点我保存一个数据</button><button onclick="readData()">点我读取一个数据</button><button onclick="deleteData()">点我删除一个数据</button><button onclick="deleteAllData()">点我清空一个数据</button><script type="text/javascript" >let p = {name:'张三',age:18}function saveData(){localStorage.setItem('msg','hello!!!')localStorage.setItem('msg2',666)localStorage.setItem('person',JSON.stringify(p))}function readData(){console.log(localStorage.getItem('msg'))console.log(localStorage.getItem('msg2'))const result = localStorage.getItem('person')console.log(JSON.parse(result))}function deleteData(){localStorage.removeItem('msg2')}function deleteAllData(){localStorage.clear()}</script></body> </html>



- **
localStorage.html**即对应部分API换成sessionStorage
📚TodoList本地存储
- 目的:自添加事项刷新后不清除。
- 在
App.vue添加watch,同时data里配套读取export default {name:'App',components:{UserHeader,UserList,UserFooter},data(){return{todos:JSON.parse(localStorage.getItem('todos')) || []}},methods:{// 数据在哪,对数据的操作就在哪// 添加一个todoaddTodo(todoObj){this.todos.unshift(todoObj)},// 勾选or取消勾选一个todocheckTodo(id){this.todos.forEach((todo)=>{if(todo.id === id) todo.done = !todo.done})},// 删除一个tododeleteTodo(id){// this.todos = this.todos.filter((todo)=>{// return todo.id !== id// })// 精简写法this.todos = this.todos.filter(todo => todo.id != id)},// 全选or取消全选checkAllTodo(done){this.todos.forEach((todo)=>{todo.done = done})},// 清除所有已经完成的todoclearAllTodo(){this.todos = this.todos.filter((todo)=>{return !todo.done})}},watch:{todos:{// 开启深度监视deep:true,handler(value){localStorage.setItem('todos',JSON.stringify(value))}}} } - 刷新后不清除

相关文章:
Vue | (三)使用Vue脚手架(中)| 尚硅谷Vue2.0+Vue3.0全套教程
文章目录 📚Todo-list 案例🐇组件化编码流程(通用)🐇实现静态组件🐇展示动态数据🐇交互⭐️添加一个todo⭐️todo勾选实现⭐️删除功能实现⭐️底部统计功能实现⭐️底部全选功能实现⭐️底部一…...
TenorFlow多层感知机识别手写体
文章目录 数据准备建立模型建立输入层 x建立隐藏层h1建立隐藏层h2建立输出层 定义训练方式建立训练数据label真实值 placeholder定义loss function选择optimizer 定义评估模型的准确率计算每一项数据是否正确预测将计算预测正确结果,加总平均 开始训练画出误差执行结…...
Java基础(二十六):Java8 Stream流及Optional类
Java基础系列文章 Java基础(一):语言概述 Java基础(二):原码、反码、补码及进制之间的运算 Java基础(三):数据类型与进制 Java基础(四):逻辑运算符和位运算符 Java基础(五):流程控制语句 Java基础(六)࿱…...
qt - 19种精美软件样式
qt - 19种精美软件样式 一、效果演示二、核心程序三、下载链接 一、效果演示 二、核心程序 #include "mainwindow.h"#include <QtAdvancedStylesheet.h> #include <QmlStyleUrlInterceptor.h>#include "ui_mainwindow.h" #include <QDir&g…...
vue 使用docx库生成word表格文档
在Vue.js中生成Word表格文档,可以通过前端库来实现。这些库可以帮助我们轻松地将HTML表格转换为Word文档(通常是.docx格式)。以下是一些流行的前端库,它们可以用于在Vue项目中生成Word表格文档: docx…...
ElementUI table表格组件实现双击编辑单元格失去焦点还原,支持多单元格
在使用ElementUI table表格组件时有时需要双击单元格显示编辑状态,失去焦点时还原表格显示。 实现思路: 在数据中增加isFocus:false.控制是否显示在table中用cell-dblclick双击方法 先看效果: 上源码:在表格模板中用scope.row…...
Java基于SpringBoot+Vue的图书管理系统
博主介绍:✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专栏推荐订阅👇…...
【云安全】Hypervisor与虚拟机
Hypervisor 也被称为虚拟机监视器(Virtual Machine Monitor,VMM),主要作用是让多个操作系统可以在同一台物理机上运行。 Type-1 Hypervisor 与 Typer-2 Hypervisor Type-1 Hypervisor 直接安装在物理服务器上,不依赖…...
JS文本加密方法探究
在前端开发中,有时候我们需要对敏感文本进行简单的加密,以提高安全性。本文将介绍一种基于 JavaScript 实现的文本加密方法,使用了 Base64、Unicode 和 ROT13 编码。 示例代码 function encodeText(text) {// Base64编码var base64Encoded …...
推荐彩虹知识付费商城免授权7.0源码
彩虹知识付费商城免授权7.0源码,最低配置环境 PHP7.2 1、上传源码到网站根目录,导入数据库文件:xydai.sql 2、修改数据库配置文件:/config.php 3、后台:/admin 账号:admin 密码:123456 4、前…...
【天衍系列 04】深入理解Flink的ElasticsearchSink组件:实时数据流如何无缝地流向Elasticsearch
文章目录 01 Elasticsearch Sink 基础概念02 Elasticsearch Sink 工作原理03 Elasticsearch Sink 核心组件04 Elasticsearch Sink 配置参数05 Elasticsearch Sink 依赖管理06 Elasticsearch Sink 初阶实战07 Elasticsearch Sink 进阶实战7.1 包结构 & 项目配置项目配置appl…...
一、ActiveMQ介绍
ActiveMQ介绍 一、JMS1.jms介绍2.jms消息传递模式3.JMS编码总体架构 二、消息中间件三、ActiveMQ介绍1.引入的原因1.1 原因1.2 遇到的问题1.3 解决思路 2.定义3.特点3.1 异步处理3.2 应用系统之间解耦3.3 实际-整体架构 4.作用 一、JMS 1.jms介绍 jms是java消息服务接口规范&…...
【牛客】寒假训练营1 I-It‘s bertrand paradox. Again! 题解
传送门:It’s bertrand paradox. Again! 标签:随机 题目大意 有两个人分别用两种方式在二维平面上随机生成1e5个圆,每个圆上的每一个点(x,y)都满足-100<x<100且-100<y<100,现在将某个人生成的1e5个圆的圆心和半径告…...
各种手型都合适,功能高度可定制,雷柏VT9PRO mini和VT9PRO游戏鼠标上手
去年雷柏推出了一系列支持4KHz回报率的鼠标,有着非常敏捷的反应速度,在游戏中操作体验十分出色。尤其是这系列4K鼠标不仅型号丰富,而且对玩家的操作习惯、手型适应也很好,像是VT9系列就主打轻巧,还有专门针对小手用户的…...
sql建库,建表基础操作
当涉及到SQL建库和建表操作时,以下是一个简单的示例: 1. 建库(创建数据库) sql复制代码 CREATE DATABASE mydatabase; 上述语句将创建一个名为mydatabase的数据库。 2. 选择数据库 在创建表之前,需要选择要在其中…...
算法训练营day32,贪心算法6
import "strconv" //738. 单调递增的数字 func monotoneIncreasingDigits(n int) int { str : strconv.Itoa(n) nums : []byte(str) length : len(nums) if length < 1 { return n } for i : length - 1; i > 0; i-- { //如果前一个数字比当前值大࿰…...
CTR之行为序列建模用户兴趣:DIN
在前面的文章中,已经介绍了很多关于推荐系统中CTR预估的相关技术,今天这篇文章也是延续这个主题。但不同的,重点是关于用户行为序列建模,阿里出品。 概要 论文:Deep Interest Network for Click-Through Rate Predict…...
Java使用Redis实现分页功能
分页功能实现应该是比较常见的,对于redis来说,近期刷题就发现了lrange、zrange这些指令,这个指令怎么使用呢? 我们接下来就来讲解下。 目录 指令简介lrangezrange Java实现Redis实现分页功能 指令简介 lrange lrange 是 Redis 中…...
Qt标准对话框设置
Qt标准对话框设置,设置字体、调色板、进度条等。 #include "mainwindow.h" #include "ui_mainwindow.h"MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow) {ui->setupUi(this); }MainWindow::~MainWi…...
如何让Obsidian实现电脑端和安卓端同步
Obsidian是一款知名的笔记软件,支持Markdown语法,它允许用户在多个设备之间同步文件。要在安卓设备上实现同步,可以使用remote save插件,以下是具体操作步骤: 首先是安装电脑端的obsidian,然后依次下载obs…...
Admin.Net中的消息通信SignalR解释
定义集线器接口 IOnlineUserHub public interface IOnlineUserHub {/// 在线用户列表Task OnlineUserList(OnlineUserList context);/// 强制下线Task ForceOffline(object context);/// 发布站内消息Task PublicNotice(SysNotice context);/// 接收消息Task ReceiveMessage(…...
【Linux】C语言执行shell指令
在C语言中执行Shell指令 在C语言中,有几种方法可以执行Shell指令: 1. 使用system()函数 这是最简单的方法,包含在stdlib.h头文件中: #include <stdlib.h>int main() {system("ls -l"); // 执行ls -l命令retu…...
Spring AI 入门:Java 开发者的生成式 AI 实践之路
一、Spring AI 简介 在人工智能技术快速迭代的今天,Spring AI 作为 Spring 生态系统的新生力量,正在成为 Java 开发者拥抱生成式 AI 的最佳选择。该框架通过模块化设计实现了与主流 AI 服务(如 OpenAI、Anthropic)的无缝对接&…...
NLP学习路线图(二十三):长短期记忆网络(LSTM)
在自然语言处理(NLP)领域,我们时刻面临着处理序列数据的核心挑战。无论是理解句子的结构、分析文本的情感,还是实现语言的翻译,都需要模型能够捕捉词语之间依时序产生的复杂依赖关系。传统的神经网络结构在处理这种序列依赖时显得力不从心,而循环神经网络(RNN) 曾被视为…...
JUC笔记(上)-复习 涉及死锁 volatile synchronized CAS 原子操作
一、上下文切换 即使单核CPU也可以进行多线程执行代码,CPU会给每个线程分配CPU时间片来实现这个机制。时间片非常短,所以CPU会不断地切换线程执行,从而让我们感觉多个线程是同时执行的。时间片一般是十几毫秒(ms)。通过时间片分配算法执行。…...
实现弹窗随键盘上移居中
实现弹窗随键盘上移的核心思路 在Android中,可以通过监听键盘的显示和隐藏事件,动态调整弹窗的位置。关键点在于获取键盘高度,并计算剩余屏幕空间以重新定位弹窗。 // 在Activity或Fragment中设置键盘监听 val rootView findViewById<V…...
掌握 HTTP 请求:理解 cURL GET 语法
cURL 是一个强大的命令行工具,用于发送 HTTP 请求和与 Web 服务器交互。在 Web 开发和测试中,cURL 经常用于发送 GET 请求来获取服务器资源。本文将详细介绍 cURL GET 请求的语法和使用方法。 一、cURL 基本概念 cURL 是 "Client URL" 的缩写…...
windows系统MySQL安装文档
概览:本文讨论了MySQL的安装、使用过程中涉及的解压、配置、初始化、注册服务、启动、修改密码、登录、退出以及卸载等相关内容,为学习者提供全面的操作指导。关键要点包括: 解压 :下载完成后解压压缩包,得到MySQL 8.…...
CVPR2025重磅突破:AnomalyAny框架实现单样本生成逼真异常数据,破解视觉检测瓶颈!
本文介绍了一种名为AnomalyAny的创新框架,该方法利用Stable Diffusion的强大生成能力,仅需单个正常样本和文本描述,即可生成逼真且多样化的异常样本,有效解决了视觉异常检测中异常样本稀缺的难题,为工业质检、医疗影像…...
MyBatis中关于缓存的理解
MyBatis缓存 MyBatis系统当中默认定义两级缓存:一级缓存、二级缓存 默认情况下,只有一级缓存开启(sqlSession级别的缓存)二级缓存需要手动开启配置,需要局域namespace级别的缓存 一级缓存(本地缓存&#…...
