feat: 添加自定义 URL 协议支持及悬浮侧边栏显隐控制

- 新增 `secscore://` 自定义 URL 协议,支持通过链接直接导航至应用内页面(如 `secscore://settings`)和控制悬浮侧边栏(如 `secscore://sidebar/toggle`)
- 在系统托盘菜单中添加“显隐悬浮侧边栏”选项
- 在设置页面添加“URL 链接”选项卡,提供协议说明和手动注册按钮
- 应用支持单实例运行,后续协议调用将转发至现有实例
- 更新构建配置以注册 URL 协议,并添加详细的使用说明文档
- 修复 WindowManager 中可能因 settings 未初始化导致的潜在错误
This commit is contained in:
Fox_block
2026-01-23 11:06:27 +08:00
parent b9749fe0a8
commit 6d2346f3b1
9 changed files with 519 additions and 8 deletions
+58
View File
@@ -60,6 +60,8 @@ export const Settings: React.FC<{ permission: permissionLevel }> = ({ permission
const [settleLoading, setSettleLoading] = useState(false)
const [settleDialogVisible, setSettleDialogVisible] = useState(false)
const [urlRegisterLoading, setUrlRegisterLoading] = useState(false)
const canAdmin = permission === 'admin'
const permissionTag = useMemo(() => {
@@ -535,6 +537,62 @@ export const Settings: React.FC<{ permission: permissionLevel }> = ({ permission
</Card>
</Tabs.TabPanel>
<Tabs.TabPanel value="url" label="URL 链接">
<Card style={{ backgroundColor: 'var(--ss-card-bg)', color: 'var(--ss-text-main)' }}>
<div style={{ fontSize: '16px', fontWeight: 600, marginBottom: '8px' }}>
URL (secscore://)
</div>
<Divider />
<div style={{ marginBottom: '12px', fontSize: '13px', color: 'var(--ss-text-secondary)' }}>
URL SecScore
</div>
<div
style={{
display: 'flex',
flexDirection: 'column',
gap: '4px',
fontSize: '12px',
fontFamily:
'ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", "Microsoft YaHei UI", "Microsoft YaHei", "PingFang SC", monospace'
}}
>
<div>secscore://settings</div>
<div>secscore://score</div>
<div>secscore://sidebar/toggle</div>
</div>
<Divider />
<Space>
<Button
theme="primary"
loading={urlRegisterLoading}
disabled={!canAdmin}
onClick={async () => {
if (!(window as any).api) return
setUrlRegisterLoading(true)
const res = await (window as any).api.registerUrlProtocol()
setUrlRegisterLoading(false)
if (res && res.success) {
MessagePlugin.success('URL 协议已注册')
} else {
MessagePlugin.error(res?.message || '注册失败')
}
}}
>
URL
</Button>
</Space>
<div
style={{
marginTop: '8px',
fontSize: '12px',
color: 'var(--ss-text-secondary)'
}}
>
SecScore
</div>
</Card>
</Tabs.TabPanel>
<Tabs.TabPanel value="about" label="关于">
<Card style={{ backgroundColor: 'var(--ss-card-bg)', color: 'var(--ss-text-main)' }}>
<div style={{ fontSize: '16px', fontWeight: 700, marginBottom: '8px' }}>SecScore</div>