bot commited on
Commit
9f6f5a5
·
1 Parent(s): ff7f695

初始化

Browse files
.gitignore ADDED
@@ -0,0 +1,23 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Logs
2
+ logs
3
+ *.log
4
+ npm-debug.log*
5
+ yarn-debug.log*
6
+ yarn-error.log*
7
+ pnpm-debug.log*
8
+ lerna-debug.log*
9
+
10
+ node_modules
11
+ dist-ssr
12
+ *.local
13
+
14
+ # Editor directories and files
15
+ .vscode/*
16
+ !.vscode/extensions.json
17
+ .idea
18
+ .DS_Store
19
+ *.suo
20
+ *.ntvs*
21
+ *.njsproj
22
+ *.sln
23
+ *.sw?
Dockerfile ADDED
@@ -0,0 +1,16 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # 使用官方 Golang 镜像作为构建阶段的基础镜像
2
+ FROM golang:1.24.1
3
+
4
+ # 设置工作目录
5
+ WORKDIR /app
6
+
7
+ # 将当前目录内容复制到容器的工作目录
8
+ COPY . .
9
+
10
+ # 下载并安装项目依赖
11
+ RUN go mod tidy
12
+
13
+ # 编译 Go 项目
14
+ RUN go run main.go
15
+
16
+ EXPOSE 8080
api/onedrive.go ADDED
@@ -0,0 +1,107 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ package api
2
+
3
+ import (
4
+ "alist/utils"
5
+ "encoding/base64"
6
+ "net/url"
7
+ "strings"
8
+
9
+ "github.com/gin-gonic/gin"
10
+ )
11
+
12
+ type Zone struct {
13
+ Oauth string
14
+ Api string
15
+ }
16
+
17
+ var zones = map[string]Zone{
18
+ "global": {
19
+ Oauth: "https://login.microsoftonline.com",
20
+ Api: "https://graph.microsoft.com",
21
+ },
22
+ "cn": {
23
+ Oauth: "https://login.chinacloudapi.cn",
24
+ Api: "https://microsoftgraph.chinacloudapi.cn",
25
+ },
26
+ "us": {
27
+ Oauth: "https://login.microsoftonline.us",
28
+ Api: "https://graph.microsoft.us",
29
+ },
30
+ "de": {
31
+ Oauth: "https://login.microsoftonline.de",
32
+ Api: "https://graph.microsoft.de",
33
+ },
34
+ }
35
+
36
+ func onedriveToken(c *gin.Context) {
37
+ req := struct {
38
+ Code string `json:"code"`
39
+ Client string `json:"client"`
40
+ }{}
41
+ err := c.ShouldBind(&req)
42
+ if err != nil {
43
+ c.JSON(400, gin.H{"error": err.Error()})
44
+ return
45
+ }
46
+ data, err := base64.StdEncoding.DecodeString(req.Client)
47
+ if err != nil {
48
+ c.JSON(400, gin.H{"error": err.Error()})
49
+ return
50
+ }
51
+ clients := strings.Split(string(data), "::")
52
+ if len(clients) < 3 {
53
+ c.JSON(400, gin.H{"error": "client error"})
54
+ return
55
+ }
56
+ if zone, ok := zones[clients[2]]; ok {
57
+ res, err := utils.RestyClient.R().
58
+ SetFormData(map[string]string{
59
+ "client_id": clients[0],
60
+ "client_secret": clients[1],
61
+ "code": req.Code,
62
+ "grant_type": "authorization_code",
63
+ "redirect_uri": "https://alist.nn.ci/tool/onedrive/callback",
64
+ }).
65
+ Post(zone.Oauth + "/common/oauth2/v2.0/token")
66
+ if err != nil {
67
+ c.JSON(400, gin.H{"error": err.Error()})
68
+ return
69
+ }
70
+ c.Data(res.StatusCode(), "application/json", res.Body())
71
+ return
72
+ }
73
+ c.JSON(400, gin.H{"error": "zone doesn't exist"})
74
+ return
75
+ }
76
+
77
+ func spSiteID(c *gin.Context) {
78
+ req := struct {
79
+ AccessToken string `json:"access_token"`
80
+ SiteUrl string `json:"site_url"`
81
+ Zone string `json:"zone"`
82
+ }{}
83
+ err := c.ShouldBind(&req)
84
+ if err != nil {
85
+ c.JSON(400, gin.H{"error": err.Error()})
86
+ return
87
+ }
88
+ u, err := url.Parse(req.SiteUrl)
89
+ if err != nil {
90
+ c.JSON(400, gin.H{"error": err.Error()})
91
+ return
92
+ }
93
+ siteName := u.Path
94
+ if zone, ok := zones[req.Zone]; ok {
95
+ res, err := utils.RestyClient.R().
96
+ SetHeader("Authorization", "Bearer "+req.AccessToken).
97
+ Get(zone.Api + "/v1.0/sites/root:/" + siteName)
98
+ if err != nil {
99
+ c.JSON(400, gin.H{"error": err.Error()})
100
+ return
101
+ }
102
+ c.Data(res.StatusCode(), "application/json", res.Body())
103
+ return
104
+ }
105
+ c.JSON(400, gin.H{"error": "zone doesn't exist"})
106
+ return
107
+ }
api/setup.go ADDED
@@ -0,0 +1,10 @@
 
 
 
 
 
 
 
 
 
 
 
1
+ package api
2
+
3
+ import (
4
+ "github.com/gin-gonic/gin"
5
+ )
6
+
7
+ func Setup(g *gin.RouterGroup) {
8
+ g.POST("/onedrive/get_refresh_token", onedriveToken)
9
+ g.POST("/onedrive/get_site_id", spSiteID)
10
+ }
dist/assets/index-BdwxG1dv.js ADDED
The diff for this file is too large to render. See raw diff
 
dist/assets/index-Vqu8JWjZ.css ADDED
@@ -0,0 +1 @@
 
 
1
+ :root{font-family:system-ui,Avenir,Helvetica,Arial,sans-serif;line-height:1.5;font-weight:400;color-scheme:light dark;color:#ffffffde;background-color:#242424;font-synthesis:none;text-rendering:optimizeLegibility;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}a{font-weight:500;color:#646cff;text-decoration:inherit}a:hover{color:#535bf2}body{margin:0;display:flex;place-items:center;min-width:320px;min-height:100vh}h1{font-size:3.2em;line-height:1.1}button{border-radius:8px;border:1px solid transparent;padding:.6em 1.2em;font-size:1em;font-weight:500;font-family:inherit;background-color:#1a1a1a;cursor:pointer;transition:border-color .25s}button:hover{border-color:#646cff}button:focus,button:focus-visible{outline:4px auto -webkit-focus-ring-color}.card{padding:2em}#app{max-width:1280px;margin:0 auto;padding:2rem;text-align:center}@media (prefers-color-scheme: light){:root{color:#213547;background-color:#fff}a:hover{color:#747bff}button{background-color:#f9f9f9}}.logo[data-v-bc48f64b]{height:6em;padding:1.5em;will-change:filter;transition:filter .3s}.logo[data-v-bc48f64b]:hover{filter:drop-shadow(0 0 2em #646cffaa)}.logo.vue[data-v-bc48f64b]:hover{filter:drop-shadow(0 0 2em #42b883aa)}h4[data-v-fe6af522]{margin:0}p[data-v-b86336cf]{margin:0;font-size:large}
dist/index.html ADDED
@@ -0,0 +1,17 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <!doctype html>
2
+ <html lang="en">
3
+
4
+ <head>
5
+ <meta charset="UTF-8" />
6
+ <link rel="icon" type="image/svg+xml" href="/vite.svg" />
7
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
8
+ <title>Alist Tool</title>
9
+ <script type="module" crossorigin src="/assets/index-BdwxG1dv.js"></script>
10
+ <link rel="stylesheet" crossorigin href="/assets/index-Vqu8JWjZ.css">
11
+ </head>
12
+
13
+ <body>
14
+ <div id="app"></div>
15
+ </body>
16
+
17
+ </html>
dist/vite.svg ADDED
go.mod ADDED
@@ -0,0 +1,37 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ module alist
2
+
3
+ go 1.23.3
4
+
5
+ require (
6
+ github.com/gin-gonic/gin v1.10.1
7
+ github.com/go-resty/resty/v2 v2.16.5
8
+ )
9
+
10
+ require (
11
+ github.com/bytedance/sonic v1.11.6 // indirect
12
+ github.com/bytedance/sonic/loader v0.1.1 // indirect
13
+ github.com/cloudwego/base64x v0.1.4 // indirect
14
+ github.com/cloudwego/iasm v0.2.0 // indirect
15
+ github.com/gabriel-vasile/mimetype v1.4.3 // indirect
16
+ github.com/gin-contrib/sse v0.1.0 // indirect
17
+ github.com/go-playground/locales v0.14.1 // indirect
18
+ github.com/go-playground/universal-translator v0.18.1 // indirect
19
+ github.com/go-playground/validator/v10 v10.20.0 // indirect
20
+ github.com/goccy/go-json v0.10.2 // indirect
21
+ github.com/json-iterator/go v1.1.12 // indirect
22
+ github.com/klauspost/cpuid/v2 v2.2.7 // indirect
23
+ github.com/leodido/go-urn v1.4.0 // indirect
24
+ github.com/mattn/go-isatty v0.0.20 // indirect
25
+ github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
26
+ github.com/modern-go/reflect2 v1.0.2 // indirect
27
+ github.com/pelletier/go-toml/v2 v2.2.2 // indirect
28
+ github.com/twitchyliquid64/golang-asm v0.15.1 // indirect
29
+ github.com/ugorji/go/codec v1.2.12 // indirect
30
+ golang.org/x/arch v0.8.0 // indirect
31
+ golang.org/x/crypto v0.31.0 // indirect
32
+ golang.org/x/net v0.33.0 // indirect
33
+ golang.org/x/sys v0.28.0 // indirect
34
+ golang.org/x/text v0.21.0 // indirect
35
+ google.golang.org/protobuf v1.34.1 // indirect
36
+ gopkg.in/yaml.v3 v3.0.1 // indirect
37
+ )
go.sum ADDED
@@ -0,0 +1,93 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ github.com/bytedance/sonic v1.11.6 h1:oUp34TzMlL+OY1OUWxHqsdkgC/Zfc85zGqw9siXjrc0=
2
+ github.com/bytedance/sonic v1.11.6/go.mod h1:LysEHSvpvDySVdC2f87zGWf6CIKJcAvqab1ZaiQtds4=
3
+ github.com/bytedance/sonic/loader v0.1.1 h1:c+e5Pt1k/cy5wMveRDyk2X4B9hF4g7an8N3zCYjJFNM=
4
+ github.com/bytedance/sonic/loader v0.1.1/go.mod h1:ncP89zfokxS5LZrJxl5z0UJcsk4M4yY2JpfqGeCtNLU=
5
+ github.com/cloudwego/base64x v0.1.4 h1:jwCgWpFanWmN8xoIUHa2rtzmkd5J2plF/dnLS6Xd/0Y=
6
+ github.com/cloudwego/base64x v0.1.4/go.mod h1:0zlkT4Wn5C6NdauXdJRhSKRlJvmclQ1hhJgA0rcu/8w=
7
+ github.com/cloudwego/iasm v0.2.0 h1:1KNIy1I1H9hNNFEEH3DVnI4UujN+1zjpuk6gwHLTssg=
8
+ github.com/cloudwego/iasm v0.2.0/go.mod h1:8rXZaNYT2n95jn+zTI1sDr+IgcD2GVs0nlbbQPiEFhY=
9
+ github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
10
+ github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
11
+ github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
12
+ github.com/gabriel-vasile/mimetype v1.4.3 h1:in2uUcidCuFcDKtdcBxlR0rJ1+fsokWf+uqxgUFjbI0=
13
+ github.com/gabriel-vasile/mimetype v1.4.3/go.mod h1:d8uq/6HKRL6CGdk+aubisF/M5GcPfT7nKyLpA0lbSSk=
14
+ github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE=
15
+ github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI=
16
+ github.com/gin-gonic/gin v1.10.1 h1:T0ujvqyCSqRopADpgPgiTT63DUQVSfojyME59Ei63pQ=
17
+ github.com/gin-gonic/gin v1.10.1/go.mod h1:4PMNQiOhvDRa013RKVbsiNwoyezlm2rm0uX/T7kzp5Y=
18
+ github.com/go-playground/assert/v2 v2.2.0 h1:JvknZsQTYeFEAhQwI4qEt9cyV5ONwRHC+lYKSsYSR8s=
19
+ github.com/go-playground/assert/v2 v2.2.0/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4=
20
+ github.com/go-playground/locales v0.14.1 h1:EWaQ/wswjilfKLTECiXz7Rh+3BjFhfDFKv/oXslEjJA=
21
+ github.com/go-playground/locales v0.14.1/go.mod h1:hxrqLVvrK65+Rwrd5Fc6F2O76J/NuW9t0sjnWqG1slY=
22
+ github.com/go-playground/universal-translator v0.18.1 h1:Bcnm0ZwsGyWbCzImXv+pAJnYK9S473LQFuzCbDbfSFY=
23
+ github.com/go-playground/universal-translator v0.18.1/go.mod h1:xekY+UJKNuX9WP91TpwSH2VMlDf28Uj24BCp08ZFTUY=
24
+ github.com/go-playground/validator/v10 v10.20.0 h1:K9ISHbSaI0lyB2eWMPJo+kOS/FBExVwjEviJTixqxL8=
25
+ github.com/go-playground/validator/v10 v10.20.0/go.mod h1:dbuPbCMFw/DrkbEynArYaCwl3amGuJotoKCe95atGMM=
26
+ github.com/go-resty/resty/v2 v2.16.5 h1:hBKqmWrr7uRc3euHVqmh1HTHcKn99Smr7o5spptdhTM=
27
+ github.com/go-resty/resty/v2 v2.16.5/go.mod h1:hkJtXbA2iKHzJheXYvQ8snQES5ZLGKMwQ07xAwp/fiA=
28
+ github.com/goccy/go-json v0.10.2 h1:CrxCmQqYDkv1z7lO7Wbh2HN93uovUHgrECaO5ZrCXAU=
29
+ github.com/goccy/go-json v0.10.2/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I=
30
+ github.com/google/go-cmp v0.5.5 h1:Khx7svrCpmxxtHBq5j2mp/xVjsi8hQMfNLvJFAlrGgU=
31
+ github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
32
+ github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
33
+ github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM=
34
+ github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=
35
+ github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg=
36
+ github.com/klauspost/cpuid/v2 v2.2.7 h1:ZWSB3igEs+d0qvnxR/ZBzXVmxkgt8DdzP6m9pfuVLDM=
37
+ github.com/klauspost/cpuid/v2 v2.2.7/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws=
38
+ github.com/knz/go-libedit v1.10.1/go.mod h1:MZTVkCWyz0oBc7JOWP3wNAzd002ZbM/5hgShxwh4x8M=
39
+ github.com/leodido/go-urn v1.4.0 h1:WT9HwE9SGECu3lg4d/dIA+jxlljEa1/ffXKmRjqdmIQ=
40
+ github.com/leodido/go-urn v1.4.0/go.mod h1:bvxc+MVxLKB4z00jd1z+Dvzr47oO32F/QSNjSBOlFxI=
41
+ github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY=
42
+ github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=
43
+ github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
44
+ github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg=
45
+ github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
46
+ github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M=
47
+ github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk=
48
+ github.com/pelletier/go-toml/v2 v2.2.2 h1:aYUidT7k73Pcl9nb2gScu7NSrKCSHIDE89b3+6Wq+LM=
49
+ github.com/pelletier/go-toml/v2 v2.2.2/go.mod h1:1t835xjRzz80PqgE6HHgN2JOsmgYu/h4qDAS4n929Rs=
50
+ github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
51
+ github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
52
+ github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
53
+ github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=
54
+ github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=
55
+ github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA=
56
+ github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
57
+ github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
58
+ github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
59
+ github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
60
+ github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=
61
+ github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=
62
+ github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg=
63
+ github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
64
+ github.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI=
65
+ github.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08=
66
+ github.com/ugorji/go/codec v1.2.12 h1:9LC83zGrHhuUA9l16C9AHXAqEV/2wBQ4nkvumAE65EE=
67
+ github.com/ugorji/go/codec v1.2.12/go.mod h1:UNopzCgEMSXjBc6AOMqYvWC1ktqTAfzJZUZgYf6w6lg=
68
+ golang.org/x/arch v0.0.0-20210923205945-b76863e36670/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=
69
+ golang.org/x/arch v0.8.0 h1:3wRIsP3pM4yUptoR96otTUOXI367OS0+c9eeRi9doIc=
70
+ golang.org/x/arch v0.8.0/go.mod h1:FEVrYAQjsQXMVJ1nsMoVVXPZg6p2JE2mx8psSWTDQys=
71
+ golang.org/x/crypto v0.31.0 h1:ihbySMvVjLAeSH1IbfcRTkD/iNscyz8rGzjF/E5hV6U=
72
+ golang.org/x/crypto v0.31.0/go.mod h1:kDsLvtWBEx7MV9tJOj9bnXsPbxwJQ6csT/x4KIN4Ssk=
73
+ golang.org/x/net v0.33.0 h1:74SYHlV8BIgHIFC/LrYkOGIwL19eTYXQ5wc6TBuO36I=
74
+ golang.org/x/net v0.33.0/go.mod h1:HXLR5J+9DxmrqMwG9qjGCxZ+zKXxBru04zlTvWlWuN4=
75
+ golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
76
+ golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
77
+ golang.org/x/sys v0.28.0 h1:Fksou7UEQUWlKvIdsqzJmUmCX3cZuD2+P3XyyzwMhlA=
78
+ golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
79
+ golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo=
80
+ golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ=
81
+ golang.org/x/time v0.6.0 h1:eTDhh4ZXt5Qf0augr54TN6suAUudPcawVZeIAPU7D4U=
82
+ golang.org/x/time v0.6.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM=
83
+ golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4=
84
+ golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
85
+ google.golang.org/protobuf v1.34.1 h1:9ddQBjfCyZPOHPUiPxpYESBLc+T8P3E+Vo4IbKZgFWg=
86
+ google.golang.org/protobuf v1.34.1/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos=
87
+ gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM=
88
+ gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
89
+ gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
90
+ gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
91
+ gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
92
+ nullprogram.com/x/optparse v1.0.0/go.mod h1:KdyPE+Igbe0jQUrVfMqDMeJQIJZEuyV7pjYmp6pbG50=
93
+ rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4=
index.html ADDED
@@ -0,0 +1,16 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <!doctype html>
2
+ <html lang="en">
3
+
4
+ <head>
5
+ <meta charset="UTF-8" />
6
+ <link rel="icon" type="image/svg+xml" href="/vite.svg" />
7
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
8
+ <title>Alist Tool</title>
9
+ </head>
10
+
11
+ <body>
12
+ <div id="app"></div>
13
+ <script type="module" src="/src/main.js"></script>
14
+ </body>
15
+
16
+ </html>
main.go ADDED
@@ -0,0 +1,27 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ package main
2
+
3
+ import (
4
+ "alist/api"
5
+
6
+ "github.com/gin-gonic/gin"
7
+ )
8
+
9
+ func main() {
10
+ r := gin.Default()
11
+
12
+ // 提供静态资源(Vue 构建后的目录)
13
+ r.Static("/assets", "./dist/assets")
14
+ r.LoadHTMLFiles("./dist/index.html")
15
+
16
+ // 所有接口前缀为 /api
17
+ apiGroup := r.Group("/api")
18
+ api.Setup(apiGroup)
19
+
20
+ // 所有非 API 的路由都返回 index.html(用于前端路由)
21
+ r.NoRoute(func(c *gin.Context) {
22
+ c.HTML(200, "index.html", nil)
23
+ })
24
+
25
+ // 启动服务
26
+ r.Run(":8080") // 默认监听 8080 端口
27
+ }
package.json ADDED
@@ -0,0 +1,20 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "name": "alist",
3
+ "private": true,
4
+ "version": "0.0.0",
5
+ "type": "module",
6
+ "scripts": {
7
+ "dev": "vite",
8
+ "build": "vite build",
9
+ "preview": "vite preview"
10
+ },
11
+ "dependencies": {
12
+ "naive-ui": "^2.41.1",
13
+ "vue": "^3.5.13",
14
+ "vue-router": "^4.5.1"
15
+ },
16
+ "devDependencies": {
17
+ "@vitejs/plugin-vue": "^5.2.3",
18
+ "vite": "^6.3.5"
19
+ }
20
+ }
pnpm-lock.yaml ADDED
@@ -0,0 +1,954 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ lockfileVersion: '9.0'
2
+
3
+ settings:
4
+ autoInstallPeers: true
5
+ excludeLinksFromLockfile: false
6
+
7
+ importers:
8
+
9
+ .:
10
+ dependencies:
11
+ naive-ui:
12
+ specifier: ^2.41.1
13
+ version: 2.41.1(vue@3.5.16)
14
+ vue:
15
+ specifier: ^3.5.13
16
+ version: 3.5.16
17
+ vue-router:
18
+ specifier: ^4.5.1
19
+ version: 4.5.1(vue@3.5.16)
20
+ devDependencies:
21
+ '@vitejs/plugin-vue':
22
+ specifier: ^5.2.3
23
+ version: 5.2.4(vite@6.3.5)(vue@3.5.16)
24
+ vite:
25
+ specifier: ^6.3.5
26
+ version: 6.3.5
27
+
28
+ packages:
29
+
30
+ '@babel/helper-string-parser@7.27.1':
31
+ resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==}
32
+ engines: {node: '>=6.9.0'}
33
+
34
+ '@babel/helper-validator-identifier@7.27.1':
35
+ resolution: {integrity: sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==}
36
+ engines: {node: '>=6.9.0'}
37
+
38
+ '@babel/parser@7.27.5':
39
+ resolution: {integrity: sha512-OsQd175SxWkGlzbny8J3K8TnnDD0N3lrIUtB92xwyRpzaenGZhxDvxN/JgU00U3CDZNj9tPuDJ5H0WS4Nt3vKg==}
40
+ engines: {node: '>=6.0.0'}
41
+ hasBin: true
42
+
43
+ '@babel/types@7.27.6':
44
+ resolution: {integrity: sha512-ETyHEk2VHHvl9b9jZP5IHPavHYk57EhanlRRuae9XCpb/j5bDCbPPMOBfCWhnl/7EDJz0jEMCi/RhccCE8r1+Q==}
45
+ engines: {node: '>=6.9.0'}
46
+
47
+ '@css-render/plugin-bem@0.15.14':
48
+ resolution: {integrity: sha512-QK513CJ7yEQxm/P3EwsI+d+ha8kSOcjGvD6SevM41neEMxdULE+18iuQK6tEChAWMOQNQPLG/Rw3Khb69r5neg==}
49
+ peerDependencies:
50
+ css-render: ~0.15.14
51
+
52
+ '@css-render/vue3-ssr@0.15.14':
53
+ resolution: {integrity: sha512-//8027GSbxE9n3QlD73xFY6z4ZbHbvrOVB7AO6hsmrEzGbg+h2A09HboUyDgu+xsmj7JnvJD39Irt+2D0+iV8g==}
54
+ peerDependencies:
55
+ vue: ^3.0.11
56
+
57
+ '@emotion/hash@0.8.0':
58
+ resolution: {integrity: sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow==}
59
+
60
+ '@esbuild/aix-ppc64@0.25.5':
61
+ resolution: {integrity: sha512-9o3TMmpmftaCMepOdA5k/yDw8SfInyzWWTjYTFCX3kPSDJMROQTb8jg+h9Cnwnmm1vOzvxN7gIfB5V2ewpjtGA==}
62
+ engines: {node: '>=18'}
63
+ cpu: [ppc64]
64
+ os: [aix]
65
+
66
+ '@esbuild/android-arm64@0.25.5':
67
+ resolution: {integrity: sha512-VGzGhj4lJO+TVGV1v8ntCZWJktV7SGCs3Pn1GRWI1SBFtRALoomm8k5E9Pmwg3HOAal2VDc2F9+PM/rEY6oIDg==}
68
+ engines: {node: '>=18'}
69
+ cpu: [arm64]
70
+ os: [android]
71
+
72
+ '@esbuild/android-arm@0.25.5':
73
+ resolution: {integrity: sha512-AdJKSPeEHgi7/ZhuIPtcQKr5RQdo6OO2IL87JkianiMYMPbCtot9fxPbrMiBADOWWm3T2si9stAiVsGbTQFkbA==}
74
+ engines: {node: '>=18'}
75
+ cpu: [arm]
76
+ os: [android]
77
+
78
+ '@esbuild/android-x64@0.25.5':
79
+ resolution: {integrity: sha512-D2GyJT1kjvO//drbRT3Hib9XPwQeWd9vZoBJn+bu/lVsOZ13cqNdDeqIF/xQ5/VmWvMduP6AmXvylO/PIc2isw==}
80
+ engines: {node: '>=18'}
81
+ cpu: [x64]
82
+ os: [android]
83
+
84
+ '@esbuild/darwin-arm64@0.25.5':
85
+ resolution: {integrity: sha512-GtaBgammVvdF7aPIgH2jxMDdivezgFu6iKpmT+48+F8Hhg5J/sfnDieg0aeG/jfSvkYQU2/pceFPDKlqZzwnfQ==}
86
+ engines: {node: '>=18'}
87
+ cpu: [arm64]
88
+ os: [darwin]
89
+
90
+ '@esbuild/darwin-x64@0.25.5':
91
+ resolution: {integrity: sha512-1iT4FVL0dJ76/q1wd7XDsXrSW+oLoquptvh4CLR4kITDtqi2e/xwXwdCVH8hVHU43wgJdsq7Gxuzcs6Iq/7bxQ==}
92
+ engines: {node: '>=18'}
93
+ cpu: [x64]
94
+ os: [darwin]
95
+
96
+ '@esbuild/freebsd-arm64@0.25.5':
97
+ resolution: {integrity: sha512-nk4tGP3JThz4La38Uy/gzyXtpkPW8zSAmoUhK9xKKXdBCzKODMc2adkB2+8om9BDYugz+uGV7sLmpTYzvmz6Sw==}
98
+ engines: {node: '>=18'}
99
+ cpu: [arm64]
100
+ os: [freebsd]
101
+
102
+ '@esbuild/freebsd-x64@0.25.5':
103
+ resolution: {integrity: sha512-PrikaNjiXdR2laW6OIjlbeuCPrPaAl0IwPIaRv+SMV8CiM8i2LqVUHFC1+8eORgWyY7yhQY+2U2fA55mBzReaw==}
104
+ engines: {node: '>=18'}
105
+ cpu: [x64]
106
+ os: [freebsd]
107
+
108
+ '@esbuild/linux-arm64@0.25.5':
109
+ resolution: {integrity: sha512-Z9kfb1v6ZlGbWj8EJk9T6czVEjjq2ntSYLY2cw6pAZl4oKtfgQuS4HOq41M/BcoLPzrUbNd+R4BXFyH//nHxVg==}
110
+ engines: {node: '>=18'}
111
+ cpu: [arm64]
112
+ os: [linux]
113
+
114
+ '@esbuild/linux-arm@0.25.5':
115
+ resolution: {integrity: sha512-cPzojwW2okgh7ZlRpcBEtsX7WBuqbLrNXqLU89GxWbNt6uIg78ET82qifUy3W6OVww6ZWobWub5oqZOVtwolfw==}
116
+ engines: {node: '>=18'}
117
+ cpu: [arm]
118
+ os: [linux]
119
+
120
+ '@esbuild/linux-ia32@0.25.5':
121
+ resolution: {integrity: sha512-sQ7l00M8bSv36GLV95BVAdhJ2QsIbCuCjh/uYrWiMQSUuV+LpXwIqhgJDcvMTj+VsQmqAHL2yYaasENvJ7CDKA==}
122
+ engines: {node: '>=18'}
123
+ cpu: [ia32]
124
+ os: [linux]
125
+
126
+ '@esbuild/linux-loong64@0.25.5':
127
+ resolution: {integrity: sha512-0ur7ae16hDUC4OL5iEnDb0tZHDxYmuQyhKhsPBV8f99f6Z9KQM02g33f93rNH5A30agMS46u2HP6qTdEt6Q1kg==}
128
+ engines: {node: '>=18'}
129
+ cpu: [loong64]
130
+ os: [linux]
131
+
132
+ '@esbuild/linux-mips64el@0.25.5':
133
+ resolution: {integrity: sha512-kB/66P1OsHO5zLz0i6X0RxlQ+3cu0mkxS3TKFvkb5lin6uwZ/ttOkP3Z8lfR9mJOBk14ZwZ9182SIIWFGNmqmg==}
134
+ engines: {node: '>=18'}
135
+ cpu: [mips64el]
136
+ os: [linux]
137
+
138
+ '@esbuild/linux-ppc64@0.25.5':
139
+ resolution: {integrity: sha512-UZCmJ7r9X2fe2D6jBmkLBMQetXPXIsZjQJCjgwpVDz+YMcS6oFR27alkgGv3Oqkv07bxdvw7fyB71/olceJhkQ==}
140
+ engines: {node: '>=18'}
141
+ cpu: [ppc64]
142
+ os: [linux]
143
+
144
+ '@esbuild/linux-riscv64@0.25.5':
145
+ resolution: {integrity: sha512-kTxwu4mLyeOlsVIFPfQo+fQJAV9mh24xL+y+Bm6ej067sYANjyEw1dNHmvoqxJUCMnkBdKpvOn0Ahql6+4VyeA==}
146
+ engines: {node: '>=18'}
147
+ cpu: [riscv64]
148
+ os: [linux]
149
+
150
+ '@esbuild/linux-s390x@0.25.5':
151
+ resolution: {integrity: sha512-K2dSKTKfmdh78uJ3NcWFiqyRrimfdinS5ErLSn3vluHNeHVnBAFWC8a4X5N+7FgVE1EjXS1QDZbpqZBjfrqMTQ==}
152
+ engines: {node: '>=18'}
153
+ cpu: [s390x]
154
+ os: [linux]
155
+
156
+ '@esbuild/linux-x64@0.25.5':
157
+ resolution: {integrity: sha512-uhj8N2obKTE6pSZ+aMUbqq+1nXxNjZIIjCjGLfsWvVpy7gKCOL6rsY1MhRh9zLtUtAI7vpgLMK6DxjO8Qm9lJw==}
158
+ engines: {node: '>=18'}
159
+ cpu: [x64]
160
+ os: [linux]
161
+
162
+ '@esbuild/netbsd-arm64@0.25.5':
163
+ resolution: {integrity: sha512-pwHtMP9viAy1oHPvgxtOv+OkduK5ugofNTVDilIzBLpoWAM16r7b/mxBvfpuQDpRQFMfuVr5aLcn4yveGvBZvw==}
164
+ engines: {node: '>=18'}
165
+ cpu: [arm64]
166
+ os: [netbsd]
167
+
168
+ '@esbuild/netbsd-x64@0.25.5':
169
+ resolution: {integrity: sha512-WOb5fKrvVTRMfWFNCroYWWklbnXH0Q5rZppjq0vQIdlsQKuw6mdSihwSo4RV/YdQ5UCKKvBy7/0ZZYLBZKIbwQ==}
170
+ engines: {node: '>=18'}
171
+ cpu: [x64]
172
+ os: [netbsd]
173
+
174
+ '@esbuild/openbsd-arm64@0.25.5':
175
+ resolution: {integrity: sha512-7A208+uQKgTxHd0G0uqZO8UjK2R0DDb4fDmERtARjSHWxqMTye4Erz4zZafx7Di9Cv+lNHYuncAkiGFySoD+Mw==}
176
+ engines: {node: '>=18'}
177
+ cpu: [arm64]
178
+ os: [openbsd]
179
+
180
+ '@esbuild/openbsd-x64@0.25.5':
181
+ resolution: {integrity: sha512-G4hE405ErTWraiZ8UiSoesH8DaCsMm0Cay4fsFWOOUcz8b8rC6uCvnagr+gnioEjWn0wC+o1/TAHt+It+MpIMg==}
182
+ engines: {node: '>=18'}
183
+ cpu: [x64]
184
+ os: [openbsd]
185
+
186
+ '@esbuild/sunos-x64@0.25.5':
187
+ resolution: {integrity: sha512-l+azKShMy7FxzY0Rj4RCt5VD/q8mG/e+mDivgspo+yL8zW7qEwctQ6YqKX34DTEleFAvCIUviCFX1SDZRSyMQA==}
188
+ engines: {node: '>=18'}
189
+ cpu: [x64]
190
+ os: [sunos]
191
+
192
+ '@esbuild/win32-arm64@0.25.5':
193
+ resolution: {integrity: sha512-O2S7SNZzdcFG7eFKgvwUEZ2VG9D/sn/eIiz8XRZ1Q/DO5a3s76Xv0mdBzVM5j5R639lXQmPmSo0iRpHqUUrsxw==}
194
+ engines: {node: '>=18'}
195
+ cpu: [arm64]
196
+ os: [win32]
197
+
198
+ '@esbuild/win32-ia32@0.25.5':
199
+ resolution: {integrity: sha512-onOJ02pqs9h1iMJ1PQphR+VZv8qBMQ77Klcsqv9CNW2w6yLqoURLcgERAIurY6QE63bbLuqgP9ATqajFLK5AMQ==}
200
+ engines: {node: '>=18'}
201
+ cpu: [ia32]
202
+ os: [win32]
203
+
204
+ '@esbuild/win32-x64@0.25.5':
205
+ resolution: {integrity: sha512-TXv6YnJ8ZMVdX+SXWVBo/0p8LTcrUYngpWjvm91TMjjBQii7Oz11Lw5lbDV5Y0TzuhSJHwiH4hEtC1I42mMS0g==}
206
+ engines: {node: '>=18'}
207
+ cpu: [x64]
208
+ os: [win32]
209
+
210
+ '@jridgewell/sourcemap-codec@1.5.0':
211
+ resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==}
212
+
213
+ '@juggle/resize-observer@3.4.0':
214
+ resolution: {integrity: sha512-dfLbk+PwWvFzSxwk3n5ySL0hfBog779o8h68wK/7/APo/7cgyWp5jcXockbxdk5kFRkbeXWm4Fbi9FrdN381sA==}
215
+
216
+ '@rollup/rollup-android-arm-eabi@4.43.0':
217
+ resolution: {integrity: sha512-Krjy9awJl6rKbruhQDgivNbD1WuLb8xAclM4IR4cN5pHGAs2oIMMQJEiC3IC/9TZJ+QZkmZhlMO/6MBGxPidpw==}
218
+ cpu: [arm]
219
+ os: [android]
220
+
221
+ '@rollup/rollup-android-arm64@4.43.0':
222
+ resolution: {integrity: sha512-ss4YJwRt5I63454Rpj+mXCXicakdFmKnUNxr1dLK+5rv5FJgAxnN7s31a5VchRYxCFWdmnDWKd0wbAdTr0J5EA==}
223
+ cpu: [arm64]
224
+ os: [android]
225
+
226
+ '@rollup/rollup-darwin-arm64@4.43.0':
227
+ resolution: {integrity: sha512-eKoL8ykZ7zz8MjgBenEF2OoTNFAPFz1/lyJ5UmmFSz5jW+7XbH1+MAgCVHy72aG59rbuQLcJeiMrP8qP5d/N0A==}
228
+ cpu: [arm64]
229
+ os: [darwin]
230
+
231
+ '@rollup/rollup-darwin-x64@4.43.0':
232
+ resolution: {integrity: sha512-SYwXJgaBYW33Wi/q4ubN+ldWC4DzQY62S4Ll2dgfr/dbPoF50dlQwEaEHSKrQdSjC6oIe1WgzosoaNoHCdNuMg==}
233
+ cpu: [x64]
234
+ os: [darwin]
235
+
236
+ '@rollup/rollup-freebsd-arm64@4.43.0':
237
+ resolution: {integrity: sha512-SV+U5sSo0yujrjzBF7/YidieK2iF6E7MdF6EbYxNz94lA+R0wKl3SiixGyG/9Klab6uNBIqsN7j4Y/Fya7wAjQ==}
238
+ cpu: [arm64]
239
+ os: [freebsd]
240
+
241
+ '@rollup/rollup-freebsd-x64@4.43.0':
242
+ resolution: {integrity: sha512-J7uCsiV13L/VOeHJBo5SjasKiGxJ0g+nQTrBkAsmQBIdil3KhPnSE9GnRon4ejX1XDdsmK/l30IYLiAaQEO0Cg==}
243
+ cpu: [x64]
244
+ os: [freebsd]
245
+
246
+ '@rollup/rollup-linux-arm-gnueabihf@4.43.0':
247
+ resolution: {integrity: sha512-gTJ/JnnjCMc15uwB10TTATBEhK9meBIY+gXP4s0sHD1zHOaIh4Dmy1X9wup18IiY9tTNk5gJc4yx9ctj/fjrIw==}
248
+ cpu: [arm]
249
+ os: [linux]
250
+
251
+ '@rollup/rollup-linux-arm-musleabihf@4.43.0':
252
+ resolution: {integrity: sha512-ZJ3gZynL1LDSIvRfz0qXtTNs56n5DI2Mq+WACWZ7yGHFUEirHBRt7fyIk0NsCKhmRhn7WAcjgSkSVVxKlPNFFw==}
253
+ cpu: [arm]
254
+ os: [linux]
255
+
256
+ '@rollup/rollup-linux-arm64-gnu@4.43.0':
257
+ resolution: {integrity: sha512-8FnkipasmOOSSlfucGYEu58U8cxEdhziKjPD2FIa0ONVMxvl/hmONtX/7y4vGjdUhjcTHlKlDhw3H9t98fPvyA==}
258
+ cpu: [arm64]
259
+ os: [linux]
260
+
261
+ '@rollup/rollup-linux-arm64-musl@4.43.0':
262
+ resolution: {integrity: sha512-KPPyAdlcIZ6S9C3S2cndXDkV0Bb1OSMsX0Eelr2Bay4EsF9yi9u9uzc9RniK3mcUGCLhWY9oLr6er80P5DE6XA==}
263
+ cpu: [arm64]
264
+ os: [linux]
265
+
266
+ '@rollup/rollup-linux-loongarch64-gnu@4.43.0':
267
+ resolution: {integrity: sha512-HPGDIH0/ZzAZjvtlXj6g+KDQ9ZMHfSP553za7o2Odegb/BEfwJcR0Sw0RLNpQ9nC6Gy8s+3mSS9xjZ0n3rhcYg==}
268
+ cpu: [loong64]
269
+ os: [linux]
270
+
271
+ '@rollup/rollup-linux-powerpc64le-gnu@4.43.0':
272
+ resolution: {integrity: sha512-gEmwbOws4U4GLAJDhhtSPWPXUzDfMRedT3hFMyRAvM9Mrnj+dJIFIeL7otsv2WF3D7GrV0GIewW0y28dOYWkmw==}
273
+ cpu: [ppc64]
274
+ os: [linux]
275
+
276
+ '@rollup/rollup-linux-riscv64-gnu@4.43.0':
277
+ resolution: {integrity: sha512-XXKvo2e+wFtXZF/9xoWohHg+MuRnvO29TI5Hqe9xwN5uN8NKUYy7tXUG3EZAlfchufNCTHNGjEx7uN78KsBo0g==}
278
+ cpu: [riscv64]
279
+ os: [linux]
280
+
281
+ '@rollup/rollup-linux-riscv64-musl@4.43.0':
282
+ resolution: {integrity: sha512-ruf3hPWhjw6uDFsOAzmbNIvlXFXlBQ4nk57Sec8E8rUxs/AI4HD6xmiiasOOx/3QxS2f5eQMKTAwk7KHwpzr/Q==}
283
+ cpu: [riscv64]
284
+ os: [linux]
285
+
286
+ '@rollup/rollup-linux-s390x-gnu@4.43.0':
287
+ resolution: {integrity: sha512-QmNIAqDiEMEvFV15rsSnjoSmO0+eJLoKRD9EAa9rrYNwO/XRCtOGM3A5A0X+wmG+XRrw9Fxdsw+LnyYiZWWcVw==}
288
+ cpu: [s390x]
289
+ os: [linux]
290
+
291
+ '@rollup/rollup-linux-x64-gnu@4.43.0':
292
+ resolution: {integrity: sha512-jAHr/S0iiBtFyzjhOkAics/2SrXE092qyqEg96e90L3t9Op8OTzS6+IX0Fy5wCt2+KqeHAkti+eitV0wvblEoQ==}
293
+ cpu: [x64]
294
+ os: [linux]
295
+
296
+ '@rollup/rollup-linux-x64-musl@4.43.0':
297
+ resolution: {integrity: sha512-3yATWgdeXyuHtBhrLt98w+5fKurdqvs8B53LaoKD7P7H7FKOONLsBVMNl9ghPQZQuYcceV5CDyPfyfGpMWD9mQ==}
298
+ cpu: [x64]
299
+ os: [linux]
300
+
301
+ '@rollup/rollup-win32-arm64-msvc@4.43.0':
302
+ resolution: {integrity: sha512-wVzXp2qDSCOpcBCT5WRWLmpJRIzv23valvcTwMHEobkjippNf+C3ys/+wf07poPkeNix0paTNemB2XrHr2TnGw==}
303
+ cpu: [arm64]
304
+ os: [win32]
305
+
306
+ '@rollup/rollup-win32-ia32-msvc@4.43.0':
307
+ resolution: {integrity: sha512-fYCTEyzf8d+7diCw8b+asvWDCLMjsCEA8alvtAutqJOJp/wL5hs1rWSqJ1vkjgW0L2NB4bsYJrpKkiIPRR9dvw==}
308
+ cpu: [ia32]
309
+ os: [win32]
310
+
311
+ '@rollup/rollup-win32-x64-msvc@4.43.0':
312
+ resolution: {integrity: sha512-SnGhLiE5rlK0ofq8kzuDkM0g7FN1s5VYY+YSMTibP7CqShxCQvqtNxTARS4xX4PFJfHjG0ZQYX9iGzI3FQh5Aw==}
313
+ cpu: [x64]
314
+ os: [win32]
315
+
316
+ '@types/estree@1.0.7':
317
+ resolution: {integrity: sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==}
318
+
319
+ '@types/katex@0.16.7':
320
+ resolution: {integrity: sha512-HMwFiRujE5PjrgwHQ25+bsLJgowjGjm5Z8FVSf0N6PwgJrwxH0QxzHYDcKsTfV3wva0vzrpqMTJS2jXPr5BMEQ==}
321
+
322
+ '@types/lodash-es@4.17.12':
323
+ resolution: {integrity: sha512-0NgftHUcV4v34VhXm8QBSftKVXtbkBG3ViCjs6+eJ5a6y6Mi/jiFGPc1sC7QK+9BFhWrURE3EOggmWaSxL9OzQ==}
324
+
325
+ '@types/lodash@4.17.17':
326
+ resolution: {integrity: sha512-RRVJ+J3J+WmyOTqnz3PiBLA501eKwXl2noseKOrNo/6+XEHjTAxO4xHvxQB6QuNm+s4WRbn6rSiap8+EA+ykFQ==}
327
+
328
+ '@vitejs/plugin-vue@5.2.4':
329
+ resolution: {integrity: sha512-7Yx/SXSOcQq5HiiV3orevHUFn+pmMB4cgbEkDYgnkUWb0WfeQ/wa2yFv6D5ICiCQOVpjA7vYDXrC7AGO8yjDHA==}
330
+ engines: {node: ^18.0.0 || >=20.0.0}
331
+ peerDependencies:
332
+ vite: ^5.0.0 || ^6.0.0
333
+ vue: ^3.2.25
334
+
335
+ '@vue/compiler-core@3.5.16':
336
+ resolution: {integrity: sha512-AOQS2eaQOaaZQoL1u+2rCJIKDruNXVBZSiUD3chnUrsoX5ZTQMaCvXlWNIfxBJuU15r1o7+mpo5223KVtIhAgQ==}
337
+
338
+ '@vue/compiler-dom@3.5.16':
339
+ resolution: {integrity: sha512-SSJIhBr/teipXiXjmWOVWLnxjNGo65Oj/8wTEQz0nqwQeP75jWZ0n4sF24Zxoht1cuJoWopwj0J0exYwCJ0dCQ==}
340
+
341
+ '@vue/compiler-sfc@3.5.16':
342
+ resolution: {integrity: sha512-rQR6VSFNpiinDy/DVUE0vHoIDUF++6p910cgcZoaAUm3POxgNOOdS/xgoll3rNdKYTYPnnbARDCZOyZ+QSe6Pw==}
343
+
344
+ '@vue/compiler-ssr@3.5.16':
345
+ resolution: {integrity: sha512-d2V7kfxbdsjrDSGlJE7my1ZzCXViEcqN6w14DOsDrUCHEA6vbnVCpRFfrc4ryCP/lCKzX2eS1YtnLE/BuC9f/A==}
346
+
347
+ '@vue/devtools-api@6.6.4':
348
+ resolution: {integrity: sha512-sGhTPMuXqZ1rVOk32RylztWkfXTRhuS7vgAKv0zjqk8gbsHkJ7xfFf+jbySxt7tWObEJwyKaHMikV/WGDiQm8g==}
349
+
350
+ '@vue/reactivity@3.5.16':
351
+ resolution: {integrity: sha512-FG5Q5ee/kxhIm1p2bykPpPwqiUBV3kFySsHEQha5BJvjXdZTUfmya7wP7zC39dFuZAcf/PD5S4Lni55vGLMhvA==}
352
+
353
+ '@vue/runtime-core@3.5.16':
354
+ resolution: {integrity: sha512-bw5Ykq6+JFHYxrQa7Tjr+VSzw7Dj4ldR/udyBZbq73fCdJmyy5MPIFR9IX/M5Qs+TtTjuyUTCnmK3lWWwpAcFQ==}
355
+
356
+ '@vue/runtime-dom@3.5.16':
357
+ resolution: {integrity: sha512-T1qqYJsG2xMGhImRUV9y/RseB9d0eCYZQ4CWca9ztCuiPj/XWNNN+lkNBuzVbia5z4/cgxdL28NoQCvC0Xcfww==}
358
+
359
+ '@vue/server-renderer@3.5.16':
360
+ resolution: {integrity: sha512-BrX0qLiv/WugguGsnQUJiYOE0Fe5mZTwi6b7X/ybGB0vfrPH9z0gD/Y6WOR1sGCgX4gc25L1RYS5eYQKDMoNIg==}
361
+ peerDependencies:
362
+ vue: 3.5.16
363
+
364
+ '@vue/shared@3.5.16':
365
+ resolution: {integrity: sha512-c/0fWy3Jw6Z8L9FmTyYfkpM5zklnqqa9+a6dz3DvONRKW2NEbh46BP0FHuLFSWi2TnQEtp91Z6zOWNrU6QiyPg==}
366
+
367
+ async-validator@4.2.5:
368
+ resolution: {integrity: sha512-7HhHjtERjqlNbZtqNqy2rckN/SpOOlmDliet+lP7k+eKZEjPk3DgyeU9lIXLdeLz0uBbbVp+9Qdow9wJWgwwfg==}
369
+
370
+ css-render@0.15.14:
371
+ resolution: {integrity: sha512-9nF4PdUle+5ta4W5SyZdLCCmFd37uVimSjg1evcTqKJCyvCEEj12WKzOSBNak6r4im4J4iYXKH1OWpUV5LBYFg==}
372
+
373
+ csstype@3.0.11:
374
+ resolution: {integrity: sha512-sa6P2wJ+CAbgyy4KFssIb/JNMLxFvKF1pCYCSXS8ZMuqZnMsrxqI2E5sPyoTpxoPU/gVZMzr2zjOfg8GIZOMsw==}
375
+
376
+ csstype@3.1.3:
377
+ resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==}
378
+
379
+ date-fns-tz@3.2.0:
380
+ resolution: {integrity: sha512-sg8HqoTEulcbbbVXeg84u5UnlsQa8GS5QXMqjjYIhS4abEVVKIUwe0/l/UhrZdKaL/W5eWZNlbTeEIiOXTcsBQ==}
381
+ peerDependencies:
382
+ date-fns: ^3.0.0 || ^4.0.0
383
+
384
+ date-fns@3.6.0:
385
+ resolution: {integrity: sha512-fRHTG8g/Gif+kSh50gaGEdToemgfj74aRX3swtiouboip5JDLAyDE9F11nHMIcvOaXeOC6D7SpNhi7uFyB7Uww==}
386
+
387
+ entities@4.5.0:
388
+ resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==}
389
+ engines: {node: '>=0.12'}
390
+
391
+ esbuild@0.25.5:
392
+ resolution: {integrity: sha512-P8OtKZRv/5J5hhz0cUAdu/cLuPIKXpQl1R9pZtvmHWQvrAUVd0UNIPT4IB4W3rNOqVO0rlqHmCIbSwxh/c9yUQ==}
393
+ engines: {node: '>=18'}
394
+ hasBin: true
395
+
396
+ estree-walker@2.0.2:
397
+ resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==}
398
+
399
+ evtd@0.2.4:
400
+ resolution: {integrity: sha512-qaeGN5bx63s/AXgQo8gj6fBkxge+OoLddLniox5qtLAEY5HSnuSlISXVPxnSae1dWblvTh4/HoMIB+mbMsvZzw==}
401
+
402
+ fdir@6.4.6:
403
+ resolution: {integrity: sha512-hiFoqpyZcfNm1yc4u8oWCf9A2c4D3QjCrks3zmoVKVxpQRzmPNar1hUJcBG2RQHvEVGDN+Jm81ZheVLAQMK6+w==}
404
+ peerDependencies:
405
+ picomatch: ^3 || ^4
406
+ peerDependenciesMeta:
407
+ picomatch:
408
+ optional: true
409
+
410
+ fsevents@2.3.3:
411
+ resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==}
412
+ engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0}
413
+ os: [darwin]
414
+
415
+ highlight.js@11.11.1:
416
+ resolution: {integrity: sha512-Xwwo44whKBVCYoliBQwaPvtd/2tYFkRQtXDWj1nackaV2JPXx3L0+Jvd8/qCJ2p+ML0/XVkJ2q+Mr+UVdpJK5w==}
417
+ engines: {node: '>=12.0.0'}
418
+
419
+ lodash-es@4.17.21:
420
+ resolution: {integrity: sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==}
421
+
422
+ lodash@4.17.21:
423
+ resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==}
424
+
425
+ magic-string@0.30.17:
426
+ resolution: {integrity: sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==}
427
+
428
+ naive-ui@2.41.1:
429
+ resolution: {integrity: sha512-TRv+GSCHnlbpiTJoz1xS1/l6Vn9/refjzJ6vFfXLuvBkSLB7ow6ERuLf2AQOqUrFSdM542EBJjoK1iM1S6X2lA==}
430
+ peerDependencies:
431
+ vue: ^3.0.0
432
+
433
+ nanoid@3.3.11:
434
+ resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==}
435
+ engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1}
436
+ hasBin: true
437
+
438
+ picocolors@1.1.1:
439
+ resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==}
440
+
441
+ picomatch@4.0.2:
442
+ resolution: {integrity: sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==}
443
+ engines: {node: '>=12'}
444
+
445
+ postcss@8.5.4:
446
+ resolution: {integrity: sha512-QSa9EBe+uwlGTFmHsPKokv3B/oEMQZxfqW0QqNCyhpa6mB1afzulwn8hihglqAb2pOw+BJgNlmXQ8la2VeHB7w==}
447
+ engines: {node: ^10 || ^12 || >=14}
448
+
449
+ rollup@4.43.0:
450
+ resolution: {integrity: sha512-wdN2Kd3Twh8MAEOEJZsuxuLKCsBEo4PVNLK6tQWAn10VhsVewQLzcucMgLolRlhFybGxfclbPeEYBaP6RvUFGg==}
451
+ engines: {node: '>=18.0.0', npm: '>=8.0.0'}
452
+ hasBin: true
453
+
454
+ seemly@0.3.10:
455
+ resolution: {integrity: sha512-2+SMxtG1PcsL0uyhkumlOU6Qo9TAQ/WyH7tthnPIOQB05/12jz9naq6GZ6iZ6ApVsO3rr2gsnTf3++OV63kE1Q==}
456
+
457
+ source-map-js@1.2.1:
458
+ resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==}
459
+ engines: {node: '>=0.10.0'}
460
+
461
+ tinyglobby@0.2.14:
462
+ resolution: {integrity: sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ==}
463
+ engines: {node: '>=12.0.0'}
464
+
465
+ treemate@0.3.11:
466
+ resolution: {integrity: sha512-M8RGFoKtZ8dF+iwJfAJTOH/SM4KluKOKRJpjCMhI8bG3qB74zrFoArKZ62ll0Fr3mqkMJiQOmWYkdYgDeITYQg==}
467
+
468
+ vdirs@0.1.8:
469
+ resolution: {integrity: sha512-H9V1zGRLQZg9b+GdMk8MXDN2Lva0zx72MPahDKc30v+DtwKjfyOSXWRIX4t2mhDubM1H09gPhWeth/BJWPHGUw==}
470
+ peerDependencies:
471
+ vue: ^3.0.11
472
+
473
+ vite@6.3.5:
474
+ resolution: {integrity: sha512-cZn6NDFE7wdTpINgs++ZJ4N49W2vRp8LCKrn3Ob1kYNtOo21vfDoaV5GzBfLU4MovSAB8uNRm4jgzVQZ+mBzPQ==}
475
+ engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0}
476
+ hasBin: true
477
+ peerDependencies:
478
+ '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0
479
+ jiti: '>=1.21.0'
480
+ less: '*'
481
+ lightningcss: ^1.21.0
482
+ sass: '*'
483
+ sass-embedded: '*'
484
+ stylus: '*'
485
+ sugarss: '*'
486
+ terser: ^5.16.0
487
+ tsx: ^4.8.1
488
+ yaml: ^2.4.2
489
+ peerDependenciesMeta:
490
+ '@types/node':
491
+ optional: true
492
+ jiti:
493
+ optional: true
494
+ less:
495
+ optional: true
496
+ lightningcss:
497
+ optional: true
498
+ sass:
499
+ optional: true
500
+ sass-embedded:
501
+ optional: true
502
+ stylus:
503
+ optional: true
504
+ sugarss:
505
+ optional: true
506
+ terser:
507
+ optional: true
508
+ tsx:
509
+ optional: true
510
+ yaml:
511
+ optional: true
512
+
513
+ vooks@0.2.12:
514
+ resolution: {integrity: sha512-iox0I3RZzxtKlcgYaStQYKEzWWGAduMmq+jS7OrNdQo1FgGfPMubGL3uGHOU9n97NIvfFDBGnpSvkWyb/NSn/Q==}
515
+ peerDependencies:
516
+ vue: ^3.0.0
517
+
518
+ vue-router@4.5.1:
519
+ resolution: {integrity: sha512-ogAF3P97NPm8fJsE4by9dwSYtDwXIY1nFY9T6DyQnGHd1E2Da94w9JIolpe42LJGIl0DwOHBi8TcRPlPGwbTtw==}
520
+ peerDependencies:
521
+ vue: ^3.2.0
522
+
523
+ vue@3.5.16:
524
+ resolution: {integrity: sha512-rjOV2ecxMd5SiAmof2xzh2WxntRcigkX/He4YFJ6WdRvVUrbt6DxC1Iujh10XLl8xCDRDtGKMeO3D+pRQ1PP9w==}
525
+ peerDependencies:
526
+ typescript: '*'
527
+ peerDependenciesMeta:
528
+ typescript:
529
+ optional: true
530
+
531
+ vueuc@0.4.64:
532
+ resolution: {integrity: sha512-wlJQj7fIwKK2pOEoOq4Aro8JdPOGpX8aWQhV8YkTW9OgWD2uj2O8ANzvSsIGjx7LTOc7QbS7sXdxHi6XvRnHPA==}
533
+ peerDependencies:
534
+ vue: ^3.0.11
535
+
536
+ snapshots:
537
+
538
+ '@babel/helper-string-parser@7.27.1': {}
539
+
540
+ '@babel/helper-validator-identifier@7.27.1': {}
541
+
542
+ '@babel/parser@7.27.5':
543
+ dependencies:
544
+ '@babel/types': 7.27.6
545
+
546
+ '@babel/types@7.27.6':
547
+ dependencies:
548
+ '@babel/helper-string-parser': 7.27.1
549
+ '@babel/helper-validator-identifier': 7.27.1
550
+
551
+ '@css-render/plugin-bem@0.15.14(css-render@0.15.14)':
552
+ dependencies:
553
+ css-render: 0.15.14
554
+
555
+ '@css-render/vue3-ssr@0.15.14(vue@3.5.16)':
556
+ dependencies:
557
+ vue: 3.5.16
558
+
559
+ '@emotion/hash@0.8.0': {}
560
+
561
+ '@esbuild/aix-ppc64@0.25.5':
562
+ optional: true
563
+
564
+ '@esbuild/android-arm64@0.25.5':
565
+ optional: true
566
+
567
+ '@esbuild/android-arm@0.25.5':
568
+ optional: true
569
+
570
+ '@esbuild/android-x64@0.25.5':
571
+ optional: true
572
+
573
+ '@esbuild/darwin-arm64@0.25.5':
574
+ optional: true
575
+
576
+ '@esbuild/darwin-x64@0.25.5':
577
+ optional: true
578
+
579
+ '@esbuild/freebsd-arm64@0.25.5':
580
+ optional: true
581
+
582
+ '@esbuild/freebsd-x64@0.25.5':
583
+ optional: true
584
+
585
+ '@esbuild/linux-arm64@0.25.5':
586
+ optional: true
587
+
588
+ '@esbuild/linux-arm@0.25.5':
589
+ optional: true
590
+
591
+ '@esbuild/linux-ia32@0.25.5':
592
+ optional: true
593
+
594
+ '@esbuild/linux-loong64@0.25.5':
595
+ optional: true
596
+
597
+ '@esbuild/linux-mips64el@0.25.5':
598
+ optional: true
599
+
600
+ '@esbuild/linux-ppc64@0.25.5':
601
+ optional: true
602
+
603
+ '@esbuild/linux-riscv64@0.25.5':
604
+ optional: true
605
+
606
+ '@esbuild/linux-s390x@0.25.5':
607
+ optional: true
608
+
609
+ '@esbuild/linux-x64@0.25.5':
610
+ optional: true
611
+
612
+ '@esbuild/netbsd-arm64@0.25.5':
613
+ optional: true
614
+
615
+ '@esbuild/netbsd-x64@0.25.5':
616
+ optional: true
617
+
618
+ '@esbuild/openbsd-arm64@0.25.5':
619
+ optional: true
620
+
621
+ '@esbuild/openbsd-x64@0.25.5':
622
+ optional: true
623
+
624
+ '@esbuild/sunos-x64@0.25.5':
625
+ optional: true
626
+
627
+ '@esbuild/win32-arm64@0.25.5':
628
+ optional: true
629
+
630
+ '@esbuild/win32-ia32@0.25.5':
631
+ optional: true
632
+
633
+ '@esbuild/win32-x64@0.25.5':
634
+ optional: true
635
+
636
+ '@jridgewell/sourcemap-codec@1.5.0': {}
637
+
638
+ '@juggle/resize-observer@3.4.0': {}
639
+
640
+ '@rollup/rollup-android-arm-eabi@4.43.0':
641
+ optional: true
642
+
643
+ '@rollup/rollup-android-arm64@4.43.0':
644
+ optional: true
645
+
646
+ '@rollup/rollup-darwin-arm64@4.43.0':
647
+ optional: true
648
+
649
+ '@rollup/rollup-darwin-x64@4.43.0':
650
+ optional: true
651
+
652
+ '@rollup/rollup-freebsd-arm64@4.43.0':
653
+ optional: true
654
+
655
+ '@rollup/rollup-freebsd-x64@4.43.0':
656
+ optional: true
657
+
658
+ '@rollup/rollup-linux-arm-gnueabihf@4.43.0':
659
+ optional: true
660
+
661
+ '@rollup/rollup-linux-arm-musleabihf@4.43.0':
662
+ optional: true
663
+
664
+ '@rollup/rollup-linux-arm64-gnu@4.43.0':
665
+ optional: true
666
+
667
+ '@rollup/rollup-linux-arm64-musl@4.43.0':
668
+ optional: true
669
+
670
+ '@rollup/rollup-linux-loongarch64-gnu@4.43.0':
671
+ optional: true
672
+
673
+ '@rollup/rollup-linux-powerpc64le-gnu@4.43.0':
674
+ optional: true
675
+
676
+ '@rollup/rollup-linux-riscv64-gnu@4.43.0':
677
+ optional: true
678
+
679
+ '@rollup/rollup-linux-riscv64-musl@4.43.0':
680
+ optional: true
681
+
682
+ '@rollup/rollup-linux-s390x-gnu@4.43.0':
683
+ optional: true
684
+
685
+ '@rollup/rollup-linux-x64-gnu@4.43.0':
686
+ optional: true
687
+
688
+ '@rollup/rollup-linux-x64-musl@4.43.0':
689
+ optional: true
690
+
691
+ '@rollup/rollup-win32-arm64-msvc@4.43.0':
692
+ optional: true
693
+
694
+ '@rollup/rollup-win32-ia32-msvc@4.43.0':
695
+ optional: true
696
+
697
+ '@rollup/rollup-win32-x64-msvc@4.43.0':
698
+ optional: true
699
+
700
+ '@types/estree@1.0.7': {}
701
+
702
+ '@types/katex@0.16.7': {}
703
+
704
+ '@types/lodash-es@4.17.12':
705
+ dependencies:
706
+ '@types/lodash': 4.17.17
707
+
708
+ '@types/lodash@4.17.17': {}
709
+
710
+ '@vitejs/plugin-vue@5.2.4(vite@6.3.5)(vue@3.5.16)':
711
+ dependencies:
712
+ vite: 6.3.5
713
+ vue: 3.5.16
714
+
715
+ '@vue/compiler-core@3.5.16':
716
+ dependencies:
717
+ '@babel/parser': 7.27.5
718
+ '@vue/shared': 3.5.16
719
+ entities: 4.5.0
720
+ estree-walker: 2.0.2
721
+ source-map-js: 1.2.1
722
+
723
+ '@vue/compiler-dom@3.5.16':
724
+ dependencies:
725
+ '@vue/compiler-core': 3.5.16
726
+ '@vue/shared': 3.5.16
727
+
728
+ '@vue/compiler-sfc@3.5.16':
729
+ dependencies:
730
+ '@babel/parser': 7.27.5
731
+ '@vue/compiler-core': 3.5.16
732
+ '@vue/compiler-dom': 3.5.16
733
+ '@vue/compiler-ssr': 3.5.16
734
+ '@vue/shared': 3.5.16
735
+ estree-walker: 2.0.2
736
+ magic-string: 0.30.17
737
+ postcss: 8.5.4
738
+ source-map-js: 1.2.1
739
+
740
+ '@vue/compiler-ssr@3.5.16':
741
+ dependencies:
742
+ '@vue/compiler-dom': 3.5.16
743
+ '@vue/shared': 3.5.16
744
+
745
+ '@vue/devtools-api@6.6.4': {}
746
+
747
+ '@vue/reactivity@3.5.16':
748
+ dependencies:
749
+ '@vue/shared': 3.5.16
750
+
751
+ '@vue/runtime-core@3.5.16':
752
+ dependencies:
753
+ '@vue/reactivity': 3.5.16
754
+ '@vue/shared': 3.5.16
755
+
756
+ '@vue/runtime-dom@3.5.16':
757
+ dependencies:
758
+ '@vue/reactivity': 3.5.16
759
+ '@vue/runtime-core': 3.5.16
760
+ '@vue/shared': 3.5.16
761
+ csstype: 3.1.3
762
+
763
+ '@vue/server-renderer@3.5.16(vue@3.5.16)':
764
+ dependencies:
765
+ '@vue/compiler-ssr': 3.5.16
766
+ '@vue/shared': 3.5.16
767
+ vue: 3.5.16
768
+
769
+ '@vue/shared@3.5.16': {}
770
+
771
+ async-validator@4.2.5: {}
772
+
773
+ css-render@0.15.14:
774
+ dependencies:
775
+ '@emotion/hash': 0.8.0
776
+ csstype: 3.0.11
777
+
778
+ csstype@3.0.11: {}
779
+
780
+ csstype@3.1.3: {}
781
+
782
+ date-fns-tz@3.2.0(date-fns@3.6.0):
783
+ dependencies:
784
+ date-fns: 3.6.0
785
+
786
+ date-fns@3.6.0: {}
787
+
788
+ entities@4.5.0: {}
789
+
790
+ esbuild@0.25.5:
791
+ optionalDependencies:
792
+ '@esbuild/aix-ppc64': 0.25.5
793
+ '@esbuild/android-arm': 0.25.5
794
+ '@esbuild/android-arm64': 0.25.5
795
+ '@esbuild/android-x64': 0.25.5
796
+ '@esbuild/darwin-arm64': 0.25.5
797
+ '@esbuild/darwin-x64': 0.25.5
798
+ '@esbuild/freebsd-arm64': 0.25.5
799
+ '@esbuild/freebsd-x64': 0.25.5
800
+ '@esbuild/linux-arm': 0.25.5
801
+ '@esbuild/linux-arm64': 0.25.5
802
+ '@esbuild/linux-ia32': 0.25.5
803
+ '@esbuild/linux-loong64': 0.25.5
804
+ '@esbuild/linux-mips64el': 0.25.5
805
+ '@esbuild/linux-ppc64': 0.25.5
806
+ '@esbuild/linux-riscv64': 0.25.5
807
+ '@esbuild/linux-s390x': 0.25.5
808
+ '@esbuild/linux-x64': 0.25.5
809
+ '@esbuild/netbsd-arm64': 0.25.5
810
+ '@esbuild/netbsd-x64': 0.25.5
811
+ '@esbuild/openbsd-arm64': 0.25.5
812
+ '@esbuild/openbsd-x64': 0.25.5
813
+ '@esbuild/sunos-x64': 0.25.5
814
+ '@esbuild/win32-arm64': 0.25.5
815
+ '@esbuild/win32-ia32': 0.25.5
816
+ '@esbuild/win32-x64': 0.25.5
817
+
818
+ estree-walker@2.0.2: {}
819
+
820
+ evtd@0.2.4: {}
821
+
822
+ fdir@6.4.6(picomatch@4.0.2):
823
+ optionalDependencies:
824
+ picomatch: 4.0.2
825
+
826
+ fsevents@2.3.3:
827
+ optional: true
828
+
829
+ highlight.js@11.11.1: {}
830
+
831
+ lodash-es@4.17.21: {}
832
+
833
+ lodash@4.17.21: {}
834
+
835
+ magic-string@0.30.17:
836
+ dependencies:
837
+ '@jridgewell/sourcemap-codec': 1.5.0
838
+
839
+ naive-ui@2.41.1(vue@3.5.16):
840
+ dependencies:
841
+ '@css-render/plugin-bem': 0.15.14(css-render@0.15.14)
842
+ '@css-render/vue3-ssr': 0.15.14(vue@3.5.16)
843
+ '@types/katex': 0.16.7
844
+ '@types/lodash': 4.17.17
845
+ '@types/lodash-es': 4.17.12
846
+ async-validator: 4.2.5
847
+ css-render: 0.15.14
848
+ csstype: 3.1.3
849
+ date-fns: 3.6.0
850
+ date-fns-tz: 3.2.0(date-fns@3.6.0)
851
+ evtd: 0.2.4
852
+ highlight.js: 11.11.1
853
+ lodash: 4.17.21
854
+ lodash-es: 4.17.21
855
+ seemly: 0.3.10
856
+ treemate: 0.3.11
857
+ vdirs: 0.1.8(vue@3.5.16)
858
+ vooks: 0.2.12(vue@3.5.16)
859
+ vue: 3.5.16
860
+ vueuc: 0.4.64(vue@3.5.16)
861
+
862
+ nanoid@3.3.11: {}
863
+
864
+ picocolors@1.1.1: {}
865
+
866
+ picomatch@4.0.2: {}
867
+
868
+ postcss@8.5.4:
869
+ dependencies:
870
+ nanoid: 3.3.11
871
+ picocolors: 1.1.1
872
+ source-map-js: 1.2.1
873
+
874
+ rollup@4.43.0:
875
+ dependencies:
876
+ '@types/estree': 1.0.7
877
+ optionalDependencies:
878
+ '@rollup/rollup-android-arm-eabi': 4.43.0
879
+ '@rollup/rollup-android-arm64': 4.43.0
880
+ '@rollup/rollup-darwin-arm64': 4.43.0
881
+ '@rollup/rollup-darwin-x64': 4.43.0
882
+ '@rollup/rollup-freebsd-arm64': 4.43.0
883
+ '@rollup/rollup-freebsd-x64': 4.43.0
884
+ '@rollup/rollup-linux-arm-gnueabihf': 4.43.0
885
+ '@rollup/rollup-linux-arm-musleabihf': 4.43.0
886
+ '@rollup/rollup-linux-arm64-gnu': 4.43.0
887
+ '@rollup/rollup-linux-arm64-musl': 4.43.0
888
+ '@rollup/rollup-linux-loongarch64-gnu': 4.43.0
889
+ '@rollup/rollup-linux-powerpc64le-gnu': 4.43.0
890
+ '@rollup/rollup-linux-riscv64-gnu': 4.43.0
891
+ '@rollup/rollup-linux-riscv64-musl': 4.43.0
892
+ '@rollup/rollup-linux-s390x-gnu': 4.43.0
893
+ '@rollup/rollup-linux-x64-gnu': 4.43.0
894
+ '@rollup/rollup-linux-x64-musl': 4.43.0
895
+ '@rollup/rollup-win32-arm64-msvc': 4.43.0
896
+ '@rollup/rollup-win32-ia32-msvc': 4.43.0
897
+ '@rollup/rollup-win32-x64-msvc': 4.43.0
898
+ fsevents: 2.3.3
899
+
900
+ seemly@0.3.10: {}
901
+
902
+ source-map-js@1.2.1: {}
903
+
904
+ tinyglobby@0.2.14:
905
+ dependencies:
906
+ fdir: 6.4.6(picomatch@4.0.2)
907
+ picomatch: 4.0.2
908
+
909
+ treemate@0.3.11: {}
910
+
911
+ vdirs@0.1.8(vue@3.5.16):
912
+ dependencies:
913
+ evtd: 0.2.4
914
+ vue: 3.5.16
915
+
916
+ vite@6.3.5:
917
+ dependencies:
918
+ esbuild: 0.25.5
919
+ fdir: 6.4.6(picomatch@4.0.2)
920
+ picomatch: 4.0.2
921
+ postcss: 8.5.4
922
+ rollup: 4.43.0
923
+ tinyglobby: 0.2.14
924
+ optionalDependencies:
925
+ fsevents: 2.3.3
926
+
927
+ vooks@0.2.12(vue@3.5.16):
928
+ dependencies:
929
+ evtd: 0.2.4
930
+ vue: 3.5.16
931
+
932
+ vue-router@4.5.1(vue@3.5.16):
933
+ dependencies:
934
+ '@vue/devtools-api': 6.6.4
935
+ vue: 3.5.16
936
+
937
+ vue@3.5.16:
938
+ dependencies:
939
+ '@vue/compiler-dom': 3.5.16
940
+ '@vue/compiler-sfc': 3.5.16
941
+ '@vue/runtime-dom': 3.5.16
942
+ '@vue/server-renderer': 3.5.16(vue@3.5.16)
943
+ '@vue/shared': 3.5.16
944
+
945
+ vueuc@0.4.64(vue@3.5.16):
946
+ dependencies:
947
+ '@css-render/vue3-ssr': 0.15.14(vue@3.5.16)
948
+ '@juggle/resize-observer': 3.4.0
949
+ css-render: 0.15.14
950
+ evtd: 0.2.4
951
+ seemly: 0.3.10
952
+ vdirs: 0.1.8(vue@3.5.16)
953
+ vooks: 0.2.12(vue@3.5.16)
954
+ vue: 3.5.16
public/vite.svg ADDED
src/App.vue ADDED
@@ -0,0 +1,22 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <script setup>
2
+
3
+ </script>
4
+
5
+ <template>
6
+ <router-view />
7
+ </template>
8
+
9
+ <style scoped>
10
+ .logo {
11
+ height: 6em;
12
+ padding: 1.5em;
13
+ will-change: filter;
14
+ transition: filter 300ms;
15
+ }
16
+ .logo:hover {
17
+ filter: drop-shadow(0 0 2em #646cffaa);
18
+ }
19
+ .logo.vue:hover {
20
+ filter: drop-shadow(0 0 2em #42b883aa);
21
+ }
22
+ </style>
src/assets/vue.svg ADDED
src/components/onedrive/Callback.vue ADDED
@@ -0,0 +1,118 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <script lang="ts" setup>
2
+ import { NAlert, NButton, NInput, NSpace, NSpin } from 'naive-ui';
3
+ import { reactive } from 'vue';
4
+
5
+ const url = new URL(window.location.href);
6
+ const code = url.searchParams.get("code");
7
+ const client = url.searchParams.get("state");
8
+ const error = url.searchParams.get("error");
9
+ const error_description = url.searchParams.get("error_description");
10
+
11
+ const data = reactive({
12
+ refreshToken: "",
13
+ accessToken: "",
14
+ error1: "",
15
+ errorMessage1: "",
16
+ siteUrl: "",
17
+ siteId: "",
18
+ error2: "",
19
+ errorMessage2: "",
20
+ gettingSiteId: false,
21
+ })
22
+
23
+ const getToken = () => {
24
+ fetch(`/api/onedrive/get_refresh_token`, {
25
+ method: "POST",
26
+ headers: {
27
+ "Content-Type": "application/json",
28
+ },
29
+ body: JSON.stringify({
30
+ code,
31
+ client,
32
+ }),
33
+ })
34
+ .then((resp) => resp.json())
35
+ .then((res) => {
36
+ console.log(res);
37
+ if (res.error) {
38
+ data.error1 = res.error;
39
+ data.errorMessage1 = res.error_description;
40
+ return;
41
+ }
42
+ data.refreshToken = res.refresh_token;
43
+ data.accessToken = res.access_token;
44
+ });
45
+ }
46
+
47
+ if (code && client && !error) {
48
+ getToken()
49
+ }
50
+ const [client_id, client_secret, zone,redirect_uri] = atob(client as string).split("::");
51
+
52
+ const getSiteId = () => {
53
+ data.gettingSiteId = true;
54
+ fetch(`/api/onedrive/get_site_id`, {
55
+ method: "POST",
56
+ headers: {
57
+ "Content-Type": "application/json",
58
+ },
59
+ body: JSON.stringify({
60
+ site_url: data.siteUrl,
61
+ access_token: data.accessToken,
62
+ zone,
63
+ }),
64
+ })
65
+ .then((resp) => {
66
+ data.gettingSiteId = false;
67
+ return resp.json()
68
+ })
69
+ .then((res) => {
70
+ if (res.error) {
71
+ data.error2 = res.error;
72
+ data.errorMessage2 = res.error.message;
73
+ return;
74
+ }
75
+ data.siteId = res.id;
76
+ });
77
+ }
78
+
79
+
80
+ </script>
81
+
82
+ <template>
83
+ <NAlert :title="error || 'Error'" type="error" v-if="!code || !client || error">
84
+ {{ error_description }}
85
+ </NAlert>
86
+ <NSpace v-else vertical size="large">
87
+ <p><b>client_id: </b>{{ client_id }}</p>
88
+ <p><b>client_secret: </b>{{ client_secret }}</p>
89
+ <p><b>zone: </b>{{ zone }}</p>
90
+ <p><b>redirect_uri: </b>{{ redirect_uri }}</p>
91
+ <NAlert :title="data.error1" type="error" v-if="data.error1 || data.errorMessage1">
92
+ {{ data.errorMessage1 }}
93
+ </NAlert>
94
+ <NSpace vertical>
95
+ <b>refresh_token:</b>
96
+ <NSpin v-if="!data.refreshToken && !data.errorMessage1" />
97
+ <NInput v-else type="textarea" autosize readonly :value="data.refreshToken" />
98
+ </NSpace>
99
+ <NSpace vertical size="large" v-if="data.accessToken">
100
+ <h3>Get sharepoint site ID</h3>
101
+ <NAlert :title="data.error2" type="error" v-if="data.error2 || data.errorMessage2">
102
+ {{ data.errorMessage2 }}
103
+ </NAlert>
104
+ <NInput placeholder="input site url (https://xx.sharepoint.xx/sites/xx)" size="large"
105
+ v-model:value="data.siteUrl" />
106
+ <NButton type="primary" size="large" @click="getSiteId">Get SiteID</NButton>
107
+ <NSpin v-if="data.gettingSiteId" />
108
+ <p v-else-if="data.siteId"><b>site_id: </b>{{ data.siteId }}</p>
109
+ </NSpace>
110
+ </NSpace>
111
+ </template>
112
+
113
+ <style scoped>
114
+ p {
115
+ margin: 0;
116
+ font-size: large;
117
+ }
118
+ </style>
src/components/onedrive/Request.vue ADDED
@@ -0,0 +1,105 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <script lang="ts" setup>
2
+ import { NInput, NSelect, NButton, NSpace } from 'naive-ui'
3
+ import { reactive, watch } from 'vue';
4
+
5
+ const zones = {
6
+ global: [
7
+ "https://login.microsoftonline.com", //请求code与请求access_token
8
+ "https://graph.microsoft.com", //获取站点ID
9
+ "https://portal.azure.com", //管理后台 创建应用
10
+ "Global",
11
+ "https://www.office.com/", //创建Sharepoint
12
+ "0a2991a3-1674-4334-8561-671cc7349960", // client_id
13
+ "uw67Q~TCMqdJyH35hlcHHclv~mhNOGx.jfPFm", // client_secret
14
+ ],
15
+ cn: [
16
+ "https://login.chinacloudapi.cn",
17
+ "https://microsoftgraph.chinacloudapi.cn",
18
+ "https://portal.azure.cn",
19
+ "21vianet(世纪互联)",
20
+ "https://portal.partner.microsoftonline.cn/Home",
21
+ "50ff485b-3bdc-4bd5-92a1-75b178187673",
22
+ "6v426lmVYKGM.bkuFu24-EqJAr_~~5_HKL",
23
+ ],
24
+ de: [
25
+ "https://login.microsoftonline.de",
26
+ "https://graph.microsoft.de",
27
+ "https://portal.microsoftazure.de",
28
+ "Azure Germany",
29
+ ],
30
+ us: [
31
+ "https://login.microsoftonline.us",
32
+ "https://graph.microsoft.us",
33
+ "https://portal.azure.us",
34
+ "Azure US GOV",
35
+ ],
36
+ };
37
+ const data = reactive({
38
+ zone: "global",
39
+ client_id: "",
40
+ client_secret: "",
41
+ redirect_uri: ""
42
+ })
43
+
44
+ data.client_id = zones[data.zone][5]
45
+ data.client_secret = zones[data.zone][6]
46
+
47
+ watch(() => data.zone, (val) => {
48
+ data.client_id = zones[val][5] || ""
49
+ data.client_secret = zones[val][6] || ""
50
+ data.redirect_uri = ""
51
+ })
52
+
53
+ const createClient = () => {
54
+ window.open(zones[data.zone][2] + '/#blade/Microsoft_AAD_RegisteredApps/ApplicationsListBlade', "_blank")
55
+ }
56
+
57
+ const getToken = () => {
58
+ const url = new URL(
59
+ `${(zones as any)[data.zone][0]}/common/oauth2/v2.0/authorize`
60
+ );
61
+ url.searchParams.set("client_id", data.client_id);
62
+ url.searchParams.set("response_type", "code");
63
+ url.searchParams.set(
64
+ "redirect_uri",
65
+ data.redirect_uri
66
+ );
67
+ url.searchParams.set(
68
+ "scope",
69
+ "offline_access files.readwrite.all"
70
+ );
71
+ url.searchParams.set(
72
+ "state",
73
+ window.btoa(`${data.client_id}::${data.client_secret}::${data.zone}::${data.redirect_uri}`)
74
+ );
75
+ window.open(url.toString(), "_self");
76
+ }
77
+ </script>
78
+
79
+ <template>
80
+ <NSpace vertical size="large">
81
+ <h4>zone</h4>
82
+ <NSelect v-model:value="data.zone" size="large" :options="Object.keys(zones).map(zone => {
83
+ return {
84
+ label: zones[zone][3],
85
+ value: zone
86
+ }
87
+ })" />
88
+ <h4>client_id</h4>
89
+ <NInput size="large" v-model:value="data.client_id" />
90
+ <h4>client_secret</h4>
91
+ <NInput size="large" v-model:value="data.client_secret" />
92
+ <h4>redirect_uri</h4>
93
+ <NInput size="large" v-model:value="data.redirect_uri" />
94
+ <NSpace justify="center">
95
+ <NButton size="large" secondary @click="createClient">Create client</NButton>
96
+ <NButton size="large" type="primary" @click="getToken">Get Refresh Token</NButton>
97
+ </NSpace>
98
+ </NSpace>
99
+ </template>
100
+
101
+ <style scoped>
102
+ h4 {
103
+ margin: 0;
104
+ }
105
+ </style>
src/components/onedrive/WebDav.vue ADDED
@@ -0,0 +1,37 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <script lang="ts" setup>
2
+ import { NButton, NInput, NSpace } from 'naive-ui';
3
+ import { reactive } from 'vue';
4
+
5
+ const data = reactive({
6
+ spUrl: "",
7
+ webdavUrl: ""
8
+ })
9
+
10
+ function calWebDavURL() {
11
+ let url = data.spUrl;
12
+ if (url.startsWith("https://")) {
13
+ url = url.replace("https://", "");
14
+ }
15
+ let ans = `https://` + url.split("/").slice(0, 3).join("/");
16
+ if (url.includes("/sites/")) {
17
+ data.webdavUrl = ans + `/Shared Documents`;
18
+ } else {
19
+ data.webdavUrl = ans + `/Documents`;
20
+ }
21
+ }
22
+ </script>
23
+
24
+ <template>
25
+ <NSpace vertical size="large">
26
+ <NInput size="large" placeholder="Input Onedrive/SharePoint URL" v-model:value="data.spUrl" />
27
+ <p>OneDrive: https://xx-my.sharepoint.xx/personal/xx_xx_xx/_layouts/15/onedrive.aspx</p>
28
+ <p>SharePoint: https://xx.sharepoint.xx/sites/xx</p>
29
+ <NButton block size="large" type="primary" @click="calWebDavURL">Get WebDav URL</NButton>
30
+ <NInput size="large" type="textarea" placeholder="WebDav URL" v-model:value="data.webdavUrl" readonly />
31
+ </NSpace>
32
+ </template>
33
+ <style scoped>
34
+ p {
35
+ margin: 0;
36
+ }
37
+ </style>
src/main.js ADDED
@@ -0,0 +1,6 @@
 
 
 
 
 
 
 
1
+ import { createApp } from 'vue'
2
+ import './style.css'
3
+ import App from './App.vue'
4
+ import router from './router'
5
+
6
+ createApp(App).use(router).mount('#app')
src/router/index.js ADDED
@@ -0,0 +1,23 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import { createRouter, createWebHistory } from 'vue-router'
2
+ import Request from '../components/onedrive/Request.vue'
3
+ import CallBack from '../components/onedrive/Callback.vue'
4
+
5
+ const routes = [
6
+ {
7
+ path: '/',
8
+ name: 'Home',
9
+ component: Request
10
+ },
11
+ {
12
+ path: '/callback',
13
+ name: 'CallBack',
14
+ component: CallBack
15
+ }
16
+ ]
17
+
18
+ const router = createRouter({
19
+ history: createWebHistory(),
20
+ routes
21
+ })
22
+
23
+ export default router
src/style.css ADDED
@@ -0,0 +1,79 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ :root {
2
+ font-family: system-ui, Avenir, Helvetica, Arial, sans-serif;
3
+ line-height: 1.5;
4
+ font-weight: 400;
5
+
6
+ color-scheme: light dark;
7
+ color: rgba(255, 255, 255, 0.87);
8
+ background-color: #242424;
9
+
10
+ font-synthesis: none;
11
+ text-rendering: optimizeLegibility;
12
+ -webkit-font-smoothing: antialiased;
13
+ -moz-osx-font-smoothing: grayscale;
14
+ }
15
+
16
+ a {
17
+ font-weight: 500;
18
+ color: #646cff;
19
+ text-decoration: inherit;
20
+ }
21
+ a:hover {
22
+ color: #535bf2;
23
+ }
24
+
25
+ body {
26
+ margin: 0;
27
+ display: flex;
28
+ place-items: center;
29
+ min-width: 320px;
30
+ min-height: 100vh;
31
+ }
32
+
33
+ h1 {
34
+ font-size: 3.2em;
35
+ line-height: 1.1;
36
+ }
37
+
38
+ button {
39
+ border-radius: 8px;
40
+ border: 1px solid transparent;
41
+ padding: 0.6em 1.2em;
42
+ font-size: 1em;
43
+ font-weight: 500;
44
+ font-family: inherit;
45
+ background-color: #1a1a1a;
46
+ cursor: pointer;
47
+ transition: border-color 0.25s;
48
+ }
49
+ button:hover {
50
+ border-color: #646cff;
51
+ }
52
+ button:focus,
53
+ button:focus-visible {
54
+ outline: 4px auto -webkit-focus-ring-color;
55
+ }
56
+
57
+ .card {
58
+ padding: 2em;
59
+ }
60
+
61
+ #app {
62
+ max-width: 1280px;
63
+ margin: 0 auto;
64
+ padding: 2rem;
65
+ text-align: center;
66
+ }
67
+
68
+ @media (prefers-color-scheme: light) {
69
+ :root {
70
+ color: #213547;
71
+ background-color: #ffffff;
72
+ }
73
+ a:hover {
74
+ color: #747bff;
75
+ }
76
+ button {
77
+ background-color: #f9f9f9;
78
+ }
79
+ }
utils/utils.go ADDED
@@ -0,0 +1,27 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ package utils
2
+
3
+ import (
4
+ "crypto/tls"
5
+ "time"
6
+
7
+ "github.com/go-resty/resty/v2"
8
+ )
9
+
10
+ var (
11
+ RestyClient = newRestyClient()
12
+ )
13
+
14
+ func newRestyClient() *resty.Client {
15
+ client := resty.New()
16
+ client.SetDisableWarn(true)
17
+
18
+ client.SetTimeout(10 * time.Second)
19
+
20
+ client.SetRetryCount(3)
21
+ client.SetRetryWaitTime(2 * time.Second)
22
+ client.SetRetryMaxWaitTime(10 * time.Second)
23
+
24
+ client.SetTLSClientConfig(&tls.Config{InsecureSkipVerify: true})
25
+
26
+ return client
27
+ }
vite.config.js ADDED
@@ -0,0 +1,7 @@
 
 
 
 
 
 
 
 
1
+ import { defineConfig } from 'vite'
2
+ import vue from '@vitejs/plugin-vue'
3
+
4
+ // https://vite.dev/config/
5
+ export default defineConfig({
6
+ plugins: [vue()],
7
+ })