主頁 > 企業開發 > vue-router

vue-router

2023-05-07 08:51:28 企業開發

安裝

vue-router是一個vue的插件,用來實作前端的路由, 推薦使用 pnpm add vue-router@4 進行安裝,推薦配合vue3組合式api使用

基礎

從一個例子開始

<!-- App.vue檔案 -->
<div id="app">
  <h1>Hello App!</h1>
  <p>
    <!--使用 router-link 組件進行導航 -->
    <!--通過傳遞 `to` 來指定鏈接 -->
    <!--`<router-link>` 將呈現一個帶有正確 `href` 屬性的 `<a>` 標簽-->
    <router-link to="/hello/112233">hello</router-link>
  </p>
  <!-- 路由出口 -->
  <!-- 路由匹配到的組件將渲染在這里 -->
  <router-view></router-view>
</div>
// router/index.js 檔案

//createRouter 用來創建路由
//createWebHashHistory 指定路由是hash模式

import { createRouter,createWebHashHistory } from 'vue-router'

import Hello from '../components/Hello.vue'
import ErrorPage from '../components/ErrorPage.vue'

// 配置路由規則
const routers = [
    // 匹配所有路由(正則匹配權重低),自定義404
    {path: '/:all(.*)*', component: ErrorPage},
    {path: '/hello/:id',component: Hello}
]

// 匯出路由
export default createRouter({
    history: createWebHashHistory(),    // 這里我們使用簡單的hash模式
    routes: routers
})
// main.js 檔案
import { createApp } from 'vue'
import './style.css'
import App from './App.vue'
import routers from './routers'

createApp(App)
    .use(routers)		// 掛載路由
    .mount('#app')

專案中的路由物件

tips: 別忘記掛載路由哦 如 use(router)

  1. $router: 通過this呼叫,或者通過 import匯出路由也一樣,此路由物件,就是匯出的路由物件,可以呼叫push等 ... <-
  2. $route: 通過this呼叫,此路由物件是當前的路由物件,比如說 /Home 拿到的是當前 /Home 的路由物件,可以通過 $route.params 拿到路由引數等

動態路由

匹配規則

匹配模式 匹配路徑 匹配說明 $route.params $route.query $route.hash
/users/:username /users/eduardo?sid=123#ok ok
/users/:username/posts/:postId /users/eduardo/posts/123?sid=123#ok ok
/:pathMatch(.*)* /a/b 匹配所有
/user-:afterUser(.*) /user-admin 匹配user- 以開頭的
/:orderId(\\d+) /123 匹配數字
/:chapters+ /a/a/a 匹配重復的(一個或多個)

從上面可以看出,路由匹配是支持自定義正則的,官方推薦的路由除錯工具 https://paths.esm.dev/

Sensitive 與 strict 路由配置

const router = createRouter({
  history: createWebHistory(),
  routes: [
    { 
        // /users	ok
        // /Users	error
        // /user/	error
        path: '/users', 
        sensitive: true,	// 大小寫敏感
        strict: true, 		// 是否嚴格按照path匹配
        
    },
  ],
  strict: true,  // 或者這里設定全域
})

嵌套路由

比如我們有兩個路由 /home/user,/home/posts,可以看出來他們都是處于 /home下的,屬于是嵌套關系,我們可以使用以下代碼實作

const routes = [
  {
    path: '/home',
    component: Home,
    children: [			// home的子級
      {
        path: 'user',
        component: User,
      },
      {
        path: 'posts',
        component: Posts,
      },
    ],
  },
]

編程式導航

頂文的有個例子使用 <router-link to="/home">點我啊</router-link> 進行路由導航,其實點擊 <router-link :to="..."> 相當于呼叫 router.push(...)

編程時導航就是通過js代碼來跳轉路由,通過以下例子介紹下

// 字串路徑
router.push('/users/admin')

// 帶有路徑的物件
router.push({ path: '/users/admin' })

// 命名的路由,讓路由建立 url, 可以傳遞params, query,hash, 傳遞的引數vue-router會自動編碼,如果放在path中需要先編碼一下
router.push({ name: 'user', params: { username: 'admin' }, query: { plan: '花兒為什么這么紅' }, hash: '#h1' } })


  • push: 這個方法會向 history 堆疊添加一個新的記錄,所以,當用戶點擊瀏覽器后退按鈕時,會回到之前的 URL
  • replace: 會替代當前位置,無法回退,其余的同上
  • forward: 向前移動一條記錄
  • back: 向后移動一條記錄
  • go: go(-1)后退,反之亦然

