开源:基于Vue3.3 + TS + Vant4 + Vite5 + Pinia + ViewPort适配..搭建的H5移动端开发模板
vue3.3-Mobile-template
基于Vue3.3 + TS + Vant4 + Vite5 + Pinia + ViewPort适配 + Sass + Axios封装 + vconsole调试工具,搭建的H5移动端开发模板,开箱即用的。
环境要求:
Node:16.20.1 pnpm:8.14.0
必须装上安装pnpm,没装的看这篇文章 https://blog.csdn.net/Steven_Son/article/details/135151622
代码管理工具推荐用:sourceTree
项目预览



项目结构
learn-vite -- UI 主目录
├── dist 打包后自动生成的文件夹
├── public -- 静态资源
├ ├── favicon.ico -- 图标
├── src -- 源码目录
├ ├── assets -- 全局静态资源
├ ├ ├── iconfont -- 字体和字体图标
├ ├ ├── images -- 图片存放路径
├ ├ ├── json -- 静态json
├ ├ └── scss -- index.scss 全局样式,reset.scss初始化样式
├ ├── components -- 封装的组件
├ ├── global 配置全局URL环境变量
├ ├── hooks -- vue3 Hooks
├ ├── layout -- 全局Tabbar配置、keep-alive可配置需长缓存的路由
├ ├── polyfill 解决浏览器兼容性的文件
├ ├── router -- VUE 路由
├ ├ ├── index -- 路由入口
├ ├── service
├ ├ ├── apiList.ts -- 接口列表
├ ├ ├── error.ts -- 封装的接口错误提示
├ ├ ├── handleError.ts -- 处理接口请求错误
├ ├ ├── requestList.ts -- 请求函数列表
├ ├ └── webRequest.ts -- 封装Axios请求函数
├ ├── store -- Pinia
├ ├ ├── index -- 统一导出整个pinia和store
├ ├ └── modules.ts store模块化
├ ├── typings -- 存储TS类型别名
├ ├── utils -- 工具包
├ ├── views -- 业务上的 vue 页面
├ ├── App.vue -- 根组件
├ └── main.ts -- 入口 ts
├── components.d.ts -- 自动注册组件文件
├── .eslintrc.js -- ESLint 配置
├── .gitignore -- git 忽略
├── tsconfig.json -- vscode 路径引入配置
├── index.html -- 首页
├── package.json -- 依赖管理
├── vite.config.ts -- vite5的相关配置
└── windi.config.ts -- WindiCSS的配置文件
命令
git clone https://github.com/HSg666/vue3.3-Mobile-template
// 或 git clone git@github.com:HSg666/vue3.3-Mobile-template
cd learn-vite // 切换
pnpm i // 装依赖
pnpm start // 启动
pnpm run build // 打包
rm -rf node_modules // 强行删除依赖包
准备打包上线时请看 配置全局URL环境变量,检查完配置后再执行pnpm run build 打包
部署上线后如果出现页面刷新报Nginx404,请看这篇文章并对照检查你的router/index.ts中的mode模式,更改配置后再试试就OK了。
https://blog.csdn.net/Steven_Son/article/details/135414494
目录
- 1、封装Router
- 2、Vant4自动按需导入
- 3、封装Axios请求函数、接口列表、请求错误处理
- 4、配置全局URL环境变量
- 5、配置alias路径别名
- 6、封装Pinia、模块化、长缓存
- 7、postcss-px-to-viewport移动端适配
- 8、自动导入组件
- 9、封装TabBar布局容器
- 10、WindiCSS样式库
- 11、初始化全局CSS和防止页面文本被用户选中
- 12、字体与字体图标
- 13、性能优化
- 14、代码规范
- 15、配置兼容性
- 16、已配置第三方工具库
- 17、拓展
1、封装Router
路径:src/router/index.ts
// 需要Tabbar的组件在layoutRoutes中添加路由,Tabbar就是页面底部的 精选、分类、购物车、我的
export const layoutRoutes: Array<RouteRecordRaw> = [{path: '/',name: 'home',meta: {title: 'home',keepAlive: true,},component: () => import('@/views/home/index.vue'),},{path: '/category',name: 'category',meta: {title: 'category',// keepAlive: true,},component: () => import('@/views/category/index.vue'),},
]
// 不需要Tabbar的组件在routes中添加路由,即页面底部空空如也的组件。
export const routes: Array<RouteRecordRaw> = [// 这个是布局,不用改{path: '/',component: () => import('@/layout/index.vue'),redirect: '/index',// 需要layout的页面children: layoutRoutes,},// 注册的路由类似登录页{path: '/login',name: 'login',component: () => import('@/views/login/index.vue'),},
]
2、移动端UI库采用Vant4
项目已经配置好按需导入和组件自动注册了,页面直接使用即可,无需手动注册。
除了Toast轻提示使用时需要手动引入,其他都无需手动引入。示例如下:
在vant4 Toast的函数名都改了,大家看官方文档就知道。
// 示例:
<script lang="ts" setup>
import { showToast } from 'vant'
const handleClick = () => {showToast('轻提示')
}</script>
<template><van-button type="primary" @click="handleClick">按钮</van-button>
</template>
自动注册的组件都保存在项目根目录的 components.d.ts中,可自行查看。
配置详情:https://blog.csdn.net/Steven_Son/article/details/135544198?spm=1001.2014.3001.5501
UI库官网地址:https://vant-ui.github.io/vant/#/zh-CN/button
3、封装Axios
1、新增axios并封装,还新增了自定义请求错误处理函数,请求类
2、封装api列表 apiList
封装的axios配合api接口使用模板
(1)、先把接口添加进接口列表
export const APIs = {GET_SHOPLIST: '/h5/getShopList', // 获取商品列表
}
(2)、页面使用
// account.vue
import AxiosRequestError from '@/service/error' // 引入自定义错误处理函数
import $api from '@/service/webRequest' // 封装好的axios请求函数
import { APIs } from '@/service/apiList' // 接口列表// 二选一即可// async await 写法
const getShop = async () => {try {const res = await $api.getShopList()console.dir(res, 'res')} catch (error: AxiosRequestError) {console.dir(error, 'error')}
}// 原生Primise .then .catch
const params = { user:'', password:'' } // 传参将需要传的值放入即可,跟vue2一样
$api.get(APIs.GET_SHOPLIST, params).then(() => {}).catch((err: AxiosRequestError) => {console.dir(err, 'err')
})
(3)、用console.dir可以捕获到详细的错误信息,还能看到我们封装的错误处理函数
data: undefined, // 接口返回值为undefined
isServerError: false, // 是否为服务器出错
isUnAuthorized: false, // 是否已通过鉴权,也就是常见的登录状态
(4)、如果要添加或使用自定义请求函数,请在src/service/requestList.ts中添加,类似于已经存在的上传图片接口
4、配置全局URL环境变量
开发和正式环境地址在 global/env.ts 中配置
// 正式环境
export const PROD_ENV = {SERVER_URL: 'http://192.168.1.193:8090/', // 服务器地址IS_DEV: 'false', // 是否为开发环境
}// 开发环境
export const DEV_ENV = {SERVER_URL: 'http://192.168.1.193:8099/',IS_DEV: 'true',
}/* isDEV:true为生产环境,false为开发环境假设开发环境的域名是 http://127.0.0.1:8099/api 或 https://xxx-test.com提示:本地如果要将请求地址切换为生产服务器,则将isDEV设置为false,注释掉判断开发环境的代码。代码如下const isDEV = false// if (typeof window !== 'undefined') {// isDEV = process.env.NODE_ENV === 'development' || ['http://192.168.1.193:8099'].includes(window.location.host)// }准备打包上线,将代码改回来。(开发环境也是这个代码)代码如下 let isDEV = true // 默认为开发环境if (typeof window !== 'undefined') {isDEV = process.env.NODE_ENV === 'development' || ['http://192.168.1.193:8099'].includes(window.location.host)}*/let isDEV = true // 默认为开发环境,但会根据当前环境动态更换开发或生产
if (typeof window !== 'undefined') {isDEV = process.env.NODE_ENV === 'development' || ['http://192.168.1.193:8099'].includes(window.location.host)
}
5、配置路径别名 alias
示例:@/store 只要在src下的都能这样简写
总共分为4步:
1、vite.config.ts
import path from 'path'
export default defineConfig({//新增resolve: {alias: {'@/assets': path.resolve(__dirname, './src/assets'),},},
})
2、tsconfig.json
"paths": {"@/assets/*": ["src/assets/*"],}
3、配置好页面使用
例如main.ts引入
// 引入全局样式
import '@/assets/scss/index.scss'
4、更改完vite.config.ts和tsconfig.json记得重启项目。
6、封装Pinia、模块化、长缓存
使用方式:
1、在store/modules下创建user.ts
import { defineStore, acceptHMRUpdate } from 'pinia'// 1、声明导出store名称
export const userStore = defineStore({id: 'user', // 2、声明store名称state: () => ({name: '很老很老的值',}),getters: {myName: state => {return `getters ${state.name}`},},actions: {changeName(name: string) {this.name = name},},})// 这行代码是用于支持热模块替换(HMR)的。在Pinia中,它允许接受热更新并应用到使用了userStore的地方。
// 3、为了让当前store接收热更新为它配置一下
if (import.meta.hot) {import.meta.hot.accept(acceptHMRUpdate(userStore, import.meta.hot))
}
2、导出user.ts中整个userStore给其他组件使用
store/modules/index.ts
export * from './user'
3、store在组件中的使用方式
// 1、引入
import { userStore } from '@/store' // 由于项目已配置路径别名,所以就用@/,它代表的是src// 2、实例化
const useUserStore = userStore()// 3、如何使用userStore中的变量和函数 看下面template中的p标签就知道,解不解构2选1
// 3.1.1 变量可用解构 例如取出name后直接使用即可
const { name } = useUserStore
// 3.1.2 变量不解构 需要加上useUserStore.name
console.log(useUserStore.name)// 3.2 使用userStore中的函数
const handleLogin = () => {useUserStore.changeName('张三')
}// 页面
<template><p>{{ name }}</p><p>{{ useUserStore.name }}</p>
</template>
完整代码
import { userStore } from '@/store' // 1、引入
const useUserStore = userStore() // 2、实例化const { name } = useUserStore // 3、解构变量// 4、使用
const handleLogin = () => {useUserStore.changeName('张三')
}<template><p>{{ name }}</p>
</template>
4、引入的store存储的数据默认是没有响应式的,可以用 storeToRefs 将其变为响应式。
// 引入
import { storeToRefs } from "pinia"; // 将我们实例化的useAppstore放进去然后解构,解构出的state数据即为响应式const { name } = storeToRefs(useAppstore);
需要storeToRefs的完整代码
import { userStore } from '@/store' // 引入userStore
import { storeToRefs } from "pinia"; // 取出响应式方法const useUserStore = userStore() // 实例化
const { name } = storeToRefs(useUserStore); // 将实例化对象的数据更改为响应式并解构出来// 使用userStore中的函数
const handleLogin = () => {useUserStore.changeName('张三')
}// 页面
<template><p>{{ name }}</p>
</template>
如何证明数据是否为响应式,请看这篇文章 https://blog.csdn.net/Steven_Son/article/details/128440811
封装+模块化:https://blog.csdn.net/Steven_Son/article/details/135553816?spm=1001.2014.3001.5501
长缓存:https://blog.csdn.net/Steven_Son/article/details/135551314?spm=1001.2014.3001.5501
Pinia官网文章:https://pinia.web3doc.top/introduction.html
7、自适应采用的是postcss-px-to-viewport
详细配置说明看这篇文章:https://blog.csdn.net/Steven_Son/article/details/135554296?spm=1001.2014.3001.5501
8、自动导入组件
使用components下的组件时自动注册的插件 unplugin-vue-components
作用:哪个页面要用到components下的组件无需import手动导入,直接使用即可。
所用的组件都自动保存在项目根目录的 components.d.ts 中。
9、封装TabBar布局容器
1、路径:src/layout/index.vue
2、作用:页面整体的布局结构,如需增加/减少tabbar数量,增加时记得给新tabbar配置正确的路由,才能正常跳转。
10、Windicss库的用法
库已经配置好了,你直接使用即可。
<p class="text-orange-500">橙色</p>
官方文档:https://windicss.org/
11、初始化全局CSS和防止页面文本被用户选中
src/assets/scss/reset.scss 和 src/assets/scss/index.scss
12、字体和字体图标
项目使用的字体和字体图标是阿里巴巴免费可商用的iconfont,无需担心是否侵权的问题。
路径:src/assets/iconfont
1、iconfont 阿里巴巴字体图标
配置文章链接: https://blog.csdn.net/Steven_Son/article/details/128149868?csdn_share_tail=%7B%22type%22%3A%22blog%22%2C%22rType%22%3A%22article%22%2C%22rId%22%3A%22128149868%22%2C%22source%22%3A%22Steven_Son%22%7D
2、引入免费的阿里巴巴思源黑体字体
配置文章链接:https://www.iconfont.cn/fonts/detail?spm=a313x.fonts_index.i1.d9df05512.7ccd3a81uTg3IB&cnid=nsKKStjV4gdI
13、性能优化
1、需要keep-alive长缓存的组件在此配置
1、路由设置keepAlive属性
src/router/index.ts
{path: '/category',name: 'category',meta: {title: 'category',keepAlive: true, // 加这一行},component: () => import('@/views/category/index.vue'),},
2、到布局结构页面手动添加要keep-alive的组件名称
src/layout/index.vue
const routerStrArr = ['home']
浏览器可以搭配插件vue.js Devtools 查看以及控制台网络降速测试
注意:最多缓存10个,缓存太多影响性能。
2、为每次打包的文件后缀添加打包时的时间戳,防止打包上线页面缓存的问题
vite.config.ts timeStamp
3、为index.html增加防盗链,解决图片403
4、PC端时自动生成iframe框架嵌套项目并网页自动居中
具体代码逻辑在 src/App.vue onMounted中
5、vite.config.ts已配置诸多优化,具体请自行查看。
14、代码规范
1、prettier + eslint 配置了代码规范插件
2、husky + lint-staged git提交规范
- feat:新功能(feature)
- fix/to:修复 bug,可以是 QA 发现的 BUG,也可以是研发自己发现的
- fix:产生 diff 并自动修复此问题。适合于一次提交直接修复问题
- to:只产生 diff 不自动修复此问题。适合于多次提交。最终修复问题提交时使用 fix
- docs:文档(documentation)。
- style:格式(不影响代码运行的变动)【比如说加注释就是这个?】
- refactor:重构(即不是新增功能,也不是修改 bug 的代码变动)。
- perf:优化相关,比如提升性能、体验。
- test:增加测试。
- chore:构建过程或辅助工具的变动。
- revert:回滚到上一个版本。
- merge:代码合并。
- sync:同步主线或分支的 Bug。
15、配置兼容性
1、browserslist 配置了浏览器兼容性
2、polyfill web项目兼容低版本浏览器插件
core-js 和 @vitejs/plugin-legacy
16、已配置第三方工具库
1、lodash
防抖和节流的使用方法,节流用到时再去查
import { debounce,throttle } from 'lodash-es'// 它返回一个带防抖的新函数
const debounceLogin = debounce(toLogin, 500)
function toLogin() {console.log(111)
}
2、vConsole移动端调试工具
详细文章看这篇:https://blog.csdn.net/Steven_Son/article/details/135555570?spm=1001.2014.3001.5501
17、拓展:
1、如果不知道怎么用Nginx部署前端打包后的dist,可以看这篇文章
https://blog.csdn.net/Steven_Son/article/details/135414494?spm=1001.2014.3001.5501
2、如果要做JWT免登,请根据你的需求对以下几个文件进行更改
1、src/service/webRequest.ts 设置token的地方
2、src/service/error.ts 错误报错页
3、src/login/index.vue 登录页,登录后可能就要保存token了
3、本地开发的项目到手机端演示
1、修改package.json配置,更改为你电脑的IP地址,同时电脑和手机要在同个网络。
说明:连的同个WIFI、同个网线。
"scripts": {"testMobile": "vite --host 192.168.1.193"}
2、电脑(windows)关闭防火墙,这三个都要关闭:域网络、专用网络、公用网络。
位置:安全中心 —— 防火墙和网络保护
3、pnpm testMobild 启动项目,手机访问启动后的项目链接。
4、解决main.ts 文件引入路径的问题
1、如果引入路径正确,但是提示找不到文件,则删除’XX’,重新引入
2、检查vite.config.ts的路径别名配置是否正确,正确代码如下
//新增resolve: {alias: {'@': path.resolve(__dirname, './src'), //把 src 的别名设置为 @},extensions: ['.js', '.json', '.ts'], // 这些类型的文件后缀的不需要写},
3、检查tsconfig.json的部分属性配置
"baseUrl": ".","paths": {"@/*": ["src/*"]},"target": "ES2020","module": "ES2020","lib": ["es2020","es5", "es6","DOM","DOM.Iterable"],"moduleResolution": "node","include": ["src/**/*.ts","src/**/*.d.ts","src/**/*.tsx","src/**/*.vue", ],
4、检查tsconfig.node.json的部分属性配置
"compilerOptions": {"module": "ES2020","moduleResolution": "node","allowSyntheticDefaultImports": true},"include": ["vite.config.ts", "src/**/*.ts", "global/*.ts"]
5、在src下新建vite-env.d.ts ,解决ts无法识别引入.vue后缀的文件夹
/// <reference types="vite/client" />
declare module '*.vue' {import type { DefineComponent } from 'vue'// eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/ban-typesconst component: DefineComponent<{}, {}, any>export default component
}
每次修改完都要重启项目,或者关闭项目重启VSCode、重启项目。
5、使用van-nav-bar时看这里
直接使用,但由于它会盖住外部包裹层,所以你使用van-nav-bar时需要给外层container添加padding-top:92px; 也就是vant-nav-bar的2倍高度(1倍是46),因为我们设计稿是750的。
这样在van-nav-bar下的内容就不会被它盖住了。
不需要van-nav-bar的无需加此样式。
<template><container><van-nav-bar title="首页" /> </container>
</template>
<style scoped lang="scss">.container{padding-top: 92px;}
</style>
6、如果打开某些组件正确引入vue的api了,但还是报未找到vue文件,此时项目有缓存,关闭整个VScode重启项目即可解决。
import { ref } from 'vue' // 正确引了,但提示报未找到文件
7、souceTree 如果提交代码失败请检查当前node 版本是否为16
node -v 如果不是则切换为16
nvm use 16 切换后souceTree重新提交代码
8、如何深层次修改vant-ui组件样式
::v-deep(.van-search) {background-color: #f5f5f5;
}
9、如何定义SCSS全局公共样式并使用
1、在src/assets/scss/variables.scss中定义
// 主题色
$theme-color: #af1d36;
2、记得在vite.config.ts配置一下这个文件路径,否则页面用了找不着
vite.config.ts
export default defineConfig({css:{// css预处理器preprocessorOptions: {scss: {// 引入 variables.scss 这样就可以在全局中使用 variables.scss中预定义的变量了// 给导入的路径最后加上 ;additionalData: '@import "@/assets/scss/variables.scss";',},},}
})
3、页面如何使用
views/home/index.vue
<template><p>测试</p>
</template><style lang="scss" scoped>p{color: $theme-color}
</style>
10、assets/images的图片可以用变量形式引入并使用
1、以home.vue为例
项目中已为assets配置路径别名,所以无需…/
import prodImg from '@/assets/images/icons/商品1.png'<template><img :src="prodImg" />
</teplate>
11、页面css布局编写规范
1、如果页面顶部有nav-bar导航栏,则用这种布局
.container {width: 100%;min-height: 100vh;padding-top: 92px;overflow-x: hidden;overflow-y: scroll;
}
2、不需要导航栏的页面用这种,少了一个padding-top,因为有导航栏时页面数据会被它盖住,所以需要下移。
.container {width: 100%;min-height: 100vh;overflow-x: hidden;overflow-y: scroll;
}
相关文章:
开源:基于Vue3.3 + TS + Vant4 + Vite5 + Pinia + ViewPort适配..搭建的H5移动端开发模板
vue3.3-Mobile-template 基于Vue3.3 TS Vant4 Vite5 Pinia ViewPort适配 Sass Axios封装 vconsole调试工具,搭建的H5移动端开发模板,开箱即用的。 环境要求: Node:16.20.1 pnpm:8.14.0 必须装上安装pnpm,没装的看这篇…...
缩略图保持加密(thumbnail-preserving encryption, TPE)的理论基础
这涉及到一些视觉心理学等方面知识: 1、参考文献: 云存储图像缩略图保持的加密研究进展(中国图像图形学报) 一些视觉心理学的研究为TPE的成功实现提供了理论基础。Potter(1975, 1976)的研究表明人类的视觉系统能够在100 ms内从一个新场景中提取出相应的语义信息;250 ms内…...
nodejs+vue+mysql校园失物招领网站38tp1
本高校失物招领平台是为了提高用户查阅信息的效率和管理人员管理信息的工作效率,可以快速存储大量数据,还有信息检索功能,这大大的满足了用户和管理员这两者的需求。操作简单易懂,合理分析各个模块的功能,尽可能优化界…...
GEDepth:Ground Embedding for Monocular Depth Estimation
参考代码:gedepth 出发点与动机 相机的外参告诉了相机在世界坐标系下的位置信息,那么可以用这个外参构建一个地面基础深度作为先验,后续只需要在这个地面基础深度先验基础上添加offset就可以得到结果深度,这样可以极大简化深度估…...
校园圈子论坛系统--APP小程序H5,前后端源码交付,支持二开!uniAPP+PHP书写!
随着移动互联网的快速发展,校园社交成为了大学生们日常生活中重要的一部分。为了方便校园内学生的交流和互动,校园社交小程序逐渐走入人们的视野。本文将探讨校园社交小程序的开发以及其带来的益处。 校园社交小程序的开发涉及许多技术和设计方面。首先&…...
VMware vCenter告警:vSphere UI运行状况警报
vSphere UI运行状况警报 不会详细显示告警的具体内容,需要我们自己进一步确认告警原因。 vSphere UI运行状况警报是一种监控工具,用于检测vSphere环境中的潜在问题。当警报触发时,通常表示系统遇到了影响性能或可用性的问题。解决vSphere UI…...
C# 引用同一个dll不同版本的程序集
因为项目需要所以必须在项目中引用不同版本的同一程序集 我要引用的文件是newtonsoft.json.dll 两个版本为12.0.0.0 和4.0.0.0 1.如果已经先引入了newtonsoft.json 12.0.0.0版本的程序集,如果直接引入另一个版本的程序集的话会提示不成功,所以先将另一个…...
单机搭建hadoop环境(包括hdfs、yarn、hive)
单机可以搭建伪分布式hadoop环境,用来测试和开发使用,hadoop包括: hdfs服务器 yarn服务器,yarn的前提是hdfs服务器, 在前面两个的基础上,课可以搭建hive服务器,不过hive不属于hadoop的必须部…...
LEETCODE 170. 交易逆序对的总数
class Solution { public:int reversePairs(vector<int>& record) {if(record.size()<1)return 0;//归并 递归int left,right;left0;rightrecord.size()-1;int nummergeSort(left,right,record);return num;}int mergeSort(int left,int right, vector<int>…...
「HarmonyOS」EventHub事件通知详细使用方法
需求背景: 在开发过程中,肯定会出现触发特定事件,需要全局进行通知,与之相关的部分进行执行相应的修改方法。举个例子:修改了用户个人昵称,需要进行全局通知,在涉及昵称的部分收到通知后&#…...
为什么golang不支持可重入锁呢?
为什么golang不需要可重入锁? 在工程中使用锁的原因在于为了保护不变量,也可以用于保护内、外部的不变量。 基于此,Go 在互斥锁设计上会遵守这几个原则。如下: 在调用 mutex.Lock 方法时,要保证这些变量的不变性保持…...
聊一聊Tomcat的架构和运行流程,尽量通俗易懂一点
1、Tomcat的架构 这里可以看出 A、一个Tomcat就是一个Server,一个Server下会有多个Service, B、Service只负责封装多个Connector和一个Container(Service本身不是容器,可以看做只是用来包装Connector和Container的壳,…...
ModelArts加速识别,助力新零售电商业务功能的实现
前言 如果说为客户提供最好的商品是产品眼中零售的本质,那么用户的思维是什么呢? 在用户眼中,极致的服务体验与优质的商品同等重要。 企业想要满足上面两项服务,关键在于提升效率,也就是需要有更高效率的零售&#…...
Qt/C++音视频开发65-切换声卡/选择音频输出设备/播放到不同的声音设备/声卡下拉框
一、前言 近期收到一个用户需求,要求音视频组件能够切换声卡,首先要在vlc上实现,于是马不停蹄的研究起来,马上查阅对应vlc有没有自带的api接口,查看接口前,先打开vlc播放器,看下能不能切换&…...
MySQL原理(一)架构组成之逻辑模块(1)组成
总的来说,MySQL可以看成是二层架构,第一层我们通常叫做SQL Layer,在MySQL数据库系统处理底层数据之前的所有工作都是在这一层完成的,包括权限判断,sql解析,执行计划优化,query cache的处理等等&…...
一、cadence PDK 自学笔记-心法
我这边ADS /Cadence PDK基本大部分都是自学完成的。 当然也非常感谢我的前同事周**的帮忙,教了我很多基础的。另外也感谢我现在同事,李**和程*的帮忙,学习了很多cad的视角。 其实对于自学写PDK的小伙伴,一般都要如何学习呢&…...
防御保护--NAT策略
目录 NAT策略 NAT类型 server-map表 P2P --- peer to peer 网络类型 编辑 目标NAT--服务器映射 双向NAT 编辑 多出口NAT NAT策略 静态NAT --- 一对一 动态NAT --- 多对多 NAPT --- 一对多的NAPT --- easy ip --- 多对多NAPT 服务器映射 源NAT--基于源IP地址进行转…...
【C++】C++入门 — 指针空值nullptr
C入门 指针空值 指针空值 在良好的C/C编程习惯中,声明一个变量时最好给该变量一个合适的初始值,否则可能会出现 不可预料的错误,比如未初始化的指针。如果一个指针没有合法的指向,我们基本都是按照如下 方式对其进行初始化: voi…...
Vue3+Koa2实现图片上传(不再畏惧)
大家好,我是勇宝,一个热爱前端的小学生,年关将至,提前祝大家新年快乐。今天呢,我们就来好好的啃一啃图片上传,从一个前端开发者的角度来探讨一下图片上传前后端到底都做了哪些事情。 文章目录 一、技术摘要…...
wsl-ubuntu 安装 nginx
wsl-ubuntu 安装 nginx 1. 安装 nginx2. 确认 nginx 启动状态3. 重启 nginx4. 停止 nginx 1. 安装 nginx sudo apt install nginx2. 确认 nginx 启动状态 systemctl status nginx3. 重启 nginx systemctl restart nginx4. 停止 nginx systemctl stop nginx完成!…...
测试markdown--肇兴
day1: 1、去程:7:04 --11:32高铁 高铁右转上售票大厅2楼,穿过候车厅下一楼,上大巴车 ¥10/人 **2、到达:**12点多到达寨子,买门票,美团/抖音:¥78人 3、中饭&a…...
WordPress插件:AI多语言写作与智能配图、免费AI模型、SEO文章生成
厌倦手动写WordPress文章?AI自动生成,效率提升10倍! 支持多语言、自动配图、定时发布,让内容创作更轻松! AI内容生成 → 不想每天写文章?AI一键生成高质量内容!多语言支持 → 跨境电商必备&am…...
C# SqlSugar:依赖注入与仓储模式实践
C# SqlSugar:依赖注入与仓储模式实践 在 C# 的应用开发中,数据库操作是必不可少的环节。为了让数据访问层更加简洁、高效且易于维护,许多开发者会选择成熟的 ORM(对象关系映射)框架,SqlSugar 就是其中备受…...
【RockeMQ】第2节|RocketMQ快速实战以及核⼼概念详解(二)
升级Dledger高可用集群 一、主从架构的不足与Dledger的定位 主从架构缺陷 数据备份依赖Slave节点,但无自动故障转移能力,Master宕机后需人工切换,期间消息可能无法读取。Slave仅存储数据,无法主动升级为Master响应请求ÿ…...
【开发技术】.Net使用FFmpeg视频特定帧上绘制内容
目录 一、目的 二、解决方案 2.1 什么是FFmpeg 2.2 FFmpeg主要功能 2.3 使用Xabe.FFmpeg调用FFmpeg功能 2.4 使用 FFmpeg 的 drawbox 滤镜来绘制 ROI 三、总结 一、目的 当前市场上有很多目标检测智能识别的相关算法,当前调用一个医疗行业的AI识别算法后返回…...
MySQL账号权限管理指南:安全创建账户与精细授权技巧
在MySQL数据库管理中,合理创建用户账号并分配精确权限是保障数据安全的核心环节。直接使用root账号进行所有操作不仅危险且难以审计操作行为。今天我们来全面解析MySQL账号创建与权限分配的专业方法。 一、为何需要创建独立账号? 最小权限原则…...
Pinocchio 库详解及其在足式机器人上的应用
Pinocchio 库详解及其在足式机器人上的应用 Pinocchio (Pinocchio is not only a nose) 是一个开源的 C 库,专门用于快速计算机器人模型的正向运动学、逆向运动学、雅可比矩阵、动力学和动力学导数。它主要关注效率和准确性,并提供了一个通用的框架&…...
怎么让Comfyui导出的图像不包含工作流信息,
为了数据安全,让Comfyui导出的图像不包含工作流信息,导出的图像就不会拖到comfyui中加载出来工作流。 ComfyUI的目录下node.py 直接移除 pnginfo(推荐) 在 save_images 方法中,删除或注释掉所有与 metadata …...
关于easyexcel动态下拉选问题处理
前些日子突然碰到一个问题,说是客户的导入文件模版想支持部分导入内容的下拉选,于是我就找了easyexcel官网寻找解决方案,并没有找到合适的方案,没办法只能自己动手并分享出来,针对Java生成Excel下拉菜单时因选项过多导…...
在 Spring Boot 项目里,MYSQL中json类型字段使用
前言: 因为程序特殊需求导致,需要mysql数据库存储json类型数据,因此记录一下使用流程 1.java实体中新增字段 private List<User> users 2.增加mybatis-plus注解 TableField(typeHandler FastjsonTypeHandler.class) private Lis…...
