425 lines
10 KiB
Markdown
425 lines
10 KiB
Markdown
# 系统模板管理指南
|
||
|
||
## 概述
|
||
|
||
系统模板(字幕和封面)现在支持以下功能:
|
||
- 📁 保存在 JSON 配置文件中
|
||
- 🎨 开发模式下可以编辑
|
||
- 📦 打包时包含在发行版中
|
||
- 🔒 生产模式下用户无法修改
|
||
|
||
---
|
||
|
||
## 文件结构
|
||
|
||
### 关键文件
|
||
|
||
```
|
||
C:\aigcpanel-main\
|
||
├── electron/
|
||
│ ├── config/
|
||
│ │ └── system-templates.json # ⭐ 系统模板配置文件
|
||
│ ├── mapi/
|
||
│ │ ├── db/
|
||
│ │ │ ├── migration.ts # 数据库迁移 v23
|
||
│ │ │ └── initSystemTemplates.ts # 初始化逻辑
|
||
│ │ └── subtitleCover/
|
||
│ │ ├── main.ts # 导出/管理实现
|
||
│ │ └── register.ts # IPC 接口注册
|
||
├── src/
|
||
│ └── api/
|
||
│ └── systemTemplates.ts # 前端 API 包装
|
||
└── scripts/
|
||
└── export-system-templates.js # 导出脚本
|
||
```
|
||
|
||
---
|
||
|
||
## 工作流程
|
||
|
||
### 1. 开发模式:编辑系统模板
|
||
|
||
#### 方法 A:在应用中编辑并导出
|
||
|
||
```typescript
|
||
import {
|
||
getSystemTemplatesList,
|
||
saveSystemTemplate,
|
||
exportSystemTemplatesToFile,
|
||
isDevMode
|
||
} from '@/api/systemTemplates';
|
||
|
||
// 检查是否开发模式
|
||
if (isDevMode()) {
|
||
// 获取现有模板
|
||
const result = await getSystemTemplatesList();
|
||
console.log('系统模板:', result.templates);
|
||
|
||
// 编辑字幕模板(例如:设置颜色)
|
||
await saveSystemTemplate({
|
||
type: 'subtitle',
|
||
id: 'template_system_11',
|
||
name: '11',
|
||
description: '系统字幕模板 11',
|
||
config: {
|
||
subtitleStyleId: 'system-subtitle-11',
|
||
subtitlePosition: 'bottom',
|
||
// ... 其他配置
|
||
subtitleStyle: {
|
||
fontColor: '#FFFFFF', // 普通字幕颜色
|
||
// ... 其他字体设置
|
||
}
|
||
}
|
||
});
|
||
|
||
// 导出配置到文件(覆盖 system-templates.json)
|
||
const exportResult = await exportSystemTemplatesToFile();
|
||
if (exportResult.success) {
|
||
console.log('✅ 配置已导出到:', exportResult.filePath);
|
||
}
|
||
}
|
||
```
|
||
|
||
#### 方法 B:使用 Node 脚本导出
|
||
|
||
```bash
|
||
# 从数据库导出所有系统模板配置到 system-templates.json
|
||
node scripts/export-system-templates.js
|
||
```
|
||
|
||
这个脚本会:
|
||
1. 连接到应用数据库
|
||
2. 读取所有系统模板配置(包括你设置的颜色)
|
||
3. 导出到 `electron/config/system-templates.json`
|
||
|
||
### 2. 打包生产版本
|
||
|
||
```bash
|
||
# 自动复制 system-templates.json 到打包资源中
|
||
npm run build:win
|
||
|
||
# 或者
|
||
npm run build:mac
|
||
```
|
||
|
||
打包流程:
|
||
1. ✅ 执行 `prepare-package.cjs` 脚本
|
||
2. ✅ 复制 `system-templates.json` → `resources/extra/common/config/`
|
||
3. ✅ 用户安装应用后,自动初始化数据库
|
||
4. ✅ 生产模式设置 `readonly=1`,用户无法修改
|
||
|
||
### 3. 生产模式:用户安装应用
|
||
|
||
用户安装后:
|
||
- ✅ 应用启动时自动从 JSON 初始化 8 套系统模板
|
||
- ✅ 字幕和封面模板都加载到数据库
|
||
- ✅ 系统模板标记为只读,用户无法编辑/删除
|
||
- ✅ 用户可以创建自己的自定义模板
|
||
|
||
---
|
||
|
||
## API 参考
|
||
|
||
### 前端 API
|
||
|
||
#### `getSystemTemplatesList()`
|
||
获取系统模板列表
|
||
|
||
```typescript
|
||
const result = await getSystemTemplatesList();
|
||
// 返回: { success: boolean, templates: { subtitleTemplates: [], coverTemplates: [] } }
|
||
```
|
||
|
||
#### `saveSystemTemplate(template)`
|
||
保存/编辑系统模板(开发模式)
|
||
|
||
```typescript
|
||
const template = {
|
||
type: 'subtitle' | 'cover',
|
||
id: 'template_system_11',
|
||
name: '11',
|
||
description: 'Description',
|
||
config: { /* 配置对象 */ },
|
||
thumbnailPath: '/path/to/thumbnail.png' // 仅 cover 类型
|
||
};
|
||
|
||
const result = await saveSystemTemplate(template);
|
||
// 返回: { success: boolean, id: string, message: string }
|
||
```
|
||
|
||
#### `resetSystemTemplates()`
|
||
重置为默认值(开发模式)
|
||
|
||
```typescript
|
||
const result = await resetSystemTemplates();
|
||
// 返回: { success: boolean, message: string }
|
||
```
|
||
|
||
#### `exportSystemTemplatesToFile()`
|
||
导出配置到 JSON 文件(开发模式)
|
||
|
||
```typescript
|
||
const result = await exportSystemTemplatesToFile();
|
||
// 返回: { success: boolean, filePath: string, message: string }
|
||
```
|
||
|
||
#### `isDevMode()`
|
||
检查是否开发模式
|
||
|
||
```typescript
|
||
if (isDevMode()) {
|
||
// 开发模式逻辑
|
||
}
|
||
```
|
||
|
||
### 后端 IPC 接口
|
||
|
||
```
|
||
systemTemplates:getList // 获取模板列表
|
||
systemTemplates:save // 保存模板
|
||
systemTemplates:delete // 删除模板
|
||
systemTemplates:reset // 重置模板
|
||
systemTemplates:export // 导出到文件
|
||
```
|
||
|
||
---
|
||
|
||
## 常见场景
|
||
|
||
### 场景 1:更新系统模板的颜色设置
|
||
|
||
1. 在应用中编辑字幕模板的颜色
|
||
2. 调用 `exportSystemTemplatesToFile()` 导出
|
||
3. 提交 `system-templates.json` 到 Git
|
||
4. 下次打包时,新颜色会包含在发行版中
|
||
|
||
### 场景 2:添加新的系统模板
|
||
|
||
1. 在应用中创建新模板
|
||
2. 调用 `saveSystemTemplate()` 保存
|
||
3. 调用 `exportSystemTemplatesToFile()` 导出
|
||
4. 更新版本号和时间戳
|
||
5. 打包发行
|
||
|
||
### 场景 3:重置系统模板
|
||
|
||
1. 调用 `resetSystemTemplates()` 重置数据库
|
||
2. 调用 `exportSystemTemplatesToFile()` 导出当前配置
|
||
3. 用户将恢复到默认的 8 套系统模板
|
||
|
||
---
|
||
|
||
## 数据库架构
|
||
|
||
### subtitle_templates 表
|
||
|
||
```sql
|
||
CREATE TABLE subtitle_templates (
|
||
id TEXT PRIMARY KEY,
|
||
name TEXT NOT NULL,
|
||
description TEXT,
|
||
config TEXT, -- JSON 格式配置
|
||
is_system INTEGER DEFAULT 0, -- 1=系统模板, 0=用户模板
|
||
readonly INTEGER DEFAULT 0, -- 1=只读(生产模式), 0=可编辑(开发模式)
|
||
created_at INTEGER,
|
||
updated_at INTEGER
|
||
);
|
||
```
|
||
|
||
### cover_templates 表
|
||
|
||
```sql
|
||
CREATE TABLE cover_templates (
|
||
id TEXT PRIMARY KEY,
|
||
name TEXT NOT NULL,
|
||
config TEXT, -- JSON 格式配置
|
||
is_system INTEGER DEFAULT 0, -- 1=系统模板, 0=用户模板
|
||
readonly INTEGER DEFAULT 0, -- 1=只读(生产模式), 0=可编辑(开发模式)
|
||
thumbnail_path TEXT,
|
||
created_at INTEGER,
|
||
updated_at INTEGER
|
||
);
|
||
```
|
||
|
||
---
|
||
|
||
## 开发模式标志
|
||
|
||
### 检查开发/生产模式
|
||
|
||
```typescript
|
||
// 方法 1:前端
|
||
import { isDevMode } from '@/api/systemTemplates';
|
||
const isDev = isDevMode();
|
||
|
||
// 方法 2:后端
|
||
function isProductionMode(): boolean {
|
||
return process.env.ELECTRON_ENV_PROD === '1' ||
|
||
process.env.NODE_ENV === 'production' ||
|
||
!process.env.DEV;
|
||
}
|
||
```
|
||
|
||
### 启动开发模式
|
||
|
||
```bash
|
||
# Windows
|
||
npm run dev:win
|
||
|
||
# macOS
|
||
npm run dev:mac
|
||
|
||
# 预发布模式(仍可编辑系统模板)
|
||
npm run dev:win:pre
|
||
npm run dev:mac:pre
|
||
```
|
||
|
||
### 启动生产模式
|
||
|
||
```bash
|
||
# 直接设置环境变量为生产模式
|
||
set ELECTRON_ENV_PROD=1 # Windows
|
||
export ELECTRON_ENV_PROD=1 # macOS/Linux
|
||
npm run dev:win
|
||
```
|
||
|
||
---
|
||
|
||
## JSON 配置文件格式
|
||
|
||
```json
|
||
{
|
||
"version": "1.0.0",
|
||
"description": "系统内置模板配置 - 包含8套字幕模板和8套封面模板",
|
||
"timestamp": "2026-01-15T10:30:00.000Z",
|
||
"subtitleTemplates": [
|
||
{
|
||
"id": "template_system_11",
|
||
"name": "11",
|
||
"description": "系统字幕模板 11",
|
||
"isSystem": true,
|
||
"readonly": false,
|
||
"createdAt": 1768396885438,
|
||
"config": {
|
||
"subtitleStyleId": "system-subtitle-11",
|
||
"subtitlePosition": "bottom",
|
||
"subtitleStyle": {
|
||
"fontColor": "#FFFFFF",
|
||
"outlineColor": "#000000",
|
||
"outlineWidth": 3,
|
||
"fontSize": 48
|
||
}
|
||
// ... 其他配置
|
||
}
|
||
}
|
||
// ... 其他7个字幕模板
|
||
],
|
||
"coverTemplates": [
|
||
// ... 8个封面模板
|
||
]
|
||
}
|
||
```
|
||
|
||
---
|
||
|
||
## 安全性注意事项
|
||
|
||
### ✅ 开发模式保护
|
||
|
||
- API 调用前检查 `isDev` 标志
|
||
- 编辑后立即导出到文件
|
||
- 配置文件纳入版本控制
|
||
|
||
### 🔒 生产模式保护
|
||
|
||
- 系统模板标记为 `readonly=1`
|
||
- IPC 接口检查开发/生产模式
|
||
- 用户无法编辑/删除系统模板
|
||
- 只能创建自己的自定义模板
|
||
|
||
### 🔄 版本管理
|
||
|
||
- 每次导出时更新 `timestamp`
|
||
- 增加版本号时更新 `version`
|
||
- 在 Git 中追踪 `system-templates.json` 的变化
|
||
|
||
---
|
||
|
||
## 故障排查
|
||
|
||
### 问题:编辑的颜色没有保存到文件
|
||
|
||
**解决:**
|
||
```typescript
|
||
// 1. 确保在开发模式
|
||
console.log('开发模式:', isDevMode());
|
||
|
||
// 2. 确认编辑已保存到数据库
|
||
const list = await getSystemTemplatesList();
|
||
console.log('当前模板:', list.templates);
|
||
|
||
// 3. 手动导出到文件
|
||
const result = await exportSystemTemplatesToFile();
|
||
console.log('导出结果:', result);
|
||
```
|
||
|
||
### 问题:生产模式仍然可以编辑系统模板
|
||
|
||
**解决:**
|
||
```typescript
|
||
// 检查环境变量
|
||
console.log('ELECTRON_ENV_PROD:', process.env.ELECTRON_ENV_PROD);
|
||
console.log('NODE_ENV:', process.env.NODE_ENV);
|
||
|
||
// 检查数据库中的 readonly 标记
|
||
// SELECT * FROM subtitle_templates WHERE is_system = 1;
|
||
// 应该看到 readonly = 1
|
||
```
|
||
|
||
### 问题:导出脚本找不到数据库
|
||
|
||
**解决:**
|
||
```bash
|
||
# 确保应用已启动过至少一次,创建了数据库
|
||
# 检查数据库位置:
|
||
# Windows: %APPDATA%\zhenqianba\data.db
|
||
# macOS: ~/Library/Application Support/zhenqianba/data.db
|
||
# Linux: ~/.config/zhenqianba/data.db
|
||
|
||
# 或者手动指定数据库路径:
|
||
node scripts/export-system-templates.js --db-path /path/to/data.db
|
||
```
|
||
|
||
---
|
||
|
||
## 最佳实践
|
||
|
||
1. **定期导出**:每次编辑系统模板后都导出
|
||
2. **版本控制**:将 `system-templates.json` 提交到 Git
|
||
3. **备份配置**:发行前备份 `system-templates.json`
|
||
4. **测试生产模式**:确保生产版本中系统模板是只读的
|
||
5. **文档更新**:模板变化时更新 `description` 字段
|
||
|
||
---
|
||
|
||
## 相关文件
|
||
|
||
- 配置文件:`electron/config/system-templates.json`
|
||
- 前端 API:`src/api/systemTemplates.ts`
|
||
- 后端实现:`electron/mapi/subtitleCover/main.ts`
|
||
- 数据库初始化:`electron/mapi/db/initSystemTemplates.ts`
|
||
- 迁移脚本:`electron/mapi/db/migration.ts` (v23)
|
||
- 打包脚本:`scripts/prepare-package.cjs`
|
||
- 导出脚本:`scripts/export-system-templates.js`
|
||
|
||
---
|
||
|
||
## 更新历史
|
||
|
||
### v1.0.0 (2026-01-15)
|
||
- ✅ 创建系统模板配置文件
|
||
- ✅ 实现导出功能
|
||
- ✅ 添加开发/生产模式区分
|
||
- ✅ 支持打包时包含配置文件
|
||
- ✅ 实现生产模式只读保护
|