命名路由

除了 path 之外,你還可以為任何路由提供 name,這有以下優點:

  • 沒有硬編碼的 URL
  • params 的自動編碼/解碼,
  • 防止你在 url 中出現打字錯誤,
const routes = [
  {
    path: '/user/:username',
    name: 'user',
    component: User,
  },
]
router.push({ name: 'user', params: { username: 'any' } }

命名視圖

有時候我們想要在同一個頁面里展示多個視圖,又不想嵌套展示,例如創建一個布局,sidebar(側邊欄),main(主要區域),示例代碼如下,當然也可以嵌套命名視圖,

<router-view  name="LeftSidebar"></router-view>
<router-view ></router-view>
<router-view  name="RightSidebar"></router-view>
const router = createRouter({
  history: createWebHashHistory(),
  routes: [
    {
      path: '/',
      components: {
        default: Home,
        // LeftSidebar: LeftSidebar 的縮寫
        LeftSidebar,
        // 它們與 `<router-view>` 上的 `name` 屬性匹配
        RightSidebar,
      },
    },
  ],
})


// 或使用嵌套命名視圖

{
  path: '/settings',
  // 你也可以在頂級路由就配置命名視圖
  component: UserSettings,
  children: [{
    path: 'emails',
    component: UserEmailsSubscriptions
  }, {
    path: 'profile',
    components: {
      default: UserProfile,
      helper: UserProfilePreview
    }
  }]
}

重定向和別名


// redirect可以是一個字串,一個物件,一個函式,示例如下
const routes = [
  {
    // /search/screens -> /search?q=screens
    path: '/search/:searchText',
    redirect: to => {
      // 方法接收目標路由作為引數
      // return 重定向的字串路徑/路徑物件
      return { path: '/search', query: { q: to.params.searchText } }
    },
  },
  {
    path: '/search',
    // ...
  },
]
// 別名,就是說當訪問這個別名的時候,跳轉到此路由,不受路由限制,推薦少用少用少用!!!

const routes = [
    {
        path: '/home',
        alias: ['/',‘’]		// 也可以設定兩個別名
    }
]


給組件傳遞props

我們可以通過$route拿到引數,但是這樣寫的話組件過于依賴路由,我們有更好的一種方式,通過設定 props: true 開啟props傳參, 示例如下

const routes = [
  {
    path: '/user/:id',
    components: { default: User, sidebar: Sidebar },
    
    // 有以下幾種寫法
      
    // 1:props: true
    // 2:props: { default: true, sidebar: false }
    // 3:{ id: '傳入的引數' }	
    // 4: route=> ({ id: route.params.id })
  }
]

路由模式

Hash 模式

在瀏覽器url使用了哈希字符 # 這部分url沒有被發送服務器, 在SEO優化 有不好的影響,如果擔心這個問題可以使用HTML5模式

import { createRouter, createWebHashHistory } from 'vue-router'

const router = createRouter({
  history: createWebHashHistory(),
  routes: [
    //...
  ],
})

HTML5 模式

這種模式看起來像一個比較正常的url 比如 https://example.com/home/user , 需要在服務器配置

import { createRouter, createWebHistory } from 'vue-router'

const router = createRouter({
  history: createWebHistory(),
  routes: [
    //...
  ],
})

服務器配置

  1. nginx

    location / {
      try_files $uri $uri/ /index.html;
    }
    
  2. node

    const http = require('http')
    const fs = require('fs')
    const httpPort = 80
    
    http
      .createServer((req, res) => {
        fs.readFile('index.html', 'utf-8', (err, content) => {
          if (err) {
            console.log('We cannot open "index.html" file.')
          }
    
          res.writeHead(200, {
            'Content-Type': 'text/html; charset=utf-8',
          })
    
          res.end(content)
        })
      })
      .listen(httpPort, () => {
        console.log('Server listening on: http://localhost:%s', httpPort)
      })
    
    1. iis

      <?xml version="1.0" encoding="UTF-8"?>
      <configuration>
        <system.webServer>
          <rewrite>
            <rules>
              <rule name="Handle History Mode and custom 404/500" stopProcessing="true">
                <match url="(.*)" />
                <conditions logicalGrouping="MatchAll">
                  <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
                  <add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" />
                </conditions>
                <action type="Rewrite" url="/" />
              </rule>
            </rules>
          </rewrite>
        </system.webServer>
      </configuration>
      

進階

好啦,看到這已經理解基礎了,想了解更的話繼續往下看,我們有時候需要做點別的 事情

導航守衛

導航守衛就是AOP的思想,在路由進入前進入后更新,做點事情,導航守衛可以使用多個會依次執行,類似于管道,路由匹配的組件會復用, 它可以掛載到全域單個路由單個組件,各有妙用,望君細品,代碼示例如下

全域守衛

// 進入前
router.beforeEach((to, from)=>{
    //回傳 false 以取消導航,也可以回傳一個物件,比如 {name:'home'},相當于重定向
})

// 或者加入第三個引數 next,如果宣告了第三個引數,則必須呼叫一個,否則會一直等待
router.beforeEach((to, from, next)=>{
    
    // next(false) 或者 next({path: '/home'})
})

// 進入后
router.afterEach((to, from)=>{
    
})

// 決議守衛,發生在beforeEach后
router.beforeResolve((to, from)=>{
    
})



路由專用守衛

// 進入路由觸發(但是還沒有進入,在beforeResolve前觸發)


function removeQueryParams(to) {
  if (Object.keys(to.query).length)
    return { path: to.path, query: {}, hash: to.hash }
}

function removeHash(to) {
  if (to.hash) return { path: to.path, query: to.query, hash: '' }
}


const routes = [
  {
    path: '/users/:id',
    component: UserDetails,
    beforeEnter: [removeQueryParams, removeHash],	// 可以是陣列,按順序呼叫
  },
]

組件內的守衛

// 選項式: beforeRouteEnter,beforeRouteUpdate,beforeRouteLeave
// 組合式:onBeforeRouteUpdate,onBeforeRouteLeave 

const UserDetails = {
  template: `...`,
  beforeRouteEnter(to, from) {
    // 在渲染該組件的對應路由被驗證前呼叫
    // 不能獲取組件實體 `this` !
    // 因為當守衛執行時,組件實體還沒被創建!
  },
  beforeRouteUpdate(to, from) {
    // 在當前路由改變,但是該組件被復用時呼叫
    // 舉例來說,對于一個帶有動態引數的路徑 `/users/:id`,在 `/users/1` 和 `/users/2` 之間跳轉的時候,
    // 由于會渲染同樣的 `UserDetails` 組件,因此組件實體會被復用,而這個鉤子就會在這個情況下被呼叫,
    // 因為在這種情況發生的時候,組件已經掛載好了,導航守衛可以訪問組件實體 `this`
  },
  beforeRouteLeave(to, from) {
    // 在導航離開渲染該組件的對應路由時呼叫
    // 與 `beforeRouteUpdate` 一樣,它可以訪問組件實體 `this`
  },
}

完整的導航決議流程

  1. 導航被觸發,
  2. 在失活的組件里呼叫 beforeRouteLeave 守衛,
  3. 呼叫全域的 beforeEach 守衛,
  4. 在重用的組件里呼叫 beforeRouteUpdate 守衛(2.2+),
  5. 在路由配置里呼叫 beforeEnter
  6. 決議異步路由組件,
  7. 在被激活的組件里呼叫 beforeRouteEnter
  8. 呼叫全域的 beforeResolve 守衛(2.5+),
  9. 導航被確認,
  10. 呼叫全域的 afterEach 鉤子,
  11. 觸發 DOM 更新,
  12. 呼叫 beforeRouteEnter 守衛中傳給 next 的回呼函式,創建好的組件實體會作為回呼函式的引數傳入,

路由元資訊

有時候想要將資訊附加到路由上,我們看下面這個例子

const routes = [
  {
    path: '/posts',
    component: PostsLayout,
    children: [
      {
        path: 'new',
        component: PostsNew,
        // 只有經過身份驗證的用戶才能創建帖子
        meta: { requiresAuth: true }
      },
      {
        path: ':id',
        component: PostsDetail
        // 任何人都可以閱讀文章
        meta: { requiresAuth: false }
      }
    ]
  }
]
// 我們可以通過 $route.meta 拿到meta資料

router.beforeEach((to, from) => {
  // 而不是去檢查每條路由記錄
  // to.matched.some(record => record.meta.requiresAuth)
  if (to.meta.requiresAuth && !auth.isLoggedIn()) {
    // 此路由需要授權,請檢查是否已登錄
    // 如果沒有,則重定向到登錄頁面
    return {
      path: '/login',
      // 保存我們所在的位置,以便以后再來
      query: { redirect: to.fullPath },
    }
  }
})

在組合式API的應用

在組合式API公開下面兩個導航守衛API

import { onBeforeRouteUpdate,onBeforeRouteLeave } from 'vue-router'

onBeforeRouteLeave: 即將離開路由

onBeforeRouteUpdate: 路由的hash或者query發生了變化

自定義router-link


<template>
    <div @click="handle">
    	<slot></slot>
    </div>
</template>


<script>

import { RouterLink, useLink } from 'vue-router'
import { computed } from 'vue'

export default {

name: 'AppLink',
props: {
 // 如果使用 TypeScript,請添加 @ts-ignore
 ...RouterLink.props,
 inactiveClass: String,
},
methods:{

 handle(){
   this.$router.push(this.to)
 }
},
setup(props) {
 	const {
       // 決議出來的路由物件
       route,
       // 用在鏈接里的 href
       href,
       // 布爾型別的 ref 標識鏈接是否匹配當前路由
       isActive,
       // 布爾型別的 ref 標識鏈接是否嚴格匹配當前路由
       isExactActive,
       // 導航至該鏈接的函式
       navigate
       } = useLink(props)

 	const isExternalLink = computed(
  	 () => typeof props.to === 'string' && props.to.startsWith('http')
 	)

 	return { isExternalLink, href, navigate, isActive }
	
	},
}

</script>

過度動效

顧名思義就是給路由的切換添加影片效果

例子如下

<router-view v-slot="{ Component, route }">
  <transition name="fade">
    <component :is="Component" :key="route.path" />
  </transition>
</router-view>

我們用v-slot拿到了 component和route,然后通過動態組件的方式來顯示,在transition指定影片效果

由于vue會自動復用看起來類似的組件,所有我們需要加上唯一 key


滾動行為

這個比較簡單就是一個 api

例子如下

const router = createRouter({
 history: createWebHashHistory(),
 routes: [...],
 scrollBehavior (to, from, savedPosition) {
   // return 期望滾動到哪個的位置,示例如下
 }
})

/*
回傳值支持以下,也可以回傳promise,支持延遲滾動

return {
     // 也可以這么寫
     // el: document.getElementById('main'),
     // el: to.hash,			 定位錨點
     // behavior: 'smooth',	 滾動流暢
     
     el: '#main',
     top: -10,
}
*/

如果回傳一個 falsy(非真值) 的值,或者是一個空物件,那么不會發生滾動,

回傳 savedPosition,在按下 后退/前進 按鈕時,就會像瀏覽器的原生表現那樣:


路由懶加載

vue-router支持動態匯入我們這樣寫,示例如下

const router = createRouter({
 routes: [
     { 
         path: '/users/:id', 
         component: () => import('./views/UserDetails.vue') 
     }
 ],
})

為了避免請求過多,我們有時候需要組件按組分塊,示例如下

// 在路由下配置webpackChunkName,vite支持webpack的這種寫法,同名的設定為一組

const UserDetails = () =>
 import(/* webpackChunkName: "group-user" */ './UserDetails.vue')
const UserDashboard = () =>
 import(/* webpackChunkName: "group-user" */ './UserDashboard.vue')
const UserProfileEdit = () =>
 import(/* webpackChunkName: "group-user" */ './UserProfileEdit.vue')




// 我們在vite.config.js 配置

export default defineConfig({
 build: {
   rollupOptions: {
     // https://rollupjs.org/guide/en/#outputmanualchunks
     output: {
       manualChunks: {
         'group-user': [				// group-user組
           './src/UserDetails.vue',
           './src/UserDashboard.vue',
           './src/UserProfileEdit.vue',
         ],
       },
     },
   },
 },
})


// 配置后將會在build后 才能生效!!!!


在router-link組件上封裝一層(自定義 RouterLink 組件),示例如下

<template>
 <a v-if="isExternalLink" v-bind="$attrs" :href="https://www.cnblogs.com/ProCheng/archive/2023/05/06/to" target="_blank">
     
   <slot />
 </a>
 <router-link
   v-else
   v-bind="$props"
   custom
   v-slot="{ isActive, href, navigate }">
     
   <a
     v-bind="$attrs"
     :https://www.cnblogs.com/ProCheng/archive/2023/05/06/href="href"
     @click="navigate"
     :>
       
     <slot />
   </a>
 </router-link>
</template>

<script>
import { RouterLink } from 'vue-router'

export default {
 name: 'AppLink',
 inheritAttrs: false,

 props: {
   // 如果使用 TypeScript,請添加 @ts-ignore
   ...RouterLink.props,
   inactiveClass: String,
 },

 computed: {
   isExternalLink() {
     return typeof this.to === 'string' && this.to.startsWith('http')
   },
 },
}
</script>

使用組件

<AppLink
   v-bind="$attrs"
   
   active-
   inactive-
 >
   點我點我
</AppLink>

路由導航檢測

有時候我們需要在push后做點什么,可以在 push 前面加上 await 示例如下

通過 push等方法進行路由導航,有時候未必會成功跳轉,比如已經在目標路由,或者路由回傳了false,示例如下


// push回傳的是一個promise,因此我們可以這樣寫
await $router.push('/user/list')
this.isMenuOpen = false;

// 判斷是否導航成功

var navigationResult = await $router.push('/user/list');
if (navigationResult) {
  // 導航被阻止
} else {
  // 導航成功 (包括重新導航的情況)
  this.isMenuOpen = false
}

// 其實通過navigationResult物件可以拿到詳細的錯誤資訊,這個用的比較少,這里就不寫了

動態路由

對于已經運行的程式,我們想添加路由,就看這里,動態路由主要通過兩個函式實作 router.addRoute()router.removeRoute()


var removeRoute = router.addRoute({path: '/user', name: 'user', component: xxx })
// router.replace(router.currentRoute.value.fullPath)	// 然后手動呼叫replace覆寫當前路由


// 可以覆寫替換,當名字一樣的情況下
removeRoute('填入路由的名字')	// 呼叫它的回傳值可以刪掉路由

// 添加嵌套路由
router.addRoute('父路由的名字', {path: '/user', name: 'user', component: xxx })

// 查看現有路由

router.hasRoute()	// 檢查路由是否存在
router.getRoutes()	// 獲取一個包含所有路由記錄的陣列

擴展

unplugin-vue-router

基于檔案的自動路由,可以使用vite提供的功能(vite-plugin-pages)

也可以通過官方提供的一個插件 unplugin-vue-router

emmmm... 這個內容有點多,還是看官網吧...

GitHub unplugin-vue-router


持續學習

閱讀 vue-router@4 API

詳細見官網

拜了個拜~

本文來自博客園,作者:Pro成,轉載請注明原文鏈接:https://www.cnblogs.com/ProCheng/p/17293241.html

轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/551835.html

標籤:其他

上一篇:el-upload組件問題 已解決

下一篇:返回列表

標籤雲
其他(158584) Python(38118) JavaScript(25404) Java(18023) C(15222) 區塊鏈(8262) C#(7972) AI(7469) 爪哇(7425) MySQL(7165) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5871) 数组(5741) R(5409) Linux(5335) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4565) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2432) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1965) Web開發(1951) HtmlCss(1932) python-3.x(1918) 弹簧靴(1913) C++(1912) xml(1889) PostgreSQL(1874) .NETCore(1857) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • IEEE1588PTP在數字化變電站時鐘同步方面的應用

    IEEE1588ptp在數字化變電站時鐘同步方面的應用 京準電子科技官微——ahjzsz 一、電力系統時間同步基本概況 隨著對IEC 61850標準研究的不斷深入,國內外學者提出基于IEC61850通信標準體系建設數字化變電站的發展思路。數字化變電站與常規變電站的顯著區別在于程序層傳統的電流/電壓互 ......

    uj5u.com 2020-09-10 03:51:52 more
  • HTTP request smuggling CL.TE

    CL.TE 簡介 前端通過Content-Length處理請求,通過反向代理或者負載均衡將請求轉發到后端,后端Transfer-Encoding優先級較高,以TE處理請求造成安全問題。 檢測 發送如下資料包 POST / HTTP/1.1 Host: ac391f7e1e9af821806e890 ......

    uj5u.com 2020-09-10 03:52:11 more
  • 網路滲透資料大全單——漏洞庫篇

    網路滲透資料大全單——漏洞庫篇漏洞庫 NVD ——美國國家漏洞庫 →http://nvd.nist.gov/。 CERT ——美國國家應急回應中心 →https://www.us-cert.gov/ OSVDB ——開源漏洞庫 →http://osvdb.org Bugtraq ——賽門鐵克 →ht ......

    uj5u.com 2020-09-10 03:52:15 more
  • 京準講述NTP時鐘服務器應用及原理

    京準講述NTP時鐘服務器應用及原理京準講述NTP時鐘服務器應用及原理 安徽京準電子科技官微——ahjzsz 北斗授時原理 授時是指接識訓通過某種方式獲得本地時間與北斗標準時間的鐘差,然后調整本地時鐘使時差控制在一定的精度范圍內。 衛星導航系統通常由三部分組成:導航授時衛星、地面檢測校正維護系統和用戶 ......

    uj5u.com 2020-09-10 03:52:25 more
  • 利用北斗衛星系統設計NTP網路時間服務器

    利用北斗衛星系統設計NTP網路時間服務器 利用北斗衛星系統設計NTP網路時間服務器 安徽京準電子科技官微——ahjzsz 概述 NTP網路時間服務器是一款支持NTP和SNTP網路時間同步協議,高精度、大容量、高品質的高科技時鐘產品。 NTP網路時間服務器設備采用冗余架構設計,高精度時鐘直接來源于北斗 ......

    uj5u.com 2020-09-10 03:52:35 more
  • 詳細解讀電力系統各種對時方式

    詳細解讀電力系統各種對時方式 詳細解讀電力系統各種對時方式 安徽京準電子科技官微——ahjzsz,更多資料請添加VX 衛星同步時鐘是我京準公司開發研制的應用衛星授時時技術的標準時間顯示和發送的裝置,該裝置以M國全球定位系統(GLOBAL POSITIONING SYSTEM,縮寫為GPS)或者我國北 ......

    uj5u.com 2020-09-10 03:52:45 more
  • 如何保證外包團隊接入企業內網安全

    不管企業規模的大小,只要企業想省錢,那么企業的某些服務就一定會采用外包的形式,然而看似美好又經濟的策略,其實也有不好的一面。下面我通過安全的角度來聊聊使用外包團的安全隱患問題。 先看看什么服務會使用外包的,最常見的就是話務/客服這種需要大量重復性、無技術性的服務,或者是一些銷售外包、特殊的職能外包等 ......

    uj5u.com 2020-09-10 03:52:57 more
  • PHP漏洞之【整型數字型SQL注入】

    0x01 什么是SQL注入 SQL是一種注入攻擊,通過前端帶入后端資料庫進行惡意的SQL陳述句查詢。 0x02 SQL整型注入原理 SQL注入一般發生在動態網站URL地址里,當然也會發生在其它地發,如登錄框等等也會存在注入,只要是和資料庫打交道的地方都有可能存在。 如這里http://192.168. ......

    uj5u.com 2020-09-10 03:55:40 more
  • [GXYCTF2019]禁止套娃

    git泄露獲取原始碼 使用GET傳參,引數為exp 經過三層過濾執行 第一層過濾偽協議,第二層過濾帶引數的函式,第三層過濾一些函式 preg_replace('/[a-z,_]+\((?R)?\)/', NULL, $_GET['exp'] (?R)參考當前正則運算式,相當于匹配函式里的引數 因此傳遞 ......

    uj5u.com 2020-09-10 03:56:07 more
  • 等保2.0實施流程

    流程 結論 ......

    uj5u.com 2020-09-10 03:56:16 more
最新发布
  • vue-router

    安裝 vue-router是一個vue的插件,用來實作前端的路由, 推薦使用 pnpm add vue-router@4 進行安裝。推薦配合vue3組合式api使用 基礎 從一個例子開始 <!-- App.vue檔案 --> <div id="app"> <h1>Hello App!</h1> <p ......

    uj5u.com 2023-05-07 08:51:28 more
  • el-upload組件問題 已解決

    前兩天我寫了一個上傳下載功能 使用<el-upload>組件 當后端將檔案流格式資料發送到回應里面前端屈接受的時候 ,我們使用 <el-upload> 組件里面的 :on-success 方法進行捕捉,使用blob進行檔案下載 檔案可以正常下載下來 但是打開檔案損壞 我去網上尋找答案, 但大多都是說 ......

    uj5u.com 2023-05-07 08:45:50 more
  • ArcToolBox-ArcGIS分析工具中英文對照及簡要介紹

    ArcGIS具有強大的分析工具箱,包括空間分析、空間統計、三維分析等,通過ArcGIS工具箱可以對空間資料進行各類操作、分析等,也可以用不同的工具制作GP模型進行發布使用。
    本文通過對ArcGIS工具箱(ArcToolBox)中工具的中英文對照及簡要說明,方便大家了解ArcGIS的各類工具,并對各類... ......

    uj5u.com 2023-05-07 08:36:10 more
  • 高精度地形DEM資料下載(NASA資料 12.5米解析度)

    本文介紹從NASA阿拉斯加衛星設備處網站下載高精度DEM資料,下載的資料精度是12.5米解析度。 目前國內大部分可以下載的dem資料都是30米或90米解析度的,對于更高精度的資料要不就是需要付費下載,要不就是涉密資料無法獲取。 下載地址:https://vertex.daac.asf.alaska. ......

    uj5u.com 2023-05-07 08:26:21 more
  • Three.js 進階之旅:頁面平滑滾動-王國之淚 &#128167;

    本文使用 React + Three.js + React Three Fiber 技術堆疊,實作一個《塞爾達傳說:王國之淚》主題風格基于滾動控制的平滑滾動圖片展示頁面。通過本文的閱讀,你將學習到的知識點包括:了解 R3F 中 useFrame hook 及 useThree hook 基本原理及用法... ......

    uj5u.com 2023-05-06 09:02:35 more
  • Three.js 進階之旅:頁面平滑滾動-王國之淚 &#128167;

    本文使用 React + Three.js + React Three Fiber 技術堆疊,實作一個《塞爾達傳說:王國之淚》主題風格基于滾動控制的平滑滾動圖片展示頁面。通過本文的閱讀,你將學習到的知識點包括:了解 R3F 中 useFrame hook 及 useThree hook 基本原理及用法... ......

    uj5u.com 2023-05-06 08:55:46 more
  • 記錄-Symbol學習筆記

    這里給大家分享我在網上總結出來的一些知識,希望對大家有所幫助 Symbol是JavaScript中的原始資料型別之一,它表示一個唯一的、不可變的值,通常用作物件屬性的鍵值。由于Symbol值是唯一的,因此可以防止物件屬性被意外地覆寫或修改。以下是Symbol的方法和屬性整理: 屬性 Symbol.l ......

    uj5u.com 2023-05-06 08:15:46 more
  • Vue3專案(Vite+TS)使用Web Serial Api全記錄

    前言 之前寫了一個vue+django的一個通過串口控制的上位機系統。但是實際生產中,不如部署到服務器上,這樣可以更好的節約成本。但是這樣就需要弄一個客戶端來控制處理串口資訊。那我就在想能不能通過網頁直接拿到客戶端的串口資訊。所以問了萬能的chatgpt,得到了以下答案: 是的,前端可以使用 Web ......

    uj5u.com 2023-05-06 08:15:40 more
  • HTML5中的document.visibilityState

    在 HTML5 中,檔案物件(即 document 物件)具有一個 visibilityState 屬性,該屬性表示當前檔案物件的可見性狀態。 visibilityState 可能的取值有以下三種: - visible :表示檔案當前處于激活狀態,即當前選項卡處于前臺或當前視窗處于螢屏最上層。- h ......

    uj5u.com 2023-05-06 08:15:36 more
  • 基于SqlSugar的開發框架循序漸進介紹(29)-- 快速構建系統引數管理

    在隨筆《基于SqlSugar的開發框架循序漸進介紹(28)-- 快速構建系統引數管理界面》中介紹了基于SqlSugar開發框架,構建系統引數管理的后端API部分,以及WInform界面部分內容,本篇隨筆介紹基于Vue3+ElementPlus的前端界面開發程序。 ......

    uj5u.com 2023-05-06 08:15:04 more