Merge branch 'develop'

This commit is contained in:
zhanggy committed 2025-10-30 10:26:29 +08:00
commit ee99467394
11 files changed
+98 -91

No files matched your search

+1 -1
View File
@@ -1,6 +1,6 @@
# GitHub Personal Access Token for private repository access
# Required for auto-updates from private repositories
GH_TOKEN=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
GH_TOKEN=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
# For private repositories, you might also need:
# GITHUB_TOKEN= # Alternative token name that some tools might use
+13 -13
View File
@@ -81,22 +81,22 @@ jobs:
git push origin v${{ env.VERSION }}
- name: Build for all platforms
run: pnpm build:all
run: pnpm pub
env:
# 在 macOS 上禁用代码签名
CSC_IDENTITY_AUTO_DISCOVERY: false
# GitHub token 用于发布
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- name: Create GitHub Release
uses: softprops/action-gh-release@v2
with:
tag_name: v${{ env.VERSION }}
name: Release v${{ env.VERSION }}
body_path: CHANGELOG.md
draft: false
prerelease: false
files: |
release/${{ env.VERSION }}/*
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
# - name: Create GitHub Release
# uses: softprops/action-gh-release@v2
# with:
# tag_name: v${{ env.VERSION }}
# name: Release v${{ env.VERSION }}
# body_path: CHANGELOG.md
# draft: false
# prerelease: false
# files: |
# release/${{ env.VERSION }}/*
# env:
# GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+12 -12
View File
@@ -56,18 +56,18 @@ const baseConfig = {
win: {
icon: 'buildAssets/icons/icon.ico',
target: [
{
target: 'appx',
arch: 'x64'
},
{
target: 'zip',
arch: 'x64'
},
{
target: 'portable',
arch: 'x64'
},
// {
// target: 'appx',
// arch: 'x64'
// },
// {
// target: 'zip',
// arch: 'x64'
// },
// {
// target: 'portable',
// arch: 'x64'
// },
{
target: 'nsis',
arch: 'x64'
+3 -2
View File
@@ -1,6 +1,6 @@
{
"name": "vutron",
"appId": "com.vutron.vutron",
"name": "gdt-tool",
"appId": "com.tool.gdt",
"version": "0.0.5",
"description": "Quick Start Templates for Vite + Vue 3 + Electron",
"homepage": "https://vutron.cdget.com",
@@ -36,6 +36,7 @@
"lint:fix": "eslint . --ext .js,.ts,.vue --fix .",
"test": "npm run build:pre && playwright test",
"test:linux": "npm run build:pre && xvfb-run --auto-servernum --server-args='-screen 0, 1280x960x24' -- playwright test",
"pub": "npm run build:pre && electron-builder --config=buildAssets/builder/config.js --windows --publish=always",
"release": "standard-version",
"release:major": "standard-version --release-as major",
"release:minor": "standard-version --release-as minor",
+8
View File
@@ -17,6 +17,14 @@ export class AutoUpdater {
autoUpdater.allowPrerelease = false
autoUpdater.channel = 'latest'
// 如果是私有仓库,设置认证信息
if (process.env.GH_TOKEN || process.env.GITHUB_TOKEN) {
// 使用环境变量中的令牌
autoUpdater.requestHeaders = {
'Authorization': `token ${process.env.GH_TOKEN || process.env.GITHUB_TOKEN}`
}
}
// 设置事件监听器
this.setupEventListeners()
}
+25 -1
View File
@@ -57,13 +57,37 @@ export default class IPCs {
if (!dialogResult.canceled && dialogResult.filePaths.length > 0) {
return {
canceled: false,
filePath: dialogResult.filePaths[0]
filePath: dialogResult.filePaths[0],
isDirectory: true
}
}
return { canceled: true }
})
// Select file or directory
ipcMain.handle('msgSelectFileOrFolder', async () => {
const dialogResult = await dialog.showOpenDialog({
properties: ['openFile', 'openDirectory']
})
if (!dialogResult.canceled && dialogResult.filePaths.length > 0) {
const filePath = dialogResult.filePaths[0];
const fs = require('fs');
const isDirectory = fs.statSync(filePath).isDirectory();
return {
canceled: false,
filePath: filePath,
isDirectory: isDirectory
}
}
return { canceled: true }
})
// Find all files in a folder recursively
ipcMain.handle(
'msgFindFilesInFolder',
+1
View File
@@ -11,6 +11,7 @@ const mainAvailChannels: string[] = [
'msgOpenExternalLink',
'msgOpenFile',
'msgSelectDirectory',
'msgSelectFileOrFolder',
'msgLoadData',
'msgSaveData',
'msgExecuteTemplate',
@@ -36,7 +36,9 @@ const headerMenus: {
</script>
<template>
<v-app-bar color="primary" density="compact">
<v-app-bar-title @click="handleRoute('/')">{{ t(titleKey) }}</v-app-bar-title>
<v-app-bar-title @click="handleRoute('/')">
GDT Tool
</v-app-bar-title>
<!-- <template #append>
<v-btn
v-for="menu in headerMenus"
+30 -59
View File
@@ -6,8 +6,7 @@
<v-row class="fill-height">
<!-- Left Panel - Template Info -->
<v-col
cols="12"
md="4"
cols="4"
class="pa-4 border-e"
>
<div class="d-flex align-center mb-4">
@@ -38,7 +37,7 @@
v-model="templateName"
label="模板名称 *"
placeholder="输入模板名称"
:rules="[requiredRule]"
:rules="[requiredRule('模板名称')]"
required
clearable
density="comfortable"
@@ -73,8 +72,7 @@
<!-- Right Panel - Tree Structure -->
<v-col
cols="12"
md="8"
cols="8"
class="pa-4"
>
<div class="d-flex align-center mb-4">
@@ -164,9 +162,9 @@
<v-form v-model="directoryFormValid">
<v-text-field
v-model="newDirectoryPath"
:label="currentEditingItem ? '新目录路径 *' : '目录路径 *'"
:placeholder="currentEditingItem ? '例如: src/new-components' : '例如: src/components'"
:rules="[requiredRule]"
:label="'目录名称'"
:placeholder="'请输入目录名称'"
:rules="[requiredRule('目录名称')]"
required
density="comfortable"
ref="directoryInputRef"
@@ -203,34 +201,39 @@
<v-form v-model="fileFormValid">
<v-text-field
v-model="newFilePath"
:label="currentEditingItem ? '新文件路径 *' : '目标文件路径 *'"
:placeholder="currentEditingItem ? '例如: src/new-index.js' : '例如: src/index.js'"
:rules="[requiredRule]"
:label="'文件名'"
:placeholder="'文件名需要带上后缀,如:style skech.doc'"
:rules="[requiredRule('文件名')]"
required
density="comfortable"
ref="fileInputRef"
@keydown.enter="selectAndAddFile"
/>
<v-file-input webkitdirectory directory label="选择文件或文件夹" density="comfortable"></v-file-input>
<div class="d-flex align-center my-4">
<v-btn
@click="selectSourceFile"
@click="selectSourceFileOrFolder"
variant="outlined"
class="mr-2"
:disabled="!!currentEditingItem"
>
选择文件
</v-btn>
<v-btn
@click="selectSourceFolder"
variant="outlined"
class="mr-2"
:disabled="!!currentEditingItem"
>
选择文件夹
选择文件或文件夹
</v-btn>
</div>
<!-- 选择提示 -->
<v-alert
type="info"
variant="tonal"
class="mt-2"
>
<div class="d-flex align-start flex-column">
<span>选择文件会直接复制到目标位置</span>
<span>选择文件夹则会自动匹配该文件夹下的文件进行复制并且重命名</span>
</div>
</v-alert>
<!-- Display selected source -->
<div v-if="selectedSourcePath" class="d-flex align-center">
<v-icon :color="isAutoFindMode ? 'warning' : 'info'" class="mr-2">
@@ -238,32 +241,6 @@
</v-icon>
<span class="text-truncate">{{ selectedSourcePath }}</span>
</div>
<!-- Auto-find indicator -->
<v-alert
v-if="isAutoFindMode"
type="info"
variant="tonal"
class="mt-2"
>
<div class="d-flex align-center">
<v-icon class="mr-2">mdi-auto-fix</v-icon>
<span>自动寻找文件夹内的文件</span>
</div>
</v-alert>
<!-- Note when editing -->
<v-alert
v-if="currentEditingItem"
type="warning"
variant="tonal"
class="mt-2"
>
<div class="d-flex align-center">
<v-icon class="mr-2">mdi-information</v-icon>
<span>正在编辑现有文件路径,文件源不会改变</span>
</div>
</v-alert>
</v-form>
</v-card-text>
<v-card-actions>
@@ -430,7 +407,7 @@ const convertToTreeItem = (node: TreeNode): TreeItem => {
}
// Validation rules
const requiredRule = (v: string | null | undefined) => !!v || '此字段为必填项'
const requiredRule = (fieldName: string) => (v: string | null | undefined) => !!v || `${fieldName}为必填项`
// Watch for changes to detect unsaved changes
watch(
@@ -1062,19 +1039,13 @@ const showSnackbar = (message: string, color: string = 'error') => {
}
// Methods for file/folder selection
const selectSourceFile = async () => {
const result = await window.mainApi.invoke('msgOpenFile', 'any')
if (!result.canceled && result.filePaths && result.filePaths.length > 0) {
selectedSourcePath.value = result.filePaths[0]
isAutoFindMode.value = false // Not in auto-find mode when selecting a specific file
}
}
const selectSourceFileOrFolder = async () => {
// 使用现有的主进程API来选择文件或文件夹
const result = await window.mainApi.invoke('msgSelectFileOrFolder')
const selectSourceFolder = async () => {
const result = await window.mainApi.invoke('msgSelectDirectory')
if (!result.canceled && result.filePath) {
if (result && result.filePath) {
selectedSourcePath.value = result.filePath
isAutoFindMode.value = true // In auto-find mode when selecting a folder
isAutoFindMode.value = result.isDirectory // 如果是目录,则启用自动查找模式
}
}
+1 -1
View File
@@ -81,7 +81,7 @@ const navigateToCreateTemplate = () => {
<v-row class="text-center mb-6">
<v-col cols="12">
<h1 class="text-h4 font-weight-bold mb-4">
{{ t('title.main') }}
GDT Tool
</h1>
<p class="text-h6 mb-6">
{{ t('desc.welcome-desc') }}
+1 -1
View File
@@ -3,7 +3,7 @@
<v-row>
<v-col cols="12">
<div class="d-flex align-center mb-4 justify-space-between flex-wrap">
<h2 class="mr-2 mb-2"> 模板列表 </h2>
<h2 class="mr-2 mb-2"> 文件创建 </h2>
<v-btn @click="navigateToCreateTemplate" color="primary" prepend-icon="mdi-plus" class="mb-2">
创建模板
</v-btn>