<?xml version="1.0" encoding="UTF-8"?>
<mxfile host="drawio" version="26.0.0">
  <diagram name="组件图">
    <mxGraphModel dx="1400" dy="900" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="1600" pageHeight="1000" math="0" shadow="0">
      <root>
        <mxCell id="0" />
        <mxCell id="1" parent="0" />

        <!-- Title -->
        <mxCell id="title" value="12306旅客管理系统 - 组件图" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;fontSize=20;fontStyle=1" vertex="1" parent="1">
          <mxGeometry x="600" y="20" width="400" height="40" as="geometry" />
        </mxCell>

        <!-- Frontend Section -->
        <mxCell id="frontend" value="前端组件 (Frontend)" style="swimlane;startSize=30;fillColor=#e3f2fd;strokeColor=#1976d2;fontStyle=1;fontSize=14;align=center;" vertex="1" parent="1">
          <mxGeometry x="50" y="80" width="380" height="400" as="geometry" />
        </mxCell>

        <!-- Page Components -->
        <mxCell id="pages" value="页面组件" style="swimlane;startSize=20;fillColor=#bbdefb;strokeColor=#1976d2;fontStyle=1;fontSize=12;align=center;" vertex="1" parent="frontend">
          <mxGeometry x="20" y="50" width="160" height="150" as="geometry" />
        </mxCell>
        <mxCell id="home" value="HomeView&#xa;首页" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#e3f2fd;strokeColor=#1976d2;fontSize=10;" vertex="1" parent="pages">
          <mxGeometry x="20" y="40" width="55" height="40" as="geometry" />
        </mxCell>
        <mxCell id="login" value="LoginView&#xa;登录" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#e3f2fd;strokeColor=#1976d2;fontSize=10;" vertex="1" parent="pages">
          <mxGeometry x="85" y="40" width="55" height="40" as="geometry" />
        </mxCell>
        <mxCell id="ticket" value="TicketQueryView&#xa;车票查询" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#e3f2fd;strokeColor=#1976d2;fontSize=10;" vertex="1" parent="pages">
          <mxGeometry x="20" y="90" width="55" height="40" as="geometry" />
        </mxCell>
        <mxCell id="passview" value="PassengersView&#xa;旅客管理" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#e3f2fd;strokeColor=#1976d2;fontSize=10;" vertex="1" parent="pages">
          <mxGeometry x="85" y="90" width="55" height="40" as="geometry" />
        </mxCell>
        <mxCell id="orderview" value="OrdersView&#xa;订单列表" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#e3f2fd;strokeColor=#1976d2;fontSize=10;" vertex="1" parent="pages">
          <mxGeometry x="20" y="140" width="120" height="30" as="geometry" />
        </mxCell>

        <!-- Common Components -->
        <mxCell id="common" value="公共组件" style="swimlane;startSize=20;fillColor=#bbdefb;strokeColor=#1976d2;fontStyle=1;fontSize=12;align=center;" vertex="1" parent="frontend">
          <mxGeometry x="200" y="50" width="160" height="150" as="geometry" />
        </mxCell>
        <mxCell id="header" value="AppHeader&#xa;头部" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#bbdefb;strokeColor=#1976d2;fontSize=10;" vertex="1" parent="common">
          <mxGeometry x="20" y="40" width="55" height="40" as="geometry" />
        </mxCell>
        <mxCell id="footer" value="AppFooter&#xa;底部" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#bbdefb;strokeColor=#1976d2;fontSize=10;" vertex="1" parent="common">
          <mxGeometry x="85" y="40" width="55" height="40" as="geometry" />
        </mxCell>
        <mxCell id="dialog" value="BaseDialog&#xa;弹窗" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#bbdefb;strokeColor=#1976d2;fontSize=10;" vertex="1" parent="common">
          <mxGeometry x="20" y="90" width="55" height="40" as="geometry" />
        </mxCell>
        <mxCell id="table" value="BaseTable&#xa;表格" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#bbdefb;strokeColor=#1976d2;fontSize=10;" vertex="1" parent="common">
          <mxGeometry x="85" y="90" width="55" height="40" as="geometry" />
        </mxCell>

        <!-- State Management -->
        <mxCell id="stores" value="状态管理" style="swimlane;startSize=20;fillColor=#c8e6c9;strokeColor=#388e3c;fontStyle=1;fontSize=12;align=center;" vertex="1" parent="frontend">
          <mxGeometry x="20" y="220" width="160" height="90" as="geometry" />
        </mxCell>
        <mxCell id="userstore" value="UserStore&#xa;用户状态" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#c8e6c9;strokeColor=#388e3c;fontSize=10;" vertex="1" parent="stores">
          <mxGeometry x="20" y="40" width="55" height="40" as="geometry" />
        </mxCell>
        <mxCell id="passstore" value="PassengerStore&#xa;旅客状态" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#c8e6c9;strokeColor=#388e3c;fontSize=10;" vertex="1" parent="stores">
          <mxGeometry x="85" y="40" width="55" height="40" as="geometry" />
        </mxCell>

        <!-- Network Layer -->
        <mxCell id="network" value="网络层" style="swimlane;startSize=20;fillColor=#fff3e0;strokeColor=#f57c00;fontStyle=1;fontSize=12;align=center;" vertex="1" parent="frontend">
          <mxGeometry x="200" y="220" width="160" height="90" as="geometry" />
        </mxCell>
        <mxCell id="apiclient" value="ApiClient&#xa;HTTP客户端" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#ffe0b2;strokeColor=#f57c00;fontSize=10;" vertex="1" parent="network">
          <mxGeometry x="20" y="40" width="55" height="40" as="geometry" />
        </mxCell>
        <mxCell id="authapi" value="AuthAPI&#xa;认证接口" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#ffe0b2;strokeColor=#f57c00;fontSize=10;" vertex="1" parent="network">
          <mxGeometry x="85" y="40" width="55" height="40" as="geometry" />
        </mxCell>

        <!-- Frontend internal connections -->
        <mxCell id="fe_c1" style="edgeStyle=orthogonalEdgeStyle;rounded=1;orthogonalLoop=1;jettySize=auto;html=1;endArrow=none;endFill=0;strokeColor=#666666;dashed=1;" edge="1" parent="frontend" source="home" target="header">
          <mxGeometry relative="1" as="geometry" />
        </mxCell>
        <mxCell id="fe_c2" style="edgeStyle=orthogonalEdgeStyle;rounded=1;orthogonalLoop=1;jettySize=auto;html=1;endArrow=none;endFill=0;strokeColor=#666666;dashed=1;" edge="1" parent="frontend" source="login" target="authapi">
          <mxGeometry relative="1" as="geometry" />
        </mxCell>
        <mxCell id="fe_c3" style="edgeStyle=orthogonalEdgeStyle;rounded=1;orthogonalLoop=1;jettySize=auto;html=1;endArrow=none;endFill=0;strokeColor=#666666;dashed=1;" edge="1" parent="frontend" source="passstore" target="apiclient">
          <mxGeometry relative="1" as="geometry" />
        </mxCell>
        <mxCell id="fe_c4" style="edgeStyle=orthogonalEdgeStyle;rounded=1;orthogonalLoop=1;jettySize=auto;html=1;endArrow=none;endFill=0;strokeColor=#666666;dashed=1;" edge="1" parent="frontend" source="apiclient" target="header">
          <mxGeometry relative="1" as="geometry" />
        </mxCell>

        <!-- Backend Section -->
        <mxCell id="backend" value="后端组件 (Backend)" style="swimlane;startSize=30;fillColor=#f3e5f5;strokeColor=#7b1fa2;fontStyle=1;fontSize=14;align=center;" vertex="1" parent="1">
          <mxGeometry x="480" y="80" width="500" height="400" as="geometry" />
        </mxCell>

        <!-- Controller Layer -->
        <mxCell id="controllers" value="控制器层" style="swimlane;startSize=20;fillColor=#e1bee7;strokeColor=#7b1fa2;fontStyle=1;fontSize=12;align=center;" vertex="1" parent="backend">
          <mxGeometry x="20" y="50" width="200" height="100" as="geometry" />
        </mxCell>
        <mxCell id="authctrl" value="AuthController&#xa;认证" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#e1bee7;strokeColor=#7b1fa2;fontSize=10;" vertex="1" parent="controllers">
          <mxGeometry x="20" y="40" width="55" height="40" as="geometry" />
        </mxCell>
        <mxCell id="userctrl" value="UserController&#xa;用户" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#e1bee7;strokeColor=#7b1fa2;fontSize=10;" vertex="1" parent="controllers">
          <mxGeometry x="85" y="40" width="55" height="40" as="geometry" />
        </mxCell>
        <mxCell id="passctrl" value="PassengerController&#xa;旅客" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#e1bee7;strokeColor=#7b1fa2;fontSize=10;" vertex="1" parent="controllers">
          <mxGeometry x="150" y="40" width="35" height="40" as="geometry" />
        </mxCell>

        <!-- Service Layer -->
        <mxCell id="services" value="服务层" style="swimlane;startSize=20;fillColor=#ffe0b2;strokeColor=#f57c00;fontStyle=1;fontSize=12;align=center;" vertex="1" parent="backend">
          <mxGeometry x="240" y="50" width="240" height="100" as="geometry" />
        </mxCell>
        <mxCell id="authsvc" value="AuthService" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#ffe0b2;strokeColor=#f57c00;fontSize=10;" vertex="1" parent="services">
          <mxGeometry x="20" y="40" width="50" height="40" as="geometry" />
        </mxCell>
        <mxCell id="usersvc" value="UserService" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#ffe0b2;strokeColor=#f57c00;fontSize=10;" vertex="1" parent="services">
          <mxGeometry x="80" y="40" width="50" height="40" as="geometry" />
        </mxCell>
        <mxCell id="passsvc" value="PassengerService" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#ffe0b2;strokeColor=#f57c00;fontSize=10;" vertex="1" parent="services">
          <mxGeometry x="140" y="40" width="50" height="40" as="geometry" />
        </mxCell>
        <mxCell id="ordersvc" value="OrderService" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#ffe0b2;strokeColor=#f57c00;fontSize=10;" vertex="1" parent="services">
          <mxGeometry x="20" y="85" width="50" height="40" as="geometry" />
        </mxCell>
        <mxCell id="ticketsvc" value="TicketService" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#ffe0b2;strokeColor=#f57c00;fontSize=10;" vertex="1" parent="services">
          <mxGeometry x="80" y="85" width="50" height="40" as="geometry" />
        </mxCell>

        <!-- Mapper Layer -->
        <mxCell id="mappers" value="数据访问层" style="swimlane;startSize=20;fillColor=#f3e5f5;strokeColor=#7b1fa2;fontStyle=1;fontSize=12;align=center;" vertex="1" parent="backend">
          <mxGeometry x="20" y="170" width="460" height="100" as="geometry" />
        </mxCell>
        <mxCell id="usermapper" value="UserMapper" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#f3e5f5;strokeColor=#7b1fa2;fontSize=10;" vertex="1" parent="mappers">
          <mxGeometry x="20" y="40" width="60" height="40" as="geometry" />
        </mxCell>
        <mxCell id="passmapper" value="PassengerMapper" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#f3e5f5;strokeColor=#7b1fa2;fontSize=10;" vertex="1" parent="mappers">
          <mxGeometry x="90" y="40" width="60" height="40" as="geometry" />
        </mxCell>
        <mxCell id="trainmapper" value="TrainMapper" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#f3e5f5;strokeColor=#7b1fa2;fontSize=10;" vertex="1" parent="mappers">
          <mxGeometry x="160" y="40" width="60" height="40" as="geometry" />
        </mxCell>
        <mxCell id="ordermapper" value="OrderMapper" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#f3e5f5;strokeColor=#7b1fa2;fontSize=10;" vertex="1" parent="mappers">
          <mxGeometry x="230" y="40" width="60" height="40" as="geometry" />
        </mxCell>
        <mxCell id="ticketmapper" value="TicketInventoryMapper" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#f3e5f5;strokeColor=#7b1fa2;fontSize=10;" vertex="1" parent="mappers">
          <mxGeometry x="300" y="40" width="60" height="40" as="geometry" />
        </mxCell>

        <!-- Config Layer -->
        <mxCell id="config" value="配置层" style="swimlane;startSize=20;fillColor=#ffebee;strokeColor=#d32f2f;fontStyle=1;fontSize=12;align=center;" vertex="1" parent="backend">
          <mxGeometry x="380" y="50" width="100" height="100" as="geometry" />
        </mxCell>
        <mxCell id="securitycfg" value="SecurityConfig" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#ffcdd2;strokeColor=#d32f2f;fontSize=9;" vertex="1" parent="config">
          <mxGeometry x="15" y="40" width="70" height="30" as="geometry" />
        </mxCell>
        <mxCell id="rediscfg" value="RedisConfig" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#ffcdd2;strokeColor=#d32f2f;fontSize=9;" vertex="1" parent="config">
          <mxGeometry x="15" y="75" width="70" height="30" as="geometry" />
        </mxCell>

        <!-- Database -->
        <mxCell id="database" value="MySQL&#xa;数据库" style="shape=cylinder3;whiteSpace=wrap;html=1;fillColor=#e3f2fd;strokeColor=#1976d2;fontSize=12;" vertex="1" parent="1">
          <mxGeometry x="1020" y="250" width="100" height="100" as="geometry" />
        </mxCell>

        <!-- Frontend-Backend connections -->
        <mxCell id="fb_c1" style="edgeStyle=orthogonalEdgeStyle;rounded=1;orthogonalLoop=1;jettySize=auto;html=1;endArrow=block;endFill=1;strokeColor=#1976d2;dashed=1;" edge="1" parent="1" source="authapi" target="authctrl">
          <mxGeometry relative="1" as="geometry" />
        </mxCell>
        <mxCell id="fb_c2" style="edgeStyle=orthogonalEdgeStyle;rounded=1;orthogonalLoop=1;jettySize=auto;html=1;endArrow=block;endFill=1;strokeColor=#1976d2;dashed=1;" edge="1" parent="1" source="passstore" target="passctrl">
          <mxGeometry relative="1" as="geometry" />
        </mxCell>

        <!-- Backend internal connections -->
        <mxCell id="be_c1" style="edgeStyle=orthogonalEdgeStyle;rounded=1;orthogonalLoop=1;jettySize=auto;html=1;endArrow=block;endFill=1;strokeColor=#7b1fa2;" edge="1" parent="1" source="authctrl" target="authsvc">
          <mxGeometry relative="1" as="geometry" />
        </mxCell>
        <mxCell id="be_c2" style="edgeStyle=orthogonalEdgeStyle;rounded=1;orthogonalLoop=1;jettySize=auto;html=1;endArrow=block;endFill=1;strokeColor=#7b1fa2;" edge="1" parent="1" source="passctrl" target="passsvc">
          <mxGeometry relative="1" as="geometry" />
        </mxCell>
        <mxCell id="be_c3" style="edgeStyle=orthogonalEdgeStyle;rounded=1;orthogonalLoop=1;jettySize=auto;html=1;endArrow=block;endFill=1;strokeColor=#7b1fa2;" edge="1" parent="1" source="authsvc" target="usermapper">
          <mxGeometry relative="1" as="geometry" />
        </mxCell>
        <mxCell id="be_c4" style="edgeStyle=orthogonalEdgeStyle;rounded=1;orthogonalLoop=1;jettySize=auto;html=1;endArrow=block;endFill=1;strokeColor=#7b1fa2;" edge="1" parent="1" source="passsvc" target="passmapper">
          <mxGeometry relative="1" as="geometry" />
        </mxCell>
        <mxCell id="be_c5" style="edgeStyle=orthogonalEdgeStyle;rounded=1;orthogonalLoop=1;jettySize=auto;html=1;endArrow=block;endFill=1;strokeColor=#7b1fa2;" edge="1" parent="1" source="ordersvc" target="ordermapper">
          <mxGeometry relative="1" as="geometry" />
        </mxCell>
        <mxCell id="be_c6" style="edgeStyle=orthogonalEdgeStyle;rounded=1;orthogonalLoop=1;jettySize=auto;html=1;endArrow=block;endFill=1;strokeColor=#7b1fa2;" edge="1" parent="1" source="ordersvc" target="ticketsvc">
          <mxGeometry relative="1" as="geometry" />
        </mxCell>
        <mxCell id="be_c7" style="edgeStyle=orthogonalEdgeStyle;rounded=1;orthogonalLoop=1;jettySize=auto;html=1;endArrow=block;endFill=1;strokeColor=#00796b;" edge="1" parent="1" source="ticketmapper" target="database">
          <mxGeometry relative="1" as="geometry" />
        </mxCell>
        <mxCell id="be_c8" style="edgeStyle=orthogonalEdgeStyle;rounded=1;orthogonalLoop=1;jettySize=auto;html=1;endArrow=block;endFill=1;strokeColor=#00796b;" edge="1" parent="1" source="usermapper" target="database">
          <mxGeometry relative="1" as="geometry" />
        </mxCell>
        <mxCell id="be_c9" style="edgeStyle=orthogonalEdgeStyle;rounded=1;orthogonalLoop=1;jettySize=auto;html=1;endArrow=block;endFill=1;strokeColor=#00796b;" edge="1" parent="1" source="passmapper" target="database">
          <mxGeometry relative="1" as="geometry" />
        </mxCell>

      </root>
    </mxGraphModel>
  </diagram>
</mxfile>
