urbanops · tech-sharing

城市运营全域平台
技术架构深度解析

从业务架构到技术架构,从单体模块到微服务演进——一文讲透全域平台。

架构组platform infra · 50 min + Q&A

agenda.yaml

今日路线图

01项目概述与业务背景~3min
02业务架构全景与业务布局~8min
03技术架构总览与分层设计~8min
04核心技术栈与基础设施层~6min
05数据存储与多数据库策略~5min
06模块调用逻辑与通信机制~6min
07安全权限与可观测性~5min
08部署架构与后续规划~5min
09总结 & Q&A~4min

// overview

UrbanOps 全域平台:
智慧城市运营管理底座

基于 RuoYi-Vue-Pro 演进而来,面向城市园林绿化、工单调度、流程协同的综合运营管理平台。

17
Maven 模块
7
激活业务模块
10+
数据库支持
3.5.5
Spring Boot
MIT
开源协议

后端技术基石

Java 17 · Spring Boot 3.5.5 · MyBatis Plus 3.5.14 · Spring Security 6.x · Flowable 7.0 · Redisson 3.51 · SkyWalking 9.5 · RocketMQ · Vert.x + MQTT

前端生态

Vue3 + element-plus 管理后台 · Vue3 + vben(ant-design-vue) 高级后台 · uni-app 移动端 · 大屏报表设计器 · 代码生成器一键生成前后端

business · architecture

业务架构全景:
四大核心域 + 三大支撑域

🌳

智慧园林管理

树木资产管理、巡检计划、养护计划、绩效评估、物料出入库、机械成本核算

Garden巡检养护绩效
📋

工单调度系统

事件上报、工单流转、物料明细、附件管理、地理位置编码、园林事件映射

Workorder事件物料
🔄

工作流引擎

Flowable 驱动,仿钉钉/飞书 + BPMN 双设计器,会签、或签、转办、委派、加签全覆盖

BPMFlowable审批
🌐

全局业务管理

问题上报、道路信息、工单提交详情、流程路径想法、跨模块数据聚合

Global道路问题
⚙️

系统管理

用户/角色/菜单/部门/岗位管理、租户与套餐、字典、通知公告、应用管理

SystemRBAC多租户
🏗️

基础设施

代码生成、文件存储、定时任务、配置管理、消息队列、API 日志、监控追踪

Infra代码生成监控

garden · smart-greening

核心业务:智慧园林管理

覆盖园林绿化全生命周期——从资产登记到巡检养护,从绩效评估到成本核算。

管理端
🌲

树木资产管理

古树名木 / 变更日志

📅

巡检计划管理

计划制定 / 明细配置

🔧

养护计划管理

养护任务 / 执行跟踪

📊

绩效管理

指标定义 / 专家评定

📦

物料管理

物料类型 / 出入库

💰

机械成本

折旧 / 租赁核算

移动端
📱

首页概览

数据汇总

📍

GPS 定位

位置上报

巡检提交

现场打卡

🛠️

养护提交

任务执行

📝

变更记录

树木变更

定时任务

自动生成巡检/养护计划

数据权限

按区域隔离园林数据

时间区间

灵活配置任务执行周期

防重复提交

计划明细幂等性保证

workorder · dispatch

工单调度:事件驱动 + 流程闭环

工单核心实体模型

📋 MainInfo — 工单主信息
📎 Attachment — 附件管理
📦 MaterialDetail — 物料明细
🎯 EventInfo — 事件信息
🔗 EventMappingInfo — 事件映射
🌳 GardenRef — 园林业务关联

工单处理流程

📝

事件上报

🔍

工单生成

👤

人员指派

🔧

现场处理

📋

结果反馈

审核结单

WorkorderModule → GardenModule (Feign API) · EventMapping 策略 · GeoCode 位置服务 · 数据权限隔离

bpm · flowable-engine

工作流引擎:同时支持
「轻量配置」与「深度编排」

SIMPLE 设计器

仿钉钉/飞书体验,拖拽搭建表单流程,10 分钟完成配置

