refactor: 优化代码结构并修复多个问题

修复 ruleComponent.tsx 和 ruleBuilderUtils.ts 中 queryToAutoScoreRule 函数的参数问题
调整 database.rs 中 state_guard 的 drop 位置
优化 EventEmitter 和 Context 中的 once 方法实现
移除 Sidebar.tsx 和 OOBE.tsx 中未使用的代码
格式化 MCP 使用文档和规则文件
This commit is contained in:
Yukino_fox
2026-03-22 19:26:35 +08:00
parent 63dda3e043
commit 5be6bd09d2
11 changed files with 26 additions and 31 deletions
+1 -4
View File
@@ -2,7 +2,4 @@
trigger: always_on trigger: always_on
--- ---
1.每次完成任务之前必须跑一遍测试(比如说npm系的typecheck/lint 1.每次完成任务之前必须跑一遍测试(比如说npm系的typecheck/lint2.每次完成任务之前必须跑一遍格式化(比如说npm系的prettier)3.任务完成时详细输出你所做的事情和需要用户确认的问题(如有)4.每次规划任务必须按照步骤来,每个步骤结束后遵循第三条规定。
2.每次完成任务之前必须跑一遍格式化(比如说npm系的prettier
3.任务完成时详细输出你所做的事情和需要用户确认的问题(如有)
4.每次规划任务必须按照步骤来,每个步骤结束后遵循第三条规定。
+7 -7
View File
@@ -25,19 +25,19 @@
你可以在前端通过 Tauri `invoke` 调用: 你可以在前端通过 Tauri `invoke` 调用:
```ts ```ts
import { invoke } from '@tauri-apps/api/core'; import { invoke } from "@tauri-apps/api/core"
await invoke('mcp_server_start', { await invoke("mcp_server_start", {
config: { config: {
host: '127.0.0.1', host: "127.0.0.1",
port: 3901, port: 3901,
}, },
}); })
const status = await invoke('mcp_server_status'); const status = await invoke("mcp_server_status")
console.log(status); console.log(status)
await invoke('mcp_server_stop'); await invoke("mcp_server_stop")
``` ```
说明: 说明:
+1 -1
View File
@@ -1061,7 +1061,6 @@ pub async fn db_switch_connection(
Some("database"), Some("database"),
None, None,
); );
drop(state_guard);
let (db_type, saved_connection_string, saved_status, conn) = if connection_string let (db_type, saved_connection_string, saved_status, conn) = if connection_string
.starts_with("postgres://") .starts_with("postgres://")
@@ -1170,6 +1169,7 @@ pub async fn db_switch_connection(
conn, conn,
) )
}; };
drop(state_guard);
{ {
let settings_db_path = sqlite_db_path(&app_handle)?; let settings_db_path = sqlite_db_path(&app_handle)?;
+1 -2
View File
@@ -7,7 +7,7 @@ import { useTheme } from "../../contexts/ThemeContext"
import { changeLanguage, AppLanguage, languageOptions } from "../../i18n" import { changeLanguage, AppLanguage, languageOptions } from "../../i18n"
import type { themeConfig } from "../../preload/types" import type { themeConfig } from "../../preload/types"
import logoSvg from "../../assets/logoHD.svg" import logoSvg from "../../assets/logoHD.svg"
import { useResponsive, useScreenSize } from "../../hooks/useResponsive" import { useResponsive } from "../../hooks/useResponsive"
interface oobeProps { interface oobeProps {
visible: boolean visible: boolean
@@ -102,7 +102,6 @@ export const OOBE: React.FC<oobeProps> = ({ visible, onComplete }) => {
const { currentTheme, setTheme, themes, applyTheme } = useTheme() const { currentTheme, setTheme, themes, applyTheme } = useTheme()
const [messageApi, contextHolder] = message.useMessage() const [messageApi, contextHolder] = message.useMessage()
const breakpoint = useResponsive() const breakpoint = useResponsive()
const { width: screenWidth, height: screenHeight } = useScreenSize()
const isMobile = breakpoint === "xs" || breakpoint === "sm" const isMobile = breakpoint === "xs" || breakpoint === "sm"
const [currentStep, setCurrentStep] = useState<oobeStep>("entry") const [currentStep, setCurrentStep] = useState<oobeStep>("entry")
+3 -1
View File
@@ -1163,7 +1163,9 @@ export const Settings: React.FC<{ permission: permissionLevel }> = ({ permission
<div style={{ fontSize: "16px", fontWeight: 600, marginBottom: "8px" }}> <div style={{ fontSize: "16px", fontWeight: 600, marginBottom: "8px" }}>
{t("settings.mcp.title")} {t("settings.mcp.title")}
</div> </div>
<div style={{ color: "var(--ss-text-secondary)", marginBottom: "12px", fontSize: "12px" }}> <div
style={{ color: "var(--ss-text-secondary)", marginBottom: "12px", fontSize: "12px" }}
>
{t("settings.mcp.description")} {t("settings.mcp.description")}
</div> </div>
<Space style={{ marginBottom: "12px" }}> <Space style={{ marginBottom: "12px" }}>
-3
View File
@@ -14,7 +14,6 @@ import {
} from "@ant-design/icons" } from "@ant-design/icons"
import { useState, useEffect } from "react" import { useState, useEffect } from "react"
import { useTranslation } from "react-i18next" import { useTranslation } from "react-i18next"
import { useResponsive } from "../hooks/useResponsive"
import appLogo from "../assets/logoHD.svg" import appLogo from "../assets/logoHD.svg"
const { Sider } = Layout const { Sider } = Layout
@@ -45,8 +44,6 @@ export function Sidebar({
onFloatingExpandedChange, onFloatingExpandedChange,
}: SidebarProps): React.JSX.Element { }: SidebarProps): React.JSX.Element {
const { t } = useTranslation() const { t } = useTranslation()
const breakpoint = useResponsive()
const isMobile = breakpoint === "xs" || breakpoint === "sm"
const [dbStatus, setDbStatus] = useState<DbStatus>({ type: "sqlite", connected: true }) const [dbStatus, setDbStatus] = useState<DbStatus>({ type: "sqlite", connected: true })
const [syncLoading, setSyncLoading] = useState(false) const [syncLoading, setSyncLoading] = useState(false)
const [messageApi, contextHolder] = message.useMessage() const [messageApi, contextHolder] = message.useMessage()
+1 -1
View File
@@ -62,7 +62,7 @@ export const defaultQuery: RuleGroupType = {
rules: [{ field: "interval_time_passed", operator: "=", value: "1440" }], rules: [{ field: "interval_time_passed", operator: "=", value: "1440" }],
} }
export function queryToAutoScoreRule(_query: RuleGroupType): AutoScoreRuleData { export function queryToAutoScoreRule(): AutoScoreRuleData {
const triggers: AutoScoreTrigger[] = [] const triggers: AutoScoreTrigger[] = []
/* const processRuleGroup = (group: RuleGroupType, relation: 'AND' | 'OR' = 'AND') => { /* const processRuleGroup = (group: RuleGroupType, relation: 'AND' | 'OR' = 'AND') => {
+1 -1
View File
@@ -37,7 +37,7 @@ export const RuleComponent: React.FC<RuleComponentProps> = ({ initialData, onCha
const handleQueryChange = (newQuery: RuleGroupType) => { const handleQueryChange = (newQuery: RuleGroupType) => {
setQuery(newQuery) setQuery(newQuery)
if (onChange) { if (onChange) {
const ruleData = queryToAutoScoreRule(newQuery) const ruleData = queryToAutoScoreRule()
onChange(ruleData) onChange(ruleData)
} }
} }
+4 -2
View File
@@ -309,8 +309,10 @@ const api = {
mcpServerStart: (config?: { mcpServerStart: (config?: {
port?: number port?: number
host?: string host?: string
}): Promise<{ success: boolean; data?: { url: string; config: { port: number; host: string } } }> => }): Promise<{
invoke("mcp_server_start", { config }), success: boolean
data?: { url: string; config: { port: number; host: string } }
}> => invoke("mcp_server_start", { config }),
mcpServerStop: (): Promise<{ success: boolean }> => invoke("mcp_server_stop"), mcpServerStop: (): Promise<{ success: boolean }> => invoke("mcp_server_stop"),
mcpServerStatus: (): Promise<{ mcpServerStatus: (): Promise<{
success: boolean success: boolean
+4 -6
View File
@@ -20,9 +20,8 @@ export class EventEmitter {
} }
once(event: string | symbol, listener: eventListener): this { once(event: string | symbol, listener: eventListener): this {
const self = this const onceListener: eventListener = (...args) => {
const onceListener: eventListener = function (...args) { this.off(event, onceListener)
self.off(event, onceListener)
listener(...args) listener(...args)
} }
return this.on(event, onceListener) return this.on(event, onceListener)
@@ -72,9 +71,8 @@ export class Context extends EventEmitter {
} }
once(event: string | symbol, listener: eventListener): this { once(event: string | symbol, listener: eventListener): this {
const self = this const onceListener: eventListener = (...args) => {
const onceListener: eventListener = function (...args) { this.off(event, onceListener)
self.off(event, onceListener)
listener(...args) listener(...args)
} }
super.on(event, onceListener) super.on(event, onceListener)