770 lines
28 KiB
Markdown
770 lines
28 KiB
Markdown
# 开发准则与规范 (DesignerCEP / Photoshop Plugin)
|
||
|
||
## 1. 项目概述
|
||
|
||
本项目是一个基于 **Vue 3 + Vite + TypeScript** 的 Adobe Photoshop 扩展插件 (CEP) 项目。
|
||
|
||
## 2. 技术栈
|
||
|
||
### 2.1 核心框架与语言
|
||
|
||
- **核心框架**: Vue 3 (Composition API + `<script setup>`)
|
||
- **语言**: TypeScript
|
||
- **UI 组件库**: Arco Design Vue (`@arco-design/web-vue` v2.57.0)
|
||
- **CEP 环境**: Adobe CEP (宿主环境: **Adobe Photoshop**)
|
||
|
||
### 2.2 状态管理库
|
||
|
||
- **Pinia** (v3.0.4)
|
||
- Vue 3 官方推荐的状态管理库
|
||
- 使用 Composition API 风格,支持 TypeScript
|
||
- 项目中的使用:
|
||
- 在 `main.ts` 中全局注册: `app.use(createPinia())`
|
||
- Store 模块位于 `src/store/` 目录
|
||
- 示例: `src/store/app.ts` (应用全局状态)、`src/store/counter.ts`
|
||
- 使用方式:
|
||
|
||
```typescript
|
||
import { defineStore } from "pinia";
|
||
import { ref } from "vue";
|
||
|
||
export const useAppStore = defineStore("app", () => {
|
||
const loading = ref(false);
|
||
function setLoading(status: boolean) {
|
||
loading.value = status;
|
||
}
|
||
return { loading, setLoading };
|
||
});
|
||
```
|
||
|
||
### 2.3 请求管理库
|
||
|
||
- **Axios** (v1.6.8)
|
||
- 基于 Promise 的 HTTP 客户端
|
||
- 项目中的封装:
|
||
- 统一请求实例: `src/utils/request.ts`
|
||
- 请求拦截器: 自动添加 Token 到请求头
|
||
- 响应拦截器: 统一错误处理 (401 自动跳转登录、错误提示等)
|
||
- API 模块化: `src/api/` 目录下按功能模块划分
|
||
- `auth.ts` - 认证相关接口
|
||
- `user.ts` - 用户相关接口
|
||
- `checkin.ts` - 签到相关接口
|
||
- `analytics.ts` - 数据分析接口
|
||
- 配置说明:
|
||
- baseURL 通过 `src/config/index.ts` 统一管理
|
||
- 开发环境通过 Vite 代理转发到本地后端 (localhost:8000)
|
||
- 生产环境直接请求远程 API 服务器
|
||
|
||
### 2.4 工程管理库
|
||
|
||
- **Vite** (v4.3.9) - 构建工具
|
||
- 配置文件: `vite.config.ts`
|
||
- 开发服务器: 端口 5173,支持热更新
|
||
- 代理配置: `/api` 代理到本地后端
|
||
- 插件系统:
|
||
- `@vitejs/plugin-vue` - Vue 3 支持
|
||
- `@vitejs/plugin-legacy` - 兼容旧版 Chrome (CEP 环境)
|
||
- `vite-tsconfig-paths` - TypeScript 路径别名支持
|
||
- 自定义 `cepPlugin` - CEP 开发环境支持
|
||
- **Vue Router** (v4.2.4) - 路由管理
|
||
|
||
- 路由配置: `src/router/index.ts`
|
||
- 支持 Hash 模式 (适配 CEP 环境)
|
||
- 路由守卫: 登录验证、权限控制
|
||
|
||
- **TypeScript** (v5.1.5) - 类型系统
|
||
|
||
- 严格模式开启
|
||
- 类型定义: `src/types/` 目录
|
||
- 禁止使用 `any` (除非必要且需注释说明)
|
||
|
||
- **Vitest** (v1.6.0) - 测试框架
|
||
- 配置在 `vite.config.ts` 中
|
||
- 测试环境: jsdom
|
||
- 支持 UI 模式: `npm run test:ui`
|
||
|
||
### 2.5 其他重要库
|
||
|
||
- **@vueuse/core** (v10.4.1) - Vue 组合式工具库
|
||
- **dayjs** (v1.11.9) - 日期处理库
|
||
- **types-for-adobe** (v7.0.12) - Adobe CEP TypeScript 类型定义
|
||
|
||
---
|
||
|
||
## 3. 开发规范
|
||
|
||
### 3.1 Vue 3 & 代码风格
|
||
|
||
1. **Composition API**:
|
||
|
||
- 必须使用 `<script setup lang="ts">` 语法糖。
|
||
- 优先使用 `ref` 定义基本类型,`reactive` 定义对象类型。
|
||
- 逻辑复用应提取为 **Composables (Hooks)** (`useXxx`),存放于 `src/hooks` 或 `src/composables`。
|
||
|
||
2. **组件 (Components)**:
|
||
|
||
- **单一职责**: 每个组件应只负责一个功能模块。
|
||
- **命名**: 文件名使用 **PascalCase** (如 `userProfile.vue` -> `UserProfile.vue`)。
|
||
- **Props 定义**: 使用 `defineProps<{ ... }>()` 进行类型安全的 Props 定义。
|
||
|
||
3. **TypeScript 类型安全**:
|
||
|
||
- ❌ **严禁使用 `any`**:除非是在不得不对接极度混乱的 legacy 代码时(需加注释说明)。
|
||
- **接口定义**: 数据模型应定义 interface,存放于 `src/types` 或组件同级目录。
|
||
- **CEP 交互**: 与 Photoshop 宿主环境交互时 (CSInterface, JSX 脚本),应注意类型转换和错误处理。
|
||
|
||
4. **样式 (CSS/Less/Sass)**:
|
||
- 使用 **Scoped CSS** (`<style scoped>`) 避免全局因污染。
|
||
- 利用 Arco Design 的 Token 进行样式定制,保持 UI 风格统一。
|
||
|
||
### 3.2 日志管理规范
|
||
|
||
本项目使用统一的全局日志管理工具 (`logger`),禁止直接使用 `console.*` 方法。
|
||
|
||
1. **核心原则**:
|
||
|
||
- ❌ **严禁直接使用 `console.log/warn/error/info/debug`**。
|
||
- ✅ **必须统一使用 `logger` 工具类**,位于 `src/utils/logger.ts`。
|
||
- ✅ **一键控制**:所有日志可通过全局开关统一开启/关闭,便于生产环境清理日志。
|
||
|
||
2. **使用方法**:
|
||
|
||
```typescript
|
||
import { logger } from "@/utils/logger";
|
||
|
||
// 普通日志
|
||
logger.log("用户登录成功");
|
||
|
||
// 信息日志
|
||
logger.info("正在加载数据...");
|
||
|
||
// 警告日志
|
||
logger.warn("Token 即将过期");
|
||
|
||
// 错误日志(始终显示,不受开关控制)
|
||
logger.error("API 请求失败:", error);
|
||
|
||
// 可控制的错误日志
|
||
logger.errorSilent("这个错误只在开启日志时显示");
|
||
|
||
// 调试日志
|
||
logger.debug("调试信息:", data);
|
||
|
||
// 分隔线
|
||
logger.separator(); // 输出 60 个 '='
|
||
logger.separator("-", 40); // 输出 40 个 '-'
|
||
```
|
||
|
||
3. **日志开关控制**:
|
||
|
||
```typescript
|
||
// 开启日志(开发环境)
|
||
logger.enable();
|
||
|
||
// 关闭日志(生产环境)
|
||
logger.disable();
|
||
|
||
// 切换日志状态
|
||
logger.toggle();
|
||
|
||
// 查询当前状态
|
||
console.log(logger.enabled); // true/false
|
||
```
|
||
|
||
4. **浏览器控制台访问**:
|
||
|
||
- 日志工具自动挂载到 `window.logger`,可在浏览器控制台直接操作:
|
||
|
||
```javascript
|
||
// 在 Chrome DevTools 控制台中
|
||
window.logger.enable(); // 开启日志
|
||
window.logger.disable(); // 关闭日志
|
||
window.logger.toggle(); // 切换状态
|
||
```
|
||
|
||
5. **特殊说明**:
|
||
|
||
- **错误日志策略**:
|
||
- `logger.error()` 始终输出,即使日志开关关闭(用于捕获关键错误)。
|
||
- 如需可控的错误日志,使用 `logger.errorSilent()`。
|
||
- **默认状态**: 日志默认为**关闭**状态,需要手动开启。
|
||
- **性能考虑**: 关闭日志后,所有日志调用不会产生任何输出,不影响性能。
|
||
|
||
6. **禁止事项**:
|
||
|
||
- ❌ 禁止在代码中直接使用 `console.log()` 等原生方法。
|
||
- ❌ 禁止删除日志代码(保留代码,通过开关控制)。
|
||
- ❌ 禁止在生产环境中开启日志(避免信息泄露)。
|
||
|
||
### 3.3 Adobe CEP & Photoshop 特有规范
|
||
|
||
1. **CSInterface**: 所有与 Photoshop 的交互必须通过 `CSInterface` 进行。
|
||
2. **Photoshop 脚本 (JSX)**:
|
||
- 宿主脚本(ExtendScript)位于 `/jsx` 目录。
|
||
- 优先使用 **ActionManager (ActionDescriptor/Reference)** 代码(通常更高效),但也支持 DOM 操作 (`app.activeDocument` 等)。
|
||
- **调试**: 使用 **ExtendScript Toolkit** 或 **VSCode ExtendScript Debugger** 调试 `.jsx` 文件。
|
||
3. **事件监听**: 使用 `CSInterface` 监听 Photoshop 事件(如文档切换、选区改变 `com.adobe.PhotoshopJSONCallback`)时,需注意性能开销。
|
||
4. **文件系统**: 利用 Node.js 上下文 (`fs`, `path`) 处理本地文件操作,比 JSX 传参更灵活。
|
||
5. **主题同步机制**:
|
||
- **Shell (AdminPanel)**: 监听 Photoshop 主题变化事件 (`com.adobe.csxs.events.ThemeColorChanged`),并将主题数据(背景色、亮度等)通过 `postMessage` 发送给 iframe。
|
||
- **Content (Designer)**: 监听 `message` 事件接收主题数据,并根据动态算法计算出完整的主题色板(主色、侧边栏色、悬浮色等),通过 CSS 变量应用到页面。
|
||
- **双向通信**: Content 加载时会发送 `REQUEST_THEME` 消息主动请求当前主题,确保初始化时颜色正确。
|
||
|
||
### 3.4 目录结构建议 (参考)
|
||
|
||
```
|
||
Designer/src/
|
||
├── api/
|
||
│ ├── ai.ts # AI 聊天/图片/模型 API 接口
|
||
│ ├── auth.ts # 认证接口
|
||
│ ├── user.ts # 用户接口
|
||
│ └── jsxApi/inline/
|
||
│ ├── utils.ts # JSX 公共工具库 (evalInlineJSX)
|
||
│ ├── pattern-ai.ts # AI 套图 JSX(置入/填色/标签/剪贴蒙版)
|
||
│ ├── layer.ts # 图层操作
|
||
│ ├── document.ts # 文档操作
|
||
│ └── ...
|
||
├── view/
|
||
│ ├── AiChat.vue # AI 聊天页面(Gemini 风格 UI)
|
||
│ └── ...
|
||
├── utils/
|
||
│ ├── aiToolExecutor.ts # AI 工具执行器(tool_call → JSX 映射)
|
||
│ ├── aiCanvasCapture.ts # 画布截图 / 临时文件管理
|
||
│ ├── logger.ts # 日志工具
|
||
│ └── request.ts # Axios 封装
|
||
├── components/ # 通用组件
|
||
├── router/ # 路由配置
|
||
├── hooks/ # 组合式函数 (Composables)
|
||
├── types/ # TypeScript 类型定义
|
||
├── App.vue
|
||
└── main.ts
|
||
|
||
Server/app/api/v1/
|
||
├── ai_chat.py # AI 聊天路由(对话/会话/图片处理端点)
|
||
├── ai_llm.py # AI 模型调用层(Qwen/Gemini/Vision/Image 统一路由)
|
||
├── ai_tools.py # AI 工具定义(PS 操作的 function calling schema)
|
||
├── auth.py # 认证路由
|
||
└── ...
|
||
```
|
||
|
||
### 3.5.5 AI 模块开发规范
|
||
|
||
1. **模型调用统一走 `ai_llm.py`**:
|
||
- 所有 LLM/Vision/Image 调用逻辑集中在此文件
|
||
- 自动路由 Qwen(DashScope)和 Gemini(第三方代理)
|
||
- 禁止在路由端点中直接调用 `OpenAI()` 客户端
|
||
|
||
2. **工具执行器模式**(前端):
|
||
- AI 返回 `tool_calls` → 前端 `aiToolExecutor.ts` 执行 → 回传结果给后端
|
||
- 工具函数映射表 `toolHandlers` 统一管理
|
||
- 状态(预览图 URL、裁片分析结果等)存在模块级变量中
|
||
|
||
3. **CEP 中的 IME(中文输入)兼容**:
|
||
- ❌ **禁止使用 Arco Design 的 `a-textarea` 做主输入框**(会拦截 IME composition 事件)
|
||
- ✅ **使用原生 `<textarea>`** 确保输入法正常工作
|
||
- ✅ **必须注册全量键盘事件**:`registerKeyEventsInterest` 要注册所有 keyCode × 16 种 modifier 组合
|
||
- ✅ **Enter 发送时检查 IME 状态**:`e.isComposing && e.keyCode !== 229`
|
||
|
||
4. **图案分层处理**(4 种类型):
|
||
- `solid` — 纯色 PS 填充
|
||
- `fill_pattern` — AI 花型铺满
|
||
- `theme_pattern` — AI 主题图案(白底)+ PS 纯色底 + 正片叠底
|
||
- `mixed_pattern` — AI 主题图案(白底)+ AI 花型底 + 正片叠底
|
||
|
||
### 3.5 CEP 插件 UI/UX 设计规范 ⭐⭐⭐
|
||
|
||
#### 1. **面板尺寸规范**(基于竞品实测)
|
||
|
||
CEP 插件运行在 Photoshop 侧边栏面板,**尺寸约束极其严格**,必须按照以下规范设计:
|
||
|
||
##### manifest.xml 配置(标准参数)
|
||
|
||
```xml
|
||
<Geometry>
|
||
<Size>
|
||
<Height>600</Height>
|
||
<Width>280</Width> <!-- 默认宽度 280px -->
|
||
</Size>
|
||
<MaxSize>
|
||
<Height>4080</Height>
|
||
<Width>600</Width> <!-- 最大宽度 600px -->
|
||
</MaxSize>
|
||
<MinSize>
|
||
<Height>600</Height>
|
||
<Width>280</Width> <!-- 最小宽度 280px -->
|
||
</MinSize>
|
||
</Geometry>
|
||
```
|
||
|
||
##### 设计约束
|
||
|
||
- **默认宽度**: 280px(竞品标准)
|
||
- **最小宽度**: 280px(不可再窄)
|
||
- **最大宽度**: 600px(不建议超过 450px)
|
||
- **高度**: 600px 起,支持无限垂直滚动
|
||
- **布局方向**: 必须是垂直布局,禁止横向滚动
|
||
|
||
##### CSS 设计准则
|
||
|
||
```css
|
||
/* 容器最大宽度约束 */
|
||
.cep-container {
|
||
max-width: 450px; /* 不要超过这个宽度 */
|
||
min-width: 280px;
|
||
width: 100%;
|
||
}
|
||
|
||
/* 侧边栏(仅图标)*/
|
||
.sidebar {
|
||
width: 40px; /* 仅显示图标,节省空间 */
|
||
position: fixed;
|
||
left: 0;
|
||
}
|
||
|
||
/* 主内容区 */
|
||
.main-content {
|
||
margin-left: 40px; /* 侧边栏宽度 */
|
||
padding: 8px; /* 紧凑内边距 */
|
||
}
|
||
|
||
/* 功能网格(自适应列数)*/
|
||
.feature-grid {
|
||
display: grid;
|
||
grid-template-columns: repeat(auto-fill, minmax(70px, 1fr));
|
||
gap: 8px;
|
||
}
|
||
```
|
||
|
||
#### 2. **间距系统**(紧凑设计)
|
||
|
||
```css
|
||
/* 不要用网页的大间距! */
|
||
--spacing-xs: 4px; /* 最小间距 */
|
||
--spacing-sm: 6px; /* 小间距 */
|
||
--spacing-md: 8px; /* 中等间距(常用)*/
|
||
--spacing-lg: 12px; /* 大间距 */
|
||
--spacing-xl: 16px; /* 超大间距(很少用)*/
|
||
|
||
/* ❌ 错误示例 */
|
||
padding: 40px; /* 太大了!会浪费空间 */
|
||
margin: 24px 0; /* 太大了! */
|
||
|
||
/* ✅ 正确示例 */
|
||
padding: 8px; /* 紧凑 */
|
||
margin: 12px 0; /* 适中 */
|
||
```
|
||
|
||
#### 3. **字体大小**(精简尺寸)
|
||
|
||
```css
|
||
--font-xs: 10px; /* 辅助文字 */
|
||
--font-sm: 11px; /* 说明文字 */
|
||
--font-base: 12px; /* 正文(默认)*/
|
||
--font-md: 13px; /* 小标题 */
|
||
--font-lg: 14px; /* 主标题(最大)*/
|
||
|
||
/* ❌ 不要用网页的大字体 */
|
||
h1 {
|
||
font-size: 24px;
|
||
} /* 太大! */
|
||
h2 {
|
||
font-size: 20px;
|
||
} /* 太大! */
|
||
|
||
/* ✅ CEP 插件标准 */
|
||
h1 {
|
||
font-size: 14px;
|
||
font-weight: 600;
|
||
}
|
||
h2 {
|
||
font-size: 13px;
|
||
font-weight: 500;
|
||
}
|
||
p {
|
||
font-size: 12px;
|
||
}
|
||
```
|
||
|
||
#### 4. **组件尺寸**
|
||
|
||
```css
|
||
/* 图标 */
|
||
--icon-sm: 16px; /* 小图标(菜单、按钮)*/
|
||
--icon-md: 24px; /* 中等图标 */
|
||
--icon-lg: 32px; /* 功能入口图标 */
|
||
--icon-xl: 48px; /* 主要功能图标(背景)*/
|
||
|
||
/* 按钮 */
|
||
--button-height-sm: 24px;
|
||
--button-height-md: 28px;
|
||
--button-height-lg: 32px; /* 最大 */
|
||
|
||
/* 输入框 */
|
||
--input-height: 28px;
|
||
|
||
/* ❌ 错误:不要用大尺寸 */
|
||
.button {
|
||
height: 48px;
|
||
} /* 太高!*/
|
||
|
||
/* ✅ 正确 */
|
||
.button {
|
||
height: 28px;
|
||
padding: 0 12px;
|
||
}
|
||
```
|
||
|
||
#### 5. **响应式网格**(自适应列数)
|
||
|
||
```css
|
||
/* 根据面板宽度自动调整列数 */
|
||
.feature-grid {
|
||
display: grid;
|
||
gap: 8px;
|
||
}
|
||
|
||
/* 窄面板 (<280px 不会出现,但做兜底) */
|
||
@media (max-width: 280px) {
|
||
.feature-grid {
|
||
grid-template-columns: repeat(2, 1fr);
|
||
}
|
||
}
|
||
|
||
/* 标准面板 (280-350px) - 最常见 */
|
||
@media (min-width: 280px) and (max-width: 350px) {
|
||
.feature-grid {
|
||
grid-template-columns: repeat(3, 1fr); /* 3列 */
|
||
}
|
||
}
|
||
|
||
/* 宽面板 (>350px) */
|
||
@media (min-width: 350px) {
|
||
.feature-grid {
|
||
grid-template-columns: repeat(4, 1fr); /* 4列 */
|
||
}
|
||
}
|
||
```
|
||
|
||
#### 6. **PS 主题适配 (Native Look)**
|
||
|
||
1. **PS 主题适配 (Native Look)**:
|
||
|
||
- ✅ **必须适配 Photoshop 的 4 种颜色主题**(深黑、深灰、浅灰、白)。
|
||
- ✅ **核心机制**:
|
||
- **获取颜色**: 通过 `new CSInterface().getHostEnvironment().appSkinInfo` 获取宿主环境颜色 (`panelBackgroundColor`)。
|
||
- **监听切换**: 必须监听 `com.adobe.csxs.events.ThemeColorChanged` 事件,实现实时自动切换。
|
||
- **实现参考代码**:
|
||
|
||
```typescript
|
||
const updateTheme = () => {
|
||
const csInterface = new CSInterface();
|
||
const skinInfo = csInterface.getHostEnvironment().appSkinInfo;
|
||
const color = skinInfo.panelBackgroundColor.color;
|
||
// 将 RGB 转换为 CSS 变量或应用到 body
|
||
const bgColor = `rgb(${Math.round(color.red)}, ${Math.round(
|
||
color.green
|
||
)}, ${Math.round(color.blue)})`;
|
||
document.body.style.backgroundColor = bgColor;
|
||
// TODO: 更新 Arco Design 的 Token (如 --color-bg-1)
|
||
};
|
||
|
||
// 初始化运行 + 监听事件
|
||
updateTheme();
|
||
new CSInterface().addEventListener(
|
||
"com.adobe.csxs.events.ThemeColorChanged",
|
||
updateTheme
|
||
);
|
||
```
|
||
|
||
- ❌ 禁止使用固定死颜色,导致在不同主题下看不清文字。
|
||
|
||
2. **样式库选择**:
|
||
|
||
- 虽然 Adobe 官方推荐 **Spectrum** (React),但在 Vue 项目中,建议使用 **Arco Design** 并自定义通过 CSS 变量映射 PS 主题色。
|
||
- **Mac 兼容性**: 如果遇到点击事件无效,尝试 hack: `delete window.PointerEvent` (常见于 CEF 环境兼容问题)。
|
||
|
||
3. **视觉美感 (Aesthetics)**:
|
||
- ✅ **高级感**: 界面设计要精致,拒绝简陋的“工程师审美”。
|
||
- ✅ **微交互**: 按钮、列表项必须有 Hover/Active 状态和过渡动画 (`transition: all 0.2s`)。
|
||
- ✅ **排版**: 使用系统字体或 Inter,保持良好的留白 (Spacing) 和层级感。
|
||
|
||
---
|
||
|
||
## 4. 后端开发规范 (Python / FastAPI)
|
||
|
||
本项目后端采用 **FastAPI** 框架,必须遵循**模块化、组件化**的开发原则。
|
||
|
||
### 4.1 核心原则
|
||
|
||
1. **分层架构**: 严格分离 控制层(API)、业务层(Service) 和 数据模型(Schema/Model)。
|
||
- ❌ **禁止**在 API 路由函数中编写通过复杂的业务逻辑。
|
||
- ✅ 业务逻辑应封装在 `services/` 目录下的服务类中。
|
||
2. **类型安全**: 全面使用 **Pydantic** (`schemas/`) 定义请求和响应模型,利用 Python Type Hints。
|
||
3. **依赖注入**: 使用 FastAPI 的 `Depends` 进行服务注入和权限验证。
|
||
|
||
### 4.2 目录结构规范
|
||
|
||
后端代码位于 `Server/` 目录,内部结构如下:
|
||
|
||
```
|
||
Server/
|
||
├── app/
|
||
│ ├── api/v1/
|
||
│ │ ├── ai_chat.py # AI 聊天路由(对话/会话/图片处理)
|
||
│ │ ├── ai_llm.py # AI 模型调用层(Qwen/Gemini 统一路由)
|
||
│ │ ├── ai_tools.py # AI 工具定义(function calling schema)
|
||
│ │ ├── auth.py # 认证接口
|
||
│ │ ├── algorithm.py # 算法接口(PLT 处理等)
|
||
│ │ └── ...
|
||
│ ├── core/ # 核心配置 (Config, Security)
|
||
│ ├── models/ # 数据库模型 (SQLAlchemy)
|
||
│ └── main.py # 程序入口
|
||
├── debug_images/ # AI 调试图片(自动生成,不提交)
|
||
├── pyproject.toml # uv 依赖管理
|
||
└── .env # 环境变量
|
||
```
|
||
|
||
### 4.3 编码规范
|
||
|
||
- **路由定义**: 使用 `APIRouter` 分散管理路由,不要全部写在 `main.py`。
|
||
- **错误处理**: 使用 `HTTPException` 抛出标准 HTTP 错误。
|
||
- **配置管理**: 所有配置项(数据库 URL、密钥等)必须从环境变量或 `core/config.py` 读取。
|
||
|
||
### 4.4 错误信息与本地化
|
||
|
||
- **后端接口返回的错误信息必须为中文**,统一由后端产生,不由前端拼接或翻译。
|
||
- 错误示例(`HTTPException.detail` 字段):
|
||
- 登录失败:`用户名或密码错误`(401)
|
||
- 注册失败(密码不一致):`两次输入的密码不一致`(400)
|
||
- 注册失败(用户名占用):`用户名已被注册`(400)
|
||
- 单设备限制:`该账号已在其他设备在线`(403)
|
||
- 用户不存在:`用户不存在`(404)
|
||
- 前端显示层可以自行决定文案风格,但不得修改后端错误语义;建议原样展示或在 UI 上补充说明。
|
||
|
||
### 4.5 登录并发与在线时长
|
||
|
||
- **单设备同时在线限制**:后端基于 `device_id` 限制同账号仅允许一个设备在线;若另一设备尝试登录,返回 403 `该账号已在其他设备在线`。
|
||
- **会话记录**:后端在登录时记录 `login_at`,在登出时记录 `logout_at` 并计算在线时长 `duration_seconds`(秒)。
|
||
- **时长统计接口**:`GET /api/v1/auth/online-time/{username}` 返回该用户历史累计在线时长(秒)与当前活跃会话的实时在线时长(秒)。
|
||
- **前端约定**:登录时必须传入稳定的 `device_id`;登出时调用 `POST /api/v1/auth/logout` 释放会话,保证统计准确。
|
||
|
||
### 4.6 HTTP 接口交互与错误码规范
|
||
|
||
#### 1. 请求方法 (HTTP Methods)
|
||
|
||
- **GET (Get Request)**
|
||
|
||
- **用途**: 仅用于**获取/查询数据**。
|
||
- **特点**: 安全且幂等(多次请求结果一致),参数通常拼接在 URL Query 中。
|
||
- **场景**: 获取用户列表、查询订单详情。
|
||
|
||
- **POST (Post Request)**
|
||
|
||
- **用途**: 用于**创建新资源**、**提交表单**或**执行非幂等操作**。
|
||
- **特点**: 数据放在 Body 中,支持大数据量,安全性高于 GET。
|
||
- **场景**: 用户注册、登录、上传文件、合并图层。
|
||
|
||
- **PUT (Put Request)**
|
||
|
||
- **用途**: 用于**全量更新**资源。
|
||
- **特点**: 幂等操作。通常需要提供被更新资源的全部字段,未提供的字段可能被置空。
|
||
- **场景**: 覆盖保存用户个人信息(包含所有字段)。
|
||
|
||
- **PATCH (Patch Request)**
|
||
|
||
- **用途**: 用于**局部更新**资源。
|
||
- **特点**: 仅发送需要修改的字段,未发送的字段保持原样。
|
||
- **场景**: 仅修改用户的“昵称”或“头像”,而不影响其他信息。
|
||
|
||
- **DELETE (Delete Request)**
|
||
|
||
- **用途**: 用于**删除资源**。
|
||
- **特点**: 幂等操作。
|
||
- **场景**: 删除订单、注销账号。
|
||
|
||
- **OPTIONS (Options Request)**
|
||
|
||
- **用途**: **预检请求 (Pre-flight)**。
|
||
- **特点**: 浏览器在跨域请求 (CORS) 前自动发起,用于询问服务器支持哪些方法和 Header。
|
||
- **场景**: 本地开发环境调用远程 API 时的跨域检查。
|
||
|
||
- **HEAD (Head Request)**
|
||
- **用途**: 获取资源的元信息(Headers),但不返回 Body。
|
||
- **特点**: 速度快,用于检查资源是否存在或是否有更新。
|
||
- **场景**: 检查大文件下载链接是否有效、检查文件最后修改时间。
|
||
|
||
#### 2. 状态码规范 (Status Codes)
|
||
|
||
所有接口应遵循标准 HTTP 状态码,结合业务错误码 (`code`) 使用。
|
||
|
||
| 状态码 | 含义 | 常见场景 |
|
||
| :------ | :-------------------- | :----------------------------------------------------------------------------- |
|
||
| **200** | OK | 请求成功,业务逻辑执行完成。 |
|
||
| **400** | Bad Request | **客户端错误**。通常是参数缺失、格式错误或业务逻辑校验失败(如“密码不一致”)。 |
|
||
| **401** | Unauthorized | **未授权**。Token 无效、过期或未登录。前端应跳转至登录页。 |
|
||
| **403** | Forbidden | **禁止访问**。已登录但权限不足,或账号被在其他设备挤下线。 |
|
||
| **404** | Not Found | 请求的资源(用户、订单等)不存在。 |
|
||
| **500** | Internal Server Error | **服务器内部错误**。代码崩溃或数据库连接失败,需联系后端排查。 |
|
||
|
||
### 4.7 配置管理与可配置化原则 ⭐⭐⭐(核心)
|
||
|
||
#### 1. 统一配置管理
|
||
|
||
- ❌ **严禁硬编码**:所有路径地址、数据库连接字符串、API 请求地址、密钥等敏感或可变信息,禁止直接写在代码中。
|
||
- ✅ **集中管理**:
|
||
- 后端:必须使用环境变量 (`.env`) 或 `app/core/config.py` 进行管理。
|
||
- 前端/客户端:必须使用 `.env` 文件或专门的 `config.ts` 模块。
|
||
- 工具脚本:必须在脚本头部定义常量或读取外部配置文件。
|
||
|
||
#### 2. 业务配置可配置化原则 ⭐
|
||
|
||
> **目标**:本项目将分销给其他用户,所有业务配置必须可通过管理后台动态修改,不得写死在代码中。
|
||
|
||
##### 2.1 **必须可配置的业务规则**
|
||
|
||
| 配置项 | 存储位置 | 说明 |
|
||
| ------------------ | ------------------------- | ----------------------------------- |
|
||
| **功能积分消耗** | `features_config` 表 | 每个功能的积分价格(普通/VIP/SVIP) |
|
||
| **VIP 价格与权益** | `vip_config` 表 | VIP 套餐价格、每日配额、签到倍数 |
|
||
| **签到奖励规则** | `check_in_config` 表 | 连续签到天数对应的积分奖励 |
|
||
| **功能开关** | `features_config.enabled` | 动态启用/禁用功能 |
|
||
|
||
##### 2.2 **配置存储规范**
|
||
|
||
- ✅ **数据库存储**:所有可变业务配置必须存储在数据库表中
|
||
- ✅ **管理后台可视化**:必须在 AdminTool 提供可视化编辑界面
|
||
- ✅ **实时生效**:配置修改后无需重启服务,立即生效
|
||
- ❌ **禁止硬编码**:禁止在代码中写死任何业务规则(如 `if consecutive_days == 7: bonus = 20`)
|
||
|
||
##### 2.3 **配置修改流程**
|
||
|
||
```
|
||
分销商/运营人员
|
||
↓
|
||
AdminTool 管理后台(可视化界面)
|
||
↓
|
||
后端 API (`/api/v1/admin/config`)
|
||
↓
|
||
数据库表(features_config / vip_config / check_in_config)
|
||
↓
|
||
前端/插件读取(实时生效)
|
||
```
|
||
|
||
##### 2.4 **示例:正确 vs 错误**
|
||
|
||
**❌ 错误示例(硬编码):**
|
||
|
||
```python
|
||
# 错误:写死在代码里
|
||
def calculate_bonus(consecutive_days):
|
||
if consecutive_days == 7:
|
||
return 20 # 硬编码
|
||
elif consecutive_days == 15:
|
||
return 50 # 硬编码
|
||
return 0
|
||
```
|
||
|
||
**✅ 正确示例(可配置):**
|
||
|
||
```python
|
||
# 正确:从配置表读取
|
||
def calculate_bonus(consecutive_days):
|
||
config = get_checkin_config(consecutive_days) # 从数据库读取
|
||
return config.bonus_points
|
||
```
|
||
|
||
##### 2.5 **管理后台要求**
|
||
|
||
- ✅ 必须在 `AdminTool/admin_gui.py` 中实现配置管理界面
|
||
- ✅ 必须使用表格/表单展示配置项
|
||
- ✅ 必须提供「新增/编辑/删除」操作
|
||
- ✅ 必须提供「保存/刷新」按钮
|
||
- ✅ 必须有操作确认提示
|
||
|
||
#### 3. 代码规模限制
|
||
|
||
- ❌ **严禁"巨型文件"**:单个代码文件(`.py`, `.ts`, `.vue` 等)的行数 **不得超过 500 行**。
|
||
- ✅ **拆分重构**:
|
||
- 一旦文件接近 500 行,必须立即进行拆分。
|
||
- 将逻辑提取为独立的 Service、Utility 函数、Composable Hook 或子组件。
|
||
- 保持代码的"高内聚、低耦合"。
|
||
|
||
---
|
||
|
||
## 5. Git 提交规范
|
||
|
||
请遵循 **Conventional Commits** 规范:
|
||
|
||
- `feat`: 新增功能
|
||
- `fix`: 修复 Bug
|
||
- `docs`: 文档变更
|
||
- `style`: 代码格式调整(不影响逻辑)
|
||
- `refactor`: 代码重构
|
||
- `chore`: 构建工具或依赖变更
|
||
|
||
**示例**: `feat: 增加PS图层自动重命名功能`
|
||
|
||
---
|
||
|
||
## 5. 调试与构建
|
||
|
||
- **开发模式**: `npm run dev` (在浏览器预览 UI)
|
||
- **构建**: `npm run build`
|
||
- **CEP 调试**: 在 Photoshop 中加载扩展,访问 `http://localhost:XXXX` 进行 Chrome DevTools 调试 UI。
|
||
|
||
---
|
||
|
||
## 6. 项目架构与工作流 (2025 重构版)
|
||
|
||
经过 2025 年底的深度重构,项目采用了高效的 **"壳(Shell) + 核(Core)"** 架构:
|
||
|
||
### 6.1 核心模块分工
|
||
|
||
| 模块 | 目录 | 类型 | 职责 |
|
||
| :------------- | :------------------------------- | :------------------ | :--------------------------------------------------------------------------------------------- |
|
||
| **Designer** | `d:\main\DesignerCEP\Designer` | **核心业务 (Core)** | 包含所有设计工具、UI 界面和业务逻辑。开发时的主要工作区。 |
|
||
| **AdminPanel** | `d:\main\DesignerCEP\AdminPanel` | **加载壳 (Shell)** | 一个轻量级的 CEP 容器,负责在 PS 中运行。它不包含业务代码,只负责通过 `iframe` 加载 Designer。 |
|
||
| **Server** | `d:\main\DesignerCEP\Server` | **后端 (API)** | 基于 FastAPI 的数据接口服务,含 AI 模型调用层(Qwen/Gemini 双路由)。 |
|
||
| **AdminTool** | `d:\main\DesignerCEP\AdminTool` | **运维工具** | 负责自动化部署、版本管理和配置修改的 Python GUI 工具。 |
|
||
|
||
### 6.2 开发流程 (Dev Workflow)
|
||
|
||
1. **启动后端** (可选,如需 API):
|
||
|
||
```bash
|
||
cd Server
|
||
uvicorn app.main:app --reload --host 0.0.0.0 --port 8000
|
||
```
|
||
|
||
2. **启动前端核心**:
|
||
|
||
```bash
|
||
cd Designer
|
||
npm run dev
|
||
# 运行在 http://localhost:5173
|
||
```
|
||
|
||
3. **在 PS 中调试**:
|
||
- 打开 Photoshop。
|
||
- 启动 **AdminPanel** 扩展。
|
||
- **智能连接**: AdminPanel 会自动检测环境。开发模式下,它会自动加载 `http://localhost:5173`,实现**热更新**。
|
||
|
||
### 6.3 生产发布 (Production)
|
||
|
||
1. **构建核心**:
|
||
|
||
```bash
|
||
cd Designer
|
||
npm run build
|
||
# 产物输出到 dist_core
|
||
```
|
||
|
||
2. **部署**:
|
||
- 使用 **AdminTool** 将 `dist_core` 上传到服务器。
|
||
- 生产环境的 AdminPanel 会自动加载服务器地址 (`https://app.aidg168.uk`)。
|
||
|
||
### 6.4 目录清理说明
|
||
|
||
- **冗余移除**: 所有旧的测试脚本、文档草稿、`dist` 目录、`buildLauncher` 脚本等均已移至 `temp_backup`。
|
||
- **配置收敛**: Designer 仅保留 `cep.config.ts`,移除了重复的 dev/prod 配置。
|