This commit is contained in:
2026-02-26 23:50:49 +08:00
parent a2f081846c
commit ea87cebbb6
5 changed files with 730 additions and 39 deletions

View File

@@ -0,0 +1,374 @@
<mxfile host="app.diagrams.net" modified="2026-02-26T21:30:00.000Z" agent="OpenCode" version="24.7.17" type="device">
<diagram id="seq-customer-appointment" name="图4.5 顾客预约序列图">
<mxGraphModel dx="1600" dy="1000" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="1600" pageHeight="1200" math="0" shadow="0">
<root>
<mxCell id="0" />
<mxCell id="1" parent="0" />
<!-- 参与者:人物图标 -->
<mxCell id="actor1" value="顾客" style="shape=umlActor;verticalLabelPosition=bottom;verticalAlign=top;html=1;outlineConnect=0;strokeColor=#000000;fillColor=#FFFFFF;" vertex="1" parent="1">
<mxGeometry x="80" y="40" width="30" height="55" as="geometry" />
</mxCell>
<!-- 参与者:系统组件矩形 -->
<mxCell id="obj2" value="系统前台" style="rounded=0;whiteSpace=wrap;html=1;strokeColor=#000000;fillColor=#FFFFFF;fontStyle=1;" vertex="1" parent="1">
<mxGeometry x="260" y="50" width="120" height="40" as="geometry" />
</mxCell>
<mxCell id="obj3" value="后台系统" style="rounded=0;whiteSpace=wrap;html=1;strokeColor=#000000;fillColor=#FFFFFF;fontStyle=1;" vertex="1" parent="1">
<mxGeometry x="540" y="50" width="120" height="40" as="geometry" />
</mxCell>
<mxCell id="obj4" value="数据库" style="rounded=0;whiteSpace=wrap;html=1;strokeColor=#000000;fillColor=#FFFFFF;fontStyle=1;" vertex="1" parent="1">
<mxGeometry x="820" y="50" width="120" height="40" as="geometry" />
</mxCell>
<!-- 生命线(虚线) -->
<mxCell id="ll1" value="" style="endArrow=none;dashed=1;html=1;strokeColor=#000000;" edge="1" parent="1">
<mxGeometry relative="1" as="geometry">
<mxPoint x="95" y="95" as="sourcePoint" />
<mxPoint x="95" y="920" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="ll2" value="" style="endArrow=none;dashed=1;html=1;strokeColor=#000000;" edge="1" parent="1">
<mxGeometry relative="1" as="geometry">
<mxPoint x="320" y="90" as="sourcePoint" />
<mxPoint x="320" y="920" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="ll3" value="" style="endArrow=none;dashed=1;html=1;strokeColor=#000000;" edge="1" parent="1">
<mxGeometry relative="1" as="geometry">
<mxPoint x="600" y="90" as="sourcePoint" />
<mxPoint x="600" y="920" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="ll4" value="" style="endArrow=none;dashed=1;html=1;strokeColor=#000000;" edge="1" parent="1">
<mxGeometry relative="1" as="geometry">
<mxPoint x="880" y="90" as="sourcePoint" />
<mxPoint x="880" y="920" as="targetPoint" />
</mxGeometry>
</mxCell>
<!-- 激活条 -->
<mxCell id="act1" value="" style="rounded=0;whiteSpace=wrap;html=1;strokeColor=#000000;fillColor=#FFFFFF;" vertex="1" parent="1">
<mxGeometry x="88" y="130" width="14" height="760" as="geometry" />
</mxCell>
<mxCell id="act2" value="" style="rounded=0;whiteSpace=wrap;html=1;strokeColor=#000000;fillColor=#FFFFFF;" vertex="1" parent="1">
<mxGeometry x="313" y="150" width="14" height="720" as="geometry" />
</mxCell>
<mxCell id="act3" value="" style="rounded=0;whiteSpace=wrap;html=1;strokeColor=#000000;fillColor=#FFFFFF;" vertex="1" parent="1">
<mxGeometry x="593" y="280" width="14" height="460" as="geometry" />
</mxCell>
<mxCell id="act4" value="" style="rounded=0;whiteSpace=wrap;html=1;strokeColor=#000000;fillColor=#FFFFFF;" vertex="1" parent="1">
<mxGeometry x="873" y="360" width="14" height="300" as="geometry" />
</mxCell>
<!-- 消息1顾客 → 前台:进入预约页面 -->
<mxCell id="m1" value="进入预约页面" style="endArrow=block;endFill=1;html=1;strokeColor=#000000;fontColor=#000000;align=center;" edge="1" parent="1">
<mxGeometry x="-0.2" relative="1" as="geometry">
<mxPoint x="102" y="160" as="sourcePoint" />
<mxPoint x="313" y="160" as="targetPoint" />
<mxPoint as="offset" />
</mxGeometry>
</mxCell>
<!-- 消息2前台 → 顾客:提示选择宠物与时段 -->
<mxCell id="m2" value="提示选择宠物与时段" style="endArrow=open;endFill=0;dashed=1;html=1;strokeColor=#000000;fontColor=#000000;align=center;" edge="1" parent="1">
<mxGeometry relative="1" as="geometry">
<mxPoint x="313" y="210" as="sourcePoint" />
<mxPoint x="102" y="210" as="targetPoint" />
</mxGeometry>
</mxCell>
<!-- 消息3顾客 → 前台:填写预约信息并提交 -->
<mxCell id="m3" value="填写预约信息并提交" style="endArrow=block;endFill=1;html=1;strokeColor=#000000;fontColor=#000000;align=center;" edge="1" parent="1">
<mxGeometry relative="1" as="geometry">
<mxPoint x="102" y="270" as="sourcePoint" />
<mxPoint x="313" y="270" as="targetPoint" />
</mxGeometry>
</mxCell>
<!-- 消息4前台 → 后台:提交预约请求 -->
<mxCell id="m4" value="提交预约请求" style="endArrow=block;endFill=1;html=1;strokeColor=#000000;fontColor=#000000;align=center;" edge="1" parent="1">
<mxGeometry relative="1" as="geometry">
<mxPoint x="327" y="310" as="sourcePoint" />
<mxPoint x="593" y="310" as="targetPoint" />
</mxGeometry>
</mxCell>
<!-- 消息5后台 → 数据库:校验宠物与时段可用性 -->
<mxCell id="m5" value="校验宠物与时段可用性" style="endArrow=block;endFill=1;html=1;strokeColor=#000000;fontColor=#000000;align=center;" edge="1" parent="1">
<mxGeometry relative="1" as="geometry">
<mxPoint x="607" y="380" as="sourcePoint" />
<mxPoint x="873" y="380" as="targetPoint" />
</mxGeometry>
</mxCell>
<!-- 消息6数据库 → 后台:返回校验结果 -->
<mxCell id="m6" value="返回校验结果" style="endArrow=open;endFill=0;dashed=1;html=1;strokeColor=#000000;fontColor=#000000;align=center;" edge="1" parent="1">
<mxGeometry relative="1" as="geometry">
<mxPoint x="873" y="430" as="sourcePoint" />
<mxPoint x="607" y="430" as="targetPoint" />
</mxGeometry>
</mxCell>
<!-- alt 片段框 -->
<mxCell id="alt_frame" value="" style="shape=mxgraph.sysml.package;html=1;overflow=fill;whiteSpace=wrap;strokeColor=#000000;fillColor=none;align=left;verticalAlign=top;spacingLeft=5;tabWidth=120;tabHeight=20;tabPosition=left;fontSize=12;" vertex="1" parent="1">
<mxGeometry x="60" y="470" width="870" height="390" as="geometry" />
</mxCell>
<mxCell id="alt_label" value="alt" style="text;html=1;align=left;verticalAlign=top;fontStyle=1;fontSize=12;fontColor=#000000;" vertex="1" parent="1">
<mxGeometry x="65" y="472" width="40" height="20" as="geometry" />
</mxCell>
<mxCell id="alt_guard1" value="[校验通过]" style="text;html=1;align=left;verticalAlign=middle;fontStyle=0;fontSize=11;fontColor=#000000;" vertex="1" parent="1">
<mxGeometry x="70" y="498" width="100" height="20" as="geometry" />
</mxCell>
<!-- 成功路径 -->
<!-- 消息7后台 → 数据库:保存预约记录 -->
<mxCell id="m7" value="保存预约记录" style="endArrow=block;endFill=1;html=1;strokeColor=#000000;fontColor=#000000;align=center;" edge="1" parent="1">
<mxGeometry relative="1" as="geometry">
<mxPoint x="607" y="530" as="sourcePoint" />
<mxPoint x="873" y="530" as="targetPoint" />
</mxGeometry>
</mxCell>
<!-- 消息8数据库 → 后台:返回保存结果 -->
<mxCell id="m8" value="返回保存结果" style="endArrow=open;endFill=0;dashed=1;html=1;strokeColor=#000000;fontColor=#000000;align=center;" edge="1" parent="1">
<mxGeometry relative="1" as="geometry">
<mxPoint x="873" y="580" as="sourcePoint" />
<mxPoint x="607" y="580" as="targetPoint" />
</mxGeometry>
</mxCell>
<!-- 消息9后台 → 前台:返回预约成功 -->
<mxCell id="m9" value="返回预约成功" style="endArrow=open;endFill=0;dashed=1;html=1;strokeColor=#000000;fontColor=#000000;align=center;" edge="1" parent="1">
<mxGeometry relative="1" as="geometry">
<mxPoint x="593" y="620" as="sourcePoint" />
<mxPoint x="327" y="620" as="targetPoint" />
</mxGeometry>
</mxCell>
<!-- 消息10前台 → 顾客:显示预约成功 -->
<mxCell id="m10" value="显示预约成功" style="endArrow=open;endFill=0;dashed=1;html=1;strokeColor=#000000;fontColor=#000000;align=center;" edge="1" parent="1">
<mxGeometry relative="1" as="geometry">
<mxPoint x="313" y="660" as="sourcePoint" />
<mxPoint x="102" y="660" as="targetPoint" />
</mxGeometry>
</mxCell>
<!-- 分隔虚线 -->
<mxCell id="alt_divider" value="" style="endArrow=none;dashed=1;html=1;strokeColor=#000000;" edge="1" parent="1">
<mxGeometry relative="1" as="geometry">
<mxPoint x="60" y="700" as="sourcePoint" />
<mxPoint x="930" y="700" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="alt_guard2" value="[校验失败]" style="text;html=1;align=left;verticalAlign=middle;fontStyle=0;fontSize=11;fontColor=#000000;" vertex="1" parent="1">
<mxGeometry x="70" y="708" width="100" height="20" as="geometry" />
</mxCell>
<!-- 失败路径 -->
<!-- 消息11后台 → 前台:返回错误码 -->
<mxCell id="m11" value="返回错误码" style="endArrow=open;endFill=0;dashed=1;html=1;strokeColor=#000000;fontColor=#000000;align=center;" edge="1" parent="1">
<mxGeometry relative="1" as="geometry">
<mxPoint x="593" y="750" as="sourcePoint" />
<mxPoint x="327" y="750" as="targetPoint" />
</mxGeometry>
</mxCell>
<!-- 消息12前台 → 顾客:提示预约失败信息 -->
<mxCell id="m12" value="提示预约失败信息" style="endArrow=open;endFill=0;dashed=1;html=1;strokeColor=#000000;fontColor=#000000;align=center;" edge="1" parent="1">
<mxGeometry relative="1" as="geometry">
<mxPoint x="313" y="800" as="sourcePoint" />
<mxPoint x="102" y="800" as="targetPoint" />
</mxGeometry>
</mxCell>
</root>
</mxGraphModel>
</diagram>
<diagram id="seq-admin-user-management" name="图4.6 管理员账号管理序列图">
<mxGraphModel dx="1600" dy="1000" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="1600" pageHeight="1200" math="0" shadow="0">
<root>
<mxCell id="0" />
<mxCell id="1" parent="0" />
<!-- 参与者:人物图标 -->
<mxCell id="actor1" value="管理员" style="shape=umlActor;verticalLabelPosition=bottom;verticalAlign=top;html=1;outlineConnect=0;strokeColor=#000000;fillColor=#FFFFFF;" vertex="1" parent="1">
<mxGeometry x="80" y="40" width="30" height="55" as="geometry" />
</mxCell>
<!-- 参与者:系统组件矩形 -->
<mxCell id="obj2" value="系统前台" style="rounded=0;whiteSpace=wrap;html=1;strokeColor=#000000;fillColor=#FFFFFF;fontStyle=1;" vertex="1" parent="1">
<mxGeometry x="260" y="50" width="120" height="40" as="geometry" />
</mxCell>
<mxCell id="obj3" value="后台系统" style="rounded=0;whiteSpace=wrap;html=1;strokeColor=#000000;fillColor=#FFFFFF;fontStyle=1;" vertex="1" parent="1">
<mxGeometry x="540" y="50" width="120" height="40" as="geometry" />
</mxCell>
<mxCell id="obj4" value="数据库" style="rounded=0;whiteSpace=wrap;html=1;strokeColor=#000000;fillColor=#FFFFFF;fontStyle=1;" vertex="1" parent="1">
<mxGeometry x="820" y="50" width="120" height="40" as="geometry" />
</mxCell>
<!-- 生命线(虚线) -->
<mxCell id="ll1" value="" style="endArrow=none;dashed=1;html=1;strokeColor=#000000;" edge="1" parent="1">
<mxGeometry relative="1" as="geometry">
<mxPoint x="95" y="95" as="sourcePoint" />
<mxPoint x="95" y="920" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="ll2" value="" style="endArrow=none;dashed=1;html=1;strokeColor=#000000;" edge="1" parent="1">
<mxGeometry relative="1" as="geometry">
<mxPoint x="320" y="90" as="sourcePoint" />
<mxPoint x="320" y="920" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="ll3" value="" style="endArrow=none;dashed=1;html=1;strokeColor=#000000;" edge="1" parent="1">
<mxGeometry relative="1" as="geometry">
<mxPoint x="600" y="90" as="sourcePoint" />
<mxPoint x="600" y="920" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="ll4" value="" style="endArrow=none;dashed=1;html=1;strokeColor=#000000;" edge="1" parent="1">
<mxGeometry relative="1" as="geometry">
<mxPoint x="880" y="90" as="sourcePoint" />
<mxPoint x="880" y="920" as="targetPoint" />
</mxGeometry>
</mxCell>
<!-- 激活条 -->
<mxCell id="act1" value="" style="rounded=0;whiteSpace=wrap;html=1;strokeColor=#000000;fillColor=#FFFFFF;" vertex="1" parent="1">
<mxGeometry x="88" y="130" width="14" height="760" as="geometry" />
</mxCell>
<mxCell id="act2" value="" style="rounded=0;whiteSpace=wrap;html=1;strokeColor=#000000;fillColor=#FFFFFF;" vertex="1" parent="1">
<mxGeometry x="313" y="150" width="14" height="720" as="geometry" />
</mxCell>
<mxCell id="act3" value="" style="rounded=0;whiteSpace=wrap;html=1;strokeColor=#000000;fillColor=#FFFFFF;" vertex="1" parent="1">
<mxGeometry x="593" y="280" width="14" height="460" as="geometry" />
</mxCell>
<mxCell id="act4" value="" style="rounded=0;whiteSpace=wrap;html=1;strokeColor=#000000;fillColor=#FFFFFF;" vertex="1" parent="1">
<mxGeometry x="873" y="360" width="14" height="300" as="geometry" />
</mxCell>
<!-- 消息1管理员 → 前台:进入用户管理页面 -->
<mxCell id="m1" value="进入用户管理页面" style="endArrow=block;endFill=1;html=1;strokeColor=#000000;fontColor=#000000;align=center;" edge="1" parent="1">
<mxGeometry relative="1" as="geometry">
<mxPoint x="102" y="160" as="sourcePoint" />
<mxPoint x="313" y="160" as="targetPoint" />
</mxGeometry>
</mxCell>
<!-- 消息2前台 → 管理员:展示用户列表 -->
<mxCell id="m2" value="展示用户列表" style="endArrow=open;endFill=0;dashed=1;html=1;strokeColor=#000000;fontColor=#000000;align=center;" edge="1" parent="1">
<mxGeometry relative="1" as="geometry">
<mxPoint x="313" y="210" as="sourcePoint" />
<mxPoint x="102" y="210" as="targetPoint" />
</mxGeometry>
</mxCell>
<!-- 消息3管理员 → 前台:选择新增/更新/禁用操作 -->
<mxCell id="m3" value="选择新增/更新/禁用操作" style="endArrow=block;endFill=1;html=1;strokeColor=#000000;fontColor=#000000;align=center;" edge="1" parent="1">
<mxGeometry relative="1" as="geometry">
<mxPoint x="102" y="270" as="sourcePoint" />
<mxPoint x="313" y="270" as="targetPoint" />
</mxGeometry>
</mxCell>
<!-- 消息4前台 → 后台:提交账号管理请求 -->
<mxCell id="m4" value="提交账号管理请求" style="endArrow=block;endFill=1;html=1;strokeColor=#000000;fontColor=#000000;align=center;" edge="1" parent="1">
<mxGeometry relative="1" as="geometry">
<mxPoint x="327" y="310" as="sourcePoint" />
<mxPoint x="593" y="310" as="targetPoint" />
</mxGeometry>
</mxCell>
<!-- 消息5后台 → 数据库:校验管理员权限 -->
<mxCell id="m5" value="校验管理员权限" style="endArrow=block;endFill=1;html=1;strokeColor=#000000;fontColor=#000000;align=center;" edge="1" parent="1">
<mxGeometry relative="1" as="geometry">
<mxPoint x="607" y="380" as="sourcePoint" />
<mxPoint x="873" y="380" as="targetPoint" />
</mxGeometry>
</mxCell>
<!-- 消息6数据库 → 后台:返回权限信息 -->
<mxCell id="m6" value="返回权限信息" style="endArrow=open;endFill=0;dashed=1;html=1;strokeColor=#000000;fontColor=#000000;align=center;" edge="1" parent="1">
<mxGeometry relative="1" as="geometry">
<mxPoint x="873" y="430" as="sourcePoint" />
<mxPoint x="607" y="430" as="targetPoint" />
</mxGeometry>
</mxCell>
<!-- alt 片段框 -->
<mxCell id="alt_frame" value="" style="shape=mxgraph.sysml.package;html=1;overflow=fill;whiteSpace=wrap;strokeColor=#000000;fillColor=none;align=left;verticalAlign=top;spacingLeft=5;tabWidth=120;tabHeight=20;tabPosition=left;fontSize=12;" vertex="1" parent="1">
<mxGeometry x="60" y="470" width="870" height="390" as="geometry" />
</mxCell>
<mxCell id="alt_label" value="alt" style="text;html=1;align=left;verticalAlign=top;fontStyle=1;fontSize=12;fontColor=#000000;" vertex="1" parent="1">
<mxGeometry x="65" y="472" width="40" height="20" as="geometry" />
</mxCell>
<mxCell id="alt_guard1" value="[权限校验通过]" style="text;html=1;align=left;verticalAlign=middle;fontStyle=0;fontSize=11;fontColor=#000000;" vertex="1" parent="1">
<mxGeometry x="70" y="498" width="120" height="20" as="geometry" />
</mxCell>
<!-- 成功路径 -->
<!-- 消息7后台 → 数据库:更新目标用户信息/状态 -->
<mxCell id="m7" value="更新目标用户信息/状态" style="endArrow=block;endFill=1;html=1;strokeColor=#000000;fontColor=#000000;align=center;" edge="1" parent="1">
<mxGeometry relative="1" as="geometry">
<mxPoint x="607" y="530" as="sourcePoint" />
<mxPoint x="873" y="530" as="targetPoint" />
</mxGeometry>
</mxCell>
<!-- 消息8数据库 → 后台:返回更新结果 -->
<mxCell id="m8" value="返回更新结果" style="endArrow=open;endFill=0;dashed=1;html=1;strokeColor=#000000;fontColor=#000000;align=center;" edge="1" parent="1">
<mxGeometry relative="1" as="geometry">
<mxPoint x="873" y="580" as="sourcePoint" />
<mxPoint x="607" y="580" as="targetPoint" />
</mxGeometry>
</mxCell>
<!-- 消息9后台 → 前台:返回操作成功 -->
<mxCell id="m9" value="返回操作成功" style="endArrow=open;endFill=0;dashed=1;html=1;strokeColor=#000000;fontColor=#000000;align=center;" edge="1" parent="1">
<mxGeometry relative="1" as="geometry">
<mxPoint x="593" y="620" as="sourcePoint" />
<mxPoint x="327" y="620" as="targetPoint" />
</mxGeometry>
</mxCell>
<!-- 消息10前台 → 管理员:刷新列表并提示成功 -->
<mxCell id="m10" value="刷新列表并提示成功" style="endArrow=open;endFill=0;dashed=1;html=1;strokeColor=#000000;fontColor=#000000;align=center;" edge="1" parent="1">
<mxGeometry relative="1" as="geometry">
<mxPoint x="313" y="660" as="sourcePoint" />
<mxPoint x="102" y="660" as="targetPoint" />
</mxGeometry>
</mxCell>
<!-- 分隔虚线 -->
<mxCell id="alt_divider" value="" style="endArrow=none;dashed=1;html=1;strokeColor=#000000;" edge="1" parent="1">
<mxGeometry relative="1" as="geometry">
<mxPoint x="60" y="700" as="sourcePoint" />
<mxPoint x="930" y="700" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="alt_guard2" value="[权限校验失败]" style="text;html=1;align=left;verticalAlign=middle;fontStyle=0;fontSize=11;fontColor=#000000;" vertex="1" parent="1">
<mxGeometry x="70" y="708" width="120" height="20" as="geometry" />
</mxCell>
<!-- 失败路径 -->
<!-- 消息11后台 → 前台:返回错误码 -->
<mxCell id="m11" value="返回错误码" style="endArrow=open;endFill=0;dashed=1;html=1;strokeColor=#000000;fontColor=#000000;align=center;" edge="1" parent="1">
<mxGeometry relative="1" as="geometry">
<mxPoint x="593" y="750" as="sourcePoint" />
<mxPoint x="327" y="750" as="targetPoint" />
</mxGeometry>
</mxCell>
<!-- 消息12前台 → 管理员:提示操作失败信息 -->
<mxCell id="m12" value="提示操作失败信息" style="endArrow=open;endFill=0;dashed=1;html=1;strokeColor=#000000;fontColor=#000000;align=center;" edge="1" parent="1">
<mxGeometry relative="1" as="geometry">
<mxPoint x="313" y="800" as="sourcePoint" />
<mxPoint x="102" y="800" as="targetPoint" />
</mxGeometry>
</mxCell>
</root>
</mxGraphModel>
</diagram>
</mxfile>

