# 福建水务营收系统架构设计文档 ## 文档信息 | 项目信息 | 详情 | |---------|------| | **项目名称** | 福建水务营收系统 | | **文档类型** | 概要设计文档 | | **技术框架** | RuoYi-Vue-Pro + yudao-ui-admin-vue3 | | **文档版本** | v1.0 | | **编写日期** | 2024-12-19 | | **文档状态** | ✅ 基本完成 | ## 目录 - [一、系统架构概述](#一系统架构概述) - [二、技术架构](#二技术架构) - [三、应用架构](#三应用架构) - [四、数据架构](#四数据架构) - [五、安全架构](#五安全架构) - [六、部署架构](#六部署架构) - [七、接口架构](#七接口架构) ## 一、系统架构概述 福建水务营收系统采用多层架构设计,旨在支持集团化的集中管理、统一资源管理的业务需求。系统架构的设计目标是实现"一个业务平台、一网通平台"的建设目标,为集团及下属各分公司提供统一的营业收费系统。 系统架构主要包括以下核心特点: - 多租户架构:支持集团、分公司、营业站点的多层级租户管理模式 - 统一资源服务:统一的数字水务系统运行资源环境 - 统一平台应用:统一业务流程,集中汇集数据 - 统一对外接口:提供标准的接口和能力 ### 1. 系统总体架构图 ```mermaid graph TB subgraph "用户层" A1[Web管理端
yudao-ui-admin-vue3] A2[移动抄表端
uni-app] A3[客户微信端
微信小程序] A4[客户支付宝端
支付宝小程序] end subgraph "网关层" B1[Nginx负载均衡] B2[API网关
统一认证/权限控制] end subgraph "应用层" C1[营收管理
RuoYi-Vue-Pro] C2[客户服务
RuoYi-Vue-Pro] C3[表务管理
RuoYi-Vue-Pro] C4[统计分析
RuoYi-Vue-Pro] end subgraph "服务层" D1[权限服务
Spring Security] D2[工作流服务
Flowable] D3[消息服务
Redis MQ] D4[文件服务
MinIO/OSS] end subgraph "数据层" E1[(OpenGauss 5.0+
主从架构)] E2[(Redis 6.0
集群缓存)] E3[文件存储
分布式存储] end subgraph "外部接口" F1[银行接口
代扣/托收] F2[支付接口
微信/支付宝] F3[短信接口
阿里云/腾讯云] F4[物联网接口
智能水表] end A1 --> B1 A2 --> B1 A3 --> B1 A4 --> B1 B1 --> B2 B2 --> C1 B2 --> C2 B2 --> C3 B2 --> C4 C1 --> D1 C1 --> D2 C1 --> D3 C1 --> D4 C2 --> D1 C2 --> D3 C3 --> D1 C3 --> D2 C4 --> D1 D1 --> E1 D2 --> E1 D3 --> E2 D4 --> E3 C1 --> F1 C1 --> F2 C2 --> F3 C3 --> F4 ``` ### 2. 物理部署架构图 ```mermaid graph TB subgraph "DMZ区域" LB1[负载均衡器
Nginx Cluster] WAF[Web应用防火墙] end subgraph "应用服务区" subgraph "Web服务集群" WEB1[Web服务器1
8核32G] WEB2[Web服务器2
8核32G] end subgraph "应用服务集群" APP1[应用服务器1
16核64G] APP2[应用服务器2
16核64G] end end subgraph "数据服务区" subgraph "数据库集群" DB1[OpenGauss主库
32核128G] DB2[OpenGauss从库
32核128G] end subgraph "缓存集群" REDIS1[Redis主节点
16核32G] REDIS2[Redis从节点
16核32G] REDIS3[Redis哨兵
8核16G] end subgraph "文件存储" FILE1[文件服务器1
8核32G 10TB] FILE2[文件服务器2
8核32G 10TB] end end subgraph "管理服务区" MONITOR[监控服务器
8核16G] BACKUP[备份服务器
8核32G 20TB] JUMP[跳板服务器
4核8G] end Internet --> WAF WAF --> LB1 LB1 --> WEB1 LB1 --> WEB2 WEB1 --> APP1 WEB1 --> APP2 WEB2 --> APP1 WEB2 --> APP2 APP1 --> DB1 APP2 --> DB1 DB1 --> DB2 APP1 --> REDIS1 APP2 --> REDIS1 REDIS1 --> REDIS2 REDIS3 --> REDIS1 REDIS3 --> REDIS2 APP1 --> FILE1 APP2 --> FILE2 FILE1 --> FILE2 MONITOR --> APP1 MONITOR --> APP2 MONITOR --> DB1 MONITOR --> REDIS1 BACKUP --> DB1 BACKUP --> FILE1 ``` ## 二、技术架构 系统采用B/S和M/S相结合的架构模式,具体技术栈如下: ### 1. 技术栈总览图 ```mermaid graph TB subgraph "前端技术栈" FE1[Vue 3.2+ TypeScript] FE2[Element Plus UI] FE3[Vite 构建工具] FE4[Pinia 状态管理] FE5[Vue Router 路由] FE6[Axios HTTP请求] FE7[ECharts 图表] FE8[富文本编辑器] end subgraph "后端技术栈" BE1[Spring Boot 3.x] BE2[Spring Security 6.x] BE3[MyBatis Plus 3.x] BE4[Redis 6.0+] BE5[OpenGauss 5.0+] BE6[Knife4j API文档] BE7[Jackson JSON处理] BE8[Maven 依赖管理] end subgraph "中间件技术栈" MW1[Nginx 负载均衡] MW2[Redis 缓存集群] MW3[Flowable 工作流] MW4[Quartz 定时任务] MW5[MinIO 文件存储] MW6[RocketMQ 消息队列] MW7[ElasticSearch 搜索] MW8[Sentinel 熔断限流] end subgraph "移动端技术栈" MB1[uni-app 跨平台] MB2[uView UI组件] MB3[微信小程序] MB4[支付宝小程序] MB5[H5响应式] MB6[高德地图SDK] MB7[NFC设备接口] end subgraph "监控运维技术栈" OP1[SkyWalking APM] OP2[Spring Boot Admin] OP3[Docker 容器化] OP4[Kubernetes 编排] OP5[Jenkins CI/CD] OP6[Prometheus 监控] OP7[Grafana 仪表盘] OP8[ELK 日志分析] end FE1 --> BE1 FE6 --> BE1 BE1 --> BE2 BE1 --> BE3 BE3 --> BE5 BE1 --> BE4 BE1 --> MW3 BE1 --> MW4 MW1 --> BE1 BE1 --> MW5 BE1 --> MW6 BE1 --> MW7 MW8 --> BE1 MB1 --> BE1 MB3 --> BE1 MB4 --> BE1 OP1 --> BE1 OP2 --> BE1 OP3 --> BE1 OP4 --> OP3 OP5 --> OP4 OP6 --> BE1 OP7 --> OP6 OP8 --> BE1 ``` ### 2. 系统数据流向图 ```mermaid flowchart TD subgraph "数据采集层" A1[移动抄表APP
数据采集] A2[智能水表
远程数据] A3[Web管理端
业务录入] A4[客户端小程序
用户数据] A5[外部系统
接口数据] end subgraph "数据接入层" B1[API网关
数据验证] B2[数据清洗
格式转换] B3[消息队列
异步处理] B4[数据缓存
临时存储] end subgraph "业务处理层" C1[抄表服务
水量计算] C2[收费服务
账单生成] C3[账务服务
财务处理] C4[工单服务
流程处理] C5[统计服务
数据分析] end subgraph "数据存储层" D1[(MySQL主库
核心业务数据)] D2[(MySQL从库
查询数据)] D3[(Redis缓存
热点数据)] D4[文件存储
附件图片] D5[(备份库
历史数据)] end subgraph "数据服务层" E1[查询服务
数据检索] E2[报表服务
统计分析] E3[接口服务
对外开放] E4[推送服务
消息通知] end subgraph "数据展现层" F1[管理后台
业务操作] F2[统计大屏
可视化展示] F3[移动端
现场作业] F4[客户端
自助服务] F5[第三方系统
数据集成] end %% 数据流向关系 A1 --> B1 A2 --> B2 A3 --> B1 A4 --> B1 A5 --> B3 B1 --> B4 B2 --> B3 B3 --> C1 B4 --> C2 C1 --> D1 C2 --> D1 C3 --> D1 C4 --> D1 C5 --> D2 D1 --> D2 D1 --> D3 D1 --> D5 D2 --> E1 D3 --> E1 D1 --> E2 D2 --> E3 E1 --> F1 E2 --> F2 E3 --> F3 E4 --> F4 E3 --> F5 %% 反向数据流 F1 -.-> C2 F3 -.-> C1 F4 -.-> C3 F5 -.-> C4 ``` ### 3. 服务端技术架构 - 操作系统:国产 Linux 操作系统 - 数据库:华为OpenGauss 5.0+数据库,企业级国产数据库 - 应用框架:基于RuoYi-Vue-Pro框架定制开发 - 核心框架:Spring Boot 3.x,支持JDK 17/21 - ORM框架:MyBatis Plus,增强的MyBatis - 权限框架:Spring Security,基于RBAC的权限管理 - 数据缓存:Redis + Redisson,高性能缓存和分布式锁 - 工作流引擎:Flowable,灵活的工作流处理 - 任务调度:基于Quartz的CRON任务调度 - 服务监控:Spring Boot Admin、SkyWalking APM - 消息队列:基于Redis的轻量级消息队列 - 文档生成:Knife4j,基于Swagger的API文档生成 - 代码生成:自动化CRUD和表单代码生成器 - 多租户:基于字段隔离的SaaS多租户设计 #### 2.1 RuoYi-Vue-Pro框架配置示例 **application.yml主配置文件:** ```yaml # 服务端口配置 server: port: 48080 servlet: context-path: /admin-api # Spring Boot 配置 spring: application: name: water-biz-server profiles: active: local # 数据源配置 datasource: druid: url: jdbc:mysql://127.0.0.1:3306/ruoyi-vue-pro?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true username: root password: ${MYSQL_PASSWORD:123456} driver-class-name: com.mysql.cj.jdbc.Driver # 连接池配置 initial-size: 10 min-idle: 10 max-active: 20 max-wait: 60000 time-between-eviction-runs-millis: 60000 min-evictable-idle-time-millis: 300000 validation-query: SELECT 1 FROM DUAL test-while-idle: true test-on-borrow: false test-on-return: false pool-prepared-statements: true max-pool-prepared-statement-per-connection-size: 20 # Redis 配置 redis: host: 127.0.0.1 port: 6379 password: ${REDIS_PASSWORD:} database: 1 timeout: 6000ms lettuce: pool: max-active: 32 max-wait: 6000ms max-idle: 32 min-idle: 8 # MyBatis Plus 配置 mybatis-plus: configuration: map-underscore-to-camel-case: true log-impl: org.apache.ibatis.logging.stdout.StdOutImpl global-config: db-config: id-type: NONE logic-delete-field: deleted logic-delete-value: 1 logic-not-delete-value: 0 type-aliases-package: cn.iocoder.yudao.module.*.dal.dataobject # 水务系统多租户配置 yudao: tenant: enable: true ignore-urls: - /admin-api/water/tenant/get-id-by-name - /admin-api/infra/file/*/get/** ignore-tables: - water_tenant - water_system_config - water_dict_data - water_dict_type # 水务系统安全配置 security: permit-all-urls: - /admin-api/water/auth/login - /admin-api/water/auth/logout - /admin-api/water/auth/refresh-token - /admin-api/water/captcha/get - /admin-api/water/sms/send # 文件存储配置 file: config: type: local local: domain: http://127.0.0.1:48080 path: /Users/yunai/file_test # 短信配置 sms: alibaba: access-key-id: ${SMS_ACCESS_KEY_ID:} access-key-secret: ${SMS_ACCESS_KEY_SECRET:} signature: 福建水务 template-code: SMS_123456 ``` **多租户配置实现:** ```java @Component @Slf4j public class WaterTenantConfiguration { @Resource private TenantProperties tenantProperties; /** * 多租户字段处理器 */ @Bean public TenantLineHandler tenantLineHandler() { return new TenantLineHandler() { @Override public Expression getTenantId() { // 从当前登录用户上下文获取租户ID Long tenantId = TenantContextHolder.getTenantId(); if (tenantId == null) { return null; } return new LongValue(tenantId); } @Override public String getTenantIdColumn() { return "tenant_id"; } @Override public boolean ignoreTable(String tableName) { // 忽略的表不进行多租户处理 return tenantProperties.getIgnoreTables().contains(tableName); } }; } /** * 多租户拦截器 */ @Bean public MybatisPlusInterceptor mybatisPlusInterceptor() { MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor(); // 多租户插件 TenantLineInnerInterceptor tenantInterceptor = new TenantLineInnerInterceptor(); tenantInterceptor.setTenantLineHandler(tenantLineHandler()); interceptor.addInnerInterceptor(tenantInterceptor); // 分页插件 interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL)); return interceptor; } } ``` **权限控制配置:** ```java @EnableWebSecurity @EnableMethodSecurity(prePostEnabled = true, securedEnabled = true) @Configuration public class WaterSecurityConfiguration { @Resource private SecurityProperties securityProperties; @Bean public SecurityFilterChain filterChain(HttpSecurity httpSecurity, @Lazy TokenAuthenticationFilter tokenAuthenticationFilter) throws Exception { return httpSecurity // 设置 URL 安全权限 .authorizeHttpRequests(c -> c // 1. 静态资源,可匿名访问 .requestMatchers(HttpMethod.GET, "/*.html", "/**/*.html", "/**/*.css", "/**/*.js").permitAll() // 2. 设置 @PermitAll 无需认证 .requestMatchers(securityProperties.getPermitAllUrls().toArray(new String[0])).permitAll() // 3. 兜底规则,必须认证 .anyRequest().authenticated() ) // 设置处理器 .exceptionHandling(c -> c.authenticationEntryPoint(authenticationEntryPoint) .accessDeniedHandler(accessDeniedHandler)) // 添加 Token Filter .addFilterBefore(tokenAuthenticationFilter, UsernamePasswordAuthenticationFilter.class) // 不创建 SecurityContext .sessionManagement(c -> c.sessionCreationPolicy(SessionCreationPolicy.STATELESS)) // 禁用 CSRF,因为使用 token 机制 .csrf(AbstractHttpConfigurer::disable) // 禁用 cors .cors(AbstractHttpConfigurer::disable) .build(); } } ``` ### 3. 客户端技术架构 - 前端框架:基于yudao-ui-admin-vue3框架定制开发 - 核心框架:Vue 3.x + TypeScript - 组件库:Element Plus,现代化UI组件 - 状态管理:Pinia,新一代的Vue状态管理库 - 路由管理:Vue Router - HTTP工具:Axios,请求拦截与统一处理 - CSS框架:Tailwind CSS / UnoCSS,原子化CSS - 图表组件:ECharts,强大的可视化图表库 - 富文本编辑器:WangEditor - 文件上传:基于Element Plus的上传组件 - 权限控制:细粒度的按钮级权限控制 - 动态表格:支持拖拽、排序、筛选 - 代码规范:ESLint + Prettier,标准化代码风格 #### 3.1 前端项目结构配置 **package.json 依赖配置:** ```json { "name": "water-biz-ui-admin", "version": "1.0.0", "description": "福建水务营收系统管理后台", "dependencies": { "@element-plus/icons-vue": "^2.1.0", "@vueuse/core": "^10.5.0", "axios": "^1.6.0", "echarts": "^5.4.3", "element-plus": "^2.4.2", "pinia": "^2.1.7", "vue": "^3.3.8", "vue-router": "^4.2.5", "@wangeditor/editor": "^5.1.23", "@wangeditor/editor-for-vue": "^5.1.12" }, "devDependencies": { "@types/node": "^20.8.7", "@typescript-eslint/eslint-plugin": "^6.9.1", "@typescript-eslint/parser": "^6.9.1", "@vitejs/plugin-vue": "^4.4.1", "eslint": "^8.52.0", "eslint-plugin-vue": "^9.17.0", "prettier": "^3.0.3", "typescript": "^5.2.2", "vite": "^4.5.0", "vue-tsc": "^1.8.22" } } ``` **vite.config.ts 构建配置:** ```typescript import { defineConfig } from 'vite' import vue from '@vitejs/plugin-vue' import { resolve } from 'path' export default defineConfig({ plugins: [vue()], resolve: { alias: { '@': resolve(__dirname, 'src'), '~': resolve(__dirname, 'src'), '#': resolve(__dirname, 'types') } }, server: { host: '0.0.0.0', port: 3000, open: true, proxy: { '/admin-api': { target: 'http://127.0.0.1:48080', changeOrigin: true, ws: true } } }, build: { target: 'es2015', outDir: 'dist', assetsDir: 'static', sourcemap: false, chunkSizeWarningLimit: 1500, rollupOptions: { output: { chunkFileNames: 'static/js/[name]-[hash].js', entryFileNames: 'static/js/[name]-[hash].js', assetFileNames: 'static/[ext]/[name]-[hash].[ext]' } } } }) ``` **src/stores/user.ts 用户状态管理:** ```typescript import { defineStore } from 'pinia' import { ref, computed } from 'vue' import { UserApi, UserVO } from '@/api/system/user' import { getAccessToken, removeToken } from '@/utils/auth' export const useUserStore = defineStore('user', () => { const userInfo = ref() const permissions = ref([]) const roles = ref([]) const nickname = computed(() => userInfo.value?.nickname ?? '') const avatar = computed(() => userInfo.value?.avatar ?? '') const email = computed(() => userInfo.value?.email ?? '') // 获取用户信息 const getUserInfo = async () => { const res = await UserApi.getUserProfile() userInfo.value = res permissions.value = res.permissions roles.value = res.roles } // 用户登出 const logout = async () => { try { await UserApi.logout() } finally { await resetToken() } } // 重置令牌 const resetToken = async () => { userInfo.value = undefined permissions.value = [] roles.value = [] removeToken() } // 检查权限 const hasPermission = (permission: string) => { return permissions.value.includes(permission) } // 检查角色 const hasRole = (role: string) => { return roles.value.includes(role) } return { userInfo, permissions, roles, nickname, avatar, email, getUserInfo, logout, resetToken, hasPermission, hasRole } }) ``` **src/utils/request.ts HTTP请求封装:** ```typescript import axios, { AxiosResponse, InternalAxiosRequestConfig } from 'axios' import { ElMessage, ElMessageBox } from 'element-plus' import { getAccessToken, getRefreshToken, removeToken } from '@/utils/auth' import { useUserStore } from '@/stores/user' // 创建 axios 实例 const service = axios.create({ baseURL: import.meta.env.VITE_BASE_URL, timeout: 50000, withCredentials: false }) // 请求拦截器 service.interceptors.request.use( (config: InternalAxiosRequestConfig) => { // 添加 token const accessToken = getAccessToken() if (accessToken && config.headers) { config.headers.Authorization = `Bearer ${accessToken}` } // 添加租户ID const tenantId = localStorage.getItem('tenantId') if (tenantId && config.headers) { config.headers['tenant-id'] = tenantId } return config }, error => { console.log(error) return Promise.reject(error) } ) // 响应拦截器 service.interceptors.response.use( (response: AxiosResponse) => { const { data } = response const { code, msg } = data // 业务请求成功 if (code === 0) { return data } // token 过期,尝试刷新 if (code === 401) { return handleTokenExpired() } // 业务请求失败 ElMessage.error(msg || '系统未知错误,请反馈给管理员') return Promise.reject(new Error(msg || 'Error')) }, error => { console.log('err' + error) let { message } = error if (message === 'Network Error') { message = '后端接口连接异常' } else if (message.includes('timeout')) { message = '系统接口请求超时' } else if (message.includes('Request failed with status code')) { message = '系统接口' + message.substr(message.length - 3) + '异常' } ElMessage.error(message) return Promise.reject(error) } ) // 处理 token 过期 const handleTokenExpired = async () => { const userStore = useUserStore() ElMessageBox.alert('登录状态已过期,您可以继续留在该页面,或者重新登录', '系统提示', { confirmButtonText: '重新登录', type: 'warning' }).then(() => { userStore.resetToken().then(() => { location.reload() }) }) } export default service ``` ### 4. 前端技术架构详细设计 #### 4.1 Web管理端架构 (yudao-ui-admin-vue3) **技术栈组成:** ```mermaid graph TB subgraph "开发框架" A1[Vue 3.2.47 Composition API] A2[TypeScript 4.9.4] A3[Vite 4.0.0 构建工具] end subgraph "UI组件库" B1[Element Plus 2.3.14] B2[Element Plus Icons] B3[自定义组件库] end subgraph "状态管理" C1[Pinia 2.0.28] C2[持久化插件] C3[全局状态管理] end subgraph "路由系统" D1[Vue Router 4.1.6] D2[路由守卫] D3[动态路由] D4[权限控制] end subgraph "HTTP通信" E1[Axios 1.2.2] E2[请求拦截器] E3[响应拦截器] E4[错误处理] end subgraph "工具库" F1[Lodash 工具函数] F2[dayjs 时间处理] F3[nprogress 进度条] F4[js-cookie Cookie管理] F5[crypto-js 加密解密] end A1 --> B1 A1 --> C1 A1 --> D1 A1 --> E1 B1 --> B3 C1 --> C2 D1 --> D2 E1 --> E2 ``` **项目结构设计:** ``` yudao-ui-admin-vue3/ ├── public/ # 静态资源 ├── src/ │ ├── api/ # API接口定义 │ │ └── water/ # 水务业务API │ │ ├── customer/ # 客户管理API │ │ ├── meter/ # 抄表管理API │ │ ├── billing/ # 收费管理API │ │ └── workflow/ # 工单管理API │ ├── assets/ # 静态资源 │ ├── components/ # 全局组件 │ │ ├── Dialog/ # 弹窗组件 │ │ ├── Form/ # 表单组件 │ │ ├── Table/ # 表格组件 │ │ └── Upload/ # 上传组件 │ ├── layout/ # 布局组件 │ ├── router/ # 路由配置 │ ├── stores/ # Pinia状态管理 │ ├── styles/ # 全局样式 │ ├── utils/ # 工具函数 │ ├── views/ # 页面组件 │ │ └── water/ # 水务业务页面 │ │ ├── customer/ # 客户管理 │ │ ├── meter/ # 抄表管理 │ │ ├── billing/ # 收费管理 │ │ └── workflow/ # 工单管理 │ └── App.vue ├── types/ # TypeScript类型定义 ├── vite.config.ts # Vite配置 ├── tsconfig.json # TypeScript配置 └── package.json # 项目依赖 ``` **核心配置示例:** ```typescript // vite.config.ts - Vite构建配置 import { defineConfig } from 'vite' import vue from '@vitejs/plugin-vue' import { resolve } from 'path' export default defineConfig({ plugins: [vue()], resolve: { alias: { '@': resolve(__dirname, 'src'), '@/api': resolve(__dirname, 'src/api'), '@/components': resolve(__dirname, 'src/components'), '@/utils': resolve(__dirname, 'src/utils') } }, server: { port: 80, proxy: { '/admin-api': { target: 'http://127.0.0.1:48080', changeOrigin: true, rewrite: (path) => path.replace(/^\/admin-api/, '/admin-api') } } }, build: { outDir: 'dist', sourcemap: false, rollupOptions: { output: { chunkFileNames: 'js/[name]-[hash].js', entryFileNames: 'js/[name]-[hash].js', assetFileNames: '[ext]/[name]-[hash].[ext]' } } } }) ``` #### 4.2 移动端架构 (uni-app) **技术栈组成:** ```mermaid graph TB subgraph "跨平台框架" M1[uni-app 3.x] M2[Vue 3 Composition API] M3[TypeScript支持] end subgraph "UI组件库" N1[uView UI 2.0] N2[uni-ui组件] N3[自定义水务组件] end subgraph "状态管理" O1[Vuex 4.x] O2[uni-app存储] O3[缓存管理] end subgraph "设备能力" P1[相机API
水表拍照] P2[NFC读取
水表标签] P3[GPS定位
抄表轨迹] P4[扫码API
二维码扫描] end subgraph "网络通信" Q1[uni.request
HTTP请求] Q2[WebSocket
实时通信] Q3[文件上传
图片处理] end M1 --> N1 M1 --> O1 M1 --> P1 M1 --> Q1 N1 --> N3 P1 --> P2 Q1 --> Q2 ``` **移动端项目结构:** ``` water-mobile-app/ ├── pages/ # 页面目录 │ ├── index/ # 首页 │ ├── meter/ # 抄表功能 │ │ ├── task/ # 抄表任务 │ │ ├── read/ # 抄表录入 │ │ └── history/ # 抄表历史 │ ├── workflow/ # 工单管理 │ └── personal/ # 个人中心 ├── components/ # 组件目录 │ ├── meter-reader/ # 水表读数组件 │ ├── map-trace/ # 地图轨迹组件 │ └── camera-scan/ # 相机扫描组件 ├── static/ # 静态资源 ├── store/ # 状态管理 ├── utils/ # 工具函数 ├── api/ # 接口定义 ├── manifest.json # 应用配置 └── pages.json # 页面配置 ``` #### 4.3 客户端小程序架构 **微信小程序技术栈:** - 开发框架:微信小程序原生框架 - UI组件:WeUI + 自定义组件 - 状态管理:小程序全局数据管理 - 支付集成:微信支付API - 地图服务:腾讯地图API **支付宝小程序技术栈:** - 开发框架:支付宝小程序原生框架 - UI组件:mini-antui + 自定义组件 - 状态管理:小程序全局数据管理 - 支付集成:支付宝支付API - 地图服务:高德地图API #### 4.4 前端工程化配置 **代码规范:** ```json // .eslintrc.js - ESLint配置 { "extends": [ "@vue/typescript/recommended", "@vue/prettier", "@vue/prettier/@typescript-eslint" ], "rules": { "@typescript-eslint/no-explicit-any": "warn", "@typescript-eslint/no-unused-vars": "error", "vue/multi-word-component-names": "off" } } ``` **构建优化:** - Vite热更新:开发环境快速构建 - 代码分割:按路由和组件懒加载 - 资源压缩:Gzip压缩和图片优化 - CDN加速:静态资源CDN分发 - 缓存策略:浏览器缓存和Service Worker - 移动端: - 核心框架:uni-app(跨平台) - 组件库:uview-ui - 小程序支持:微信小程序、支付宝小程序等 - 移动端地图:高德地图SDK(用于抄表轨迹和导航) - 设备接入:NFC、扫码、相机等硬件设备接口 ### 2.3 技术特性 - 单点登录:OAuth2 + JWT实现统一认证 - 数据交换:基于RESTful API的系统内部数据交换与共享 - 统一报表平台:集成JimuReport,支持自定义报表设计与生成 - 大屏设计:集成GoView,支持可视化大屏设计 - 安全保障:满足安全等保三级要求 - 密码加密:BCrypt加密算法 - 防XSS攻击:表单数据过滤 - 防SQL注入:参数化查询 - 防CSRF攻击:Token验证 - 性能规格:支持200并发用户,50并发移动设备,系统响应时间不超过3秒 - 扩展容量:支持100万客户的业务量,满足企业3-5年的业务发展需求 - 支持功能: - 支付管理:微信支付、支付宝支付等 - 短信服务:阿里云、腾讯云等多家短信服务商 - AI能力: - 智能抄表:基于图像识别的水表读数 - 异常分析:基于AI的用水异常分析 - API网关:支持API权限管理、限流熔断、白名单控制 ## 3. 应用架构 ### 1. 微服务应用架构图 ```mermaid graph TB subgraph "网关层" GW[API网关
Spring Cloud Gateway] AUTH[认证服务
OAuth2 + JWT] end subgraph "基础服务层" subgraph "系统服务" SYS[系统管理服务
用户/角色/权限] TENANT[租户管理服务
多租户隔离] FILE[文件管理服务
附件存储] MSG[消息服务
短信/邮件/推送] end subgraph "工作流服务" WF[工作流引擎
Flowable] TASK[任务调度服务
Quartz] end end subgraph "业务服务层" subgraph "客户域服务" CUST[客户管理服务
Customer Service] METER[水表管理服务
Meter Service] ADDR[地址管理服务
Address Service] end subgraph "营收域服务" READ[抄表服务
Reading Service] BILL[账单服务
Billing Service] PAY[收费服务
Payment Service] ACC[账务服务
Accounting Service] end subgraph "运营域服务" ORDER[工单服务
Workflow Service] RPT[报表服务
Report Service] STATS[统计分析服务
Statistics Service] end subgraph "接口域服务" BANK[银行接口服务
Bank Service] PAY_GW[支付网关服务
Payment Gateway] IOT[物联网服务
IoT Service] SMS[短信服务
SMS Service] end end subgraph "数据层" subgraph "业务数据库" DB_CUST[(客户库
Customer DB)] DB_BILL[(营收库
Billing DB)] DB_RPT[(报表库
Report DB)] end subgraph "缓存与存储" REDIS[(Redis集群
缓存/会话)] ES[(ElasticSearch
搜索引擎)] FILE_STORE[文件存储
MinIO/OSS] end end %% 网关层连接 GW --> AUTH GW --> SYS GW --> CUST GW --> READ GW --> ORDER %% 服务间调用 CUST --> METER CUST --> ADDR READ --> METER READ --> CUST BILL --> READ BILL --> CUST PAY --> BILL ACC --> PAY ORDER --> WF ORDER --> TASK RPT --> STATS %% 外部接口调用 PAY --> BANK PAY --> PAY_GW READ --> IOT ORDER --> SMS %% 数据层连接 CUST --> DB_CUST METER --> DB_CUST BILL --> DB_BILL PAY --> DB_BILL RPT --> DB_RPT SYS --> REDIS AUTH --> REDIS CUST --> REDIS BILL --> ES FILE --> FILE_STORE ``` ### 2. 服务治理架构 ```mermaid graph TB subgraph "服务发现与注册" NACOS[Nacos注册中心
服务注册/发现/配置] end subgraph "服务网格层" subgraph "负载均衡" LB[Ribbon负载均衡
客户端负载均衡] FEIGN[OpenFeign
服务间调用] end subgraph "容错保护" CB[Sentinel熔断器
流量控制/熔断降级] RETRY[重试机制
失败重试] end subgraph "链路追踪" TRACE[SkyWalking
分布式链路追踪] METRIC[Micrometer
指标收集] end end subgraph "配置管理" CONFIG[Nacos Config
配置中心] SECRET[配置加密
敏感信息保护] end subgraph "监控告警" MONITOR[Spring Boot Admin
应用监控] ALERT[告警系统
异常通知] LOG[ELK日志系统
日志聚合分析] end NACOS --> LB NACOS --> FEIGN LB --> CB FEIGN --> TRACE CB --> RETRY CONFIG --> SECRET MONITOR --> ALERT TRACE --> LOG ``` 系统应用架构基于业务域划分,主要包括以下核心应用模块: ### 3.1 统一平台 - 单点登录:统一认证入口,支持多种登录方式 - 系统管理:组织机构、员工管理、角色权限管理、菜单配置等 - 流程节点提醒:工作流节点到期和状态变更提醒 ### 3.2 营收系统 - 系统管理:水价管理、用户档案管理、更名过户管理等 - 抄表开账:册本管理、抄表录入、复核开账等 - 收费管理:柜台收费、特殊开账、柜台结账、批量缴费等 - 账务处理:预存调整、未销调整、已销调整、分账调整等 - 发票管理:发票查询、发票开具、电子发票等 - 代收业务:实时收费、银行代扣、银行托收等 - 环卫系统:计费核定、计费退补、计费减免等 - 业务工单:业务清单、上报清单、稽查工单、移表工单等 ### 3.3 客户服务 - 微信、支付宝服务窗:账户绑定、用水查询、在线缴费等 - 历史账单:账单查询、用水分析、账单推送等 - 电子发票:发票申请、发票查询、发票下载等 - 营业网点:网点查询、网点导航、业务指南等 - 账户流水:流水查询、明细下载、交易统计等 - 微网厅:用户注册、信息查询、业务办理等 ### 3.4 表务系统 - 表务工单:换表工单、移表工单、拆表工单、复装工单等 - 表务仓库:新表入库、水表检定、水表领用、水表出库等 - 水表参数与基础信息:水表厂家管理、水表型号管理等 - 物联网对接与数据同步:厂家设备信息管理、远程抄表数据同步等 ### 3.5 报装管理 - 报装流程:报装申请、方案设计、合同签订、施工管理等 - 一户一表管理:改造计划、改造实施、用户转换等 ### 3.6 统计分析 - 报表查询:标准报表、自定义报表、报表导出打印等 - 欠费查询:欠费情况统计、欠费用户明细、欠费分析等 - 缴费记录:缴费情况统计、缴费明细查询、缴费趋势分析等 - 用水分析:用水量统计、用水趋势分析、异常用水分析等 ### 3.7 工程管理 - 工程申请:工程立项、材料提交、前期勘察等 - 工程施工:施工计划、施工派工、施工记录等 - 工程验收:验收申请、验收检查、验收记录等 - 工程查询:工程进度查询、工程资料查询、工程统计等 ### 3.8 抄表APP - 首页功能:首页展示、个人信息、快捷查询等 - 抄表功能:抄表任务、NFC抄表、扫码抄表、AI录入等 - 工单管理:问题上报、问题回填、代办工单、稽查工单等 ### 3.9 接口服务 - API市场:API展示、API使用说明、API测试等 - API管理:API申请、API调度看板、接口服务配置管理等 - 接口权限管理:授权管理、白名单管理、安全策略等 - 系统对外接口:查询接口、业务处理接口、状态同步接口等 ### 3.10 系统配置 - 水表参数:水表厂家、水表型号、水表量程等 - 地址参数:行政区划、地址编码、地址库等 - 价格体系:用水性质、水价标准、阶梯水价等 - 基本配置:系统参数、业务规则、打印模板等 - 催缴管理:催缴计划、催缴任务、催缴执行等 - 用户权限:菜单权限、功能权限、数据权限等 - 定时任务:任务配置、任务监控、任务日志等 ## 4. 数据架构 系统数据架构基于客户关系数据库为核心和基础,实现客户全生命周期管理。 ### 4.1 数据分层 - 数据采集层:负责从各业务系统和物联网设备采集原始数据 - 数据存储层:统一数据存储,实现分布式数据管理 - 数据服务层:提供数据服务接口 - 数据展现层:提供数据分析和可视化功能 ### 4.2 OpenGauss数据库架构 #### 4.2.1 主从高可用架构 ```mermaid graph TB subgraph "OpenGauss高可用集群" MASTER[("OpenGauss主库
Primary Node
读写操作")] STANDBY[("OpenGauss备库
Standby Node
只读操作")] CASCADE[("OpenGauss级联备库
Cascade Standby
负载分担")] end subgraph "应用层" APP1[应用服务器1] APP2[应用服务器2] APP3[应用服务器3] end subgraph "连接池" POOL[连接池
HikariCP
Druid] end subgraph "监控管理" MON[OpenGauss Monitor
性能监控] BACKUP[定时备份
gs_backup] end APP1 --> POOL APP2 --> POOL APP3 --> POOL POOL --> MASTER POOL --> STANDBY POOL --> CASCADE MASTER -.->|流复制| STANDBY STANDBY -.->|级联复制| CASCADE MON --> MASTER MON --> STANDBY BACKUP --> MASTER ``` #### 4.2.2 分片存储架构 ```mermaid graph TB subgraph "OpenGauss分布式架构" subgraph "协调节点" CN1[协调节点1
Coordinator Node] CN2[协调节点2
Coordinator Node] end subgraph "数据节点组1" DN1_1[数据节点1-主
Datanode Primary] DN1_2[数据节点1-备
Datanode Standby] end subgraph "数据节点组2" DN2_1[数据节点2-主
Datanode Primary] DN2_2[数据节点2-备
Datanode Standby] end subgraph "GTM节点" GTM[全局事务管理器
GTM Master] GTM_S[GTM备节点
GTM Standby] end end CN1 --> DN1_1 CN1 --> DN2_1 CN2 --> DN1_1 CN2 --> DN2_1 DN1_1 -.->|主备同步| DN1_2 DN2_1 -.->|主备同步| DN2_2 GTM -.->|备份| GTM_S CN1 --> GTM CN2 --> GTM ``` #### 4.2.3 数据安全架构 ```mermaid graph TB subgraph "安全防护层" TDE[透明数据加密
TDE] RLS[行级安全
Row Level Security] MASK[动态数据脱敏
Dynamic Data Masking] AUDIT[三权分立审计
Separated Audit] end subgraph "访问控制层" RBAC[基于角色的访问控制
RBAC] LDAP[LDAP集成认证
External Auth] SSL[SSL/TLS加密传输
Encrypted Transport] end subgraph "数据存储层" ENCRYPT[存储层加密
Storage Encryption] COMPRESS[数据压缩
Data Compression] BACKUP_ENC[备份加密
Backup Encryption] end TDE --> ENCRYPT RLS --> RBAC MASK --> ENCRYPT AUDIT --> BACKUP_ENC RBAC --> SSL LDAP --> SSL ``` ### 4.3 数据模型设计 - **客户信息模型**:包含客户基础信息、表卡信息、账户信息、联系人信息等 - **业务数据模型**:抄表数据、收费数据、账务数据、发票数据等 - **工单数据模型**:表务工单、报装工单、业务工单等 - **配置数据模型**:系统参数、水表参数、价格体系等 - **报表数据模型**:统计数据、分析数据、预测数据等 - **物联网数据模型**:设备信息、状态信息、实时数据等 ### 4.4 数据集成与共享 - **统一数据标准**:定义统一的数据标准和数据字典,符合OpenGauss规范 - **数据集成机制**:采用OpenGauss XA事务实现系统间的数据一致性 - **数据共享机制**:基于OpenGauss外部数据包装器(FDW)实现跨库数据访问 - **数据同步策略**:支持实时流复制、定时数据同步、批量ETL处理等 ### 4.5 OpenGauss特性应用 #### 4.5.1 性能优化特性 - **向量化执行引擎**:批量数据处理,提升OLAP查询性能30-50% - **列存储引擎**:统计报表类查询,压缩比高达10:1 - **分区表技术**:按月份分区存储抄表数据,支持分区裁剪 - **并行查询**:复杂统计查询自动并行执行 - **智能优化器**:自适应查询计划,持续性能优化 #### 4.5.2 企业级特性 - **在线扩容**:支持不停机新增数据节点 - **故障自愈**:主备节点故障自动切换,RTO < 10秒 - **读写分离**:自动路由读请求到备节点,减轻主库压力 - **负载均衡**:连接池级别的智能负载均衡 - **全量/增量备份**:支持热备份,最小备份粒度到事务级 ## 5. 安全架构 系统安全架构基于OpenGauss数据库的企业级安全特性,满足等保三级要求和国产化安全标准: ### 5.1 网络安全 - **边界防护**:防火墙、入侵检测/防御系统 - **访问控制**:基于角色的访问控制(RBAC) - **通信安全**:SSL/TLS加密传输,支持国密算法 - **安全监控**:实时监控网络安全状态和异常访问 ### 5.2 OpenGauss数据安全架构 #### 5.2.1 数据加密安全 ```mermaid graph TB subgraph "加密层级" L1[传输层加密
SSL/TLS/国密SM] L2[存储层加密
TDE透明数据加密] L3[字段级加密
敏感字段加密] L4[备份加密
备份文件加密] end subgraph "密钥管理" KMS[密钥管理系统
Key Management] HSM[硬件安全模块
Hardware Security] ROT[密钥轮换
Key Rotation] end subgraph "国密算法" SM2[SM2椭圆曲线
非对称加密] SM3[SM3哈希算法
消息摘要] SM4[SM4分组密码
对称加密] end L1 --> KMS L2 --> HSM L3 --> ROT L4 --> KMS KMS --> SM2 HSM --> SM3 ROT --> SM4 ``` #### 5.2.2 访问控制安全 ```mermaid graph TB subgraph "身份认证" AUTH1[用户名密码认证] AUTH2[LDAP集成认证] AUTH3[Kerberos认证] AUTH4[证书认证] end subgraph "权限控制" RBAC[基于角色的权限控制
Role-Based Access Control] RLS[行级安全策略
Row Level Security] CLS[列级安全控制
Column Level Security] TENANT[多租户数据隔离
Multi-Tenant Isolation] end subgraph "审计监控" AUDIT[操作审计日志
Audit Logging] MONITOR[实时安全监控
Security Monitoring] ALERT[安全告警
Security Alert] REPORT[合规报告
Compliance Report] end AUTH1 --> RBAC AUTH2 --> RLS AUTH3 --> CLS AUTH4 --> TENANT RBAC --> AUDIT RLS --> MONITOR CLS --> ALERT TENANT --> REPORT ``` ### 5.3 数据安全特性 - **透明数据加密(TDE)**:自动加密存储数据,支持SM4国密算法 - **行级安全(RLS)**:基于用户角色的行级数据访问控制 - **列级权限**:敏感字段的精细化访问控制 - **动态脱敏**:查询时自动脱敏显示敏感信息 - **数据备份安全**:备份文件自动加密,支持增量备份 - **审计日志**:完整记录所有数据库操作,支持合规审计 ### 5.4 多租户安全隔离 - **逻辑隔离**:基于tenant_id的数据隔离 - **连接隔离**:租户间连接池隔离 - **权限隔离**:租户级别的权限管理 - **资源隔离**:CPU、内存、IO资源限制 ### 5.5 应用安全 - **身份认证**:多因素认证,支持短信验证码、邮箱验证等 - **授权管理**:细粒度的权限控制,支持菜单、按钮、数据权限 - **安全审计**:用户操作审计,关键业务操作全程记录 - **密码策略**:密码复杂度、定期更换、失败锁定等安全策略 - **会话管理**:会话超时、并发限制、单点登录等 ### 5.6 接口安全 - **接口认证**:基于JWT Token的接口认证 - **接口授权**:基于角色的接口授权和权限验证 - **接口加密**:敏感数据的加密传输,支持国密算法 - **接口防护**:防重放、防篡改、防SQL注入等安全措施 - **接口限流**:基于IP、用户、应用的多维度限流策略 ## 6. 部署架构 系统采用集中部署的模式,基于集团私有云环境进行部署。 ### 6.1 物理部署 - **生产环境**:高可用集群部署 - 应用服务器:2台或以上服务器,负载均衡 - **OpenGauss数据库集群**:主从+级联备架构,支持自动故障切换 - 缓存服务器:Redis集群 - 文件服务器:冗余存储 - **灾备环境**:异地灾备,定期数据同步,支持OpenGauss流复制 - **测试环境**:用于系统测试和验证,单节点OpenGauss部署 - **开发环境**:用于系统开发和集成测试,单节点OpenGauss部署 ### 6.2 逻辑部署 - **应用服务器集群**:负责业务逻辑处理,支持水平扩展 - **OpenGauss数据库集群**:负责数据存储和管理,提供高可用保障 - **文件服务器**:负责文档和附件存储,支持分布式存储 - **缓存服务器**:Redis集群提高系统性能 - **负载均衡服务器**:实现请求分发和负载均衡 - **移动应用服务**:提供移动端API服务 - **API网关**:统一的接口管理和控制 ### 6.3 容器部署 - 基于Docker容器技术实现微服务部署 - 使用Kubernetes进行容器编排和管理 - 支持容器的自动扩缩容和故障转移 - 实现服务的灰度发布和版本控制 ## 7. 接口架构 系统提供标准化的接口,实现与外部系统的集成和数据交换。 ### 7.1 外部接口 - 银行接口:实现与银行系统的对接,支持代扣、托收等功能 - 支付宝/微信接口:支持在线支付功能 - 短信接口:支持短信通知和验证码功能 - 集抄系统接口:实现与智能水表集中抄表系统的对接 - 政务系统接口:实现与地方政务平台和政务APP的对接 - 消火栓系统接口:实现与消火栓系统的对接 - 环卫系统接口:实现与环卫系统的对接 - OA系统接口:实现与OA系统的工作流对接 ### 7.2 内部接口 - ESB服务接口:系统内部模块间的数据交换 - 报表接口:提供报表数据查询和生成功能 - 查询接口:提供数据查询功能 - 业务处理接口:提供业务处理功能 - 消息通知接口:提供消息推送和通知功能 - 工作流接口:提供工作流处理和状态查询功能 ### 7.3 接口标准 - 接口协议:RESTful API、WebService、消息队列等 - 数据格式:JSON、XML等 - 接口安全:身份认证、授权、加密传输等 - 接口文档:统一的接口文档和示例代码 - 接口测试:提供接口测试工具和环境 ### 7.4 接口服务管理 - API网关:统一的接口入口和管理 - 服务注册与发现:服务的自动注册和发现 - 服务路由:根据请求参数进行服务路由 - 服务降级:在服务不可用时提供降级策略 - 服务监控:实时监控服务的可用性和性能