feat:
新增文件行数限制规则和批量查询规范,优化同步脚本 - 新增文件行数限制规则(Java 300/Go 400/Vue 200/TS 300/Python 300) - Java 开发规范新增批量查询规范(IN 子句 ≤ 500,分批查询工具方法) - 优化同步配置脚本,改为删除旧目录+整体复制策略
This commit is contained in:
1 parent
fafb94dcc7
commit
fbc5af8685
4 files changed
+156
-198
No files matched your search
@@ -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 | 提取工具函数、常量、类型到独立文件 |
|
||||
@@ -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
@@ -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
@@ -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}"
|
||||
Reference in new issue
Block a user