diff --git a/README.en-US.md b/README.en-US.md index c9a8f92c..04bb01ba 100644 --- a/README.en-US.md +++ b/README.en-US.md @@ -1,14 +1,11 @@
-vue3-element-admin - -# vue3-element-admin +logo vue3-element-admin **Vue3 + Vite + TypeScript Enterprise Admin Frontend** -[![Vue](https://img.shields.io/badge/Vue-3.5.22-brightgreen.svg)](https://vuejs.org/) -[![Vite](https://img.shields.io/badge/Vite-7.3.0-green.svg)](https://vitejs.dev/) -[![Element Plus](https://img.shields.io/badge/Element%20Plus-2.3.2-blue.svg)](https://element-plus.org/) +[![Vue](https://img.shields.io/badge/Vue-3.5.30-brightgreen.svg)](https://vuejs.org/) +[![Element Plus](https://img.shields.io/badge/Element%20Plus-2.13.6-blue.svg)](https://element-plus.org/) [![Gitee Star](https://gitee.com/youlaiorg/vue3-element-admin/badge/star.svg)](https://gitee.com/youlaiorg/vue3-element-admin/stargazers) [![GitHub Star](https://img.shields.io/github/stars/youlaitech/vue3-element-admin?style=social)](https://github.com/youlaitech/vue3-element-admin) [![GitCode Star](https://gitcode.com/youlai/vue3-element-admin/star/badge.svg)](https://gitcode.com/youlai/vue3-element-admin/stargazers) @@ -20,26 +17,26 @@
-[🖥️ Live Preview](https://vue.youlai.tech) | [� Mobile Preview](https://app.youlai.tech) | [� Documentation](https://www.youlai.tech/vue3-element-admin) | [💬 中文](README.md) +[![Online Preview](https://img.shields.io/badge/Online%20Preview-2D8CF0?style=for-the-badge&logo=google-chrome&logoColor=white)](https://vue.youlai.tech) +[![Mobile Preview](https://img.shields.io/badge/Mobile%20Preview-19BE6B?style=for-the-badge&logo=android&logoColor=white)](https://app.youlai.tech) +[![Documentation](https://img.shields.io/badge/Documentation-8B5CF6?style=for-the-badge&logo=gitbook&logoColor=white)](https://www.youlai.tech/docs/web/) +[![Official Site](https://img.shields.io/badge/Official%20Site-FF9F1C?style=for-the-badge&logo=safari&logoColor=white)](https://www.youlai.tech/docs/web/) +[![中文](https://img.shields.io/badge/中文-00B4D8?style=for-the-badge&logo=google-translate&logoColor=white)](./README.md)
## Introduction -[vue3-element-admin](https://gitcode.com/youlai/vue3-element-admin) is a minimalist enterprise-level admin frontend template built with Vue3, Vite7, TypeScript, and Element-Plus. It comes with a Java backend [youlai-boot](https://gitee.com/youlaiorg/youlai-boot), a multi-tenant Java backend [youlai-boot-tenant](https://gitee.com/youlaiorg/youlai-boot-tenant), and a Node backend [youlai-nest](https://gitee.com/youlaiorg/youlai-nest). A simplified version [vue3-element-template](https://gitee.com/youlaiorg/vue3-element-template) and a JavaScript version [vue3-element-admin-js](https://gitee.com/youlaiorg/vue3-element-admin) are also available. +[vue3-element-admin](https://gitcode.com/youlai/vue3-element-admin) is an enterprise-level admin frontend template built with Vue3, Vite, TypeScript, and Element-Plus. It ships with a Java backend [youlai-boot](https://gitee.com/youlaiorg/youlai-boot), a multi-tenant backend [youlai-boot-tenant](https://gitee.com/youlaiorg/youlai-boot-tenant), and a Node backend [youlai-nest](https://gitee.com/youlaiorg/youlai-nest). A streamlined version [vue3-element-template](https://gitee.com/youlaiorg/vue3-element-template), a JavaScript version [vue3-element-admin-js](https://gitee.com/youlaiorg/vue3-element-admin-js), and a Naive UI version [vue3-naiveui-admin](https://gitee.com/youlaiorg/vue3-naiveui-admin) are also available for different scenarios. ## Project Features -- **Simple and Easy-to-use**: Upgraded version of [vue-element-admin](https://gitee.com/panjiachen/vue-element-admin) for Vue3, with minimal encapsulation and easy to get started. -- **Data Interaction**: Support for `Mock` data and [online API documentation](https://www.apifox.cn/apidoc/shared-195e783f-4d85-4235-a038-eec696de4ea5), with accompanying [Java](https://gitee.com/youlaiorg/youlai-boot) and [Node](https://gitee.com/youlaiorg/youlai-nest) backend source code. - -- **System Functions**: Provides user management, role management, menu management, department management, dictionary management, and other functional modules. -- **Permission Management**: Supports dynamic routing, button permissions, role permissions, and data permissions. - -- **Multi-tenant**: Supports multi-tenant mode and tenant isolation. - -- **Infrastructure**: Provides internationalization, multiple layouts, dark mode, full screen, watermark, API documentation, and code generator functionality. -- **Continuous Updates**: Project is continuously updated with real-time updates of tools and dependencies. +- **Simple and Easy-to-use** — A Vue3 upgrade of [vue-element-admin](https://gitee.com/panjiachen/vue-element-admin) with no over-encapsulation, easy to get started. +- **Permission System** — Dynamic routing, button permissions, role permissions, and data permissions. +- **Multi-tenant** — Supports multi-tenant mode and tenant isolation. +- **Infrastructure** — Internationalization, multiple layouts, dark mode, full screen, watermark, API documentation, and code generator. +- **Data Interaction** — Supports Mock data and online API documentation, with accompanying Java / Node backend source code. +- **Continuous Updates** — The project is continuously open-sourced and updated, keeping pace with the mainstream tech stack. ## System Preview @@ -71,64 +68,22 @@ -## Ecosystem +## Quick Start -**Frontend** +**Environment Requirements**: Node.js `^20.19.0` or `>=22.12.0` · pnpm `>=8.0.0` -| Project | Tech Stack | Description | -|:-----|:-------|:-----| -| [vue3-element-admin](https://gitee.com/youlaiorg/vue3-element-admin) | Vue 3 + Vite + TS + Element Plus | PC Admin (Main) | -| [vue3-element-admin-js](https://gitee.com/youlaiorg/vue3-element-admin-js) | Vue 3 + Vite + JS + Element Plus | JavaScript Version | -| [vue3-element-template](https://gitee.com/youlaiorg/vue3-element-template) | Vue 3 + Vite + TS + Element Plus | Lite Template | -| [youlai-app](https://gitee.com/youlaiorg/youlai-app) | Vue 3 + UniApp | Mobile App | - -**Backend** - -| Project | Tech Stack | Description | -|:-----|:-------|:-----| -| [youlai-boot](https://gitee.com/youlaiorg/youlai-boot) | Spring Boot + MyBatis-Plus | Java (recommended) | -| [youlai-nest](https://gitee.com/youlaiorg/youlai-nest) | NestJS + TypeORM | Node.js | -| [youlai-gin](https://gitee.com/youlaiorg/youlai-gin) | Go + Gorm | Go | -| [youlai-django](https://gitee.com/youlaiorg/youlai-django) | Django + DRF | Python | -| [youlai-fastapi](https://gitee.com/youlaiorg/youlai-fastapi) | FastAPI + SQLAlchemy | Python | -| [youlai-think](https://gitee.com/youlaiorg/youlai-think) | ThinkPHP + ThinkORM | PHP | -| [youlai-aspnet](https://gitee.com/youlaiorg/youlai-aspnet) | ASP.NET Core + EF Core | C# | -| [youlai-axum](https://gitee.com/youlaiorg/youlai-axum) | Axum + SeaORM | Rust | -> **youlai-boot** also provides variants: [Multi-tenant](https://gitee.com/youlaiorg/youlai-boot-tenant) · [MyBatis-Flex](https://gitee.com/youlaiorg/youlai-boot-flex) · [Spring Boot 3](https://gitee.com/youlaiorg/youlai-boot/tree/spring-boot-3) · [PostgreSQL](https://gitee.com/youlaiorg/youlai-boot/tree/db-pg) · [Multi-module](https://gitee.com/youlaiorg/youlai-boot/tree/multi-module) -> -> All eight backends share the same **RESTful API** and **database schema**, frontends can switch seamlessly. - -## Development Guide - -| Name | Link | -| ---------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| Video Tutorial | [https://www.bilibili.com/video/BV1eFUuYyEFj](https://www.bilibili.com/video/BV1eFUuYyEFj) | -| Project Setup | [Building a Backend Management System from Scratch with Vue3, Vite, TypeScript, and Element-Plus](https://blog.csdn.net/u013737132/article/details/130191394) | -| Official Documentation | [https://www.youlai.tech/vue3-element-admin/](https://www.youlai.tech/vue3-element-admin/) | -| Code Standards | [ESLint V9 + Prettier + Stylelint + EditorConfig for Standardized and Unified Frontend Code Style](https://youlai.blog.csdn.net/article/details/145608723) | -| Commit Standards | [Husky + Lint-staged + Commitlint + Commitizen + cz-git for Git Commit Standards](https://youlai.blog.csdn.net/article/details/145615236) | -| API Documentation | [https://www.apifox.cn/apidoc/shared-195e783f-4d85-4235-a038-eec696de4ea5](https://www.apifox.cn/apidoc/shared-195e783f-4d85-4235-a038-eec696de4ea5) | - -## Project Setup - -- **Environment Preparation** - -| Type | Requirement | Notes | -| ------------------- | ------------------------------------------------------------ | ---------------------------------------- | -| **Node.js** | `^20.19.0` or `>=22.12.0` | LTS is recommended (even major versions) | -| **Package Manager** | `pnpm >= 8.0.0` | This project uses pnpm | -| **IDE** | [Visual Studio Code](https://code.visualstudio.com/Download) | Recommended Vue/TypeScript extensions | - -- **Quick Start** +| Environment Type | Version Requirement | Notes | +| -------- | -------- | ---- | +| **Node.js** | `^20.19.0` or `>=22.12.0` | LTS is recommended (even major versions) | +| **Package Manager** | `pnpm >= 8.0.0` | This project uses pnpm as the package manager | +| **IDE** | [Visual Studio Code](https://code.visualstudio.com/Download) | Vue and TypeScript extensions recommended | ```bash # Clone repository git clone https://gitee.com/youlaiorg/vue3-element-admin.git - -# Change directory cd vue3-element-admin -# Install pnpm +# Install pnpm (skip if already installed) npm install pnpm -g # Set mirror source (optional) @@ -141,93 +96,102 @@ pnpm install pnpm run dev ``` +After starting, visit http://localhost:3000 and log in with `admin` / `123456`. + +> For more, see the official docs: [Quick Start](https://www.youlai.tech/docs/web/) · [Deployment Guide](https://www.youlai.tech/docs/web/deployment/deploy.html) + +## AI Programming + +This project ships with an [Agent Skill](https://skills.sh/youlaitech/youlai-skills). Once installed, the AI coding assistant automatically follows this project's Vue3 development conventions (naming, directory structure, BEM + UnoCSS, component and API conventions). It supports 70+ agents including CodeBuddy, Claude Code, Cursor, Codex, and GitHub Copilot. + +```bash +npx skills add https://github.com/youlaitech/youlai-skills --skill vue +``` + +## Ecosystem Matrix + +**Frontend** + +| Project | Tech Stack | Description | Status | +|:-----|:-------|:-----|:---------| +| [vue3-element-admin](https://gitee.com/youlaiorg/vue3-element-admin) | Vue 3 + Vite + TS + Element Plus | PC Admin (Main) | ✅️ | +| [vue3-element-admin-js](https://gitee.com/youlaiorg/vue3-element-admin-js) | Vue 3 + Vite + JS + Element Plus | JavaScript Version | ✅️ | +| [vue3-element-template](https://gitee.com/youlaiorg/vue3-element-template) | Vue 3 + Vite + TS + Element Plus | Lite Template | ✅️ | +| [vue3-naiveui-admin](https://gitee.com/youlaiorg/vue3-naiveui-admin) | Vue 3 + Vite + TS + Naive UI | Naive UI Version | ✅️ | +| [youlai-app](https://gitee.com/youlaiorg/youlai-app) | Vue 3 + UniApp | Mobile App | ✅️ | + +**Backend** + +| Project | Tech Stack | Description | Status | +|:-----|:-------|:-----|:---------| +| [youlai-boot](https://gitee.com/youlaiorg/youlai-boot) | Spring Boot + MyBatis-Plus | Java (Main) | ✅️ | +| [youlai-nest](https://gitee.com/youlaiorg/youlai-nest) | NestJS + TypeORM | Node.js | ✅️ | +| [youlai-gin](https://gitee.com/youlaiorg/youlai-gin) | Go + Gorm | Go | ✅️ | +| [youlai-django](https://gitee.com/youlaiorg/youlai-django) | Django + DRF | Python | ✅️ | +| [youlai-fastapi](https://gitee.com/youlaiorg/youlai-fastapi) | FastAPI + SQLAlchemy | Python | ✅️ | +| [youlai-laravel](https://gitee.com/youlaiorg/youlai-laravel) | Laravel + Eloquent | PHP | ✅️ | +| [youlai-think](https://gitee.com/youlaiorg/youlai-think) | ThinkPHP + ThinkORM | PHP | ✅️ | +| [youlai-aspnet](https://gitee.com/youlaiorg/youlai-aspnet) | ASP.NET Core + EF Core | C# | ✅️ | +| [youlai-axum](https://gitee.com/youlaiorg/youlai-axum) | Axum + SeaORM | Rust | ✅️ | + +> All nine backends share the same **RESTful API** and **database schema**, frontends can switch seamlessly. + +**Variants and Derivatives** + +| Project | Base | Description | Status | +|:-----|:-----|:-----|:---------| +| [youlai-boot-tenant](https://gitee.com/youlaiorg/youlai-boot-tenant) | youlai-boot | Multi-tenant SaaS, tenant isolation and tenant config | ✅️ | +| [youlai-boot-flex](https://gitee.com/youlaiorg/youlai-boot-flex) | youlai-boot | Switched to MyBatis-Flex | ✅️ | +| [youlai-boot (db-pg)](https://gitee.com/youlaiorg/youlai-boot/tree/db-pg) | youlai-boot | PostgreSQL database branch | ✅️ | +| [youlai-boot (multi-module)](https://gitee.com/youlaiorg/youlai-boot/tree/multi-module) | youlai-boot | Multi-module project split | ✅️ | +| [youlai-boot (spring-boot-3)](https://gitee.com/youlaiorg/youlai-boot/tree/spring-boot-3) | youlai-boot | Spring Boot 3 compatible branch | ✅️ | +| [youlai-nest (multi-tenant)](https://gitee.com/youlaiorg/youlai-nest/tree/multi-tenant) | youlai-nest | Multi-tenant SaaS, tenant isolation and tenant config | ✅️ | + +## Development Guide + +| Name | Link | +| -------- | -------- | +| Video Tutorial | [https://www.bilibili.com/video/BV1eFUuYyEFj](https://www.bilibili.com/video/BV1eFUuYyEFj) | +| Project Setup | [Building a Backend Management System from Scratch with Vue3, Vite, TypeScript, and Element-Plus](https://blog.csdn.net/u013737132/article/details/130191394) | +| Official Documentation | [https://www.youlai.tech/docs/web/](https://www.youlai.tech/docs/web/) | +| Deployment Guide | [https://www.youlai.tech/docs/web/deployment/deploy.html](https://www.youlai.tech/docs/web/deployment/deploy.html) | +| FAQ | [https://www.youlai.tech/docs/faq/](https://www.youlai.tech/docs/faq/) | +| Code Standards | [ESLint V9 + Prettier + Stylelint + EditorConfig for Standardized and Unified Frontend Code Style](https://youlai.blog.csdn.net/article/details/145608723) | +| Commit Standards | [Husky + Lint-staged + Commitlint + Commitizen + cz-git for Git Commit Standards](https://youlai.blog.csdn.net/article/details/145615236) | +| API Documentation | [https://www.apifox.cn](https://www.apifox.cn/apidoc/shared-195e783f-4d85-4235-a038-eec696de4ea5) | + ## Project Deployment -After executing the `pnpm run build` command, the project will be bundled and a `dist` directory will be generated. Next, upload the files from the `dist` directory to the `/usr/share/nginx/html` directory on your server and configure Nginx for reverse proxy. +Run `pnpm run build` to bundle and generate the `dist` directory, upload it to the server and configure Nginx reverse proxy. ```bash pnpm run build ``` -Here is an example Nginx configuration: +For the detailed deployment flow (Nginx config, reverse proxy, HTTPS, etc.), see the [Deployment Guide](https://www.youlai.tech/docs/web/deployment/deploy.html). -```nginx -server { - listen 80; - server_name localhost; +## Data Interface - location / { - root /usr/share/nginx/html; - index index.html index.htm; - } +The frontend uses the online API by default, and can also switch to local Mock or connect to a local backend. - # Reverse proxy configuration - location /prod-api/ { - # Please replace api.youlai.tech with your backend API address, and keep the trailing slash / - proxy_pass http://api.youlai.tech/; - } -} -``` +**Local Mock**: Set `VITE_MOCK_DEV_SERVER` in `.env.development` to `true` to enable local Mock interfaces, allowing standalone development without a backend. -For more detailed information, please refer to this article: [Nginx Installation and Configuration](https://blog.csdn.net/u013737132/article/details/145667694). - -## Local Mock - -The project supports both online and local Mock interfaces. By default, it uses online interfaces. To switch to Mock interfaces, modify the `VITE_MOCK_DEV_SERVER` value in the `.env.development` file to `true`. - -## Backend API - -> If you have a basic understanding of Java development, follow these steps to convert online API to local backend API and create an enterprise-level full-stack development environment to help you on your full-stack journey. - -1. Get the backend source code based on `Java` and `SpringBoot` from [youlai-boot](https://gitee.com/youlaiorg/youlai-boot.git). -2. Follow the instructions in the backend project's README.md to [set up and run locally](https://gitee.com/youlaiorg/youlai-boot#%E9%A1%B9%E7%9B%AE%E8%BF%90%E8%A1%8C). -3. Modify the value of `VITE_APP_API_URL` in the `.env.development` file, changing it from https://api.youlai.tech to http://localhost:8989. - -## Notes - -- **Auto import plugin is disabled by default** - - Component type declarations have been automatically generated for the template project. If you add and use new components, follow the instructions in the screenshot to enable automatic generation. After automatic generation is complete, remember to set it back to `false` to avoid conflicts. - - ![](https://foruda.gitee.com/images/1687755823137387608/412ea803_716974.png) - -- **Blank page when accessing the project** - - Try upgrading your browser, as older browser engines may not support certain new JavaScript syntax, such as optional chaining operator `?.`. - -- **Project synchronization with repository updates** - - After synchronizing the project with repository updates, it is recommended to run `pnpm install` to update dependencies before starting. - -- **Red highlight on project components, functions, and imports** - - Restart VSCode to try again. - -- **Other issues** - - If you have any other issues or suggestions, please open an [ISSUE](https://gitee.com/youlaiorg/vue3-element-admin/issues/new). +**Connect to Backend**: All nine backends use the default port `8000`. Change `VITE_APP_API_URL` in `.env.development` to `http://localhost:8000` and start the corresponding backend (the recommended Java backend is [youlai-boot](https://gitee.com/youlaiorg/youlai-boot.git); see each repo's README for the rest). ## Commit Conventions -Execute `pnpm run commit` to invoke interactive git commit and complete the information input and selection according to the prompts. +Run `pnpm run commit` to invoke the interactive git commit and complete the information input and selection according to the prompts. ![](https://foruda.gitee.com/images/1687755823165218215/c1705416_716974.png) -## Project Statistics +## Technical Cooperation -![](https://repobeats.axiom.co/api/embed/aa7cca3d6fa9c308fc659fa6e09af9a1910506c3.svg "Repobeats analytics image") - -Thanks to all the contributors! -感谢所有的贡献者! - -[![contributors](https://contrib.rocks/image?repo=youlaitech/vue3-element-admin)](https://github.com/youlaitech/vue3-element-admin/graphs/contributors) - ---- +This project is open-sourced under the [MIT](LICENSE) license and free for commercial use. Feel free to submit issues or feedback in [Issue](https://gitee.com/youlaiorg/vue3-element-admin/issues), and pull requests in [Pull Request](https://gitee.com/youlaiorg/vue3-element-admin/pulls) are also welcome. For technical support, business cooperation, secondary development, or project customization, contact the author via WeChat (see QR code below). @@ -244,7 +208,3 @@ Thanks to all the contributors!
- WeChat Official Account
+ WeChat Official Account
WeChat Official Account
    

Technical Exchange · Issue Feedback · Business Cooperation

- -## License - -[MIT](LICENSE) diff --git a/README.md b/README.md index 55a90400..af0b81f9 100644 --- a/README.md +++ b/README.md @@ -19,7 +19,7 @@ [![在线预览](https://img.shields.io/badge/在线预览-2D8CF0?style=for-the-badge&logo=google-chrome&logoColor=white)](https://vue.youlai.tech) [![移动端预览](https://img.shields.io/badge/移动端预览-19BE6B?style=for-the-badge&logo=android&logoColor=white)](https://app.youlai.tech) -[![阅读文档](https://img.shields.io/badge/阅读文档-8B5CF6?style=for-the-badge&logo=gitbook&logoColor=white)](https://juejin.cn/post/7228990409909108793) +[![阅读文档](https://img.shields.io/badge/阅读文档-8B5CF6?style=for-the-badge&logo=gitbook&logoColor=white)](https://www.youlai.tech/docs/web/) [![官网](https://img.shields.io/badge/官网-FF9F1C?style=for-the-badge&logo=safari&logoColor=white)](https://www.youlai.tech/docs/web/) [![English](https://img.shields.io/badge/English-00B4D8?style=for-the-badge&logo=google-translate&logoColor=white)](./README.en-US.md) @@ -27,20 +27,16 @@ ## 项目简介 -[vue3-element-admin](https://gitcode.com/youlai/vue3-element-admin) 基于 Vue3、Vite、TypeScript 和 Element-Plus 搭建的极简开箱即用企业级后台管理前端模板。 配套 Java 后端 [youlai-boot](https://gitee.com/youlaiorg/youlai-boot)、多租户后端 [youlai-boot-tenant](https://gitee.com/youlaiorg/youlai-boot-tenant) 和 Node 后端 [youlai-nest](https://gitee.com/youlaiorg/youlai-nest) 。 提供开发简版[vue3-element-template](https://gitee.com/youlaiorg/vue3-element-template) 和 JS 版本[vue3-element-admin-js](https://gitee.com/youlaiorg/vue3-element-admin) 供开发者快速开发。 +[vue3-element-admin](https://gitcode.com/youlai/vue3-element-admin) 基于 Vue3、Vite、TypeScript 和 Element-Plus 搭建的企业级中后台前端模板,配套 Java 后端 [youlai-boot](https://gitee.com/youlaiorg/youlai-boot)、多租户后端 [youlai-boot-tenant](https://gitee.com/youlaiorg/youlai-boot-tenant) 和 Node 后端 [youlai-nest](https://gitee.com/youlaiorg/youlai-nest)。另提供精简版 [vue3-element-template](https://gitee.com/youlaiorg/vue3-element-template)、JS 版 [vue3-element-admin-js](https://gitee.com/youlaiorg/vue3-element-admin-js) 和 Naive UI 版 [vue3-naiveui-admin](https://gitee.com/youlaiorg/vue3-naiveui-admin) 供不同场景选用。 ## 项目特色 -- **简洁易用**:基于 [vue-element-admin](https://gitee.com/panjiachen/vue-element-admin) 升级的 Vue3 版本,无过渡封装 ,易上手。 -- **数据交互**: 支持 `Mock` 数据和[线上接口文档](https://www.apifox.cn/apidoc/shared-195e783f-4d85-4235-a038-eec696de4ea5),并提供配套的 [Java](https://gitee.com/youlaiorg/youlai-boot) 和 [Node](https://gitee.com/youlaiorg/youlai-nest) 后端源码。 - -- **系统功能:** 提供用户管理、角色管理、菜单管理、部门管理、字典管理、系统配置、通知公告等功能模块。 -- **权限管理:** 支持动态路由、按钮权限、角色权限和数据权限等多种权限管理方式。 - -- **多租户:** 支持多租户模式与租户隔离。 - -- **基础设施:** 提供国际化、多布局、暗黑模式、全屏、水印、接口文档和代码生成器等功能。 -- **持续更新**:项目持续开源更新,实时更新工具和依赖。 +- **简洁易用** — 基于 [vue-element-admin](https://gitee.com/panjiachen/vue-element-admin) 升级的 Vue3 版本,无过度封装,易上手 +- **权限体系** — 动态路由、按钮权限、角色权限和数据权限 +- **多租户** — 支持多租户模式与租户隔离 +- **基础设施** — 国际化、多布局、暗黑模式、全屏、水印、接口文档、代码生成器 +- **数据交互** — 支持 Mock 数据与线上接口文档,配套 Java / Node 后端源码 +- **持续更新** — 项目持续开源更新,跟进主流技术栈 ## 系统预览 @@ -72,68 +68,25 @@ -## 生态矩阵 +## 快速开始 -**前端** +**环境要求**:Node.js `^20.19.0` 或 `>=22.12.0` · pnpm `>=8.0.0` -| 项目 | 技术栈 | 说明 | -|:-----|:-------|:-----| -| [vue3-element-admin](https://gitee.com/youlaiorg/vue3-element-admin) | Vue 3 + Vite + TS + Element Plus | PC 管理前端(主推) | -| [vue3-element-admin-js](https://gitee.com/youlaiorg/vue3-element-admin-js) | Vue 3 + Vite + JS + Element Plus | JavaScript 版本 | -| [vue3-element-template](https://gitee.com/youlaiorg/vue3-element-template) | Vue 3 + Vite + TS + Element Plus | 精简模板 | -| [youlai-app](https://gitee.com/youlaiorg/youlai-app) | Vue 3 + UniApp | 移动端 App | - -**后端** - -| 项目 | 技术栈 | 说明 | -|:-----|:-------|:-----| -| [youlai-boot](https://gitee.com/youlaiorg/youlai-boot) | Spring Boot + MyBatis-Plus | Java(主推) | -| [youlai-nest](https://gitee.com/youlaiorg/youlai-nest) | NestJS + TypeORM | Node.js | -| [youlai-gin](https://gitee.com/youlaiorg/youlai-gin) | Go + Gorm | Go | -| [youlai-django](https://gitee.com/youlaiorg/youlai-django) | Django + DRF | Python | -| [youlai-fastapi](https://gitee.com/youlaiorg/youlai-fastapi) | FastAPI + SQLAlchemy | Python | -| [youlai-think](https://gitee.com/youlaiorg/youlai-think) | ThinkPHP + ThinkORM | PHP | -| [youlai-aspnet](https://gitee.com/youlaiorg/youlai-aspnet) | ASP.NET Core + EF Core | C# | -| [youlai-axum](https://gitee.com/youlaiorg/youlai-axum) | Axum + SeaORM | Rust | - -> **youlai-boot** 还提供以下变种和分支版本:[多租户](https://gitee.com/youlaiorg/youlai-boot-tenant)· [MyBatis-Flex](https://gitee.com/youlaiorg/youlai-boot-flex)· [Spring Boot 3](https://gitee.com/youlaiorg/youlai-boot/tree/spring-boot-3) · [PostgreSQL](https://gitee.com/youlaiorg/youlai-boot/tree/db-pg) · [多模块](https://gitee.com/youlaiorg/youlai-boot/tree/multi-module) -> -> 八种后端共享同一套 **RESTful API 规范** 和 **数据库结构**,前端可无缝切换。 - -## 开发指南 - -| 名称 | 地址 | -| -------- | ---------------------------------------------------------------------------------------------------------------------------------- | -| 视频教程 | [https://www.bilibili.com/video/BV1eFUuYyEFj](https://www.bilibili.com/video/BV1eFUuYyEFj) | -| 项目搭建 | [基于 Vue3 + Vite + TypeScript + Element-Plus 从0到1搭建后台管理系统](https://blog.csdn.net/u013737132/article/details/130191394) | -| 官方文档 | [https://www.youlai.tech/docs/web/](https://www.youlai.tech/docs/web/) | -| 代码规范 | [ESLint V9 + Prettier + Stylelint + EditorConfig 约束和统一前端代码规范](https://youlai.blog.csdn.net/article/details/145608723) | -| 提交规范 | [Husky + Lint-staged + Commitlint + Commitizen + cz-git 配置 Git 提交规范](https://youlai.blog.csdn.net/article/details/145615236) | -| 接口文档 | [https://www.apifox.cn](https://www.apifox.cn/apidoc/shared-195e783f-4d85-4235-a038-eec696de4ea5) | - -## 项目启动 - -- **环境准备** - -| 环境类型 | 版本要求 | 备注 | -| ------------ | ------------------------------------------------------------ | --------------------------------- | -| **Node.js** | `^20.19.0` 或 `>=22.12.0` | 推荐使用 LTS 版本(主版本为偶数) | -| **包管理器** | `pnpm >= 8.0.0` | 项目使用 pnpm 作为包管理器 | +| 环境类型 | 版本要求 | 备注 | +| -------- | -------- | ---- | +| **Node.js** | `^20.19.0` 或 `>=22.12.0` | 推荐 LTS 版本(主版本为偶数) | +| **包管理器** | `pnpm >= 8.0.0` | 项目使用 pnpm 作为包管理器 | | **开发工具** | [Visual Studio Code](https://code.visualstudio.com/Download) | 推荐安装 Vue、TypeScript 相关插件 | -- **快速开始** - ```bash # 克隆代码 git clone https://gitee.com/youlaiorg/vue3-element-admin.git - -# 切换目录 cd vue3-element-admin -# 安装 pnpm +# 安装 pnpm(已安装可跳过) npm install pnpm -g -# 设置镜像源(可忽略) +# 设置镜像源(可忽略) pnpm config set registry https://registry.npmmirror.com # 安装依赖 @@ -143,6 +96,10 @@ pnpm install pnpm run dev ``` +启动后访问 [http://localhost:3000](http://localhost:3000),使用 `admin` / `123456` 登录。 + +> 更多内容详见官方文档:[快速开始](https://www.youlai.tech/docs/web/) · [部署指南](https://www.youlai.tech/docs/web/deployment/deploy.html) + ## AI 编程 本项目配套 [Agent Skill](https://skills.sh/youlaitech/youlai-skills),安装后 AI 编程助手会自动遵循本项目的 Vue3 开发规范(命名、目录结构、BEM + UnoCSS、组件与 API 约定)。支持 CodeBuddy、Claude Code、Cursor、Codex、GitHub Copilot 等 70+ Agent。 @@ -151,74 +108,75 @@ pnpm run dev npx skills add https://github.com/youlaitech/youlai-skills --skill vue ``` -- **安装位置**:项目级默认写入各 Agent 的 skills 目录,如 CodeBuddy → `.codebuddy/skills/vue/SKILL.md`、Claude Code → `.claude/skills/vue/SKILL.md`、Cursor → `.cursor/skills/vue/SKILL.md`;加 `-g` 改为全局 `~/.codebuddy/skills/` 等,跨项目复用。 -- **生成文件**:`vue/` 目录,内含 `SKILL.md`(frontmatter `name`/`description` + Vue3 开发规范正文)。 +## 生态矩阵 + +**前端** + +| 项目 | 技术栈 | 说明 | 更新状态 | +|:-----|:-------|:-----|:---------| +| [vue3-element-admin](https://gitee.com/youlaiorg/vue3-element-admin) | Vue 3 + Vite + TS + Element Plus | PC 管理前端(主推) | ✅️ | +| [vue3-element-admin-js](https://gitee.com/youlaiorg/vue3-element-admin-js) | Vue 3 + Vite + JS + Element Plus | JavaScript 版本 | ✅️ | +| [vue3-element-template](https://gitee.com/youlaiorg/vue3-element-template) | Vue 3 + Vite + TS + Element Plus | 精简模板 | ✅️ | +| [vue3-naiveui-admin](https://gitee.com/youlaiorg/vue3-naiveui-admin) | Vue 3 + Vite + TS + Naive UI | Naive UI 版本 | ✅️ | +| [youlai-app](https://gitee.com/youlaiorg/youlai-app) | Vue 3 + UniApp | 移动端 App | ✅️ | + +**后端** + +| 项目 | 技术栈 | 说明 | 更新状态 | +|:-----|:-------|:-----|:---------| +| [youlai-boot](https://gitee.com/youlaiorg/youlai-boot) | Spring Boot + MyBatis-Plus | Java(主推) | ✅️ | +| [youlai-nest](https://gitee.com/youlaiorg/youlai-nest) | NestJS + TypeORM | Node.js | ✅️ | +| [youlai-gin](https://gitee.com/youlaiorg/youlai-gin) | Go + Gorm | Go | ✅️ | +| [youlai-django](https://gitee.com/youlaiorg/youlai-django) | Django + DRF | Python | ✅️ | +| [youlai-fastapi](https://gitee.com/youlaiorg/youlai-fastapi) | FastAPI + SQLAlchemy | Python | ✅️ | +| [youlai-laravel](https://gitee.com/youlaiorg/youlai-laravel) | Laravel + Eloquent | PHP | ✅️ | +| [youlai-think](https://gitee.com/youlaiorg/youlai-think) | ThinkPHP + ThinkORM | PHP | ✅️ | +| [youlai-aspnet](https://gitee.com/youlaiorg/youlai-aspnet) | ASP.NET Core + EF Core | C# | ✅️ | +| [youlai-axum](https://gitee.com/youlaiorg/youlai-axum) | Axum + SeaORM | Rust | ✅️ | + +> 九种后端共享同一套 **RESTful API 规范** 和 **数据库结构**,前端可无缝切换。 + +**变种与衍生版本** + +| 项目 | 基础 | 说明 | 更新状态 | +|:-----|:-----|:-----|:---------| +| [youlai-boot-tenant](https://gitee.com/youlaiorg/youlai-boot-tenant) | youlai-boot | 多租户 SaaS,租户隔离与租户配置 | ✅️ | +| [youlai-boot-flex](https://gitee.com/youlaiorg/youlai-boot-flex) | youlai-boot | 改用 MyBatis-Flex | ✅️ | +| [youlai-boot (db-pg)](https://gitee.com/youlaiorg/youlai-boot/tree/db-pg) | youlai-boot | PostgreSQL 数据库分支 | ✅️ | +| [youlai-boot (multi-module)](https://gitee.com/youlaiorg/youlai-boot/tree/multi-module) | youlai-boot | 多模块工程拆分 | ✅️ | +| [youlai-boot (spring-boot-3)](https://gitee.com/youlaiorg/youlai-boot/tree/spring-boot-3) | youlai-boot | Spring Boot 3 兼容分支 | ✅️ | +| [youlai-nest (multi-tenant)](https://gitee.com/youlaiorg/youlai-nest/tree/multi-tenant) | youlai-nest | 多租户 SaaS,租户隔离与租户配置 | ✅️ | + +## 开发指南 + +| 名称 | 地址 | +| -------- | -------- | +| 视频教程 | [https://www.bilibili.com/video/BV1eFUuYyEFj](https://www.bilibili.com/video/BV1eFUuYyEFj) | +| 项目搭建 | [基于 Vue3 + Vite + TypeScript + Element-Plus 从0到1搭建后台管理系统](https://blog.csdn.net/u013737132/article/details/130191394) | +| 官方文档 | [https://www.youlai.tech/docs/web/](https://www.youlai.tech/docs/web/) | +| 部署指南 | [https://www.youlai.tech/docs/web/deployment/deploy.html](https://www.youlai.tech/docs/web/deployment/deploy.html) | +| 常见问题 | [https://www.youlai.tech/docs/faq/](https://www.youlai.tech/docs/faq/) | +| 代码规范 | [ESLint V9 + Prettier + Stylelint + EditorConfig 约束和统一前端代码规范](https://youlai.blog.csdn.net/article/details/145608723) | +| 提交规范 | [Husky + Lint-staged + Commitlint + Commitizen + cz-git 配置 Git 提交规范](https://youlai.blog.csdn.net/article/details/145615236) | +| 接口文档 | [https://www.apifox.cn](https://www.apifox.cn/apidoc/shared-195e783f-4d85-4235-a038-eec696de4ea5) | ## 项目部署 -执行 `pnpm run build` 命令后,项目将被打包并生成 `dist` 目录。接下来,将 `dist` 目录下的文件上传到服务器 `/usr/share/nginx/html` 目录下,并配置 Nginx 进行反向代理。 +执行 `pnpm run build` 打包生成 `dist` 目录,上传至服务器并配置 Nginx 反向代理。 ```bash pnpm run build ``` -以下是 Nginx 的配置示例: +详细部署流程(Nginx 配置、反向代理、HTTPS 等)见 [部署指南](https://www.youlai.tech/docs/web/deployment/deploy.html)。 -```nginx -server { - listen 80; - server_name localhost; +## 数据接口 - location / { - root /usr/share/nginx/html; - index index.html index.htm; - } +前端默认使用线上接口,也可切换为本地 Mock 或对接本地后端。 - # 反向代理配置 - location /prod-api/ { - # 请将 api.youlai.tech 替换为您的后端 API 地址,并注意保留后面的斜杠 / - proxy_pass http://api.youlai.tech/; - } -} -``` +**本地 Mock**:将 `.env.development` 的 `VITE_MOCK_DEV_SERVER` 设为 `true` 即启用本地 Mock 接口,无需后端即可独立开发。 -更多详细信息,请参考这篇文章:[Nginx 安装和配置](https://blog.csdn.net/u013737132/article/details/145667694)。 - -## 本地Mock - -项目同时支持在线和本地 Mock 接口,默认使用线上接口,如需替换为 Mock 接口,修改文件 `.env.development` 的 `VITE_MOCK_DEV_SERVER` 为 `true` **即可**。 - -## 后端接口 - -> 如果您具备Java开发基础,按照以下步骤将在线接口转为本地后端接口,创建企业级前后端分离开发环境,助您走向全栈之路。 - -1. 获取基于 `Java` 和 `SpringBoot` 开发的后端 [youlai-boot](https://gitee.com/youlaiorg/youlai-boot.git) 源码。 -2. 根据后端工程的说明文档 [README.md](https://gitee.com/youlaiorg/youlai-boot#%E9%A1%B9%E7%9B%AE%E8%BF%90%E8%A1%8C) 完成本地启动。 -3. 修改 `.env.development` 文件中的 `VITE_APP_API_URL` 的值,将其从 https://api.youlai.tech 更改为 http://localhost:8000 即可。 - -## 注意事项 - -- **自动导入插件自动生成默认关闭** - - 模板项目的组件类型声明已自动生成。如果添加和使用新的组件,请按照图示方法开启自动生成。在自动生成完成后,记得将其设置为 `false`,避免重复执行引发冲突。 - - ![](https://foruda.gitee.com/images/1687755823137387608/412ea803_716974.png) - -- **项目启动浏览器访问空白** - - 请升级浏览器尝试,低版本浏览器内核可能不支持某些新的 JavaScript 语法,比如可选链操作符 `?.`。 - -- **项目同步仓库更新升级** - - 项目同步仓库更新升级之后,建议 `pnpm install` 安装更新依赖之后启动 。 - -- **项目组件、函数和引用爆红** - - 重启 VSCode 尝试 - -- **其他问题** - - 如果有其他问题或者建议,建议 [ISSUE](https://gitee.com/youlaiorg/vue3-element-admin/issues/new) +**对接后端**:九种后端默认端口均为 `8000`,将 `.env.development` 的 `VITE_APP_API_URL` 改为 `http://localhost:8000` 并启动对应后端即可(主推 Java 后端 [youlai-boot](https://gitee.com/youlaiorg/youlai-boot.git),其余见各自仓库 README)。 ## 提交规范 @@ -226,16 +184,9 @@ server { ![](https://foruda.gitee.com/images/1687755823165218215/c1705416_716974.png) -## 项目统计 +## 技术合作 -![](https://repobeats.axiom.co/api/embed/aa7cca3d6fa9c308fc659fa6e09af9a1910506c3.svg "Repobeats analytics image") - -Thanks to all the contributors! -感谢所有的贡献者! - -[![contributors](https://contrib.rocks/image?repo=youlaitech/vue3-element-admin)](https://github.com/youlaitech/vue3-element-admin/graphs/contributors) - ---- +本项目采用 [MIT](LICENSE) 协议开源,可免费商用。欢迎在 [Issue](https://gitee.com/youlaiorg/vue3-element-admin/issues) 提交问题或反馈,也欢迎提交 [Pull Request](https://gitee.com/youlaiorg/vue3-element-admin/pulls) 共建。如需技术支持、商务合作、二次开发或项目定制,可联系作者微信(见下方二维码)。 @@ -257,3 +208,4 @@ Thanks to all the contributors!

技术交流 · 问题反馈 · 商务合作

+ diff --git a/package.json b/package.json index 02950e6f..8cafe407 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "vue3-element-admin", "description": "Vue3 + Vite + TypeScript + Element-Plus 的后台管理模板,vue-element-admin 的 Vue3 版本", - "version": "4.7.7", + "version": "4.8.0", "private": true, "type": "module", "scripts": { @@ -63,6 +63,7 @@ "path-browserify": "^1.0.1", "path-to-regexp": "^8.4.2", "pinia": "^3.0.4", + "qrcode": "^1.5.4", "qs": "^6.15.2", "sortablejs": "^1.15.7", "vue": "^3.5.38", @@ -81,6 +82,7 @@ "@types/node": "^26.0.0", "@types/nprogress": "^0.2.3", "@types/path-browserify": "^1.0.3", + "@types/qrcode": "^1.5.6", "@types/qs": "^6.15.1", "@types/sortablejs": "^1.15.9", "@vitejs/plugin-vue": "^6.0.7", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 08e0deb2..8d4231f8 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -56,6 +56,9 @@ importers: pinia: specifier: ^3.0.4 version: 3.0.4(typescript@5.9.3)(vue@3.5.38(typescript@5.9.3)) + qrcode: + specifier: ^1.5.4 + version: 1.5.4 qs: specifier: ^6.15.2 version: 6.15.2 @@ -73,7 +76,7 @@ importers: version: 11.4.6(vue@3.5.38(typescript@5.9.3)) vue-router: specifier: ^5.1.0 - version: 5.1.0(@vue/compiler-sfc@3.5.38)(pinia@3.0.4(typescript@5.9.3)(vue@3.5.38(typescript@5.9.3)))(rolldown@1.1.2)(vite@8.1.0(@types/node@26.0.0)(jiti@2.7.0)(sass@1.101.0)(terser@5.48.0)(yaml@2.9.0))(vue@3.5.38(typescript@5.9.3)) + version: 5.1.0(@vue/compiler-sfc@3.5.38)(pinia@3.0.4(typescript@5.9.3)(vue@3.5.38(typescript@5.9.3)))(rolldown@1.1.2)(vite@8.0.6(@types/node@26.0.0)(jiti@2.7.0)(sass@1.101.0)(terser@5.48.0)(yaml@2.9.0))(vue@3.5.38(typescript@5.9.3)) vxe-table: specifier: ~4.6.25 version: 4.6.25(vue@3.5.38(typescript@5.9.3)) @@ -105,6 +108,9 @@ importers: '@types/path-browserify': specifier: ^1.0.3 version: 1.0.3 + '@types/qrcode': + specifier: ^1.5.6 + version: 1.5.6 '@types/qs': specifier: ^6.15.1 version: 6.15.1 @@ -113,7 +119,7 @@ importers: version: 1.15.9 '@vitejs/plugin-vue': specifier: ^6.0.7 - version: 6.0.7(vite@8.1.0(@types/node@26.0.0)(jiti@2.7.0)(sass@1.101.0)(terser@5.48.0)(yaml@2.9.0))(vue@3.5.38(typescript@5.9.3)) + version: 6.0.7(vite@8.0.6(@types/node@26.0.0)(jiti@2.7.0)(sass@1.101.0)(terser@5.48.0)(yaml@2.9.0))(vue@3.5.38(typescript@5.9.3)) autoprefixer: specifier: ^10.5.0 version: 10.5.1(postcss@8.5.15) @@ -194,19 +200,19 @@ importers: version: 8.62.0(eslint@10.5.0(jiti@2.7.0))(typescript@5.9.3) unocss: specifier: ^66.7.2 - version: 66.7.2(vite@8.1.0(@types/node@26.0.0)(jiti@2.7.0)(sass@1.101.0)(terser@5.48.0)(yaml@2.9.0)) + version: 66.7.2(vite@8.0.6(@types/node@26.0.0)(jiti@2.7.0)(sass@1.101.0)(terser@5.48.0)(yaml@2.9.0)) unplugin-auto-import: specifier: ^21.0.0 version: 21.0.0(@vueuse/core@14.3.0(vue@3.5.38(typescript@5.9.3))) unplugin-vue-components: specifier: ^32.1.0 - version: 32.1.0(rolldown@1.1.2)(vite@8.1.0(@types/node@26.0.0)(jiti@2.7.0)(sass@1.101.0)(terser@5.48.0)(yaml@2.9.0))(vue@3.5.38(typescript@5.9.3)) + version: 32.1.0(rolldown@1.1.2)(vite@8.0.6(@types/node@26.0.0)(jiti@2.7.0)(sass@1.101.0)(terser@5.48.0)(yaml@2.9.0))(vue@3.5.38(typescript@5.9.3)) vite: - specifier: ^8.0.16 - version: 8.1.0(@types/node@26.0.0)(jiti@2.7.0)(sass@1.101.0)(terser@5.48.0)(yaml@2.9.0) + specifier: 8.0.6 + version: 8.0.6(@types/node@26.0.0)(jiti@2.7.0)(sass@1.101.0)(terser@5.48.0)(yaml@2.9.0) vite-plugin-mock-dev-server: specifier: ^2.4.1 - version: 2.4.1(rolldown@1.1.2)(vite@8.1.0(@types/node@26.0.0)(jiti@2.7.0)(sass@1.101.0)(terser@5.48.0)(yaml@2.9.0)) + version: 2.4.1(rolldown@1.1.2)(vite@8.0.6(@types/node@26.0.0)(jiti@2.7.0)(sass@1.101.0)(terser@5.48.0)(yaml@2.9.0)) vue-eslint-parser: specifier: ^10.4.1 version: 10.4.1(eslint@10.5.0(jiti@2.7.0)) @@ -431,12 +437,21 @@ packages: '@emnapi/core@1.11.1': resolution: {integrity: sha512-RSvbQmHzdKzNsLYa/wHrbc3KN4sYLKAdPZxqiM2HATqv/SBk2/ENSHpvXGaLOMcsAyz0poEGqkmmKYG3OWiJEQ==} + '@emnapi/core@1.9.1': + resolution: {integrity: sha512-mukuNALVsoix/w1BJwFzwXBN/dHeejQtuVzcDsfOEsdpCumXb/E9j8w11h5S54tT1xhifGfbbSm/ICrObRb3KA==} + '@emnapi/runtime@1.10.0': resolution: {integrity: sha512-ewvYlk86xUoGI0zQRNq/mC+16R1QeDlKQy21Ki3oSYXNgLb45GV1P6A0M+/s6nyCuNDqe5VpaY84BzXGwVbwFA==} '@emnapi/runtime@1.11.1': resolution: {integrity: sha512-vgj7R3y3Wgx24IQaGPA/R6YFXLHVMOZ0uVEyIQPaWs+rd1AzfEMXlAC22FYwO1XkKR6NPsq7mUandH8oIRdZFw==} + '@emnapi/runtime@1.9.1': + resolution: {integrity: sha512-VYi5+ZVLhpgK4hQ0TAjiQiZ6ol0oe4mBx7mVv7IflsiEp0OWoVsp/+f9Vc1hOhE0TtkORVrI1GvzyreqpgWtkA==} + + '@emnapi/wasi-threads@1.2.0': + resolution: {integrity: sha512-N10dEJNSsUx41Z6pZsXU8FjPjpBEplgH24sfkmITrBED1/U2Esum9F3lfLrMjKHHjmi557zQn7kR9R+XWXu5Rg==} + '@emnapi/wasi-threads@1.2.1': resolution: {integrity: sha512-uTII7OYF+/Mes/MrcIOYp5yOtSMLBWSIoLPpcgwipoiKbli6k322tcoFsxoIIxPDqW01SQGAgko4EzZi2BNv2w==} @@ -728,6 +743,9 @@ packages: cpu: [x64] os: [win32] + '@oxc-project/types@0.123.0': + resolution: {integrity: sha512-YtECP/y8Mj1lSHiUWGSRzy/C6teUKlS87dEfuVKT09LgQbUsBW1rNg+MiJ4buGu3yuADV60gbIvo9/HplA56Ew==} + '@oxc-project/types@0.131.0': resolution: {integrity: sha512-PgnWDfV0h+b16XNKbXU7Daib/BFSt/J2mEzfYIBu6JB/wNdlU+kVYXCkGA1A9fWkTbOgbjh4e6NhPeQOYvFhEA==} @@ -838,36 +856,73 @@ packages: '@quansync/fs@1.0.0': resolution: {integrity: sha512-4TJ3DFtlf1L5LDMaM6CanJ/0lckGNtJcMjQ1NAV6zDmA0tEHKZtxNKin8EgPaVX1YzljbxckyT2tJrpQKAtngQ==} + '@rolldown/binding-android-arm64@1.0.0-rc.13': + resolution: {integrity: sha512-5ZiiecKH2DXAVJTNN13gNMUcCDg4Jy8ZjbXEsPnqa248wgOVeYRX0iqXXD5Jz4bI9BFHgKsI2qmyJynstbmr+g==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [android] + '@rolldown/binding-android-arm64@1.1.2': resolution: {integrity: sha512-2cZ+7xRS+DBcuJBJKnfzsbleumJhBqSlJVpuzHC0nTqfd3QQ7Vx2/x5YR/D7cBamKSeWplwo82Fn9lqYUDEMfA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [android] + '@rolldown/binding-darwin-arm64@1.0.0-rc.13': + resolution: {integrity: sha512-tz/v/8G77seu8zAB3A5sK3UFoOl06zcshEzhUO62sAEtrEuW/H1CcyoupOrD+NbQJytYgA4CppXPzlrmp4JZKA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [darwin] + '@rolldown/binding-darwin-arm64@1.1.2': resolution: {integrity: sha512-RkPMJnygxsgOYdkfqgpwY0/Fzm8d0VQe6HGU2/B00Xa9eqdLbrII+DOKAodbJAn3ZL1AJxGHkZRPYazgGY6Ljw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [darwin] + '@rolldown/binding-darwin-x64@1.0.0-rc.13': + resolution: {integrity: sha512-8DakphqOz8JrMYWTJmWA+vDJxut6LijZ8Xcdc4flOlAhU7PNVwo2MaWBF9iXjJAPo5rC/IxEFZDhJ3GC7NHvug==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [darwin] + '@rolldown/binding-darwin-x64@1.1.2': resolution: {integrity: sha512-Uiczh6vFhwyfd7WNe7Q7mCA4KxAiLdz7jPE/WGizfRpIieoyFuNVMmM8HqZ9HwudTkY6/AeMQwlNJ9NJijguWw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [darwin] + '@rolldown/binding-freebsd-x64@1.0.0-rc.13': + resolution: {integrity: sha512-4wBQFfjDuXYN/SVI8inBF3Aa+isq40rc6VMFbk5jcpolUBTe5cYnMsHZ51nFWsx3PVyyNN3vgoESki0Hmr/4BA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [freebsd] + '@rolldown/binding-freebsd-x64@1.1.2': resolution: {integrity: sha512-+TpdtTRgHiJFjCVFbw311SuLk3KfytPOQQn+VlAEv+gBxYPtL7E6JS9e/tk+8CwxhIZvemJKo4rTKgfWNsKkkA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [freebsd] + '@rolldown/binding-linux-arm-gnueabihf@1.0.0-rc.13': + resolution: {integrity: sha512-JW/e4yPIXLms+jmnbwwy5LA/LxVwZUWLN8xug+V200wzaVi5TEGIWQlh8o91gWYFxW609euI98OCCemmWGuPrw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [linux] + '@rolldown/binding-linux-arm-gnueabihf@1.1.2': resolution: {integrity: sha512-4lv1/tkmi7ueIVHnyreaOeUpiZP26BH9rRy6hoYfR9310A2B9nUEVRDvBx69vx64Nr3eTPPRkyciqJJs+j9Jmw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm] os: [linux] + '@rolldown/binding-linux-arm64-gnu@1.0.0-rc.13': + resolution: {integrity: sha512-ZfKWpXiUymDnavepCaM6KG/uGydJ4l2nBmMxg60Ci4CbeefpqjPWpfaZM7PThOhk2dssqBAcwLc6rAyr0uTdXg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + libc: [glibc] + '@rolldown/binding-linux-arm64-gnu@1.1.2': resolution: {integrity: sha512-gBSUVO0eaWgw1JMjK3gB8BMlX2Mk148s2lTiVT3e9vjVxbl7UDfMWWY8CfIaaqiXuM9fVTMxIpUz6CAo/B6Vlw==} engines: {node: ^20.19.0 || >=22.12.0} @@ -875,6 +930,13 @@ packages: os: [linux] libc: [glibc] + '@rolldown/binding-linux-arm64-musl@1.0.0-rc.13': + resolution: {integrity: sha512-bmRg3O6Z0gq9yodKKWCIpnlH051sEfdVwt+6m5UDffAQMUUqU0xjnQqqAUm+Gu7ofAAly9DqiQDtKu2nPDEABA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + libc: [musl] + '@rolldown/binding-linux-arm64-musl@1.1.2': resolution: {integrity: sha512-LjQP/iZLBu8o8PjIfk4x3At0/mT6h282pvz8Z5LAyhGbu/kDezyO7ea62rF5uoqmgnIYqbN/MqJ3Si3Aymi7xQ==} engines: {node: ^20.19.0 || >=22.12.0} @@ -882,6 +944,13 @@ packages: os: [linux] libc: [musl] + '@rolldown/binding-linux-ppc64-gnu@1.0.0-rc.13': + resolution: {integrity: sha512-8Wtnbw4k7pMYN9B/mOEAsQ8HOiq7AZ31Ig4M9BKn2So4xRaFEhtCSa4ZJaOutOWq50zpgR4N5+L/opnlaCx8wQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [ppc64] + os: [linux] + libc: [glibc] + '@rolldown/binding-linux-ppc64-gnu@1.1.2': resolution: {integrity: sha512-X/7bVLWelEsbyWDUSXt7zVsTniLLPIY2n1rH58qr78l9i7MNbbxBWD8gI2vRfBWf4NUXJCUuQnfZDsp32LqsfQ==} engines: {node: ^20.19.0 || >=22.12.0} @@ -889,6 +958,13 @@ packages: os: [linux] libc: [glibc] + '@rolldown/binding-linux-s390x-gnu@1.0.0-rc.13': + resolution: {integrity: sha512-D/0Nlo8mQuxSMohNJUF2lDXWRsFDsHldfRRgD9bRgktj+EndGPj4DOV37LqDKPYS+osdyhZEH7fTakTAEcW7qg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [s390x] + os: [linux] + libc: [glibc] + '@rolldown/binding-linux-s390x-gnu@1.1.2': resolution: {integrity: sha512-gb6dYKW/1KDorGXyy48glEBJs/sxVSC5pcVrox/pFGV4mvwSFeg2sK5L2tRkVsVlh7kueqOgg4GEcuipJcGuKg==} engines: {node: ^20.19.0 || >=22.12.0} @@ -896,6 +972,13 @@ packages: os: [linux] libc: [glibc] + '@rolldown/binding-linux-x64-gnu@1.0.0-rc.13': + resolution: {integrity: sha512-eRrPvat2YaVQcwwKi/JzOP6MKf1WRnOCr+VaI3cTWz3ZoLcP/654z90lVCJ4dAuMEpPdke0n+qyAqXDZdIC4rA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + libc: [glibc] + '@rolldown/binding-linux-x64-gnu@1.1.2': resolution: {integrity: sha512-JY4w85pU3iAiJVMh5nuk4/Mh9GjMsupe8MrIN53rwxAZW64GKrWeJBuN6SxQg9QTU5uB1cxyhDzW8jqRn1EABw==} engines: {node: ^20.19.0 || >=22.12.0} @@ -903,6 +986,13 @@ packages: os: [linux] libc: [glibc] + '@rolldown/binding-linux-x64-musl@1.0.0-rc.13': + resolution: {integrity: sha512-PsdONiFRp8hR8KgVjTWjZ9s7uA3uueWL0t74/cKHfM4dR5zXYv4AjB8BvA+QDToqxAFg4ZkcVEqeu5F7inoz5w==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + libc: [musl] + '@rolldown/binding-linux-x64-musl@1.1.2': resolution: {integrity: sha512-xvpA7o5KCYLB0Rwscmuylb1/zHHSUx4g4xilm4prC5jP76pEUlzBmMbgpbh7bVDbId4NcfT96gN5i6mE6UDaiw==} engines: {node: ^20.19.0 || >=22.12.0} @@ -910,29 +1000,55 @@ packages: os: [linux] libc: [musl] + '@rolldown/binding-openharmony-arm64@1.0.0-rc.13': + resolution: {integrity: sha512-hCNXgC5dI3TVOLrPT++PKFNZ+1EtS0mLQwfXXXSUD/+rGlB65gZDwN/IDuxLpQP4x8RYYHqGomlUXzpO8aVI2w==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [openharmony] + '@rolldown/binding-openharmony-arm64@1.1.2': resolution: {integrity: sha512-p/ts6KBLjuk49Bp21XH77poQGt02iNz7ChgHep7tudPOaLinR/De/RHdxF8w8Yj4r/bF/bqXwH6PZrB2sA+Nvw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [openharmony] + '@rolldown/binding-wasm32-wasi@1.0.0-rc.13': + resolution: {integrity: sha512-viLS5C5et8NFtLWw9Sw3M/w4vvnVkbWkO7wSNh3C+7G1+uCkGpr6PcjNDSFcNtmXY/4trjPBqUfcOL+P3sWy/g==} + engines: {node: '>=14.0.0'} + cpu: [wasm32] + '@rolldown/binding-wasm32-wasi@1.1.2': resolution: {integrity: sha512-VMu/wmrZ9hJzYlRhbw7jK5PODlugyKZ5mOdX78+lS8OvuFkWNQdz1pFLrI2p3P0pjXOmUZ7B48o5VnMH9QOGtg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [wasm32] + '@rolldown/binding-win32-arm64-msvc@1.0.0-rc.13': + resolution: {integrity: sha512-Fqa3Tlt1xL4wzmAYxGNFV36Hb+VfPc9PYU+E25DAnswXv3ODDu/yyWjQDbXMo5AGWkQVjLgQExuVu8I/UaZhPQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [win32] + '@rolldown/binding-win32-arm64-msvc@1.1.2': resolution: {integrity: sha512-xtUJqs8qEkuSviS0n1tsohaPuz3a1SPhZywOji4Oo+sgrJs8daEDMZ0QtqL0OS7dx8PoVpg2J/ZZycPY5I2+Zg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [win32] + '@rolldown/binding-win32-x64-msvc@1.0.0-rc.13': + resolution: {integrity: sha512-/pLI5kPkGEi44TDlnbio3St/5gUFeN51YWNAk/Gnv6mEQBOahRBh52qVFVBpmrnU01n2yysvBML9Ynu7K4kGAQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [win32] + '@rolldown/binding-win32-x64-msvc@1.1.2': resolution: {integrity: sha512-85YiLQqjUKgSO/Zjnf9e0XIn5Ymrh1fLDWBeAkZqpuBR/3R8TpfoHXuyblqyQrftSSgWO9qpcHN8mkyKsLraoA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [win32] + '@rolldown/pluginutils@1.0.0-rc.13': + resolution: {integrity: sha512-3ngTAv6F/Py35BsYbeeLeecvhMKdsKm4AoOETVhAA+Qc8nrA2I0kF7oa93mE9qnIurngOSpMnQ0x2nQY2FPviA==} + '@rolldown/pluginutils@1.0.1': resolution: {integrity: sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw==} @@ -993,6 +1109,9 @@ packages: '@types/path-browserify@1.0.3': resolution: {integrity: sha512-ZmHivEbNCBtAfcrFeBCiTjdIc2dey0l7oCGNGpSuRTy8jP6UVND7oUowlvDujBy8r2Hoa8bfFUOCiPWfmtkfxw==} + '@types/qrcode@1.5.6': + resolution: {integrity: sha512-te7NQcV2BOvdj2b1hCAHzAoMNuj65kNBMz0KBaxM6c3VGBOhU0dURQKOtH8CFNI/dsKkwlv32p26qYQTWoB5bw==} + '@types/qs@6.15.1': resolution: {integrity: sha512-GZHUBZR9hckSUhrxmp1nG6NwdpM9fCunJwyThLW1X3AyHgd9IlHb6VANpQQqDr2o/qQp6McZ3y/IA2rVzKzSbw==} @@ -1540,6 +1659,10 @@ packages: resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} engines: {node: '>=6'} + camelcase@5.3.1: + resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} + engines: {node: '>=6'} + caniuse-lite@1.0.30001799: resolution: {integrity: sha512-hG1bReV+OUU+MOqK4t/ZWI0tZOyz3rqS9XuhOUz1cIcbwBKjOyJEJuw9ER5JuNyqxNk8u/JUVbGibBOL1yrjFw==} @@ -1581,6 +1704,9 @@ packages: resolution: {integrity: sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==} engines: {node: '>= 10'} + cliui@6.0.0: + resolution: {integrity: sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==} + cliui@8.0.1: resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} engines: {node: '>=12'} @@ -1758,6 +1884,10 @@ packages: supports-color: optional: true + decamelize@1.2.0: + resolution: {integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==} + engines: {node: '>=0.10.0'} + dedent@0.7.0: resolution: {integrity: sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==} @@ -1799,6 +1929,9 @@ packages: diff-match-patch@1.0.5: resolution: {integrity: sha512-IayShXAgj/QMXgB0IWmKx+rOPuGMhqm5w6jvFxmVenXKIzRqTAAsbBPT3kWQeGANj3jGgvcvv4yK6SxqYmikgw==} + dijkstrajs@1.0.3: + resolution: {integrity: sha512-qiSlmBq9+BCdCA/L46dw8Uy93mloxsPSbwnm5yrKn2vMPiy8KyAskTF6zuV/j5BMsmOGZDPs7KjU+mjb670kfA==} + dom-serializer@2.0.0: resolution: {integrity: sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==} @@ -2083,6 +2216,10 @@ packages: find-root@1.1.0: resolution: {integrity: sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==} + find-up@4.1.0: + resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} + engines: {node: '>=8'} + find-up@5.0.0: resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} engines: {node: '>=10'} @@ -2592,6 +2729,10 @@ packages: resolution: {integrity: sha512-++gUqRDEvcnN6Zhqrr+y/CkVEHhlrR96vZn3nZZPYzMcBUyBtTKzB9NadClFIsIVSsu+3i9tfk/erqy9kAmt7Q==} engines: {node: '>=14'} + locate-path@5.0.0: + resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} + engines: {node: '>=8'} + locate-path@6.0.0: resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} engines: {node: '>=10'} @@ -2880,10 +3021,18 @@ packages: peerDependencies: oxc-parser: '>=0.98.0' + p-limit@2.3.0: + resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} + engines: {node: '>=6'} + p-limit@3.1.0: resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} engines: {node: '>=10'} + p-locate@4.1.0: + resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} + engines: {node: '>=8'} + p-locate@5.0.0: resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} engines: {node: '>=10'} @@ -2892,6 +3041,10 @@ packages: resolution: {integrity: sha512-hEt02O4hUct5wtwg4H4KcWgDdm+l1bOaEy/hWzd8xtXB9BqxTWBBhb+2ImAtH4Cv4rPjV76xN3Zumqk3k3AhhQ==} engines: {node: '>=16.17'} + p-try@2.2.0: + resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} + engines: {node: '>=6'} + package-manager-detector@1.6.0: resolution: {integrity: sha512-61A5ThoTiDG/C8s8UMZwSorAGwMJ0ERVGj2OjoW5pAalsNOg15+iQiPzrLJ4jhZ1HJzmC2PIHT2oEiH3R5fzNA==} @@ -2963,6 +3116,10 @@ packages: pkg-types@2.3.1: resolution: {integrity: sha512-y+ichcgc2LrADuhLNAx8DFjVfgz91pRxfZdI3UDhxHvcVEZsenLO+7XaU5vOp0u/7V/wZ+plyuQxtrDlZJ+yeg==} + pngjs@5.0.0: + resolution: {integrity: sha512-40QW5YalBNfQo5yRYmiw7Yz6TKKVr3h6970B2YE+3fQpsWcrbj1PzJgxeJ19DRQjhMbKPIuMY8rFaXc8moolVw==} + engines: {node: '>=10.13.0'} + postcss-html@1.8.1: resolution: {integrity: sha512-OLF6P7qctfAWayOhLpcVnTGqVeJzu2W3WpIYelfz2+JV5oGxfkcEvweN9U4XpeqE0P98dcD9ssusGwlF0TK0uQ==} engines: {node: ^12 || >=14} @@ -3042,6 +3199,11 @@ packages: resolution: {integrity: sha512-+Owyggi9IxT1ePKGafcI87ubSmxol6smwJ+RAHDQlx9+9cPwFWDiKFFCPuWhr9ignlGpZ9vDQLw67N4dcTVFEA==} engines: {node: '>=20'} + qrcode@1.5.4: + resolution: {integrity: sha512-1ca71Zgiu6ORjHqFBDpnSMTR2ReToX4l1Au1VFLyVeBTFavzQnv5JxMFr3ukHVKpSrSA2MCk0lNJSykjUfz7Zg==} + engines: {node: '>=10.13.0'} + hasBin: true + qs@6.15.2: resolution: {integrity: sha512-Rzq0KEyX/w/tEybncDgdkZrJgVUsUMk3xjh3t5bv3S1HTAtg+uOYt72+ZfwiQwKdysThkTBdL/rTi6HDmX9Ddw==} engines: {node: '>=0.6'} @@ -3085,6 +3247,9 @@ packages: resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} engines: {node: '>=0.10.0'} + require-main-filename@2.0.0: + resolution: {integrity: sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==} + resolve-dir@1.0.1: resolution: {integrity: sha512-R7uiTjECzvOsWSfdM0QKFNBVFcK27aHOUwdvK53BcW8zqnGdYp0Fbj82cy54+2A4P2tFM22J5kRfe1R+lM/1yg==} engines: {node: '>=0.10.0'} @@ -3121,6 +3286,11 @@ packages: deprecated: Rimraf versions prior to v4 are no longer supported hasBin: true + rolldown@1.0.0-rc.13: + resolution: {integrity: sha512-bvVj8YJmf0rq4pSFmH7laLa6pYrhghv3PRzrCdRAr23g66zOKVJ4wkvFtgohtPLWmthgg8/rkaqRHrpUEh0Zbw==} + engines: {node: ^20.19.0 || >=22.12.0} + hasBin: true + rolldown@1.1.2: resolution: {integrity: sha512-x0CrQQqCXWGeI8dTvFfN/Dnv3yMKT9hv5jFjlOreKAx9wqLq9wz7VvLLHyaAXC90/CpggTu9SisSbsJJTPSjNQ==} engines: {node: ^20.19.0 || >=22.12.0} @@ -3165,6 +3335,9 @@ packages: engines: {node: '>=10'} hasBin: true + set-blocking@2.0.0: + resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} + setimmediate@1.0.5: resolution: {integrity: sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==} @@ -3620,13 +3793,13 @@ packages: zstd-codec: optional: true - vite@8.1.0: - resolution: {integrity: sha512-BuJcQK/56NQTWDGn4ABea3q4SSBdNPWwNZKTkkUpcMPnLoquSYH8llRtSUIgoL1KSCpHt5eghLShn50mH36y7Q==} + vite@8.0.6: + resolution: {integrity: sha512-jeOXoY6N8rOfit/mZADMd0misLqjRdWBB3/S23ZQNuPcbVsfMBJutWD8b4ftdczMOsNyMBnKro0Z1Kt0HIqq5Q==} engines: {node: ^20.19.0 || >=22.12.0} hasBin: true peerDependencies: '@types/node': ^20.19.0 || >=22.12.0 - '@vitejs/devtools': ^0.3.0 + '@vitejs/devtools': ^0.1.0 esbuild: ^0.27.0 || ^0.28.0 jiti: '>=1.21.0' less: ^4.0.0 @@ -3733,6 +3906,9 @@ packages: webpack-virtual-modules@0.6.2: resolution: {integrity: sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==} + which-module@2.0.1: + resolution: {integrity: sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==} + which@1.3.1: resolution: {integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==} hasBin: true @@ -3794,6 +3970,9 @@ packages: xmlchars@2.2.0: resolution: {integrity: sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==} + y18n@4.0.3: + resolution: {integrity: sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==} + y18n@5.0.8: resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} engines: {node: '>=10'} @@ -3803,10 +3982,18 @@ packages: engines: {node: '>= 14.6'} hasBin: true + yargs-parser@18.1.3: + resolution: {integrity: sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==} + engines: {node: '>=6'} + yargs-parser@21.1.1: resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} engines: {node: '>=12'} + yargs@15.4.1: + resolution: {integrity: sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==} + engines: {node: '>=8'} + yargs@17.7.3: resolution: {integrity: sha512-GZtjxm/J/4TSxuL3FNYjCmLktBTnIw/rVmKSIyKeYAZpmJB2ig9VauCC5xsa82GNKVKDAqpOn3KVzNt0zmrU0g==} engines: {node: '>=12'} @@ -4088,6 +4275,12 @@ snapshots: tslib: 2.8.1 optional: true + '@emnapi/core@1.9.1': + dependencies: + '@emnapi/wasi-threads': 1.2.0 + tslib: 2.8.1 + optional: true + '@emnapi/runtime@1.10.0': dependencies: tslib: 2.8.1 @@ -4098,6 +4291,16 @@ snapshots: tslib: 2.8.1 optional: true + '@emnapi/runtime@1.9.1': + dependencies: + tslib: 2.8.1 + optional: true + + '@emnapi/wasi-threads@1.2.0': + dependencies: + tslib: 2.8.1 + optional: true + '@emnapi/wasi-threads@1.2.1': dependencies: tslib: 2.8.1 @@ -4269,6 +4472,13 @@ snapshots: '@tybys/wasm-util': 0.10.3 optional: true + '@napi-rs/wasm-runtime@1.1.6(@emnapi/core@1.9.1)(@emnapi/runtime@1.9.1)': + dependencies: + '@emnapi/core': 1.9.1 + '@emnapi/runtime': 1.9.1 + '@tybys/wasm-util': 0.10.3 + optional: true + '@noble/hashes@1.8.0': {} '@nodelib/fs.scandir@2.1.5': @@ -4347,9 +4557,12 @@ snapshots: '@oxc-parser/binding-win32-x64-msvc@0.131.0': optional: true + '@oxc-project/types@0.123.0': {} + '@oxc-project/types@0.131.0': {} - '@oxc-project/types@0.137.0': {} + '@oxc-project/types@0.137.0': + optional: true '@paralleldrive/cuid2@2.3.1': dependencies: @@ -4426,42 +4639,85 @@ snapshots: dependencies: quansync: 1.0.0 + '@rolldown/binding-android-arm64@1.0.0-rc.13': + optional: true + '@rolldown/binding-android-arm64@1.1.2': optional: true + '@rolldown/binding-darwin-arm64@1.0.0-rc.13': + optional: true + '@rolldown/binding-darwin-arm64@1.1.2': optional: true + '@rolldown/binding-darwin-x64@1.0.0-rc.13': + optional: true + '@rolldown/binding-darwin-x64@1.1.2': optional: true + '@rolldown/binding-freebsd-x64@1.0.0-rc.13': + optional: true + '@rolldown/binding-freebsd-x64@1.1.2': optional: true + '@rolldown/binding-linux-arm-gnueabihf@1.0.0-rc.13': + optional: true + '@rolldown/binding-linux-arm-gnueabihf@1.1.2': optional: true + '@rolldown/binding-linux-arm64-gnu@1.0.0-rc.13': + optional: true + '@rolldown/binding-linux-arm64-gnu@1.1.2': optional: true + '@rolldown/binding-linux-arm64-musl@1.0.0-rc.13': + optional: true + '@rolldown/binding-linux-arm64-musl@1.1.2': optional: true + '@rolldown/binding-linux-ppc64-gnu@1.0.0-rc.13': + optional: true + '@rolldown/binding-linux-ppc64-gnu@1.1.2': optional: true + '@rolldown/binding-linux-s390x-gnu@1.0.0-rc.13': + optional: true + '@rolldown/binding-linux-s390x-gnu@1.1.2': optional: true + '@rolldown/binding-linux-x64-gnu@1.0.0-rc.13': + optional: true + '@rolldown/binding-linux-x64-gnu@1.1.2': optional: true + '@rolldown/binding-linux-x64-musl@1.0.0-rc.13': + optional: true + '@rolldown/binding-linux-x64-musl@1.1.2': optional: true + '@rolldown/binding-openharmony-arm64@1.0.0-rc.13': + optional: true + '@rolldown/binding-openharmony-arm64@1.1.2': optional: true + '@rolldown/binding-wasm32-wasi@1.0.0-rc.13': + dependencies: + '@emnapi/core': 1.9.1 + '@emnapi/runtime': 1.9.1 + '@napi-rs/wasm-runtime': 1.1.6(@emnapi/core@1.9.1)(@emnapi/runtime@1.9.1) + optional: true + '@rolldown/binding-wasm32-wasi@1.1.2': dependencies: '@emnapi/core': 1.11.1 @@ -4469,12 +4725,20 @@ snapshots: '@napi-rs/wasm-runtime': 1.1.6(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1) optional: true + '@rolldown/binding-win32-arm64-msvc@1.0.0-rc.13': + optional: true + '@rolldown/binding-win32-arm64-msvc@1.1.2': optional: true + '@rolldown/binding-win32-x64-msvc@1.0.0-rc.13': + optional: true + '@rolldown/binding-win32-x64-msvc@1.1.2': optional: true + '@rolldown/pluginutils@1.0.0-rc.13': {} + '@rolldown/pluginutils@1.0.1': {} '@simple-libs/child-process-utils@1.0.2': @@ -4524,6 +4788,10 @@ snapshots: '@types/path-browserify@1.0.3': {} + '@types/qrcode@1.5.6': + dependencies: + '@types/node': 26.0.0 + '@types/qs@6.15.1': {} '@types/retry@0.12.2': {} @@ -4743,7 +5011,7 @@ snapshots: dependencies: '@unocss/core': 66.7.2 - '@unocss/vite@66.7.2(vite@8.1.0(@types/node@26.0.0)(jiti@2.7.0)(sass@1.101.0)(terser@5.48.0)(yaml@2.9.0))': + '@unocss/vite@66.7.2(vite@8.0.6(@types/node@26.0.0)(jiti@2.7.0)(sass@1.101.0)(terser@5.48.0)(yaml@2.9.0))': dependencies: '@jridgewell/remapping': 2.3.5 '@unocss/config': 66.7.2 @@ -4754,7 +5022,7 @@ snapshots: pathe: 2.0.3 tinyglobby: 0.2.17 unplugin-utils: 0.3.1 - vite: 8.1.0(@types/node@26.0.0)(jiti@2.7.0)(sass@1.101.0)(terser@5.48.0)(yaml@2.9.0) + vite: 8.0.6(@types/node@26.0.0)(jiti@2.7.0)(sass@1.101.0)(terser@5.48.0)(yaml@2.9.0) '@uppy/companion-client@5.1.1(@uppy/core@5.2.0)': dependencies: @@ -4787,10 +5055,10 @@ snapshots: '@uppy/core': 5.2.0 '@uppy/utils': 7.2.0 - '@vitejs/plugin-vue@6.0.7(vite@8.1.0(@types/node@26.0.0)(jiti@2.7.0)(sass@1.101.0)(terser@5.48.0)(yaml@2.9.0))(vue@3.5.38(typescript@5.9.3))': + '@vitejs/plugin-vue@6.0.7(vite@8.0.6(@types/node@26.0.0)(jiti@2.7.0)(sass@1.101.0)(terser@5.48.0)(yaml@2.9.0))(vue@3.5.38(typescript@5.9.3))': dependencies: '@rolldown/pluginutils': 1.0.1 - vite: 8.1.0(@types/node@26.0.0)(jiti@2.7.0)(sass@1.101.0)(terser@5.48.0)(yaml@2.9.0) + vite: 8.0.6(@types/node@26.0.0)(jiti@2.7.0)(sass@1.101.0)(terser@5.48.0)(yaml@2.9.0) vue: 3.5.38(typescript@5.9.3) '@volar/language-core@2.4.28': @@ -5258,6 +5526,8 @@ snapshots: callsites@3.1.0: {} + camelcase@5.3.1: {} + caniuse-lite@1.0.30001799: {} chainsaw@0.1.0: @@ -5298,6 +5568,12 @@ snapshots: cli-width@3.0.0: {} + cliui@6.0.0: + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 6.2.0 + cliui@8.0.1: dependencies: string-width: 4.2.3 @@ -5484,6 +5760,8 @@ snapshots: dependencies: ms: 2.1.3 + decamelize@1.2.0: {} + dedent@0.7.0: {} deep-is@0.1.4: {} @@ -5513,6 +5791,8 @@ snapshots: diff-match-patch@1.0.5: {} + dijkstrajs@1.0.3: {} + dom-serializer@2.0.0: dependencies: domelementtype: 2.3.0 @@ -5832,6 +6112,11 @@ snapshots: find-root@1.1.0: {} + find-up@4.1.0: + dependencies: + locate-path: 5.0.0 + path-exists: 4.0.0 + find-up@5.0.0: dependencies: locate-path: 6.0.0 @@ -6306,6 +6591,10 @@ snapshots: pkg-types: 2.3.1 quansync: 0.2.11 + locate-path@5.0.0: + dependencies: + p-locate: 4.1.0 + locate-path@6.0.0: dependencies: p-locate: 5.0.0 @@ -6575,10 +6864,18 @@ snapshots: magic-regexp: 0.10.0 oxc-parser: 0.131.0 + p-limit@2.3.0: + dependencies: + p-try: 2.2.0 + p-limit@3.1.0: dependencies: yocto-queue: 0.1.0 + p-locate@4.1.0: + dependencies: + p-limit: 2.3.0 + p-locate@5.0.0: dependencies: p-limit: 3.1.0 @@ -6589,6 +6886,8 @@ snapshots: is-network-error: 1.3.2 retry: 0.13.1 + p-try@2.2.0: {} + package-manager-detector@1.6.0: {} pako@1.0.11: {} @@ -6647,6 +6946,8 @@ snapshots: exsolve: 1.1.0 pathe: 2.0.3 + pngjs@5.0.0: {} + postcss-html@1.8.1: dependencies: htmlparser2: 8.0.2 @@ -6709,6 +7010,12 @@ snapshots: dependencies: hookified: 2.2.0 + qrcode@1.5.4: + dependencies: + dijkstrajs: 1.0.3 + pngjs: 5.0.0 + yargs: 15.4.1 + qs@6.15.2: dependencies: side-channel: 1.1.1 @@ -6754,6 +7061,8 @@ snapshots: require-from-string@2.0.2: {} + require-main-filename@2.0.0: {} + resolve-dir@1.0.1: dependencies: expand-tilde: 2.0.2 @@ -6783,6 +7092,27 @@ snapshots: dependencies: glob: 7.2.3 + rolldown@1.0.0-rc.13: + dependencies: + '@oxc-project/types': 0.123.0 + '@rolldown/pluginutils': 1.0.0-rc.13 + optionalDependencies: + '@rolldown/binding-android-arm64': 1.0.0-rc.13 + '@rolldown/binding-darwin-arm64': 1.0.0-rc.13 + '@rolldown/binding-darwin-x64': 1.0.0-rc.13 + '@rolldown/binding-freebsd-x64': 1.0.0-rc.13 + '@rolldown/binding-linux-arm-gnueabihf': 1.0.0-rc.13 + '@rolldown/binding-linux-arm64-gnu': 1.0.0-rc.13 + '@rolldown/binding-linux-arm64-musl': 1.0.0-rc.13 + '@rolldown/binding-linux-ppc64-gnu': 1.0.0-rc.13 + '@rolldown/binding-linux-s390x-gnu': 1.0.0-rc.13 + '@rolldown/binding-linux-x64-gnu': 1.0.0-rc.13 + '@rolldown/binding-linux-x64-musl': 1.0.0-rc.13 + '@rolldown/binding-openharmony-arm64': 1.0.0-rc.13 + '@rolldown/binding-wasm32-wasi': 1.0.0-rc.13 + '@rolldown/binding-win32-arm64-msvc': 1.0.0-rc.13 + '@rolldown/binding-win32-x64-msvc': 1.0.0-rc.13 + rolldown@1.1.2: dependencies: '@oxc-project/types': 0.137.0 @@ -6803,6 +7133,7 @@ snapshots: '@rolldown/binding-wasm32-wasi': 1.1.2 '@rolldown/binding-win32-arm64-msvc': 1.1.2 '@rolldown/binding-win32-x64-msvc': 1.1.2 + optional: true run-async@2.4.1: {} @@ -6840,6 +7171,8 @@ snapshots: semver@7.8.5: {} + set-blocking@2.0.0: {} + setimmediate@1.0.5: {} setprototypeof@1.2.0: {} @@ -7218,7 +7551,7 @@ snapshots: universalify@2.0.1: {} - unocss@66.7.2(vite@8.1.0(@types/node@26.0.0)(jiti@2.7.0)(sass@1.101.0)(terser@5.48.0)(yaml@2.9.0)): + unocss@66.7.2(vite@8.0.6(@types/node@26.0.0)(jiti@2.7.0)(sass@1.101.0)(terser@5.48.0)(yaml@2.9.0)): dependencies: '@unocss/cli': 66.7.2 '@unocss/core': 66.7.2 @@ -7236,7 +7569,7 @@ snapshots: '@unocss/transformer-compile-class': 66.7.2 '@unocss/transformer-directives': 66.7.2 '@unocss/transformer-variant-group': 66.7.2 - '@unocss/vite': 66.7.2(vite@8.1.0(@types/node@26.0.0)(jiti@2.7.0)(sass@1.101.0)(terser@5.48.0)(yaml@2.9.0)) + '@unocss/vite': 66.7.2(vite@8.0.6(@types/node@26.0.0)(jiti@2.7.0)(sass@1.101.0)(terser@5.48.0)(yaml@2.9.0)) transitivePeerDependencies: - vite @@ -7258,7 +7591,7 @@ snapshots: pathe: 2.0.3 picomatch: 4.0.4 - unplugin-vue-components@32.1.0(rolldown@1.1.2)(vite@8.1.0(@types/node@26.0.0)(jiti@2.7.0)(sass@1.101.0)(terser@5.48.0)(yaml@2.9.0))(vue@3.5.38(typescript@5.9.3)): + unplugin-vue-components@32.1.0(rolldown@1.1.2)(vite@8.0.6(@types/node@26.0.0)(jiti@2.7.0)(sass@1.101.0)(terser@5.48.0)(yaml@2.9.0))(vue@3.5.38(typescript@5.9.3)): dependencies: chokidar: 5.0.0 local-pkg: 1.2.1 @@ -7267,7 +7600,7 @@ snapshots: obug: 2.1.3 picomatch: 4.0.4 tinyglobby: 0.2.17 - unplugin: 3.2.0(rolldown@1.1.2)(vite@8.1.0(@types/node@26.0.0)(jiti@2.7.0)(sass@1.101.0)(terser@5.48.0)(yaml@2.9.0)) + unplugin: 3.2.0(rolldown@1.1.2)(vite@8.0.6(@types/node@26.0.0)(jiti@2.7.0)(sass@1.101.0)(terser@5.48.0)(yaml@2.9.0)) unplugin-utils: 0.3.1 vue: 3.5.38(typescript@5.9.3) transitivePeerDependencies: @@ -7288,14 +7621,14 @@ snapshots: picomatch: 4.0.4 webpack-virtual-modules: 0.6.2 - unplugin@3.2.0(rolldown@1.1.2)(vite@8.1.0(@types/node@26.0.0)(jiti@2.7.0)(sass@1.101.0)(terser@5.48.0)(yaml@2.9.0)): + unplugin@3.2.0(rolldown@1.1.2)(vite@8.0.6(@types/node@26.0.0)(jiti@2.7.0)(sass@1.101.0)(terser@5.48.0)(yaml@2.9.0)): dependencies: '@jridgewell/remapping': 2.3.5 picomatch: 4.0.4 webpack-virtual-modules: 0.6.2 optionalDependencies: rolldown: 1.1.2 - vite: 8.1.0(@types/node@26.0.0)(jiti@2.7.0)(sass@1.101.0)(terser@5.48.0)(yaml@2.9.0) + vite: 8.0.6(@types/node@26.0.0)(jiti@2.7.0)(sass@1.101.0)(terser@5.48.0)(yaml@2.9.0) unzipper@0.10.14: dependencies: @@ -7326,7 +7659,7 @@ snapshots: vary@1.1.2: {} - vite-plugin-mock-dev-server@2.4.1(rolldown@1.1.2)(vite@8.1.0(@types/node@26.0.0)(jiti@2.7.0)(sass@1.101.0)(terser@5.48.0)(yaml@2.9.0)): + vite-plugin-mock-dev-server@2.4.1(rolldown@1.1.2)(vite@8.0.6(@types/node@26.0.0)(jiti@2.7.0)(sass@1.101.0)(terser@5.48.0)(yaml@2.9.0)): dependencies: '@pengzhanbo/utils': 3.7.3 ansis: 4.3.1 @@ -7343,7 +7676,7 @@ snapshots: path-to-regexp: 8.4.2 picomatch: 4.0.4 tinyglobby: 0.2.17 - vite: 8.1.0(@types/node@26.0.0)(jiti@2.7.0)(sass@1.101.0)(terser@5.48.0)(yaml@2.9.0) + vite: 8.0.6(@types/node@26.0.0)(jiti@2.7.0)(sass@1.101.0)(terser@5.48.0)(yaml@2.9.0) ws: 8.21.0 optionalDependencies: rolldown: 1.1.2 @@ -7351,12 +7684,12 @@ snapshots: - bufferutil - utf-8-validate - vite@8.1.0(@types/node@26.0.0)(jiti@2.7.0)(sass@1.101.0)(terser@5.48.0)(yaml@2.9.0): + vite@8.0.6(@types/node@26.0.0)(jiti@2.7.0)(sass@1.101.0)(terser@5.48.0)(yaml@2.9.0): dependencies: lightningcss: 1.32.0 picomatch: 4.0.4 postcss: 8.5.15 - rolldown: 1.1.2 + rolldown: 1.0.0-rc.13 tinyglobby: 0.2.17 optionalDependencies: '@types/node': 26.0.0 @@ -7394,7 +7727,7 @@ snapshots: '@vue/devtools-api': 6.6.4 vue: 3.5.38(typescript@5.9.3) - vue-router@5.1.0(@vue/compiler-sfc@3.5.38)(pinia@3.0.4(typescript@5.9.3)(vue@3.5.38(typescript@5.9.3)))(rolldown@1.1.2)(vite@8.1.0(@types/node@26.0.0)(jiti@2.7.0)(sass@1.101.0)(terser@5.48.0)(yaml@2.9.0))(vue@3.5.38(typescript@5.9.3)): + vue-router@5.1.0(@vue/compiler-sfc@3.5.38)(pinia@3.0.4(typescript@5.9.3)(vue@3.5.38(typescript@5.9.3)))(rolldown@1.1.2)(vite@8.0.6(@types/node@26.0.0)(jiti@2.7.0)(sass@1.101.0)(terser@5.48.0)(yaml@2.9.0))(vue@3.5.38(typescript@5.9.3)): dependencies: '@babel/generator': 8.0.0 '@vue-macros/common': 3.1.2(vue@3.5.38(typescript@5.9.3)) @@ -7410,14 +7743,14 @@ snapshots: picomatch: 4.0.4 scule: 1.3.0 tinyglobby: 0.2.17 - unplugin: 3.2.0(rolldown@1.1.2)(vite@8.1.0(@types/node@26.0.0)(jiti@2.7.0)(sass@1.101.0)(terser@5.48.0)(yaml@2.9.0)) + unplugin: 3.2.0(rolldown@1.1.2)(vite@8.0.6(@types/node@26.0.0)(jiti@2.7.0)(sass@1.101.0)(terser@5.48.0)(yaml@2.9.0)) unplugin-utils: 0.3.1 vue: 3.5.38(typescript@5.9.3) yaml: 2.9.0 optionalDependencies: '@vue/compiler-sfc': 3.5.38 pinia: 3.0.4(typescript@5.9.3)(vue@3.5.38(typescript@5.9.3)) - vite: 8.1.0(@types/node@26.0.0)(jiti@2.7.0)(sass@1.101.0)(terser@5.48.0)(yaml@2.9.0) + vite: 8.0.6(@types/node@26.0.0)(jiti@2.7.0)(sass@1.101.0)(terser@5.48.0)(yaml@2.9.0) transitivePeerDependencies: - '@farmfe/core' - '@rspack/core' @@ -7456,6 +7789,8 @@ snapshots: webpack-virtual-modules@0.6.2: {} + which-module@2.0.1: {} + which@1.3.1: dependencies: isexe: 2.0.0 @@ -7506,12 +7841,33 @@ snapshots: xmlchars@2.2.0: {} + y18n@4.0.3: {} + y18n@5.0.8: {} yaml@2.9.0: {} + yargs-parser@18.1.3: + dependencies: + camelcase: 5.3.1 + decamelize: 1.2.0 + yargs-parser@21.1.1: {} + yargs@15.4.1: + dependencies: + cliui: 6.0.0 + decamelize: 1.2.0 + find-up: 4.1.0 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + require-main-filename: 2.0.0 + set-blocking: 2.0.0 + string-width: 4.2.3 + which-module: 2.0.1 + y18n: 4.0.3 + yargs-parser: 18.1.3 + yargs@17.7.3: dependencies: cliui: 8.0.1 diff --git a/public/images/qrcode/wechat-official.jpg b/public/images/qrcode/wechat-official.jpg new file mode 100644 index 00000000..576f210a Binary files /dev/null and b/public/images/qrcode/wechat-official.jpg differ diff --git a/public/images/qrcode/wechat-official.png b/public/images/qrcode/wechat-official.png deleted file mode 100644 index 54f1e17f..00000000 Binary files a/public/images/qrcode/wechat-official.png and /dev/null differ diff --git a/src/api/auth/index.ts b/src/api/auth/index.ts index 08c097e7..eb4b0574 100644 --- a/src/api/auth/index.ts +++ b/src/api/auth/index.ts @@ -1,6 +1,28 @@ import request from "@/utils/request"; import type { CaptchaInfo, LoginRequest, LoginResult } from "./types"; +/** 申请扫码票据的响应:票据字符串与有效期(秒) */ +export interface QrCodeGenerateResult { + /** 一次扫码登录会话的唯一票据,由 PC 端编码进二维码 */ + ticket: string; + /** 票据有效期(秒),默认 300,过期后 Redis 自动清理 */ + expireSeconds: number; +} + +/** 轮询扫码状态的响应 */ +export interface QrCodeStatusResult { + /** 当前票据 */ + ticket: string; + /** 状态:WAITING/SCANNED/CONFIRMED/LOGGED_IN/CANCELED/EXPIRED */ + status: "WAITING" | "SCANNED" | "CONFIRMED" | "LOGGED_IN" | "CANCELED" | "EXPIRED"; + /** 脱敏昵称,仅 SCANNED 之后返回,WAITING 为 undefined */ + nickname?: string; + /** 头像 URL,仅 SCANNED 之后返回 */ + avatar?: string; + /** 票据剩余有效期(秒) */ + expireSeconds: number; +} + const AUTH_BASE_URL = "/api/v1/auth"; const AuthAPI = { @@ -59,6 +81,31 @@ const AuthAPI = { method: "get", }); }, + + // ============ 扫码登录 ============ + + qrGenerate(): Promise { + return request({ + url: `${AUTH_BASE_URL}/qr-code/generate`, + method: "post", + }); + }, + + qrStatus(ticket: string): Promise { + return request({ + url: `${AUTH_BASE_URL}/qr-code/status`, + method: "get", + params: { ticket }, + }); + }, + + qrLogin(ticket: string): Promise { + return request({ + url: `${AUTH_BASE_URL}/qr-code/login`, + method: "post", + data: { ticket }, + }); + }, }; export default AuthAPI; diff --git a/src/stores/user.ts b/src/stores/user.ts index d01aab50..6629a595 100644 --- a/src/stores/user.ts +++ b/src/stores/user.ts @@ -26,6 +26,14 @@ export const useUserStore = defineStore("user", () => { AuthStorage.setTokens(accessToken, refreshToken, rememberMe.value); } + /** + * 扫码登录:用票据换取会话令牌 + */ + async function loginByQrCode(ticket: string): Promise { + const { accessToken, refreshToken } = await AuthAPI.qrLogin(ticket); + AuthStorage.setTokens(accessToken, refreshToken, false); + } + let refreshPromise: Promise | null = null; /** @@ -111,6 +119,7 @@ export const useUserStore = defineStore("user", () => { rememberMe, isLoggedIn: () => !!AuthStorage.getAccessToken(), login, + loginByQrCode, logout, getUserInfo, resetAllState, diff --git a/src/views/login/components/QrCodeLogin.vue b/src/views/login/components/QrCodeLogin.vue new file mode 100644 index 00000000..4250a176 --- /dev/null +++ b/src/views/login/components/QrCodeLogin.vue @@ -0,0 +1,236 @@ + + + + + diff --git a/src/views/login/index.vue b/src/views/login/index.vue index 9853862b..95055a3e 100644 --- a/src/views/login/index.vue +++ b/src/views/login/index.vue @@ -52,7 +52,14 @@