Skip to content

Commit 4e6c286

Browse files
authored
在线更新功能界面美化设计 (#44)
* resolve merge conflict in main.go, keep remote version * 代码还原及已知bug修复 * 在线更新功能界面美化设计 * 图片更新 close #31 --------- Co-authored-by: hea7en <hea7enn@qq.com>
1 parent 12e4c51 commit 4e6c286

File tree

22 files changed

+290
-340
lines changed

22 files changed

+290
-340
lines changed

CHANGELOG.json

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,24 @@
11
[
2+
{
3+
"version": "v3.5.0",
4+
"date": "2025-12-05",
5+
"changes": ["Add online update feature"]
6+
},
7+
{
8+
"version": "v3.4.1",
9+
"date": "2025-12-05",
10+
"changes": ["Fix known issues"]
11+
},
12+
{
13+
"version": "v3.4.0",
14+
"date": "2025-12-04",
15+
"changes": ["Optimize token statistics"]
16+
},
17+
{
18+
"version": "v3.3.1",
19+
"date": "2025-12-01",
20+
"changes": ["Fix tray icon display issue"]
21+
},
222
{
323
"version": "v3.2.1",
424
"date": "2025-11-25",

CHANGELOG_CN.json

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,24 @@
11
[
2+
{
3+
"version": "v3.5.0",
4+
"date": "2025-12-05",
5+
"changes": ["新增在线更新功能"]
6+
},
7+
{
8+
"version": "v3.4.1",
9+
"date": "2025-12-05",
10+
"changes": ["修改已知问题"]
11+
},
12+
{
13+
"version": "v3.4.0",
14+
"date": "2025-12-04",
15+
"changes": ["优化token统计问题"]
16+
},
17+
{
18+
"version": "v3.3.1",
19+
"date": "2025-12-01",
20+
"changes": ["修复托盘图标显示问题"]
21+
},
222
{
323
"version": "v3.2.1",
424
"date": "2025-11-25",

app.go

Lines changed: 0 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -1079,46 +1079,6 @@ func (a *App) UpdatePort(port int) error {
10791079
return nil
10801080
}
10811081

1082-
// GetRetryCount returns global retry count
1083-
func (a *App) GetRetryCount() int {
1084-
return a.config.GetRetryCount()
1085-
}
1086-
1087-
// GetRetryDelaySec returns global retry delay in seconds
1088-
func (a *App) GetRetryDelaySec() int {
1089-
return a.config.GetRetryDelaySec()
1090-
}
1091-
1092-
// SetRetrySettings updates global retry settings
1093-
func (a *App) SetRetrySettings(retryCount, retryDelaySec int) error {
1094-
if retryCount < 1 || retryCount > 10 {
1095-
return fmt.Errorf("retryCount must be between 1 and 10, got %d", retryCount)
1096-
}
1097-
if retryDelaySec < 0 || retryDelaySec > 300 {
1098-
return fmt.Errorf("retryDelaySec must be between 0 and 300, got %d", retryDelaySec)
1099-
}
1100-
1101-
a.config.UpdateRetrySettings(retryCount, retryDelaySec)
1102-
1103-
if err := a.config.Validate(); err != nil {
1104-
return err
1105-
}
1106-
1107-
if err := a.proxy.UpdateConfig(a.config); err != nil {
1108-
return err
1109-
}
1110-
1111-
if a.storage != nil {
1112-
configAdapter := storage.NewConfigStorageAdapter(a.storage)
1113-
if err := a.config.SaveToStorage(configAdapter); err != nil {
1114-
return fmt.Errorf("failed to save retry settings: %w", err)
1115-
}
1116-
}
1117-
1118-
logger.Info("Retry settings updated: count=%d, delay=%ds", retryCount, retryDelaySec)
1119-
return nil
1120-
}
1121-
11221082
// ToggleEndpoint toggles the enabled state of an endpoint
11231083
func (a *App) ToggleEndpoint(index int, enabled bool) error {
11241084
endpoints := a.config.GetEndpoints()

docs/images/ME.png

36.5 KB
Loading

frontend/public/chat.jpg

-12.7 KB
Loading

frontend/src/i18n/en.js

Lines changed: 3 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -66,8 +66,6 @@ export default {
6666
portUpdateFailed: 'Failed to update port: {error}',
6767
requiredFields: 'Please fill in all required fields',
6868
modelRequired: 'Model field is required for {transformer} transformer',
69-
retryCountInvalid: 'Retry count must be between 1 and 10',
70-
retryDelayInvalid: 'Retry delay must be between 0 and 300 seconds',
7169
saveFailed: 'Failed to save: {error}',
7270
confirmDelete: 'Are you sure you want to delete endpoint "{name}"?',
7371
deleteFailed: 'Failed to delete: {error}'
@@ -157,12 +155,6 @@ export default {
157155
minimize: 'Minimize to Tray',
158156
ask: 'Ask Every Time'
159157
},
160-
retryCount: 'Retry Count',
161-
retryCountHelp: 'Global retries per endpoint before switching (1-10)',
162-
retryDelaySec: 'Retry Delay (seconds)',
163-
retryDelaySecHelp: 'Global wait time between retries (0-300 seconds)',
164-
retryCountInvalid: 'Retry count must be between 1 and 10',
165-
retryDelayInvalid: 'Retry delay must be between 0 and 300 seconds',
166158
languageHelp: 'Select the interface display language',
167159
save: 'Save',
168160
cancel: 'Cancel',
@@ -209,7 +201,7 @@ export default {
209201
configSaved: 'Configuration saved',
210202
configSaveFailed: 'Failed to save configuration',
211203
serverUrl: 'WebDAV Server URL',
212-
serverUrlHelp: 'Supports Nutstore, NextCloud, ownCloud and other standard WebDAV services',
204+
serverUrlHelp: 'Currently only supports Nutstore WebDAV service',
213205
username: 'Username',
214206
password: 'Password',
215207
usernamePlaceholder: 'Enter WebDAV username',
@@ -287,7 +279,8 @@ export default {
287279
checkInterval: 'Check Interval',
288280
upToDate: 'You are up to date',
289281
checkFailed: 'Failed to check for updates',
290-
noAutoCheck: "No Auto Check",
282+
noAutoCheck: "No Auto Update",
283+
noChangelog: 'No changelog available',
291284
everyHour: 'Every Hour',
292285
every6Hours: 'Every 6 Hours',
293286
everyDay: 'Every Day',

frontend/src/i18n/zh-CN.js

Lines changed: 4 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -66,8 +66,6 @@ export default {
6666
portUpdateFailed: '端口修改失败:{error}',
6767
requiredFields: '请填写所有必填项',
6868
modelRequired: '使用 {transformer} 转换器时,模型字段为必填项',
69-
retryCountInvalid: '重试次数需在 1-10 之间',
70-
retryDelayInvalid: '重试间隔需在 0-300 秒之间',
7169
saveFailed: '保存失败:{error}',
7270
confirmDelete: '确认删除端点 "{name}" 吗?',
7371
deleteFailed: '删除失败:{error}'
@@ -157,12 +155,6 @@ export default {
157155
minimize: '最小化到托盘',
158156
ask: '每次询问'
159157
},
160-
retryCount: '重试次数',
161-
retryCountHelp: '全局每个端点的连续重试次数,超出后切换(1-10)',
162-
retryDelaySec: '重试间隔(秒)',
163-
retryDelaySecHelp: '全局每次重试前等待时间(0-300 秒)',
164-
retryCountInvalid: '重试次数需在 1-10 之间',
165-
retryDelayInvalid: '重试间隔需在 0-300 秒之间',
166158
languageHelp: '选择界面显示语言',
167159
save: '保存',
168160
cancel: '取消',
@@ -209,7 +201,7 @@ export default {
209201
configSaved: '配置已保存',
210202
configSaveFailed: '配置保存失败',
211203
serverUrl: 'WebDAV 服务器地址',
212-
serverUrlHelp: '支持坚果云、NextCloud、ownCloud 等标准 WebDAV 服务',
204+
serverUrlHelp: '当前只支持坚果云 WebDAV 服务',
213205
username: '用户名',
214206
password: '密码',
215207
usernamePlaceholder: '输入 WebDAV 用户名',
@@ -283,11 +275,12 @@ export default {
283275
downloadComplete: '下载完成',
284276
downloadFailed: '下载失败',
285277
installFailed: '安装失败',
286-
autoCheck: '自动检查更新',
278+
autoCheck: '自动更新',
287279
checkInterval: '检查间隔',
288280
upToDate: '已是最新版本',
289281
checkFailed: '检查更新失败',
290-
noAutoCheck: "不自动检查",
282+
noAutoCheck: "不自动更新",
283+
noChangelog: '暂无更新说明',
291284
everyHour: '每小时',
292285
every6Hours: '每 6 小时',
293286
everyDay: '每天',

frontend/src/main.js

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import { setLanguage } from './i18n/index.js'
44
import { initUI, changeLanguage } from './modules/ui.js'
55
import { loadConfig } from './modules/config.js'
66
import { loadStats, switchStatsPeriod, loadStatsByPeriod, getCurrentPeriod } from './modules/stats.js'
7-
import { renderEndpoints, toggleEndpointPanel, setTransformerFilter } from './modules/endpoints.js'
7+
import { renderEndpoints, toggleEndpointPanel } from './modules/endpoints.js'
88
import { loadLogs, toggleLogPanel, changeLogLevel, copyLogs, clearLogs } from './modules/logs.js'
99
import { showDataSyncDialog } from './modules/webdav.js'
1010
import { initTips } from './modules/tips.js'
@@ -162,7 +162,6 @@ window.minimizeToTray = minimizeToTray;
162162
window.showDataSyncDialog = showDataSyncDialog;
163163
window.switchStatsPeriod = switchStatsPeriod;
164164
window.toggleEndpointPanel = toggleEndpointPanel;
165-
window.setTransformerFilter = setTransformerFilter;
166165
window.showSettingsModal = showSettingsModal;
167166
window.closeSettingsModal = closeSettingsModal;
168167
window.saveSettings = saveSettings;

frontend/src/modules/endpoints.js

Lines changed: 5 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@ let currentTestButton = null;
77
let currentTestButtonOriginalText = '';
88
let currentTestIndex = -1;
99
let endpointPanelExpanded = true;
10-
let currentTransformerFilter = 'claude';
1110

1211
function copyToClipboard(text, button) {
1312
navigator.clipboard.writeText(text).then(() => {
@@ -39,15 +38,6 @@ export function setTestState(button, index) {
3938

4039
export async function renderEndpoints(endpoints) {
4140
const container = document.getElementById('endpointList');
42-
const filterTabs = document.getElementById('endpointFilterTabs');
43-
if (filterTabs) {
44-
filterTabs.querySelectorAll('.endpoint-filter-btn').forEach((btn) => {
45-
const isActive = btn.dataset.transformer === currentTransformerFilter;
46-
btn.classList.toggle('active', isActive);
47-
btn.classList.toggle('btn-primary', isActive);
48-
btn.classList.toggle('btn-secondary', !isActive);
49-
});
50-
}
5141

5242
// Get current endpoint
5343
let currentEndpointName = '';
@@ -70,16 +60,11 @@ export async function renderEndpoints(endpoints) {
7060

7161
const endpointStats = getEndpointStats();
7262
// Display endpoints in config file order (no sorting by enabled status)
73-
const sortedEndpoints = endpoints
74-
.map((ep, index) => {
75-
const stats = endpointStats[ep.name] || { requests: 0, errors: 0, inputTokens: 0, outputTokens: 0 };
76-
const enabled = ep.enabled !== undefined ? ep.enabled : true;
77-
return { endpoint: ep, originalIndex: index, stats, enabled };
78-
})
79-
.filter(({ endpoint: ep }) => {
80-
const transformer = ep.transformer || 'claude';
81-
return transformer === currentTransformerFilter;
82-
});
63+
const sortedEndpoints = endpoints.map((ep, index) => {
64+
const stats = endpointStats[ep.name] || { requests: 0, errors: 0, inputTokens: 0, outputTokens: 0 };
65+
const enabled = ep.enabled !== undefined ? ep.enabled : true;
66+
return { endpoint: ep, originalIndex: index, stats, enabled };
67+
});
8368

8469
sortedEndpoints.forEach(({ endpoint: ep, originalIndex: index, stats }) => {
8570
const totalTokens = stats.inputTokens + stats.outputTokens;
@@ -208,11 +193,6 @@ export function toggleEndpointPanel() {
208193
}
209194
}
210195

211-
export function setTransformerFilter(transformer) {
212-
currentTransformerFilter = transformer || 'claude';
213-
window.loadConfig(); // re-render with new filter
214-
}
215-
216196
// Drag and drop state
217197
let draggedElement = null;
218198
let draggedOverElement = null;

frontend/src/modules/modal.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ function showError(message) {
1919
}
2020

2121
// Show notification
22-
function showNotification(message, type = 'info') {
22+
export function showNotification(message, type = 'info') {
2323
// Create notification element
2424
const notification = document.createElement('div');
2525
notification.className = `notification notification-${type}`;

0 commit comments

Comments
 (0)