View File

@@ -0,0 +1,251 @@
<mxfile host="app.diagrams.net" modified="2026-02-26T20:58:00.000Z" agent="OpenCode" version="24.7.17" type="device">
<diagram id="fig4-1-customer" name="图4.1 顾客功能结构图">
<mxGraphModel dx="1500" dy="900" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="2200" pageHeight="1400" math="0" shadow="0">
<root>
<mxCell id="0" />
<mxCell id="1" parent="0" />
<mxCell id="10" value="顾客功能结构" style="rounded=0;whiteSpace=wrap;html=1;strokeWidth=2;fontStyle=1;" vertex="1" parent="1"><mxGeometry x="980" y="40" width="220" height="60" as="geometry" /></mxCell>
<mxCell id="20" value="账户与安全" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1"><mxGeometry x="130" y="180" width="180" height="50" as="geometry" /></mxCell>
<mxCell id="21" value="注册登录" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1"><mxGeometry x="40" y="290" width="160" height="44" as="geometry" /></mxCell>
<mxCell id="22" value="修改密码" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1"><mxGeometry x="220" y="290" width="160" height="44" as="geometry" /></mxCell>
<mxCell id="23" value="登录认证" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1"><mxGeometry x="20" y="390" width="120" height="40" as="geometry" /></mxCell>
<mxCell id="24" value="身份保持" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1"><mxGeometry x="140" y="390" width="120" height="40" as="geometry" /></mxCell>
<mxCell id="25" value="密码校验" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1"><mxGeometry x="260" y="390" width="120" height="40" as="geometry" /></mxCell>
<mxCell id="30" value="个人中心" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1"><mxGeometry x="430" y="180" width="180" height="50" as="geometry" /></mxCell>
<mxCell id="31" value="查看个人信息" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1"><mxGeometry x="340" y="290" width="160" height="44" as="geometry" /></mxCell>
<mxCell id="32" value="修改个人信息" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1"><mxGeometry x="520" y="290" width="160" height="44" as="geometry" /></mxCell>
<mxCell id="33" value="联系方式维护" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1"><mxGeometry x="360" y="390" width="140" height="40" as="geometry" /></mxCell>
<mxCell id="34" value="头像信息维护" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1"><mxGeometry x="520" y="390" width="140" height="40" as="geometry" /></mxCell>
<mxCell id="40" value="宠物档案管理" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1"><mxGeometry x="730" y="180" width="180" height="50" as="geometry" /></mxCell>
<mxCell id="41" value="新增宠物档案" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1"><mxGeometry x="640" y="290" width="160" height="44" as="geometry" /></mxCell>
<mxCell id="42" value="编辑宠物档案" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1"><mxGeometry x="820" y="290" width="160" height="44" as="geometry" /></mxCell>
<mxCell id="43" value="删除宠物档案" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1"><mxGeometry x="1000" y="290" width="160" height="44" as="geometry" /></mxCell>
<mxCell id="44" value="基础信息录入" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1"><mxGeometry x="640" y="390" width="160" height="40" as="geometry" /></mxCell>
<mxCell id="45" value="健康备注维护" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1"><mxGeometry x="820" y="390" width="160" height="40" as="geometry" /></mxCell>
<mxCell id="50" value="预约管理" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1"><mxGeometry x="1130" y="180" width="180" height="50" as="geometry" /></mxCell>
<mxCell id="51" value="提交预约" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1"><mxGeometry x="1040" y="290" width="150" height="44" as="geometry" /></mxCell>
<mxCell id="52" value="取消预约" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1"><mxGeometry x="1200" y="290" width="150" height="44" as="geometry" /></mxCell>
<mxCell id="53" value="查询预约记录" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1"><mxGeometry x="1360" y="290" width="150" height="44" as="geometry" /></mxCell>
<mxCell id="54" value="选择宠物与时段" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1"><mxGeometry x="1040" y="390" width="150" height="40" as="geometry" /></mxCell>
<mxCell id="55" value="状态跟踪" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1"><mxGeometry x="1200" y="390" width="150" height="40" as="geometry" /></mxCell>
<mxCell id="56" value="取消确认" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1"><mxGeometry x="1360" y="390" width="150" height="40" as="geometry" /></mxCell>
<mxCell id="60" value="订单与报告" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1"><mxGeometry x="1530" y="180" width="180" height="50" as="geometry" /></mxCell>
<mxCell id="61" value="查看订单" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1"><mxGeometry x="1460" y="290" width="140" height="44" as="geometry" /></mxCell>
<mxCell id="62" value="查询报告" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1"><mxGeometry x="1610" y="290" width="140" height="44" as="geometry" /></mxCell>
<mxCell id="63" value="订单详情查看" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1"><mxGeometry x="1460" y="390" width="140" height="40" as="geometry" /></mxCell>
<mxCell id="64" value="报告内容浏览" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1"><mxGeometry x="1610" y="390" width="140" height="40" as="geometry" /></mxCell>
<mxCell id="70" value="公告与消息" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1"><mxGeometry x="1880" y="180" width="180" height="50" as="geometry" /></mxCell>
<mxCell id="71" value="查看公告" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1"><mxGeometry x="1810" y="290" width="140" height="44" as="geometry" /></mxCell>
<mxCell id="72" value="留言反馈" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1"><mxGeometry x="1960" y="290" width="140" height="44" as="geometry" /></mxCell>
<mxCell id="e100" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=none;" edge="1" parent="1" source="10" target="20"><mxGeometry relative="1" as="geometry" /></mxCell>
<mxCell id="e101" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=none;" edge="1" parent="1" source="10" target="30"><mxGeometry relative="1" as="geometry" /></mxCell>
<mxCell id="e102" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=none;" edge="1" parent="1" source="10" target="40"><mxGeometry relative="1" as="geometry" /></mxCell>
<mxCell id="e103" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=none;" edge="1" parent="1" source="10" target="50"><mxGeometry relative="1" as="geometry" /></mxCell>
<mxCell id="e104" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=none;" edge="1" parent="1" source="10" target="60"><mxGeometry relative="1" as="geometry" /></mxCell>
<mxCell id="e105" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=none;" edge="1" parent="1" source="10" target="70"><mxGeometry relative="1" as="geometry" /></mxCell>
<mxCell id="e110" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=none;" edge="1" parent="1" source="20" target="21"><mxGeometry relative="1" as="geometry" /></mxCell>
<mxCell id="e111" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=none;" edge="1" parent="1" source="20" target="22"><mxGeometry relative="1" as="geometry" /></mxCell>
<mxCell id="e112" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=none;" edge="1" parent="1" source="21" target="23"><mxGeometry relative="1" as="geometry" /></mxCell>
<mxCell id="e113" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=none;" edge="1" parent="1" source="21" target="24"><mxGeometry relative="1" as="geometry" /></mxCell>
<mxCell id="e114" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=none;" edge="1" parent="1" source="22" target="25"><mxGeometry relative="1" as="geometry" /></mxCell>
<mxCell id="e120" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=none;" edge="1" parent="1" source="30" target="31"><mxGeometry relative="1" as="geometry" /></mxCell>
<mxCell id="e121" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=none;" edge="1" parent="1" source="30" target="32"><mxGeometry relative="1" as="geometry" /></mxCell>
<mxCell id="e122" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=none;" edge="1" parent="1" source="32" target="33"><mxGeometry relative="1" as="geometry" /></mxCell>
<mxCell id="e123" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=none;" edge="1" parent="1" source="32" target="34"><mxGeometry relative="1" as="geometry" /></mxCell>
<mxCell id="e130" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=none;" edge="1" parent="1" source="40" target="41"><mxGeometry relative="1" as="geometry" /></mxCell>
<mxCell id="e131" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=none;" edge="1" parent="1" source="40" target="42"><mxGeometry relative="1" as="geometry" /></mxCell>
<mxCell id="e132" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=none;" edge="1" parent="1" source="40" target="43"><mxGeometry relative="1" as="geometry" /></mxCell>
<mxCell id="e133" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=none;" edge="1" parent="1" source="41" target="44"><mxGeometry relative="1" as="geometry" /></mxCell>
<mxCell id="e134" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=none;" edge="1" parent="1" source="42" target="45"><mxGeometry relative="1" as="geometry" /></mxCell>
<mxCell id="e140" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=none;" edge="1" parent="1" source="50" target="51"><mxGeometry relative="1" as="geometry" /></mxCell>
<mxCell id="e141" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=none;" edge="1" parent="1" source="50" target="52"><mxGeometry relative="1" as="geometry" /></mxCell>
<mxCell id="e142" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=none;" edge="1" parent="1" source="50" target="53"><mxGeometry relative="1" as="geometry" /></mxCell>
<mxCell id="e143" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=none;" edge="1" parent="1" source="51" target="54"><mxGeometry relative="1" as="geometry" /></mxCell>
<mxCell id="e144" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=none;" edge="1" parent="1" source="53" target="55"><mxGeometry relative="1" as="geometry" /></mxCell>
<mxCell id="e145" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=none;" edge="1" parent="1" source="52" target="56"><mxGeometry relative="1" as="geometry" /></mxCell>
<mxCell id="e150" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=none;" edge="1" parent="1" source="60" target="61"><mxGeometry relative="1" as="geometry" /></mxCell>
<mxCell id="e151" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=none;" edge="1" parent="1" source="60" target="62"><mxGeometry relative="1" as="geometry" /></mxCell>
<mxCell id="e152" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=none;" edge="1" parent="1" source="61" target="63"><mxGeometry relative="1" as="geometry" /></mxCell>
<mxCell id="e153" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=none;" edge="1" parent="1" source="62" target="64"><mxGeometry relative="1" as="geometry" /></mxCell>
<mxCell id="e160" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=none;" edge="1" parent="1" source="70" target="71"><mxGeometry relative="1" as="geometry" /></mxCell>
<mxCell id="e161" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=none;" edge="1" parent="1" source="70" target="72"><mxGeometry relative="1" as="geometry" /></mxCell>
</root>
</mxGraphModel>
</diagram>
<diagram id="fig4-2-doctor" name="图4.2 医生功能结构图">
<mxGraphModel dx="1500" dy="900" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="2200" pageHeight="1400" math="0" shadow="0">
<root>
<mxCell id="0" />
<mxCell id="1" parent="0" />
<mxCell id="10" value="医生功能结构" style="rounded=0;whiteSpace=wrap;html=1;strokeWidth=2;fontStyle=1;" vertex="1" parent="1"><mxGeometry x="980" y="40" width="220" height="60" as="geometry" /></mxCell>
<mxCell id="20" value="接诊工作台" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1"><mxGeometry x="180" y="180" width="190" height="50" as="geometry" /></mxCell>
<mxCell id="21" value="查看预约" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1"><mxGeometry x="90" y="290" width="160" height="44" as="geometry" /></mxCell>
<mxCell id="22" value="接诊确认" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1"><mxGeometry x="270" y="290" width="160" height="44" as="geometry" /></mxCell>
<mxCell id="23" value="创建就诊记录" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1"><mxGeometry x="160" y="390" width="180" height="40" as="geometry" /></mxCell>
<mxCell id="30" value="病历管理" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1"><mxGeometry x="520" y="180" width="190" height="50" as="geometry" /></mxCell>
<mxCell id="31" value="编辑病历" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1"><mxGeometry x="430" y="290" width="160" height="44" as="geometry" /></mxCell>
<mxCell id="32" value="查询历史病历" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1"><mxGeometry x="610" y="290" width="160" height="44" as="geometry" /></mxCell>
<mxCell id="33" value="主诉录入" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1"><mxGeometry x="390" y="390" width="120" height="40" as="geometry" /></mxCell>
<mxCell id="34" value="检查结果录入" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1"><mxGeometry x="520" y="390" width="120" height="40" as="geometry" /></mxCell>
<mxCell id="35" value="诊断结论录入" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1"><mxGeometry x="650" y="390" width="120" height="40" as="geometry" /></mxCell>
<mxCell id="40" value="处方管理" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1"><mxGeometry x="860" y="180" width="190" height="50" as="geometry" /></mxCell>
<mxCell id="41" value="开具处方" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1"><mxGeometry x="770" y="290" width="160" height="44" as="geometry" /></mxCell>
<mxCell id="42" value="查看处方" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1"><mxGeometry x="950" y="290" width="160" height="44" as="geometry" /></mxCell>
<mxCell id="43" value="查询历史处方" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1"><mxGeometry x="1130" y="290" width="160" height="44" as="geometry" /></mxCell>
<mxCell id="44" value="处方明细维护" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1"><mxGeometry x="830" y="390" width="140" height="40" as="geometry" /></mxCell>
<mxCell id="45" value="用法用量录入" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1"><mxGeometry x="980" y="390" width="140" height="40" as="geometry" /></mxCell>
<mxCell id="50" value="业务查询与协同" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1"><mxGeometry x="1370" y="180" width="200" height="50" as="geometry" /></mxCell>
<mxCell id="51" value="查看公告" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1"><mxGeometry x="1300" y="290" width="140" height="44" as="geometry" /></mxCell>
<mxCell id="52" value="修改个人信息" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1"><mxGeometry x="1450" y="290" width="140" height="44" as="geometry" /></mxCell>
<mxCell id="53" value="修改密码" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1"><mxGeometry x="1600" y="290" width="140" height="44" as="geometry" /></mxCell>
<mxCell id="60" value="诊疗闭环" style="rounded=0;whiteSpace=wrap;html=1;strokeWidth=2;" vertex="1" parent="1"><mxGeometry x="840" y="520" width="300" height="50" as="geometry" /></mxCell>
<mxCell id="61" value="查看预约" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1"><mxGeometry x="700" y="620" width="120" height="40" as="geometry" /></mxCell>
<mxCell id="62" value="接诊确认" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1"><mxGeometry x="830" y="620" width="120" height="40" as="geometry" /></mxCell>
<mxCell id="63" value="病历录入" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1"><mxGeometry x="960" y="620" width="120" height="40" as="geometry" /></mxCell>
<mxCell id="64" value="处方开具" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1"><mxGeometry x="1090" y="620" width="120" height="40" as="geometry" /></mxCell>
<mxCell id="e100" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=none;" edge="1" parent="1" source="10" target="20"><mxGeometry relative="1" as="geometry" /></mxCell>
<mxCell id="e101" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=none;" edge="1" parent="1" source="10" target="30"><mxGeometry relative="1" as="geometry" /></mxCell>
<mxCell id="e102" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=none;" edge="1" parent="1" source="10" target="40"><mxGeometry relative="1" as="geometry" /></mxCell>
<mxCell id="e103" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=none;" edge="1" parent="1" source="10" target="50"><mxGeometry relative="1" as="geometry" /></mxCell>
<mxCell id="e104" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=none;" edge="1" parent="1" source="10" target="60"><mxGeometry relative="1" as="geometry" /></mxCell>
<mxCell id="e110" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=none;" edge="1" parent="1" source="20" target="21"><mxGeometry relative="1" as="geometry" /></mxCell>
<mxCell id="e111" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=none;" edge="1" parent="1" source="20" target="22"><mxGeometry relative="1" as="geometry" /></mxCell>
<mxCell id="e112" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=none;" edge="1" parent="1" source="22" target="23"><mxGeometry relative="1" as="geometry" /></mxCell>
<mxCell id="e120" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=none;" edge="1" parent="1" source="30" target="31"><mxGeometry relative="1" as="geometry" /></mxCell>
<mxCell id="e121" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=none;" edge="1" parent="1" source="30" target="32"><mxGeometry relative="1" as="geometry" /></mxCell>
<mxCell id="e122" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=none;" edge="1" parent="1" source="31" target="33"><mxGeometry relative="1" as="geometry" /></mxCell>
<mxCell id="e123" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=none;" edge="1" parent="1" source="31" target="34"><mxGeometry relative="1" as="geometry" /></mxCell>
<mxCell id="e124" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=none;" edge="1" parent="1" source="31" target="35"><mxGeometry relative="1" as="geometry" /></mxCell>
<mxCell id="e130" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=none;" edge="1" parent="1" source="40" target="41"><mxGeometry relative="1" as="geometry" /></mxCell>
<mxCell id="e131" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=none;" edge="1" parent="1" source="40" target="42"><mxGeometry relative="1" as="geometry" /></mxCell>
<mxCell id="e132" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=none;" edge="1" parent="1" source="40" target="43"><mxGeometry relative="1" as="geometry" /></mxCell>
<mxCell id="e133" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=none;" edge="1" parent="1" source="41" target="44"><mxGeometry relative="1" as="geometry" /></mxCell>
<mxCell id="e134" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=none;" edge="1" parent="1" source="41" target="45"><mxGeometry relative="1" as="geometry" /></mxCell>
<mxCell id="e140" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=none;" edge="1" parent="1" source="50" target="51"><mxGeometry relative="1" as="geometry" /></mxCell>
<mxCell id="e141" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=none;" edge="1" parent="1" source="50" target="52"><mxGeometry relative="1" as="geometry" /></mxCell>
<mxCell id="e142" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=none;" edge="1" parent="1" source="50" target="53"><mxGeometry relative="1" as="geometry" /></mxCell>
<mxCell id="e150" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=none;" edge="1" parent="1" source="60" target="61"><mxGeometry relative="1" as="geometry" /></mxCell>
<mxCell id="e151" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=none;" edge="1" parent="1" source="60" target="62"><mxGeometry relative="1" as="geometry" /></mxCell>
<mxCell id="e152" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=none;" edge="1" parent="1" source="60" target="63"><mxGeometry relative="1" as="geometry" /></mxCell>
<mxCell id="e153" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=none;" edge="1" parent="1" source="60" target="64"><mxGeometry relative="1" as="geometry" /></mxCell>
</root>
</mxGraphModel>
</diagram>
<diagram id="fig4-3-admin" name="图4.3 管理员功能结构图">
<mxGraphModel dx="1500" dy="900" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="2400" pageHeight="1400" math="0" shadow="0">
<root>
<mxCell id="0" />
<mxCell id="1" parent="0" />
<mxCell id="10" value="管理员功能结构" style="rounded=0;whiteSpace=wrap;html=1;strokeWidth=2;fontStyle=1;" vertex="1" parent="1"><mxGeometry x="1080" y="40" width="220" height="60" as="geometry" /></mxCell>
<mxCell id="20" value="账户与权限管理" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1"><mxGeometry x="120" y="180" width="220" height="50" as="geometry" /></mxCell>
<mxCell id="21" value="用户管理" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1"><mxGeometry x="40" y="290" width="140" height="44" as="geometry" /></mxCell>
<mxCell id="22" value="医生管理" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1"><mxGeometry x="190" y="290" width="140" height="44" as="geometry" /></mxCell>
<mxCell id="23" value="新增用户" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1"><mxGeometry x="10" y="390" width="110" height="40" as="geometry" /></mxCell>
<mxCell id="24" value="编辑用户" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1"><mxGeometry x="120" y="390" width="110" height="40" as="geometry" /></mxCell>
<mxCell id="25" value="禁用/启用用户" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1"><mxGeometry x="230" y="390" width="120" height="40" as="geometry" /></mxCell>
<mxCell id="30" value="公告管理" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1"><mxGeometry x="470" y="180" width="220" height="50" as="geometry" /></mxCell>
<mxCell id="31" value="发布公告" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1"><mxGeometry x="410" y="290" width="120" height="44" as="geometry" /></mxCell>
<mxCell id="32" value="编辑公告" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1"><mxGeometry x="540" y="290" width="120" height="44" as="geometry" /></mxCell>
<mxCell id="33" value="删除公告" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1"><mxGeometry x="670" y="290" width="120" height="44" as="geometry" /></mxCell>
<mxCell id="34" value="公告列表查询" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1"><mxGeometry x="490" y="390" width="170" height="40" as="geometry" /></mxCell>
<mxCell id="40" value="药品基础管理" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1"><mxGeometry x="850" y="180" width="220" height="50" as="geometry" /></mxCell>
<mxCell id="41" value="新增药品" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1"><mxGeometry x="790" y="290" width="120" height="44" as="geometry" /></mxCell>
<mxCell id="42" value="编辑药品" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1"><mxGeometry x="920" y="290" width="120" height="44" as="geometry" /></mxCell>
<mxCell id="43" value="禁用/启用药品" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1"><mxGeometry x="1050" y="290" width="140" height="44" as="geometry" /></mxCell>
<mxCell id="44" value="药品分类维护" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1"><mxGeometry x="850" y="390" width="120" height="40" as="geometry" /></mxCell>
<mxCell id="45" value="规格价格维护" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1"><mxGeometry x="980" y="390" width="120" height="40" as="geometry" /></mxCell>
<mxCell id="50" value="库存流水管理" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1"><mxGeometry x="1260" y="180" width="220" height="50" as="geometry" /></mxCell>
<mxCell id="51" value="药品入库" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1"><mxGeometry x="1200" y="290" width="120" height="44" as="geometry" /></mxCell>
<mxCell id="52" value="药品出库" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1"><mxGeometry x="1330" y="290" width="120" height="44" as="geometry" /></mxCell>
<mxCell id="53" value="库存查询" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1"><mxGeometry x="1460" y="290" width="120" height="44" as="geometry" /></mxCell>
<mxCell id="54" value="入库记录查询" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1"><mxGeometry x="1210" y="390" width="120" height="40" as="geometry" /></mxCell>
<mxCell id="55" value="出库记录查询" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1"><mxGeometry x="1340" y="390" width="120" height="40" as="geometry" /></mxCell>
<mxCell id="56" value="低库存预警查看" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1"><mxGeometry x="1470" y="390" width="140" height="40" as="geometry" /></mxCell>
<mxCell id="60" value="统计分析" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1"><mxGeometry x="1650" y="180" width="220" height="50" as="geometry" /></mxCell>
<mxCell id="61" value="预约统计" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1"><mxGeometry x="1590" y="290" width="120" height="44" as="geometry" /></mxCell>
<mxCell id="62" value="订单统计" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1"><mxGeometry x="1720" y="290" width="120" height="44" as="geometry" /></mxCell>
<mxCell id="63" value="药品消耗统计" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1"><mxGeometry x="1850" y="290" width="140" height="44" as="geometry" /></mxCell>
<mxCell id="64" value="时间范围筛选" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1"><mxGeometry x="1670" y="390" width="120" height="40" as="geometry" /></mxCell>
<mxCell id="65" value="可视化展示" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1"><mxGeometry x="1810" y="390" width="120" height="40" as="geometry" /></mxCell>
<mxCell id="70" value="系统维护" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1"><mxGeometry x="2010" y="180" width="180" height="50" as="geometry" /></mxCell>
<mxCell id="71" value="修改个人信息" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1"><mxGeometry x="1940" y="290" width="140" height="44" as="geometry" /></mxCell>
<mxCell id="72" value="修改密码" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1"><mxGeometry x="2090" y="290" width="120" height="44" as="geometry" /></mxCell>
<mxCell id="e100" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=none;" edge="1" parent="1" source="10" target="20"><mxGeometry relative="1" as="geometry" /></mxCell>
<mxCell id="e101" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=none;" edge="1" parent="1" source="10" target="30"><mxGeometry relative="1" as="geometry" /></mxCell>
<mxCell id="e102" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=none;" edge="1" parent="1" source="10" target="40"><mxGeometry relative="1" as="geometry" /></mxCell>
<mxCell id="e103" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=none;" edge="1" parent="1" source="10" target="50"><mxGeometry relative="1" as="geometry" /></mxCell>
<mxCell id="e104" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=none;" edge="1" parent="1" source="10" target="60"><mxGeometry relative="1" as="geometry" /></mxCell>
<mxCell id="e105" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=none;" edge="1" parent="1" source="10" target="70"><mxGeometry relative="1" as="geometry" /></mxCell>
<mxCell id="e110" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=none;" edge="1" parent="1" source="20" target="21"><mxGeometry relative="1" as="geometry" /></mxCell>
<mxCell id="e111" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=none;" edge="1" parent="1" source="20" target="22"><mxGeometry relative="1" as="geometry" /></mxCell>
<mxCell id="e112" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=none;" edge="1" parent="1" source="21" target="23"><mxGeometry relative="1" as="geometry" /></mxCell>
<mxCell id="e113" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=none;" edge="1" parent="1" source="21" target="24"><mxGeometry relative="1" as="geometry" /></mxCell>
<mxCell id="e114" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=none;" edge="1" parent="1" source="21" target="25"><mxGeometry relative="1" as="geometry" /></mxCell>
<mxCell id="e120" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=none;" edge="1" parent="1" source="30" target="31"><mxGeometry relative="1" as="geometry" /></mxCell>
<mxCell id="e121" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=none;" edge="1" parent="1" source="30" target="32"><mxGeometry relative="1" as="geometry" /></mxCell>
<mxCell id="e122" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=none;" edge="1" parent="1" source="30" target="33"><mxGeometry relative="1" as="geometry" /></mxCell>
<mxCell id="e123" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=none;" edge="1" parent="1" source="32" target="34"><mxGeometry relative="1" as="geometry" /></mxCell>
<mxCell id="e130" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=none;" edge="1" parent="1" source="40" target="41"><mxGeometry relative="1" as="geometry" /></mxCell>
<mxCell id="e131" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=none;" edge="1" parent="1" source="40" target="42"><mxGeometry relative="1" as="geometry" /></mxCell>
<mxCell id="e132" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=none;" edge="1" parent="1" source="40" target="43"><mxGeometry relative="1" as="geometry" /></mxCell>
<mxCell id="e133" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=none;" edge="1" parent="1" source="41" target="44"><mxGeometry relative="1" as="geometry" /></mxCell>
<mxCell id="e134" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=none;" edge="1" parent="1" source="42" target="45"><mxGeometry relative="1" as="geometry" /></mxCell>
<mxCell id="e140" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=none;" edge="1" parent="1" source="50" target="51"><mxGeometry relative="1" as="geometry" /></mxCell>
<mxCell id="e141" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=none;" edge="1" parent="1" source="50" target="52"><mxGeometry relative="1" as="geometry" /></mxCell>
<mxCell id="e142" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=none;" edge="1" parent="1" source="50" target="53"><mxGeometry relative="1" as="geometry" /></mxCell>
<mxCell id="e143" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=none;" edge="1" parent="1" source="51" target="54"><mxGeometry relative="1" as="geometry" /></mxCell>
<mxCell id="e144" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=none;" edge="1" parent="1" source="52" target="55"><mxGeometry relative="1" as="geometry" /></mxCell>
<mxCell id="e145" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=none;" edge="1" parent="1" source="53" target="56"><mxGeometry relative="1" as="geometry" /></mxCell>
<mxCell id="e150" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=none;" edge="1" parent="1" source="60" target="61"><mxGeometry relative="1" as="geometry" /></mxCell>
<mxCell id="e151" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=none;" edge="1" parent="1" source="60" target="62"><mxGeometry relative="1" as="geometry" /></mxCell>
<mxCell id="e152" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=none;" edge="1" parent="1" source="60" target="63"><mxGeometry relative="1" as="geometry" /></mxCell>
<mxCell id="e153" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=none;" edge="1" parent="1" source="61" target="64"><mxGeometry relative="1" as="geometry" /></mxCell>
<mxCell id="e154" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=none;" edge="1" parent="1" source="63" target="65"><mxGeometry relative="1" as="geometry" /></mxCell>
<mxCell id="e160" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=none;" edge="1" parent="1" source="70" target="71"><mxGeometry relative="1" as="geometry" /></mxCell>
<mxCell id="e161" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=none;" edge="1" parent="1" source="70" target="72"><mxGeometry relative="1" as="geometry" /></mxCell>
</root>
</mxGraphModel>
</diagram>
</mxfile>

