docs(project-summary): 新增项目总结文档及内容
- 添加了“项目总结”侧边栏项,支持目录折叠,方便访问汇总内容 - 新增Cursor进阶指南文档,详解Agent模式、Composer与快捷键等高级功能 - 编写权限管理系统文档,包含系统设计、权限架构及详细使用说明 - 新添服务总线学习文档,解析@BusService注解与CGLIB动态代理机制 - 录制回放权限配置说明,新增录像回放权限位及权限隔离策略 - 提供数据库配置脚本及实施步骤,确保权限配置准确高效
This commit is contained in:
@@ -194,6 +194,14 @@ export default sidebar({
|
|||||||
prefix: "log/",
|
prefix: "log/",
|
||||||
children: "structure",
|
children: "structure",
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
text: "项目总结",
|
||||||
|
collapsible: true,
|
||||||
|
expanded: false,
|
||||||
|
icon: "mdi:book-open-page-variant",
|
||||||
|
prefix: "project-summary/",
|
||||||
|
children: "structure",
|
||||||
|
},
|
||||||
{
|
{
|
||||||
text: "常用记录",
|
text: "常用记录",
|
||||||
icon: "mdi:star",
|
icon: "mdi:star",
|
||||||
|
|||||||
603
src/programming/frontend/tools/Cursor-进阶指南.md
Normal file
603
src/programming/frontend/tools/Cursor-进阶指南.md
Normal file
@@ -0,0 +1,603 @@
|
|||||||
|
---
|
||||||
|
title: Cursor 进阶指南
|
||||||
|
icon: mdi:rocket-launch
|
||||||
|
date: 2026-02-04
|
||||||
|
category:
|
||||||
|
- 开发工具
|
||||||
|
- 前端
|
||||||
|
tag:
|
||||||
|
- Cursor
|
||||||
|
- AI编程
|
||||||
|
- 进阶技巧
|
||||||
|
- Agent
|
||||||
|
---
|
||||||
|
|
||||||
|
# Cursor 进阶指南
|
||||||
|
|
||||||
|
本指南整理自Cursor官方文档,涵盖Agent模式、Composer、快捷键配置、Context管理等高级功能,帮助开发者充分发挥Cursor的AI编程能力。
|
||||||
|
|
||||||
|
<!-- more -->
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 一、Agent 模式详解
|
||||||
|
|
||||||
|
### 1.1 Agent 是什么
|
||||||
|
|
||||||
|
Agent是Cursor的AI助手核心功能,能够独立完成复杂的编码任务、执行终端命令和修改代码。通过`Cmd+I`(Mac)或`Ctrl+I`(Windows)打开侧边栏Agent面板。
|
||||||
|
|
||||||
|
### 1.2 Agent 模式类型
|
||||||
|
|
||||||
|
| 模式 | 描述 | 适用场景 |
|
||||||
|
|------|------|----------|
|
||||||
|
| **Agent** | 自主决策完成复杂任务 | 大型重构、多文件修改 |
|
||||||
|
| **Composer** | 协作式生成代码 | 新功能开发、代码生成 |
|
||||||
|
| **Chat** | 对话式问答 | 问题解答、代码解释 |
|
||||||
|
|
||||||
|
### 1.3 Agent 基本用法
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 启动交互式会话
|
||||||
|
agent
|
||||||
|
|
||||||
|
# 带初始提示启动
|
||||||
|
agent "重构auth模块使用JWT认证"
|
||||||
|
|
||||||
|
# 非交互模式(适合脚本和CI/CD)
|
||||||
|
agent -p "Your prompt here"
|
||||||
|
|
||||||
|
# JSON输出格式
|
||||||
|
agent --print --output-format json "Your prompt here"
|
||||||
|
```
|
||||||
|
|
||||||
|
### 1.4 模式切换
|
||||||
|
|
||||||
|
- **快捷键**:`Cmd+.` 快速切换模式
|
||||||
|
- **UI操作**:Agent界面中的模式下拉菜单
|
||||||
|
- **自定义**:可在设置中配置模式切换快捷键
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 二、Composer 功能深度使用
|
||||||
|
|
||||||
|
### 2.1 Composer 核心能力
|
||||||
|
|
||||||
|
Composer是Cursor的代码生成引擎,支持:
|
||||||
|
|
||||||
|
- 多文件同时生成
|
||||||
|
- 智能依赖分析
|
||||||
|
- 代码一致性维护
|
||||||
|
- 上下文感知生成
|
||||||
|
|
||||||
|
### 2.2 Composer 最佳实践
|
||||||
|
|
||||||
|
```markdown
|
||||||
|
## 高效提示词结构
|
||||||
|
|
||||||
|
### 1. 明确任务目标
|
||||||
|
"创建一个用户认证模块,包含登录、注册、JWT token验证"
|
||||||
|
|
||||||
|
### 2. 指定技术栈
|
||||||
|
"使用TypeScript,遵循项目现有的代码风格"
|
||||||
|
|
||||||
|
### 3. 说明约束条件
|
||||||
|
"不引入新的第三方依赖,使用现有的express框架"
|
||||||
|
|
||||||
|
### 4. 分步骤执行
|
||||||
|
"第一步:设计数据库模型
|
||||||
|
第二步:创建路由
|
||||||
|
第三步:实现中间件"
|
||||||
|
```
|
||||||
|
|
||||||
|
### 2.3 Composer 生成策略
|
||||||
|
|
||||||
|
| 策略 | 说明 | 使用建议 |
|
||||||
|
|------|------|----------|
|
||||||
|
| **增量生成** | 在现有代码基础上添加 | 小改动、新功能扩展 |
|
||||||
|
| **全量生成** | 创建完整的代码文件 | 新模块、复杂功能 |
|
||||||
|
| **重构生成** | 重写现有代码 | 性能优化、架构升级 |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 三、快捷键配置与自定义
|
||||||
|
|
||||||
|
### 3.1 常用快捷键速查
|
||||||
|
|
||||||
|
| 功能 | Mac | Windows | 说明 |
|
||||||
|
|------|-----|---------|------|
|
||||||
|
| Agent面板 | `Cmd+I` | `Ctrl+I` | 打开AI助手 |
|
||||||
|
| Composer | `Cmd+L` | `Ctrl+L` | 代码生成 |
|
||||||
|
| Chat | `Cmd+J` | `Ctrl+J` | 对话问答 |
|
||||||
|
| Terminal | `` Cmd+` `` | `` Ctrl+` `` | 终端面板 |
|
||||||
|
| 命令面板 | `Cmd+Shift+P` | `Ctrl+Shift+P` | VS Code命令 |
|
||||||
|
| 文件搜索 | `Cmd+P` | `Ctrl+P` | 快速打开文件 |
|
||||||
|
|
||||||
|
### 3.2 自定义快捷键配置
|
||||||
|
|
||||||
|
通过`Cmd+Shift+J`打开Cursor设置,进入`Keyboard Shortcuts`进行配置:
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"key": "cmd+m",
|
||||||
|
"command": "cursor.generateGitCommitMessage",
|
||||||
|
"description": "生成Git提交信息"
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### 3.3 Tab 智能提示自定义
|
||||||
|
|
||||||
|
在Keyboard Shortcuts设置中搜索`Accept Cursor Tab Suggestions`,可自定义接受和拒绝建议的按键。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 四、Context 管理与配置
|
||||||
|
|
||||||
|
### 4.1 Context 是什么
|
||||||
|
|
||||||
|
Context是Cursor理解项目背景的关键,提供AI代码生成所需的上下文信息。
|
||||||
|
|
||||||
|
### 4.2 Context 类型
|
||||||
|
|
||||||
|
| 类型 | 描述 | 添加方式 |
|
||||||
|
|------|------|----------|
|
||||||
|
| **代码库** | 当前项目的所有代码 | 自动索引 |
|
||||||
|
| **选定代码** | 当前选中的代码片段 | 手动选择 |
|
||||||
|
| **文件** | 整个文件内容 | 拖拽或添加 |
|
||||||
|
| **URL** | 网页内容 | 粘贴链接 |
|
||||||
|
| **文档** | 项目文档、API文档 | 文件添加 |
|
||||||
|
| **Git Diff** | 代码变更对比 | 自动读取 |
|
||||||
|
|
||||||
|
### 4.3 Context 最佳实践
|
||||||
|
|
||||||
|
```markdown
|
||||||
|
## 有效提供Context的方法
|
||||||
|
|
||||||
|
### ✅ 推荐做法
|
||||||
|
- 提供清晰的代码文件
|
||||||
|
- 添加相关依赖的文档链接
|
||||||
|
- 说明代码的业务背景
|
||||||
|
- 展示期望的代码风格
|
||||||
|
|
||||||
|
### ❌ 避免做法
|
||||||
|
- 提供过多无关代码
|
||||||
|
- 缺少必要的上下文说明
|
||||||
|
- 混合不相关的功能需求
|
||||||
|
```
|
||||||
|
|
||||||
|
### 4.4 Cursor CLI Context 配置
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"version": 1,
|
||||||
|
"editor": { "vimMode": false },
|
||||||
|
"permissions": {
|
||||||
|
"allow": ["Shell(ls)", "Shell(echo)", "Read(src/**/*.ts)"],
|
||||||
|
"deny": ["Shell(rm)", "Read(.env*)"]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 五、MCP 与 Skills 扩展
|
||||||
|
|
||||||
|
### 5.1 MCP (Model Context Protocol)
|
||||||
|
|
||||||
|
MCP是Cursor的扩展协议,允许AI访问外部工具和数据源。
|
||||||
|
|
||||||
|
#### 主要功能
|
||||||
|
|
||||||
|
| 功能 | 描述 |
|
||||||
|
|------|------|
|
||||||
|
| **工具调用** | 执行外部工具操作 |
|
||||||
|
| **数据访问** | 连接外部数据源 |
|
||||||
|
| **API集成** | 调用第三方API |
|
||||||
|
|
||||||
|
#### 配置示例
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"mcpServers": {
|
||||||
|
"github": {
|
||||||
|
"command": "npx",
|
||||||
|
"args": ["-y", "@modelcontextprotocol/server-github"],
|
||||||
|
"env": { "GITHUB_TOKEN": "your-token" }
|
||||||
|
},
|
||||||
|
"filesystem": {
|
||||||
|
"command": "npx",
|
||||||
|
"args": ["-y", "@modelcontextprotocol/server-filesystem", "/path/to/dir"]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### 5.2 Skills 自定义
|
||||||
|
|
||||||
|
Skills是Cursor的自定义技能扩展,用于扩展AI能力。
|
||||||
|
|
||||||
|
#### Skills 结构
|
||||||
|
|
||||||
|
```
|
||||||
|
~/.cursor/skills/
|
||||||
|
├── skills/
|
||||||
|
│ ├── my-custom-skill/
|
||||||
|
│ │ ├── skill.json
|
||||||
|
│ │ ├── prompts.py
|
||||||
|
│ │ └── actions.py
|
||||||
|
│ └── another-skill/
|
||||||
|
└── config.json
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Skill 配置示例
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"name": "database-schema-generator",
|
||||||
|
"version": "1.0.0",
|
||||||
|
"description": "根据需求生成数据库Schema",
|
||||||
|
"commands": [
|
||||||
|
{
|
||||||
|
"name": "generate-schema",
|
||||||
|
"description": "生成数据库表结构"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 六、Rules 配置与个性化
|
||||||
|
|
||||||
|
### 6.1 Rules 是什么
|
||||||
|
|
||||||
|
Rules是Cursor的行为规范配置,控制AI代码生成的行为、风格和限制。
|
||||||
|
|
||||||
|
### 6.2 Rules 配置位置
|
||||||
|
|
||||||
|
- **全局配置**:`~/.cursor/rules/`
|
||||||
|
- **项目配置**:项目根目录`.cursor/rules/`
|
||||||
|
- **文件级别**:`.cursor/rules/filename.md`
|
||||||
|
|
||||||
|
### 6.3 Rules 编写示例
|
||||||
|
|
||||||
|
```markdown
|
||||||
|
---
|
||||||
|
name: vue-style-guide
|
||||||
|
description: Vue 3 组件开发规范
|
||||||
|
scope: src/**/*.vue
|
||||||
|
---
|
||||||
|
|
||||||
|
# Vue 3 组件开发规范
|
||||||
|
|
||||||
|
## 代码风格
|
||||||
|
- 使用 `<script setup>` 语法
|
||||||
|
- 组件名使用 PascalCase
|
||||||
|
- Props 定义使用 TypeScript 接口
|
||||||
|
|
||||||
|
## 命名规范
|
||||||
|
- 组件文件:PascalCase
|
||||||
|
- 组件变量:camelCase
|
||||||
|
- 常量:UPPER_SNAKE_CASE
|
||||||
|
|
||||||
|
## 最佳实践
|
||||||
|
- 优先使用组合式API
|
||||||
|
- Props 应该始终被验证
|
||||||
|
- 事件使用 emits 选项定义
|
||||||
|
```
|
||||||
|
|
||||||
|
### 6.4 Rules 优先级
|
||||||
|
|
||||||
|
| 位置 | 优先级 | 说明 |
|
||||||
|
|------|--------|------|
|
||||||
|
| 文件级别 | 最高 | 只对单个文件生效 |
|
||||||
|
| 项目级别 | 中 | 对整个项目生效 |
|
||||||
|
| 全局级别 | 最低 | 默认行为 |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 七、API 与集成
|
||||||
|
|
||||||
|
### 7.1 Cursor API 基础
|
||||||
|
|
||||||
|
#### 认证配置
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 设置API密钥
|
||||||
|
export CURSOR_API_KEY="your-api-key"
|
||||||
|
```
|
||||||
|
|
||||||
|
#### 基础调用
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Analytics API 示例
|
||||||
|
curl -X GET "https://api.cursor.com/analytics/team/dau" \
|
||||||
|
-H "Authorization: Bearer YOUR_API_KEY"
|
||||||
|
```
|
||||||
|
|
||||||
|
### 7.2 API 最佳实践
|
||||||
|
|
||||||
|
#### 1. 分页使用
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 大团队(超过100用户)使用分页防止超时
|
||||||
|
curl -X GET "https://api.cursor.com/analytics/users" \
|
||||||
|
-H "Authorization: Bearer YOUR_API_KEY" \
|
||||||
|
-d "page=1&per_page=100"
|
||||||
|
```
|
||||||
|
|
||||||
|
#### 2. 缓存策略
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 初始请求
|
||||||
|
curl -X GET "https://api.cursor.com/analytics/team/dau" \
|
||||||
|
-H "Authorization: Bearer YOUR_API_KEY" \
|
||||||
|
-D headers.txt
|
||||||
|
|
||||||
|
# 响应包含: ETag: "abc123xyz"
|
||||||
|
|
||||||
|
# 后续请求使用缓存
|
||||||
|
curl -X GET "https://api.cursor.com/analytics/team/dau" \
|
||||||
|
-H "Authorization: Bearer YOUR_API_KEY" \
|
||||||
|
-H "If-None-Match: \"abc123xyz\""
|
||||||
|
```
|
||||||
|
|
||||||
|
#### 3. 性能优化
|
||||||
|
|
||||||
|
| 优化点 | 说明 |
|
||||||
|
|--------|------|
|
||||||
|
| 合理日期范围 | 1-3个月为最佳 |
|
||||||
|
| 用户过滤 | 使用users参数减少查询 |
|
||||||
|
| ETag缓存 | 减少不必要的数据传输 |
|
||||||
|
| 批量请求 | 合并多个API调用 |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 八、终端与 Agent 集成
|
||||||
|
|
||||||
|
### 8.1 终端环境配置
|
||||||
|
|
||||||
|
#### Zsh 配置优化
|
||||||
|
|
||||||
|
```zsh
|
||||||
|
# ~/.zshrc — 当Cursor Agent运行时禁用Powerlevel10k主题
|
||||||
|
if [[ -n "$CURSOR_AGENT" ]]; then
|
||||||
|
# 跳过主题初始化以获得更好兼容性
|
||||||
|
else
|
||||||
|
[[ -r ~/.p10k.zsh ]] && source ~/.p10k.zsh
|
||||||
|
fi
|
||||||
|
```
|
||||||
|
|
||||||
|
### 8.2 Agent 终端权限
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"permissions": {
|
||||||
|
"allow": [
|
||||||
|
"Shell(ls)",
|
||||||
|
"Shell(git)",
|
||||||
|
"Shell(npm run *)",
|
||||||
|
"Read(src/**/*.ts)",
|
||||||
|
"Write(package.json)"
|
||||||
|
],
|
||||||
|
"deny": [
|
||||||
|
"Shell(rm -rf *)",
|
||||||
|
"Read(.env*)",
|
||||||
|
"Write(**/*.key)"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 九、从 VS Code 迁移
|
||||||
|
|
||||||
|
### 9.1 一键导入
|
||||||
|
|
||||||
|
1. 打开Cursor设置 (`Cmd+Shift+J`)
|
||||||
|
2. 进入 `General > Account`
|
||||||
|
3. 在"VS Code Import"下点击Import按钮
|
||||||
|
|
||||||
|
### 9.2 导入内容
|
||||||
|
|
||||||
|
| 项目 | 说明 |
|
||||||
|
|------|------|
|
||||||
|
| 设置 | 编辑器配置、主题 |
|
||||||
|
| 扩展 | 已安装的插件 |
|
||||||
|
| 快捷键 | 键盘映射 |
|
||||||
|
| 代码片段 | Snippets |
|
||||||
|
|
||||||
|
### 9.3 手动迁移项目
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 在Cursor中打开VS Code项目目录
|
||||||
|
cd /path/to/vscode/project
|
||||||
|
cursor .
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 十、高级技巧与最佳实践
|
||||||
|
|
||||||
|
### 10.1 高效提示词技巧
|
||||||
|
|
||||||
|
```markdown
|
||||||
|
## 结构化提示词模板
|
||||||
|
|
||||||
|
### 任务描述
|
||||||
|
[简要说明要做什么]
|
||||||
|
|
||||||
|
### 上下文
|
||||||
|
[提供相关的代码和文档]
|
||||||
|
|
||||||
|
### 要求
|
||||||
|
1. [具体要求1]
|
||||||
|
2. [具体要求2]
|
||||||
|
3. [具体要求3]
|
||||||
|
|
||||||
|
### 约束
|
||||||
|
- [限制条件1]
|
||||||
|
- [限制条件2]
|
||||||
|
|
||||||
|
### 期望输出
|
||||||
|
[描述期望的代码风格和结构]
|
||||||
|
```
|
||||||
|
|
||||||
|
### 10.2 Agent 模式选择
|
||||||
|
|
||||||
|
| 场景 | 推荐模式 | 原因 |
|
||||||
|
|------|----------|------|
|
||||||
|
| 理解代码逻辑 | Chat | 交互式问答 |
|
||||||
|
| 新功能开发 | Composer | 代码生成 |
|
||||||
|
| 复杂重构 | Agent | 自主决策 |
|
||||||
|
| Bug修复 | Agent + Chat | 分析+修复 |
|
||||||
|
|
||||||
|
### 10.3 性能优化建议
|
||||||
|
|
||||||
|
```markdown
|
||||||
|
## 提升响应速度
|
||||||
|
|
||||||
|
### 1. 精简Context
|
||||||
|
- 只添加相关文件
|
||||||
|
- 避免过大的文件
|
||||||
|
- 使用文件摘要而非全文
|
||||||
|
|
||||||
|
### 2. 明确任务范围
|
||||||
|
- 分解复杂任务为小步骤
|
||||||
|
- 避免模糊的指令
|
||||||
|
- 提供具体示例
|
||||||
|
|
||||||
|
### 3. 利用Rules
|
||||||
|
- 定义项目代码规范
|
||||||
|
- 配置常用代码模式
|
||||||
|
- 减少重复说明
|
||||||
|
```
|
||||||
|
|
||||||
|
### 10.4 常见问题解决
|
||||||
|
|
||||||
|
| 问题 | 解决方案 |
|
||||||
|
|------|----------|
|
||||||
|
| AI回答不准确 | 提供更多上下文 |
|
||||||
|
| 生成代码有误 | 指定代码风格Rules |
|
||||||
|
| 响应速度慢 | 精简Context范围 |
|
||||||
|
| 格式错误 | 使用代码块标记 |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 十一、Git 集成
|
||||||
|
|
||||||
|
### 11.1 提交信息生成
|
||||||
|
|
||||||
|
配置快捷键生成Git提交信息:
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"key": "cmd+m",
|
||||||
|
"command": "cursor.generateGitCommitMessage"
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### 11.2 代码审查辅助
|
||||||
|
|
||||||
|
- 使用Agent分析代码变更
|
||||||
|
- 生成审查报告
|
||||||
|
- 建议改进方案
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 十二、CLI 高级用法
|
||||||
|
|
||||||
|
### 12.1 非交互式使用
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 管道输入
|
||||||
|
echo "修复登录bug" | agent -p --print
|
||||||
|
|
||||||
|
# 脚本集成
|
||||||
|
#!/bin/bash
|
||||||
|
agent -p "在第$LINE行添加日志" --print
|
||||||
|
```
|
||||||
|
|
||||||
|
### 12.2 输出格式控制
|
||||||
|
|
||||||
|
| 格式 | 用途 |
|
||||||
|
|------|------|
|
||||||
|
| `text` | 可读文本(默认) |
|
||||||
|
| `json` | 程序处理 |
|
||||||
|
| `stream-json` | 流式JSON |
|
||||||
|
|
||||||
|
```bash
|
||||||
|
agent --print --output-format json "Your prompt"
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 十三、团队协作
|
||||||
|
|
||||||
|
### 13.1 共享配置
|
||||||
|
|
||||||
|
| 配置项 | 共享方式 |
|
||||||
|
|--------|----------|
|
||||||
|
| Rules | 提交到代码仓库 |
|
||||||
|
| Settings | Settings Sync |
|
||||||
|
| 快捷键 | 导出JSON分享 |
|
||||||
|
|
||||||
|
### 13.2 团队最佳实践
|
||||||
|
|
||||||
|
```markdown
|
||||||
|
## 团队Cursor配置建议
|
||||||
|
|
||||||
|
### 1. 统一代码规范
|
||||||
|
- 创建项目级Rules
|
||||||
|
- 定义代码风格指南
|
||||||
|
- 配置导入规则
|
||||||
|
|
||||||
|
### 2. 共享快捷键
|
||||||
|
- 统一常用操作快捷键
|
||||||
|
- 避免冲突
|
||||||
|
- 文档化自定义快捷键
|
||||||
|
|
||||||
|
### 3. Agent模式规范
|
||||||
|
- 定义使用场景
|
||||||
|
- 明确审批流程
|
||||||
|
- 代码审查标准
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 十四、资源与支持
|
||||||
|
|
||||||
|
### 14.1 官方资源
|
||||||
|
|
||||||
|
| 资源 | 链接 |
|
||||||
|
|------|------|
|
||||||
|
| 官网 | cursor.com |
|
||||||
|
| 文档 | docs.cursor.com |
|
||||||
|
| 社区 | forum.cursor.com |
|
||||||
|
| GitHub | github.com/cursor |
|
||||||
|
|
||||||
|
### 14.2 学习路径
|
||||||
|
|
||||||
|
```
|
||||||
|
入门 → 进阶 → 专家
|
||||||
|
↓ ↓ ↓
|
||||||
|
基础 Agent 团队
|
||||||
|
用法 Rules 规模化
|
||||||
|
配置 MCP 定制化
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 十五、总结
|
||||||
|
|
||||||
|
1. **Agent模式**:根据任务复杂度选择合适的模式
|
||||||
|
2. **Context管理**:精准提供上下文信息
|
||||||
|
3. **Rules配置**:定义项目代码规范
|
||||||
|
4. **快捷键优化**:提升工作效率
|
||||||
|
5. **团队协作**:标准化配置共享
|
||||||
|
6. **持续学习**:关注官方文档更新
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
> 最后更新:2026年2月
|
||||||
|
> 参考文档:cursor.com/docs
|
||||||
9
src/work/project-summary/README.md
Normal file
9
src/work/project-summary/README.md
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
---
|
||||||
|
title: 项目总结
|
||||||
|
index: false
|
||||||
|
icon: mdi:book-open-page-variant
|
||||||
|
category:
|
||||||
|
- 工作
|
||||||
|
---
|
||||||
|
|
||||||
|
<Catalog />
|
||||||
225
src/work/project-summary/录像回放权限配置说明.md
Normal file
225
src/work/project-summary/录像回放权限配置说明.md
Normal file
@@ -0,0 +1,225 @@
|
|||||||
|
---
|
||||||
|
icon: mdi:video-outline
|
||||||
|
date: 2026-03-05
|
||||||
|
category:
|
||||||
|
- 工作
|
||||||
|
- 项目总结
|
||||||
|
tag:
|
||||||
|
- 权限配置
|
||||||
|
- 录像回放
|
||||||
|
title: 录像回放权限配置说明
|
||||||
|
---
|
||||||
|
|
||||||
|
录像回放权限配置说明
|
||||||
|
<!-- more -->
|
||||||
|
|
||||||
|
# 录像回放权限配置说明
|
||||||
|
|
||||||
|
## 概述
|
||||||
|
|
||||||
|
根据系统权限说明文档中的权限隔离原则,为录像回放相关功能设置了单独的权限位(权限位21:RECORD_PLAYBACK),实现与实时监控权限的独立控制。
|
||||||
|
|
||||||
|
## 修改内容
|
||||||
|
|
||||||
|
### 1. 权限常量定义
|
||||||
|
|
||||||
|
**文件**: `platapp/04_sunri-web-patrol/sunri-web-center-utils/src/main/java/com/sunri/constant/RightConstant.java`
|
||||||
|
|
||||||
|
**修改内容**: 添加录像回放权限常量
|
||||||
|
```java
|
||||||
|
// 录像回放: 操作员,对应实时监控->录像回放相关界面的浏览、查询权限
|
||||||
|
public static final int RECORD_PLAYBACK = 21;
|
||||||
|
```
|
||||||
|
|
||||||
|
同时更新了操作员权限注释,增加 `RECORD_PLAYBACK` 权限位。
|
||||||
|
|
||||||
|
### 2. Controller API权限注解更新
|
||||||
|
|
||||||
|
#### 2.1 HighDefinitionVideoEquipmentController.java
|
||||||
|
|
||||||
|
**文件**: `platapp/04_sunri-web-patrol/sunri-web-center-cygbusiness/cygbusiness-model/src/main/java/com/sunri/model/controller/account/HighDefinitionVideoEquipmentController.java`
|
||||||
|
|
||||||
|
**修改的API方法**:
|
||||||
|
- `getVideoFileList` - 录像-获取文件列表
|
||||||
|
- `getVideoFileUrl` - 录像-获取回放地址
|
||||||
|
- `stopVideoFileUrl` - 录像-停止回放/推流
|
||||||
|
- `videoPlayBackControl` - 录像-回放控制
|
||||||
|
- `videoProgress` - 录像-进度获取
|
||||||
|
- `getAfterCalibrationStartTime` - 录像-获取校准后开始时间
|
||||||
|
|
||||||
|
**权限变更**: 从 `@ApiRight(value = {REAL_TIME_MONITORING})` 改为 `@ApiRight(value = {RECORD_PLAYBACK})`
|
||||||
|
|
||||||
|
#### 2.2 ResourceController.java
|
||||||
|
|
||||||
|
**文件**: `platapp/04_sunri-web-patrol/sunri-web-center-standalone/standalone-patrol/src/main/java/com/sunri/controller/ResourceController.java`
|
||||||
|
|
||||||
|
**修改的API方法**:
|
||||||
|
- `downloadVideoChunk` - 下载文件到浏览器(分片)
|
||||||
|
- `getDownloadChunkSize` - 获取下载文件分片数
|
||||||
|
|
||||||
|
**权限变更**: 从 `@ApiRight(value = {REAL_TIME_MONITORING, ALGORITHM_VERIFICATION})` 改为 `@ApiRight(value = {REAL_TIME_MONITORING, RECORD_PLAYBACK, ALGORITHM_VERIFICATION})`
|
||||||
|
|
||||||
|
#### 2.3 HighDefinitionVideoMonitorController.java
|
||||||
|
|
||||||
|
**文件**: `platapp/04_sunri-web-patrol/sunri-web-center-cygbusiness/cygbusiness-model/src/main/java/com/sunri/model/controller/monitor/HighDefinitionVideoMonitorController.java`
|
||||||
|
|
||||||
|
**修改的API方法**:
|
||||||
|
- `videoDownload` - 录像-开始下载/手动录像
|
||||||
|
|
||||||
|
**权限变更**: 从 `@ApiRight(value = {DEVICE_CONTROL})` 改为 `@ApiRight(value = {RECORD_PLAYBACK})`
|
||||||
|
|
||||||
|
### 3. 数据库配置脚本
|
||||||
|
|
||||||
|
```sql
|
||||||
|
-- 录像回放权限配置脚本
|
||||||
|
-- 功能:为录像回放相关功能添加权限位21(RECORD_PLAYBACK)的单独控制
|
||||||
|
|
||||||
|
-- 1. 添加录像回放权限常量到 cfg_auth_const 表
|
||||||
|
INSERT INTO cfg_auth_const (right, description, create_time, update_time)
|
||||||
|
VALUES (21, '录像回放', NOW(), NOW())
|
||||||
|
ON DUPLICATE KEY UPDATE description = '录像回放', update_time = NOW();
|
||||||
|
|
||||||
|
-- 2. 查找录像回放相关的菜单ID
|
||||||
|
-- SELECT id, name, nodeid, url FROM cfg_menu WHERE name LIKE '%录像%' OR name LIKE '%回放%';
|
||||||
|
|
||||||
|
-- 3. 为录像回放菜单绑定权限位21(按实际菜单修改)
|
||||||
|
-- INSERT INTO cfg_resource_right (resource_id, right)
|
||||||
|
-- VALUES (7, 21)
|
||||||
|
-- ON DUPLICATE KEY UPDATE right = 21;
|
||||||
|
|
||||||
|
-- INSERT INTO cfg_resource_right (resource_id, right)
|
||||||
|
-- SELECT id, 21 FROM cfg_menu WHERE nodeid = 'LXHF'
|
||||||
|
-- ON DUPLICATE KEY UPDATE right = 21;
|
||||||
|
|
||||||
|
-- 4. 更新角色权限配置(示例)
|
||||||
|
-- UPDATE user_role_info SET role_authority = role_authority | 2097152 WHERE role_name = '操作员';
|
||||||
|
-- UPDATE user_role_info SET role_authority = role_authority | 2097216 WHERE role_name = '监控操作员';
|
||||||
|
-- UPDATE user_role_info SET role_authority = role_authority | 2097152 WHERE role_name = '录像查询员';
|
||||||
|
|
||||||
|
-- 5. 验证配置
|
||||||
|
-- SELECT * FROM cfg_auth_const WHERE right = 21;
|
||||||
|
-- SELECT mr.*, m.name, m.nodeid FROM cfg_resource_right mr JOIN cfg_menu m ON mr.resource_id = m.id WHERE mr.right = 21;
|
||||||
|
-- SELECT role_id, role_name, role_authority, (role_authority & 2097152) > 0 AS has_record_playback_permission FROM user_role_info;
|
||||||
|
|
||||||
|
-- 回滚SQL
|
||||||
|
-- DELETE FROM cfg_auth_const WHERE right = 21;
|
||||||
|
-- DELETE FROM cfg_resource_right WHERE right = 21;
|
||||||
|
-- UPDATE user_role_info SET role_authority = role_authority & ~2097152 WHERE role_authority & 2097152 > 0;
|
||||||
|
```
|
||||||
|
|
||||||
|
## 权限隔离优势
|
||||||
|
|
||||||
|
通过将录像回放权限从实时监控权限中独立出来,实现了以下优势:
|
||||||
|
|
||||||
|
| 场景 | 实时监控权限(6) | 录像回放权限(21) | 说明 |
|
||||||
|
|------|----------------|------------------|------|
|
||||||
|
| 实时监控员 | ✅ | ❌ | 只能查看实时监控画面 |
|
||||||
|
| 录像查询员 | ❌ | ✅ | 只能查看历史录像回放 |
|
||||||
|
| 监控操作员 | ✅ | ✅ | 既能看实时监控也能看录像回放 |
|
||||||
|
| 数据分析员 | ❌ | ✅ | 只能进行录像数据分析 |
|
||||||
|
|
||||||
|
## 实施步骤
|
||||||
|
|
||||||
|
### 代码修改(已完成)
|
||||||
|
|
||||||
|
1. ✅ 在 `RightConstant.java` 中添加 `RECORD_PLAYBACK = 21` 常量
|
||||||
|
2. ✅ 更新录像回放相关API的权限注解
|
||||||
|
3. ✅ 创建数据库配置脚本
|
||||||
|
|
||||||
|
### 数据库配置(需要手动执行)
|
||||||
|
|
||||||
|
1. 备份数据库
|
||||||
|
2. 执行上文中的 SQL 配置脚本
|
||||||
|
3. 根据实际菜单数据,确认录像回放菜单的ID或nodeid
|
||||||
|
4. 更新角色权限配置
|
||||||
|
5. 验证配置是否正确
|
||||||
|
|
||||||
|
### 系统部署
|
||||||
|
|
||||||
|
1. 编译代码
|
||||||
|
2. 部署应用
|
||||||
|
3. 执行数据库配置脚本
|
||||||
|
4. 相关用户重新登录以获取新权限
|
||||||
|
|
||||||
|
## 权限位计算
|
||||||
|
|
||||||
|
- **权限位21的值**: 2^21 = 2,097,152
|
||||||
|
- **实时监控权限位6的值**: 2^6 = 64
|
||||||
|
- **同时拥有实时监控和录像回放权限**: 64 + 2,097,152 = 2,097,216
|
||||||
|
|
||||||
|
### 角色权限配置示例
|
||||||
|
|
||||||
|
```sql
|
||||||
|
-- 操作员:增加录像回放权限
|
||||||
|
UPDATE user_role_info SET role_authority = role_authority | 2097152 WHERE role_name = '操作员';
|
||||||
|
|
||||||
|
-- 监控操作员:拥有实时监控和录像回放权限
|
||||||
|
UPDATE user_role_info SET role_authority = role_authority | 2097216 WHERE role_name = '监控操作员';
|
||||||
|
|
||||||
|
-- 录像查询员:只拥有录像回放权限
|
||||||
|
UPDATE user_role_info SET role_authority = role_authority | 2097152 WHERE role_name = '录像查询员';
|
||||||
|
```
|
||||||
|
|
||||||
|
## 注意事项
|
||||||
|
|
||||||
|
1. **数据库备份**: 执行数据库脚本前,请务必备份数据库
|
||||||
|
2. **菜单确认**: 脚本中的菜单ID需要根据实际情况进行确认和修改
|
||||||
|
3. **角色权限**: 角色权限配置需要根据实际业务需求进行调整
|
||||||
|
4. **用户登录**: 修改角色权限后,相关用户需要重新登录才能生效
|
||||||
|
5. **权限测试**: 部署后请进行全面的权限测试,确保权限控制正确
|
||||||
|
|
||||||
|
## 回滚方案
|
||||||
|
|
||||||
|
如需回滚,请执行以下操作:
|
||||||
|
|
||||||
|
1. 恢复代码版本
|
||||||
|
2. 执行上文中的回滚 SQL 脚本
|
||||||
|
3. 重新部署应用
|
||||||
|
4. 相关用户重新登录
|
||||||
|
|
||||||
|
## 验证方法
|
||||||
|
|
||||||
|
### 代码验证
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 搜索所有使用RECORD_PLAYBACK权限的API
|
||||||
|
grep -r "RECORD_PLAYBACK" --include="*.java" platapp/
|
||||||
|
```
|
||||||
|
|
||||||
|
### 数据库验证
|
||||||
|
|
||||||
|
```sql
|
||||||
|
-- 查看权限常量
|
||||||
|
SELECT * FROM cfg_auth_const WHERE right = 21;
|
||||||
|
|
||||||
|
-- 查看菜单权限绑定
|
||||||
|
SELECT mr.*, m.name, m.nodeid
|
||||||
|
FROM cfg_resource_right mr
|
||||||
|
JOIN cfg_menu m ON mr.resource_id = m.id
|
||||||
|
WHERE mr.right = 21;
|
||||||
|
|
||||||
|
-- 查看角色权限
|
||||||
|
SELECT role_id, role_name, role_authority,
|
||||||
|
(role_authority & 2097152) > 0 AS has_record_playback_permission
|
||||||
|
FROM user_role_info;
|
||||||
|
```
|
||||||
|
|
||||||
|
### 功能验证
|
||||||
|
|
||||||
|
1. 创建只拥有录像回放权限的用户角色
|
||||||
|
2. 使用该角色登录系统
|
||||||
|
3. 验证只能访问录像回放功能,不能访问实时监控功能
|
||||||
|
4. 创建只拥有实时监控权限的用户角色
|
||||||
|
5. 使用该角色登录系统
|
||||||
|
6. 验证只能访问实时监控功能,不能访问录像回放功能
|
||||||
|
|
||||||
|
## 相关文档
|
||||||
|
|
||||||
|
- 权限管理系统文档.md: 完整的权限管理说明文档
|
||||||
|
|
||||||
|
## 版本信息
|
||||||
|
|
||||||
|
- **修改日期**: 2026-03-05
|
||||||
|
- **修改人员**: 系统管理员
|
||||||
|
- **版本**: 1.0.0
|
||||||
|
- **状态**: 已完成代码修改和数据库配置
|
||||||
202
src/work/project-summary/服务总线学习.md
Normal file
202
src/work/project-summary/服务总线学习.md
Normal file
@@ -0,0 +1,202 @@
|
|||||||
|
---
|
||||||
|
icon: mdi:transit-connection-variant
|
||||||
|
date: 2026-03-05
|
||||||
|
category:
|
||||||
|
- 工作
|
||||||
|
- 项目总结
|
||||||
|
tag:
|
||||||
|
- 服务总线
|
||||||
|
- CGLIB
|
||||||
|
- 权限系统
|
||||||
|
title: 服务总线学习
|
||||||
|
---
|
||||||
|
|
||||||
|
服务总线学习
|
||||||
|
<!-- more -->
|
||||||
|
|
||||||
|
# @BusService 注解与 CGLIB 动态代理机制学习记录
|
||||||
|
|
||||||
|
## 1. 概述
|
||||||
|
本次学习深入探讨了 `@BusService` 注解配合 CGLIB 动态代理实现的无本地实现接口代理机制,了解了服务总线架构中客户端如何通过动态代理调用远程服务。
|
||||||
|
|
||||||
|
## 2. @BusService 注解的作用
|
||||||
|
|
||||||
|
### 2.1 注解定义
|
||||||
|
`@BusService` 注解位于 `/platform/00_depends/00_sunri-bus-service-dependency-thrift/src/main/java/com/sunri/annotation/BusService.java`,包含以下关键属性:
|
||||||
|
- `name()` - 服务名称(如 "cygdevopsweb")
|
||||||
|
- `dataclass()` - 数据类别(如 "statistic")
|
||||||
|
- `app()` - 应用名称
|
||||||
|
- `datatype()` - 数据类型
|
||||||
|
|
||||||
|
### 2.2 注解处理流程
|
||||||
|
1. **扫描**:`ServiceBusBeanAutoDefinitionConfig.definitionConsumer()` 方法扫描带有 `@BusService` 注解的接口
|
||||||
|
2. **验证**:检查注解有效性、服务名称、排除列表等
|
||||||
|
3. **过滤**:确保接口属于指定包名且未重复注册
|
||||||
|
|
||||||
|
## 3. CGLIB 动态代理机制
|
||||||
|
|
||||||
|
### 3.1 代理对象创建位置
|
||||||
|
在 `ServiceBusBeanAutoDefinitionConfig.java` 第409-445行的循环中:
|
||||||
|
|
||||||
|
```java
|
||||||
|
if (c.isInterface()) { // 409行
|
||||||
|
if (!c.getName().contains(pkgname)) { // 410-412行
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
// ... 验证逻辑 ...
|
||||||
|
|
||||||
|
// Bean构建
|
||||||
|
BusService service = (BusService) c.getAnnotation(BusService.class); // 417行
|
||||||
|
if (service == null || "".equals(service.name()) || exclude.contains(service.name())) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 创建服务信息
|
||||||
|
ServiceInfo serviceInfo = new ServiceInfo(); // 425行
|
||||||
|
serviceInfo.setPaname(StringUtils.isEmpty(service.app()) ? busClientConfig.getPaname() : service.app());
|
||||||
|
serviceInfo.setServname(service.name());
|
||||||
|
// ... 设置其他服务信息
|
||||||
|
|
||||||
|
// 注册Bean定义
|
||||||
|
BeanDefinitionBuilder builder = BeanDefinitionBuilder.genericBeanDefinition(c); // 434行
|
||||||
|
GenericBeanDefinition definition = (GenericBeanDefinition) builder.getRawBeanDefinition();
|
||||||
|
definition.getPropertyValues().add("interfaceClass", c); // 436行
|
||||||
|
definition.getPropertyValues().add("serviceInfo", serviceInfo); // 437行
|
||||||
|
definition.getPropertyValues().add("clientManager", clientManager); // 438行
|
||||||
|
definition.setBeanClass(BusClientFactoryBean.class); // 439行
|
||||||
|
definition.setRole(BeanDefinition.ROLE_INFRASTRUCTURE);
|
||||||
|
definition.setAutowireMode(GenericBeanDefinition.AUTOWIRE_BY_TYPE);
|
||||||
|
String name = toLowerCaseFirstOne(c.getSimpleName()); // 442行
|
||||||
|
dbf.registerBeanDefinition(name, definition); // 443行
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### 3.2 BusClientFactoryBean 核心实现
|
||||||
|
位于 `/platform/00_depends/00_sunri-bus-service-dependency-thrift/src/main/java/com/sunri/client/mapper/BusClientFactoryBean.java`:
|
||||||
|
|
||||||
|
```java
|
||||||
|
@Override
|
||||||
|
public T getObject() throws Exception {
|
||||||
|
enhancer.setSuperclass(interfaceClass); // 29行 设置要代理的接口
|
||||||
|
interceptor.setClientManager(clientManager); // 30行 设置客户端管理器
|
||||||
|
interceptor.setServiceInfo(serviceInfo); // 31行 设置服务信息
|
||||||
|
enhancer.setCallback(interceptor); // 32行 设置拦截器
|
||||||
|
return (T) enhancer.create(); // 33行 创建代理对象
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### 3.3 BusClientInterceptor 拦截器
|
||||||
|
位于 `/platform/00_depends/00_sunri-bus-service-dependency-thrift/src/main/java/com/sunri/client/mapper/BusClientInterceptor.java`:
|
||||||
|
- 拦截所有接口方法调用
|
||||||
|
- 将本地方法调用转换为远程服务调用
|
||||||
|
- 通过 Thrift 协议发送到远程服务端
|
||||||
|
|
||||||
|
## 4. Spring Bean 生命周期集成
|
||||||
|
|
||||||
|
### 4.1 Bean 定义注册
|
||||||
|
- **触发位置**:`ServiceBusBeanAutoDefinitionConfig.postProcessBeanDefinitionRegistry()`
|
||||||
|
- **执行时机**:Spring 容器启动时,在 `BeanDefinitionRegistryPostProcessor` 阶段
|
||||||
|
- **结果**:将每个带 `@BusService` 注解的接口注册为由 `BusClientFactoryBean` 创建的 Bean
|
||||||
|
|
||||||
|
### 4.2 属性自动注入机制
|
||||||
|
在 `ServiceBusBeanAutoDefinitionConfig.definitionConsumer()` 第436-438行:
|
||||||
|
```java
|
||||||
|
definition.getPropertyValues().add("interfaceClass", c); // 接口类
|
||||||
|
definition.getPropertyValues().add("serviceInfo", serviceInfo); // 服务信息
|
||||||
|
definition.getPropertyValues().add("clientManager", clientManager); // 客户端管理器
|
||||||
|
```
|
||||||
|
|
||||||
|
Spring 框架内部通过反射机制自动调用对应的 setter 方法:
|
||||||
|
- `setInterfaceClass()` → 注入接口类
|
||||||
|
- `setServiceInfo()` → 注入服务信息
|
||||||
|
- `setClientManager()` → 注入客户端管理器
|
||||||
|
|
||||||
|
### 4.3 Bean 实例化
|
||||||
|
当应用通过 `@Autowired` 或 `context.getBean()` 获取接口实例时:
|
||||||
|
1. Spring 发现该 Bean 由 `BusClientFactoryBean` 创建
|
||||||
|
2. 调用 `BusClientFactoryBean.getObject()`
|
||||||
|
3. CGLIB 创建动态代理对象
|
||||||
|
4. 返回代理对象给应用
|
||||||
|
|
||||||
|
## 5. 工作流程总结
|
||||||
|
|
||||||
|
```
|
||||||
|
应用启动 → ServiceBusBeanAutoDefinitionConfig 扫描 @BusService 注解的接口
|
||||||
|
↓
|
||||||
|
为每个接口创建 BusClientFactoryBean 定义并注册到 Spring 容器
|
||||||
|
↓
|
||||||
|
应用代码获取接口实例 (@Autowired 或 getBean)
|
||||||
|
↓
|
||||||
|
Spring 调用 BusClientFactoryBean.getObject()
|
||||||
|
↓
|
||||||
|
CGLIB 创建接口的动态代理对象
|
||||||
|
↓
|
||||||
|
应用调用接口方法时由 BusClientInterceptor 拦截
|
||||||
|
↓
|
||||||
|
拦截器将方法调用转换为远程服务调用
|
||||||
|
↓
|
||||||
|
通过 Thrift 协议发送到远程服务端执行
|
||||||
|
↓
|
||||||
|
返回结果给调用方
|
||||||
|
```
|
||||||
|
|
||||||
|
## 6. 关键特点
|
||||||
|
|
||||||
|
### 6.1 透明性
|
||||||
|
- 客户端代码无需关心底层网络通信
|
||||||
|
- 接口调用如同本地调用一样简单
|
||||||
|
|
||||||
|
### 6.2 解耦性
|
||||||
|
- 客户端只依赖接口定义
|
||||||
|
- 无需知道服务实现的位置和细节
|
||||||
|
|
||||||
|
### 6.3 动态性
|
||||||
|
- 运行时动态生成代理类
|
||||||
|
- 支持灵活的服务定位和负载均衡
|
||||||
|
|
||||||
|
## 7. Spring FactoryBean属性注入机制
|
||||||
|
|
||||||
|
### 7.1 RegisterCenterClientFactoryBean属性注入流程
|
||||||
|
|
||||||
|
**调用位置**:`ServiceBusBeanAutoDefinitionConfig.postProcessBeanDefinitionRegistry()` 第211-218行
|
||||||
|
|
||||||
|
**实现机制**:
|
||||||
|
1. **属性值设置**:通过`BeanDefinition.getPropertyValues().add()`方法设置属性
|
||||||
|
2. **自动注入**:Spring容器在Bean创建过程中自动调用对应的setter方法
|
||||||
|
3. **多态引用**:`private RegisterCenterClient client`字段声明为接口类型,运行时指向`RegisterCenterDefaultClient`实例
|
||||||
|
|
||||||
|
**上下文依赖**:
|
||||||
|
- 依赖Spring的Bean生命周期管理
|
||||||
|
-需要BeanDefinitionRegistryPostProcessor阶段的支持
|
||||||
|
- 依赖属性编辑器和类型转换机制
|
||||||
|
|
||||||
|
### 7.2完整调用链
|
||||||
|
```java
|
||||||
|
// 1. 创建Bean定义
|
||||||
|
BeanDefinitionBuilder builder = BeanDefinitionBuilder.genericBeanDefinition(RegisterCenterClient.class);
|
||||||
|
GenericBeanDefinition definition = (GenericBeanDefinition) builder.getRawBeanDefinition();
|
||||||
|
|
||||||
|
// 2. 设置属性值(关键步骤)
|
||||||
|
definition.getPropertyValues().add("interfaceClass", RegisterCenterClient.class);
|
||||||
|
definition.getPropertyValues().add("client", zkClient); // zkClient是RegisterCenterDefaultClient实例
|
||||||
|
|
||||||
|
// 3.指定FactoryBean类
|
||||||
|
definition.setBeanClass(RegisterCenterClientFactoryBean.class);
|
||||||
|
|
||||||
|
// 4. Spring内部调用setter方法
|
||||||
|
// setInterfaceClass(RegisterCenterClient.class)
|
||||||
|
// setClient(RegisterCenterDefaultClient实例)
|
||||||
|
|
||||||
|
// 5. getObject()返回具体实现
|
||||||
|
@Override
|
||||||
|
public T getObject() throws Exception {
|
||||||
|
return (T) client; // 返回RegisterCenterDefaultClient实例
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## 8.技术栈
|
||||||
|
- **CGLIB**:用于动态代理类生成
|
||||||
|
- **Spring Framework**:用于 Bean 生命周期管理和依赖注入
|
||||||
|
- **Thrift**:用于远程服务通信协议
|
||||||
|
- **Zookeeper**:用于服务注册与发现
|
||||||
|
- **Curator**:用于Zookeeper客户端连接管理
|
||||||
1321
src/work/project-summary/权限管理系统文档.md
Normal file
1321
src/work/project-summary/权限管理系统文档.md
Normal file
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user