✦ 拖拽式表单设计
✦ 审批节点可视化配置
✦ 抄送人 / 条件分支
✦ 超时审批 / 自动提醒

BPMN 设计器

基于 BPMN 2.0 标准,适配复杂多层级审批及自动化场景

✦ 会签 / 或签 / 依次审批
✦ 转办 / 委派 / 加签 / 减签
✦ 并行 / 包容 / 路由分支
✦ 父子流程 / 触发节点

Flowable 7.0

核心流程引擎

信创数据库兼容

DM8 / KingBase / OpenGauss

动态表单

节点级只读/编辑/隐藏权限

global · system · infra

业务支撑域:
公共服务与系统管理

🌐 Global 全局模块

问题上报管理

公共问题发现 → 流转到工单系统

道路信息管理

道路基础数据维护

工单提交详情

跨模块工单数据聚合视图

流程路径想法

流程优化建议收集

⚙️ System + Infra 模块

RBAC 权限体系

用户 → 角色 → 菜单 → 按钮权限 · 数据权限

SaaS 多租户

租户管理 · 套餐配置 · 数据隔离 · 透明化封装

代码生成器

一键生成 Java · Vue · SQL · 接口文档

消息通知中心

短信 · 邮件 · 站内信 · 多通道

architecture · layers

技术架构五层模型

从用户端到底层基础设施,清晰分层、逐级解耦。

接入层
🖥️

Web Admin

Vue3 + Element Plus

📱

Mobile App

uni-app 跨端

📊

大屏展示

GoView 可视化

🔗

开放 API

第三方对接

网关层
🔐

认证鉴权

Spring Security + Token

🚪

路由转发

Nginx / Gateway

⚖️

负载均衡

多实例分发

🛡️

安全防护

XSS / CSRF / SQL注入

服务层
🌳

Garden

园林管理

📋

Workorder

工单调度

🔄

BPM

工作流

🌐

Global

全局服务

⚙️

System

系统管理

🏗️

Infra

基础设施

中间件
🗄️

MySQL

OLTP

Redis

缓存/锁

📨

RocketMQ

消息队列

🔍

Elasticsearch

全文检索

📡

TDengine

时序数据

backend · layered

后端分层架构:
Controller → Service → DAL 三层解耦

controller/

接收请求、参数校验、VO 转换

admin/app/VO 对象@Valid

service/

业务逻辑编排、事务管理、策略模式

接口+实现@Transactional策略Listener

dal/

数据访问层:MySQL Mapper + Redis Cache

mysql/redis/dataobject/

convert/

MapStruct 对象转换层,编译期生成高性能映射代码

api/

模块间 Feign 接口定义 + DTO,实现跨模块调用

mq/ + job/

异步消息(producer/consumer)+ 定时任务调度

framework/

模块内框架代码:数据权限配置、Web 配置、操作日志等

framework · starters

基础设施层:
15 个 Spring Boot Starter

将通用能力抽象为可复用的 Starter 组件,所有业务模块按需引入。

🌐

web

全局异常处理 · 统一返回 · CORS · Swagger

🔐

security

Spring Security · Token 鉴权 · SSO

🗄️

mybatis

MyBatis Plus · 多数据源 · 联表查询

redis

Redisson · 分布式锁 · 缓存策略

📨

mq

RocketMQ 集成 · 消息幂等 · 重试

🛡️

protection

分布式锁 · 幂等 · 限流 · 熔断

📊

monitor

SkyWalking · Admin · 日志中心

job

Quartz 定时任务 · 执行日志

📝

excel

FastExcel 导入导出

🔌

websocket

实时通信 · Token 校验 · 集群

🏢

biz-tenant

多租户数据隔离 · 透明封装

🔒

biz-data-permission

数据权限 · 行级过滤

tech-stack · ecosystem

核心技术栈全景

核心框架

Spring Boot 3.5.5Spring MVC 6.xSpring Security 6.x
🗄️

持久层

MyBatis Plus 3.5.14Druid 1.2.27Dynamic-DS 4.3.1

缓存 & 锁

