28 KiB
28 KiB
福建水务营收系统架构设计文档
文档信息
| 项目信息 | 详情 |
|---|---|
| 项目名称 | 福建水务营收系统 |
| 文档类型 | 概要设计文档 |
| 技术框架 | RuoYi-Vue-Pro + yudao-ui-admin-vue3 |
| 文档版本 | v1.0 |
| 编写日期 | 2024-12-19 |
| 文档状态 | 🟡 进行中 |
目录
一、系统架构概述
福建水务营收系统采用多层架构设计,旨在支持集团化的集中管理、统一资源管理的业务需求。系统架构的设计目标是实现"一个业务平台、一网通平台"的建设目标,为集团及下属各分公司提供统一的营业收费系统。
系统架构主要包括以下核心特点:
- 多租户架构:支持集团、分公司、营业站点的多层级租户管理模式
- 统一资源服务:统一的数字水务系统运行资源环境
- 统一平台应用:统一业务流程,集中汇集数据
- 统一对外接口:提供标准的接口和能力
1. 系统总体架构图
graph TB
subgraph "用户层"
A1[Web管理端<br/>yudao-ui-admin-vue3]
A2[移动抄表端<br/>uni-app]
A3[客户微信端<br/>微信小程序]
A4[客户支付宝端<br/>支付宝小程序]
end
subgraph "网关层"
B1[Nginx负载均衡]
B2[API网关<br/>统一认证/权限控制]
end
subgraph "应用层"
C1[营收管理<br/>RuoYi-Vue-Pro]
C2[客户服务<br/>RuoYi-Vue-Pro]
C3[表务管理<br/>RuoYi-Vue-Pro]
C4[统计分析<br/>RuoYi-Vue-Pro]
end
subgraph "服务层"
D1[权限服务<br/>Spring Security]
D2[工作流服务<br/>Flowable]
D3[消息服务<br/>Redis MQ]
D4[文件服务<br/>MinIO/OSS]
end
subgraph "数据层"
E1[(MySQL 8.0<br/>主从架构)]
E2[(Redis 6.0<br/>集群缓存)]
E3[文件存储<br/>分布式存储]
end
subgraph "外部接口"
F1[银行接口<br/>代扣/托收]
F2[支付接口<br/>微信/支付宝]
F3[短信接口<br/>阿里云/腾讯云]
F4[物联网接口<br/>智能水表]
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. 物理部署架构图
graph TB
subgraph "DMZ区域"
LB1[负载均衡器<br/>Nginx Cluster]
WAF[Web应用防火墙]
end
subgraph "应用服务区"
subgraph "Web服务集群"
WEB1[Web服务器1<br/>8核32G]
WEB2[Web服务器2<br/>8核32G]
end
subgraph "应用服务集群"
APP1[应用服务器1<br/>16核64G]
APP2[应用服务器2<br/>16核64G]
end
end
subgraph "数据服务区"
subgraph "数据库集群"
DB1[MySQL主库<br/>32核128G]
DB2[MySQL从库<br/>32核128G]
end
subgraph "缓存集群"
REDIS1[Redis主节点<br/>16核32G]
REDIS2[Redis从节点<br/>16核32G]
REDIS3[Redis哨兵<br/>8核16G]
end
subgraph "文件存储"
FILE1[文件服务器1<br/>8核32G 10TB]
FILE2[文件服务器2<br/>8核32G 10TB]
end
end
subgraph "管理服务区"
MONITOR[监控服务器<br/>8核16G]
BACKUP[备份服务器<br/>8核32G 20TB]
JUMP[跳板服务器<br/>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. 技术栈总览图
graph TB
subgraph "前端技术栈"
FE1[Vue 3.2+ TypeScript]
FE2[Element Plus UI]
FE3[Vite 构建工具]
FE4[Pinia 状态管理]
FE5[Vue Router 路由]
end
subgraph "后端技术栈"
BE1[Spring Boot 3.x]
BE2[Spring Security 6.x]
BE3[MyBatis Plus 3.x]
BE4[Redis 6.0+]
BE5[MySQL 8.0+]
end
subgraph "中间件技术栈"
MW1[Nginx 负载均衡]
MW2[Redis 缓存集群]
MW3[Flowable 工作流]
MW4[Quartz 定时任务]
MW5[MinIO 文件存储]
end
subgraph "监控运维技术栈"
OP1[SkyWalking APM]
OP2[Spring Boot Admin]
OP3[Docker 容器化]
OP4[Kubernetes 编排]
OP5[Jenkins CI/CD]
end
FE1 --> BE1
FE2 --> BE1
BE1 --> BE2
BE1 --> BE3
BE3 --> BE5
BE1 --> BE4
BE1 --> MW3
BE1 --> MW4
MW1 --> BE1
BE1 --> MW5
OP1 --> BE1
OP2 --> BE1
OP3 --> BE1
OP4 --> OP3
OP5 --> OP4
2. 服务端技术架构
- 操作系统:国产 Linux 操作系统
- 数据库:MySQL/MariaDB数据库,支持国产OpenGauss数据库
- 应用框架:基于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主配置文件:
# 服务端口配置
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
多租户配置实现:
@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;
}
}
权限控制配置:
@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 依赖配置:
{
"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 构建配置:
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 用户状态管理:
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<UserVO>()
const permissions = ref<string[]>([])
const roles = ref<string[]>([])
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请求封装:
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
- 移动端:
- 核心框架: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. 应用架构
系统应用架构基于业务域划分,主要包括以下核心应用模块:
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 数据模型
- 客户信息模型:包含客户基础信息、表卡信息、账户信息、联系人信息等
- 业务数据模型:抄表数据、收费数据、账务数据、发票数据等
- 工单数据模型:表务工单、报装工单、业务工单等
- 配置数据模型:系统参数、水表参数、价格体系等
- 报表数据模型:统计数据、分析数据、预测数据等
- 物联网数据模型:设备信息、状态信息、实时数据等
4.3 数据集成与共享
- 统一数据标准:定义统一的数据标准和数据字典
- 数据集成机制:采用ESB实现系统间的数据集成
- 数据共享机制:基于统一的数据服务接口实现数据共享
- 数据同步策略:实时同步、定时同步、批量同步等
5. 安全架构
系统安全架构满足等保三级要求,主要包括以下安全措施:
5.1 网络安全
- 边界防护:防火墙、入侵检测/防御系统
- 访问控制:基于角色的访问控制
- 通信安全:SSL/TLS加密传输
- 安全监控:实时监控网络安全状态
5.2 数据安全
- 数据加密:敏感数据加密存储
- 数据备份:定期数据备份和恢复机制
- 数据审计:关键操作的审计日志
- 数据脱敏:敏感数据的显示脱敏和处理脱敏
- 数据权限:基于多租户的数据隔离和访问控制
5.3 应用安全
- 身份认证:多因素认证
- 授权管理:细粒度的权限控制
- 安全审计:用户操作审计
- 密码策略:密码复杂度、定期更换、失败锁定等
- 会话管理:会话超时、并发限制等
5.4 接口安全
- 接口认证:基于Token的接口认证
- 接口授权:基于角色的接口授权
- 接口加密:敏感数据的加密传输
- 接口防护:防重放、防篡改等安全措施
- 接口限流:基于IP、用户、应用的限流策略
6. 部署架构
系统采用集中部署的模式,基于集团私有云环境进行部署。
6.1 物理部署
- 生产环境:高可用集群部署
- 应用服务器:2台或以上服务器,负载均衡
- 数据库服务器:主从架构,实时同步
- 缓存服务器:Redis集群
- 文件服务器:冗余存储
- 灾备环境:异地灾备,定期数据同步
- 测试环境:用于系统测试和验证
- 开发环境:用于系统开发和集成测试
6.2 逻辑部署
- 应用服务器集群:负责业务逻辑处理
- 数据库服务器集群:负责数据存储和管理
- 文件服务器:负责文档和附件存储
- 缓存服务器:提高系统性能
- 负载均衡服务器:实现请求分发和负载均衡
- 移动应用服务:提供移动端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网关:统一的接口入口和管理
- 服务注册与发现:服务的自动注册和发现
- 服务路由:根据请求参数进行服务路由
- 服务降级:在服务不可用时提供降级策略
- 服务监控:实时监控服务的可用性和性能