View File

@@ -0,0 +1,42 @@
<mxfile host="app.diagrams.net" modified="2026-02-26T21:12:00.000Z" agent="OpenCode" version="24.7.17" type="device">
<diagram id="class-diagram" name="图4.4 系统类图">
<mxGraphModel dx="1600" dy="1000" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="2600" pageHeight="1600" math="0" shadow="0">
<root>
<mxCell id="0" />
<mxCell id="1" parent="0" />
<mxCell id="10" value="系统类图(核心实体类)" style="rounded=0;whiteSpace=wrap;html=1;strokeWidth=2;fontStyle=1;" vertex="1" parent="1"><mxGeometry x="1160" y="20" width="260" height="56" as="geometry" /></mxCell>
<mxCell id="100" value="&lt;b&gt;用户类&lt;/b&gt;&lt;hr/&gt;+ id: Long&lt;br/&gt;+ username: String&lt;br/&gt;+ phone: String&lt;br/&gt;+ email: String&lt;br/&gt;+ password: String&lt;br/&gt;+ role: String&lt;br/&gt;+ status: Integer&lt;br/&gt;+ avatar: String&lt;br/&gt;+ createTime: DateTime&lt;br/&gt;+ updateTime: DateTime&lt;br/&gt;+ deleted: Integer" style="shape=umlClass;whiteSpace=wrap;html=1;" vertex="1" parent="1"><mxGeometry x="80" y="140" width="250" height="280" as="geometry" /></mxCell>
<mxCell id="101" value="&lt;b&gt;医生类&lt;/b&gt;&lt;hr/&gt;+ id: Long&lt;br/&gt;+ name: String&lt;br/&gt;+ department: String&lt;br/&gt;+ title: String&lt;br/&gt;+ phone: String&lt;br/&gt;+ email: String&lt;br/&gt;+ status: Integer&lt;br/&gt;+ createTime: DateTime&lt;br/&gt;+ updateTime: DateTime&lt;br/&gt;+ deleted: Integer" style="shape=umlClass;whiteSpace=wrap;html=1;" vertex="1" parent="1"><mxGeometry x="380" y="140" width="250" height="260" as="geometry" /></mxCell>
<mxCell id="102" value="&lt;b&gt;宠物类&lt;/b&gt;&lt;hr/&gt;+ id: Long&lt;br/&gt;+ ownerId: Long&lt;br/&gt;+ name: String&lt;br/&gt;+ species: String&lt;br/&gt;+ breed: String&lt;br/&gt;+ gender: String&lt;br/&gt;+ birthday: Date&lt;br/&gt;+ weight: Decimal&lt;br/&gt;+ remark: String&lt;br/&gt;+ createTime: DateTime&lt;br/&gt;+ updateTime: DateTime&lt;br/&gt;+ deleted: Integer" style="shape=umlClass;whiteSpace=wrap;html=1;" vertex="1" parent="1"><mxGeometry x="80" y="520" width="260" height="300" as="geometry" /></mxCell>
<mxCell id="103" value="&lt;b&gt;预约类&lt;/b&gt;&lt;hr/&gt;+ id: Long&lt;br/&gt;+ customerId: Long&lt;br/&gt;+ petId: Long&lt;br/&gt;+ doctorId: Long&lt;br/&gt;+ department: String&lt;br/&gt;+ appointmentDate: Date&lt;br/&gt;+ timeSlot: String&lt;br/&gt;+ status: String&lt;br/&gt;+ remark: String&lt;br/&gt;+ createTime: DateTime&lt;br/&gt;+ updateTime: DateTime&lt;br/&gt;+ deleted: Integer" style="shape=umlClass;whiteSpace=wrap;html=1;" vertex="1" parent="1"><mxGeometry x="390" y="520" width="270" height="300" as="geometry" /></mxCell>
<mxCell id="104" value="&lt;b&gt;就诊类&lt;/b&gt;&lt;hr/&gt;+ id: Long&lt;br/&gt;+ appointmentId: Long&lt;br/&gt;+ customerId: Long&lt;br/&gt;+ petId: Long&lt;br/&gt;+ doctorId: Long&lt;br/&gt;+ symptoms: String&lt;br/&gt;+ diagnosis: String&lt;br/&gt;+ treatmentPlan: String&lt;br/&gt;+ status: String&lt;br/&gt;+ paymentStatus: String&lt;br/&gt;+ createTime: DateTime&lt;br/&gt;+ updateTime: DateTime&lt;br/&gt;+ deleted: Integer" style="shape=umlClass;whiteSpace=wrap;html=1;" vertex="1" parent="1"><mxGeometry x="710" y="520" width="280" height="320" as="geometry" /></mxCell>
<mxCell id="105" value="&lt;b&gt;病历类&lt;/b&gt;&lt;hr/&gt;+ id: Long&lt;br/&gt;+ visitId: Long&lt;br/&gt;+ doctorId: Long&lt;br/&gt;+ content: Text&lt;br/&gt;+ recordType: String&lt;br/&gt;+ createTime: DateTime&lt;br/&gt;+ updateTime: DateTime&lt;br/&gt;+ deleted: Integer" style="shape=umlClass;whiteSpace=wrap;html=1;" vertex="1" parent="1"><mxGeometry x="1030" y="520" width="250" height="230" as="geometry" /></mxCell>
<mxCell id="106" value="&lt;b&gt;处方类&lt;/b&gt;&lt;hr/&gt;+ id: Long&lt;br/&gt;+ visitId: Long&lt;br/&gt;+ doctorId: Long&lt;br/&gt;+ customerId: Long&lt;br/&gt;+ totalAmount: Decimal&lt;br/&gt;+ status: String&lt;br/&gt;+ createTime: DateTime&lt;br/&gt;+ updateTime: DateTime&lt;br/&gt;+ deleted: Integer" style="shape=umlClass;whiteSpace=wrap;html=1;" vertex="1" parent="1"><mxGeometry x="1320" y="520" width="260" height="250" as="geometry" /></mxCell>
<mxCell id="107" value="&lt;b&gt;处方明细类&lt;/b&gt;&lt;hr/&gt;+ id: Long&lt;br/&gt;+ prescriptionId: Long&lt;br/&gt;+ drugId: Long&lt;br/&gt;+ quantity: Integer&lt;br/&gt;+ dosage: String&lt;br/&gt;+ frequency: String&lt;br/&gt;+ duration: String&lt;br/&gt;+ createTime: DateTime&lt;br/&gt;+ updateTime: DateTime&lt;br/&gt;+ deleted: Integer" style="shape=umlClass;whiteSpace=wrap;html=1;" vertex="1" parent="1"><mxGeometry x="1620" y="520" width="280" height="270" as="geometry" /></mxCell>
<mxCell id="108" value="&lt;b&gt;药品类&lt;/b&gt;&lt;hr/&gt;+ id: Long&lt;br/&gt;+ name: String&lt;br/&gt;+ category: String&lt;br/&gt;+ specification: String&lt;br/&gt;+ unitPrice: Decimal&lt;br/&gt;+ stockQuantity: Integer&lt;br/&gt;+ alertThreshold: Integer&lt;br/&gt;+ status: Integer&lt;br/&gt;+ createTime: DateTime&lt;br/&gt;+ updateTime: DateTime&lt;br/&gt;+ deleted: Integer" style="shape=umlClass;whiteSpace=wrap;html=1;" vertex="1" parent="1"><mxGeometry x="1940" y="520" width="280" height="290" as="geometry" /></mxCell>
<mxCell id="109" value="&lt;b&gt;订单类&lt;/b&gt;&lt;hr/&gt;+ id: Long&lt;br/&gt;+ visitId: Long&lt;br/&gt;+ customerId: Long&lt;br/&gt;+ amount: Decimal&lt;br/&gt;+ status: String&lt;br/&gt;+ paymentMethod: String&lt;br/&gt;+ paymentTime: DateTime&lt;br/&gt;+ createTime: DateTime&lt;br/&gt;+ updateTime: DateTime&lt;br/&gt;+ deleted: Integer" style="shape=umlClass;whiteSpace=wrap;html=1;" vertex="1" parent="1"><mxGeometry x="710" y="930" width="280" height="270" as="geometry" /></mxCell>
<mxCell id="110" value="&lt;b&gt;入库类&lt;/b&gt;&lt;hr/&gt;+ id: Long&lt;br/&gt;+ drugId: Long&lt;br/&gt;+ quantity: Integer&lt;br/&gt;+ unitPrice: Decimal&lt;br/&gt;+ supplier: String&lt;br/&gt;+ operatorId: Long&lt;br/&gt;+ createTime: DateTime&lt;br/&gt;+ updateTime: DateTime&lt;br/&gt;+ deleted: Integer" style="shape=umlClass;whiteSpace=wrap;html=1;" vertex="1" parent="1"><mxGeometry x="1940" y="930" width="270" height="250" as="geometry" /></mxCell>
<mxCell id="111" value="&lt;b&gt;出库类&lt;/b&gt;&lt;hr/&gt;+ id: Long&lt;br/&gt;+ drugId: Long&lt;br/&gt;+ quantity: Integer&lt;br/&gt;+ purpose: String&lt;br/&gt;+ operatorId: Long&lt;br/&gt;+ createTime: DateTime&lt;br/&gt;+ updateTime: DateTime&lt;br/&gt;+ deleted: Integer" style="shape=umlClass;whiteSpace=wrap;html=1;" vertex="1" parent="1"><mxGeometry x="2240" y="930" width="260" height="230" as="geometry" /></mxCell>
<mxCell id="112" value="&lt;b&gt;公告类&lt;/b&gt;&lt;hr/&gt;+ id: Long&lt;br/&gt;+ title: String&lt;br/&gt;+ content: Text&lt;br/&gt;+ publishTime: DateTime&lt;br/&gt;+ status: Integer&lt;br/&gt;+ createTime: DateTime&lt;br/&gt;+ updateTime: DateTime&lt;br/&gt;+ deleted: Integer" style="shape=umlClass;whiteSpace=wrap;html=1;" vertex="1" parent="1"><mxGeometry x="1030" y="140" width="250" height="230" as="geometry" /></mxCell>
<mxCell id="113" value="&lt;b&gt;报告类&lt;/b&gt;&lt;hr/&gt;+ id: Long&lt;br/&gt;+ visitId: Long&lt;br/&gt;+ customerId: Long&lt;br/&gt;+ petId: Long&lt;br/&gt;+ reportType: String&lt;br/&gt;+ content: Text&lt;br/&gt;+ createTime: DateTime&lt;br/&gt;+ updateTime: DateTime&lt;br/&gt;+ deleted: Integer" style="shape=umlClass;whiteSpace=wrap;html=1;" vertex="1" parent="1"><mxGeometry x="1320" y="140" width="260" height="250" as="geometry" /></mxCell>
<mxCell id="200" value="1:N" style="edgeStyle=orthogonalEdgeStyle;rounded=0;html=1;endArrow=none;" edge="1" parent="1" source="100" target="102"><mxGeometry relative="1" as="geometry" /></mxCell>
<mxCell id="201" value="1:N" style="edgeStyle=orthogonalEdgeStyle;rounded=0;html=1;endArrow=none;" edge="1" parent="1" source="100" target="103"><mxGeometry relative="1" as="geometry" /></mxCell>
<mxCell id="202" value="1:N" style="edgeStyle=orthogonalEdgeStyle;rounded=0;html=1;endArrow=none;" edge="1" parent="1" source="101" target="103"><mxGeometry relative="1" as="geometry" /></mxCell>
<mxCell id="203" value="1:N" style="edgeStyle=orthogonalEdgeStyle;rounded=0;html=1;endArrow=none;" edge="1" parent="1" source="102" target="103"><mxGeometry relative="1" as="geometry" /></mxCell>
<mxCell id="204" value="1:1" style="edgeStyle=orthogonalEdgeStyle;rounded=0;html=1;endArrow=none;" edge="1" parent="1" source="103" target="104"><mxGeometry relative="1" as="geometry" /></mxCell>
<mxCell id="205" value="1:N" style="edgeStyle=orthogonalEdgeStyle;rounded=0;html=1;endArrow=none;" edge="1" parent="1" source="104" target="105"><mxGeometry relative="1" as="geometry" /></mxCell>
<mxCell id="206" value="1:N" style="edgeStyle=orthogonalEdgeStyle;rounded=0;html=1;endArrow=none;" edge="1" parent="1" source="104" target="106"><mxGeometry relative="1" as="geometry" /></mxCell>
<mxCell id="207" value="1:N" style="edgeStyle=orthogonalEdgeStyle;rounded=0;html=1;endArrow=none;" edge="1" parent="1" source="106" target="107"><mxGeometry relative="1" as="geometry" /></mxCell>
<mxCell id="208" value="N:1" style="edgeStyle=orthogonalEdgeStyle;rounded=0;html=1;endArrow=none;" edge="1" parent="1" source="107" target="108"><mxGeometry relative="1" as="geometry" /></mxCell>
<mxCell id="209" value="1:1" style="edgeStyle=orthogonalEdgeStyle;rounded=0;html=1;endArrow=none;" edge="1" parent="1" source="104" target="109"><mxGeometry relative="1" as="geometry" /></mxCell>
<mxCell id="210" value="1:N" style="edgeStyle=orthogonalEdgeStyle;rounded=0;html=1;endArrow=none;" edge="1" parent="1" source="108" target="110"><mxGeometry relative="1" as="geometry" /></mxCell>
<mxCell id="211" value="1:N" style="edgeStyle=orthogonalEdgeStyle;rounded=0;html=1;endArrow=none;" edge="1" parent="1" source="108" target="111"><mxGeometry relative="1" as="geometry" /></mxCell>
<mxCell id="212" value="1:N" style="edgeStyle=orthogonalEdgeStyle;rounded=0;html=1;endArrow=none;" edge="1" parent="1" source="104" target="113"><mxGeometry relative="1" as="geometry" /></mxCell>
<mxCell id="213" value="1:N" style="edgeStyle=orthogonalEdgeStyle;rounded=0;html=1;endArrow=none;" edge="1" parent="1" source="100" target="112"><mxGeometry relative="1" as="geometry" /></mxCell>
</root>
</mxGraphModel>
</diagram>
</mxfile>

