Vue3项目 网易严选_学习笔记

Vue3项目 网易严选_第一天

主要内容

  • 项目搭建
  • vuex基础
  • 路由设计
  • 首页顶部和底部布局

学习目标

知识点要求
项目搭建掌握
vuex基础掌握
路由设计掌握
首页顶部和底部布局掌握

一、项目搭建

1.1 创建项目

  1. vue create vue-wangyi
  2. 选择vue3.0版本

1.2 目录调整

大致步骤:

  • 删除无用代码和文件
  • 完善项目的基础结构
  • 读懂默认生成的代码

落的代码:	[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2m8kPIaZ-1663513268468)(images\jiegou.png)]

注意:以上结构目录及供参考

二、Vuex基础

安装:

npm install vuex@next --save

2.1 定义模块

export default createStore({state: {username: 'zs'},getters: {newName (state) {return state.username + '!!!'}},//同步请求mutations: {updateName (state) {state.username = 'ls'}},//异步请求,内部调用同步请求actions: {updateName (ctx) {// 发请求setTimeout(() => {ctx.commit('updateName')}, 1000)}},modules: {}
})

使用

<template><!-- vue2.0需要根元素,vue3.0可以是代码片段 Fragment --><div>App<!-- 1. 使用根模块state的数据   --><p>{{$store.state.username}}</p><!-- 2. 使用根模块getters的数据   --><p>{{$store.getters['newName']}}</p><button @click="mutationsFn">mutationsFn</button></div>
</template>
<script>
import { useStore } from 'vuex'
export default {name: 'App',setup () {// 使用vuex仓库const store = useStore()// 1. 使用根模块state的数据console.log(store.state.username)// 2. 使用根模块getters的数据console.log(store.getters.newName)const mutationsFn = () => {// 3. 提交根模块mutations函数// store.commit('updateName')// 4. 调用根模块actions函数store.dispatch('updateName')}return { mutationsFn }}
}
</script>

2.2 modules (分模块)

存在两种情况

​ 默认的模块,state 区分模块,其他 getters mutations actions 都在全局。

​ 带命名空间 namespaced: true 的模块,所有功能区分模块,更高封装度和复用。

import { createStore } from 'vuex'const moduleA = {// 子模块state建议写成函数state: () => {return {username: '模块A'}},getters: {changeName (state) {return state.username + 'AAAAAA'}}
}const moduleB = {// 带命名空间的模块namespaced: true,// 子模块state建议写成函数state: () => {return {username: '模块B'}},getters: {changeName (state) {return state.username + 'BBBBBB'}},mutations: {// 修改名字的mutationupdate (state) {state.username = 'BBBB' + state.username}},actions: {update ({ commit }) {// 假设请求setTimeout(() => {commit('update')}, 2000)}}
}// 创建vuex仓库并导出
export default createStore({state: {// 数据person: [{ id: 1, name: 'tom', gender: '男' },{ id: 2, name: 'lucy', gender: '女' },{ id: 3, name: 'jack', gender: '男' }]},mutations: {// 改数据函数},actions: {// 请求数据函数},modules: {// 分模块a: moduleA,b: moduleB},getters: {// vuex的计算属性boys: (state) => {return state.person.filter(p => p.gender === '男')}}
})

使用:

<template><div>APP组件</div><ul><li v-for="item in $store.getters.boys" :key="item.id">{{item.name}}</li></ul><!-- 使用模块A的username --><p>A的username --- {{$store.state.a.username}}</p><p>A的changeName --- {{$store.getters.changeName}}</p><hr><p>B的username --- {{$store.state.b.username}}</p><p>B的changeName --- {{$store.getters['b/changeName']}}</p><button @click="$store.commit('b/update')">修改username</button><button @click="$store.dispatch('b/update')">异步修改username</button>
</template>

2.3 vuex-持久化

在开发的过程中,像用户信息(名字,头像,token)需要vuex中存储且需要本地存储。

再例如,购物车如果需要未登录状态下也支持,如果管理在vuex中页需要存储在本地。

我们需要category模块存储分类信息,但是分类信息不需要持久化。

1)首先:我们需要安装一个vuex的插件vuex-persistedstate来支持vuex的状态持久化。

npm i vuex-persistedstate

2)然后:在src/store 文件夹下新建 modules 文件,在 modules 下新建 user.jscart.js

