本文引用的文件
本规范面向清鉴 AI 调查工具的多语言代码库,覆盖 Java、TypeScript/Vue、SQL、Shell/Batch 的命名约定、目录组织、注释和格式化规则。重点说明前端 Prettier、ESLint、Stylelint 配置及忽略策略,明确 Electron 主进程、preload、渲染进程的隔离边界;同时给出后端 Spring Boot 模块划分、controller/service/mapper/entity 的组织方式,以及 MyBatis-Plus 实体与 SQL 脚本编写约定。文末提供新增模块示例、常见违规问题和可执行修复命令。
仓库采用多模块、前后端分离、桌面应用加 Web 前端的组合结构:
graph TB
A["仓库根目录"] --> B["ai-electron<br/>Electron 桌面应用"]
A --> C["ai-server<br/>Spring Boot 后端"]
A --> D["ai-gateway<br/>网关或辅助服务"]
A --> E["sql<br/>数据库脚本"]
A --> F["deploy、cmd、docs 等工程化资源"]
B --> B1["electron/<br/>主进程与 preload"]
B --> B2["frontend/<br/>Vue + TypeScript 前端"]
C --> C1["src/main/java/com/zsjz/ai/module/*<br/>业务模块"]
C --> C2["src/main/java/com/zsjz/ai/common/*<br/>通用能力"]
C --> C3["src/main/resources/*<br/>配置与映射"]
E --> E1["平台库脚本<br/>如 user.sql"]
E --> E2["案件库/测试脚本<br/>如 case_table.sql、testSql/*"]
图表来源
章节来源
Prettier 是前端样式与代码格式的单一事实来源,所有 JavaScript、TypeScript、Vue、Less、SCSS、HTML、JSON 等由它决定换行、缩进、引号、分号、尾逗号等细节。
核心规则要点:
.rc 类配置文件使用 JSON 解析器。prettier-plugin-packagejson 以格式化 package.json。章节来源
ESLint 负责语法错误、类型提示、Vue 模板规则、Prettier 集成等。当前配置按文件类型分块:
no-undef、no-var-requires、no-unused-vars 等。vue-eslint-parser。vue/no-v-html。@typescript-eslint/parser。章节来源
Stylelint 主要检查 Less、SCSS、Vue 模板中的样式,并与 Prettier 协作。
关键约定:
stylelint-config-standard、stylelint-config-standard-less。postcss-html 解析。postcss-less。postcss-scss。global、deep、v-deep、v-global、v-slotted。top/right/bottom/left,但禁止 inset 值。rpx。章节来源
Prettier 忽略以下路径与文件:
dist。public。node_modules。.local。.npmrc、.output.js。*.sh。*.md。*.svg、*.html、*.json、*-lock.yaml。Stylelint 忽略:
dist、public、node_modules。*.sh、*.md。ESLint 在配置内部也忽略了 node_modules、dist、public、build、git、编辑器目录、shell 脚本、Markdown、字体、类型声明、快照等。
章节来源
package.json 定义了常用命令:
pnpm lint:eslint:检查并尝试修复 TS、TSX、MJS、Vue。pnpm lint:prettier:检查并写入 Vue、TSX、Less、SCSS。pnpm lint:stylelint:检查并修复 Vue、Less、SCSS、CSS。pnpm lint:all:安装依赖、类型检查、运行 ESLint、Prettier、Stylelint。章节来源
本项目当前 Electron 渲染进程未启用上下文隔离,而是通过主进程直接暴露 IPC 给渲染进程。
主进程使用 ElectronEgg 启动应用,注册生命周期钩子,并注册 preload。
sequenceDiagram
participant Main as "main.ts"
participant Lifecycle as "preload/lifecycle.ts"
participant Preload as "preload/index.ts"
participant App as "ElectronEgg"
Main->>App: new ElectronEgg()
Main->>Lifecycle: new Lifecycle()
Main->>App: register("ready", ready)
Main->>App: register("window-ready", windowReady)
Main->>App: register("before-close", beforeClose)
Main->>App: register("preload", preload)
Main->>App: run()
图表来源
preload 初始化托盘服务和安全服务,并通过日志记录加载阶段。当前 preload 本身没有向渲染进程暴露 API。
flowchart TD
Start(["preload 入口"]) --> Tray["创建托盘服务"]
Tray --> Security["创建安全服务"]
Security --> End(["完成初始化"])
图表来源
由于当前窗口配置关闭了 contextIsolation 并开启 nodeIntegration,渲染进程可直接使用 require('electron')。仓库中存在一个 bridge 示例,使用 contextBridge.exposeInMainWorld 暴露 ipcRenderer,但在当前共享 webPreferences 下,该桥接并非唯一路径。
graph LR
Renderer["渲染进程"] -->|直接 require electron| NodeAPI["Node/Electron API"]
Renderer -->|contextBridge 示例| Bridge["bridge.ts 暴露 ipcRenderer"]
Bridge --> Renderer
图表来源
当前实现为了兼容现有渲染进程代码,显式设置:
contextIsolation: falsenodeIntegration: true这意味着渲染进程可以调用 Node.js 和 Electron 原生 API。若未来改为上下文隔离,必须:
contextBridge 暴露最小接口。章节来源
后端包路径以 com.zsjz.ai 为基础,业务功能按模块拆分到 module 下。已有模块包括:
plat:平台基础能力,如用户、系统信息、健康检查、会话、SSE 等。aiclean:AI 清洗、模板、同义词、规则、字段、批处理、作业等。agent:Agent 聊天、工具、模型、附件、Python 执行、RAG、意图等。knowledge:知识库文档、基座、下载日志等。dm:数据管理、文件识别等。external、otg、person、trans、search、govern 等扩展领域模块。每个模块通常包含:
api:对外 REST 控制器。controller:其他控制器(部分模块直接使用 controller)。service:业务逻辑。mapper:MyBatis Mapper。entity:数据库实体。tree、rag、followup、artifact 等。BaseMapper,定义数据访问接口。Entity:使用 Lombok 与 MyBatis-Plus 注解映射数据库表。
classDiagram
class AiCleanSynonymController {
+list()
+create(row)
+update(row)
+delete(row)
+toggle(row)
}
class AiCleanSynonymService {
+list()
+create(row)
+update(row)
+delete(id)
+toggle(id, status)
-assertWordsFree(stdWord, aliasWord, excludeId)
-refreshAfterCommit()
}
class AiCleanSynonymMapper {
+selectList(wrapper)
+insert(entity)
+updateById(entity)
+deleteById(id)
}
class AiCleanSynonym {
+id
+stdWord
+aliasWord
+remark
+status
+createBy
+createTime
+updateTime
}
AiCleanSynonymController --> AiCleanSynonymService : "调用"
AiCleanSynonymService --> AiCleanSynonymMapper : "调用"
AiCleanSynonymService --> AiCleanSynonym : "操作实体"
图表来源
章节来源
AiCleanSynonym、AiCleanSynonymController。create、update、assertWordsFree。STARTUP_PROBE_RETRIES(前端也有类似模式)。@Data 简化 getter/setter。@TableName 指定表名。@TableId(type = IdType.ASSIGN_ID)。@TableField。LocalDateTime。Serializable,保留 serialVersionUID。module.<domain>.mapper。BaseMapper<Entity>。@Mapper 注解。@Service。@RequiredArgsConstructor 注入依赖。@Transactional。CREATE TABLE IF NOT EXISTS 保证幂等。COMMENT ON TABLE 和 COMMENT ON COLUMN 描述表和列。CREATE INDEX 和 CREATE UNIQUE INDEX 建立必要索引。ALTER TABLE ... ADD COLUMN IF NOT EXISTS 做增量迁移。INSERT INTO ... SELECT ... WHERE NOT EXISTS 做幂等初始化数据。章节来源
假设新增“线索追踪”模块,包结构应遵循现有 module 模式:
com.zsjz.ai.module.tracking
├── api
│ └── TrackingController.java
├── service
│ └── TrackingService.java
├── mapper
│ └── TrackingMapper.java
├── entity
│ └── TrackingRecord.java
对应约定:
api,使用 @RestController 和 @RequestMapping。@Service,写操作加 @Transactional。BaseMapper,加 @Mapper。@TableName、@TableId、@TableField、Javadoc 注释。章节来源
现有前端大量使用 Vue 3 <script setup lang="ts"> 组合式 API,并在 <template> 中使用 Ant Design Vue、UnoCSS、国际化等能力。参考根组件和组织方式:
flowchart TD
Entry["main.ts 创建 Vue 应用"] --> Router["路由初始化"]
Entry --> Store["Pinia 状态初始化"]
Entry --> I18n["国际化初始化"]
Entry --> ErrorHandle["全局错误处理"]
Entry --> Directives["全局指令"]
Entry --> Components["全局组件注册"]
Entry --> Root["App.vue 根组件"]
图表来源
组件编写建议:
<script setup lang="ts">。computed、watch、onMounted。章节来源
参考平台用户表脚本,新建一张“线索追踪记录表”时应遵循:
CREATE TABLE IF NOT EXISTS。COMMENT ON TABLE 和 COMMENT ON COLUMN。INSERT INTO ... SELECT ... WHERE NOT EXISTS。如果需要对存量表迁移,使用 ALTER TABLE ... ADD COLUMN IF NOT EXISTS。
flowchart TD
Header["脚本头部注释"] --> Create["CREATE TABLE IF NOT EXISTS"]
Create --> Columns["字段定义与默认值"]
Columns --> Indexes["索引与唯一约束"]
Indexes --> Comments["表和列注释"]
Comments --> Data["幂等初始化数据"]
Data --> Migration["存量迁移与校验"]
图表来源
章节来源
any、non-null assertion、unused vars 等被关闭的规则,导致类型安全下降。在前端工程目录执行:
修复 ESLint:
pnpm lint:eslint
修复 Prettier:
pnpm lint:prettier
修复 Stylelint:
pnpm lint:stylelint
一次性完整检查:
pnpm lint:all
章节来源
清鉴 AI 调查工具的代码规范以 Prettier 为格式事实来源,ESLint 负责语法与 Vue/TS 质量,Stylelint 负责样式质量;Electron 当前采用较宽松的渲染进程权限,需在未来逐步收敛到 preload 桥接;后端 Spring Boot 按模块与分层组织,使用 MyBatis-Plus 与 PostgreSQL,强调实体注解、Service 事务、Mapper 简洁、SQL 幂等与注释;前端 Vue 使用组合式 API、Ant Design Vue、UnoCSS,并通过统一脚本命令维护代码质量。遵循这些约定可以降低协作成本、减少风格分歧,并使自动化检查和修复更有效。