Redis 7.xRedisson 3.51Lock4j 2.2.7
📨

消息队列

RocketMQSpring-RocketMQRedis Stream
🔄

工作流

Flowable 7.0.1BPMN 2.0SIMPLE 设计器
📡

IoT & 通信

Vert.x 4.5.13Netty 4.2.4MQTT 1.2.5
🔍

可观测性

SkyWalking 9.5Admin 3.5.2OpenTracing
📋

API 文档

Springdoc 2.8.11Knife4j 4.5.0Swagger 3
🔌

插件 & 工具

PF4J 0.9.0MapStruct 1.6.3Hutool 5.8+6.0
🧪

测试

JUnit 5Mockito 5.xJedis-Mock
🗄️

多数据库

MySQL 8.xDM8KingBaseOpenGauss
🐳

部署运维

DockerK8sJenkinsHarbor

database · strategy

数据存储策略:
多数据源 + 多数据库 + 读写分离

Dynamic-Datasource 多数据源

一主多从读写分离
@DS 注解切换数据源
多库事务(本地事务 + 补偿)
Druid 连接池监控

Redis 缓存体系

○ Redisson 分布式锁 · 幂等键
○ Redis Stream 轻量 MQ
○ 菜单/字典/租户权限缓存
○ Token 存储 & 在线用户管理

多数据库兼容矩阵

MySQL 5.7 / 8.0+ — 主力库
达梦 DM8 — 国产信创
人大金仓 KingBase 8.6 — 信创
OpenGauss 5.1 — 华为开源
Oracle / PostgreSQL / SQL Server
TDengine 3.7 — IoT 时序数据

数据隔离策略

SaaS 多租户:共享数据表 + tenant_id 字段隔离,biz-tenant Starter 透明拦截 SQL,自动添加租户条件

invocation · communication

模块调用逻辑:
三种通信通道

Feign API
System → Dept APISystem → User APISystem → Dict APIWorkorder → Garden APIGarden → System API
▼ 同步调用 · 模块间 RPC · 请求/响应模式 ▼
MQ 消息
SMS Producer → ConsumerMail Producer → ConsumerEvent → 多消费者RocketMQ TopicRedis Stream
▼ 异步解耦 · 事件驱动 · 最终一致性 ▼
直接依赖
Server → All ModulesWorkorder → Garden ServiceBPM → System UserGarden → Infra File

api/ 包设计

每个模块暴露 Feign 接口 + DTO,其他模块引入依赖即可调用,编译期类型安全。

mq/ 包设计

Producer 发送消息,Consumer 消费处理。SMS / Mail 异步发送,不解耦主流程。

service/ 直接注入

同模块内 Service 互相注入。跨模块通过 api 包或直接依赖。

async · event-driven

异步消息与事件驱动

RocketMQ 消息架构

📤 Producer: 业务服务发送消息到 Topic
📥 Consumer: 独立消费组拉取并处理
🔄 重试机制: 消费失败自动重试
⚡ 顺序消息: 全局/分区有序
🔒 事务消息: 分布式事务最终一致性

典型异步场景

📧 SMS 发送 → MQ 异步 → 消费者推送
📨 邮件发送 → MQ 异步 → 消费者投递
🔔 站内信通知 → Redis Stream 广播
📋 操作日志 → 异步记录不影响主流程
🔄 工单事件 → MQ 通知园林模块更新

定时任务 (Quartz)

巡检计划自动生成 · 养护计划定时创建 · 数据统计报表 · 超时任务自动处理

服务保障 (Protection)

@Lock4j 分布式锁防并发 · @Idempotent 幂等性 · @RateLimiter 限流保护 · 熔断降级

security · auth · tenant

安全与权限体系

🔐 认证体系

  • Spring Security 6.x 核心
  • Token + Redis 无状态会话
  • OAuth2 授权码模式
  • 多终端(Web / App / 小程序)
  • SSO 单点登录
  • 社交登录(JustAuth)

