Compare commits
20
Commits
12f9726814
...
main
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
0267fac3a1 | ||
|
|
01fb8bb7c2 | ||
|
|
d20dc84d9d | ||
|
|
c1be93739d | ||
|
|
370ec61f3d | ||
|
|
e0d967f736 | ||
|
|
a27291d82b | ||
|
|
2e5203c69a | ||
|
|
5e254af81f | ||
|
|
c7b5ef75a3 | ||
|
|
72a20a3825 | ||
|
|
9f8dfe3893 | ||
|
|
315916d027 | ||
|
|
6e0a416422 | ||
|
|
759caf5fb2 | ||
|
|
03212f9854 | ||
|
|
d61b5e8a52 | ||
|
|
89c138cedf | ||
|
|
0ba17ace6f | ||
|
|
0e4ccae5d3 |
No files matched your search
@@ -0,0 +1,29 @@
|
||||
# 自动发布GitHub Action
|
||||
|
||||
这个GitHub Action工作流会在每次推送代码到`main`分支时自动创建一个新的发布版本,使用Debian 12环境进行构建。
|
||||
|
||||
## 工作流程
|
||||
|
||||
1. 当代码推送到`main`分支时,工作流自动触发
|
||||
2. 使用Debian 12容器作为构建环境
|
||||
3. 安装必要的系统依赖(git、curl、nodejs等)
|
||||
4. 检出代码并设置Node.js和PNPM环境
|
||||
5. 安装项目依赖并构建项目
|
||||
6. 将构建输出(.output目录)打包为output.tar.gz
|
||||
7. 从package.json中获取版本号
|
||||
8. 计算提交次数并将其添加到版本号中
|
||||
9. 生成更新日志(从上一个标签到当前提交的所有变更)
|
||||
10. 创建GitHub Release,包括:
|
||||
- 版本标签(格式:v版本号.提交次数,例如v0.1.0.42)
|
||||
- 自动生成的更新日志
|
||||
- 构建输出压缩包(output.tar.gz)
|
||||
|
||||
## 使用方法
|
||||
|
||||
无需手动操作,只需将代码推送到`main`分支,GitHub Action将自动执行并创建新的发布版本。
|
||||
|
||||
如果需要更改发布版本号,请修改`package.json`文件中的`version`字段。
|
||||
|
||||
## 环境兼容性
|
||||
|
||||
构建过程在Debian 12环境中进行,确保生成的输出文件与目标部署环境(Debian 12)完全兼容。
|
||||
@@ -0,0 +1,84 @@
|
||||
name: Auto Release
|
||||
|
||||
on:
|
||||
push:
|
||||
branches: [main]
|
||||
|
||||
jobs:
|
||||
build-and-release:
|
||||
runs-on: ubuntu-latest
|
||||
container:
|
||||
image: debian:12
|
||||
env:
|
||||
DOCKER_DEFAULT_PLATFORM: linux/amd64
|
||||
permissions:
|
||||
contents: write
|
||||
steps:
|
||||
- name: Install dependencies for Git and Node.js
|
||||
run: |
|
||||
apt-get update
|
||||
apt-get install -y git curl wget nodejs npm tar gzip
|
||||
|
||||
- name: Checkout code
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
fetch-depth: 0
|
||||
|
||||
- name: Configure Git safe directory
|
||||
run: git config --global --add safe.directory /__w/miaoBlog/miaoBlog
|
||||
|
||||
- name: Setup Node.js
|
||||
uses: actions/setup-node@v4
|
||||
with:
|
||||
node-version: 'lts/*'
|
||||
|
||||
- name: Setup PNPM
|
||||
uses: pnpm/action-setup@v2
|
||||
with:
|
||||
version: 9
|
||||
|
||||
- name: Install dependencies
|
||||
run: pnpm install
|
||||
|
||||
- name: Build project
|
||||
run: pnpm build
|
||||
|
||||
- name: Create output.tar.gz
|
||||
run: tar -czvf output.tar.gz .output/
|
||||
|
||||
- name: Get version from package.json
|
||||
id: package-version
|
||||
run: echo "VERSION=$(node -p "require('./package.json').version || '0.1.0'")" >> $GITHUB_ENV
|
||||
|
||||
- name: Get commit count
|
||||
id: commit-count
|
||||
run: echo "COUNT=$(git rev-list --count HEAD)" >> $GITHUB_ENV
|
||||
|
||||
- name: Create release version
|
||||
id: release-version
|
||||
run: echo "RELEASE_VERSION=v${{ env.VERSION }}.${{ env.COUNT }}" >> $GITHUB_ENV
|
||||
|
||||
- name: Generate changelog
|
||||
id: changelog
|
||||
run: |
|
||||
PREVIOUS_TAG=$(git describe --tags --abbrev=0 2>/dev/null || echo "")
|
||||
if [ -z "$PREVIOUS_TAG" ]; then
|
||||
git log --pretty=format:"* %s (%h)" > CHANGELOG.md
|
||||
else
|
||||
git log ${PREVIOUS_TAG}..HEAD --pretty=format:"* %s (%h)" > CHANGELOG.md
|
||||
fi
|
||||
echo "CHANGELOG_PATH=CHANGELOG.md" >> $GITHUB_ENV
|
||||
|
||||
- name: Create GitHub Release
|
||||
uses: softprops/action-gh-release@v1
|
||||
with:
|
||||
tag_name: ${{ env.RELEASE_VERSION }}
|
||||
name: Release ${{ env.RELEASE_VERSION }}
|
||||
body_path: ${{ env.CHANGELOG_PATH }}
|
||||
draft: false
|
||||
prerelease: false
|
||||
token: ${{ secrets.GITHUB_TOKEN }}
|
||||
files: |
|
||||
output.tar.gz
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
@@ -2,7 +2,7 @@
|
||||
|
||||
# 接下来的计划
|
||||
|
||||
- 用户密码哈希存储
|
||||
- 文章表增加对最后编辑时间的支持与对加密的支持
|
||||
- 用户密码哈希存储(👌)
|
||||
- 文章表增加对最后编辑时间的支持与对加密的支持(没啥用感觉)
|
||||
- 美化markdown的渲染 (👌)
|
||||
- 迁移仓库到gitea (👌)
|
||||
@@ -13,6 +13,7 @@
|
||||
import miaoHeader from './components/miaoHeader.vue';
|
||||
import miaoContentWrapper from './components/miaoContentWrapper.vue';
|
||||
import "/style/default.scss";
|
||||
import "/style/tailwind.css"
|
||||
|
||||
// @ts-ignore
|
||||
useHead({
|
||||
|
||||
@@ -1,10 +1,14 @@
|
||||
<template>
|
||||
<div class="cm-rander-wrapper">
|
||||
<div :class="wrapperClass">
|
||||
<div class="cm-header">
|
||||
<div class="cm-header-title">
|
||||
<span>CodeMirror</span>
|
||||
<span>{{ props.type ?? 'CodeMirror' }}</span>
|
||||
</div>
|
||||
<div class="cm-header-controls">
|
||||
<div class="cm-header-controls-copy" :class="{ 'cm-header-controls-copy-hide': !show }"
|
||||
@click="copyCode">
|
||||
复制
|
||||
</div>
|
||||
<div class="cm-switch-show-hide" @click="show = !show">
|
||||
{{ show ? '收起' : '展开' }}
|
||||
</div>
|
||||
@@ -26,6 +30,7 @@ import { EditorState } from "@codemirror/state"
|
||||
const props = defineProps<{
|
||||
data: string,
|
||||
type?: string,
|
||||
inline?: boolean,
|
||||
}>()
|
||||
|
||||
const show = ref(true)
|
||||
@@ -33,14 +38,18 @@ const cmRootRef = ref<HTMLElement>()
|
||||
|
||||
const isLoading = ref(true)
|
||||
|
||||
const wrapperClass = computed(() => {
|
||||
return ['cm-rander-wrapper', props.inline === true ? 'cm-rander-wrapper-inline' : '']
|
||||
})
|
||||
|
||||
const rows = computed(() => {
|
||||
if (!props.data) {
|
||||
return 5
|
||||
}
|
||||
const lines = props.data.split('\n')
|
||||
console.log({
|
||||
L: lines.length,
|
||||
})
|
||||
// console.log({
|
||||
// L: lines.length,
|
||||
// })
|
||||
return lines.length - 2 > 0 ? lines.length - 2 : 1
|
||||
})
|
||||
|
||||
@@ -101,6 +110,11 @@ const useLangExtensions = async () => {
|
||||
}
|
||||
}
|
||||
|
||||
const copyCode = () => {
|
||||
navigator.clipboard.writeText(props.data)
|
||||
ElMessage.success('复制成功')
|
||||
}
|
||||
|
||||
let cm: EditorView
|
||||
|
||||
onMounted(async () => {
|
||||
@@ -135,6 +149,18 @@ onBeforeUnmount(() => {
|
||||
|
||||
<style lang="scss">
|
||||
.cm-rander-wrapper {
|
||||
&-inline {
|
||||
display: inline-block;
|
||||
|
||||
.cm-header {
|
||||
display: none !important;
|
||||
}
|
||||
|
||||
.cm-gutters {
|
||||
display: none !important;
|
||||
}
|
||||
}
|
||||
|
||||
.cm-header {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
@@ -147,6 +173,23 @@ onBeforeUnmount(() => {
|
||||
user-select: none;
|
||||
|
||||
.cm-header-controls {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 10px;
|
||||
|
||||
.cm-header-controls-copy {
|
||||
cursor: pointer;
|
||||
color: #fff;
|
||||
fill: #fff;
|
||||
transition: all 0.2s ease;
|
||||
opacity: 1;
|
||||
}
|
||||
|
||||
.cm-header-controls-copy-hide {
|
||||
pointer-events: none;
|
||||
opacity: 0;
|
||||
}
|
||||
|
||||
.cm-switch-show-hide {
|
||||
cursor: pointer;
|
||||
color: #fff;
|
||||
|
||||
+180
-46
@@ -2,72 +2,43 @@
|
||||
|
||||
<template>
|
||||
<div class="md-render-wrapper markdown-body">
|
||||
<!-- <div v-html="renderedData" :key="_key"></div> -->
|
||||
<VNodeArr></VNodeArr>
|
||||
<VNodeMD v-if="VNodeMD && props.data"></VNodeMD>
|
||||
<div v-else>
|
||||
<el-skeleton v-if="!props.disableSkeleton" :rows="12" />
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script setup lang="ts">
|
||||
import codemirrorMiddleware from '~/hooks/h2v/codemirrorMiddleware';
|
||||
import useMarkdownit from '~/hooks/useMarkdownit';
|
||||
import Html2VNode from '~/utils/html2VNode';
|
||||
import codeMirror from './codeMirror.vue';
|
||||
|
||||
const props = defineProps<{
|
||||
data: string
|
||||
disableSkeleton?: boolean
|
||||
}>()
|
||||
|
||||
const _key = ref(Math.random())
|
||||
const VNodeMD = shallowRef<any>()
|
||||
|
||||
const markdownIt = await useMarkdownit()
|
||||
|
||||
const VNodeArr = computed(() => {
|
||||
watch(() => props.data, async () => {
|
||||
if (!props.data) {
|
||||
return () => []
|
||||
}
|
||||
const markdownIt = await useMarkdownit()
|
||||
const renderedData = markdownIt.render(props.data)
|
||||
const h2v = new Html2VNode()
|
||||
h2v.use(
|
||||
{
|
||||
filter(tagName) {
|
||||
return tagName === 'code'
|
||||
},
|
||||
rander({
|
||||
item,
|
||||
// tagName,
|
||||
tagAttrs,
|
||||
// middlewareMap
|
||||
}) {
|
||||
// console.log({
|
||||
// tagName,
|
||||
// tagAttrs,
|
||||
// })
|
||||
const codeType = tagAttrs?.class?.slice(1, -1)?.split('-')?.[1] ?? ''
|
||||
// console.log({
|
||||
// codeType,
|
||||
// })
|
||||
return h(
|
||||
codeMirror,
|
||||
{
|
||||
// @ts-ignore
|
||||
data: item.children[0].children.trim(),
|
||||
type: codeType,
|
||||
},
|
||||
)
|
||||
},
|
||||
}
|
||||
)
|
||||
const res = h2v.rander(renderedData)
|
||||
return {
|
||||
h2v.use(codemirrorMiddleware)
|
||||
const res = await h2v.render(renderedData)
|
||||
VNodeMD.value = {
|
||||
setup: () => {
|
||||
return () => res
|
||||
},
|
||||
}
|
||||
}, {
|
||||
immediate: true
|
||||
})
|
||||
|
||||
// watch(() => renderedData.value, () => {
|
||||
// _key.value = Math.random()
|
||||
// })
|
||||
|
||||
</script>
|
||||
|
||||
<style lang="scss">
|
||||
@@ -85,11 +56,174 @@ const VNodeArr = computed(() => {
|
||||
|
||||
hr {
|
||||
display: block;
|
||||
margin: 0;
|
||||
margin: 1em 0;
|
||||
padding-top: 1em;
|
||||
unicode-bidi: isolate;
|
||||
overflow: hidden;
|
||||
border-style: inset;
|
||||
border-width: 0;
|
||||
height: auto;
|
||||
}
|
||||
|
||||
/* 恢复标题样式 */
|
||||
h1,
|
||||
h2,
|
||||
h3,
|
||||
h4,
|
||||
h5,
|
||||
h6 {
|
||||
margin-top: 1em;
|
||||
margin-bottom: 0.5em;
|
||||
font-weight: bold;
|
||||
line-height: 1.25;
|
||||
color: #111;
|
||||
}
|
||||
|
||||
h1 {
|
||||
font-size: 2em;
|
||||
border-bottom: 1px solid #eaecef;
|
||||
padding-bottom: 0.3em;
|
||||
}
|
||||
|
||||
h2 {
|
||||
font-size: 1.5em;
|
||||
border-bottom: 1px solid #eaecef;
|
||||
padding-bottom: 0.3em;
|
||||
}
|
||||
|
||||
h3 {
|
||||
font-size: 1.25em;
|
||||
}
|
||||
|
||||
h4 {
|
||||
font-size: 1em;
|
||||
}
|
||||
|
||||
h5 {
|
||||
font-size: 0.875em;
|
||||
}
|
||||
|
||||
h6 {
|
||||
font-size: 0.85em;
|
||||
color: #6a737d;
|
||||
}
|
||||
|
||||
/* 恢复段落样式 */
|
||||
p {
|
||||
margin-top: 0;
|
||||
margin-bottom: 1em;
|
||||
line-height: 1.6;
|
||||
}
|
||||
|
||||
/* 恢复列表样式 */
|
||||
ul,
|
||||
ol {
|
||||
margin-top: 0;
|
||||
margin-bottom: 1em;
|
||||
padding-left: 2em;
|
||||
}
|
||||
|
||||
ul {
|
||||
list-style-type: disc;
|
||||
}
|
||||
|
||||
ol {
|
||||
list-style-type: decimal;
|
||||
}
|
||||
|
||||
li {
|
||||
margin-bottom: 0.25em;
|
||||
}
|
||||
|
||||
li>ul,
|
||||
li>ol {
|
||||
margin-top: 0.25em;
|
||||
margin-bottom: 0;
|
||||
}
|
||||
|
||||
/* 恢复链接样式 */
|
||||
a {
|
||||
color: #0366d6;
|
||||
text-decoration: none;
|
||||
|
||||
&:hover {
|
||||
text-decoration: underline;
|
||||
}
|
||||
}
|
||||
|
||||
/* 恢复引用块样式 */
|
||||
blockquote {
|
||||
margin: 0 0 1em;
|
||||
padding: 0 1em;
|
||||
color: #6a737d;
|
||||
border-left: 0.25em solid #dfe2e5;
|
||||
|
||||
> :first-child {
|
||||
margin-top: 0;
|
||||
}
|
||||
|
||||
> :last-child {
|
||||
margin-bottom: 0;
|
||||
}
|
||||
}
|
||||
|
||||
/* 恢复表格样式 */
|
||||
table {
|
||||
display: block;
|
||||
width: 100%;
|
||||
overflow: auto;
|
||||
margin-top: 0;
|
||||
margin-bottom: 1em;
|
||||
border-spacing: 0;
|
||||
border-collapse: collapse;
|
||||
}
|
||||
|
||||
th {
|
||||
font-weight: 600;
|
||||
padding: 6px 13px;
|
||||
border: 1px solid #dfe2e5;
|
||||
}
|
||||
|
||||
td {
|
||||
padding: 6px 13px;
|
||||
border: 1px solid #dfe2e5;
|
||||
}
|
||||
|
||||
tr {
|
||||
background-color: #fff;
|
||||
border-top: 1px solid #c6cbd1;
|
||||
|
||||
&:nth-child(2n) {
|
||||
background-color: #f6f8fa;
|
||||
}
|
||||
}
|
||||
|
||||
/* 恢复行内代码样式 */
|
||||
code:not(pre code) {
|
||||
padding: 0.2em 0.4em;
|
||||
margin: 0;
|
||||
font-size: 85%;
|
||||
background-color: rgba(27, 31, 35, 0.05);
|
||||
border-radius: 3px;
|
||||
font-family: SFMono-Regular, Consolas, Liberation Mono, Menlo, monospace;
|
||||
}
|
||||
|
||||
/* 恢复图片样式 */
|
||||
img {
|
||||
max-width: 100%;
|
||||
box-sizing: border-box;
|
||||
background-color: #fff;
|
||||
}
|
||||
|
||||
/* 恢复预格式化文本样式 */
|
||||
pre {
|
||||
padding: 16px;
|
||||
overflow: auto;
|
||||
font-size: 85%;
|
||||
line-height: 1.45;
|
||||
background-color: #f6f8fa;
|
||||
border-radius: 3px;
|
||||
margin-top: 0;
|
||||
margin-bottom: 1em;
|
||||
word-wrap: normal;
|
||||
}
|
||||
}
|
||||
</style>
|
||||
@@ -6,72 +6,70 @@
|
||||
|
||||
<script setup lang="ts">
|
||||
import QRCode from 'qrcode';
|
||||
import jsqrgb from 'jsqrgb';
|
||||
import { onMounted, ref, watchEffect } from 'vue';
|
||||
|
||||
const props = defineProps<{
|
||||
value: string
|
||||
value: string | Uint8Array,
|
||||
width?: number
|
||||
}>()
|
||||
|
||||
const width = ref(600)
|
||||
const width = ref(props.width ?? 600)
|
||||
|
||||
const canvasRefRGB = ref<HTMLCanvasElement>()
|
||||
|
||||
const generateQRCodeCanvasData = (data: string) => {
|
||||
const generateQRCodeCanvasData = (data: Uint8Array) => {
|
||||
const canvas = document.createElement('canvas')
|
||||
canvas.width = width.value
|
||||
canvas.height = width.value
|
||||
const ctx = canvas.getContext('2d')!
|
||||
QRCode.toCanvas(canvas, [{ data: new TextEncoder().encode(data), mode: 'byte' }], {
|
||||
QRCode.toCanvas(canvas, [{ data, mode: 'byte' }], {
|
||||
width: width.value,
|
||||
})
|
||||
const imageData = ctx.getImageData(0, 0, width.value, width.value)
|
||||
return imageData
|
||||
}
|
||||
|
||||
const paddingData = (data: string) => {
|
||||
const b64Data = btoa(data)
|
||||
if (b64Data.length % 3 === 0) {
|
||||
return b64Data + '012'
|
||||
} else if (b64Data.length % 3 === 1) {
|
||||
return b64Data + '01'
|
||||
} else {
|
||||
return b64Data + '0'
|
||||
}
|
||||
const paddingData = (data: Uint8Array) => {
|
||||
return new Uint8Array([...data, ...new Array(3 - data.length % 3).fill(0).map((_, i) => i)])
|
||||
}
|
||||
|
||||
onMounted(() => {
|
||||
watchEffect(() => {
|
||||
const padedData = paddingData(props.value)
|
||||
const data = {
|
||||
r: padedData.slice(0, padedData.length / 3),
|
||||
g: padedData.slice(padedData.length / 3, padedData.length / 3 * 2),
|
||||
b: padedData.slice(padedData.length / 3 * 2, padedData.length)
|
||||
}
|
||||
// console.log({
|
||||
// data,
|
||||
// ECData: {
|
||||
// r: new TextEncoder().encode(data.r),
|
||||
// g: new TextEncoder().encode(data.g),
|
||||
// b: new TextEncoder().encode(data.b)
|
||||
// }
|
||||
// })
|
||||
const imgData = {
|
||||
r: generateQRCodeCanvasData(data.r),
|
||||
g: generateQRCodeCanvasData(data.g),
|
||||
b: generateQRCodeCanvasData(data.b)
|
||||
}
|
||||
const rgbImgData = new ImageData(width.value, width.value)
|
||||
for (let i = 0; i < rgbImgData.data.length; i += 4) {
|
||||
rgbImgData.data[i] = imgData.r.data[i]
|
||||
rgbImgData.data[i + 1] = imgData.g.data[i + 1]
|
||||
rgbImgData.data[i + 2] = imgData.b.data[i + 2]
|
||||
rgbImgData.data[i + 3] = 2 << 8 - 1
|
||||
}
|
||||
const u8iData = props.value instanceof Uint8Array ? props.value : new TextEncoder().encode(props.value)
|
||||
const imgData = jsqrgb.generate(u8iData, {
|
||||
size: 600
|
||||
})
|
||||
const canvas = canvasRefRGB.value!
|
||||
canvas.width = width.value
|
||||
canvas.height = width.value
|
||||
const ctx = canvas.getContext('2d')!
|
||||
ctx.putImageData(rgbImgData, 0, 0)
|
||||
ctx.putImageData(imgData, 0, 0)
|
||||
return
|
||||
|
||||
// const padedData = paddingData(u8iData)
|
||||
// const data = {
|
||||
// r: padedData.slice(0, padedData.length / 3),
|
||||
// g: padedData.slice(padedData.length / 3, padedData.length / 3 * 2),
|
||||
// b: padedData.slice(padedData.length / 3 * 2, padedData.length)
|
||||
// }
|
||||
// const imgData = {
|
||||
// r: generateQRCodeCanvasData(data.r),
|
||||
// g: generateQRCodeCanvasData(data.g),
|
||||
// b: generateQRCodeCanvasData(data.b)
|
||||
// }
|
||||
// const rgbImgData = new ImageData(width.value, width.value)
|
||||
// for (let i = 0; i < rgbImgData.data.length; i += 4) {
|
||||
// rgbImgData.data[i] = imgData.r.data[i]
|
||||
// rgbImgData.data[i + 1] = imgData.g.data[i + 1]
|
||||
// rgbImgData.data[i + 2] = imgData.b.data[i + 2]
|
||||
// rgbImgData.data[i + 3] = 2 << 8 - 1
|
||||
// }
|
||||
// const canvas = canvasRefRGB.value!
|
||||
// canvas.width = width.value
|
||||
// canvas.height = width.value
|
||||
// const ctx = canvas.getContext('2d')!
|
||||
// ctx.putImageData(rgbImgData, 0, 0)
|
||||
})
|
||||
})
|
||||
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
</el-input>
|
||||
</el-col>
|
||||
<el-col :span="12">
|
||||
<el-input-tag v-model:model-value="tags" placeholder="添加标签" :disabled="disabled"/>
|
||||
<el-input-tag v-model:model-value="tags" placeholder="添加标签" :disabled="disabled" />
|
||||
</el-col>
|
||||
</el-row>
|
||||
<el-row>
|
||||
@@ -18,7 +18,31 @@
|
||||
</el-input>
|
||||
</el-col>
|
||||
</el-row>
|
||||
<el-input type="textarea" v-model:model-value="content" placeholder="content" :autosize="{ minRows: 15 }" :disabled="disabled"/>
|
||||
<el-row>
|
||||
<el-col :span="16"></el-col>
|
||||
<el-col :span="8">
|
||||
<div
|
||||
class="switch-button overflow-hidden z-10 border-0 border-gray-300 rounded-bl-sm rounded-tr-sm flex select-none">
|
||||
<div class="switch-button-item" :class="{ 'switch-button-item-active': isEditing }"
|
||||
@click="isEditing = true">
|
||||
编辑
|
||||
</div>
|
||||
<div class="switch-button-item" :class="{ 'switch-button-item-active': !isEditing }"
|
||||
@click="isEditing = false">
|
||||
预览
|
||||
</div>
|
||||
</div>
|
||||
</el-col>
|
||||
</el-row>
|
||||
<el-row>
|
||||
<el-col>
|
||||
<el-input v-if="isEditing" type="textarea" v-model:model-value="content" placeholder="content"
|
||||
:autosize="{ minRows: 15 }" :disabled="disabled" />
|
||||
<div class=" border-1 border-gray-300 rounded-sm p-2" v-else>
|
||||
<markdown-render :data="content ?? ''" :disable-skeleton="true" />
|
||||
</div>
|
||||
</el-col>
|
||||
</el-row>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
@@ -33,6 +57,8 @@ const summary = defineModel<string>('summary')
|
||||
const tags = defineModel<string[]>('tags')
|
||||
const content = defineModel<string>('content')
|
||||
|
||||
const isEditing = ref(true)
|
||||
|
||||
</script>
|
||||
|
||||
<style scoped>
|
||||
@@ -42,3 +68,30 @@ const content = defineModel<string>('content')
|
||||
gap: 5px;
|
||||
}
|
||||
</style>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
.switch-button {
|
||||
|
||||
&-item {
|
||||
width: 50%;
|
||||
height: 100%;
|
||||
background-color: #fff;
|
||||
cursor: pointer;
|
||||
transition: all .15s ease;
|
||||
padding: 0 5px;
|
||||
|
||||
&:hover {
|
||||
background-color: #f0f0f0;
|
||||
}
|
||||
|
||||
&-active {
|
||||
color: #0077ff;
|
||||
background-color: #d3e7ff;
|
||||
|
||||
&:hover {
|
||||
background-color: #c3e0ff;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
</style>
|
||||
@@ -0,0 +1,28 @@
|
||||
const codemirrorMiddleware: middlewareType = {
|
||||
filter(tagName: string) {
|
||||
return tagName === 'code'
|
||||
},
|
||||
async render({
|
||||
item,
|
||||
tagAttrs,
|
||||
}) {
|
||||
const codeMirror = await cachedPromise('component:codeMirror', async () => {
|
||||
const codeMirror = (await import('~/components/codeMirror.vue')).default
|
||||
return codeMirror
|
||||
})
|
||||
const codeType = tagAttrs?.class?.slice(1, -1)?.split('-')?.[1] ?? ''
|
||||
// @ts-ignore
|
||||
const inline = (item.children[0].children.trim() as string).includes('\n') ? false : true
|
||||
return h(
|
||||
codeMirror,
|
||||
{
|
||||
// @ts-ignore
|
||||
data: item.children[0].children.trim(),
|
||||
type: codeType,
|
||||
inline,
|
||||
},
|
||||
)
|
||||
},
|
||||
}
|
||||
|
||||
export default codemirrorMiddleware
|
||||
@@ -56,6 +56,15 @@ export default function useFetch() {
|
||||
'Authorization': `Bearer ${userStore.token}`
|
||||
}
|
||||
}),
|
||||
deletePost: (id: number) => $fetch('/api/posts/deletePost', {
|
||||
body: {
|
||||
id
|
||||
},
|
||||
method: 'POST',
|
||||
headers: {
|
||||
'Authorization': `Bearer ${userStore.token}`
|
||||
}
|
||||
})
|
||||
},
|
||||
user: {
|
||||
login: (body: {
|
||||
|
||||
+2
-1
@@ -2,6 +2,7 @@
|
||||
// import Components from "unplugin-vue-components/vite";
|
||||
// import { ElementPlusResolver } from 'unplugin-vue-components/resolvers'
|
||||
import mkcert from "vite-plugin-mkcert";
|
||||
import tailwindcss from '@tailwindcss/vite'
|
||||
|
||||
|
||||
// https://nuxt.com/docs/api/configuration/nuxt-config
|
||||
@@ -21,7 +22,7 @@ export default defineNuxtConfig({
|
||||
server: {
|
||||
https: true,
|
||||
},
|
||||
plugins: [mkcert()],
|
||||
plugins: [mkcert(), tailwindcss()],
|
||||
},
|
||||
modules: ["@pinia/nuxt", '@element-plus/nuxt'],
|
||||
compatibilityDate: "2025-01-12",
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
{
|
||||
"name": "miao-blog",
|
||||
"private": true,
|
||||
"version": "1.1.0",
|
||||
"type": "module",
|
||||
"scripts": {
|
||||
"build": "nuxt build && bash ./aftBuild.sh",
|
||||
@@ -13,6 +14,7 @@
|
||||
"@codemirror/lang-javascript": "^6.2.2",
|
||||
"@codemirror/state": "^6.5.1",
|
||||
"@pinia/nuxt": "^0.9.0",
|
||||
"@tailwindcss/vite": "^4.0.5",
|
||||
"@types/node": "^22.10.5",
|
||||
"bcryptjs": "^2.4.3",
|
||||
"better-sqlite3": "11.3.0",
|
||||
@@ -20,11 +22,13 @@
|
||||
"dayjs": "^1.11.13",
|
||||
"jsonwebtoken": "^9.0.2",
|
||||
"jsqr": "^1.4.0",
|
||||
"jsqrgb": "^0.0.3",
|
||||
"markdown-it": "^14.1.0",
|
||||
"node-fetch": "^3.3.2",
|
||||
"nuxt": "^3.15.1",
|
||||
"pinia": "^2.3.0",
|
||||
"qrcode": "^1.5.4",
|
||||
"tailwindcss": "^4.0.5",
|
||||
"unplugin-auto-import": "^19.0.0",
|
||||
"unplugin-vue-components": "^28.0.0",
|
||||
"vue": "^3.4.21",
|
||||
|
||||
+32
-2
@@ -4,7 +4,7 @@
|
||||
<span>导航</span>
|
||||
</div>
|
||||
<div class="content-wrap">
|
||||
<div v-for="(item) in PageContent" :key="item.subTitle" class="content">
|
||||
<div v-for="(item) in pageContent" :key="item.subTitle" class="content">
|
||||
<div class="sub-title">
|
||||
<miao-divider-left>
|
||||
<div class="sub-title-wrapper">
|
||||
@@ -60,7 +60,7 @@ type ContentItem = {
|
||||
}[]
|
||||
}
|
||||
|
||||
const PageContent = reactive<PageContent[]>([
|
||||
const pageContent = reactive<PageContent[]>([
|
||||
{
|
||||
subTitle: '个人项目',
|
||||
show: true,
|
||||
@@ -89,6 +89,25 @@ const PageContent = reactive<PageContent[]>([
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
name: 'Bobj',
|
||||
description: '模块化的JS对象序列化库,名字完全抄袭至BSON',
|
||||
links: [
|
||||
{
|
||||
name: "github",
|
||||
url: "https://github.com/Zioywishing/bobj"
|
||||
}, {
|
||||
name: "npm",
|
||||
url: "https://www.npmjs.com/package/bobj"
|
||||
}
|
||||
],
|
||||
nuxtLinks: [
|
||||
{
|
||||
name: 'demo',
|
||||
to: `/iframe/${encodeURIComponent('/iframe-source/bobj-demo/index.html')}`
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
name: 'MiaoBlog',
|
||||
description: '施工中,不过最好不要抱有太大期待,毕竟还是以实现功能为目标去做的',
|
||||
@@ -158,6 +177,17 @@ const PageContent = reactive<PageContent[]>([
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
name: 'ES-Crypto',
|
||||
description: '结合浏览器fileSystem实现的加密小工具,再也不用担心内存爆掉了',
|
||||
nuxtLinks: [
|
||||
{
|
||||
name: 'demo',
|
||||
to: `/iframe/${encodeURIComponent('/iframe-source/es-crypto/index.html')}`
|
||||
}
|
||||
]
|
||||
|
||||
},
|
||||
]
|
||||
}, {
|
||||
subTitle: '学习资料',
|
||||
|
||||
@@ -1,6 +1,8 @@
|
||||
<template>
|
||||
<div class="user-wrapper">
|
||||
<Suspense>
|
||||
<NuxtPage />
|
||||
</Suspense>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
|
||||
+18
-23
@@ -1,6 +1,6 @@
|
||||
<template>
|
||||
<div class="posts-wrapper">
|
||||
<article class="posts-item" v-for="post in postsData" :key="post.id">
|
||||
<article class="posts-item" v-for="post in posts" :key="post.id">
|
||||
<header class="post-title">
|
||||
<nuxt-link :to="`/posts/post-${post.id}`">{{ post.title }}</nuxt-link>
|
||||
</header>
|
||||
@@ -12,13 +12,13 @@
|
||||
{{ formatDate(post.date, 'yy-MM-dd HH:mm:ss') }}
|
||||
</span>
|
||||
</div>
|
||||
<div class="post-tags">
|
||||
<div class="post-tags" v-if="post.tags.length">
|
||||
<bookmark class="post-tags-icon" />
|
||||
<div v-for="tag in post.tags">{{ tag }}</div>
|
||||
</div>
|
||||
</footer>
|
||||
</article>
|
||||
<div class="posts-skeleton" v-if="!isInit">
|
||||
<div class="posts-skeleton" v-if="pending && 0">
|
||||
<div class="posts-skeleton-item" v-for="_ in range(5)">
|
||||
<el-skeleton :rows="3" />
|
||||
</div>
|
||||
@@ -33,29 +33,24 @@ import bookmark from '~/components/icons/tag.vue'
|
||||
import type { postItem } from '~/types/post';
|
||||
|
||||
const store = useDefaultStore()
|
||||
const isInit = ref(false)
|
||||
|
||||
const postsData = ref<postItem[]>([])
|
||||
|
||||
const getData = async () => {
|
||||
const cache = store.getCache('posts')
|
||||
if (cache) {
|
||||
return cache as postItem[]
|
||||
// 使用useFetch在服务器端获取数据
|
||||
const { data, pending } = await useFetch<{ code: number, data: postItem[] }>('/api/posts/getPostList', {
|
||||
// 如果缓存中已有数据,优先使用缓存
|
||||
key: 'posts-list',
|
||||
transform: (response) => {
|
||||
if (response && response.data) {
|
||||
store.setCache('posts', response.data)
|
||||
return response
|
||||
}
|
||||
const response = await $fetch('/api/posts/getPostList')
|
||||
const res = response.data
|
||||
store.setCache('posts', res)
|
||||
return res
|
||||
}
|
||||
|
||||
onMounted(async () => {
|
||||
// router.push('/posts/temp')
|
||||
// await sleep(1000)
|
||||
postsData.value = await getData()
|
||||
isInit.value = true;
|
||||
// console.log(postsData.value)
|
||||
return { code: 0, data: [] }
|
||||
},
|
||||
// 添加以下选项
|
||||
lazy: true, // 避免客户端自动重新获取
|
||||
server: true, // 仅在服务器端获取数据
|
||||
})
|
||||
|
||||
// 从响应中提取文章列表
|
||||
const posts = computed(() => data.value?.data || []) as ComputedRef<postItem[]>
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
|
||||
+11
-50
@@ -1,9 +1,9 @@
|
||||
<template>
|
||||
<div class="md-wrapper">
|
||||
<div class="md" v-if="isInit">
|
||||
<div class="md-title">{{ title }}</div>
|
||||
<div class="md" v-if="!loading && postData">
|
||||
<div class="md-title">{{ postData.title }}</div>
|
||||
<div class="md-divider"></div>
|
||||
<markdown-render :data="content"></markdown-render>
|
||||
<markdown-render :data="postData.data"></markdown-render>
|
||||
</div>
|
||||
<div v-else class="md-skeleton-item">
|
||||
<el-skeleton :rows="12" />
|
||||
@@ -12,61 +12,22 @@
|
||||
</template>
|
||||
|
||||
<script setup lang="ts">
|
||||
import useMarkdownit from '~/hooks/useMarkdownit';
|
||||
import usePostStore from '~/hooks/pinia/usePostStore';
|
||||
import markdownRender from '~/components/markdownRender.vue';
|
||||
import type { postContent } from '~/types/post';
|
||||
|
||||
const postStore = usePostStore()
|
||||
|
||||
const markdownRender = shallowRef<any>()
|
||||
const route = useRoute()
|
||||
|
||||
const isInit = ref(false)
|
||||
|
||||
const title = ref('')
|
||||
|
||||
const content = ref('')
|
||||
|
||||
const renderedData = ref('')
|
||||
|
||||
const id = route.params.id as string
|
||||
|
||||
onMounted(async () => {
|
||||
const loading = ref(true)
|
||||
|
||||
const _p = new Promise<postContent>(async (resolve, reject) => {
|
||||
try {
|
||||
const cache = postStore.getPostCache(id)
|
||||
if (cache) {
|
||||
resolve(cache)
|
||||
return
|
||||
}
|
||||
const res = await $fetch('/api/posts/getPostContent', {
|
||||
method: 'POST',
|
||||
body: {
|
||||
id
|
||||
}
|
||||
}) as postContent
|
||||
postStore.setPostCache(id, res)
|
||||
resolve(res)
|
||||
} catch (error) {
|
||||
reject(error)
|
||||
}
|
||||
})
|
||||
|
||||
const markdownIt = await useMarkdownit()
|
||||
|
||||
const postsData = await _p
|
||||
|
||||
content.value = postsData.data
|
||||
|
||||
renderedData.value = markdownIt.render(postsData.data)
|
||||
|
||||
title.value = postsData.title
|
||||
|
||||
isInit.value = true
|
||||
const postData = ref<postContent>()
|
||||
|
||||
onBeforeMount(async () => {
|
||||
const postDataPromise = getPostData(Number(id))
|
||||
markdownRender.value = (await import('~/components/markdownRender.vue')).default
|
||||
postData.value = await postDataPromise
|
||||
loading.value = false
|
||||
})
|
||||
|
||||
</script>
|
||||
|
||||
<style scoped>
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
<template>
|
||||
<div>
|
||||
<div style="display: flex;flex-direction: column;align-items: center;">
|
||||
<miaoQRGBCode :value="testData"/>
|
||||
<div>{{ testData }}</div>
|
||||
<input type="text" v-model="testData">
|
||||
|
||||
@@ -1,20 +1,21 @@
|
||||
<template>
|
||||
<div class="qr-scanner-wrapper">
|
||||
<video ref="scannerDisplayRef"></video>
|
||||
<div>res: {{ res }}</div>
|
||||
<canvas ref="testCtx" style="transform: scale(.6);" v-show="true"></canvas>
|
||||
<canvas ref="testCtxR" style="transform: scale(.6);" v-show="true"></canvas>
|
||||
<canvas ref="testCtxG" style="transform: scale(.6);" v-show="true"></canvas>
|
||||
<canvas ref="testCtxB" style="transform: scale(.6);" v-show="true"></canvas>
|
||||
<div>{{ res }}</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script setup lang="ts">
|
||||
import jsQR from 'jsqr'
|
||||
import jsqrgb from 'jsqrgb';
|
||||
import { ref, onMounted, onBeforeUnmount } from 'vue';
|
||||
|
||||
const emit = defineEmits<{
|
||||
onResult: [value: string]
|
||||
onResult: [value: Uint8Array]
|
||||
}>()
|
||||
|
||||
const scannerDisplayRef = ref<HTMLVideoElement>()
|
||||
@@ -22,25 +23,47 @@ const testCtx = ref<HTMLCanvasElement>()
|
||||
const testCtxR = ref<HTMLCanvasElement>()
|
||||
const testCtxG = ref<HTMLCanvasElement>()
|
||||
const testCtxB = ref<HTMLCanvasElement>()
|
||||
// const result = reactive<string[]>([])
|
||||
const res = ref<string>('')
|
||||
|
||||
let stream: MediaStream | null = null
|
||||
let timer: any | undefined = undefined
|
||||
|
||||
const unpaddingData = (data: string) => {
|
||||
if (data.endsWith('012')) {
|
||||
return atob(data.slice(0, data.length - 3))
|
||||
} else if (data.endsWith('01')) {
|
||||
return atob(data.slice(0, data.length - 2))
|
||||
} else {
|
||||
return atob(data.slice(0, data.length - 1))
|
||||
const u8iEndWith = (data: Uint8Array, target: number[]) => {
|
||||
for (let i = 0; i < target.length; i++) {
|
||||
if (data[data.length - 1 - i] !== target[target.length - 1 - i]) return false
|
||||
}
|
||||
return true
|
||||
}
|
||||
|
||||
const unpaddingData = (data: Uint8Array): Uint8Array => {
|
||||
return data.slice(0, data.length - data[data.length - 1])
|
||||
}
|
||||
|
||||
class Binarization {
|
||||
constructor(options?: {
|
||||
threshold?: number
|
||||
min?: number,
|
||||
max?: number
|
||||
}) {
|
||||
options === undefined || (options = {})
|
||||
this.threshold = options?.threshold ?? 150
|
||||
this.min = options?.min ?? 0
|
||||
this.max = options?.max ?? 255
|
||||
}
|
||||
private threshold: number
|
||||
private min: number
|
||||
private max: number
|
||||
private cache = new Map<number, number>()
|
||||
public binarization = (value: number) => {
|
||||
if (this.cache.has(value)) return this.cache.get(value)!
|
||||
const res = value >= this.threshold? this.max : this.min
|
||||
this.cache.set(value, res)
|
||||
return res
|
||||
}
|
||||
}
|
||||
// const scannerResult = new Set()
|
||||
|
||||
const getQRDataFromVideoFrame = (videoFrame: VideoFrame): string | undefined => {
|
||||
const getQRDataFromVideoFrame = (videoFrame: VideoFrame): Uint8Array | undefined => {
|
||||
const canvas = testCtx.value!
|
||||
canvas.width = videoFrame.codedWidth
|
||||
canvas.height = videoFrame.codedHeight
|
||||
@@ -55,19 +78,26 @@ const getQRDataFromVideoFrame = (videoFrame: VideoFrame): string | undefined =>
|
||||
g: new ImageData(canvas.width, canvas.height),
|
||||
b: new ImageData(canvas.width, canvas.height),
|
||||
}
|
||||
const binarization = new Binarization().binarization
|
||||
for (let i = 0; i < imageData.data.length; i += 4) {
|
||||
imageDataRGB.r.data[i] = imageData.data[i]
|
||||
imageDataRGB.r.data[i + 1] = imageData.data[i]
|
||||
imageDataRGB.r.data[i + 2] = imageData.data[i]
|
||||
imageDataRGB.r.data[i + 3] = imageData.data[i + 3]
|
||||
imageDataRGB.g.data[i] = imageData.data[i + 1]
|
||||
imageDataRGB.g.data[i + 1] = imageData.data[i + 1]
|
||||
imageDataRGB.g.data[i + 2] = imageData.data[i + 1]
|
||||
imageDataRGB.g.data[i + 3] = imageData.data[i + 3]
|
||||
imageDataRGB.b.data[i] = imageData.data[i + 2]
|
||||
imageDataRGB.b.data[i + 1] = imageData.data[i + 2]
|
||||
imageDataRGB.b.data[i + 2] = imageData.data[i + 2]
|
||||
imageDataRGB.b.data[i + 3] = imageData.data[i + 3]
|
||||
const rgba = {
|
||||
r: binarization(imageData.data[i]),
|
||||
g: binarization(imageData.data[i + 1]),
|
||||
b: binarization(imageData.data[i + 2]),
|
||||
a: imageData.data[i + 3]
|
||||
}
|
||||
imageDataRGB.r.data[i] = rgba.r
|
||||
imageDataRGB.r.data[i + 1] = rgba.r
|
||||
imageDataRGB.r.data[i + 2] = rgba.r
|
||||
imageDataRGB.r.data[i + 3] = rgba.a
|
||||
imageDataRGB.g.data[i] = rgba.g
|
||||
imageDataRGB.g.data[i + 1] = rgba.g
|
||||
imageDataRGB.g.data[i + 2] = rgba.g
|
||||
imageDataRGB.g.data[i + 3] = rgba.a
|
||||
imageDataRGB.b.data[i] = rgba.b
|
||||
imageDataRGB.b.data[i + 1] = rgba.b
|
||||
imageDataRGB.b.data[i + 2] = rgba.b
|
||||
imageDataRGB.b.data[i + 3] = rgba.a
|
||||
}
|
||||
testCtxR.value!.width = canvas.width
|
||||
testCtxR.value!.height = canvas.height
|
||||
@@ -79,11 +109,13 @@ const getQRDataFromVideoFrame = (videoFrame: VideoFrame): string | undefined =>
|
||||
testCtxG.value!.getContext('2d')?.putImageData(imageDataRGB.g, 0, 0)
|
||||
testCtxB.value!.getContext('2d')?.putImageData(imageDataRGB.b, 0, 0)
|
||||
// const code = jsQR(imageData?.data, imageData?.width, imageData?.height)
|
||||
const codeR = jsQR(imageDataRGB.r.data, imageDataRGB.r.width, imageDataRGB.r.height)
|
||||
const codeG = jsQR(imageDataRGB.g.data, imageDataRGB.g.width, imageDataRGB.g.height)
|
||||
const codeB = jsQR(imageDataRGB.b.data, imageDataRGB.b.width, imageDataRGB.b.height)
|
||||
if(!codeR || !codeG || !codeB) return undefined
|
||||
const data = unpaddingData(codeR?.data + codeG?.data + codeB?.data)
|
||||
// const codeR = jsQR(imageDataRGB.r.data, imageDataRGB.r.width, imageDataRGB.r.height)
|
||||
// const codeG = jsQR(imageDataRGB.g.data, imageDataRGB.g.width, imageDataRGB.g.height)
|
||||
// const codeB = jsQR(imageDataRGB.b.data, imageDataRGB.b.width, imageDataRGB.b.height)
|
||||
// if (!codeR || !codeG || !codeB) return undefined
|
||||
// const resBuffer = new Uint8Array([...codeR.binaryData, ...codeG.binaryData, ...codeB.binaryData])
|
||||
// const data = unpaddingData(resBuffer)
|
||||
const data = jsqrgb.recognize(imageData)
|
||||
return data
|
||||
}
|
||||
|
||||
@@ -98,7 +130,7 @@ const handleTrackProcessor = async (track: MediaStreamTrack) => {
|
||||
const frameFromCamera = result.value as VideoFrame;
|
||||
const data = getQRDataFromVideoFrame(frameFromCamera)
|
||||
if (data) {
|
||||
res.value = data
|
||||
res.value = new TextDecoder().decode(data)
|
||||
console.log(data)
|
||||
emit('onResult', data)
|
||||
}
|
||||
|
||||
+207
-5
@@ -1,13 +1,215 @@
|
||||
<template>
|
||||
<div>
|
||||
index
|
||||
<div class="p-6">
|
||||
<div class="bg-white rounded-lg shadow-md p-6">
|
||||
<h1 class="text-2xl font-bold mb-6 text-gray-800">系统信息</h1>
|
||||
|
||||
<div v-if="isLoading" class="flex justify-center items-center h-40">
|
||||
<div class="animate-spin rounded-full h-12 w-12 border-t-2 border-b-2 border-blue-500"></div>
|
||||
</div>
|
||||
|
||||
<div v-else-if="error" class="text-red-500 text-center">
|
||||
{{ error }}
|
||||
</div>
|
||||
|
||||
<div v-else class="grid grid-cols-1 md:grid-cols-2 gap-6">
|
||||
<!-- 系统信息 -->
|
||||
<div class="bg-gray-50 p-4 rounded-lg">
|
||||
<h2 class="text-lg font-semibold mb-3 text-gray-700">操作系统</h2>
|
||||
<div class="space-y-2">
|
||||
<div class="flex justify-between">
|
||||
<span class="text-gray-600">平台:</span>
|
||||
<span class="font-medium">{{ systemInfo?.system?.platform }}</span>
|
||||
</div>
|
||||
<div class="flex justify-between">
|
||||
<span class="text-gray-600">版本:</span>
|
||||
<span class="font-medium">{{ systemInfo?.system?.release }}</span>
|
||||
</div>
|
||||
<div class="flex justify-between">
|
||||
<span class="text-gray-600">主机名:</span>
|
||||
<span class="font-medium">{{ systemInfo?.system?.hostname }}</span>
|
||||
</div>
|
||||
<div class="flex justify-between">
|
||||
<span class="text-gray-600">Node.js版本:</span>
|
||||
<span class="font-medium">{{ systemInfo?.node }}</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- 硬件信息 -->
|
||||
<div class="bg-gray-50 p-4 rounded-lg">
|
||||
<h2 class="text-lg font-semibold mb-3 text-gray-700">硬件信息</h2>
|
||||
<div class="space-y-2">
|
||||
<div class="flex justify-between">
|
||||
<span class="text-gray-600">CPU型号:</span>
|
||||
<span class="font-medium">{{ systemInfo?.hardware?.cpu?.model }}</span>
|
||||
</div>
|
||||
<div class="flex justify-between">
|
||||
<span class="text-gray-600">CPU核心数:</span>
|
||||
<span class="font-medium">{{ systemInfo?.hardware?.cpu?.cores }}</span>
|
||||
</div>
|
||||
<div class="flex justify-between">
|
||||
<span class="text-gray-600">CPU使用率:</span>
|
||||
<div class="w-32 bg-gray-200 rounded-full h-4 overflow-hidden">
|
||||
<div class="bg-blue-600 h-4 rounded-full" :style="`width: ${performanceData?.cpu?.usage < 5 ? 5 : performanceData?.cpu?.usage}%`"></div>
|
||||
</div>
|
||||
<span class="font-medium">{{ performanceData?.cpu?.usage }}%</span>
|
||||
</div>
|
||||
<div class="flex justify-between">
|
||||
<span class="text-gray-600">内存使用情况:</span>
|
||||
<span class="font-medium">{{ performanceData?.memory?.used || systemInfo?.hardware?.memory?.used }} / {{ performanceData?.memory?.total || systemInfo?.hardware?.memory?.total }}</span>
|
||||
</div>
|
||||
<div class="flex justify-between">
|
||||
<span class="text-gray-600">内存使用率:</span>
|
||||
<div class="w-32 bg-gray-200 rounded-full h-4 overflow-hidden">
|
||||
<div class="bg-green-600 h-4 rounded-full" :style="`width: ${performanceData?.memory?.percent}%`"></div>
|
||||
</div>
|
||||
<span class="font-medium">{{ performanceData?.memory?.percent }}%</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="mt-4 text-gray-500 text-sm flex justify-between">
|
||||
<div>性能数据更新时间: {{ performanceUpdated }}</div>
|
||||
<div>系统数据更新时间: {{ lastUpdated }}</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script setup lang="ts">
|
||||
const systemInfo = ref<any>(null);
|
||||
const performanceData = ref<any>(null);
|
||||
const isLoading = ref(true);
|
||||
const error = ref('');
|
||||
const lastUpdated = ref('');
|
||||
const performanceUpdated = ref('');
|
||||
|
||||
// 格式化时间
|
||||
const formatTime = () => {
|
||||
const now = new Date();
|
||||
const hours = now.getHours().toString().padStart(2, '0');
|
||||
const minutes = now.getMinutes().toString().padStart(2, '0');
|
||||
const seconds = now.getSeconds().toString().padStart(2, '0');
|
||||
return `${hours}:${minutes}:${seconds}`;
|
||||
};
|
||||
|
||||
// 定义API响应类型
|
||||
interface SystemInfoResponse {
|
||||
success: boolean;
|
||||
data?: {
|
||||
system: {
|
||||
platform: string;
|
||||
release: string;
|
||||
hostname: string;
|
||||
};
|
||||
node: string;
|
||||
hardware: {
|
||||
cpu: {
|
||||
model: string;
|
||||
cores: number;
|
||||
usage: number;
|
||||
};
|
||||
memory: {
|
||||
total: string;
|
||||
free: string;
|
||||
used: string;
|
||||
percent: number;
|
||||
};
|
||||
};
|
||||
};
|
||||
message?: string;
|
||||
}
|
||||
|
||||
interface PerformanceResponse {
|
||||
success: boolean;
|
||||
data?: {
|
||||
cpu: {
|
||||
usage: number;
|
||||
};
|
||||
memory: {
|
||||
total: string;
|
||||
free: string;
|
||||
used: string;
|
||||
percent: number;
|
||||
};
|
||||
};
|
||||
message?: string;
|
||||
}
|
||||
|
||||
// 获取系统信息
|
||||
const fetchSystemInfo = async () => {
|
||||
try {
|
||||
if (!systemInfo.value) {
|
||||
isLoading.value = true;
|
||||
}
|
||||
error.value = '';
|
||||
|
||||
const response = await $fetch<SystemInfoResponse>('/api/system/info');
|
||||
|
||||
if (response && response.success && response.data) {
|
||||
systemInfo.value = response.data;
|
||||
|
||||
// 如果还没有性能数据,初始化它
|
||||
if (!performanceData.value) {
|
||||
performanceData.value = {
|
||||
cpu: {
|
||||
usage: response.data.hardware.cpu.usage
|
||||
},
|
||||
memory: response.data.hardware.memory
|
||||
};
|
||||
}
|
||||
|
||||
lastUpdated.value = formatTime();
|
||||
} else {
|
||||
error.value = response?.message || '获取系统信息失败';
|
||||
}
|
||||
} catch (err) {
|
||||
error.value = '请求发生错误';
|
||||
console.error('Error fetching system info:', err);
|
||||
} finally {
|
||||
isLoading.value = false;
|
||||
}
|
||||
};
|
||||
|
||||
// 获取性能数据(CPU和内存使用率)
|
||||
const fetchPerformanceData = async () => {
|
||||
try {
|
||||
const response = await $fetch<PerformanceResponse>('/api/system/performance');
|
||||
|
||||
if (response && response.success && response.data) {
|
||||
performanceData.value = response.data;
|
||||
performanceUpdated.value = formatTime();
|
||||
}
|
||||
} catch (err) {
|
||||
console.error('Error fetching performance data:', err);
|
||||
}
|
||||
};
|
||||
|
||||
// 首次获取数据
|
||||
onMounted(() => {
|
||||
// 获取完整系统信息
|
||||
fetchSystemInfo();
|
||||
|
||||
// 设置30秒定时更新系统信息
|
||||
const systemTimer = setInterval(() => {
|
||||
fetchSystemInfo();
|
||||
}, 30000);
|
||||
|
||||
// 立即获取一次性能数据
|
||||
fetchPerformanceData();
|
||||
|
||||
// 设置5秒定时更新性能数据
|
||||
const performanceTimer = setInterval(() => {
|
||||
fetchPerformanceData();
|
||||
}, 5000);
|
||||
|
||||
// 组件卸载时清除定时器
|
||||
onUnmounted(() => {
|
||||
clearInterval(systemTimer);
|
||||
clearInterval(performanceTimer);
|
||||
});
|
||||
});
|
||||
</script>
|
||||
|
||||
<style scoped>
|
||||
|
||||
</style>
|
||||
<style scoped></style>
|
||||
@@ -39,7 +39,7 @@ type resType = {
|
||||
} & postItem
|
||||
|
||||
|
||||
const { post: { getPost, updatePost, uploadPost } } = useFetch()
|
||||
const { post: { getPost, updatePost, uploadPost, deletePost } } = useFetch()
|
||||
|
||||
const route = useRoute()
|
||||
const router = useRouter()
|
||||
@@ -86,12 +86,7 @@ const handleClickDelete = async () => {
|
||||
}
|
||||
)
|
||||
try {
|
||||
const response = await $fetch('/api/posts/deletePost', {
|
||||
method: 'POST',
|
||||
body: {
|
||||
id: id.value
|
||||
}
|
||||
})
|
||||
const response = await deletePost(id.value)
|
||||
ElMessage({
|
||||
type: 'success',
|
||||
message: '删除文章完成',
|
||||
@@ -99,7 +94,8 @@ const handleClickDelete = async () => {
|
||||
const store = useDefaultStore()
|
||||
store.deleteCache('posts')
|
||||
router.back()
|
||||
} catch {
|
||||
} catch(e) {
|
||||
console.error(e)
|
||||
ElMessage({
|
||||
type: 'error',
|
||||
message: '删除失败',
|
||||
|
||||
Generated
+319
-39
@@ -17,6 +17,9 @@ importers:
|
||||
'@pinia/nuxt':
|
||||
specifier: ^0.9.0
|
||||
version: 0.9.0(magicast@0.3.5)(pinia@2.3.0(typescript@5.7.3)(vue@3.5.13(typescript@5.7.3)))(rollup@4.30.1)
|
||||
'@tailwindcss/vite':
|
||||
specifier: ^4.0.5
|
||||
version: 4.0.5(vite@6.0.7(@types/node@22.10.5)(jiti@2.4.2)(lightningcss@1.29.1)(sass@1.83.1)(terser@5.37.0)(yaml@2.7.0))
|
||||
'@types/node':
|
||||
specifier: ^22.10.5
|
||||
version: 22.10.5
|
||||
@@ -38,6 +41,9 @@ importers:
|
||||
jsqr:
|
||||
specifier: ^1.4.0
|
||||
version: 1.4.0
|
||||
jsqrgb:
|
||||
specifier: ^0.0.3
|
||||
version: 0.0.3
|
||||
markdown-it:
|
||||
specifier: ^14.1.0
|
||||
version: 14.1.0
|
||||
@@ -46,13 +52,16 @@ importers:
|
||||
version: 3.3.2
|
||||
nuxt:
|
||||
specifier: ^3.15.1
|
||||
version: 3.15.1(@parcel/watcher@2.5.0)(@types/node@22.10.5)(better-sqlite3@11.3.0)(db0@0.2.1(better-sqlite3@11.3.0))(ioredis@5.4.2)(magicast@0.3.5)(rollup@4.30.1)(sass@1.83.1)(terser@5.37.0)(typescript@5.7.3)(vite@6.0.7(@types/node@22.10.5)(jiti@2.4.2)(sass@1.83.1)(terser@5.37.0)(yaml@2.7.0))(yaml@2.7.0)
|
||||
version: 3.15.1(@parcel/watcher@2.5.0)(@types/node@22.10.5)(better-sqlite3@11.3.0)(db0@0.2.1(better-sqlite3@11.3.0))(ioredis@5.4.2)(lightningcss@1.29.1)(magicast@0.3.5)(rollup@4.30.1)(sass@1.83.1)(terser@5.37.0)(typescript@5.7.3)(vite@6.0.7(@types/node@22.10.5)(jiti@2.4.2)(lightningcss@1.29.1)(sass@1.83.1)(terser@5.37.0)(yaml@2.7.0))(yaml@2.7.0)
|
||||
pinia:
|
||||
specifier: ^2.3.0
|
||||
version: 2.3.0(typescript@5.7.3)(vue@3.5.13(typescript@5.7.3))
|
||||
qrcode:
|
||||
specifier: ^1.5.4
|
||||
version: 1.5.4
|
||||
tailwindcss:
|
||||
specifier: ^4.0.5
|
||||
version: 4.0.5
|
||||
unplugin-auto-import:
|
||||
specifier: ^19.0.0
|
||||
version: 19.0.0(@nuxt/kit@3.15.1(magicast@0.3.5)(rollup@4.30.1))(@vueuse/core@9.13.0(vue@3.5.13(typescript@5.7.3)))(rollup@4.30.1)
|
||||
@@ -119,7 +128,7 @@ importers:
|
||||
version: 1.83.1
|
||||
vite-plugin-mkcert:
|
||||
specifier: ^1.17.6
|
||||
version: 1.17.6(vite@6.0.7(@types/node@22.10.5)(jiti@2.4.2)(sass@1.83.1)(terser@5.37.0)(yaml@2.7.0))
|
||||
version: 1.17.6(vite@6.0.7(@types/node@22.10.5)(jiti@2.4.2)(lightningcss@1.29.1)(sass@1.83.1)(terser@5.37.0)(yaml@2.7.0))
|
||||
|
||||
packages:
|
||||
|
||||
@@ -1138,6 +1147,88 @@ packages:
|
||||
'@sxzz/popperjs-es@2.11.7':
|
||||
resolution: {integrity: sha512-Ccy0NlLkzr0Ex2FKvh2X+OyERHXJ88XJ1MXtsI9y9fGexlaXaVTPzBCRBwIxFkORuOb+uBqeu+RqnpgYTEZRUQ==}
|
||||
|
||||
'@tailwindcss/node@4.0.5':
|
||||
resolution: {integrity: sha512-ffTz4DX1cgr4XPuqjhm32YV6Lyx58R1CxAAnSFTamg6wXwfk3oWdb6exgAbGesPzvUgicTO0gwUdQGSsg4nNog==}
|
||||
|
||||
'@tailwindcss/oxide-android-arm64@4.0.5':
|
||||
resolution: {integrity: sha512-kK/ik8aIAKWDIEYDZGUCJcnU1qU5sPoMBlVzPvtsUqiV6cSHcnVRUdkcLwKqTeUowzZtjjRiamELLd9Gb0x5BQ==}
|
||||
engines: {node: '>= 10'}
|
||||
cpu: [arm64]
|
||||
os: [android]
|
||||
|
||||
'@tailwindcss/oxide-darwin-arm64@4.0.5':
|
||||
resolution: {integrity: sha512-vkbXFv0FfAEbrSa5NBjFEE+xi06ha7mxuxjY8LRn7d7/tBGrAZOEJnnsEbB6M1+x2pGRTjjei0XyTIXdVCglJA==}
|
||||
engines: {node: '>= 10'}
|
||||
cpu: [arm64]
|
||||
os: [darwin]
|
||||
|
||||
'@tailwindcss/oxide-darwin-x64@4.0.5':
|
||||
resolution: {integrity: sha512-PedA64rHBXEa4e6abBWE4Yj4gHulfPb5T+rBNnX+WGkjjge5Txa2oS99TLmJ5BPDkXXqz/Ba7oweWIDDG7i5NQ==}
|
||||
engines: {node: '>= 10'}
|
||||
cpu: [x64]
|
||||
os: [darwin]
|
||||
|
||||
'@tailwindcss/oxide-freebsd-x64@4.0.5':
|
||||
resolution: {integrity: sha512-silz3nuZdEYDfic3v/ooVUQChj9hbxDSee43GCQNwr/iD9L4K/JsZtoNqr0w69pUkvWcKINOGOG0r7WqUqkAeg==}
|
||||
engines: {node: '>= 10'}
|
||||
cpu: [x64]
|
||||
os: [freebsd]
|
||||
|
||||
'@tailwindcss/oxide-linux-arm-gnueabihf@4.0.5':
|
||||
resolution: {integrity: sha512-ElneG75XS64B9I2G83A/Hc7EtNVOD5xahs7avq0aeW7mEX6CtMc8m8RCXMn3jGhz8enFE52l6QU0wO7iVkEtXQ==}
|
||||
engines: {node: '>= 10'}
|
||||
cpu: [arm]
|
||||
os: [linux]
|
||||
|
||||
'@tailwindcss/oxide-linux-arm64-gnu@4.0.5':
|
||||
resolution: {integrity: sha512-8yoXpWTeIFaByUaKy2qRAppznLVaDHP9xYCAbS3FG7+uUwHi8CHE4TcomM7eyamo0U7dbUIDgKMGoAX5s2iVrA==}
|
||||
engines: {node: '>= 10'}
|
||||
cpu: [arm64]
|
||||
os: [linux]
|
||||
libc: [glibc]
|
||||
|
||||
'@tailwindcss/oxide-linux-arm64-musl@4.0.5':
|
||||
resolution: {integrity: sha512-BDlVSiiJ08GRz9KKnXgaPFs2fkukPF3pym6uK3oWEKW45jKlVGgybLqulcV5nLEqREOuyq4Rn4vnZss4/bbQ/g==}
|
||||
engines: {node: '>= 10'}
|
||||
cpu: [arm64]
|
||||
os: [linux]
|
||||
libc: [musl]
|
||||
|
||||
'@tailwindcss/oxide-linux-x64-gnu@4.0.5':
|
||||
resolution: {integrity: sha512-DYgieNDRkTy69bWPgdsc47nAXa74P63P/RetUwYM9vYj5USyOfHCEcqIthkCuYw3dXKBhjgwe697TmL2g2jpAw==}
|
||||
engines: {node: '>= 10'}
|
||||
cpu: [x64]
|
||||
os: [linux]
|
||||
libc: [glibc]
|
||||
|
||||
'@tailwindcss/oxide-linux-x64-musl@4.0.5':
|
||||
resolution: {integrity: sha512-z2RzUvOQl0ZqrZqmCFP53tJbBXQ3UmLD/E6J7+q0e+4VaFnXCcIYTfQbHgI8f3fash+q6gK80Ko/ywEQ+bvv6Q==}
|
||||
engines: {node: '>= 10'}
|
||||
cpu: [x64]
|
||||
os: [linux]
|
||||
libc: [musl]
|
||||
|
||||
'@tailwindcss/oxide-win32-arm64-msvc@4.0.5':
|
||||
resolution: {integrity: sha512-ho1dJ4o5Q8nAOxdMkbfBu5aSqI+/bzQ0jEeHcXaEdEJzf2fSWs3HY7bIKtE6vQS8c4SmSBvls7IhGPuJxNg+2Q==}
|
||||
engines: {node: '>= 10'}
|
||||
cpu: [arm64]
|
||||
os: [win32]
|
||||
|
||||
'@tailwindcss/oxide-win32-x64-msvc@4.0.5':
|
||||
resolution: {integrity: sha512-yjw6JhtyDXr+G0aZrj3L3NlEV7CobSqOdPyfo6G3d91WEZ5b8PyGm86IAreX08Jp9DChGXEd53gWysVpWCTs+w==}
|
||||
engines: {node: '>= 10'}
|
||||
cpu: [x64]
|
||||
os: [win32]
|
||||
|
||||
'@tailwindcss/oxide@4.0.5':
|
||||
resolution: {integrity: sha512-iWGyOCu0TuzvCBisWbGv2K9+7QCfE0ztgtrZOvb9iF7V7ChVkD15Obe3HevZrhjngAc34jDA+OMSuSvkrpTy4A==}
|
||||
engines: {node: '>= 10'}
|
||||
|
||||
'@tailwindcss/vite@4.0.5':
|
||||
resolution: {integrity: sha512-/i4hjLTUYVjUG0MTUviQP3HR/hzwyzv8Sq4sz2pnsNuf+FIjjhJB0vcnIMH1KIX0k8ozD6CBv2Dl76tlm/JFFA==}
|
||||
peerDependencies:
|
||||
vite: ^5.2.0 || ^6
|
||||
|
||||
'@trysound/sax@0.2.0':
|
||||
resolution: {integrity: sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==}
|
||||
engines: {node: '>=10.13.0'}
|
||||
@@ -2295,6 +2386,9 @@ packages:
|
||||
jsqr@1.4.0:
|
||||
resolution: {integrity: sha512-dxLob7q65Xg2DvstYkRpkYtmKm2sPJ9oFhrhmudT1dZvNFFTlroai3AWSpLey/w5vMcLBXRgOJsbXpdN9HzU/A==}
|
||||
|
||||
jsqrgb@0.0.3:
|
||||
resolution: {integrity: sha512-R2hArt7TLz1zygOc0Erd2/ssBGLW1wFE5uFyqOub5e8SW7K2/sGKc2qUkg5NbK9hbDgNu448cts/37y+oipbng==}
|
||||
|
||||
jwa@1.4.1:
|
||||
resolution: {integrity: sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==}
|
||||
|
||||
@@ -2322,6 +2416,74 @@ packages:
|
||||
resolution: {integrity: sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==}
|
||||
engines: {node: '>= 0.6.3'}
|
||||
|
||||
lightningcss-darwin-arm64@1.29.1:
|
||||
resolution: {integrity: sha512-HtR5XJ5A0lvCqYAoSv2QdZZyoHNttBpa5EP9aNuzBQeKGfbyH5+UipLWvVzpP4Uml5ej4BYs5I9Lco9u1fECqw==}
|
||||
engines: {node: '>= 12.0.0'}
|
||||
cpu: [arm64]
|
||||
os: [darwin]
|
||||
|
||||
lightningcss-darwin-x64@1.29.1:
|
||||
resolution: {integrity: sha512-k33G9IzKUpHy/J/3+9MCO4e+PzaFblsgBjSGlpAaFikeBFm8B/CkO3cKU9oI4g+fjS2KlkLM/Bza9K/aw8wsNA==}
|
||||
engines: {node: '>= 12.0.0'}
|
||||
cpu: [x64]
|
||||
os: [darwin]
|
||||
|
||||
lightningcss-freebsd-x64@1.29.1:
|
||||
resolution: {integrity: sha512-0SUW22fv/8kln2LnIdOCmSuXnxgxVC276W5KLTwoehiO0hxkacBxjHOL5EtHD8BAXg2BvuhsJPmVMasvby3LiQ==}
|
||||
engines: {node: '>= 12.0.0'}
|
||||
cpu: [x64]
|
||||
os: [freebsd]
|
||||
|
||||
lightningcss-linux-arm-gnueabihf@1.29.1:
|
||||
resolution: {integrity: sha512-sD32pFvlR0kDlqsOZmYqH/68SqUMPNj+0pucGxToXZi4XZgZmqeX/NkxNKCPsswAXU3UeYgDSpGhu05eAufjDg==}
|
||||
engines: {node: '>= 12.0.0'}
|
||||
cpu: [arm]
|
||||
os: [linux]
|
||||
|
||||
lightningcss-linux-arm64-gnu@1.29.1:
|
||||
resolution: {integrity: sha512-0+vClRIZ6mmJl/dxGuRsE197o1HDEeeRk6nzycSy2GofC2JsY4ifCRnvUWf/CUBQmlrvMzt6SMQNMSEu22csWQ==}
|
||||
engines: {node: '>= 12.0.0'}
|
||||
cpu: [arm64]
|
||||
os: [linux]
|
||||
libc: [glibc]
|
||||
|
||||
lightningcss-linux-arm64-musl@1.29.1:
|
||||
resolution: {integrity: sha512-UKMFrG4rL/uHNgelBsDwJcBqVpzNJbzsKkbI3Ja5fg00sgQnHw/VrzUTEc4jhZ+AN2BvQYz/tkHu4vt1kLuJyw==}
|
||||
engines: {node: '>= 12.0.0'}
|
||||
cpu: [arm64]
|
||||
os: [linux]
|
||||
libc: [musl]
|
||||
|
||||
lightningcss-linux-x64-gnu@1.29.1:
|
||||
resolution: {integrity: sha512-u1S+xdODy/eEtjADqirA774y3jLcm8RPtYztwReEXoZKdzgsHYPl0s5V52Tst+GKzqjebkULT86XMSxejzfISw==}
|
||||
engines: {node: '>= 12.0.0'}
|
||||
cpu: [x64]
|
||||
os: [linux]
|
||||
libc: [glibc]
|
||||
|
||||
lightningcss-linux-x64-musl@1.29.1:
|
||||
resolution: {integrity: sha512-L0Tx0DtaNUTzXv0lbGCLB/c/qEADanHbu4QdcNOXLIe1i8i22rZRpbT3gpWYsCh9aSL9zFujY/WmEXIatWvXbw==}
|
||||
engines: {node: '>= 12.0.0'}
|
||||
cpu: [x64]
|
||||
os: [linux]
|
||||
libc: [musl]
|
||||
|
||||
lightningcss-win32-arm64-msvc@1.29.1:
|
||||
resolution: {integrity: sha512-QoOVnkIEFfbW4xPi+dpdft/zAKmgLgsRHfJalEPYuJDOWf7cLQzYg0DEh8/sn737FaeMJxHZRc1oBreiwZCjog==}
|
||||
engines: {node: '>= 12.0.0'}
|
||||
cpu: [arm64]
|
||||
os: [win32]
|
||||
|
||||
lightningcss-win32-x64-msvc@1.29.1:
|
||||
resolution: {integrity: sha512-NygcbThNBe4JElP+olyTI/doBNGJvLs3bFCRPdvuCcxZCcCZ71B858IHpdm7L1btZex0FvCmM17FK98Y9MRy1Q==}
|
||||
engines: {node: '>= 12.0.0'}
|
||||
cpu: [x64]
|
||||
os: [win32]
|
||||
|
||||
lightningcss@1.29.1:
|
||||
resolution: {integrity: sha512-FmGoeD4S05ewj+AkhTY+D+myDvXI6eL27FjHIjoyUkO/uw7WZD1fBVs0QxeYWa7E17CUHJaYX/RUGISCtcrG4Q==}
|
||||
engines: {node: '>= 12.0.0'}
|
||||
|
||||
lilconfig@3.1.3:
|
||||
resolution: {integrity: sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==}
|
||||
engines: {node: '>=14'}
|
||||
@@ -3296,6 +3458,9 @@ packages:
|
||||
resolution: {integrity: sha512-ulAk51I9UVUyJgxlv9M6lFot2WP3e7t8Kz9+IS6D4rVba1tR9kON+Ey69f+1R4Q8cd45Lod6a4IcJIxnzGc/zA==}
|
||||
engines: {node: '>=18'}
|
||||
|
||||
tailwindcss@4.0.5:
|
||||
resolution: {integrity: sha512-DZZIKX3tA23LGTjHdnwlJOTxfICD1cPeykLLsYF1RQBI9QsCR3i0szohJfJDVjr6aNRAIio5WVO7FGB77fRHwg==}
|
||||
|
||||
tapable@2.2.1:
|
||||
resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==}
|
||||
engines: {node: '>=6'}
|
||||
@@ -4505,12 +4670,12 @@ snapshots:
|
||||
|
||||
'@nuxt/devalue@2.0.2': {}
|
||||
|
||||
'@nuxt/devtools-kit@1.7.0(magicast@0.3.5)(rollup@4.30.1)(vite@6.0.7(@types/node@22.10.5)(jiti@2.4.2)(sass@1.83.1)(terser@5.37.0)(yaml@2.7.0))':
|
||||
'@nuxt/devtools-kit@1.7.0(magicast@0.3.5)(rollup@4.30.1)(vite@6.0.7(@types/node@22.10.5)(jiti@2.4.2)(lightningcss@1.29.1)(sass@1.83.1)(terser@5.37.0)(yaml@2.7.0))':
|
||||
dependencies:
|
||||
'@nuxt/kit': 3.15.1(magicast@0.3.5)(rollup@4.30.1)
|
||||
'@nuxt/schema': 3.15.1
|
||||
execa: 7.2.0
|
||||
vite: 6.0.7(@types/node@22.10.5)(jiti@2.4.2)(sass@1.83.1)(terser@5.37.0)(yaml@2.7.0)
|
||||
vite: 6.0.7(@types/node@22.10.5)(jiti@2.4.2)(lightningcss@1.29.1)(sass@1.83.1)(terser@5.37.0)(yaml@2.7.0)
|
||||
transitivePeerDependencies:
|
||||
- magicast
|
||||
- rollup
|
||||
@@ -4529,13 +4694,13 @@ snapshots:
|
||||
rc9: 2.1.2
|
||||
semver: 7.6.3
|
||||
|
||||
'@nuxt/devtools@1.7.0(rollup@4.30.1)(vite@6.0.7(@types/node@22.10.5)(jiti@2.4.2)(sass@1.83.1)(terser@5.37.0)(yaml@2.7.0))(vue@3.5.13(typescript@5.7.3))':
|
||||
'@nuxt/devtools@1.7.0(rollup@4.30.1)(vite@6.0.7(@types/node@22.10.5)(jiti@2.4.2)(lightningcss@1.29.1)(sass@1.83.1)(terser@5.37.0)(yaml@2.7.0))(vue@3.5.13(typescript@5.7.3))':
|
||||
dependencies:
|
||||
'@antfu/utils': 0.7.10
|
||||
'@nuxt/devtools-kit': 1.7.0(magicast@0.3.5)(rollup@4.30.1)(vite@6.0.7(@types/node@22.10.5)(jiti@2.4.2)(sass@1.83.1)(terser@5.37.0)(yaml@2.7.0))
|
||||
'@nuxt/devtools-kit': 1.7.0(magicast@0.3.5)(rollup@4.30.1)(vite@6.0.7(@types/node@22.10.5)(jiti@2.4.2)(lightningcss@1.29.1)(sass@1.83.1)(terser@5.37.0)(yaml@2.7.0))
|
||||
'@nuxt/devtools-wizard': 1.7.0
|
||||
'@nuxt/kit': 3.15.1(magicast@0.3.5)(rollup@4.30.1)
|
||||
'@vue/devtools-core': 7.6.8(vite@6.0.7(@types/node@22.10.5)(jiti@2.4.2)(sass@1.83.1)(terser@5.37.0)(yaml@2.7.0))(vue@3.5.13(typescript@5.7.3))
|
||||
'@vue/devtools-core': 7.6.8(vite@6.0.7(@types/node@22.10.5)(jiti@2.4.2)(lightningcss@1.29.1)(sass@1.83.1)(terser@5.37.0)(yaml@2.7.0))(vue@3.5.13(typescript@5.7.3))
|
||||
'@vue/devtools-kit': 7.6.8
|
||||
birpc: 0.2.19
|
||||
consola: 3.3.3
|
||||
@@ -4564,9 +4729,9 @@ snapshots:
|
||||
sirv: 3.0.0
|
||||
tinyglobby: 0.2.10
|
||||
unimport: 3.14.5(rollup@4.30.1)
|
||||
vite: 6.0.7(@types/node@22.10.5)(jiti@2.4.2)(sass@1.83.1)(terser@5.37.0)(yaml@2.7.0)
|
||||
vite-plugin-inspect: 0.8.9(@nuxt/kit@3.15.1(magicast@0.3.5)(rollup@4.30.1))(rollup@4.30.1)(vite@6.0.7(@types/node@22.10.5)(jiti@2.4.2)(sass@1.83.1)(terser@5.37.0)(yaml@2.7.0))
|
||||
vite-plugin-vue-inspector: 5.3.1(vite@6.0.7(@types/node@22.10.5)(jiti@2.4.2)(sass@1.83.1)(terser@5.37.0)(yaml@2.7.0))
|
||||
vite: 6.0.7(@types/node@22.10.5)(jiti@2.4.2)(lightningcss@1.29.1)(sass@1.83.1)(terser@5.37.0)(yaml@2.7.0)
|
||||
vite-plugin-inspect: 0.8.9(@nuxt/kit@3.15.1(magicast@0.3.5)(rollup@4.30.1))(rollup@4.30.1)(vite@6.0.7(@types/node@22.10.5)(jiti@2.4.2)(lightningcss@1.29.1)(sass@1.83.1)(terser@5.37.0)(yaml@2.7.0))
|
||||
vite-plugin-vue-inspector: 5.3.1(vite@6.0.7(@types/node@22.10.5)(jiti@2.4.2)(lightningcss@1.29.1)(sass@1.83.1)(terser@5.37.0)(yaml@2.7.0))
|
||||
which: 3.0.1
|
||||
ws: 8.18.0
|
||||
transitivePeerDependencies:
|
||||
@@ -4630,12 +4795,12 @@ snapshots:
|
||||
- rollup
|
||||
- supports-color
|
||||
|
||||
'@nuxt/vite-builder@3.15.1(@types/node@22.10.5)(magicast@0.3.5)(rollup@4.30.1)(sass@1.83.1)(terser@5.37.0)(typescript@5.7.3)(vue@3.5.13(typescript@5.7.3))(yaml@2.7.0)':
|
||||
'@nuxt/vite-builder@3.15.1(@types/node@22.10.5)(lightningcss@1.29.1)(magicast@0.3.5)(rollup@4.30.1)(sass@1.83.1)(terser@5.37.0)(typescript@5.7.3)(vue@3.5.13(typescript@5.7.3))(yaml@2.7.0)':
|
||||
dependencies:
|
||||
'@nuxt/kit': 3.15.1(magicast@0.3.5)(rollup@4.30.1)
|
||||
'@rollup/plugin-replace': 6.0.2(rollup@4.30.1)
|
||||
'@vitejs/plugin-vue': 5.2.1(vite@6.0.7(@types/node@22.10.5)(jiti@2.4.2)(sass@1.83.1)(terser@5.37.0)(yaml@2.7.0))(vue@3.5.13(typescript@5.7.3))
|
||||
'@vitejs/plugin-vue-jsx': 4.1.1(vite@6.0.7(@types/node@22.10.5)(jiti@2.4.2)(sass@1.83.1)(terser@5.37.0)(yaml@2.7.0))(vue@3.5.13(typescript@5.7.3))
|
||||
'@vitejs/plugin-vue': 5.2.1(vite@6.0.7(@types/node@22.10.5)(jiti@2.4.2)(lightningcss@1.29.1)(sass@1.83.1)(terser@5.37.0)(yaml@2.7.0))(vue@3.5.13(typescript@5.7.3))
|
||||
'@vitejs/plugin-vue-jsx': 4.1.1(vite@6.0.7(@types/node@22.10.5)(jiti@2.4.2)(lightningcss@1.29.1)(sass@1.83.1)(terser@5.37.0)(yaml@2.7.0))(vue@3.5.13(typescript@5.7.3))
|
||||
autoprefixer: 10.4.20(postcss@8.4.49)
|
||||
consola: 3.3.3
|
||||
cssnano: 7.0.6(postcss@8.4.49)
|
||||
@@ -4659,9 +4824,9 @@ snapshots:
|
||||
ufo: 1.5.4
|
||||
unenv: 1.10.0
|
||||
unplugin: 2.1.2
|
||||
vite: 6.0.7(@types/node@22.10.5)(jiti@2.4.2)(sass@1.83.1)(terser@5.37.0)(yaml@2.7.0)
|
||||
vite-node: 2.1.8(@types/node@22.10.5)(sass@1.83.1)(terser@5.37.0)
|
||||
vite-plugin-checker: 0.8.0(typescript@5.7.3)(vite@6.0.7(@types/node@22.10.5)(jiti@2.4.2)(sass@1.83.1)(terser@5.37.0)(yaml@2.7.0))
|
||||
vite: 6.0.7(@types/node@22.10.5)(jiti@2.4.2)(lightningcss@1.29.1)(sass@1.83.1)(terser@5.37.0)(yaml@2.7.0)
|
||||
vite-node: 2.1.8(@types/node@22.10.5)(lightningcss@1.29.1)(sass@1.83.1)(terser@5.37.0)
|
||||
vite-plugin-checker: 0.8.0(typescript@5.7.3)(vite@6.0.7(@types/node@22.10.5)(jiti@2.4.2)(lightningcss@1.29.1)(sass@1.83.1)(terser@5.37.0)(yaml@2.7.0))
|
||||
vue: 3.5.13(typescript@5.7.3)
|
||||
vue-bundle-renderer: 2.1.1
|
||||
transitivePeerDependencies:
|
||||
@@ -4980,6 +5145,67 @@ snapshots:
|
||||
|
||||
'@sxzz/popperjs-es@2.11.7': {}
|
||||
|
||||
'@tailwindcss/node@4.0.5':
|
||||
dependencies:
|
||||
enhanced-resolve: 5.18.0
|
||||
jiti: 2.4.2
|
||||
tailwindcss: 4.0.5
|
||||
|
||||
'@tailwindcss/oxide-android-arm64@4.0.5':
|
||||
optional: true
|
||||
|
||||
'@tailwindcss/oxide-darwin-arm64@4.0.5':
|
||||
optional: true
|
||||
|
||||
'@tailwindcss/oxide-darwin-x64@4.0.5':
|
||||
optional: true
|
||||
|
||||
'@tailwindcss/oxide-freebsd-x64@4.0.5':
|
||||
optional: true
|
||||
|
||||
'@tailwindcss/oxide-linux-arm-gnueabihf@4.0.5':
|
||||
optional: true
|
||||
|
||||
'@tailwindcss/oxide-linux-arm64-gnu@4.0.5':
|
||||
optional: true
|
||||
|
||||
'@tailwindcss/oxide-linux-arm64-musl@4.0.5':
|
||||
optional: true
|
||||
|
||||
'@tailwindcss/oxide-linux-x64-gnu@4.0.5':
|
||||
optional: true
|
||||
|
||||
'@tailwindcss/oxide-linux-x64-musl@4.0.5':
|
||||
optional: true
|
||||
|
||||
'@tailwindcss/oxide-win32-arm64-msvc@4.0.5':
|
||||
optional: true
|
||||
|
||||
'@tailwindcss/oxide-win32-x64-msvc@4.0.5':
|
||||
optional: true
|
||||
|
||||
'@tailwindcss/oxide@4.0.5':
|
||||
optionalDependencies:
|
||||
'@tailwindcss/oxide-android-arm64': 4.0.5
|
||||
'@tailwindcss/oxide-darwin-arm64': 4.0.5
|
||||
'@tailwindcss/oxide-darwin-x64': 4.0.5
|
||||
'@tailwindcss/oxide-freebsd-x64': 4.0.5
|
||||
'@tailwindcss/oxide-linux-arm-gnueabihf': 4.0.5
|
||||
'@tailwindcss/oxide-linux-arm64-gnu': 4.0.5
|
||||
'@tailwindcss/oxide-linux-arm64-musl': 4.0.5
|
||||
'@tailwindcss/oxide-linux-x64-gnu': 4.0.5
|
||||
'@tailwindcss/oxide-linux-x64-musl': 4.0.5
|
||||
'@tailwindcss/oxide-win32-arm64-msvc': 4.0.5
|
||||
'@tailwindcss/oxide-win32-x64-msvc': 4.0.5
|
||||
|
||||
'@tailwindcss/vite@4.0.5(vite@6.0.7(@types/node@22.10.5)(jiti@2.4.2)(lightningcss@1.29.1)(sass@1.83.1)(terser@5.37.0)(yaml@2.7.0))':
|
||||
dependencies:
|
||||
'@tailwindcss/node': 4.0.5
|
||||
'@tailwindcss/oxide': 4.0.5
|
||||
lightningcss: 1.29.1
|
||||
tailwindcss: 4.0.5
|
||||
vite: 6.0.7(@types/node@22.10.5)(jiti@2.4.2)(lightningcss@1.29.1)(sass@1.83.1)(terser@5.37.0)(yaml@2.7.0)
|
||||
|
||||
'@trysound/sax@0.2.0': {}
|
||||
|
||||
'@types/bcryptjs@2.4.6': {}
|
||||
@@ -5074,19 +5300,19 @@ snapshots:
|
||||
- rollup
|
||||
- supports-color
|
||||
|
||||
'@vitejs/plugin-vue-jsx@4.1.1(vite@6.0.7(@types/node@22.10.5)(jiti@2.4.2)(sass@1.83.1)(terser@5.37.0)(yaml@2.7.0))(vue@3.5.13(typescript@5.7.3))':
|
||||
'@vitejs/plugin-vue-jsx@4.1.1(vite@6.0.7(@types/node@22.10.5)(jiti@2.4.2)(lightningcss@1.29.1)(sass@1.83.1)(terser@5.37.0)(yaml@2.7.0))(vue@3.5.13(typescript@5.7.3))':
|
||||
dependencies:
|
||||
'@babel/core': 7.26.0
|
||||
'@babel/plugin-transform-typescript': 7.26.5(@babel/core@7.26.0)
|
||||
'@vue/babel-plugin-jsx': 1.2.5(@babel/core@7.26.0)
|
||||
vite: 6.0.7(@types/node@22.10.5)(jiti@2.4.2)(sass@1.83.1)(terser@5.37.0)(yaml@2.7.0)
|
||||
vite: 6.0.7(@types/node@22.10.5)(jiti@2.4.2)(lightningcss@1.29.1)(sass@1.83.1)(terser@5.37.0)(yaml@2.7.0)
|
||||
vue: 3.5.13(typescript@5.7.3)
|
||||
transitivePeerDependencies:
|
||||
- supports-color
|
||||
|
||||
'@vitejs/plugin-vue@5.2.1(vite@6.0.7(@types/node@22.10.5)(jiti@2.4.2)(sass@1.83.1)(terser@5.37.0)(yaml@2.7.0))(vue@3.5.13(typescript@5.7.3))':
|
||||
'@vitejs/plugin-vue@5.2.1(vite@6.0.7(@types/node@22.10.5)(jiti@2.4.2)(lightningcss@1.29.1)(sass@1.83.1)(terser@5.37.0)(yaml@2.7.0))(vue@3.5.13(typescript@5.7.3))':
|
||||
dependencies:
|
||||
vite: 6.0.7(@types/node@22.10.5)(jiti@2.4.2)(sass@1.83.1)(terser@5.37.0)(yaml@2.7.0)
|
||||
vite: 6.0.7(@types/node@22.10.5)(jiti@2.4.2)(lightningcss@1.29.1)(sass@1.83.1)(terser@5.37.0)(yaml@2.7.0)
|
||||
vue: 3.5.13(typescript@5.7.3)
|
||||
|
||||
'@vue-macros/common@1.15.1(rollup@4.30.1)(vue@3.5.13(typescript@5.7.3))':
|
||||
@@ -5164,14 +5390,14 @@ snapshots:
|
||||
|
||||
'@vue/devtools-api@6.6.4': {}
|
||||
|
||||
'@vue/devtools-core@7.6.8(vite@6.0.7(@types/node@22.10.5)(jiti@2.4.2)(sass@1.83.1)(terser@5.37.0)(yaml@2.7.0))(vue@3.5.13(typescript@5.7.3))':
|
||||
'@vue/devtools-core@7.6.8(vite@6.0.7(@types/node@22.10.5)(jiti@2.4.2)(lightningcss@1.29.1)(sass@1.83.1)(terser@5.37.0)(yaml@2.7.0))(vue@3.5.13(typescript@5.7.3))':
|
||||
dependencies:
|
||||
'@vue/devtools-kit': 7.6.8
|
||||
'@vue/devtools-shared': 7.7.0
|
||||
mitt: 3.0.1
|
||||
nanoid: 5.0.9
|
||||
pathe: 1.1.2
|
||||
vite-hot-client: 0.2.4(vite@6.0.7(@types/node@22.10.5)(jiti@2.4.2)(sass@1.83.1)(terser@5.37.0)(yaml@2.7.0))
|
||||
vite-hot-client: 0.2.4(vite@6.0.7(@types/node@22.10.5)(jiti@2.4.2)(lightningcss@1.29.1)(sass@1.83.1)(terser@5.37.0)(yaml@2.7.0))
|
||||
vue: 3.5.13(typescript@5.7.3)
|
||||
transitivePeerDependencies:
|
||||
- vite
|
||||
@@ -6254,6 +6480,11 @@ snapshots:
|
||||
|
||||
jsqr@1.4.0: {}
|
||||
|
||||
jsqrgb@0.0.3:
|
||||
dependencies:
|
||||
jsqr: 1.4.0
|
||||
qrcode: 1.5.4
|
||||
|
||||
jwa@1.4.1:
|
||||
dependencies:
|
||||
buffer-equal-constant-time: 1.0.1
|
||||
@@ -6282,6 +6513,51 @@ snapshots:
|
||||
dependencies:
|
||||
readable-stream: 2.3.8
|
||||
|
||||
lightningcss-darwin-arm64@1.29.1:
|
||||
optional: true
|
||||
|
||||
lightningcss-darwin-x64@1.29.1:
|
||||
optional: true
|
||||
|
||||
lightningcss-freebsd-x64@1.29.1:
|
||||
optional: true
|
||||
|
||||
lightningcss-linux-arm-gnueabihf@1.29.1:
|
||||
optional: true
|
||||
|
||||
lightningcss-linux-arm64-gnu@1.29.1:
|
||||
optional: true
|
||||
|
||||
lightningcss-linux-arm64-musl@1.29.1:
|
||||
optional: true
|
||||
|
||||
lightningcss-linux-x64-gnu@1.29.1:
|
||||
optional: true
|
||||
|
||||
lightningcss-linux-x64-musl@1.29.1:
|
||||
optional: true
|
||||
|
||||
lightningcss-win32-arm64-msvc@1.29.1:
|
||||
optional: true
|
||||
|
||||
lightningcss-win32-x64-msvc@1.29.1:
|
||||
optional: true
|
||||
|
||||
lightningcss@1.29.1:
|
||||
dependencies:
|
||||
detect-libc: 1.0.3
|
||||
optionalDependencies:
|
||||
lightningcss-darwin-arm64: 1.29.1
|
||||
lightningcss-darwin-x64: 1.29.1
|
||||
lightningcss-freebsd-x64: 1.29.1
|
||||
lightningcss-linux-arm-gnueabihf: 1.29.1
|
||||
lightningcss-linux-arm64-gnu: 1.29.1
|
||||
lightningcss-linux-arm64-musl: 1.29.1
|
||||
lightningcss-linux-x64-gnu: 1.29.1
|
||||
lightningcss-linux-x64-musl: 1.29.1
|
||||
lightningcss-win32-arm64-msvc: 1.29.1
|
||||
lightningcss-win32-x64-msvc: 1.29.1
|
||||
|
||||
lilconfig@3.1.3: {}
|
||||
|
||||
linkify-it@5.0.0:
|
||||
@@ -6624,14 +6900,14 @@ snapshots:
|
||||
|
||||
nuxi@3.20.0: {}
|
||||
|
||||
nuxt@3.15.1(@parcel/watcher@2.5.0)(@types/node@22.10.5)(better-sqlite3@11.3.0)(db0@0.2.1(better-sqlite3@11.3.0))(ioredis@5.4.2)(magicast@0.3.5)(rollup@4.30.1)(sass@1.83.1)(terser@5.37.0)(typescript@5.7.3)(vite@6.0.7(@types/node@22.10.5)(jiti@2.4.2)(sass@1.83.1)(terser@5.37.0)(yaml@2.7.0))(yaml@2.7.0):
|
||||
nuxt@3.15.1(@parcel/watcher@2.5.0)(@types/node@22.10.5)(better-sqlite3@11.3.0)(db0@0.2.1(better-sqlite3@11.3.0))(ioredis@5.4.2)(lightningcss@1.29.1)(magicast@0.3.5)(rollup@4.30.1)(sass@1.83.1)(terser@5.37.0)(typescript@5.7.3)(vite@6.0.7(@types/node@22.10.5)(jiti@2.4.2)(lightningcss@1.29.1)(sass@1.83.1)(terser@5.37.0)(yaml@2.7.0))(yaml@2.7.0):
|
||||
dependencies:
|
||||
'@nuxt/devalue': 2.0.2
|
||||
'@nuxt/devtools': 1.7.0(rollup@4.30.1)(vite@6.0.7(@types/node@22.10.5)(jiti@2.4.2)(sass@1.83.1)(terser@5.37.0)(yaml@2.7.0))(vue@3.5.13(typescript@5.7.3))
|
||||
'@nuxt/devtools': 1.7.0(rollup@4.30.1)(vite@6.0.7(@types/node@22.10.5)(jiti@2.4.2)(lightningcss@1.29.1)(sass@1.83.1)(terser@5.37.0)(yaml@2.7.0))(vue@3.5.13(typescript@5.7.3))
|
||||
'@nuxt/kit': 3.15.1(magicast@0.3.5)(rollup@4.30.1)
|
||||
'@nuxt/schema': 3.15.1
|
||||
'@nuxt/telemetry': 2.6.4(magicast@0.3.5)(rollup@4.30.1)
|
||||
'@nuxt/vite-builder': 3.15.1(@types/node@22.10.5)(magicast@0.3.5)(rollup@4.30.1)(sass@1.83.1)(terser@5.37.0)(typescript@5.7.3)(vue@3.5.13(typescript@5.7.3))(yaml@2.7.0)
|
||||
'@nuxt/vite-builder': 3.15.1(@types/node@22.10.5)(lightningcss@1.29.1)(magicast@0.3.5)(rollup@4.30.1)(sass@1.83.1)(terser@5.37.0)(typescript@5.7.3)(vue@3.5.13(typescript@5.7.3))(yaml@2.7.0)
|
||||
'@unhead/dom': 1.11.16
|
||||
'@unhead/shared': 1.11.16
|
||||
'@unhead/ssr': 1.11.16
|
||||
@@ -7425,6 +7701,8 @@ snapshots:
|
||||
|
||||
system-architecture@0.1.0: {}
|
||||
|
||||
tailwindcss@4.0.5: {}
|
||||
|
||||
tapable@2.2.1: {}
|
||||
|
||||
tar-fs@2.1.2:
|
||||
@@ -7691,17 +7969,17 @@ snapshots:
|
||||
|
||||
util-deprecate@1.0.2: {}
|
||||
|
||||
vite-hot-client@0.2.4(vite@6.0.7(@types/node@22.10.5)(jiti@2.4.2)(sass@1.83.1)(terser@5.37.0)(yaml@2.7.0)):
|
||||
vite-hot-client@0.2.4(vite@6.0.7(@types/node@22.10.5)(jiti@2.4.2)(lightningcss@1.29.1)(sass@1.83.1)(terser@5.37.0)(yaml@2.7.0)):
|
||||
dependencies:
|
||||
vite: 6.0.7(@types/node@22.10.5)(jiti@2.4.2)(sass@1.83.1)(terser@5.37.0)(yaml@2.7.0)
|
||||
vite: 6.0.7(@types/node@22.10.5)(jiti@2.4.2)(lightningcss@1.29.1)(sass@1.83.1)(terser@5.37.0)(yaml@2.7.0)
|
||||
|
||||
vite-node@2.1.8(@types/node@22.10.5)(sass@1.83.1)(terser@5.37.0):
|
||||
vite-node@2.1.8(@types/node@22.10.5)(lightningcss@1.29.1)(sass@1.83.1)(terser@5.37.0):
|
||||
dependencies:
|
||||
cac: 6.7.14
|
||||
debug: 4.4.0(supports-color@9.4.0)
|
||||
es-module-lexer: 1.6.0
|
||||
pathe: 1.1.2
|
||||
vite: 5.4.11(@types/node@22.10.5)(sass@1.83.1)(terser@5.37.0)
|
||||
vite: 5.4.11(@types/node@22.10.5)(lightningcss@1.29.1)(sass@1.83.1)(terser@5.37.0)
|
||||
transitivePeerDependencies:
|
||||
- '@types/node'
|
||||
- less
|
||||
@@ -7713,7 +7991,7 @@ snapshots:
|
||||
- supports-color
|
||||
- terser
|
||||
|
||||
vite-plugin-checker@0.8.0(typescript@5.7.3)(vite@6.0.7(@types/node@22.10.5)(jiti@2.4.2)(sass@1.83.1)(terser@5.37.0)(yaml@2.7.0)):
|
||||
vite-plugin-checker@0.8.0(typescript@5.7.3)(vite@6.0.7(@types/node@22.10.5)(jiti@2.4.2)(lightningcss@1.29.1)(sass@1.83.1)(terser@5.37.0)(yaml@2.7.0)):
|
||||
dependencies:
|
||||
'@babel/code-frame': 7.26.2
|
||||
ansi-escapes: 4.3.2
|
||||
@@ -7725,7 +8003,7 @@ snapshots:
|
||||
npm-run-path: 4.0.1
|
||||
strip-ansi: 6.0.1
|
||||
tiny-invariant: 1.3.3
|
||||
vite: 6.0.7(@types/node@22.10.5)(jiti@2.4.2)(sass@1.83.1)(terser@5.37.0)(yaml@2.7.0)
|
||||
vite: 6.0.7(@types/node@22.10.5)(jiti@2.4.2)(lightningcss@1.29.1)(sass@1.83.1)(terser@5.37.0)(yaml@2.7.0)
|
||||
vscode-languageclient: 7.0.0
|
||||
vscode-languageserver: 7.0.0
|
||||
vscode-languageserver-textdocument: 1.0.12
|
||||
@@ -7733,7 +8011,7 @@ snapshots:
|
||||
optionalDependencies:
|
||||
typescript: 5.7.3
|
||||
|
||||
vite-plugin-inspect@0.8.9(@nuxt/kit@3.15.1(magicast@0.3.5)(rollup@4.30.1))(rollup@4.30.1)(vite@6.0.7(@types/node@22.10.5)(jiti@2.4.2)(sass@1.83.1)(terser@5.37.0)(yaml@2.7.0)):
|
||||
vite-plugin-inspect@0.8.9(@nuxt/kit@3.15.1(magicast@0.3.5)(rollup@4.30.1))(rollup@4.30.1)(vite@6.0.7(@types/node@22.10.5)(jiti@2.4.2)(lightningcss@1.29.1)(sass@1.83.1)(terser@5.37.0)(yaml@2.7.0)):
|
||||
dependencies:
|
||||
'@antfu/utils': 0.7.10
|
||||
'@rollup/pluginutils': 5.1.4(rollup@4.30.1)
|
||||
@@ -7744,24 +8022,24 @@ snapshots:
|
||||
perfect-debounce: 1.0.0
|
||||
picocolors: 1.1.1
|
||||
sirv: 3.0.0
|
||||
vite: 6.0.7(@types/node@22.10.5)(jiti@2.4.2)(sass@1.83.1)(terser@5.37.0)(yaml@2.7.0)
|
||||
vite: 6.0.7(@types/node@22.10.5)(jiti@2.4.2)(lightningcss@1.29.1)(sass@1.83.1)(terser@5.37.0)(yaml@2.7.0)
|
||||
optionalDependencies:
|
||||
'@nuxt/kit': 3.15.1(magicast@0.3.5)(rollup@4.30.1)
|
||||
transitivePeerDependencies:
|
||||
- rollup
|
||||
- supports-color
|
||||
|
||||
vite-plugin-mkcert@1.17.6(vite@6.0.7(@types/node@22.10.5)(jiti@2.4.2)(sass@1.83.1)(terser@5.37.0)(yaml@2.7.0)):
|
||||
vite-plugin-mkcert@1.17.6(vite@6.0.7(@types/node@22.10.5)(jiti@2.4.2)(lightningcss@1.29.1)(sass@1.83.1)(terser@5.37.0)(yaml@2.7.0)):
|
||||
dependencies:
|
||||
'@octokit/rest': 20.1.1
|
||||
axios: 1.7.9(debug@4.4.0)
|
||||
debug: 4.4.0(supports-color@9.4.0)
|
||||
picocolors: 1.1.1
|
||||
vite: 6.0.7(@types/node@22.10.5)(jiti@2.4.2)(sass@1.83.1)(terser@5.37.0)(yaml@2.7.0)
|
||||
vite: 6.0.7(@types/node@22.10.5)(jiti@2.4.2)(lightningcss@1.29.1)(sass@1.83.1)(terser@5.37.0)(yaml@2.7.0)
|
||||
transitivePeerDependencies:
|
||||
- supports-color
|
||||
|
||||
vite-plugin-vue-inspector@5.3.1(vite@6.0.7(@types/node@22.10.5)(jiti@2.4.2)(sass@1.83.1)(terser@5.37.0)(yaml@2.7.0)):
|
||||
vite-plugin-vue-inspector@5.3.1(vite@6.0.7(@types/node@22.10.5)(jiti@2.4.2)(lightningcss@1.29.1)(sass@1.83.1)(terser@5.37.0)(yaml@2.7.0)):
|
||||
dependencies:
|
||||
'@babel/core': 7.26.0
|
||||
'@babel/plugin-proposal-decorators': 7.25.9(@babel/core@7.26.0)
|
||||
@@ -7772,11 +8050,11 @@ snapshots:
|
||||
'@vue/compiler-dom': 3.5.13
|
||||
kolorist: 1.8.0
|
||||
magic-string: 0.30.17
|
||||
vite: 6.0.7(@types/node@22.10.5)(jiti@2.4.2)(sass@1.83.1)(terser@5.37.0)(yaml@2.7.0)
|
||||
vite: 6.0.7(@types/node@22.10.5)(jiti@2.4.2)(lightningcss@1.29.1)(sass@1.83.1)(terser@5.37.0)(yaml@2.7.0)
|
||||
transitivePeerDependencies:
|
||||
- supports-color
|
||||
|
||||
vite@5.4.11(@types/node@22.10.5)(sass@1.83.1)(terser@5.37.0):
|
||||
vite@5.4.11(@types/node@22.10.5)(lightningcss@1.29.1)(sass@1.83.1)(terser@5.37.0):
|
||||
dependencies:
|
||||
esbuild: 0.21.5
|
||||
postcss: 8.4.49
|
||||
@@ -7784,10 +8062,11 @@ snapshots:
|
||||
optionalDependencies:
|
||||
'@types/node': 22.10.5
|
||||
fsevents: 2.3.3
|
||||
lightningcss: 1.29.1
|
||||
sass: 1.83.1
|
||||
terser: 5.37.0
|
||||
|
||||
vite@6.0.7(@types/node@22.10.5)(jiti@2.4.2)(sass@1.83.1)(terser@5.37.0)(yaml@2.7.0):
|
||||
vite@6.0.7(@types/node@22.10.5)(jiti@2.4.2)(lightningcss@1.29.1)(sass@1.83.1)(terser@5.37.0)(yaml@2.7.0):
|
||||
dependencies:
|
||||
esbuild: 0.24.2
|
||||
postcss: 8.4.49
|
||||
@@ -7796,6 +8075,7 @@ snapshots:
|
||||
'@types/node': 22.10.5
|
||||
fsevents: 2.3.3
|
||||
jiti: 2.4.2
|
||||
lightningcss: 1.29.1
|
||||
sass: 1.83.1
|
||||
terser: 5.37.0
|
||||
yaml: 2.7.0
|
||||
|
||||
@@ -0,0 +1 @@
|
||||
(function(){"use strict";var w=r=>{throw TypeError(r)},g=(r,e,t)=>e.has(r)||w("Cannot "+t),l=(r,e,t)=>(g(r,e,"read from private field"),e.get(r)),f=(r,e,t)=>e.has(r)?w("Cannot add the same private member more than once"):e instanceof WeakSet?e.add(r):e.set(r,t);function z(r){const e=new ArrayBuffer(8),t=new Uint8Array(e);for(let a=0;a<8;a++)t[a]=r[a]||0;return new DataView(e).getFloat64(0,!0)}const p=[{filter:new Uint8Array([0]),deserialize:r=>r.deserializer.deserialize(r.targetArray)},{filter:new Uint8Array([1]),deserialize:async r=>{const e=await r.deserializer.deserialize(r.targetArray),t=new Array(e.l).fill(0);for(let a=0;a<e.l;a++)t[a]=e[a];return t}},{filter:new Uint8Array([2]),deserialize:r=>new Uint8Array(r.targetArray)},{filter:new Uint8Array([3]),deserialize:r=>new TextDecoder().decode(r.targetArray)},{filter:new Uint8Array([4]),deserialize:r=>z(r.targetArray)},{filter:new Uint8Array([5]),deserialize:r=>r.targetArray[0]===1},{filter:new Uint8Array([6]),deserialize:r=>{}},{filter:new Uint8Array([7]),deserialize:r=>null}];function v(r){let e=0;for(let t=0;t<r.length;t++)e=(e<<8)+r[t];return e}function U(r){const{targetArray:e,textDecoder:t=new TextDecoder}=r,a=e[0],n=e[1],i=e[2],s=t.decode(e.subarray(3,3+a)),y=e.subarray(3+a,3+a+n),b=e.subarray(3+a+n,3+a+n+i),A=v(b),k=e.subarray(3+a+n+i,3+a+n+i+A);return{key:s,valueType:y,value:k,totalLength:3+a+n+i+A}}const h=["0","1","2","3","4","5","6","7","8","9","a","b","c","d","e","f"],d=r=>r.reduce((e,t)=>e+h[t>>8]+h[t&255],"");var o,c,u;class m{constructor(){f(this,o,new Map),f(this,c,[]),f(this,u,new TextDecoder),p.forEach(e=>{this.registerPlugin(e)})}async deserialize(e){const t={};let a=0;for(;a<e.length;){const n=e.subarray(a),i=U({targetArray:n,textDecoder:l(this,u)});if(l(this,o).has(d(i.valueType))){const s=l(this,o).get(d(i.valueType)).deserialize({targetArray:i.value,deserializer:this});t[i.key]=s instanceof Promise?await s:s}else for(const s of l(this,c))if(s.filter(i.valueType)){const y=s.deserialize({targetArray:i.value,deserializer:this});t[i.key]=y instanceof Promise?await y:y}a+=i.totalLength}return t}registerPlugin(e){if(e.filter instanceof Uint8Array){l(this,o).set(d(e.filter),e);return}l(this,c).unshift(e)}}o=new WeakMap,c=new WeakMap,u=new WeakMap;const T=new m;self.onmessage=async r=>{const e=new Uint8Array(r.data),t=await T.deserialize(e);self.postMessage(t)}})();
|
||||
@@ -0,0 +1 @@
|
||||
@charset "UTF-8";/*! tailwindcss v4.1.7 | MIT License | https://tailwindcss.com */@layer theme{:root,:host{--font-sans:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";--font-mono:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;--spacing:.25rem;--container-2xs:18rem;--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono)}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;-moz-tab-size:4;tab-size:4;line-height:1.5;font-family:var(--default-font-family,ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring{outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab,red,red)){::placeholder{color:color-mix(in oklab,currentcolor 50%,transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){-webkit-appearance:button;-moz-appearance:button;appearance:button}::file-selector-button{-webkit-appearance:button;-moz-appearance:button;appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}}@layer components;@layer utilities{.relative{position:relative}.ml-2{margin-left:calc(var(--spacing)*2)}.flex{display:flex}.w-full{width:100%}.min-w-2xs{min-width:var(--container-2xs)}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.items-center{align-items:center}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.gap-2{gap:calc(var(--spacing)*2)}.gap-3{gap:calc(var(--spacing)*3)}.p-0\.5{padding:calc(var(--spacing)*.5)}}body{margin:0}:root{--el-color-white:#ffffff;--el-color-black:#000000;--el-color-primary-rgb:64,158,255;--el-color-success-rgb:103,194,58;--el-color-warning-rgb:230,162,60;--el-color-danger-rgb:245,108,108;--el-color-error-rgb:245,108,108;--el-color-info-rgb:144,147,153;--el-font-size-extra-large:20px;--el-font-size-large:18px;--el-font-size-medium:16px;--el-font-size-base:14px;--el-font-size-small:13px;--el-font-size-extra-small:12px;--el-font-family:"Helvetica Neue",Helvetica,"PingFang SC","Hiragino Sans GB","MicrLine truncated
|
||||
@@ -0,0 +1,17 @@
|
||||
var hd=Object.defineProperty;var vd=(e,t,n)=>t in e?hd(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n;var Sn=(e,t,n)=>vd(e,typeof t!="symbol"?t+"":t,n);(function(){const t=document.createElement("link").relList;if(t&&t.supports&&t.supports("modulepreload"))return;for(const o of document.querySelectorAll('link[rel="modulepreload"]'))r(o);new MutationObserver(o=>{for(const s of o)if(s.type==="childList")for(const i of s.addedNodes)i.tagName==="LINK"&&i.rel==="modulepreload"&&r(i)}).observe(document,{childList:!0,subtree:!0});function n(o){const s={};return o.integrity&&(s.integrity=o.integrity),o.referrerPolicy&&(s.referrerPolicy=o.referrerPolicy),o.crossOrigin==="use-credentials"?s.credentials="include":o.crossOrigin==="anonymous"?s.credentials="omit":s.credentials="same-origin",s}function r(o){if(o.ep)return;o.ep=!0;const s=n(o);fetch(o.href,s)}})();/**
|
||||
* @vue/shared v3.5.14
|
||||
* (c) 2018-present Yuxi (Evan) You and Vue contributors
|
||||
* @license MIT
|
||||
**//*! #__NO_SIDE_EFFECTS__ */function Ti(e){const t=Object.create(null);for(const n of e.split(","))t[n]=1;return n=>n in t}const Ee={},dr=[],st=()=>{},gd=()=>!1,ns=e=>e.charCodeAt(0)===111&&e.charCodeAt(1)===110&&(e.charCodeAt(2)>122||e.charCodeAt(2)<97),Ci=e=>e.startsWith("onUpdate:"),je=Object.assign,Oi=(e,t)=>{const n=e.indexOf(t);n>-1&&e.splice(n,1)},md=Object.prototype.hasOwnProperty,we=(e,t)=>md.call(e,t),Y=Array.isArray,pr=e=>rs(e)==="[object Map]",Ou=e=>rs(e)==="[object Set]",ee=e=>typeof e=="function",ye=e=>typeof e=="string",gn=e=>typeof e=="symbol",de=e=>e!==null&&typeof e=="object",ko=e=>(de(e)||ee(e))&&ee(e.then)&&ee(e.catch),Iu=Object.prototype.toString,rs=e=>Iu.call(e),bd=e=>rs(e).slice(8,-1),Ii=e=>rs(e)==="[object Object]",Ai=e=>ye(e)&&e!=="NaN"&&e[0]!=="-"&&""+parseInt(e,10)===e,jr=Ti(",key,ref,ref_for,ref_key,onVnodeBeforeMount,onVnodeMounted,onVnodeBeforeUpdate,onVnodeUpdated,onVnodeBeforeUnmount,onVnodeUnmounted"),os=e=>{const t=Object.create(null);return n=>t[n]||(t[n]=e(n))},yd=/-(\w)/g,wt=os(e=>e.replace(yd,(t,n)=>n?n.toUpperCase():"")),_d=/\B([A-Z])/g,mn=os(e=>e.replace(_d,"-$1").toLowerCase()),ss=os(e=>e.charAt(0).toUpperCase()+e.slice(1)),Mo=os(e=>e?`on${ss(e)}`:""),pt=(e,t)=>!Object.is(e,t),Ro=(e,...t)=>{for(let n=0;n<e.length;n++)e[n](...t)},Au=(e,t,n,r=!1)=>{Object.defineProperty(e,t,{configurable:!0,enumerable:!1,writable:r,value:n})},ei=e=>{const t=parseFloat(e);return isNaN(t)?e:t},wd=e=>{const t=ye(e)?Number(e):NaN;return isNaN(t)?e:t};let Oa;const is=()=>Oa||(Oa=typeof globalThis<"u"?globalThis:typeof self<"u"?self:typeof window<"u"?window:typeof global<"u"?global:{});function Ge(e){if(Y(e)){const t={};for(let n=0;n<e.length;n++){const r=e[n],o=ye(r)?Cd(r):Ge(r);if(o)for(const s in o)t[s]=o[s]}return t}else if(ye(e)||de(e))return e}const Sd=/;(?![^(]*\))/g,Ed=/:([^]+)/,Td=/\/\*[^]*?\*\//g;function Cd(e){const t={};return e.replace(Td,"").split(Sd).forEach(n=>{if(n){const r=n.split(Ed);r.length>1&&(t[r[0].trim()]=r[1].trim())}}),t}function U(e){let t="";if(ye(e))t=e;else if(Y(e))for(let n=0;n<e.length;n++){const r=U(e[n]);r&&(t+=r+" ")}else if(de(e))for(const n in e)e[n]&&(t+=n+" ");return t.trim()}const Od="itemscope,allowfullscreen,formnovalidate,ismap,nomodule,novalidate,readonly",Id=Ti(Od);function xu(e){return!!e||e===""}const Pu=e=>!!(e&&e.__v_isRef===!0),Ae=e=>ye(e)?e:e==null?"":Y(e)||de(e)&&(e.toString===Iu||!ee(e.toString))?Pu(e)?Ae(e.value):JSON.stringify(e,Mu,2):String(e),Mu=(e,t)=>Pu(t)?Mu(e,t.value):pr(t)?{[`Map(${t.size})`]:[...t.entries()].reduce((n,[r,o],s)=>(n[Rs(r,s)+" =>"]=o,n),{})}:Ou(t)?{[`Set(${t.size})`]:[...t.values()].map(n=>Rs(n))}:gn(t)?Rs(t):de(t)&&!Y(t)&&!Ii(t)?String(t):t,Rs=(e,t="")=>{var n;return gn(e)?`Symbol(${(n=e.description)!=null?n:t})`:e};/**
|
||||
* @vue/reactivity v3.5.14
|
||||
* (c) 2018-present Yuxi (Evan) You and Vue contributors
|
||||
* @license MIT
|
||||
**/let et;class Ad{constructor(t=!1){this.detached=t,this._active=!0,this._on=0,this.effects=[],this.cleanups=[],this._isPaused=!1,this.parent=et,!t&&et&&(this.index=(et.scopes||(et.scopes=[])).push(this)-1)}get active(){return this._active}pause(){if(this._active){this._isPaused=!0;let t,n;if(this.scopes)for(t=0,n=this.scopes.length;t<n;t++)this.scopes[t].pause();for(t=0,n=this.effects.length;t<n;t++)this.effects[t].pause()}}resume(){if(this._active&&this._isPaused){this._isPaused=!1;let t,n;if(this.scopes)for(t=0,n=this.scopes.length;t<n;t++)this.scopes[t].resume();for(t=0,n=this.effects.length;t<n;t++)this.effects[t].resume()}}run(t){if(this._active){const n=et;try{return et=this,t()}finally{et=n}}}on(){++this._on===1&&(this.prevScope=et,et=this)}off(){this._on>0&&--this._on===0&&(et=this.prevScope,this.prevScope=void 0)}stop(t){if(this._active){this._active=!1;let n,r;for(n=0,r=this.effects.length;n<r;n++)this.effects[n].stop();for(this.effects.length=0,n=0,r=this.cleanups.length;n<r;n++)this.cleanups[n]();if(this.cleanups.length=0,this.scopes){for(n=0,r=this.scopes.length;n<r;n++)this.scopes[n].stop(!0);this.scopes.length=0}if(!this.detached&&this.parent&&!t){const o=this.parent.scopes.pop();o&&o!==this&&(this.parent.scopes[this.index]=o,o.index=this.index)}this.parent=void 0}}}function Ru(){return et}function xd(e,t=!1){et&&et.cleanups.push(e)}let Ce;const $s=new WeakSet;class $u{constructor(t){this.fn=t,this.deps=void 0,this.depsTail=void 0,this.flags=5,this.next=void 0,this.cleanup=void 0,this.scheduler=void 0,et&&et.active&&et.effects.push(this)}pause(){this.flags|=64}resume(){this.flags&64&&(this.flags&=-65,$s.has(this)&&($s.delete(this),this.trigger()))}notify(){this.flags&2&&!(this.flags&32)||this.flags&8||Fu(this)}run(){if(!(this.flags&1))return this.fn();this.flags|=2,Ia(this),Lu(this);const t=Ce,n=kt;Ce=this,kt=!0;try{return this.fn()}finally{ku(this),Ce=t,kt=n,this.flags&=-3}}stop(){if(this.flags&1){for(let t=this.deps;t;t=t.nextDep)Mi(t);this.deps=this.depsTail=void 0,Ia(this),this.onStop&&this.onStop(),this.flags&=-2}}trigger(){this.flags&64?$s.add(this):this.scheduler?this.scheduler():this.runIfDirty()}runIfDirty(){ti(this)&&this.run()}get dirty(){return ti(this)}}let Nu=0,Vr,Hr;function Fu(e,t=!1){if(e.flags|=8,t){e.next=Hr,Hr=e;return}e.next=Vr,Vr=e}function xi(){Nu++}function Pi(){if(--Nu>0)return;if(Hr){let t=Hr;for(Hr=void 0;t;){const n=t.next;t.next=void 0,t.flags&=-9,t=n}}let e;for(;Vr;){let t=Vr;for(Vr=void 0;t;){const n=t.next;if(t.next=void 0,t.flags&=-9,t.flags&1)try{t.trigger()}catch(r){e||(e=r)}t=n}}if(e)throw e}function Lu(e){for(let t=e.deps;t;t=t.nextDep)t.version=-1,t.prevActiveLink=t.dep.activeLink,t.dep.activeLink=t}function ku(e){let t,n=e.depsTail,r=n;for(;r;){const o=r.prevDep;r.version===-1?(r===n&&(n=o),Mi(r),Pd(r)):t=r,r.dep.activeLink=r.prevActiveLink,r.prevActiveLink=void 0,r=o}e.deps=t,e.depsTail=n}function ti(e){for(let t=e.deps;t;t=t.nextDep)if(t.dep.version!==t.version||t.dep.computed&&(Bu(t.dep.computed)||t.dep.version!==t.version))return!0;return!!e._dirty}function Bu(e){if(e.flags&4&&!(e.flags&16)||(e.flags&=-17,e.globalVersion===Jr)||(e.globalVersion=Jr,!e.isSSR&&e.flags&128&&(!e.deps&&!e._dirty||!ti(e))))return;e.flags|=2;const t=e.dep,n=Ce,r=kt;Ce=e,kt=!0;try{Lu(e);const o=e.fn(e._value);(t.version===0||pt(o,e._value))&&(e.flags|=128,e._value=o,t.version++)}catch(o){throw t.version++,o}finally{Ce=n,kt=r,ku(e),e.flags&=-3}}function Mi(e,t=!1){const{dep:n,prevSub:r,nextSub:o}=e;if(r&&(r.nextSub=o,e.prevSub=void 0),o&&(o.prevSub=r,e.nextSub=void 0),n.subs===e&&(n.subs=r,!r&&n.computed)){n.computed.flags&=-5;for(let s=n.computed.deps;s;s=s.nextDep)Mi(s,!0)}!t&&!--n.sc&&n.map&&n.map.delete(n.key)}function Pd(e){const{prevDep:t,nextDep:n}=e;t&&(t.nextDep=n,e.prevDep=void 0),n&&(n.prevDep=t,e.nextDep=void 0)}let kt=!0;const Du=[];function dn(){Du.push(kt),kt=!1}function pn(){const e=Du.pop();kt=e===void 0?!0:e}function Ia(e){const{cleanup:t}=e;if(e.cleanup=void 0,t){const n=Ce;Ce=void 0;try{t()}finally{Ce=n}}}let Jr=0;class Md{constructor(t,n){this.sub=t,this.dep=n,this.version=n.version,this.nextDep=this.prevDep=this.nextSub=this.prevSub=this.prevActiveLink=void 0}}class as{constructor(t){this.computed=t,this.version=0,this.activeLink=void 0,this.subs=void 0,this.map=void 0,this.key=void 0,this.sc=0}track(t){if(!Ce||!kt||Ce===this.computed)return;let n=this.activeLink;if(n===void 0||n.sub!==Ce)n=this.activeLink=new Md(Ce,this),Ce.deps?(n.prevDep=Ce.depsTail,Ce.depsTail.nextDep=n,Ce.depsTail=n):Ce.deps=Ce.depsTail=n,ju(n);else if(n.version===-1&&(n.version=this.version,n.nextDep)){const r=n.nextDep;r.prevDep=n.prevDep,n.prevDep&&(n.prevDep.nextDep=r),n.prevDep=Ce.depsTail,n.nextDep=void 0,Ce.depsTail.nextDep=n,Ce.depsTail=n,Ce.deps===n&&(Ce.deps=r)}return n}trigger(t){this.version++,Jr++,this.notify(t)}notify(t){xi();try{for(let n=this.subs;n;n=n.prevSub)n.sub.notify()&&n.sub.dep.notify()}finally{Pi()}}}function ju(e){if(e.dep.sc++,e.sub.flags&4){const t=e.dLine truncated
|
||||
* @vue/runtime-core v3.5.14
|
||||
* (c) 2018-present Yuxi (Evan) You and Vue contributors
|
||||
* @license MIT
|
||||
**/function lo(e,t,n,r){try{return r?e(...r):e()}catch(o){cs(o,t,n)}}function Bt(e,t,n,r){if(ee(e)){const o=lo(e,t,n,r);return o&&ko(o)&&o.catch(s=>{cs(s,t,n)}),o}if(Y(e)){const o=[];for(let s=0;s<e.length;s++)o.push(Bt(e[s],t,n,r));return o}}function cs(e,t,n,r=!0){const o=t?t.vnode:null,{errorHandler:s,throwUnhandledErrorInProduction:i}=t&&t.appContext.config||Ee;if(t){let a=t.parent;const l=t.proxy,c=`https://vuejs.org/error-reference/#runtime-${n}`;for(;a;){const u=a.ec;if(u){for(let f=0;f<u.length;f++)if(u[f](e,l,c)===!1)return}a=a.parent}if(s){dn(),lo(s,null,10,[e,l,c]),pn();return}}ap(e,n,o,r,i)}function ap(e,t,n,r=!0,o=!1){if(o)throw e;console.error(e)}const ct=[];let Kt=-1;const vr=[];let On=null,lr=0;const Ju=Promise.resolve();let Vo=null;function Fe(e){const t=Vo||Ju;return e?t.then(this?e.bind(this):e):t}function lp(e){let t=Kt+1,n=ct.length;for(;t<n;){const r=t+n>>>1,o=ct[r],s=Xr(o);s<e||s===e&&o.flags&2?t=r+1:n=r}return t}function Li(e){if(!(e.flags&1)){const t=Xr(e),n=ct[ct.length-1];!n||!(e.flags&2)&&t>=Xr(n)?ct.push(e):ct.splice(lp(t),0,e),e.flags|=1,Zu()}}function Zu(){Vo||(Vo=Ju.then(Qu))}function up(e){Y(e)?vr.push(...e):On&&e.id===-1?On.splice(lr+1,0,e):e.flags&1||(vr.push(e),e.flags|=1),Zu()}function xa(e,t,n=Kt+1){for(;n<ct.length;n++){const r=ct[n];if(r&&r.flags&2){if(e&&r.id!==e.uid)continue;ct.splice(n,1),n--,r.flags&4&&(r.flags&=-2),r(),r.flags&4||(r.flags&=-2)}}}function Xu(e){if(vr.length){const t=[...new Set(vr)].sort((n,r)=>Xr(n)-Xr(r));if(vr.length=0,On){On.push(...t);return}for(On=t,lr=0;lr<On.length;lr++){const n=On[lr];n.flags&4&&(n.flags&=-2),n.flags&8||n(),n.flags&=-2}On=null,lr=0}}const Xr=e=>e.id==null?e.flags&2?-1:1/0:e.id;function Qu(e){try{for(Kt=0;Kt<ct.length;Kt++){const t=ct[Kt];t&&!(t.flags&8)&&(t.flags&4&&(t.flags&=-2),lo(t,t.i,t.i?15:14),t.flags&4||(t.flags&=-2))}}finally{for(;Kt<ct.length;Kt++){const t=ct[Kt];t&&(t.flags&=-2)}Kt=-1,ct.length=0,Xu(),Vo=null,(ct.length||vr.length)&&Qu()}}let He=null,ec=null;function Ho(e){const t=He;return He=e,ec=e&&e.type.__scopeId||null,t}function ne(e,t=He,n){if(!t||e._n)return e;const r=(...o)=>{r._d&&za(-1);const s=Ho(t);let i;try{i=e(...o)}finally{Ho(s),r._d&&za(1)}return i};return r._n=!0,r._c=!0,r._d=!0,r}function $n(e,t){if(He===null)return e;const n=vs(He),r=e.dirs||(e.dirs=[]);for(let o=0;o<t.length;o++){let[s,i,a,l=Ee]=t[o];s&&(ee(s)&&(s={mounted:s,updated:s}),s.deep&&sn(i),r.push({dir:s,instance:n,value:i,oldValue:void 0,arg:a,modifiers:l}))}return e}function Vn(e,t,n,r){const o=e.dirs,s=t&&t.dirs;for(let i=0;i<o.length;i++){const a=o[i];s&&(a.oldValue=s[i].value);let l=a.dir[r];l&&(dn(),Bt(l,n,8,[e.el,a,e,t]),pn())}}const tc=Symbol("_vte"),nc=e=>e.__isTeleport,zr=e=>e&&(e.disabled||e.disabled===""),Pa=e=>e&&(e.defer||e.defer===""),Ma=e=>typeof SVGElement<"u"&&e instanceof SVGElement,Ra=e=>typeof MathMLElement=="function"&&e instanceof MathMLElement,oi=(e,t)=>{const n=e&&e.to;return ye(n)?t?t(n):null:n},rc={name:"Teleport",__isTeleport:!0,process(e,t,n,r,o,s,i,a,l,c){const{mc:u,pc:f,pbc:d,o:{insert:h,querySelector:p,createText:v,createComment:w}}=c,y=zr(t.props);let{shapeFlag:A,children:E,dynamicChildren:C}=t;if(e==null){const _=t.el=v(""),x=t.anchor=v("");h(_,n,r),h(x,n,r);const B=(M,q)=>{A&16&&(o&&o.isCE&&(o.ce._teleportTarget=M),u(E,M,q,o,s,i,a,l))},j=()=>{const M=t.target=oi(t.props,p),q=oc(M,t,v,h);M&&(i!=="svg"&&Ma(M)?i="svg":i!=="mathml"&&Ra(M)&&(i="mathml"),y||(B(M,q),$o(t,!1)))};y&&(B(n,x),$o(t,!0)),Pa(t.props)?lt(()=>{j(),t.el.__isMounted=!0},s):j()}else{if(Pa(t.props)&&!e.el.__isMounted){lt(()=>{rc.process(e,t,n,r,o,s,i,a,l,c),delete e.el.__isMounted},s);return}t.el=e.el,t.targetStart=e.targetStart;const _=t.anchor=e.anchor,x=t.target=e.target,B=t.targetAnchor=e.targetAnchor,j=zr(e.props),M=j?n:x,q=j?_:B;if(i==="svg"||Ma(x)?i="svg":(i==="mathml"||Ra(x))&&(i="mathml"),C?(d(e.dynamicChildren,C,M,o,s,i,a),Hi(e,t,!0)):l||f(e,t,M,q,o,s,i,a,!1),y)j?t.props&&e.props&&t.props.to!==e.props.to&&(t.props.to=e.props.to):So(t,n,_,c,1);else if((t.props&&t.props.to)!==(e.props&&e.props.to)){const te=t.target=oi(t.props,p);te&&So(t,te,null,c,0)}else j&&So(t,x,B,c,1);$o(t,y)}},remove(e,t,n,{um:r,o:{remove:o}},s){const{shapeFlag:i,children:a,anchor:l,targetStart:c,targetAnchor:u,target:f,props:d}=e;if(f&&(o(c),o(u)),s&&o(l),i&16){const h=s||!zr(d);for(let p=0;p<a.length;p++){const v=a[p];r(v,t,n,h,!!v.dynamicChildren)}}},move:So,hydrate:cp};function So(e,t,n,{o:{insert:r},m:o},s=2){s===0&&r(e.targetAnchor,t,n);const{el:i,anchor:a,shapeFlag:l,children:c,props:u}=e,f=s===2;if(f&&r(i,t,n),(!f||zr(u))&&l&16)for(let d=0;d<c.length;d++)o(c[d],t,n,2);f&&r(a,t,n)}function cp(e,t,n,r,o,s,{o:{nextSibling:i,parentNode:a,querySelector:l,insert:c,createText:u}},f){const d=t.target=oi(t.props,l);if(d){const h=zr(t.props),p=d._lpa||d.firstChild;if(t.shapeFlag&16)if(h)t.anchor=f(i(e),t,a(e),n,r,o,s),t.targetStart=p,t.targetAnchor=p&&i(p);else{t.anchor=i(e);let v=p;for(;v;){if(v&&v.nodeType===8){if(v.data==="teleport start anchor")t.tar
Line truncated
|
||||
* @vue/runtime-dom v3.5.14
|
||||
* (c) 2018-present Yuxi (Evan) You and Vue contributors
|
||||
* @license MIT
|
||||
**/let fi;const Wa=typeof window<"u"&&window.trustedTypes;if(Wa)try{fi=Wa.createPolicy("vue",{createHTML:e=>e})}catch{}const Hc=fi?e=>fi.createHTML(e):e=>e,dh="http://www.w3.org/2000/svg",ph="http://www.w3.org/1998/Math/MathML",tn=typeof document<"u"?document:null,Ga=tn&&tn.createElement("template"),hh={insert:(e,t,n)=>{t.insertBefore(e,n||null)},remove:e=>{const t=e.parentNode;t&&t.removeChild(e)},createElement:(e,t,n,r)=>{const o=t==="svg"?tn.createElementNS(dh,e):t==="mathml"?tn.createElementNS(ph,e):n?tn.createElement(e,{is:n}):tn.createElement(e);return e==="select"&&r&&r.multiple!=null&&o.setAttribute("multiple",r.multiple),o},createText:e=>tn.createTextNode(e),createComment:e=>tn.createComment(e),setText:(e,t)=>{e.nodeValue=t},setElementText:(e,t)=>{e.textContent=t},parentNode:e=>e.parentNode,nextSibling:e=>e.nextSibling,querySelector:e=>tn.querySelector(e),setScopeId(e,t){e.setAttribute(t,"")},insertStaticContent(e,t,n,r,o,s){const i=n?n.previousSibling:t.lastChild;if(o&&(o===s||o.nextSibling))for(;t.insertBefore(o.cloneNode(!0),n),!(o===s||!(o=o.nextSibling)););else{Ga.innerHTML=Hc(r==="svg"?`<svg>${e}</svg>`:r==="mathml"?`<math>${e}</math>`:e);const a=Ga.content;if(r==="svg"||r==="mathml"){const l=a.firstChild;for(;l.firstChild;)a.appendChild(l.firstChild);a.removeChild(l)}t.insertBefore(a,n)}return[i?i.nextSibling:t.firstChild,n?n.previousSibling:t.lastChild]}},En="transition",$r="animation",no=Symbol("_vtc"),zc={name:String,type:String,css:{type:Boolean,default:!0},duration:[String,Number,Object],enterFromClass:String,enterActiveClass:String,enterToClass:String,appearFromClass:String,appearActiveClass:String,appearToClass:String,leaveFromClass:String,leaveActiveClass:String,leaveToClass:String},vh=je({},sc,zc),gh=e=>(e.displayName="Transition",e.props=vh,e),Ki=gh((e,{slots:t})=>uh(hp,mh(e),t)),Un=(e,t=[])=>{Y(e)?e.forEach(n=>n(...t)):e&&e(...t)},qa=e=>e?Y(e)?e.some(t=>t.length>1):e.length>1:!1;function mh(e){const t={};for(const $ in e)$ in zc||(t[$]=e[$]);if(e.css===!1)return t;const{name:n="v",type:r,duration:o,enterFromClass:s=`${n}-enter-from`,enterActiveClass:i=`${n}-enter-active`,enterToClass:a=`${n}-enter-to`,appearFromClass:l=s,appearActiveClass:c=i,appearToClass:u=a,leaveFromClass:f=`${n}-leave-from`,leaveActiveClass:d=`${n}-leave-active`,leaveToClass:h=`${n}-leave-to`}=e,p=bh(o),v=p&&p[0],w=p&&p[1],{onBeforeEnter:y,onEnter:A,onEnterCancelled:E,onLeave:C,onLeaveCancelled:_,onBeforeAppear:x=y,onAppear:B=A,onAppearCancelled:j=E}=t,M=($,ie,ve,Oe)=>{$._enterCancelled=Oe,Kn($,ie?u:a),Kn($,ie?c:i),ve&&ve()},q=($,ie)=>{$._isLeaving=!1,Kn($,f),Kn($,h),Kn($,d),ie&&ie()},te=$=>(ie,ve)=>{const Oe=$?B:A,ae=()=>M(ie,$,ve);Un(Oe,[ie,ae]),Ya(()=>{Kn(ie,$?l:s),Qt(ie,$?u:a),qa(Oe)||Ja(ie,r,v,ae)})};return je(t,{onBeforeEnter($){Un(y,[$]),Qt($,s),Qt($,i)},onBeforeAppear($){Un(x,[$]),Qt($,l),Qt($,c)},onEnter:te(!1),onAppear:te(!0),onLeave($,ie){$._isLeaving=!0;const ve=()=>q($,ie);Qt($,f),$._enterCancelled?(Qt($,d),Qa()):(Qa(),Qt($,d)),Ya(()=>{$._isLeaving&&(Kn($,f),Qt($,h),qa(C)||Ja($,r,w,ve))}),Un(C,[$,ve])},onEnterCancelled($){M($,!1,void 0,!0),Un(E,[$])},onAppearCancelled($){M($,!0,void 0,!0),Un(j,[$])},onLeaveCancelled($){q($),Un(_,[$])}})}function bh(e){if(e==null)return null;if(de(e))return[js(e.enter),js(e.leave)];{const t=js(e);return[t,t]}}function js(e){return wd(e)}function Qt(e,t){t.split(/\s+/).forEach(n=>n&&e.classList.add(n)),(e[no]||(e[no]=new Set)).add(t)}function Kn(e,t){t.split(/\s+/).forEach(r=>r&&e.classList.remove(r));const n=e[no];n&&(n.delete(t),n.size||(e[no]=void 0))}function Ya(e){requestAnimationFrame(()=>{requestAnimationFrame(e)})}let yh=0;function Ja(e,t,n,r){const o=e._endId=++yh,s=()=>{o===e._endId&&r()};if(n!=null)return setTimeout(s,n);const{type:i,timeout:a,propCount:l}=_h(e,t);if(!i)return r();const c=i+"end";let u=0;const f=()=>{e.removeEventListener(c,d),s()},d=h=>{h.target===e&&++u>=l&&f()};setTimeout(()=>{u<l&&f()},a+1),e.addEventListener(c,d)}function _h(e,t){const n=window.getComputedStyle(e),r=p=>(n[p]||"").split(", "),o=r(`${En}Delay`),s=r(`${En}Duration`),i=Za(o,s),a=r(`${$r}Delay`),l=r(`${$r}Duration`),c=Za(a,l);let u=null,f=0,d=0;t===En?i>0&&(u=En,f=i,d=s.length):t===$r?c>0&&(u=$r,f=c,d=l.length):(f=Math.max(i,c),u=f>0?i>c?En:$r:null,d=u?u===En?s.length:l.length:0);const h=u===En&&/\b(transform|all)(,|$)/.test(r(`${En}Property`).toString());return{type:u,timeout:f,propCount:d,hasTransform:h}}function Za(e,t){for(;e.length<t.length;)e=e.concat(e);return Math.max(...t.map((n,r)=>Xa(n)+Xa(e[r])))}function Xa(e){return e==="auto"?0:Number(e.slice(0,-1).replace(",","."))*1e3}function Qa(){return document.body.offsetHeight}function wh(e,t,n){const r=e[no];r&&(t=(t?[t,...r]:[...r]).join(" ")),t==null?e.removeAttribute("class"):n?e.setAttribute("class",t):e.className=t}const qo=Symbol("_vod"),Uc=Symbol("_vsh"),co={beforeMount(e,{value:t},{transition:n}){e[qo]=e.style.display==="none"?"":e.style.display,n&&t?n.beforeEnter(e):Nr(e,t)},mounted(e,{value:t},{transition
Line truncated
|
||||
@@ -0,0 +1 @@
|
||||
(function(){"use strict";var y=e=>{throw TypeError(e)},g=(e,t,r)=>t.has(e)||y("Cannot "+r),l=(e,t,r)=>(g(e,t,"read from private field"),r?r.call(e):t.get(e)),w=(e,t,r)=>t.has(e)?y("Cannot add the same private member more than once"):t instanceof WeakSet?t.add(e):t.set(e,r);const c=new WeakMap,f=e=>{if(e instanceof Uint8Array)return e.length;{if(c.has(e))return c.get(e);const t=e.reduce((r,n)=>r+f(n),0);return c.set(e,t),t}},h=(e,t)=>{t=t||1;const r=[];for(;e>0||t>0;)r.unshift(e&255),e=e>>8,t--;return new Uint8Array(r)},p=e=>{const{key:t,valueType:r,value:n,textEncoder:i=new TextEncoder}=e,a=i.encode(t),s=h(f(n));return[new Uint8Array([a.length,r.length,s.length]),a,r,s,n]};function A(e){const t=new ArrayBuffer(8);return new DataView(t).setFloat64(0,e,!0),new Uint8Array(Array.from(new Uint8Array(t)))}const u=async e=>e instanceof Promise?await e:e,U=[{filter:e=>e instanceof Object,targetType:new Uint8Array([0]),async serialize(e){const t=new TextEncoder,r=[];for(const n in e.target){const i=e.target[n],a=await e.serializer.filterPlugin(i),s=a.targetType;if(!s)throw new Error("Unknown value type");const v=await u(a.serialize({target:i,serializer:e.serializer}))??new Uint8Array(0);r.push(p({key:n,valueType:s,value:v,textEncoder:t}))}return r}},{filter:e=>e instanceof Array,targetType:new Uint8Array([1]),async serialize(e){const t={...e.target,l:e.target.length};return await e.serializer.serialize(t)}},{filter:e=>e instanceof Uint8Array,targetType:new Uint8Array([2]),serialize(e){return e.target}},{filter(e){return typeof e=="string"},targetType:new Uint8Array([3]),serialize(e){return(e.textEncoder||new TextEncoder).encode(e.target)}},{filter(e){return typeof e=="number"},targetType:new Uint8Array([4]),serialize(e){return A(e.target)}},{filter(e){return typeof e=="boolean"},targetType:new Uint8Array([5]),serialize(e){return new Uint8Array([e.target?1:0])}},{filter(e){return typeof e>"u"},targetType:new Uint8Array([6]),serialize(){return new Uint8Array(0)}},{filter(e){return e===null},targetType:new Uint8Array([7]),serialize(){return new Uint8Array(0)}}];function z(e,t){const r=t??e.reduce((a,s)=>a+s.length,0),n=new Uint8Array(r);let i=0;for(const a of e)n.set(a,i),i+=a.length;return n}var o;class d{constructor(){w(this,o,[]),U.forEach(t=>{this.registerPlugin(t)})}async serialize(t){for(const r of l(this,o))if(r.filter(t)){const n=await u(r.serialize({target:t,serializer:this}));return n instanceof Uint8Array?n:z(n.flat(1/0),f(n))}}async filterPlugin(t){for(const r of l(this,o))if(r.filter(t))return r}registerPlugin(t){l(this,o).unshift(t)}}o=new WeakMap;const T=new d;self.onmessage=async e=>{const t=e.data,r=await T.serialize(t);self.postMessage(r)}})();
|
||||
@@ -0,0 +1,13 @@
|
||||
<!doctype html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||
<title>Bobj Demo</title>
|
||||
<script type="module" crossorigin src="./assets/index-DhXdPBmT.js"></script>
|
||||
<link rel="stylesheet" crossorigin href="./assets/index-CvYTlbt6.css">
|
||||
</head>
|
||||
<body>
|
||||
<div id="app"></div>
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1 @@
|
||||
var h=Object.defineProperty;var y=(i,n,s)=>n in i?h(i,n,{enumerable:!0,configurable:!0,writable:!0,value:s}):i[n]=s;var c=(i,n,s)=>y(i,typeof n!="symbol"?n+"":n,s);(function(){"use strict";class i{constructor(t){c(this,"counter");c(this,"bias",0);this.counter=new Uint8Array(16),t instanceof Uint8Array?this.counter=new Uint8Array([...t]):new DataView(this.counter.buffer).setUint32(0,t??0,!0)}increase(t){t=Math.floor(t??1),this.bias+=t;let e=Math.floor(this.bias/16);this.bias=this.bias%16;for(let r=15;r>=8&&e!==0;r--){const a=this.counter[r]+e;this.counter[r]=a&255,e=a>>8}}get value(){return new Uint8Array([...this.counter])}}class n{constructor(t,e){c(this,"key");c(this,"counter");c(this,"_remainingCounterIndex",0);this.key=t,this.counter=new i(e)}async encrypt(t){const e=this._remainingCounterIndex,r=(16-(e+t.length)%16)%16,a=new Uint8Array([...new Uint8Array(e).fill(0),...t,...new Uint8Array(r).fill(0)]),u=this.counter.value,l=await crypto.subtle.encrypt({name:"AES-CTR",counter:u,length:128},this.key,a);return this._remainingCounterIndex=r,this.counter.increase(t.length),new Uint8Array(l).slice(e,e+t.length)}}let s;self.onmessage=async function(o){try{const{data:t,key:e}=o.data;if(!s){const a=await crypto.subtle.importKey("raw",e,{name:"AES-CTR"},!1,["encrypt"]);s=new n(a,7058)}const r=await s.encrypt(t);self.postMessage(r)}catch(t){throw t}}})();
|
||||
@@ -0,0 +1,29 @@
|
||||
(function(){const t=document.createElement("link").relList;if(t&&t.supports&&t.supports("modulepreload"))return;for(const s of document.querySelectorAll('link[rel="modulepreload"]'))r(s);new MutationObserver(s=>{for(const o of s)if(o.type==="childList")for(const i of o.addedNodes)i.tagName==="LINK"&&i.rel==="modulepreload"&&r(i)}).observe(document,{childList:!0,subtree:!0});function n(s){const o={};return s.integrity&&(o.integrity=s.integrity),s.referrerPolicy&&(o.referrerPolicy=s.referrerPolicy),s.crossOrigin==="use-credentials"?o.credentials="include":s.crossOrigin==="anonymous"?o.credentials="omit":o.credentials="same-origin",o}function r(s){if(s.ep)return;s.ep=!0;const o=n(s);fetch(s.href,o)}})();/**
|
||||
* @vue/shared v3.5.13
|
||||
* (c) 2018-present Yuxi (Evan) You and Vue contributors
|
||||
* @license MIT
|
||||
**//*! #__NO_SIDE_EFFECTS__ */function to(e){const t=Object.create(null);for(const n of e.split(","))t[n]=1;return n=>n in t}const ge={},In=[],Be=()=>{},Mu=()=>!1,qr=e=>e.charCodeAt(0)===111&&e.charCodeAt(1)===110&&(e.charCodeAt(2)>122||e.charCodeAt(2)<97),no=e=>e.startsWith("onUpdate:"),Ae=Object.assign,ro=(e,t)=>{const n=e.indexOf(t);n>-1&&e.splice(n,1)},Nu=Object.prototype.hasOwnProperty,ue=(e,t)=>Nu.call(e,t),Z=Array.isArray,On=e=>Jr(e)==="[object Map]",al=e=>Jr(e)==="[object Set]",W=e=>typeof e=="function",ce=e=>typeof e=="string",Rt=e=>typeof e=="symbol",he=e=>e!==null&&typeof e=="object",ul=e=>(he(e)||W(e))&&W(e.then)&&W(e.catch),cl=Object.prototype.toString,Jr=e=>cl.call(e),Pu=e=>Jr(e).slice(8,-1),fl=e=>Jr(e)==="[object Object]",so=e=>ce(e)&&e!=="NaN"&&e[0]!=="-"&&""+parseInt(e,10)===e,jn=to(",key,ref,ref_for,ref_key,onVnodeBeforeMount,onVnodeMounted,onVnodeBeforeUpdate,onVnodeUpdated,onVnodeBeforeUnmount,onVnodeUnmounted"),Xr=e=>{const t=Object.create(null);return n=>t[n]||(t[n]=e(n))},$u=/-(\w)/g,Ge=Xr(e=>e.replace($u,(t,n)=>n?n.toUpperCase():"")),Lu=/\B([A-Z])/g,Ft=Xr(e=>e.replace(Lu,"-$1").toLowerCase()),Zr=Xr(e=>e.charAt(0).toUpperCase()+e.slice(1)),vs=Xr(e=>e?`on${Zr(e)}`:""),We=(e,t)=>!Object.is(e,t),bs=(e,...t)=>{for(let n=0;n<e.length;n++)e[n](...t)},dl=(e,t,n,r=!1)=>{Object.defineProperty(e,t,{configurable:!0,enumerable:!1,writable:r,value:n})},ku=e=>{const t=parseFloat(e);return isNaN(t)?e:t},Ru=e=>{const t=ce(e)?Number(e):NaN;return isNaN(t)?e:t};let Do;const Qr=()=>Do||(Do=typeof globalThis<"u"?globalThis:typeof self<"u"?self:typeof window<"u"?window:typeof global<"u"?global:{});function at(e){if(Z(e)){const t={};for(let n=0;n<e.length;n++){const r=e[n],s=ce(r)?Du(r):at(r);if(s)for(const o in s)t[o]=s[o]}return t}else if(ce(e)||he(e))return e}const Fu=/;(?![^(]*\))/g,Bu=/:([^]+)/,Vu=/\/\*[^]*?\*\//g;function Du(e){const t={};return e.replace(Vu,"").split(Fu).forEach(n=>{if(n){const r=n.split(Bu);r.length>1&&(t[r[0].trim()]=r[1].trim())}}),t}function q(e){let t="";if(ce(e))t=e;else if(Z(e))for(let n=0;n<e.length;n++){const r=q(e[n]);r&&(t+=r+" ")}else if(he(e))for(const n in e)e[n]&&(t+=n+" ");return t.trim()}const Hu="itemscope,allowfullscreen,formnovalidate,ismap,nomodule,novalidate,readonly",ju=to(Hu);function pl(e){return!!e||e===""}const hl=e=>!!(e&&e.__v_isRef===!0),je=e=>ce(e)?e:e==null?"":Z(e)||he(e)&&(e.toString===cl||!W(e.toString))?hl(e)?je(e.value):JSON.stringify(e,gl,2):String(e),gl=(e,t)=>hl(t)?gl(e,t.value):On(t)?{[`Map(${t.size})`]:[...t.entries()].reduce((n,[r,s],o)=>(n[ys(r,o)+" =>"]=s,n),{})}:al(t)?{[`Set(${t.size})`]:[...t.values()].map(n=>ys(n))}:Rt(t)?ys(t):he(t)&&!Z(t)&&!fl(t)?String(t):t,ys=(e,t="")=>{var n;return Rt(e)?`Symbol(${(n=e.description)!=null?n:t})`:e};/**
|
||||
* @vue/reactivity v3.5.13
|
||||
* (c) 2018-present Yuxi (Evan) You and Vue contributors
|
||||
* @license MIT
|
||||
**/let De;class ml{constructor(t=!1){this.detached=t,this._active=!0,this.effects=[],this.cleanups=[],this._isPaused=!1,this.parent=De,!t&&De&&(this.index=(De.scopes||(De.scopes=[])).push(this)-1)}get active(){return this._active}pause(){if(this._active){this._isPaused=!0;let t,n;if(this.scopes)for(t=0,n=this.scopes.length;t<n;t++)this.scopes[t].pause();for(t=0,n=this.effects.length;t<n;t++)this.effects[t].pause()}}resume(){if(this._active&&this._isPaused){this._isPaused=!1;let t,n;if(this.scopes)for(t=0,n=this.scopes.length;t<n;t++)this.scopes[t].resume();for(t=0,n=this.effects.length;t<n;t++)this.effects[t].resume()}}run(t){if(this._active){const n=De;try{return De=this,t()}finally{De=n}}}on(){De=this}off(){De=this.parent}stop(t){if(this._active){this._active=!1;let n,r;for(n=0,r=this.effects.length;n<r;n++)this.effects[n].stop();for(this.effects.length=0,n=0,r=this.cleanups.length;n<r;n++)this.cleanups[n]();if(this.cleanups.length=0,this.scopes){for(n=0,r=this.scopes.length;n<r;n++)this.scopes[n].stop(!0);this.scopes.length=0}if(!this.detached&&this.parent&&!t){const s=this.parent.scopes.pop();s&&s!==this&&(this.parent.scopes[this.index]=s,s.index=this.index)}this.parent=void 0}}}function vl(e){return new ml(e)}function oo(){return De}function io(e,t=!1){De&&De.cleanups.push(e)}let be;const _s=new WeakSet;class bl{constructor(t){this.fn=t,this.deps=void 0,this.depsTail=void 0,this.flags=5,this.next=void 0,this.cleanup=void 0,this.scheduler=void 0,De&&De.active&&De.effects.push(this)}pause(){this.flags|=64}resume(){this.flags&64&&(this.flags&=-65,_s.has(this)&&(_s.delete(this),this.trigger()))}notify(){this.flags&2&&!(this.flags&32)||this.flags&8||_l(this)}run(){if(!(this.flags&1))return this.fn();this.flags|=2,Ho(this),wl(this);const t=be,n=ht;be=this,ht=!0;try{return this.fn()}finally{xl(this),be=t,ht=n,this.flags&=-3}}stop(){if(this.flags&1){for(let t=this.deps;t;t=t.nextDep)uo(t);this.deps=this.depsTail=void 0,Ho(this),this.onStop&&this.onStop(),this.flags&=-2}}trigger(){this.flags&64?_s.add(this):this.scheduler?this.scheduler():this.runIfDirty()}runIfDirty(){Bs(this)&&this.run()}get dirty(){return Bs(this)}}let yl=0,zn,Un;function _l(e,t=!1){if(e.flags|=8,t){e.next=Un,Un=e;return}e.next=zn,zn=e}function lo(){yl++}function ao(){if(--yl>0)return;if(Un){let t=Un;for(Un=void 0;t;){const n=t.next;t.next=void 0,t.flags&=-9,t=n}}let e;for(;zn;){let t=zn;for(zn=void 0;t;){const n=t.next;if(t.next=void 0,t.flags&=-9,t.flags&1)try{t.trigger()}catch(r){e||(e=r)}t=n}}if(e)throw e}function wl(e){for(let t=e.deps;t;t=t.nextDep)t.version=-1,t.prevActiveLink=t.dep.activeLink,t.dep.activeLink=t}function xl(e){let t,n=e.depsTail,r=n;for(;r;){const s=r.prevDep;r.version===-1?(r===n&&(n=s),uo(r),zu(r)):t=r,r.dep.activeLink=r.prevActiveLink,r.prevActiveLink=void 0,r=s}e.deps=t,e.depsTail=n}function Bs(e){for(let t=e.deps;t;t=t.nextDep)if(t.dep.version!==t.version||t.dep.computed&&(Sl(t.dep.computed)||t.dep.version!==t.version))return!0;return!!e._dirty}function Sl(e){if(e.flags&4&&!(e.flags&16)||(e.flags&=-17,e.globalVersion===Jn))return;e.globalVersion=Jn;const t=e.dep;if(e.flags|=2,t.version>0&&!e.isSSR&&e.deps&&!Bs(e)){e.flags&=-3;return}const n=be,r=ht;be=e,ht=!0;try{wl(e);const s=e.fn(e._value);(t.version===0||We(s,e._value))&&(e._value=s,t.version++)}catch(s){throw t.version++,s}finally{be=n,ht=r,xl(e),e.flags&=-3}}function uo(e,t=!1){const{dep:n,prevSub:r,nextSub:s}=e;if(r&&(r.nextSub=s,e.prevSub=void 0),s&&(s.prevSub=r,e.nextSub=void 0),n.subs===e&&(n.subs=r,!r&&n.computed)){n.computed.flags&=-5;for(let o=n.computed.deps;o;o=o.nextDep)uo(o,!0)}!t&&!--n.sc&&n.map&&n.map.delete(n.key)}function zu(e){const{prevDep:t,nextDep:n}=e;t&&(t.nextDep=n,e.prevDep=void 0),n&&(n.prevDep=t,e.nextDep=void 0)}let ht=!0;const Cl=[];function en(){Cl.push(ht),ht=!1}function tn(){const e=Cl.pop();ht=e===void 0?!0:e}function Ho(e){const{cleanup:t}=e;if(e.cleanup=void 0,t){const n=be;be=void 0;try{t()}finally{be=n}}}let Jn=0;class Uu{constructor(t,n){this.sub=t,this.dep=n,this.version=n.version,this.nextDep=this.prevDep=this.nextSub=this.prevSub=this.prevActiveLink=void 0}}class es{constructor(t){this.computed=t,this.version=0,this.activeLink=void 0,this.subs=void 0,this.map=void 0,this.key=void 0,this.sc=0}track(t){if(!be||!ht||be===this.computed)return;let n=this.activeLink;if(n===void 0||n.sub!==be)n=this.activeLink=new Uu(be,this),be.deps?(n.prevDep=be.depsTail,be.depsTail.nextDep=n,be.depsTail=n):be.deps=be.depsTail=n,El(n);else if(n.version===-1&&(n.version=this.version,n.nextDep)){const r=n.nextDep;r.prevDep=n.prevDep,n.prevDep&&(n.prevDep.nextDep=r),n.prevDep=be.depsTail,n.nextDep=void 0,be.depsTail.nextDep=n,be.depsTail=n,be.deps===n&&(be.deps=r)}return n}trigger(t){this.version++,Jn++,this.notify(t)}notify(t){lo();try{for(let n=this.subs;n;n=n.prevSub)n.sub.notify()&&n.sub.dep.notify()}finally{ao()}}}function El(e){if(e.dep.sc++,e.sub.flags&4){const t=e.dep.computed;if(t&&!e.dep.subs){t.flags|=20;for(let r=t.deps;r;r=r.nextDLine truncated
|
||||
* @vue/runtime-core v3.5.13
|
||||
* (c) 2018-present Yuxi (Evan) You and Vue contributors
|
||||
* @license MIT
|
||||
**/function cr(e,t,n,r){try{return r?e(...r):e()}catch(s){rs(s,t,n)}}function gt(e,t,n,r){if(W(e)){const s=cr(e,t,n,r);return s&&ul(s)&&s.catch(o=>{rs(o,t,n)}),s}if(Z(e)){const s=[];for(let o=0;o<e.length;o++)s.push(gt(e[o],t,n,r));return s}}function rs(e,t,n,r=!0){const s=t?t.vnode:null,{errorHandler:o,throwUnhandledErrorInProduction:i}=t&&t.appContext.config||ge;if(t){let l=t.parent;const a=t.proxy,u=`https://vuejs.org/error-reference/#runtime-${n}`;for(;l;){const c=l.ec;if(c){for(let p=0;p<c.length;p++)if(c[p](e,a,u)===!1)return}l=l.parent}if(o){en(),cr(o,null,10,[e,a,u]),tn();return}}bc(e,n,s,r,i)}function bc(e,t,n,r=!0,s=!1){if(s)throw e;console.error(e)}const He=[];let xt=-1;const An=[];let Kt=null,Cn=0;const Fl=Promise.resolve();let Fr=null;function Fe(e){const t=Fr||Fl;return e?t.then(this?e.bind(this):e):t}function yc(e){let t=xt+1,n=He.length;for(;t<n;){const r=t+n>>>1,s=He[r],o=Qn(s);o<e||o===e&&s.flags&2?t=r+1:n=r}return t}function ho(e){if(!(e.flags&1)){const t=Qn(e),n=He[He.length-1];!n||!(e.flags&2)&&t>=Qn(n)?He.push(e):He.splice(yc(t),0,e),e.flags|=1,Bl()}}function Bl(){Fr||(Fr=Fl.then(Dl))}function _c(e){Z(e)?An.push(...e):Kt&&e.id===-1?Kt.splice(Cn+1,0,e):e.flags&1||(An.push(e),e.flags|=1),Bl()}function zo(e,t,n=xt+1){for(;n<He.length;n++){const r=He[n];if(r&&r.flags&2){if(e&&r.id!==e.uid)continue;He.splice(n,1),n--,r.flags&4&&(r.flags&=-2),r(),r.flags&4||(r.flags&=-2)}}}function Vl(e){if(An.length){const t=[...new Set(An)].sort((n,r)=>Qn(n)-Qn(r));if(An.length=0,Kt){Kt.push(...t);return}for(Kt=t,Cn=0;Cn<Kt.length;Cn++){const n=Kt[Cn];n.flags&4&&(n.flags&=-2),n.flags&8||n(),n.flags&=-2}Kt=null,Cn=0}}const Qn=e=>e.id==null?e.flags&2?-1:1/0:e.id;function Dl(e){try{for(xt=0;xt<He.length;xt++){const t=He[xt];t&&!(t.flags&8)&&(t.flags&4&&(t.flags&=-2),cr(t,t.i,t.i?15:14),t.flags&4||(t.flags&=-2))}}finally{for(;xt<He.length;xt++){const t=He[xt];t&&(t.flags&=-2)}xt=-1,He.length=0,Vl(),Fr=null,(He.length||An.length)&&Dl()}}let Ie=null,Hl=null;function Br(e){const t=Ie;return Ie=e,Hl=e&&e.type.__scopeId||null,t}function le(e,t=Ie,n){if(!t||e._n)return e;const r=(...s)=>{r._d&&ti(-1);const o=Br(t);let i;try{i=e(...s)}finally{Br(o),r._d&&ti(1)}return i};return r._n=!0,r._c=!0,r._d=!0,r}function Et(e,t){if(Ie===null)return e;const n=as(Ie),r=e.dirs||(e.dirs=[]);for(let s=0;s<t.length;s++){let[o,i,l,a=ge]=t[s];o&&(W(o)&&(o={mounted:o,updated:o}),o.deep&&Pt(i),r.push({dir:o,instance:n,value:i,oldValue:void 0,arg:l,modifiers:a}))}return e}function nn(e,t,n,r){const s=e.dirs,o=t&&t.dirs;for(let i=0;i<s.length;i++){const l=s[i];o&&(l.oldValue=o[i].value);let a=l.dir[r];a&&(en(),gt(a,n,8,[e.el,l,e,t]),tn())}}const wc=Symbol("_vte"),jl=e=>e.__isTeleport,Wt=Symbol("_leaveCb"),_r=Symbol("_enterCb");function xc(){const e={isMounted:!1,isLeaving:!1,isUnmounting:!1,leavingVNodes:new Map};return nt(()=>{e.isMounted=!0}),bn(()=>{e.isUnmounting=!0}),e}const rt=[Function,Array],zl={mode:String,appear:Boolean,persisted:Boolean,onBeforeEnter:rt,onEnter:rt,onAfterEnter:rt,onEnterCancelled:rt,onBeforeLeave:rt,onLeave:rt,onAfterLeave:rt,onLeaveCancelled:rt,onBeforeAppear:rt,onAppear:rt,onAfterAppear:rt,onAppearCancelled:rt},Ul=e=>{const t=e.subTree;return t.component?Ul(t.component):t},Sc={name:"BaseTransition",props:zl,setup(e,{slots:t}){const n=et(),r=xc();return()=>{const s=t.default&&Gl(t.default(),!0);if(!s||!s.length)return;const o=Kl(s),i=de(e),{mode:l}=i;if(r.isLeaving)return Ss(o);const a=Uo(o);if(!a)return Ss(o);let u=js(a,i,r,n,p=>u=p);a.type!==ze&&er(a,u);let c=n.subTree&&Uo(n.subTree);if(c&&c.type!==ze&&!un(a,c)&&Ul(n).type!==ze){let p=js(c,i,r,n);if(er(c,p),l==="out-in"&&a.type!==ze)return r.isLeaving=!0,p.afterLeave=()=>{r.isLeaving=!1,n.job.flags&8||n.update(),delete p.afterLeave,c=void 0},Ss(o);l==="in-out"&&a.type!==ze?p.delayLeave=(g,b,d)=>{const v=Wl(r,c);v[String(c.key)]=c,g[Wt]=()=>{b(),g[Wt]=void 0,delete u.delayedLeave,c=void 0},u.delayedLeave=()=>{d(),delete u.delayedLeave,c=void 0}}:c=void 0}else c&&(c=void 0);return o}}};function Kl(e){let t=e[0];if(e.length>1){for(const n of e)if(n.type!==ze){t=n;break}}return t}const Cc=Sc;function Wl(e,t){const{leavingVNodes:n}=e;let r=n.get(t.type);return r||(r=Object.create(null),n.set(t.type,r)),r}function js(e,t,n,r,s){const{appear:o,mode:i,persisted:l=!1,onBeforeEnter:a,onEnter:u,onAfterEnter:c,onEnterCancelled:p,onBeforeLeave:g,onLeave:b,onAfterLeave:d,onLeaveCancelled:v,onBeforeAppear:w,onAppear:x,onAfterAppear:D,onAppearCancelled:K}=t,B=String(e.key),j=Wl(n,e),te=($,G)=>{$&>($,r,9,G)},H=($,G)=>{const Q=G[1];te($,G),Z($)?$.every(A=>A.length<=1)&&Q():$.length<=1&&Q()},z={mode:i,persisted:l,beforeEnter($){let G=a;if(!n.isMounted)if(o)G=w||a;else return;$[Wt]&&$[Wt](!0);const Q=j[B];Q&&un(e,Q)&&Q.el[Wt]&&Q.el[Wt](),te(G,[$])},enter($){let G=u,Q=c,A=p;if(!n.isMounted)if(o)G=x||u,Q=D||c,A=K||p;else return;let ee=!1;const me=$[_r]=C=>{ee||(ee=!0,C?te(A,[$]):te(Q,[$]),z.delayedLeave&&z.delayedLeave(),$[_r]=void 0)};G?H(G,[$,me]):me()},leave($,G){const Q=St
Line truncated
|
||||
* @vue/runtime-dom v3.5.13
|
||||
* (c) 2018-present Yuxi (Evan) You and Vue contributors
|
||||
* @license MIT
|
||||
**/let Ys;const si=typeof window<"u"&&window.trustedTypes;if(si)try{Ys=si.createPolicy("vue",{createHTML:e=>e})}catch{}const Oa=Ys?e=>Ys.createHTML(e):e=>e,Cf="http://www.w3.org/2000/svg",Ef="http://www.w3.org/1998/Math/MathML",Mt=typeof document<"u"?document:null,oi=Mt&&Mt.createElement("template"),Tf={insert:(e,t,n)=>{t.insertBefore(e,n||null)},remove:e=>{const t=e.parentNode;t&&t.removeChild(e)},createElement:(e,t,n,r)=>{const s=t==="svg"?Mt.createElementNS(Cf,e):t==="mathml"?Mt.createElementNS(Ef,e):n?Mt.createElement(e,{is:n}):Mt.createElement(e);return e==="select"&&r&&r.multiple!=null&&s.setAttribute("multiple",r.multiple),s},createText:e=>Mt.createTextNode(e),createComment:e=>Mt.createComment(e),setText:(e,t)=>{e.nodeValue=t},setElementText:(e,t)=>{e.textContent=t},parentNode:e=>e.parentNode,nextSibling:e=>e.nextSibling,querySelector:e=>Mt.querySelector(e),setScopeId(e,t){e.setAttribute(t,"")},insertStaticContent(e,t,n,r,s,o){const i=n?n.previousSibling:t.lastChild;if(s&&(s===o||s.nextSibling))for(;t.insertBefore(s.cloneNode(!0),n),!(s===o||!(s=s.nextSibling)););else{oi.innerHTML=Oa(r==="svg"?`<svg>${e}</svg>`:r==="mathml"?`<math>${e}</math>`:e);const l=oi.content;if(r==="svg"||r==="mathml"){const a=l.firstChild;for(;a.firstChild;)l.appendChild(a.firstChild);l.removeChild(a)}t.insertBefore(l,n)}return[i?i.nextSibling:t.firstChild,n?n.previousSibling:t.lastChild]}},Dt="transition",Bn="animation",sr=Symbol("_vtc"),Aa={name:String,type:String,css:{type:Boolean,default:!0},duration:[String,Number,Object],enterFromClass:String,enterActiveClass:String,enterToClass:String,appearFromClass:String,appearActiveClass:String,appearToClass:String,leaveFromClass:String,leaveActiveClass:String,leaveToClass:String},If=Ae({},zl,Aa),Of=e=>(e.displayName="Transition",e.props=If,e),yo=Of((e,{slots:t})=>bo(Cc,Af(e),t)),sn=(e,t=[])=>{Z(e)?e.forEach(n=>n(...t)):e&&e(...t)},ii=e=>e?Z(e)?e.some(t=>t.length>1):e.length>1:!1;function Af(e){const t={};for(const A in e)A in Aa||(t[A]=e[A]);if(e.css===!1)return t;const{name:n="v",type:r,duration:s,enterFromClass:o=`${n}-enter-from`,enterActiveClass:i=`${n}-enter-active`,enterToClass:l=`${n}-enter-to`,appearFromClass:a=o,appearActiveClass:u=i,appearToClass:c=l,leaveFromClass:p=`${n}-leave-from`,leaveActiveClass:g=`${n}-leave-active`,leaveToClass:b=`${n}-leave-to`}=e,d=Mf(s),v=d&&d[0],w=d&&d[1],{onBeforeEnter:x,onEnter:D,onEnterCancelled:K,onLeave:B,onLeaveCancelled:j,onBeforeAppear:te=x,onAppear:H=D,onAppearCancelled:z=K}=t,$=(A,ee,me,C)=>{A._enterCancelled=C,on(A,ee?c:l),on(A,ee?u:i),me&&me()},G=(A,ee)=>{A._isLeaving=!1,on(A,p),on(A,b),on(A,g),ee&&ee()},Q=A=>(ee,me)=>{const C=A?H:D,E=()=>$(ee,A,me);sn(C,[ee,E]),li(()=>{on(ee,A?a:o),Ot(ee,A?c:l),ii(C)||ai(ee,r,v,E)})};return Ae(t,{onBeforeEnter(A){sn(x,[A]),Ot(A,o),Ot(A,i)},onBeforeAppear(A){sn(te,[A]),Ot(A,a),Ot(A,u)},onEnter:Q(!1),onAppear:Q(!0),onLeave(A,ee){A._isLeaving=!0;const me=()=>G(A,ee);Ot(A,p),A._enterCancelled?(Ot(A,g),fi()):(fi(),Ot(A,g)),li(()=>{A._isLeaving&&(on(A,p),Ot(A,b),ii(B)||ai(A,r,w,me))}),sn(B,[A,me])},onEnterCancelled(A){$(A,!1,void 0,!0),sn(K,[A])},onAppearCancelled(A){$(A,!0,void 0,!0),sn(z,[A])},onLeaveCancelled(A){G(A),sn(j,[A])}})}function Mf(e){if(e==null)return null;if(he(e))return[Os(e.enter),Os(e.leave)];{const t=Os(e);return[t,t]}}function Os(e){return Ru(e)}function Ot(e,t){t.split(/\s+/).forEach(n=>n&&e.classList.add(n)),(e[sr]||(e[sr]=new Set)).add(t)}function on(e,t){t.split(/\s+/).forEach(r=>r&&e.classList.remove(r));const n=e[sr];n&&(n.delete(t),n.size||(e[sr]=void 0))}function li(e){requestAnimationFrame(()=>{requestAnimationFrame(e)})}let Nf=0;function ai(e,t,n,r){const s=e._endId=++Nf,o=()=>{s===e._endId&&r()};if(n!=null)return setTimeout(o,n);const{type:i,timeout:l,propCount:a}=Pf(e,t);if(!i)return r();const u=i+"end";let c=0;const p=()=>{e.removeEventListener(u,g),o()},g=b=>{b.target===e&&++c>=a&&p()};setTimeout(()=>{c<a&&p()},l+1),e.addEventListener(u,g)}function Pf(e,t){const n=window.getComputedStyle(e),r=d=>(n[d]||"").split(", "),s=r(`${Dt}Delay`),o=r(`${Dt}Duration`),i=ui(s,o),l=r(`${Bn}Delay`),a=r(`${Bn}Duration`),u=ui(l,a);let c=null,p=0,g=0;t===Dt?i>0&&(c=Dt,p=i,g=o.length):t===Bn?u>0&&(c=Bn,p=u,g=a.length):(p=Math.max(i,u),c=p>0?i>u?Dt:Bn:null,g=c?c===Dt?o.length:a.length:0);const b=c===Dt&&/\b(transform|all)(,|$)/.test(r(`${Dt}Property`).toString());return{type:c,timeout:p,propCount:g,hasTransform:b}}function ui(e,t){for(;e.length<t.length;)e=e.concat(e);return Math.max(...t.map((n,r)=>ci(n)+ci(e[r])))}function ci(e){return e==="auto"?0:Number(e.slice(0,-1).replace(",","."))*1e3}function fi(){return document.body.offsetHeight}function $f(e,t,n){const r=e[sr];r&&(t=(t?[t,...r]:[...r]).join(" ")),t==null?e.removeAttribute("class"):n?e.setAttribute("class",t):e.className=t}const jr=Symbol("_vod"),Ma=Symbol("_vsh"),Xt={beforeMount(e,{value:t},{transition:n}){e[jr]=e.style.display==="none"?"":e.style.display,n&&t?n.beforeEnter(e):Vn(e,t)},mounted(e,{value:t},{transition:n}){n&&t
Line truncated
|
||||
height:0 !important;
|
||||
visibility:hidden !important;
|
||||
${cu()?"":"overflow:hidden !important;"}
|
||||
position:absolute !important;
|
||||
z-index:-1000 !important;
|
||||
top:0 !important;
|
||||
right:0 !important;
|
||||
`,lg=["letter-spacing","line-height","padding-top","padding-bottom","font-family","font-weight","font-size","text-rendering","text-transform","width","text-indent","padding-left","padding-right","border-width","box-sizing"];function ag(e){const t=window.getComputedStyle(e),n=t.getPropertyValue("box-sizing"),r=Number.parseFloat(t.getPropertyValue("padding-bottom"))+Number.parseFloat(t.getPropertyValue("padding-top")),s=Number.parseFloat(t.getPropertyValue("border-bottom-width"))+Number.parseFloat(t.getPropertyValue("border-top-width"));return{contextStyle:lg.map(i=>`${i}:${t.getPropertyValue(i)}`).join(";"),paddingSize:r,borderSize:s,boxSizing:n}}function zi(e,t=1,n){var r;ct||(ct=document.createElement("textarea"),document.body.appendChild(ct));const{paddingSize:s,borderSize:o,boxSizing:i,contextStyle:l}=ag(e);ct.setAttribute("style",`${l};${ig}`),ct.value=e.value||e.placeholder||"";let a=ct.scrollHeight;const u={};i==="border-box"?a=a+o:i==="content-box"&&(a=a-s),ct.value="";const c=ct.scrollHeight-s;if(Ce(t)){let p=c*t;i==="border-box"&&(p=p+s+o),a=Math.max(p,a),u.minHeight=`${p}px`}if(Ce(n)){let p=c*n;i==="border-box"&&(p=p+s+o),a=Math.min(p,a)}return u.height=`${a}px`,(r=ct.parentNode)==null||r.removeChild(ct),ct=void 0,u}const cn=e=>e,ug=mt({ariaLabel:String,ariaOrientation:{type:String,values:["horizontal","vertical","undefined"]},ariaControls:String}),fu=e=>Wp(ug,e),cg=mt({id:{type:String,default:void 0},size:Ao,disabled:Boolean,modelValue:{type:Ne([String,Number,Object]),default:""},maxlength:{type:[String,Number]},minlength:{type:[String,Number]},type:{type:String,default:"text"},resize:{type:String,values:["none","both","horizontal","vertical"]},autosize:{type:Ne([Boolean,Object]),default:!1},autocomplete:{type:String,default:"off"},formatter:{type:Function},parser:{type:Function},placeholder:{type:String},form:{type:String},readonly:Boolean,clearable:Boolean,showPassword:Boolean,showWordLimit:Boolean,suffixIcon:{type:ar},prefixIcon:{type:ar},containerRole:{type:String,default:void 0},tabindex:{type:[String,Number],default:0},validateEvent:{type:Boolean,default:!0},inputStyle:{type:Ne([Object,Array,String]),default:()=>cn({})},autofocus:Boolean,rows:{type:Number,default:2},...fu(["ariaLabel"])}),fg={[$t]:e=>ce(e),input:e=>ce(e),change:e=>ce(e),focus:e=>e instanceof FocusEvent,blur:e=>e instanceof FocusEvent,clear:()=>!0,mouseleave:e=>e instanceof MouseEvent,mouseenter:e=>e instanceof MouseEvent,keydown:e=>e instanceof Event,compositionstart:e=>e instanceof CompositionEvent,compositionupdate:e=>e instanceof CompositionEvent,compositionend:e=>e instanceof CompositionEvent},dg=["class","style"],pg=/^on[A-Z]/,hg=(e={})=>{const{excludeListeners:t=!1,excludeKeys:n}=e,r=P(()=>((n==null?void 0:n.value)||[]).concat(dg)),s=et();return P(s?()=>{var o;return ja(Object.entries((o=s.proxy)==null?void 0:o.$attrs).filter(([i])=>!r.value.includes(i)&&!(t&&pg.test(i))))}:()=>({}))},No=Symbol("formContextKey"),du=Symbol("formItemContextKey"),Ui={prefix:Math.floor(Math.random()*1e4),current:0},gg=Symbol("elIdInjection"),mg=()=>et()?Ee(gg,Ui):Ui,qs=e=>{const t=mg(),n=La();return th(()=>m(e)||`${n.value}-id-${t.prefix}-${t.current++}`)},Po=()=>{const e=Ee(No,void 0),t=Ee(du,void 0);return{form:e,formItem:t}},vg=(e,{formItemContext:t,disableIdGeneration:n,disableIdManagement:r})=>{n||(n=oe(!1)),r||(r=oe(!1));const s=oe();let o;const i=P(()=>{var l;return!!(!(e.label||e.ariaLabel)&&t&&t.inputIds&&((l=t.inputIds)==null?void 0:l.length)<=1)});return nt(()=>{o=_e([kr(e,"id"),n],([l,a])=>{const u=l??(a?void 0:qs().value);u!==s.value&&(t!=null&&t.removeInputId&&(s.value&&t.removeInputId(s.value),!(r!=null&&r.value)&&!a&&u&&t.addInputId(u)),s.value=u)},{immediate:!0})}),go(()=>{o&&o(),t!=null&&t.removeInputId&&s.value&&t.removeInputId(s.value)}),{isLabeledByFormItem:i,inputId:s}},pu=e=>{const t=et();return P(()=>{var n,r;return(r=(n=t==null?void 0:t.proxy)==null?void 0:n.$props)==null?void 0:r[e]})},$o=(e,t={})=>{const n=oe(void 0),r=t.prop?n:pu("size"),s=t.global?n:Sh(),o=t.form?{size:void 0}:Ee(No,void 0),i=t.formItem?{size:void 0}:Ee(du,void 0);return P(()=>r.value||m(e)||(i==null?void 0:i.size)||(o==null?void 0:o.size)||s.value||"")},ds=e=>{const t=pu("disabled"),n=Ee(No,void 0);return P(()=>t.value||m(e)||(n==null?void 0:n.disabled)||!1)};function bg(e,{beforeFocus:t,afterFocus:n,beforeBlur:r,afterBlur:s}={}){const o=et(),{emit:i}=o,l=Kn(),a=oe(!1),u=g=>{W(t)&&t(g)||a.value||(a.value=!0,i("focus",g),n==null||n())},c=g=>{var b;W(r)&&r(g)||g.relatedTarget&&((b=l.value)!=null&&b.contains(g.relatedTarget))||(a.value=!1,i("blur",g),s==null||s())},p=()=>{var g,b;(g=l.value)!=null&&g.contains(document.activeElement)&&l.value!==document.activeElement||(b=e.value)==null||b.focus()};return _e(l,g=>{g&&g.setAttribute("tabindex","-1")}),Mr(l,"focus",u,!0),Mr(l,"blur",c,!0),Mr(l,"click",p,!0),{isFocused:a,wrapperRef:l,handleFocus:u,handleBlur:c}}const yg=e=>/([\uAC00-\uD7AF\u3130-\u318F])+/gi.test(e);function _g({afterComposition:e,e
Line truncated
|
||||
* pinia v2.3.1
|
||||
* (c) 2025 Eduardo San Martin Morote
|
||||
* @license MIT
|
||||
*/let Cu;const gs=e=>Cu=e,Eu=Symbol();function Qs(e){return e&&typeof e=="object"&&Object.prototype.toString.call(e)==="[object Object]"&&typeof e.toJSON!="function"}var qn;(function(e){e.direct="direct",e.patchObject="patch object",e.patchFunction="patch function"})(qn||(qn={}));function qm(){const e=vl(!0),t=e.run(()=>oe({}));let n=[],r=[];const s=Zn({install(o){gs(s),s._a=o,o.provide(Eu,s),o.config.globalProperties.$pinia=s,r.forEach(i=>n.push(i)),r=[]},use(o){return this._a?n.push(o):r.push(o),this},_p:n,_a:null,_e:e,_s:new Map,state:t});return s}const Tu=()=>{};function il(e,t,n,r=Tu){e.push(t);const s=()=>{const o=e.indexOf(t);o>-1&&(e.splice(o,1),r())};return!n&&oo()&&io(s),s}function Sn(e,...t){e.slice().forEach(n=>{n(...t)})}const Jm=e=>e(),ll=Symbol(),Fs=Symbol();function eo(e,t){e instanceof Map&&t instanceof Map?t.forEach((n,r)=>e.set(r,n)):e instanceof Set&&t instanceof Set&&t.forEach(e.add,e);for(const n in t){if(!t.hasOwnProperty(n))continue;const r=t[n],s=e[n];Qs(s)&&Qs(r)&&e.hasOwnProperty(n)&&!ye(r)&&!Jt(r)?e[n]=eo(s,r):e[n]=r}return e}const Xm=Symbol();function Zm(e){return!Qs(e)||!e.hasOwnProperty(Xm)}const{assign:Ut}=Object;function Qm(e){return!!(ye(e)&&e.effect)}function ev(e,t,n,r){const{state:s,actions:o,getters:i}=t,l=n.state.value[e];let a;function u(){l||(n.state.value[e]=s?s():{});const c=kl(n.state.value[e]);return Ut(c,o,Object.keys(i||{}).reduce((p,g)=>(p[g]=Zn(P(()=>{gs(n);const b=n._s.get(e);return i[g].call(b,b)})),p),{}))}return a=Iu(e,u,t,n,r,!0),a}function Iu(e,t,n={},r,s,o){let i;const l=Ut({actions:{}},n),a={deep:!0};let u,c,p=[],g=[],b;const d=r.state.value[e];!o&&!d&&(r.state.value[e]={}),oe({});let v;function w(z){let $;u=c=!1,typeof z=="function"?(z(r.state.value[e]),$={type:qn.patchFunction,storeId:e,events:b}):(eo(r.state.value[e],z),$={type:qn.patchObject,payload:z,storeId:e,events:b});const G=v=Symbol();Fe().then(()=>{v===G&&(u=!0)}),c=!0,Sn(p,$,r.state.value[e])}const x=o?function(){const{state:$}=n,G=$?$():{};this.$patch(Q=>{Ut(Q,G)})}:Tu;function D(){i.stop(),p=[],g=[],r._s.delete(e)}const K=(z,$="")=>{if(ll in z)return z[Fs]=$,z;const G=function(){gs(r);const Q=Array.from(arguments),A=[],ee=[];function me(N){A.push(N)}function C(N){ee.push(N)}Sn(g,{args:Q,name:G[Fs],store:j,after:me,onError:C});let E;try{E=z.apply(this&&this.$id===e?this:j,Q)}catch(N){throw Sn(ee,N),N}return E instanceof Promise?E.then(N=>(Sn(A,N),N)).catch(N=>(Sn(ee,N),Promise.reject(N))):(Sn(A,E),E)};return G[ll]=!0,G[Fs]=$,G},B={_p:r,$id:e,$onAction:il.bind(null,g),$patch:w,$reset:x,$subscribe(z,$={}){const G=il(p,z,$.detached,()=>Q()),Q=i.run(()=>_e(()=>r.state.value[e],A=>{($.flush==="sync"?c:u)&&z({storeId:e,type:qn.direct,events:b},A)},Ut({},a,$)));return G},$dispose:D},j=ot(B);r._s.set(e,j);const H=(r._a&&r._a.runWithContext||Jm)(()=>r._e.run(()=>(i=vl()).run(()=>t({action:K}))));for(const z in H){const $=H[z];if(ye($)&&!Qm($)||Jt($))o||(d&&Zm($)&&(ye($)?$.value=d[z]:eo($,d[z])),r.state.value[e][z]=$);else if(typeof $=="function"){const G=K($,z);H[z]=G,l.actions[z]=$}}return Ut(j,H),Ut(de(j),H),Object.defineProperty(j,"$state",{get:()=>r.state.value[e],set:z=>{w($=>{Ut($,z)})}}),r._p.forEach(z=>{Ut(j,i.run(()=>z({store:j,app:r._a,pinia:r,options:l})))}),d&&o&&n.hydrate&&n.hydrate(j.$state,d),u=!0,c=!0,j}/*! #__NO_SIDE_EFFECTS__ */function tv(e,t,n){let r,s;const o=typeof t=="function";r=e,s=o?n:t;function i(l,a){const u=zc();return l=l||(u?Ee(Eu,null):null),l&&gs(l),l=Cu,l._s.has(r)||(o?Iu(r,t,s,l):ev(r,s,l)),l._s.get(r)}return i.$id=r,i}const Ou=tv("miao-escrypto-setting",()=>{const e=oe({key:"",step:10485760});return{setting:e,setSetting:n=>{e.value=n,localStorage.setItem("miao-escrypto-setting",JSON.stringify(e.value))}}}),nv={class:"z-30 bg-gray-200 py-2 px-2 flex items-center justify-between h-[1.5rem] sticky top-0 shadow select-none"},rv={class:"flex items-center gap-2"},sv=["onClick"],ov={class:"flex items-center gap-2"},iv=["onClick"],lv={class:"py-6 px-2 gap-3 min-w-full grid grid-cols-[repeat(auto-fill,minmax(8rem,_1fr))]"},av=re({__name:"ESCrypto",props:{root:{}},setup(e){const t=Ou(),n=e,r=ot([]),s=new Map,o=P(()=>{const d=s.get(a.value)??[];return[...r.filter(v=>!d.some(w=>w.name===v.name)&&!v.name.endsWith(".crswap")),...d].sort((v,w)=>v.type==="file"&&w.type==="directory"?-1:v.type==="directory"&&w.type==="file"?1:v.name.localeCompare(w.name))}),i=oe(),l=ot([]),a=P(()=>l.map(d=>d.name).join("/")),u=P(()=>[{name:"返回",func:()=>{console.log({dirStack:l});const d=l.pop();console.log(d),d&&(i.value=d)},disabled:!l.length}]),c=P(()=>[{name:"加/解密",func:async()=>{const d=r.filter(D=>D.selected),v=s.get(a.value);let w="",x=0;do{if(w=t.setting.key,x=t.setting.step,w&&x)break;dt.error("请完善设置"),await p()}while(!w);for(const D of d){D.selected=!1;const K=D.name+(D.name.endsWith(".enc")?`.${D.name.split(".").slice(0,-1).pop()}`:".enc");if(v.some(me=>me.name===K||me.name.split(".").slice(0,-1).join(".")===K)){dt.error("文件正在处理");continue}const B=i.vLine truncated
|
||||
@@ -0,0 +1 @@
|
||||
@charset "UTF-8";/*! tailwindcss v4.0.3 | MIT License | https://tailwindcss.com */@layer theme{:root,:host{--font-sans:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";--font-serif:ui-serif,Georgia,Cambria,"Times New Roman",Times,serif;--font-mono:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;--color-red-50:oklch(.971 .013 17.38);--color-red-100:oklch(.936 .032 17.717);--color-red-200:oklch(.885 .062 18.334);--color-red-300:oklch(.808 .114 19.571);--color-red-400:oklch(.704 .191 22.216);--color-red-500:oklch(.637 .237 25.331);--color-red-600:oklch(.577 .245 27.325);--color-red-700:oklch(.505 .213 27.518);--color-red-800:oklch(.444 .177 26.899);--color-red-900:oklch(.396 .141 25.723);--color-red-950:oklch(.258 .092 26.042);--color-orange-50:oklch(.98 .016 73.684);--color-orange-100:oklch(.954 .038 75.164);--color-orange-200:oklch(.901 .076 70.697);--color-orange-300:oklch(.837 .128 66.29);--color-orange-400:oklch(.75 .183 55.934);--color-orange-500:oklch(.705 .213 47.604);--color-orange-600:oklch(.646 .222 41.116);--color-orange-700:oklch(.553 .195 38.402);--color-orange-800:oklch(.47 .157 37.304);--color-orange-900:oklch(.408 .123 38.172);--color-orange-950:oklch(.266 .079 36.259);--color-amber-50:oklch(.987 .022 95.277);--color-amber-100:oklch(.962 .059 95.617);--color-amber-200:oklch(.924 .12 95.746);--color-amber-300:oklch(.879 .169 91.605);--color-amber-400:oklch(.828 .189 84.429);--color-amber-500:oklch(.769 .188 70.08);--color-amber-600:oklch(.666 .179 58.318);--color-amber-700:oklch(.555 .163 48.998);--color-amber-800:oklch(.473 .137 46.201);--color-amber-900:oklch(.414 .112 45.904);--color-amber-950:oklch(.279 .077 45.635);--color-yellow-50:oklch(.987 .026 102.212);--color-yellow-100:oklch(.973 .071 103.193);--color-yellow-200:oklch(.945 .129 101.54);--color-yellow-300:oklch(.905 .182 98.111);--color-yellow-400:oklch(.852 .199 91.936);--color-yellow-500:oklch(.795 .184 86.047);--color-yellow-600:oklch(.681 .162 75.834);--color-yellow-700:oklch(.554 .135 66.442);--color-yellow-800:oklch(.476 .114 61.907);--color-yellow-900:oklch(.421 .095 57.708);--color-yellow-950:oklch(.286 .066 53.813);--color-lime-50:oklch(.986 .031 120.757);--color-lime-100:oklch(.967 .067 122.328);--color-lime-200:oklch(.938 .127 124.321);--color-lime-300:oklch(.897 .196 126.665);--color-lime-400:oklch(.841 .238 128.85);--color-lime-500:oklch(.768 .233 130.85);--color-lime-600:oklch(.648 .2 131.684);--color-lime-700:oklch(.532 .157 131.589);--color-lime-800:oklch(.453 .124 130.933);--color-lime-900:oklch(.405 .101 131.063);--color-lime-950:oklch(.274 .072 132.109);--color-green-50:oklch(.982 .018 155.826);--color-green-100:oklch(.962 .044 156.743);--color-green-200:oklch(.925 .084 155.995);--color-green-300:oklch(.871 .15 154.449);--color-green-400:oklch(.792 .209 151.711);--color-green-500:oklch(.723 .219 149.579);--color-green-600:oklch(.627 .194 149.214);--color-green-700:oklch(.527 .154 150.069);--color-green-800:oklch(.448 .119 151.328);--color-green-900:oklch(.393 .095 152.535);--color-green-950:oklch(.266 .065 152.934);--color-emerald-50:oklch(.979 .021 166.113);--color-emerald-100:oklch(.95 .052 163.051);--color-emerald-200:oklch(.905 .093 164.15);--color-emerald-300:oklch(.845 .143 164.978);--color-emerald-400:oklch(.765 .177 163.223);--color-emerald-500:oklch(.696 .17 162.48);--color-emerald-600:oklch(.596 .145 163.225);--color-emerald-700:oklch(.508 .118 165.612);--color-emerald-800:oklch(.432 .095 166.913);--color-emerald-900:oklch(.378 .077 168.94);--color-emerald-950:oklch(.262 .051 172.552);--color-teal-50:oklch(.984 .014 180.72);--color-teal-100:oklch(.953 .051 180.801);--color-teal-200:oklch(.91 .096 180.426);--color-teal-300:oklch(.855 .138 181.071);--color-teal-400:oklch(.777 .152 181.912);--color-teal-500:oklch(.704 .14 182.503);--color-teal-600:oklch(.6 .118 184.704);--color-teal-700:oklch(.511 .096 186.391);--color-teal-800:oklch(.437 .078 188.216);--color-teal-900:oklch(.386 .063 188.416);--color-teal-950:oklch(.277 .046 192.524);--color-cyan-50:oklch(.984 .019 200.873);--color-cyan-100:oklch(.956 .045 203.388);--color-cyan-200:oklch(.917 .08 205.041);--color-cyan-300:oklch(.865 .127 207.078);--color-cyan-400:oklch(.789 .154 211.53);--color-cyan-500:oklch(.715 .143 215.221);--color-cyan-600:oklch(.609 .126 221.723);--color-cyan-700:oklch(.52 .105 223.128);--color-cyan-800:oklch(.45 .085 224.283);--color-cyan-900:oklch(.398 .07 227.392);--color-cyan-950:oklch(.302 .056 229.695);--color-sky-50:oklch(.977 .013 236.62);--color-sky-100:oklch(.951 .026 236.824);--color-sky-200:oklch(.901 .058 230.902);--color-sky-300:oklch(.828 .111 230.318);--color-sky-400:oklch(.746 .16 232.661);--color-sky-500:oklch(.685 .169 237.323);--color-sky-600:oklch(.588 .158 241.966);--color-sky-700:oklch(.5 .134 242.749);--color-sky-800:oklch(.443 .11 240.79);--color-sky-900:oklch(.391 .09 240.876);--color-sky-950:oklch(.293 .0Line truncated
|
||||
@@ -0,0 +1,14 @@
|
||||
<!doctype html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8" />
|
||||
<link rel="icon" type="image/svg+xml" href="./vite.svg" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||
<title>Vite + Vue + TS</title>
|
||||
<script type="module" crossorigin src="./assets/index-BgRmqDOl.js"></script>
|
||||
<link rel="stylesheet" crossorigin href="./assets/index-DPPM0kQh.css">
|
||||
</head>
|
||||
<body>
|
||||
<div id="app"></div>
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,92 @@
|
||||
import os from 'os';
|
||||
import { execSync } from 'child_process';
|
||||
|
||||
export default defineEventHandler(async (event) => {
|
||||
try {
|
||||
// 获取操作系统信息
|
||||
const platform = os.platform();
|
||||
const release = os.release();
|
||||
const hostname = os.hostname();
|
||||
|
||||
// 获取Node.js版本
|
||||
const nodeVersion = process.version;
|
||||
|
||||
// 硬件信息
|
||||
const cpuInfo = os.cpus();
|
||||
const totalMemory = os.totalmem();
|
||||
const freeMemory = os.freemem();
|
||||
|
||||
// 计算CPU使用率
|
||||
const cpuUsage = getCpuUsage();
|
||||
|
||||
// 计算内存使用率
|
||||
const memoryUsage = {
|
||||
total: formatBytes(totalMemory),
|
||||
free: formatBytes(freeMemory),
|
||||
used: formatBytes(totalMemory - freeMemory),
|
||||
percent: Math.round(((totalMemory - freeMemory) / totalMemory) * 100)
|
||||
};
|
||||
|
||||
return {
|
||||
success: true,
|
||||
data: {
|
||||
system: {
|
||||
platform,
|
||||
release,
|
||||
hostname
|
||||
},
|
||||
node: nodeVersion,
|
||||
hardware: {
|
||||
cpu: {
|
||||
model: cpuInfo[0]?.model || 'Unknown',
|
||||
cores: cpuInfo.length,
|
||||
usage: cpuUsage
|
||||
},
|
||||
memory: memoryUsage
|
||||
}
|
||||
}
|
||||
};
|
||||
} catch (error) {
|
||||
console.error('Error fetching system info:', error);
|
||||
return {
|
||||
success: false,
|
||||
message: '获取系统信息失败'
|
||||
};
|
||||
}
|
||||
});
|
||||
|
||||
// 格式化字节数为可读格式
|
||||
function formatBytes(bytes: number) {
|
||||
if (bytes === 0) return '0 Bytes';
|
||||
|
||||
const k = 1024;
|
||||
const sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB'];
|
||||
const i = Math.floor(Math.log(bytes) / Math.log(k));
|
||||
|
||||
return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + ' ' + sizes[i];
|
||||
}
|
||||
|
||||
// 获取CPU使用率
|
||||
function getCpuUsage() {
|
||||
try {
|
||||
const cpus = os.cpus();
|
||||
let totalIdle = 0;
|
||||
let totalTick = 0;
|
||||
|
||||
cpus.forEach(cpu => {
|
||||
for (const type in cpu.times) {
|
||||
totalTick += cpu.times[type as keyof typeof cpu.times];
|
||||
}
|
||||
totalIdle += cpu.times.idle;
|
||||
});
|
||||
|
||||
const idle = totalIdle / cpus.length;
|
||||
const total = totalTick / cpus.length;
|
||||
const usagePercent = Math.round(100 - (idle / total * 100));
|
||||
|
||||
return usagePercent;
|
||||
} catch (error) {
|
||||
console.error('Error calculating CPU usage:', error);
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,70 @@
|
||||
import os from 'os';
|
||||
|
||||
export default defineEventHandler(async (event) => {
|
||||
try {
|
||||
// 获取CPU信息
|
||||
const cpuUsage = getCpuUsage();
|
||||
|
||||
// 获取内存信息
|
||||
const totalMemory = os.totalmem();
|
||||
const freeMemory = os.freemem();
|
||||
const memoryUsage = {
|
||||
total: formatBytes(totalMemory),
|
||||
free: formatBytes(freeMemory),
|
||||
used: formatBytes(totalMemory - freeMemory),
|
||||
percent: Math.round(((totalMemory - freeMemory) / totalMemory) * 100)
|
||||
};
|
||||
|
||||
return {
|
||||
success: true,
|
||||
data: {
|
||||
cpu: {
|
||||
usage: cpuUsage
|
||||
},
|
||||
memory: memoryUsage
|
||||
}
|
||||
};
|
||||
} catch (error) {
|
||||
console.error('Error fetching performance info:', error);
|
||||
return {
|
||||
success: false,
|
||||
message: '获取性能数据失败'
|
||||
};
|
||||
}
|
||||
});
|
||||
|
||||
// 格式化字节数为可读格式
|
||||
function formatBytes(bytes: number) {
|
||||
if (bytes === 0) return '0 Bytes';
|
||||
|
||||
const k = 1024;
|
||||
const sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB'];
|
||||
const i = Math.floor(Math.log(bytes) / Math.log(k));
|
||||
|
||||
return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + ' ' + sizes[i];
|
||||
}
|
||||
|
||||
// 获取CPU使用率
|
||||
function getCpuUsage() {
|
||||
try {
|
||||
const cpus = os.cpus();
|
||||
let totalIdle = 0;
|
||||
let totalTick = 0;
|
||||
|
||||
cpus.forEach(cpu => {
|
||||
for (const type in cpu.times) {
|
||||
totalTick += cpu.times[type as keyof typeof cpu.times];
|
||||
}
|
||||
totalIdle += cpu.times.idle;
|
||||
});
|
||||
|
||||
const idle = totalIdle / cpus.length;
|
||||
const total = totalTick / cpus.length;
|
||||
const usagePercent = Math.round(100 - (idle / total * 100));
|
||||
|
||||
return usagePercent;
|
||||
} catch (error) {
|
||||
console.error('Error calculating CPU usage:', error);
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
@@ -1,4 +1,3 @@
|
||||
// import { defineEventHandler, readBody, createError } from 'h3';
|
||||
import bcrypt from 'bcryptjs';
|
||||
import BetterSqlite3 from 'better-sqlite3';
|
||||
|
||||
@@ -10,9 +9,10 @@ export default defineEventHandler(async (event) => {
|
||||
// 查询用户
|
||||
const userDB = BetterSqlite3('./userData/db/user.db');
|
||||
const user: any = userDB.prepare('SELECT * FROM user WHERE username = ?').get(username);
|
||||
if (!user || password !== user.password) {
|
||||
const authRes = await authUser(username, password);
|
||||
if(!authRes){
|
||||
userDB.close();
|
||||
throw createError({ statusCode: 401, statusMessage: 'Invalid username or password' });
|
||||
throw createError({ statusCode: 401, statusMessage: 'Username or password is incorrect' });
|
||||
}
|
||||
|
||||
// 更新最后登录时间
|
||||
|
||||
@@ -10,6 +10,10 @@ export default defineEventHandler(async (event) => {
|
||||
try {
|
||||
// 验证旧的 Token
|
||||
const decoded = jwt.verify(token, jwtSecret) as any;
|
||||
const authRes = await authUser(decoded.username, decoded.password);
|
||||
if (!authRes) {
|
||||
throw createError({ statusCode: 401, statusMessage: 'Username or password is incorrect' });
|
||||
}
|
||||
// 生成新的 Token
|
||||
const newToken = jwt.sign({
|
||||
username: decoded.username,
|
||||
|
||||
@@ -20,10 +20,7 @@ export default defineEventHandler(async (event) => {
|
||||
// throw createError({ statusCode: 400, statusMessage: 'Username already exists' });
|
||||
// }
|
||||
|
||||
// 哈希密码,暂未实现,未来实现
|
||||
// const salt = getKey().substring(0, 10);
|
||||
// const hashedPassword = bcrypt.hashSync(password, salt);
|
||||
const hashedPassword = password
|
||||
const hashedPassword = bcrypt.hashSync(password, 10);
|
||||
|
||||
// 插入新用户
|
||||
const createTime = Date.now();
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
// import bcrypt from 'bcryptjs';
|
||||
import bcrypt from 'bcryptjs';
|
||||
import BetterSqlite3 from 'better-sqlite3';
|
||||
// import { defineEventHandler, createError, readBody } from 'h3';
|
||||
import jwt from 'jsonwebtoken';
|
||||
@@ -27,18 +27,12 @@ export default defineEventHandler(async (event) => {
|
||||
}
|
||||
|
||||
// 验证旧密码是否正确
|
||||
// const passwordMatch = bcrypt.compareSync(oldPassword, user.password);
|
||||
const passwordMatch = oldPassword === user.password;
|
||||
if (!passwordMatch) {
|
||||
const authRes = await authUser(username, oldPassword);
|
||||
if (!authRes) {
|
||||
userDB.close();
|
||||
throw createError({ statusCode: 401, statusMessage: 'Invalid old password' });
|
||||
throw createError({ statusCode: 401, statusMessage: 'Old password is incorrect' });
|
||||
}
|
||||
|
||||
// 哈希新密码
|
||||
// const salt = bcrypt.genSaltSync(10);
|
||||
// const hashedNewPassword = bcrypt.hashSync(newPassword, salt);
|
||||
|
||||
const hashedNewPassword = newPassword;
|
||||
const hashedNewPassword = bcrypt.hashSync(newPassword, 10);
|
||||
|
||||
// 更新密码
|
||||
const stmt = userDB.prepare('UPDATE user SET password =? WHERE username =?');
|
||||
|
||||
@@ -1,5 +1,4 @@
|
||||
import serverConfig from "../server.config"
|
||||
// import { verify } from 'jsonwebtoken'
|
||||
import jwt from 'jsonwebtoken'
|
||||
import getKey from "../utils/getKey"
|
||||
|
||||
@@ -17,10 +16,13 @@ export default defineEventHandler(async (event) => {
|
||||
const token = authHeader.split('Bearer ')[1].trim()
|
||||
try {
|
||||
const decoded = jwt.verify(token, key) as { userId: number, password: string, username: string, exp: number }
|
||||
const authRes = await authUser(decoded.username, decoded.password)
|
||||
if (!authRes) {
|
||||
throw createError({ statusCode: 401, statusMessage: 'Token invalid or expired', data: { err: 'auth failed', token } })
|
||||
}
|
||||
if (decoded.exp > Date.now()) {
|
||||
throw createError({ statusCode: 401, statusMessage: 'Token invalid or expired', data: { err: 'token expired', token } })
|
||||
}
|
||||
// console.log(decoded)
|
||||
// 将用户ID挂载到事件对象,供后续使用
|
||||
// event.context.userId = decoded.userId
|
||||
} catch (err) {
|
||||
|
||||
@@ -5,6 +5,7 @@ export default {
|
||||
'/api/test/testDir',
|
||||
'/api/posts/editPost',
|
||||
'/api/posts/uploadPost',
|
||||
'/api/posts/deletePost',
|
||||
'/api/user/updatePassword',
|
||||
'/api/system/update'
|
||||
])
|
||||
|
||||
@@ -0,0 +1,16 @@
|
||||
import bcrypt from 'bcryptjs';
|
||||
import BetterSqlite3 from 'better-sqlite3';
|
||||
|
||||
export default async function authUser(
|
||||
username: string,
|
||||
password: string
|
||||
) {
|
||||
const userDB = BetterSqlite3('./userData/db/user.db');
|
||||
const user: any = userDB.prepare('SELECT * FROM user WHERE username = ?').get(username);
|
||||
const bPasswd = bcrypt.compareSync(password, user.password) || password === user.password;
|
||||
if (!user || !bPasswd) {
|
||||
userDB.close();
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
@@ -0,0 +1 @@
|
||||
@import "tailwindcss";
|
||||
@@ -0,0 +1,11 @@
|
||||
import useDefaultStore from "~/hooks/pinia/useDefaultStore"
|
||||
|
||||
export default async function cachedPromise<T>(key: string, promise: () =>Promise<T>): Promise<T> {
|
||||
const cache = useDefaultStore().getCache(key)
|
||||
if (cache) {
|
||||
return cache
|
||||
}
|
||||
const res = await promise()
|
||||
useDefaultStore().setCache(key, res)
|
||||
return res
|
||||
}
|
||||
+1
-1
@@ -1,6 +1,6 @@
|
||||
import useDefaultStore from "~/hooks/pinia/useDefaultStore"
|
||||
import usePostStore from "~/hooks/pinia/usePostStore"
|
||||
import useMiaoFetch from "~/hooks/useMiaoFetch"
|
||||
// import useMiaoFetch from "~/hooks/useMiaoFetch"
|
||||
// import usePostStore from "~/hooks/pinia/usePostStore"
|
||||
import type { postContent, postItem } from "~/types/post"
|
||||
|
||||
|
||||
+14
-13
@@ -11,11 +11,12 @@ export default class Html2VNode {
|
||||
public use(middleware: middlewareType) {
|
||||
this.middlewareList.push(middleware)
|
||||
}
|
||||
public rander(htmlString: string) {
|
||||
const html2ObjResult = this.html2Obj(htmlString);
|
||||
public render(htmlString: string) {
|
||||
const htmlString2 = htmlString.replaceAll('<hr>', '<hr></hr>').replaceAll('<br>', '<br></br>')
|
||||
const html2ObjResult = this.html2Obj(htmlString2);
|
||||
const middlewareMap = this.buildMiddlewareMap(html2ObjResult);
|
||||
const wrinklesResult = this.wrinkles(html2ObjResult)
|
||||
const vnodes = this.rander2VNode(wrinklesResult, middlewareMap)
|
||||
const vnodes = this.render2VNode(wrinklesResult, middlewareMap)
|
||||
return vnodes;
|
||||
}
|
||||
|
||||
@@ -40,36 +41,36 @@ export default class Html2VNode {
|
||||
return middlewareMap;
|
||||
}
|
||||
|
||||
private rander2VNode = (
|
||||
private render2VNode = async (
|
||||
wrinklesResult: (miaoVNodeType | string)[],
|
||||
middlewareMap: Map<string, middlewareType[]>
|
||||
): (VNode | string)[] => {
|
||||
return wrinklesResult.map((item: miaoVNodeType | string): VNode | string => {
|
||||
): Promise<(VNode | string)[]> => {
|
||||
return Promise.all(wrinklesResult.map((async (item: miaoVNodeType | string): Promise<VNode | string> => {
|
||||
if (typeof item === 'string') {
|
||||
return item;
|
||||
}
|
||||
const { tagName = '', tagAttrs } = this.parseTag(item.tag);
|
||||
const middlewares = middlewareMap.get(tagName)
|
||||
for(const middleware of middlewares!) {
|
||||
const _res = middleware.rander({
|
||||
const _res = middleware.render({
|
||||
item,
|
||||
tagName,
|
||||
tagAttrs,
|
||||
middlewareMap
|
||||
})
|
||||
if(_res) {
|
||||
return _res
|
||||
return await _res
|
||||
}
|
||||
}
|
||||
return ''
|
||||
})
|
||||
})))
|
||||
}
|
||||
|
||||
private defaultMiddleware: middlewareType = {
|
||||
filter: (_: string) => {
|
||||
return true;
|
||||
},
|
||||
rander: ({
|
||||
render: async ({
|
||||
item, tagName, tagAttrs, middlewareMap
|
||||
}) => {
|
||||
if (!tagName) {
|
||||
@@ -77,7 +78,7 @@ export default class Html2VNode {
|
||||
}
|
||||
let child: string | (string | VNode)[] = item.children as string
|
||||
if (typeof item.children !== 'string') {
|
||||
child = this.rander2VNode(item.children, middlewareMap)
|
||||
child = await this.render2VNode(item.children, middlewareMap)
|
||||
}
|
||||
return h(tagName ?? 'span', tagAttrs, child)
|
||||
}
|
||||
@@ -214,11 +215,11 @@ type TagType = {
|
||||
// 要优化也是以后优化了
|
||||
export type middlewareType = {
|
||||
filter: (tagName: string) => boolean,
|
||||
rander: (option: {
|
||||
render: (option: {
|
||||
item: miaoVNodeType,
|
||||
tagName: string,
|
||||
tagAttrs: { [key: string]: string },
|
||||
middlewareMap: Map<string, middlewareType[]>
|
||||
}
|
||||
) => VNode | string
|
||||
) => Promise<VNode | string>
|
||||
}
|
||||
Reference in new issue
Block a user