src/store/modules/user.js

// 用户模块
export default {namespaced: true,state () {return {// 用户信息profile: {id: '',avatar: '',nickname: '',account: '',mobile: '',token: ''}}},mutations: {// 修改用户信息,payload就是用户信息对象setUser (state, payload) {state.profile = payload}}
}

src/store/modules/cart.js

// 购物车状态
export default {namespaced: true,state: () => {return {list: []}}
}

src/store/modules/category.js

// 分类模块
export default {namespaced: true,state () {return {// 分类信息集合list: []}}
}

3)继续:在 src/store/index.js 中导入 user cart 模块。

import { createStore } from 'vuex'import user from './modules/user'
import cart from './modules/cart'
import cart from './modules/category'export default createStore({modules: {user,cart,category}
})

4)最后:使用vuex-persistedstate插件来进行持久化

import { createStore } from 'vuex'
+import createPersistedstate from 'vuex-persistedstate'import user from './modules/user'
import cart from './modules/cart'
import category from './modules/category'export default createStore({modules: {user,cart,category},
+  plugins: [
+    createPersistedstate({
+      key: 'pc-store',
+      paths: ['user', 'cart']
+    })
+  ]
})

注意:

===> 默认是存储在localStorage中

===> key是存储数据的键名

===> paths是存储state中的那些数据,如果是模块下具体的数据需要加上模块名称,如user.token

===> 修改state后触发才可以看到本地存储数据的的变化。

测试: user模块定义一个mutation在main.js去调用下,观察浏览器application的localStorage下数据。

src/App.js

<template><div class="container"><!-- 修改数据,测试是否持久化 -->App {{$store.state.user.profile.account}}<button @click="$store.commit('user/setUser',{account:'zhoujielun'})">设置用户信息</button></div>
</template>
<script>
export default {name: 'App'
}
</script>

三、路由设计

3.1 路由布局

​	[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZZaVeLrA-1663513268469)(images\luyou.png)]

3.2 路由基础实现

路由文件index.js

import { createRouter, createWebHashHistory } from 'vue-router'//异步加载组件
const Layout = ()=>import('@/views/Layout.vue')
const Home = ()=>import('@/views/home')
import TopCategory from '@/views/category'
import SubCategory from '@/views/category/sub'const routes = [{path:'/',component:Layout,children:[{ path:'/',component:Home},{ path: '/category/:id', component: TopCategory },{ path: '/category/sub/:id', component: SubCategory }]}
]const router = createRouter({history: createWebHashHistory(),routes
})export default router

App.vue

<template><!-- 一级路由 --><router-view />
</template>
<script>
export default {setup() {},
};
</script><style lang="less">
</style>

一级路由布局容器 src/views/Layout.vue

<template><nav>顶部通栏</nav><header>头部</header><main><!-- 二级路由 --><router-view></router-view></main><footer>底部</footer>
</template><script>
export default {name: 'xtx-layout'
}
</script><style scoped lang='less'></style>

二级路由首页组件 src/views/home/index.vue

<template><div class='xtx-home-page'>首页</div>
</template><script>
export default {name: 'xtx-home-page'
}
</script><style scoped lang='less'></style>

3.3 样式配置

变量 src/assets/styles/variables.less

// 主题
@xtxColor:#27BA9B;
// 辅助
@helpColor:#E26237;
// 成功
@sucColor:#1DC779;
// 警告
@warnColor:#FFB302;
// 价格
@priceColor:#CF4444;

混入 src/assets/styles/mixins.less

// 鼠标经过上移阴影动画
.hoverShadow () {transition: all .5s;&:hover {transform: translate3d(0,-3px,0);box-shadow: 0 3px 8px rgba(0,0,0,0.2);}
}

less混入就是,申明一段css代码(选择器包裹的代码)或者函数,在其他css选择器调用,可复用包裹的代码

完成自动注入公用变量和混入

四、首页顶部和底部布局

4.1 顶部通栏布局

​	[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wsWipuCv-1663513268469)(images\top.png)]

代码演示:

