newrun
@@ -1,122 +1,49 @@
|
||||
<template>
|
||||
<div class="home-view">
|
||||
<header class="header">
|
||||
<h1>Designer 管理后台</h1>
|
||||
<p class="subtitle">集成开发与资源管理中心</p>
|
||||
</header>
|
||||
|
||||
<div class="card-grid">
|
||||
<div class="card" @click="goToIframe">
|
||||
<div class="icon">🌐</div>
|
||||
<h3>外部预览</h3>
|
||||
<p>嵌入式浏览器页面查看</p>
|
||||
</div>
|
||||
|
||||
<div class="card" @click="toggleTheme">
|
||||
<div class="icon">{{ isDark ? '🌙' : '☀️' }}</div>
|
||||
<h3>主题切换</h3>
|
||||
<p>当前: {{ isDark ? '深色模式' : '浅色模式' }}</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="status-panel">
|
||||
<h3>系统状态</h3>
|
||||
<div class="status-item">
|
||||
<span>版本:</span>
|
||||
<code>{{ version }}</code>
|
||||
</div>
|
||||
<div class="status-item">
|
||||
<span>运行模式:</span>
|
||||
<span class="badge" :class="{ dev: isDev }">{{ isDev ? '开发模式' : '生产模式' }}</span>
|
||||
</div>
|
||||
<div class="loading-container">
|
||||
<div class="spinner"></div>
|
||||
<p>正在加载 Designer...</p>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script setup lang="ts">
|
||||
import { onMounted } from 'vue'
|
||||
import { useRouter } from 'vue-router'
|
||||
import { useTheme } from '@/hooks/useTheme'
|
||||
|
||||
const router = useRouter()
|
||||
const { isDark, toggleTheme } = useTheme()
|
||||
|
||||
const version = __VERSION__
|
||||
const isDev = __DEV__
|
||||
|
||||
const goToIframe = () => {
|
||||
router.push('/iframe')
|
||||
}
|
||||
onMounted(() => {
|
||||
// 自动跳转到 Iframe 页面
|
||||
router.replace('/iframe')
|
||||
})
|
||||
</script>
|
||||
|
||||
<style scoped>
|
||||
.home-view {
|
||||
padding: 24px;
|
||||
height: 100vh;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 32px;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
background-color: #1e1e1e; /* PS 默认深色背景 */
|
||||
color: #ffffff;
|
||||
}
|
||||
|
||||
.header h1 {
|
||||
margin: 0;
|
||||
font-size: 24px;
|
||||
background: linear-gradient(90deg, #4facfe 0%, #00f2fe 100%);
|
||||
-webkit-background-clip: text;
|
||||
-webkit-text-fill-color: transparent;
|
||||
}
|
||||
|
||||
.subtitle {
|
||||
margin: 10px 0 0;
|
||||
opacity: 0.6;
|
||||
}
|
||||
|
||||
.card-grid {
|
||||
display: grid;
|
||||
grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
|
||||
gap: 20px;
|
||||
}
|
||||
|
||||
.card {
|
||||
background: rgba(255, 255, 255, 0.05);
|
||||
border: 1px solid rgba(255, 255, 255, 0.1);
|
||||
border-radius: 12px;
|
||||
padding: 24px;
|
||||
cursor: pointer;
|
||||
transition: all 0.3s ease;
|
||||
.loading-container {
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.card:hover {
|
||||
background: rgba(255, 255, 255, 0.1);
|
||||
transform: translateY(-4px);
|
||||
border-color: #4facfe;
|
||||
.spinner {
|
||||
width: 40px;
|
||||
height: 40px;
|
||||
border: 4px solid rgba(255, 255, 255, 0.1);
|
||||
border-left-color: #0078d7;
|
||||
border-radius: 50%;
|
||||
animation: spin 1s linear infinite;
|
||||
margin: 0 auto 16px;
|
||||
}
|
||||
|
||||
.icon {
|
||||
font-size: 32px;
|
||||
margin-bottom: 12px;
|
||||
}
|
||||
|
||||
.status-panel {
|
||||
background: rgba(0, 0, 0, 0.2);
|
||||
border-radius: 8px;
|
||||
padding: 16px;
|
||||
}
|
||||
|
||||
.status-item {
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
margin-bottom: 8px;
|
||||
font-family: monospace;
|
||||
}
|
||||
|
||||
.badge {
|
||||
padding: 2px 8px;
|
||||
border-radius: 4px;
|
||||
font-size: 12px;
|
||||
}
|
||||
|
||||
.badge.dev {
|
||||
background: #f39c12;
|
||||
color: #000;
|
||||
@keyframes spin {
|
||||
to { transform: rotate(360deg); }
|
||||
}
|
||||
</style>
|
||||
|
||||
@@ -44,8 +44,11 @@ const frameRef = ref<HTMLIFrameElement | null>(null)
|
||||
const loading = ref(true)
|
||||
|
||||
const currentUrl = ref(
|
||||
// localStorage.getItem('adminPanelUrl') || 'https://app.aidg168.uk'
|
||||
localStorage.getItem('adminPanelUrl') || 'http://localhost:5173/#/login'
|
||||
localStorage.getItem('adminPanelUrl') || (
|
||||
__DEV__
|
||||
? 'http://localhost:5173'
|
||||
: 'https://app.aidg168.uk'
|
||||
)
|
||||
)
|
||||
|
||||
function goBack() {
|
||||
|
||||
@@ -79,23 +79,24 @@ if IS_DEV:
|
||||
app.mount("/download", StaticFiles(directory="archives"), name="download")
|
||||
|
||||
# Mount Shell directory (登录页面)
|
||||
shell_dir = Path(__file__).parent.parent / "Designer"
|
||||
if shell_dir.exists():
|
||||
app.mount("/shell", StaticFiles(directory=str(shell_dir), html=True), name="shell")
|
||||
print(f"✓ Shell 已挂载 (Dev): {shell_dir}")
|
||||
else:
|
||||
print(f"⚠️ Shell 目录不存在: {shell_dir}")
|
||||
print(" 请先运行: cd Designer && npm run build:shell")
|
||||
# shell_dir = Path(__file__).parent.parent / "Designer"
|
||||
# if shell_dir.exists():
|
||||
# app.mount("/shell", StaticFiles(directory=str(shell_dir), html=True), name="shell")
|
||||
# print(f"✓ Shell 已挂载 (Dev): {shell_dir}")
|
||||
# else:
|
||||
# # print(f"⚠️ Shell 目录不存在: {shell_dir}")
|
||||
# # print(" 请先运行: cd Designer && npm run build:shell")
|
||||
# pass
|
||||
|
||||
# Mount DesignerCache directory to serve Core application files
|
||||
designer_cache = Path.home() / "AppData" / "Roaming" / "DesignerCache"
|
||||
if designer_cache.exists():
|
||||
app.mount("/core", StaticFiles(directory=str(designer_cache), html=True), name="core")
|
||||
print(f"✓ Core 已挂载 (Dev): {designer_cache}")
|
||||
else:
|
||||
# Create directory if it doesn't exist
|
||||
designer_cache.mkdir(parents=True, exist_ok=True)
|
||||
app.mount("/core", StaticFiles(directory=str(designer_cache), html=True), name="core")
|
||||
# designer_cache = Path.home() / "AppData" / "Roaming" / "DesignerCache"
|
||||
# if designer_cache.exists():
|
||||
# app.mount("/core", StaticFiles(directory=str(designer_cache), html=True), name="core")
|
||||
# print(f"✓ Core 已挂载 (Dev): {designer_cache}")
|
||||
# else:
|
||||
# # Create directory if it doesn't exist
|
||||
# designer_cache.mkdir(parents=True, exist_ok=True)
|
||||
# app.mount("/core", StaticFiles(directory=str(designer_cache), html=True), name="core")
|
||||
else:
|
||||
print("ℹ️ Production Mode: Static files are NOT mounted by FastAPI (handled by Caddy/Nginx).")
|
||||
|
||||
|
||||
|
Before Width: | Height: | Size: 475 B After Width: | Height: | Size: 475 B |
|
Before Width: | Height: | Size: 846 B After Width: | Height: | Size: 846 B |
|
Before Width: | Height: | Size: 1.2 KiB After Width: | Height: | Size: 1.2 KiB |
|
Before Width: | Height: | Size: 1.6 KiB After Width: | Height: | Size: 1.6 KiB |
|
Before Width: | Height: | Size: 475 B After Width: | Height: | Size: 475 B |
|
Before Width: | Height: | Size: 846 B After Width: | Height: | Size: 846 B |
|
Before Width: | Height: | Size: 1.2 KiB After Width: | Height: | Size: 1.2 KiB |
|
Before Width: | Height: | Size: 1.6 KiB After Width: | Height: | Size: 1.6 KiB |
61
temp_backup/Designer_redundant/dev.cep.config.ts
Normal file
@@ -0,0 +1,61 @@
|
||||
import { ICepConfig } from "@/plugins";
|
||||
|
||||
const config: ICepConfig = {
|
||||
"name": "cep-super-edition",
|
||||
"id": "com.cep-super-edition",
|
||||
"version": "0.0.1",
|
||||
"extensionVersion": "6.1.0",
|
||||
"requiredRuntimeVersion": "8.0",
|
||||
"type": "Panel",
|
||||
"parameters": [
|
||||
"--enable-nodejs"
|
||||
],
|
||||
"panels": [
|
||||
{
|
||||
"name": "cepName",
|
||||
"displayName": "超级套版",
|
||||
"main": "./index.html",
|
||||
"width": 400,
|
||||
"height": 300,
|
||||
"minWidth": 400,
|
||||
"minHeight": 300,
|
||||
"maxWidth": 4000,
|
||||
"maxHeight": 3000
|
||||
}
|
||||
],
|
||||
"hosts": [
|
||||
{
|
||||
"name": "AEFT",
|
||||
"version": "[0.0,99.9]"
|
||||
},
|
||||
{
|
||||
"name": "PPRO",
|
||||
"version": "[0.0,99.9]"
|
||||
},
|
||||
{
|
||||
"name": "ILST",
|
||||
"version": "[0.0,99.9]"
|
||||
},
|
||||
{
|
||||
"name": "PHXS",
|
||||
"version": "[0.0,99.9]"
|
||||
},
|
||||
{
|
||||
"name": "FLPR",
|
||||
"version": "[0.0,99.9]"
|
||||
}
|
||||
],
|
||||
"build": {
|
||||
"jsxBin": false,
|
||||
"country": "CN",
|
||||
"province": "GD",
|
||||
"org": "你的公司名称",
|
||||
"password": "",
|
||||
"tsa": ""
|
||||
},
|
||||
"zxp": {
|
||||
"jsxBin": false
|
||||
}
|
||||
}
|
||||
|
||||
export default config;
|
||||
179
temp_backup/Designer_redundant/docs/CEP插件UI适配指南.md
Normal file
@@ -0,0 +1,179 @@
|
||||
# 🎨 CEP 插件 UI 适配完全指南
|
||||
|
||||
> **目标**:将网页版 UI 完美重构为 Adobe CEP 插件原生体验,对标行业顶尖竞品。
|
||||
|
||||
## 📋 目录
|
||||
|
||||
- [核心约束](#-核心约束)
|
||||
- [问题诊断](#-问题诊断)
|
||||
- [UI 重构方案](#-ui-重构方案)
|
||||
- [样式系统 (Design System)](#-样式系统-design-system)
|
||||
- [实施路线图](#-实施路线图)
|
||||
- [验收标准](#-验收标准)
|
||||
|
||||
---
|
||||
|
||||
## <20> 核心约束
|
||||
|
||||
> [!IMPORTANT] > **CEP 插件的黄金法则**:
|
||||
> 能够在 **280px** 宽度的面板中完整显示所有核心功能,且无需横向滚动。
|
||||
|
||||
### 尺寸规范 (Manifest.xml)
|
||||
|
||||
| 属性 | 值 | 说明 |
|
||||
| :----------- | :--------------- | :------------------------- |
|
||||
| **默认尺寸** | `280px × 600px` | 最小可用状态 |
|
||||
| **最小尺寸** | `280px × 600px` | 锁死最小宽度,防止布局崩坏 |
|
||||
| **最大尺寸** | `600px × 4080px` | 允许垂直方向无限延伸 |
|
||||
|
||||
---
|
||||
|
||||
## 🔍 问题诊断
|
||||
|
||||
我们在将 Web UI 移植到 CEP 环境时,面临以下主要适配挑战:
|
||||
|
||||
```mermaid
|
||||
graph TD
|
||||
A[Web UI (1200px+)] -->|❌ 侧边栏过宽| B(180px Nav)
|
||||
A -->|❌ 网格松散| C(Card Layout)
|
||||
A -->|❌ 组件巨大| D(Large Buttons/Inputs)
|
||||
|
||||
B --> E[CEP Environment (280px)]
|
||||
C --> E
|
||||
D --> E
|
||||
|
||||
E -->|导致| F[⚠️ 横向滚动条]
|
||||
E -->|导致| G[⚠️ 内容被截断]
|
||||
E -->|导致| H[⚠️ 操作效率低]
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🛠 UI 重构方案
|
||||
|
||||
### 1. 导航栏 (Navigation)
|
||||
|
||||
**现状**:`180px` 宽度的侧边栏在 `280px` 的面板中占据了 64% 的空间。
|
||||
**方案**:采用 **图标栏 (Icon Bar)** 模式。
|
||||
|
||||
| 调整项 | Web 版 | CEP 适配版 |
|
||||
| :------- | :----------- | :-------------------------- |
|
||||
| **模式** | 展开式侧边栏 | 收缩式图标栏 |
|
||||
| **宽度** | `180px` | `40px` |
|
||||
| **标签** | 文字 + 图标 | 仅图标 (Hover 显示 Tooltip) |
|
||||
|
||||
### 2. 信息卡片 (Info Cards)
|
||||
|
||||
**现状**:卡片布局在窄屏下挤压严重。
|
||||
**方案**:**CSS Grid 自适应紧凑布局**。
|
||||
|
||||
> [!TIP]
|
||||
> 使用 `grid-template-columns: repeat(3, 1fr)` 确保在 280px 宽度下也能整齐排列。
|
||||
|
||||
**代码对比**:
|
||||
|
||||
```vue
|
||||
<!-- ✅ 推荐写法 -->
|
||||
<div class="cep-info-grid">
|
||||
<div class="info-card">
|
||||
<div class="card-icon">⚡</div>
|
||||
<div class="card-data">
|
||||
<span class="label">积分</span>
|
||||
<span class="value">{{ points }}</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
```
|
||||
|
||||
### 3. 功能入口 (Feature Grid)
|
||||
|
||||
**现状**:每个功能占据大块面积,包含描述文字。
|
||||
**方案**:**应用抽屉风格 (App Drawer)**,仅保留图标和名称。
|
||||
|
||||
- **移除**:详细的功能描述文本。
|
||||
- **缩小**:图标尺寸从 `32px` -> `24px`。
|
||||
- **布局**:使用 `repeat(auto-fill, minmax(70px, 1fr))` 实现自动换行。
|
||||
|
||||
---
|
||||
|
||||
## 🎨 样式系统 (Design System)
|
||||
|
||||
为了让插件看起来像原生 PS 功能,我们需要覆盖 Arco Design 的默认样式。
|
||||
|
||||
> [!NOTE]
|
||||
> 请在 `src/style/` 下创建 `cep-override.css` 并全局引入。
|
||||
|
||||
### 全局样式重写 (`cep-override.css`)
|
||||
|
||||
```css
|
||||
:root {
|
||||
/* 定义紧凑型尺寸变量 */
|
||||
--cep-padding-base: 8px;
|
||||
--cep-font-size-base: 12px;
|
||||
--cep-btn-height: 28px;
|
||||
}
|
||||
|
||||
/* 🟢 按钮微型化 */
|
||||
.arco-btn {
|
||||
height: var(--cep-btn-height) !important;
|
||||
padding: 0 12px !important;
|
||||
font-size: var(--cep-font-size-base) !important;
|
||||
border-radius: 2px !important; /* PS 风格通常更方正 */
|
||||
}
|
||||
|
||||
/* 🟢 输入框紧凑化 */
|
||||
.arco-input-wrapper {
|
||||
height: var(--cep-btn-height) !important;
|
||||
padding: 0 8px !important;
|
||||
}
|
||||
|
||||
/* 🟢 滚动条美化 (原生风格) */
|
||||
::-webkit-scrollbar {
|
||||
width: 4px; /* 极细滚动条 */
|
||||
background: transparent;
|
||||
}
|
||||
::-webkit-scrollbar-thumb {
|
||||
background: #505050;
|
||||
border-radius: 2px;
|
||||
}
|
||||
::-webkit-scrollbar-thumb:hover {
|
||||
background: #6e6e6e;
|
||||
}
|
||||
|
||||
/* 🟢 卡片与容器 */
|
||||
.cep-container {
|
||||
padding: var(--cep-padding-base);
|
||||
}
|
||||
.arco-card-body {
|
||||
padding: 8px !important;
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## <20> 实施路线图
|
||||
|
||||
1. **配置 manifest**
|
||||
- 修改 `manifest.xml` 中的 geometry 配置,锁定最小宽度。
|
||||
2. **样式注入**
|
||||
- 创建并引入 `cep-override.css`。
|
||||
3. **组件改造**
|
||||
- **Home.vue**: 将 Sider `width` 设为 40,`collapsed` 设为 true。
|
||||
- **HomePage.vue**: 重写 Grid 布局,移除多余文字描述,使用紧凑型 Icon。
|
||||
4. **响应式测试**
|
||||
- 在浏览器中将视口宽度调整为 `280px` 进行极限测试。
|
||||
|
||||
---
|
||||
|
||||
## ✅ 验收标准 (Checklist)
|
||||
|
||||
请逐项核对以确保完美交付:
|
||||
|
||||
- [ ] **宽度测试**:在 280px 宽度下,无横向滚动条。
|
||||
- [ ] **侧边栏**:宽度严格控制在 40px 以内。
|
||||
- [ ] **字体**:正文不大于 12px,标题不大于 14px。
|
||||
- [ ] **按钮**:高度不大于 28px (Small/Mini 尺寸)。
|
||||
- [ ] **深色模式**:背景色与 PS 界面融合 (通常为 `#323232` 或 `#535353`)。
|
||||
- [ ] **交互**:所有点击区域即使在小尺寸下也易于点击 (增加热区 padding 不增加视觉 margin)。
|
||||
|
||||
> [!WARNING] > **切记**:CEP 插件是工具属性极强的应用,**效率**高于**装饰**。尽量减少无用的留白和装饰性元素。
|
||||
164
temp_backup/Designer_redundant/docs/CEP适配完成说明.md
Normal file
@@ -0,0 +1,164 @@
|
||||
# ✅ CEP 插件 UI 适配完成说明
|
||||
|
||||
## 🎯 完成的工作
|
||||
|
||||
### 1. **面板尺寸配置** ✅
|
||||
已统一为竞品标准(图牛助理2.0):
|
||||
|
||||
```
|
||||
所有配置文件已更新:
|
||||
├── cep.config.ts ✅ 280px × 600px
|
||||
├── dev.cep.config.ts ✅ 280px × 600px
|
||||
└── prod.cep.config.ts ✅ 280px × 600px
|
||||
```
|
||||
|
||||
### 2. **全局样式系统** ✅
|
||||
|
||||
创建了两个全局样式文件:
|
||||
|
||||
#### `src/style/cep-arco-override.css` - Arco Design 组件覆盖
|
||||
```css
|
||||
自动调整所有 Arco 组件:
|
||||
- Button: 28px 高度(小按钮 24px)
|
||||
- Input: 28px 高度
|
||||
- Card: 8px 内边距
|
||||
- 字体: 12px 正文,10px 辅助文字
|
||||
- 图标: 14-24px
|
||||
- 间距: 4-16px 紧凑系统
|
||||
```
|
||||
|
||||
#### `src/style/cep-pages.css` - 页面布局样式
|
||||
```css
|
||||
专门优化的页面:
|
||||
- Home.vue: 40px 侧边栏(仅图标)
|
||||
- HomePage.vue: 紧凑信息卡片 + 功能网格
|
||||
- Profile.vue: 2列统计网格
|
||||
- CheckIn.vue: 紧凑签到日历
|
||||
```
|
||||
|
||||
### 3. **已调整的组件** ✅
|
||||
|
||||
#### Home.vue 主容器
|
||||
```diff
|
||||
- 侧边栏宽度: 180px
|
||||
+ 侧边栏宽度: 40px(仅图标)
|
||||
|
||||
- 可折叠展开
|
||||
+ 固定折叠(节省空间)
|
||||
|
||||
- 显示菜单文字
|
||||
+ 仅显示图标
|
||||
```
|
||||
|
||||
#### HomePage.vue 首页
|
||||
```diff
|
||||
信息卡片:
|
||||
- gutter: 16
|
||||
+ gutter: 8(紧凑间距)
|
||||
|
||||
- 标题: "剩余积分"
|
||||
+ 标题: "积分"(简化文字)
|
||||
|
||||
- 图标大小: 默认
|
||||
+ 图标大小: 14px
|
||||
|
||||
快捷按钮:
|
||||
- size="large"
|
||||
+ size="default"(28px)
|
||||
|
||||
- 文字: "每日签到"
|
||||
+ 文字: "签到"(简化)
|
||||
```
|
||||
|
||||
### 4. **引入方式** ✅
|
||||
|
||||
在 `src/main.ts` 中自动引入:
|
||||
```typescript
|
||||
import '@arco-design/web-vue/dist/arco.css';
|
||||
import './style/cep-arco-override.css'; // ⭐ 全局覆盖
|
||||
import './style/cep-pages.css'; // ⭐ 页面样式
|
||||
```
|
||||
|
||||
## 🎨 UI框架信息
|
||||
|
||||
- **组件库**: Arco Design Vue 2.57.0(字节跳动)
|
||||
- **核心框架**: Vue 3 + TypeScript
|
||||
- **构建工具**: Vite
|
||||
- **路由**: Vue Router 4
|
||||
|
||||
## 📐 适配效果
|
||||
|
||||
### 尺寸对比
|
||||
|
||||
| 元素 | 网页版 | CEP版 | 优化 |
|
||||
|------|--------|-------|------|
|
||||
| 面板宽度 | - | 280px | ✅ |
|
||||
| 侧边栏 | 180px | 40px | ✅ 节省 140px |
|
||||
| 按钮高度 | 40px | 28px | ✅ |
|
||||
| 卡片间距 | 16px | 8px | ✅ |
|
||||
| 字体大小 | 14px | 12px | ✅ |
|
||||
| 图标 | 24px | 14-20px | ✅ |
|
||||
|
||||
### 响应式网格
|
||||
|
||||
```css
|
||||
功能网格自动适配:
|
||||
- 窄面板 (<300px): 2列
|
||||
- 标准面板 (300-350px): 3列 ⭐ 默认
|
||||
- 宽面板 (>350px): 4列
|
||||
```
|
||||
|
||||
## 🧪 测试方法
|
||||
|
||||
### 方法1: 浏览器测试
|
||||
```bash
|
||||
cd Designer
|
||||
npm run dev
|
||||
```
|
||||
在浏览器中打开,按 F12 开发者工具:
|
||||
- 设置设备工具栏(Ctrl+Shift+M)
|
||||
- 自定义宽度: 280px
|
||||
- 测试滚动和交互
|
||||
|
||||
### 方法2: Photoshop 测试
|
||||
```bash
|
||||
npm run build
|
||||
```
|
||||
在 PS 中加载插件,查看实际效果。
|
||||
|
||||
## 📋 全局样式变量参考
|
||||
|
||||
```css
|
||||
/* 在组件中使用这些变量 */
|
||||
.my-component {
|
||||
padding: var(--cep-spacing-md); /* 8px */
|
||||
font-size: var(--cep-font-base); /* 12px */
|
||||
height: var(--cep-button-height); /* 28px */
|
||||
}
|
||||
|
||||
/* 或使用工具类 */
|
||||
<div class="cep-compact"> /* 自动应用紧凑间距 */
|
||||
<span class="cep-text-xs"> /* 10px 字体 */
|
||||
```
|
||||
|
||||
## ⚠️ 注意事项
|
||||
|
||||
1. **所有新组件**都会自动应用 CEP 样式(无需手动调整)
|
||||
2. **如果需要特殊尺寸**,在组件内用 `style` 覆盖
|
||||
3. **开发时**在浏览器中测试 280px 宽度
|
||||
4. **构建前**确保所有样式文件已保存
|
||||
|
||||
## 🚀 下一步
|
||||
|
||||
1. ✅ 面板尺寸已调整
|
||||
2. ✅ 全局样式已配置
|
||||
3. ✅ 主要组件已优化
|
||||
4. 📝 测试所有页面在 280px 宽度下的显示效果
|
||||
5. 📝 根据需要微调个别组件
|
||||
|
||||
---
|
||||
|
||||
**现在您的 Designer 插件已完美适配 CEP 环境!** 🎉
|
||||
|
||||
所有页面都会自动应用紧凑布局,无需逐个调整!
|
||||
|
||||
98
temp_backup/Designer_redundant/docs/core-publish-guide.md
Normal file
@@ -0,0 +1,98 @@
|
||||
# Core 应用发布流程
|
||||
|
||||
本文档描述如何构建和发布 Core 应用的新版本。
|
||||
|
||||
## 前置条件
|
||||
|
||||
- 后端服务器已运行
|
||||
- 已完成代码修改并测试
|
||||
|
||||
## 发布步骤
|
||||
|
||||
### 1. 构建 Core 应用
|
||||
|
||||
```powershell
|
||||
cd d:\main\DesignerCEP\Designer
|
||||
npm run build:core
|
||||
```
|
||||
|
||||
这会在 `dist_core/` 目录生成构建产物。
|
||||
|
||||
### 2. 重命名入口文件
|
||||
|
||||
构建后的入口文件是 `index-core.html`,需要重命名为 `index.html`:
|
||||
|
||||
```powershell
|
||||
Move-Item -Path ".\dist_core\index-core.html" -Destination ".\dist_core\index.html" -Force
|
||||
```
|
||||
|
||||
### 3. 打包为 ZIP
|
||||
|
||||
将版本号替换为新版本(如 `v1.0.4`):
|
||||
|
||||
```powershell
|
||||
$version = "v1.0.4"
|
||||
Compress-Archive -Path ".\dist_core\*" -DestinationPath "..\Server\archives\core-$version.zip" -Force
|
||||
```
|
||||
|
||||
### 4. 更新数据库
|
||||
|
||||
编辑 `Server/update_version.py`,将版本号改为新版本,然后运行:
|
||||
|
||||
```powershell
|
||||
cd d:\main\DesignerCEP\Server
|
||||
python update_version.py
|
||||
```
|
||||
|
||||
或者直接执行 SQL:
|
||||
|
||||
```sql
|
||||
UPDATE plugin_groups SET current_version_file='core-v1.0.4.zip' WHERE id=1;
|
||||
```
|
||||
|
||||
### 5. 清除客户端缓存(测试时)
|
||||
|
||||
用户端需要清除旧缓存才能下载新版本:
|
||||
|
||||
```powershell
|
||||
Remove-Item -Recurse -Force "$env:APPDATA\DesignerCache" -ErrorAction SilentlyContinue
|
||||
```
|
||||
|
||||
## 一键发布脚本
|
||||
|
||||
可以创建一个 PowerShell 脚本自动执行以上步骤:
|
||||
|
||||
```powershell
|
||||
# publish-core.ps1
|
||||
param([string]$version = "v1.0.0")
|
||||
|
||||
# 1. Build
|
||||
npm run build:core
|
||||
|
||||
# 2. Rename
|
||||
Move-Item -Path ".\dist_core\index-core.html" -Destination ".\dist_core\index.html" -Force
|
||||
|
||||
# 3. Package
|
||||
Compress-Archive -Path ".\dist_core\*" -DestinationPath "..\Server\archives\core-$version.zip" -Force
|
||||
|
||||
Write-Host "Created: core-$version.zip"
|
||||
Write-Host "Remember to update database: python update_version.py"
|
||||
```
|
||||
|
||||
使用方法:
|
||||
|
||||
```powershell
|
||||
.\publish-core.ps1 -version "v1.0.5"
|
||||
```
|
||||
|
||||
## 项目结构说明
|
||||
|
||||
| 路径 | 说明 |
|
||||
| :------------------------------ | :------------------- |
|
||||
| `Designer/index.html` | Shell 入口(登录页) |
|
||||
| `Designer/index-core.html` | Core 入口(主应用) |
|
||||
| `Designer/src/main.ts` | Core 应用入口点 |
|
||||
| `Designer/src/launcher/main.ts` | Shell 应用入口点 |
|
||||
| `Designer/dist_core/` | Core 构建输出 |
|
||||
| `Server/archives/` | ZIP 包存放目录 |
|
||||
| `Server/update_version.py` | 数据库版本更新脚本 |
|
||||
84
temp_backup/Designer_redundant/hybrid-demo.ts
Normal file
@@ -0,0 +1,84 @@
|
||||
/**
|
||||
* 混合方案 Demo - 简单版
|
||||
* 前端获取图层名称 → 后端计算 → 前端显示结果
|
||||
*/
|
||||
|
||||
import { evalInlineJSX, JSXResponse } from './utils';
|
||||
import { config } from '@/config';
|
||||
|
||||
/**
|
||||
* Demo:获取当前图层名称并计算
|
||||
*
|
||||
* 流程:
|
||||
* 1. 本地 → 获取当前图层名称(如 "87-98")
|
||||
* 2. 本地 → 发送到服务器
|
||||
* 3. 服务器 → 计算数学表达式(核心算法)
|
||||
* 4. 服务器 → 返回计算结果
|
||||
* 5. 本地 → 显示结果
|
||||
*/
|
||||
export async function calculateLayerName(): Promise<JSXResponse> {
|
||||
try {
|
||||
// 1. 💻 本地获取图层名称(简单 JSX)
|
||||
const jsx = `
|
||||
try {
|
||||
if (!$.global.JSXUtils.hasDocument()) {
|
||||
return $.global.JSXUtils.stringify({ error: '没有打开的文档' });
|
||||
}
|
||||
|
||||
var doc = $.global.JSXUtils.getDocument();
|
||||
|
||||
if (doc.activeLayer) {
|
||||
return $.global.JSXUtils.stringify({
|
||||
success: true,
|
||||
layerName: doc.activeLayer.name
|
||||
});
|
||||
} else {
|
||||
return $.global.JSXUtils.stringify({
|
||||
error: '没有选中的图层'
|
||||
});
|
||||
}
|
||||
} catch (error) {
|
||||
return $.global.JSXUtils.stringify({
|
||||
error: error.toString()
|
||||
});
|
||||
}
|
||||
`;
|
||||
|
||||
const layerResult = await evalInlineJSX(jsx);
|
||||
|
||||
if (layerResult.error || !layerResult.success) {
|
||||
return layerResult;
|
||||
}
|
||||
|
||||
const layerName = layerResult.layerName;
|
||||
|
||||
// 2. 🌐 发送到服务器计算(核心算法在服务器,使用 API Key 验证)
|
||||
const response = await fetch(`${config.apiBaseUrl}/jsx_demo/calculate`, {
|
||||
method: 'POST',
|
||||
headers: {
|
||||
'Content-Type': 'application/json',
|
||||
'X-API-Key': 'demo_key_123' // 🔐 API Key 验证
|
||||
},
|
||||
body: JSON.stringify({
|
||||
expression: layerName
|
||||
})
|
||||
});
|
||||
|
||||
if (!response.ok) {
|
||||
return { error: '服务器错误' };
|
||||
}
|
||||
|
||||
const calcResult = await response.json();
|
||||
|
||||
return {
|
||||
success: calcResult.success,
|
||||
expression: calcResult.expression,
|
||||
result: calcResult.result,
|
||||
message: calcResult.message,
|
||||
layerName: layerName
|
||||
};
|
||||
|
||||
} catch (error) {
|
||||
return { error: String(error) };
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,3 @@
|
||||
## 目录说明
|
||||
- cep 插件壳模板文件
|
||||
- cep.config.json 配置文件
|
||||
@@ -0,0 +1,65 @@
|
||||
import { ICepConfig } from "@plugins";
|
||||
|
||||
const config: ICepConfig = {
|
||||
name: "cepName",
|
||||
id: "com.cepName",
|
||||
version: "1.0.0",
|
||||
extensionVersion: "6.1.0",
|
||||
requiredRuntimeVersion: "9.0",
|
||||
type: "Panel",
|
||||
parameters: [
|
||||
"--enable-nodejs",
|
||||
],
|
||||
panels: [
|
||||
{
|
||||
name: "cepName",
|
||||
displayName: "panelName",
|
||||
main: "./index.html",
|
||||
width: 400,
|
||||
height: 300,
|
||||
minWidth: 400,
|
||||
minHeight: 300,
|
||||
maxWidth: 4000,
|
||||
maxHeight: 3000,
|
||||
}
|
||||
],
|
||||
hosts:[
|
||||
{
|
||||
name: "AEFT",
|
||||
version: "[0.0,99.9]",
|
||||
},
|
||||
{
|
||||
name: "PPRO",
|
||||
version: "[0.0,99.9]",
|
||||
},
|
||||
{
|
||||
name: "ILST",
|
||||
version: "[0.0,99.9]",
|
||||
},
|
||||
{
|
||||
name: "PHXS",
|
||||
version: "[0.0,99.9]",
|
||||
},
|
||||
{
|
||||
name: "FLPR",
|
||||
version: "[0.0,99.9]",
|
||||
},
|
||||
],
|
||||
build: {
|
||||
jsxBin: false,
|
||||
/**国家 */
|
||||
country: "CN",
|
||||
/**省份 */
|
||||
province: "GD",
|
||||
/**公司名称 */
|
||||
org: "你的公司名称",
|
||||
/**签名密码 */
|
||||
password: "",
|
||||
tsa: "",
|
||||
},
|
||||
zxp: {
|
||||
jsxBin: false
|
||||
}
|
||||
}
|
||||
|
||||
export default config;
|
||||
@@ -0,0 +1,23 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<ExtensionManifest xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" ExtensionBundleId="com.temp.id" ExtensionBundleVersion="1.0" Version="6.0"> <!-- MAJOR-VERSION-UPDATE-MARKER -->
|
||||
<ExtensionList>
|
||||
<Extension Id="com.temp.id" Version="6.1.0"/>
|
||||
</ExtensionList>
|
||||
<Geometry>
|
||||
<Size>
|
||||
<Height>600</Height>
|
||||
<Width>280</Width>
|
||||
</Size>
|
||||
<MaxSize>
|
||||
<Height>4080</Height>
|
||||
<Width>600</Width>
|
||||
</MaxSize>
|
||||
<MinSize>
|
||||
<Height>600</Height>
|
||||
<Width>280</Width>
|
||||
</MinSize>
|
||||
</Geometry>
|
||||
<DispatchInfoList>
|
||||
|
||||
</DispatchInfoList>
|
||||
</ExtensionManifest>
|
||||
|
After Width: | Height: | Size: 475 B |
|
After Width: | Height: | Size: 846 B |
|
After Width: | Height: | Size: 1.2 KiB |
|
After Width: | Height: | Size: 1.6 KiB |
|
After Width: | Height: | Size: 475 B |
|
After Width: | Height: | Size: 846 B |
|
After Width: | Height: | Size: 1.2 KiB |
|
After Width: | Height: | Size: 1.6 KiB |
@@ -0,0 +1,16 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>{{name}}</title>
|
||||
<script>
|
||||
window.location.href = "{{serverURL}}"
|
||||
</script>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
</body>
|
||||
</html>
|
||||
15
temp_backup/Designer_redundant/plugins_jsx_template/debug.ts
Normal file
@@ -0,0 +1,15 @@
|
||||
export function joinDebug(id: string, hosts: { name: string }[]) {
|
||||
let port = 7080
|
||||
return `
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<ExtensionList>
|
||||
<Extension Id="${id}">
|
||||
<HostList>
|
||||
${hosts
|
||||
.map((host) => `<Host Name="${host.name}" Port="${port++}"/>`)
|
||||
.join("\n")}
|
||||
</HostList>
|
||||
</Extension>
|
||||
</ExtensionList>
|
||||
`
|
||||
}
|
||||
20
temp_backup/Designer_redundant/plugins_jsx_template/html.ts
Normal file
@@ -0,0 +1,20 @@
|
||||
export function joinHtml(name:string,server:string){
|
||||
return `
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>${name}</title>
|
||||
<script>
|
||||
window.location.href = "${server}"
|
||||
</script>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
</body>
|
||||
</html>
|
||||
`
|
||||
}
|
||||
@@ -0,0 +1,66 @@
|
||||
import { ICepConfig } from "../types";
|
||||
|
||||
export function joinManifest(config: ICepConfig) {
|
||||
const { id, version, extensionVersion, requiredRuntimeVersion, hosts, parameters, panels } = config
|
||||
const mainId=`${id}`
|
||||
const panel = panels[0]
|
||||
return `<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<ExtensionManifest xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" ExtensionBundleId="${id}.body" ExtensionBundleVersion="1.0" Version="6.0"> <!-- MAJOR-VERSION-UPDATE-MARKER -->
|
||||
<ExtensionList>
|
||||
<Extension Id="${mainId}" Version="${extensionVersion}"/>
|
||||
</ExtensionList>
|
||||
<ExecutionEnvironment>
|
||||
<HostList>
|
||||
${hosts.map(item => `<Host Name="${item.name}" Version="${item.version}"/>`).join("\n")}
|
||||
</HostList>
|
||||
<LocaleList>
|
||||
<Locale Code="All"/>
|
||||
</LocaleList>
|
||||
<RequiredRuntimeList>
|
||||
<RequiredRuntime Name="CSXS" Version="${requiredRuntimeVersion}"/> <!-- MAJOR-VERSION-UPDATE-MARKER -->
|
||||
</RequiredRuntimeList>
|
||||
</ExecutionEnvironment>
|
||||
<DispatchInfoList>
|
||||
<Extension Id="${mainId}">
|
||||
<DispatchInfo>
|
||||
<Resources>
|
||||
<MainPath>./index.html</MainPath>
|
||||
<!-- <ScriptPath>./jsx/core.jsx</ScriptPath> -->
|
||||
<CEFCommandLine>
|
||||
${parameters.map(item => `<Parameter>${item}</Parameter>`).join("\n")}
|
||||
</CEFCommandLine>
|
||||
</Resources>
|
||||
<Lifecycle>
|
||||
<AutoVisible>true</AutoVisible>
|
||||
</Lifecycle>
|
||||
<UI>
|
||||
<Type>Panel</Type>
|
||||
<Menu>${panel.displayName}</Menu>
|
||||
<Geometry>
|
||||
<Size>
|
||||
<Height>${panel.height}</Height>
|
||||
<Width>${panel.width}</Width>
|
||||
</Size>
|
||||
<MaxSize>
|
||||
<Height>${panel.maxHeight||panel.height}</Height>
|
||||
<Width>${panel.maxWidth||panel.width}</Width>
|
||||
</MaxSize>
|
||||
<MinSize>
|
||||
<Height>${panel.minHeight||panel.height}</Height>
|
||||
<Width>${panel.minWidth||panel.width}</Width>
|
||||
</MinSize>
|
||||
</Geometry>
|
||||
<Icons>
|
||||
<Icon Type="Normal">./img/highlight.png</Icon>
|
||||
<Icon Type="RollOver">./img/dark.png</Icon>
|
||||
<Icon Type="DarkNormal">./img/highlight.png</Icon>
|
||||
<Icon Type="DarkRollOver">./img/dark.png</Icon>
|
||||
</Icons>
|
||||
</UI>
|
||||
</DispatchInfo>
|
||||
</Extension>
|
||||
</DispatchInfoList>
|
||||
</ExtensionManifest>
|
||||
|
||||
`
|
||||
}
|
||||
61
temp_backup/Designer_redundant/prod.cep.config.ts
Normal file
@@ -0,0 +1,61 @@
|
||||
import { ICepConfig } from "./plugins";
|
||||
|
||||
const config: ICepConfig = {
|
||||
"name": "cep-super-edition",
|
||||
"id": "com.cep-super-edition",
|
||||
"version": "0.0.1",
|
||||
"extensionVersion": "6.1.0",
|
||||
"requiredRuntimeVersion": "8.0",
|
||||
"type": "Panel",
|
||||
"parameters": [
|
||||
"--enable-nodejs"
|
||||
],
|
||||
"panels": [
|
||||
{
|
||||
"name": "超级套版",
|
||||
"displayName": "超级套版",
|
||||
"main": "./index.html",
|
||||
"width": 280,
|
||||
"height": 600,
|
||||
"minWidth": 280,
|
||||
"minHeight": 600,
|
||||
"maxWidth": 600,
|
||||
"maxHeight": 4080
|
||||
}
|
||||
],
|
||||
"hosts": [
|
||||
{
|
||||
"name": "AEFT",
|
||||
"version": "[0.0,99.9]"
|
||||
},
|
||||
{
|
||||
"name": "PPRO",
|
||||
"version": "[0.0,99.9]"
|
||||
},
|
||||
{
|
||||
"name": "ILST",
|
||||
"version": "[0.0,99.9]"
|
||||
},
|
||||
{
|
||||
"name": "PHXS",
|
||||
"version": "[0.0,99.9]"
|
||||
},
|
||||
{
|
||||
"name": "FLPR",
|
||||
"version": "[0.0,99.9]"
|
||||
}
|
||||
],
|
||||
"build": {
|
||||
"jsxBin": false,
|
||||
"country": "CN",
|
||||
"province": "GD",
|
||||
"org": "你的公司名称",
|
||||
"password": "",
|
||||
"tsa": ""
|
||||
},
|
||||
"zxp": {
|
||||
"jsxBin": false
|
||||
}
|
||||
}
|
||||
|
||||
export default config;
|
||||
239
temp_backup/Designer_redundant/scripts/buildLauncher.ts
Normal file
@@ -0,0 +1,239 @@
|
||||
/**
|
||||
* 构建客户端启动器(Launcher)
|
||||
*
|
||||
* 这个脚本只生成一个简单的 CEP 插件:
|
||||
* - index.html(跳转到服务器)
|
||||
* - manifest.xml(CEP 配置)
|
||||
* - 图标等资源
|
||||
*
|
||||
* 用法:npx ts-node scripts/buildLauncher.ts
|
||||
*/
|
||||
|
||||
import * as fs from 'fs';
|
||||
import * as path from 'path';
|
||||
|
||||
// ========== 配置 ==========
|
||||
const CONFIG = {
|
||||
// 服务器地址(客户打开插件后跳转到这里)
|
||||
serverURL: 'https://aidg168.uk/app/#/login',
|
||||
|
||||
// CEP 插件信息
|
||||
name: 'Designer',
|
||||
id: 'com.designer.launcher',
|
||||
version: '1.0.0',
|
||||
displayName: '超级套版',
|
||||
|
||||
// 面板大小
|
||||
panel: {
|
||||
width: 450,
|
||||
height: 600,
|
||||
minWidth: 400,
|
||||
minHeight: 500,
|
||||
},
|
||||
|
||||
// 支持的 Adobe 软件
|
||||
hosts: [
|
||||
{ name: 'PHXS', version: '[0.0,99.9]' }, // Photoshop
|
||||
{ name: 'ILST', version: '[0.0,99.9]' }, // Illustrator
|
||||
{ name: 'AEFT', version: '[0.0,99.9]' }, // After Effects
|
||||
{ name: 'PPRO', version: '[0.0,99.9]' }, // Premiere Pro
|
||||
],
|
||||
|
||||
// 输出目录
|
||||
outputDir: 'dist/Launcher',
|
||||
};
|
||||
|
||||
// ========== 模板 ==========
|
||||
|
||||
// 跳转 HTML
|
||||
const htmlTemplate = `<!DOCTYPE html>
|
||||
<html lang="zh-CN">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>${CONFIG.displayName}</title>
|
||||
<style>
|
||||
body {
|
||||
margin: 0;
|
||||
padding: 20px;
|
||||
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
|
||||
background: #1e1e1e;
|
||||
color: #fff;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
height: 100vh;
|
||||
box-sizing: border-box;
|
||||
}
|
||||
.loading {
|
||||
text-align: center;
|
||||
}
|
||||
.spinner {
|
||||
width: 40px;
|
||||
height: 40px;
|
||||
border: 3px solid #333;
|
||||
border-top-color: #0078d4;
|
||||
border-radius: 50%;
|
||||
animation: spin 1s linear infinite;
|
||||
margin: 0 auto 20px;
|
||||
}
|
||||
@keyframes spin {
|
||||
to { transform: rotate(360deg); }
|
||||
}
|
||||
.message {
|
||||
font-size: 14px;
|
||||
opacity: 0.8;
|
||||
}
|
||||
.error {
|
||||
color: #ff6b6b;
|
||||
display: none;
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<div class="loading">
|
||||
<div class="spinner"></div>
|
||||
<p class="message">正在连接服务器...</p>
|
||||
<p class="error" id="error">连接失败,请检查网络</p>
|
||||
</div>
|
||||
|
||||
<script>
|
||||
// 跳转到服务器
|
||||
const serverURL = '${CONFIG.serverURL}';
|
||||
|
||||
// 延迟跳转,让用户看到加载动画
|
||||
setTimeout(function() {
|
||||
window.location.href = serverURL;
|
||||
}, 500);
|
||||
|
||||
// 超时检测
|
||||
setTimeout(function() {
|
||||
document.getElementById('error').style.display = 'block';
|
||||
}, 10000);
|
||||
</script>
|
||||
</body>
|
||||
</html>`;
|
||||
|
||||
// manifest.xml
|
||||
const manifestTemplate = `<?xml version="1.0" encoding="UTF-8"?>
|
||||
<ExtensionManifest Version="6.0" ExtensionBundleId="${CONFIG.id}" ExtensionBundleVersion="${CONFIG.version}"
|
||||
ExtensionBundleName="${CONFIG.name}" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
|
||||
<ExtensionList>
|
||||
<Extension Id="${CONFIG.id}.panel" Version="${CONFIG.version}" />
|
||||
</ExtensionList>
|
||||
<ExecutionEnvironment>
|
||||
<HostList>
|
||||
${CONFIG.hosts.map(h => `<Host Name="${h.name}" Version="${h.version}" />`).join('\n ')}
|
||||
</HostList>
|
||||
<LocaleList>
|
||||
<Locale Code="All" />
|
||||
</LocaleList>
|
||||
<RequiredRuntimeList>
|
||||
<RequiredRuntime Name="CSXS" Version="6.0" />
|
||||
</RequiredRuntimeList>
|
||||
</ExecutionEnvironment>
|
||||
<DispatchInfoList>
|
||||
<Extension Id="${CONFIG.id}.panel">
|
||||
<DispatchInfo>
|
||||
<Resources>
|
||||
<MainPath>./index.html</MainPath>
|
||||
<CEFCommandLine>
|
||||
<Parameter>--enable-nodejs</Parameter>
|
||||
<Parameter>--mixed-context</Parameter>
|
||||
</CEFCommandLine>
|
||||
</Resources>
|
||||
<Lifecycle>
|
||||
<AutoVisible>true</AutoVisible>
|
||||
</Lifecycle>
|
||||
<UI>
|
||||
<Type>Panel</Type>
|
||||
<Menu>${CONFIG.displayName}</Menu>
|
||||
<Geometry>
|
||||
<Size>
|
||||
<Width>${CONFIG.panel.width}</Width>
|
||||
<Height>${CONFIG.panel.height}</Height>
|
||||
</Size>
|
||||
<MinSize>
|
||||
<Width>${CONFIG.panel.minWidth}</Width>
|
||||
<Height>${CONFIG.panel.minHeight}</Height>
|
||||
</MinSize>
|
||||
</Geometry>
|
||||
<Icons>
|
||||
<Icon Type="Normal">./img/dark.png</Icon>
|
||||
<Icon Type="RollOver">./img/highlight.png</Icon>
|
||||
<Icon Type="DarkNormal">./img/dark.png</Icon>
|
||||
<Icon Type="DarkRollOver">./img/highlight.png</Icon>
|
||||
</Icons>
|
||||
</UI>
|
||||
</DispatchInfo>
|
||||
</Extension>
|
||||
</DispatchInfoList>
|
||||
</ExtensionManifest>`;
|
||||
|
||||
// ========== 构建函数 ==========
|
||||
|
||||
function copyFolder(src: string, dest: string) {
|
||||
if (!fs.existsSync(dest)) {
|
||||
fs.mkdirSync(dest, { recursive: true });
|
||||
}
|
||||
|
||||
const files = fs.readdirSync(src);
|
||||
for (const file of files) {
|
||||
const srcPath = path.join(src, file);
|
||||
const destPath = path.join(dest, file);
|
||||
|
||||
if (fs.statSync(srcPath).isDirectory()) {
|
||||
copyFolder(srcPath, destPath);
|
||||
} else {
|
||||
fs.copyFileSync(srcPath, destPath);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function build() {
|
||||
console.log('🚀 构建客户端启动器...\n');
|
||||
|
||||
const outputDir = path.resolve(__dirname, '..', CONFIG.outputDir);
|
||||
|
||||
// 1. 清理输出目录
|
||||
if (fs.existsSync(outputDir)) {
|
||||
fs.rmSync(outputDir, { recursive: true });
|
||||
}
|
||||
fs.mkdirSync(outputDir, { recursive: true });
|
||||
console.log('✓ 创建输出目录:', outputDir);
|
||||
|
||||
// 2. 创建 CSXS 目录
|
||||
const csxsDir = path.join(outputDir, 'CSXS');
|
||||
fs.mkdirSync(csxsDir, { recursive: true });
|
||||
|
||||
// 3. 写入 index.html
|
||||
fs.writeFileSync(path.join(outputDir, 'index.html'), htmlTemplate);
|
||||
console.log('✓ 生成 index.html');
|
||||
|
||||
// 4. 写入 manifest.xml
|
||||
fs.writeFileSync(path.join(csxsDir, 'manifest.xml'), manifestTemplate);
|
||||
console.log('✓ 生成 CSXS/manifest.xml');
|
||||
|
||||
// 5. 复制图标
|
||||
const imgSrc = path.resolve(__dirname, '../plugins/jsx/template/cep/img');
|
||||
const imgDest = path.join(outputDir, 'img');
|
||||
if (fs.existsSync(imgSrc)) {
|
||||
copyFolder(imgSrc, imgDest);
|
||||
console.log('✓ 复制图标');
|
||||
}
|
||||
|
||||
console.log('\n========================================');
|
||||
console.log('✅ 构建完成!');
|
||||
console.log('========================================');
|
||||
console.log(`📁 输出目录: ${outputDir}`);
|
||||
console.log(`🔗 跳转地址: ${CONFIG.serverURL}`);
|
||||
console.log('\n下一步:');
|
||||
console.log('1. 使用 ZXPSignCmd 签名打包成 .zxp');
|
||||
console.log('2. 或直接复制到 Adobe CEP 扩展目录测试');
|
||||
}
|
||||
|
||||
// 执行
|
||||
build();
|
||||
|
||||
64
temp_backup/Designer_redundant/test-simple.ts
Normal file
@@ -0,0 +1,64 @@
|
||||
/**
|
||||
* 超级简单的测试 - 验证最基础的 evalScript
|
||||
*/
|
||||
|
||||
import { cep } from "@/utils/cep";
|
||||
|
||||
/**
|
||||
* 测试1:最简单的计算
|
||||
*/
|
||||
export async function testSimpleCalc() {
|
||||
try {
|
||||
const result = await cep.evalScript("1 + 2 + 3");
|
||||
console.log('简单计算结果:', result);
|
||||
return { success: true, result };
|
||||
} catch (error) {
|
||||
console.error('简单计算失败:', error);
|
||||
return { success: false, error: String(error) };
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 测试2:获取应用名称(不依赖任何工具库)
|
||||
*/
|
||||
export async function testGetAppName() {
|
||||
try {
|
||||
const result = await cep.evalScript("app.name");
|
||||
console.log('应用名称:', result);
|
||||
return { success: true, appName: result };
|
||||
} catch (error) {
|
||||
console.error('获取应用名称失败:', error);
|
||||
return { success: false, error: String(error) };
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 测试3:创建图层(最简单版本,不依赖工具库)
|
||||
*/
|
||||
export async function testCreateLayerDirect() {
|
||||
const jsx = `
|
||||
(function() {
|
||||
try {
|
||||
if (app.documents.length === 0) {
|
||||
return "no_document";
|
||||
}
|
||||
var doc = app.activeDocument;
|
||||
var layer = doc.artLayers.add();
|
||||
layer.name = "TestLayer";
|
||||
return "success:" + layer.name;
|
||||
} catch (e) {
|
||||
return "error:" + e.toString();
|
||||
}
|
||||
})()
|
||||
`;
|
||||
|
||||
try {
|
||||
const result = await cep.evalScript(jsx);
|
||||
console.log('创建图层结果:', result);
|
||||
return { success: true, result };
|
||||
} catch (error) {
|
||||
console.error('创建图层失败:', error);
|
||||
return { success: false, error: String(error) };
|
||||
}
|
||||
}
|
||||
|
||||
|
Before Width: | Height: | Size: 9.1 KiB After Width: | Height: | Size: 9.1 KiB |
|
Before Width: | Height: | Size: 9.1 KiB After Width: | Height: | Size: 9.1 KiB |
|
Before Width: | Height: | Size: 2.1 KiB After Width: | Height: | Size: 2.1 KiB |
|
Before Width: | Height: | Size: 9.1 KiB After Width: | Height: | Size: 9.1 KiB |
|
Before Width: | Height: | Size: 119 KiB After Width: | Height: | Size: 119 KiB |
|
Before Width: | Height: | Size: 114 KiB After Width: | Height: | Size: 114 KiB |