Nuxt3JS项目目录数据记录
1. 按官方文档
-
Stylesheets (CSS, SASS, etc.)
-
Fonts
-
Images 它不会从
public/
目录中提供。
推荐我们放置 CSS JS Fonts等资源文件,而public则可以放置img html等公开的文件
两者的区别在于 最终的文件读取url上,存放在assets文件夹里的文件不会被url所识别,而放置在public文件夹里的文件则可以通过url来访问
例如 :
读取css文件 访问https://abc.com/css/index.css 这是错误的,不可访问的
读取img文件 访问https://abc.com/img/logo.png 这是可以正常识别和访问的,同样你将公开css文件、js文件以及html文件放置在public文件夹下 都是可以通过url来访问资源,因为这是公开的
public/
目录直接服务于服务器根目录,包含必须保留其名称的公共文件(例如:robots.txt
)或可能不会更改(例如:favicon.ico
)。 -- 官网components
├─ Article
│ ├─ List.vue
│ ├─ LoginBox.vue
│ └─ PageCard.vue
├─ CtrlPanel
│ └─ Aside.vue
├─ Header
│ ├─ Ctrl
│ │ └─ index.vue
│ ├─ LogoMenu
│ │ └─ index.vue
│ └─ index.vue
├─ ElMessageBoxTips.ts
├─ README
└─ useLocalStorage.ts 同样在index.vue中 则可以直接使用该函数,不用导入!
import { ElMessageBox, ElMessage } from 'element-plus'
// 二次封装 回调 Element 提示框 结果只返回 true / false
function WarningTips(Tips: string): Promise<string> {
return new Promise((resolve) => {
ElMessageBox.confirm(
Tips,
'提示',
{
confirmButtonText: '确认',
cancelButtonText: '取消',
type: 'warning',
}
).then(() => {
resolve('true');
}).catch(() => {
ElMessage({
type: 'info',
message: '已取消该操作',
});
resolve('false');
});
});
}
export default {
WarningTips
}
我们在全局任意的.vue组件中都可以这么使用
if (await ElMessageBoxTips.WarningTips('放弃注册吗?') === 'true') {
router.back()
}
直接调用ElMessageBoxTips.WarningTips方法 ,这个丝滑的过程得益于Nuxt3的自动引入,全程无感操作,纵享丝滑~
import { createRouter, createWebHistory } from 'vue-router'
// 创建路由对象
import RouterMap from '@/router/routerMap'
// 导入路由对象
import { ElNotification } from 'element-plus'
// 导入element-plus插件
// layout 布局
const router = createRouter({
history: createWebHistory(import.meta.env.BASE_URL),//TODO 生产环境需要修改为/admin/ import.meta.env.BASE_URL
routes: RouterMap
})
// 创建路由前置操作
router.beforeEach((to, from, next) => {
// 获取token
const token: boolean = localStorage.getItem('token')!== 'undefined' && localStorage.getItem('token')!== null && localStorage.getItem('token')!== undefined? true : false
// 获取是否拦截路由
const interceptionPath: boolean = to.path.match(/^\/controlPanel/)? true : false
// 如果拦截路由,则拦截
if (interceptionPath) {
if (token) {
next()
} else {
ElNotification({
title: '错误',
message: '未登录 禁止操作!',
type: 'warning',
})
next('/')
}
} else {
// 否则不拦截
next()
}
})
// 路由拦截
export default router
但是在Nuxt3中,你知道的,路由是自动构建的,无需我们手动编写(当然也不是不行233),在Nuxt3中middleware里的文件就能帮我们实现这个路由守卫功能了,我们在middleware文件夹下创建一个middleware
├─ auth.global.ts
└─ README auth.global.ts,里面的内容是
// 路由守卫
export default defineNuxtRouteMiddleware((to, from) => {
let token: string | null = ''
const toPath = to.fullPath;
if (toPath.match(/^\/CtrlView\//) || toPath.match(/^\/CtrlView/)) {
if (process.env.NODE_ENV === 'development' && typeof localStorage !== 'undefined') {
token = localStorage.getItem('token')
if (token) {
return true
} else {
return navigateTo('/Login')
}
}
}
return true
})
这样就能直接在全局中定义了一个路由中间件,而这个中间件的作用就是鉴权,当然你可以设计多个中间件,用于处理路由参数等等等...
关于命名方式:在middleware目录下 在文件中添加后缀.global.ts 则被是为全局的中间件,如果你不希望这个中间件被全局调用,只想在某些路由中使用,那就正常的命名auth.ts文件,在需要引入的组件中
<script setup>
definePageMeta({
middleware: ["auth"]
// or middleware: 'auth'
})
</script>
调用即可!