View File

@@ -299,62 +299,86 @@ Comprehensive functional and process-oriented testing indicates that the system
#### 3.3.4 用例关系include关系 #### 3.3.4 用例关系include关系
系统用例之间存在明确的包含关系include`<<include>>`表示。包含关系表示一个用例必须包含另一个用例的行为才能完成。以下列出系统的主要包含关系: 系统用例之间存在明确的包含关系include`<<include>>`表示。包含关系表示一个用例在执行过程中必然包含子用例的行为。以下按业务模块列出系统的主要包含关系:
**1顾客用例的include关系** **1顾客用例的include关系**
- 提交预约 <<include>> 登录 预约管理模块:
- 取消预约 <<include>> 登录 - 预约管理 <<include>> 提交预约
- 查询预约记录 <<include>> 登录 - 预约管理 <<include>> 取消预约
- 查看订单 <<include>> - 预约管理 <<include>> 查询预约记
- 查询报告 <<include>> 登录
- 维护宠物档案 <<include>> 登录 宠物档案模块:
- 修改个人信息 <<include>> 登录 - 宠物档案管理 <<include>> 新增宠物
- 修改密码 <<include>> 登录 - 宠物档案管理 <<include>> 编辑宠物
- 提交预约 <<include>> 维护宠物档案(需要先创建宠物档案才能进行预约) - 宠物档案管理 <<include>> 删除宠物
个人信息模块:
- 个人中心 <<include>> 修改个人信息
- 个人中心 <<include>> 修改密码
**2医生用例的include关系** **2医生用例的include关系**
- 查看预约 <<include>> 登录 接诊管理模块:
- 接诊确认 <<include>> 登录 - 接诊管理 <<include>> 查看预约
- 创建就诊记录 <<include>> 登录 - 接诊管理 <<include>> 接诊确认
- 编辑病历 <<include>> - 接诊管理 <<include>> 创建就诊记
- 开具处方 <<include>> 登录
- 查看处方 <<include>> 登录 诊疗管理模块:
- 查询历史病历 <<include>> 登录 - 诊疗管理 <<include>> 编辑病历
- 查询历史处方 <<include>> 登录 - 诊疗管理 <<include>> 开具处方
- 修改个人信息 <<include>> 登录 - 诊疗管理 <<include>> 查看处方
- 修改密码 <<include>> 登录
- 创建就诊记录 <<include>> 查看预约(需要先查看预约才能创建就诊记录) 历史查询模块:
- 编辑病<<include>> 创建就诊记录(需要先创建就诊记录才能编辑病历 -史查询 <<include>> 查询历史病历
- 开具处方 <<include>> 创建就诊记录(需要先创建就诊记录才能开具处方 - 历史查询 <<include>> 查询历史处方
- 开具处方 <<include>> 编辑病历(需要先完成病历录入才能开具处方)
个人信息模块:
- 个人中心 <<include>> 修改个人信息
- 个人中心 <<include>> 修改密码
**3管理员用例的include关系** **3管理员用例的include关系**
- 用户管理 <<include>> 登录 用户管理模块:
- 医生管理 <<include>> 登录 - 用户管理 <<include>> 查看用户列表
- 公告管理 <<include>> 登录 - 用户管理 <<include>> 新增用户
- 药品管理 <<include>> 登录 - 用户管理 <<include>> 编辑用户
- 药品入库 <<include>> 登录 - 用户管理 <<include>> 禁用用户
- 药品出库 <<include>> 登录 - 用户管理 <<include>> 启用用户
- 库存查询 <<include>> 登录
- 统计报表查看 <<include>> 登录 公告管理模块:
- 修改个人信息 <<include>> 登录 - 公告管理 <<include>> 发布公告
- 修改密码 <<include>> 登录 - 公告管理 <<include>> 编辑公告
- 药品入库 <<include>> 药品管理(需要先在药品管理中维护药品信息才能进行入库操作) - 公告管理 <<include>> 删除公告
- 药品出库 <<include>> 药品管理(需要先在药品管理中维护药品信息才能进行出库操作)
药品与库存管理模块:
- 药品管理 <<include>> 新增药品
- 药品管理 <<include>> 编辑药品
- 药品管理 <<include>> 禁用药品
- 药品管理 <<include>> 启用药品
- 库存管理 <<include>> 药品入库
- 库存管理 <<include>> 药品出库
- 库存管理 <<include>> 库存查询
统计分析模块:
- 统计报表 <<include>> 预约统计
- 统计报表 <<include>> 订单统计
- 统计报表 <<include>> 药品消耗统计
个人信息模块:
- 个人中心 <<include>> 修改个人信息
- 个人中心 <<include>> 修改密码
**4跨角色共享用例** **4跨角色共享用例**
以下用例被多个角色共享: 以下用例被多个角色共享:
- **登录**:被顾客、医生、管理员三个角色的所有业务用例包含 - **登录**作为系统认证入口,被顾客、医生、管理员三个角色共同使用
- **修改个人信息**:被顾客、医生、管理员三个角色使用 - **修改个人信息**:被顾客、医生、管理员三个角色使用
- **修改密码**:被顾客、医生、管理员三个角色使用 - **修改密码**:被顾客、医生、管理员三个角色使用
- **查看公告**:被顾客、医生、管理员三个角色使用 - **查看公告**:被顾客、医生、管理员三个角色使用
这些共享用例体现了系统的基础能力,所有角色的业务操作都依赖于这些基础用例的完成 这些共享用例体现了系统的基础通用能力,各角色通过统一入口完成认证与个人信息维护
### 3.4 用例描述 ### 3.4 用例描述
@@ -614,7 +638,7 @@ Comprehensive functional and process-oriented testing indicates that the system
### 4.2 类图设计 ### 4.2 类图设计
系统核心实体包含 `User``Doctor``Pet``Appointment``Visit``MedicalRecord``Prescription``PrescriptionItem``Drug``OrderInfo``StockIn``StockOut``Notice``Report` 等。 系统核心实体包含:用户类、医生类、宠物类、预约类、就诊类、病历类、处方类、处方明细类、药品类、订单类、入库类、出库类、公告类、报告类等。
主要关系如下: 主要关系如下: