chore: import WonderQ project
21
.gitignore
vendored
Normal file
@@ -0,0 +1,21 @@
|
||||
node_modules/
|
||||
dist/
|
||||
apps/*/dist/
|
||||
.env
|
||||
.env.local
|
||||
**/.venv/
|
||||
**/.pytest_cache/
|
||||
**/__pycache__/
|
||||
*.pyc
|
||||
*.sqlite
|
||||
*.db
|
||||
*.pem
|
||||
*.key
|
||||
.DS_Store
|
||||
*.log
|
||||
coverage/
|
||||
.prisma/
|
||||
artifacts/
|
||||
task_plan.md
|
||||
progress.md
|
||||
findings.md
|
||||
376
AGENTS.md
Normal file
@@ -0,0 +1,376 @@
|
||||
# AGENTS.md
|
||||
|
||||
本文档用于约束 AI 代理参与 WonderQ 项目开发时的行为、边界和验证方式。适用于 Codex、ChatGPT、Cursor、Claude Code 等 AI 工具。
|
||||
|
||||
项目层规则优先于通用规则;进入某个子项目工作时,优先遵守该子项目技术栈、接口契约和锁定边界。
|
||||
|
||||
## 1. 全局协作规则
|
||||
|
||||
- 默认全程使用中文回答;用户明确要求其他语言时才切换。
|
||||
- 回答简洁直接,不做无效铺垫,不输出与任务无关的说明。
|
||||
- 需求不清晰、影响范围不明或涉及高风险文件时,先提问确认,不自行猜测执行。
|
||||
- 默认只读优先。创建、修改、删除文件必须先获得用户明确授权。
|
||||
- 严格按当前需求工作,不额外加功能、不扩大改动范围。
|
||||
- 修改前先阅读目标文件、相邻实现、相关类型和契约文档;修改后检查变更内容,并按影响范围运行验证。
|
||||
- 保留工作区里的用户改动,不使用 `git reset`、`git checkout --`、批量删除或覆盖无关文件。
|
||||
- 不读取、展示、复述或提交 `.env`、`.env.local`、生产环境变量、Token、密码、密钥、真实客服链接、企业 ID、客户手机号等敏感信息。
|
||||
- 文档、示例和测试只能使用占位值,不写入真实账号、密钥、联系方式或生产配置。
|
||||
- 用户提到产品设计时,优先考虑 `product design`。
|
||||
- 用户提出“调整视觉 UI”“视觉不好看”“美化界面”“优化视觉”“界面更好看”等需求时,优先考虑 `ui-ux-pro-max`,并结合项目现有设计系统落地。
|
||||
|
||||
## 2. 项目定位
|
||||
|
||||
WonderQ 是三端分离的旅行产品项目集合,当前由三个独立子项目组成:
|
||||
|
||||
- `WonderQ-MiniAPP`:万趣旅行移动端前台,面向 H5 与微信小程序,技术栈为 uni-app、Vue 3、TypeScript、TailwindCSS。
|
||||
- `WonderQ-Admin-UI`:后台管理前端,用于维护首页结构、目的地、线路商品、活动入口、页面模块和客户需求线索,技术栈为 Vite、React、TypeScript、Tailwind CSS 4、shadcn/ui 风格组件。
|
||||
- `WonderQ-Admin`:后端 API 服务,为 MiniAPP 提供 Public API,为后台管理端提供 Admin API,技术栈为 Python、FastAPI、SQLAlchemy 2、Alembic、PostgreSQL、JWT、Pydantic。
|
||||
|
||||
核心开发原则是页面驱动开发:业务围绕 MiniAPP/H5 前台页面和运营配置场景展开;后台负责配置页面数据;后端负责业务逻辑、鉴权、数据持久化和接口;MiniAPP 负责展示与交互。
|
||||
|
||||
## 3. 根目录结构
|
||||
|
||||
```text
|
||||
WonderQ-Project/
|
||||
├─ AGENTS.md
|
||||
├─ README.md
|
||||
├─ docs/
|
||||
│ ├─ README.md
|
||||
│ ├─ integration-workflow.md
|
||||
│ ├─ development-status.md
|
||||
│ ├─ decisions.md
|
||||
│ ├─ backend-api-service.md
|
||||
│ ├─ backend-plan.md
|
||||
│ ├─ admin-api-requirements.md
|
||||
│ ├─ module-config-api.md
|
||||
│ └─ public-api.md
|
||||
├─ WonderQ-MiniAPP/
|
||||
├─ WonderQ-Admin-UI/
|
||||
└─ WonderQ-Admin/
|
||||
```
|
||||
|
||||
## 4. 文档入口与权威来源
|
||||
|
||||
- `docs/README.md` 是当前文档索引。
|
||||
- `docs/integration-workflow.md` 定义三端本地启动、联调顺序、接口变更流程和验证命令。
|
||||
- `docs/development-status.md` 记录三端能力对接状态,不替代实际测试结果。
|
||||
- `docs/decisions.md` 记录当前有效技术和文档决策。
|
||||
- `docs/public-api.md` 是 MiniAPP 对接后端的唯一 Public API 契约。
|
||||
- `docs/admin-api-requirements.md` 是 Admin UI 对接后端的主契约。
|
||||
- `docs/module-config-api.md` 是页面模块配置 CRUD 的唯一细节契约。
|
||||
- `docs/backend-api-service.md`、`docs/backend-plan.md` 约束后端运行、联调、部署和规划边界。
|
||||
|
||||
接口、字段、状态码或模块规则发生变化时,先更新对应契约文档,再改后端和前端实现。
|
||||
|
||||
## 5. 页面驱动开发流程
|
||||
|
||||
本项目采用页面驱动开发(Page Driven Development):先从 MiniAPP/H5 前台页面和运营配置场景定义需求,再推进数据模型、后端 API、后台管理和前台实现。
|
||||
|
||||
新增或重构面向用户的页面、模块或运营能力时,按以下顺序推进:
|
||||
|
||||
1. 明确前台页面目标:用户角色、页面流程、展示模块、交互方式、空态、错误态和边界情况。
|
||||
2. 明确数据归属:哪些字段来自 Public API,哪些字段由 Admin API 维护,哪些仅为本地兜底内容。
|
||||
3. 更新契约文档:Public API 改 `public-api.md`,Admin API 改 `admin-api-requirements.md`,页面模块 CRUD 改 `module-config-api.md`。
|
||||
4. 设计后端数据与接口:数据库模型、迁移、Pydantic schema、鉴权、审计、参数校验和错误响应。
|
||||
5. 实现后端 API:保持现有路径和响应结构兼容,不随意破坏 MiniAPP 与 Admin UI 调用。
|
||||
6. 实现后台管理:围绕运营配置页面组织菜单和表单,不按数据库表名机械拆菜单。
|
||||
7. 实现 MiniAPP 展示:调用 Public API,处理 loading、empty、error、retry、分页/刷新和本地兜底。
|
||||
8. 运行三端验证:按变更范围执行后端测试、前端构建、MiniAPP 构建和必要的浏览器/小程序验证。
|
||||
|
||||
小型修复、纯文档整理、单端 UI 调整不强制输出完整八步,但不能跳过与当前任务相关的契约、安全和验证检查。
|
||||
|
||||
## 6. 三端模块分工
|
||||
|
||||
### WonderQ-MiniAPP
|
||||
|
||||
```text
|
||||
WonderQ-MiniAPP/
|
||||
├─ index.html
|
||||
├─ package.json
|
||||
├─ tsconfig.json
|
||||
├─ tailwind.config.ts
|
||||
├─ vitest.config.ts
|
||||
├─ vite.config.ts
|
||||
├─ src/
|
||||
│ ├─ main.ts
|
||||
│ ├─ App.vue
|
||||
│ ├─ app.css
|
||||
│ ├─ manifest.json
|
||||
│ ├─ pages.json
|
||||
│ ├─ content.ts
|
||||
│ ├─ generated-products.json
|
||||
│ ├─ components/
|
||||
│ ├─ lib/
|
||||
│ └─ pages/
|
||||
├─ tests/
|
||||
├─ public/assets/
|
||||
└─ scripts/
|
||||
```
|
||||
|
||||
- `src/pages/`:首页、目的地、搜索、活动、需求、权益、预订、详情和我的页面。
|
||||
- `src/components/`:复用 Vue SFC 组件,如顶部栏、底部导航、产品卡、客服弹层、空状态和留资表单。
|
||||
- `src/lib/api.ts`:Public API 客户端与类型定义,访问 `/api/public/site-config`、`/api/public/products`、`/api/public/leads`。
|
||||
- `src/lib/data.ts`、`src/lib/store.ts`、`src/lib/navigation.ts`、`src/lib/support.ts`:业务数据归一化、共享状态、页面跳转和客服联系封装。
|
||||
- `src/content.ts`、`src/generated-products.json`:前台静态兜底内容与产品数据。
|
||||
- `public/assets/`:前台图片资源。
|
||||
|
||||
### WonderQ-Admin-UI
|
||||
|
||||
```text
|
||||
WonderQ-Admin-UI/
|
||||
├─ README.md
|
||||
├─ components.json
|
||||
├─ public/assets/
|
||||
├─ src/
|
||||
│ ├─ App.tsx
|
||||
│ ├─ api.ts
|
||||
│ ├─ components/ui/
|
||||
│ ├─ lib/
|
||||
│ ├─ pages/
|
||||
│ ├─ main.tsx
|
||||
│ ├─ styles.css
|
||||
│ └─ vite-env.d.ts
|
||||
├─ index.html
|
||||
├─ package.json
|
||||
├─ tsconfig.json
|
||||
├─ vite.config.ts
|
||||
└─ yarn.lock
|
||||
```
|
||||
|
||||
- `src/App.tsx`:后台应用壳、登录态、侧边导航和全局布局。
|
||||
- `src/api.ts`:Admin API 类型、Token 管理、鉴权头和请求封装。
|
||||
- `src/pages/structure/StructurePage.tsx`:首页、目的地页、需求页等页面模块配置主界面。
|
||||
- `src/pages/products/ProductsPage.tsx`:线路商品维护。
|
||||
- `src/pages/leads/LeadsPage.tsx`:需求线索查询、筛选和状态流转。
|
||||
- `src/components/ui/`:Button、Card、Input、Textarea、Badge、Alert、Switch、NativeSelect、Separator 等基础组件。
|
||||
- `src/styles.css`:Tailwind 入口、设计变量、后台工作台、表格/表单和移动端适配。
|
||||
|
||||
### WonderQ-Admin
|
||||
|
||||
```text
|
||||
WonderQ-Admin/
|
||||
├─ app/
|
||||
│ ├─ main.py
|
||||
│ ├─ config.py
|
||||
│ ├─ database.py
|
||||
│ ├─ models.py
|
||||
│ ├─ schemas.py
|
||||
│ ├─ auth.py
|
||||
│ ├─ serializers.py
|
||||
│ ├─ content.py
|
||||
│ ├─ seed.py
|
||||
│ └─ routers/
|
||||
│ ├─ public.py
|
||||
│ ├─ admin.py
|
||||
│ └─ shared.py
|
||||
├─ alembic/
|
||||
├─ data/generated-products.json
|
||||
├─ tests/
|
||||
├─ Dockerfile
|
||||
├─ docker-compose.yml
|
||||
├─ requirements.txt
|
||||
├─ pyproject.toml
|
||||
├─ .env.example
|
||||
└─ README.md
|
||||
```
|
||||
|
||||
- `app/main.py`:FastAPI 应用入口、CORS、错误处理和路由注册。
|
||||
- `app/config.py`、`app/database.py`:环境变量配置与 SQLAlchemy engine/session/Base。
|
||||
- `app/models.py`、`app/schemas.py`、`app/serializers.py`:ORM 模型、Pydantic 校验和响应序列化。
|
||||
- `app/auth.py`:JWT 与后台鉴权。
|
||||
- `app/routers/public.py`、`app/routers/admin.py`、`app/routers/shared.py`:Public API、Admin API 和共享查询。
|
||||
- `app/content.py`、`app/seed.py`、`data/generated-products.json`:初始化内容、重置命令和迁移数据源。
|
||||
- `alembic/`、`Dockerfile`、`docker-compose.yml`:数据库迁移与部署入口。
|
||||
|
||||
## 7. 启动方式
|
||||
|
||||
### 后端 `WonderQ-Admin`
|
||||
|
||||
从 `WonderQ-Project` 根目录启动:
|
||||
|
||||
```powershell
|
||||
Set-Location .\WonderQ-Admin
|
||||
.\.venv\Scripts\Activate.ps1
|
||||
docker-compose up -d postgres redis
|
||||
python -m alembic upgrade head
|
||||
python -m uvicorn app.main:app --host 0.0.0.0 --port 4000 --reload
|
||||
```
|
||||
|
||||
首次缺少虚拟环境或依赖时,再执行:
|
||||
|
||||
```powershell
|
||||
python -m venv .venv
|
||||
.\.venv\Scripts\Activate.ps1
|
||||
python -m pip install -r requirements.txt
|
||||
```
|
||||
|
||||
健康检查:http://localhost:4000/health。
|
||||
|
||||
### 管理前端 `WonderQ-Admin-UI`
|
||||
|
||||
```powershell
|
||||
Set-Location .\WonderQ-Admin-UI
|
||||
yarn install
|
||||
yarn dev
|
||||
```
|
||||
|
||||
默认访问:http://localhost:5602。后端 Admin API 默认运行在 http://localhost:4000。
|
||||
|
||||
### 前台 `WonderQ-MiniAPP`
|
||||
|
||||
```powershell
|
||||
Set-Location .\WonderQ-MiniAPP
|
||||
yarn install
|
||||
yarn dev
|
||||
```
|
||||
|
||||
H5 默认访问:http://localhost:5173。微信小程序开发构建:
|
||||
|
||||
```powershell
|
||||
yarn dev:mp-weixin
|
||||
```
|
||||
|
||||
## 8. 测试与验证
|
||||
|
||||
- `WonderQ-Admin`:修改 Python 代码后运行 `python -m pytest`;涉及迁移时运行 `python -m alembic upgrade head`;空库或 seed 相关变更才考虑 `python -m app.seed`,且执行前必须确认风险。
|
||||
- `WonderQ-Admin-UI`:当前未配置独立测试脚本,提交前至少运行 `yarn build`;涉及 UI、交互或接口行为时,本地启动页面并手动验证关键流程。
|
||||
- `WonderQ-MiniAPP`:前台变更后至少运行 `yarn build:h5`、`yarn build:mp-weixin`、`yarn test`;UI 变更还应浏览器验证移动端和桌面宽度,涉及小程序兼容时用微信开发者工具验证 `dist/build/mp-weixin`。
|
||||
- 纯文档变更可不跑构建,但必须检查文档链接、命令、路径和敏感信息。
|
||||
|
||||
## 9. 部署规范
|
||||
|
||||
- `WonderQ-MiniAPP`:H5 生产构建使用 `yarn build:h5`,产物在 `dist/build/h5`;微信小程序构建使用 `yarn build:mp-weixin`,产物在 `dist/build/mp-weixin`。
|
||||
- `WonderQ-Admin-UI`:生产发布使用 `yarn build` 生成 `dist/`,可交给 Nginx、CDN 或静态托管服务部署。
|
||||
- `WonderQ-Admin`:使用 Dockerfile 与 `docker-compose.yml` 部署 API、PostgreSQL 和 Redis。
|
||||
- 生产 API 地址、客服链接、企业 ID、JWT secret、OSS 密钥、数据库连接只允许通过部署环境变量注入,不硬编码到源码、测试或文档。
|
||||
- 不提交 `dist/`、`node_modules/`、`.venv/`、`.env`、`.env.local`、日志、coverage、数据库备份或临时规划文件。
|
||||
|
||||
## 10. 接口与数据规范
|
||||
|
||||
- Public API 与 Admin API 分离:MiniAPP 只访问 `/api/public/...`,Admin UI 只访问 `/api/admin/...`。
|
||||
- 保持现有 API 路径和响应结构兼容;不要为了统一风格擅自改路径、改字段名或改响应包裹结构。
|
||||
- 接口设计优先 RESTful 风格,如 `GET /api/admin/products`、`POST /api/admin/products`、`PATCH /api/admin/products/{id}`。
|
||||
- 禁止新增 `/getBanner`、`/saveProduct`、`/updateConfig` 这类动作式路径,除非已有契约明确要求。
|
||||
- TypeScript 与 API 响应字段保持 camelCase;后端内部可使用 snake_case,但序列化给前端时遵守契约。
|
||||
- 外部输入必须通过 Pydantic schema 或前端表单校验;后端不能信任前端传参。
|
||||
- 错误响应不得泄露内部异常、SQL、环境变量、Token、密钥或敏感业务数据。
|
||||
- 页面模块字段、排序、删除冲突、媒体上传等细节以 `module-config-api.md` 为准。
|
||||
|
||||
## 11. 数据库与后端实现原则
|
||||
|
||||
- Alembic 管理数据库迁移;涉及模型变更时同步迁移、测试和契约文档。
|
||||
- 新业务表按实际需要考虑 `id`、`created_at`、`updated_at`、`deleted_at`、`status`、`sort` 等字段,不机械添加无意义字段。
|
||||
- 时间字段后端统一使用明确时区语义;对外返回 ISO 8601 字符串。
|
||||
- 查询应合理建立索引,避免 N+1 查询和无界列表。
|
||||
- Admin 变更类接口应继续写入审计日志,尤其是发布、重置、删除、状态流转和页面配置变更。
|
||||
- 复杂新业务优先按 Router、Service、Repository 分层拆分;现有简单接口可沿用当前结构,但不要把大量业务逻辑继续堆进单个路由函数。
|
||||
|
||||
## 12. 前端实现原则
|
||||
|
||||
- TypeScript 项目使用 strict 模式,新增代码应有明确类型,避免 `any`。
|
||||
- `WonderQ-MiniAPP` 使用 Vue 3 SFC、`<script setup lang="ts">` 和 uni-app 组件,不引入 React。
|
||||
- `WonderQ-Admin-UI` 使用 React 函数组件和 Hooks,不引入 class component。
|
||||
- 样式优先使用项目已集成的 TailwindCSS;管理端同时遵守 `src/styles.css` 的设计变量和已有类名体系。
|
||||
- `WonderQ-MiniAPP` 移动端采用简约、内容优先的视觉风格:以白色和低饱和中性色为基础,使用绿色作为主操作色,避免大面积渐变、金色渐变按钮、装饰性光晕和重阴影。
|
||||
- MiniAPP 卡片、输入框和操作按钮优先使用 8-12px 圆角、细边框和轻阴影;图片负责表达目的地与线路,不额外叠加装饰性图形。
|
||||
- MiniAPP 顶部栏和底部导航保持扁平、稳定的固定布局,选中态通过颜色、细线或浅色底区分,不使用会改变布局的浮动徽章或缩放动画。
|
||||
- 通用控件优先复用 `src/components/ui/`;图标优先使用 `lucide-react`。
|
||||
- 功能不要集中堆在一个文件中。能拆分组件就拆分组件,能封装工具函数就封装工具函数,保持人工可维护性和复用性。
|
||||
- UI 必须处理 loading、empty、error、retry、禁用态、提交中状态和移动端布局。
|
||||
- MiniAPP 页面数据优先来自 Public API;接口失败或字段缺失时按现有本地兜底机制处理,不新增硬编码业务数据源。
|
||||
|
||||
## 13. 命名与代码风格
|
||||
|
||||
- 组件、类型使用 PascalCase。
|
||||
- 函数、变量使用 camelCase。
|
||||
- CSS class 沿用 kebab-case 或 Tailwind 原子类。
|
||||
- Python 代码遵守现有 FastAPI、SQLAlchemy、Pydantic 风格。
|
||||
- 中文文案文件按 UTF-8 处理;Windows PowerShell 中检查中文文件时使用 `Get-Content -Encoding UTF8`。
|
||||
- 注释只写必要解释,避免“赋值给变量”这类无意义注释。
|
||||
|
||||
## 14. 高风险区域与锁定文件
|
||||
|
||||
### 全局高风险区域
|
||||
|
||||
未经用户明确授权,不得改动:
|
||||
|
||||
- `.env`、`.env.local`、生产环境变量、密钥配置、账号密码和真实隐私配置。
|
||||
- 数据库配置、鉴权逻辑、部署入口、依赖锁文件。
|
||||
- 已被页面引用的图片资源、采集源文件、生成数据和大批量素材文件。
|
||||
- 任何会重置、迁移、删除、覆盖生产或开发数据的命令。
|
||||
|
||||
删除、批量移动、重命名资源文件前必须再次确认。
|
||||
|
||||
### `WonderQ-MiniAPP`
|
||||
|
||||
- 不要在本子项目重新添加后端、数据库、ORM、Docker Compose、后台认证或管理后台页面。
|
||||
- `src/lib/api.ts` 的公共 API 路径保持 `/api/public/site-config`、`/api/public/products`、`/api/public/leads`,除非后端契约已同步变更。
|
||||
- `vite.config.ts`、`manifest.json` 的 `/api` 代理只服务本地开发,不作为生产后端配置。
|
||||
- 不要随意改动 `src/generated-products.json`、`public/assets/source/` 中的采集/生成内容,除非任务专门针对这些资源。
|
||||
|
||||
### `WonderQ-Admin-UI`
|
||||
|
||||
未经用户明确授权,不得改动:
|
||||
|
||||
- `.env`、`.env.local`、任何生产环境变量或密钥配置。
|
||||
- `vite.config.ts` 中的代理、端口和构建配置。
|
||||
- `tsconfig.json` 的严格类型配置。
|
||||
- `package.json`、`yarn.lock` 的依赖与脚本。
|
||||
- `src/api.ts` 的接口路径、Token 存储键、鉴权头和类型契约。
|
||||
- `public/assets/` 下已被页面引用的图片资源和 `manifest.json`。
|
||||
- `docs/admin-api-requirements.md` 与 `docs/module-config-api.md` 中的接口契约,除非任务就是同步契约变更。
|
||||
|
||||
### `WonderQ-Admin`
|
||||
|
||||
未经用户明确授权,不得改动:
|
||||
|
||||
- `.env`、`.env.local`、生产环境变量和任何密钥配置。
|
||||
- `app/models.py`、`alembic/versions/*`:数据库结构和迁移。
|
||||
- `app/auth.py`:后台鉴权逻辑。
|
||||
- `app/routers/admin.py`、`app/routers/public.py`:核心 API 行为。
|
||||
- `app/seed.py`、`app/content.py`、`data/generated-products.json`:初始化内容和迁移数据源。
|
||||
- `Dockerfile`、`docker-compose.yml`:部署入口。
|
||||
- `requirements.txt`、`pyproject.toml`:依赖和测试配置。
|
||||
|
||||
如确需修改上述文件,先说明原因、影响范围、验证方式,并等待用户确认。
|
||||
|
||||
## 15. AI 输出要求
|
||||
|
||||
### 开发类需求
|
||||
|
||||
根据任务范围输出必要内容:
|
||||
|
||||
- 功能目标和影响范围。
|
||||
- 涉及页面、用户角色、数据流和边界情况。
|
||||
- 是否需要数据库、后端 API、Admin UI、MiniAPP 同步变更。
|
||||
- 需要更新的契约文档。
|
||||
- 开发顺序、验证命令和风险点。
|
||||
|
||||
不要对纯文档、纯样式、小修复机械输出数据库设计、后台 CRUD 或无关扩展建议。
|
||||
|
||||
### 评审类需求
|
||||
|
||||
优先输出问题,按严重程度排序,并给出文件和行号。重点关注:
|
||||
|
||||
- 行为回归、接口不兼容、权限绕过、数据丢失。
|
||||
- 缺少参数校验、错误处理、空态处理或测试。
|
||||
- 敏感信息泄露、生产环境风险、破坏锁定边界。
|
||||
|
||||
### 实施类需求
|
||||
|
||||
- 先读相关文件和契约,再动手。
|
||||
- 修改范围最小化,不做无关重构。
|
||||
- 编辑后检查变更内容。
|
||||
- 按影响范围运行验证;无法运行时说明原因和剩余风险。
|
||||
|
||||
## 16. 自检清单
|
||||
|
||||
提交或答复前检查:
|
||||
|
||||
- 是否误读或输出敏感信息。
|
||||
- 是否改动了未授权文件或锁定文件。
|
||||
- 是否保持 Public API、Admin API、页面模块契约一致。
|
||||
- 是否遗漏鉴权、参数校验、错误响应、审计或删除冲突处理。
|
||||
- 是否处理 loading、empty、error、retry 和移动端适配。
|
||||
- 是否新增硬编码生产地址、客服链接、密钥或真实手机号。
|
||||
- 是否运行了与变更范围匹配的验证,或明确说明未运行原因。
|
||||
1
WonderQ-Admin-UI/.env.example
Normal file
@@ -0,0 +1 @@
|
||||
VITE_API_BASE_URL="http://localhost:4000"
|
||||
7
WonderQ-Admin-UI/.gitignore
vendored
Normal file
@@ -0,0 +1,7 @@
|
||||
node_modules/
|
||||
dist/
|
||||
.env
|
||||
.env.local
|
||||
*.log
|
||||
coverage/
|
||||
.vite/
|
||||
40
WonderQ-Admin-UI/README.md
Normal file
@@ -0,0 +1,40 @@
|
||||
# WonderQ-Admin-UI
|
||||
|
||||
独立的 WonderQ 后台管理前端,基于 Vite、React、TypeScript、Tailwind CSS 4 和 shadcn/ui 风格组件。
|
||||
|
||||
## 本地启动
|
||||
|
||||
1. 安装依赖:
|
||||
|
||||
```bash
|
||||
yarn install
|
||||
```
|
||||
|
||||
本项目使用 Yarn 1 锁文件。Windows 环境下,Vite 8、Tailwind CSS 4、lightningcss 依赖 native binding,`package.json` 中已固定对应的 Windows 构建包,避免 Yarn 1 漏装 optional dependency 导致构建失败。
|
||||
|
||||
2. 确认后端 API 运行在 `http://localhost:4000`。
|
||||
|
||||
3. 启动后台 UI:
|
||||
|
||||
```bash
|
||||
yarn dev
|
||||
```
|
||||
|
||||
访问:http://localhost:5602
|
||||
|
||||
局域网访问可使用本机 IP,例如 `http://192.168.1.23:5602/`。该地址由 Vite dev server 提供,支持样式和组件热更新。
|
||||
|
||||
默认后台账号由 `WonderQ-Admin` 提供:`admin@example.com / ChangeMe123!`。
|
||||
|
||||
## 目录说明
|
||||
|
||||
- `src/App.tsx`:后台管理主界面和业务交互。
|
||||
- `src/api.ts`:Admin API 类型、Token 管理和请求封装。
|
||||
- `src/components/ui/`:本地 shadcn/ui 风格基础组件,包括 Button、Card、Input、Textarea、Badge、Alert、Switch 等。
|
||||
- `src/lib/utils.ts`:组件 className 合并工具。
|
||||
- `src/styles.css`:Tailwind 入口、设计变量、后台布局和响应式样式。
|
||||
- `public/assets/`:后台预览所需静态资源,保留 `/assets/...` 引用方式。
|
||||
- `components.json`:shadcn/ui 组件配置。
|
||||
- `vite.config.ts`:开发环境将 `/api` 代理到 `http://localhost:4000`,dev server 固定运行在 `5602` 并支持 HMR;生产构建预览运行在 `5603`。
|
||||
|
||||
本仓库已经独立,不再依赖 `WonderQ-MiniAPP` 的相对路径。
|
||||
21
WonderQ-Admin-UI/components.json
Normal file
@@ -0,0 +1,21 @@
|
||||
{
|
||||
"$schema": "https://ui.shadcn.com/schema.json",
|
||||
"style": "new-york",
|
||||
"rsc": false,
|
||||
"tsx": true,
|
||||
"tailwind": {
|
||||
"config": "",
|
||||
"css": "src/styles.css",
|
||||
"baseColor": "neutral",
|
||||
"cssVariables": true,
|
||||
"prefix": ""
|
||||
},
|
||||
"aliases": {
|
||||
"components": "@/components",
|
||||
"utils": "@/lib/utils",
|
||||
"ui": "@/components/ui",
|
||||
"lib": "@/lib",
|
||||
"hooks": "@/hooks"
|
||||
},
|
||||
"iconLibrary": "lucide"
|
||||
}
|
||||
12
WonderQ-Admin-UI/index.html
Normal file
@@ -0,0 +1,12 @@
|
||||
<!doctype html>
|
||||
<html lang="zh-CN">
|
||||
<head>
|
||||
<meta charset="UTF-8" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||
<title>万趣小程序管理端</title>
|
||||
</head>
|
||||
<body>
|
||||
<div id="root"></div>
|
||||
<script type="module" src="/src/main.tsx"></script>
|
||||
</body>
|
||||
</html>
|
||||
35
WonderQ-Admin-UI/package.json
Normal file
@@ -0,0 +1,35 @@
|
||||
{
|
||||
"name": "wonderq-admin-ui",
|
||||
"version": "0.1.0",
|
||||
"private": true,
|
||||
"type": "module",
|
||||
"scripts": {
|
||||
"dev": "vite",
|
||||
"build": "tsc --noEmit && vite build",
|
||||
"preview": "vite preview"
|
||||
},
|
||||
"dependencies": {
|
||||
"@radix-ui/react-select": "^2.3.2",
|
||||
"@radix-ui/react-slot": "^1.3.0",
|
||||
"@radix-ui/react-switch": "^1.3.2",
|
||||
"@rolldown/binding-win32-x64-msvc": "1.1.3",
|
||||
"@tailwindcss/oxide-win32-x64-msvc": "4.3.2",
|
||||
"@tailwindcss/vite": "^4.3.2",
|
||||
"@vitejs/plugin-react": "^6.0.3",
|
||||
"class-variance-authority": "^0.7.1",
|
||||
"clsx": "^2.1.1",
|
||||
"lightningcss-win32-x64-msvc": "1.32.0",
|
||||
"lucide-react": "^1.21.0",
|
||||
"react": "^19.2.7",
|
||||
"react-dom": "^19.2.7",
|
||||
"tailwind-merge": "^3.6.0",
|
||||
"tailwindcss": "^4.3.2",
|
||||
"vite": "^8.1.0"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@types/node": "^26.0.1",
|
||||
"@types/react": "^19.2.17",
|
||||
"@types/react-dom": "^19.2.3",
|
||||
"typescript": "^6.0.3"
|
||||
}
|
||||
}
|
||||
BIN
WonderQ-Admin-UI/public/assets/guizhou/baili-azalea.jpg
Normal file
|
After Width: | Height: | Size: 1.3 MiB |
BIN
WonderQ-Admin-UI/public/assets/guizhou/bailian-hot-spring.jpg
Normal file
|
After Width: | Height: | Size: 1.3 MiB |
BIN
WonderQ-Admin-UI/public/assets/guizhou/cave-sunbeam.jpg
Normal file
|
After Width: | Height: | Size: 4.9 MiB |
BIN
WonderQ-Admin-UI/public/assets/guizhou/chishui-danxia.jpg
Normal file
|
After Width: | Height: | Size: 1.4 MiB |
BIN
WonderQ-Admin-UI/public/assets/guizhou/dong-village.jpg
Normal file
|
After Width: | Height: | Size: 1.1 MiB |
BIN
WonderQ-Admin-UI/public/assets/guizhou/fanjing-mountain.jpg
Normal file
|
After Width: | Height: | Size: 695 KiB |
BIN
WonderQ-Admin-UI/public/assets/guizhou/gorge-paddle.jpg
Normal file
|
After Width: | Height: | Size: 14 MiB |
BIN
WonderQ-Admin-UI/public/assets/guizhou/huangguoshu-waterfall.jpg
Normal file
|
After Width: | Height: | Size: 1.3 MiB |
BIN
WonderQ-Admin-UI/public/assets/guizhou/intangible-masks.jpg
Normal file
|
After Width: | Height: | Size: 18 MiB |
BIN
WonderQ-Admin-UI/public/assets/guizhou/jiabang-terrace.jpg
Normal file
|
After Width: | Height: | Size: 1.2 MiB |
BIN
WonderQ-Admin-UI/public/assets/guizhou/jianhe-hot-spring.jpg
Normal file
|
After Width: | Height: | Size: 4.6 MiB |
BIN
WonderQ-Admin-UI/public/assets/guizhou/jiaxiu-tower.jpg
Normal file
|
After Width: | Height: | Size: 961 KiB |
BIN
WonderQ-Admin-UI/public/assets/guizhou/karst-cave-explorer.jpg
Normal file
|
After Width: | Height: | Size: 1.6 MiB |
BIN
WonderQ-Admin-UI/public/assets/guizhou/libo-water-forest.jpg
Normal file
|
After Width: | Height: | Size: 1.3 MiB |
BIN
WonderQ-Admin-UI/public/assets/guizhou/libo-xiaoqikong.jpg
Normal file
|
After Width: | Height: | Size: 1.7 MiB |
BIN
WonderQ-Admin-UI/public/assets/guizhou/miao-costume.jpg
Normal file
|
After Width: | Height: | Size: 1.3 MiB |
BIN
WonderQ-Admin-UI/public/assets/guizhou/miao-dragon-boat.jpg
Normal file
|
After Width: | Height: | Size: 4.1 MiB |
BIN
WonderQ-Admin-UI/public/assets/guizhou/miao-lusheng-dance.jpg
Normal file
|
After Width: | Height: | Size: 802 KiB |
BIN
WonderQ-Admin-UI/public/assets/guizhou/miao-village-street.jpg
Normal file
|
After Width: | Height: | Size: 32 MiB |
BIN
WonderQ-Admin-UI/public/assets/guizhou/mountain-resort.jpg
Normal file
|
After Width: | Height: | Size: 3.6 MiB |
BIN
WonderQ-Admin-UI/public/assets/guizhou/shuichunhe-rafting.jpg
Normal file
|
After Width: | Height: | Size: 951 KiB |
BIN
WonderQ-Admin-UI/public/assets/guizhou/tiankeng-pool.jpg
Normal file
|
After Width: | Height: | Size: 11 MiB |
|
After Width: | Height: | Size: 955 KiB |
BIN
WonderQ-Admin-UI/public/assets/guizhou/wanfenglin.jpg
Normal file
|
After Width: | Height: | Size: 1023 KiB |
BIN
WonderQ-Admin-UI/public/assets/guizhou/wumeng-grassland.jpg
Normal file
|
After Width: | Height: | Size: 1.7 MiB |
BIN
WonderQ-Admin-UI/public/assets/guizhou/xijiang-miao-village.jpg
Normal file
|
After Width: | Height: | Size: 465 KiB |
BIN
WonderQ-Admin-UI/public/assets/guizhou/zhenyuan-ancient-town.jpg
Normal file
|
After Width: | Height: | Size: 1.2 MiB |
BIN
WonderQ-Admin-UI/public/assets/guizhou/zhijin-cave-pool.jpg
Normal file
|
After Width: | Height: | Size: 1.9 MiB |
BIN
WonderQ-Admin-UI/public/assets/guizhou/zhijin-cave.jpg
Normal file
|
After Width: | Height: | Size: 1020 KiB |
BIN
WonderQ-Admin-UI/public/assets/source/asset-000-6130f5faf6.jpg
Normal file
|
After Width: | Height: | Size: 166 KiB |
BIN
WonderQ-Admin-UI/public/assets/source/asset-001-e3ccdf0858.jpg
Normal file
|
After Width: | Height: | Size: 208 KiB |
BIN
WonderQ-Admin-UI/public/assets/source/asset-002-60f1781bad.jpg
Normal file
|
After Width: | Height: | Size: 89 KiB |
BIN
WonderQ-Admin-UI/public/assets/source/asset-003-67c94551ff.jpg
Normal file
|
After Width: | Height: | Size: 278 KiB |
BIN
WonderQ-Admin-UI/public/assets/source/asset-004-74801a9861.jpg
Normal file
|
After Width: | Height: | Size: 265 KiB |
BIN
WonderQ-Admin-UI/public/assets/source/asset-005-5f88616344.jpg
Normal file
|
After Width: | Height: | Size: 236 KiB |
BIN
WonderQ-Admin-UI/public/assets/source/asset-006-065f65e89a.png
Normal file
|
After Width: | Height: | Size: 3.0 KiB |
BIN
WonderQ-Admin-UI/public/assets/source/asset-007-bfd23e4423.png
Normal file
|
After Width: | Height: | Size: 1.6 KiB |
BIN
WonderQ-Admin-UI/public/assets/source/asset-008-b69a2ebdf1.png
Normal file
|
After Width: | Height: | Size: 2.0 KiB |
BIN
WonderQ-Admin-UI/public/assets/source/asset-009-7c60387849.png
Normal file
|
After Width: | Height: | Size: 882 B |
BIN
WonderQ-Admin-UI/public/assets/source/asset-010-8614b34e80.png
Normal file
|
After Width: | Height: | Size: 1.9 KiB |
BIN
WonderQ-Admin-UI/public/assets/source/asset-011-398553c792.png
Normal file
|
After Width: | Height: | Size: 8.1 KiB |
BIN
WonderQ-Admin-UI/public/assets/source/asset-012-486ac8f1a1.png
Normal file
|
After Width: | Height: | Size: 7.8 KiB |
BIN
WonderQ-Admin-UI/public/assets/source/asset-013-babb337ba2.png
Normal file
|
After Width: | Height: | Size: 10 KiB |
BIN
WonderQ-Admin-UI/public/assets/source/asset-014-fd57beac6b.png
Normal file
|
After Width: | Height: | Size: 9.0 KiB |
BIN
WonderQ-Admin-UI/public/assets/source/asset-015-94835fc601.png
Normal file
|
After Width: | Height: | Size: 10 KiB |
BIN
WonderQ-Admin-UI/public/assets/source/asset-016-306236a4af.png
Normal file
|
After Width: | Height: | Size: 6.0 KiB |
BIN
WonderQ-Admin-UI/public/assets/source/asset-017-e4a0e59bd4.png
Normal file
|
After Width: | Height: | Size: 9.9 KiB |
BIN
WonderQ-Admin-UI/public/assets/source/asset-018-30bc451049.jpg
Normal file
|
After Width: | Height: | Size: 13 KiB |
BIN
WonderQ-Admin-UI/public/assets/source/asset-019-8b7f71737e.jpg
Normal file
|
After Width: | Height: | Size: 13 KiB |
BIN
WonderQ-Admin-UI/public/assets/source/asset-020-5207a45c09.png
Normal file
|
After Width: | Height: | Size: 11 KiB |
BIN
WonderQ-Admin-UI/public/assets/source/asset-021-267958c0d6.png
Normal file
|
After Width: | Height: | Size: 12 KiB |
BIN
WonderQ-Admin-UI/public/assets/source/asset-022-f982dcf65e.png
Normal file
|
After Width: | Height: | Size: 30 KiB |
BIN
WonderQ-Admin-UI/public/assets/source/asset-023-20ebf544be.png
Normal file
|
After Width: | Height: | Size: 18 KiB |
BIN
WonderQ-Admin-UI/public/assets/source/asset-024-6e6ee3998c.png
Normal file
|
After Width: | Height: | Size: 1.4 KiB |
BIN
WonderQ-Admin-UI/public/assets/source/asset-025-980c7ac168.png
Normal file
|
After Width: | Height: | Size: 1.1 KiB |
BIN
WonderQ-Admin-UI/public/assets/source/asset-026-6e4d686b97.png
Normal file
|
After Width: | Height: | Size: 497 B |
BIN
WonderQ-Admin-UI/public/assets/source/asset-027-22aef1d83b.png
Normal file
|
After Width: | Height: | Size: 703 B |
BIN
WonderQ-Admin-UI/public/assets/source/asset-028-912019b131.png
Normal file
|
After Width: | Height: | Size: 67 KiB |
BIN
WonderQ-Admin-UI/public/assets/source/asset-029-9eccbb7131.png
Normal file
|
After Width: | Height: | Size: 66 KiB |
BIN
WonderQ-Admin-UI/public/assets/source/asset-030-a77d1ef23a.jpg
Normal file
|
After Width: | Height: | Size: 12 KiB |
BIN
WonderQ-Admin-UI/public/assets/source/asset-031-802555e02b.png
Normal file
|
After Width: | Height: | Size: 158 KiB |
BIN
WonderQ-Admin-UI/public/assets/source/asset-032-1257cf8865.jpg
Normal file
|
After Width: | Height: | Size: 16 KiB |
BIN
WonderQ-Admin-UI/public/assets/source/asset-033-4f39bbaba6.jpg
Normal file
|
After Width: | Height: | Size: 13 KiB |
BIN
WonderQ-Admin-UI/public/assets/source/asset-034-393944f522.png
Normal file
|
After Width: | Height: | Size: 149 KiB |
BIN
WonderQ-Admin-UI/public/assets/source/asset-035-9d6bac22b3.jpg
Normal file
|
After Width: | Height: | Size: 14 KiB |
BIN
WonderQ-Admin-UI/public/assets/source/asset-036-60d6309202.jpg
Normal file
|
After Width: | Height: | Size: 12 KiB |
BIN
WonderQ-Admin-UI/public/assets/source/asset-037-b6dee37086.jpg
Normal file
|
After Width: | Height: | Size: 14 KiB |
BIN
WonderQ-Admin-UI/public/assets/source/asset-038-90f983ea37.jpg
Normal file
|
After Width: | Height: | Size: 16 KiB |
BIN
WonderQ-Admin-UI/public/assets/source/asset-039-a02a731cec.jpg
Normal file
|
After Width: | Height: | Size: 11 KiB |
BIN
WonderQ-Admin-UI/public/assets/source/asset-040-10c33d1558.jpg
Normal file
|
After Width: | Height: | Size: 13 KiB |
BIN
WonderQ-Admin-UI/public/assets/source/asset-041-c5a7b61b99.jpg
Normal file
|
After Width: | Height: | Size: 11 KiB |
BIN
WonderQ-Admin-UI/public/assets/source/asset-042-263c1d8958.jpg
Normal file
|
After Width: | Height: | Size: 12 KiB |
BIN
WonderQ-Admin-UI/public/assets/source/asset-043-a1bbc0007e.jpg
Normal file
|
After Width: | Height: | Size: 13 KiB |
BIN
WonderQ-Admin-UI/public/assets/source/asset-044-80ccc16363.jpg
Normal file
|
After Width: | Height: | Size: 17 KiB |
BIN
WonderQ-Admin-UI/public/assets/source/asset-045-014a557086.png
Normal file
|
After Width: | Height: | Size: 38 KiB |
BIN
WonderQ-Admin-UI/public/assets/source/asset-046-5b4ca8173b.png
Normal file
|
After Width: | Height: | Size: 766 B |
BIN
WonderQ-Admin-UI/public/assets/source/asset-047-14415ef235.jpg
Normal file
|
After Width: | Height: | Size: 89 KiB |
BIN
WonderQ-Admin-UI/public/assets/source/asset-048-cdb636ea72.jpg
Normal file
|
After Width: | Height: | Size: 27 KiB |
BIN
WonderQ-Admin-UI/public/assets/source/asset-049-662d6cd220.jpg
Normal file
|
After Width: | Height: | Size: 31 KiB |
BIN
WonderQ-Admin-UI/public/assets/source/asset-050-b1dcc1ad8e.jpg
Normal file
|
After Width: | Height: | Size: 34 KiB |
BIN
WonderQ-Admin-UI/public/assets/source/asset-051-5873b802e1.jpg
Normal file
|
After Width: | Height: | Size: 35 KiB |
BIN
WonderQ-Admin-UI/public/assets/source/asset-052-8454c19a8f.jpg
Normal file
|
After Width: | Height: | Size: 14 KiB |
BIN
WonderQ-Admin-UI/public/assets/source/asset-053-9298156002.jpg
Normal file
|
After Width: | Height: | Size: 26 KiB |
BIN
WonderQ-Admin-UI/public/assets/source/asset-054-c936b44502.jpg
Normal file
|
After Width: | Height: | Size: 49 KiB |
BIN
WonderQ-Admin-UI/public/assets/source/asset-055-0cd651d9e1.jpg
Normal file
|
After Width: | Height: | Size: 24 KiB |
BIN
WonderQ-Admin-UI/public/assets/source/asset-056-209a8a139f.jpg
Normal file
|
After Width: | Height: | Size: 32 KiB |
BIN
WonderQ-Admin-UI/public/assets/source/asset-057-7c54fd675c.jpg
Normal file
|
After Width: | Height: | Size: 15 KiB |
BIN
WonderQ-Admin-UI/public/assets/source/asset-058-77303eee5e.jpg
Normal file
|
After Width: | Height: | Size: 15 KiB |
BIN
WonderQ-Admin-UI/public/assets/source/asset-059-a8a6b2886f.jpg
Normal file
|
After Width: | Height: | Size: 50 KiB |
BIN
WonderQ-Admin-UI/public/assets/source/asset-060-4906700f3d.jpg
Normal file
|
After Width: | Height: | Size: 51 KiB |
BIN
WonderQ-Admin-UI/public/assets/source/asset-061-34916cd0eb.jpg
Normal file
|
After Width: | Height: | Size: 33 KiB |
BIN
WonderQ-Admin-UI/public/assets/source/asset-062-d0571e4731.jpg
Normal file
|
After Width: | Height: | Size: 18 KiB |