新增文件行数限制规则和批量查询规范,优化同步脚本

  - 新增文件行数限制规则(Java 300/Go 400/Vue 200/TS 300/Python 300)
  - Java 开发规范新增批量查询规范(IN 子句 ≤ 500,分批查询工具方法)
  - 优化同步配置脚本,改为删除旧目录+整体复制策略
This commit is contained in:
wwj committed 2026-02-25 11:14:08 +08:00
1 parent fafb94dcc7
commit fbc5af8685
4 files changed
+156 -198

No files matched your search

+36
View File
@@ -0,0 +1,36 @@
---
paths: "**/*.{go,java,vue,tsx,jsx,ts,js,py}"
---
# 文件行数限制
> 控制单文件复杂度,减少 token 消耗,提升可维护性。
---
## 行数上限
| 语言 | 上限 | 说明 |
|------|------|------|
| Java | 300 行 | Spring 分层清晰,超过说明职责过多 |
| Go | 400 行 | 错误处理导致偏长,但超过 400 应拆分 |
| Vue | 200 行 | 样式已抽到 assets/styles,模板+逻辑 200 行足够 |
| TSX/JSX | 200 行 | 同 Vue |
| TypeScript/JS | 300 行 | 工具类、服务类 |
| Python | 300 行 | 模块化拆分 |
## 超限时的处理
**新建文件时**:预估超限则提前拆分,不要写完再拆
**修改现有文件时**:
- 不强制重构现有大文件
- 新增功能如果会导致超限,拆到新文件
## 拆分指引
| 语言 | 拆分方式 |
|------|---------|
| Java | Service 拆分职责、提取 Helper/Converter 类 |
| Go | 按功能拆分同包文件(如 `user_query.go`、`user_update.go`) |
| Vue | 提取子组件、composables、样式到 assets/styles |
| TS/JS | 提取工具函数、常量、类型到独立文件 |
+29
View File
@@ -101,6 +101,35 @@ public class UserDTO {
---
## 批量查询规范
| 规则 | 说明 |
|------|------|
| ❌ 禁止 IN 子句超过 500 个参数 | SQL 解析开销大,执行计划不稳定 |
| ✅ 超过时分批查询 | 每批 500,合并结果 |
| ✅ 封装通用工具方法 | 避免每处手写分批逻辑 |
```java
// ❌ 1700 个 ID 一次查询
List<User> users = userRepository.findByIdIn(allIds); // IN 子句过长
// ✅ 分批查询工具方法
public static <T, R> List<R> batchQuery(List<T> params, int batchSize,
Function<List<T>, List<R>> queryFn) {
List<R> result = new ArrayList<>();
for (int i = 0; i < params.size(); i += batchSize) {
List<T> batch = params.subList(i, Math.min(i + batchSize, params.size()));
result.addAll(queryFn.apply(batch));
}
return result;
}
// 使用
List<User> users = batchQuery(allIds, 500, ids -> userRepository.findByIdIn(ids));
```
---
## 异常处理
```java
+49 -102
View File
@@ -3,119 +3,66 @@ setlocal enabledelayedexpansion
REM 同步 .claude 和 .gemini 配置到用户根目录
REM 获取用户根目录
set "HOME_DIR=%USERPROFILE%"
REM 当前脚本所在目录
set "SCRIPT_DIR=%~dp0"
set "SCRIPT_DIR=%SCRIPT_DIR:~0,-1%"
REM 需要同步的目录
set "SYNC_DIRS=.claude .gemini"
REM 全局覆盖策略(空表示每次询问,yes表示全部覆盖,no表示全部跳过)
set "OVERWRITE_ALL="
echo === 配置同步工具 ===
echo 源目录: %SCRIPT_DIR%
echo 目标目录: %HOME_DIR%
echo.
for %%d in (%SYNC_DIRS%) do (
call :sync_directory "%%d"
REM --- Claude Code ---
if exist "%SCRIPT_DIR%\.claude" (
echo [Claude Code] 开始同步
REM 确保目标目录存在
if not exist "%HOME_DIR%\.claude" mkdir "%HOME_DIR%\.claude"
REM 删除旧配置目录(保留历史记录、projects 等)
if exist "%HOME_DIR%\.claude\rules" rmdir /s /q "%HOME_DIR%\.claude\rules"
if exist "%HOME_DIR%\.claude\skills" rmdir /s /q "%HOME_DIR%\.claude\skills"
if exist "%HOME_DIR%\.claude\commands" rmdir /s /q "%HOME_DIR%\.claude\commands"
if exist "%HOME_DIR%\.claude\templates" rmdir /s /q "%HOME_DIR%\.claude\templates"
if exist "%HOME_DIR%\.claude\tasks" rmdir /s /q "%HOME_DIR%\.claude\tasks"
echo 已清理旧配置目录
REM 复制配置目录
xcopy /e /i /q "%SCRIPT_DIR%\.claude\rules" "%HOME_DIR%\.claude\rules"
xcopy /e /i /q "%SCRIPT_DIR%\.claude\skills" "%HOME_DIR%\.claude\skills"
xcopy /e /i /q "%SCRIPT_DIR%\.claude\commands" "%HOME_DIR%\.claude\commands"
xcopy /e /i /q "%SCRIPT_DIR%\.claude\templates" "%HOME_DIR%\.claude\templates"
xcopy /e /i /q "%SCRIPT_DIR%\.claude\tasks" "%HOME_DIR%\.claude\tasks"
copy /y "%SCRIPT_DIR%\.claude\CLAUDE.md" "%HOME_DIR%\.claude\CLAUDE.md" >nul
echo [√] rules/ skills/ commands/ templates/ tasks/ CLAUDE.md
) else (
echo [Claude Code] 源目录不存在,跳过
)
echo.
REM --- Gemini CLI ---
if exist "%SCRIPT_DIR%\.gemini" (
echo [Gemini CLI] 开始同步
REM 确保目标目录存在
if not exist "%HOME_DIR%\.gemini" mkdir "%HOME_DIR%\.gemini"
REM 删除旧配置目录(保留认证信息)
if exist "%HOME_DIR%\.gemini\commands" rmdir /s /q "%HOME_DIR%\.gemini\commands"
echo 已清理旧配置目录
REM 复制配置
xcopy /e /i /q "%SCRIPT_DIR%\.gemini\commands" "%HOME_DIR%\.gemini\commands"
copy /y "%SCRIPT_DIR%\.gemini\GEMINI.md" "%HOME_DIR%\.gemini\GEMINI.md" >nul
copy /y "%SCRIPT_DIR%\.gemini\settings.json" "%HOME_DIR%\.gemini\settings.json" >nul
echo [√] commands/ GEMINI.md settings.json
) else (
echo [Gemini CLI] 源目录不存在,跳过
)
echo.
echo === 同步完成 ===
pause
goto :eof
:sync_directory
set "dir_name=%~1"
set "src_dir=%SCRIPT_DIR%\%dir_name%"
set "dest_dir=%HOME_DIR%\%dir_name%"
if not exist "%src_dir%" (
echo [警告] 源目录不存在,跳过: %src_dir%
goto :eof
)
echo.
echo [开始同步] %dir_name%
REM 创建目标目录
if not exist "%dest_dir%" (
mkdir "%dest_dir%"
)
REM 复制所有文件(使用 xcopy)
for /r "%src_dir%" %%f in (*) do (
set "file=%%f"
set "rel_path=!file:%src_dir%\=!"
set "dest_file=%dest_dir%\!rel_path!"
REM 创建目标子目录
for %%p in ("!dest_file!") do (
set "dest_subdir=%%~dpp"
if not exist "!dest_subdir!" (
mkdir "!dest_subdir!"
)
)
REM 检查文件是否存在
if exist "!dest_file!" (
REM 先检查全局策略
if "!OVERWRITE_ALL!"=="yes" (
copy /y "%%f" "!dest_file!" >nul
echo [√] 已覆盖: !dest_file!
) else if "!OVERWRITE_ALL!"=="no" (
echo [×] 已跳过: !dest_file!
) else (
call :confirm_overwrite "!dest_file!" "%%f"
if errorlevel 1 (
echo [×] 已跳过: !dest_file!
) else (
copy /y "%%f" "!dest_file!" >nul
echo [√] 已覆盖: !dest_file!
)
)
) else (
copy "%%f" "!dest_file!" >nul
echo [√] 已复制: !dest_file!
)
)
goto :eof
:confirm_overwrite
set "dest=%~1"
set "src=%~2"
REM 如果已设置全局策略,直接返回
if "!OVERWRITE_ALL!"=="yes" (
exit /b 0
)
if "!OVERWRITE_ALL!"=="no" (
exit /b 1
)
REM 询问用户
echo [!] 文件已存在: %dest%
set /p "response=是否覆盖? [y/N/a(全部覆盖)/s(全部跳过)]: "
REM 处理用户输入
if /i "!response!"=="a" (
set "OVERWRITE_ALL=yes"
echo [√] 后续文件将全部覆盖
exit /b 0
)
if /i "!response!"=="s" (
set "OVERWRITE_ALL=no"
echo [√] 后续文件将全部跳过
exit /b 1
)
if /i "!response!"=="y" (
exit /b 0
)
REM 默认不覆盖(空输入或其他输入)
exit /b 1
+42 -96
View File
@@ -9,113 +9,59 @@ GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m'
# 获取用户根目录
HOME_DIR="${HOME}"
# 当前脚本所在目录
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
# 需要同步的目录
SYNC_DIRS=(".claude" ".gemini")
echo -e "${GREEN}=== 配置同步工具 ===${NC}"
echo -e "源目录: ${SCRIPT_DIR}"
echo -e "目标目录: ${HOME}"
echo ""
# 全局覆盖策略(空表示每次询问,yes表示全部覆盖,no表示全部跳过)
OVERWRITE_ALL=""
# --- Claude Code ---
if [[ -d "${SCRIPT_DIR}/.claude" ]]; then
echo -e "${GREEN}[Claude Code] 开始同步${NC}"
# 确认覆盖函数
confirm_overwrite() {
local file="${1}"
# 确保目标目录存在
mkdir -p ~/.claude
# 如果已设置全局策略,直接返回
if [[ "${OVERWRITE_ALL}" == "yes" ]]; then
return 0
elif [[ "${OVERWRITE_ALL}" == "no" ]]; then
return 1
fi
# 删除旧配置目录(保留历史记录、projects 等)
rm -rf ~/.claude/rules ~/.claude/skills ~/.claude/commands ~/.claude/templates ~/.claude/tasks
echo -e "${YELLOW} 已清理旧配置目录${NC}"
# 询问用户
echo -e "${YELLOW}文件已存在: ${file}${NC}"
echo -ne "是否覆盖? [y/N/a(全部覆盖)/s(全部跳过)]: "
read -r response < /dev/tty
# 复制配置目录
cp -r "${SCRIPT_DIR}/.claude/rules" ~/.claude/
cp -r "${SCRIPT_DIR}/.claude/skills" ~/.claude/
cp -r "${SCRIPT_DIR}/.claude/commands" ~/.claude/
cp -r "${SCRIPT_DIR}/.claude/templates" ~/.claude/
cp -r "${SCRIPT_DIR}/.claude/tasks" ~/.claude/
cp "${SCRIPT_DIR}/.claude/CLAUDE.md" ~/.claude/
case "${response}" in
[aA])
OVERWRITE_ALL="yes"
echo -e "${GREEN}后续文件将全部覆盖${NC}"
return 0
;;
[sS])
OVERWRITE_ALL="no"
echo -e "${GREEN}后续文件将全部跳过${NC}"
return 1
;;
[yY])
return 0
;;
*)
return 1
;;
esac
}
echo -e "${GREEN} ✓ rules/ skills/ commands/ templates/ tasks/ CLAUDE.md${NC}"
else
echo -e "${YELLOW}[Claude Code] 源目录不存在,跳过${NC}"
fi
# 复制文件函数
copy_file() {
local src="${1}"
local dest="${2}"
echo ""
if [[ -f "${dest}" ]]; then
if confirm_overwrite "${dest}"; then
cp -f "${src}" "${dest}"
echo -e "${GREEN}✓ 已覆盖: ${dest}${NC}"
else
echo -e "${YELLOW}✗ 已跳过: ${dest}${NC}"
fi
else
cp "${src}" "${dest}"
echo -e "${GREEN}✓ 已复制: ${dest}${NC}"
fi
}
# --- Gemini CLI ---
if [[ -d "${SCRIPT_DIR}/.gemini" ]]; then
echo -e "${GREEN}[Gemini CLI] 开始同步${NC}"
# 同步目录函数
sync_directory() {
local dir_name="${1}"
local src_dir="${SCRIPT_DIR}/${dir_name}"
local dest_dir="${HOME_DIR}/${dir_name}"
# 确保目标目录存在
mkdir -p ~/.gemini
if [[ ! -d "${src_dir}" ]]; then
echo -e "${YELLOW}源目录不存在,跳过: ${src_dir}${NC}"
return
fi
# 删除旧配置目录(保留认证信息)
rm -rf ~/.gemini/commands
echo -e "${YELLOW} 已清理旧配置目录${NC}"
echo -e "\n${GREEN}开始同步: ${dir_name}${NC}"
# 复制配置
cp -r "${SCRIPT_DIR}/.gemini/commands" ~/.gemini/
cp "${SCRIPT_DIR}/.gemini/GEMINI.md" ~/.gemini/
cp "${SCRIPT_DIR}/.gemini/settings.json" ~/.gemini/
# 创建目标目录(如果不存在)
mkdir -p "${dest_dir}"
echo -e "${GREEN} ✓ commands/ GEMINI.md settings.json${NC}"
else
echo -e "${YELLOW}[Gemini CLI] 源目录不存在,跳过${NC}"
fi
# 递归处理所有文件
while IFS= read -r -d '' file; do
local rel_path="${file#${src_dir}/}"
local dest_file="${dest_dir}/${rel_path}"
local dest_subdir="$(dirname "${dest_file}")"
# 创建子目录
mkdir -p "${dest_subdir}"
# 复制文件
copy_file "${file}" "${dest_file}"
done < <(find "${src_dir}" -type f -print0)
}
# 主流程
main() {
echo -e "${GREEN}=== 配置同步工具 ===${NC}"
echo -e "源目录: ${SCRIPT_DIR}"
echo -e "目标目录: ${HOME_DIR}"
for dir in "${SYNC_DIRS[@]}"; do
sync_directory "${dir}"
done
echo -e "\n${GREEN}=== 同步完成 ===${NC}"
}
main
echo ""
echo -e "${GREEN}=== 同步完成 ===${NC}"