新增登录功能和全局路由守卫

This commit is contained in:
zhangqi 2025-09-09 17:35:46 +08:00
parent 52dbd09bd6
commit e778db1432
13 changed files with 562 additions and 18 deletions

172
package-lock.json generated
View File

@ -11,6 +11,8 @@
"@element-plus/icons-vue": "^2.3.1",
"axios": "^1.6.7",
"element-plus": "^2.5.6",
"md5": "^2.3.0",
"pinia": "^3.0.3",
"vue": "^3.4.38",
"vue-baidu-map-3x": "^1.0.40",
"vue-router": "^4.3.0"
@ -1248,6 +1250,30 @@
"integrity": "sha512-sGhTPMuXqZ1rVOk32RylztWkfXTRhuS7vgAKv0zjqk8gbsHkJ7xfFf+jbySxt7tWObEJwyKaHMikV/WGDiQm8g==",
"license": "MIT"
},
"node_modules/@vue/devtools-kit": {
"version": "7.7.7",
"resolved": "https://registry.npmmirror.com/@vue/devtools-kit/-/devtools-kit-7.7.7.tgz",
"integrity": "sha512-wgoZtxcTta65cnZ1Q6MbAfePVFxfM+gq0saaeytoph7nEa7yMXoi6sCPy4ufO111B9msnw0VOWjPEFCXuAKRHA==",
"license": "MIT",
"dependencies": {
"@vue/devtools-shared": "^7.7.7",
"birpc": "^2.3.0",
"hookable": "^5.5.3",
"mitt": "^3.0.1",
"perfect-debounce": "^1.0.0",
"speakingurl": "^14.0.1",
"superjson": "^2.2.2"
}
},
"node_modules/@vue/devtools-shared": {
"version": "7.7.7",
"resolved": "https://registry.npmmirror.com/@vue/devtools-shared/-/devtools-shared-7.7.7.tgz",
"integrity": "sha512-+udSj47aRl5aKb0memBvcUG9koarqnxNM5yjuREvqwK6T3ap4mn3Zqqc17QrBFTqSMjr3HK1cvStEZpMDpfdyw==",
"license": "MIT",
"dependencies": {
"rfdc": "^1.4.1"
}
},
"node_modules/@vue/language-core": {
"version": "2.2.8",
"resolved": "https://registry.npmjs.org/@vue/language-core/-/language-core-2.2.8.tgz",
@ -1453,6 +1479,15 @@
"dev": true,
"license": "MIT"
},
"node_modules/birpc": {
"version": "2.5.0",
"resolved": "https://registry.npmmirror.com/birpc/-/birpc-2.5.0.tgz",
"integrity": "sha512-VSWO/W6nNQdyP520F1mhf+Lc2f8pjGQOtoHHm7Ze8Go1kX7akpVIrtTa0fn+HB0QJEDVacl6aO08YE0PgXfdnQ==",
"license": "MIT",
"funding": {
"url": "https://github.com/sponsors/antfu"
}
},
"node_modules/bmaplib.curveline": {
"version": "1.0.0",
"resolved": "https://registry.npmmirror.com/bmaplib.curveline/-/bmaplib.curveline-1.0.0.tgz",
@ -1518,6 +1553,15 @@
"node": ">= 0.4"
}
},
"node_modules/charenc": {
"version": "0.0.2",
"resolved": "https://registry.npmmirror.com/charenc/-/charenc-0.0.2.tgz",
"integrity": "sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA==",
"license": "BSD-3-Clause",
"engines": {
"node": "*"
}
},
"node_modules/chokidar": {
"version": "4.0.3",
"resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz",
@ -1546,6 +1590,30 @@
"node": ">= 0.8"
}
},
"node_modules/copy-anything": {
"version": "3.0.5",
"resolved": "https://registry.npmmirror.com/copy-anything/-/copy-anything-3.0.5.tgz",
"integrity": "sha512-yCEafptTtb4bk7GLEQoM8KVJpxAfdBJYaXyzQEgQQQgYrZiDp8SJmGKlYza6CYjEDNstAdNdKA3UuoULlEbS6w==",
"license": "MIT",
"dependencies": {
"is-what": "^4.1.8"
},
"engines": {
"node": ">=12.13"
},
"funding": {
"url": "https://github.com/sponsors/mesqueeb"
}
},
"node_modules/crypt": {
"version": "0.0.2",
"resolved": "https://registry.npmmirror.com/crypt/-/crypt-0.0.2.tgz",
"integrity": "sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow==",
"license": "BSD-3-Clause",
"engines": {
"node": "*"
}
},
"node_modules/csstype": {
"version": "3.1.3",
"resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz",
@ -1907,6 +1975,12 @@
"he": "bin/he"
}
},
"node_modules/hookable": {
"version": "5.5.3",
"resolved": "https://registry.npmmirror.com/hookable/-/hookable-5.5.3.tgz",
"integrity": "sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ==",
"license": "MIT"
},
"node_modules/immutable": {
"version": "5.1.1",
"resolved": "https://registry.npmjs.org/immutable/-/immutable-5.1.1.tgz",
@ -1914,6 +1988,12 @@
"dev": true,
"license": "MIT"
},
"node_modules/is-buffer": {
"version": "1.1.6",
"resolved": "https://registry.npmmirror.com/is-buffer/-/is-buffer-1.1.6.tgz",
"integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==",
"license": "MIT"
},
"node_modules/is-extglob": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
@ -1950,6 +2030,18 @@
"node": ">=0.12.0"
}
},
"node_modules/is-what": {
"version": "4.1.16",
"resolved": "https://registry.npmmirror.com/is-what/-/is-what-4.1.16.tgz",
"integrity": "sha512-ZhMwEosbFJkA0YhFnNDgTM4ZxDRsS6HqTo7qsZM08fehyRYIYa0yHu5R6mgo1n/8MgaPBXiPimPD77baVFYg+A==",
"license": "MIT",
"engines": {
"node": ">=12.13"
},
"funding": {
"url": "https://github.com/sponsors/mesqueeb"
}
},
"node_modules/lodash": {
"version": "4.17.21",
"resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
@ -1991,6 +2083,17 @@
"node": ">= 0.4"
}
},
"node_modules/md5": {
"version": "2.3.0",
"resolved": "https://registry.npmmirror.com/md5/-/md5-2.3.0.tgz",
"integrity": "sha512-T1GITYmFaKuO91vxyoQMFETst+O71VUPEU3ze5GNzDm0OWdP8v1ziTaAEPUr/3kLsY3Sftgz242A1SetQiDL7g==",
"license": "BSD-3-Clause",
"dependencies": {
"charenc": "0.0.2",
"crypt": "0.0.2",
"is-buffer": "~1.1.6"
}
},
"node_modules/memoize-one": {
"version": "6.0.0",
"resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-6.0.0.tgz",
@ -2049,6 +2152,12 @@
"url": "https://github.com/sponsors/isaacs"
}
},
"node_modules/mitt": {
"version": "3.0.1",
"resolved": "https://registry.npmmirror.com/mitt/-/mitt-3.0.1.tgz",
"integrity": "sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==",
"license": "MIT"
},
"node_modules/muggle-string": {
"version": "0.4.1",
"resolved": "https://registry.npmjs.org/muggle-string/-/muggle-string-0.4.1.tgz",
@ -2095,6 +2204,12 @@
"dev": true,
"license": "MIT"
},
"node_modules/perfect-debounce": {
"version": "1.0.0",
"resolved": "https://registry.npmmirror.com/perfect-debounce/-/perfect-debounce-1.0.0.tgz",
"integrity": "sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA==",
"license": "MIT"
},
"node_modules/picocolors": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz",
@ -2115,6 +2230,36 @@
"url": "https://github.com/sponsors/jonschlinkert"
}
},
"node_modules/pinia": {
"version": "3.0.3",
"resolved": "https://registry.npmmirror.com/pinia/-/pinia-3.0.3.tgz",
"integrity": "sha512-ttXO/InUULUXkMHpTdp9Fj4hLpD/2AoJdmAbAeW2yu1iy1k+pkFekQXw5VpC0/5p51IOR/jDaDRfRWRnMMsGOA==",
"license": "MIT",
"dependencies": {
"@vue/devtools-api": "^7.7.2"
},
"funding": {
"url": "https://github.com/sponsors/posva"
},
"peerDependencies": {
"typescript": ">=4.4.4",
"vue": "^2.7.0 || ^3.5.11"
},
"peerDependenciesMeta": {
"typescript": {
"optional": true
}
}
},
"node_modules/pinia/node_modules/@vue/devtools-api": {
"version": "7.7.7",
"resolved": "https://registry.npmmirror.com/@vue/devtools-api/-/devtools-api-7.7.7.tgz",
"integrity": "sha512-lwOnNBH2e7x1fIIbVT7yF5D+YWhqELm55/4ZKf45R9T8r9dE2AIOy8HKjfqzGsoTHFbWbr337O4E0A0QADnjBg==",
"license": "MIT",
"dependencies": {
"@vue/devtools-kit": "^7.7.7"
}
},
"node_modules/postcss": {
"version": "8.5.3",
"resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.3.tgz",
@ -2163,6 +2308,12 @@
"url": "https://paulmillr.com/funding/"
}
},
"node_modules/rfdc": {
"version": "1.4.1",
"resolved": "https://registry.npmmirror.com/rfdc/-/rfdc-1.4.1.tgz",
"integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==",
"license": "MIT"
},
"node_modules/rollup": {
"version": "4.40.0",
"resolved": "https://registry.npmjs.org/rollup/-/rollup-4.40.0.tgz",
@ -2233,6 +2384,27 @@
"node": ">=0.10.0"
}
},
"node_modules/speakingurl": {
"version": "14.0.1",
"resolved": "https://registry.npmmirror.com/speakingurl/-/speakingurl-14.0.1.tgz",
"integrity": "sha512-1POYv7uv2gXoyGFpBCmpDVSNV74IfsWlDW216UPjbWufNf+bSU6GdbDsxdcxtfwb4xlI3yxzOTKClUosxARYrQ==",
"license": "BSD-3-Clause",
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/superjson": {
"version": "2.2.2",
"resolved": "https://registry.npmmirror.com/superjson/-/superjson-2.2.2.tgz",
"integrity": "sha512-5JRxVqC8I8NuOUjzBbvVJAKNM8qoVuH0O77h4WInc/qC2q5IreqKxYwgkga3PfA22OayK2ikceb/B26dztPl+Q==",
"license": "MIT",
"dependencies": {
"copy-anything": "^3.0.2"
},
"engines": {
"node": ">=16"
}
},
"node_modules/tiny-emitter": {
"version": "2.1.0",
"resolved": "https://registry.npmmirror.com/tiny-emitter/-/tiny-emitter-2.1.0.tgz",

View File

@ -12,6 +12,8 @@
"@element-plus/icons-vue": "^2.3.1",
"axios": "^1.6.7",
"element-plus": "^2.5.6",
"md5": "^2.3.0",
"pinia": "^3.0.3",
"vue": "^3.4.38",
"vue-baidu-map-3x": "^1.0.40",
"vue-router": "^4.3.0"

View File

@ -13,11 +13,17 @@
router
class="main-menu"
>
<!-- 登录后才显示的菜单项 -->
<template v-if="authStore.isLoggedIn">
<el-menu-item index="/">首页</el-menu-item>
<el-menu-item index="/demand">任务需求</el-menu-item>
<el-menu-item index="/search">任务检索</el-menu-item>
<el-menu-item index="/statistics">统计分析</el-menu-item>
<el-menu-item index="/contact">联系我们</el-menu-item>
</template>
<!-- 登录/退出按钮 -->
<el-menu-item v-if="!authStore.isLoggedIn" index="/login">登录</el-menu-item>
<el-menu-item v-else @click="logout">退出登录</el-menu-item>
</el-menu>
</div>
<img class="bg" v-show="activeMenu == '/' || activeMenu == '/statistics'" src="@/assets/bg.jpg" alt="背景图片" />
@ -56,13 +62,16 @@
</el-container>
</template>
<script setup lang="ts">
<script setup>
import { ref, watch } from 'vue'
import { useRoute } from 'vue-router'
const activeMenu = ref('/')
import { useRoute, useRouter } from 'vue-router'
import { useAuthStore } from '@/store/authStore'
const route = useRoute()
const router = useRouter()
const authStore = useAuthStore()
const activeMenu = ref(route.path)
//
watch(
@ -72,6 +81,12 @@ watch(
}
)
// 退
const logout = () => {
authStore.logout()
router.push('/login')
}
</script>
<style lang="scss" scoped>

View File

@ -1,5 +1,14 @@
import request from '@/utils/request'
// 登录
export const login = (data) => {
return request({
url: '/frame/optr/login.htm',
method: 'post',
data
})
}
// 获取参数列表
export const getParam = () => {
return request({

BIN
src/assets/icon_pwd.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 326 B

BIN
src/assets/icon_user.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 439 B

BIN
src/assets/loginBg.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 77 KiB

BIN
src/assets/login_logo.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

View File

@ -1,4 +1,5 @@
import { createApp } from 'vue'
import { createPinia } from 'pinia'
import ElementPlus from 'element-plus'
import 'element-plus/dist/index.css'
import * as ElementPlusIconsVue from '@element-plus/icons-vue'
@ -10,10 +11,14 @@ import './style.css'
const app = createApp(App)
const pinia = createPinia()
for (const [key, component] of Object.entries(ElementPlusIconsVue)) {
app.component(key, component)
}
app.use(pinia)
app.use(BaiduMap, {
ak: 'uu7pXHZLZOejrWXyTK2lVMHASObAg8Fz'
})

View File

@ -1,4 +1,5 @@
import { createRouter, createWebHashHistory } from 'vue-router'
import { useAuthStore } from '@/store/authStore'
const router = createRouter({
history: createWebHashHistory(),
@ -7,37 +8,42 @@ const router = createRouter({
path: '/',
name: 'Home',
component: () => import('@/views/Home.vue'),
meta: { title: '首页' }
meta: { title: '首页', requiresAuth: true }
},
{
path: '/demand',
name: 'TaskDemand',
component: () => import('@/views/TaskDemand.vue'),
meta: { title: '任务需求' }
meta: { title: '任务需求', requiresAuth: true }
},
{
path: '/search',
name: 'TaskSearch',
component: () => import('@/views/TaskSearch.vue'),
meta: { title: '任务检索' }
meta: { title: '任务检索', requiresAuth: true }
},
{
path: '/input/:id?',
name: 'TaskInput',
component: () => import('@/views/TaskInput.vue'),
meta: { title: '任务需求信息录入' }
meta: { title: '任务需求信息录入', requiresAuth: true }
},
{
path: '/statistics',
name: 'Statistics',
component: () => import('@/views/Statistics.vue'),
meta: { title: '统计分析' }
meta: { title: '统计分析', requiresAuth: true }
},
{
path: '/contact',
name: 'Contact',
component: () => import('@/views/Contact.vue'),
meta: { title: '联系我们' }
meta: { title: '联系我们', requiresAuth: true }
}, {
path: '/login',
name: 'Login',
component: () => import('@/views/Login.vue'),
meta: { title: '登录', requiresAuth: false }
}
]
})
@ -46,7 +52,27 @@ router.beforeEach((to, from, next) => {
if (to.meta.title) {
document.title = '应急搜捞 - ' + to.meta.title
}
const authStore = useAuthStore()
// 如果目标路由需要登录但用户未登录
if (to.meta.requiresAuth && !authStore.isLoggedIn) {
// 重定向到登录页,并记录原始目标路径
next({
path: '/login',
query: { redirect: to.fullPath }
})
}
// 如果用户已登录但尝试访问登录页
else if (to.path === '/login' && authStore.isLoggedIn) {
// 重定向到首页
next('/')
}
// 其他情况正常导航
else {
// 否则继续导航
next()
}
})
export default router

24
src/store/authStore.js Normal file
View File

@ -0,0 +1,24 @@
// src/store/authStore.js
import { defineStore } from 'pinia'
import { ref, computed } from 'vue'
export const useAuthStore = defineStore('auth', () => {
const token = ref(localStorage.getItem('token') || null)
// 计算属性:是否已登录
const isLoggedIn = computed(() => !!token.value)
// 登录方法
function login(newToken) {
token.value = newToken
localStorage.setItem('token', newToken)
}
// 退出登录方法
function logout() {
token.value = null
localStorage.removeItem('token')
}
return { token, isLoggedIn, login, logout }
})

184
src/views/Login.vue Normal file
View File

@ -0,0 +1,184 @@
<template>
<div class="container">
<div class="content">
<div class="left">
<p>面向数据样品贡献方需求构建用户体验良好的数据样品目录信息平台</p>
<p>提供便捷安全的数据录入统计分析和可视化检索工具服务数据样品贡献者资助机构和管理机构</p>
</div>
<div class="card">
<div class="login_img">
<img src="@/assets/login_logo.png" alt="">
</div>
<div class="form">
<div class="input">
<img src="@/assets/icon_user.png" alt="">
<input v-model="loginName" type="text" placeholder="请输入用户名">
</div>
<div class="input">
<img src="@/assets/icon_pwd.png" alt="">
<input v-model="loginPass" type="password" placeholder="请输入密码">
</div>
</div>
<div class="btn">
<el-button @click="onReset">重置</el-button>
<el-button type="primary" @click="onLogin">登录</el-button>
</div>
</div>
</div>
</div>
</template>
<script setup>
import { login } from '@/api/task.js'
import { ref, onMounted } from 'vue'
import md5 from 'md5'
import { ElMessage } from 'element-plus'
import { useRouter } from 'vue-router';
import { useAuthStore } from '@/store/authStore'
const router = useRouter();
const authStore = useAuthStore()
const loginName = ref('')
const loginPass = ref('')
onMounted(() => {
// 访
if (authStore.isLoggedIn) {
router.push('/')
}
})
const onReset = () => {
loginName.value = ''
loginPass.value = ''
}
const onLogin = () => {
if (!loginName.value) return ElMessage('请输入用户名')
if (!loginPass.value) return ElMessage('请输入密码')
login({
loginName: loginName.value,
loginPass: md5(loginPass.value)
}).then(res => {
if (res.success) {
// 使 store
authStore.login(res.entity)
ElMessage.success('登录成功')
router.push('/')
} else {
ElMessage.error(res.message || '登录失败')
}
})
}
</script>
<style lang="scss" scoped>
.container {
width: 100%;
height: 100vh;
background: url(@/assets/loginBg.jpg) center no-repeat;
background-size: cover;
display: flex;
justify-content: center;
align-items: center;
.content {
max-width: 1400px;
width: 100%;
display: flex;
align-items: center;
justify-content: space-between;
.left {
width: 50%;
height: auto;
display: flex;
flex-direction: column;
p {
font-size: 26px;
color: #fff;
line-height: 50px;
}
}
.card {
width: 540px;
background: #fff;
border-radius: 10px;
box-sizing: border-box;
padding: 45px;
display: flex;
flex-direction: column;
.login_img {
margin-bottom: 30px;
width: 100%;
height: auto;
display: flex;
align-items: center;
justify-content: center;
img {
width: auto;
height: auto;
}
}
.form {
width: 100%;
height: auto;
display: flex;
flex-direction: column;
align-items: center;
.input {
margin-bottom: 15px;
width: 100%;
height: 60px;
border: 1px solid #eeeeee;
border-radius: 5px;
box-sizing: border-box;
padding: 20px;
display: flex;
align-items: center;
img {
width: auto;
height: auto;
display: block;
margin-right: 25px;
}
input {
width: 90%;
height: auto;
border: none;
background: none;
outline: none;
font-size: 16px;
color: #666;
}
}
}
.btn {
width: 100%;
height: 60px;
display: flex;
align-items: center;
justify-content: space-between;
margin-top: 20px;
margin-bottom: 40px;
.el-button {
width: 48%;
height: 50px;
font-size: 18px;
}
}
}
}
}
</style>

111
yarn.lock
View File

@ -209,6 +209,33 @@
resolved "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-6.6.4.tgz"
integrity sha512-sGhTPMuXqZ1rVOk32RylztWkfXTRhuS7vgAKv0zjqk8gbsHkJ7xfFf+jbySxt7tWObEJwyKaHMikV/WGDiQm8g==
"@vue/devtools-api@^7.7.2":
version "7.7.7"
resolved "https://registry.npmmirror.com/@vue/devtools-api/-/devtools-api-7.7.7.tgz"
integrity sha512-lwOnNBH2e7x1fIIbVT7yF5D+YWhqELm55/4ZKf45R9T8r9dE2AIOy8HKjfqzGsoTHFbWbr337O4E0A0QADnjBg==
dependencies:
"@vue/devtools-kit" "^7.7.7"
"@vue/devtools-kit@^7.7.7":
version "7.7.7"
resolved "https://registry.npmmirror.com/@vue/devtools-kit/-/devtools-kit-7.7.7.tgz"
integrity sha512-wgoZtxcTta65cnZ1Q6MbAfePVFxfM+gq0saaeytoph7nEa7yMXoi6sCPy4ufO111B9msnw0VOWjPEFCXuAKRHA==
dependencies:
"@vue/devtools-shared" "^7.7.7"
birpc "^2.3.0"
hookable "^5.5.3"
mitt "^3.0.1"
perfect-debounce "^1.0.0"
speakingurl "^14.0.1"
superjson "^2.2.2"
"@vue/devtools-shared@^7.7.7":
version "7.7.7"
resolved "https://registry.npmmirror.com/@vue/devtools-shared/-/devtools-shared-7.7.7.tgz"
integrity sha512-+udSj47aRl5aKb0memBvcUG9koarqnxNM5yjuREvqwK6T3ap4mn3Zqqc17QrBFTqSMjr3HK1cvStEZpMDpfdyw==
dependencies:
rfdc "^1.4.1"
"@vue/language-core@2.2.8":
version "2.2.8"
resolved "https://registry.npmjs.org/@vue/language-core/-/language-core-2.2.8.tgz"
@ -317,6 +344,11 @@ balanced-match@^1.0.0:
resolved "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz"
integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==
birpc@^2.3.0:
version "2.5.0"
resolved "https://registry.npmmirror.com/birpc/-/birpc-2.5.0.tgz"
integrity sha512-VSWO/W6nNQdyP520F1mhf+Lc2f8pjGQOtoHHm7Ze8Go1kX7akpVIrtTa0fn+HB0QJEDVacl6aO08YE0PgXfdnQ==
bmaplib.curveline@^1.0.0:
version "1.0.0"
resolved "https://registry.npmmirror.com/bmaplib.curveline/-/bmaplib.curveline-1.0.0.tgz"
@ -366,6 +398,11 @@ call-bind-apply-helpers@^1.0.1, call-bind-apply-helpers@^1.0.2:
es-errors "^1.3.0"
function-bind "^1.1.2"
charenc@0.0.2:
version "0.0.2"
resolved "https://registry.npmmirror.com/charenc/-/charenc-0.0.2.tgz"
integrity sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA==
chokidar@^4.0.0:
version "4.0.3"
resolved "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz"
@ -380,6 +417,18 @@ combined-stream@^1.0.8:
dependencies:
delayed-stream "~1.0.0"
copy-anything@^3.0.2:
version "3.0.5"
resolved "https://registry.npmmirror.com/copy-anything/-/copy-anything-3.0.5.tgz"
integrity sha512-yCEafptTtb4bk7GLEQoM8KVJpxAfdBJYaXyzQEgQQQgYrZiDp8SJmGKlYza6CYjEDNstAdNdKA3UuoULlEbS6w==
dependencies:
is-what "^4.1.8"
crypt@0.0.2:
version "0.0.2"
resolved "https://registry.npmmirror.com/crypt/-/crypt-0.0.2.tgz"
integrity sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow==
csstype@^3.1.3:
version "3.1.3"
resolved "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz"
@ -586,11 +635,21 @@ he@^1.2.0:
resolved "https://registry.npmjs.org/he/-/he-1.2.0.tgz"
integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==
hookable@^5.5.3:
version "5.5.3"
resolved "https://registry.npmmirror.com/hookable/-/hookable-5.5.3.tgz"
integrity sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ==
immutable@^5.0.2:
version "5.1.1"
resolved "https://registry.npmjs.org/immutable/-/immutable-5.1.1.tgz"
integrity sha512-3jatXi9ObIsPGr3N5hGw/vWWcTkq6hUYhpQz4k0wLC+owqWi/LiugIw9x0EdNZ2yGedKN/HzePiBvaJRXa0Ujg==
is-buffer@~1.1.6:
version "1.1.6"
resolved "https://registry.npmmirror.com/is-buffer/-/is-buffer-1.1.6.tgz"
integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==
is-extglob@^2.1.1:
version "2.1.1"
resolved "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz"
@ -608,6 +667,11 @@ is-number@^7.0.0:
resolved "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz"
integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==
is-what@^4.1.8:
version "4.1.16"
resolved "https://registry.npmmirror.com/is-what/-/is-what-4.1.16.tgz"
integrity sha512-ZhMwEosbFJkA0YhFnNDgTM4ZxDRsS6HqTo7qsZM08fehyRYIYa0yHu5R6mgo1n/8MgaPBXiPimPD77baVFYg+A==
lodash-es@*, lodash-es@^4.17.21:
version "4.17.21"
resolved "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz"
@ -635,6 +699,15 @@ math-intrinsics@^1.1.0:
resolved "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz"
integrity sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==
md5@^2.3.0:
version "2.3.0"
resolved "https://registry.npmmirror.com/md5/-/md5-2.3.0.tgz"
integrity sha512-T1GITYmFaKuO91vxyoQMFETst+O71VUPEU3ze5GNzDm0OWdP8v1ziTaAEPUr/3kLsY3Sftgz242A1SetQiDL7g==
dependencies:
charenc "0.0.2"
crypt "0.0.2"
is-buffer "~1.1.6"
memoize-one@^6.0.0:
version "6.0.0"
resolved "https://registry.npmjs.org/memoize-one/-/memoize-one-6.0.0.tgz"
@ -667,6 +740,11 @@ minimatch@^9.0.3:
dependencies:
brace-expansion "^2.0.1"
mitt@^3.0.1:
version "3.0.1"
resolved "https://registry.npmmirror.com/mitt/-/mitt-3.0.1.tgz"
integrity sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==
muggle-string@^0.4.1:
version "0.4.1"
resolved "https://registry.npmjs.org/muggle-string/-/muggle-string-0.4.1.tgz"
@ -692,6 +770,11 @@ path-browserify@^1.0.1:
resolved "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz"
integrity sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==
perfect-debounce@^1.0.0:
version "1.0.0"
resolved "https://registry.npmmirror.com/perfect-debounce/-/perfect-debounce-1.0.0.tgz"
integrity sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA==
picocolors@^1.1.1:
version "1.1.1"
resolved "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz"
@ -702,6 +785,13 @@ picomatch@^2.3.1:
resolved "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz"
integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==
pinia@^3.0.3:
version "3.0.3"
resolved "https://registry.npmmirror.com/pinia/-/pinia-3.0.3.tgz"
integrity sha512-ttXO/InUULUXkMHpTdp9Fj4hLpD/2AoJdmAbAeW2yu1iy1k+pkFekQXw5VpC0/5p51IOR/jDaDRfRWRnMMsGOA==
dependencies:
"@vue/devtools-api" "^7.7.2"
postcss@^8.4.43, postcss@^8.4.48:
version "8.5.3"
resolved "https://registry.npmjs.org/postcss/-/postcss-8.5.3.tgz"
@ -721,6 +811,11 @@ readdirp@^4.0.1:
resolved "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz"
integrity sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==
rfdc@^1.4.1:
version "1.4.1"
resolved "https://registry.npmmirror.com/rfdc/-/rfdc-1.4.1.tgz"
integrity sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==
rollup@^4.20.0:
version "4.40.0"
resolved "https://registry.npmjs.org/rollup/-/rollup-4.40.0.tgz"
@ -766,6 +861,18 @@ source-map-js@^1.2.0, source-map-js@^1.2.1, "source-map-js@>=0.6.2 <2.0.0":
resolved "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz"
integrity sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==
speakingurl@^14.0.1:
version "14.0.1"
resolved "https://registry.npmmirror.com/speakingurl/-/speakingurl-14.0.1.tgz"
integrity sha512-1POYv7uv2gXoyGFpBCmpDVSNV74IfsWlDW216UPjbWufNf+bSU6GdbDsxdcxtfwb4xlI3yxzOTKClUosxARYrQ==
superjson@^2.2.2:
version "2.2.2"
resolved "https://registry.npmmirror.com/superjson/-/superjson-2.2.2.tgz"
integrity sha512-5JRxVqC8I8NuOUjzBbvVJAKNM8qoVuH0O77h4WInc/qC2q5IreqKxYwgkga3PfA22OayK2ikceb/B26dztPl+Q==
dependencies:
copy-anything "^3.0.2"
tiny-emitter@^2.1.0:
version "2.1.0"
resolved "https://registry.npmmirror.com/tiny-emitter/-/tiny-emitter-2.1.0.tgz"
@ -778,7 +885,7 @@ to-regex-range@^5.0.1:
dependencies:
is-number "^7.0.0"
typescript@*, typescript@^5.5.3, typescript@>=5.0.0:
typescript@*, typescript@^5.5.3, typescript@>=4.4.4, typescript@>=5.0.0:
version "5.8.3"
resolved "https://registry.npmjs.org/typescript/-/typescript-5.8.3.tgz"
integrity sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==
@ -833,7 +940,7 @@ vue-tsc@^2.1.4:
"@volar/typescript" "~2.4.11"
"@vue/language-core" "2.2.8"
"vue@^3.0.0-0 || ^2.6.0", vue@^3.2.0, vue@^3.2.25, vue@^3.4.38, vue@3.5.13:
"vue@^2.7.0 || ^3.5.11", "vue@^3.0.0-0 || ^2.6.0", vue@^3.2.0, vue@^3.2.25, vue@^3.4.38, vue@3.5.13:
version "3.5.13"
resolved "https://registry.npmjs.org/vue/-/vue-3.5.13.tgz"
integrity sha512-wmeiSMxkZCSc+PM2w2VRsOYAZC8GdipNFRTsLSfodVqI9mbejKeXEGr8SckuLnrQPGe3oJN5c3K0vpoU9q/wCQ==