File size: 5,070 Bytes
d0dd276
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
import fs from 'fs';
import path from 'path';
import { execSync } from 'child_process';
import { fileURLToPath } from 'url';
import crypto from 'crypto';

// 获取 __dirname 等效值
const __filename = fileURLToPath(import.meta.url);
const __dirname = path.dirname(__filename);

// 确保目标目录存在
const templatesDir = path.resolve(__dirname, '../app/templates');
const assetsDir = path.resolve(templatesDir, 'assets');

// 清空目标目录
console.log('清空目标目录...');
if (fs.existsSync(assetsDir)) {
  // 删除assets目录中的所有文件
  const files = fs.readdirSync(assetsDir);
  for (const file of files) {
    const filePath = path.join(assetsDir, file);
    if (fs.lstatSync(filePath).isDirectory()) {
      // 如果是目录,递归删除
      fs.rmSync(filePath, { recursive: true, force: true });
    } else {
      // 如果是文件,直接删除
      fs.unlinkSync(filePath);
    }
  }
  console.log(`已清空目录: ${assetsDir}`);
} else {
  // 如果目录不存在,创建它
  fs.mkdirSync(assetsDir, { recursive: true });
  console.log(`已创建目录: ${assetsDir}`);
}

// 确保templates目录存在
if (!fs.existsSync(templatesDir)) {
  fs.mkdirSync(templatesDir, { recursive: true });
  console.log(`已创建目录: ${templatesDir}`);
}

// 构建 Vue 应用
console.log('正在构建 Vue 应用...');
execSync('npx vite build', { stdio: 'inherit' });

// 生成随机文件名
function generateRandomFileName(extension) {
  // 生成16字节的随机数据并转换为十六进制字符串
  const randomBytes = crypto.randomBytes(16).toString('hex');
  return `${randomBytes}.${extension}`;
}

// 重命名文件并返回新文件名
function renameFileWithRandomName(directory, originalName, extension) {
  // 不重命名favicon.ico文件
  if (originalName === 'favicon.ico') {
    return originalName;
  }
  
  const newFileName = generateRandomFileName(extension);
  const oldPath = path.join(directory, originalName);
  const newPath = path.join(directory, newFileName);
  
  if (fs.existsSync(oldPath)) {
    fs.renameSync(oldPath, newPath);
    console.log(`文件已重命名: ${originalName} -> ${newFileName}`);
    return newFileName;
  } else {
    console.warn(`警告: 文件 ${originalName} 不存在,无法重命名`);
    return originalName;
  }
}

// 查找所有资源文件
const allFiles = fs.readdirSync(assetsDir);
const jsFiles = allFiles.filter(file => file.endsWith('.js'));
const cssFiles = allFiles.filter(file => file.endsWith('.css'));
const imageFiles = allFiles.filter(file => /\.(png|jpg|jpeg|gif|svg|webp)$/.test(file));
const otherFiles = allFiles.filter(file => 
  !file.endsWith('.js') && 
  !file.endsWith('.css') && 
  !/\.(png|jpg|jpeg|gif|svg|webp)$/.test(file) && 
  file !== 'favicon.ico'
);

// 重命名所有JS文件
const jsFileMap = {};
jsFiles.forEach(file => {
  const extension = path.extname(file).substring(1);
  const newFileName = renameFileWithRandomName(assetsDir, file, extension);
  jsFileMap[file] = newFileName;
});

// 重命名所有CSS文件
const cssFileMap = {};
cssFiles.forEach(file => {
  const extension = path.extname(file).substring(1);
  const newFileName = renameFileWithRandomName(assetsDir, file, extension);
  cssFileMap[file] = newFileName;
});

// 重命名所有图片文件
const imageFileMap = {};
imageFiles.forEach(file => {
  const extension = path.extname(file).substring(1);
  const newFileName = renameFileWithRandomName(assetsDir, file, extension);
  imageFileMap[file] = newFileName;
});

// 重命名其他文件
const otherFileMap = {};
otherFiles.forEach(file => {
  const extension = path.extname(file).substring(1);
  const newFileName = renameFileWithRandomName(assetsDir, file, extension);
  otherFileMap[file] = newFileName;
});

console.log(`检测到并重命名了文件:`);
console.log(`- JS文件: ${Object.keys(jsFileMap).length} 个`);
console.log(`- CSS文件: ${Object.keys(cssFileMap).length} 个`);
console.log(`- 图片文件: ${Object.keys(imageFileMap).length} 个`);
console.log(`- 其他文件: ${Object.keys(otherFileMap).length} 个`);

// 创建一个简单的 index.html 文件,引用构建后的资源
const indexContent = `
<!DOCTYPE html>
<html lang="zh-CN">
  <head>
    <meta charset="UTF-8">
    <link rel="icon" href="/assets/favicon.ico">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Gemini API 代理服务</title>
    ${Object.values(jsFileMap).map(file => `<script type="module" crossorigin src="/assets/${file}"></script>`).join('\n    ')}
    ${Object.values(cssFileMap).map(file => `<link rel="stylesheet" href="/assets/${file}">`).join('\n    ')}
  </head>
  <body>
    <div id="app"></div>
  </body>
</html>
`;

// 将 index.html 写入到 app/templates 目录
const targetIndexPath = path.resolve(templatesDir, 'index.html');
fs.writeFileSync(targetIndexPath, indexContent);

console.log('构建完成!');
console.log(`- index.html 已创建到: ${targetIndexPath}`);
console.log(`- 静态资源已输出到: ${assetsDir}`);