<template><nav class="app-topnav"><div class="container"><ul><template v-if="profile.token"><li><a href="javascript:;"><i class="iconfont icon-user"></i>周杰伦</a></li><li><a href="javascript:;">退出登录</a></li></template><template v-else><li><a href="javascript:;">请先登录</a></li><li><a href="javascript:;">免费注册</a></li></template><li><a href="javascript:;">我的订单</a></li><li><a href="javascript:;">会员中心</a></li><li><a href="javascript:;">帮助中心</a></li><li><a href="javascript:;">关于我们</a></li><li><a href="javascript:;"><i class="iconfont icon-phone"></i>手机版</a></li></ul></div></nav>
</template>
<script>
import { computed } from "@vue/runtime-core";
import { useStore } from "vuex";export default {name: "AppTopnav",setup() {const store = useStore();const profile = computed(() => {return store.state.user.profile;});return { profile };},
};
</script>
<style scoped lang="less">
.app-topnav {background: #333;ul {display: flex;height: 53px;justify-content: flex-end;align-items: center;li {a {padding: 0 15px;color: #cdcdcd;line-height: 1;display: inline-block;i {font-size: 14px;margin-right: 2px;}&:hover {color: @xtxColor;}}~ li {a {border-left: 2px solid #666;}}}}
}
</style>

布局界面

<template><div><!-- 顶部区域 --><AppTopnav/></div>
</template>
<script>
import AppTopnav from '@/components/app-topnav.vue';export default {name:'Layout',components:{AppTopnav,},
};
</script>
<style lang="less" scoped>
.main{min-height: 500px;
}
.active{color: @xtxColor;.hoverShadow()
}
</style>

4.2 头部布局

​	[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZAcockDl-1663513268469)(images\header.png)]

代码演示:

<template><header class="app-header"><div class="container"><!-- 顶部区域 --><div class="app-top"><h1 class="logo"><RouterLink to="/"><img src="../assets/images/logo.png" alt="" /></RouterLink></h1><div class="center"><div class="center-search"><input type="text" /><div class="btn">搜索</div></div><ul class="navs"><li><a href="#">美食</a></li><li><a href="#">餐厨</a></li><li><a href="#">艺术</a></li><li><a href="#">电器</a></li><li><a href="#">居家</a></li><li><a href="#">洗护</a></li><li><a href="#">孕婴</a></li><li><a href="#">服装</a></li><li><a href="#">杂货</a></li></ul></div><div class="search"><i class="iconfont icon-search"></i><input type="text" placeholder="搜一搜" /></div><div class="cart"><a class="curr" href="#"><i class="iconfont icon-cart"></i><em>2</em></a></div></div><!-- 二级导航 --><div class="app-nav"><AppHeaderNav/></div></div></header>
</template><script>
import AppHeaderNav from './app-header-nav.vue';export default {name: "AppHeader",components:{AppHeaderNav}
};
</script><style scoped lang='less'>
.app-header {background: #fff;.app-top {display: flex;align-items: center;}.logo {width: 200px;a {display: block;height: 100px;width: 100%;margin-top: 15px;}}.center {position: relative;margin-top: 26px;flex: 1;.center-search {width: 532px;float: right;input {height: 38px;line-height: 38px;padding-top: 2px;padding-bottom: 2px;border: 1px solid #cc9756;border-bottom-left-radius: 19px;border-top-left-radius: 19px;font-size: 14px;width: 442px;padding-left: 38px;}.btn {width: 90px;height: 38px;background-color: #cc9756;border-top-right-radius: 19px;border-bottom-right-radius: 19px;cursor: pointer;float: right;color: #fff;line-height: 38px;text-align: center;font-size: 16px;letter-spacing: 1px;}}}// 底部导航---------------------.app-nav{height: 40px;.navs{float: left;li{line-height: 40px;font-weight: bold;a{border-right: 0;color: #000;}}}}//-----------------------------.navs {width: 520px;display: flex;justify-content: space-around;float: right;padding-right: 80px;li {line-height: 32px;text-align: center;a {font-size: 12px;line-height: 12px;padding: 0 10px;display: inline-block;border-right: 1px solid #ccc;color: #999;}&:hover {a {color: @xtxColor;}}}li:last-child a {border-right: 0;}}.search {width: 170px;height: 32px;position: relative;border-bottom: 1px solid #e7e7e7;line-height: 32px;.icon-search {font-size: 18px;margin-left: 5px;}input {width: 140px;padding-left: 5px;color: #666;}}.cart {width: 50px;.curr {height: 32px;line-height: 32px;text-align: center;position: relative;display: block;.icon-cart {font-size: 22px;}em {font-style: normal;position: absolute;right: 0;top: 0;padding: 1px 6px;line-height: 1;background: @helpColor;color: #fff;font-size: 12px;border-radius: 10px;font-family: Arial;}}}
}
</style>

