├── .github
└── workflows
│ └── deploy.yml
├── .gitignore
├── .vscode
└── extensions.json
├── LICENSE
├── README.md
├── index.js
├── package-lock.json
├── package.json
├── update_files.js
├── web
├── index.html
├── public
│ ├── favicon.ico
│ ├── opml.xml
│ └── rss.xml
├── src
│ ├── App.vue
│ ├── assets
│ │ ├── base.css
│ │ ├── data.json
│ │ ├── github.png
│ │ ├── logo.png
│ │ └── opml.json
│ ├── components
│ │ ├── BlogInfoCard.vue
│ │ └── SummaryCard.vue
│ └── main.js
└── vite.config.js
├── workers-site
├── .cargo-ok
├── .gitignore
├── index.js
├── package-lock.json
└── package.json
└── wrangler.toml
/.github/workflows/deploy.yml:
--------------------------------------------------------------------------------
1 | name: Deploy
2 | on:
3 | schedule:
4 | - cron: "0 4,16 * * *"
5 | workflow_dispatch:
6 | jobs:
7 | build:
8 | runs-on: ubuntu-latest
9 | strategy:
10 | matrix:
11 | node-version:
12 | - 23.x
13 | steps:
14 | - name: Checkout
15 | uses: actions/checkout@v4
16 | with:
17 | # 令 GitHub 在 git clone 和 git checkout 后「忘记」使用的 credentials。
18 | # 如果之后需要以另外的身份(如你的 GitHub Bot)执行 git push 操作时(如部署到 GitHub Pages),必须设置为 false。
19 | persist-credentials: false
20 | - name: Use Node.js ${{ matrix.node-version }}
21 | uses: actions/setup-node@v4
22 | with:
23 | node-version: ${{ matrix.node-version }}
24 | # 缓存 node_modules,缓存机制参见 GitHub 文档:https://help.github.com/en/actions/configuring-and-managing-workflows/caching-dependencies-to-speed-up-workflows
25 | - name: Cache node_modules
26 | uses: actions/cache@v4 # 使用 GitHub 官方的缓存 Action。
27 | env:
28 | cache-name: blogroll-node-modules
29 | with:
30 | path: node_modules
31 | key: ${{ runner.os }}-${{ matrix.node-version }}-${{ env.cache-name }}-${{ hashFiles('package-lock.json') }} # 使用 package-lock.json 的 Hash 作为缓存的 key。也可以使用 package.json 代替
32 | # Wrangler 在构建时会在 workers-site 目录下执行 npm i,因此也要缓存这里的 node_modules
33 | - name: Cache workers-site/node_modules
34 | uses: actions/cache@v4
35 | env:
36 | cache-name: workers-site-node-modules
37 | with:
38 | path: workers-site/node_modules
39 | key: ${{ runner.os }}-${{ matrix.node-version }}-${{ env.cache-name }}-${{ hashFiles('workers-site/package-lock.json') }}
40 | - run: npm i # 执行 Blogroll 的依赖安装
41 | - run: npm run update # 相当于 node update_files.js,从 Seatable 更新数据到 README.md
42 | env:
43 | SEATABLE_API_TOKEN: ${{ secrets.SEATABLE_API_TOKEN }}
44 | - name: Commit and push if README.md changed
45 | env:
46 | DEPLOY_REPO: git@github.com:nju-lug/blogroll.git
47 | DEPLOY_BRANCH: main
48 | SSH_PRIVATE_KEY: ${{ secrets.SSH_PRIVATE_KEY }}
49 | run: |
50 | if [ -n "$(git status --porcelain README.md)" ]; then
51 | git config --local user.email "github-actions[bot]@users.noreply.github.com"
52 | git config --local user.name "github-actions[bot]"
53 | git add README.md
54 | git commit -m "update README.md from github actions"
55 | mkdir -p ~/.ssh
56 | echo "$SSH_PRIVATE_KEY" > ~/.ssh/id_rsa
57 | chmod 600 ~/.ssh/id_rsa
58 | ssh-keyscan github.com >> ~/.ssh/known_hosts
59 | git push $DEPLOY_REPO HEAD:$DEPLOY_BRANCH
60 | else
61 | echo "No changes detected"
62 | fi
63 | - run: npm run gen # 相当于 node index.js,生成 opml.xml,opml.json 和 data.json
64 | - run: npm run build
65 | - name: Deploy to Cloudflare Workers
66 | uses: cloudflare/wrangler-action@v3
67 | with:
68 | apiToken: ${{ secrets.CF_WORKERS_TOKEN }} # 前一步设置的 Secrets 的名称
69 | # Wrangler Action 也支持使用传统的 Global API Token + Email 的鉴权方式,但不推荐
70 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
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 | .DS_Store
12 | dist
13 | dist-ssr
14 | coverage
15 | *.local
16 |
17 | /cypress/videos/
18 | /cypress/screenshots/
19 |
20 | # Editor directories and files
21 | .vscode/*
22 | !.vscode/extensions.json
23 | .idea
24 | *.suo
25 | *.ntvs*
26 | *.njsproj
27 | *.sln
28 | *.sw?
29 |
--------------------------------------------------------------------------------
/.vscode/extensions.json:
--------------------------------------------------------------------------------
1 | {
2 | "recommendations": ["johnsoncodehk.volar", "johnsoncodehk.vscode-typescript-vue-plugin"]
3 | }
4 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | MIT License
2 |
3 | Copyright (c) 2022 Nanjing University Linux Users Group
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE.
22 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # NJU-LUG Blogroll
2 |
3 | 南京大学 [Linux User Group](https://git.nju.edu.cn/nju-lug/lug-introduction) 收集的同学们的 Blog。
4 |
5 |
6 | ## 聚合页面
7 |
8 | [聚合页面](https://blogroll.njulug.org/) 自动聚合这个 `README.md` 文件的表格中的所有 RSS 源,并以用户友好的方式显示出来。
9 |
10 | 欢迎在线浏览:https://blogroll.njulug.org/
11 |
12 | 聚合页面使用 Vue 框架编写,每天定时 0 点和 12 点,会通过 GitHub Action 自动集成和部署到 Cloudflare 上。
13 |
14 | 聚合页面由 [@OrangeX4](https://github.com/OrangeX4) 和 [@Do1e](https://github.com/Do1e) 维护,如发现页面上有任何 Bug,欢迎在本 Repo 中提出 Issues。
15 |
16 |
17 | ## 聚合 RSS 订阅
18 |
19 | 我们也制作了一个聚合 RSS,欢迎来订阅:
20 |
21 | https://blogroll.njulug.org/rss.xml
22 |
23 | 使用该RSS订阅的Telegram频道:
24 |
25 | https://t.me/NJULUG_Blogroll
26 |
27 |
28 | ## FAQ
29 |
30 | > 萌新也可以加 Blog 列表么?
31 |
32 | 能。只要是南京大学的同学和校友都欢迎。
33 |
34 | > 有些 Blog 太久没更新或失效了,怎么办?
35 |
36 | 联系[@Do1e i@do1e.cn](mailto:i@do1e.cn)进行删除,同时我们也会通过 Github Action 的自动更新中的 Log 来判断是否失效。
37 |
38 |
39 | ## 添加/编辑方式
40 |
41 | 填写表单:[https://table.nju.edu.cn/dtable/forms/b7e232c1-b52b-43ad-8058-3400594cba5a/](https://table.nju.edu.cn/dtable/forms/b7e232c1-b52b-43ad-8058-3400594cba5a/)
42 |
43 | 编辑表单:[https://table.nju.edu.cn/dtable/collection-tables/36161685-5d74-4d48-928f-b6b40174da28](https://table.nju.edu.cn/dtable/collection-tables/36161685-5d74-4d48-928f-b6b40174da28)。如果是之前在README中填写的,可重新[填写表单](https://table.nju.edu.cn/dtable/forms/b7e232c1-b52b-43ad-8058-3400594cba5a/),保证`Name`字段一致即可。
44 |
45 | 如果无 RSS 源,可以使用 `---` 代替,聚合页面将不会抓取,仅展示HTML链接。
46 |
47 | ## Lists
48 |
49 | | Name | RSS | HTML |
50 | | -- | -- | -- |
51 | | OrangeX4's Blog | https://blog.orangex4.workers.dev/atom.xml | https://blog.orangex4.workers.dev/ |
52 | | Do1e | https://www.do1e.cn/feed | https://www.do1e.cn |
53 | | Idealclover's Blog | https://idealclover.top/feed | https://idealclover.top/ |
54 | | Cmj's Blog | https://blog.caomingjun.com/atom.xml | https://blog.caomingjun.com/ |
55 | | Mexii's Blog | https://blog.mexii.dev/atom.xml | https://blog.mexii.dev/ |
56 | | LadderOperator's Blog | https://ladderoperator.top/index.xml | https://ladderoperator.top |
57 | | Antares's Blog | https://chr.fan/feed | https://chr.fan |
58 | | lyc8503's Blog | https://blog.lyc8503.net/atom.xml | https://blog.lyc8503.net/ |
59 | | YeungYeah 的乱写地 | https://scottyeung.top/atom.xml | https://scottyeung.top/ |
60 | | yaoge123's Blog | https://www.yaoge123.com/blog/feed | https://www.yaoge123.com/ |
61 | | 南雍随笔 | https://ydjsir.com.cn/atom.xml | https://ydjsir.com.cn/ |
62 | | Kevinpro's Blog | --- | https://www.yuque.com/kevinpro |
63 | | Domon | https://www.domon.cn/rss/ | https://www.domon.cn |
64 | | 极东魔术昼寝结社 | https://blog.jaoushingan.com/atom.xml | https://blog.jaoushingan.com |
65 | | Chivalric Gong | --- | https://gmy-acoustics.github.io/ |
66 | | Persvadisto's Blog | https://persvadisto.github.io/atom.xml | https://persvadisto.github.io/ |
67 | | Yukino's Blog | https://02hyc.github.io/Blog/index.xml | https://02hyc.github.io/Blog/ |
68 | | The 0x26A1 Bay | https://igns.top/index.xml | https://igns.top/ |
69 | | jjl9807's blog | https://blog.jjl9807.com/feed/ | https://blog.jjl9807.com/ |
70 |
71 |
72 | ## OPML
73 |
74 | `opml.xml` 地址:https://blogroll.njulug.org/opml.xml
75 |
76 | 你可以使用 `opml.xml` 文件在 Inoreader 里持续订阅,或在 Feedly 下载之后导入。
77 |
78 | > OPML(英语:Outline Processor Markup Language)意为“大纲处理标记语言”,是一种基于 XML 上的文件保存格式。目前流行的应用方式为收集博客或播客的 RSS 来源,整理成单一可交换的 OPML 格式的订阅列表,让用户便于转移自己的订阅项目。
79 | >
80 | > -- Wikipedia
81 |
82 |
83 | ## See Also
84 |
85 | - https://github.com/tuna/blogroll
86 | - https://github.com/NUAA-Open-Source/BlogRoll
87 | - https://github.com/timqian/chinese-independent-blogs
88 |
--------------------------------------------------------------------------------
/index.js:
--------------------------------------------------------------------------------
1 | // 文件读取包
2 | const fs = require('fs');
3 | // 引入 RSS 解析第三方包
4 | const Parser = require('rss-parser');
5 | const parser = new Parser();
6 | // 引入 RSS 生成器
7 | const RSS = require('rss');
8 |
9 | // 相关配置
10 | const opmlXmlContentTitle = 'NJU-LUG Blogroll';
11 | const readmeMdPath = './README.md';
12 | const opmlJsonPath = './web/src/assets/opml.json';
13 | const dataJsonPath = './web/src/assets/data.json';
14 | const maxDataJsonItemsNumber = 40; // 保存前四十项
15 | const opmlXmlPath = './web/public/opml.xml';
16 | const rssXmlPath = './web/public/rss.xml';
17 | const opmlXmlContentOp = '\n \n ' + opmlXmlContentTitle + ' \n \n \n\n';
18 | const opmlXmlContentEd = '\n \n ';
19 |
20 | // 解析 README 中的表格,转为 JSON
21 | const pattern = /\| *([^\|]*) *\| *(http[^\|]*|---) *\| *(http[^\|]*|---) *\|/g;
22 | const readmeMdContent = fs.readFileSync(readmeMdPath, { encoding: 'utf-8' });
23 | // 生成 opml.json
24 | const opmlJson = [];
25 | let resultArray;
26 | while ((resultArray = pattern.exec(readmeMdContent)) !== null) {
27 | opmlJson.push({
28 | title: resultArray[1].trim(),
29 | xmlUrl: resultArray[2].trim(),
30 | htmlUrl: resultArray[3].trim()
31 | });
32 | }
33 | // 保存 opml.json 和 opml.xml
34 | fs.writeFileSync(opmlJsonPath, JSON.stringify(opmlJson, null, 2), { encoding: 'utf-8' });
35 | const opmlXmlContent = opmlXmlContentOp
36 | + opmlJson.map((lineJson) => ` \n`).join('')
37 | + opmlXmlContentEd;
38 | fs.writeFileSync(opmlXmlPath, opmlXmlContent, { encoding: 'utf-8' });
39 |
40 | // 异步处理
41 | (async () => {
42 |
43 | try {
44 | // 获取服务器 IP 地址
45 | const response = await fetch('https://ipapi.do1e.cn/get-ip');
46 | const ipData = await response.json();
47 | console.log(ipData);
48 | } catch (err) {
49 | console.log(err);
50 | }
51 |
52 | // 用于存储各项数据
53 | const dataJson = [];
54 |
55 | for (const lineJson of opmlJson) {
56 |
57 | try {
58 |
59 | // 读取 RSS 的具体内容
60 | if (!lineJson.xmlUrl.startsWith('http')) {
61 | continue;
62 | }
63 | const feed = await parser.parseURL(lineJson.xmlUrl);
64 |
65 | // 数组合并
66 | dataJson.push.apply(dataJson, feed.items.filter((item) => item.title && item.content && item.pubDate).map((item) => {
67 | const pubDate = new Date(item.pubDate);
68 | return {
69 | name: lineJson.title,
70 | xmlUrl: lineJson.xmlUrl,
71 | htmlUrl: lineJson.htmlUrl,
72 | title: item.title,
73 | link: item.link,
74 | summary: item.summary ? item.summary : item.content,
75 | pubDate: pubDate,
76 | pubDateYYMMDD: pubDate.toISOString().split('T')[0]
77 | }
78 | }));
79 |
80 | } catch (err) {
81 |
82 | // 网络超时,进行 Log 报告
83 | console.log(err);
84 | console.log("-------------------------");
85 | console.log("xmlUrl: " + lineJson.xmlUrl);
86 | console.log("-------------------------");
87 |
88 | }
89 | }
90 |
91 | // 按时间顺序排序
92 | dataJson.sort((itemA, itemB) => itemA.pubDate < itemB.pubDate ? 1 : -1);
93 | // 默认为保存前 n 项的数据, 并保证不超过当前时间
94 | const curDate = new Date();
95 | const dataJsonSliced = dataJson.filter((item) => item.pubDate <= curDate).slice(0, Math.min(maxDataJsonItemsNumber, dataJson.length));
96 | fs.writeFileSync(dataJsonPath, JSON.stringify(dataJsonSliced, null, 2), { encoding: 'utf-8' });
97 |
98 | // 生成 RSS 文件
99 | var feed = new RSS({
100 | title: 'NJU-LUG Blogroll',
101 | description: '南京大学 Linux User Group 收集同学和校友们的 Blog',
102 | feed_url: 'https://blogroll.njulug.org/rss.xml',
103 | site_url: 'https://blogroll.njulug.org/',
104 | image_url: 'https://blogroll.njulug.org/assets/logo.56c0d74c.png',
105 | docs: 'https://blogroll.njulug.org/',
106 | managingEditor: 'NJU-LUG',
107 | webMaster: 'NJU-LUG',
108 | copyright: '2022 NJU-LUG',
109 | language: 'cn',
110 | pubDate: dataJson[0].pubDate,
111 | ttl: '60',
112 | });
113 |
114 | for (let item of dataJsonSliced) {
115 | feed.item({
116 | title: item.title,
117 | description: item.summary,
118 | url: item.link, // link to the item
119 | author: item.name, // optional - defaults to feed author property
120 | date: item.pubDate.toISOString(), // any format that js Date can parse.
121 | });
122 | }
123 |
124 | // 保存 rss.xml 文件
125 | const rssXmlContent = feed.xml();
126 | fs.writeFileSync(rssXmlPath, rssXmlContent, { encoding: 'utf-8' });
127 |
128 | })();
129 |
--------------------------------------------------------------------------------
/package-lock.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "blogroll",
3 | "version": "2.0.0",
4 | "lockfileVersion": 2,
5 | "requires": true,
6 | "packages": {
7 | "": {
8 | "name": "blogroll",
9 | "version": "2.0.0",
10 | "dependencies": {
11 | "rss": "^1.2.2",
12 | "rss-parser": "^3.12.0",
13 | "seatable-api": "^1.0.42",
14 | "vue": "^3.2.29"
15 | },
16 | "devDependencies": {
17 | "@vitejs/plugin-vue": "^2.1.0",
18 | "vite": "^2.7.13"
19 | }
20 | },
21 | "node_modules/@babel/parser": {
22 | "version": "7.17.0",
23 | "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.17.0.tgz",
24 | "integrity": "sha512-VKXSCQx5D8S04ej+Dqsr1CzYvvWgf20jIw2D+YhQCrIlr2UZGaDds23Y0xg75/skOxpLCRpUZvk/1EAVkGoDOw==",
25 | "bin": {
26 | "parser": "bin/babel-parser.js"
27 | },
28 | "engines": {
29 | "node": ">=6.0.0"
30 | }
31 | },
32 | "node_modules/@babel/runtime": {
33 | "version": "7.20.13",
34 | "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.20.13.tgz",
35 | "integrity": "sha512-gt3PKXs0DBoL9xCvOIIZ2NEqAGZqHjAnmVbfQtB620V0uReIQutpel14KcneZuer7UioY8ALKZ7iocavvzTNFA==",
36 | "dependencies": {
37 | "regenerator-runtime": "^0.13.11"
38 | },
39 | "engines": {
40 | "node": ">=6.9.0"
41 | }
42 | },
43 | "node_modules/@vitejs/plugin-vue": {
44 | "version": "2.2.0",
45 | "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-2.2.0.tgz",
46 | "integrity": "sha512-wXigM1EwN2G7rZcwG6kLk9ivvIMhx2363tCEvMBiXcTu5nePM/12hUPVzPb83Uugt6U+zom1gTpJopi/Ow/jwg==",
47 | "dev": true,
48 | "engines": {
49 | "node": ">=12.0.0"
50 | },
51 | "peerDependencies": {
52 | "vite": "^2.5.10",
53 | "vue": "^3.2.25"
54 | }
55 | },
56 | "node_modules/@vue/compiler-core": {
57 | "version": "3.2.31",
58 | "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.2.31.tgz",
59 | "integrity": "sha512-aKno00qoA4o+V/kR6i/pE+aP+esng5siNAVQ422TkBNM6qA4veXiZbSe8OTXHXquEi/f6Akc+nLfB4JGfe4/WQ==",
60 | "dependencies": {
61 | "@babel/parser": "^7.16.4",
62 | "@vue/shared": "3.2.31",
63 | "estree-walker": "^2.0.2",
64 | "source-map": "^0.6.1"
65 | }
66 | },
67 | "node_modules/@vue/compiler-dom": {
68 | "version": "3.2.31",
69 | "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.2.31.tgz",
70 | "integrity": "sha512-60zIlFfzIDf3u91cqfqy9KhCKIJgPeqxgveH2L+87RcGU/alT6BRrk5JtUso0OibH3O7NXuNOQ0cDc9beT0wrg==",
71 | "dependencies": {
72 | "@vue/compiler-core": "3.2.31",
73 | "@vue/shared": "3.2.31"
74 | }
75 | },
76 | "node_modules/@vue/compiler-sfc": {
77 | "version": "3.2.31",
78 | "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.2.31.tgz",
79 | "integrity": "sha512-748adc9msSPGzXgibHiO6T7RWgfnDcVQD+VVwYgSsyyY8Ans64tALHZANrKtOzvkwznV/F4H7OAod/jIlp/dkQ==",
80 | "dependencies": {
81 | "@babel/parser": "^7.16.4",
82 | "@vue/compiler-core": "3.2.31",
83 | "@vue/compiler-dom": "3.2.31",
84 | "@vue/compiler-ssr": "3.2.31",
85 | "@vue/reactivity-transform": "3.2.31",
86 | "@vue/shared": "3.2.31",
87 | "estree-walker": "^2.0.2",
88 | "magic-string": "^0.25.7",
89 | "postcss": "^8.1.10",
90 | "source-map": "^0.6.1"
91 | }
92 | },
93 | "node_modules/@vue/compiler-ssr": {
94 | "version": "3.2.31",
95 | "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.2.31.tgz",
96 | "integrity": "sha512-mjN0rqig+A8TVDnsGPYJM5dpbjlXeHUm2oZHZwGyMYiGT/F4fhJf/cXy8QpjnLQK4Y9Et4GWzHn9PS8AHUnSkw==",
97 | "dependencies": {
98 | "@vue/compiler-dom": "3.2.31",
99 | "@vue/shared": "3.2.31"
100 | }
101 | },
102 | "node_modules/@vue/reactivity": {
103 | "version": "3.2.31",
104 | "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.2.31.tgz",
105 | "integrity": "sha512-HVr0l211gbhpEKYr2hYe7hRsV91uIVGFYNHj73njbARVGHQvIojkImKMaZNDdoDZOIkMsBc9a1sMqR+WZwfSCw==",
106 | "dependencies": {
107 | "@vue/shared": "3.2.31"
108 | }
109 | },
110 | "node_modules/@vue/reactivity-transform": {
111 | "version": "3.2.31",
112 | "resolved": "https://registry.npmjs.org/@vue/reactivity-transform/-/reactivity-transform-3.2.31.tgz",
113 | "integrity": "sha512-uS4l4z/W7wXdI+Va5pgVxBJ345wyGFKvpPYtdSgvfJfX/x2Ymm6ophQlXXB6acqGHtXuBqNyyO3zVp9b1r0MOA==",
114 | "dependencies": {
115 | "@babel/parser": "^7.16.4",
116 | "@vue/compiler-core": "3.2.31",
117 | "@vue/shared": "3.2.31",
118 | "estree-walker": "^2.0.2",
119 | "magic-string": "^0.25.7"
120 | }
121 | },
122 | "node_modules/@vue/runtime-core": {
123 | "version": "3.2.31",
124 | "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.2.31.tgz",
125 | "integrity": "sha512-Kcog5XmSY7VHFEMuk4+Gap8gUssYMZ2+w+cmGI6OpZWYOEIcbE0TPzzPHi+8XTzAgx1w/ZxDFcXhZeXN5eKWsA==",
126 | "dependencies": {
127 | "@vue/reactivity": "3.2.31",
128 | "@vue/shared": "3.2.31"
129 | }
130 | },
131 | "node_modules/@vue/runtime-dom": {
132 | "version": "3.2.31",
133 | "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.2.31.tgz",
134 | "integrity": "sha512-N+o0sICVLScUjfLG7u9u5XCjvmsexAiPt17GNnaWHJUfsKed5e85/A3SWgKxzlxx2SW/Hw7RQxzxbXez9PtY3g==",
135 | "dependencies": {
136 | "@vue/runtime-core": "3.2.31",
137 | "@vue/shared": "3.2.31",
138 | "csstype": "^2.6.8"
139 | }
140 | },
141 | "node_modules/@vue/server-renderer": {
142 | "version": "3.2.31",
143 | "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.2.31.tgz",
144 | "integrity": "sha512-8CN3Zj2HyR2LQQBHZ61HexF5NReqngLT3oahyiVRfSSvak+oAvVmu8iNLSu6XR77Ili2AOpnAt1y8ywjjqtmkg==",
145 | "dependencies": {
146 | "@vue/compiler-ssr": "3.2.31",
147 | "@vue/shared": "3.2.31"
148 | },
149 | "peerDependencies": {
150 | "vue": "3.2.31"
151 | }
152 | },
153 | "node_modules/@vue/shared": {
154 | "version": "3.2.31",
155 | "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.2.31.tgz",
156 | "integrity": "sha512-ymN2pj6zEjiKJZbrf98UM2pfDd6F2H7ksKw7NDt/ZZ1fh5Ei39X5tABugtT03ZRlWd9imccoK0hE8hpjpU7irQ=="
157 | },
158 | "node_modules/asynckit": {
159 | "version": "0.4.0",
160 | "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
161 | "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q=="
162 | },
163 | "node_modules/axios": {
164 | "version": "1.7.9",
165 | "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.9.tgz",
166 | "integrity": "sha512-LhLcE7Hbiryz8oMDdDptSrWowmB4Bl6RCt6sIJKpRB4XtVf0iEgewX3au/pJqm+Py1kCASkb/FFKjxQaLtxJvw==",
167 | "dependencies": {
168 | "follow-redirects": "^1.15.6",
169 | "form-data": "^4.0.0",
170 | "proxy-from-env": "^1.1.0"
171 | }
172 | },
173 | "node_modules/combined-stream": {
174 | "version": "1.0.8",
175 | "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
176 | "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
177 | "dependencies": {
178 | "delayed-stream": "~1.0.0"
179 | },
180 | "engines": {
181 | "node": ">= 0.8"
182 | }
183 | },
184 | "node_modules/csstype": {
185 | "version": "2.6.19",
186 | "resolved": "https://registry.npmjs.org/csstype/-/csstype-2.6.19.tgz",
187 | "integrity": "sha512-ZVxXaNy28/k3kJg0Fou5MiYpp88j7H9hLZp8PDC3jV0WFjfH5E9xHb56L0W59cPbKbcHXeP4qyT8PrHp8t6LcQ=="
188 | },
189 | "node_modules/dayjs": {
190 | "version": "1.10.7",
191 | "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.10.7.tgz",
192 | "integrity": "sha512-P6twpd70BcPK34K26uJ1KT3wlhpuOAPoMwJzpsIWUxHZ7wpmbdZL/hQqBDfz7hGurYSa5PhzdhDHtt319hL3ig=="
193 | },
194 | "node_modules/delayed-stream": {
195 | "version": "1.0.0",
196 | "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
197 | "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==",
198 | "engines": {
199 | "node": ">=0.4.0"
200 | }
201 | },
202 | "node_modules/entities": {
203 | "version": "2.2.0",
204 | "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz",
205 | "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==",
206 | "funding": {
207 | "url": "https://github.com/fb55/entities?sponsor=1"
208 | }
209 | },
210 | "node_modules/esbuild": {
211 | "version": "0.14.21",
212 | "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.14.21.tgz",
213 | "integrity": "sha512-7WEoNMBJdLN993dr9h0CpFHPRc3yFZD+EAVY9lg6syJJ12gc5fHq8d75QRExuhnMkT2DaRiIKFThRvDWP+fO+A==",
214 | "dev": true,
215 | "hasInstallScript": true,
216 | "bin": {
217 | "esbuild": "bin/esbuild"
218 | },
219 | "engines": {
220 | "node": ">=12"
221 | },
222 | "optionalDependencies": {
223 | "esbuild-android-arm64": "0.14.21",
224 | "esbuild-darwin-64": "0.14.21",
225 | "esbuild-darwin-arm64": "0.14.21",
226 | "esbuild-freebsd-64": "0.14.21",
227 | "esbuild-freebsd-arm64": "0.14.21",
228 | "esbuild-linux-32": "0.14.21",
229 | "esbuild-linux-64": "0.14.21",
230 | "esbuild-linux-arm": "0.14.21",
231 | "esbuild-linux-arm64": "0.14.21",
232 | "esbuild-linux-mips64le": "0.14.21",
233 | "esbuild-linux-ppc64le": "0.14.21",
234 | "esbuild-linux-riscv64": "0.14.21",
235 | "esbuild-linux-s390x": "0.14.21",
236 | "esbuild-netbsd-64": "0.14.21",
237 | "esbuild-openbsd-64": "0.14.21",
238 | "esbuild-sunos-64": "0.14.21",
239 | "esbuild-windows-32": "0.14.21",
240 | "esbuild-windows-64": "0.14.21",
241 | "esbuild-windows-arm64": "0.14.21"
242 | }
243 | },
244 | "node_modules/esbuild-android-arm64": {
245 | "version": "0.14.21",
246 | "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.14.21.tgz",
247 | "integrity": "sha512-Bqgld1TY0wZv8TqiQmVxQFgYzz8ZmyzT7clXBDZFkOOdRybzsnj8AZuK1pwcLVA7Ya6XncHgJqIao7NFd3s0RQ==",
248 | "cpu": [
249 | "arm64"
250 | ],
251 | "dev": true,
252 | "optional": true,
253 | "os": [
254 | "android"
255 | ],
256 | "engines": {
257 | "node": ">=12"
258 | }
259 | },
260 | "node_modules/esbuild-darwin-64": {
261 | "version": "0.14.21",
262 | "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.14.21.tgz",
263 | "integrity": "sha512-j+Eg+e13djzyYINVvAbOo2/zvZ2DivuJJTaBrJnJHSD7kUNuGHRkHoSfFjbI80KHkn091w350wdmXDNSgRjfYQ==",
264 | "cpu": [
265 | "x64"
266 | ],
267 | "dev": true,
268 | "optional": true,
269 | "os": [
270 | "darwin"
271 | ],
272 | "engines": {
273 | "node": ">=12"
274 | }
275 | },
276 | "node_modules/esbuild-darwin-arm64": {
277 | "version": "0.14.21",
278 | "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.14.21.tgz",
279 | "integrity": "sha512-nDNTKWDPI0RuoPj5BhcSB2z5EmZJJAyRtZLIjyXSqSpAyoB8eyAKXl4lB8U2P78Fnh4Lh1le/fmpewXE04JhBQ==",
280 | "cpu": [
281 | "arm64"
282 | ],
283 | "dev": true,
284 | "optional": true,
285 | "os": [
286 | "darwin"
287 | ],
288 | "engines": {
289 | "node": ">=12"
290 | }
291 | },
292 | "node_modules/esbuild-freebsd-64": {
293 | "version": "0.14.21",
294 | "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.14.21.tgz",
295 | "integrity": "sha512-zIurkCHXhxELiDZtLGiexi8t8onQc2LtuE+S7457H/pP0g0MLRKMrsn/IN4LDkNe6lvBjuoZZi2OfelOHn831g==",
296 | "cpu": [
297 | "x64"
298 | ],
299 | "dev": true,
300 | "optional": true,
301 | "os": [
302 | "freebsd"
303 | ],
304 | "engines": {
305 | "node": ">=12"
306 | }
307 | },
308 | "node_modules/esbuild-freebsd-arm64": {
309 | "version": "0.14.21",
310 | "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.14.21.tgz",
311 | "integrity": "sha512-wdxMmkJfbwcN+q85MpeUEamVZ40FNsBa9mPq8tAszDn8TRT2HoJvVRADPIIBa9SWWwlDChIMjkDKAnS3KS/sPA==",
312 | "cpu": [
313 | "arm64"
314 | ],
315 | "dev": true,
316 | "optional": true,
317 | "os": [
318 | "freebsd"
319 | ],
320 | "engines": {
321 | "node": ">=12"
322 | }
323 | },
324 | "node_modules/esbuild-linux-32": {
325 | "version": "0.14.21",
326 | "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.14.21.tgz",
327 | "integrity": "sha512-fmxvyzOPPh2xiEHojpCeIQP6pXcoKsWbz3ryDDIKLOsk4xp3GbpHIEAWP0xTeuhEbendmvBDVKbAVv3PnODXLg==",
328 | "cpu": [
329 | "ia32"
330 | ],
331 | "dev": true,
332 | "optional": true,
333 | "os": [
334 | "linux"
335 | ],
336 | "engines": {
337 | "node": ">=12"
338 | }
339 | },
340 | "node_modules/esbuild-linux-64": {
341 | "version": "0.14.21",
342 | "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.14.21.tgz",
343 | "integrity": "sha512-edZyNOv1ql+kpmlzdqzzDjRQYls+tSyi4QFi+PdBhATJFUqHsnNELWA9vMSzAaInPOEaVUTA5Ml28XFChcy4DA==",
344 | "cpu": [
345 | "x64"
346 | ],
347 | "dev": true,
348 | "optional": true,
349 | "os": [
350 | "linux"
351 | ],
352 | "engines": {
353 | "node": ">=12"
354 | }
355 | },
356 | "node_modules/esbuild-linux-arm": {
357 | "version": "0.14.21",
358 | "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.14.21.tgz",
359 | "integrity": "sha512-aSU5pUueK6afqmLQsbU+QcFBT62L+4G9hHMJDHWfxgid6hzhSmfRH9U/f+ymvxsSTr/HFRU4y7ox8ZyhlVl98w==",
360 | "cpu": [
361 | "arm"
362 | ],
363 | "dev": true,
364 | "optional": true,
365 | "os": [
366 | "linux"
367 | ],
368 | "engines": {
369 | "node": ">=12"
370 | }
371 | },
372 | "node_modules/esbuild-linux-arm64": {
373 | "version": "0.14.21",
374 | "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.14.21.tgz",
375 | "integrity": "sha512-t5qxRkq4zdQC0zXpzSB2bTtfLgOvR0C6BXYaRE/6/k8/4SrkZcTZBeNu+xGvwCU4b5dU9ST9pwIWkK6T1grS8g==",
376 | "cpu": [
377 | "arm64"
378 | ],
379 | "dev": true,
380 | "optional": true,
381 | "os": [
382 | "linux"
383 | ],
384 | "engines": {
385 | "node": ">=12"
386 | }
387 | },
388 | "node_modules/esbuild-linux-mips64le": {
389 | "version": "0.14.21",
390 | "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.14.21.tgz",
391 | "integrity": "sha512-jLZLQGCNlUsmIHtGqNvBs3zN+7a4D9ckf0JZ+jQTwHdZJ1SgV9mAjbB980OFo66LoY+WeM7t3WEnq3FjI1zw4A==",
392 | "cpu": [
393 | "mips64el"
394 | ],
395 | "dev": true,
396 | "optional": true,
397 | "os": [
398 | "linux"
399 | ],
400 | "engines": {
401 | "node": ">=12"
402 | }
403 | },
404 | "node_modules/esbuild-linux-ppc64le": {
405 | "version": "0.14.21",
406 | "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.14.21.tgz",
407 | "integrity": "sha512-4TWxpK391en2UBUw6GSrukToTDu6lL9vkm3Ll40HrI08WG3qcnJu7bl8e1+GzelDsiw1QmfAY/nNvJ6iaHRpCQ==",
408 | "cpu": [
409 | "ppc64"
410 | ],
411 | "dev": true,
412 | "optional": true,
413 | "os": [
414 | "linux"
415 | ],
416 | "engines": {
417 | "node": ">=12"
418 | }
419 | },
420 | "node_modules/esbuild-linux-riscv64": {
421 | "version": "0.14.21",
422 | "resolved": "https://registry.npmjs.org/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.14.21.tgz",
423 | "integrity": "sha512-fElngqOaOfTsF+u+oetDLHsPG74vB2ZaGZUqmGefAJn3a5z9Z2pNa4WpVbbKgHpaAAy5tWM1m1sbGohj6Ki6+Q==",
424 | "cpu": [
425 | "riscv64"
426 | ],
427 | "dev": true,
428 | "optional": true,
429 | "os": [
430 | "linux"
431 | ],
432 | "engines": {
433 | "node": ">=12"
434 | }
435 | },
436 | "node_modules/esbuild-linux-s390x": {
437 | "version": "0.14.21",
438 | "resolved": "https://registry.npmjs.org/esbuild-linux-s390x/-/esbuild-linux-s390x-0.14.21.tgz",
439 | "integrity": "sha512-brleZ6R5fYv0qQ7ZBwenQmP6i9TdvJCB092c/3D3pTLQHBGHJb5zWgKxOeS7bdHzmLy6a6W7GbFk6QKpjyD6QA==",
440 | "cpu": [
441 | "s390x"
442 | ],
443 | "dev": true,
444 | "optional": true,
445 | "os": [
446 | "linux"
447 | ],
448 | "engines": {
449 | "node": ">=12"
450 | }
451 | },
452 | "node_modules/esbuild-netbsd-64": {
453 | "version": "0.14.21",
454 | "resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.14.21.tgz",
455 | "integrity": "sha512-nCEgsLCQ8RoFWVV8pVI+kX66ICwbPP/M9vEa0NJGIEB/Vs5sVGMqkf67oln90XNSkbc0bPBDuo4G6FxlF7PN8g==",
456 | "cpu": [
457 | "x64"
458 | ],
459 | "dev": true,
460 | "optional": true,
461 | "os": [
462 | "netbsd"
463 | ],
464 | "engines": {
465 | "node": ">=12"
466 | }
467 | },
468 | "node_modules/esbuild-openbsd-64": {
469 | "version": "0.14.21",
470 | "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.14.21.tgz",
471 | "integrity": "sha512-h9zLMyVD0T73MDTVYIb/qUTokwI6EJH9O6wESuTNq6+XpMSr6C5aYZ4fvFKdNELW+Xsod+yDS2hV2JTUAbFrLA==",
472 | "cpu": [
473 | "x64"
474 | ],
475 | "dev": true,
476 | "optional": true,
477 | "os": [
478 | "openbsd"
479 | ],
480 | "engines": {
481 | "node": ">=12"
482 | }
483 | },
484 | "node_modules/esbuild-sunos-64": {
485 | "version": "0.14.21",
486 | "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.14.21.tgz",
487 | "integrity": "sha512-Kl+7Cot32qd9oqpLdB1tEGXEkjBlijrIxMJ0+vlDFaqsODutif25on0IZlFxEBtL2Gosd4p5WCV1U7UskNQfXA==",
488 | "cpu": [
489 | "x64"
490 | ],
491 | "dev": true,
492 | "optional": true,
493 | "os": [
494 | "sunos"
495 | ],
496 | "engines": {
497 | "node": ">=12"
498 | }
499 | },
500 | "node_modules/esbuild-windows-32": {
501 | "version": "0.14.21",
502 | "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.14.21.tgz",
503 | "integrity": "sha512-V7vnTq67xPBUCk/9UtlolmQ798Ecjdr1ZoI1vcSgw7M82aSSt0eZdP6bh5KAFZU8pxDcx3qoHyWQfHYr11f22A==",
504 | "cpu": [
505 | "ia32"
506 | ],
507 | "dev": true,
508 | "optional": true,
509 | "os": [
510 | "win32"
511 | ],
512 | "engines": {
513 | "node": ">=12"
514 | }
515 | },
516 | "node_modules/esbuild-windows-64": {
517 | "version": "0.14.21",
518 | "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.14.21.tgz",
519 | "integrity": "sha512-kDgHjKOHwjfJDCyRGELzVxiP/RBJBTA+wyspf78MTTJQkyPuxH2vChReNdWc+dU2S4gIZFHMdP1Qrl/k22ZmaA==",
520 | "cpu": [
521 | "x64"
522 | ],
523 | "dev": true,
524 | "optional": true,
525 | "os": [
526 | "win32"
527 | ],
528 | "engines": {
529 | "node": ">=12"
530 | }
531 | },
532 | "node_modules/esbuild-windows-arm64": {
533 | "version": "0.14.21",
534 | "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.14.21.tgz",
535 | "integrity": "sha512-8Sbo0zpzgwWrwjQYLmHF78f7E2xg5Ve63bjB2ng3V2aManilnnTGaliq2snYg+NOX60+hEvJHRdVnuIAHW0lVw==",
536 | "cpu": [
537 | "arm64"
538 | ],
539 | "dev": true,
540 | "optional": true,
541 | "os": [
542 | "win32"
543 | ],
544 | "engines": {
545 | "node": ">=12"
546 | }
547 | },
548 | "node_modules/estree-walker": {
549 | "version": "2.0.2",
550 | "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz",
551 | "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w=="
552 | },
553 | "node_modules/follow-redirects": {
554 | "version": "1.15.9",
555 | "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz",
556 | "integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==",
557 | "funding": [
558 | {
559 | "type": "individual",
560 | "url": "https://github.com/sponsors/RubenVerborgh"
561 | }
562 | ],
563 | "engines": {
564 | "node": ">=4.0"
565 | },
566 | "peerDependenciesMeta": {
567 | "debug": {
568 | "optional": true
569 | }
570 | }
571 | },
572 | "node_modules/form-data": {
573 | "version": "4.0.1",
574 | "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.1.tgz",
575 | "integrity": "sha512-tzN8e4TX8+kkxGPK8D5u0FNmjPUjw3lwC9lSLxxoB/+GtsJG91CO8bSWy73APlgAZzZbXEYZJuxjkHH2w+Ezhw==",
576 | "dependencies": {
577 | "asynckit": "^0.4.0",
578 | "combined-stream": "^1.0.8",
579 | "mime-types": "^2.1.12"
580 | },
581 | "engines": {
582 | "node": ">= 6"
583 | }
584 | },
585 | "node_modules/fsevents": {
586 | "version": "2.3.2",
587 | "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz",
588 | "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==",
589 | "dev": true,
590 | "hasInstallScript": true,
591 | "optional": true,
592 | "os": [
593 | "darwin"
594 | ],
595 | "engines": {
596 | "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
597 | }
598 | },
599 | "node_modules/function-bind": {
600 | "version": "1.1.1",
601 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
602 | "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==",
603 | "dev": true
604 | },
605 | "node_modules/has": {
606 | "version": "1.0.3",
607 | "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
608 | "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
609 | "dev": true,
610 | "dependencies": {
611 | "function-bind": "^1.1.1"
612 | },
613 | "engines": {
614 | "node": ">= 0.4.0"
615 | }
616 | },
617 | "node_modules/is-core-module": {
618 | "version": "2.8.1",
619 | "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.1.tgz",
620 | "integrity": "sha512-SdNCUs284hr40hFTFP6l0IfZ/RSrMXF3qgoRHd3/79unUTvrFO/JoXwkGm+5J/Oe3E/b5GsnG330uUNgRpu1PA==",
621 | "dev": true,
622 | "dependencies": {
623 | "has": "^1.0.3"
624 | },
625 | "funding": {
626 | "url": "https://github.com/sponsors/ljharb"
627 | }
628 | },
629 | "node_modules/magic-string": {
630 | "version": "0.25.7",
631 | "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.7.tgz",
632 | "integrity": "sha512-4CrMT5DOHTDk4HYDlzmwu4FVCcIYI8gauveasrdCu2IKIFOJ3f0v/8MDGJCDL9oD2ppz/Av1b0Nj345H9M+XIA==",
633 | "dependencies": {
634 | "sourcemap-codec": "^1.4.4"
635 | }
636 | },
637 | "node_modules/mime-db": {
638 | "version": "1.25.0",
639 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.25.0.tgz",
640 | "integrity": "sha1-wY29fHOl2/b0SgJNwNFloeexw5I=",
641 | "engines": {
642 | "node": ">= 0.6"
643 | }
644 | },
645 | "node_modules/mime-types": {
646 | "version": "2.1.13",
647 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.13.tgz",
648 | "integrity": "sha1-4HqqnGxrmnyjASxpADrSWjnpKog=",
649 | "dependencies": {
650 | "mime-db": "~1.25.0"
651 | },
652 | "engines": {
653 | "node": ">= 0.6"
654 | }
655 | },
656 | "node_modules/nanoid": {
657 | "version": "3.2.0",
658 | "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.2.0.tgz",
659 | "integrity": "sha512-fmsZYa9lpn69Ad5eDn7FMcnnSR+8R34W9qJEijxYhTbfOWzr22n1QxCMzXLK+ODyW2973V3Fux959iQoUxzUIA==",
660 | "bin": {
661 | "nanoid": "bin/nanoid.cjs"
662 | },
663 | "engines": {
664 | "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
665 | }
666 | },
667 | "node_modules/path-parse": {
668 | "version": "1.0.7",
669 | "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
670 | "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==",
671 | "dev": true
672 | },
673 | "node_modules/picocolors": {
674 | "version": "1.0.0",
675 | "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz",
676 | "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ=="
677 | },
678 | "node_modules/postcss": {
679 | "version": "8.4.6",
680 | "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.6.tgz",
681 | "integrity": "sha512-OovjwIzs9Te46vlEx7+uXB0PLijpwjXGKXjVGGPIGubGpq7uh5Xgf6D6FiJ/SzJMBosHDp6a2hiXOS97iBXcaA==",
682 | "dependencies": {
683 | "nanoid": "^3.2.0",
684 | "picocolors": "^1.0.0",
685 | "source-map-js": "^1.0.2"
686 | },
687 | "engines": {
688 | "node": "^10 || ^12 || >=14"
689 | },
690 | "funding": {
691 | "type": "opencollective",
692 | "url": "https://opencollective.com/postcss/"
693 | }
694 | },
695 | "node_modules/proxy-from-env": {
696 | "version": "1.1.0",
697 | "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz",
698 | "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg=="
699 | },
700 | "node_modules/regenerator-runtime": {
701 | "version": "0.13.11",
702 | "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz",
703 | "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg=="
704 | },
705 | "node_modules/resolve": {
706 | "version": "1.22.0",
707 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.0.tgz",
708 | "integrity": "sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw==",
709 | "dev": true,
710 | "dependencies": {
711 | "is-core-module": "^2.8.1",
712 | "path-parse": "^1.0.7",
713 | "supports-preserve-symlinks-flag": "^1.0.0"
714 | },
715 | "bin": {
716 | "resolve": "bin/resolve"
717 | },
718 | "funding": {
719 | "url": "https://github.com/sponsors/ljharb"
720 | }
721 | },
722 | "node_modules/rollup": {
723 | "version": "2.67.2",
724 | "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.67.2.tgz",
725 | "integrity": "sha512-hoEiBWwZtf1QdK3jZIq59L0FJj4Fiv4RplCO4pvCRC86qsoFurWB4hKQIjoRf3WvJmk5UZ9b0y5ton+62fC7Tw==",
726 | "dev": true,
727 | "bin": {
728 | "rollup": "dist/bin/rollup"
729 | },
730 | "engines": {
731 | "node": ">=10.0.0"
732 | },
733 | "optionalDependencies": {
734 | "fsevents": "~2.3.2"
735 | }
736 | },
737 | "node_modules/rss": {
738 | "version": "1.2.2",
739 | "resolved": "https://registry.npmjs.org/rss/-/rss-1.2.2.tgz",
740 | "integrity": "sha1-UKFpiHYTgTOnT5oF0r3I240nqSE=",
741 | "dependencies": {
742 | "mime-types": "2.1.13",
743 | "xml": "1.0.1"
744 | }
745 | },
746 | "node_modules/rss-parser": {
747 | "version": "3.12.0",
748 | "resolved": "https://registry.npmjs.org/rss-parser/-/rss-parser-3.12.0.tgz",
749 | "integrity": "sha512-aqD3E8iavcCdkhVxNDIdg1nkBI17jgqF+9OqPS1orwNaOgySdpvq6B+DoONLhzjzwV8mWg37sb60e4bmLK117A==",
750 | "dependencies": {
751 | "entities": "^2.0.3",
752 | "xml2js": "^0.4.19"
753 | }
754 | },
755 | "node_modules/sax": {
756 | "version": "1.2.4",
757 | "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz",
758 | "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw=="
759 | },
760 | "node_modules/seatable-api": {
761 | "version": "1.0.42",
762 | "resolved": "https://registry.npmjs.org/seatable-api/-/seatable-api-1.0.42.tgz",
763 | "integrity": "sha512-zooM+8AbYywvhoaeo4D4SmzTddBcfeCQH8wUFF0/M+1mCDupmavozpjwKL0/+A6saeUvV7/yvFc5wFP7UKv1eQ==",
764 | "dependencies": {
765 | "@babel/runtime": "7.20.13",
766 | "axios": "~1.7.*",
767 | "dayjs": "1.10.7"
768 | }
769 | },
770 | "node_modules/source-map": {
771 | "version": "0.6.1",
772 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
773 | "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
774 | "engines": {
775 | "node": ">=0.10.0"
776 | }
777 | },
778 | "node_modules/source-map-js": {
779 | "version": "1.0.2",
780 | "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz",
781 | "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==",
782 | "engines": {
783 | "node": ">=0.10.0"
784 | }
785 | },
786 | "node_modules/sourcemap-codec": {
787 | "version": "1.4.8",
788 | "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz",
789 | "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA=="
790 | },
791 | "node_modules/supports-preserve-symlinks-flag": {
792 | "version": "1.0.0",
793 | "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz",
794 | "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==",
795 | "dev": true,
796 | "engines": {
797 | "node": ">= 0.4"
798 | },
799 | "funding": {
800 | "url": "https://github.com/sponsors/ljharb"
801 | }
802 | },
803 | "node_modules/vite": {
804 | "version": "2.8.1",
805 | "resolved": "https://registry.npmjs.org/vite/-/vite-2.8.1.tgz",
806 | "integrity": "sha512-Typ8qjUnW0p53gBsJpisrKcZlEbUPZATja9BG6Z09QZjg9YrnEn/htkr/VH4WhnH7eNUQeSD+wKI1lHzQRWskw==",
807 | "dev": true,
808 | "dependencies": {
809 | "esbuild": "^0.14.14",
810 | "postcss": "^8.4.6",
811 | "resolve": "^1.22.0",
812 | "rollup": "^2.59.0"
813 | },
814 | "bin": {
815 | "vite": "bin/vite.js"
816 | },
817 | "engines": {
818 | "node": ">=12.2.0"
819 | },
820 | "optionalDependencies": {
821 | "fsevents": "~2.3.2"
822 | },
823 | "peerDependencies": {
824 | "less": "*",
825 | "sass": "*",
826 | "stylus": "*"
827 | },
828 | "peerDependenciesMeta": {
829 | "less": {
830 | "optional": true
831 | },
832 | "sass": {
833 | "optional": true
834 | },
835 | "stylus": {
836 | "optional": true
837 | }
838 | }
839 | },
840 | "node_modules/vue": {
841 | "version": "3.2.31",
842 | "resolved": "https://registry.npmjs.org/vue/-/vue-3.2.31.tgz",
843 | "integrity": "sha512-odT3W2tcffTiQCy57nOT93INw1auq5lYLLYtWpPYQQYQOOdHiqFct9Xhna6GJ+pJQaF67yZABraH47oywkJgFw==",
844 | "dependencies": {
845 | "@vue/compiler-dom": "3.2.31",
846 | "@vue/compiler-sfc": "3.2.31",
847 | "@vue/runtime-dom": "3.2.31",
848 | "@vue/server-renderer": "3.2.31",
849 | "@vue/shared": "3.2.31"
850 | }
851 | },
852 | "node_modules/xml": {
853 | "version": "1.0.1",
854 | "resolved": "https://registry.npmjs.org/xml/-/xml-1.0.1.tgz",
855 | "integrity": "sha1-eLpyAgApxbyHuKgaPPzXS0ovweU="
856 | },
857 | "node_modules/xml2js": {
858 | "version": "0.4.23",
859 | "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.23.tgz",
860 | "integrity": "sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug==",
861 | "dependencies": {
862 | "sax": ">=0.6.0",
863 | "xmlbuilder": "~11.0.0"
864 | },
865 | "engines": {
866 | "node": ">=4.0.0"
867 | }
868 | },
869 | "node_modules/xmlbuilder": {
870 | "version": "11.0.1",
871 | "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz",
872 | "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==",
873 | "engines": {
874 | "node": ">=4.0"
875 | }
876 | }
877 | },
878 | "dependencies": {
879 | "@babel/parser": {
880 | "version": "7.17.0",
881 | "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.17.0.tgz",
882 | "integrity": "sha512-VKXSCQx5D8S04ej+Dqsr1CzYvvWgf20jIw2D+YhQCrIlr2UZGaDds23Y0xg75/skOxpLCRpUZvk/1EAVkGoDOw=="
883 | },
884 | "@babel/runtime": {
885 | "version": "7.20.13",
886 | "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.20.13.tgz",
887 | "integrity": "sha512-gt3PKXs0DBoL9xCvOIIZ2NEqAGZqHjAnmVbfQtB620V0uReIQutpel14KcneZuer7UioY8ALKZ7iocavvzTNFA==",
888 | "requires": {
889 | "regenerator-runtime": "^0.13.11"
890 | }
891 | },
892 | "@vitejs/plugin-vue": {
893 | "version": "2.2.0",
894 | "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-2.2.0.tgz",
895 | "integrity": "sha512-wXigM1EwN2G7rZcwG6kLk9ivvIMhx2363tCEvMBiXcTu5nePM/12hUPVzPb83Uugt6U+zom1gTpJopi/Ow/jwg==",
896 | "dev": true,
897 | "requires": {}
898 | },
899 | "@vue/compiler-core": {
900 | "version": "3.2.31",
901 | "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.2.31.tgz",
902 | "integrity": "sha512-aKno00qoA4o+V/kR6i/pE+aP+esng5siNAVQ422TkBNM6qA4veXiZbSe8OTXHXquEi/f6Akc+nLfB4JGfe4/WQ==",
903 | "requires": {
904 | "@babel/parser": "^7.16.4",
905 | "@vue/shared": "3.2.31",
906 | "estree-walker": "^2.0.2",
907 | "source-map": "^0.6.1"
908 | }
909 | },
910 | "@vue/compiler-dom": {
911 | "version": "3.2.31",
912 | "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.2.31.tgz",
913 | "integrity": "sha512-60zIlFfzIDf3u91cqfqy9KhCKIJgPeqxgveH2L+87RcGU/alT6BRrk5JtUso0OibH3O7NXuNOQ0cDc9beT0wrg==",
914 | "requires": {
915 | "@vue/compiler-core": "3.2.31",
916 | "@vue/shared": "3.2.31"
917 | }
918 | },
919 | "@vue/compiler-sfc": {
920 | "version": "3.2.31",
921 | "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.2.31.tgz",
922 | "integrity": "sha512-748adc9msSPGzXgibHiO6T7RWgfnDcVQD+VVwYgSsyyY8Ans64tALHZANrKtOzvkwznV/F4H7OAod/jIlp/dkQ==",
923 | "requires": {
924 | "@babel/parser": "^7.16.4",
925 | "@vue/compiler-core": "3.2.31",
926 | "@vue/compiler-dom": "3.2.31",
927 | "@vue/compiler-ssr": "3.2.31",
928 | "@vue/reactivity-transform": "3.2.31",
929 | "@vue/shared": "3.2.31",
930 | "estree-walker": "^2.0.2",
931 | "magic-string": "^0.25.7",
932 | "postcss": "^8.1.10",
933 | "source-map": "^0.6.1"
934 | }
935 | },
936 | "@vue/compiler-ssr": {
937 | "version": "3.2.31",
938 | "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.2.31.tgz",
939 | "integrity": "sha512-mjN0rqig+A8TVDnsGPYJM5dpbjlXeHUm2oZHZwGyMYiGT/F4fhJf/cXy8QpjnLQK4Y9Et4GWzHn9PS8AHUnSkw==",
940 | "requires": {
941 | "@vue/compiler-dom": "3.2.31",
942 | "@vue/shared": "3.2.31"
943 | }
944 | },
945 | "@vue/reactivity": {
946 | "version": "3.2.31",
947 | "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.2.31.tgz",
948 | "integrity": "sha512-HVr0l211gbhpEKYr2hYe7hRsV91uIVGFYNHj73njbARVGHQvIojkImKMaZNDdoDZOIkMsBc9a1sMqR+WZwfSCw==",
949 | "requires": {
950 | "@vue/shared": "3.2.31"
951 | }
952 | },
953 | "@vue/reactivity-transform": {
954 | "version": "3.2.31",
955 | "resolved": "https://registry.npmjs.org/@vue/reactivity-transform/-/reactivity-transform-3.2.31.tgz",
956 | "integrity": "sha512-uS4l4z/W7wXdI+Va5pgVxBJ345wyGFKvpPYtdSgvfJfX/x2Ymm6ophQlXXB6acqGHtXuBqNyyO3zVp9b1r0MOA==",
957 | "requires": {
958 | "@babel/parser": "^7.16.4",
959 | "@vue/compiler-core": "3.2.31",
960 | "@vue/shared": "3.2.31",
961 | "estree-walker": "^2.0.2",
962 | "magic-string": "^0.25.7"
963 | }
964 | },
965 | "@vue/runtime-core": {
966 | "version": "3.2.31",
967 | "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.2.31.tgz",
968 | "integrity": "sha512-Kcog5XmSY7VHFEMuk4+Gap8gUssYMZ2+w+cmGI6OpZWYOEIcbE0TPzzPHi+8XTzAgx1w/ZxDFcXhZeXN5eKWsA==",
969 | "requires": {
970 | "@vue/reactivity": "3.2.31",
971 | "@vue/shared": "3.2.31"
972 | }
973 | },
974 | "@vue/runtime-dom": {
975 | "version": "3.2.31",
976 | "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.2.31.tgz",
977 | "integrity": "sha512-N+o0sICVLScUjfLG7u9u5XCjvmsexAiPt17GNnaWHJUfsKed5e85/A3SWgKxzlxx2SW/Hw7RQxzxbXez9PtY3g==",
978 | "requires": {
979 | "@vue/runtime-core": "3.2.31",
980 | "@vue/shared": "3.2.31",
981 | "csstype": "^2.6.8"
982 | }
983 | },
984 | "@vue/server-renderer": {
985 | "version": "3.2.31",
986 | "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.2.31.tgz",
987 | "integrity": "sha512-8CN3Zj2HyR2LQQBHZ61HexF5NReqngLT3oahyiVRfSSvak+oAvVmu8iNLSu6XR77Ili2AOpnAt1y8ywjjqtmkg==",
988 | "requires": {
989 | "@vue/compiler-ssr": "3.2.31",
990 | "@vue/shared": "3.2.31"
991 | }
992 | },
993 | "@vue/shared": {
994 | "version": "3.2.31",
995 | "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.2.31.tgz",
996 | "integrity": "sha512-ymN2pj6zEjiKJZbrf98UM2pfDd6F2H7ksKw7NDt/ZZ1fh5Ei39X5tABugtT03ZRlWd9imccoK0hE8hpjpU7irQ=="
997 | },
998 | "asynckit": {
999 | "version": "0.4.0",
1000 | "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
1001 | "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q=="
1002 | },
1003 | "axios": {
1004 | "version": "1.7.9",
1005 | "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.9.tgz",
1006 | "integrity": "sha512-LhLcE7Hbiryz8oMDdDptSrWowmB4Bl6RCt6sIJKpRB4XtVf0iEgewX3au/pJqm+Py1kCASkb/FFKjxQaLtxJvw==",
1007 | "requires": {
1008 | "follow-redirects": "^1.15.6",
1009 | "form-data": "^4.0.0",
1010 | "proxy-from-env": "^1.1.0"
1011 | }
1012 | },
1013 | "combined-stream": {
1014 | "version": "1.0.8",
1015 | "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
1016 | "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
1017 | "requires": {
1018 | "delayed-stream": "~1.0.0"
1019 | }
1020 | },
1021 | "csstype": {
1022 | "version": "2.6.19",
1023 | "resolved": "https://registry.npmjs.org/csstype/-/csstype-2.6.19.tgz",
1024 | "integrity": "sha512-ZVxXaNy28/k3kJg0Fou5MiYpp88j7H9hLZp8PDC3jV0WFjfH5E9xHb56L0W59cPbKbcHXeP4qyT8PrHp8t6LcQ=="
1025 | },
1026 | "dayjs": {
1027 | "version": "1.10.7",
1028 | "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.10.7.tgz",
1029 | "integrity": "sha512-P6twpd70BcPK34K26uJ1KT3wlhpuOAPoMwJzpsIWUxHZ7wpmbdZL/hQqBDfz7hGurYSa5PhzdhDHtt319hL3ig=="
1030 | },
1031 | "delayed-stream": {
1032 | "version": "1.0.0",
1033 | "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
1034 | "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ=="
1035 | },
1036 | "entities": {
1037 | "version": "2.2.0",
1038 | "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz",
1039 | "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A=="
1040 | },
1041 | "esbuild": {
1042 | "version": "0.14.21",
1043 | "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.14.21.tgz",
1044 | "integrity": "sha512-7WEoNMBJdLN993dr9h0CpFHPRc3yFZD+EAVY9lg6syJJ12gc5fHq8d75QRExuhnMkT2DaRiIKFThRvDWP+fO+A==",
1045 | "dev": true,
1046 | "requires": {
1047 | "esbuild-android-arm64": "0.14.21",
1048 | "esbuild-darwin-64": "0.14.21",
1049 | "esbuild-darwin-arm64": "0.14.21",
1050 | "esbuild-freebsd-64": "0.14.21",
1051 | "esbuild-freebsd-arm64": "0.14.21",
1052 | "esbuild-linux-32": "0.14.21",
1053 | "esbuild-linux-64": "0.14.21",
1054 | "esbuild-linux-arm": "0.14.21",
1055 | "esbuild-linux-arm64": "0.14.21",
1056 | "esbuild-linux-mips64le": "0.14.21",
1057 | "esbuild-linux-ppc64le": "0.14.21",
1058 | "esbuild-linux-riscv64": "0.14.21",
1059 | "esbuild-linux-s390x": "0.14.21",
1060 | "esbuild-netbsd-64": "0.14.21",
1061 | "esbuild-openbsd-64": "0.14.21",
1062 | "esbuild-sunos-64": "0.14.21",
1063 | "esbuild-windows-32": "0.14.21",
1064 | "esbuild-windows-64": "0.14.21",
1065 | "esbuild-windows-arm64": "0.14.21"
1066 | }
1067 | },
1068 | "esbuild-android-arm64": {
1069 | "version": "0.14.21",
1070 | "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.14.21.tgz",
1071 | "integrity": "sha512-Bqgld1TY0wZv8TqiQmVxQFgYzz8ZmyzT7clXBDZFkOOdRybzsnj8AZuK1pwcLVA7Ya6XncHgJqIao7NFd3s0RQ==",
1072 | "dev": true,
1073 | "optional": true
1074 | },
1075 | "esbuild-darwin-64": {
1076 | "version": "0.14.21",
1077 | "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.14.21.tgz",
1078 | "integrity": "sha512-j+Eg+e13djzyYINVvAbOo2/zvZ2DivuJJTaBrJnJHSD7kUNuGHRkHoSfFjbI80KHkn091w350wdmXDNSgRjfYQ==",
1079 | "dev": true,
1080 | "optional": true
1081 | },
1082 | "esbuild-darwin-arm64": {
1083 | "version": "0.14.21",
1084 | "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.14.21.tgz",
1085 | "integrity": "sha512-nDNTKWDPI0RuoPj5BhcSB2z5EmZJJAyRtZLIjyXSqSpAyoB8eyAKXl4lB8U2P78Fnh4Lh1le/fmpewXE04JhBQ==",
1086 | "dev": true,
1087 | "optional": true
1088 | },
1089 | "esbuild-freebsd-64": {
1090 | "version": "0.14.21",
1091 | "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.14.21.tgz",
1092 | "integrity": "sha512-zIurkCHXhxELiDZtLGiexi8t8onQc2LtuE+S7457H/pP0g0MLRKMrsn/IN4LDkNe6lvBjuoZZi2OfelOHn831g==",
1093 | "dev": true,
1094 | "optional": true
1095 | },
1096 | "esbuild-freebsd-arm64": {
1097 | "version": "0.14.21",
1098 | "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.14.21.tgz",
1099 | "integrity": "sha512-wdxMmkJfbwcN+q85MpeUEamVZ40FNsBa9mPq8tAszDn8TRT2HoJvVRADPIIBa9SWWwlDChIMjkDKAnS3KS/sPA==",
1100 | "dev": true,
1101 | "optional": true
1102 | },
1103 | "esbuild-linux-32": {
1104 | "version": "0.14.21",
1105 | "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.14.21.tgz",
1106 | "integrity": "sha512-fmxvyzOPPh2xiEHojpCeIQP6pXcoKsWbz3ryDDIKLOsk4xp3GbpHIEAWP0xTeuhEbendmvBDVKbAVv3PnODXLg==",
1107 | "dev": true,
1108 | "optional": true
1109 | },
1110 | "esbuild-linux-64": {
1111 | "version": "0.14.21",
1112 | "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.14.21.tgz",
1113 | "integrity": "sha512-edZyNOv1ql+kpmlzdqzzDjRQYls+tSyi4QFi+PdBhATJFUqHsnNELWA9vMSzAaInPOEaVUTA5Ml28XFChcy4DA==",
1114 | "dev": true,
1115 | "optional": true
1116 | },
1117 | "esbuild-linux-arm": {
1118 | "version": "0.14.21",
1119 | "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.14.21.tgz",
1120 | "integrity": "sha512-aSU5pUueK6afqmLQsbU+QcFBT62L+4G9hHMJDHWfxgid6hzhSmfRH9U/f+ymvxsSTr/HFRU4y7ox8ZyhlVl98w==",
1121 | "dev": true,
1122 | "optional": true
1123 | },
1124 | "esbuild-linux-arm64": {
1125 | "version": "0.14.21",
1126 | "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.14.21.tgz",
1127 | "integrity": "sha512-t5qxRkq4zdQC0zXpzSB2bTtfLgOvR0C6BXYaRE/6/k8/4SrkZcTZBeNu+xGvwCU4b5dU9ST9pwIWkK6T1grS8g==",
1128 | "dev": true,
1129 | "optional": true
1130 | },
1131 | "esbuild-linux-mips64le": {
1132 | "version": "0.14.21",
1133 | "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.14.21.tgz",
1134 | "integrity": "sha512-jLZLQGCNlUsmIHtGqNvBs3zN+7a4D9ckf0JZ+jQTwHdZJ1SgV9mAjbB980OFo66LoY+WeM7t3WEnq3FjI1zw4A==",
1135 | "dev": true,
1136 | "optional": true
1137 | },
1138 | "esbuild-linux-ppc64le": {
1139 | "version": "0.14.21",
1140 | "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.14.21.tgz",
1141 | "integrity": "sha512-4TWxpK391en2UBUw6GSrukToTDu6lL9vkm3Ll40HrI08WG3qcnJu7bl8e1+GzelDsiw1QmfAY/nNvJ6iaHRpCQ==",
1142 | "dev": true,
1143 | "optional": true
1144 | },
1145 | "esbuild-linux-riscv64": {
1146 | "version": "0.14.21",
1147 | "resolved": "https://registry.npmjs.org/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.14.21.tgz",
1148 | "integrity": "sha512-fElngqOaOfTsF+u+oetDLHsPG74vB2ZaGZUqmGefAJn3a5z9Z2pNa4WpVbbKgHpaAAy5tWM1m1sbGohj6Ki6+Q==",
1149 | "dev": true,
1150 | "optional": true
1151 | },
1152 | "esbuild-linux-s390x": {
1153 | "version": "0.14.21",
1154 | "resolved": "https://registry.npmjs.org/esbuild-linux-s390x/-/esbuild-linux-s390x-0.14.21.tgz",
1155 | "integrity": "sha512-brleZ6R5fYv0qQ7ZBwenQmP6i9TdvJCB092c/3D3pTLQHBGHJb5zWgKxOeS7bdHzmLy6a6W7GbFk6QKpjyD6QA==",
1156 | "dev": true,
1157 | "optional": true
1158 | },
1159 | "esbuild-netbsd-64": {
1160 | "version": "0.14.21",
1161 | "resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.14.21.tgz",
1162 | "integrity": "sha512-nCEgsLCQ8RoFWVV8pVI+kX66ICwbPP/M9vEa0NJGIEB/Vs5sVGMqkf67oln90XNSkbc0bPBDuo4G6FxlF7PN8g==",
1163 | "dev": true,
1164 | "optional": true
1165 | },
1166 | "esbuild-openbsd-64": {
1167 | "version": "0.14.21",
1168 | "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.14.21.tgz",
1169 | "integrity": "sha512-h9zLMyVD0T73MDTVYIb/qUTokwI6EJH9O6wESuTNq6+XpMSr6C5aYZ4fvFKdNELW+Xsod+yDS2hV2JTUAbFrLA==",
1170 | "dev": true,
1171 | "optional": true
1172 | },
1173 | "esbuild-sunos-64": {
1174 | "version": "0.14.21",
1175 | "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.14.21.tgz",
1176 | "integrity": "sha512-Kl+7Cot32qd9oqpLdB1tEGXEkjBlijrIxMJ0+vlDFaqsODutif25on0IZlFxEBtL2Gosd4p5WCV1U7UskNQfXA==",
1177 | "dev": true,
1178 | "optional": true
1179 | },
1180 | "esbuild-windows-32": {
1181 | "version": "0.14.21",
1182 | "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.14.21.tgz",
1183 | "integrity": "sha512-V7vnTq67xPBUCk/9UtlolmQ798Ecjdr1ZoI1vcSgw7M82aSSt0eZdP6bh5KAFZU8pxDcx3qoHyWQfHYr11f22A==",
1184 | "dev": true,
1185 | "optional": true
1186 | },
1187 | "esbuild-windows-64": {
1188 | "version": "0.14.21",
1189 | "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.14.21.tgz",
1190 | "integrity": "sha512-kDgHjKOHwjfJDCyRGELzVxiP/RBJBTA+wyspf78MTTJQkyPuxH2vChReNdWc+dU2S4gIZFHMdP1Qrl/k22ZmaA==",
1191 | "dev": true,
1192 | "optional": true
1193 | },
1194 | "esbuild-windows-arm64": {
1195 | "version": "0.14.21",
1196 | "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.14.21.tgz",
1197 | "integrity": "sha512-8Sbo0zpzgwWrwjQYLmHF78f7E2xg5Ve63bjB2ng3V2aManilnnTGaliq2snYg+NOX60+hEvJHRdVnuIAHW0lVw==",
1198 | "dev": true,
1199 | "optional": true
1200 | },
1201 | "estree-walker": {
1202 | "version": "2.0.2",
1203 | "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz",
1204 | "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w=="
1205 | },
1206 | "follow-redirects": {
1207 | "version": "1.15.9",
1208 | "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz",
1209 | "integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ=="
1210 | },
1211 | "form-data": {
1212 | "version": "4.0.1",
1213 | "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.1.tgz",
1214 | "integrity": "sha512-tzN8e4TX8+kkxGPK8D5u0FNmjPUjw3lwC9lSLxxoB/+GtsJG91CO8bSWy73APlgAZzZbXEYZJuxjkHH2w+Ezhw==",
1215 | "requires": {
1216 | "asynckit": "^0.4.0",
1217 | "combined-stream": "^1.0.8",
1218 | "mime-types": "^2.1.12"
1219 | }
1220 | },
1221 | "fsevents": {
1222 | "version": "2.3.2",
1223 | "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz",
1224 | "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==",
1225 | "dev": true,
1226 | "optional": true
1227 | },
1228 | "function-bind": {
1229 | "version": "1.1.1",
1230 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
1231 | "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==",
1232 | "dev": true
1233 | },
1234 | "has": {
1235 | "version": "1.0.3",
1236 | "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
1237 | "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
1238 | "dev": true,
1239 | "requires": {
1240 | "function-bind": "^1.1.1"
1241 | }
1242 | },
1243 | "is-core-module": {
1244 | "version": "2.8.1",
1245 | "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.1.tgz",
1246 | "integrity": "sha512-SdNCUs284hr40hFTFP6l0IfZ/RSrMXF3qgoRHd3/79unUTvrFO/JoXwkGm+5J/Oe3E/b5GsnG330uUNgRpu1PA==",
1247 | "dev": true,
1248 | "requires": {
1249 | "has": "^1.0.3"
1250 | }
1251 | },
1252 | "magic-string": {
1253 | "version": "0.25.7",
1254 | "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.7.tgz",
1255 | "integrity": "sha512-4CrMT5DOHTDk4HYDlzmwu4FVCcIYI8gauveasrdCu2IKIFOJ3f0v/8MDGJCDL9oD2ppz/Av1b0Nj345H9M+XIA==",
1256 | "requires": {
1257 | "sourcemap-codec": "^1.4.4"
1258 | }
1259 | },
1260 | "mime-db": {
1261 | "version": "1.25.0",
1262 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.25.0.tgz",
1263 | "integrity": "sha1-wY29fHOl2/b0SgJNwNFloeexw5I="
1264 | },
1265 | "mime-types": {
1266 | "version": "2.1.13",
1267 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.13.tgz",
1268 | "integrity": "sha1-4HqqnGxrmnyjASxpADrSWjnpKog=",
1269 | "requires": {
1270 | "mime-db": "~1.25.0"
1271 | }
1272 | },
1273 | "nanoid": {
1274 | "version": "3.2.0",
1275 | "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.2.0.tgz",
1276 | "integrity": "sha512-fmsZYa9lpn69Ad5eDn7FMcnnSR+8R34W9qJEijxYhTbfOWzr22n1QxCMzXLK+ODyW2973V3Fux959iQoUxzUIA=="
1277 | },
1278 | "path-parse": {
1279 | "version": "1.0.7",
1280 | "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
1281 | "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==",
1282 | "dev": true
1283 | },
1284 | "picocolors": {
1285 | "version": "1.0.0",
1286 | "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz",
1287 | "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ=="
1288 | },
1289 | "postcss": {
1290 | "version": "8.4.6",
1291 | "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.6.tgz",
1292 | "integrity": "sha512-OovjwIzs9Te46vlEx7+uXB0PLijpwjXGKXjVGGPIGubGpq7uh5Xgf6D6FiJ/SzJMBosHDp6a2hiXOS97iBXcaA==",
1293 | "requires": {
1294 | "nanoid": "^3.2.0",
1295 | "picocolors": "^1.0.0",
1296 | "source-map-js": "^1.0.2"
1297 | }
1298 | },
1299 | "proxy-from-env": {
1300 | "version": "1.1.0",
1301 | "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz",
1302 | "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg=="
1303 | },
1304 | "regenerator-runtime": {
1305 | "version": "0.13.11",
1306 | "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz",
1307 | "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg=="
1308 | },
1309 | "resolve": {
1310 | "version": "1.22.0",
1311 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.0.tgz",
1312 | "integrity": "sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw==",
1313 | "dev": true,
1314 | "requires": {
1315 | "is-core-module": "^2.8.1",
1316 | "path-parse": "^1.0.7",
1317 | "supports-preserve-symlinks-flag": "^1.0.0"
1318 | }
1319 | },
1320 | "rollup": {
1321 | "version": "2.67.2",
1322 | "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.67.2.tgz",
1323 | "integrity": "sha512-hoEiBWwZtf1QdK3jZIq59L0FJj4Fiv4RplCO4pvCRC86qsoFurWB4hKQIjoRf3WvJmk5UZ9b0y5ton+62fC7Tw==",
1324 | "dev": true,
1325 | "requires": {
1326 | "fsevents": "~2.3.2"
1327 | }
1328 | },
1329 | "rss": {
1330 | "version": "1.2.2",
1331 | "resolved": "https://registry.npmjs.org/rss/-/rss-1.2.2.tgz",
1332 | "integrity": "sha1-UKFpiHYTgTOnT5oF0r3I240nqSE=",
1333 | "requires": {
1334 | "mime-types": "2.1.13",
1335 | "xml": "1.0.1"
1336 | }
1337 | },
1338 | "rss-parser": {
1339 | "version": "3.12.0",
1340 | "resolved": "https://registry.npmjs.org/rss-parser/-/rss-parser-3.12.0.tgz",
1341 | "integrity": "sha512-aqD3E8iavcCdkhVxNDIdg1nkBI17jgqF+9OqPS1orwNaOgySdpvq6B+DoONLhzjzwV8mWg37sb60e4bmLK117A==",
1342 | "requires": {
1343 | "entities": "^2.0.3",
1344 | "xml2js": "^0.4.19"
1345 | }
1346 | },
1347 | "sax": {
1348 | "version": "1.2.4",
1349 | "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz",
1350 | "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw=="
1351 | },
1352 | "seatable-api": {
1353 | "version": "1.0.42",
1354 | "resolved": "https://registry.npmjs.org/seatable-api/-/seatable-api-1.0.42.tgz",
1355 | "integrity": "sha512-zooM+8AbYywvhoaeo4D4SmzTddBcfeCQH8wUFF0/M+1mCDupmavozpjwKL0/+A6saeUvV7/yvFc5wFP7UKv1eQ==",
1356 | "requires": {
1357 | "@babel/runtime": "7.20.13",
1358 | "axios": "~1.7.*",
1359 | "dayjs": "1.10.7"
1360 | }
1361 | },
1362 | "source-map": {
1363 | "version": "0.6.1",
1364 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
1365 | "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="
1366 | },
1367 | "source-map-js": {
1368 | "version": "1.0.2",
1369 | "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz",
1370 | "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw=="
1371 | },
1372 | "sourcemap-codec": {
1373 | "version": "1.4.8",
1374 | "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz",
1375 | "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA=="
1376 | },
1377 | "supports-preserve-symlinks-flag": {
1378 | "version": "1.0.0",
1379 | "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz",
1380 | "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==",
1381 | "dev": true
1382 | },
1383 | "vite": {
1384 | "version": "2.8.1",
1385 | "resolved": "https://registry.npmjs.org/vite/-/vite-2.8.1.tgz",
1386 | "integrity": "sha512-Typ8qjUnW0p53gBsJpisrKcZlEbUPZATja9BG6Z09QZjg9YrnEn/htkr/VH4WhnH7eNUQeSD+wKI1lHzQRWskw==",
1387 | "dev": true,
1388 | "requires": {
1389 | "esbuild": "^0.14.14",
1390 | "fsevents": "~2.3.2",
1391 | "postcss": "^8.4.6",
1392 | "resolve": "^1.22.0",
1393 | "rollup": "^2.59.0"
1394 | }
1395 | },
1396 | "vue": {
1397 | "version": "3.2.31",
1398 | "resolved": "https://registry.npmjs.org/vue/-/vue-3.2.31.tgz",
1399 | "integrity": "sha512-odT3W2tcffTiQCy57nOT93INw1auq5lYLLYtWpPYQQYQOOdHiqFct9Xhna6GJ+pJQaF67yZABraH47oywkJgFw==",
1400 | "requires": {
1401 | "@vue/compiler-dom": "3.2.31",
1402 | "@vue/compiler-sfc": "3.2.31",
1403 | "@vue/runtime-dom": "3.2.31",
1404 | "@vue/server-renderer": "3.2.31",
1405 | "@vue/shared": "3.2.31"
1406 | }
1407 | },
1408 | "xml": {
1409 | "version": "1.0.1",
1410 | "resolved": "https://registry.npmjs.org/xml/-/xml-1.0.1.tgz",
1411 | "integrity": "sha1-eLpyAgApxbyHuKgaPPzXS0ovweU="
1412 | },
1413 | "xml2js": {
1414 | "version": "0.4.23",
1415 | "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.23.tgz",
1416 | "integrity": "sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug==",
1417 | "requires": {
1418 | "sax": ">=0.6.0",
1419 | "xmlbuilder": "~11.0.0"
1420 | }
1421 | },
1422 | "xmlbuilder": {
1423 | "version": "11.0.1",
1424 | "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz",
1425 | "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA=="
1426 | }
1427 | }
1428 | }
1429 |
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "blogroll",
3 | "version": "2.0.0",
4 | "scripts": {
5 | "dev": "cd web && vite",
6 | "update": "node update_files.js",
7 | "gen": "node index.js",
8 | "build": "cd web && vite build",
9 | "preview": "cd web && vite preview --port 5050"
10 | },
11 | "dependencies": {
12 | "rss": "^1.2.2",
13 | "rss-parser": "^3.12.0",
14 | "seatable-api": "^1.0.42",
15 | "vue": "^3.2.29"
16 | },
17 | "devDependencies": {
18 | "@vitejs/plugin-vue": "^2.1.0",
19 | "vite": "^2.7.13"
20 | }
21 | }
22 |
--------------------------------------------------------------------------------
/update_files.js:
--------------------------------------------------------------------------------
1 | // 文件读取包
2 | const fs = require('fs');
3 | // 引入 SeaTableAPI
4 | const { Base } = require('seatable-api');
5 | // exit函数
6 | const { exit } = require('process');
7 |
8 | // 相关配置
9 | const seatableToken = process.env.SEATABLE_API_TOKEN;
10 | const readmeMdPath = './README.md';
11 | // 读取 README.md
12 | const readmeMdContent = fs.readFileSync(readmeMdPath, { encoding: 'utf-8' });
13 |
14 | // 解析 SeaTable 中的表格,转为 JSON
15 | async function parseSeaTableToJson() {
16 | const seatableBase = new Base({
17 | server: "https://table.nju.edu.cn",
18 | APIToken: seatableToken
19 | });
20 | try {
21 | await seatableBase.auth();
22 | } catch (err) {
23 | console.log('Seatable API Token 无效,请检查环境变量 SEATABLE_API_TOKEN 是否正确设置。');
24 | exit(1);
25 | }
26 | const tables = await seatableBase.getTables();
27 | const rows = await seatableBase.listRows(tables[0]['name']);
28 | const rows_reverse = rows.reverse();
29 | var opmlJson = [];
30 | rows_reverse.forEach(row => {
31 | // 根据Name去重并保留最后一个
32 | if (row['Name'] && !(opmlJson.find((item) => item.title === row['Name']))) {
33 | if (opmlJson.find((item) => item.htmlUrl === row['HTML'])) {
34 | return;
35 | }
36 | opmlJson.push({
37 | title: row['Name'],
38 | xmlUrl: row['RSS'],
39 | htmlUrl: row['HTML']
40 | });
41 | }
42 | });
43 | return opmlJson.reverse();
44 | }
45 |
46 |
47 | (async () => {
48 | // 从 SeaTable 中读取数据
49 | const opmlJson = await parseSeaTableToJson();
50 |
51 | // 更新 README.md 中的表格内容
52 | const tableStart = readmeMdContent.indexOf('| -- | -- | -- |') + 22;
53 | const tableEnd = readmeMdContent.indexOf('## OPML') - 2;
54 | const tableContent = opmlJson.map((lineJson) => `| ${lineJson.title} | ${lineJson.xmlUrl} | ${lineJson.htmlUrl} |`).join('\n') + '\n';
55 | const newReadmeMdContent = readmeMdContent.slice(0, tableStart) + tableContent + readmeMdContent.slice(tableEnd);
56 | fs.writeFileSync(readmeMdPath, newReadmeMdContent, { encoding: 'utf-8' });
57 | })();
58 |
--------------------------------------------------------------------------------
/web/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 | Blogroll | NJU-LUG
9 |
10 |
11 |
12 |
13 |
14 |
15 |
--------------------------------------------------------------------------------
/web/public/favicon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nju-lug/blogroll/7aecf651d6459f717cbe6b59e25c0a9737d7fd65/web/public/favicon.ico
--------------------------------------------------------------------------------
/web/public/opml.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | NJU-LUG Blogroll
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
--------------------------------------------------------------------------------
/web/public/rss.xml:
--------------------------------------------------------------------------------
1 | https://blogroll.njulug.org/https://blogroll.njulug.org/assets/logo.56c0d74c.png NJU-LUG Blogroll https://blogroll.njulug.org/RSS for Node Thu, 17 Feb 2022 06:49:52 GMT Wed, 31 Dec 2098 16:00:00 GMT https://blogroll.njulug.org/ 60
2 | 为 Hexo 博客中的 Markdown 添加卡片式链接支持
3 |
4 | 我写了一个 Hexo 插件 ,可以使用现有 Markdown 语法将链接转换为卡片式链接(网页卡片).
5 | 这个插件的 GitHub 地址在这里:
6 | OrangeX4/hexo-link-card - GitHub https://github.com/OrangeX4/hexo-link-card
7 | 卡片式链接的优点:
8 |
9 | 在移动互联网的时代,有许多人通过智能手机浏览文章,通过卡片式链接打开新页面对他们更友好;
10 | 旧式的链接显示方式不够明显,很容易导致人们忽视了这是一条链接,卡片式链接能够突出显示,不容易被他人忽略;
11 | 许多平台,例如 Bilibili,知乎,微信公众号等平台,均有将链接转换为卡片式链接的功能,如果能在书写 Markdown 阶段,就将卡片式链接的书写考虑进去,能给后续发布带来很大的便利。
12 | ]]> https://blog.orangex4.cool/post/hexo-link-card/https://blog.orangex4.cool/post/hexo-link-card/ Wed, 09 Feb 2022 16:00:00 GMT
13 | VSCode 通过 Remote - SSH 远程连接腾讯云服务器
14 |
15 | 每当我切换到一个新环境,例如新电脑、新系统时,总是会忘记如何配置 VSCode 中的 Remote - SSH,也就很难连上腾讯云服务器进行开发。
16 | 所以我特意将配置的步骤写成一篇博文,记录如下。
17 |
18 |
20 |
]]> https://blog.orangex4.cool/post/cloud-server-in-vscode-ssh/https://blog.orangex4.cool/post/cloud-server-in-vscode-ssh/ Mon, 07 Feb 2022 16:00:00 GMT 2021年4月,Cloudflare 宣布其旗下的服务 Cloudflare Tunnel 免费开放 。Cloudflare Tunnel 可以在服务器和 Cloudflare 全球网络之间建立连接,使得服务器在不打开任何防火墙入站规则(甚至可以没有公网IP)的情况下得以被公网访问。这一技术可以应用于内网穿透、保护服务器安全性等领域。
21 | 网络上已经有很多关于 Cloudflare Tunnel 的使用教程,但截至本文章发布,我并没有找到延迟和速度测试。因此我自己分别对上海和香港的服务器进行了测试并发布在这里。
]]> https://blog.caomingjun.com/cloudflare-tunnel-speedtest/https://blog.caomingjun.com/cloudflare-tunnel-speedtest/ Sun, 06 Feb 2022 11:23:00 GMT https://idealclover.top/archives/630/https://idealclover.top/archives/630/ Fri, 04 Feb 2022 11:30:00 GMT https://blog.typoverflow.me/index.php/archives/34/https://blog.typoverflow.me/index.php/archives/34/ Wed, 26 Jan 2022 13:42:00 GMT 在刚刚过去的 2021 年,我在课内课外都折腾了不少东西(主要是在下半年)。其实这其中的许多东西都值得写一篇博客记录,但是我自从创建网站之后就比较忙,没有写,于是在这篇文章做一个总结。可能未来会补上那些博客。]]> https://blog.caomingjun.com/my2021/https://blog.caomingjun.com/my2021/ Sun, 23 Jan 2022 11:36:40 GMT 群晖的 QuickConnect 是群晖自带的一项内网穿透功能, 通过某宝的洗白服务, 自建的黑群晖也可以使用 QuickConnect 来进行内网穿透.
24 | QuickConnect 与群晖自家的应用搭配使用很方便, 可以实现内外网的无缝切换 , 只需要填入 QuickConnect ID 即可.
25 | 但缺点 是 QuickConnect 功能只能在群晖官方的 APP 上使用, 而群晖的很多 APP 实际使用体验很差, 缺失很多最基本的功能.
26 | AIO Ep.9 中提到了使用 ipv6 DDNS 的方式, 这篇有关 n1 盒子的文章 中展示了配置透明代理访问内网任意服务的方式. 但这种方法在目前 ipv6 尚未全面普及 的时候仍有不便.(很多 Wi-Fi 不支持或默认未开启 ipv6, 必须使用热点共享.)
27 | 最终经过搜索和实验我找到了使用 QuickConnect 代理所有应用流量的方法, 可以节约自己搭建反向代理或购买反向代理的费用.(白嫖到榨干它) 整理记录在此.
28 |
29 | ]]> https://blog.lyc8503.site/2022/01/21/%E4%B8%93%E9%A2%98%E5%90%91%E7%A0%94%E7%A9%B6/AllInOne%E5%AE%B6%E7%94%A8%E6%9C%8D%E5%8A%A1%E5%99%A8/10-all-in-quickconnect/https://blog.lyc8503.site/2022/01/21/%E4%B8%93%E9%A2%98%E5%90%91%E7%A0%94%E7%A9%B6/AllInOne%E5%AE%B6%E7%94%A8%E6%9C%8D%E5%8A%A1%E5%99%A8/10-all-in-quickconnect/ Fri, 21 Jan 2022 15:18:34 GMT 同源策略 是指在Web浏览器 中,允许某个网页脚本 访问另一个网页的数据,但前提是这两个网页必须有相同的URI 、主机名 和端口号 ,一旦两个网站满足上述条件,这两个网站就被认定为具有相同来源。此策略可防止某个网页上的恶意脚本 通过该页面的文档对象模型 访问另一网页上的敏感数据。
32 | 跨域资源共享 (英语:Cross-origin resource sharing,缩写:CORS),用于让网页的受限资源能够被其他域名的页面访问的一种机制。
33 | 跨站请求伪造 (英语:Cross-site request forgery),也被称为 one-click attack 或者 session riding ,通常缩写为 CSRF 或者 XSRF , 是一种挟制用户在当前已登录的Web应用程序上执行非本意的操作的攻击方法。
34 |
35 | ]]> https://blog.lyc8503.site/2022/01/20/%E5%AD%A6%E4%B9%A0%E6%97%A5%E8%AE%B0/Web/cors-and-csrf/https://blog.lyc8503.site/2022/01/20/%E5%AD%A6%E4%B9%A0%E6%97%A5%E8%AE%B0/Web/cors-and-csrf/ Thu, 20 Jan 2022 03:54:55 GMT 来安利一下这个非常强大的软件 PowerToys.
38 | PowerToys 是微软官方和开源社区共同维护的一组实用工具.
39 | 包含了 Explorer markdown/pdf/svg 预览, 屏幕取色, PowerToys Run(快速启动), 正则文件重命名, 快捷键映射, 图像大小调整, 快速定位鼠标, 保持唤醒等一系列十分实用的功能.
40 |
41 | ]]> https://blog.lyc8503.site/2022/01/20/%E6%9D%82%E4%B8%83%E6%9D%82%E5%85%AB0w0/windows-powertoys/https://blog.lyc8503.site/2022/01/20/%E6%9D%82%E4%B8%83%E6%9D%82%E5%85%AB0w0/windows-powertoys/ Thu, 20 Jan 2022 03:38:25 GMT https://blog.typoverflow.me/index.php/archives/32/https://blog.typoverflow.me/index.php/archives/32/ Sat, 15 Jan 2022 05:21:00 GMT
42 | GitHub仓库 地址 前几天突发奇想,虚幻4里有没有办法模拟出乒乓球在真实世界的运动规律呢(比如下旋的回弹,上旋加速等)? 据我 ...
43 | The post 高速旋转球体的物理动画模拟(虚幻4实现) appeared first on α-Lyrae .
44 | ]]> https://chr.fan/ue4-ball/https://chr.fan/ue4-ball/ Sat, 01 Jan 2022 15:36:33 GMT
45 | GAMES101课后作业仓库 博客的LaTeX支持真的差得离谱……符号过大,格式也不太好看,可能以后会比较少在博客上写数学相关的东 ...
46 | The post GAMES101学习笔记 appeared first on α-Lyrae .
47 | ]]> https://chr.fan/games101/https://chr.fan/games101/ Sat, 01 Jan 2022 15:27:59 GMT https://blog.typoverflow.me/index.php/archives/14/https://blog.typoverflow.me/index.php/archives/14/ Sun, 26 Dec 2021 15:59:00 GMT https://blog.typoverflow.me/index.php/archives/4/https://blog.typoverflow.me/index.php/archives/4/ Sat, 25 Dec 2021 08:53:00 GMT https://ladderoperator.top/post/hello_hugo/https://ladderoperator.top/post/hello_hugo/ Mon, 13 Dec 2021 00:00:00 GMT 0x00 前言去年苹果发布了搭载 M1 芯片的 MacBook, 随后新一代的 Mac mini 和 iMac 也使用了 Arm 架构的 M1 芯片. M1 Pro 和 M1 Max 让 M1 完全取代 Intel 芯片成为可能.
50 | 目前的趋势是 M1 将会全面取代 x86 的 Intel CPU, 在技术层面上黑苹果会困难到几乎不可能. 同时黑苹果的价格优势也变得不再显著. 可能不过几年, “黑苹果”的技术就会淹没在历史的潮流中.
51 | 所以趁着这最后的辉煌, 我也来尝试体验一下 Hackintosh.
52 |
53 | ]]> https://blog.lyc8503.site/2021/11/29/%E8%BD%AF%E4%BB%B6%E7%A0%94%E7%A9%B6=)/%E5%85%B6%E4%BB%96/hackintosh-1/https://blog.lyc8503.site/2021/11/29/%E8%BD%AF%E4%BB%B6%E7%A0%94%E7%A9%B6=)/%E5%85%B6%E4%BB%96/hackintosh-1/ Mon, 29 Nov 2021 01:26:37 GMT 某些 Windows 系统内置的应用, 比如 SMB 或者 RDP, 不能设置 Socks5 代理.
56 | 这样如果希望在公网上访问到家里服务器的 SMB 文件共享就不太方便了.
57 | 还有一些应用 (比如 QQ / git) 不会默认使用系统代理, 需要手动设置, 也相对比较麻烦.
58 | 上一篇文章中基于软路由网关的透明代理模式可以解决这种问题.
59 | 可是笔记本不是只在一个固定的路由器下使用, 而需要携带到不同的网络环境下使用时, 设置基于 TUN 的全局代理 则会更加方便.
60 |
61 | ]]> https://blog.lyc8503.site/2021/11/17/%E8%BD%AF%E4%BB%B6%E7%A0%94%E7%A9%B6=)/%E5%85%B6%E4%BB%96/configuring-tun/https://blog.lyc8503.site/2021/11/17/%E8%BD%AF%E4%BB%B6%E7%A0%94%E7%A9%B6=)/%E5%85%B6%E4%BB%96/configuring-tun/ Wed, 17 Nov 2021 12:15:09 GMT
62 | 不定期更新遇到的新问题,仅做记录,仅限我的笔记本上可以如下解决问题 无声音,No input or output devices ...
63 | The post Arch踩坑记录 appeared first on α-Lyrae .
64 | ]]> https://chr.fan/arch%e8%b8%a9%e5%9d%91%e8%ae%b0%e5%bd%95/https://chr.fan/arch%e8%b8%a9%e5%9d%91%e8%ae%b0%e5%bd%95/ Sat, 23 Oct 2021 09:49:36 GMT https://blog.caomingjun.com/2021/10/14/%E8%A7%A3%E5%86%B3Android-Studio%E4%B8%8Bflutter%E4%BD%BF%E7%94%A8%E7%AD%BE%E5%90%8D%E6%9E%84%E5%BB%BA%E5%A4%B1%E8%B4%A5%E7%9A%84%E9%97%AE%E9%A2%98/https://blog.caomingjun.com/2021/10/14/%E8%A7%A3%E5%86%B3Android-Studio%E4%B8%8Bflutter%E4%BD%BF%E7%94%A8%E7%AD%BE%E5%90%8D%E6%9E%84%E5%BB%BA%E5%A4%B1%E8%B4%A5%E7%9A%84%E9%97%AE%E9%A2%98/ Thu, 14 Oct 2021 02:53:58 GMT 每一场泡沫破碎的背后, 是一茬韭菜的哭泣, 更是一群垃圾佬的狂欢(大雾)~~
67 |
68 | ]]> https://blog.lyc8503.site/2021/09/30/%E7%A1%AC%E4%BB%B6%E3%81%AE%E7%A0%94%E7%A9%B6/phicomm-n1/https://blog.lyc8503.site/2021/09/30/%E7%A1%AC%E4%BB%B6%E3%81%AE%E7%A0%94%E7%A9%B6/phicomm-n1/ Thu, 30 Sep 2021 05:52:22 GMT https://blog.caomingjun.com/2021/09/29/%E7%94%A8python%E7%BC%96%E5%86%99%E7%BD%91%E9%A1%B5%E6%9B%B4%E6%96%B0%E6%8F%90%E9%86%92%E7%A8%8B%E5%BA%8F/https://blog.caomingjun.com/2021/09/29/%E7%94%A8python%E7%BC%96%E5%86%99%E7%BD%91%E9%A1%B5%E6%9B%B4%E6%96%B0%E6%8F%90%E9%86%92%E7%A8%8B%E5%BA%8F/ Wed, 29 Sep 2021 07:16:56 GMT https://blog.caomingjun.com/2021/09/28/urllib3-1-26%E4%B8%8E%E4%BB%A3%E7%90%86%E5%86%B2%E7%AA%81%E9%97%AE%E9%A2%98%E8%A7%A3%E5%86%B3/https://blog.caomingjun.com/2021/09/28/urllib3-1-26%E4%B8%8E%E4%BB%A3%E7%90%86%E5%86%B2%E7%AA%81%E9%97%AE%E9%A2%98%E8%A7%A3%E5%86%B3/ Tue, 28 Sep 2021 03:19:59 GMT 开始读大学, 准备寻找一种电子手写笔记的解决方案~
71 | 简单搜索了一下, 找到了以下几种方案.
72 |
73 | 手写之后拍照上传
74 | 优点: 无需专用设备, 书写手感好, 几乎无成本. 缺点: 麻烦低效, 要携带纸笔.
75 |
76 | 数位板
77 | 优点: 低成本, 低延时. 缺点: 手眼不同步. 携带电脑和板, 重.
78 |
79 | 数位屏
80 | 优点: 看着屏写, 手眼同步, 低延时. 缺点: 携带电脑和屏, 重. 数位屏较贵.
81 |
82 | 支持手写笔的平板
83 | 优点: 手眼同步, 课后平板还能用于其他用处. 缺点: 手写延时高, 贵.
84 |
85 | 普通平板加被动电容笔
86 | 优点: 便宜的一塌糊涂. 缺点: 基本就是垃圾.
87 |
88 |
89 |
90 | ]]> https://blog.lyc8503.site/2021/09/27/%E6%9D%82%E4%B8%83%E6%9D%82%E5%85%AB0w0/iplay30-handwriting/https://blog.lyc8503.site/2021/09/27/%E6%9D%82%E4%B8%83%E6%9D%82%E5%85%AB0w0/iplay30-handwriting/ Mon, 27 Sep 2021 02:58:31 GMT
91 | 简单方便, 在 VSCode 中使用 Latex 公式和 Python 进行科学计算
92 |
93 |
94 |
95 | 简介
96 |
97 | Latex Sympy Calculator 是一款 VSCode 插件, 它能够帮助你在 VSCode 写 Latex 或 Markdown 的时候, 一键计算 Latex 书写的数学公式.
98 |
99 |
101 |
102 | 当前支持的功能:
103 |
104 | 算术: 加 (+), 减 (-), 点乘 (·), 叉乘 (×), 除法 (/), 乘方 (^), 绝对值 (|x|), 开方 (√), 虚数 (i)…
105 | 字母表: 英文字母 a - z, A - Z, 希腊字母 α - ω, 下标 (x_1), 重音符 (ā)…
106 | 常见函数: 最大公约数 (gcd), 最小公倍数 (lcm), 下界 (floor), 上届 (ceil), 最大值 (max), 最小值 (min), 取对数 (log), 自然对数 (ln), 指数 (exp), 三角函数 (sin, cos, tan, csc, sec, cot, arcsin, sinh, arsinh)…
107 | 微积分: 求极限 (l i m n → ∞ lim_{n\to\infty} l i m n → ∞ ), 求导/求微分 (d d x ( x 2 + x ) \frac{d}{dx}(x^2+x) d x d ( x 2 + x ) ), 求积分 (∫ x d x \int xdx ∫ x d x )…
108 | 线性代数: 矩阵 (Matrix), 行列式 (Determinant), 转置 (Transpose), 求逆 (Inverse), 初等变换 (Elementary Transformation)…
109 | 关系符: 大于 (>), 小于 (<), 大于等于 (≥), 小于等于 (≤), 相等 (=)…
110 | 其他: 二项式…
111 |
112 | 当然, 实际上还有很多其他的功能, 只要是 Python Sympy 包支持的运算, 都可以通过这个插件来实现 .
113 | 通过这个插件, 你就不再需要一字一句地将 Latex 转译成其他语言, 然后用 Matlab 或 MMA 等数学软件进行科学计算了. 简单的 符号推导 , 矩阵运算 , 微积分 , 科学计算 , 完全可以利用这个插件来实现.
114 | 如果你也在 VSCode 中用 Latex 或 Markdown 写数学公式, 那么这就是你 必备的 VSCode 科学计算插件 .
115 | 插件的 GitHub 页面 .
116 | latex2sympy2 包的 Github 页面 .
]]> https://blog.orangex4.cool/post/latex-sympy-calculator/https://blog.orangex4.cool/post/latex-sympy-calculator/ Fri, 17 Sep 2021 16:00:00 GMT
117 | 为自己搭建 RSS 订阅提醒服务
118 |
119 |
120 |
121 | 缘由
122 |
123 | 自己一直苦于关注的信息源太杂, 每次想要查看新的信息, 都得打开一堆网站和 APP (如别人的博客, Github, 微博, 知乎, B站之类的). 为了改善自己的订阅体验, 在 @Mexii 的帮助下, 我开始研究如何给自己搭建一个体验良好的 RSS 订阅提醒服务.
124 | 最终的解决方案如下:
125 |
126 | Inkrss (开源项目, RSS 订阅提醒的核心, 使用免费的 Cloudflare Workers)
127 | Vercel (免费的 Serverless 云函数服务, 能够免费托管 NodeJS, Python 代码)
128 | 企业微信 Server 酱 (免费开通企业微信, 然后使用 Server 酱进行信息提醒)
129 | RssHub (为了更好的体验, 需要托管在自建的服务器中, 需要服务器)
130 |
131 | 大致效果如下:
132 |
133 |
135 |
]]> https://blog.orangex4.cool/post/inkrss-for-self/https://blog.orangex4.cool/post/inkrss-for-self/ Fri, 17 Sep 2021 16:00:00 GMT 时隔一年又一个月, 由于最近硬件价格实在是比较魔幻, 更加舍不得把我角落里吃灰已久 Orange Pi PC 2 扔掉了. 毕竟同样使用全志 H5 Soc 的 Orange Pi Zero Plus 小板现在都超过它当时的价格了.
138 | 正好最近心血来潮升级了 电烙铁, 可调电源, 万用表等一系列工具, 所以就来继续尝试看看维修. :P
139 | 维修的上一段尝试在 这里 .
140 |
141 | ]]> https://blog.lyc8503.site/2021/09/17/%E7%A1%AC%E4%BB%B6%E3%81%AE%E7%A0%94%E7%A9%B6/orange-pi-repair-2/https://blog.lyc8503.site/2021/09/17/%E7%A1%AC%E4%BB%B6%E3%81%AE%E7%A0%94%E7%A9%B6/orange-pi-repair-2/ Fri, 17 Sep 2021 07:36:51 GMT https://blog.caomingjun.com/2021/09/12/%E3%80%8A%E6%8F%90%E9%97%AE%E7%9A%84%E6%99%BA%E6%85%A7%E3%80%8B%E5%92%8C%E3%80%8A%E5%88%AB%E5%83%8F%E5%BC%B1%E6%99%BA%E4%B8%80%E6%A0%B7%E6%8F%90%E9%97%AE%E3%80%8B%E8%AF%BB%E5%90%8E%E6%84%9F/https://blog.caomingjun.com/2021/09/12/%E3%80%8A%E6%8F%90%E9%97%AE%E7%9A%84%E6%99%BA%E6%85%A7%E3%80%8B%E5%92%8C%E3%80%8A%E5%88%AB%E5%83%8F%E5%BC%B1%E6%99%BA%E4%B8%80%E6%A0%B7%E6%8F%90%E9%97%AE%E3%80%8B%E8%AF%BB%E5%90%8E%E6%84%9F/ Sun, 12 Sep 2021 15:07:04 GMT 高中期间学校要求竞赛使用的计算器是 卡西欧 991 CNX, 可是它功能太少, 很多数学计算都不能进行. 学校又不允许带手机.
144 | 于是只能转向”古老”的科学计算器, 发现了一款性价比很高的科学计算器 – HP 39gs.
145 | HP 39gs 这款机器现在某宝涨价到近 80r 了, 我当时咸鱼入手的时候只要 50r, 之前好像还只要 20-30r,
146 | HP 39gs 本身功能也不是特别多, 可能比起卡西欧只多了绘图和编程的功能.
147 | 但是 HP 39gs 和支持 CAS 的 HP 48gii 只差了按键印刷和 一块 Flash 而已. 魔改之后计算器大概就变成了一个简陋版 Matlab 了. 可玩性增强很多.
148 |
149 | ]]> https://blog.lyc8503.site/2021/09/10/%E7%A1%AC%E4%BB%B6%E3%81%AE%E7%A0%94%E7%A9%B6/hp39gs-modify/https://blog.lyc8503.site/2021/09/10/%E7%A1%AC%E4%BB%B6%E3%81%AE%E7%A0%94%E7%A9%B6/hp39gs-modify/ Fri, 10 Sep 2021 06:27:22 GMT https://blog.caomingjun.com/2021/09/09/zsh%E9%85%8D%E7%BD%AE/https://blog.caomingjun.com/2021/09/09/zsh%E9%85%8D%E7%BD%AE/ Thu, 09 Sep 2021 03:07:54 GMT https://blog.caomingjun.com/2021/09/09/%E4%B8%AA%E4%BA%BA%E5%8D%9A%E5%AE%A2%E5%BB%BA%E7%AB%8B%E8%BF%87%E7%A8%8B%E8%AE%B0%E5%BD%95/https://blog.caomingjun.com/2021/09/09/%E4%B8%AA%E4%BA%BA%E5%8D%9A%E5%AE%A2%E5%BB%BA%E7%AB%8B%E8%BF%87%E7%A8%8B%E8%AE%B0%E5%BD%95/ Thu, 09 Sep 2021 01:37:34 GMT
150 | 在提问之前
151 |
152 | 阅读《提问的智慧》 有感.
153 | 每一个人, 特别是学计算机的人, 都要学会通过 STFW 和 RTFM 独立解决问题. 这是由多方原因决定的.
]]> https://blog.orangex4.cool/post/before-asking-questions/https://blog.orangex4.cool/post/before-asking-questions/ Tue, 07 Sep 2021 16:00:00 GMT
154 | 在 Markdown 中书写伪代码
155 |
156 |
157 |
158 | 0. 想法来源
159 |
160 | 最近上算法课需要书写伪代码, 但伪代码一般都是通过 Latex 书写的, 但我又不想专门为了它去写 Latex, 所以就开始考虑如何在 Markdown 中书写伪代码.
161 | 根据 “Atwood’s Law” 原则:
162 |
163 | Any application that can be written in JavaScript, will eventually be written in JavaScript.
164 | 任何可以用 JavaScript 来写的应用, 最终都将用 JavaScript 来写.
165 |
166 | 我再次将目光投向前端, 寻找符合前端思想的解决方案.
167 | 最终我选定了 VSCode + Markdown Preview Enhanced + pseudocode.js 的组合.
168 | (缺点是不能在 VSCode 中实时预览, 这个问题的主要原因是我不想再次魔改和维护别人写的插件了.)
169 | 大概效果:
170 |
171 |
173 |
]]> https://blog.orangex4.cool/post/markdown-pseudocode/https://blog.orangex4.cool/post/markdown-pseudocode/ Thu, 02 Sep 2021 16:00:00 GMT
174 | 声明:本人不会提供任何解密lpk文件的程序。本文仅仅是技术向的探讨、经验分享。 如果您认为本文侵犯了您的权益,请联系我,我会立刻删 ...
175 | The post Live2DViewerEX 创意工坊lpk文件分析 – 动态调试Unity程序 appeared first on α-Lyrae .
176 | ]]> https://chr.fan/lpk-decrypt/https://chr.fan/lpk-decrypt/ Tue, 31 Aug 2021 20:45:13 GMT 之前设置了 ipv6 DDNS, 可以从外网访问到家里 AIO 上的 http 服务器.
179 | 由于只是自己使用, 就打算使用自签名证书. 但按照网上教程生成的证书导入 Chrome 后报错 ERR_CERT_COMMON_NAME_INVALID
, 在 OkHttp 中报错Hostname xxx is not verified.
180 | 查阅资料发现是生成的证书没有 SAN 的缘故, 网上生成 SAN 自签名证书的教程很多都有问题, 最终找到一种可行的方法, 记录在此.
181 |
182 | ]]> https://blog.lyc8503.site/2021/08/29/%E8%BD%AF%E4%BB%B6%E7%A0%94%E7%A9%B6=)/%E6%9C%8D%E5%8A%A1%E5%99%A8%E7%BB%B4%E6%8A%A4&%E9%85%8D%E7%BD%AEder%E6%97%A5%E5%B8%B8/self-signed-cert-with-san/https://blog.lyc8503.site/2021/08/29/%E8%BD%AF%E4%BB%B6%E7%A0%94%E7%A9%B6=)/%E6%9C%8D%E5%8A%A1%E5%99%A8%E7%BB%B4%E6%8A%A4&%E9%85%8D%E7%BD%AEder%E6%97%A5%E5%B8%B8/self-signed-cert-with-san/ Sun, 29 Aug 2021 06:58:09 GMT 初探 ipv6 & 群晖 ipv6 DDNS 的设置.
185 |
186 | ]]> https://blog.lyc8503.site/2021/08/24/%E4%B8%93%E9%A2%98%E5%90%91%E7%A0%94%E7%A9%B6/AllInOne%E5%AE%B6%E7%94%A8%E6%9C%8D%E5%8A%A1%E5%99%A8/9-syno-ipv6-ddns/https://blog.lyc8503.site/2021/08/24/%E4%B8%93%E9%A2%98%E5%90%91%E7%A0%94%E7%A9%B6/AllInOne%E5%AE%B6%E7%94%A8%E6%9C%8D%E5%8A%A1%E5%99%A8/9-syno-ipv6-ddns/ Tue, 24 Aug 2021 01:43:33 GMT 黑群晖不定时失联, 排查故障过程记录.
189 |
190 | ]]> https://blog.lyc8503.site/2021/08/23/%E4%B8%93%E9%A2%98%E5%90%91%E7%A0%94%E7%A9%B6/AllInOne%E5%AE%B6%E7%94%A8%E6%9C%8D%E5%8A%A1%E5%99%A8/8-syno-down-troubleshooting/https://blog.lyc8503.site/2021/08/23/%E4%B8%93%E9%A2%98%E5%90%91%E7%A0%94%E7%A9%B6/AllInOne%E5%AE%B6%E7%94%A8%E6%9C%8D%E5%8A%A1%E5%99%A8/8-syno-down-troubleshooting/ Mon, 23 Aug 2021 14:48:40 GMT Hpe Gen10+ 有点令我失望… 后闲鱼出手改用自己组装的整机.
193 |
194 | ]]> https://blog.lyc8503.site/2021/08/23/%E4%B8%93%E9%A2%98%E5%90%91%E7%A0%94%E7%A9%B6/AllInOne%E5%AE%B6%E7%94%A8%E6%9C%8D%E5%8A%A1%E5%99%A8/7-hardware-upgrade-and-diy/https://blog.lyc8503.site/2021/08/23/%E4%B8%93%E9%A2%98%E5%90%91%E7%A0%94%E7%A9%B6/AllInOne%E5%AE%B6%E7%94%A8%E6%9C%8D%E5%8A%A1%E5%99%A8/7-hardware-upgrade-and-diy/ Mon, 23 Aug 2021 04:26:52 GMT 如题. 主要是归类一些我参考的教程.
197 |
198 | ]]> https://blog.lyc8503.site/2021/08/13/%E4%B8%93%E9%A2%98%E5%90%91%E7%A0%94%E7%A9%B6/AllInOne%E5%AE%B6%E7%94%A8%E6%9C%8D%E5%8A%A1%E5%99%A8/6-software-implementation/https://blog.lyc8503.site/2021/08/13/%E4%B8%93%E9%A2%98%E5%90%91%E7%A0%94%E7%A9%B6/AllInOne%E5%AE%B6%E7%94%A8%E6%9C%8D%E5%8A%A1%E5%99%A8/6-software-implementation/ Fri, 13 Aug 2021 02:39:32 GMT 基础的 ESXi 已经装好了, 先来概括一下软件上的安排.
201 |
202 | ]]> https://blog.lyc8503.site/2021/08/12/%E4%B8%93%E9%A2%98%E5%90%91%E7%A0%94%E7%A9%B6/AllInOne%E5%AE%B6%E7%94%A8%E6%9C%8D%E5%8A%A1%E5%99%A8/5-software-configuration/https://blog.lyc8503.site/2021/08/12/%E4%B8%93%E9%A2%98%E5%90%91%E7%A0%94%E7%A9%B6/AllInOne%E5%AE%B6%E7%94%A8%E6%9C%8D%E5%8A%A1%E5%99%A8/5-software-configuration/ Thu, 12 Aug 2021 16:09:47 GMT 博客本来使用了 Netlify + 国内阿里 CDN 加速.
205 | 但没想到… Netlify 的源站实在是太慢了. 慢到返回一个 304 都能等到 504 Gateway Time-out.
206 | 既然都已经备案了, 还是要想办法让国内访问快一点.
207 | 所以打算利用 Github Actions 将网站再部署到 OSS 上, 再用 CDN 加速.
208 | 同时由于国内评论发表需要审核, 使用 Valine (Valine-Admin) 替换了 Gitalk, 支持手动审核.
209 |
210 | ]]> https://blog.lyc8503.site/2021/08/12/%E8%BD%AF%E4%BB%B6%E7%A0%94%E7%A9%B6=)/%E6%9C%8D%E5%8A%A1%E5%99%A8%E7%BB%B4%E6%8A%A4&%E9%85%8D%E7%BD%AEder%E6%97%A5%E5%B8%B8/hexo-on-oss/https://blog.lyc8503.site/2021/08/12/%E8%BD%AF%E4%BB%B6%E7%A0%94%E7%A9%B6=)/%E6%9C%8D%E5%8A%A1%E5%99%A8%E7%BB%B4%E6%8A%A4&%E9%85%8D%E7%BD%AEder%E6%97%A5%E5%B8%B8/hexo-on-oss/ Thu, 12 Aug 2021 15:56:44 GMT
--------------------------------------------------------------------------------
/web/src/App.vue:
--------------------------------------------------------------------------------
1 |
7 |
8 |
9 |
21 |
22 |
23 |
24 |
29 |
30 |
31 |
40 |
41 |
42 |
43 |
55 |
56 |
59 |
--------------------------------------------------------------------------------
/web/src/assets/base.css:
--------------------------------------------------------------------------------
1 | body {
2 | margin: 0;
3 | overflow-x: hidden;
4 | color: #2c323c;
5 | background-color: #f6f6f6;
6 | font-family: 'PingFang SC', 'Microsoft YaHei', sans-serif, Arial;
7 | }
8 |
9 | html body table td, html body table th {
10 | border: 1px solid #d6d6d6;
11 | padding: 6px 13px;
12 | }
13 |
14 | html body table th {
15 | font-weight: bold;
16 | color: #000;
17 | }
18 |
19 | td {
20 | display: table-cell;
21 | vertical-align: inherit;
22 | }
23 |
24 | th {
25 | display: table-cell;
26 | vertical-align: inherit;
27 | font-weight: bold;
28 | text-align: -internal-center;
29 | }
30 |
31 | thead {
32 | display: table-header-group;
33 | vertical-align: middle;
34 | border-color: inherit;
35 | }
36 |
37 | html body table {
38 | margin: 10px 0 15px 0;
39 | border-collapse: collapse;
40 | border-spacing: 0;
41 | display: block;
42 | width: 100%;
43 | overflow: auto;
44 | word-break: normal;
45 | word-break: keep-all;
46 | }
47 |
48 | blockquote {
49 | margin: 20px auto;
50 | color: #555555;
51 | padding: 3px 3px 3px 12px;
52 | border-left: 8px solid #84b3ff;
53 | position: relative;
54 | background: #f0f0f0;
55 | }
56 |
57 | code {
58 | font-family: Menlo,Monaco,Consolas,'Courier New',monospace;
59 | background-color: #f0f0f0;
60 | border-radius: 3px;
61 | padding: 3px;
62 | }
63 |
64 | pre code {
65 | background-color: transparent;
66 | }
67 |
68 | img {
69 | max-width: 100%;
70 | max-height: 100%;
71 | object-fit: cover;
72 | }
73 |
74 | ::-webkit-scrollbar {
75 | width: 5px;
76 | background-color: transparent;
77 | }
78 |
79 | ::-webkit-scrollbar-track {
80 | border-radius: 5px;
81 | margin: 5px 0;
82 | background-color: transparent;
83 | }
84 |
85 | ::-webkit-scrollbar-thumb {
86 | border-radius: 5px;
87 | background-color: rgba(175, 175, 175, 0.75);
88 | }
89 |
90 | ::-webkit-scrollbar-thumb:hover {
91 | border-radius: 5px;
92 | background-color: rgba(100, 100, 100, 0.85);
93 | }
94 |
95 | a {
96 | color: #3273dc;
97 | text-decoration: none;
98 | }
99 |
100 | a:hover {
101 | color: #2c323c;
102 | }
103 |
104 | #logo-left {
105 | flex-grow: 1;
106 | display: flex;
107 | align-items: center;
108 | }
109 |
110 | #logo-right {
111 | display: flex;
112 | align-items: center;
113 | padding-right: 5px;
114 | }
115 |
116 | #logo {
117 | height: 35px;
118 | width: 35px;
119 | }
120 |
121 | #logo-github {
122 | height: 30px;
123 | width: 30px;
124 | }
125 |
126 | #logo-text {
127 | padding: 0 10px;
128 | color: #444950;
129 | font-size: large;
130 | font-weight: bold;
131 | }
132 |
133 | #header {
134 | -webkit-box-shadow: 0 1px 3px rgb(18 18 18 / 10%);
135 | box-shadow: 0 1px 3px rgb(18 18 18 / 10%);
136 | z-index: 100;
137 | overflow: hidden;
138 | background: #fff;
139 | margin-bottom: 20px;
140 | }
141 |
142 | #header-inner {
143 | width: 1200px;
144 | padding-left: 30px;
145 | height: 50px;
146 | margin: auto;
147 | display: flex;
148 | align-items: center;
149 | }
150 |
151 | #container {
152 | margin: auto;
153 | width: 1200px;
154 | overflow: hidden;
155 | }
156 |
157 | #main {
158 | float: left;
159 | width: 70%;
160 | }
161 |
162 | #sidebar {
163 | -webkit-box-shadow: 0 1px 3px rgb(18 18 18 / 10%);
164 | box-shadow: 0 1px 3px rgb(18 18 18 / 10%);
165 | border-radius: 5px;
166 | background-color: #fff;
167 | float: right;
168 | width: 30%;
169 | }
170 |
171 | #sidebar-content {
172 | margin: 20px 30px;
173 | }
174 |
175 | /* 适配窄框 */
176 | @media (max-width: 1200px) {
177 |
178 | #container {
179 | width: 100%;
180 | }
181 |
182 | #header-inner {
183 | width: 100%;
184 | }
185 |
186 | #logo-right {
187 | padding-right: 45px;
188 | }
189 |
190 | #main {
191 | float: none;
192 | width: auto;
193 | }
194 |
195 | #sidebar {
196 | float: none;
197 | display: none;
198 | }
199 | }
200 |
201 |
--------------------------------------------------------------------------------
/web/src/assets/data.json:
--------------------------------------------------------------------------------
1 | [
2 | {
3 | "name": "OrangeX4's Blog",
4 | "xmlUrl": "https://orangex4.cool/atom.xml",
5 | "htmlUrl": "https://orangex4.cool/",
6 | "title": "为 Hexo 博客中的 Markdown 添加卡片式链接支持",
7 | "link": "https://blog.orangex4.cool/post/hexo-link-card/",
8 | "summary": "\n 为 Hexo 博客中的 Markdown 添加卡片式链接支持 \n \n我写了一个 Hexo 插件 ,可以使用现有 Markdown 语法将链接转换为卡片式链接(网页卡片).
\n这个插件的 GitHub 地址在这里:
\nOrangeX4/hexo-link-card - GitHub https://github.com/OrangeX4/hexo-link-card
\n卡片式链接的优点:
\n\n在移动互联网的时代,有许多人通过智能手机浏览文章,通过卡片式链接打开新页面对他们更友好; \n旧式的链接显示方式不够明显,很容易导致人们忽视了这是一条链接,卡片式链接能够突出显示,不容易被他人忽略; \n许多平台,例如 Bilibili,知乎,微信公众号等平台,均有将链接转换为卡片式链接的功能,如果能在书写 Markdown 阶段,就将卡片式链接的书写考虑进去,能给后续发布带来很大的便利。 \n ",
9 | "pubDate": "2022-02-09T16:00:00.000Z",
10 | "pubDateYYMMDD": "2022-02-09"
11 | },
12 | {
13 | "name": "OrangeX4's Blog",
14 | "xmlUrl": "https://orangex4.cool/atom.xml",
15 | "htmlUrl": "https://orangex4.cool/",
16 | "title": "VSCode 通过 Remote - SSH 远程连接腾讯云服务器",
17 | "link": "https://blog.orangex4.cool/post/cloud-server-in-vscode-ssh/",
18 | "summary": "\n VSCode 通过 Remote - SSH 远程连接腾讯云服务器 \n \n每当我切换到一个新环境,例如新电脑、新系统时,总是会忘记如何配置 VSCode 中的 Remote - SSH,也就很难连上腾讯云服务器进行开发。
\n所以我特意将配置的步骤写成一篇博文,记录如下。
\n\n \n
",
19 | "pubDate": "2022-02-07T16:00:00.000Z",
20 | "pubDateYYMMDD": "2022-02-07"
21 | },
22 | {
23 | "name": "Cmj's Blog",
24 | "xmlUrl": "https://blog.caomingjun.com/atom.xml",
25 | "htmlUrl": "https://blog.caomingjun.com/",
26 | "title": "Cloudflare Tunnel 速度测试",
27 | "link": "https://blog.caomingjun.com/cloudflare-tunnel-speedtest/",
28 | "summary": "2021年4月,Cloudflare 宣布其旗下的服务 Cloudflare Tunnel 免费开放 。Cloudflare Tunnel 可以在服务器和 Cloudflare 全球网络之间建立连接,使得服务器在不打开任何防火墙入站规则(甚至可以没有公网IP)的情况下得以被公网访问。这一技术可以应用于内网穿透、保护服务器安全性等领域。
\n网络上已经有很多关于 Cloudflare Tunnel 的使用教程,但截至本文章发布,我并没有找到延迟和速度测试。因此我自己分别对上海和香港的服务器进行了测试并发布在这里。
",
29 | "pubDate": "2022-02-06T11:23:00.000Z",
30 | "pubDateYYMMDD": "2022-02-06"
31 | },
32 | {
33 | "name": "Idealclover's Blog",
34 | "xmlUrl": "https://idealclover.top/feed",
35 | "htmlUrl": "https://idealclover.top/",
36 | "title": "Pico Neo 3 开箱体验 - XR 或许已经走出了最低谷",
37 | "link": "https://idealclover.top/archives/630/",
38 | "summary": "“字节跳动 50 亿元收购 pico,宣布进军元宇宙”这成为了同事,会不会给点优惠啊,翠翠这么想着,结果就有了内部员工福利——原来 2599 的 Pico Neo 3 只要 1599,甚至到手写...",
39 | "pubDate": "2022-02-04T11:30:00.000Z",
40 | "pubDateYYMMDD": "2022-02-04"
41 | },
42 | {
43 | "name": "Typoverflow's Blog",
44 | "xmlUrl": "https://blog.typoverflow.me/index.php/feed/",
45 | "htmlUrl": "https://blog.typoverflow.me/",
46 | "title": "杂记 | 2021年终总结",
47 | "link": "https://blog.typoverflow.me/index.php/archives/34/",
48 | "summary": "写在前面在2021年最后的那一个月里,开始重新打理自己的博客,也终于有时间好好思考一下过去的一年自己做了些什么事。总感觉2020年年初开始时间真的过得飞快,也不知道到底是因为生活到了一定的阶段后...",
49 | "pubDate": "2022-01-26T13:42:00.000Z",
50 | "pubDateYYMMDD": "2022-01-26"
51 | },
52 | {
53 | "name": "Cmj's Blog",
54 | "xmlUrl": "https://blog.caomingjun.com/atom.xml",
55 | "htmlUrl": "https://blog.caomingjun.com/",
56 | "title": "2021折腾总结",
57 | "link": "https://blog.caomingjun.com/my2021/",
58 | "summary": "在刚刚过去的 2021 年,我在课内课外都折腾了不少东西(主要是在下半年)。其实这其中的许多东西都值得写一篇博客记录,但是我自从创建网站之后就比较忙,没有写,于是在这篇文章做一个总结。可能未来会补上那些博客。
",
59 | "pubDate": "2022-01-23T11:36:40.000Z",
60 | "pubDateYYMMDD": "2022-01-23"
61 | },
62 | {
63 | "name": "lyc8503's Blog",
64 | "xmlUrl": "https://blog.lyc8503.site/atom.xml",
65 | "htmlUrl": "https://blog.lyc8503.site/",
66 | "title": "AIO Ep10. 使用群晖 QuickConnect 访问内网任意 / 第三方 TCP 服务",
67 | "link": "https://blog.lyc8503.site/2022/01/21/%E4%B8%93%E9%A2%98%E5%90%91%E7%A0%94%E7%A9%B6/AllInOne%E5%AE%B6%E7%94%A8%E6%9C%8D%E5%8A%A1%E5%99%A8/10-all-in-quickconnect/",
68 | "summary": "\n \n 群晖的 QuickConnect 是群晖自带的一项内网穿透功能, 通过某宝的洗白服务, 自建的黑群晖也可以使用 QuickConnect 来进行内网穿透.
\nQuickConnect 与群晖自家的应用搭配使用很方便, 可以实现内外网的无缝切换 , 只需要填入 QuickConnect ID 即可.
\n但缺点 是 QuickConnect 功能只能在群晖官方的 APP 上使用, 而群晖的很多 APP 实际使用体验很差, 缺失很多最基本的功能.
\nAIO Ep.9 中提到了使用 ipv6 DDNS 的方式, 这篇有关 n1 盒子的文章 中展示了配置透明代理访问内网任意服务的方式. 但这种方法在目前 ipv6 尚未全面普及 的时候仍有不便.(很多 Wi-Fi 不支持或默认未开启 ipv6, 必须使用热点共享.)
\n最终经过搜索和实验我找到了使用 QuickConnect 代理所有应用流量的方法, 可以节约自己搭建反向代理或购买反向代理的费用.(白嫖到榨干它) 整理记录在此.
\n \n ",
69 | "pubDate": "2022-01-21T15:18:34.000Z",
70 | "pubDateYYMMDD": "2022-01-21"
71 | },
72 | {
73 | "name": "lyc8503's Blog",
74 | "xmlUrl": "https://blog.lyc8503.site/atom.xml",
75 | "htmlUrl": "https://blog.lyc8503.site/",
76 | "title": "关于 SOP(同源策略) / CORS(跨源资源共享) / CSRF(跨站请求伪造) 的一些认识",
77 | "link": "https://blog.lyc8503.site/2022/01/20/%E5%AD%A6%E4%B9%A0%E6%97%A5%E8%AE%B0/Web/cors-and-csrf/",
78 | "summary": "\n \n 同源策略 是指在Web浏览器 中,允许某个网页脚本 访问另一个网页的数据,但前提是这两个网页必须有相同的URI 、主机名 和端口号 ,一旦两个网站满足上述条件,这两个网站就被认定为具有相同来源。此策略可防止某个网页上的恶意脚本 通过该页面的文档对象模型 访问另一网页上的敏感数据。
\n跨域资源共享 (英语:Cross-origin resource sharing,缩写:CORS),用于让网页的受限资源能够被其他域名的页面访问的一种机制。
\n跨站请求伪造 (英语:Cross-site request forgery),也被称为 one-click attack 或者 session riding ,通常缩写为 CSRF 或者 XSRF , 是一种挟制用户在当前已登录的Web应用程序上执行非本意的操作的攻击方法。
\n \n ",
79 | "pubDate": "2022-01-20T03:54:55.000Z",
80 | "pubDateYYMMDD": "2022-01-20"
81 | },
82 | {
83 | "name": "lyc8503's Blog",
84 | "xmlUrl": "https://blog.lyc8503.site/atom.xml",
85 | "htmlUrl": "https://blog.lyc8503.site/",
86 | "title": "Windows 下的实用工具 PowerToys 推荐",
87 | "link": "https://blog.lyc8503.site/2022/01/20/%E6%9D%82%E4%B8%83%E6%9D%82%E5%85%AB0w0/windows-powertoys/",
88 | "summary": "\n \n 来安利一下这个非常强大的软件 PowerToys.
\nPowerToys 是微软官方和开源社区共同维护的一组实用工具.
\n包含了 Explorer markdown/pdf/svg 预览, 屏幕取色, PowerToys Run(快速启动), 正则文件重命名, 快捷键映射, 图像大小调整, 快速定位鼠标, 保持唤醒等一系列十分实用的功能.
\n \n ",
89 | "pubDate": "2022-01-20T03:38:25.000Z",
90 | "pubDateYYMMDD": "2022-01-20"
91 | },
92 | {
93 | "name": "Typoverflow's Blog",
94 | "xmlUrl": "https://blog.typoverflow.me/index.php/feed/",
95 | "htmlUrl": "https://blog.typoverflow.me/",
96 | "title": "2022的Flags",
97 | "link": "https://blog.typoverflow.me/index.php/archives/32/",
98 | "summary": "可惜第一个月就开始摸了[goal title=\"在学\"][item progress=\"1%\"] cpp guidelines [/item][item progress=\"41%\"] cs14...",
99 | "pubDate": "2022-01-15T05:21:00.000Z",
100 | "pubDateYYMMDD": "2022-01-15"
101 | },
102 | {
103 | "name": "Antares's Blog",
104 | "xmlUrl": "https://chr.fan/feed",
105 | "htmlUrl": "https://chr.fan",
106 | "title": "高速旋转球体的物理动画模拟(虚幻4实现)",
107 | "link": "https://chr.fan/ue4-ball/",
108 | "summary": "\nGitHub仓库 地址 前几天突发奇想,虚幻4里有没有办法模拟出乒乓球在真实世界的运动规律呢(比如下旋的回弹,上旋加速等)? 据我 ...
\nThe post 高速旋转球体的物理动画模拟(虚幻4实现) appeared first on α-Lyrae .
\n",
109 | "pubDate": "2022-01-01T15:36:33.000Z",
110 | "pubDateYYMMDD": "2022-01-01"
111 | },
112 | {
113 | "name": "Antares's Blog",
114 | "xmlUrl": "https://chr.fan/feed",
115 | "htmlUrl": "https://chr.fan",
116 | "title": "GAMES101学习笔记",
117 | "link": "https://chr.fan/games101/",
118 | "summary": "\nGAMES101课后作业仓库 博客的LaTeX支持真的差得离谱……符号过大,格式也不太好看,可能以后会比较少在博客上写数学相关的东 ...
\nThe post GAMES101学习笔记 appeared first on α-Lyrae .
\n",
119 | "pubDate": "2022-01-01T15:27:59.000Z",
120 | "pubDateYYMMDD": "2022-01-01"
121 | },
122 | {
123 | "name": "Typoverflow's Blog",
124 | "xmlUrl": "https://blog.typoverflow.me/index.php/feed/",
125 | "htmlUrl": "https://blog.typoverflow.me/",
126 | "title": "观影记录",
127 | "link": "https://blog.typoverflow.me/index.php/archives/14/",
128 | "summary": "观影记录",
129 | "pubDate": "2021-12-26T15:59:00.000Z",
130 | "pubDateYYMMDD": "2021-12-26"
131 | },
132 | {
133 | "name": "Typoverflow's Blog",
134 | "xmlUrl": "https://blog.typoverflow.me/index.php/feed/",
135 | "htmlUrl": "https://blog.typoverflow.me/",
136 | "title": "南大印象",
137 | "link": "https://blog.typoverflow.me/index.php/archives/4/",
138 | "summary": "南大印象",
139 | "pubDate": "2021-12-25T08:53:00.000Z",
140 | "pubDateYYMMDD": "2021-12-25"
141 | },
142 | {
143 | "name": "LadderOperator's Blog",
144 | "xmlUrl": "https://ladderoperator.top/index.xml",
145 | "htmlUrl": "https://ladderoperator.top",
146 | "title": "从 Wordpress 切换至 Hugo",
147 | "link": "https://ladderoperator.top/post/hello_hugo/",
148 | "summary": "由于某次 Wordpress 差点崩没了的经历,细思恐极,觉得文章应该有个比较好的备份模式。故 (花了快半年) 决定切换到 Hugo! 这也是我的第",
149 | "pubDate": "2021-12-13T00:00:00.000Z",
150 | "pubDateYYMMDD": "2021-12-13"
151 | },
152 | {
153 | "name": "lyc8503's Blog",
154 | "xmlUrl": "https://blog.lyc8503.site/atom.xml",
155 | "htmlUrl": "https://blog.lyc8503.site/",
156 | "title": "H110m + QNCT 的 OpenCore MacOS Big Sur 黑苹果尝试",
157 | "link": "https://blog.lyc8503.site/2021/11/29/%E8%BD%AF%E4%BB%B6%E7%A0%94%E7%A9%B6=)/%E5%85%B6%E4%BB%96/hackintosh-1/",
158 | "summary": "\n \n 0x00 前言 去年苹果发布了搭载 M1 芯片的 MacBook, 随后新一代的 Mac mini 和 iMac 也使用了 Arm 架构的 M1 芯片. M1 Pro 和 M1 Max 让 M1 完全取代 Intel 芯片成为可能.
\n目前的趋势是 M1 将会全面取代 x86 的 Intel CPU, 在技术层面上黑苹果会困难到几乎不可能. 同时黑苹果的价格优势也变得不再显著. 可能不过几年, “黑苹果”的技术就会淹没在历史的潮流中.
\n所以趁着这最后的辉煌, 我也来尝试体验一下 Hackintosh.
\n \n ",
159 | "pubDate": "2021-11-29T01:26:37.000Z",
160 | "pubDateYYMMDD": "2021-11-29"
161 | },
162 | {
163 | "name": "lyc8503's Blog",
164 | "xmlUrl": "https://blog.lyc8503.site/atom.xml",
165 | "htmlUrl": "https://blog.lyc8503.site/",
166 | "title": "Windows 下 TUN 全局透明代理的设置",
167 | "link": "https://blog.lyc8503.site/2021/11/17/%E8%BD%AF%E4%BB%B6%E7%A0%94%E7%A9%B6=)/%E5%85%B6%E4%BB%96/configuring-tun/",
168 | "summary": "\n \n 某些 Windows 系统内置的应用, 比如 SMB 或者 RDP, 不能设置 Socks5 代理.
\n这样如果希望在公网上访问到家里服务器的 SMB 文件共享就不太方便了.
\n还有一些应用 (比如 QQ / git) 不会默认使用系统代理, 需要手动设置, 也相对比较麻烦.
\n上一篇文章中基于软路由网关的透明代理模式可以解决这种问题.
\n可是笔记本不是只在一个固定的路由器下使用, 而需要携带到不同的网络环境下使用时, 设置基于 TUN 的全局代理 则会更加方便.
\n \n ",
169 | "pubDate": "2021-11-17T12:15:09.000Z",
170 | "pubDateYYMMDD": "2021-11-17"
171 | },
172 | {
173 | "name": "Antares's Blog",
174 | "xmlUrl": "https://chr.fan/feed",
175 | "htmlUrl": "https://chr.fan",
176 | "title": "Arch踩坑记录",
177 | "link": "https://chr.fan/arch%e8%b8%a9%e5%9d%91%e8%ae%b0%e5%bd%95/",
178 | "summary": "\n不定期更新遇到的新问题,仅做记录,仅限我的笔记本上可以如下解决问题 无声音,No input or output devices ...
\nThe post Arch踩坑记录 appeared first on α-Lyrae .
\n",
179 | "pubDate": "2021-10-23T09:49:36.000Z",
180 | "pubDateYYMMDD": "2021-10-23"
181 | },
182 | {
183 | "name": "Cmj's Blog",
184 | "xmlUrl": "https://blog.caomingjun.com/atom.xml",
185 | "htmlUrl": "https://blog.caomingjun.com/",
186 | "title": "解决Android Studio下flutter使用签名构建失败的问题",
187 | "link": "https://blog.caomingjun.com/2021/10/14/%E8%A7%A3%E5%86%B3Android-Studio%E4%B8%8Bflutter%E4%BD%BF%E7%94%A8%E7%AD%BE%E5%90%8D%E6%9E%84%E5%BB%BA%E5%A4%B1%E8%B4%A5%E7%9A%84%E9%97%AE%E9%A2%98/",
188 | "summary": "解决Android Studio下flutter使用签名构建失败的问题",
189 | "pubDate": "2021-10-14T02:53:58.000Z",
190 | "pubDateYYMMDD": "2021-10-14"
191 | },
192 | {
193 | "name": "lyc8503's Blog",
194 | "xmlUrl": "https://blog.lyc8503.site/atom.xml",
195 | "htmlUrl": "https://blog.lyc8503.site/",
196 | "title": "N1 盒子刷 Armbian 配置为软路由 & AP 方案记录",
197 | "link": "https://blog.lyc8503.site/2021/09/30/%E7%A1%AC%E4%BB%B6%E3%81%AE%E7%A0%94%E7%A9%B6/phicomm-n1/",
198 | "summary": "\n \n 每一场泡沫破碎的背后, 是一茬韭菜的哭泣, 更是一群垃圾佬的狂欢(大雾)~~
\n \n ",
199 | "pubDate": "2021-09-30T05:52:22.000Z",
200 | "pubDateYYMMDD": "2021-09-30"
201 | },
202 | {
203 | "name": "Cmj's Blog",
204 | "xmlUrl": "https://blog.caomingjun.com/atom.xml",
205 | "htmlUrl": "https://blog.caomingjun.com/",
206 | "title": "用python编写网页更新提醒程序",
207 | "link": "https://blog.caomingjun.com/2021/09/29/%E7%94%A8python%E7%BC%96%E5%86%99%E7%BD%91%E9%A1%B5%E6%9B%B4%E6%96%B0%E6%8F%90%E9%86%92%E7%A8%8B%E5%BA%8F/",
208 | "summary": "用python编写网页更新提醒程序,在HTML、RSS、网盘分享链接更新时提醒",
209 | "pubDate": "2021-09-29T07:16:56.000Z",
210 | "pubDateYYMMDD": "2021-09-29"
211 | },
212 | {
213 | "name": "Cmj's Blog",
214 | "xmlUrl": "https://blog.caomingjun.com/atom.xml",
215 | "htmlUrl": "https://blog.caomingjun.com/",
216 | "title": "urllib3 1.26与代理冲突问题解决",
217 | "link": "https://blog.caomingjun.com/2021/09/28/urllib3-1-26%E4%B8%8E%E4%BB%A3%E7%90%86%E5%86%B2%E7%AA%81%E9%97%AE%E9%A2%98%E8%A7%A3%E5%86%B3/",
218 | "summary": "python出现ValueError: check_hostname requires server_hostname,如何在不回退urllib3且保持代理打开的情况下解决问题?",
219 | "pubDate": "2021-09-28T03:19:59.000Z",
220 | "pubDateYYMMDD": "2021-09-28"
221 | },
222 | {
223 | "name": "lyc8503's Blog",
224 | "xmlUrl": "https://blog.lyc8503.site/atom.xml",
225 | "htmlUrl": "https://blog.lyc8503.site/",
226 | "title": "电子手写笔记解决方案 - iPlay 30(附刷机过程)",
227 | "link": "https://blog.lyc8503.site/2021/09/27/%E6%9D%82%E4%B8%83%E6%9D%82%E5%85%AB0w0/iplay30-handwriting/",
228 | "summary": "\n \n 开始读大学, 准备寻找一种电子手写笔记的解决方案~
\n简单搜索了一下, 找到了以下几种方案.
\n\n手写之后拍照上传
\n优点: 无需专用设备, 书写手感好, 几乎无成本. 缺点: 麻烦低效, 要携带纸笔.
\n \n数位板
\n优点: 低成本, 低延时. 缺点: 手眼不同步. 携带电脑和板, 重.
\n \n数位屏
\n优点: 看着屏写, 手眼同步, 低延时. 缺点: 携带电脑和屏, 重. 数位屏较贵.
\n \n支持手写笔的平板
\n优点: 手眼同步, 课后平板还能用于其他用处. 缺点: 手写延时高, 贵.
\n \n普通平板加被动电容笔
\n优点: 便宜的一塌糊涂. 缺点: 基本就是垃圾.
\n \n \n \n ",
229 | "pubDate": "2021-09-27T02:58:31.000Z",
230 | "pubDateYYMMDD": "2021-09-27"
231 | },
232 | {
233 | "name": "OrangeX4's Blog",
234 | "xmlUrl": "https://orangex4.cool/atom.xml",
235 | "htmlUrl": "https://orangex4.cool/",
236 | "title": "简单方便, 在 VSCode 中使用 Latex 公式和 Python 进行科学计算",
237 | "link": "https://blog.orangex4.cool/post/latex-sympy-calculator/",
238 | "summary": "\n 简单方便, 在 VSCode 中使用 Latex 公式和 Python 进行科学计算 \n \n\n \n 简介 \n \nLatex Sympy Calculator 是一款 VSCode 插件, 它能够帮助你在 VSCode 写 Latex 或 Markdown 的时候, 一键计算 Latex 书写的数学公式.
\n\n \n
\n当前支持的功能:
\n\n算术: 加 (+), 减 (-), 点乘 (·), 叉乘 (×), 除法 (/), 乘方 (^), 绝对值 (|x|), 开方 (√), 虚数 (i)… \n字母表: 英文字母 a - z, A - Z, 希腊字母 α - ω, 下标 (x_1), 重音符 (ā)… \n常见函数: 最大公约数 (gcd), 最小公倍数 (lcm), 下界 (floor), 上届 (ceil), 最大值 (max), 最小值 (min), 取对数 (log), 自然对数 (ln), 指数 (exp), 三角函数 (sin, cos, tan, csc, sec, cot, arcsin, sinh, arsinh)… \n微积分: 求极限 (l i m n → ∞ lim_{n\\to\\infty} l i m n → ∞ ), 求导/求微分 (d d x ( x 2 + x ) \\frac{d}{dx}(x^2+x) d x d ( x 2 + x ) ), 求积分 (∫ x d x \\int xdx ∫ x d x )… \n线性代数: 矩阵 (Matrix), 行列式 (Determinant), 转置 (Transpose), 求逆 (Inverse), 初等变换 (Elementary Transformation)… \n关系符: 大于 (>), 小于 (<), 大于等于 (≥), 小于等于 (≤), 相等 (=)… \n其他: 二项式… \n \n当然, 实际上还有很多其他的功能, 只要是 Python Sympy 包支持的运算, 都可以通过这个插件来实现 .
\n通过这个插件, 你就不再需要一字一句地将 Latex 转译成其他语言, 然后用 Matlab 或 MMA 等数学软件进行科学计算了. 简单的 符号推导 , 矩阵运算 , 微积分 , 科学计算 , 完全可以利用这个插件来实现.
\n如果你也在 VSCode 中用 Latex 或 Markdown 写数学公式, 那么这就是你 必备的 VSCode 科学计算插件 .
\n插件的 GitHub 页面 .
\nlatex2sympy2 包的 Github 页面 .
",
239 | "pubDate": "2021-09-17T16:00:00.000Z",
240 | "pubDateYYMMDD": "2021-09-17"
241 | },
242 | {
243 | "name": "OrangeX4's Blog",
244 | "xmlUrl": "https://orangex4.cool/atom.xml",
245 | "htmlUrl": "https://orangex4.cool/",
246 | "title": "为自己搭建 RSS 订阅提醒服务",
247 | "link": "https://blog.orangex4.cool/post/inkrss-for-self/",
248 | "summary": "\n \n\n \n 缘由 \n \n自己一直苦于关注的信息源太杂, 每次想要查看新的信息, 都得打开一堆网站和 APP (如别人的博客, Github, 微博, 知乎, B站之类的). 为了改善自己的订阅体验, 在 @Mexii 的帮助下, 我开始研究如何给自己搭建一个体验良好的 RSS 订阅提醒服务.
\n最终的解决方案如下:
\n\nInkrss (开源项目, RSS 订阅提醒的核心, 使用免费的 Cloudflare Workers) \nVercel (免费的 Serverless 云函数服务, 能够免费托管 NodeJS, Python 代码) \n企业微信 Server 酱 (免费开通企业微信, 然后使用 Server 酱进行信息提醒) \nRssHub (为了更好的体验, 需要托管在自建的服务器中, 需要服务器) \n \n大致效果如下:
\n\n \n
",
249 | "pubDate": "2021-09-17T16:00:00.000Z",
250 | "pubDateYYMMDD": "2021-09-17"
251 | },
252 | {
253 | "name": "lyc8503's Blog",
254 | "xmlUrl": "https://blog.lyc8503.site/atom.xml",
255 | "htmlUrl": "https://blog.lyc8503.site/",
256 | "title": "尝试自己动手维修坏掉的 Orange Pi~ Part. 2",
257 | "link": "https://blog.lyc8503.site/2021/09/17/%E7%A1%AC%E4%BB%B6%E3%81%AE%E7%A0%94%E7%A9%B6/orange-pi-repair-2/",
258 | "summary": "\n \n 时隔一年又一个月, 由于最近硬件价格实在是比较魔幻, 更加舍不得把我角落里吃灰已久 Orange Pi PC 2 扔掉了. 毕竟同样使用全志 H5 Soc 的 Orange Pi Zero Plus 小板现在都超过它当时的价格了.
\n正好最近心血来潮升级了 电烙铁, 可调电源, 万用表等一系列工具, 所以就来继续尝试看看维修. :P
\n维修的上一段尝试在 这里 .
\n \n ",
259 | "pubDate": "2021-09-17T07:36:51.000Z",
260 | "pubDateYYMMDD": "2021-09-17"
261 | },
262 | {
263 | "name": "Cmj's Blog",
264 | "xmlUrl": "https://blog.caomingjun.com/atom.xml",
265 | "htmlUrl": "https://blog.caomingjun.com/",
266 | "title": "《提问的智慧》和《别像弱智一样提问》读后感",
267 | "link": "https://blog.caomingjun.com/2021/09/12/%E3%80%8A%E6%8F%90%E9%97%AE%E7%9A%84%E6%99%BA%E6%85%A7%E3%80%8B%E5%92%8C%E3%80%8A%E5%88%AB%E5%83%8F%E5%BC%B1%E6%99%BA%E4%B8%80%E6%A0%B7%E6%8F%90%E9%97%AE%E3%80%8B%E8%AF%BB%E5%90%8E%E6%84%9F/",
268 | "summary": "计算机系统基础课的实验课要求阅读《提问的智慧》和《别像弱智一样提问》这两篇文章,并写一篇不少于800字的读后感。作为记录,我把读后感也发在博客里。",
269 | "pubDate": "2021-09-12T15:07:04.000Z",
270 | "pubDateYYMMDD": "2021-09-12"
271 | },
272 | {
273 | "name": "lyc8503's Blog",
274 | "xmlUrl": "https://blog.lyc8503.site/atom.xml",
275 | "htmlUrl": "https://blog.lyc8503.site/",
276 | "title": "Hp 39gs 图形科学计算器硬件魔改 48gii 小记",
277 | "link": "https://blog.lyc8503.site/2021/09/10/%E7%A1%AC%E4%BB%B6%E3%81%AE%E7%A0%94%E7%A9%B6/hp39gs-modify/",
278 | "summary": "\n \n 高中期间学校要求竞赛使用的计算器是 卡西欧 991 CNX, 可是它功能太少, 很多数学计算都不能进行. 学校又不允许带手机.
\n于是只能转向”古老”的科学计算器, 发现了一款性价比很高的科学计算器 – HP 39gs.
\nHP 39gs 这款机器现在某宝涨价到近 80r 了, 我当时咸鱼入手的时候只要 50r, 之前好像还只要 20-30r,
\nHP 39gs 本身功能也不是特别多, 可能比起卡西欧只多了绘图和编程的功能.
\n但是 HP 39gs 和支持 CAS 的 HP 48gii 只差了按键印刷和 一块 Flash 而已. 魔改之后计算器大概就变成了一个简陋版 Matlab 了. 可玩性增强很多.
\n \n ",
279 | "pubDate": "2021-09-10T06:27:22.000Z",
280 | "pubDateYYMMDD": "2021-09-10"
281 | },
282 | {
283 | "name": "Cmj's Blog",
284 | "xmlUrl": "https://blog.caomingjun.com/atom.xml",
285 | "htmlUrl": "https://blog.caomingjun.com/",
286 | "title": "zsh配置",
287 | "link": "https://blog.caomingjun.com/2021/09/09/zsh%E9%85%8D%E7%BD%AE/",
288 | "summary": "我的zsh配置",
289 | "pubDate": "2021-09-09T03:07:54.000Z",
290 | "pubDateYYMMDD": "2021-09-09"
291 | },
292 | {
293 | "name": "Cmj's Blog",
294 | "xmlUrl": "https://blog.caomingjun.com/atom.xml",
295 | "htmlUrl": "https://blog.caomingjun.com/",
296 | "title": "个人博客建立过程记录",
297 | "link": "https://blog.caomingjun.com/2021/09/09/%E4%B8%AA%E4%BA%BA%E5%8D%9A%E5%AE%A2%E5%BB%BA%E7%AB%8B%E8%BF%87%E7%A8%8B%E8%AE%B0%E5%BD%95/",
298 | "summary": "基于Hexo+Github+Cloudflare Pages建立个人博客",
299 | "pubDate": "2021-09-09T01:37:34.000Z",
300 | "pubDateYYMMDD": "2021-09-09"
301 | },
302 | {
303 | "name": "OrangeX4's Blog",
304 | "xmlUrl": "https://orangex4.cool/atom.xml",
305 | "htmlUrl": "https://orangex4.cool/",
306 | "title": "在提问之前",
307 | "link": "https://blog.orangex4.cool/post/before-asking-questions/",
308 | "summary": "\n 在提问之前 \n \n阅读《提问的智慧》 有感.
\n每一个人, 特别是学计算机的人, 都要学会通过 STFW 和 RTFM 独立解决问题. 这是由多方原因决定的.
",
309 | "pubDate": "2021-09-07T16:00:00.000Z",
310 | "pubDateYYMMDD": "2021-09-07"
311 | },
312 | {
313 | "name": "OrangeX4's Blog",
314 | "xmlUrl": "https://orangex4.cool/atom.xml",
315 | "htmlUrl": "https://orangex4.cool/",
316 | "title": "在 Markdown 中书写伪代码",
317 | "link": "https://blog.orangex4.cool/post/markdown-pseudocode/",
318 | "summary": "\n 在 Markdown 中书写伪代码 \n \n\n \n 0. 想法来源 \n \n最近上算法课需要书写伪代码, 但伪代码一般都是通过 Latex 书写的, 但我又不想专门为了它去写 Latex, 所以就开始考虑如何在 Markdown 中书写伪代码.
\n根据 “Atwood’s Law” 原则:
\n\nAny application that can be written in JavaScript, will eventually be written in JavaScript.
\n任何可以用 JavaScript 来写的应用, 最终都将用 JavaScript 来写.
\n \n我再次将目光投向前端, 寻找符合前端思想的解决方案.
\n最终我选定了 VSCode + Markdown Preview Enhanced + pseudocode.js 的组合.
\n(缺点是不能在 VSCode 中实时预览, 这个问题的主要原因是我不想再次魔改和维护别人写的插件了.)
\n大概效果:
\n\n \n
",
319 | "pubDate": "2021-09-02T16:00:00.000Z",
320 | "pubDateYYMMDD": "2021-09-02"
321 | },
322 | {
323 | "name": "Antares's Blog",
324 | "xmlUrl": "https://chr.fan/feed",
325 | "htmlUrl": "https://chr.fan",
326 | "title": "Live2DViewerEX 创意工坊lpk文件分析 – 动态调试Unity程序",
327 | "link": "https://chr.fan/lpk-decrypt/",
328 | "summary": "\n声明:本人不会提供任何解密lpk文件的程序。本文仅仅是技术向的探讨、经验分享。 如果您认为本文侵犯了您的权益,请联系我,我会立刻删 ...
\nThe post Live2DViewerEX 创意工坊lpk文件分析 – 动态调试Unity程序 appeared first on α-Lyrae .
\n",
329 | "pubDate": "2021-08-31T20:45:13.000Z",
330 | "pubDateYYMMDD": "2021-08-31"
331 | },
332 | {
333 | "name": "lyc8503's Blog",
334 | "xmlUrl": "https://blog.lyc8503.site/atom.xml",
335 | "htmlUrl": "https://blog.lyc8503.site/",
336 | "title": "生成含有使用者备用名称 (SAN) 的 SSL 证书, 解决 Chrome 和 Okhttp HTTPS 报错",
337 | "link": "https://blog.lyc8503.site/2021/08/29/%E8%BD%AF%E4%BB%B6%E7%A0%94%E7%A9%B6=)/%E6%9C%8D%E5%8A%A1%E5%99%A8%E7%BB%B4%E6%8A%A4&%E9%85%8D%E7%BD%AEder%E6%97%A5%E5%B8%B8/self-signed-cert-with-san/",
338 | "summary": "\n \n 之前设置了 ipv6 DDNS, 可以从外网访问到家里 AIO 上的 http 服务器.
\n由于只是自己使用, 就打算使用自签名证书. 但按照网上教程生成的证书导入 Chrome 后报错 ERR_CERT_COMMON_NAME_INVALID
, 在 OkHttp 中报错Hostname xxx is not verified.
\n查阅资料发现是生成的证书没有 SAN 的缘故, 网上生成 SAN 自签名证书的教程很多都有问题, 最终找到一种可行的方法, 记录在此.
\n \n ",
339 | "pubDate": "2021-08-29T06:58:09.000Z",
340 | "pubDateYYMMDD": "2021-08-29"
341 | },
342 | {
343 | "name": "lyc8503's Blog",
344 | "xmlUrl": "https://blog.lyc8503.site/atom.xml",
345 | "htmlUrl": "https://blog.lyc8503.site/",
346 | "title": "AIO Ep9. 群晖 ipv6 阿里 DDNS 设置",
347 | "link": "https://blog.lyc8503.site/2021/08/24/%E4%B8%93%E9%A2%98%E5%90%91%E7%A0%94%E7%A9%B6/AllInOne%E5%AE%B6%E7%94%A8%E6%9C%8D%E5%8A%A1%E5%99%A8/9-syno-ipv6-ddns/",
348 | "summary": "\n \n 初探 ipv6 & 群晖 ipv6 DDNS 的设置.
\n \n ",
349 | "pubDate": "2021-08-24T01:43:33.000Z",
350 | "pubDateYYMMDD": "2021-08-24"
351 | },
352 | {
353 | "name": "lyc8503's Blog",
354 | "xmlUrl": "https://blog.lyc8503.site/atom.xml",
355 | "htmlUrl": "https://blog.lyc8503.site/",
356 | "title": "AIO Ep8. 记一次 ESXi 黑群晖失联排查",
357 | "link": "https://blog.lyc8503.site/2021/08/23/%E4%B8%93%E9%A2%98%E5%90%91%E7%A0%94%E7%A9%B6/AllInOne%E5%AE%B6%E7%94%A8%E6%9C%8D%E5%8A%A1%E5%99%A8/8-syno-down-troubleshooting/",
358 | "summary": "\n \n 黑群晖不定时失联, 排查故障过程记录.
\n \n ",
359 | "pubDate": "2021-08-23T14:48:40.000Z",
360 | "pubDateYYMMDD": "2021-08-23"
361 | },
362 | {
363 | "name": "lyc8503's Blog",
364 | "xmlUrl": "https://blog.lyc8503.site/atom.xml",
365 | "htmlUrl": "https://blog.lyc8503.site/",
366 | "title": "AIO Ep7. 硬件的一些更改",
367 | "link": "https://blog.lyc8503.site/2021/08/23/%E4%B8%93%E9%A2%98%E5%90%91%E7%A0%94%E7%A9%B6/AllInOne%E5%AE%B6%E7%94%A8%E6%9C%8D%E5%8A%A1%E5%99%A8/7-hardware-upgrade-and-diy/",
368 | "summary": "\n \n Hpe Gen10+ 有点令我失望… 后闲鱼出手改用自己组装的整机.
\n \n ",
369 | "pubDate": "2021-08-23T04:26:52.000Z",
370 | "pubDateYYMMDD": "2021-08-23"
371 | },
372 | {
373 | "name": "lyc8503's Blog",
374 | "xmlUrl": "https://blog.lyc8503.site/atom.xml",
375 | "htmlUrl": "https://blog.lyc8503.site/",
376 | "title": "AIO Ep6. ESXi 黑群晖设置时的一些小技巧和踩的坑",
377 | "link": "https://blog.lyc8503.site/2021/08/13/%E4%B8%93%E9%A2%98%E5%90%91%E7%A0%94%E7%A9%B6/AllInOne%E5%AE%B6%E7%94%A8%E6%9C%8D%E5%8A%A1%E5%99%A8/6-software-implementation/",
378 | "summary": "\n \n 如题. 主要是归类一些我参考的教程.
\n \n ",
379 | "pubDate": "2021-08-13T02:39:32.000Z",
380 | "pubDateYYMMDD": "2021-08-13"
381 | },
382 | {
383 | "name": "lyc8503's Blog",
384 | "xmlUrl": "https://blog.lyc8503.site/atom.xml",
385 | "htmlUrl": "https://blog.lyc8503.site/",
386 | "title": "AIO Ep5. 我的服务器的软件结构",
387 | "link": "https://blog.lyc8503.site/2021/08/12/%E4%B8%93%E9%A2%98%E5%90%91%E7%A0%94%E7%A9%B6/AllInOne%E5%AE%B6%E7%94%A8%E6%9C%8D%E5%8A%A1%E5%99%A8/5-software-configuration/",
388 | "summary": "\n \n 基础的 ESXi 已经装好了, 先来概括一下软件上的安排.
\n \n ",
389 | "pubDate": "2021-08-12T16:09:47.000Z",
390 | "pubDateYYMMDD": "2021-08-12"
391 | },
392 | {
393 | "name": "lyc8503's Blog",
394 | "xmlUrl": "https://blog.lyc8503.site/atom.xml",
395 | "htmlUrl": "https://blog.lyc8503.site/",
396 | "title": "Hexo 部署到 OSS 国内访问加速",
397 | "link": "https://blog.lyc8503.site/2021/08/12/%E8%BD%AF%E4%BB%B6%E7%A0%94%E7%A9%B6=)/%E6%9C%8D%E5%8A%A1%E5%99%A8%E7%BB%B4%E6%8A%A4&%E9%85%8D%E7%BD%AEder%E6%97%A5%E5%B8%B8/hexo-on-oss/",
398 | "summary": "\n \n 博客本来使用了 Netlify + 国内阿里 CDN 加速.
\n但没想到… Netlify 的源站实在是太慢了. 慢到返回一个 304 都能等到 504 Gateway Time-out.
\n既然都已经备案了, 还是要想办法让国内访问快一点.
\n所以打算利用 Github Actions 将网站再部署到 OSS 上, 再用 CDN 加速.
\n同时由于国内评论发表需要审核, 使用 Valine (Valine-Admin) 替换了 Gitalk, 支持手动审核.
\n \n ",
399 | "pubDate": "2021-08-12T15:56:44.000Z",
400 | "pubDateYYMMDD": "2021-08-12"
401 | }
402 | ]
--------------------------------------------------------------------------------
/web/src/assets/github.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nju-lug/blogroll/7aecf651d6459f717cbe6b59e25c0a9737d7fd65/web/src/assets/github.png
--------------------------------------------------------------------------------
/web/src/assets/logo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nju-lug/blogroll/7aecf651d6459f717cbe6b59e25c0a9737d7fd65/web/src/assets/logo.png
--------------------------------------------------------------------------------
/web/src/assets/opml.json:
--------------------------------------------------------------------------------
1 | [
2 | {
3 | "title": "OrangeX4's Blog",
4 | "xmlUrl": "https://orangex4.cool/atom.xml",
5 | "htmlUrl": "https://orangex4.cool/"
6 | },
7 | {
8 | "title": "Idealclover's Blog",
9 | "xmlUrl": "https://idealclover.top/feed",
10 | "htmlUrl": "https://idealclover.top/"
11 | },
12 | {
13 | "title": "Typoverflow's Blog",
14 | "xmlUrl": "https://blog.typoverflow.me/index.php/feed/",
15 | "htmlUrl": "https://blog.typoverflow.me/"
16 | },
17 | {
18 | "title": "Cmj's Blog",
19 | "xmlUrl": "https://blog.caomingjun.com/atom.xml",
20 | "htmlUrl": "https://blog.caomingjun.com/"
21 | },
22 | {
23 | "title": "Mexii's Blog",
24 | "xmlUrl": "https://blog.mexii.one/atom.xml",
25 | "htmlUrl": "https://blog.mexii.one/"
26 | },
27 | {
28 | "title": "LadderOperator's Blog",
29 | "xmlUrl": "https://ladderoperator.top/index.xml",
30 | "htmlUrl": "https://ladderoperator.top"
31 | },
32 | {
33 | "title": "Antares's Blog",
34 | "xmlUrl": "https://chr.fan/feed",
35 | "htmlUrl": "https://chr.fan"
36 | },
37 | {
38 | "title": "lyc8503's Blog",
39 | "xmlUrl": "https://blog.lyc8503.site/atom.xml",
40 | "htmlUrl": "https://blog.lyc8503.site/"
41 | }
42 | ]
--------------------------------------------------------------------------------
/web/src/components/BlogInfoCard.vue:
--------------------------------------------------------------------------------
1 |
9 |
10 |
11 |
12 | {{ props.title }}
13 |
16 |
17 |
24 |
27 |
28 |
29 | {{ props.htmlUrl }}
30 |
31 |
32 |
33 |
34 |
--------------------------------------------------------------------------------
/web/src/components/SummaryCard.vue:
--------------------------------------------------------------------------------
1 |
9 |
10 |
11 |
19 |
20 |
21 |
68 |
--------------------------------------------------------------------------------
/web/src/main.js:
--------------------------------------------------------------------------------
1 | import { createApp } from 'vue'
2 | import App from './App.vue'
3 |
4 | createApp(App).mount('#app')
5 |
--------------------------------------------------------------------------------
/web/vite.config.js:
--------------------------------------------------------------------------------
1 | import { fileURLToPath, URL } from 'url'
2 |
3 | import { defineConfig } from 'vite'
4 | import vue from '@vitejs/plugin-vue'
5 |
6 | // https://vitejs.dev/config/
7 | export default defineConfig({
8 | plugins: [vue()],
9 | resolve: {
10 | alias: {
11 | '@': fileURLToPath(new URL('./src', import.meta.url))
12 | }
13 | }
14 | })
15 |
--------------------------------------------------------------------------------
/workers-site/.cargo-ok:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nju-lug/blogroll/7aecf651d6459f717cbe6b59e25c0a9737d7fd65/workers-site/.cargo-ok
--------------------------------------------------------------------------------
/workers-site/.gitignore:
--------------------------------------------------------------------------------
1 | node_modules
2 | worker
3 |
--------------------------------------------------------------------------------
/workers-site/index.js:
--------------------------------------------------------------------------------
1 | import { getAssetFromKV, mapRequestToAsset } from '@cloudflare/kv-asset-handler'
2 |
3 | /**
4 | * The DEBUG flag will do two things that help during development:
5 | * 1. we will skip caching on the edge, which makes it easier to
6 | * debug.
7 | * 2. we will return an error message on exception in your Response rather
8 | * than the default 404.html page.
9 | */
10 | const DEBUG = false
11 |
12 | addEventListener('fetch', event => {
13 | try {
14 | event.respondWith(handleEvent(event))
15 | } catch (e) {
16 | if (DEBUG) {
17 | return event.respondWith(
18 | new Response(e.message || e.toString(), {
19 | status: 500,
20 | }),
21 | )
22 | }
23 | event.respondWith(new Response('Internal Error', { status: 500 }))
24 | }
25 | })
26 |
27 | async function handleEvent(event) {
28 | const url = new URL(event.request.url)
29 | let options = {}
30 |
31 | /**
32 | * You can add custom logic to how we fetch your assets
33 | * by configuring the function `mapRequestToAsset`
34 | */
35 | // options.mapRequestToAsset = handlePrefix(/^\/docs/)
36 |
37 | try {
38 | if (DEBUG) {
39 | // customize caching
40 | options.cacheControl = {
41 | bypassCache: true,
42 | };
43 | }
44 | const page = await getAssetFromKV(event, options);
45 |
46 | // allow headers to be altered
47 | const response = new Response(page.body, page);
48 |
49 | response.headers.set("X-XSS-Protection", "1; mode=block");
50 | response.headers.set("X-Content-Type-Options", "nosniff");
51 | response.headers.set("X-Frame-Options", "DENY");
52 | response.headers.set("Referrer-Policy", "unsafe-url");
53 | response.headers.set("Feature-Policy", "none");
54 |
55 | return response;
56 |
57 | } catch (e) {
58 | // if an error is thrown try to serve the asset at 404.html
59 | if (!DEBUG) {
60 | try {
61 | let notFoundResponse = await getAssetFromKV(event, {
62 | mapRequestToAsset: req => new Request(`${new URL(req.url).origin}/404.html`, req),
63 | })
64 |
65 | return new Response(notFoundResponse.body, { ...notFoundResponse, status: 404 })
66 | } catch (e) {}
67 | }
68 |
69 | return new Response(e.message || e.toString(), { status: 500 })
70 | }
71 | }
72 |
73 | /**
74 | * Here's one example of how to modify a request to
75 | * remove a specific prefix, in this case `/docs` from
76 | * the url. This can be useful if you are deploying to a
77 | * route on a zone, or if you only want your static content
78 | * to exist at a specific path.
79 | */
80 | function handlePrefix(prefix) {
81 | return request => {
82 | // compute the default (e.g. / -> index.html)
83 | let defaultAssetKey = mapRequestToAsset(request)
84 | let url = new URL(defaultAssetKey.url)
85 |
86 | // strip the prefix from the path for lookup
87 | url.pathname = url.pathname.replace(prefix, '/')
88 |
89 | // inherit all other props from the default request
90 | return new Request(url.toString(), defaultAssetKey)
91 | }
92 | }
--------------------------------------------------------------------------------
/workers-site/package-lock.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "worker",
3 | "version": "1.0.0",
4 | "lockfileVersion": 1,
5 | "requires": true,
6 | "dependencies": {
7 | "@cloudflare/kv-asset-handler": {
8 | "version": "0.1.2",
9 | "resolved": "https://registry.npmjs.org/@cloudflare/kv-asset-handler/-/kv-asset-handler-0.1.2.tgz",
10 | "integrity": "sha512-otES1gV5mEhNh82p/sJERPMMrC7UOLV2JyfKf4e3EX1TmMkZ3N8IDGAqRNsoRU8UYTO7wc83I7pH1p4ozAdgMQ==",
11 | "requires": {
12 | "mime": "^2.5.2"
13 | }
14 | },
15 | "mime": {
16 | "version": "2.5.2",
17 | "resolved": "https://registry.npmjs.org/mime/-/mime-2.5.2.tgz",
18 | "integrity": "sha512-tqkh47FzKeCPD2PUiPB6pkbMzsCasjxAfC62/Wap5qrUWcb+sFasXUC5I3gYM5iBM8v/Qpn4UK0x+j0iHyFPDg=="
19 | }
20 | }
21 | }
22 |
--------------------------------------------------------------------------------
/workers-site/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "private": true,
3 | "name": "worker",
4 | "version": "1.0.0",
5 | "description": "A template for kick starting a Cloudflare Workers project",
6 | "main": "index.js",
7 | "author": "Ashley Lewis ",
8 | "license": "MIT",
9 | "dependencies": {
10 | "@cloudflare/kv-asset-handler": "~0.1.2"
11 | }
12 | }
13 |
--------------------------------------------------------------------------------
/wrangler.toml:
--------------------------------------------------------------------------------
1 | name = "blogroll"
2 | type = "webpack"
3 | account_id = "8b594a098b4be5946860cee0cf79f104"
4 | workers_dev = true
5 | # route = "blogroll.njulug.org/*"
6 | zone_id = "cd50d75141e3c6095863f20a0edfc0e7"
7 | compatibility_date = "2024-11-19"
8 |
9 | [site]
10 | bucket = "./web/dist"
11 | entry-point = "workers-site"
12 |
--------------------------------------------------------------------------------