├── .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 | ![](https://picbed-1311007548.cos.ap-shanghai.myqcloud.com/markdown_picbed/img//2024/09/18/55dfc19e44d418dd418b65b6d11db400.png) 26 | 27 | 安装成功后,会在菜单栏显示一个点赞按钮,点击后即可为好友的运动记录一键点赞,确保友谊的小破车不会打翻。 28 | 29 | ![](https://picbed-1311007548.cos.ap-shanghai.myqcloud.com/markdown_picbed/img//2024/09/18/b3b830b3fd70ddb38ba458894f34d162.png) 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 | ![](https://picbed-1311007548.cos.ap-shanghai.myqcloud.com/markdown_picbed/img//2024/09/18/419c3b57b5e4e60f90e43f89bb2ba9b4.png) 18 | 19 | ![](https://picbed-1311007548.cos.ap-shanghai.myqcloud.com/markdown_picbed/img//2024/09/18/dc727ffe4f928618451b2025d6d0b368.png) 20 | 21 | ![](https://picbed-1311007548.cos.ap-shanghai.myqcloud.com/markdown_picbed/img//2024/09/18/2c700c2c9c1472910d0866c24bdab9c4.png) 22 | 23 | ![](https://picbed-1311007548.cos.ap-shanghai.myqcloud.com/markdown_picbed/img//2024/09/18/94caa25c7ada5b0fc3b2ac9b62c7b8fd.png) 24 | 25 | ![](https://picbed-1311007548.cos.ap-shanghai.myqcloud.com/markdown_picbed/img//2024/09/18/670d46e6993018f2672960004f9d65e7.png) 26 | 27 | ![](https://picbed-1311007548.cos.ap-shanghai.myqcloud.com/markdown_picbed/img//2024/09/18/c5cdc450fe4c7fa5f1ec8c99eaf911ff.png) 28 | 29 | ![](https://picbed-1311007548.cos.ap-shanghai.myqcloud.com/markdown_picbed/img//2024/09/18/6c099edf9dbd414c1aa8ab63c3246d7d.png) 30 | 31 | ![](https://picbed-1311007548.cos.ap-shanghai.myqcloud.com/markdown_picbed/img//2024/09/18/d49747d9aad65e6cca31fad06b72fc0e.png) 32 | 33 | ![](https://picbed-1311007548.cos.ap-shanghai.myqcloud.com/markdown_picbed/img//2024/09/18/2a8b7fe406cf72de8ff9378bcddd5bfa.png) 34 | 35 | ![](https://picbed-1311007548.cos.ap-shanghai.myqcloud.com/markdown_picbed/img//2024/09/18/3eab6470657e244cfe696065884c9936.png) 36 | 37 | ![](https://picbed-1311007548.cos.ap-shanghai.myqcloud.com/markdown_picbed/img//2024/09/18/a4881c186d1653a941978e539ca5be27.png) -------------------------------------------------------------------------------- /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 | ![](https://picbed-1311007548.cos.ap-shanghai.myqcloud.com/markdown_picbed/img//2024/10/19/cc51cc55b4434c1813e2b68ed66842ba.png) 19 | 20 | ## 使用方式 21 | 22 | 进入网站后右侧边栏点击Rider,配置个人的基本信息: 23 | 24 | - 本次骑行的功率 25 | - 个人的FTP 26 | - 体重 27 | - 身高 28 | 29 | 主要就是第一项,是你准备本次骑行用多大功率去骑。 30 | 31 | ![](https://picbed-1311007548.cos.ap-shanghai.myqcloud.com/markdown_picbed/img//2024/10/19/9f85a749c568a97bec437dd102f8bbbd.png) 32 | 33 | 当然有时候骑比赛,不会开启ERG,功率就会有大幅的变化,比如上坡功率大,下坡功率小,那么就可以拖动Pacing这个滑杆,模拟动态变化,表示你准备在哪个功率区间去骑。 34 | 35 | ![](https://picbed-1311007548.cos.ap-shanghai.myqcloud.com/markdown_picbed/img//2024/10/19/9cad6a34e8f23212f9161d105fe66069.png) 36 | 37 | 点击Bike,筛选出车辆类型,以及当前可购买的车: 38 | 39 | - Level表示Zwift中的等级,有的车只有打到特定等级才能购买 40 | - Drops表示你在Zwift中汗水余额,也是游戏中的货币,能筛选出你能买得起的车 41 | - 车辆类型筛选,一般勾选大组车,除非你有特殊需求如果你不想购买新车,可以勾选Only show items i own,只选车库已有的车 42 | 43 | ![](https://picbed-1311007548.cos.ap-shanghai.myqcloud.com/markdown_picbed/img//2024/10/19/fd2f24cd11c9e074709dc7629a3d3f9e.png) 44 | 45 | 完成基础配置后就可以根据地图选车了,点击Route,根据一些条件筛选出你准备骑的路线。 46 | 47 | 通常最常使用的是用关键词搜索,比如想要找Road to Sky这条路线,在最下面的文本框中输入road,或者sky,那么在最上面的下拉框中将只显示带有road的路线。 48 | 49 | 也可以根据路线的情况筛选,比如Road to Sky爬升有1000+,那么可以拖动Elevation滑杆到1000M,也能筛选出来。 50 | 51 | ![](https://picbed-1311007548.cos.ap-shanghai.myqcloud.com/markdown_picbed/img//2024/10/19/2aa314723be58e1a58c51f071a9f918c.png) 52 | 53 | 当你选择一条路线后,右侧将会自动计算出适合这条路线并满足你条件的所有车架与轮组。这些组合是以你当前条件下的最优解,每个组合右上角有骑完这条路线的预计时间以及能量消耗。你可以再根据自己的情况选择是买新车,还是用已有的装备。 54 | 55 | ![](https://picbed-1311007548.cos.ap-shanghai.myqcloud.com/markdown_picbed/img//2024/10/19/182367b50e9510c32c2609e3e0fa96a2.png) 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 | ![](https://picbed-1311007548.cos.ap-shanghai.myqcloud.com/markdown_picbed/img//2024/09/19/982ddfce88d818b7d3fb0cc221d6732b.png) 46 | 47 | ## 获取UserID 48 | 49 | - 还是刚刚的页面,切换到“标头”旁边的预览 50 | - 鼠标点击预览中的内容,Ctrl+F打开搜索框 51 | - 搜索userid,即可找到自己的userid 52 | - 眼尖的话,其实第二个请求里也有userid信息,都可以。 53 | 54 | ![](https://picbed-1311007548.cos.ap-shanghai.myqcloud.com/markdown_picbed/img//2024/09/19/d949eae90bb64f9a938f41d9559da86a.png) 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 |
20 |
21 |
22 | {{ end -}} 23 | 24 | 48 | {{ end }} 49 | 50 | {{ define "sidebar-footer" }} 51 | {{ if site.Params.doks.sectionFooter -}} 52 |
53 |
54 |
55 |

Start building with Doks today

56 | {{ i18n "get-started" }} 57 |
58 |
59 |
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 | ![](https://picbed-1311007548.cos.ap-shanghai.myqcloud.com/markdown_picbed/img//2024/08/11/a7e7fcb06615b3c2f248176404c6a657.png) 29 | 3. **配置和使用** 30 | - 用户可以根据自己的需求调整 Elevate 的设置,包括单位、分析参数等选项。 31 | 32 | ## 使用介绍 33 | 34 | 第一次导入成功后先别着急查看数据,先配置一下个人信息,参考下图。切记基本信息和Strava保持一致,不然重新导入真的很费时间,因为Strava接口请求有限制,你可以在Strava申请导出所有数据为文件,这样会快很多,后面再详细介绍。 35 | 36 | ![](https://picbed-1311007548.cos.ap-shanghai.myqcloud.com/markdown_picbed/img//2024/08/11/277c631d2d6ccfd6f773c597acfd2f22.png) 37 | 38 | 查看活动汇总 39 | 40 | ![](https://picbed-1311007548.cos.ap-shanghai.myqcloud.com/markdown_picbed/img//2024/08/11/c02f376a56f92c647d3568ce55a790ca.png) 41 | 42 | 设置年度目标,计算目标进度 43 | 44 | ![](https://picbed-1311007548.cos.ap-shanghai.myqcloud.com/markdown_picbed/img//2024/08/11/6d40e1a8a47cc775db4017d2dbaf6ad6.png) 45 | 46 | ![](https://picbed-1311007548.cos.ap-shanghai.myqcloud.com/markdown_picbed/img//2024/08/11/1619fb87264a40ff328bbcee8a1a5ae5.png) 47 | 48 | 你是不是也想知道自己关注的大佬功率是多少?嘿嘿,Elevate会根据大佬公开的数据,预估一个功率和工体比。以下就是范二特的一次骑行数据。 49 | 50 | ![](https://picbed-1311007548.cos.ap-shanghai.myqcloud.com/markdown_picbed/img//2024/08/12/6fffdb98932e9b8b1a39c9aeb08da701.png) 51 | 52 | More Data!点击橙色的按钮,可以显示更多的数据信息,当然这些信息对于普通骑行者作用不大。对于业余车手可以通过这些数据来学习一下职业车手的骑行习惯。比如功率分配,踏频分配等等。 53 | 54 | ![](https://picbed-1311007548.cos.ap-shanghai.myqcloud.com/markdown_picbed/img//2024/08/12/f0259d2d859d146985934a3c86815920.png) -------------------------------------------------------------------------------- /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 | ![](https://picbed-1311007548.cos.ap-shanghai.myqcloud.com/markdown_picbed/img//2024/08/24/fed51344e1e22419ca0ef77be2175cd5.png) 31 | 32 | ![](https://picbed-1311007548.cos.ap-shanghai.myqcloud.com/markdown_picbed/img//2024/08/24/a4ec56ea0604b336d80ff0fe8369dd2c.png) 33 | 34 | ## 配置天气卡片 35 | 36 | Strava 订阅用户可以生成每次运动的天气卡片,可以在运动简介中看到这次运动时的天气情况,如图所示: 37 | 38 | 没有订阅的用户也可以通过这个工具来生成,在天气配置页面,开启即可: 39 | 40 | ![](https://picbed-1311007548.cos.ap-shanghai.myqcloud.com/markdown_picbed/img//2024/08/24/b9732209d84fd4164a684bb7a66eaab6.png) 41 | 42 | 当下次有新的数据同步到 Strava 时,会自动在标题下面生成天气信息,如图所示: 43 | 44 | ![](https://picbed-1311007548.cos.ap-shanghai.myqcloud.com/markdown_picbed/img//2024/08/24/1d2987ccad88c1736c7251b0bb35d299.png) 45 | 46 | 如果你想自定义天气卡片的样式,可以在天气卡片配置页面进行设置,比如将英文转换为中文: 47 | 48 | ![](https://picbed-1311007548.cos.ap-shanghai.myqcloud.com/markdown_picbed/img//2024/08/24/42dc1ed8021b3f224c2e7c61513ca19b.png) 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 | ![](https://picbed-1311007548.cos.ap-shanghai.myqcloud.com/markdown_picbed/img//2024/09/21/2ce1c390f26689fdcb17f95672cbc6df.png) 100 | 101 | ### 骑行运动时,自动在标题前添加骑行表情 102 | 103 | > 表情包可以从[getemoji网站](https://getemoji.com/)查找复制粘贴进去。 104 | 105 | ![](https://picbed-1311007548.cos.ap-shanghai.myqcloud.com/markdown_picbed/img//2024/09/21/3b79406262b6742b84eeaf4e9a723a1b.png) 106 | 107 | 1. 填写自动化名称:标题添加骑行图标 108 | 2. 设置字段条件:运动类型-包含-骑行,虚拟骑行,山地骑行,公路骑行 109 | 3. 点击新增Action 110 | 4. 选择:在原始标题前 111 | 5. 文本框中输入复制来的自行车表情包 112 | 6. 关闭文本框 113 | 7. 滑动页面底部,点击保存 114 | 8. 显示下图表示创建成功 115 | 116 | ![](https://picbed-1311007548.cos.ap-shanghai.myqcloud.com/markdown_picbed/img//2024/09/21/d7557b1af2dd3482725fc7d2562e0a7a.png) 117 | 118 | 当我们有新的骑行运动数据产生时,会自动在标题前添加骑行表情。 119 | 120 | ![](https://picbed-1311007548.cos.ap-shanghai.myqcloud.com/markdown_picbed/img//2024/09/21/fb23e8074556416d7a6296043d434ddd.png) 121 | 122 | ### 配速达到4分/km时,将Strava的装备设置为指定跑鞋 123 | 124 | 1. 填写自动化名称:配速小于4分换跑鞋 125 | 2. 设置字段条件:平均配速 - 小于 - 4 126 | 3. 点击新增Action 127 | 4. 选择:装备 - 选择想要切换的装备 128 | 5. 滑动页面底部,点击保存 129 | 130 | ![](https://picbed-1311007548.cos.ap-shanghai.myqcloud.com/markdown_picbed/img//2024/09/21/98a107b5a3b760987a94dfb02b4a81d8.png) 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 | - ![](https://picbed-1311007548.cos.ap-shanghai.myqcloud.com/markdown_picbed/img//2024/09/18/d37ec75fa675abbaf457a8cc30371778.png) 49 | - 你也可以选择以文件的形式导入训练记录 50 | - ![](https://picbed-1311007548.cos.ap-shanghai.myqcloud.com/markdown_picbed/img//2024/09/18/effa3a688b48b14972f1fac063bc0f63.png) 51 | 52 | 2. **设置个人训练区间** 53 | - 在“设置”页面中,根据个人的功率测试或心率监测结果,设置训练区间(Zones),包括功率区间、心率区间等。此功能有助于定制个性化的训练分析。 54 | 55 | 3. **分析训练数据** 56 | - 在每次训练结束后,系统会自动生成详细的训练分析报告。你可以在“Activity”页面查看每次训练的详细图表,包括功率、心率、踏频、速度等多维度的数据分析。 57 | - ![](https://picbed-1311007548.cos.ap-shanghai.myqcloud.com/markdown_picbed/img//2024/09/18/0729258437eadd403178f9fd8fac23a6.png) 58 | 59 | 4. **监控康复与健康状况** 60 | - 在“健康度”页面,你可以看到体能变化的长时间趋势,以及恢复状况。根据 TSB(训练压力平衡)值,Intervals.icu 能够帮助用户识别疲劳或即将出现的过度训练风险。 61 | - ![](https://picbed-1311007548.cos.ap-shanghai.myqcloud.com/markdown_picbed/img//2024/09/18/87fa668c3b1e7964ecfd637e604eb383.png) 62 | 63 | ## 制定训练计划 64 | 65 | ### 添加他人分享的训练计划 66 | 67 | ![](https://picbed-1311007548.cos.ap-shanghai.myqcloud.com/markdown_picbed/img//2024/12/24/9d9b28fd9447a1c3b9e200926b0d8ded.png) 68 | 69 | 点击**书本图标**显示训练课程库,会显示已经保存的训练课程,开始状态为空的,需要自行制定或添加。然后点击底部**搜索计划**,可以搜索到其他用户分享的训练计划,如果你还没有制定训练的经验,可以先添加其他人制定好的内容。下图显示了一些其他用户分享的训练计划: 70 | 71 | ![](https://picbed-1311007548.cos.ap-shanghai.myqcloud.com/markdown_picbed/img//2024/12/24/4ef8844654fc6174838b431564ce6e40.png) 72 | 73 | 比如点击sumulige分享的训练计划后可以看到完整计划如下,点击**添加到资料库**,就可以在左侧的资料库中看到该计划,后续可以直接在资料库中查看 74 | 75 | ![](https://picbed-1311007548.cos.ap-shanghai.myqcloud.com/markdown_picbed/img//2024/12/24/252291fabfe41a8e7ae044d7309cfb29.png) 76 | 77 | 因为打开网页时默认第一行就是当前日期,但是一般我们添加计划都是未来日期,你可以点击下图中的位置来显示未来日期,便于拖放训练计划。 78 | 79 | ![](https://picbed-1311007548.cos.ap-shanghai.myqcloud.com/markdown_picbed/img//2024/12/24/2dce671dda6b858b440b15634a6b297f.png) 80 | 81 | 82 | 比如我想让制定的计划从01月06日开始,直接从资料库中拖动之前添加的计划到01月06日的格子里,ICU就会自动将所有训练都添加完成。 83 | 84 | ![](https://picbed-1311007548.cos.ap-shanghai.myqcloud.com/markdown_picbed/img//2024/12/24/64a57a7c4055aace95d60150023305bf.png) 85 | 86 | 添加完成后如图所示: 87 | 88 | ![](https://picbed-1311007548.cos.ap-shanghai.myqcloud.com/markdown_picbed/img//2024/12/24/a3af9c4fe2b0a9a780b084ed1a8d38eb.png) 89 | 90 | 如果你不小心拖错了日期,点击训练计划的第一个训练周六周日续时间,也就是01月06号那个训练按照以下步骤批量删除所有刚刚添加的训练: 91 | 92 | ![](https://picbed-1311007548.cos.ap-shanghai.myqcloud.com/markdown_picbed/img//2024/12/24/96b9fc0a0d4f5f2ba92cf9023165de35.png) 93 | 94 | 95 | ### 手动添加训练计划 96 | 97 | 如果你有自己的训练计划想要添加到ICU中,你可以逐个步骤添加,也可以通过ICU自己的语法快速添加计划。 98 | 99 | 点击日历中的任何一个日期,使用UI按钮逐步添加: 100 | 101 | ![](https://picbed-1311007548.cos.ap-shanghai.myqcloud.com/markdown_picbed/img//2024/12/24/ed1d99e234067a297ed8580b9ad88615.png) 102 | 103 | ![](https://picbed-1311007548.cos.ap-shanghai.myqcloud.com/markdown_picbed/img//2024/12/24/476200bd0cabaef27a89fe6e68774be3.png) 104 | 105 | ![](https://picbed-1311007548.cos.ap-shanghai.myqcloud.com/markdown_picbed/img//2024/12/24/005fc2d9ee4719c31c60aa5bd5898a27.png) 106 | 107 | ![](https://picbed-1311007548.cos.ap-shanghai.myqcloud.com/markdown_picbed/img//2024/12/24/749d854286977516420c66ed5910ea18.png) 108 | 109 | 我更推荐使用ICU自己的语法快速添加,比如下面的训练计划: 110 | 111 | ![](https://picbed-1311007548.cos.ap-shanghai.myqcloud.com/markdown_picbed/img//2024/12/24/043dc055da5baea9b01fd6805ee9095e.png) 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 | ![](https://picbed-1311007548.cos.ap-shanghai.myqcloud.com/markdown_picbed/img//2024/12/24/f386896eee8810978e72b4b7b48fefdf.png) 159 | 160 | 如果你想立刻同步计划到佳明,重新勾选一下“上传计划中的训练课程”即可手动上传,注意不是点击断开连接的标识哦,不是点击断开连接的标识哦,不是点击断开连接的标识哦。 161 | 162 | 捣鼓半天码表都不显示计划,原来是只能同步未来七天的计划。 163 | 164 | ![](https://picbed-1311007548.cos.ap-shanghai.myqcloud.com/markdown_picbed/img//2024/12/24/e45e40d7ec4c8153cee09f24999ad85b.png) 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 | - ![](https://picbed-1311007548.cos.ap-shanghai.myqcloud.com/markdown_picbed/img//2025/02/10/ed838fae543dc8d607c231d89fc4888b.png) 24 | - 前往[Zwift 官网](https://www.zwift.com/),拉到页面底部,可以看到安装链接,安装 Zwift 软件。记住安装的路径,我安装在了`C:\Program Files (x86)\Zwift`。 25 | - ![](https://picbed-1311007548.cos.ap-shanghai.myqcloud.com/markdown_picbed/img//2025/02/09/734f7507b1e68958bba2ea2525216752.png) 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 | - ![](https://picbed-1311007548.cos.ap-shanghai.myqcloud.com/markdown_picbed/img//2025/02/19/52b44adfe177bde733156c3d2faefe5e.png) 30 | - 最终运行完的结果如下: 31 | - ![](https://picbed-1311007548.cos.ap-shanghai.myqcloud.com/markdown_picbed/img//2025/02/09/6769deefaa7c142c42411a43af345e8d.png) 32 | - 进入`zwiftoffline`目录,双击`zoffline_1.0.140279.exe`,运行 zoffline。 33 | - ![](https://picbed-1311007548.cos.ap-shanghai.myqcloud.com/markdown_picbed/img//2025/02/09/029bd1af360095a4a279b52c822cd5c7.png) 34 | - 启动原版 Zwift 程序,**如果显示的页面还是原来 Zwift 的登录页面,看看是不是开了代理,关闭代理再试试**。 35 | - ![](https://picbed-1311007548.cos.ap-shanghai.myqcloud.com/markdown_picbed/img//2025/02/09/e577c5169d652b1ae201a337a0d292f8.png) 36 | - 下图是官方原版登录界面,**如果显示这个页面说明配置失败**: 37 | - ![](https://picbed-1311007548.cos.ap-shanghai.myqcloud.com/markdown_picbed/img//2025/02/19/d8c93c7c78d2f33555bed4a3be9d671f.png) 38 | - 将输入法切换为微软英文输入法,点击`Start Zwift`即可开始游戏。如果是搜狗输入法将会卡在登录页面。 39 | 40 | ## 获取个人原来的 Zwift 资料信息 41 | 42 | 如果不配置这一项,那么使用 Zwift offline 骑行的时候,会显示你的信息是一个新的账号,而不是你原来的账号。 43 | 44 | 在登录页面可以进入设置: 45 | 46 | ![](https://picbed-1311007548.cos.ap-shanghai.myqcloud.com/markdown_picbed/img//2025/02/09/ce3667b3f69bf3ab3fd81c191aee51f8.png) 47 | 48 | 填写邮箱和密码,勾选所有选项,点击 Submit 即可: 49 | 50 | ![](https://picbed-1311007548.cos.ap-shanghai.myqcloud.com/markdown_picbed/img//2025/02/09/9cc77352a1f299516e1f76989bdc60c3.png) 51 | 52 | 这样再登录到 Zwift 时就是原来的账号了。 53 | 54 | ## 链接 Strava 上传活动 55 | 56 | 登录[Strava](https://www.strava.com/settings/api),申请 API,获取`Client ID`和`Client Secret`。 57 | 58 | 填写内容可以参考下图: 59 | 60 | ![](https://picbed-1311007548.cos.ap-shanghai.myqcloud.com/markdown_picbed/img//2025/02/09/d8024be9518e5a262538aa5d48c7fbb0.png) 61 | 62 | 其中授权回调域填写:launcher.zwift.com 63 | 64 | 申请完成后会得到下面的信息: 65 | 66 | ![](https://picbed-1311007548.cos.ap-shanghai.myqcloud.com/markdown_picbed/img//2025/02/09/a5024f9e2e150810251222315be11ac9.png) 67 | 68 | 在登录页面可以进入设置,填写得到的`Client ID`和`Client Secret`。 69 | 70 | ![](https://picbed-1311007548.cos.ap-shanghai.myqcloud.com/markdown_picbed/img//2025/02/09/29afa480ea0c6ceba03f89a14b30c987.png) 71 | 72 | ![](https://picbed-1311007548.cos.ap-shanghai.myqcloud.com/markdown_picbed/img//2025/02/09/84b0932cd611d78a1497f82aafa86fb7.png) 73 | 74 | ![](https://picbed-1311007548.cos.ap-shanghai.myqcloud.com/markdown_picbed/img//2025/02/09/2457689c2493d63ffa77e465948d3d84.png) 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 | ![](https://picbed-1311007548.cos.ap-shanghai.myqcloud.com/markdown_picbed/img//2025/05/18/4b0dbbd3bd2dd82b1c6da8327e494ea3.png) 83 | 84 | ![](https://picbed-1311007548.cos.ap-shanghai.myqcloud.com/markdown_picbed/img//2025/05/18/05c02cfd9cd98aaf1e198d2f99b58f5a.png) 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 | ![](https://picbed-1311007548.cos.ap-shanghai.myqcloud.com/markdown_picbed/img//2025/02/15/f18d29b2d3e548bf2fe0878d54b2f45f.png) 97 | 98 | > 注意哦,不是运行目录下的`zwiftoffline\storage\1\customworkouts`哦,开始我自作聪明把课程放到这个目录下,结果发现上传不了,后来才发现是放错了。 99 | 100 | ![](https://picbed-1311007548.cos.ap-shanghai.myqcloud.com/markdown_picbed/img//2025/02/15/edd5d0ab56c733e794d196838851dfe3.png) 101 | 102 | ## 常见问题 103 | 104 | ### 卡在蓝色登录界面 105 | 106 | ![](https://picbed-1311007548.cos.ap-shanghai.myqcloud.com/markdown_picbed/img//2025/02/20/03f08f3fa8d593d33b38647a46f22341.png) 107 | 108 | 进程管理中关闭Zwift,输入法需要切换为微软英文输入法重新登录: 109 | 110 | ![](https://picbed-1311007548.cos.ap-shanghai.myqcloud.com/markdown_picbed/img//2025/02/20/48a6263e5ffe475ec5753b13cffd2ec1.png) 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 | ![](https://picbed-1311007548.cos.ap-shanghai.myqcloud.com/markdown_picbed/img//2025/10/24/72ba6a993d30a1d2ba6b6c36a9e603ad.png) 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 [![Awesome](https://cdn.rawgit.com/sindresorhus/awesome/d7305f38d29fed78fa85652e3a63e154dd8e8829/media/badge.svg)](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 | ![](https://picbed-1311007548.cos.ap-shanghai.myqcloud.com/markdown_picbed/img//2025/02/09/d8024be9518e5a262538aa5d48c7fbb0.png) 30 | 31 | 其中授权回调域填写:launcher.zwift.com 32 | 33 | 申请完成后会得到下面的信息: 34 | 35 | ![](https://picbed-1311007548.cos.ap-shanghai.myqcloud.com/markdown_picbed/img//2025/02/09/a5024f9e2e150810251222315be11ac9.png) 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 | ![](https://picbed-1311007548.cos.ap-shanghai.myqcloud.com/markdown_picbed/img//2025/03/08/89a9c1d81d40e6b4687531ab92d689a2.png) 46 | 47 | 此时跳转到一个无法访问的网页,将地址栏中的`code`值记录下来,后面需要用到: 48 | 49 | ![](https://picbed-1311007548.cos.ap-shanghai.myqcloud.com/markdown_picbed/img//2025/03/08/c3a74e83d363bb0f453ad37712dd28ac.png) 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 | ![](https://picbed-1311007548.cos.ap-shanghai.myqcloud.com/markdown_picbed/img//2025/02/23/af3c468483a1c46544c02b5c2d8124ac.png) 195 | 196 | 197 | - 访问 `localhost:8080` 查看数据 198 | 199 | ![](https://picbed-1311007548.cos.ap-shanghai.myqcloud.com/markdown_picbed/img//2025/03/08/07a1a21d1c53ab4560de20f5cbcb60db.png) 200 | 201 | 202 | ## 常见问题 203 | 204 | ### 401 Unauthorized 205 | 206 | ![](https://picbed-1311007548.cos.ap-shanghai.myqcloud.com/markdown_picbed/img//2025/02/22/a541f82e213a98de7f9e69a614e0e7bc.png) 207 | 208 | `.env`中的`STRAVA_REFRESH_TOKEN`可能过期,需要重新获取。又或者压根就忘记了获取`refresh_token`,需要重新获取。 209 | 210 | 211 | ### Failed to connect to nominatim.openstreetmap.org 212 | 213 | ![](https://picbed-1311007548.cos.ap-shanghai.myqcloud.com/markdown_picbed/img//2025/02/22/86b6394d0eca978d164927d9129641ea.png) 214 | 215 | 因为需要生成一些地图热点信息,所以需要访问nominatim.openstreetmap.org,所以需要配置代理。 216 | 217 | ### Tring to calculate the relative power for activity 218 | 219 | ![](https://picbed-1311007548.cos.ap-shanghai.myqcloud.com/markdown_picbed/img//2025/02/23/e39d6ef29c3288646bfd500908e58e0c.png) 220 | 221 | 因为需要计算相对功率重量比(w/kg),所以需要配置体重历史。如果发现某个活动的时间点没有配置体重信息就会报这个错。看看`.env`中的`ATHLETE_WEIGHTS`是否配置正确。我建议直接修改成我提供的数据,也就是从1970年开始都是当前的体重。因为我尝试配置了自己的体重历史,但是一直报错,所以直接改成了这个。 222 | 223 | ### Looks like you still need to import your strava data 224 | 225 | ![](https://picbed-1311007548.cos.ap-shanghai.myqcloud.com/markdown_picbed/img//2025/02/23/e31949d1bf03a1df838b21a74908bfbc.png) 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 --------------------------------------------------------------------------------