二级导航

<template><ul class="app-header-nav"><li><RouterLink to="/">首页</RouterLink></li><li><a href="#">美食</a></li><li><a href="#">餐厨</a></li><li><a href="#">艺术</a></li><li><a href="#">电器</a></li><li><a href="#">居家</a></li><li><a href="#">洗护</a></li><li><a href="#">孕婴</a></li><li><a href="#">服装</a></li><li><a href="#">杂货</a></li></ul>
</template><script>
export default {name: "AppHeaderNav",}
};
</script>
<style scoped lang='less'>
.app-header-nav {width: 1240px;display: flex;justify-content: space-around;position: relative; z-index: 998;  > li {> a {font-size: 14px;line-height: 40px;font-weight: bold;height: 40px;display: inline-block;}.router-link-exact-active{color: @xtxColor;border-bottom: 2px solid @xtxColor;}&:hover {  > a {color: @xtxColor;border-bottom: 2px solid @xtxColor;}> .layer {height: 132px;opacity: 0;}.active{opacity: 1;}}}
}
.layer {width: 1240px;background-color: #fff;position: absolute;left: 0px;top: 42px;height: 0;overflow: hidden;opacity: 0;box-shadow: 0 0 5px #ccc;transition: all .2s .1s;ul {display: flex;flex-wrap: wrap;padding: 0 70px;align-items: center;height: 132px;li {width: 110px;text-align: center;img {width: 60px;height: 60px;}p {padding-top: 10px;}&:hover {p {color: @xtxColor;}}}}
}
</style>

4.3 底部布局

​	效果展示[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZgCxLlIz-1663513268470)(images\footer.png)]

代码展示

