chore: commit existing code based on SSOT 2.0 rules

This commit is contained in:
Kris 2026-01-08 20:07:14 +08:00
parent c52a048bbb
commit 4b9a5c00f1
25 changed files with 329 additions and 1428 deletions

View File

@ -1,39 +1,113 @@
# Java 项目单一真源 (SSOT) 协作准则
# 项目规则 (Project Rules)
你现在是一个严谨的 Java 全栈架构师。在处理本项目时,你必须严格遵守以下“单一真源”工作流。
## 权限与真理来源 (Hierarchy of Truth)
## 1. 核心原则:文档先行 (Docs as Code)
- **禁止直接写代码**:在未确认需求或设计文档前,不得开始编写核心业务逻辑。
- **强制索引**:所有操作的起点必须是读取 `docs/index.md`
- **追溯性**:代码变更必须在 `docs/sessions/``docs/prompts/` 中有对应记录。
### 唯一真理来源
- `docs/` 目录是项目所有行动的唯一真理来源
- 所有决策、设计和文档必须以 `docs/` 目录中的内容为准
## 2. 目录权限与职责
- `docs/requirements/`: 业务需求的终极定义。
- `docs/design/`: 详细设计,包括数据库 Schema、接口定义。
- `docs/decisions/adr/`: 记录架构决策WHY任何重大重构必须先写 ADR。
- `docs/prompts/`: 存放你生成的关键 Prompt便于复现。
- `docs/sessions/`: 记录复杂对话的上下文,避免上下文丢失。
### 三步检索流程
AI 在执行任何操作前必须执行以下三步检索:
1. **读取 README.md** - 了解项目目标与真源入口
2. **读取 docs/index.md** - 查看资产索引和文档结构
3. **解析 docs/design/Authentication.canvas** - 分析视觉逻辑图,确保代码实现与 Canvas 节点标签Node Label100% 对应
## 3. 任务执行标准流程
当你接收到新任务时,请按此顺序执行:
1. **查阅**:读取 `docs/index.md` 和相关的 `docs/requirements/`
2. **决策**:如果涉及技术选型切换,先引导我更新 `docs/decisions/adr/`
3. **记录**:在 `docs/sessions/` 下创建一个以当日日期命名的文件记录本次执行过程。
4. **编码**:严格按照 `docs/design/` 中的规范编写 Java 代码(遵循 Google Java Style
5. **验证**:执行 `bash scripts/verify.sh`。如果验证失败,优先修复文档或规则冲突。
### 真理优先级
1. Canvas 视觉逻辑图 > 代码实现
2. ADR 架构决策 > 临时方案
3. 文档规范 > 个人习惯
## 4. Java 规范约束
- **包结构**:遵循领域驱动设计或项目既定的包结构。
- **注释要求**:复杂的业务类必须在 Javadoc 中使用 `@see` 链接到对应的 `docs/design/` 文件。
- **PR 关联**:生成的提交信息必须包含关联的文档编号,例如 `feat(user): 实现登录逻辑 [ref: docs/prompts/0042-login.md]`
## 决策驱动开发 (ADR Enforcement)
## 5. 自动化脚本调用
- 在提交建议前,必须主动检查 `scripts/verify.sh` 是否能通过。
- 如果我要求你优化文档,请参照 `docs/decisions/adr/0000-template.md` 等模板进行补齐。
### ADR 强制要求
- 任何涉及以下方面的改动,必须首先检查或创建 `docs/decisions/adr/` 下的文档:
- 架构变更
- 数据结构调整
- 鉴权流程修改
- 核心模块重构
## 6. 拒绝策略
- **拒绝模糊需求**:如果需求与 `docs/requirements/` 不符且没有新的文档更新,请提醒我先更新真源文档。
- **拒绝跳过流程**:如果我试图直接修改代码而不记录 Session请礼貌地询问是否需要记录到 `docs/sessions/`
### 禁止事项
- 严禁在没有 ADR 支持的情况下进行大规模重构
- 严禁跳过决策流程直接实施重大变更
## 7. 低切换成本任务 (Parallel Backlog)
- 当我在等待编译或测试时,请主动从 `docs/parallel-backlog.md` 中提取任务并询问:“现在有空档,是否需要处理 [任务名称]?”
### ADR 流程
1. 创建 ADR 草案
2. 团队审核
3. 获得批准后实施
4. 更新相关文档和 Canvas
## 指令驱动开发 (Prompt-First Protocol)
### Prompt 优先原则
- 强制执行 `docs/prompts/` 规范
- 对于复杂功能,必须先要求用户确认或更新对应的 Prompt 模板
- 严禁脱离文档盲写代码
### Prompt 模板使用
- 所有复杂操作必须基于 `docs/prompts/0000-template.md` 创建专用 Prompt
- Prompt 必须包含:输入引用、目标、输出格式、约束、验收标准、风险、使用记录
### 指令执行流程
1. 分析任务需求
2. 查找或创建对应的 Prompt 模板
3. 与用户确认 Prompt 内容
4. 基于 Prompt 执行任务
5. 验证结果是否符合 Prompt 要求
## 自动化文档维护 (Auto-Maintenance)
### 索引自动更新
- 每当在 `docs/` 下创建新文件AI 必须主动更新 `docs/index.md`
- 更新必须包含:文件路径、描述、创建日期
### 会话自动归档
- 任务结束时,必须按 `docs/sessions/` 模板生成会话记录
- 会话记录必须包含:现状、目标、引用链接、关键决策、回滚步骤
- 提醒用户同步更新 Canvas 画布
### 变更自动记录
- 所有重要变更必须在 `docs/changelog/` 中记录
- 记录必须包含:变更内容、影响范围、实施人员、日期
## 操作指令集 (Trigger Commands)
### 关键词触发
- `/session` - 自动归档当前会话
- `/adr` - 启动架构决策记录起草
- `/prompt` - 创建或更新 Prompt 模板
- `/canvas` - 检查并提醒更新 Canvas 画布
- `/index` - 更新 docs/index.md 索引
### 指令执行逻辑
1. 用户输入触发指令
2. AI 识别指令类型
3. 执行对应操作
4. 生成操作结果报告
## 违规处理
### 轻微违规
- 提醒用户并要求修正
- 记录在会话归档中
### 严重违规
- 拒绝执行操作
- 要求用户确认正确的流程
- 必要时请求人工干预
## 规则更新
### 更新流程
1. 提出规则变更建议
2. 创建 ADR 记录
3. 团队审核
4. 批准后更新规则文件
5. 通知所有团队成员
### 版本控制
- 规则文件必须通过 Git 进行版本控制
- 每次更新必须记录变更原因和影响
## 生效时间
本规则自创建之日起生效,适用于所有项目相关的 AI 操作。

View File

@ -31,6 +31,12 @@
- **目录**: [prompts/](prompts/)
- **描述**: 包含 AI 提示词模板和最佳实践
- **模板**: [0000-template.md](prompts/0000-template.md)
- **提示词文件**:
- [01创建白板提示词.md](prompts/01创建白板提示词.md)
- [02白板优化提示词.md](prompts/02白板优化提示词.md)
- [03创建工作流提示词.md](prompts/03创建工作流提示词.md)
- [04工作流整合白板提示词.md](prompts/04工作流整合白板提示词.md)
- [05创建项目规则提示词.md](prompts/05创建项目规则提示词.md)
### 5. 会话记录

View File

@ -0,0 +1,11 @@
@echo off
rem 自动提交批处理文件
set "SCRIPT_DIR=%~dp0"
set "POWERSHELL_SCRIPT=%SCRIPT_DIR%auto-commit.ps1"
rem 执行 PowerShell 脚本
powershell.exe -ExecutionPolicy Bypass -File "%POWERSHELL_SCRIPT"
pause

View File

@ -0,0 +1,202 @@
#!/usr/bin/env pwsh
# 自动提交脚本 - 基于 SSOT 2.0 规则
# 配置变量
$ProjectRoot = "$PSScriptRoot\.."
$DocsDir = "$ProjectRoot\docs"
$IndexFile = "$DocsDir\index.md"
$SessionsDir = "$DocsDir\sessions"
$ChangelogDir = "$DocsDir\changelog"
$CurrentDate = Get-Date -Format "yyyyMMdd"
$SessionFile = "$SessionsDir\$CurrentDate-session.md"
# 函数:更新文档索引
function Update-Index {
Write-Host "正在更新文档索引..."
# 获取所有文档文件
$DocFiles = Get-ChildItem -Path $DocsDir -Recurse -File | Where-Object { $_.Extension -eq ".md" -or $_.Extension -eq ".canvas" }
# 读取当前索引文件内容
$IndexContent = Get-Content -Path $IndexFile -Raw
# 这里可以添加更复杂的索引更新逻辑
# 例如:自动添加新文件到索引
Write-Host "文档索引更新完成"
}
# 函数:创建会话记录
function Create-Session {
Write-Host "正在创建会话记录..."
# 检查会话目录是否存在
if (!(Test-Path $SessionsDir)) {
New-Item -ItemType Directory -Path $SessionsDir -Force | Out-Null
}
# 创建会话记录内容
$SessionContent = @"
# 会话记录
## 现状
[描述当前项目或任务的现状包括已完成的工作遇到的问题等]
## 目标
[描述本次会话的具体目标包括要实现的功能解决的问题等]
## 输入链接
- [需求文档](https://example.com) - 相关需求描述
- [设计文档](https://example.com) - 相关设计说明
- [架构决策](https://example.com) - 相关架构决策
## Prompt 文件
- [Prompt 模板](https://example.com) - 使用的提示词文件
## Context Snapshot
记录本次会话参考了哪些 Canvas 节点
- [Authentication.canvas](../Authentication.canvas) - 项目架构视觉化展示
- **参考节点**: [节点名称](路径) - 描述
- **快照时间**: $(Get-Date -Format "yyyy-MM-dd HH:mm:ss")
## 执行过程
详细记录本次会话的执行过程包括
1. 执行的命令或操作
2. 遇到的问题及解决方案
3. 关键决策点
4. 时间线
## 关键产出
记录本次会话的关键产出例如
- 生成的代码文件
- 更新的文档
- 解决的问题
- 达成的共识
## 质疑与替代方案
记录在执行过程中提出的质疑和考虑的替代方案
- 质疑[具体质疑内容]
- 替代方案[替代方案描述]
- 评估[对替代方案的评估]
## 结论
总结本次会话的结果包括
- 完成的工作
- 达成的目标
- 后续的行动计划
- 需要跟进的事项
## Design Update
- [ ] 是否需要更新 Canvas?
- [ ] Authentication.canvas
- [ ] 其他 Canvas 文件: ____________________
## 复现步骤
提供复现本次会话结果的具体步骤
1. [步骤 1 描述]
2. [步骤 2 描述]
3. [步骤 3 描述]
4. [验证方法描述]
"@
# 写入会话记录文件
$SessionContent | Out-File -FilePath $SessionFile -Encoding UTF8
Write-Host "会话记录已创建: $SessionFile"
}
# 函数:创建变更记录
function Create-Changelog {
Write-Host "正在创建变更记录..."
# 检查变更日志目录是否存在
if (!(Test-Path $ChangelogDir)) {
New-Item -ItemType Directory -Path $ChangelogDir -Force | Out-Null
}
# 创建变更记录内容
$ChangelogContent = @"
# 变更记录 - $CurrentDate
## 变更内容
- [变更 1] - 描述
- [变更 2] - 描述
- [变更 3] - 描述
## 影响范围
- 模块 1
- 模块 2
- 模块 3
## 实施人员
- [实施人员]
## 日期
$CurrentDate
"@
# 写入变更记录文件
$ChangelogFile = "$ChangelogDir\$CurrentDate-changelog.md"
$ChangelogContent | Out-File -FilePath $ChangelogFile -Encoding UTF8
Write-Host "变更记录已创建: $ChangelogFile"
}
# 函数:执行 git 提交
function Execute-GitCommit {
Write-Host "正在执行 git 提交..."
# 切换到项目根目录
Set-Location -Path $ProjectRoot
# 添加所有变更
git add .
# 提交变更
$CommitMessage = "chore: auto-commit - $(Get-Date -Format "yyyy-MM-dd HH:mm:ss")"
git commit -m $CommitMessage
Write-Host "git 提交完成"
}
# 主函数
function Main {
Write-Host "开始执行自动提交脚本..."
# 更新文档索引
Update-Index
# 创建会话记录
Create-Session
# 创建变更记录
Create-Changelog
# 执行 git 提交
Execute-GitCommit
Write-Host "自动提交脚本执行完成!"
}
# 执行主函数
Main

View File

@ -0,0 +1,5 @@
@echo off
powershell.exe -ExecutionPolicy Bypass -File "%~dp0auto-commit.ps1"
pause

Binary file not shown.

Before

Width:  |  Height:  |  Size: 86 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 107 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 182 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 163 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 84 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 146 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 181 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 146 KiB

View File

@ -1,311 +0,0 @@
<mxfile host="65bd71144e">
<diagram id="xy79Wy17eWdTJqY27ViR" name="第 1 页">
<mxGraphModel dx="1674" dy="779" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="827" pageHeight="1169" math="0" shadow="0">
<root>
<mxCell id="0"/>
<mxCell id="1" parent="0"/>
<mxCell id="7" value="" style="edgeStyle=none;html=1;" parent="1" source="2" target="6" edge="1">
<mxGeometry relative="1" as="geometry"/>
</mxCell>
<mxCell id="2" value="代码生成" style="html=1;" parent="1" vertex="1">
<mxGeometry x="205" y="20" width="110" height="50" as="geometry"/>
</mxCell>
<mxCell id="9" value="" style="edgeStyle=none;html=1;" parent="1" source="3" target="8" edge="1">
<mxGeometry relative="1" as="geometry"/>
</mxCell>
<mxCell id="3" value="预览代码" style="html=1;" parent="1" vertex="1">
<mxGeometry x="525" y="20" width="110" height="50" as="geometry"/>
</mxCell>
<mxCell id="13" value="" style="edgeStyle=none;html=1;entryX=0.5;entryY=0;entryDx=0;entryDy=0;" parent="1" source="6" target="12" edge="1">
<mxGeometry relative="1" as="geometry"/>
</mxCell>
<mxCell id="6" value="GenTableServiceImpl.previewCode" style="html=1;" parent="1" vertex="1">
<mxGeometry x="150" y="120" width="220" height="50" as="geometry"/>
</mxCell>
<mxCell id="11" value="" style="edgeStyle=none;html=1;" parent="1" source="8" target="10" edge="1">
<mxGeometry relative="1" as="geometry"/>
</mxCell>
<mxCell id="8" value="GenTableServiceImpl.downloadCode" style="html=1;" parent="1" vertex="1">
<mxGeometry x="460" y="100" width="240" height="50" as="geometry"/>
</mxCell>
<mxCell id="14" style="edgeStyle=none;html=1;entryX=0.5;entryY=0;entryDx=0;entryDy=0;" parent="1" source="10" target="12" edge="1">
<mxGeometry relative="1" as="geometry"/>
</mxCell>
<mxCell id="10" value="GenTableServiceImpl.generatorCode" style="html=1;" parent="1" vertex="1">
<mxGeometry x="460" y="190" width="240" height="50" as="geometry"/>
</mxCell>
<mxCell id="16" style="edgeStyle=none;html=1;entryX=0.5;entryY=0;entryDx=0;entryDy=0;" parent="1" source="12" target="17" edge="1">
<mxGeometry relative="1" as="geometry">
<mxPoint x="360" y="580" as="targetPoint"/>
</mxGeometry>
</mxCell>
<mxCell id="12" value="GenTableMapper.selectGenTableById&amp;nbsp; &amp;nbsp;查询表信息" style="html=1;" parent="1" vertex="1">
<mxGeometry x="230" y="330" width="310" height="50" as="geometry"/>
</mxCell>
<mxCell id="19" value="" style="edgeStyle=none;html=1;" parent="1" source="17" target="18" edge="1">
<mxGeometry relative="1" as="geometry"/>
</mxCell>
<mxCell id="17" value="GenTableServiceImpl.setSubTable&amp;nbsp; 设置主子表信息" style="html=1;" parent="1" vertex="1">
<mxGeometry x="237.5" y="420" width="297.5" height="50" as="geometry"/>
</mxCell>
<mxCell id="21" value="" style="edgeStyle=none;html=1;" parent="1" source="18" target="20" edge="1">
<mxGeometry relative="1" as="geometry"/>
</mxCell>
<mxCell id="18" value="GenTableServiceImpl.setPkColumn&amp;nbsp; 设置主键列信息" style="html=1;" parent="1" vertex="1">
<mxGeometry x="232.5" y="515" width="307.5" height="50" as="geometry"/>
</mxCell>
<mxCell id="23" value="" style="edgeStyle=none;html=1;" parent="1" source="20" target="22" edge="1">
<mxGeometry relative="1" as="geometry"/>
</mxCell>
<mxCell id="20" value="VelocityInitializer.initVelocity&amp;nbsp; &amp;nbsp;初始化vm方法" style="html=1;" parent="1" vertex="1">
<mxGeometry x="242.5" y="595" width="287.5" height="50" as="geometry"/>
</mxCell>
<mxCell id="25" value="" style="edgeStyle=none;html=1;" parent="1" source="22" target="24" edge="1">
<mxGeometry relative="1" as="geometry"/>
</mxCell>
<mxCell id="22" value="VelocityUtils.prepareContext&amp;nbsp; &lt;font color=&quot;#ff0000&quot;&gt;设置模板变量信息&lt;/font&gt;" style="html=1;" parent="1" vertex="1">
<mxGeometry x="242.5" y="685" width="287.5" height="50" as="geometry"/>
</mxCell>
<mxCell id="27" value="" style="edgeStyle=none;html=1;" parent="1" source="24" target="26" edge="1">
<mxGeometry relative="1" as="geometry"/>
</mxCell>
<mxCell id="24" value="VelocityUtils.getTemplateList&amp;nbsp; &lt;font color=&quot;#ff0000&quot;&gt;获取模板列表&lt;/font&gt;" style="html=1;" parent="1" vertex="1">
<mxGeometry x="242.5" y="770" width="287.5" height="50" as="geometry"/>
</mxCell>
<mxCell id="30" value="" style="edgeStyle=none;html=1;" parent="1" source="26" target="29" edge="1">
<mxGeometry relative="1" as="geometry"/>
</mxCell>
<mxCell id="26" value="Velocity.getTemplate 渲染模板" style="html=1;" parent="1" vertex="1">
<mxGeometry x="242.5" y="860" width="287.5" height="50" as="geometry"/>
</mxCell>
<mxCell id="29" value="预览代码 -&amp;gt; 结果储存到dataMap中&lt;br&gt;自定义路径 -&amp;gt; 通过FileUtils写入到指定位置&lt;br&gt;下载代码 -&amp;gt; 将生抽的信息添加到zip然后下载" style="html=1;" parent="1" vertex="1">
<mxGeometry x="242.5" y="950" width="287.5" height="50" as="geometry"/>
</mxCell>
<mxCell id="31" value="&lt;div style=&quot;color: rgb(0, 0, 0); background-color: rgb(255, 255, 255); font-family: Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-weight: normal; font-size: 14px; line-height: 19px; white-space-collapse: preserve;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;GenTable&lt;/span&gt;&lt;/div&gt;" style="shape=table;startSize=30;container=1;collapsible=1;childLayout=tableLayout;fixedRows=1;rowLines=0;fontStyle=1;align=center;resizeLast=1;html=1;" vertex="1" parent="1">
<mxGeometry x="910" y="20" width="180" height="540" as="geometry"/>
</mxCell>
<mxCell id="32" value="" style="shape=tableRow;horizontal=0;startSize=0;swimlaneHead=0;swimlaneBody=0;fillColor=none;collapsible=0;dropTarget=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;top=0;left=0;right=0;bottom=1;" vertex="1" parent="31">
<mxGeometry y="30" width="180" height="30" as="geometry"/>
</mxCell>
<mxCell id="33" value="PK" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;fontStyle=1;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="32">
<mxGeometry width="30" height="30" as="geometry">
<mxRectangle width="30" height="30" as="alternateBounds"/>
</mxGeometry>
</mxCell>
<mxCell id="34" value="&lt;div style=&quot;color: #000000;background-color: #ffffff;font-family: Consolas, &#39;Courier New&#39;, monospace;font-weight: normal;font-size: 14px;line-height: 19px;white-space: pre;&quot;&gt;&lt;span style=&quot;color: #880088;font-weight: bold;&quot;&gt;tableId&lt;/span&gt;&lt;/div&gt;" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;align=left;spacingLeft=6;fontStyle=5;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="32">
<mxGeometry x="30" width="150" height="30" as="geometry">
<mxRectangle width="150" height="30" as="alternateBounds"/>
</mxGeometry>
</mxCell>
<mxCell id="35" value="" style="shape=tableRow;horizontal=0;startSize=0;swimlaneHead=0;swimlaneBody=0;fillColor=none;collapsible=0;dropTarget=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;top=0;left=0;right=0;bottom=0;" vertex="1" parent="31">
<mxGeometry y="60" width="180" height="30" as="geometry"/>
</mxCell>
<mxCell id="36" value="" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;editable=1;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="35">
<mxGeometry width="30" height="30" as="geometry">
<mxRectangle width="30" height="30" as="alternateBounds"/>
</mxGeometry>
</mxCell>
<mxCell id="37" value="&lt;div style=&quot;color: rgb(0, 0, 0); background-color: rgb(255, 255, 255); font-family: Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 14px; line-height: 19px; white-space: pre;&quot;&gt;&lt;span style=&quot;color: #880088;font-weight: bold;&quot;&gt;tableName&lt;/span&gt;&lt;/div&gt;" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;align=left;spacingLeft=6;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="35">
<mxGeometry x="30" width="150" height="30" as="geometry">
<mxRectangle width="150" height="30" as="alternateBounds"/>
</mxGeometry>
</mxCell>
<mxCell id="38" value="" style="shape=tableRow;horizontal=0;startSize=0;swimlaneHead=0;swimlaneBody=0;fillColor=none;collapsible=0;dropTarget=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;top=0;left=0;right=0;bottom=0;" vertex="1" parent="31">
<mxGeometry y="90" width="180" height="30" as="geometry"/>
</mxCell>
<mxCell id="39" value="" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;editable=1;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="38">
<mxGeometry width="30" height="30" as="geometry">
<mxRectangle width="30" height="30" as="alternateBounds"/>
</mxGeometry>
</mxCell>
<mxCell id="40" value="&lt;div style=&quot;color: rgb(0, 0, 0); background-color: rgb(255, 255, 255); font-family: Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 14px; line-height: 19px; white-space: pre;&quot;&gt;&lt;span style=&quot;color: #880088;font-weight: bold;&quot;&gt;tableAlias&lt;/span&gt;&lt;/div&gt;" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;align=left;spacingLeft=6;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="38">
<mxGeometry x="30" width="150" height="30" as="geometry">
<mxRectangle width="150" height="30" as="alternateBounds"/>
</mxGeometry>
</mxCell>
<mxCell id="41" value="" style="shape=tableRow;horizontal=0;startSize=0;swimlaneHead=0;swimlaneBody=0;fillColor=none;collapsible=0;dropTarget=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;top=0;left=0;right=0;bottom=0;" vertex="1" parent="31">
<mxGeometry y="120" width="180" height="30" as="geometry"/>
</mxCell>
<mxCell id="42" value="" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;editable=1;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="41">
<mxGeometry width="30" height="30" as="geometry">
<mxRectangle width="30" height="30" as="alternateBounds"/>
</mxGeometry>
</mxCell>
<mxCell id="43" value="&lt;div style=&quot;color: rgb(0, 0, 0); background-color: rgb(255, 255, 255); font-family: Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 14px; line-height: 19px; white-space: pre;&quot;&gt;&lt;span style=&quot;color: #880088;font-weight: bold;&quot;&gt;tableComment&lt;/span&gt;&lt;/div&gt;" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;align=left;spacingLeft=6;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="41">
<mxGeometry x="30" width="150" height="30" as="geometry">
<mxRectangle width="150" height="30" as="alternateBounds"/>
</mxGeometry>
</mxCell>
<mxCell id="44" value="" style="shape=tableRow;horizontal=0;startSize=0;swimlaneHead=0;swimlaneBody=0;fillColor=none;collapsible=0;dropTarget=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;top=0;left=0;right=0;bottom=0;" vertex="1" parent="31">
<mxGeometry y="150" width="180" height="30" as="geometry"/>
</mxCell>
<mxCell id="45" value="" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;editable=1;overflow=hidden;" vertex="1" parent="44">
<mxGeometry width="30" height="30" as="geometry">
<mxRectangle width="30" height="30" as="alternateBounds"/>
</mxGeometry>
</mxCell>
<mxCell id="46" value="subTableName" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;align=left;spacingLeft=6;overflow=hidden;" vertex="1" parent="44">
<mxGeometry x="30" width="150" height="30" as="geometry">
<mxRectangle width="150" height="30" as="alternateBounds"/>
</mxGeometry>
</mxCell>
<mxCell id="47" value="" style="shape=tableRow;horizontal=0;startSize=0;swimlaneHead=0;swimlaneBody=0;fillColor=none;collapsible=0;dropTarget=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;top=0;left=0;right=0;bottom=0;" vertex="1" parent="31">
<mxGeometry y="180" width="180" height="30" as="geometry"/>
</mxCell>
<mxCell id="48" value="" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;editable=1;overflow=hidden;" vertex="1" parent="47">
<mxGeometry width="30" height="30" as="geometry">
<mxRectangle width="30" height="30" as="alternateBounds"/>
</mxGeometry>
</mxCell>
<mxCell id="49" value="subTableFkName" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;align=left;spacingLeft=6;overflow=hidden;" vertex="1" parent="47">
<mxGeometry x="30" width="150" height="30" as="geometry">
<mxRectangle width="150" height="30" as="alternateBounds"/>
</mxGeometry>
</mxCell>
<mxCell id="50" value="" style="shape=tableRow;horizontal=0;startSize=0;swimlaneHead=0;swimlaneBody=0;fillColor=none;collapsible=0;dropTarget=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;top=0;left=0;right=0;bottom=0;" vertex="1" parent="31">
<mxGeometry y="210" width="180" height="30" as="geometry"/>
</mxCell>
<mxCell id="51" value="" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;editable=1;overflow=hidden;" vertex="1" parent="50">
<mxGeometry width="30" height="30" as="geometry">
<mxRectangle width="30" height="30" as="alternateBounds"/>
</mxGeometry>
</mxCell>
<mxCell id="52" value="className" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;align=left;spacingLeft=6;overflow=hidden;" vertex="1" parent="50">
<mxGeometry x="30" width="150" height="30" as="geometry">
<mxRectangle width="150" height="30" as="alternateBounds"/>
</mxGeometry>
</mxCell>
<mxCell id="57" value="" style="shape=tableRow;horizontal=0;startSize=0;swimlaneHead=0;swimlaneBody=0;fillColor=none;collapsible=0;dropTarget=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;top=0;left=0;right=0;bottom=0;" vertex="1" parent="31">
<mxGeometry y="240" width="180" height="30" as="geometry"/>
</mxCell>
<mxCell id="58" value="" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;editable=1;overflow=hidden;" vertex="1" parent="57">
<mxGeometry width="30" height="30" as="geometry">
<mxRectangle width="30" height="30" as="alternateBounds"/>
</mxGeometry>
</mxCell>
<mxCell id="59" value="tplCategory" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;align=left;spacingLeft=6;overflow=hidden;" vertex="1" parent="57">
<mxGeometry x="30" width="150" height="30" as="geometry">
<mxRectangle width="150" height="30" as="alternateBounds"/>
</mxGeometry>
</mxCell>
<mxCell id="60" value="" style="shape=tableRow;horizontal=0;startSize=0;swimlaneHead=0;swimlaneBody=0;fillColor=none;collapsible=0;dropTarget=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;top=0;left=0;right=0;bottom=0;" vertex="1" parent="31">
<mxGeometry y="270" width="180" height="30" as="geometry"/>
</mxCell>
<mxCell id="61" value="" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;editable=1;overflow=hidden;" vertex="1" parent="60">
<mxGeometry width="30" height="30" as="geometry">
<mxRectangle width="30" height="30" as="alternateBounds"/>
</mxGeometry>
</mxCell>
<mxCell id="62" value="tplWebType" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;align=left;spacingLeft=6;overflow=hidden;" vertex="1" parent="60">
<mxGeometry x="30" width="150" height="30" as="geometry">
<mxRectangle width="150" height="30" as="alternateBounds"/>
</mxGeometry>
</mxCell>
<mxCell id="63" value="" style="shape=tableRow;horizontal=0;startSize=0;swimlaneHead=0;swimlaneBody=0;fillColor=none;collapsible=0;dropTarget=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;top=0;left=0;right=0;bottom=0;" vertex="1" parent="31">
<mxGeometry y="300" width="180" height="30" as="geometry"/>
</mxCell>
<mxCell id="64" value="" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;editable=1;overflow=hidden;" vertex="1" parent="63">
<mxGeometry width="30" height="30" as="geometry">
<mxRectangle width="30" height="30" as="alternateBounds"/>
</mxGeometry>
</mxCell>
<mxCell id="65" value="moduleName" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;align=left;spacingLeft=6;overflow=hidden;" vertex="1" parent="63">
<mxGeometry x="30" width="150" height="30" as="geometry">
<mxRectangle width="150" height="30" as="alternateBounds"/>
</mxGeometry>
</mxCell>
<mxCell id="66" value="" style="shape=tableRow;horizontal=0;startSize=0;swimlaneHead=0;swimlaneBody=0;fillColor=none;collapsible=0;dropTarget=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;top=0;left=0;right=0;bottom=0;" vertex="1" parent="31">
<mxGeometry y="330" width="180" height="30" as="geometry"/>
</mxCell>
<mxCell id="67" value="" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;editable=1;overflow=hidden;" vertex="1" parent="66">
<mxGeometry width="30" height="30" as="geometry">
<mxRectangle width="30" height="30" as="alternateBounds"/>
</mxGeometry>
</mxCell>
<mxCell id="68" value="businessName" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;align=left;spacingLeft=6;overflow=hidden;" vertex="1" parent="66">
<mxGeometry x="30" width="150" height="30" as="geometry">
<mxRectangle width="150" height="30" as="alternateBounds"/>
</mxGeometry>
</mxCell>
<mxCell id="69" value="" style="shape=tableRow;horizontal=0;startSize=0;swimlaneHead=0;swimlaneBody=0;fillColor=none;collapsible=0;dropTarget=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;top=0;left=0;right=0;bottom=0;" vertex="1" parent="31">
<mxGeometry y="360" width="180" height="30" as="geometry"/>
</mxCell>
<mxCell id="70" value="" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;editable=1;overflow=hidden;" vertex="1" parent="69">
<mxGeometry width="30" height="30" as="geometry">
<mxRectangle width="30" height="30" as="alternateBounds"/>
</mxGeometry>
</mxCell>
<mxCell id="71" value="functionName" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;align=left;spacingLeft=6;overflow=hidden;" vertex="1" parent="69">
<mxGeometry x="30" width="150" height="30" as="geometry">
<mxRectangle width="150" height="30" as="alternateBounds"/>
</mxGeometry>
</mxCell>
<mxCell id="72" value="" style="shape=tableRow;horizontal=0;startSize=0;swimlaneHead=0;swimlaneBody=0;fillColor=none;collapsible=0;dropTarget=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;top=0;left=0;right=0;bottom=0;" vertex="1" parent="31">
<mxGeometry y="390" width="180" height="30" as="geometry"/>
</mxCell>
<mxCell id="73" value="" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;editable=1;overflow=hidden;" vertex="1" parent="72">
<mxGeometry width="30" height="30" as="geometry">
<mxRectangle width="30" height="30" as="alternateBounds"/>
</mxGeometry>
</mxCell>
<mxCell id="74" value="functionAuthor" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;align=left;spacingLeft=6;overflow=hidden;" vertex="1" parent="72">
<mxGeometry x="30" width="150" height="30" as="geometry">
<mxRectangle width="150" height="30" as="alternateBounds"/>
</mxGeometry>
</mxCell>
<mxCell id="75" value="" style="shape=tableRow;horizontal=0;startSize=0;swimlaneHead=0;swimlaneBody=0;fillColor=none;collapsible=0;dropTarget=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;top=0;left=0;right=0;bottom=0;" vertex="1" parent="31">
<mxGeometry y="420" width="180" height="30" as="geometry"/>
</mxCell>
<mxCell id="76" value="" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;editable=1;overflow=hidden;" vertex="1" parent="75">
<mxGeometry width="30" height="30" as="geometry">
<mxRectangle width="30" height="30" as="alternateBounds"/>
</mxGeometry>
</mxCell>
<mxCell id="77" value="genType" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;align=left;spacingLeft=6;overflow=hidden;" vertex="1" parent="75">
<mxGeometry x="30" width="150" height="30" as="geometry">
<mxRectangle width="150" height="30" as="alternateBounds"/>
</mxGeometry>
</mxCell>
<mxCell id="78" value="" style="shape=tableRow;horizontal=0;startSize=0;swimlaneHead=0;swimlaneBody=0;fillColor=none;collapsible=0;dropTarget=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;top=0;left=0;right=0;bottom=0;" vertex="1" parent="31">
<mxGeometry y="450" width="180" height="30" as="geometry"/>
</mxCell>
<mxCell id="79" value="" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;editable=1;overflow=hidden;" vertex="1" parent="78">
<mxGeometry width="30" height="30" as="geometry">
<mxRectangle width="30" height="30" as="alternateBounds"/>
</mxGeometry>
</mxCell>
<mxCell id="80" value="genPath" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;align=left;spacingLeft=6;overflow=hidden;" vertex="1" parent="78">
<mxGeometry x="30" width="150" height="30" as="geometry">
<mxRectangle width="150" height="30" as="alternateBounds"/>
</mxGeometry>
</mxCell>
<mxCell id="84" value="" style="shape=tableRow;horizontal=0;startSize=0;swimlaneHead=0;swimlaneBody=0;fillColor=none;collapsible=0;dropTarget=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;top=0;left=0;right=0;bottom=0;" vertex="1" parent="31">
<mxGeometry y="480" width="180" height="30" as="geometry"/>
</mxCell>
<mxCell id="85" value="" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;editable=1;overflow=hidden;" vertex="1" parent="84">
<mxGeometry width="30" height="30" as="geometry">
<mxRectangle width="30" height="30" as="alternateBounds"/>
</mxGeometry>
</mxCell>
<mxCell id="86" value="pkColumn" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;align=left;spacingLeft=6;overflow=hidden;" vertex="1" parent="84">
<mxGeometry x="30" width="150" height="30" as="geometry">
<mxRectangle width="150" height="30" as="alternateBounds"/>
</mxGeometry>
</mxCell>
<mxCell id="87" value="" style="shape=tableRow;horizontal=0;startSize=0;swimlaneHead=0;swimlaneBody=0;fillColor=none;collapsible=0;dropTarget=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;top=0;left=0;right=0;bottom=0;" vertex="1" parent="31">
<mxGeometry y="510" width="180" height="30" as="geometry"/>
</mxCell>
<mxCell id="88" value="" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;editable=1;overflow=hidden;" vertex="1" parent="87">
<mxGeometry width="30" height="30" as="geometry">
<mxRectangle width="30" height="30" as="alternateBounds"/>
</mxGeometry>
</mxCell>
<mxCell id="89" value="subTable" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;align=left;spacingLeft=6;overflow=hidden;" vertex="1" parent="87">
<mxGeometry x="30" width="150" height="30" as="geometry">
<mxRectangle width="150" height="30" as="alternateBounds"/>
</mxGeometry>
</mxCell>
</root>
</mxGraphModel>
</diagram>
</mxfile>

View File

@ -1,149 +0,0 @@
<mxfile host="65bd71144e">
<diagram id="27K8aLRXgDd5Ry5UGMpc" name="第 1 页">
<mxGraphModel dx="2298" dy="760" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="827" pageHeight="1169" math="0" shadow="0">
<root>
<mxCell id="0"/>
<mxCell id="1" parent="0"/>
<mxCell id="7" value="" style="edgeStyle=none;html=1;" parent="1" source="2" target="4" edge="1">
<mxGeometry relative="1" as="geometry"/>
</mxCell>
<mxCell id="2" value="数据源1" style="html=1;" parent="1" vertex="1">
<mxGeometry x="510" y="340" width="110" height="50" as="geometry"/>
</mxCell>
<mxCell id="8" value="" style="edgeStyle=none;html=1;" parent="1" source="3" target="5" edge="1">
<mxGeometry relative="1" as="geometry"/>
</mxCell>
<mxCell id="3" value="数据源2" style="html=1;" parent="1" vertex="1">
<mxGeometry x="-90" y="340" width="110" height="50" as="geometry"/>
</mxCell>
<mxCell id="9" style="edgeStyle=none;html=1;" parent="1" source="4" target="28" edge="1">
<mxGeometry relative="1" as="geometry">
<mxPoint x="571.4814814814818" y="470" as="targetPoint"/>
</mxGeometry>
</mxCell>
<mxCell id="44" style="edgeStyle=none;html=1;" parent="1" source="4" target="43" edge="1">
<mxGeometry relative="1" as="geometry"/>
</mxCell>
<mxCell id="4" value="&lt;div style=&quot;background-color: rgb(255, 255, 255); font-family: Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 14px; line-height: 19px;&quot;&gt;DataSource1&lt;/div&gt;" style="html=1;" parent="1" vertex="1">
<mxGeometry x="325" y="340" width="110" height="50" as="geometry"/>
</mxCell>
<mxCell id="10" style="edgeStyle=none;html=1;" parent="1" source="5" target="28" edge="1">
<mxGeometry relative="1" as="geometry">
<mxPoint x="556.25" y="470" as="targetPoint"/>
</mxGeometry>
</mxCell>
<mxCell id="45" style="edgeStyle=none;html=1;" parent="1" source="5" target="43" edge="1">
<mxGeometry relative="1" as="geometry"/>
</mxCell>
<mxCell id="5" value="&lt;div style=&quot;background-color: rgb(255, 255, 255); font-family: Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 14px; line-height: 19px;&quot;&gt;DataSource2&lt;/div&gt;" style="html=1;" parent="1" vertex="1">
<mxGeometry x="100" y="340" width="110" height="50" as="geometry"/>
</mxCell>
<mxCell id="15" value="" style="edgeStyle=none;html=1;" parent="1" source="11" target="28" edge="1">
<mxGeometry relative="1" as="geometry">
<mxPoint x="636.25" y="470" as="targetPoint"/>
</mxGeometry>
</mxCell>
<mxCell id="11" value="&lt;div style=&quot;background-color: rgb(255, 255, 255); font-family: Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 14px; line-height: 19px;&quot;&gt;&lt;div style=&quot;line-height: 19px;&quot;&gt;DynamicDataSourceContextHolder&lt;/div&gt;&lt;/div&gt;" style="html=1;" parent="1" vertex="1">
<mxGeometry x="460" y="460" width="270" height="50" as="geometry"/>
</mxCell>
<mxCell id="13" value="&lt;div style=&quot;background-color: rgb(255, 255, 255); font-family: Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 14px; line-height: 19px;&quot;&gt;&lt;h1 style=&quot;box-sizing: border-box; outline: 0px; margin: 0px; padding: 0px; font-family: &amp;quot;PingFang SC&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, SimHei, Arial, SimSun; font-size: 28px; overflow-wrap: break-word; color: rgb(34, 34, 38); word-break: break-all; font-variant-ligatures: common-ligatures; text-align: start;&quot; id=&quot;articleContentId&quot; class=&quot;title-article&quot;&gt;Spring AbstractRoutingDataSource&lt;br&gt;&lt;br&gt;&lt;/h1&gt;&lt;div&gt;* determineCurrentLookupKey&lt;/div&gt;&lt;/div&gt;" style="html=1;" parent="1" vertex="1">
<mxGeometry x="-380" y="455" width="520" height="70" as="geometry"/>
</mxCell>
<mxCell id="19" value="" style="edgeStyle=none;html=1;" parent="1" source="16" target="18" edge="1">
<mxGeometry relative="1" as="geometry"/>
</mxCell>
<mxCell id="16" value="方法1" style="html=1;" parent="1" vertex="1">
<mxGeometry x="880" y="340" width="110" height="50" as="geometry"/>
</mxCell>
<mxCell id="20" value="" style="edgeStyle=none;html=1;" parent="1" source="17" target="18" edge="1">
<mxGeometry relative="1" as="geometry"/>
</mxCell>
<mxCell id="17" value="方法2" style="html=1;" parent="1" vertex="1">
<mxGeometry x="880" y="580" width="110" height="50" as="geometry"/>
</mxCell>
<mxCell id="21" value="" style="edgeStyle=none;html=1;" parent="1" source="18" target="11" edge="1">
<mxGeometry relative="1" as="geometry"/>
</mxCell>
<mxCell id="18" value="&lt;div style=&quot;background-color: rgb(255, 255, 255); font-family: Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 14px; line-height: 19px;&quot;&gt;DataSourceAspect&lt;/div&gt;" style="html=1;" parent="1" vertex="1">
<mxGeometry x="790" y="460" width="290" height="50" as="geometry"/>
</mxCell>
<mxCell id="22" value="" style="edgeStyle=none;html=1;" parent="1" source="23" target="26" edge="1">
<mxGeometry relative="1" as="geometry"/>
</mxCell>
<mxCell id="23" value="数据源1" style="html=1;" parent="1" vertex="1">
<mxGeometry x="-90" y="580" width="110" height="50" as="geometry"/>
</mxCell>
<mxCell id="24" value="" style="edgeStyle=none;html=1;" parent="1" source="25" target="27" edge="1">
<mxGeometry relative="1" as="geometry"/>
</mxCell>
<mxCell id="25" value="数据源2" style="html=1;" parent="1" vertex="1">
<mxGeometry x="510" y="580" width="110" height="50" as="geometry"/>
</mxCell>
<mxCell id="29" style="edgeStyle=none;html=1;" parent="1" source="26" target="28" edge="1">
<mxGeometry relative="1" as="geometry"/>
</mxCell>
<mxCell id="46" style="edgeStyle=none;html=1;" parent="1" source="26" target="47" edge="1">
<mxGeometry relative="1" as="geometry">
<mxPoint x="240" y="790" as="targetPoint"/>
</mxGeometry>
</mxCell>
<mxCell id="26" value="&lt;div style=&quot;background-color: rgb(255, 255, 255); font-family: Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 14px; line-height: 19px;&quot;&gt;&lt;div style=&quot;line-height: 19px;&quot;&gt;AtomikosDataSourceBean1&lt;/div&gt;&lt;/div&gt;" style="html=1;" parent="1" vertex="1">
<mxGeometry x="60" y="580" width="190" height="50" as="geometry"/>
</mxCell>
<mxCell id="30" style="edgeStyle=none;html=1;" parent="1" source="27" target="28" edge="1">
<mxGeometry relative="1" as="geometry"/>
</mxCell>
<mxCell id="49" style="edgeStyle=none;html=1;" parent="1" source="27" target="48" edge="1">
<mxGeometry relative="1" as="geometry"/>
</mxCell>
<mxCell id="27" value="&lt;div style=&quot;background-color: rgb(255, 255, 255); font-family: Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 14px; line-height: 19px;&quot;&gt;&lt;div style=&quot;line-height: 19px;&quot;&gt;AtomikosDataSourceBean2&lt;/div&gt;&lt;/div&gt;" style="html=1;" parent="1" vertex="1">
<mxGeometry x="285" y="580" width="190" height="50" as="geometry"/>
</mxCell>
<mxCell id="59" style="edgeStyle=none;html=1;" parent="1" source="28" target="13" edge="1">
<mxGeometry relative="1" as="geometry"/>
</mxCell>
<mxCell id="28" value="&lt;div style=&quot;background-color: rgb(255, 255, 255); font-family: Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 14px; line-height: 19px;&quot;&gt;DynamicDataSource&lt;/div&gt;" style="whiteSpace=wrap;html=1;" parent="1" vertex="1">
<mxGeometry x="170" y="455" width="230" height="60" as="geometry"/>
</mxCell>
<mxCell id="54" value="" style="edgeStyle=none;html=1;" parent="1" source="43" target="53" edge="1">
<mxGeometry relative="1" as="geometry"/>
</mxCell>
<mxCell id="43" value="&lt;div style=&quot;background-color: rgb(255, 255, 255); font-family: Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 14px; line-height: 19px;&quot;&gt;sqlSessionFactory&lt;/div&gt;" style="whiteSpace=wrap;html=1;" parent="1" vertex="1">
<mxGeometry x="160" y="210" width="210" height="60" as="geometry"/>
</mxCell>
<mxCell id="51" style="edgeStyle=none;html=1;" parent="1" source="47" target="50" edge="1">
<mxGeometry relative="1" as="geometry"/>
</mxCell>
<mxCell id="47" value="&lt;div style=&quot;background-color: rgb(255, 255, 255); font-family: Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 14px; line-height: 19px;&quot;&gt;SqlSessionFactory1&lt;/div&gt;" style="html=1;" parent="1" vertex="1">
<mxGeometry x="55" y="670" width="200" height="50" as="geometry"/>
</mxCell>
<mxCell id="52" style="edgeStyle=none;html=1;" parent="1" source="48" target="50" edge="1">
<mxGeometry relative="1" as="geometry"/>
</mxCell>
<mxCell id="48" value="&lt;div style=&quot;background-color: rgb(255, 255, 255); font-family: Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 14px; line-height: 19px;&quot;&gt;SqlSessionFactory2&lt;/div&gt;" style="whiteSpace=wrap;html=1;" parent="1" vertex="1">
<mxGeometry x="280" y="670" width="200" height="50" as="geometry"/>
</mxCell>
<mxCell id="56" style="edgeStyle=none;html=1;" parent="1" source="50" target="57" edge="1">
<mxGeometry relative="1" as="geometry">
<mxPoint x="-593.9655172413791" y="670" as="targetPoint"/>
<Array as="points">
<mxPoint x="-470" y="815"/>
</Array>
</mxGeometry>
</mxCell>
<mxCell id="50" value="&lt;div style=&quot;background-color: rgb(255, 255, 255); font-family: Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 14px; line-height: 19px;&quot;&gt;DynamicSqlSessionTemplate&lt;/div&gt;" style="whiteSpace=wrap;html=1;" parent="1" vertex="1">
<mxGeometry x="160" y="790" width="210" height="50" as="geometry"/>
</mxCell>
<mxCell id="58" style="edgeStyle=none;html=1;" parent="1" source="53" target="57" edge="1">
<mxGeometry relative="1" as="geometry"/>
</mxCell>
<mxCell id="53" value="&lt;div style=&quot;background-color: rgb(255, 255, 255); font-family: Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 14px; line-height: 19px;&quot;&gt;&lt;div style=&quot;line-height: 19px;&quot;&gt;SqlSessionTemplate&lt;/div&gt;&lt;/div&gt;" style="whiteSpace=wrap;html=1;" parent="1" vertex="1">
<mxGeometry x="-573" y="210" width="210" height="60" as="geometry"/>
</mxCell>
<mxCell id="57" value="mybatis" style="html=1;" parent="1" vertex="1">
<mxGeometry x="-523" y="465" width="110" height="50" as="geometry"/>
</mxCell>
</root>
</mxGraphModel>
</diagram>
</mxfile>

View File

@ -1,76 +0,0 @@
<mxfile host="65bd71144e">
<diagram id="X-9zxwZzwVme25TE_fPk" name="第 1 页">
<mxGraphModel dx="1002" dy="1732" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="827" pageHeight="1169" math="0" shadow="0">
<root>
<mxCell id="0"/>
<mxCell id="1" parent="0"/>
<mxCell id="2" value="微信小程序" style="shape=umlLifeline;perimeter=lifelinePerimeter;whiteSpace=wrap;html=1;container=1;collapsible=0;recursiveResize=0;outlineConnect=0;" vertex="1" parent="1">
<mxGeometry x="100" y="130" width="100" height="390" as="geometry"/>
</mxCell>
<mxCell id="16" value="" style="html=1;points=[];perimeter=orthogonalPerimeter;" vertex="1" parent="2">
<mxGeometry x="45" y="140" width="10" height="40" as="geometry"/>
</mxCell>
<mxCell id="17" value="wx.login" style="edgeStyle=orthogonalEdgeStyle;html=1;align=left;spacingLeft=2;endArrow=block;rounded=0;entryX=1;entryY=0;" edge="1" target="16" parent="2">
<mxGeometry relative="1" as="geometry">
<mxPoint x="50" y="120" as="sourcePoint"/>
<Array as="points">
<mxPoint x="80" y="120"/>
</Array>
</mxGeometry>
</mxCell>
<mxCell id="20" value="" style="html=1;points=[];perimeter=orthogonalPerimeter;" vertex="1" parent="2">
<mxGeometry x="45" y="260" width="10" height="40" as="geometry"/>
</mxCell>
<mxCell id="3" value="开发者服务器" style="shape=umlLifeline;perimeter=lifelinePerimeter;whiteSpace=wrap;html=1;container=1;collapsible=0;recursiveResize=0;outlineConnect=0;" vertex="1" parent="1">
<mxGeometry x="330" y="130" width="100" height="390" as="geometry"/>
</mxCell>
<mxCell id="9" value="" style="html=1;points=[];perimeter=orthogonalPerimeter;" vertex="1" parent="3">
<mxGeometry x="45" y="170" width="10" height="110" as="geometry"/>
</mxCell>
<mxCell id="4" value="微信接口服务" style="shape=umlLifeline;perimeter=lifelinePerimeter;whiteSpace=wrap;html=1;container=1;collapsible=0;recursiveResize=0;outlineConnect=0;" vertex="1" parent="1">
<mxGeometry x="590" y="130" width="100" height="400" as="geometry"/>
</mxCell>
<mxCell id="11" value="" style="html=1;points=[];perimeter=orthogonalPerimeter;" vertex="1" parent="4">
<mxGeometry x="45" y="175" width="10" height="60" as="geometry"/>
</mxCell>
<mxCell id="8" value="" style="html=1;verticalAlign=bottom;endArrow=block;exitX=0.9;exitY=0.89;exitDx=0;exitDy=0;exitPerimeter=0;" edge="1" parent="1" source="16" target="9">
<mxGeometry width="80" relative="1" as="geometry">
<mxPoint x="155" y="305" as="sourcePoint"/>
<mxPoint x="290" y="340" as="targetPoint"/>
</mxGeometry>
</mxCell>
<mxCell id="12" value="携带code" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" vertex="1" connectable="0" parent="8">
<mxGeometry x="-0.1218" y="-1" relative="1" as="geometry">
<mxPoint as="offset"/>
</mxGeometry>
</mxCell>
<mxCell id="10" value="携带appid、appsecret、code" style="html=1;verticalAlign=bottom;endArrow=block;entryX=-0.02;entryY=0.01;entryDx=0;entryDy=0;entryPerimeter=0;" edge="1" parent="1" source="9" target="11">
<mxGeometry width="80" relative="1" as="geometry">
<mxPoint x="460" y="330" as="sourcePoint"/>
<mxPoint x="550" y="330" as="targetPoint"/>
</mxGeometry>
</mxCell>
<mxCell id="18" value="返回session_key、openid" style="html=1;verticalAlign=bottom;endArrow=open;dashed=1;endSize=8;entryX=1.02;entryY=0.567;entryDx=0;entryDy=0;entryPerimeter=0;" edge="1" parent="1" source="11" target="9">
<mxGeometry relative="1" as="geometry">
<mxPoint x="574" y="360" as="sourcePoint"/>
<mxPoint x="414" y="360" as="targetPoint"/>
</mxGeometry>
</mxCell>
<mxCell id="19" value="返回token" style="html=1;verticalAlign=bottom;endArrow=open;dashed=1;endSize=8;entryX=0.98;entryY=0.235;entryDx=0;entryDy=0;entryPerimeter=0;" edge="1" parent="1" source="9" target="20">
<mxGeometry relative="1" as="geometry">
<mxPoint x="290" y="400" as="sourcePoint"/>
<mxPoint x="210" y="400" as="targetPoint"/>
</mxGeometry>
</mxCell>
<mxCell id="21" value="code临时登录凭证只能使用一次&lt;br&gt;appid开发者id&lt;br&gt;appsecret开发者密码&lt;br&gt;openid用户唯一标识&lt;br&gt;session_key会话密钥对用户数据进行加密的签名" style="html=1;dropTarget=0;align=left;" vertex="1" parent="1">
<mxGeometry x="90" y="-80" width="300" height="160" as="geometry"/>
</mxCell>
<mxCell id="22" value="" style="shape=module;jettyWidth=8;jettyHeight=4;" vertex="1" parent="21">
<mxGeometry x="1" width="20" height="20" relative="1" as="geometry">
<mxPoint x="-27" y="7" as="offset"/>
</mxGeometry>
</mxCell>
</root>
</mxGraphModel>
</diagram>
</mxfile>

View File

@ -1,43 +0,0 @@
<mxfile host="65bd71144e">
<diagram id="eUwQ9UTd_wFMP36Shy1F" name="第 1 页">
<mxGraphModel dx="1173" dy="766" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="827" pageHeight="1169" math="0" shadow="0">
<root>
<mxCell id="0"/>
<mxCell id="1" parent="0"/>
<mxCell id="4" value="" style="edgeStyle=none;html=1;" edge="1" parent="1" source="2" target="3">
<mxGeometry relative="1" as="geometry"/>
</mxCell>
<mxCell id="2" value="获取支付链接" style="html=1;" vertex="1" parent="1">
<mxGeometry x="400" y="140" width="110" height="50" as="geometry"/>
</mxCell>
<mxCell id="6" value="" style="edgeStyle=none;html=1;" edge="1" parent="1" source="3" target="5">
<mxGeometry relative="1" as="geometry"/>
</mxCell>
<mxCell id="3" value="用户支付" style="html=1;" vertex="1" parent="1">
<mxGeometry x="400" y="220" width="110" height="50" as="geometry"/>
</mxCell>
<mxCell id="8" value="" style="edgeStyle=none;html=1;" edge="1" parent="1" source="5" target="7">
<mxGeometry relative="1" as="geometry"/>
</mxCell>
<mxCell id="5" value="进入支付回调" style="html=1;" vertex="1" parent="1">
<mxGeometry x="400" y="310" width="110" height="50" as="geometry"/>
</mxCell>
<mxCell id="17" value="" style="edgeStyle=none;html=1;" edge="1" parent="1" source="7" target="13">
<mxGeometry relative="1" as="geometry"/>
</mxCell>
<mxCell id="7" value="验签" style="html=1;" vertex="1" parent="1">
<mxGeometry x="400" y="400" width="110" height="50" as="geometry"/>
</mxCell>
<mxCell id="9" value="用户定义的回调业务" style="html=1;" vertex="1" parent="1">
<mxGeometry x="400" y="580" width="110" height="50" as="geometry"/>
</mxCell>
<mxCell id="18" value="" style="edgeStyle=none;html=1;" edge="1" parent="1" source="13" target="9">
<mxGeometry relative="1" as="geometry"/>
</mxCell>
<mxCell id="13" value="更改订单状态" style="html=1;" vertex="1" parent="1">
<mxGeometry x="400" y="490" width="110" height="50" as="geometry"/>
</mxCell>
</root>
</mxGraphModel>
</diagram>
</mxfile>

View File

@ -1,222 +0,0 @@
<mxfile host="65bd71144e">
<diagram id="OUCQybPowJdnNh2YIqGc" name="第 1 页">
<mxGraphModel dx="823" dy="766" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="827" pageHeight="1169" math="0" shadow="0">
<root>
<mxCell id="0"/>
<mxCell id="1" parent="0"/>
<mxCell id="2" value="" style="ellipse;html=1;shape=startState;fillColor=#000000;strokeColor=#ff0000;" parent="1" vertex="1">
<mxGeometry x="388" y="260" width="30" height="30" as="geometry"/>
</mxCell>
<mxCell id="3" value="" style="edgeStyle=orthogonalEdgeStyle;html=1;verticalAlign=bottom;endArrow=open;endSize=8;strokeColor=#ff0000;" parent="1" source="2" target="5" edge="1">
<mxGeometry relative="1" as="geometry">
<mxPoint x="403" y="440" as="targetPoint"/>
</mxGeometry>
</mxCell>
<mxCell id="4" value="创建订单" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" parent="3" vertex="1" connectable="0">
<mxGeometry x="-0.1879" y="-1" relative="1" as="geometry">
<mxPoint as="offset"/>
</mxGeometry>
</mxCell>
<mxCell id="5" value="未支付" style="rounded=1;whiteSpace=wrap;html=1;arcSize=40;fontColor=#000000;fillColor=#ffffc0;strokeColor=#ff0000;" parent="1" vertex="1">
<mxGeometry x="343" y="370" width="120" height="40" as="geometry"/>
</mxCell>
<mxCell id="6" value="" style="edgeStyle=orthogonalEdgeStyle;html=1;verticalAlign=bottom;endArrow=open;endSize=8;strokeColor=#ff0000;entryX=0.5;entryY=0;entryDx=0;entryDy=0;" parent="1" source="5" target="8" edge="1">
<mxGeometry relative="1" as="geometry">
<mxPoint x="462" y="540" as="targetPoint"/>
</mxGeometry>
</mxCell>
<mxCell id="7" value="支付" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" parent="6" vertex="1" connectable="0">
<mxGeometry x="-0.2513" y="-1" relative="1" as="geometry">
<mxPoint x="1" y="13" as="offset"/>
</mxGeometry>
</mxCell>
<mxCell id="8" value="已支付" style="rounded=1;whiteSpace=wrap;html=1;arcSize=40;fontColor=#000000;fillColor=#ffffc0;strokeColor=#ff0000;" parent="1" vertex="1">
<mxGeometry x="343" y="490" width="120" height="40" as="geometry"/>
</mxCell>
<mxCell id="9" value="" style="edgeStyle=orthogonalEdgeStyle;html=1;verticalAlign=bottom;endArrow=open;endSize=8;strokeColor=#ff0000;exitX=0;exitY=0.25;exitDx=0;exitDy=0;entryX=1;entryY=0.25;entryDx=0;entryDy=0;" parent="1" source="8" target="14" edge="1">
<mxGeometry relative="1" as="geometry">
<mxPoint x="288" y="590" as="targetPoint"/>
<mxPoint x="343" y="510" as="sourcePoint"/>
</mxGeometry>
</mxCell>
<mxCell id="10" value="申请开票" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" parent="9" vertex="1" connectable="0">
<mxGeometry x="-0.2606" relative="1" as="geometry">
<mxPoint x="-7" as="offset"/>
</mxGeometry>
</mxCell>
<mxCell id="13" value="" style="ellipse;html=1;shape=endState;fillColor=#000000;strokeColor=#ff0000;" parent="1" vertex="1">
<mxGeometry x="388" y="595" width="30" height="30" as="geometry"/>
</mxCell>
<mxCell id="14" value="待开票" style="rounded=1;whiteSpace=wrap;html=1;arcSize=40;fontColor=#000000;fillColor=#ffffc0;strokeColor=#ff0000;" parent="1" vertex="1">
<mxGeometry x="129" y="490" width="120" height="40" as="geometry"/>
</mxCell>
<mxCell id="15" value="" style="edgeStyle=orthogonalEdgeStyle;html=1;verticalAlign=bottom;endArrow=open;endSize=8;strokeColor=#ff0000;exitX=0.5;exitY=1;exitDx=0;exitDy=0;" parent="1" source="14" target="17" edge="1">
<mxGeometry relative="1" as="geometry">
<mxPoint x="273" y="730" as="targetPoint"/>
</mxGeometry>
</mxCell>
<mxCell id="16" value="同意开票" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" parent="15" vertex="1" connectable="0">
<mxGeometry x="-0.2741" y="1" relative="1" as="geometry">
<mxPoint x="-1" y="8" as="offset"/>
</mxGeometry>
</mxCell>
<mxCell id="17" value="已开票" style="rounded=1;whiteSpace=wrap;html=1;arcSize=40;fontColor=#000000;fillColor=#ffffc0;strokeColor=#ff0000;" parent="1" vertex="1">
<mxGeometry x="129" y="590" width="120" height="40" as="geometry"/>
</mxCell>
<mxCell id="18" value="" style="edgeStyle=orthogonalEdgeStyle;html=1;verticalAlign=bottom;endArrow=open;endSize=8;strokeColor=#ff0000;entryX=0;entryY=0.5;entryDx=0;entryDy=0;exitX=1;exitY=0.5;exitDx=0;exitDy=0;" parent="1" source="17" target="13" edge="1">
<mxGeometry relative="1" as="geometry">
<mxPoint x="273" y="840" as="targetPoint"/>
<Array as="points"/>
<mxPoint x="299" y="800" as="sourcePoint"/>
</mxGeometry>
</mxCell>
<mxCell id="19" value="下载发票" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" parent="18" vertex="1" connectable="0">
<mxGeometry x="-0.2583" y="-1" relative="1" as="geometry">
<mxPoint x="-12" y="-1" as="offset"/>
</mxGeometry>
</mxCell>
<mxCell id="21" value="开票失败" style="rounded=1;whiteSpace=wrap;html=1;arcSize=40;fontColor=#000000;fillColor=#ffffc0;strokeColor=#ff0000;" parent="1" vertex="1">
<mxGeometry x="129" y="370" width="120" height="40" as="geometry"/>
</mxCell>
<mxCell id="22" value="" style="edgeStyle=orthogonalEdgeStyle;html=1;verticalAlign=bottom;endArrow=open;endSize=8;strokeColor=#ff0000;exitX=0.75;exitY=0;exitDx=0;exitDy=0;entryX=0.75;entryY=1;entryDx=0;entryDy=0;" parent="1" source="14" target="21" edge="1">
<mxGeometry relative="1" as="geometry">
<mxPoint x="478" y="750" as="targetPoint"/>
<Array as="points">
<mxPoint x="219" y="410"/>
<mxPoint x="219" y="410"/>
</Array>
</mxGeometry>
</mxCell>
<mxCell id="23" value="不同意开票" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" parent="22" vertex="1" connectable="0">
<mxGeometry x="-0.1415" y="-1" relative="1" as="geometry">
<mxPoint x="-1" y="13" as="offset"/>
</mxGeometry>
</mxCell>
<mxCell id="25" value="" style="edgeStyle=orthogonalEdgeStyle;html=1;verticalAlign=bottom;endArrow=open;endSize=8;strokeColor=#ff0000;exitX=0.25;exitY=1;exitDx=0;exitDy=0;entryX=0.25;entryY=0;entryDx=0;entryDy=0;" parent="1" source="21" target="14" edge="1">
<mxGeometry relative="1" as="geometry">
<mxPoint x="149" y="580" as="targetPoint"/>
<mxPoint x="79" y="440" as="sourcePoint"/>
<Array as="points">
<mxPoint x="159" y="460"/>
<mxPoint x="159" y="460"/>
</Array>
</mxGeometry>
</mxCell>
<mxCell id="26" value="再次申请开票" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" parent="25" vertex="1" connectable="0">
<mxGeometry x="-0.1415" y="-1" relative="1" as="geometry">
<mxPoint x="5" y="-1" as="offset"/>
</mxGeometry>
</mxCell>
<mxCell id="27" value="待退款" style="rounded=1;whiteSpace=wrap;html=1;arcSize=40;fontColor=#000000;fillColor=#ffffc0;strokeColor=#ff0000;" parent="1" vertex="1">
<mxGeometry x="579" y="490" width="120" height="40" as="geometry"/>
</mxCell>
<mxCell id="28" value="" style="edgeStyle=orthogonalEdgeStyle;html=1;verticalAlign=bottom;endArrow=open;endSize=8;strokeColor=#ff0000;entryX=0.5;entryY=0;entryDx=0;entryDy=0;exitX=0.5;exitY=1;exitDx=0;exitDy=0;" parent="1" source="27" target="32" edge="1">
<mxGeometry relative="1" as="geometry">
<mxPoint x="462" y="700" as="targetPoint"/>
<mxPoint x="579" y="650" as="sourcePoint"/>
</mxGeometry>
</mxCell>
<mxCell id="34" value="同意退款" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" parent="28" vertex="1" connectable="0">
<mxGeometry x="-0.2333" y="-2" relative="1" as="geometry">
<mxPoint x="-2" y="3" as="offset"/>
</mxGeometry>
</mxCell>
<mxCell id="30" value="" style="edgeStyle=orthogonalEdgeStyle;html=1;verticalAlign=bottom;endArrow=open;endSize=8;strokeColor=#ff0000;movable=1;resizable=1;rotatable=1;deletable=1;editable=1;connectable=1;exitX=1;exitY=0.75;exitDx=0;exitDy=0;entryX=0;entryY=0.75;entryDx=0;entryDy=0;" parent="1" source="8" target="27" edge="1">
<mxGeometry relative="1" as="geometry">
<mxPoint x="499" y="550" as="targetPoint"/>
<mxPoint x="669" y="570" as="sourcePoint"/>
<Array as="points"/>
</mxGeometry>
</mxCell>
<mxCell id="31" value="申请退款" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" parent="30" vertex="1" connectable="0">
<mxGeometry x="0.2333" relative="1" as="geometry">
<mxPoint x="-28" as="offset"/>
</mxGeometry>
</mxCell>
<mxCell id="32" value="已退款" style="rounded=1;whiteSpace=wrap;html=1;arcSize=40;fontColor=#000000;fillColor=#ffffc0;strokeColor=#ff0000;" parent="1" vertex="1">
<mxGeometry x="579" y="590" width="120" height="40" as="geometry"/>
</mxCell>
<mxCell id="33" value="" style="edgeStyle=orthogonalEdgeStyle;html=1;verticalAlign=bottom;endArrow=open;endSize=8;strokeColor=#ff0000;entryX=1;entryY=0.5;entryDx=0;entryDy=0;exitX=0;exitY=0.5;exitDx=0;exitDy=0;" parent="1" source="32" target="13" edge="1">
<mxGeometry relative="1" as="geometry">
<mxPoint x="462" y="830" as="targetPoint"/>
<Array as="points"/>
</mxGeometry>
</mxCell>
<mxCell id="35" value="退款到账" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" parent="33" vertex="1" connectable="0">
<mxGeometry x="0.0112" y="3" relative="1" as="geometry">
<mxPoint x="30" y="-3" as="offset"/>
</mxGeometry>
</mxCell>
<mxCell id="36" value="退款失败" style="rounded=1;whiteSpace=wrap;html=1;arcSize=40;fontColor=#000000;fillColor=#ffffc0;strokeColor=#ff0000;" parent="1" vertex="1">
<mxGeometry x="579" y="370" width="120" height="40" as="geometry"/>
</mxCell>
<mxCell id="37" value="" style="edgeStyle=orthogonalEdgeStyle;html=1;verticalAlign=bottom;endArrow=open;endSize=8;strokeColor=#ff0000;exitX=0.75;exitY=0;exitDx=0;exitDy=0;entryX=0.75;entryY=1;entryDx=0;entryDy=0;" parent="1" source="27" target="36" edge="1">
<mxGeometry relative="1" as="geometry">
<mxPoint x="688" y="800" as="targetPoint"/>
<Array as="points">
<mxPoint x="669" y="460"/>
<mxPoint x="669" y="460"/>
</Array>
</mxGeometry>
</mxCell>
<mxCell id="38" value="拒绝退款" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" parent="37" vertex="1" connectable="0">
<mxGeometry x="-0.4012" y="2" relative="1" as="geometry">
<mxPoint x="2" y="-16" as="offset"/>
</mxGeometry>
</mxCell>
<mxCell id="40" value="" style="edgeStyle=orthogonalEdgeStyle;html=1;verticalAlign=bottom;endArrow=open;endSize=8;strokeColor=#ff0000;entryX=0.25;entryY=0;entryDx=0;entryDy=0;exitX=0.25;exitY=1;exitDx=0;exitDy=0;" parent="1" source="36" target="27" edge="1">
<mxGeometry relative="1" as="geometry">
<mxPoint x="698" y="710" as="targetPoint"/>
<mxPoint x="738" y="590" as="sourcePoint"/>
<Array as="points">
<mxPoint x="609" y="470"/>
<mxPoint x="609" y="470"/>
</Array>
</mxGeometry>
</mxCell>
<mxCell id="41" value="再次申请退款" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" parent="40" vertex="1" connectable="0">
<mxGeometry x="-0.4012" y="2" relative="1" as="geometry">
<mxPoint x="-12" y="16" as="offset"/>
</mxGeometry>
</mxCell>
<mxCell id="43" value="" style="edgeStyle=orthogonalEdgeStyle;html=1;verticalAlign=bottom;endArrow=open;endSize=8;strokeColor=#ff0000;movable=1;resizable=1;rotatable=1;deletable=1;editable=1;connectable=1;entryX=1;entryY=0.25;entryDx=0;entryDy=0;exitX=0;exitY=0.25;exitDx=0;exitDy=0;" parent="1" source="27" target="8" edge="1">
<mxGeometry relative="1" as="geometry">
<mxPoint x="442" y="640" as="targetPoint"/>
<mxPoint x="539" y="500" as="sourcePoint"/>
<Array as="points">
<mxPoint x="539" y="500"/>
<mxPoint x="539" y="500"/>
</Array>
</mxGeometry>
</mxCell>
<mxCell id="44" value="拒绝退款" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" parent="43" vertex="1" connectable="0">
<mxGeometry x="0.2333" relative="1" as="geometry">
<mxPoint x="12" as="offset"/>
</mxGeometry>
</mxCell>
<mxCell id="45" value="" style="edgeStyle=orthogonalEdgeStyle;html=1;verticalAlign=bottom;endArrow=open;endSize=8;strokeColor=#ff0000;entryX=0;entryY=0.75;entryDx=0;entryDy=0;exitX=1;exitY=0.75;exitDx=0;exitDy=0;" parent="1" source="14" target="8" edge="1">
<mxGeometry relative="1" as="geometry">
<mxPoint x="349" y="610" as="targetPoint"/>
<mxPoint x="359" y="550" as="sourcePoint"/>
</mxGeometry>
</mxCell>
<mxCell id="46" value="拒绝开票" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" parent="45" vertex="1" connectable="0">
<mxGeometry x="-0.2606" relative="1" as="geometry">
<mxPoint x="6" as="offset"/>
</mxGeometry>
</mxCell>
<mxCell id="49" value="" style="edgeStyle=orthogonalEdgeStyle;html=1;verticalAlign=bottom;endArrow=open;endSize=8;strokeColor=#ff0000;entryX=0.5;entryY=0;entryDx=0;entryDy=0;exitX=0.5;exitY=1;exitDx=0;exitDy=0;" parent="1" source="8" target="13" edge="1">
<mxGeometry relative="1" as="geometry">
<mxPoint x="413" y="500" as="targetPoint"/>
<mxPoint x="413" y="420" as="sourcePoint"/>
</mxGeometry>
</mxCell>
<mxCell id="50" value="不支持开发票" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" parent="49" vertex="1" connectable="0">
<mxGeometry x="-0.2513" y="-1" relative="1" as="geometry">
<mxPoint x="1" y="6" as="offset"/>
</mxGeometry>
</mxCell>
</root>
</mxGraphModel>
</diagram>
</mxfile>

View File

@ -1,68 +0,0 @@
### 与权限有关的注解
`@Anonymous`注解用于配置公开接口
`@PreAuthorize`注解用于配置接口要求用户拥有某些权限才可访问,它拥有如下方法
| 方法 | 参数 | 描述 |
| ----------- | ------ | ---------------------------------------------- |
| hasPermi | String | 验证用户是否具备某权限 |
| lacksPermi | String | 验证用户是否不具备某权限,与 hasPermi逻辑相反 |
| hasAnyPermi | String | 验证用户是否具有以下任意一个权限 |
| hasRole | String | 判断用户是否拥有某个角色 |
| lacksRole | String | 验证用户是否不具备某角色,与 isRole逻辑相反 |
| hasAnyRoles | String | 验证用户是否具有以下任意一个角色,多个逗号分隔 |
```java
@PreAuthorize("@ss.hasPermi('system:user:list')")
@PreAuthorize("@ss.lacksPermi('system:user:list')")
@PreAuthorize("@ss.hasAnyPermi('system:user:add,system:user:edit')")
```
`@DataScope`注解用于配置接口数据权限
* `deptAlias`用于指定部门表的别名;
* `userAlias`用于指定用户表的别名;
* 实体需要继承BaseEntity类;
* `全部数据权限`、`自定数据权限`、`部门数据权限`、`部门及以下数据权限`、`仅本人数据权限`五种权限模式在后台角色管理界面配置数据权限
```java
// 部门数据权限注解
@DataScope(deptAlias = "d")
// 部门及用户权限注解
@DataScope(deptAlias = "d", userAlias = "u")
```
1. 使用注解
```java
@DataScope(deptAlias = "d", userAlias = "u")
public List<...> select(...)
{
return mapper.select(...);
}
```
2. 配置mybatis的xml
```xml
<select id="select" parameterType="..." resultMap="...Result">
<include refid="select...Vo"/>
<!-- 数据范围过滤 -->
${params.dataScope}
</select>
```
### 安全工具类
com.datai.common.utils.SecurityUtils
| 方法 | 参数 | 返回 | 描述 |
| ------------ | ------ | ---------- | ------------------------ |
| getUserId | 无 | Long | 获取当前用户ID |
| getDeptId | 无 | Long | 获取当前部门ID |
| getUsername | 无 | String | 获取当前用户账户 |
| getLoginUser | 无 | LonginUser | 获取当前登录用户代理 |
| hasPermi | String | boolean | 验证用户是否具备某权限 |
| hasRole | String | boolean | 验证用户是否拥有某个角色 |

View File

@ -1,100 +0,0 @@
<mxfile host="65bd71144e">
<diagram id="TvbLNUR7pZR6Xx6IZirq" name="第 1 页">
<mxGraphModel dx="1050" dy="563" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="827" pageHeight="1169" math="0" shadow="0">
<root>
<mxCell id="0"/>
<mxCell id="1" parent="0"/>
<mxCell id="2" value="datai-admin" style="html=1;" parent="1" vertex="1">
<mxGeometry x="380" y="780" width="110" height="50" as="geometry"/>
</mxCell>
<mxCell id="4" style="edgeStyle=none;html=1;" parent="1" source="3" target="5" edge="1">
<mxGeometry relative="1" as="geometry"/>
</mxCell>
<mxCell id="10" style="edgeStyle=none;html=1;" edge="1" parent="1" source="3" target="9">
<mxGeometry relative="1" as="geometry"/>
</mxCell>
<mxCell id="28" style="edgeStyle=none;html=1;" edge="1" parent="1" source="3" target="26">
<mxGeometry relative="1" as="geometry"/>
</mxCell>
<mxCell id="34" style="edgeStyle=none;html=1;" edge="1" parent="1" source="3" target="31">
<mxGeometry relative="1" as="geometry"/>
</mxCell>
<mxCell id="3" value="datai-common" style="html=1;" parent="1" vertex="1">
<mxGeometry x="380" y="320" width="110" height="50" as="geometry"/>
</mxCell>
<mxCell id="7" style="edgeStyle=none;html=1;" edge="1" parent="1" source="5" target="6">
<mxGeometry relative="1" as="geometry"/>
</mxCell>
<mxCell id="5" value="datai-system" style="html=1;" vertex="1" parent="1">
<mxGeometry x="380" y="440" width="110" height="50" as="geometry"/>
</mxCell>
<mxCell id="8" style="edgeStyle=none;html=1;entryX=0.5;entryY=0;entryDx=0;entryDy=0;" edge="1" parent="1" source="6" target="2">
<mxGeometry relative="1" as="geometry"/>
</mxCell>
<mxCell id="13" style="edgeStyle=none;html=1;" edge="1" parent="1" source="6" target="12">
<mxGeometry relative="1" as="geometry"/>
</mxCell>
<mxCell id="24" style="edgeStyle=none;html=1;" edge="1" parent="1" source="6" target="20">
<mxGeometry relative="1" as="geometry"/>
</mxCell>
<mxCell id="6" value="datai-framework" style="html=1;" vertex="1" parent="1">
<mxGeometry x="380" y="560" width="110" height="50" as="geometry"/>
</mxCell>
<mxCell id="11" style="edgeStyle=none;html=1;" edge="1" parent="1" source="9" target="2">
<mxGeometry relative="1" as="geometry"/>
</mxCell>
<mxCell id="9" value="datai-quartz" style="html=1;" vertex="1" parent="1">
<mxGeometry x="260" y="585" width="110" height="50" as="geometry"/>
</mxCell>
<mxCell id="14" style="edgeStyle=none;html=1;" edge="1" parent="1" source="12" target="2">
<mxGeometry relative="1" as="geometry"/>
</mxCell>
<mxCell id="12" value="datai-online" style="html=1;" vertex="1" parent="1">
<mxGeometry x="520" y="585" width="110" height="50" as="geometry"/>
</mxCell>
<mxCell id="18" style="edgeStyle=none;html=1;" edge="1" parent="1" source="15" target="2">
<mxGeometry relative="1" as="geometry"/>
</mxCell>
<mxCell id="15" value="datai-oauth-starter" style="html=1;" vertex="1" parent="1">
<mxGeometry x="590" y="700" width="110" height="50" as="geometry"/>
</mxCell>
<mxCell id="17" style="edgeStyle=none;html=1;" edge="1" parent="1" source="16" target="2">
<mxGeometry relative="1" as="geometry"/>
</mxCell>
<mxCell id="16" value="datai-pay-stater" style="html=1;" vertex="1" parent="1">
<mxGeometry x="180" y="730" width="110" height="50" as="geometry"/>
</mxCell>
<mxCell id="23" style="edgeStyle=none;html=1;" edge="1" parent="1" source="19" target="15">
<mxGeometry relative="1" as="geometry"/>
</mxCell>
<mxCell id="19" value="datai-oauth-xx" style="html=1;" vertex="1" parent="1">
<mxGeometry x="660" y="585" width="110" height="50" as="geometry"/>
</mxCell>
<mxCell id="22" style="edgeStyle=none;html=1;" edge="1" parent="1" source="20" target="19">
<mxGeometry relative="1" as="geometry"/>
</mxCell>
<mxCell id="20" value="datai-oauth-common" style="html=1;" vertex="1" parent="1">
<mxGeometry x="660" y="370" width="110" height="50" as="geometry"/>
</mxCell>
<mxCell id="30" style="edgeStyle=none;html=1;" edge="1" parent="1" source="25" target="16">
<mxGeometry relative="1" as="geometry"/>
</mxCell>
<mxCell id="25" value="datai-pay-xx" style="html=1;" vertex="1" parent="1">
<mxGeometry x="20" y="585" width="110" height="50" as="geometry"/>
</mxCell>
<mxCell id="29" style="edgeStyle=none;html=1;" edge="1" parent="1" source="26" target="25">
<mxGeometry relative="1" as="geometry"/>
</mxCell>
<mxCell id="26" value="datai-pay-common" style="html=1;" vertex="1" parent="1">
<mxGeometry x="20" y="400" width="110" height="50" as="geometry"/>
</mxCell>
<mxCell id="33" style="edgeStyle=none;html=1;" edge="1" parent="1" source="31" target="2">
<mxGeometry relative="1" as="geometry"/>
</mxCell>
<mxCell id="31" value="datai-generator" style="html=1;" vertex="1" parent="1">
<mxGeometry x="140" y="585" width="110" height="50" as="geometry"/>
</mxCell>
</root>
</mxGraphModel>
</diagram>
</mxfile>

View File

@ -1,131 +0,0 @@
<mxfile host="65bd71144e">
<diagram id="IyeDk-cAWrKOq7F3gyWb" name="第 1 页">
<mxGraphModel dx="344" dy="766" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="827" pageHeight="1169" background="#FFFFFF" math="0" shadow="0">
<root>
<mxCell id="0"/>
<mxCell id="1" parent="0"/>
<mxCell id="7" value="" style="edgeStyle=none;html=1;" parent="1" source="5" target="6" edge="1">
<mxGeometry relative="1" as="geometry"/>
</mxCell>
<mxCell id="5" value="访问/login" style="html=1;" parent="1" vertex="1">
<mxGeometry x="300" y="30" width="110" height="50" as="geometry"/>
</mxCell>
<mxCell id="9" value="" style="edgeStyle=none;html=1;" parent="1" source="6" target="20" edge="1">
<mxGeometry relative="1" as="geometry">
<mxPoint x="359.0000000000001" y="200" as="targetPoint"/>
</mxGeometry>
</mxCell>
<mxCell id="6" value="被SysLoginController.login()捕获" style="html=1;" parent="1" vertex="1">
<mxGeometry x="261.5" y="100" width="187" height="30" as="geometry"/>
</mxCell>
<mxCell id="20" value="&lt;span style=&quot;font-weight: 400;&quot;&gt;调用方法SysLoginService.login()执行登录逻辑&lt;/span&gt;" style="swimlane;whiteSpace=wrap;html=1;" parent="1" vertex="1">
<mxGeometry x="110" y="155" width="490" height="935" as="geometry">
<mxRectangle x="109" y="195" width="290" height="30" as="alternateBounds"/>
</mxGeometry>
</mxCell>
<mxCell id="22" value="" style="edgeStyle=none;html=1;" parent="20" source="10" target="21" edge="1">
<mxGeometry relative="1" as="geometry"/>
</mxCell>
<mxCell id="10" value="&lt;div style=&quot;text-align: center;&quot;&gt;&lt;span style=&quot;background-color: transparent;&quot;&gt;调用方法SysLoginService.validateCaptcha()&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;&quot;&gt;&lt;span style=&quot;background-color: transparent;&quot;&gt;1. &lt;/span&gt;&lt;font style=&quot;background-color: transparent; color: rgb(0, 0, 204);&quot;&gt;从redis里拿到验证码对应的验证信息&lt;/font&gt;&lt;/div&gt;&lt;div style=&quot;&quot;&gt;&lt;span style=&quot;background-color: transparent;&quot;&gt;2. &lt;/span&gt;&lt;font style=&quot;background-color: transparent; color: rgb(0, 0, 204);&quot;&gt;删除redis中验证码对应的验证信息&lt;/font&gt;&lt;/div&gt;&lt;div style=&quot;&quot;&gt;&lt;span style=&quot;background-color: transparent;&quot;&gt;3. 如果验证信息为空,&lt;/span&gt;&lt;font style=&quot;background-color: transparent;&quot;&gt;抛出验证码过期的异常&lt;/font&gt;&lt;/div&gt;&lt;div style=&quot;&quot;&gt;&lt;span style=&quot;background-color: transparent;&quot;&gt;4. 如果code与验证信息的值不同&lt;/span&gt;&lt;font style=&quot;background-color: transparent;&quot;&gt;抛出验证码错误的异常&lt;/font&gt;&lt;/div&gt;" style="html=1;align=left;" parent="20" vertex="1">
<mxGeometry x="87.42999999999999" y="35" width="315.15" height="100" as="geometry"/>
</mxCell>
<mxCell id="24" value="" style="edgeStyle=none;html=1;" parent="20" source="21" target="23" edge="1">
<mxGeometry relative="1" as="geometry"/>
</mxCell>
<mxCell id="21" value="调用方法SysLoginService.loginPreCheck()&lt;br&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;background-color: transparent;&quot;&gt;1. &lt;/span&gt;&lt;font style=&quot;background-color: transparent;&quot;&gt;用户名或密码为空 -&amp;gt; 错误 &lt;font style=&quot;color: rgb(255, 0, 0);&quot;&gt;抛出异常&lt;/font&gt;&lt;/font&gt;&lt;/div&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;background-color: transparent;&quot;&gt;2. &lt;/span&gt;&lt;font style=&quot;background-color: transparent;&quot;&gt;密码不在指定范围内 -&amp;gt; 错误 &lt;font style=&quot;color: rgb(255, 0, 0);&quot;&gt;抛出异常&lt;/font&gt;&lt;/font&gt;&lt;/div&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;background-color: transparent;&quot;&gt;3. &lt;/span&gt;&lt;font style=&quot;background-color: transparent;&quot;&gt;用户名不在指定范围内 -&amp;gt; 错误 &lt;font style=&quot;color: rgb(255, 0, 0);&quot;&gt;抛出异常&lt;/font&gt;&lt;/font&gt;&lt;/div&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;background-color: transparent;&quot;&gt;4. &lt;/span&gt;&lt;font style=&quot;background-color: transparent;&quot;&gt;IP黑名单校验 -&amp;gt; 错误 &lt;font style=&quot;color: rgb(255, 0, 0);&quot;&gt;抛出异常&lt;/font&gt;&lt;/font&gt;&lt;/div&gt;" style="html=1;" parent="20" vertex="1">
<mxGeometry x="112.91" y="170" width="267.1" height="100" as="geometry"/>
</mxCell>
<mxCell id="26" style="edgeStyle=none;html=1;" parent="20" source="23" target="25" edge="1">
<mxGeometry relative="1" as="geometry"/>
</mxCell>
<mxCell id="23" value="&lt;font style=&quot;color: rgb(0, 204, 0);&quot;&gt;通过new UsernamePasswordAuthenticationToken生成一个认证信息&lt;br&gt;通过AuthenticationContextHolder.setContext将认证信息设置到上下文&lt;/font&gt;&lt;br&gt;通过AuthenticationManager.authenticate()对认证信息进行认证,这个方法&lt;br&gt;会去调用UserDetailsServiceImpl.loadUserByUsername()方法进行认证" style="html=1;" parent="20" vertex="1">
<mxGeometry x="43.39" y="295" width="406.13" height="70" as="geometry"/>
</mxCell>
<mxCell id="68" style="edgeStyle=none;html=1;" edge="1" parent="20" source="25" target="40">
<mxGeometry relative="1" as="geometry"/>
</mxCell>
<mxCell id="25" value="&lt;span style=&quot;font-weight: 400;&quot;&gt;loadUserByUsername&lt;/span&gt;" style="swimlane;whiteSpace=wrap;html=1;" parent="20" vertex="1">
<mxGeometry x="27.43" y="385" width="438.06" height="355" as="geometry">
<mxRectangle x="25.97999999999999" y="380" width="160" height="30" as="alternateBounds"/>
</mxGeometry>
</mxCell>
<mxCell id="29" value="" style="edgeStyle=none;html=1;" parent="25" source="27" target="28" edge="1">
<mxGeometry relative="1" as="geometry"/>
</mxCell>
<mxCell id="27" value="调用ISysUserService.selectUserByUserName()获取用户信息&lt;br&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;background-color: transparent;&quot;&gt;校验是否为空 -&amp;gt; &lt;/span&gt;&lt;font style=&quot;background-color: transparent; color: rgb(255, 0, 0);&quot;&gt;抛出用户不存在的异常&lt;/font&gt;&lt;/div&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;background-color: transparent;&quot;&gt;校验是否已被删除 -&amp;gt; &lt;/span&gt;&lt;font style=&quot;background-color: transparent; color: rgb(255, 0, 0);&quot;&gt;抛出用户已被删除的异常&lt;/font&gt;&lt;/div&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;background-color: transparent;&quot;&gt;校验是否已被停用 -&amp;gt; &lt;/span&gt;&lt;font style=&quot;background-color: transparent; color: rgb(255, 0, 0);&quot;&gt;抛出用户已被停用的异常&lt;/font&gt;&lt;/div&gt;" style="whiteSpace=wrap;html=1;" parent="25" vertex="1">
<mxGeometry x="48.55" y="40" width="340.95" height="60" as="geometry"/>
</mxCell>
<mxCell id="28" value="调用SysPasswordService.validate()进行认证&lt;br&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;background-color: transparent;&quot;&gt;1. 获取上下文的认证信息,并获取认证信息中携带的用户名和密码&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;background-color: transparent;&quot;&gt;2. &lt;/span&gt;&lt;font style=&quot;background-color: transparent; color: rgb(0, 0, 255);&quot;&gt;从redis中获取该用户名密码错误次数&lt;/font&gt;&lt;/div&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;background-color: transparent;&quot;&gt;3. 校验该用户名密码错误次数是否过多&lt;/span&gt;&lt;span style=&quot;background-color: transparent;&quot;&gt;若次数过多,则&lt;/span&gt;&lt;font style=&quot;background-color: transparent; color: rgb(255, 0, 0);&quot;&gt;抛出密码错误次数过多的异常&lt;/font&gt;&lt;/div&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;background-color: transparent;&quot;&gt;4. 调用SecurityUtils.matchesPassword方法校验用户名密码是否匹配&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;background-color: transparent;&quot;&gt;5. 若不匹配,&lt;font style=&quot;color: rgb(0, 0, 255);&quot;&gt;则密码错误次数加一&lt;/font&gt;,且&lt;/span&gt;&lt;font style=&quot;background-color: transparent;&quot;&gt;抛&lt;font style=&quot;color: rgb(255, 0, 0);&quot;&gt;出密码错误的异常&lt;/font&gt;&lt;/font&gt;&lt;/div&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;background-color: transparent;&quot;&gt;6. 若匹配,&lt;font style=&quot;color: rgb(0, 0, 255);&quot;&gt;则清除密码错误次数&lt;/font&gt;,校验结束即校验通过&lt;/span&gt;&lt;/div&gt;" style="whiteSpace=wrap;html=1;" parent="25" vertex="1">
<mxGeometry x="33.56" y="135" width="370.95" height="120" as="geometry"/>
</mxCell>
<mxCell id="36" value="调用createLoginUser方法new&amp;nbsp;LoginUser()创建一个UserDetails凭证&lt;br&gt;调用SysPermissionService.getMenuPermission()方法获取用户角色权限" style="html=1;" parent="25" vertex="1">
<mxGeometry x="27.98" y="290" width="382.09" height="50" as="geometry"/>
</mxCell>
<mxCell id="37" style="edgeStyle=none;html=1;" parent="25" source="28" target="36" edge="1">
<mxGeometry relative="1" as="geometry">
<mxPoint x="324.02" y="280" as="targetPoint"/>
</mxGeometry>
</mxCell>
<mxCell id="44" value="" style="edgeStyle=none;html=1;" parent="20" source="40" target="43" edge="1">
<mxGeometry relative="1" as="geometry"/>
</mxCell>
<mxCell id="40" value="1. &lt;font color=&quot;#ff0000&quot;&gt;若上述环节抛出异常则处理异常并抛出对应的新的异常&lt;/font&gt;&lt;div&gt;&lt;font style=&quot;color: rgb(0, 0, 0);&quot;&gt;2. 若上述环节正常运行,则校验环节结束&lt;/font&gt;&lt;br&gt;3. 无论校验结果如何,清除上下文&lt;/div&gt;" style="html=1;align=left;" parent="20" vertex="1">
<mxGeometry x="90.98" y="765" width="308.06" height="55" as="geometry"/>
</mxCell>
<mxCell id="43" value="1. 调用createToken()记录并更新用户信息&lt;br&gt;2. 调用TokenService.createToken()生成token&lt;br&gt;3. 设置用户代理信息LoginUser将&lt;font style=&quot;color: rgb(0, 0, 255);&quot;&gt;LoginUser存入redis&lt;/font&gt;" style="html=1;align=left;" parent="20" vertex="1">
<mxGeometry x="92.42999999999999" y="845" width="308.06" height="70" as="geometry"/>
</mxCell>
<mxCell id="47" style="edgeStyle=none;html=1;" parent="1" source="43" target="48" edge="1">
<mxGeometry relative="1" as="geometry">
<mxPoint x="333.06500000000005" y="1290.0000000000002" as="targetPoint"/>
</mxGeometry>
</mxCell>
<mxCell id="65" value="" style="edgeStyle=none;html=1;fontColor=#00FFFF;" parent="1" source="48" target="64" edge="1">
<mxGeometry relative="1" as="geometry"/>
</mxCell>
<mxCell id="48" value="认证成功将Token返回给前端" style="html=1;" parent="1" vertex="1">
<mxGeometry x="254.73000000000002" y="1110" width="203.46" height="31" as="geometry"/>
</mxCell>
<mxCell id="51" value="" style="edgeStyle=none;html=1;" parent="1" source="49" target="50" edge="1">
<mxGeometry relative="1" as="geometry"/>
</mxCell>
<mxCell id="49" value="Token认证" style="whiteSpace=wrap;html=1;" parent="1" vertex="1">
<mxGeometry x="765" y="1010" width="120" height="60" as="geometry"/>
</mxCell>
<mxCell id="53" value="" style="edgeStyle=none;html=1;" parent="1" source="50" target="52" edge="1">
<mxGeometry relative="1" as="geometry"/>
</mxCell>
<mxCell id="50" value="触发JwtAuthenticationTokenFilter拦截器&lt;br&gt;调用doFilterInternal方法进行处理" style="whiteSpace=wrap;html=1;" parent="1" vertex="1">
<mxGeometry x="690" y="920" width="270" height="60" as="geometry"/>
</mxCell>
<mxCell id="55" value="" style="edgeStyle=none;html=1;" parent="1" source="52" target="54" edge="1">
<mxGeometry relative="1" as="geometry"/>
</mxCell>
<mxCell id="52" value="调用TokenService.getLoginUser()方法&lt;br&gt;1. 调用方法getToken从request的请求头中获取token&lt;br&gt;&lt;font style=&quot;color: rgb(0, 0, 204);&quot;&gt;2. 通过token在redis中获取用户代理信息LoginUser&lt;/font&gt;" style="whiteSpace=wrap;html=1;" parent="1" vertex="1">
<mxGeometry x="675" y="830" width="300" height="60" as="geometry"/>
</mxCell>
<mxCell id="57" value="" style="edgeStyle=none;html=1;" parent="1" source="54" target="56" edge="1">
<mxGeometry relative="1" as="geometry"/>
</mxCell>
<mxCell id="54" value="判断用户凭证是非空并且判断上下文认证信息为空&lt;br&gt;调用TokenService.verifyToken()校验token并判断最小时间刷新token" style="whiteSpace=wrap;html=1;" parent="1" vertex="1">
<mxGeometry x="630" y="750" width="390" height="60" as="geometry"/>
</mxCell>
<mxCell id="59" value="" style="edgeStyle=none;html=1;" parent="1" source="56" target="58" edge="1">
<mxGeometry relative="1" as="geometry"/>
</mxCell>
<mxCell id="56" value="&lt;font style=&quot;color: rgb(0, 153, 0);&quot;&gt;1. 通过UsernamePasswordAuthenticationToken创建一个认证信息&lt;br&gt;2. 通过WebAuthenticationDetailsSource构建一个用户凭证并通过UsernamePasswordAuthenticationToken.setDetails设置到认证信息里&lt;br&gt;3. 将认证信息通过SecurityContextHolder.getContext().setAuthentication拿到上下文并设置到上下文&lt;/font&gt;" style="whiteSpace=wrap;html=1;strokeColor=#00CC00;align=left;" parent="1" vertex="1">
<mxGeometry x="632.75" y="640" width="384.51" height="80" as="geometry"/>
</mxCell>
<mxCell id="58" value="继续过滤&lt;br&gt;在鉴权系统中会用到上述设置的上下文" style="whiteSpace=wrap;html=1;" parent="1" vertex="1">
<mxGeometry x="755" y="555" width="140" height="60" as="geometry"/>
</mxCell>
<mxCell id="66" style="edgeStyle=none;html=1;fontColor=#00FFFF;" parent="1" source="64" target="49" edge="1">
<mxGeometry relative="1" as="geometry"/>
</mxCell>
<mxCell id="64" value="前端拿到token后存到浏览器中&lt;br&gt;后续发送请求在浏览器中拿到token&lt;br&gt;并将token设置到请求头里" style="whiteSpace=wrap;html=1;" parent="1" vertex="1">
<mxGeometry x="705.49" y="1090" width="239.02" height="70" as="geometry"/>
</mxCell>
</root>
</mxGraphModel>
</diagram>
</mxfile>

Binary file not shown.

View File

@ -1,260 +0,0 @@
<mxfile host="65bd71144e">
<diagram id="PzGHVj2JrUCharDApkJk" name="第 1 页">
<mxGraphModel dx="1496" dy="1393" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="827" pageHeight="1169" math="0" shadow="0">
<root>
<mxCell id="0"/>
<mxCell id="1" parent="0"/>
<mxCell id="7" value="" style="edgeStyle=none;html=1;" parent="1" source="5" target="6" edge="1">
<mxGeometry relative="1" as="geometry"/>
</mxCell>
<mxCell id="5" value="调用登录&lt;br&gt;发送验证码&lt;br&gt;接口" style="strokeWidth=2;html=1;shape=mxgraph.flowchart.start_1;whiteSpace=wrap;" parent="1" vertex="1">
<mxGeometry x="59" y="60" width="100" height="60" as="geometry"/>
</mxCell>
<mxCell id="9" value="" style="edgeStyle=none;html=1;" parent="1" source="6" target="8" edge="1">
<mxGeometry relative="1" as="geometry"/>
</mxCell>
<mxCell id="13" value="不存在账户" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" parent="9" vertex="1" connectable="0">
<mxGeometry x="-0.325" y="-1" relative="1" as="geometry">
<mxPoint x="13" y="-1" as="offset"/>
</mxGeometry>
</mxCell>
<mxCell id="11" value="" style="edgeStyle=none;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;exitPerimeter=0;" parent="1" source="6" target="10" edge="1">
<mxGeometry relative="1" as="geometry"/>
</mxCell>
<mxCell id="12" value="存在账户" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" parent="11" vertex="1" connectable="0">
<mxGeometry x="0.2667" y="-1" relative="1" as="geometry">
<mxPoint x="1" y="-14" as="offset"/>
</mxGeometry>
</mxCell>
<mxCell id="6" value="是否存在账户" style="strokeWidth=2;html=1;shape=mxgraph.flowchart.decision;whiteSpace=wrap;" parent="1" vertex="1">
<mxGeometry x="59" y="170" width="100" height="100" as="geometry"/>
</mxCell>
<mxCell id="18" value="" style="edgeStyle=none;html=1;" parent="1" source="8" target="17" edge="1">
<mxGeometry relative="1" as="geometry"/>
</mxCell>
<mxCell id="22" value="否" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" parent="18" vertex="1" connectable="0">
<mxGeometry x="-0.3667" relative="1" as="geometry">
<mxPoint as="offset"/>
</mxGeometry>
</mxCell>
<mxCell id="20" value="" style="edgeStyle=none;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;exitPerimeter=0;" parent="1" source="8" target="10" edge="1">
<mxGeometry relative="1" as="geometry">
<mxPoint x="309" y="340" as="targetPoint"/>
<Array as="points">
<mxPoint x="289" y="388"/>
</Array>
</mxGeometry>
</mxCell>
<mxCell id="21" value="是" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" parent="20" vertex="1" connectable="0">
<mxGeometry x="-0.2857" y="-1" relative="1" as="geometry">
<mxPoint x="1" y="-41" as="offset"/>
</mxGeometry>
</mxCell>
<mxCell id="8" value="是否开启&lt;br&gt;自动注册" style="strokeWidth=2;html=1;shape=mxgraph.flowchart.decision;whiteSpace=wrap;" parent="1" vertex="1">
<mxGeometry x="239" y="170" width="100" height="100" as="geometry"/>
</mxCell>
<mxCell id="24" value="" style="edgeStyle=none;html=1;" parent="1" source="10" target="23" edge="1">
<mxGeometry relative="1" as="geometry"/>
</mxCell>
<mxCell id="10" value="发送&lt;br&gt;登录验证码" style="rounded=1;whiteSpace=wrap;html=1;absoluteArcSize=1;arcSize=14;strokeWidth=2;" parent="1" vertex="1">
<mxGeometry x="59" y="338" width="100" height="100" as="geometry"/>
</mxCell>
<mxCell id="17" value="抛出异常&lt;br&gt;没有该用户" style="strokeWidth=2;html=1;shape=mxgraph.flowchart.terminator;whiteSpace=wrap;" parent="1" vertex="1">
<mxGeometry x="379" y="190" width="100" height="60" as="geometry"/>
</mxCell>
<mxCell id="34" value="" style="edgeStyle=none;html=1;" parent="1" source="23" target="33" edge="1">
<mxGeometry relative="1" as="geometry"/>
</mxCell>
<mxCell id="23" value="用户收到验证码&lt;br&gt;携带验证码调用&lt;br&gt;登录验证接口" style="rounded=1;whiteSpace=wrap;html=1;absoluteArcSize=1;arcSize=14;strokeWidth=2;" parent="1" vertex="1">
<mxGeometry x="59" y="490" width="100" height="100" as="geometry"/>
</mxCell>
<mxCell id="30" value="" style="edgeStyle=none;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;exitPerimeter=0;" parent="1" source="27" target="29" edge="1">
<mxGeometry relative="1" as="geometry">
<Array as="points">
<mxPoint x="109" y="1027"/>
</Array>
</mxGeometry>
</mxCell>
<mxCell id="32" value="是" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" parent="30" vertex="1" connectable="0">
<mxGeometry x="-0.22" y="-2" relative="1" as="geometry">
<mxPoint x="2" y="-25" as="offset"/>
</mxGeometry>
</mxCell>
<mxCell id="40" value="" style="edgeStyle=none;html=1;" parent="1" source="27" target="31" edge="1">
<mxGeometry relative="1" as="geometry"/>
</mxCell>
<mxCell id="41" value="否" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" parent="40" vertex="1" connectable="0">
<mxGeometry x="-0.3619" y="-4" relative="1" as="geometry">
<mxPoint y="-4" as="offset"/>
</mxGeometry>
</mxCell>
<mxCell id="27" value="是否存在账户" style="strokeWidth=2;html=1;shape=mxgraph.flowchart.decision;whiteSpace=wrap;" parent="1" vertex="1">
<mxGeometry x="59" y="866.75" width="100" height="100" as="geometry"/>
</mxCell>
<mxCell id="29" value="返回token" style="strokeWidth=2;html=1;shape=mxgraph.flowchart.terminator;whiteSpace=wrap;" parent="1" vertex="1">
<mxGeometry x="189" y="996.75" width="100" height="60" as="geometry"/>
</mxCell>
<mxCell id="42" style="edgeStyle=none;html=1;" parent="1" source="31" target="29" edge="1">
<mxGeometry relative="1" as="geometry">
<Array as="points">
<mxPoint x="379" y="1027"/>
</Array>
</mxGeometry>
</mxCell>
<mxCell id="31" value="创建账户" style="rounded=1;whiteSpace=wrap;html=1;absoluteArcSize=1;arcSize=14;strokeWidth=2;" parent="1" vertex="1">
<mxGeometry x="329" y="866.75" width="100" height="100" as="geometry"/>
</mxCell>
<mxCell id="36" value="" style="edgeStyle=none;html=1;" parent="1" source="33" target="35" edge="1">
<mxGeometry relative="1" as="geometry"/>
</mxCell>
<mxCell id="39" value="否" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" parent="36" vertex="1" connectable="0">
<mxGeometry x="-0.3619" y="-1" relative="1" as="geometry">
<mxPoint as="offset"/>
</mxGeometry>
</mxCell>
<mxCell id="37" value="" style="edgeStyle=none;html=1;" parent="1" source="33" target="27" edge="1">
<mxGeometry relative="1" as="geometry">
<Array as="points"/>
</mxGeometry>
</mxCell>
<mxCell id="38" value="是" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" parent="37" vertex="1" connectable="0">
<mxGeometry x="-0.1238" relative="1" as="geometry">
<mxPoint as="offset"/>
</mxGeometry>
</mxCell>
<mxCell id="33" value="验证码&lt;br&gt;是否正确" style="strokeWidth=2;html=1;shape=mxgraph.flowchart.decision;whiteSpace=wrap;" parent="1" vertex="1">
<mxGeometry x="59" y="728" width="100" height="100" as="geometry"/>
</mxCell>
<mxCell id="35" value="抛出异常&lt;br&gt;验证码错误" style="strokeWidth=2;html=1;shape=mxgraph.flowchart.terminator;whiteSpace=wrap;" parent="1" vertex="1">
<mxGeometry x="379" y="748" width="100" height="60" as="geometry"/>
</mxCell>
<mxCell id="45" value="" style="edgeStyle=none;html=1;" parent="1" source="43" target="44" edge="1">
<mxGeometry relative="1" as="geometry"/>
</mxCell>
<mxCell id="43" value="调用注册&lt;br&gt;发送验证码&lt;br&gt;接口" style="strokeWidth=2;html=1;shape=mxgraph.flowchart.start_1;whiteSpace=wrap;" parent="1" vertex="1">
<mxGeometry x="669" y="348" width="100" height="60" as="geometry"/>
</mxCell>
<mxCell id="48" value="" style="edgeStyle=none;html=1;" parent="1" source="44" target="47" edge="1">
<mxGeometry relative="1" as="geometry"/>
</mxCell>
<mxCell id="49" value="是" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" parent="48" vertex="1" connectable="0">
<mxGeometry x="-0.4111" relative="1" as="geometry">
<mxPoint as="offset"/>
</mxGeometry>
</mxCell>
<mxCell id="51" value="" style="edgeStyle=none;html=1;" parent="1" source="44" target="50" edge="1">
<mxGeometry relative="1" as="geometry"/>
</mxCell>
<mxCell id="52" value="否" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" parent="51" vertex="1" connectable="0">
<mxGeometry x="-0.5067" y="1" relative="1" as="geometry">
<mxPoint x="-1" y="10" as="offset"/>
</mxGeometry>
</mxCell>
<mxCell id="44" value="是否存在账户" style="strokeWidth=2;html=1;shape=mxgraph.flowchart.decision;whiteSpace=wrap;" parent="1" vertex="1">
<mxGeometry x="669" y="448" width="100" height="100" as="geometry"/>
</mxCell>
<mxCell id="47" value="抛出异常&lt;br&gt;账户已存在" style="strokeWidth=2;html=1;shape=mxgraph.flowchart.terminator;whiteSpace=wrap;" parent="1" vertex="1">
<mxGeometry x="509" y="468" width="100" height="60" as="geometry"/>
</mxCell>
<mxCell id="54" value="" style="edgeStyle=none;html=1;" parent="1" source="50" target="53" edge="1">
<mxGeometry relative="1" as="geometry"/>
</mxCell>
<mxCell id="50" value="发送&lt;br&gt;注册验证码" style="rounded=1;whiteSpace=wrap;html=1;absoluteArcSize=1;arcSize=14;strokeWidth=2;" parent="1" vertex="1">
<mxGeometry x="669" y="578" width="100" height="100" as="geometry"/>
</mxCell>
<mxCell id="56" value="" style="edgeStyle=none;html=1;" parent="1" source="53" target="55" edge="1">
<mxGeometry relative="1" as="geometry"/>
</mxCell>
<mxCell id="53" value="用户收到验证码&lt;br&gt;携带验证码调用&lt;br&gt;注册验证接口" style="rounded=1;whiteSpace=wrap;html=1;absoluteArcSize=1;arcSize=14;strokeWidth=2;" parent="1" vertex="1">
<mxGeometry x="669" y="728" width="100" height="100" as="geometry"/>
</mxCell>
<mxCell id="60" style="edgeStyle=none;html=1;" parent="1" source="55" target="35" edge="1">
<mxGeometry relative="1" as="geometry"/>
</mxCell>
<mxCell id="61" value="否" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" parent="60" vertex="1" connectable="0">
<mxGeometry x="0.2444" y="5" relative="1" as="geometry">
<mxPoint x="11" y="-5" as="offset"/>
</mxGeometry>
</mxCell>
<mxCell id="62" style="edgeStyle=none;html=1;" parent="1" source="55" target="81" edge="1">
<mxGeometry relative="1" as="geometry">
<mxPoint x="709" y="873" as="targetPoint"/>
</mxGeometry>
</mxCell>
<mxCell id="63" value="是" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" parent="62" vertex="1" connectable="0">
<mxGeometry x="-0.2358" y="4" relative="1" as="geometry">
<mxPoint x="-4" y="-7" as="offset"/>
</mxGeometry>
</mxCell>
<mxCell id="55" value="验证码&lt;br&gt;是否正确" style="strokeWidth=2;html=1;shape=mxgraph.flowchart.decision;whiteSpace=wrap;" parent="1" vertex="1">
<mxGeometry x="529" y="728" width="100" height="100" as="geometry"/>
</mxCell>
<mxCell id="70" value="" style="edgeStyle=none;html=1;" parent="1" source="64" target="69" edge="1">
<mxGeometry relative="1" as="geometry"/>
</mxCell>
<mxCell id="64" value="调用重置密码&lt;br&gt;发送验证码&lt;br&gt;接口" style="strokeWidth=2;html=1;shape=mxgraph.flowchart.start_1;whiteSpace=wrap;" parent="1" vertex="1">
<mxGeometry x="516.5" y="60" width="100" height="60" as="geometry"/>
</mxCell>
<mxCell id="72" value="" style="edgeStyle=none;html=1;exitX=0;exitY=0.5;exitDx=0;exitDy=0;exitPerimeter=0;" parent="1" source="69" target="17" edge="1">
<mxGeometry relative="1" as="geometry">
<mxPoint x="859" y="193" as="targetPoint"/>
</mxGeometry>
</mxCell>
<mxCell id="73" value="否" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" parent="72" vertex="1" connectable="0">
<mxGeometry x="-0.2519" relative="1" as="geometry">
<mxPoint as="offset"/>
</mxGeometry>
</mxCell>
<mxCell id="75" value="" style="edgeStyle=none;html=1;" parent="1" source="69" target="74" edge="1">
<mxGeometry relative="1" as="geometry"/>
</mxCell>
<mxCell id="69" value="是否存在账户" style="strokeWidth=2;html=1;shape=mxgraph.flowchart.decision;whiteSpace=wrap;" parent="1" vertex="1">
<mxGeometry x="516.5" y="170" width="100" height="100" as="geometry"/>
</mxCell>
<mxCell id="77" value="" style="edgeStyle=none;html=1;" parent="1" source="74" target="76" edge="1">
<mxGeometry relative="1" as="geometry"/>
</mxCell>
<mxCell id="74" value="发送&lt;br&gt;重置验证码" style="rounded=1;whiteSpace=wrap;html=1;absoluteArcSize=1;arcSize=14;strokeWidth=2;" parent="1" vertex="1">
<mxGeometry x="516.5" y="338" width="100" height="100" as="geometry"/>
</mxCell>
<mxCell id="79" value="" style="edgeStyle=none;html=1;" parent="1" source="76" target="78" edge="1">
<mxGeometry relative="1" as="geometry"/>
</mxCell>
<mxCell id="76" value="用户收到验证码&lt;br&gt;携带验证码调用&lt;br&gt;重置验证接口" style="rounded=1;whiteSpace=wrap;html=1;absoluteArcSize=1;arcSize=14;strokeWidth=2;" parent="1" vertex="1">
<mxGeometry x="379" y="338" width="100" height="100" as="geometry"/>
</mxCell>
<mxCell id="82" style="edgeStyle=none;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;exitPerimeter=0;" parent="1" source="78" target="35" edge="1">
<mxGeometry relative="1" as="geometry"/>
</mxCell>
<mxCell id="83" value="否" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" parent="82" vertex="1" connectable="0">
<mxGeometry x="-0.35" y="1" relative="1" as="geometry">
<mxPoint as="offset"/>
</mxGeometry>
</mxCell>
<mxCell id="85" value="" style="edgeStyle=none;html=1;" parent="1" source="78" target="84" edge="1">
<mxGeometry relative="1" as="geometry"/>
</mxCell>
<mxCell id="86" value="是" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" parent="85" vertex="1" connectable="0">
<mxGeometry x="-0.3905" relative="1" as="geometry">
<mxPoint as="offset"/>
</mxGeometry>
</mxCell>
<mxCell id="78" value="验证码&lt;br&gt;是否正确" style="strokeWidth=2;html=1;shape=mxgraph.flowchart.decision;whiteSpace=wrap;" parent="1" vertex="1">
<mxGeometry x="379" y="518" width="100" height="100" as="geometry"/>
</mxCell>
<mxCell id="81" value="创建账户" style="strokeWidth=2;html=1;shape=mxgraph.flowchart.terminator;whiteSpace=wrap;" parent="1" vertex="1">
<mxGeometry x="529" y="874.75" width="100" height="60" as="geometry"/>
</mxCell>
<mxCell id="88" value="" style="edgeStyle=none;html=1;" parent="1" source="84" target="87" edge="1">
<mxGeometry relative="1" as="geometry"/>
</mxCell>
<mxCell id="84" value="修改原有的密码" style="rounded=1;whiteSpace=wrap;html=1;absoluteArcSize=1;arcSize=14;strokeWidth=2;" parent="1" vertex="1">
<mxGeometry x="239" y="518" width="100" height="100" as="geometry"/>
</mxCell>
<mxCell id="87" value="删除当前&lt;br&gt;登录用户&lt;br&gt;凭证信息" style="strokeWidth=2;html=1;shape=mxgraph.flowchart.terminator;whiteSpace=wrap;" parent="1" vertex="1">
<mxGeometry x="239" y="668" width="100" height="60" as="geometry"/>
</mxCell>
</root>
</mxGraphModel>
</diagram>
</mxfile>

View File

@ -1,37 +0,0 @@
<mxfile host="65bd71144e">
<diagram id="PZYBk4sDCuIX38xMYcUk" name="第 1 页">
<mxGraphModel dx="880" dy="766" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="827" pageHeight="1169" math="0" shadow="0">
<root>
<mxCell id="0"/>
<mxCell id="1" parent="0"/>
<mxCell id="4" value="" style="edgeStyle=none;html=1;" parent="1" source="2" target="3" edge="1">
<mxGeometry relative="1" as="geometry"/>
</mxCell>
<mxCell id="2" value="标记有RateLimiter注解的方法会被RateLimiterAspect拦截" style="html=1;" parent="1" vertex="1">
<mxGeometry x="224" y="80" width="380" height="50" as="geometry"/>
</mxCell>
<mxCell id="6" value="" style="edgeStyle=none;html=1;" parent="1" source="3" target="5" edge="1">
<mxGeometry relative="1" as="geometry"/>
</mxCell>
<mxCell id="3" value="获取注解上的时间和次数" style="html=1;" parent="1" vertex="1">
<mxGeometry x="224" y="150" width="380" height="50" as="geometry"/>
</mxCell>
<mxCell id="8" value="" style="edgeStyle=none;html=1;" parent="1" source="5" target="7" edge="1">
<mxGeometry relative="1" as="geometry"/>
</mxCell>
<mxCell id="5" value="&amp;nbsp;通过拼接{KEY}-{IP/USERID/DEPTID}-{ClassName}-{MethodName}形成rediskey" style="html=1;" parent="1" vertex="1">
<mxGeometry x="164" y="230" width="500" height="50" as="geometry"/>
</mxCell>
<mxCell id="10" value="" style="edgeStyle=none;html=1;" parent="1" source="7" target="9" edge="1">
<mxGeometry relative="1" as="geometry"/>
</mxCell>
<mxCell id="7" value="通过redisTemplate.excute来检测time时间内最大请求次数" style="html=1;" parent="1" vertex="1">
<mxGeometry x="164" y="310" width="500" height="50" as="geometry"/>
</mxCell>
<mxCell id="9" value="通过返回的number再次确认请求次数" style="html=1;" parent="1" vertex="1">
<mxGeometry x="164" y="390" width="500" height="50" as="geometry"/>
</mxCell>
</root>
</mxGraphModel>
</diagram>
</mxfile>