🛡️ 授权体系

  • RBAC:用户 → 角色 → 菜单
  • 按钮级别权限控制
  • 动态菜单加载
  • Redis 缓存权限信息
  • 数据权限:行级过滤
  • 部门数据范围隔离

🏢 多租户

  • tenant_id 字段隔离
  • MyBatis 拦截器自动注入
  • 租户套餐权限定制
  • 每个租户独立菜单/角色
  • 透明化封装无侵入
  • 支持租户禁用/过期
SystemModule → Security Starter → Token + Redis → @PreAuthorize → DataPermission AOP → SQL Interceptor

observability · monitoring

可观测性与监控体系

📝 日志体系

Logback + SkyWalking Logback Appender,TraceId 自动注入,一键关联链路

操作日志登录日志API 访问日志错误日志

📊 指标监控

Spring Boot Admin 应用监控 + Druid SQL 监控 + Redis 监控面板

JVM 指标连接池QPS/RT慢 SQL

🔍 链路追踪

Apache SkyWalking 9.5 分布式追踪,服务拓扑自动发现

调用链拓扑图慢端点告警

Monitor Starter 集成

SkyWalking · Admin Client · OpenTracing · 日志中心 · 一键接入

保护机制

分布式锁 (Lock4j) · 幂等性保证 · 限流降级 · 异常全局处理 · 错误码统一管理

deployment · ci-cd

部署架构与 CI/CD 流水线

🚀

CI 持续集成

  • Jenkins Pipeline
  • Maven 多模块构建
  • 单元测试 + 代码扫描
  • Docker 镜像构建
  • 推送 Harbor 私有仓库
☸️

容器编排

  • Kubernetes 集群
  • Deployment 滚动更新
  • Service 服务发现
  • ConfigMap 配置管理
  • Ingress 流量入口
📊

运维监控

  • Prometheus + Grafana
  • SkyWalking 链路追踪
  • ELK 日志收集
  • AlertManager 告警
  • Admin 应用监控

Dockerfile — 多阶段构建

urbanops-server/Dockerfile
# Stage 1: 构建
FROM maven:3.9-eclipse-temurin-17 AS builder
COPY . /app && WORKDIR /app
RUN mvn clean package -DskipTests

# Stage 2: 运行
FROM eclipse-temurin:17-jre
COPY --from=builder /app/urbanops-server/target/*.jar app.jar
ENTRYPOINT ["java","-jar","/app.jar"]

roadmap · planning

后续扩展规划

Phase 1 · 近期

🏗️ 架构夯实

  • 完善 IoT 设备接入能力 (MQTT + Vert.x)
  • 会员中心模块激活 (Member)
  • 支付系统集成 (Pay)
  • 微信公众号接入 (MP)
  • 数据报表与大屏 (Report)
  • 完善单元测试覆盖率
Phase 3 · 远期

🌐 平台化

  • 多租户 SaaS 化运营
  • 开放平台 & API 市场
  • 低代码/无代码搭建
  • PF4J 插件生态
  • 边缘计算 + IoT 规模化
  • 数据中台 & 智能决策
Q2 2025

物联网接入打通

MQTT 协议适配 · 设备影子 · 数据上行 · TDengine 时序存储

Q3 2025

业务模块激活

Member + Pay + MP + Report 模块上线,补齐业务闭环

Q4 2025

微服务演进

核心域拆分 · Spring Cloud 迁移 · 服务独立部署

// key-takeaways

五个核心要点

1 · 业务驱动架构

智慧园林 + 工单调度 + 流程协同,三大核心域支撑城市运营。

2 · 分层清晰可扩展

15 个 Starter 组件化,模块间 Feign API + MQ 双通道解耦。

3 · 信创全栈兼容

MySQL / DM8 / KingBase / OpenGauss 多数据库无缝切换。

4 · 可观测性内置

SkyWalking + Admin + 日志中心,三大支柱保障系统可靠。

5 · 渐进式演进

从模块化到微服务化,从单应用到平台化,路径清晰可落地。

?

Questions & Discussion

感谢聆听 · 欢迎交流

#urbanops #spring-boot #microservices #smart-garden #cloud-native