<template><footer class="app-footer"><!-- 联系我们 --><div class="contact"><div class="container"><dl><dt>客户服务</dt><dd><i class="iconfont icon-kefu"></i> 在线客服</dd><dd><i class="iconfont icon-wenti1"></i> 问题反馈</dd></dl><dl><dt>关注我们</dt><dd><i class="iconfont icon-weixin"></i> 公众号</dd><dd><i class="iconfont icon-weibo"></i> 微博</dd></dl><dl><dt>下载APP</dt><dd class="qrcode"><img src="../assets/images/saoma.png" /></dd><dd class="download"><span>扫描二维码</span><span>立马下载APP</span><a href="javascript:;">下载页面</a></dd></dl><dl><dt>服务热线</dt><dd class="hotline">400-0000-000 <small>周一至周日 8:00-18:00</small></dd></dl></div></div><!-- 其它 --><div class="extra"><div class="container"><div class="slogan"><a href="javascript:;"><i class="iconfont icon-footer01"></i><span>价格亲民</span></a><a href="javascript:;"><i class="iconfont icon-footer02"></i><span>物流快捷</span></a><a href="javascript:;"><i class="iconfont icon-footer03"></i><span>品质新鲜</span></a></div><!-- 版权信息 --><div class="copyright"><p><a href="javascript:;">关于我们</a><a href="javascript:;">帮助中心</a><a href="javascript:;">售后服务</a><a href="javascript:;">配送与验收</a><a href="javascript:;">商务合作</a><a href="javascript:;">搜索推荐</a><a href="javascript:;">友情链接</a></p><p>CopyRight © 网易严选</p></div></div></div></footer>
</template><script>
export default {name: 'AppFooter'
}
</script><style scoped lang='less'>
.app-footer {overflow: hidden;background-color: #f5f5f5;padding-top: 20px;.contact {background: #fff;.container {padding: 60px 0 40px 25px;display: flex;}dl {height: 190px;text-align: center;padding: 0 72px;border-right: 1px solid #f2f2f2;color: #999;&:first-child {padding-left: 0;}&:last-child {border-right: none;padding-right: 0;}}dt {line-height: 1;font-size: 18px;}dd {margin: 36px 12px 0 0;float: left;width: 92px;height: 92px;padding-top: 10px;border: 1px solid #ededed;.iconfont {font-size: 36px;display: block;color: #666;}&:hover {.iconfont {color: @xtxColor;}}&:last-child {margin-right: 0;}}.qrcode {width: 92px;height: 92px;padding: 7px;border: 1px solid #ededed;}.download {padding-top: 5px;font-size: 14px;width: auto;height: auto;border: none;span {display: block;}a {display: block;line-height: 1;padding: 10px 25px;margin-top: 5px;color: #fff;border-radius: 2px;background-color: @xtxColor;}}.hotline {padding-top: 20px;font-size: 22px;color: #666;width: auto;height: auto;border: none;small {display: block;font-size: 15px;color: #999;}}}.extra {background-color: #333;}.slogan {height: 178px;line-height: 58px;padding: 60px 100px;border-bottom: 1px solid #434343;display: flex;justify-content: space-between;a {height: 58px;line-height: 58px;color: #fff;font-size: 28px;i {font-size: 50px;vertical-align: middle;margin-right: 10px;font-weight: 100;}span {vertical-align: middle;text-shadow: 0 0 1px #333;}}}.copyright {height: 170px;padding-top: 40px;text-align: center;color: #999;font-size: 15px;p {line-height: 1;margin-bottom: 20px;}a {color: #999;line-height: 1;padding: 0 10px;border-right: 1px solid #999;&:last-child {border-right: none;}}}
}
</style>

4.4 头部导航动态数据

定义一个常量数据和后台保持一致(约定好9大分类),这样不请求后台就能展示一级分类,不至于白屏。

定义九个分类常量数据 src/api/constants.js

// 顶级分类
export const topCategory = ['居家','美食','服饰','母婴','个护','严选','数码','运动','杂货'
]

定义API函数 src/api/category.js

// 定义首页需要的接口函数
import request from '@/utils/request'/*** 获取首页头部分类数据*/
export const findAllCategory = () => {return request.get('/api/xhr/globalinfo/queryTop.json')
}

跨域配置

const path = require('path')
module.exports = {//跨域请求devServer: {proxy: {'/api': {target: 'http://you.163.com',//网易新闻接口ws: true,changeOrigin: true,pathRewrite: {//重写路径'^/api': ''}},'/foo': {target: 'http://localhost:3333',//本地接口ws: true,changeOrigin: true,pathRewrite: {//重写路径'^/foo': ''}},},}
}

vuex在category模块,来存储分类数据,提供修改和获取的函数。

import { topCategory } from '../../api/constants';
import { findAllCategory } from '../../api/category';export default {namespaced: true,state() {return {list: topCategory.map(ele => ({ name: ele })),}},//加载数据成功后需要修改list所以需要mutations函数mutations: {setList(state, headCategory) {state.list = headCategory},},// 需要向后台加载数据,所以需要actions函数获取数据actions:{async getList({commit}){const res = await findAllCategory();commit('setList',res.data.data.cateList)}}
}

导航组件数据获取

