This commit is contained in:
949036910@qq.com
2026-05-30 18:44:16 +08:00
parent e10a66ccf2
commit 9c6650373f
162 changed files with 624 additions and 26788 deletions

View File

@@ -5,32 +5,20 @@ alwaysApply: true
# aiclient 项目约定
## 技术栈
## 仓库拆分
- **桌面壳**Tauri 2Rust单例、无边框、可拖动标题栏
- **前端**Vue 3 + Vite 6**纯 JavaScript**(不使用 TypeScript
- **UI**Tailwind CSS v4`@tailwindcss/vite`+ PrimeVue 4Aura 深色预设)
- **状态/路由**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/ # Piniaauth 等)
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`
## 通用原则

View File

@@ -31,7 +31,7 @@ alwaysApply: false
## 权限(`capabilities/default.json`
- 拖动窗口需:`core:window:allow-start-dragging`
- 前端标题栏元素使用 `data-tauri-drag-region`(在 `AppTitlebar.vue`
- 前端标题栏元素使用 `data-tauri-drag-region`(在 aiclient_ui 的 `AppTitlebar.vue`
## Rust 约定
@@ -41,6 +41,6 @@ alwaysApply: false
## 开发注意
- Vite 固定端口 `1420`(见 `vite.config.js`),与 `tauri.conf.json` 的 `devUrl` 一致
前端在 **`../aiclient_ui`** 开发并 **`npm run build:deploy`** 部署到服务器;**`tauri build` 不编译前端**。发布版 WebView 加载 `http://81.71.163.140/images/newyaoyan/`(见 `lib.rs`)。
- 修改 capabilities 或插件后需重新 `tauri dev` / `tauri:build`
- 发布构建使用 `npm run tauri:build``bundle.targets` 为空,跳过 MSI/NSIS构建结束后由 `src-tauri/scripts/zip-portable.cjs` 生成 `target/release/bundle/zip/*.zip`