1111
This commit is contained in:
@@ -5,32 +5,20 @@ alwaysApply: true
|
||||
|
||||
# aiclient 项目约定
|
||||
|
||||
## 技术栈
|
||||
## 仓库拆分
|
||||
|
||||
- **桌面壳**:Tauri 2(Rust),单例、无边框、可拖动标题栏
|
||||
- **前端**:Vue 3 + Vite 6,**纯 JavaScript**(不使用 TypeScript)
|
||||
- **UI**:Tailwind CSS v4(`@tailwindcss/vite`)+ PrimeVue 4(Aura 深色预设)
|
||||
- **状态/路由**:Pinia + Vue Router
|
||||
| 仓库 | 职责 |
|
||||
|------|------|
|
||||
| **aiclient**(本仓库) | Tauri 2 桌面壳、Rust 业务、updater、打包 |
|
||||
| **aiclient_ui**(`../aiclient_ui`) | Vue 3 前端,Vite 开发/构建 |
|
||||
|
||||
## 目录结构
|
||||
|
||||
```
|
||||
src/ # Vue 前端
|
||||
main.js # 入口:插件与全局组件注册
|
||||
App.vue # 布局:标题栏 + router-view
|
||||
styles/main.css # Tailwind + 科技感主题令牌
|
||||
router/ # 路由与守卫
|
||||
stores/ # Pinia(auth 等)
|
||||
views/ # 页面
|
||||
components/ # 可复用组件
|
||||
src-tauri/ # Tauri Rust 与配置
|
||||
```
|
||||
`tauri.conf.json` 的 `frontendDist` 为占位目录 `frontend-stub`,**发布构建不编译前端**;运行时加载服务器上的 HTML/CSS/JS(见 `lib.rs` 中 `PROD_WEB_URL`)。前端开发/部署在 **aiclient_ui** 仓库。
|
||||
|
||||
## 常用命令
|
||||
|
||||
- `npm run dev` — 仅前端(端口 1420)
|
||||
- `npm run tauri dev` — 桌面开发
|
||||
- `npm run build` / `npm run tauri:build` — 构建桌面端(仅生成 zip 便携包,不生成 MSI/NSIS 安装包;前端无 `tsc` 步骤)
|
||||
- 在 **aiclient_ui**:`npm run dev` — 仅 Web;`npm run build:deploy` — 部署到服务器静态目录
|
||||
- 在 **aiclient**:`npm run dev` — `tauri dev`(调试时连本地 Vite)
|
||||
- 在 **aiclient**:`npm run tauri:build` — 仅打包 Rust/updater,不构建前端
|
||||
|
||||
## 后端 API 约定(pythonbackend)
|
||||
|
||||
@@ -38,55 +26,23 @@ src-tauri/ # Tauri Rust 与配置
|
||||
|
||||
### 统一响应 `ApiResponse<T>`
|
||||
|
||||
所有 JSON 响应使用同一信封(与 `app/schemas/common.py` 一致):
|
||||
|
||||
| 字段 | 类型 | 说明 |
|
||||
|------|------|------|
|
||||
| `ok` | `boolean` | `true` 表示业务成功,`false` 表示失败(如校验、鉴权、业务错误) |
|
||||
| `message` | `string` | 提示文案,默认可为空;失败时展示给用户 |
|
||||
| `data` | `T \| null` | 成功时的载荷;失败时通常为 `null` 或省略 |
|
||||
| `ok` | `boolean` | 业务是否成功 |
|
||||
| `message` | `string` | 用户可见提示 |
|
||||
| `data` | `T \| null` | 成功载荷 |
|
||||
|
||||
前端处理模式:
|
||||
|
||||
```js
|
||||
const body = await res.json();
|
||||
if (!body.ok) {
|
||||
// 用 body.message 提示用户
|
||||
return { ok: false, message: body.message };
|
||||
}
|
||||
// 使用 body.data
|
||||
```
|
||||
|
||||
- 业务失败(如用户名已存在)仍返回 **HTTP 200**,以 `ok: false` 区分,勿仅依赖状态码。
|
||||
- 未认证访问受保护接口返回 **HTTP 401**(FastAPI 标准错误体,非 `ApiResponse` 信封)。
|
||||
业务失败仍返回 **HTTP 200** + `ok: false`。未认证返回 **401**。
|
||||
|
||||
### 认证
|
||||
|
||||
- 登录/注册成功后,`data` 为 `TokenResponse`:
|
||||
- `access_token`:JWT,前端持久化(如 localStorage `aiclient_token`)
|
||||
- `token_type`:固定 `"bearer"`
|
||||
- `user`:`{ id, username }`
|
||||
- 需登录的请求请求头:`Authorization: Bearer <access_token>`
|
||||
- 登出:`POST /api/v1/auth/logout`,带同上 Authorization;成功 `ok: true`,`message`: `"已退出登录"`
|
||||
- JWT:`Authorization: Bearer <access_token>`
|
||||
- 登出:`POST /api/v1/auth/logout`
|
||||
|
||||
### 认证相关端点
|
||||
### 环境
|
||||
|
||||
| 方法 | 路径 | 请求体 | `data`(成功时) |
|
||||
|------|------|--------|------------------|
|
||||
| POST | `/api/v1/auth/register` | `{ username, password, confirmPassword }` | `TokenResponse` |
|
||||
| POST | `/api/v1/auth/login` | `{ username, password }` | `TokenResponse` |
|
||||
| POST | `/api/v1/auth/logout` | 无 | `null` |
|
||||
| GET | `/api/v1/auth/me` | 无 | `{ id, username }` |
|
||||
|
||||
- 注册请求体字段名与前端表单一致:`confirmPassword`(camelCase);其余 API JSON 字段为 **snake_case**(如 `access_token`)。
|
||||
- 密码规则与本地逻辑对齐:至少 6 位;用户名 trim 后非空。
|
||||
|
||||
|
||||
### 前端对接注意
|
||||
|
||||
- Pinia `auth` store 的 `login` / `register` 可逐步改为调用上述 API,保留 `{ ok, message }` 与视图层一致。
|
||||
- 开发时后端需配置 CORS 包含 `http://localhost:1420`(见 pythonbackend `.env` 的 `CORS_ORIGINS`)。
|
||||
- 开发时 Vite 将 `/api` 代理到 `http://127.0.0.1:8001`(见 `vite.config.js`);API 基址默认 `/api/v1`,生产可设 `VITE_API_BASE_URL`。
|
||||
- 前端 `VITE_*`:aiclient_ui 的 `.env`
|
||||
- Rust `AICLIENT_*`:aiclient 根目录 `.env`
|
||||
|
||||
## 通用原则
|
||||
|
||||
|
||||
Reference in New Issue
Block a user