<template><ul class="app-header-nav"><li><RouterLink to="/">首页</RouterLink></li><li v-for="item in list" :key='item.id'  @mouseenter="show(item)" @mouseleave="hide(item)"><RouterLink  @click="change(item)" :to='"/category/"+item.id'>{{item.name}}</RouterLink><div class="layer" :class="{active:item.open}"><ul><li v-for="ele in item.subCateGroupList" :key="ele.id"><RouterLink :to='"/category/sub/"+ele.id' @click="change(item)"><img :src="ele.categoryList[0].bannerUrl" alt=""><p>{{ele.name}}</p></RouterLink></li></ul></div></li></ul>
</template><script>
import {useStore} from 'vuex';
import {computed} from 'vue';export default {name: "AppHeaderNav",setup(){const store = useStore();const list = computed(()=>{return store.state.category.list})//点击事件const change=(item)=>{item.open=false}//显示const show=(item)=>{item.open= true}//隐藏const hide=(item)=>{item.open=false}return {list,change,show,hide}}
};
</script>

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

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

相关文章

Workerman开启ssl方法如下

参考地址 Workerman开启ssl方法如下-遇见你与你分享 准备工作&#xff1a; 1、Workerman版本不小于3.3.7 2、PHP安装了openssl扩展 3、已经申请了证书&#xff08;pem/crt文件及key文件&#xff09;放在了/etc/nginx/conf.d/ssl下 4、配置文件 location /wss { proxy_set…

unity制作拼接地图

前段时间有个朋友问我想要制作一款地图编辑器&#xff0c;最开始我还想着在一个平面用节点切割制作地图编辑器这倒是也行&#xff0c;但不太好控制每一个点&#xff0c;如果未来项目大了&#xff0c;更加不好维护。 偶然间翻到一篇文章&#xff1a;unity地图边缘检测 或许我们…

基于数字孪生的城市建模和仿真

近年来&#xff0c;数字孪生概念几乎呈爆炸式增长&#xff0c;利用该概念的科学文章数量呈指数级增长就证明了这一点。 这一概念源自制造业&#xff0c;使用 CAD 模型可以创建组件和产品的精确数字复制品。 该术语最早的使用可以追溯到 2003 年&#xff0c;通常归功于 Grieves …

vue3第二十节(新增编译宏defineModel)

为什么会需要使用defineModel() 注意&#xff1a;defineModel() 需要在3.4及以上版本才可使用&#xff1b; 组件之间通讯&#xff0c;通过 props 和 emits 进行通讯,是单向数据流&#xff0c;比如&#xff1a;props是自上而下的&#xff08;父组件数据修改导致子组件更新&…

生成人工智能体:人类行为的交互式模拟论文与源码架构解析(2)——架构分析 - 核心思想环境搭建技术选型

4.架构分析 4.1.核心思想 超越一阶提示&#xff0c;通过增加静态知识库和信息检索方案或简单的总结方案来扩展语言模型。 将这些想法扩展到构建一个代理架构&#xff0c;该架构处理检索&#xff0c;其中过去的经验在每个时步动态更新&#xff0c;并混合与npc当前上下文和计划…

【动态规划】切割钢条详解python

1. 问题介绍和应用场景 切割钢条问题是运筹学和算法设计中的一个经典问题&#xff0c;涉及如何最优化切割有限资源以最大化收益。这个问题经常用作动态规划教学的入门案例&#xff0c;同时在工业生产中也有实际应用&#xff0c;比如在金属加工业中如何切割原材料以减少浪费并增…

EelasticSearch是什么?及EelasticSearch的安装

一、概述 Elasticsearch 是一个基于 Apache Lucene 构建的开源分布式搜索引擎和分析引擎。它专为云计算环境设计&#xff0c;提供了一个分布式的、高可用的实时分析和搜索平台。Elasticsearch 可以处理大量数据&#xff0c;并且具备横向扩展能力&#xff0c;能够通过增加更多的…

Jmeter三个常用组件

Jmeter三个常用组件 一、线程组二、 HTTP请求三、查看结果树 线程组&#xff1a;jmeter是基于线程来运行的&#xff0c;线程组主要用来管理线程的数量&#xff0c;线程的执行策略。 HTTP请求&#xff1a;HTTP请求是jmeter接口测试的核心部分&#xff0c;主要使用HTTP取样器来发…

Android 12 如何加载 native 原生库

在 Android 7.0 及更高版本中&#xff0c;系统库与应用库是分开的。 图1. 原生库的命名空间 原生库的命名空间可防止应用使用私有平台的原生 API&#xff08;例如使用 OpenSSL&#xff09;。该命名空间还可以避免应用意外使用平台库&#xff08;而非它们自己的库&#xff09;的…

ES源码四:网络通信层流程

听说ES网络层很难&#xff1f;今天来卷它&#x1f604; 前言 ES网络层比较复杂&#xff0c;分为两个部分&#xff1a; 基于HTTP协议的REST服务端基于TCP实现的PRC框架 插件化设计的网络层模块&#xff08;NetworkModule&#xff09; 入口还是上一章的创建Node构造方法的地方…

【MySQL 安装与配置】Window简单安装MySQL,并配置局域网连接

文章日期&#xff1a;2024.04.17 系统&#xff1a;Window10 || Window11 类型&#xff1a;安装与配置MySQL数据库 文章全程已做去敏处理&#xff01;&#xff01;&#xff01; 【需要做的可联系我】 AES解密处理&#xff08;直接解密即可&#xff09;&#xff08;crypto-js.js…

系统稳定性建设

说到系统稳定性&#xff0c;不知道大家会想起什么&#xff1f;大多数人会觉得这个词挺虚的&#xff0c;不知道系统稳定性指的是什么。 一年前看到这个词&#xff0c;也是类似于这样的感受&#xff0c;大概只知道要消除单点、做好监控报警&#xff0c;但却并没有一个体系化的方…

记录一下我102连不上MySQL的问题 NotBefore

【背景描述】我在102上是能登录上MySQL的&#xff0c;但是用客户端&#xff08;DataGrip、SQLyog就连不上&#xff09; 【解决方案】 加个这个?useSSLfalse&serverTimezoneUTC 【另外的小问题】如果直接输mysql 上面这个不是报错&#xff0c;不用管 再输mysql -uroot -p…

upload-labs靶场详解

靶场环境 下载链接&#xff1a;https://codeload.github.com/c0ny1/upload-labs/zip/refs/heads/master 使用小皮集成环境来完成这个靶场 将文件放到WWW目录下就可以进行访问 进入关卡后页面呈现&#xff1a; Pass-01&#xff08;前端绕过&#xff09; 我们先尝试上传一个web.…

[svelte]属性和逻辑块

属性 / Default values • Svelte 教程 | Svelte 中文网 属性 Declaring props 到目前为止&#xff0c;我们只处理了内部状态——也就是说&#xff0c;这些值只能在给定的组件中访问。 在任何实际应用程序中&#xff0c;都需要将数据从一个组件向下传递到其子组件。为此&…

【Spring】-编程式事务和声明式事务

spring中控制事务的方式有两种&#xff1a;编程式事务和声明式事务&#xff0c;今天我以两种事务出发&#xff0c;对spring中实现事务的EnableTransactionManagement和Transaction两个注解的底层原理进行讨论。 一、编程式事务 什么是编程式事务&#xff1f; 硬编码的方式实现…

Adobe将Sora、Runway、Pika,集成在PR中

4月15日晚&#xff0c;全球多媒体巨头Adobe在官网宣布&#xff0c;将OpenAI的Sora、Pika 、Runway等著名第三方文生视频模型&#xff0c;集成在视频剪辑软件Premiere Pro中&#xff08;简称“PR”&#xff09;。 同时&#xff0c;Adob也会将自身研发的Firefly系列模型包括视频…

【Python】高级进阶(专版提升3)

Python 1 程序结构1.1 模块 Module1.1.1 定义1.1.2 作用1.1.3 导入1.1.3.1 import1.1.3.2 from import 1.1.4 模块变量1.1.5 加载过程1.1.6 分类 1.2 包package1.2.1 定义1.2.2 作用1.2.3 导入1.1.3.1 import1.1.3.2 from import 2 异常处理Error2.1 异常2.2 处理 3 迭代3.1 可…

Three.js 入门——核心概念和坐标系理解

Three.js 是什么&#xff1f; 一个封装了 WebGL 的库&#xff0c;简化 WebGL 的使用 WebGL vs OpenGL OpenGL 主要被认为是一种 API&#xff08;应用程序编程接口&#xff09;&#xff0c;它为我们提供了大量可用于操作图形和图像的函数&#xff0c;主要用 C语言编写的。 然…

python辅助QQ登入

python辅助QQ登入 import pyautogui import time import random from pyautogui import ImageNotFoundException# 生成随机等待时间&#xff0c;范围在1到3秒之间 random_time random.uniform(1, 3)def find_and_click(image_path, moveFalse, execute_nextTrue):try:image_l…