├── .hugo_build.lock
├── static
└── .gitkeep
├── assets
├── images
│ └── .gitkeep
├── svgs
│ └── .gitkeep
├── js
│ └── custom.js
├── scss
│ └── common
│ │ ├── _custom.scss
│ │ └── _variables-custom.scss
├── cover.png
├── favicon.ico
├── favicon.png
├── jsconfig.json
├── favicon.svg
├── mask-icon.svg
└── ics
│ └── cycling_races_bilingual.ics
├── config
├── next
│ └── hugo.toml
├── production
│ └── hugo.toml
├── babel.config.js
├── _default
│ ├── markup.toml
│ ├── languages.toml
│ ├── menus
│ │ ├── menus.nl.toml
│ │ └── menus.en.toml
│ ├── module.toml
│ ├── hugo.toml
│ └── params.toml
└── postcss.config.js
├── .npmignore
├── layouts
├── partials
│ ├── head
│ │ ├── script-header.html
│ │ └── custom-head.html
│ └── footer
│ │ └── script-footer-custom.html
└── index.html
├── .devcontainer
├── devcontainer.json
└── Dockerfile
├── .npmrc
├── .gitignore
├── _gen
├── images
│ ├── favicon_hu16607879628914845586.png
│ ├── favicon_hu4129261240948945293.png
│ ├── favicon_hu4486009373732204089.png
│ └── favicon_hu7450944814887469546.png
└── assets
│ └── scss
│ └── app.scss_bbe385005c051cedd4efa2b07beada58.json
├── resources
└── _gen
│ ├── images
│ ├── favicon_hu16607879628914845586.png
│ ├── favicon_hu4129261240948945293.png
│ ├── favicon_hu4486009373732204089.png
│ └── favicon_hu7450944814887469546.png
│ └── assets
│ └── scss
│ └── app.scss_bbe385005c051cedd4efa2b07beada58.json
├── .prettierignore
├── .markdownlint.json
├── .vscode
├── settings.json
└── extensions.json
├── content
├── privacy.md
├── docs
│ ├── _index.md
│ ├── resources.md
│ ├── news-media
│ │ ├── _index.md
│ │ └── cycling-news.md
│ ├── social-forums
│ │ ├── _index.md
│ │ └── bikeforums.md
│ ├── race-datatracking
│ │ ├── _index.md
│ │ └── tour-tracker-grand-tours.md
│ ├── routes-navigation
│ │ ├── _index.md
│ │ └── xingzhe-export-gpx.md
│ ├── training-fitness
│ │ ├── _index.md
│ │ ├── ai-bike-fitting.md
│ │ └── zwiftoffline.md
│ ├── equipment-components
│ │ ├── _index.md
│ │ └── zwifterbikes.md
│ └── strava-garmin
│ │ ├── _index.md
│ │ ├── gcw-and-strava-kudo-all.md
│ │ ├── elevate-for-strava.md
│ │ ├── gear-automator.md
│ │ ├── intervals-icu.md
│ │ └── strava-statistics.md
├── _index.md
└── blog
│ ├── _index.md
│ └── example
│ └── index.md
├── .prettierrc.yaml
├── .gitpod.yml
├── .codesandbox
└── tasks.json
├── package.json
├── .github
└── workflows
│ ├── super-linter.yml
│ └── blog-deploy.yml
├── LICENSE
├── netlify.toml
├── hugo_stats.json
├── README_CN.md
└── README.md
/.hugo_build.lock:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/static/.gitkeep:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/assets/images/.gitkeep:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/assets/svgs/.gitkeep:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/assets/js/custom.js:
--------------------------------------------------------------------------------
1 | // Put your custom JS code here
2 |
--------------------------------------------------------------------------------
/assets/scss/common/_custom.scss:
--------------------------------------------------------------------------------
1 | // Put your custom SCSS code here
2 |
--------------------------------------------------------------------------------
/config/next/hugo.toml:
--------------------------------------------------------------------------------
1 | # Overrides for next environment
2 | baseurl = "/"
3 |
--------------------------------------------------------------------------------
/assets/scss/common/_variables-custom.scss:
--------------------------------------------------------------------------------
1 | // Put your custom SCSS variables here
2 |
--------------------------------------------------------------------------------
/assets/cover.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Dunky-Z/awesome-cycling/HEAD/assets/cover.png
--------------------------------------------------------------------------------
/assets/favicon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Dunky-Z/awesome-cycling/HEAD/assets/favicon.ico
--------------------------------------------------------------------------------
/assets/favicon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Dunky-Z/awesome-cycling/HEAD/assets/favicon.png
--------------------------------------------------------------------------------
/.npmignore:
--------------------------------------------------------------------------------
1 | .env
2 | .netlify
3 | .hugo_build.lock
4 | node_modules
5 | public
6 | resources
7 |
--------------------------------------------------------------------------------
/layouts/partials/head/script-header.html:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/.devcontainer/devcontainer.json:
--------------------------------------------------------------------------------
1 | {
2 | "build": {
3 | "dockerfile": "./Dockerfile"
4 | }
5 | }
6 |
--------------------------------------------------------------------------------
/config/production/hugo.toml:
--------------------------------------------------------------------------------
1 | # Overrides for production environment
2 | baseurl = "http://lifeislife.cn/awesome-cycling/"
3 |
--------------------------------------------------------------------------------
/.npmrc:
--------------------------------------------------------------------------------
1 | enable-pre-post-scripts=true
2 | auto-install-peers=true
3 | node-linker=hoisted
4 | prefer-symlinked-executables=false
5 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | .DS_Store
2 | Thumbs.db
3 | db.json
4 | *.log
5 | node_modules/
6 | public/
7 | .deploy*/
8 | thulite-project
9 | resources/
--------------------------------------------------------------------------------
/_gen/images/favicon_hu16607879628914845586.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Dunky-Z/awesome-cycling/HEAD/_gen/images/favicon_hu16607879628914845586.png
--------------------------------------------------------------------------------
/_gen/images/favicon_hu4129261240948945293.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Dunky-Z/awesome-cycling/HEAD/_gen/images/favicon_hu4129261240948945293.png
--------------------------------------------------------------------------------
/_gen/images/favicon_hu4486009373732204089.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Dunky-Z/awesome-cycling/HEAD/_gen/images/favicon_hu4486009373732204089.png
--------------------------------------------------------------------------------
/_gen/images/favicon_hu7450944814887469546.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Dunky-Z/awesome-cycling/HEAD/_gen/images/favicon_hu7450944814887469546.png
--------------------------------------------------------------------------------
/resources/_gen/images/favicon_hu16607879628914845586.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Dunky-Z/awesome-cycling/HEAD/resources/_gen/images/favicon_hu16607879628914845586.png
--------------------------------------------------------------------------------
/resources/_gen/images/favicon_hu4129261240948945293.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Dunky-Z/awesome-cycling/HEAD/resources/_gen/images/favicon_hu4129261240948945293.png
--------------------------------------------------------------------------------
/resources/_gen/images/favicon_hu4486009373732204089.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Dunky-Z/awesome-cycling/HEAD/resources/_gen/images/favicon_hu4486009373732204089.png
--------------------------------------------------------------------------------
/resources/_gen/images/favicon_hu7450944814887469546.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Dunky-Z/awesome-cycling/HEAD/resources/_gen/images/favicon_hu7450944814887469546.png
--------------------------------------------------------------------------------
/.prettierignore:
--------------------------------------------------------------------------------
1 | *.html
2 | *.ico
3 | *.png
4 | *.jp*g
5 | *.toml
6 | *.*ignore
7 | *.svg
8 | *.xml
9 | LICENSE
10 | .npmrc
11 | .gitkeep
12 | *.woff*
13 |
--------------------------------------------------------------------------------
/.markdownlint.json:
--------------------------------------------------------------------------------
1 | {
2 | "MD007": false,
3 | "MD010": false,
4 | "MD013": false,
5 | "MD024": false,
6 | "MD025": false,
7 | "MD036": false,
8 | "MD045": false
9 | }
--------------------------------------------------------------------------------
/assets/jsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "compilerOptions": {
3 | "baseUrl": ".",
4 | "paths": {
5 | "*": ["*", "..\\node_modules\\@thulite\\doks-core\\assets\\*"]
6 | }
7 | }
8 | }
9 |
--------------------------------------------------------------------------------
/.vscode/settings.json:
--------------------------------------------------------------------------------
1 | {
2 | "editor.wordWrap": "off",
3 | "files.trimTrailingWhitespace": true,
4 | "files.insertFinalNewline": true,
5 | "editor.tabSize": 2,
6 | "editor.insertSpaces": true
7 | }
8 |
--------------------------------------------------------------------------------
/.vscode/extensions.json:
--------------------------------------------------------------------------------
1 | {
2 | "recommendations": ["budparr.language-hugo-vscode", "yzhang.markdown-all-in-one", "tamasfe.even-better-toml", "dbaeumer.vscode-eslint", "DavidAnson.vscode-markdownlint", "stylelint.vscode-stylelint"]
3 | }
4 |
--------------------------------------------------------------------------------
/_gen/assets/scss/app.scss_bbe385005c051cedd4efa2b07beada58.json:
--------------------------------------------------------------------------------
1 | {"Target":"main.01b0834d5af51b24812d02878d09c8d7677d6b8af13164fb50215889dc19aaefd0e9366c13b45a9a57ae481dfd1836bce46b5ebfe461d56e3498b9443d8c5e27.css","MediaType":"text/css","Data":{"Integrity":"sha512-AbCDTVr1GySBLQKHjQnI12d9a4rxMWT7UCFYidwZqu/Q6TZsE7RamleuSB39GDa85Gtev+Rh1W40mLlEPYxeJw=="}}
--------------------------------------------------------------------------------
/resources/_gen/assets/scss/app.scss_bbe385005c051cedd4efa2b07beada58.json:
--------------------------------------------------------------------------------
1 | {"Target":"main.01b0834d5af51b24812d02878d09c8d7677d6b8af13164fb50215889dc19aaefd0e9366c13b45a9a57ae481dfd1836bce46b5ebfe461d56e3498b9443d8c5e27.css","MediaType":"text/css","Data":{"Integrity":"sha512-AbCDTVr1GySBLQKHjQnI12d9a4rxMWT7UCFYidwZqu/Q6TZsE7RamleuSB39GDa85Gtev+Rh1W40mLlEPYxeJw=="}}
--------------------------------------------------------------------------------
/layouts/partials/head/custom-head.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
11 |
--------------------------------------------------------------------------------
/content/privacy.md:
--------------------------------------------------------------------------------
1 | ---
2 | title: "Privacy Policy"
3 | description: ""
4 | summary: ""
5 | date: 2024-09-07T17:19:07+02:00
6 | lastmod: 2024-09-07T17:19:07+02:00
7 | draft: false
8 | type: "legal"
9 | seo:
10 | title: "" # custom title (optional)
11 | description: "" # custom description (recommended)
12 | canonical: "" # custom canonical URL (optional)
13 | noindex: false # false (default) or true
14 | ---
15 |
--------------------------------------------------------------------------------
/content/docs/_index.md:
--------------------------------------------------------------------------------
1 | ---
2 | title: "Docs"
3 | description: ""
4 | summary: ""
5 | date: 2024-09-07T16:12:03+02:00
6 | lastmod: 2024-09-07T16:12:03+02:00
7 | draft: false
8 | weight: 999
9 | toc: true
10 | seo:
11 | title: "" # custom title (optional)
12 | description: "" # custom description (recommended)
13 | canonical: "" # custom canonical URL (optional)
14 | noindex: false # false (default) or true
15 | ---
16 |
--------------------------------------------------------------------------------
/content/_index.md:
--------------------------------------------------------------------------------
1 | ---
2 | title: "Welcome to Awesome Cycling"
3 | description: ""
4 | lead: "收集关于自行车的一切"
5 | date: 2024-09-07T16:33:54+02:00
6 | lastmod: 2024-09-07T16:33:54+02:00
7 | draft: false
8 | seo:
9 | title: "Welcome to Awesome Cycling" # custom title (optional)
10 | description: "" # custom description (recommended)
11 | canonical: "" # custom canonical URL (optional)
12 | noindex: false # false (default) or true
13 | ---
14 |
--------------------------------------------------------------------------------
/.prettierrc.yaml:
--------------------------------------------------------------------------------
1 | # Default config
2 | tabWidth: 4
3 | endOfLine: crlf
4 | singleQuote: true
5 | printWidth: 100000
6 | trailingComma: none
7 | bracketSameLine: true
8 | quoteProps: consistent
9 | experimentalTernaries: true
10 |
11 | # Overrided config
12 | overrides:
13 | - files: ["*.md", "*.json", "*.yaml"]
14 | options:
15 | tabWidth: 2
16 | singleQuote: false
17 | - files: ["*.scss"]
18 | options:
19 | singleQuote: false
20 |
--------------------------------------------------------------------------------
/content/docs/resources.md:
--------------------------------------------------------------------------------
1 | ---
2 | title: "Resources"
3 | description: ""
4 | summary: ""
5 | date: 2024-09-07T09:30:56+01:00
6 | lastmod: 2024-09-27T09:30:56+01:00
7 | draft: false
8 | weight: 999
9 | toc: true
10 | seo:
11 | title: "" # custom title (optional)
12 | description: "" # custom description (recommended)
13 | canonical: "" # custom canonical URL (optional)
14 | noindex: false # false (default) or true
15 | ---
16 |
17 | Link to valuable, relevant resources.
18 |
--------------------------------------------------------------------------------
/content/docs/news-media/_index.md:
--------------------------------------------------------------------------------
1 | ---
2 | title: "新闻与媒体(News & Media)"
3 | description: ""
4 | summary: ""
5 | date: 2024-09-07T16:06:50+02:00
6 | lastmod: 2024-09-07T16:06:50+02:00
7 | draft: false
8 | weight: 200
9 | toc: true
10 | sidebar:
11 | collapsed: false
12 | seo:
13 | title: "" # custom title (optional)
14 | description: "" # custom description (recommended)
15 | canonical: "" # custom canonical URL (optional)
16 | noindex: false # false (default) or true
17 | ---
18 |
--------------------------------------------------------------------------------
/content/docs/social-forums/_index.md:
--------------------------------------------------------------------------------
1 | ---
2 | title: "社交与论坛(Social & Forums)"
3 | description: ""
4 | summary: ""
5 | date: 2024-09-07T16:12:37+02:00
6 | lastmod: 2024-09-07T16:12:37+02:00
7 | draft: false
8 | weight: 100
9 | toc: true
10 | sidebar:
11 | collapsed: false
12 | seo:
13 | title: "" # custom title (optional)
14 | description: "" # custom description (recommended)
15 | canonical: "" # custom canonical URL (optional)
16 | noindex: false # false (default) or true
17 | ---
18 |
--------------------------------------------------------------------------------
/content/blog/_index.md:
--------------------------------------------------------------------------------
1 | ---
2 | title: "Blog"
3 | description: ""
4 | summary: ""
5 | date: 2024-09-07T16:21:44+02:00
6 | lastmod: 2024-09-07T16:21:44+02:00
7 | draft: true
8 | weight: 50
9 | categories: []
10 | tags: []
11 | contributors: []
12 | pinned: false
13 | homepage: false
14 | seo:
15 | title: "" # custom title (optional)
16 | description: "" # custom description (recommended)
17 | canonical: "" # custom canonical URL (optional)
18 | noindex: false # false (default) or true
19 | ---
20 |
--------------------------------------------------------------------------------
/content/docs/race-datatracking/_index.md:
--------------------------------------------------------------------------------
1 | ---
2 | title: "赛事与数据跟踪(Race & Data Tracking)"
3 | description: ""
4 | summary: ""
5 | date: 2024-09-07T16:12:37+02:00
6 | lastmod: 2024-09-07T16:12:37+02:00
7 | draft: false
8 | weight: 300
9 | toc: true
10 | sidebar:
11 | collapsed: false
12 | seo:
13 | title: "" # custom title (optional)
14 | description: "" # custom description (recommended)
15 | canonical: "" # custom canonical URL (optional)
16 | noindex: false # false (default) or true
17 | ---
18 |
--------------------------------------------------------------------------------
/content/docs/routes-navigation/_index.md:
--------------------------------------------------------------------------------
1 | ---
2 | title: "路线与导航工具(Routes & Navigation)"
3 | description: ""
4 | summary: ""
5 | date: 2024-09-07T16:12:37+02:00
6 | lastmod: 2024-09-07T16:12:37+02:00
7 | draft: false
8 | weight: 300
9 | toc: true
10 | sidebar:
11 | collapsed: false
12 | seo:
13 | title: "" # custom title (optional)
14 | description: "" # custom description (recommended)
15 | canonical: "" # custom canonical URL (optional)
16 | noindex: false # false (default) or true
17 | ---
18 |
--------------------------------------------------------------------------------
/content/docs/training-fitness/_index.md:
--------------------------------------------------------------------------------
1 | ---
2 | title: "训练与健康管理(Training & Fitness)"
3 | description: ""
4 | summary: ""
5 | date: 2024-09-27T16:12:37+02:00
6 | lastmod: 2024-09-27T16:12:37+02:00
7 | draft: false
8 | weight: 300
9 | toc: true
10 | sidebar:
11 | collapsed: false
12 | seo:
13 | title: "" # custom title (optional)
14 | description: "" # custom description (recommended)
15 | canonical: "" # custom canonical URL (optional)
16 | noindex: false # false (default) or true
17 | ---
18 |
--------------------------------------------------------------------------------
/content/docs/equipment-components/_index.md:
--------------------------------------------------------------------------------
1 | ---
2 | title: "设备与零配件(Equipment & Components)"
3 | description: ""
4 | summary: ""
5 | date: 2024-09-27T16:12:37+02:00
6 | lastmod: 2024-09-27T16:12:37+02:00
7 | draft: false
8 | weight: 300
9 | toc: true
10 | sidebar:
11 | collapsed: false
12 | seo:
13 | title: "" # custom title (optional)
14 | description: "" # custom description (recommended)
15 | canonical: "" # custom canonical URL (optional)
16 | noindex: false # false (default) or true
17 | ---
18 |
--------------------------------------------------------------------------------
/config/babel.config.js:
--------------------------------------------------------------------------------
1 | module.exports = {
2 | presets: [
3 | [
4 | '@babel/preset-env',
5 | {
6 | targets: {
7 | browsers: [
8 | // Best practice: https://github.com/babel/babel/issues/7789
9 | '>=1%',
10 | 'not ie 11',
11 | 'not op_mini all'
12 | ]
13 | }
14 | }
15 | ]
16 | ]
17 | };
18 |
--------------------------------------------------------------------------------
/content/docs/strava-garmin/_index.md:
--------------------------------------------------------------------------------
1 | ---
2 | title: "Strava 和 Garmin 相关工具(Strava & Garmin Tools)"
3 | description: ""
4 | summary: ""
5 | date: 2024-09-07T16:12:37+02:00
6 | lastmod: 2024-09-07T16:12:37+02:00
7 | draft: false
8 | weight: 400
9 | toc: true
10 | sidebar:
11 | collapsed: false
12 | seo:
13 | title: "" # custom title (optional)
14 | description: "" # custom description (recommended)
15 | canonical: "" # custom canonical URL (optional)
16 | noindex: false # false (default) or true
17 | ---
18 |
--------------------------------------------------------------------------------
/layouts/partials/footer/script-footer-custom.html:
--------------------------------------------------------------------------------
1 | {{/* Put your custom tags here */}}
2 |
3 | {{/* EXAMPLE - only load script for production
4 | {{ if eq (hugo.Environment) "production" -}}
5 | {{ partial "footer/esbuild" (dict "src" "js/instantpage.js" "load" "async" "transpile" false) -}}
6 | {{ end -}}
7 | */}}
8 |
9 | {{/* EXAMPLE - only load script for a page type e.g. contact or gallery
10 | {{ if eq .Type "gallery" -}}
11 | {{ partial "footer/esbuild" (dict "src" "js/gallery.js" "load" "async" "transpile" false) -}}
12 | {{ end -}}
13 | */}}
14 |
--------------------------------------------------------------------------------
/content/docs/news-media/cycling-news.md:
--------------------------------------------------------------------------------
1 | ---
2 | title: "CyclingNews"
3 | description: ""
4 | summary: ""
5 | date: 2024-09-17T16:04:48+02:00
6 | lastmod: 2024-18-07T16:04:48+02:00
7 | draft: false
8 | weight: 810
9 | toc: true
10 | seo:
11 | title: "" # custom title (optional)
12 | description: "" # custom description (recommended)
13 | canonical: "" # custom canonical URL (optional)
14 | noindex: false # false (default) or true
15 | ---
16 |
17 | [Cycling News](http://www.cyclingnews.com/)是全球领先的自行车运动新闻网站,专注于提供各类自行车赛事的最新报道和分析,涵盖职业赛事、骑行装备、技术更新以及自行车文化。该网站是自行车爱好者、职业选手以及教练获取自行车相关信息的首选平台。
--------------------------------------------------------------------------------
/.gitpod.yml:
--------------------------------------------------------------------------------
1 | # Source: https://github.com/gitpod-io/template-hugo/blob/main/.gitpod.yml
2 |
3 | # List the start up tasks. Learn more https://www.gitpod.io/docs/config-start-tasks/
4 | tasks:
5 | - name: Run start up tasks
6 | before: brew install hugo
7 | init: pnpm install
8 | command: hugo server --baseURL $(gp url 1313) --liveReloadPort=443 --appendPort=false --bind=0.0.0.0 --disableFastRender --noHTTPCache --navigateToChanged
9 |
10 | # List the ports to expose. Learn more https://www.gitpod.io/docs/config-ports/
11 | ports:
12 | - port: 1313
13 | onOpen: open-preview
14 |
--------------------------------------------------------------------------------
/content/docs/social-forums/bikeforums.md:
--------------------------------------------------------------------------------
1 | ---
2 | title: "BikeForums"
3 | description: ""
4 | summary: ""
5 | date: 2024-09-07T16:04:48+02:00
6 | lastmod: 2024-09-07T16:04:48+02:00
7 | draft: false
8 | weight: 810
9 | toc: true
10 | seo:
11 | title: "" # custom title (optional)
12 | description: "" # custom description (recommended)
13 | canonical: "" # custom canonical URL (optional)
14 | noindex: false # false (default) or true
15 | ---
16 |
17 | [BikeForums](https://www.bikeforums.net/) 是一个专注于骑行的在线社区,骑行爱好者可以在这里讨论各种与自行车相关的主题。网站包含多个讨论版块,涵盖了不同类型的骑行,如公路自行车、山地车、通勤骑行等。同时,用户可以在这里分享骑行经验、维修技巧、装备推荐,甚至讨论骑行赛事和训练计划。社区成员可以通过回帖互动、提出问题或提供建议,是一个非常活跃的自行车爱好者交流平台。
18 |
--------------------------------------------------------------------------------
/.codesandbox/tasks.json:
--------------------------------------------------------------------------------
1 | {
2 | // These tasks will run in order when initializing your CodeSandbox project.
3 | "setupTasks": [
4 | {
5 | "name": "Install Dependencies",
6 | "command": "npm install"
7 | }
8 | ],
9 |
10 | // These tasks can be run from CodeSandbox. Running one will open a log in the app.
11 | "tasks": {
12 | "start": {
13 | "name": "dev",
14 | "command": "npm run dev -- --baseURL=/ --appendPort=false --liveReloadPort=443 --bind=0.0.0.0",
15 | "runAtStart": true
16 | },
17 | "install": {
18 | "name": "install dependencies",
19 | "command": "npm install"
20 | }
21 | }
22 | }
23 |
--------------------------------------------------------------------------------
/.devcontainer/Dockerfile:
--------------------------------------------------------------------------------
1 | FROM mcr.microsoft.com/devcontainers/base:ubuntu-22.04
2 |
3 | RUN apt-get update && \
4 | apt-get install -y \
5 | ca-certificates \
6 | nodejs \
7 | npm \
8 | wget && \
9 | update-ca-certificates
10 |
11 | ARG HUGO_VERSION="0.131.0"
12 | RUN wget --quiet "https://github.com/gohugoio/hugo/releases/download/v${HUGO_VERSION}/hugo_extended_${HUGO_VERSION}_Linux-64bit.tar.gz" && \
13 | tar xzf hugo_extended_${HUGO_VERSION}_Linux-64bit.tar.gz && \
14 | rm -r hugo_extended_${HUGO_VERSION}_Linux-64bit.tar.gz && \
15 | mv hugo /usr/bin && \
16 | chmod 755 /usr/bin/hugo
17 |
18 | WORKDIR /src
19 | COPY ./ /src
20 |
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "awesome-cycling",
3 | "version": "0.0.0",
4 | "description": "Doks theme",
5 | "author": "Thulite",
6 | "license": "MIT",
7 | "scripts": {
8 | "create": "hugo new",
9 | "dev": "hugo server --disableFastRender --noHTTPCache",
10 | "format": "prettier **/** -w -c",
11 | "build": "hugo --minify --gc",
12 | "preview": "vite preview --outDir public"
13 | },
14 | "dependencies": {
15 | "@thulite/doks-core": "^1.7.0",
16 | "@thulite/images": "^3.3.0",
17 | "@thulite/inline-svg": "^1.1.0",
18 | "@thulite/seo": "^2.4.0",
19 | "@tabler/icons": "^3.12.0",
20 | "thulite": "^2.5.0"
21 | },
22 | "devDependencies": {
23 | "prettier": "^3.3.3",
24 | "vite": "^5.4.2"
25 | },
26 | "engines": {
27 | "node": ">=20.11.0"
28 | }
29 | }
--------------------------------------------------------------------------------
/config/_default/markup.toml:
--------------------------------------------------------------------------------
1 | defaultMarkdownHandler = "goldmark"
2 |
3 | [goldmark]
4 | [goldmark.extensions]
5 | linkify = false
6 | [goldmark.parser]
7 | autoHeadingID = true
8 | autoHeadingIDType = "github"
9 | [goldmark.parser.attribute]
10 | block = true
11 | title = true
12 | [goldmark.renderer]
13 | unsafe = true
14 |
15 | [highlight]
16 | anchorLineNos = false
17 | codeFences = true
18 | guessSyntax = false
19 | hl_Lines = ''
20 | hl_inline = false
21 | lineAnchors = ''
22 | lineNoStart = 1
23 | lineNos = false
24 | lineNumbersInTable = false
25 | noClasses = false
26 | noHl = false
27 | style = 'monokai'
28 | tabWidth = 2
29 |
30 | [tableOfContents]
31 | endLevel = 3
32 | ordered = false
33 | startLevel = 2
34 |
--------------------------------------------------------------------------------
/assets/favicon.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/assets/mask-icon.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/.github/workflows/super-linter.yml:
--------------------------------------------------------------------------------
1 | # This workflow executes several linters on changed files based on languages used in your code base whenever
2 | # you push a code or open a pull request.
3 | #
4 | # You can adjust the behavior by modifying this file.
5 | # For more information, see:
6 | # https://github.com/github/super-linter
7 | name: Lint Code Base
8 |
9 | on:
10 | push:
11 | branches: [ "hexo" ]
12 | pull_request:
13 | branches: [ "hexo" ]
14 | jobs:
15 | run-lint:
16 | runs-on: ubuntu-latest
17 | steps:
18 | - name: Checkout code
19 | uses: actions/checkout@v3
20 | with:
21 | # Full git history is needed to get a proper list of changed files within `super-linter`
22 | fetch-depth: 0
23 |
24 | - name: Lint Code Base
25 | uses: github/super-linter@v4
26 | env:
27 | VALIDATE_MARKDOWN: true
28 | DEFAULT_BRANCH: "hexo"
29 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
--------------------------------------------------------------------------------
/content/blog/example/index.md:
--------------------------------------------------------------------------------
1 | ---
2 | title: "Example Post"
3 | description: "Just an example post."
4 | summary: "You can use blog posts for announcing product updates and features."
5 | date: 2024-09-07T16:27:22+02:00
6 | lastmod: 2024-09-07T16:27:22+02:00
7 | draft: true
8 | weight: 50
9 | categories: []
10 | tags: []
11 | contributors: []
12 | pinned: false
13 | homepage: false
14 | seo:
15 | title: "" # custom title (optional)
16 | description: "" # custom description (recommended)
17 | canonical: "" # custom canonical URL (optional)
18 | noindex: false # false (default) or true
19 | ---
20 |
21 | Well-thought-through product announcements will help increase feature awareness and engage users with new functionality. Just like [sharing your public roadmap](https://canny.io/blog/should-you-have-a-public-roadmap/), it's also a great way to let potential customers see that you're constantly improving.
22 |
23 | ## Further reading
24 |
25 | - Read [How to announce product updates and features](https://canny.io/blog/announce-product-updates-features/)
26 |
--------------------------------------------------------------------------------
/content/docs/training-fitness/ai-bike-fitting.md:
--------------------------------------------------------------------------------
1 | ---
2 | title: "AI Bike Fitting"
3 | description: "Guides lead a user through a specific task they want to accomplish, often with a sequence of steps."
4 | summary: ""
5 | date: 2024-09-27T13:04:48+02:00
6 | lastmod: 2024-09-27T13:04:48+02:00
7 | draft: false
8 | weight: 810
9 | toc: true
10 | seo:
11 | title: "" # custom title (optional)
12 | description: "" # custom description (recommended)
13 | canonical: "" # custom canonical URL (optional)
14 | noindex: false # false (default) or true
15 | ---
16 |
17 | [AI Bike Fitting](https://bikelab.cn/ai-bike-fitting/)是一个免费的Fitting工具,仅需拍摄上传一段公路车骑行视频,AI自动分析姿势并给出建议。
18 |
19 | ## 使用方法
20 |
21 | 1. 拍摄角度:拍摄镜头位于公路车正侧面,左右均可,拍摄一段20秒内的视频。
22 | 2. 画面构成:保持画面中只出现一个人和一辆车,需要拍到人和车的全身。
23 | 3. 拍摄环境:可以把车架设在骑行台拍摄,手机和骑行台尽量摆放水平。也可以直接拍摄路面骑行实况,需要拍摄到车辆的前后轮。
24 | 4. 骑行姿势:骑行姿势放轻松,目视前方,踏频稳定,不站立摇车,手不离把。没穿锁鞋的情况下,脚不要在脚踏上移动位置。
25 | 5. 画面质量:保持光线良好,拍摄画面尽量不要出现拖影和模糊,也可使用慢动作模式拍摄。
26 | 6. 视频处理:截取骑行姿势最稳定的一段片段,上传前可用视频编辑类APP先剪裁掉有干扰的片段,为减少服务器资源占用,目前限制上传容量为30MB。
27 | 7. 上传视频:上传视频后,AI会自动分析姿势并给出建议,建议在上传后等待几分钟,AI分析完成后会有提示。
28 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | MIT License
2 |
3 | Copyright (c) 2020-2024 Thulite
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 |
--------------------------------------------------------------------------------
/content/docs/strava-garmin/gcw-and-strava-kudo-all.md:
--------------------------------------------------------------------------------
1 | ---
2 | title: "GCW and Strava Kudo All"
3 | description: ""
4 | summary: ""
5 | date: 2024-09-18T16:04:48+02:00
6 | lastmod: 2024-09-18T21:04:48+02:00
7 | draft: false
8 | weight: 810
9 | toc: true
10 | seo:
11 | title: "" # custom title (optional)
12 | description: "" # custom description (recommended)
13 | canonical: "" # custom canonical URL (optional)
14 | noindex: false # false (default) or true
15 | ---
16 |
17 | ## 功能介绍
18 |
19 | [GCW and Strava Kudo All](https://chromewebstore.google.com/detail/gcw%E5%92%8Cstrava%E4%B8%80%E9%94%AE%E7%82%B9%E8%B5%9E/folhiecfhnmdniibjjcfogpdoafdamoc) 是一个浏览器插件,用于在Strava网站或Garmin Connect网站上一键点赞好友的运动记录。
20 |
21 | ## 使用方法
22 |
23 | 前往Chrome应用商店安装[GCW and Strava Kudo All](https://chromewebstore.google.com/detail/gcw%E5%92%8Cstrava%E4%B8%80%E9%94%AE%E7%82%B9%E8%B5%9E/folhiecfhnmdniibjjcfogpdoafdamoc)即可:
24 |
25 | 
26 |
27 | 安装成功后,会在菜单栏显示一个点赞按钮,点击后即可为好友的运动记录一键点赞,确保友谊的小破车不会打翻。
28 |
29 | 
30 |
31 | 需要注意的是,因为Strava的活动记录是懒加载的,所谓懒加载就是它只加载部分好友活动,只有你往下翻才会继续加载一些活动,点赞只会点赞已经加载的活动,所以你想要给更多人点赞,需要继续下翻页面。
32 |
--------------------------------------------------------------------------------
/config/_default/languages.toml:
--------------------------------------------------------------------------------
1 | [en]
2 | languageName = "English"
3 | contentDir = "content/en"
4 | weight = 10
5 | [en.params]
6 | languageISO = "EN"
7 | languageTag = "en-US"
8 | footer = 'Brought to you by Thulite'
9 | alertText = 'Doks version 1.0 just shipped!'
10 |
11 | [de]
12 | languageName = "German"
13 | contentDir = "content/de"
14 | weight = 15
15 | [de.params]
16 | languageISO = "DE"
17 | languageTag = "de-DE"
18 | footer = 'Gebaut mit Thulite'
19 | alertText = 'Neue Version ist da! Doks v0.5'
20 |
21 | [nl]
22 | languageName = "Nederlands"
23 | contentDir = "content/nl"
24 | weight = 20
25 | [nl.params]
26 | languageISO = "NL"
27 | languageTag = "nl-NL"
28 | titleAddition = "Modern documentatie-thema"
29 | description = "Doks is een Hugo-thema waarmee je moderne documentatie-websites kunt bouwen die veilig, snel en klaar voor SEO zijn — standaard."
30 | titleHome = "Doks thema"
31 | footer = 'Mogelijk gemaakt door Netlify, Hugo, en Doks'
32 | alertText = 'Introductie van het Doks-kinderthema, verschillende DX + UX-updates en meer! Bekijk Doks v0.2'
33 |
--------------------------------------------------------------------------------
/config/_default/menus/menus.nl.toml:
--------------------------------------------------------------------------------
1 | [[docs]]
2 | name = "Prologue"
3 | weight = 10
4 | identifier = "prologue"
5 | url = "/docs/prologue/"
6 |
7 | [[docs]]
8 | name = "Help"
9 | weight = 60
10 | identifier = "help"
11 | url = "/docs/help/"
12 |
13 | [[main]]
14 | name = "Docs"
15 | url = "/docs/prologue/introduction/"
16 | weight = 10
17 |
18 | # [[main]]
19 | # name = "Blog"
20 | # url = "/blog/"
21 | # weight = 20
22 |
23 | [[social]]
24 | name = "GitHub"
25 | pre = ""
26 | url = "https://github.com/h-enk/doks"
27 | post = "v0.1.0"
28 | weight = 10
29 |
30 | [[social]]
31 | name = "X"
32 | pre = ""
33 | url = "https://twitter.com/getdoks"
34 | weight = 20
35 |
36 | # [[footer]]
37 | # name = "Privacy"
38 | # url = "/privacy-policy/"
39 | # weight = 10
40 |
--------------------------------------------------------------------------------
/netlify.toml:
--------------------------------------------------------------------------------
1 | [build]
2 | publish = "public"
3 | functions = "functions"
4 |
5 | [build.environment]
6 | NODE_VERSION = "20.11.0"
7 | NPM_VERSION = "10.2.4"
8 | HUGO_VERSION = "0.125.1"
9 |
10 | [context.production]
11 | command = "npm run build"
12 |
13 | [context.deploy-preview]
14 | command = "npm run build"
15 |
16 | [context.branch-deploy]
17 | command = "npm run build"
18 |
19 | [context.next]
20 | command = "npm run build"
21 |
22 | [context.next.environment]
23 | HUGO_ENV = "next"
24 |
25 | [dev]
26 | framework = "#custom"
27 | command = "npm run dev"
28 | targetPort = 1313
29 | port = 8888
30 | publish = "public"
31 | autoLaunch = false
32 |
33 | # Redirects and rewrites — https://docs.netlify.com/routing/redirects/#syntax-for-the-netlify-configuration-file
34 |
35 | # Custom headers — https://docs.netlify.com/routing/headers/#syntax-for-the-netlify-configuration-file
36 | [[headers]]
37 | for = "/*"
38 | [headers.values]
39 | Strict-Transport-Security = "max-age=31536000; includeSubDomains; preload"
40 | X-Content-Type-Options = "nosniff"
41 | X-XSS-Protection = "1; mode=block"
42 | Content-Security-Policy = "default-src 'self'; manifest-src 'self'; connect-src 'self'; font-src 'self'; img-src 'self' https://avatars.githubusercontent.com data:; script-src 'self' 'nonce-dXNlcj0iaGVsbG8iLGRvbWFpbj0iaGVua3ZlcmxpbmRlLmNvbSIsZG9jdW1lbnQud3JpdGUodXNlcisiQCIrZG9tYWluKTs=' 'sha256-aWZ3y/RxbBYKHXH0z8+8ljrHG1mSBvyzSfxSMjBSaXk='; style-src 'self'"
43 | X-Frame-Options = "SAMEORIGIN"
44 | Referrer-Policy = "strict-origin"
45 | Permissions-Policy = "geolocation=(self), microphone=(), camera=()"
46 | Cache-Control= '''
47 | public,
48 | max-age=31536000'''
49 | Access-Control-Allow-Origin = "*"
50 |
--------------------------------------------------------------------------------
/.github/workflows/blog-deploy.yml:
--------------------------------------------------------------------------------
1 | name: deploy
2 |
3 | on:
4 | push:
5 | workflow_dispatch:
6 | schedule:
7 | # Runs everyday at 8:00 AM
8 | - cron: "0 0 * * *"
9 |
10 | jobs:
11 | build:
12 | runs-on: ubuntu-latest
13 | env:
14 | HUGO_VERSION: 0.126.0
15 | steps:
16 | - name: Install Hugo CLI
17 | run: |
18 | wget -O ${{ runner.temp }}/hugo.deb https://github.com/gohugoio/hugo/releases/download/v${HUGO_VERSION}/hugo_extended_${HUGO_VERSION}_linux-amd64.deb \
19 | && sudo dpkg -i ${{ runner.temp }}/hugo.deb
20 | - name: Install Dart Sass
21 | run: sudo snap install dart-sass
22 | - name: Checkout
23 | uses: actions/checkout@v4
24 | with:
25 | submodules: recursive
26 | fetch-depth: 0
27 | - name: Setup Node.js
28 | uses: actions/setup-node@v4
29 | with:
30 | node-version: '20'
31 | cache: 'npm'
32 |
33 | - name: Setup Pages
34 | id: pages
35 | uses: actions/configure-pages@v4
36 | - name: Install dependencies
37 | run: "[[ -f package-lock.json || -f npm-shrinkwrap.json ]] && npm ci || true"
38 | - name: Build production website
39 | env:
40 | # For maximum backward compatibility with Hugo modules
41 | HUGO_ENVIRONMENT: production
42 | HUGO_ENV: production
43 | TZ: America/Los_Angeles
44 | run: |
45 | npm run build \
46 | -- \
47 | --baseURL "${{ steps.pages.outputs.base_url }}/"
48 |
49 | - name: Deploy Web
50 | uses: peaceiris/actions-gh-pages@v4
51 | with:
52 | personal_token: ${{ secrets.PERSONAL_TOKEN }}
53 | external_repository: Dunky-Z/awesome-cycling
54 | publish_branch: gh-pages
55 | publish_dir: ./public
56 | commit_message: ${{ github.event.head_commit.message }}
--------------------------------------------------------------------------------
/config/_default/module.toml:
--------------------------------------------------------------------------------
1 | # mounts
2 | ## archetypes
3 | [[mounts]]
4 | source = "node_modules/@thulite/doks-core/archetypes"
5 | target = "archetypes"
6 |
7 | [[mounts]]
8 | source = "archetypes"
9 | target = "archetypes"
10 |
11 | ## assets
12 | [[mounts]]
13 | source = "node_modules/@thulite/core/assets"
14 | target = "assets"
15 |
16 | [[mounts]]
17 | source = "node_modules/@thulite/images/assets"
18 | target = "assets"
19 |
20 | [[mounts]]
21 | source = "node_modules/@thulite/doks-core/assets"
22 | target = "assets"
23 |
24 | [[mounts]]
25 | source = "node_modules/@tabler/icons/icons"
26 | target = "assets/svgs/tabler-icons"
27 |
28 | [[mounts]]
29 | source = "assets"
30 | target = "assets"
31 |
32 | ## content
33 | [[mounts]]
34 | source = "content"
35 | target = "content"
36 |
37 | ## data
38 | [[mounts]]
39 | source = "node_modules/@thulite/doks-core/data"
40 | target = "data"
41 |
42 | [[mounts]]
43 | source = "data"
44 | target = "data"
45 |
46 | ## i18n
47 | [[mounts]]
48 | source = "node_modules/@thulite/doks-core/i18n"
49 | target = "i18n"
50 |
51 | [[mounts]]
52 | source = "i18n"
53 | target = "i18n"
54 |
55 | ## layouts
56 | [[mounts]]
57 | source = "node_modules/@thulite/core/layouts"
58 | target = "layouts"
59 |
60 | [[mounts]]
61 | source = "node_modules/@thulite/seo/layouts"
62 | target = "layouts"
63 |
64 | [[mounts]]
65 | source = "node_modules/@thulite/images/layouts"
66 | target = "layouts"
67 |
68 | [[mounts]]
69 | source = "node_modules/@thulite/doks-core/layouts"
70 | target = "layouts"
71 |
72 | [[mounts]]
73 | source = "node_modules/@thulite/inline-svg/layouts"
74 | target = "layouts"
75 |
76 | [[mounts]]
77 | source = "layouts"
78 | target = "layouts"
79 |
80 | ## static
81 | [[mounts]]
82 | source = "node_modules/@thulite/doks-core/static"
83 | target = "static"
84 |
85 | [[mounts]]
86 | source = "static"
87 | target = "static"
88 |
--------------------------------------------------------------------------------
/content/docs/race-datatracking/tour-tracker-grand-tours.md:
--------------------------------------------------------------------------------
1 | ---
2 | title: "Tour Tracker Grand Tours"
3 | description: "Guides lead a user through a specific task they want to accomplish, often with a sequence of steps."
4 | summary: ""
5 | date: 2024-09-07T16:04:48+02:00
6 | lastmod: 2024-09-07T16:04:48+02:00
7 | draft: false
8 | weight: 810
9 | toc: true
10 | seo:
11 | title: "" # custom title (optional)
12 | description: "" # custom description (recommended)
13 | canonical: "" # custom canonical URL (optional)
14 | noindex: false # false (default) or true
15 | ---
16 |
17 | 
18 |
19 | 
20 |
21 | 
22 |
23 | 
24 |
25 | 
26 |
27 | 
28 |
29 | 
30 |
31 | 
32 |
33 | 
34 |
35 | 
36 |
37 | 
--------------------------------------------------------------------------------
/config/_default/hugo.toml:
--------------------------------------------------------------------------------
1 | title = "Awesom-Cycling"
2 | baseurl = "http://localhost/"
3 | canonifyURLs = false
4 | disableAliases = true
5 | disableHugoGeneratorInject = true
6 | # disableKinds = ["taxonomy", "term"]
7 | enableEmoji = true
8 | enableGitInfo = false
9 | enableRobotsTXT = true
10 | languageCode = "en-US"
11 | paginate = 10
12 | rssLimit = 10
13 | summarylength = 20 # 70 (default)
14 |
15 | # Multilingual
16 | defaultContentLanguage = "en"
17 | disableLanguages = ["de", "nl"]
18 | defaultContentLanguageInSubdir = false
19 |
20 | copyRight = "Copyright (c) 2020-2024 Thulite"
21 |
22 | [build.buildStats]
23 | enable = true
24 |
25 | [outputs]
26 | home = ["HTML", "RSS", "searchIndex"]
27 | section = ["HTML", "RSS", "SITEMAP"]
28 |
29 | [outputFormats.searchIndex]
30 | mediaType = "application/json"
31 | baseName = "search-index"
32 | isPlainText = true
33 | notAlternative = true
34 |
35 | # Add output format for section sitemap.xml
36 | [outputFormats.SITEMAP]
37 | mediaType = "application/xml"
38 | baseName = "sitemap"
39 | isHTML = false
40 | isPlainText = true
41 | noUgly = true
42 | rel = "sitemap"
43 |
44 | [sitemap]
45 | changefreq = "monthly"
46 | filename = "sitemap.xml"
47 | priority = 0.5
48 |
49 | [caches]
50 | [caches.getjson]
51 | dir = ":cacheDir/:project"
52 | maxAge = -1 # "30m"
53 |
54 | [taxonomies]
55 | contributor = "contributors"
56 | category = "categories"
57 | tag = "tags"
58 |
59 | [permalinks]
60 | blog = "/blog/:slug/"
61 | docs = "/docs/:sections[1:]/:slug/"
62 | # docs = "/docs/1.0/:sections[1:]/:slug/"
63 |
64 | [minify.tdewolff.html]
65 | keepWhitespace = false
66 |
67 | [related]
68 | threshold = 80
69 | includeNewer = true
70 | toLower = false
71 | [[related.indices]]
72 | name = "categories"
73 | weight = 100
74 | [[related.indices]]
75 | name = "tags"
76 | weight = 80
77 | [[related.indices]]
78 | name = "date"
79 | weight = 10
80 |
81 | [imaging]
82 | anchor = "Center"
83 | bgColor = "#ffffff"
84 | hint = "photo"
85 | quality = 85
86 | resampleFilter = "Lanczos"
87 |
--------------------------------------------------------------------------------
/content/docs/equipment-components/zwifterbikes.md:
--------------------------------------------------------------------------------
1 | ---
2 | title: "ZwifterBikes"
3 | description: ""
4 | summary: ""
5 | date: 2024-09-27T13:04:48+02:00
6 | lastmod: 2024-09-27T13:04:48+02:00
7 | draft: false
8 | weight: 810
9 | toc: true
10 | seo:
11 | title: "" # custom title (optional)
12 | description: "" # custom description (recommended)
13 | canonical: "" # custom canonical URL (optional)
14 | noindex: false # false (default) or true
15 | ---
16 | [ZwifterBikes](https://zwifterbikes.web.app/) 是一个查询 Zwift 游戏中自行车的数据的网站,可以查询自行车的重量、空气动力学系数等信息。设定个人体能数据后,可以计算出不同自行车在不同地图中的性能表现。
17 |
18 | 
19 |
20 | ## 使用方式
21 |
22 | 进入网站后右侧边栏点击Rider,配置个人的基本信息:
23 |
24 | - 本次骑行的功率
25 | - 个人的FTP
26 | - 体重
27 | - 身高
28 |
29 | 主要就是第一项,是你准备本次骑行用多大功率去骑。
30 |
31 | 
32 |
33 | 当然有时候骑比赛,不会开启ERG,功率就会有大幅的变化,比如上坡功率大,下坡功率小,那么就可以拖动Pacing这个滑杆,模拟动态变化,表示你准备在哪个功率区间去骑。
34 |
35 | 
36 |
37 | 点击Bike,筛选出车辆类型,以及当前可购买的车:
38 |
39 | - Level表示Zwift中的等级,有的车只有打到特定等级才能购买
40 | - Drops表示你在Zwift中汗水余额,也是游戏中的货币,能筛选出你能买得起的车
41 | - 车辆类型筛选,一般勾选大组车,除非你有特殊需求如果你不想购买新车,可以勾选Only show items i own,只选车库已有的车
42 |
43 | 
44 |
45 | 完成基础配置后就可以根据地图选车了,点击Route,根据一些条件筛选出你准备骑的路线。
46 |
47 | 通常最常使用的是用关键词搜索,比如想要找Road to Sky这条路线,在最下面的文本框中输入road,或者sky,那么在最上面的下拉框中将只显示带有road的路线。
48 |
49 | 也可以根据路线的情况筛选,比如Road to Sky爬升有1000+,那么可以拖动Elevation滑杆到1000M,也能筛选出来。
50 |
51 | 
52 |
53 | 当你选择一条路线后,右侧将会自动计算出适合这条路线并满足你条件的所有车架与轮组。这些组合是以你当前条件下的最优解,每个组合右上角有骑完这条路线的预计时间以及能量消耗。你可以再根据自己的情况选择是买新车,还是用已有的装备。
54 |
55 | 
56 |
--------------------------------------------------------------------------------
/content/docs/routes-navigation/xingzhe-export-gpx.md:
--------------------------------------------------------------------------------
1 | ---
2 | title: "xingzhe-export-gpx"
3 | description: "Guides lead a user through a specific task they want to accomplish, often with a sequence of steps."
4 | summary: ""
5 | date: 2024-09-19T16:04:48+02:00
6 | lastmod: 2024-09-19T16:04:48+02:00
7 | draft: false
8 | weight: 810
9 | toc: true
10 | seo:
11 | title: "" # custom title (optional)
12 | description: "" # custom description (recommended)
13 | canonical: "" # custom canonical URL (optional)
14 | noindex: false # false (default) or true
15 | ---
16 |
17 | [xingzhe-export-gpx](https://github.com/weaming/xingzhe-export-gpx) 可以将行者运动App的数据导出为GPX文件,方便在其他平台上查看和分析。
18 |
19 | ## 下载编译
20 |
21 | 下载源码:
22 |
23 | ```bash
24 | git clone https://github.com/weaming/xingzhe-export-gpx.git
25 | cd xingzhe-export-gpx
26 | ```
27 |
28 |
29 | ```bash
30 | yarn; npm install typescript
31 | yarn build
32 | ```
33 |
34 | ## 获取cookie
35 |
36 | - 登录行者
37 | - 点击右上角用户名进入个人主页
38 | - F12打开浏览器开发者工具
39 | - 点击开发者工具“网络”选项卡
40 | - 刷新页面
41 | - 点击任意的网络请求,如get_user_info
42 | - 点击请求的“标头”
43 | - 往下翻,翻到Cookie,复制Cookie的所有内容,右击即可复制
44 |
45 | 
46 |
47 | ## 获取UserID
48 |
49 | - 还是刚刚的页面,切换到“标头”旁边的预览
50 | - 鼠标点击预览中的内容,Ctrl+F打开搜索框
51 | - 搜索userid,即可找到自己的userid
52 | - 眼尖的话,其实第二个请求里也有userid信息,都可以。
53 |
54 | 
55 |
56 | ## 配置config
57 |
58 | 将上面获取到的cookie和userid填入`config.js`中。
59 |
60 | ```ts
61 | const xingzhe_prefix = 'https://www.imxingzhe.com'
62 | const user_month_info = '/api/v4/user_month_info/'
63 | // 选择下载年份
64 | const year = '2023'
65 | // 填写个人user_id
66 | const user_id = '6413500'
67 | // 填写个人xingzhe cookie, https://imxingzhe.com
68 | const xingzhe_cookie = ''
69 | module.exports = {
70 | xingzhe_prefix,
71 | user_month_info,
72 | year,
73 | user_id,
74 | xingzhe_cookie,
75 | }
76 | ```
77 |
78 | ## 注意事项
79 |
80 | - 每次只能下载一年的数据,每次下载都会覆盖上一次下载结果,所以请下载下一年的数据时,先把数据复制出来。
81 | - 导入Strava就不用多介绍了,Strava主页右上角的+号,上传文件即可。
82 | - Strava上传GPX文件好像一天只能上传30个左右,如果数据很多的话就比较蛋疼了。会提示超过上传限制,请稍后再试。
83 |
--------------------------------------------------------------------------------
/layouts/index.html:
--------------------------------------------------------------------------------
1 | {{ define "main" }}
2 |
3 |
4 |
5 |
{{ .Title }}
6 |
7 |
8 |
{{ .Params.lead | safeHTML }}
9 |
10 |
Explore Now
11 | {{ .Content }}
12 |
13 |
14 |
15 | {{ end }}
16 |
17 | {{ define "sidebar-prefooter" }}
18 | {{ if site.Params.doks.backgroundDots -}}
19 |
22 | {{ end -}}
23 |
24 |
48 | {{ end }}
49 |
50 | {{ define "sidebar-footer" }}
51 | {{ if site.Params.doks.sectionFooter -}}
52 |
60 | {{ end -}}
61 | {{ end }}
62 |
--------------------------------------------------------------------------------
/config/postcss.config.js:
--------------------------------------------------------------------------------
1 | const autoprefixer = require('autoprefixer');
2 | const purgecss = require('@fullhuman/postcss-purgecss');
3 | const whitelister = require('purgecss-whitelister');
4 |
5 | module.exports = {
6 | plugins: [
7 | autoprefixer(),
8 | purgecss({
9 | content: ['./hugo_stats.json'],
10 | extractors: [
11 | {
12 | extractor: (content) => {
13 | const els = JSON.parse(content).htmlElements;
14 | return els.tags.concat(els.classes, els.ids);
15 | },
16 | extensions: ['json']
17 | }
18 | ],
19 | dynamicAttributes: [
20 | 'aria-expanded',
21 | 'data-bs-popper',
22 | 'data-bs-target',
23 | 'data-bs-theme',
24 | 'data-dark-mode',
25 | 'data-global-alert',
26 | 'data-pane', // tabs.js
27 | 'data-popper-placement',
28 | 'data-sizes',
29 | 'data-toggle-tab', // tabs.js
30 | 'id',
31 | 'size',
32 | 'type'
33 | ],
34 | safelist: [
35 | 'active',
36 | 'btn-clipboard', // clipboards.js
37 | 'clipboard', // clipboards.js
38 | 'disabled',
39 | 'hidden',
40 | 'modal-backdrop', // search-modal.js
41 | 'selected', // search-modal.js
42 | 'show',
43 | 'img-fluid',
44 | 'blur-up',
45 | 'lazyload',
46 | 'lazyloaded',
47 | 'alert-link',
48 | 'container-fw ',
49 | 'container-lg',
50 | 'container-fluid',
51 | 'offcanvas-backdrop',
52 | 'figcaption',
53 | 'dt',
54 | 'dd',
55 | 'showing',
56 | 'hiding',
57 | 'page-item',
58 | 'page-link',
59 | 'not-content',
60 | ...whitelister(['./assets/scss/**/*.scss', './node_modules/@thulite/doks-core/assets/scss/components/_code.scss', './node_modules/@thulite/doks-core/assets/scss/components/_expressive-code.scss', './node_modules/@thulite/doks-core/assets/scss/common/_syntax.scss'])
61 | ]
62 | })
63 | ]
64 | };
65 |
--------------------------------------------------------------------------------
/content/docs/strava-garmin/elevate-for-strava.md:
--------------------------------------------------------------------------------
1 | ---
2 | title: "Elevate for Strava"
3 | description: "Guides lead a user through a specific task they want to accomplish, often with a sequence of steps."
4 | summary: ""
5 | date: 2024-09-07T16:04:48+02:00
6 | lastmod: 2024-09-07T16:04:48+02:00
7 | draft: false
8 | weight: 810
9 | toc: true
10 | seo:
11 | title: "" # custom title (optional)
12 | description: "" # custom description (recommended)
13 | canonical: "" # custom canonical URL (optional)
14 | noindex: false # false (default) or true
15 | ---
16 |
17 | 推荐一个开源工具,[Elevate for Strava](https://github.com/thomaschampagne/elevate),可以为 Strava 提供丰富的数据分析功能,帮助骑行爱好者和运动员更好地了解自己的运动表现。目前有Web插件、Windows APP和MacOS APP。开发者表示未来主要是提供应用软件,插件开发可能投入会减少,如果想要更快更全面体验软件功能,推荐使用Windows APP或MacOS APP。因为Web插件使用更加方便,所以我就以Web插件为例进行介绍。
18 |
19 | ## 安装工具
20 |
21 | 以下是简单的安装步骤,App版本可以前往[Elevate for Strava](https://github.com/thomaschampagne/elevate)的github主页Release页面下载。
22 |
23 | 1. **安装扩展程序**
24 | - 用户可以通过 Chrome 或 Firefox 浏览器的扩展商店搜索“Elevate for Strava”,然后点击“安装”按钮。如果你是Chrome用户,可以点击[此链接](https://chromewebstore.google.com/detail/elevate-for-strava/dhiaggccakkgdfcadnklkbljcgicpckn)直达。其他浏览器可以[访问官网查看](https://thomaschampagne.github.io/elevate/#/landing)。
25 |
26 | 2. **同步 Strava 数据**
27 | - 安装完成后,用户需要登录他们的 Strava 账户,并授权 Elevate 访问其运动数据。之后,Elevate 将自动同步 Strava 数据,并开始生成各种分析报告。
28 | 
29 | 3. **配置和使用**
30 | - 用户可以根据自己的需求调整 Elevate 的设置,包括单位、分析参数等选项。
31 |
32 | ## 使用介绍
33 |
34 | 第一次导入成功后先别着急查看数据,先配置一下个人信息,参考下图。切记基本信息和Strava保持一致,不然重新导入真的很费时间,因为Strava接口请求有限制,你可以在Strava申请导出所有数据为文件,这样会快很多,后面再详细介绍。
35 |
36 | 
37 |
38 | 查看活动汇总
39 |
40 | 
41 |
42 | 设置年度目标,计算目标进度
43 |
44 | 
45 |
46 | 
47 |
48 | 你是不是也想知道自己关注的大佬功率是多少?嘿嘿,Elevate会根据大佬公开的数据,预估一个功率和工体比。以下就是范二特的一次骑行数据。
49 |
50 | 
51 |
52 | More Data!点击橙色的按钮,可以显示更多的数据信息,当然这些信息对于普通骑行者作用不大。对于业余车手可以通过这些数据来学习一下职业车手的骑行习惯。比如功率分配,踏频分配等等。
53 |
54 | 
--------------------------------------------------------------------------------
/config/_default/menus/menus.en.toml:
--------------------------------------------------------------------------------
1 | # [[docs]]
2 | # name = "Prologue"
3 | # weight = 10
4 | # identifier = "prologue"
5 | # url = "/docs/prologue/"
6 |
7 | # [[docs]]
8 | # name = "Help"
9 | # weight = 60
10 | # identifier = "help"
11 | # url = "/docs/help/"
12 |
13 | # [[docs]]
14 | # name = "Lorem"
15 | # weight = 70
16 | # identifier = "lorem"
17 | # url = "/docs/lorem/"
18 |
19 | [[guide]]
20 | name = "Lorem"
21 | weight = 10
22 | identifier = "lorem"
23 | url = "/guide/lorem/"
24 |
25 | [[tutorial]]
26 | name = "Lorem"
27 | weight = 10
28 | identifier = "lorem"
29 | url = "/tutorial/lorem/"
30 |
31 | [[main]]
32 | name = "Docs"
33 | url = "/docs/social-forums/BikeForums"
34 | # url = "/docs/1.0/prologue/introduction/"
35 | weight = 10
36 |
37 | # [[main]]
38 | # name = "Blog"
39 | # url = "/blog/"
40 | # weight = 30
41 |
42 | [[social]]
43 | name = "Strava"
44 | pre = ''
45 | url = "https://strava.com/athletes/117756825"
46 | weight = 10
47 |
48 | #
49 | # [[social]]
50 | # name = "Discord"
51 | # pre = ''
52 | # url = "https://getdoks.org/chat"
53 | # weight = 20
54 |
55 | [[social]]
56 | name = "GitHub"
57 | pre = ''
58 | url = "https://github.com/Dunky-Z/awesome-cycling.git"
59 | post = "v0.1.0"
60 | weight = 30
61 |
62 | #[[sidebar_docs]]
63 | # name = "AAAA"
64 | # pageRef = "/docs/a"
65 | # weight = 10
66 | #
67 | # [[sidebar_docs]]
68 | # name = "Reference"
69 | # pageRef = "/docs/reference"
70 | # weight = 20
71 | #
72 | # [[sidebar_docs]]
73 | # name = "Resources"
74 | # pageRef = "/docs/resources"
75 | # weight = 30
76 |
77 | [[footer]]
78 | name = "Privacy Policy"
79 | url = "/privacy/"
80 | weight = 10
81 |
82 | # [[footer]]
83 | # name = "Terms of Service"
84 | # url = "/terms/"
85 | # weight = 20
86 |
--------------------------------------------------------------------------------
/content/docs/strava-garmin/gear-automator.md:
--------------------------------------------------------------------------------
1 | ---
2 | title: "GearAutomator"
3 | description: "Guides lead a user through a specific task they want to accomplish, often with a sequence of steps."
4 | summary: ""
5 | date: 2024-09-18T16:04:48+02:00
6 | lastmod: 2024-09-18T21:04:48+02:00
7 | draft: false
8 | weight: 810
9 | toc: true
10 | seo:
11 | title: "" # custom title (optional)
12 | description: "" # custom description (recommended)
13 | canonical: "" # custom canonical URL (optional)
14 | noindex: false # false (default) or true
15 | ---
16 |
17 |
18 | GearAutomator 是[XiaoSiHwang](https://github.com/XiaoSiHwang)开发的一款可以生成 Strava 运动热图以及天气卡片的工具。
19 |
20 | ## 同步 Strava 数据
21 |
22 | GearAutomator 是一个可以生成 Strava 运动热图和天气卡片的工具,访问 [GearAutomator](https://www.gearaut.com),点击的`Connect with Strava`按钮,然后输入 Strava 的用户名和密码登录。
23 |
24 | 根据运动数据量不同,生成时间会有所不同,请勿关闭页面,等待生成完成。Strava 的 API 限制很严格,同步数据很慢,连接上 Strava 之后,建议干其他事情,等待数据同步完成,不用频繁刷新页面。我第一次同步数据不知道花了多久一直没有显示热图,以为这个工具失效了,后来某一天再次访问,发现热图已经生成了。
25 |
26 | ## 查看热图
27 |
28 | Zwift 虚拟骑行也会使用真实的 GPX 数据,所以在热力地图中也能看到有轨迹,虚拟骑行会用紫色轨迹表示,真实骑行会用绿色轨迹表示。图中紫色轨迹就是巴黎香街冲刺。绿色轨迹是一次路骑。
29 |
30 | 
31 |
32 | 
33 |
34 | ## 配置天气卡片
35 |
36 | Strava 订阅用户可以生成每次运动的天气卡片,可以在运动简介中看到这次运动时的天气情况,如图所示:
37 |
38 | 没有订阅的用户也可以通过这个工具来生成,在天气配置页面,开启即可:
39 |
40 | 
41 |
42 | 当下次有新的数据同步到 Strava 时,会自动在标题下面生成天气信息,如图所示:
43 |
44 | 
45 |
46 | 如果你想自定义天气卡片的样式,可以在天气卡片配置页面进行设置,比如将英文转换为中文:
47 |
48 | 
49 |
50 | 你可以直接复制下面的文本,替换即可:
51 |
52 | ```yaml
53 | 温度: ${temperature}
54 | 体感温度: ${apparentTemperature}
55 | 天气状况: ${skyCon}
56 | 湿度: ${humidity}
57 | 气压: ${pressure}
58 | 云量: ${cloudRate}
59 | 风速: ${windSpeed}
60 | 能见度: ${visibility}
61 | 空气质量:
62 | 空气质量指数(AQI): ${aqi}
63 | 细颗粒物(PM2.5): ${pm25}
64 | 可吸入颗粒物(PM10): ${pm10}
65 | 臭氧(O3): ${o3}
66 | 二氧化硫(SO2): ${so2}
67 | 二氧化氮(NO2): ${no2}
68 | 一氧化碳(CO): ${co}
69 | 紫外线强度(UV): ${uv}
70 | 地面接收的太阳辐射(DSWRF): ${dswrf}
71 | ```
72 |
73 | ```yaml
74 | 温度: ${startTemperature} - ${endTemperature}
75 | 体感温度: ${startApparentTemperature} - ${endApparentTemperature}
76 | 天气状况: ${startSkyCon} - ${endSkyCon}
77 | 湿度: ${startHumidity} - ${endHumidity}
78 | 气压: ${startPressure} - ${endPressure}
79 | 云量: ${startCloudRate} - ${endCloudRate}
80 | 风速: ${startWindSpeed} - ${endWindSpeed}
81 | 能见度: ${startVisibility} - ${endVisibility}
82 |
83 | 空气质量:
84 | 空气质量指数(AQI): ${startAqi} - ${endAqi}
85 | 细颗粒物(PM2.5): ${startPM25} - ${endPM25}
86 | 可吸入颗粒物(PM10): ${startPM10} - ${endPM10}
87 | 臭氧(O3): ${startO3} - ${endO3}
88 | 二氧化硫(SO2): ${startSO2} - ${endSO2}
89 | 二氧化氮(NO2): ${startNO2} - ${endNO2}
90 | 一氧化碳(CO): ${startCO} - ${endCO}
91 | 紫外线强度(UV): ${startUV} - ${endUV}
92 | 地面接收的太阳辐射(DSWRF): ${startDswrf} - ${endDswrf}
93 | ```
94 |
95 | ## Strava IFTTT 自动化工具
96 |
97 | 该功能可以根据设定的一些场景条件自动触发一些Strava的操作。点击左侧菜单栏Strava IFTTT,点击新建,可以看到如下页面,在此可以创建自己的自动化规则。接下来我会举例介绍该功能的使用。
98 |
99 | 
100 |
101 | ### 骑行运动时,自动在标题前添加骑行表情
102 |
103 | > 表情包可以从[getemoji网站](https://getemoji.com/)查找复制粘贴进去。
104 |
105 | 
106 |
107 | 1. 填写自动化名称:标题添加骑行图标
108 | 2. 设置字段条件:运动类型-包含-骑行,虚拟骑行,山地骑行,公路骑行
109 | 3. 点击新增Action
110 | 4. 选择:在原始标题前
111 | 5. 文本框中输入复制来的自行车表情包
112 | 6. 关闭文本框
113 | 7. 滑动页面底部,点击保存
114 | 8. 显示下图表示创建成功
115 |
116 | 
117 |
118 | 当我们有新的骑行运动数据产生时,会自动在标题前添加骑行表情。
119 |
120 | 
121 |
122 | ### 配速达到4分/km时,将Strava的装备设置为指定跑鞋
123 |
124 | 1. 填写自动化名称:配速小于4分换跑鞋
125 | 2. 设置字段条件:平均配速 - 小于 - 4
126 | 3. 点击新增Action
127 | 4. 选择:装备 - 选择想要切换的装备
128 | 5. 滑动页面底部,点击保存
129 |
130 | 
131 |
132 | 当下次新增的跑步数据配速小于4分时,会自动将装备设置为指定的跑鞋。
133 |
--------------------------------------------------------------------------------
/config/_default/params.toml:
--------------------------------------------------------------------------------
1 | # Hugo
2 | title = "Awesom-Cycling"
3 | description = "Congrats on setting up a new Doks project!"
4 | images = ["cover.png"]
5 |
6 | # mainSections
7 | mainSections = ["docs"]
8 |
9 | [social]
10 | twitter = "getdoks"
11 |
12 | # Doks (@thulite/doks-core)
13 | [doks]
14 | # Color mode
15 | colorMode = "auto" # auto (default), light or dark
16 | colorModeToggler = true # true (default) or false (this setting is only relevant when colorMode = auto)
17 |
18 | # Navbar
19 | navbarSticky = true # true (default) or false
20 | containerBreakpoint = "lg" # "", "sm", "md", "lg" (default), "xl", "xxl", or "fluid"
21 |
22 | ## Button
23 | navBarButton = false # false (default) or true
24 | navBarButtonUrl = "/docs/prologue/introduction/"
25 | navBarButtonText = "Get started"
26 |
27 | # FlexSearch
28 | flexSearch = true # true (default) or false
29 | searchExclKinds = [] # list of page kinds to exclude from search indexing (e.g. ["home", "taxonomy", "term"] )
30 | searchExclTypes = [] # list of content types to exclude from search indexing (e.g. ["blog", "docs", "legal", "contributors", "categories"])
31 | showSearch = [] # [] (all pages, default) or homepage (optionally) and list of sections (e.g. ["homepage", "blog", "guides"])
32 | indexSummary = false # true or false (default); whether to index only the `.Summary` instead of the full `.Content`; limits the respective JSON field size and thus increases loading time
33 |
34 | ## Search results
35 | showDate = false # false (default) or true
36 | showSummary = true # true (default) or false
37 | searchLimit = 99 # 0 (no limit, default) or natural number
38 |
39 | # Global alert
40 | alert = false # false (default) or true
41 | alertDismissable = true # true (default) or false
42 |
43 | # Bootstrap
44 | bootstrapJavascript = false # false (default) or true
45 |
46 | # Nav
47 | sectionNav = ["docs"] # ["docs"] (default) or list of sections (e.g. ["docs", "guides"])
48 | toTopButton = false # false (default) or true
49 | breadcrumbTrail = false # false (default) or true
50 | headlineHash = true # true (default) or false
51 | scrollSpy = true # true (default) or false
52 |
53 | # Multilingual
54 | multilingualMode = false # false (default) or true
55 | showMissingLanguages = true # whether or not to show untranslated languages in the language menu; true (default) or false
56 |
57 | # Versioning
58 | docsVersioning = false # false (default) or true
59 | docsVersion = "1.0"
60 |
61 | # UX
62 | headerBar = false # true (default) or false
63 | backgroundDots = true # true (default) or false
64 |
65 | # Homepage
66 | sectionFooter = false # false (default) or true
67 |
68 | # Blog
69 | relatedPosts = false # false (default) or true
70 | imageList = true # true (default) or false
71 | imageSingle = true # true (default) or false
72 |
73 | # Repository
74 | editPage = false # false (default) or true
75 | lastMod = false # false (default) or true
76 | repoHost = "GitHub" # GitHub (default), Gitea, GitLab, Bitbucket, or BitbucketServer
77 | docsRepo = "https://github.com/h-enk/doks"
78 | docsRepoBranch = "main" # main (default), master, or
79 | docsRepoSubPath = "" # "" (none, default) or
80 |
81 | # SCSS colors
82 | # backGround = "yellowgreen"
83 | ## Dark theme
84 | # textDark = "#dee2e6" # "#dee2e6" (default), "#dee2e6" (orignal), or custom color
85 | # accentDark = "#5d2f86" # "#5d2f86" (default), "#5d2f86" (original), or custom color
86 | ## Light theme
87 | # textLight = "#1d2d35" # "#1d2d35" (default), "#1d2d35" (orignal), or custom color
88 | # accentLight = "#8ed6fb" # "#8ed6fb" (default), "#8ed6fb" (orignal), or custom color
89 |
90 | # [doks.menu]
91 | # [doks.menu.section]
92 | # auto = true # true (default) or false
93 | # collapsibleSidebar = true # true (default) or false
94 |
95 | # Debug
96 | [render_hooks.image]
97 | errorLevel = 'ignore' # ignore (default), warning, or error (fails the build)
98 |
99 | [render_hooks.link]
100 | errorLevel = 'ignore' # ignore (default), warning, or error (fails the build)
101 | highlightBroken = false # true or false (default)
102 |
103 | # Images (@thulite/images)
104 | [thulite_images]
105 | [thulite_images.defaults]
106 | decoding = "async" # sync, async, or auto (default)
107 | fetchpriority = "auto" # high, low, or auto (default)
108 | loading = "lazy" # eager or lazy (default)
109 | widths = [480, 576, 768, 1025, 1200, 1440] # [640, 768, 1024, 1366, 1600, 1920] for example
110 | sizes = "auto" # 100vw (default), 75vw, or auto for example
111 | process = "" # "fill 1600x900" or "fill 2100x900" for example
112 | lqip = "16x webp q20" # "16x webp q20" or "21x webp q20" for example
113 |
114 | # Inline SVG (@thulite/inline-svg)
115 | [inline_svg]
116 | iconSetDir = "tabler-icons" # "tabler-icons" (default)
117 |
118 | # SEO (@thulite/seo)
119 | [seo]
120 | [seo.title]
121 | separator = " | "
122 | suffix = ""
123 | [seo.favicons]
124 | sizes = []
125 | icon = "favicon.png" # favicon.png (default)
126 | svgIcon = "favicon.svg" # favicon.svg (default)
127 | maskIcon = "mask-icon.svg" # mask-icon.svg (default)
128 | maskIconColor = "white" # white (default)
129 | [seo.schemas]
130 | type = "Organization" # Organization (default) or Person
131 | logo = "favicon-512x512.png" # Logo of Organization — favicon-512x512.png (default)
132 | name = "Thulite" # Name of Organization or Person
133 | sameAs = [] # E.g. ["https://github.com/thuliteio/thulite", "https://fosstodon.org/@thulite"]
134 | images = ["cover.png"] # ["cover.png"] (default)
135 | article = [] # Article sections
136 | newsArticle = [] # NewsArticle sections
137 | blogPosting = ["blog"] # BlogPosting sections
138 | product = [] # Product sections
139 |
--------------------------------------------------------------------------------
/content/docs/strava-garmin/intervals-icu.md:
--------------------------------------------------------------------------------
1 | ---
2 | title: "intervals.icu"
3 | description: ""
4 | summary: ""
5 | date: 2024-09-18T16:04:48+02:00
6 | lastmod: 2024-09-18T21:04:48+02:00
7 | draft: false
8 | weight: 810
9 | toc: true
10 | seo:
11 | title: "" # custom title (optional)
12 | description: "" # custom description (recommended)
13 | canonical: "" # custom canonical URL (optional)
14 | noindex: false # false (default) or true
15 | ---
16 |
17 | # Intervals.icu 网站介绍及使用指南
18 |
19 | ## 概述
20 |
21 | [intervals.icu](https://intervals.icu) 是一个专为运动员和教练设计的训练管理平台,主要服务于骑行和跑步等耐力运动。它通过深度数据分析和图表展示,帮助用户跟踪和优化训练计划、监控体能变化,并提供详细的性能分析。网站集成了多种运动数据源,能够将 Strava 等平台的数据导入并进一步分析。
22 |
23 | ## 功能介绍
24 |
25 | 1. **训练分析**
26 | - **功率曲线分析**:Intervals.icu 可以从功率计或智能骑行台获取数据,生成用户的功率曲线,帮助评估不同时间段的表现。
27 | - **训练负荷管理(CTL/ATL/TSB)**:通过计算用户的累积训练负荷(Chronic Training Load, CTL)、急性训练负荷(Acute Training Load, ATL)和训练压力平衡(Training Stress Balance, TSB),平台能够评估当前体能状况和疲劳水平,并提供调整训练的建议。
28 |
29 | 2. **心率和功率区间管理**
30 | - 该网站允许用户根据心率和功率区间来规划训练并监控每次训练的实际完成情况,帮助用户更精确地调整训练强度。
31 |
32 | 3. **个性化训练计划**
33 | - 用户可以制定长期或短期的训练计划,设定目标和预期,并跟踪每一次训练的达成情况。Intervals.icu 还支持根据过去的数据生成个性化的训练建议。
34 |
35 | 4. **数据可视化**
36 | - 网站提供多种形式的图表和图形展示,帮助用户理解训练数据。你可以查看不同维度的数据,包括功率、心率、速度、步频等,所有数据都可以直观地在图表上展示。
37 |
38 | 5. **康复与健康监测**
39 | - Intervals.icu 通过分析运动量,结合用户的主观感受(如疲劳和睡眠情况),为恢复期的训练计划提供建议,防止过度训练导致伤病。
40 |
41 | 6. **与第三方工具的集成**
42 | - 支持与 Strava 无缝集成,用户可以将 Strava 上的骑行或跑步记录自动同步到 Intervals.icu 上进行详细分析。此外,用户可以导入来自 Garmin、Zwift、TrainerRoad 等平台的数据。
43 |
44 | ## 使用指南
45 |
46 | 1. **注册与账号关联**
47 | - 访问 [intervals.icu](https://intervals.icu),通过 Strava 登录或创建一个独立账户。首次登录后,用户可以选择同步 Strava 数据,网站会导入过去的训练记录。
48 | - 
49 | - 你也可以选择以文件的形式导入训练记录
50 | - 
51 |
52 | 2. **设置个人训练区间**
53 | - 在“设置”页面中,根据个人的功率测试或心率监测结果,设置训练区间(Zones),包括功率区间、心率区间等。此功能有助于定制个性化的训练分析。
54 |
55 | 3. **分析训练数据**
56 | - 在每次训练结束后,系统会自动生成详细的训练分析报告。你可以在“Activity”页面查看每次训练的详细图表,包括功率、心率、踏频、速度等多维度的数据分析。
57 | - 
58 |
59 | 4. **监控康复与健康状况**
60 | - 在“健康度”页面,你可以看到体能变化的长时间趋势,以及恢复状况。根据 TSB(训练压力平衡)值,Intervals.icu 能够帮助用户识别疲劳或即将出现的过度训练风险。
61 | - 
62 |
63 | ## 制定训练计划
64 |
65 | ### 添加他人分享的训练计划
66 |
67 | 
68 |
69 | 点击**书本图标**显示训练课程库,会显示已经保存的训练课程,开始状态为空的,需要自行制定或添加。然后点击底部**搜索计划**,可以搜索到其他用户分享的训练计划,如果你还没有制定训练的经验,可以先添加其他人制定好的内容。下图显示了一些其他用户分享的训练计划:
70 |
71 | 
72 |
73 | 比如点击sumulige分享的训练计划后可以看到完整计划如下,点击**添加到资料库**,就可以在左侧的资料库中看到该计划,后续可以直接在资料库中查看
74 |
75 | 
76 |
77 | 因为打开网页时默认第一行就是当前日期,但是一般我们添加计划都是未来日期,你可以点击下图中的位置来显示未来日期,便于拖放训练计划。
78 |
79 | 
80 |
81 |
82 | 比如我想让制定的计划从01月06日开始,直接从资料库中拖动之前添加的计划到01月06日的格子里,ICU就会自动将所有训练都添加完成。
83 |
84 | 
85 |
86 | 添加完成后如图所示:
87 |
88 | 
89 |
90 | 如果你不小心拖错了日期,点击训练计划的第一个训练周六周日续时间,也就是01月06号那个训练按照以下步骤批量删除所有刚刚添加的训练:
91 |
92 | 
93 |
94 |
95 | ### 手动添加训练计划
96 |
97 | 如果你有自己的训练计划想要添加到ICU中,你可以逐个步骤添加,也可以通过ICU自己的语法快速添加计划。
98 |
99 | 点击日历中的任何一个日期,使用UI按钮逐步添加:
100 |
101 | 
102 |
103 | 
104 |
105 | 
106 |
107 | 
108 |
109 | 我更推荐使用ICU自己的语法快速添加,比如下面的训练计划:
110 |
111 | 
112 |
113 | 只需要以下的文本复制到**说明**文本框中即可生成训练计划:
114 |
115 | ```txt
116 | - Warm up 3m 110W
117 | - Active 3m 75%
118 | - Recovery 1m 55%
119 |
120 | 2x
121 | - Hard 15s 200%
122 | - Easy 1m 55%
123 |
124 |
125 | 1x
126 | - 1m 55%
127 | - 1m 65%
128 | - 1m 75%
129 | - 1m 85%
130 |
131 | - Recovery 1m 65%
132 |
133 | 10x
134 | - Hard 30s 115%
135 | - Easy 15s 65%
136 |
137 | - Recovery 4m 65%
138 |
139 | 10x
140 | - Hard 30s 115%
141 | - Easy 15s 65%
142 |
143 | - Cool Down 4m 110W
144 | ```
145 |
146 | 简单总结一下语法:
147 |
148 | - `-` 表示一个训练阶段
149 | - `-` 之后的文本是训练的描述
150 | - `m` 表示时间分钟
151 | - 每行最后是训练强度,可以用百分比表示FTP的百分比,也可以用具体的功率值表示
152 | - `x` 表示重复次数
153 | - 需要重复的阶段之间不能有空行,否则ICU会认为是不同的阶段
154 |
155 |
156 | ## 同步计划到Garmin Connect
157 |
158 | 
159 |
160 | 如果你想立刻同步计划到佳明,重新勾选一下“上传计划中的训练课程”即可手动上传,注意不是点击断开连接的标识哦,不是点击断开连接的标识哦,不是点击断开连接的标识哦。
161 |
162 | 捣鼓半天码表都不显示计划,原来是只能同步未来七天的计划。
163 |
164 | 
165 |
166 | ## ICU小技巧
167 |
168 | - 可以直接将日历中的训练拖到资料库,也可以反向操作
169 | - 在日历中找到一个训练,按住ALT拖动即可复制该训练
170 | - 添加完训练计划后,可以在健康度中查看未来的健康度曲线
171 |
--------------------------------------------------------------------------------
/content/docs/training-fitness/zwiftoffline.md:
--------------------------------------------------------------------------------
1 | ---
2 | title: "ZwiftOffline"
3 | description: ""
4 | summary: ""
5 | date: 2025-02-09T13:04:48+02:00
6 | lastmod: 2025-02-09T13:04:48+02:00
7 | draft: false
8 | weight: 810
9 | toc: true
10 | seo:
11 | title: "" # custom title (optional)
12 | description: "" # custom description (recommended)
13 | canonical: "" # custom canonical URL (optional)
14 | noindex: false # false (default) or true
15 | ---
16 |
17 | [ZwiftOffline](https://github.com/zoffline/zwift-offline?tab=readme-ov-file)是一个开源社区自制的 Zwift 的 server 端,可以在没有网络的情况下进行 Zwift 课程或路线训练,多平台支持。
18 |
19 | ## 安装 ZwiftOffline
20 |
21 | - 从[GitHub Release 页面](https://github.com/zoffline/zwift-offline/releases/latest)下载最新的 zoffline 发布版。
22 | - 找一个目录用于运行 Zwift offline,我新建了一个`zwiftoffline`目录,保存刚刚下载的`exe`文件,然后运行你下载的 zoffline.exe。一旦运行,zoffline 会在其所在的相同文件夹中创建一个`storage`目录,用以保存你的 Zwift 进度。生成`storage`目录后,按`Ctrl+C`先关闭 zoffline,稍后还有其他配置。
23 | - 
24 | - 前往[Zwift 官网](https://www.zwift.com/),拉到页面底部,可以看到安装链接,安装 Zwift 软件。记住安装的路径,我安装在了`C:\Program Files (x86)\Zwift`。
25 | - 
26 | - 运行 Zwift,这时候客户端会开始更新,因为安装的只是一个登录器,游戏本体还需要下载。**一定要安装之后就执行这一步,因为后续的配置会改变网络配置,导致无法下载游戏本体。**
27 | - 从[GitHub Rlease](https://github.com/oldnapalm/zoffline-helper/releases/latest)下载配置脚本等文件`zoffline-helper.zip`,将其也解压到`zwiftoffline`目录。
28 | - 进入`zwiftoffline/zoffline-helper`目录,右键点击`configure_client.bat`,选择以管理员身份运行。这个脚本会自动配置 zoffline,以便你可以在本地运行 Zwift。期间会弹窗让你选择Zwift目录,就是之前需要记住的安装目录:
29 | - 
30 | - 最终运行完的结果如下:
31 | - 
32 | - 进入`zwiftoffline`目录,双击`zoffline_1.0.140279.exe`,运行 zoffline。
33 | - 
34 | - 启动原版 Zwift 程序,**如果显示的页面还是原来 Zwift 的登录页面,看看是不是开了代理,关闭代理再试试**。
35 | - 
36 | - 下图是官方原版登录界面,**如果显示这个页面说明配置失败**:
37 | - 
38 | - 将输入法切换为微软英文输入法,点击`Start Zwift`即可开始游戏。如果是搜狗输入法将会卡在登录页面。
39 |
40 | ## 获取个人原来的 Zwift 资料信息
41 |
42 | 如果不配置这一项,那么使用 Zwift offline 骑行的时候,会显示你的信息是一个新的账号,而不是你原来的账号。
43 |
44 | 在登录页面可以进入设置:
45 |
46 | 
47 |
48 | 填写邮箱和密码,勾选所有选项,点击 Submit 即可:
49 |
50 | 
51 |
52 | 这样再登录到 Zwift 时就是原来的账号了。
53 |
54 | ## 链接 Strava 上传活动
55 |
56 | 登录[Strava](https://www.strava.com/settings/api),申请 API,获取`Client ID`和`Client Secret`。
57 |
58 | 填写内容可以参考下图:
59 |
60 | 
61 |
62 | 其中授权回调域填写:launcher.zwift.com
63 |
64 | 申请完成后会得到下面的信息:
65 |
66 | 
67 |
68 | 在登录页面可以进入设置,填写得到的`Client ID`和`Client Secret`。
69 |
70 | 
71 |
72 | 
73 |
74 | 
75 |
76 | 右击管理员运行`zoffline-helper/disable_zoffline.bat`,这一步把hosts的配置都清除。
77 |
78 | 命令行里运行`zoffline-helper/strava_auth.exe --client-id CLIENT_ID --client-secret CLIENT_SECRET`,把CLIENT_ID和CLIENT_SECRET替换成你的strava应用的client id和client secret。
79 |
80 | 浏览器打开`localhost:8000`授权访问。
81 |
82 | 
83 |
84 | 
85 |
86 | 把目录中生成的`strava_token.txt`移动到目录`storage/1`下。
87 |
88 | 右击管理员运行`zoffline-helper/configure_client.bat`,重新配置hosts。
89 |
90 | ## 上传训练课程
91 |
92 | 虽然Zwift有很多训练课程,但是我还是习惯在Intervals ICU上创建好自己的课程,然后上传到Zwift。虽然Intervals ICU上的课程可以直接同步到Zwift,但是单机版的没法同步这些课程,所以只能手动上传。
93 |
94 | 具体如何创建课程我就不多说了,这里假设你已经有了一系列`.zwo`训练课程文件,那么你只需要将其保存到`Documents/Zwift/Workouts/1`目录下即可:
95 |
96 | 
97 |
98 | > 注意哦,不是运行目录下的`zwiftoffline\storage\1\customworkouts`哦,开始我自作聪明把课程放到这个目录下,结果发现上传不了,后来才发现是放错了。
99 |
100 | 
101 |
102 | ## 常见问题
103 |
104 | ### 卡在蓝色登录界面
105 |
106 | 
107 |
108 | 进程管理中关闭Zwift,输入法需要切换为微软英文输入法重新登录:
109 |
110 | 
111 |
112 | ### 配置Zwiftoffline后无法更新Zwift
113 |
114 | 因为`configure_client.bat`会修改Hosts文件,导致无法连接到Zwift服务器,所以在更新Zwift时需要先关闭`zoffline`,然后再更新。可以进入`zwiftoffline/zoffline-helper`目录,右键点击`disable_zoffline.bat`,选择以管理员身份运行,可以清除网络配置,然后再打开Zwift开启更新。
115 |
116 | ### 更新是出现Z117错误,无法更新游戏
117 |
118 | 官方给出的原因和解决办法很多,但是都没能解决。你可以先使用我提供的方式看能否解决,如果不行再参考官方提供的方式。
119 |
120 | 方法一:
121 |
122 | 1. 如果你有代理(梯子),打开代理,更新订阅,更换节点后卸载重装Zwift。
123 |
124 | 方式二:
125 |
126 | 1. 如果你没有代理,你可以尝试换个网络环境,比如电脑连接手机热点来下载更新。
127 |
128 | 前两种方式参考讨论:[Z117 在 602 行 - 错误和支持 - Zwift 论坛 --- Z117 at Line 602 - Bugs and Support - Zwift Forums](https://forums.zwift.com/t/z117-at-line-602/573404)
129 |
130 | 方式三,官方解决方案:
131 |
132 | 
133 |
134 | ### 无法自动上传活动到Strava
135 |
136 |
--------------------------------------------------------------------------------
/hugo_stats.json:
--------------------------------------------------------------------------------
1 | {
2 | "htmlElements": {
3 | "tags": [
4 | "a",
5 | "article",
6 | "aside",
7 | "base",
8 | "blockquote",
9 | "body",
10 | "button",
11 | "circle",
12 | "code",
13 | "details",
14 | "div",
15 | "figcaption",
16 | "figure",
17 | "footer",
18 | "form",
19 | "g",
20 | "h1",
21 | "h2",
22 | "h3",
23 | "h5",
24 | "head",
25 | "header",
26 | "html",
27 | "img",
28 | "input",
29 | "kbd",
30 | "label",
31 | "li",
32 | "line",
33 | "link",
34 | "main",
35 | "meta",
36 | "nav",
37 | "noscript",
38 | "ol",
39 | "p",
40 | "path",
41 | "pre",
42 | "script",
43 | "section",
44 | "small",
45 | "span",
46 | "strong",
47 | "style",
48 | "summary",
49 | "svg",
50 | "template",
51 | "time",
52 | "title",
53 | "ul"
54 | ],
55 | "classes": [
56 | "DocSearch-Label",
57 | "active",
58 | "anchor",
59 | "bg-dots",
60 | "bi",
61 | "bi-strava",
62 | "blog-header",
63 | "btn",
64 | "btn-close",
65 | "btn-cta",
66 | "btn-lg",
67 | "btn-link",
68 | "btn-primary",
69 | "card",
70 | "card-body",
71 | "card-list",
72 | "categories",
73 | "chroma",
74 | "col-lg-10",
75 | "col-lg-11",
76 | "col-lg-12",
77 | "col-lg-5",
78 | "col-lg-8",
79 | "col-lg-9",
80 | "col-md-12",
81 | "col-xl-3",
82 | "col-xl-4",
83 | "col-xl-8",
84 | "col-xl-9",
85 | "container-fluid",
86 | "container-lg",
87 | "content",
88 | "contributors",
89 | "created-date",
90 | "d-flex",
91 | "d-lg-block",
92 | "d-lg-none",
93 | "d-md-block",
94 | "d-md-none",
95 | "d-none",
96 | "d-xl-block",
97 | "d-xl-none",
98 | "docs",
99 | "docs-content",
100 | "docs-links",
101 | "docs-sidebar",
102 | "docs-toc",
103 | "doks-sidebar",
104 | "error404",
105 | "expressive-code",
106 | "flex-column",
107 | "flex-grow-1",
108 | "flex-lg-row",
109 | "flex-md-row",
110 | "flex-row",
111 | "flex-sm-row",
112 | "flex-xl-nowrap",
113 | "footer",
114 | "form-control",
115 | "form-control-lg",
116 | "frame",
117 | "fs-5",
118 | "h-auto",
119 | "h5",
120 | "header",
121 | "highlight",
122 | "home",
123 | "icon",
124 | "icon-tabler",
125 | "icon-tabler-arrow-left",
126 | "icon-tabler-arrow-right",
127 | "icon-tabler-brand-github",
128 | "icon-tabler-dots-vertical",
129 | "icon-tabler-menu",
130 | "icon-tabler-moon",
131 | "icon-tabler-search",
132 | "icon-tabler-sun",
133 | "icon-tabler-x",
134 | "is-terminal",
135 | "justify-content-between",
136 | "justify-content-center",
137 | "justify-content-end",
138 | "justify-content-start",
139 | "lead",
140 | "list",
141 | "list-inline",
142 | "list-inline-item",
143 | "list-nested",
144 | "list-unstyled",
145 | "list-view",
146 | "m-2",
147 | "mb-0",
148 | "me-2",
149 | "me-auto",
150 | "me-lg-1",
151 | "me-lg-3",
152 | "message",
153 | "modal",
154 | "modal-body",
155 | "modal-content",
156 | "modal-dialog",
157 | "modal-dialog-scrollable",
158 | "modal-footer",
159 | "modal-fullscreen-md-down",
160 | "modal-header",
161 | "modal-title",
162 | "ms-2",
163 | "ms-3",
164 | "ms-auto",
165 | "ms-lg-2",
166 | "mt-3",
167 | "mt-n3",
168 | "mx-2",
169 | "mx-auto",
170 | "my-3",
171 | "nav",
172 | "nav-item",
173 | "nav-link",
174 | "navbar",
175 | "navbar-brand",
176 | "navbar-expand-lg",
177 | "navbar-nav",
178 | "not-content",
179 | "offcanvas",
180 | "offcanvas-body",
181 | "offcanvas-end",
182 | "offcanvas-header",
183 | "offcanvas-start",
184 | "offcanvas-title",
185 | "order-3",
186 | "order-lg-4",
187 | "p-0",
188 | "p-2",
189 | "page-footer-meta",
190 | "page-links",
191 | "page-nav",
192 | "pb-3",
193 | "privacy",
194 | "px-0",
195 | "query-no-results",
196 | "rounded-pill",
197 | "row",
198 | "search-form",
199 | "search-input",
200 | "search-loading",
201 | "search-no-recent",
202 | "search-no-results",
203 | "search-result",
204 | "search-results",
205 | "search-text",
206 | "section",
207 | "section-nav",
208 | "single",
209 | "social-link",
210 | "status",
211 | "sticky-top",
212 | "stretched-link",
213 | "submitted",
214 | "tags",
215 | "taxonomy",
216 | "text-body-secondary",
217 | "text-center",
218 | "text-decoration-none",
219 | "text-end",
220 | "text-lg-end",
221 | "text-lg-start",
222 | "text-muted",
223 | "text-reset",
224 | "title",
225 | "title-submitted",
226 | "toc-mobile",
227 | "visually-hidden",
228 | "w-100",
229 | "wrap"
230 | ],
231 | "ids": [
232 | "TableOfContents",
233 | "buttonColorMode",
234 | "doks-docs-nav",
235 | "h-rh-i-0",
236 | "h-rh-i-1",
237 | "h-rh-i-10",
238 | "h-rh-i-2",
239 | "h-rh-i-3",
240 | "h-rh-i-4",
241 | "h-rh-i-5",
242 | "h-rh-i-6",
243 | "h-rh-i-7",
244 | "h-rh-i-8",
245 | "h-rh-i-9",
246 | "intervalsicu-网站介绍及使用指南",
247 | "offcanvasNavMain",
248 | "offcanvasNavMainLabel",
249 | "offcanvasNavSection",
250 | "offcanvasNavSectionLabel",
251 | "query",
252 | "search-form",
253 | "searchModal",
254 | "searchModalLabel",
255 | "searchResults",
256 | "searchToggleDesktop",
257 | "searchToggleMobile",
258 | "socialMenu",
259 | "strava-ifttt-自动化工具",
260 | "toc",
261 | "下载编译",
262 | "使用介绍",
263 | "使用指南",
264 | "使用方式",
265 | "使用方法",
266 | "功能介绍",
267 | "同步-strava-数据",
268 | "安装工具",
269 | "查看热图",
270 | "概述",
271 | "注意事项",
272 | "获取cookie",
273 | "获取userid",
274 | "配置config",
275 | "配置天气卡片",
276 | "配速达到4分km时将strava的装备设置为指定跑鞋",
277 | "骑行运动时自动在标题前添加骑行表情"
278 | ]
279 | }
280 | }
281 |
--------------------------------------------------------------------------------
/README_CN.md:
--------------------------------------------------------------------------------
1 | # Awesome-cycling
2 |
3 | 收集与骑行相关的网站与工具。
4 |
5 | 部分网站和工具有详细使用文档,可以访问[Welcome to Awesome Cycling](https://lifeislife.cn/awesome-cycling/)参考。
6 |
7 | ## 图标含义介绍
8 |
9 | - :cn: - 表示对中国大陆地区开放的资源。
10 | - :moneybag: - 表示应用内有内购项目。
11 |
12 | ## 目录
13 |
14 | - [图标含义介绍](#图标含义介绍)
15 | - [目录](#目录)
16 | - [社交与论坛(Social & Forums)](#社交与论坛social--forums)
17 | - [新闻与媒体(News & Media)](#新闻与媒体news--media)
18 | - [赛事与数据跟踪(Race & Data Tracking)](#赛事与数据跟踪race--data-tracking)
19 | - [Strava 和 Garmin 相关工具(Strava & Garmin Tools)](#strava-和-garmin-相关工具strava--garmin-tools)
20 | - [数据分析与可视化(Data Analysis & Visualization)](#数据分析与可视化data-analysis--visualization)
21 | - [训练与健康管理(Training & Fitness)](#训练与健康管理training--fitness)
22 | - [路线与导航工具(Routes & Navigation)](#路线与导航工具routes--navigation)
23 | - [设备与零配件(Equipment & Components)](#设备与零配件equipment--components)
24 |
25 | ## 社交与论坛(Social & Forums)
26 |
27 | - [Reddit](https://www.reddit.com/r/bicycling/) - 自行车的 Reddit 社区。
28 | - [Bike Forums](http://www.bikeforums.net/) - 自行车论坛。
29 |
30 | ## 新闻与媒体(News & Media)
31 |
32 | - [Cycling News](http://www.cyclingnews.com/) - 自行车新闻。
33 | - [Bike Radar](http://www.bikeradar.com/) - 自行车新闻和评论。
34 | - [Cycling Weekly](http://www.cyclingweekly.co.uk/) - 自行车新闻和评论。
35 | - [Pink Bike](http://www.pinkbike.com/) - 自行车新闻和评论。
36 | - [LanterneRouge](https://lanternerouge.com/) - 自行车新闻和评论,根据大环赛爬坡表现对车手的 W/Kg 进行估计。
37 | - [Tiz-Cycling](https://tiz-cycling.tv/) - 收录了自行车赛事直播回放,包括各大环赛的回放。
38 | - [Cycling Stream](https://cyclingstream.com/) - 收录了自行车赛事直播回放,同时还有直播实况。
39 |
40 | ## 赛事与数据跟踪(Race & Data Tracking)
41 |
42 | - [Tour Tracker](https://live.thetourtracker.com/) - [ :cn: ] 赛事跟踪工具,提供各大赛事的实时数据以及参赛车队和队员的数据等,目前适配了 Android 和 iOS。Web 版提供了部分功能。
43 | - [ProCyclingStats](https://www.procyclingstats.com/) - [ :cn: ] 提供了自行车赛事的数据,包括赛程、车队、车手非常全面的数据,PCS 堪称自行车运动数据库。
44 |
45 | ## Strava 和 Garmin 相关工具(Strava & Garmin Tools)
46 |
47 | - [Elevate for Strava](https://github.com/thomaschampagne/elevate) - [ :cn: ] Strava 增强工具,提供了更多的数据和图表。目前适配了浏览器插件,Windows 以及 MacOS。
48 | - [DailySync](https://gitlab.com/gooin/dailysync) - [ :cn: ] 一个可以将 Strava 数据同步到 Garmin Connect 的工具。打通佳明中国区与国际区,您的骑行/跑步数据时刻保持同步。
49 | - [GCW and Strava Kudo All](https://github.com/Likenttt/gcw-strava-kudo-all) - [ :cn: ] 一款浏览器插件,用于在 GCW(Garmin Connect Web)和 Strava 中一键批量点赞。
50 | - [GCW Enhancement](https://chromewebstore.google.com/detail/gcw-enhancement/kekllebheolphbonigihnnbakpobfcpo) - [ :cn: ] 一款浏览器插件,用于导入导出 Garmin Connect Web 的训练数据。
51 | - [Sauce for Strava](https://www.sauce.llc/) - [ :cn: ] Strava 增强工具,一款浏览器插件,将 Strava 网页界面增强提供了更多的数据分析功能,亮点功能是可以进行指定赛段的功率估算,其它功能也非常实用。
52 | - [mywindsock](https://mywindsock.com/) - [ :en: :moneybag: ] Strava 增强工具 | 风向预测平台,绑定后自动在 Strava 活动备注中提供活动的天气报告,最重要的是风向的影响,也可通过网页提前预估路书的风向,付费获得更多功能。
53 | - [Riduck](https://riduck.com/) - [ :cn: ] Strava 增强工具 | 数据分析平台,绑定后自动在 Strava 活动备注中提供活动的功率心理报告,也可通过网页进行数据综合分析,数据全面度低于 Intervals.icu,但其估计的 FTP,VO2MAX 更具指导意义。
54 | - [klimat](https://klimat.app/) - [ :en: :moneybag: ] Strava 增强工具 | 风向预测平台,绑定后自动在 Strava 活动备注中提供活动的天气报告,只能免费 90 个活动。
55 | - [Strava Statistics](https://github.com/robiningelbrecht/strava-statistics) - [ :cn: ] Strava-statistics 是一个自托管工具,利用 Strava 数据生成个人运动统计,支持 Docker 部署,提供丰富的可视化分析。
56 | - [MyWhoosh2Garmin](https://github.com/JayQueue/MyWhoosh2Garmin) - [ :cn: ] 一个用于将 MyWhoosh 数据同步到 Garmin Connect 的工具。
57 | - [Strava integration for Home Assistant](https://github.com/craibo/ha_strava) - [ :cn: ] 一个用于将 Strava 数据集成到 Home Assistant 的工具。
58 |
59 | ## 数据分析与可视化(Data Analysis & Visualization)
60 |
61 | - [Gear Automator](https://www.gearaut.com/heatmap) - [ :cn: ] Strava 数据生成骑行热力图工具。
62 | - [Intervals.icu](https://intervals.icu/) - [ :cn: ] 一个免费的训练分析工具,可以导入 Strava 平台的数据,提供了更多的数据分析和图表。
63 | - [VeloViewer](https://veloviewer.com/) - [ :cn: :moneybag: ] 一个 Strava 数据综合分析平台,更倾向于分析整体的数据,可以生成大环赛级别的海拔爬升图和 3D 路线图 (Strava 所有赛段免费)。
64 | - [Sanluca](https://sanluca.cc/) - [ :cn: ] 生成大环赛级别的海拔爬升图和路线图,免费支持上传自己的 GPX 路书文件。
65 | - [Tapiriik](https://tapiriik.com/) - [ :cn: ] 一个用于各种平台之间同步运动数据的工具。
66 | - [ZwiftHub](https://zwifthub.com/) - [ :cn: ] ZwiftHub 可让用于跟踪已经获得的 Zwift 路线徽章。它还提供了一个灵活的界面,用于按世界、地图时间表、距离等过滤路线。
67 | - [Running Page](https://github.com/yihong0618/running_page) - [ :cn: ] 一个用于生成跑步数据的可视化页面,可以导入 Strava 数据,生成跑步数据的可视化页面。
68 |
69 | ## 训练与健康管理(Training & Fitness)
70 |
71 | - [BikeLAB 单车实验室](https://bikelab.cn/ai-bike-fitting/) - [ :cn: ] 基于人工智能的 Fitting 工具。
72 | - [GoldenCheetah](https://github.com/goldencheetah/goldencheetah) - [ :cn: ] 一个极其专业的运动员管理训练分析的开源本地工具,可自定义程度极高,可以自动导入 Strava 等平台的轨迹,还可以连接室内骑行台进行训练。
73 | - [Zwift](https://www.zwift.com/) - [ :cn: :moneybag: ] 室内骑行平台,可以通过连接智能骑行台进行训练,提供了虚拟世界的骑行体验。
74 | - [ZwiftOffline](https://github.com/zoffline/zwift-offline) - 离线版 Zwift,社区自制的 Zwift 的 server 端,可以在没有网络的情况下进行 Zwift 课程或路线训练,多平台支持。
75 | - [Zoffline-CN-Tool](https://github.com/kanhao100/zoffline-cn-tool) - [ :cn: ] Zoffline-CN-Tool 是一个用于管理和切换 Zwift 官方服务器与社区服务器的图形化工具。它提供了一个简单的界面来帮助用户完成 Zoffline 社区服 在大陆地区特殊网络环境的相关的配置任务 [ 本地反代 + 自签证书 ]。
76 | - [netbrain/zwift](https://github.com/netbrain/zwift) - 一个用于在 Linux 系统上运行 Zwift 的 Docker 镜像工具,使用 Wine 模拟 Windows 环境,支持智能骑行台和蓝牙设备连接,配合 Zwift Companion 应用使用。
77 | - [Source4Zwift](https://source4zwift.com/) - [ :moneybag: ] Zwift 的功能扩展工具,可以在骑行时查看更多的数据。
78 | - [TrainerRoad](https://www.trainerroad.com/) - [ :cn: :moneybag: ] 室内骑行平台,提供了专业的训练计划和训练数据分析。
79 | - [Bbiketerra](https://biketerra.com/) - [ :cn: :moneybag: ] 室内虚拟骑行训练网页,可以上传自己的 gpx 路书文献生成三维地形画面,需要连接功率骑行台
80 | - [Indievelo](https://indievelo.com/) - [ :cn: ] 室内骑行平台,有独特的天气系统,风速风向都会影响骑行表现,目前可免费使用。
81 | - [Auuki](https://github.com/dvmarinoff/Auuki) - [ :cn: ] 一个用于自行车训练的开源工具,可以通过连接 ANT+ 设备进行训练。
82 | - [RoadCaptain](https://github.com/sandermvanvliet/RoadCaptain) - [ :cn: ] 在 Zwift 中构建和骑行自定义路线,提升您的室内骑行体验。
83 | - [zwo-editor](https://github.com/breiko83/zwo-editor) - [ :cn: ] 一个用于编辑 Zwift 训练课程的工具。
84 |
85 | ## 路线与导航工具(Routes & Navigation)
86 |
87 | - [Komoot](https://www.komoot.com/) - [ :en: :moneybag: ] 专业的骑行路书规划编辑平台,优秀的路径规划,多平台支持,但国内部分地图路网较旧。
88 | - [GPX Studio](https://gpx.studio/) - 免费的在线 GPX 文件编辑器,具有高级路线规划、文件处理工具和 3D 可视化功能。
89 | - [IGPSPORT2Xingzhe](https://github.com/kvnZero/IGPSPORT2Xingzhe) - [ :cn: ] IGPSPORT 骑行数据导入行者工具。
90 | - [xingzhe-export-gpx](https://github.com/weaming/xingzhe-export-gpx) - [ :cn: ] 将行者骑行数据批量导出为 GPX 格式。
91 | - [GOTOES](https://gotoes.org/) - [ :cn: ] GPX、FIT、TCX 轨迹文件编辑工具。
92 | - [EasyGPS](https://github.com/ZhangKeLiang0627/EasyGPS) - 基于 C 语言开发,采用 ESP32S3R8 板的开源 GPS 自行车码表。
93 | - [X-TRACK](https://github.com/FASTSHIFT/X-TRACK) - 开源 GPS 自行车码表。
94 | - [Windy](https://windy.app/) - [ :cn: ] 一个天气预报和风向预测工具,可以查看全球范围内的风向和风速,适合长途骑行前根据风向规划路线。
95 |
96 | ## 设备与零配件(Equipment & Components)
97 |
98 | - [Compare the Watts](https://compare-the-watts.com/) - [ :cn: ] 一个比较不同功率计数据的工具,可以使用它评估不同功率计的一致性。
99 | - [BikeInsights](https://bikeinsights.com) - [ :cn: ] 一个数据丰富的自行车信息数据库,可以查询自行车的尺寸、几何、重量等信息。便于对比不同品牌和型号的自行车。
100 | - [BicycleRollingResistance](https://www.bicyclerollingresistance.com/) - [ :cn: :moneybag: ] 一个查询自行车轮胎滚阻、防刺、重量等的数据库网站。
101 | - [GearCalculator](https://gear-calculator.com/) - [ :cn: ] 一个用于计算自行车变速比、齿轮比和传动比的网站。通过输入自行车的齿盘、飞轮齿数、轮胎尺寸等参数,骑行者可以直观地看到不同齿轮组合下的速度、踏频、以及每次踏动的距离。
102 | - [ZwifterBikes](https://zwifterbikes.web.app/) - [ :cn: ] 一个查询 Zwift 游戏中自行车的数据的网站,可以查询自行车的重量、空气动力学系数等信息。设定个人体能数据后,可以计算出不同自行车在不同地图中的性能表现。
103 | - [自行车计算器](https://pan.baidu.com/s/1gdmoQCr) - [ :cn: ] 一个 Windows 应用程序,用以计算齿比和辐条长度等,内置有常用传动套件、外胎的数据库,简单易用,更直观地看到不同齿轮组合下的速度、踏频,国内论坛 77bike 的大佬制作。
104 | - [vpower](https://github.com/oldnapalm/vpower) - [ :cn: ] ANT+ 虚拟功率计项目,适用于自行车涡轮训练器,支持多种训练器和设备,提供虚拟功率计算和广播功能。
105 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # Awesome Cycling [](https://github.com/sindresorhus/awesome)
2 |
3 | A collection of cycling-related websites and tools.
4 |
5 | [中文版本](README_CN.md)
6 |
7 | For detailed documentation of some websites and tools, please visit [Welcome to Awesome Cycling](https://lifeislife.cn/awesome-cycling/).
8 |
9 | ## Table of Contents
10 |
11 | - [Social & Forums](#social--forums)
12 | - [News & Media](#news--media)
13 | - [Race & Data Tracking](#race--data-tracking)
14 | - [Strava & Garmin Tools](#strava--garmin-tools)
15 | - [Data Analysis & Visualization](#data-analysis--visualization)
16 | - [Training & Fitness](#training--fitness)
17 | - [Routes & Navigation](#routes--navigation)
18 | - [Equipment & Components](#equipment--components)
19 |
20 | ## Social & Forums
21 |
22 | - [Reddit](https://www.reddit.com/r/bicycling/) - Reddit community for bicycling.
23 | - [Bike Forums](http://www.bikeforums.net/) - Bicycle forums.
24 |
25 | ## News & Media
26 |
27 | - [Cycling News](http://www.cyclingnews.com/) - Cycling news.
28 | - [Bike Radar](http://www.bikeradar.com/) - Cycling news and reviews.
29 | - [Cycling Weekly](http://www.cyclingweekly.co.uk/) - Cycling news and reviews.
30 | - [Pink Bike](http://www.pinkbike.com/) - Cycling news and reviews.
31 | - [LanterneRouge](https://lanternerouge.com/) - Cycling news and reviews, estimates riders' W/Kg based on Grand Tour climbing performance.
32 | - [Tiz-Cycling](https://tiz-cycling.tv/) - Collection of cycling race broadcasts replays, including Grand Tours.
33 | - [Cycling Stream](https://cyclingstream.com/) - Collection of cycling race broadcasts replays and live streams.
34 |
35 | ## Race & Data Tracking
36 |
37 | - [Tour Tracker](https://live.thetourtracker.com/) - Race tracking tool providing real-time data for major races, teams, and riders. Available on Android and iOS, with partial functionality on web version.
38 | - [ProCyclingStats](https://www.procyclingstats.com/) - Comprehensive database for cycling races, including schedules, teams, and rider statistics.
39 |
40 | ## Strava & Garmin Tools
41 |
42 | - [Elevate for Strava](https://github.com/thomaschampagne/elevate) - Strava enhancement tool providing additional data and charts. Available as browser extension, Windows, and MacOS applications.
43 | - [DailySync](https://gitlab.com/gooin/dailysync) - Tool to sync Strava data with Garmin Connect.
44 | - [GCW and Strava Kudo All](https://github.com/Likenttt/gcw-strava-kudo-all) - Browser extension for batch kudos on GCW (Garmin Connect Web) and Strava.
45 | - [GCW Enhancement](https://chromewebstore.google.com/detail/gcw-enhancement/kekllebheolphbonigihnnbakpobfcpo) - Browser extension for importing/exporting Garmin Connect Web training data.
46 | - [Sauce for Strava](https://www.sauce.llc/) - Browser extension enhancing Strava web interface with additional analysis features.
47 | - [mywindsock](https://mywindsock.com/) - Strava enhancement tool and wind prediction platform.
48 | - [Riduck](https://riduck.com/) - Strava enhancement tool for data analysis.
49 | - [klimat](https://klimat.app/) - Strava enhancement tool for weather reporting.
50 | - [Strava Statistics](https://github.com/robiningelbrecht/strava-statistics) - Self-hosted tool generating personal activity statistics using Strava data.
51 | - [MyWhoosh2Garmin](https://github.com/JayQueue/MyWhoosh2Garmin) - Tool for syncing MyWhoosh data to Garmin Connect.
52 | - [Strava integration for Home Assistant](https://github.com/craibo/ha_strava) - Tool for syncing Strava data to Home Assistant.
53 |
54 | ## Data Analysis & Visualization
55 |
56 | - [Gear Automator](https://www.gearaut.com/heatmap) - Tool for generating cycling heatmaps from Strava data.
57 | - [Intervals.icu](https://intervals.icu/) - Free training analysis tool with Strava data import capabilities.
58 | - [VeloViewer](https://veloviewer.com/) - Comprehensive Strava data analysis platform.
59 | - [Sanluca](https://sanluca.cc/) - Generate Grand Tour-style elevation profiles and route maps.
60 | - [Tapiriik](https://tapiriik.com/) - Tool for syncing activities between various platforms.
61 | - [ZwiftHub](https://zwifthub.com/) - Track Zwift route badges and filter routes by world, map schedule, distance, etc.
62 | - [Running Page](https://github.com/yihong0618/running_page) - Generate visualization pages for running data with Strava import support.
63 |
64 | ## Training & Fitness
65 |
66 | - [BikeLAB](https://bikelab.cn/ai-bike-fitting/) - AI-based bike fitting tool.
67 | - [GoldenCheetah](https://github.com/goldencheetah/goldencheetah) - Professional open-source training analysis tool.
68 | - [Zwift](https://www.zwift.com/) - Indoor cycling platform with virtual world experience.
69 | - [ZwiftOffline](https://github.com/zoffline/zwift-offline) - Offline version of Zwift for training without internet connection.
70 | - [Zoffline-CN-Tool](https://github.com/kanhao100/zoffline-cn-tool) - GUI tool for managing Zwift official and community servers.
71 | - [netbrain/zwift](https://github.com/netbrain/zwift) - Docker image for running Zwift on Linux systems using Wine to emulate Windows environment, supports smart trainers and Bluetooth devices with Zwift Companion app.
72 | - [Source4Zwift](https://source4zwift.com/) - Zwift functionality extension tool.
73 | - [TrainerRoad](https://www.trainerroad.com/) - Indoor cycling platform with professional training plans.
74 | - [Bbiketerra](https://biketerra.com/) - Indoor virtual cycling training website.
75 | - [Indievelo](https://indievelo.com/) - Indoor cycling platform with unique weather system.
76 | - [Auuki](https://github.com/dvmarinoff/Auuki) - Open-source cycling training tool with ANT+ device support.
77 | - [RoadCaptain](https://github.com/sandermvanvliet/RoadCaptain) - Build and ride custom routes in Zwift, enhancing your indoor cycling experience.
78 | - [zwo-editor](https://github.com/breiko83/zwo-editor) - Tool for editing Zwift training courses.
79 |
80 | ## Routes & Navigation
81 |
82 | - [Komoot](https://www.komoot.com/) - Professional route planning and editing platform.
83 | - [GPX Studio](https://gpx.studio/) - Free online GPX file editor with advanced route planning, file processing tools, and 3D visualization capabilities.
84 | - [IGPSPORT2Xingzhe](https://github.com/kvnZero/IGPSPORT2Xingzhe) - IGPSPORT cycling data import tool.
85 | - [xingzhe-export-gpx](https://github.com/weaming/xingzhe-export-gpx) - Batch export tool for cycling data to GPX format.
86 | - [GOTOES](https://gotoes.org/) - GPX, FIT, TCX track file editor.
87 | - [EasyGPS](https://github.com/ZhangKeLiang0627/EasyGPS) - Open-source GPS bike computer based on ESP32S3R8.
88 | - [X-TRACK](https://github.com/FASTSHIFT/X-TRACK) - Open-source GPS bike computer.
89 | - [Windy](https://windy.app/) - Weather forecast and wind prediction tool.
90 |
91 | ## Equipment & Components
92 |
93 | - [Compare the Watts](https://compare-the-watts.com/) - Tool for comparing power meter data.
94 | - [BikeInsights](https://bikeinsights.com) - Comprehensive bicycle information database.
95 | - [BicycleRollingResistance](https://www.bicyclerollingresistance.com/) - Database for bicycle tire rolling resistance, puncture protection, and weight.
96 | - [GearCalculator](https://gear-calculator.com/) - Calculator for bicycle gear ratios and transmission ratios.
97 | - [ZwifterBikes](https://zwifterbikes.web.app/) - Database for Zwift in-game bicycle specifications.
98 | - [Bicycle Calculator](https://pan.baidu.com/s/1gdmoQCr) - Windows application for calculating gear ratios and spoke lengths.
99 | - [vpower](https://github.com/oldnapalm/vpower) - ANT+ Virtual Power Meter project for bicycle turbo trainers, supporting various trainers and devices, providing virtual power calculation and broadcasting functionality.
100 |
--------------------------------------------------------------------------------
/content/docs/strava-garmin/strava-statistics.md:
--------------------------------------------------------------------------------
1 | ---
2 | title: "Strava Statistics"
3 | description: ""
4 | summary: ""
5 | date: 2025-02-20T16:04:48+02:00
6 | lastmod: 2025-02-20T21:04:48+02:00
7 | draft: false
8 | weight: 810
9 | toc: true
10 | seo:
11 | title: "" # custom title (optional)
12 | description: "" # custom description (recommended)
13 | canonical: "" # custom canonical URL (optional)
14 | noindex: false # false (default) or true
15 | ---
16 |
17 | # Strava Statistics 部署文档
18 |
19 | [Strava Statistics](https://github.com/robiningelbrecht/strava-statistics) 是一个自托管工具,利用 Strava 数据生成个人运动统计,支持 Docker 部署,提供丰富的可视化分析。下面介绍如何使用 Docker Compose 部署。
20 |
21 | ## 申请 Strava 的 API 权限
22 |
23 | 在[ZwiftOffline](https://lifeislife.cn/awesome-cycling/docs/training-fitness/zwiftoffline/)中也需要用到 API 权限,因为不同应用程序也不冲突,懒得再重新申请,所以以下填的信息使用的 ZwiftOffline 的 API 权限。
24 |
25 | 登录[Strava](https://www.strava.com/settings/api),申请 API,获取`Client ID`和`Client Secret`。
26 |
27 | 填写内容可以参考下图:
28 |
29 | 
30 |
31 | 其中授权回调域填写:launcher.zwift.com
32 |
33 | 申请完成后会得到下面的信息:
34 |
35 | 
36 |
37 | 将下面链接中的`client_id`值换成上图中的客户 ID,然后浏览器中访问这个链接:
38 |
39 | ```txt
40 | http://www.strava.com/oauth/authorize?client_id=xxxxxxx&response_type=code&redirect_uri=http://localhost/exchange_token&approval_prompt=force&scope=activity:read_all
41 | ```
42 |
43 | 点击授权:
44 |
45 | 
46 |
47 | 此时跳转到一个无法访问的网页,将地址栏中的`code`值记录下来,后面需要用到:
48 |
49 | 
50 |
51 | 需要用这个`code`发起一个 cURL 请求得到`refresh_token`,具体做法是在命令行终端中执行下面的命令:
52 |
53 | ```bash
54 | curl -X POST https://www.strava.com/oauth/token \
55 | -F client_id=YOURCLIENTID \
56 | -F client_secret=YOURCLIENTSECRET \
57 | -F code=AUTHORIZATIONCODE \
58 | -F grant_type=authorization_code
59 | ```
60 |
61 | - `client_id`值替换为申请得到的`客户ID`
62 | - `client_secret`值替换为申请得到的`客户端密钥`
63 | - `code`替换为上一步浏览器中得到的`code`
64 |
65 | 执行成功后可以得到下面的返回信息,需要将返回值中的`refresh_token`和`access_token`记录下来,后面需要用到:
66 |
67 | ```bash
68 | {"token_type":"Bearer","expires_at":1740213400,"expires_in":21600,"refresh_token":"123456789123456789","access_token":"123456789123456789","athlete":{"id":117756825,"username":"dunky_zhang","resource_state":2,"firstname":"Dominic","lastname":"Zhang","bio":"骑行小白","city":"","state":"","country":null,"sex":"M","premium":true,"summit":true,"created_at":"2023-05-10T13:54:32Z","updated_at":"2025-02-06T05:29:52Z","badge_type_id":1,"weight":66.0,"profile_medium":"https://dgalywyr863hv.cloudfront.net/pictures/athletes/117756825/32138099/2/medium.jpg","profile":"https://dgalywyr863hv.cloudfront.net/pictures/athletes/117756825/32138099/2/large.jpg","friend":null,"follower":null}}#
69 | ```
70 |
71 | ## Docker Compose 部署 Strava Statistics
72 |
73 | 创建目录用于存放 Strava Statistics 的配置文件
74 |
75 | ```bash
76 | mkdir statistics-for-strava
77 | cd statistics-for-strava
78 | ```
79 |
80 | 创建 `docker-compose.yml` 文件
81 |
82 | ```bash
83 | touch docker-compose.yml
84 | ```
85 |
86 | 编辑 `docker-compose.yml` 文件,填入以下内容:
87 |
88 | ```yaml
89 | services:
90 | app:
91 | image: robiningelbrecht/strava-statistics:latest
92 | volumes:
93 | - ./build:/var/www/build
94 | - ./storage/database:/var/www/storage/database
95 | - ./storage/files:/var/www/storage/files
96 | env_file: ./.env
97 | ports:
98 | - 8080:8080
99 | environment:
100 | - PUID=1000
101 | - PGID=1000
102 | - TZ=Asia/Shanghai
103 | # 因为Strava的API需要代理访问,所以下面设置了我的代理地址,请你根据自己的代理地址进行设置
104 | - http_proxy=http://192.168.1.9:7890
105 | - https_proxy=http://192.168.1.9:7890
106 | - all_proxy=socks5://192.168.1.9:7891
107 | ```
108 |
109 | 创建 `.env` 文件
110 |
111 | ```bash
112 | touch .env
113 | ```
114 |
115 | 编辑 `.env` 文件,填入以下内容:
116 |
117 | ```bash
118 | # 应用程序将托管的URL。此URL将用于清单文件中。
119 | # 这将允许您将Web应用程序作为原生应用程序安装到您的设备上。
120 | MANIFEST_APP_URL=http://localhost:8080/
121 | # 您的Strava应用程序的客户端ID。
122 | STRAVA_CLIENT_ID=xxxxxxx
123 | # 您的Strava应用程序的客户端密钥。
124 | STRAVA_CLIENT_SECRET=xxxxxxxxxxxxxx
125 | # 您的Strava应用程序的刷新令牌。在上一步获取到的
126 | STRAVA_REFRESH_TOKEN=xxxxxxxxxxxxxx
127 | # Strava API有限速限制(https://github.com/robiningelbrecht/strava-statistics/wiki),
128 | # 为了确保我们不会达到限速,我们希望限制每次导入处理的新活动数量。
129 | # 考虑到每天有1000次请求限制,并且导入一个新活动最多可能需要3次API调用,250应该是一个安全的数字。
130 | NUMBER_OF_NEW_ACTIVITIES_TO_PROCESS_PER_IMPORT=250
131 | # 定期运行导入和HTML构建的计划。留空以禁用定期导入。
132 | # 默认计划为每天凌晨04:05运行一次。如果您不知道什么是cron表达式,请勿更改此项。
133 | # 请确保不要过于频繁地运行导入,以避免达到Strava API的限速。每天一次应该足够。
134 | IMPORT_AND_BUILD_SCHEDULE="5 4 * * *"
135 | # 设置用于计划的时区
136 | # 有效的时区可以在此处找到(TZ标识符列):https://en.wikipedia.org/wiki/List_of_tz_database_time_zones#List
137 | TZ=Asia/Shanghai
138 |
139 | # 允许的选项:en_US、fr_FR 或 nl_BE
140 | LOCALE=en_US
141 | # 允许的选项:metric(公制)或 imperial(英制)
142 | UNIT_SYSTEM=metric
143 | # 渲染应用程序时使用的时间格式
144 | # 允许的格式:24 或 12(包括AM和PM)
145 | TIME_FORMAT=24
146 | # 渲染应用程序时使用的日期格式
147 | # 允许的格式:DAY-MONTH-YEAR(日-月-年)或 MONTH-DAY-YEAR(月-日-年)
148 | DATE_FORMAT=DAY-MONTH-YEAR
149 | # 要导入的运动类型。留空以导入所有运动类型。
150 | # 通过此列表,您还可以决定运动类型的渲染顺序。
151 | # 完整的允许选项列表可在以下地址找到:https://github.com/robiningelbrecht/strava-statistics/wiki/Supported-sport-types/
152 | SPORT_TYPES_TO_IMPORT='[]'
153 | # 您的生日。需要用于计算心率区间。
154 | ATHLETE_BIRTHDAY=1999-01-01
155 | # 体重历史(单位为千克或磅,取决于UNIT_SYSTEM)。需要用于计算相对功率重量比(w/kg)。
156 | # 查看更多信息:https://github.com/robiningelbrecht/strava-statistics/wiki
157 | ATHLETE_WEIGHTS='{
158 | "1970-01-01": 68
159 | }'
160 |
161 | # FTP(功能阈值功率)历史。需要用于计算活动压力水平。
162 | # 查看更多信息:https://github.com/robiningelbrecht/strava-statistics/wiki
163 | FTP_VALUES='{
164 | "2024-12-12": 235
165 | }'
166 | # 包含ntfy主题的完整URL。此主题将用于在新的HTML构建运行时通知您。
167 | # 留空以禁用通知。
168 | NTFY_URL=''
169 | # 在导入期间要跳过的活动ID数组。
170 | # 这允许您在导入时跳过特定活动。
171 | ACTIVITIES_TO_SKIP_DURING_IMPORT='[]'
172 |
173 | # 创建/拥有由strava-statistics管理的文件的UID和GID
174 | # 可能仅在Linux主机上需要,详见Wiki中的文件权限部分
175 | #PUID=
176 | #PGID=
177 | ```
178 |
179 | 开始导入数据:
180 |
181 | - 启动容器
182 |
183 | ```bash
184 | docker-compose up -d
185 | ```
186 |
187 | - 导入数据
188 |
189 | ```bash
190 | docker compose exec app bin/console app:strava:import-data
191 | docker compose exec app bin/console app:strava:build-files
192 | ```
193 | 导入过程非常非常慢,因为需要挨个数据获取,并且很容易出错,如果出错了,需要先关闭容器,然后重新导入。以下是导入成功的截图:
194 | 
195 |
196 |
197 | - 访问 `localhost:8080` 查看数据
198 |
199 | 
200 |
201 |
202 | ## 常见问题
203 |
204 | ### 401 Unauthorized
205 |
206 | 
207 |
208 | `.env`中的`STRAVA_REFRESH_TOKEN`可能过期,需要重新获取。又或者压根就忘记了获取`refresh_token`,需要重新获取。
209 |
210 |
211 | ### Failed to connect to nominatim.openstreetmap.org
212 |
213 | 
214 |
215 | 因为需要生成一些地图热点信息,所以需要访问nominatim.openstreetmap.org,所以需要配置代理。
216 |
217 | ### Tring to calculate the relative power for activity
218 |
219 | 
220 |
221 | 因为需要计算相对功率重量比(w/kg),所以需要配置体重历史。如果发现某个活动的时间点没有配置体重信息就会报这个错。看看`.env`中的`ATHLETE_WEIGHTS`是否配置正确。我建议直接修改成我提供的数据,也就是从1970年开始都是当前的体重。因为我尝试配置了自己的体重历史,但是一直报错,所以直接改成了这个。
222 |
223 | ### Looks like you still need to import your strava data
224 |
225 | 
226 |
227 | 如果你只执行了`docker-compose up -d`,而没有执行导入数据的命令,那么就会出现这个错误。需要执行导入数据的命令。如果你已经导入成功了,如果还报这个错,就需要重启一下容器。
228 |
229 |
--------------------------------------------------------------------------------
/assets/ics/cycling_races_bilingual.ics:
--------------------------------------------------------------------------------
1 | BEGIN:VCALENDAR
2 | VERSION:2.0
3 | PRODID:ics.py - http://git.io/lLljaA
4 | BEGIN:VEVENT
5 | DTSTART;VALUE=DATE:20250512
6 | SUMMARY:环意大利赛 Giro d'Italia (2.UWT) - Stage 4
7 | UID:94ab72aa-140e-4254-bfea-919fd5960192
8 | END:VEVENT
9 | BEGIN:VEVENT
10 | DTSTART;VALUE=DATE:20250913
11 | SUMMARY:环西班牙自行车赛 La Vuelta Ciclista a España (2.UWT) - Stage 22
12 | UID:ce0023d7-356e-4b5c-a4f4-63ea220e7ec4
13 | END:VEVENT
14 | BEGIN:VEVENT
15 | DTSTART;VALUE=DATE:20250909
16 | SUMMARY:环西班牙自行车赛 La Vuelta Ciclista a España (2.UWT) - Stage 18
17 | UID:9be23ed7-63fe-4e19-8191-1f5d6aad3604
18 | END:VEVENT
19 | BEGIN:VEVENT
20 | DTSTART;VALUE=DATE:20250612
21 | SUMMARY:环多菲内赛 Critérium du Dauphiné (2.UWT) - Stage 5
22 | UID:d0dfe1f7-b465-4e44-8112-438b450eaa1d
23 | END:VEVENT
24 | BEGIN:VEVENT
25 | DTSTART;VALUE=DATE:20250402
26 | SUMMARY:穿越弗兰德斯赛 Dwars door Vlaanderen - A travers la Flandre ME (1.UWT)
27 | UID:09e810f9-e2b3-4cd8-bf59-26e402d89a6b
28 | END:VEVENT
29 | BEGIN:VEVENT
30 | DTSTART;VALUE=DATE:20250613
31 | SUMMARY:环多菲内赛 Critérium du Dauphiné (2.UWT) - Stage 6
32 | UID:e51f959f-d07a-4da9-bdef-fa832c8dd878
33 | END:VEVENT
34 | BEGIN:VEVENT
35 | DTSTART;VALUE=DATE:20250826
36 | SUMMARY:环西班牙自行车赛 La Vuelta Ciclista a España (2.UWT) - Stage 4
37 | UID:9bfcbcad-e4c5-437f-a62f-d1c663234524
38 | END:VEVENT
39 | BEGIN:VEVENT
40 | DTSTART;VALUE=DATE:20250903
41 | SUMMARY:环西班牙自行车赛 La Vuelta Ciclista a España (2.UWT) - Stage 12
42 | UID:56c3568b-81a1-4782-b26c-02fc42b550a3
43 | END:VEVENT
44 | BEGIN:VEVENT
45 | DTSTART;VALUE=DATE:20250518
46 | SUMMARY:环意大利赛 Giro d'Italia (2.UWT) - Stage 10
47 | UID:133f61da-8191-4eae-9d8f-a11ce21fd5eb
48 | END:VEVENT
49 | BEGIN:VEVENT
50 | DTSTART;VALUE=DATE:20250311
51 | SUMMARY:双海赛(连接第勒尼安海与亚得里亚海) Tirreno-Adriatico (2.UWT) - Stage 2
52 | UID:f1aeab58-fb2f-4dce-b501-ecf3f4deb705
53 | END:VEVENT
54 | BEGIN:VEVENT
55 | DTSTART;VALUE=DATE:20250824
56 | SUMMARY:环西班牙自行车赛 La Vuelta Ciclista a España (2.UWT) - Stage 2
57 | UID:03ca78d6-ac22-45fc-b322-a09bdb0fa2f3
58 | END:VEVENT
59 | BEGIN:VEVENT
60 | DTSTART;VALUE=DATE:20250914
61 | SUMMARY:蒙特利尔大奖赛 Grand Prix Cycliste de Montréal (1.UWT)
62 | UID:b8a2e0dd-a15d-41cc-86df-d3bdb420246d
63 | END:VEVENT
64 | BEGIN:VEVENT
65 | DTSTART;VALUE=DATE:20250217
66 | SUMMARY:环阿联酋赛 UAE Tour (2.UWT) - Stage 1
67 | UID:ffd6b9b4-07fe-4c58-9ebc-8dc40c217573
68 | END:VEVENT
69 | BEGIN:VEVENT
70 | DTSTART;VALUE=DATE:20250509
71 | SUMMARY:环意大利赛 Giro d'Italia (2.UWT) - Stage 1
72 | UID:a9897c2e-885f-4f66-83f3-cc2b76c2b75a
73 | END:VEVENT
74 | BEGIN:VEVENT
75 | DTSTART;VALUE=DATE:20250427
76 | SUMMARY:列日-巴斯通-列日赛 Liège-Bastogne-Liège (1.UWT)
77 | UID:bf311b9f-2b0b-4103-8e00-2a33e7f8f6eb
78 | END:VEVENT
79 | BEGIN:VEVENT
80 | DTSTART;VALUE=DATE:20250721
81 | SUMMARY:环法自行车赛 Tour de France (2.UWT) - Stage 17
82 | UID:f45e1e23-2c61-4856-9f87-652dc58bffb3
83 | END:VEVENT
84 | BEGIN:VEVENT
85 | DTSTART;VALUE=DATE:20250407
86 | SUMMARY:环巴斯克赛 Itzulia Basque Country (2.UWT) - Stage 1
87 | UID:92e5c572-ee7f-4f03-a144-2a1f4814ff14
88 | END:VEVENT
89 | BEGIN:VEVENT
90 | DTSTART;VALUE=DATE:20250715
91 | SUMMARY:环法自行车赛 Tour de France (2.UWT) - Stage 11
92 | UID:1063452a-b9ec-4857-9cb8-0e4980a1ae4c
93 | END:VEVENT
94 | BEGIN:VEVENT
95 | DTSTART;VALUE=DATE:20250725
96 | SUMMARY:环法自行车赛 Tour de France (2.UWT) - Stage 21
97 | UID:ac46914f-a80f-4fe5-81bd-7e90f2cc6520
98 | END:VEVENT
99 | BEGIN:VEVENT
100 | DTSTART;VALUE=DATE:20250614
101 | SUMMARY:环多菲内赛 Critérium du Dauphiné (2.UWT) - Stage 7
102 | UID:8a884977-4831-41a6-b606-8f9ff57bf48b
103 | END:VEVENT
104 | BEGIN:VEVENT
105 | DTSTART;VALUE=DATE:20250122
106 | SUMMARY:环澳大利亚赛 Santos Tour Down Under (2.UWT) - Stage 2
107 | UID:a83e0dda-2b40-44a2-a30d-2a66a4fb090e
108 | END:VEVENT
109 | BEGIN:VEVENT
110 | DTSTART;VALUE=DATE:20250410
111 | SUMMARY:环巴斯克赛 Itzulia Basque Country (2.UWT) - Stage 4
112 | UID:87810f3d-5963-4011-81ed-fa2bb6ef72d1
113 | END:VEVENT
114 | BEGIN:VEVENT
115 | DTSTART;VALUE=DATE:20250527
116 | SUMMARY:环意大利赛 Giro d'Italia (2.UWT) - Stage 19
117 | UID:7f18e0ef-cd88-4655-ac26-74bddd527861
118 | END:VEVENT
119 | BEGIN:VEVENT
120 | DTSTART;VALUE=DATE:20250905
121 | SUMMARY:环西班牙自行车赛 La Vuelta Ciclista a España (2.UWT) - Stage 14
122 | UID:0a0efe7a-554f-43b1-93c9-83613394f632
123 | END:VEVENT
124 | BEGIN:VEVENT
125 | DTSTART;VALUE=DATE:20250220
126 | SUMMARY:环阿联酋赛 UAE Tour (2.UWT) - Stage 4
127 | UID:c3661d39-ff81-43e7-bf26-5b437a93f066
128 | END:VEVENT
129 | BEGIN:VEVENT
130 | DTSTART;VALUE=DATE:20250328
131 | SUMMARY:环加泰罗尼亚赛 Volta Ciclista a Catalunya (2.UWT) - Stage 5
132 | UID:99801729-2d8c-4c95-8bec-f6dbf13959e2
133 | END:VEVENT
134 | BEGIN:VEVENT
135 | DTSTART;VALUE=DATE:20250711
136 | SUMMARY:环法自行车赛 Tour de France (2.UWT) - Stage 7
137 | UID:d02a717c-37bd-404b-9a6f-a39cf6beeae4
138 | END:VEVENT
139 | BEGIN:VEVENT
140 | DTSTART;VALUE=DATE:20250717
141 | SUMMARY:环法自行车赛 Tour de France (2.UWT) - Stage 13
142 | UID:d757ea5e-c987-4d1d-8627-25afb4c5125c
143 | END:VEVENT
144 | BEGIN:VEVENT
145 | DTSTART;VALUE=DATE:20250525
146 | SUMMARY:环意大利赛 Giro d'Italia (2.UWT) - Stage 17
147 | UID:dbc9cede-280e-4acc-852f-6a8838936362
148 | END:VEVENT
149 | BEGIN:VEVENT
150 | DTSTART;VALUE=DATE:20250314
151 | SUMMARY:双海赛(连接第勒尼安海与亚得里亚海) Tirreno-Adriatico (2.UWT) - Stage 5
152 | UID:9eeade89-d1a0-47f8-b291-0d016b51453d
153 | END:VEVENT
154 | BEGIN:VEVENT
155 | DTSTART;VALUE=DATE:20250316
156 | SUMMARY:双海赛(连接第勒尼安海与亚得里亚海) Tirreno-Adriatico (2.UWT) - Stage 7
157 | UID:559ac567-933d-4839-93c6-012ec99ffb8b
158 | END:VEVENT
159 | BEGIN:VEVENT
160 | DTSTART;VALUE=DATE:20250823
161 | SUMMARY:环西班牙自行车赛 La Vuelta Ciclista a España (2.UWT) - Stage 1
162 | UID:79fd2584-a84f-40d9-a604-b9cc5a0af7ab
163 | END:VEVENT
164 | BEGIN:VEVENT
165 | DTSTART;VALUE=DATE:20250720
166 | SUMMARY:环法自行车赛 Tour de France (2.UWT) - Stage 16
167 | UID:c331ff53-10a8-4d7b-a0ab-5c21cda9e25b
168 | END:VEVENT
169 | BEGIN:VEVENT
170 | DTSTART;VALUE=DATE:20250823
171 | SUMMARY:环比荷卢赛(荷兰、比利时、卢森堡) Renewi Tour (2.UWT) - Stage 4
172 | UID:8769e818-c476-4573-ba50-9c713eb8d157
173 | END:VEVENT
174 | BEGIN:VEVENT
175 | DTSTART;VALUE=DATE:20250430
176 | SUMMARY:环罗曼迪赛 Tour de Romandie (2.UWT) - Stage 2
177 | UID:2eab5553-5ca5-4bfa-acb8-b6775e680068
178 | END:VEVENT
179 | BEGIN:VEVENT
180 | DTSTART;VALUE=DATE:20250618
181 | SUMMARY:环瑞士赛 Tour de Suisse (2.UWT) - Stage 4
182 | UID:10fadd42-65b2-4ad1-8bc1-3c34a5a830d8
183 | END:VEVENT
184 | BEGIN:VEVENT
185 | DTSTART;VALUE=DATE:20250312
186 | SUMMARY:巴黎-尼斯赛 Paris-Nice (2.UWT) - Stage 4
187 | UID:3d50f3eb-c2a3-4ef5-90ee-0f48f6ffe4f0
188 | END:VEVENT
189 | BEGIN:VEVENT
190 | DTSTART;VALUE=DATE:20250308
191 | SUMMARY:白路赛 Strade Bianche (1.UWT)
192 | UID:74b4c1c7-c0ce-4741-ae40-0cd3be0de4f9
193 | END:VEVENT
194 | BEGIN:VEVENT
195 | DTSTART;VALUE=DATE:20250510
196 | SUMMARY:环意大利赛 Giro d'Italia (2.UWT) - Stage 2
197 | UID:253ccfff-166a-45e3-8399-12199ec751c5
198 | END:VEVENT
199 | BEGIN:VEVENT
200 | DTSTART;VALUE=DATE:20250805
201 | SUMMARY:环波兰赛 Tour de Pologne (2.UWT) - Stage 2
202 | UID:d8cc1f63-0a37-47bc-957b-9216ed438342
203 | END:VEVENT
204 | BEGIN:VEVENT
205 | DTSTART;VALUE=DATE:20250808
206 | SUMMARY:环波兰赛 Tour de Pologne (2.UWT) - Stage 5
207 | UID:ed6e91a9-cca9-409b-b614-1be257d3473f
208 | END:VEVENT
209 | BEGIN:VEVENT
210 | DTSTART;VALUE=DATE:20250316
211 | SUMMARY:巴黎-尼斯赛 Paris-Nice (2.UWT) - Stage 8
212 | UID:7f567ca2-8978-4a47-ae51-927c0caeea5b
213 | END:VEVENT
214 | BEGIN:VEVENT
215 | DTSTART;VALUE=DATE:20250806
216 | SUMMARY:环波兰赛 Tour de Pologne (2.UWT) - Stage 3
217 | UID:cf6c514d-04bd-4619-adcc-100e5e7c1757
218 | END:VEVENT
219 | BEGIN:VEVENT
220 | DTSTART;VALUE=DATE:20250501
221 | SUMMARY:环罗曼迪赛 Tour de Romandie (2.UWT) - Stage 3
222 | UID:0d669be1-c007-4fbf-841e-e90417d2abe4
223 | END:VEVENT
224 | BEGIN:VEVENT
225 | DTSTART;VALUE=DATE:20250412
226 | SUMMARY:环巴斯克赛 Itzulia Basque Country (2.UWT) - Stage 6
227 | UID:2a49e921-0b37-4409-bf7f-d2803bfa7abd
228 | END:VEVENT
229 | BEGIN:VEVENT
230 | DTSTART;VALUE=DATE:20250511
231 | SUMMARY:环意大利赛 Giro d'Italia (2.UWT) - Stage 3
232 | UID:2c9ab70f-75db-489f-a322-ba1c510e5291
233 | END:VEVENT
234 | BEGIN:VEVENT
235 | DTSTART;VALUE=DATE:20250822
236 | SUMMARY:环比荷卢赛(荷兰、比利时、卢森堡) Renewi Tour (2.UWT) - Stage 3
237 | UID:ee99e673-d173-4b1a-adc1-02448055d17f
238 | END:VEVENT
239 | BEGIN:VEVENT
240 | DTSTART;VALUE=DATE:20250722
241 | SUMMARY:环法自行车赛 Tour de France (2.UWT) - Stage 18
242 | UID:b8f89529-c828-45df-ba8a-6c5b7cb8f116
243 | END:VEVENT
244 | BEGIN:VEVENT
245 | DTSTART;VALUE=DATE:20250310
246 | SUMMARY:双海赛(连接第勒尼安海与亚得里亚海) Tirreno-Adriatico (2.UWT) - Stage 1
247 | UID:3ac9044f-cde8-472f-a6ca-a0f7f1d3a571
248 | END:VEVENT
249 | BEGIN:VEVENT
250 | DTSTART;VALUE=DATE:20250310
251 | SUMMARY:巴黎-尼斯赛 Paris-Nice (2.UWT) - Stage 2
252 | UID:586f329d-a52e-4c4d-9d05-ff2cc4e383b3
253 | END:VEVENT
254 | BEGIN:VEVENT
255 | DTSTART;VALUE=DATE:20250223
256 | SUMMARY:环阿联酋赛 UAE Tour (2.UWT) - Stage 7
257 | UID:a5425005-6ed0-459b-ad07-f85db5a69f21
258 | END:VEVENT
259 | BEGIN:VEVENT
260 | DTSTART;VALUE=DATE:20250526
261 | SUMMARY:环意大利赛 Giro d'Italia (2.UWT) - Stage 18
262 | UID:588d7593-90cd-46eb-a1d6-da76eebfca70
263 | END:VEVENT
264 | BEGIN:VEVENT
265 | DTSTART;VALUE=DATE:20250504
266 | SUMMARY:环罗曼迪赛 Tour de Romandie (2.UWT) - Stage 6
267 | UID:18f215f1-de90-45f6-96af-81c17052490b
268 | END:VEVENT
269 | BEGIN:VEVENT
270 | DTSTART;VALUE=DATE:20250222
271 | SUMMARY:环阿联酋赛 UAE Tour (2.UWT) - Stage 6
272 | UID:8782d809-d41a-4f91-a8d2-c15039c0a157
273 | END:VEVENT
274 | BEGIN:VEVENT
275 | DTSTART;VALUE=DATE:20250324
276 | SUMMARY:环加泰罗尼亚赛 Volta Ciclista a Catalunya (2.UWT) - Stage 1
277 | UID:5b36e1ba-4259-446a-be96-4ee7b8e8e15d
278 | END:VEVENT
279 | BEGIN:VEVENT
280 | DTSTART;VALUE=DATE:20251011
281 | SUMMARY:环伦巴第赛(秋季古典赛) Il Lombardia (1.UWT)
282 | UID:d06e2a32-157f-43a3-a259-499adaabae67
283 | END:VEVENT
284 | BEGIN:VEVENT
285 | DTSTART;VALUE=DATE:20250125
286 | SUMMARY:环澳大利亚赛 Santos Tour Down Under (2.UWT) - Stage 5
287 | UID:a1393554-0d5e-4902-816b-8eb2b3644360
288 | END:VEVENT
289 | BEGIN:VEVENT
290 | DTSTART;VALUE=DATE:20250313
291 | SUMMARY:双海赛(连接第勒尼安海与亚得里亚海) Tirreno-Adriatico (2.UWT) - Stage 4
292 | UID:65fcddda-e9c2-4e09-962c-defa0c5593b4
293 | END:VEVENT
294 | BEGIN:VEVENT
295 | DTSTART;VALUE=DATE:20250820
296 | SUMMARY:环比荷卢赛(荷兰、比利时、卢森堡) Renewi Tour (2.UWT) - Stage 1
297 | UID:043e0195-79dd-4b9b-8f10-a1be94ff0e90
298 | END:VEVENT
299 | BEGIN:VEVENT
300 | DTSTART;VALUE=DATE:20250423
301 | SUMMARY:瓦隆之箭 La Flèche Wallonne (1.UWT)
302 | UID:7ec34511-2199-4c76-bbfc-bfdbb5b71018
303 | END:VEVENT
304 | BEGIN:VEVENT
305 | DTSTART;VALUE=DATE:20250712
306 | SUMMARY:环法自行车赛 Tour de France (2.UWT) - Stage 8
307 | UID:fde3de1f-7152-4d96-b203-9b20b7bf58ec
308 | END:VEVENT
309 | BEGIN:VEVENT
310 | DTSTART;VALUE=DATE:20250831
311 | SUMMARY:环西班牙自行车赛 La Vuelta Ciclista a España (2.UWT) - Stage 9
312 | UID:29b1a117-6ab1-4fd4-b2b9-0c86a811888c
313 | END:VEVENT
314 | BEGIN:VEVENT
315 | DTSTART;VALUE=DATE:20250914
316 | SUMMARY:环西班牙自行车赛 La Vuelta Ciclista a España (2.UWT) - Stage 23
317 | UID:4164284b-1161-4e53-8eed-59694097773b
318 | END:VEVENT
319 | BEGIN:VEVENT
320 | DTSTART;VALUE=DATE:20251019
321 | SUMMARY:环广西公路自行车赛 Gree-Tour of Guangxi (2.UWT) - Stage 6
322 | UID:16a67473-8165-45a7-bc76-4e4d762aa48b
323 | END:VEVENT
324 | BEGIN:VEVENT
325 | DTSTART;VALUE=DATE:20250908
326 | SUMMARY:环西班牙自行车赛 La Vuelta Ciclista a España (2.UWT) - Stage 17
327 | UID:441eb3ea-fa6a-48ba-8a2e-d0bc208099c1
328 | END:VEVENT
329 | BEGIN:VEVENT
330 | DTSTART;VALUE=DATE:20250329
331 | SUMMARY:环加泰罗尼亚赛 Volta Ciclista a Catalunya (2.UWT) - Stage 6
332 | UID:173c3530-ed2b-4404-9b7c-c87a389c4dc9
333 | END:VEVENT
334 | BEGIN:VEVENT
335 | DTSTART;VALUE=DATE:20250705
336 | SUMMARY:环法自行车赛 Tour de France (2.UWT) - Stage 1
337 | UID:ca75fd8a-cca3-44c7-96a0-f32da6226a17
338 | END:VEVENT
339 | BEGIN:VEVENT
340 | DTSTART;VALUE=DATE:20250825
341 | SUMMARY:环西班牙自行车赛 La Vuelta Ciclista a España (2.UWT) - Stage 3
342 | UID:f5c7fb74-fb00-4391-b80e-b91f87976dc3
343 | END:VEVENT
344 | BEGIN:VEVENT
345 | DTSTART;VALUE=DATE:20250328
346 | SUMMARY:E3经典赛 E3 Saxo Classic ME (1.UWT)
347 | UID:4681bcd9-d4d4-4b95-8d4c-6f0a593b57fe
348 | END:VEVENT
349 | BEGIN:VEVENT
350 | DTSTART;VALUE=DATE:20250809
351 | SUMMARY:环波兰赛 Tour de Pologne (2.UWT) - Stage 6
352 | UID:046de17c-58a7-4e06-861c-e5d31b062ccb
353 | END:VEVENT
354 | BEGIN:VEVENT
355 | DTSTART;VALUE=DATE:20250713
356 | SUMMARY:环法自行车赛 Tour de France (2.UWT) - Stage 9
357 | UID:bd3285d6-37e2-487c-b321-2a2183880f45
358 | END:VEVENT
359 | BEGIN:VEVENT
360 | DTSTART;VALUE=DATE:20250824
361 | SUMMARY:环比荷卢赛(荷兰、比利时、卢森堡) Renewi Tour (2.UWT) - Stage 5
362 | UID:74d7487f-a877-4b84-9062-7139025e62d4
363 | END:VEVENT
364 | BEGIN:VEVENT
365 | DTSTART;VALUE=DATE:20250523
366 | SUMMARY:环意大利赛 Giro d'Italia (2.UWT) - Stage 15
367 | UID:79a9562d-2815-49fd-a9b3-095166b1cf2a
368 | END:VEVENT
369 | BEGIN:VEVENT
370 | DTSTART;VALUE=DATE:20250503
371 | SUMMARY:环罗曼迪赛 Tour de Romandie (2.UWT) - Stage 5
372 | UID:f9f15097-f79f-4288-aced-ec131d008e5f
373 | END:VEVENT
374 | BEGIN:VEVENT
375 | DTSTART;VALUE=DATE:20250530
376 | SUMMARY:环意大利赛 Giro d'Italia (2.UWT) - Stage 22
377 | UID:da23ca32-56dd-4c8d-bb8f-ed3322a99f73
378 | END:VEVENT
379 | BEGIN:VEVENT
380 | DTSTART;VALUE=DATE:20250723
381 | SUMMARY:环法自行车赛 Tour de France (2.UWT) - Stage 19
382 | UID:6e97ded9-b3c7-4156-a1be-30b08d3cb74c
383 | END:VEVENT
384 | BEGIN:VEVENT
385 | DTSTART;VALUE=DATE:20250330
386 | SUMMARY:环加泰罗尼亚赛 Volta Ciclista a Catalunya (2.UWT) - Stage 7
387 | UID:581861f7-8107-4bcf-8853-4a14eb83b195
388 | END:VEVENT
389 | BEGIN:VEVENT
390 | DTSTART;VALUE=DATE:20250727
391 | SUMMARY:环法自行车赛 Tour de France (2.UWT) - Stage 23
392 | UID:a8793cdd-750e-4d17-8ed6-b9f675a1ef49
393 | END:VEVENT
394 | BEGIN:VEVENT
395 | DTSTART;VALUE=DATE:20251018
396 | SUMMARY:环广西公路自行车赛 Gree-Tour of Guangxi (2.UWT) - Stage 5
397 | UID:c406248a-475c-471a-95b0-14f1e0ab3518
398 | END:VEVENT
399 | BEGIN:VEVENT
400 | DTSTART;VALUE=DATE:20250910
401 | SUMMARY:环西班牙自行车赛 La Vuelta Ciclista a España (2.UWT) - Stage 19
402 | UID:f4dc86f6-2887-4f6f-83c8-bdcaabb7702b
403 | END:VEVENT
404 | BEGIN:VEVENT
405 | DTSTART;VALUE=DATE:20250821
406 | SUMMARY:环比荷卢赛(荷兰、比利时、卢森堡) Renewi Tour (2.UWT) - Stage 2
407 | UID:4cf30bba-44ed-4f98-9adc-211a5a9f566b
408 | END:VEVENT
409 | BEGIN:VEVENT
410 | DTSTART;VALUE=DATE:20250408
411 | SUMMARY:环巴斯克赛 Itzulia Basque Country (2.UWT) - Stage 2
412 | UID:a774f425-e378-4f31-bc13-583d0cb09670
413 | END:VEVENT
414 | BEGIN:VEVENT
415 | DTSTART;VALUE=DATE:20250314
416 | SUMMARY:巴黎-尼斯赛 Paris-Nice (2.UWT) - Stage 6
417 | UID:9f6fe224-52ff-4598-a2ec-e910ea8e5e8c
418 | END:VEVENT
419 | BEGIN:VEVENT
420 | DTSTART;VALUE=DATE:20250617
421 | SUMMARY:环瑞士赛 Tour de Suisse (2.UWT) - Stage 3
422 | UID:e50007d4-3596-49b1-babb-fa53ae1ace9b
423 | END:VEVENT
424 | BEGIN:VEVENT
425 | DTSTART;VALUE=DATE:20250502
426 | SUMMARY:环罗曼迪赛 Tour de Romandie (2.UWT) - Stage 4
427 | UID:e468c04c-840e-41dd-a457-947447764196
428 | END:VEVENT
429 | BEGIN:VEVENT
430 | DTSTART;VALUE=DATE:20251015
431 | SUMMARY:环广西公路自行车赛 Gree-Tour of Guangxi (2.UWT) - Stage 2
432 | UID:b0f90773-659c-451f-a8fe-86c9f17eead4
433 | END:VEVENT
434 | BEGIN:VEVENT
435 | DTSTART;VALUE=DATE:20250126
436 | SUMMARY:环澳大利亚赛 Santos Tour Down Under (2.UWT) - Stage 6
437 | UID:1898ac17-ca35-4236-8551-bb339b19b34c
438 | END:VEVENT
439 | BEGIN:VEVENT
440 | DTSTART;VALUE=DATE:20250315
441 | SUMMARY:巴黎-尼斯赛 Paris-Nice (2.UWT) - Stage 7
442 | UID:79bb372b-1015-4b74-86bb-4d4f6d320426
443 | END:VEVENT
444 | BEGIN:VEVENT
445 | DTSTART;VALUE=DATE:20250326
446 | SUMMARY:环加泰罗尼亚赛 Volta Ciclista a Catalunya (2.UWT) - Stage 3
447 | UID:3488a7cb-4a67-4e94-9b25-33d3094a55c5
448 | END:VEVENT
449 | BEGIN:VEVENT
450 | DTSTART;VALUE=DATE:20250802
451 | SUMMARY:圣塞巴斯蒂安经典赛 Donostia San Sebastian Klasikoa (1.UWT)
452 | UID:5235d849-7e23-42ec-943f-37db1754a0d5
453 | END:VEVENT
454 | BEGIN:VEVENT
455 | DTSTART;VALUE=DATE:20250202
456 | SUMMARY:卡德尔·埃文斯大洋路赛 Cadel Evans Great Ocean Road Race - Men (1.UWT)
457 | UID:c982ccb0-8bf2-4355-9a0c-6650bcd585d5
458 | END:VEVENT
459 | BEGIN:VEVENT
460 | DTSTART;VALUE=DATE:20250901
461 | SUMMARY:环西班牙自行车赛 La Vuelta Ciclista a España (2.UWT) - Stage 10
462 | UID:0dec3608-fd6c-4cc5-b852-4269aa0005c6
463 | END:VEVENT
464 | BEGIN:VEVENT
465 | DTSTART;VALUE=DATE:20250413
466 | SUMMARY:巴黎-鲁贝古典赛 Paris-Roubaix (1.UWT)
467 | UID:0582e76a-4573-489b-8334-1986613e06af
468 | END:VEVENT
469 | BEGIN:VEVENT
470 | DTSTART;VALUE=DATE:20250615
471 | SUMMARY:环瑞士赛 Tour de Suisse (2.UWT) - Stage 1
472 | UID:e8e265e0-a0b3-4dff-be2c-601b3882d3df
473 | END:VEVENT
474 | BEGIN:VEVENT
475 | DTSTART;VALUE=DATE:20250906
476 | SUMMARY:环西班牙自行车赛 La Vuelta Ciclista a España (2.UWT) - Stage 15
477 | UID:fd88cfad-b779-4937-a0e3-c21dc7c06e54
478 | END:VEVENT
479 | BEGIN:VEVENT
480 | DTSTART;VALUE=DATE:20250912
481 | SUMMARY:魁北克大奖赛 Grand Prix Cycliste de Québec (1.UWT)
482 | UID:7ff821fb-2808-4fd7-ad12-80d726cb6526
483 | END:VEVENT
484 | BEGIN:VEVENT
485 | DTSTART;VALUE=DATE:20250420
486 | SUMMARY:阿姆斯特尔黄金赛 Amstel Gold Race (1.UWT)
487 | UID:180ff6d4-18d9-4924-802d-452b8fec8a21
488 | END:VEVENT
489 | BEGIN:VEVENT
490 | DTSTART;VALUE=DATE:20250219
491 | SUMMARY:环阿联酋赛 UAE Tour (2.UWT) - Stage 3
492 | UID:6eabb061-1e54-453a-b32f-50724833f354
493 | END:VEVENT
494 | BEGIN:VEVENT
495 | DTSTART;VALUE=DATE:20250610
496 | SUMMARY:环多菲内赛 Critérium du Dauphiné (2.UWT) - Stage 3
497 | UID:fba058c8-bd6c-44ba-83fb-86f6a906c292
498 | END:VEVENT
499 | BEGIN:VEVENT
500 | DTSTART;VALUE=DATE:20250325
501 | SUMMARY:环加泰罗尼亚赛 Volta Ciclista a Catalunya (2.UWT) - Stage 2
502 | UID:59aeacba-bc4b-48be-9a67-769fb02ca0cf
503 | END:VEVENT
504 | BEGIN:VEVENT
505 | DTSTART;VALUE=DATE:20250601
506 | SUMMARY:环意大利赛 Giro d'Italia (2.UWT) - Stage 24
507 | UID:39e0ae9f-28fd-4609-8ff1-51acb08093a0
508 | END:VEVENT
509 | BEGIN:VEVENT
510 | DTSTART;VALUE=DATE:20250622
511 | SUMMARY:哥本哈根经典赛 Copenhagen Sprint (1.UWT)
512 | UID:26977d3e-de4b-4355-bfc2-8dc87124c9f3
513 | END:VEVENT
514 | BEGIN:VEVENT
515 | DTSTART;VALUE=DATE:20250707
516 | SUMMARY:环法自行车赛 Tour de France (2.UWT) - Stage 3
517 | UID:a72a47d9-da5b-43aa-a34f-06ff637a4895
518 | END:VEVENT
519 | BEGIN:VEVENT
520 | DTSTART;VALUE=DATE:20250615
521 | SUMMARY:环多菲内赛 Critérium du Dauphiné (2.UWT) - Stage 8
522 | UID:710039ed-caa6-4e4c-af9b-28ea99cad5fc
523 | END:VEVENT
524 | BEGIN:VEVENT
525 | DTSTART;VALUE=DATE:20250322
526 | SUMMARY:米兰-圣雷莫古典赛 Milano-Sanremo (1.UWT)
527 | UID:547a8487-eff9-4e75-8ac2-26618029f4d6
528 | END:VEVENT
529 | BEGIN:VEVENT
530 | DTSTART;VALUE=DATE:20250619
531 | SUMMARY:环瑞士赛 Tour de Suisse (2.UWT) - Stage 5
532 | UID:8207f9cc-b2d9-4e0d-87b9-78f5f92afb2f
533 | END:VEVENT
534 | BEGIN:VEVENT
535 | DTSTART;VALUE=DATE:20250708
536 | SUMMARY:环法自行车赛 Tour de France (2.UWT) - Stage 4
537 | UID:820bec86-7676-4001-8b47-1258741cfb67
538 | END:VEVENT
539 | BEGIN:VEVENT
540 | DTSTART;VALUE=DATE:20250609
541 | SUMMARY:环多菲内赛 Critérium du Dauphiné (2.UWT) - Stage 2
542 | UID:dba48bd5-aa79-4412-88d2-74f8b81cd2e8
543 | END:VEVENT
544 | BEGIN:VEVENT
545 | DTSTART;VALUE=DATE:20250718
546 | SUMMARY:环法自行车赛 Tour de France (2.UWT) - Stage 14
547 | UID:50b759a9-a36b-43c6-9e39-bb47fdd312c5
548 | END:VEVENT
549 | BEGIN:VEVENT
550 | DTSTART;VALUE=DATE:20250529
551 | SUMMARY:环意大利赛 Giro d'Italia (2.UWT) - Stage 21
552 | UID:c35a2ea1-8824-44b3-af0a-bb9460bb4589
553 | END:VEVENT
554 | BEGIN:VEVENT
555 | DTSTART;VALUE=DATE:20250907
556 | SUMMARY:环西班牙自行车赛 La Vuelta Ciclista a España (2.UWT) - Stage 16
557 | UID:5462de98-a77c-4329-bd08-fbea653df47d
558 | END:VEVENT
559 | BEGIN:VEVENT
560 | DTSTART;VALUE=DATE:20250827
561 | SUMMARY:环西班牙自行车赛 La Vuelta Ciclista a España (2.UWT) - Stage 5
562 | UID:54efb0fa-8382-41df-b9b9-3a6cb7672510
563 | END:VEVENT
564 | BEGIN:VEVENT
565 | DTSTART;VALUE=DATE:20250810
566 | SUMMARY:环波兰赛 Tour de Pologne (2.UWT) - Stage 7
567 | UID:43b399a7-1004-43b1-b0e0-51ad27f470bf
568 | END:VEVENT
569 | BEGIN:VEVENT
570 | DTSTART;VALUE=DATE:20250311
571 | SUMMARY:巴黎-尼斯赛 Paris-Nice (2.UWT) - Stage 3
572 | UID:8f431be3-a1b5-4a9e-8414-eb3e94111588
573 | END:VEVENT
574 | BEGIN:VEVENT
575 | DTSTART;VALUE=DATE:20250513
576 | SUMMARY:环意大利赛 Giro d'Italia (2.UWT) - Stage 5
577 | UID:85619401-acef-4021-94ab-3ee0a67b598f
578 | END:VEVENT
579 | BEGIN:VEVENT
580 | DTSTART;VALUE=DATE:20250429
581 | SUMMARY:环罗曼迪赛 Tour de Romandie (2.UWT) - Stage 1
582 | UID:9a276da3-4652-4fb3-8254-d47144c94530
583 | END:VEVENT
584 | BEGIN:VEVENT
585 | DTSTART;VALUE=DATE:20250123
586 | SUMMARY:环澳大利亚赛 Santos Tour Down Under (2.UWT) - Stage 3
587 | UID:72cd1531-eb6a-4414-a532-88ef895108cf
588 | END:VEVENT
589 | BEGIN:VEVENT
590 | DTSTART;VALUE=DATE:20250411
591 | SUMMARY:环巴斯克赛 Itzulia Basque Country (2.UWT) - Stage 5
592 | UID:bd872a61-a03f-4097-b619-8a5e800da179
593 | END:VEVENT
594 | BEGIN:VEVENT
595 | DTSTART;VALUE=DATE:20250519
596 | SUMMARY:环意大利赛 Giro d'Italia (2.UWT) - Stage 11
597 | UID:08c89a53-a96a-407b-af4b-0fcf1d9d42eb
598 | END:VEVENT
599 | BEGIN:VEVENT
600 | DTSTART;VALUE=DATE:20250830
601 | SUMMARY:环西班牙自行车赛 La Vuelta Ciclista a España (2.UWT) - Stage 8
602 | UID:e1875aac-b570-46c6-b97d-1df4b6b94cd2
603 | END:VEVENT
604 | BEGIN:VEVENT
605 | DTSTART;VALUE=DATE:20250124
606 | SUMMARY:环澳大利亚赛 Santos Tour Down Under (2.UWT) - Stage 4
607 | UID:a113339a-436a-4cd1-a4e5-478d562b4187
608 | END:VEVENT
609 | BEGIN:VEVENT
610 | DTSTART;VALUE=DATE:20250902
611 | SUMMARY:环西班牙自行车赛 La Vuelta Ciclista a España (2.UWT) - Stage 11
612 | UID:b715728a-235c-4356-b477-789ef15ff7e6
613 | END:VEVENT
614 | BEGIN:VEVENT
615 | DTSTART;VALUE=DATE:20250817
616 | SUMMARY:汉堡经典赛 ADAC Cyclassics (1.UWT)
617 | UID:6363f5d4-ccc3-488e-83a9-f99aa86bf26c
618 | END:VEVENT
619 | BEGIN:VEVENT
620 | DTSTART;VALUE=DATE:20250313
621 | SUMMARY:巴黎-尼斯赛 Paris-Nice (2.UWT) - Stage 5
622 | UID:ba46666f-abff-45b0-9181-1f0adb64a33e
623 | END:VEVENT
624 | BEGIN:VEVENT
625 | DTSTART;VALUE=DATE:20250520
626 | SUMMARY:环意大利赛 Giro d'Italia (2.UWT) - Stage 12
627 | UID:e556f1cf-e63e-4e64-a27e-9166d2c6de86
628 | END:VEVENT
629 | BEGIN:VEVENT
630 | DTSTART;VALUE=DATE:20250409
631 | SUMMARY:环巴斯克赛 Itzulia Basque Country (2.UWT) - Stage 3
632 | UID:3651e57a-97da-4f70-898a-956b484531f9
633 | END:VEVENT
634 | BEGIN:VEVENT
635 | DTSTART;VALUE=DATE:20250911
636 | SUMMARY:环西班牙自行车赛 La Vuelta Ciclista a España (2.UWT) - Stage 20
637 | UID:48e723e2-0353-4178-83c8-81201fbdf22c
638 | END:VEVENT
639 | BEGIN:VEVENT
640 | DTSTART;VALUE=DATE:20250514
641 | SUMMARY:环意大利赛 Giro d'Italia (2.UWT) - Stage 6
642 | UID:2e12856e-0391-4444-abc8-bdf4eb597b49
643 | END:VEVENT
644 | BEGIN:VEVENT
645 | DTSTART;VALUE=DATE:20250719
646 | SUMMARY:环法自行车赛 Tour de France (2.UWT) - Stage 15
647 | UID:562cad7d-628d-4615-9044-bb8b8c8e26ce
648 | END:VEVENT
649 | BEGIN:VEVENT
650 | DTSTART;VALUE=DATE:20250706
651 | SUMMARY:环法自行车赛 Tour de France (2.UWT) - Stage 2
652 | UID:1adb7dc7-dc84-4959-8b6a-972e96631733
653 | END:VEVENT
654 | BEGIN:VEVENT
655 | DTSTART;VALUE=DATE:20250724
656 | SUMMARY:环法自行车赛 Tour de France (2.UWT) - Stage 20
657 | UID:f6c814c4-01db-4f76-86b7-21d3d0d8b632
658 | END:VEVENT
659 | BEGIN:VEVENT
660 | DTSTART;VALUE=DATE:20250327
661 | SUMMARY:环加泰罗尼亚赛 Volta Ciclista a Catalunya (2.UWT) - Stage 4
662 | UID:875bc033-4511-49e0-8ff7-0620a590ef7e
663 | END:VEVENT
664 | BEGIN:VEVENT
665 | DTSTART;VALUE=DATE:20250312
666 | SUMMARY:双海赛(连接第勒尼安海与亚得里亚海) Tirreno-Adriatico (2.UWT) - Stage 3
667 | UID:f5648339-ae25-4e49-8556-e6e1aefbde77
668 | END:VEVENT
669 | BEGIN:VEVENT
670 | DTSTART;VALUE=DATE:20250804
671 | SUMMARY:环波兰赛 Tour de Pologne (2.UWT) - Stage 1
672 | UID:808e1b9e-cc3c-41eb-8b7c-7cf1ed5210de
673 | END:VEVENT
674 | BEGIN:VEVENT
675 | DTSTART;VALUE=DATE:20250528
676 | SUMMARY:环意大利赛 Giro d'Italia (2.UWT) - Stage 20
677 | UID:6739efbc-7c25-4b61-aa1b-97ba1cddef13
678 | END:VEVENT
679 | BEGIN:VEVENT
680 | DTSTART;VALUE=DATE:20250829
681 | SUMMARY:环西班牙自行车赛 La Vuelta Ciclista a España (2.UWT) - Stage 7
682 | UID:25a2c42c-311c-4b22-a875-c517e89233d9
683 | END:VEVENT
684 | BEGIN:VEVENT
685 | DTSTART;VALUE=DATE:20250621
686 | SUMMARY:环瑞士赛 Tour de Suisse (2.UWT) - Stage 7
687 | UID:c7129c9f-39f3-400a-a9de-2c661a8d1f8e
688 | END:VEVENT
689 | BEGIN:VEVENT
690 | DTSTART;VALUE=DATE:20250218
691 | SUMMARY:环阿联酋赛 UAE Tour (2.UWT) - Stage 2
692 | UID:8bb9d34d-71ca-45d9-ab4a-9d5e4a6f532b
693 | END:VEVENT
694 | BEGIN:VEVENT
695 | DTSTART;VALUE=DATE:20250710
696 | SUMMARY:环法自行车赛 Tour de France (2.UWT) - Stage 6
697 | UID:c3f8a9c7-27d4-4fa7-b162-e65c96d3b82f
698 | END:VEVENT
699 | BEGIN:VEVENT
700 | DTSTART;VALUE=DATE:20250726
701 | SUMMARY:环法自行车赛 Tour de France (2.UWT) - Stage 22
702 | UID:2782e41c-9c3d-4734-a096-0ea6283e0906
703 | END:VEVENT
704 | BEGIN:VEVENT
705 | DTSTART;VALUE=DATE:20251014
706 | SUMMARY:环广西公路自行车赛 Gree-Tour of Guangxi (2.UWT) - Stage 1
707 | UID:bc764a8a-7928-4437-b729-7a1f93428ebc
708 | END:VEVENT
709 | BEGIN:VEVENT
710 | DTSTART;VALUE=DATE:20250121
711 | SUMMARY:环澳大利亚赛 Santos Tour Down Under (2.UWT) - Stage 1
712 | UID:1f385c24-efc9-47cc-b9e7-8e4c1edad5e3
713 | END:VEVENT
714 | BEGIN:VEVENT
715 | DTSTART;VALUE=DATE:20250521
716 | SUMMARY:环意大利赛 Giro d'Italia (2.UWT) - Stage 13
717 | UID:9c0e5c38-30e3-4a4b-a33a-235378a84d91
718 | END:VEVENT
719 | BEGIN:VEVENT
720 | DTSTART;VALUE=DATE:20250904
721 | SUMMARY:环西班牙自行车赛 La Vuelta Ciclista a España (2.UWT) - Stage 13
722 | UID:1636ed10-6012-4f37-a6b4-a9ec815ed13d
723 | END:VEVENT
724 | BEGIN:VEVENT
725 | DTSTART;VALUE=DATE:20250517
726 | SUMMARY:环意大利赛 Giro d'Italia (2.UWT) - Stage 9
727 | UID:3ba2fa24-388d-4a07-82bc-913b137000cb
728 | END:VEVENT
729 | BEGIN:VEVENT
730 | DTSTART;VALUE=DATE:20250406
731 | SUMMARY:环法兰德斯赛 Ronde van Vlaanderen ME (1.UWT)
732 | UID:be55747e-7cb7-4f07-a282-edb994d5bce3
733 | END:VEVENT
734 | BEGIN:VEVENT
735 | DTSTART;VALUE=DATE:20250515
736 | SUMMARY:环意大利赛 Giro d'Italia (2.UWT) - Stage 7
737 | UID:42521800-2395-4299-9f95-8c86b662026a
738 | END:VEVENT
739 | BEGIN:VEVENT
740 | DTSTART;VALUE=DATE:20251017
741 | SUMMARY:环广西公路自行车赛 Gree-Tour of Guangxi (2.UWT) - Stage 4
742 | UID:d1d4dadd-f800-4201-b63c-163e1b7a1302
743 | END:VEVENT
744 | BEGIN:VEVENT
745 | DTSTART;VALUE=DATE:20250807
746 | SUMMARY:环波兰赛 Tour de Pologne (2.UWT) - Stage 4
747 | UID:da52d6c1-5b3d-4b72-95ec-440aa2eaa803
748 | END:VEVENT
749 | BEGIN:VEVENT
750 | DTSTART;VALUE=DATE:20250301
751 | SUMMARY:新闻报环赛 Omloop Nieuwsblad ME (1.UWT)
752 | UID:432bacd4-1ee0-4ef6-83dd-e2de3f562ed6
753 | END:VEVENT
754 | BEGIN:VEVENT
755 | DTSTART;VALUE=DATE:20250501
756 | SUMMARY:法兰克福锦标赛 Eschborn-Frankfurt (1.UWT)
757 | UID:b7721253-6789-4d79-8ff0-5a9834d6109a
758 | END:VEVENT
759 | BEGIN:VEVENT
760 | DTSTART;VALUE=DATE:20250326
761 | SUMMARY:布鲁日-德帕内经典赛 Classic Brugge-De Panne (1.UWT)
762 | UID:3e34597b-5927-4169-a51b-a5443406f29a
763 | END:VEVENT
764 | BEGIN:VEVENT
765 | DTSTART;VALUE=DATE:20250309
766 | SUMMARY:巴黎-尼斯赛 Paris-Nice (2.UWT) - Stage 1
767 | UID:9edce687-d093-45df-8c15-8625668ed35e
768 | END:VEVENT
769 | BEGIN:VEVENT
770 | DTSTART;VALUE=DATE:20250622
771 | SUMMARY:环瑞士赛 Tour de Suisse (2.UWT) - Stage 8
772 | UID:0261f37e-33a7-4108-ba1f-cfdb552e3798
773 | END:VEVENT
774 | BEGIN:VEVENT
775 | DTSTART;VALUE=DATE:20250330
776 | SUMMARY:根特-韦弗尔海姆赛 Gent-Wevelgem in Flanders Fields ME (1.UWT)
777 | UID:25759cea-ec42-460d-b2e8-c683b43dedbb
778 | END:VEVENT
779 | BEGIN:VEVENT
780 | DTSTART;VALUE=DATE:20250831
781 | SUMMARY:布列塔尼经典赛 Bretagne Classic - Ouest-France (1.UWT)
782 | UID:332f660b-7aab-4f33-a8d2-278c8a459e25
783 | END:VEVENT
784 | BEGIN:VEVENT
785 | DTSTART;VALUE=DATE:20250221
786 | SUMMARY:环阿联酋赛 UAE Tour (2.UWT) - Stage 5
787 | UID:a9903c71-6c4e-4e63-98f7-1e984bdfa9e3
788 | END:VEVENT
789 | BEGIN:VEVENT
790 | DTSTART;VALUE=DATE:20251016
791 | SUMMARY:环广西公路自行车赛 Gree-Tour of Guangxi (2.UWT) - Stage 3
792 | UID:4ed14ebf-d8ef-47cd-9378-bf04561ce7a3
793 | END:VEVENT
794 | BEGIN:VEVENT
795 | DTSTART;VALUE=DATE:20250912
796 | SUMMARY:环西班牙自行车赛 La Vuelta Ciclista a España (2.UWT) - Stage 21
797 | UID:5e7f06d2-8bf9-4efb-a15d-fa62a854ae5c
798 | END:VEVENT
799 | BEGIN:VEVENT
800 | DTSTART;VALUE=DATE:20250524
801 | SUMMARY:环意大利赛 Giro d'Italia (2.UWT) - Stage 16
802 | UID:05ff68c6-36c0-41d5-a36b-0674760469b5
803 | END:VEVENT
804 | BEGIN:VEVENT
805 | DTSTART;VALUE=DATE:20250611
806 | SUMMARY:环多菲内赛 Critérium du Dauphiné (2.UWT) - Stage 4
807 | UID:709922bb-e73c-4c81-b5af-d28f7309d67c
808 | END:VEVENT
809 | BEGIN:VEVENT
810 | DTSTART;VALUE=DATE:20250828
811 | SUMMARY:环西班牙自行车赛 La Vuelta Ciclista a España (2.UWT) - Stage 6
812 | UID:44e5a537-af3c-42f1-85f3-0fa1ca51bcfe
813 | END:VEVENT
814 | BEGIN:VEVENT
815 | DTSTART;VALUE=DATE:20250608
816 | SUMMARY:环多菲内赛 Critérium du Dauphiné (2.UWT) - Stage 1
817 | UID:b781d5a1-52f7-4f11-b97d-185c3f3ed64c
818 | END:VEVENT
819 | BEGIN:VEVENT
820 | DTSTART;VALUE=DATE:20250709
821 | SUMMARY:环法自行车赛 Tour de France (2.UWT) - Stage 5
822 | UID:848081a6-5e8b-4644-98d3-e3425a764026
823 | END:VEVENT
824 | BEGIN:VEVENT
825 | DTSTART;VALUE=DATE:20250522
826 | SUMMARY:环意大利赛 Giro d'Italia (2.UWT) - Stage 14
827 | UID:8cc2fd99-166c-430e-b06a-768db189a956
828 | END:VEVENT
829 | BEGIN:VEVENT
830 | DTSTART;VALUE=DATE:20250531
831 | SUMMARY:环意大利赛 Giro d'Italia (2.UWT) - Stage 23
832 | UID:77419e0c-5796-41ee-8902-284232197bb7
833 | END:VEVENT
834 | BEGIN:VEVENT
835 | DTSTART;VALUE=DATE:20250516
836 | SUMMARY:环意大利赛 Giro d'Italia (2.UWT) - Stage 8
837 | UID:9757628b-5a56-4ffa-b297-2eb23ed70eab
838 | END:VEVENT
839 | BEGIN:VEVENT
840 | DTSTART;VALUE=DATE:20250315
841 | SUMMARY:双海赛(连接第勒尼安海与亚得里亚海) Tirreno-Adriatico (2.UWT) - Stage 6
842 | UID:19c375bc-56d1-4886-b1a1-671d12c32768
843 | END:VEVENT
844 | BEGIN:VEVENT
845 | DTSTART;VALUE=DATE:20250616
846 | SUMMARY:环瑞士赛 Tour de Suisse (2.UWT) - Stage 2
847 | UID:5a0f562f-3332-46a1-97a8-3e33681f10fc
848 | END:VEVENT
849 | BEGIN:VEVENT
850 | DTSTART;VALUE=DATE:20250714
851 | SUMMARY:环法自行车赛 Tour de France (2.UWT) - Stage 10
852 | UID:4131a860-d65e-4761-9ca1-879d3cd07cba
853 | END:VEVENT
854 | BEGIN:VEVENT
855 | DTSTART;VALUE=DATE:20250620
856 | SUMMARY:环瑞士赛 Tour de Suisse (2.UWT) - Stage 6
857 | UID:ee4c090a-829b-443f-a2b8-381e97a87775
858 | END:VEVENT
859 | BEGIN:VEVENT
860 | DTSTART;VALUE=DATE:20250716
861 | SUMMARY:环法自行车赛 Tour de France (2.UWT) - Stage 12
862 | UID:8ad0497d-1fb1-4d4d-b9b6-f5dc2abc8235
863 | END:VEVENT
864 | END:VCALENDAR
--------------------------------------------------------------------------------