docs: 添加API接口文档、数据库设计文档、部署运维文档

This commit is contained in:
zhangjf 2026-02-15 12:09:18 +08:00
parent c12a1ac3d3
commit 61475dd320
3 changed files with 2576 additions and 0 deletions

1083
doc/API接口文档.md Normal file

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,710 @@
# 资金服务平台数据库设计文档
> 版本: v1.0
> 更新日期: 2026-02-13
> 作者: zhangjf
> 数据库: MySQL 8.0
> 字符集: utf8mb4
---
## 一、数据库概览
### 1.1 数据库信息
| 项目 | 值 |
|------|-----|
| 数据库名 | fund_platform |
| 字符集 | utf8mb4 |
| 排序规则 | utf8mb4_unicode_ci |
| 存储引擎 | InnoDB |
| 时区 | +08:00 |
### 1.2 表清单
| 模块 | 表名 | 说明 | 记录数 |
|------|------|------|--------|
| **系统管理** | sys_tenant | 租户表 | 2 |
| | sys_dept | 部门表 | 7 |
| | sys_user | 用户表 | 6 |
| | sys_role | 角色表 | 7 |
| | sys_menu | 菜单表 | 38 |
| | sys_user_role | 用户角色关联表 | 6 |
| | sys_role_menu | 角色菜单关联表 | 动态 |
| | sys_operation_log | 操作日志表 | 动态 |
| **客户管理** | customer | 客户表 | 3 |
| | customer_contact | 客户联系人表 | 0 |
| **项目管理** | project | 项目表 | 3 |
| | project_member | 项目成员表 | 6 |
| **需求工单** | requirement | 需求工单表 | 0 |
| **支出管理** | expense_type | 支出类型表 | 12 |
| | expense | 支出表 | 0 |
| **应收款管理** | receivable | 应收款表 | 0 |
| | receipt | 收款记录表 | 0 |
---
## 二、ER 图
```
┌─────────────────────────────────────────────────────────────────────────────────────────┐
│ 资金服务平台数据库 ER 图 │
├─────────────────────────────────────────────────────────────────────────────────────────┤
│ │
│ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │
│ │ sys_tenant │ │ sys_user │ │ sys_role │ │
│ │ (租户表) │ │ (用户表) │ │ (角色表) │ │
│ ├──────────────┤ ├──────────────┤ ├──────────────┤ │
│ │ PK tenant_id │◄────────┤ FK tenant_id │ │ FK tenant_id │ │
│ │ code │ │ PK user_id │◄───────►│ PK role_id │ │
│ │ name │ │ username │ │ code │ │
│ │ type │ │ password │ │ name │ │
│ │ status │ │ real_name │ │ type │ │
│ └──────────────┘ │ dept_id │────────►│ scope │ │
│ │ status │ └──────────────┘ │
│ └──────────────┘ ▲ │
│ ▲ │ │
│ │ │ │
│ ┌──────┴──────┐ ┌──────┴──────┐ │
│ │ sys_dept │ │sys_user_role│ │
│ │ (部门表) │ │(用户角色关联)│ │
│ ├─────────────┤ ├─────────────┤ │
│ │ PK dept_id │ │ PK id │ │
│ │ FK tenant_id│ │ FK user_id │ │
│ │ name │ │ FK role_id │ │
│ │ parent_id │ └─────────────┘ │
│ └─────────────┘ │
│ │
│ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │
│ │ customer │ │ project │ │ requirement │ │
│ │ (客户表) │ │ (项目表) │ │ (需求工单表) │ │
│ ├──────────────┤ ├──────────────┤ ├──────────────┤ │
│ │ PK customer_id│◄───────┤ FK customer_id│◄───────┤ FK customer_id│ │
│ │ FK tenant_id │ │ FK tenant_id │ │ FK tenant_id │ │
│ │ code │ │ PK project_id│◄───────┤ FK project_id│ │
│ │ name │ │ code │ │ PK req_id │ │
│ │ type │ │ name │ │ code │ │
│ │ level │ │ manager_id│ │ name │ │
│ └──────────────┘ │ status │ │ amount │ │
│ │ └──────────────┘ │ status │ │
│ │ ▲ └──────────────┘ │
│ │ │ │
│ │ ┌──────┴──────┐ │
│ │ │project_member│ │
│ │ │(项目成员表) │ │
│ │ ├─────────────┤ │
│ │ │ PK member_id│ │
│ │ │ FK project_id│ │
│ │ │ FK user_id │ │
│ │ │ role │ │
│ │ └─────────────┘ │
│ │ │
│ ▼ │
│ ┌──────────────┐ │
│ │customer_contact│ │
│ │(客户联系人表) │ │
│ ├──────────────┤ │
│ │ PK contact_id │ │
│ │ FK customer_id│ │
│ │ name │ │
│ │ phone │ │
│ │ is_primary │ │
│ └──────────────┘ │
│ │
│ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │
│ │ expense_type │ │ expense │ │ receivable │ │
│ │ (支出类型表) │ │ (支出表) │ │ (应收款表) │ │
│ ├──────────────┤ ├──────────────┤ ├──────────────┤ │
│ │ PK type_id │◄────────┤ FK type_id │ │ PK receiv_id │ │
│ │ FK tenant_id │ │ FK tenant_id │ │ FK tenant_id │ │
│ │ code │ │ PK expense_id│ │ FK project_id│ │
│ │ name │ │ code │ │ FK customer_id│ │
│ │ parent_id │ │ amount │ │ FK req_id │ │
│ └──────────────┘ │ date │ │ amount │ │
│ │ status │ │ status │ │
│ └──────────────┘ └──────┬───────┘ │
│ │ │
│ ┌──────┴──────┐ │
│ │ receipt │ │
│ │ (收款记录表) │ │
│ ├─────────────┤ │
│ │ PK receipt_id│ │
│ │ FK receiv_id │ │
│ │ amount │ │
│ │ date │ │
│ └─────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────────────────────────────┘
```
---
## 三、表结构详细说明
### 3.1 系统管理模块
#### 3.1.1 sys_tenant租户表
| 字段名 | 类型 | 长度 | 必填 | 默认值 | 说明 |
|--------|------|------|------|--------|------|
| tenant_id | BIGINT | - | 是 | 自增 | 主键租户ID |
| tenant_code | VARCHAR | 50 | 是 | - | 租户编码(唯一) |
| tenant_name | VARCHAR | 100 | 是 | - | 租户名称 |
| tenant_type | TINYINT | - | 否 | 1 | 租户类型1-一库多租户2-一库一租户 |
| contact_name | VARCHAR | 50 | 否 | - | 联系人姓名 |
| contact_phone | VARCHAR | 20 | 否 | - | 联系人电话 |
| contact_email | VARCHAR | 100 | 否 | - | 联系人邮箱 |
| db_config | JSON | - | 否 | - | 数据库配置(一库一租户模式使用) |
| status | TINYINT | - | 否 | 1 | 状态0-禁用1-启用 |
| expire_time | DATETIME | - | 否 | - | 过期时间 |
| created_time | DATETIME | - | 否 | CURRENT_TIMESTAMP | 创建时间 |
| updated_time | DATETIME | - | 否 | CURRENT_TIMESTAMP | 更新时间 |
**索引:**
- PRIMARY KEY (`tenant_id`)
- UNIQUE KEY `uk_code` (`tenant_code`)
- INDEX `idx_status` (`status`)
---
#### 3.1.2 sys_dept部门表
| 字段名 | 类型 | 长度 | 必填 | 默认值 | 说明 |
|--------|------|------|------|--------|------|
| dept_id | BIGINT | - | 是 | 自增 | 主键部门ID |
| tenant_id | BIGINT | - | 是 | - | 租户ID外键 |
| dept_name | VARCHAR | 100 | 是 | - | 部门名称 |
| parent_id | BIGINT | - | 否 | 0 | 父部门ID0表示顶级部门 |
| dept_code | VARCHAR | 50 | 否 | - | 部门编码 |
| dept_level | INT | - | 否 | 1 | 部门层级 |
| sort_order | INT | - | 否 | 0 | 排序顺序 |
| leader | VARCHAR | 50 | 否 | - | 部门负责人 |
| leader_phone | VARCHAR | 20 | 否 | - | 负责人电话 |
| status | TINYINT | - | 否 | 1 | 状态0-禁用1-启用 |
| remark | VARCHAR | 500 | 否 | - | 备注说明 |
| created_by | BIGINT | - | 否 | - | 创建人ID |
| created_time | DATETIME | - | 否 | CURRENT_TIMESTAMP | 创建时间 |
| updated_by | BIGINT | - | 否 | - | 更新人ID |
| updated_time | DATETIME | - | 否 | CURRENT_TIMESTAMP | 更新时间 |
| deleted | TINYINT | - | 否 | 0 | 逻辑删除0-未删除1-已删除 |
**索引:**
- PRIMARY KEY (`dept_id`)
- INDEX `idx_tenant` (`tenant_id`)
- INDEX `idx_parent` (`parent_id`)
- INDEX `idx_status` (`status`)
---
#### 3.1.3 sys_user用户表
| 字段名 | 类型 | 长度 | 必填 | 默认值 | 说明 |
|--------|------|------|------|--------|------|
| user_id | BIGINT | - | 是 | 自增 | 主键用户ID |
| tenant_id | BIGINT | - | 是 | - | 租户ID外键 |
| username | VARCHAR | 50 | 是 | - | 用户名(登录账号) |
| password | VARCHAR | 100 | 是 | - | 密码BCrypt加密存储 |
| real_name | VARCHAR | 50 | 是 | - | 真实姓名 |
| gender | TINYINT | - | 否 | 0 | 性别0-未知1-男2-女 |
| phone | VARCHAR | 20 | 否 | - | 手机号码 |
| email | VARCHAR | 100 | 否 | - | 邮箱地址 |
| dept_id | BIGINT | - | 否 | - | 所属部门ID外键 |
| position | VARCHAR | 50 | 否 | - | 岗位/职位 |
| avatar | VARCHAR | 255 | 否 | - | 头像URL |
| status | TINYINT | - | 否 | 1 | 状态0-禁用1-启用 |
| last_login_time | DATETIME | - | 否 | - | 最后登录时间 |
| last_login_ip | VARCHAR | 50 | 否 | - | 最后登录IP |
| created_by | BIGINT | - | 否 | - | 创建人ID |
| created_time | DATETIME | - | 否 | CURRENT_TIMESTAMP | 创建时间 |
| updated_by | BIGINT | - | 否 | - | 更新人ID |
| updated_time | DATETIME | - | 否 | CURRENT_TIMESTAMP | 更新时间 |
| deleted | TINYINT | - | 否 | 0 | 逻辑删除0-未删除1-已删除 |
**索引:**
- PRIMARY KEY (`user_id`)
- UNIQUE KEY `uk_tenant_username` (`tenant_id`, `username`)
- INDEX `idx_tenant` (`tenant_id`)
- INDEX `idx_dept` (`dept_id`)
- INDEX `idx_status` (`status`)
---
#### 3.1.4 sys_role角色表
| 字段名 | 类型 | 长度 | 必填 | 默认值 | 说明 |
|--------|------|------|------|--------|------|
| role_id | BIGINT | - | 是 | 自增 | 主键角色ID |
| tenant_id | BIGINT | - | 是 | - | 租户ID外键 |
| role_code | VARCHAR | 50 | 是 | - | 角色编码 |
| role_name | VARCHAR | 100 | 是 | - | 角色名称 |
| role_type | VARCHAR | 20 | 否 | custom | 角色类型system-系统角色custom-自定义角色 |
| data_scope | VARCHAR | 20 | 否 | self | 数据范围all-全部dept-本部门self-本人 |
| sort_order | INT | - | 否 | 0 | 排序顺序 |
| status | TINYINT | - | 否 | 1 | 状态0-禁用1-启用 |
| remark | VARCHAR | 500 | 否 | - | 备注说明 |
| created_by | BIGINT | - | 否 | - | 创建人ID |
| created_time | DATETIME | - | 否 | CURRENT_TIMESTAMP | 创建时间 |
| updated_by | BIGINT | - | 否 | - | 更新人ID |
| updated_time | DATETIME | - | 否 | CURRENT_TIMESTAMP | 更新时间 |
| deleted | TINYINT | - | 否 | 0 | 逻辑删除0-未删除1-已删除 |
**索引:**
- PRIMARY KEY (`role_id`)
- UNIQUE KEY `uk_tenant_code` (`tenant_id`, `role_code`)
- INDEX `idx_tenant` (`tenant_id`)
- INDEX `idx_status` (`status`)
---
#### 3.1.5 sys_menu菜单表
| 字段名 | 类型 | 长度 | 必填 | 默认值 | 说明 |
|--------|------|------|------|--------|------|
| menu_id | BIGINT | - | 是 | 自增 | 主键菜单ID |
| tenant_id | BIGINT | - | 否 | 0 | 租户ID0表示系统通用菜单 |
| menu_name | VARCHAR | 100 | 是 | - | 菜单名称 |
| menu_type | VARCHAR | 20 | 是 | - | 菜单类型dir-目录menu-菜单button-按钮 |
| parent_id | BIGINT | - | 否 | 0 | 父菜单ID0表示顶级菜单 |
| menu_level | INT | - | 否 | 1 | 菜单层级 |
| icon | VARCHAR | 100 | 否 | - | 菜单图标 |
| path | VARCHAR | 200 | 否 | - | 路由路径 |
| component | VARCHAR | 200 | 否 | - | 组件路径 |
| permission | VARCHAR | 100 | 否 | - | 权限标识user:list |
| sort_order | INT | - | 否 | 0 | 排序顺序 |
| status | TINYINT | - | 否 | 1 | 状态0-禁用1-启用 |
| remark | VARCHAR | 500 | 否 | - | 备注说明 |
| created_by | BIGINT | - | 否 | - | 创建人ID |
| created_time | DATETIME | - | 否 | CURRENT_TIMESTAMP | 创建时间 |
| updated_by | BIGINT | - | 否 | - | 更新人ID |
| updated_time | DATETIME | - | 否 | CURRENT_TIMESTAMP | 更新时间 |
| deleted | TINYINT | - | 否 | 0 | 逻辑删除0-未删除1-已删除 |
**索引:**
- PRIMARY KEY (`menu_id`)
- INDEX `idx_tenant` (`tenant_id`)
- INDEX `idx_parent` (`parent_id`)
- INDEX `idx_type` (`menu_type`)
- INDEX `idx_status` (`status`)
---
#### 3.1.6 sys_user_role用户角色关联表
| 字段名 | 类型 | 长度 | 必填 | 默认值 | 说明 |
|--------|------|------|------|--------|------|
| id | BIGINT | - | 是 | 自增 | 主键ID |
| tenant_id | BIGINT | - | 是 | - | 租户ID外键 |
| user_id | BIGINT | - | 是 | - | 用户ID外键 |
| role_id | BIGINT | - | 是 | - | 角色ID外键 |
| created_time | DATETIME | - | 否 | CURRENT_TIMESTAMP | 创建时间 |
**索引:**
- PRIMARY KEY (`id`)
- UNIQUE KEY `uk_user_role` (`tenant_id`, `user_id`, `role_id`)
- INDEX `idx_user` (`user_id`)
- INDEX `idx_role` (`role_id`)
---
#### 3.1.7 sys_role_menu角色菜单关联表
| 字段名 | 类型 | 长度 | 必填 | 默认值 | 说明 |
|--------|------|------|------|--------|------|
| id | BIGINT | - | 是 | 自增 | 主键ID |
| tenant_id | BIGINT | - | 是 | - | 租户ID外键 |
| role_id | BIGINT | - | 是 | - | 角色ID外键 |
| menu_id | BIGINT | - | 是 | - | 菜单ID外键 |
| created_time | DATETIME | - | 否 | CURRENT_TIMESTAMP | 创建时间 |
**索引:**
- PRIMARY KEY (`id`)
- UNIQUE KEY `uk_role_menu` (`tenant_id`, `role_id`, `menu_id`)
- INDEX `idx_role` (`role_id`)
- INDEX `idx_menu` (`menu_id`)
---
#### 3.1.8 sys_operation_log操作日志表
| 字段名 | 类型 | 长度 | 必填 | 默认值 | 说明 |
|--------|------|------|------|--------|------|
| log_id | BIGINT | - | 是 | 自增 | 主键日志ID |
| tenant_id | BIGINT | - | 是 | - | 租户ID外键 |
| user_id | BIGINT | - | 否 | - | 操作人ID外键 |
| username | VARCHAR | 50 | 否 | - | 操作人用户名 |
| operation | VARCHAR | 100 | 否 | - | 操作描述 |
| method | VARCHAR | 200 | 否 | - | 操作方法 |
| params | TEXT | - | 否 | - | 操作参数JSON格式 |
| ip | VARCHAR | 50 | 否 | - | 操作IP |
| user_agent | VARCHAR | 500 | 否 | - | 用户代理 |
| operation_time | DATETIME | - | 否 | CURRENT_TIMESTAMP | 操作时间 |
| cost_time | BIGINT | - | 否 | 0 | 耗时(毫秒) |
| result | VARCHAR | 20 | 否 | success | 操作结果success-成功fail-失败 |
| error_msg | TEXT | - | 否 | - | 错误信息 |
**索引:**
- PRIMARY KEY (`log_id`)
- INDEX `idx_tenant` (`tenant_id`)
- INDEX `idx_user` (`user_id`)
- INDEX `idx_time` (`operation_time`)
- INDEX `idx_result` (`result`)
---
### 3.2 客户管理模块
#### 3.2.1 customer客户表
| 字段名 | 类型 | 长度 | 必填 | 默认值 | 说明 |
|--------|------|------|------|--------|------|
| customer_id | BIGINT | - | 是 | 自增 | 主键客户ID |
| tenant_id | BIGINT | - | 是 | - | 租户ID外键 |
| customer_code | VARCHAR | 50 | 是 | - | 客户编码(唯一) |
| customer_name | VARCHAR | 200 | 是 | - | 客户名称 |
| customer_short | VARCHAR | 100 | 否 | - | 客户简称 |
| customer_type | VARCHAR | 20 | 否 | enterprise | 客户类型enterprise-企业individual-个人 |
| industry | VARCHAR | 50 | 否 | - | 所属行业 |
| scale | VARCHAR | 20 | 否 | - | 企业规模small-小型medium-中型large-大型 |
| level | VARCHAR | 20 | 否 | normal | 客户等级A/B/C/D/normal |
| tax_no | VARCHAR | 50 | 否 | - | 纳税人识别号 |
| legal_person | VARCHAR | 50 | 否 | - | 法定代表人 |
| address | VARCHAR | 500 | 否 | - | 公司地址 |
| phone | VARCHAR | 20 | 否 | - | 联系电话 |
| email | VARCHAR | 100 | 否 | - | 邮箱地址 |
| website | VARCHAR | 200 | 否 | - | 公司网站 |
| status | TINYINT | - | 否 | 1 | 状态0-禁用1-启用 |
| remark | VARCHAR | 500 | 否 | - | 备注说明 |
| cooperation_start | DATE | - | 否 | - | 合作开始日期 |
| cooperation_end | DATE | - | 否 | - | 合作结束日期 |
| created_by | BIGINT | - | 否 | - | 创建人ID |
| created_time | DATETIME | - | 否 | CURRENT_TIMESTAMP | 创建时间 |
| updated_by | BIGINT | - | 否 | - | 更新人ID |
| updated_time | DATETIME | - | 否 | CURRENT_TIMESTAMP | 更新时间 |
| deleted | TINYINT | - | 否 | 0 | 逻辑删除0-未删除1-已删除 |
**索引:**
- PRIMARY KEY (`customer_id`)
- UNIQUE KEY `uk_tenant_code` (`tenant_id`, `customer_code`)
- INDEX `idx_tenant` (`tenant_id`)
- INDEX `idx_status` (`status`)
- INDEX `idx_level` (`level`)
---
#### 3.2.2 customer_contact客户联系人表
| 字段名 | 类型 | 长度 | 必填 | 默认值 | 说明 |
|--------|------|------|------|--------|------|
| contact_id | BIGINT | - | 是 | 自增 | 主键联系人ID |
| tenant_id | BIGINT | - | 是 | - | 租户ID外键 |
| customer_id | BIGINT | - | 是 | - | 客户ID外键 |
| contact_name | VARCHAR | 50 | 是 | - | 联系人姓名 |
| position | VARCHAR | 50 | 否 | - | 职位/职务 |
| department | VARCHAR | 100 | 否 | - | 所属部门 |
| phone | VARCHAR | 20 | 否 | - | 联系电话 |
| mobile | VARCHAR | 20 | 否 | - | 手机号码 |
| email | VARCHAR | 100 | 否 | - | 邮箱地址 |
| wechat | VARCHAR | 50 | 否 | - | 微信号 |
| qq | VARCHAR | 20 | 否 | - | QQ号 |
| is_primary | TINYINT | - | 否 | 0 | 是否主要联系人0-否1-是 |
| sort_order | INT | - | 否 | 0 | 排序顺序 |
| status | TINYINT | - | 否 | 1 | 状态0-禁用1-启用 |
| remark | VARCHAR | 200 | 否 | - | 备注说明 |
| created_by | BIGINT | - | 否 | - | 创建人ID |
| created_time | DATETIME | - | 否 | CURRENT_TIMESTAMP | 创建时间 |
| updated_by | BIGINT | - | 否 | - | 更新人ID |
| updated_time | DATETIME | - | 否 | CURRENT_TIMESTAMP | 更新时间 |
| deleted | TINYINT | - | 否 | 0 | 逻辑删除0-未删除1-已删除 |
**索引:**
- PRIMARY KEY (`contact_id`)
- INDEX `idx_tenant` (`tenant_id`)
- INDEX `idx_customer` (`customer_id`)
- INDEX `idx_status` (`status`)
---
### 3.3 项目管理模块
#### 3.3.1 project项目表
| 字段名 | 类型 | 长度 | 必填 | 默认值 | 说明 |
|--------|------|------|------|--------|------|
| project_id | BIGINT | - | 是 | 自增 | 主键项目ID |
| tenant_id | BIGINT | - | 是 | - | 租户ID外键 |
| project_code | VARCHAR | 50 | 是 | - | 项目编号(唯一) |
| project_name | VARCHAR | 200 | 是 | - | 项目名称 |
| project_short | VARCHAR | 100 | 否 | - | 项目简称 |
| customer_id | BIGINT | - | 是 | - | 客户ID外键 |
| project_type | VARCHAR | 20 | 否 | development | 项目类型development-开发maintenance-维护consulting-咨询 |
| project_manager_id | BIGINT | - | 否 | - | 项目经理ID外键 |
| start_date | DATE | - | 否 | - | 项目开始日期 |
| end_date | DATE | - | 否 | - | 项目结束日期 |
| budget_amount | DECIMAL | 15,2 | 否 | 0.00 | 项目预算金额 |
| contract_amount | DECIMAL | 15,2 | 否 | 0.00 | 合同金额 |
| status | VARCHAR | 20 | 否 | preparing | 项目状态preparing-筹备中ongoing-进行中completed-已完成archived-已归档cancelled-已取消 |
| progress | INT | - | 否 | 0 | 项目进度0-100 |
| description | TEXT | - | 否 | - | 项目描述 |
| remark | VARCHAR | 500 | 否 | - | 备注说明 |
| attachment_url | VARCHAR | 500 | 否 | - | 附件URL |
| created_by | BIGINT | - | 否 | - | 创建人ID |
| created_time | DATETIME | - | 否 | CURRENT_TIMESTAMP | 创建时间 |
| updated_by | BIGINT | - | 否 | - | 更新人ID |
| updated_time | DATETIME | - | 否 | CURRENT_TIMESTAMP | 更新时间 |
| deleted | TINYINT | - | 否 | 0 | 逻辑删除0-未删除1-已删除 |
**索引:**
- PRIMARY KEY (`project_id`)
- UNIQUE KEY `uk_tenant_code` (`tenant_id`, `project_code`)
- INDEX `idx_tenant` (`tenant_id`)
- INDEX `idx_customer` (`customer_id`)
- INDEX `idx_manager` (`project_manager_id`)
- INDEX `idx_status` (`status`)
---
#### 3.3.2 project_member项目成员表
| 字段名 | 类型 | 长度 | 必填 | 默认值 | 说明 |
|--------|------|------|------|--------|------|
| member_id | BIGINT | - | 是 | 自增 | 主键成员关系ID |
| tenant_id | BIGINT | - | 是 | - | 租户ID外键 |
| project_id | BIGINT | - | 是 | - | 项目ID外键 |
| user_id | BIGINT | - | 是 | - | 用户ID外键 |
| role | VARCHAR | 50 | 否 | member | 项目角色pm-项目经理dev-开发test-测试finance-财务member-普通成员 |
| join_date | DATE | - | 否 | - | 加入日期 |
| leave_date | DATE | - | 否 | - | 离开日期 |
| workload | DECIMAL | 5,2 | 否 | 0.00 | 工作量占比0-100 |
| status | TINYINT | - | 否 | 1 | 状态0-已离开1-在职 |
| remark | VARCHAR | 200 | 否 | - | 备注说明 |
| created_by | BIGINT | - | 否 | - | 创建人ID |
| created_time | DATETIME | - | 否 | CURRENT_TIMESTAMP | 创建时间 |
| updated_by | BIGINT | - | 否 | - | 更新人ID |
| updated_time | DATETIME | - | 否 | CURRENT_TIMESTAMP | 更新时间 |
| deleted | TINYINT | - | 否 | 0 | 逻辑删除0-未删除1-已删除 |
**索引:**
- PRIMARY KEY (`member_id`)
- UNIQUE KEY `uk_project_user` (`tenant_id`, `project_id`, `user_id`)
- INDEX `idx_project` (`project_id`)
- INDEX `idx_user` (`user_id`)
---
### 3.4 需求工单模块
#### 3.4.1 requirement需求工单表
| 字段名 | 类型 | 长度 | 必填 | 默认值 | 说明 |
|--------|------|------|------|--------|------|
| requirement_id | BIGINT | - | 是 | 自增 | 主键需求ID |
| tenant_id | BIGINT | - | 是 | - | 租户ID外键 |
| requirement_code | VARCHAR | 50 | 是 | - | 需求编号(唯一) |
| requirement_name | VARCHAR | 200 | 是 | - | 需求名称 |
| description | TEXT | - | 否 | - | 需求描述 |
| project_id | BIGINT | - | 是 | - | 项目ID外键 |
| customer_id | BIGINT | - | 是 | - | 客户ID外键 |
| priority | VARCHAR | 20 | 否 | normal | 优先级high-高normal-中low-低 |
| estimated_hours | DECIMAL | 8,2 | 否 | 0.00 | 预估开发工时(小时) |
| actual_hours | DECIMAL | 8,2 | 否 | 0.00 | 实际开发工时(小时) |
| planned_start | DATE | - | 否 | - | 计划开始日期 |
| planned_end | DATE | - | 否 | - | 计划结束日期 |
| actual_start | DATE | - | 否 | - | 实际开始日期 |
| actual_end | DATE | - | 否 | - | 实际结束日期 |
| delivery_date | DATE | - | 否 | - | 交付日期 |
| receivable_amount | DECIMAL | 15,2 | 否 | 0.00 | 应收款金额 |
| receivable_date | DATE | - | 否 | - | 应收款日期 |
| status | VARCHAR | 20 | 否 | pending | 状态pending-待开发developing-开发中delivered-已交付completed-已完成 |
| progress | INT | - | 否 | 0 | 开发进度0-100 |
| attachment_url | VARCHAR | 500 | 否 | - | 附件URL |
| created_by | BIGINT | - | 否 | - | 创建人ID |
| created_time | DATETIME | - | 否 | CURRENT_TIMESTAMP | 创建时间 |
| updated_by | BIGINT | - | 否 | - | 更新人ID |
| updated_time | DATETIME | - | 否 | CURRENT_TIMESTAMP | 更新时间 |
| deleted | TINYINT | - | 否 | 0 | 逻辑删除0-未删除1-已删除 |
**索引:**
- PRIMARY KEY (`requirement_id`)
- UNIQUE KEY `uk_tenant_code` (`tenant_id`, `requirement_code`)
- INDEX `idx_tenant` (`tenant_id`)
- INDEX `idx_project` (`project_id`)
- INDEX `idx_customer` (`customer_id`)
- INDEX `idx_status` (`status`)
---
### 3.5 支出管理模块
#### 3.5.1 expense_type支出类型表
| 字段名 | 类型 | 长度 | 必填 | 默认值 | 说明 |
|--------|------|------|------|--------|------|
| type_id | BIGINT | - | 是 | 自增 | 主键支出类型ID |
| tenant_id | BIGINT | - | 是 | - | 租户ID外键 |
| type_code | VARCHAR | 50 | 否 | - | 支出类型编码 |
| type_name | VARCHAR | 100 | 是 | - | 支出类型名称 |
| parent_id | BIGINT | - | 否 | 0 | 父类型ID0表示一级类型 |
| type_level | INT | - | 否 | 1 | 类型层级 |
| sort_order | INT | - | 否 | 0 | 排序顺序 |
| description | VARCHAR | 200 | 否 | - | 类型描述 |
| status | TINYINT | - | 否 | 1 | 状态0-禁用1-启用 |
| created_by | BIGINT | - | 否 | - | 创建人ID |
| created_time | DATETIME | - | 否 | CURRENT_TIMESTAMP | 创建时间 |
| updated_by | BIGINT | - | 否 | - | 更新人ID |
| updated_time | DATETIME | - | 否 | CURRENT_TIMESTAMP | 更新时间 |
| deleted | TINYINT | - | 否 | 0 | 逻辑删除0-未删除1-已删除 |
**索引:**
- PRIMARY KEY (`type_id`)
- INDEX `idx_tenant` (`tenant_id`)
- INDEX `idx_parent` (`parent_id`)
- INDEX `idx_status` (`status`)
---
#### 3.5.2 expense支出表
| 字段名 | 类型 | 长度 | 必填 | 默认值 | 说明 |
|--------|------|------|------|--------|------|
| expense_id | BIGINT | - | 是 | 自增 | 主键支出ID |
| tenant_id | BIGINT | - | 是 | - | 租户ID外键 |
| expense_code | VARCHAR | 50 | 是 | - | 支出编号(唯一) |
| expense_type_id | BIGINT | - | 是 | - | 支出类型ID外键 |
| expense_amount | DECIMAL | 15,2 | 否 | 0.00 | 支出金额 |
| expense_date | DATE | - | 否 | - | 支出日期 |
| expense_reason | TEXT | - | 否 | - | 支出事由 |
| project_id | BIGINT | - | 否 | - | 所属项目ID外键 |
| applicant_id | BIGINT | - | 是 | - | 申请人ID外键 |
| department_id | BIGINT | - | 否 | - | 申请部门ID外键 |
| payment_method | VARCHAR | 20 | 否 | transfer | 付款方式transfer-转账cash-现金check-支票other-其他 |
| payment_account | VARCHAR | 100 | 否 | - | 付款账户 |
| attachment_url | VARCHAR | 500 | 否 | - | 附件URL |
| status | VARCHAR | 20 | 否 | pending | 状态pending-待付款paid-已付款completed-已完成cancelled-已作废 |
| payment_date | DATE | - | 否 | - | 付款日期 |
| payment_voucher | VARCHAR | 255 | 否 | - | 付款凭证 |
| remark | VARCHAR | 500 | 否 | - | 备注说明 |
| created_by | BIGINT | - | 否 | - | 创建人ID |
| created_time | DATETIME | - | 否 | CURRENT_TIMESTAMP | 创建时间 |
| updated_by | BIGINT | - | 否 | - | 更新人ID |
| updated_time | DATETIME | - | 否 | CURRENT_TIMESTAMP | 更新时间 |
| deleted | TINYINT | - | 否 | 0 | 逻辑删除0-未删除1-已删除 |
**索引:**
- PRIMARY KEY (`expense_id`)
- UNIQUE KEY `uk_tenant_code` (`tenant_id`, `expense_code`)
- INDEX `idx_tenant` (`tenant_id`)
- INDEX `idx_type` (`expense_type_id`)
- INDEX `idx_project` (`project_id`)
- INDEX `idx_applicant` (`applicant_id`)
- INDEX `idx_status` (`status`)
---
### 3.6 应收款管理模块
#### 3.6.1 receivable应收款表
| 字段名 | 类型 | 长度 | 必填 | 默认值 | 说明 |
|--------|------|------|------|--------|------|
| receivable_id | BIGINT | - | 是 | 自增 | 主键应收款ID |
| tenant_id | BIGINT | - | 是 | - | 租户ID外键 |
| receivable_code | VARCHAR | 50 | 是 | - | 应收款编号(唯一) |
| requirement_id | BIGINT | - | 是 | - | 需求ID外键 |
| project_id | BIGINT | - | 是 | - | 项目ID外键 |
| customer_id | BIGINT | - | 是 | - | 客户ID外键 |
| receivable_amount | DECIMAL | 15,2 | 否 | 0.00 | 应收款金额 |
| receivable_date | DATE | - | 否 | - | 应收款日期 |
| payment_due_date | DATE | - | 否 | - | 付款截止日期 |
| payment_method | VARCHAR | 20 | 否 | - | 付款方式transfer-转账cash-现金check-支票other-其他 |
| bank_account | VARCHAR | 100 | 否 | - | 收款账户 |
| status | VARCHAR | 20 | 否 | pending | 状态pending-待收款partial-部分收款received-已收款overdue-逾期 |
| received_amount | DECIMAL | 15,2 | 否 | 0.00 | 已收款金额 |
| unpaid_amount | DECIMAL | 15,2 | 否 | 0.00 | 未收款金额 |
| overdue_days | INT | - | 否 | 0 | 逾期天数 |
| remark | VARCHAR | 500 | 否 | - | 备注说明 |
| created_by | BIGINT | - | 否 | - | 创建人ID |
| created_time | DATETIME | - | 否 | CURRENT_TIMESTAMP | 创建时间 |
| updated_by | BIGINT | - | 否 | - | 更新人ID |
| updated_time | DATETIME | - | 否 | CURRENT_TIMESTAMP | 更新时间 |
| deleted | TINYINT | - | 否 | 0 | 逻辑删除0-未删除1-已删除 |
**索引:**
- PRIMARY KEY (`receivable_id`)
- UNIQUE KEY `uk_tenant_code` (`tenant_id`, `receivable_code`)
- INDEX `idx_tenant` (`tenant_id`)
- INDEX `idx_requirement` (`requirement_id`)
- INDEX `idx_project` (`project_id`)
- INDEX `idx_customer` (`customer_id`)
- INDEX `idx_status` (`status`)
---
#### 3.6.2 receipt收款记录表
| 字段名 | 类型 | 长度 | 必填 | 默认值 | 说明 |
|--------|------|------|------|--------|------|
| receipt_id | BIGINT | - | 是 | 自增 | 主键收款记录ID |
| tenant_id | BIGINT | - | 是 | - | 租户ID外键 |
| receipt_code | VARCHAR | 50 | 是 | - | 收款编号(唯一) |
| receivable_id | BIGINT | - | 是 | - | 应收款ID外键 |
| receipt_amount | DECIMAL | 15,2 | 否 | 0.00 | 收款金额 |
| receipt_date | DATE | - | 否 | - | 收款日期 |
| receipt_method | VARCHAR | 20 | 否 | transfer | 收款方式transfer-转账cash-现金check-支票other-其他 |
| receipt_account | VARCHAR | 100 | 否 | - | 收款账户 |
| payer_name | VARCHAR | 100 | 否 | - | 付款方名称 |
| receipt_voucher | VARCHAR | 255 | 否 | - | 收款凭证URL |
| operator_id | BIGINT | - | 否 | - | 操作人ID外键 |
| remark | VARCHAR | 200 | 否 | - | 备注说明 |
| created_time | DATETIME | - | 否 | CURRENT_TIMESTAMP | 创建时间 |
**索引:**
- PRIMARY KEY (`receipt_id`)
- UNIQUE KEY `uk_tenant_code` (`tenant_id`, `receipt_code`)
- INDEX `idx_tenant` (`tenant_id`)
- INDEX `idx_receivable` (`receivable_id`)
---
## 四、数据库设计规范
### 4.1 命名规范
| 项目 | 规范 | 示例 |
|------|------|------|
| 数据库名 | 小写,下划线分隔 | fund_platform |
| 表名 | 小写,下划线分隔 | sys_user |
| 字段名 | 小写,下划线分隔 | user_name |
| 索引名 | 前缀_表名_字段名 | uk_tenant_username |
| 外键名 | fk_表名_字段名 | fk_user_dept |
### 4.2 字段规范
| 字段类型 | 使用场景 | 示例 |
|----------|----------|------|
| BIGINT | 主键、外键、ID | user_id |
| VARCHAR(50) | 编码、用户名、短文本 | user_code |
| VARCHAR(100) | 名称、标题 | user_name |
| VARCHAR(200) | 长名称、URL | project_name |
| VARCHAR(500) | 备注、描述 | remark |
| TEXT | 长文本、JSON | description |
| TINYINT | 状态、布尔值 | status |
| INT | 数量、排序 | sort_order |
| DECIMAL(15,2) | 金额 | amount |
| DATETIME | 日期时间 | created_time |
| DATE | 日期 | start_date |
### 4.3 通用字段
所有表必须包含以下字段:
| 字段名 | 类型 | 说明 |
|--------|------|------|
| created_by | BIGINT | 创建人ID |
| created_time | DATETIME | 创建时间DEFAULT CURRENT_TIMESTAMP |
| updated_by | BIGINT | 更新人ID |
| updated_time | DATETIME | 更新时间DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP |
| deleted | TINYINT | 逻辑删除标志DEFAULT 0 |
---
**文档结束**

783
doc/部署运维文档.md Normal file
View File

@ -0,0 +1,783 @@
# 资金服务平台部署运维文档
> 版本: v1.0
> 更新日期: 2026-02-13
> 作者: zhangjf
---
## 一、本地开发环境搭建
### 1.1 环境要求
| 组件 | 版本要求 | 说明 |
|------|----------|------|
| JDK | 21+ | Java开发工具包 |
| Maven | 3.9+ | 项目构建工具 |
| MySQL | 8.0+ | 数据库 |
| Redis | 7.0+ | 缓存服务 |
| Nacos | 3.0+ | 服务注册与配置中心 |
| Node.js | 18+ | 前端开发环境 |
### 1.2 安装步骤
#### 1.2.1 安装 JDK 21
```bash
# 下载并解压 JDK 21
wget https://download.java.net/openjdk/jdk21/ri/openjdk-21+35_linux-x64_bin.tar.gz
tar -xzf openjdk-21+35_linux-x64_bin.tar.gz -C /opt/
# 配置环境变量
echo 'export JAVA_HOME=/opt/jdk-21' >> ~/.bashrc
echo 'export PATH=$JAVA_HOME/bin:$PATH' >> ~/.bashrc
source ~/.bashrc
# 验证安装
java -version
```
#### 1.2.2 安装 Maven 3.9
```bash
# 下载并解压 Maven
wget https://dlcdn.apache.org/maven/maven-3/3.9.9/binaries/apache-maven-3.9.9-bin.tar.gz
tar -xzf apache-maven-3.9.9-bin.tar.gz -C /opt/
# 配置环境变量
echo 'export MAVEN_HOME=/opt/apache-maven-3.9.9' >> ~/.bashrc
echo 'export PATH=$MAVEN_HOME/bin:$PATH' >> ~/.bashrc
source ~/.bashrc
# 验证安装
mvn -version
```
#### 1.2.3 安装 MySQL 8.0
```bash
# Ubuntu/Debian
sudo apt update
sudo apt install mysql-server-8.0
# 启动 MySQL
sudo systemctl start mysql
sudo systemctl enable mysql
# 配置 root 密码
sudo mysql -e "ALTER USER 'root'@'localhost' IDENTIFIED WITH caching_sha2_password BY 'zjf@123456';"
# 创建数据库
mysql -u root -p'zjf@123456' -e "CREATE DATABASE fund_platform CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;"
```
#### 1.2.4 安装 Redis
```bash
# Ubuntu/Debian
sudo apt update
sudo apt install redis-server
# 配置密码
sudo sed -i 's/# requirepass foobared/requirepass zjf@123456/' /etc/redis/redis.conf
# 启动 Redis
sudo systemctl restart redis
sudo systemctl enable redis
# 验证安装
redis-cli -a zjf@123456 ping
```
#### 1.2.5 安装 Nacos 3.0
```bash
# 下载 Nacos
cd /opt
wget https://github.com/alibaba/nacos/releases/download/3.0.0/nacos-server-3.0.0.tar.gz
tar -xzf nacos-server-3.0.0.tar.gz
# 配置端口
cd nacos/conf
sed -i 's/server.port=8848/server.port=8048/' application.properties
# 启动 Nacos单机模式
cd /opt/nacos/bin
sh startup.sh -m standalone
# 访问控制台http://localhost:8048/nacos
# 默认账号密码nacos / nacos
```
#### 1.2.6 安装 Node.js 18
```bash
# 使用 nvm 安装
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.0/install.sh | bash
source ~/.bashrc
nvm install 18
nvm use 18
# 验证安装
node -v
npm -v
```
### 1.3 项目初始化
```bash
# 克隆项目
git clone <repository-url>
cd fundplatform
# 初始化数据库
mysql -u root -p'zjf@123456' < sql/fund_platform_schema.sql
mysql -u root -p'zjf@123456' < sql/fund_platform_init.sql
# 配置环境变量
cp .env.example .env
# 编辑 .env 文件配置数据库、Redis、Nacos 连接信息
```
### 1.4 启动服务
```bash
# 1. 确保 MySQL、Redis、Nacos 已启动
# 2. 启动后端服务(在各自服务目录执行)
cd fund-gateway
mvn spring-boot:run
cd fund-sys
mvn spring-boot:run
# 3. 启动前端Vue 3
cd fund-admin
npm install
npm run dev
# 4. 访问系统
# 管理后台http://localhost:5173
# 网关地址http://localhost:8080
# Nacos 控制台http://localhost:8048/nacos
```
---
## 二、测试环境部署
### 2.1 服务器配置
| 组件 | 配置 | 数量 |
|------|------|------|
| 应用服务器 | 4核8G | 2台 |
| 数据库服务器 | 4核8G | 1台 |
| 缓存服务器 | 2核4G | 1台 |
### 2.2 部署架构
```
┌─────────────────────────────────────────────────────────────┐
│ 测试环境部署架构 │
├─────────────────────────────────────────────────────────────┤
│ │
│ ┌──────────────┐ │
│ │ Nginx │ ← 负载均衡 + 静态资源 │
│ │ (80/443) │ │
│ └──────┬───────┘ │
│ │ │
│ ┌──────┴──────┐ │
│ │ │ │
│ ▼ ▼ │
│ ┌─────────┐ ┌─────────┐ │
│ │AppSrv-1 │ │AppSrv-2 │ ← 应用服务器Gateway + Services
│ │:8080-8090│ │:8080-8090│ │
│ └────┬────┘ └────┬────┘ │
│ │ │ │
│ └─────┬──────┘ │
│ │ │
│ ┌────────┴────────┐ │
│ │ │ │
│ ▼ ▼ │
│ ┌─────────┐ ┌─────────┐ │
│ │ MySQL │ │ Redis │ │
│ │ :3306 │ │ :6379 │ │
│ └─────────┘ └─────────┘ │
│ │
│ ┌─────────┐ │
│ │ Nacos │ ← 服务注册与配置中心 │
│ │ :8848 │ │
│ └─────────┘ │
│ │
└─────────────────────────────────────────────────────────────┘
```
### 2.3 部署步骤
#### 2.3.1 部署 Nacos
```bash
# 在服务器上安装 Nacos
cd /opt
wget https://github.com/alibaba/nacos/releases/download/3.0.0/nacos-server-3.0.0.tar.gz
tar -xzf nacos-server-3.0.0.tar.gz
cd nacos/conf
# 配置 MySQL 持久化
cat >> application.properties << EOF
spring.datasource.platform=mysql
db.num=1
db.url.0=jdbc:mysql://mysql-server:3306/nacos?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=Asia/Shanghai
db.user.0=nacos
db.password.0=nacos_password
EOF
# 启动 Nacos集群模式
cd /opt/nacos/bin
sh startup.sh
```
#### 2.3.2 部署 MySQL
```bash
# 创建数据库和用户
mysql -u root -p << EOF
CREATE DATABASE IF NOT EXISTS fund_platform CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER 'fund_user'@'%' IDENTIFIED BY 'Fund@123456';
GRANT ALL PRIVILEGES ON fund_platform.* TO 'fund_user'@'%';
FLUSH PRIVILEGES;
EOF
# 导入表结构和数据
mysql -u fund_user -p'Fund@123456' fund_platform < fund_platform_schema.sql
mysql -u fund_user -p'Fund@123456' fund_platform < fund_platform_init.sql
```
#### 2.3.3 部署 Redis
```bash
# 配置 Redis
sudo tee /etc/redis/redis.conf > /dev/null << EOF
bind 0.0.0.0
port 6379
requirepass Redis@123456
maxmemory 2gb
maxmemory-policy allkeys-lru
appendonly yes
EOF
# 启动 Redis
sudo systemctl restart redis
```
#### 2.3.4 部署应用服务
```bash
# 1. 打包应用
cd fundplatform
mvn clean package -DskipTests
# 2. 上传 jar 包到服务器
scp fund-gateway/target/fund-gateway-1.0.0.jar user@app-server-1:/opt/fundplatform/
scp fund-sys/target/fund-sys-1.0.0.jar user@app-server-1:/opt/fundplatform/
# 3. 创建启动脚本
cat > /opt/fundplatform/start.sh << 'EOF'
#!/bin/bash
APP_NAME=$1
JAR_FILE=$2
nohup java -Xms512m -Xmx1024m \
-Dspring.profiles.active=test \
-Dfile.encoding=UTF-8 \
-jar $JAR_FILE > logs/$APP_NAME.log 2>&1 &
echo "$APP_NAME started, PID: $!"
EOF
chmod +x /opt/fundplatform/start.sh
# 4. 启动服务
./start.sh gateway fund-gateway-1.0.0.jar
./start.sh sys fund-sys-1.0.0.jar
```
#### 2.3.5 部署 Nginx
```bash
# 安装 Nginx
sudo apt install nginx
# 配置反向代理
sudo tee /etc/nginx/sites-available/fundplatform << 'EOF'
upstream gateway {
server app-server-1:8080 weight=5;
server app-server-2:8080 weight=5;
}
server {
listen 80;
server_name test.fundplatform.com;
# 前端静态资源
location / {
root /opt/fundplatform/admin;
try_files $uri $uri/ /index.html;
}
# API 代理
location /api/ {
proxy_pass http://gateway/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
EOF
sudo ln -s /etc/nginx/sites-available/fundplatform /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl restart nginx
```
---
## 三、生产环境部署
### 3.1 服务器配置
| 组件 | 配置 | 数量 | 说明 |
|------|------|------|------|
| 应用服务器 | 8核16G | 3台 | 运行 Gateway 和微服务 |
| 数据库服务器 | 8核16G | 2台 | MySQL 主从 |
| 缓存服务器 | 4核8G | 3台 | Redis 集群 |
| Nacos 服务器 | 4核8G | 3台 | Nacos 集群 |
| Nginx 服务器 | 4核8G | 2台 | 负载均衡 |
### 3.2 部署架构
```
┌─────────────────────────────────────────────────────────────────────────────┐
│ 生产环境部署架构 │
├─────────────────────────────────────────────────────────────────────────────┤
│ │
│ ┌──────────────┐ ┌──────────────┐ │
│ │ Nginx-1 │◄────────────►│ Nginx-2 │ ← 负载均衡Keepalived
│ │ (VIP:80/443)│ │ │ │
│ └──────┬───────┘ └──────┬───────┘ │
│ │ │ │
│ └──────────────┬───────────────┘ │
│ │ │
│ ┌─────────────────────┼─────────────────────┐ │
│ │ │ │ │
│ ▼ ▼ ▼ │
│ ┌─────────┐ ┌─────────┐ ┌─────────┐ │
│ │AppSrv-1 │ │AppSrv-2 │ │AppSrv-3 │ ← 应用服务集群 │
│ │:8080-8090│ │:8080-8090│ │:8080-8090│ │
│ └────┬────┘ └────┬────┘ └────┬────┘ │
│ │ │ │ │
│ └───────────────────┼───────────────────┘ │
│ │ │
│ ┌──────────────────────┼──────────────────────┐ │
│ │ │ │ │
│ ▼ ▼ ▼ │
│ ┌─────────┐ ┌─────────┐ ┌─────────┐ │
│ │ MySQL │◄────────►│ MySQL │ │ Redis │ ← 数据层 │
│ │ Master │ 主从 │ Slave │ │ Cluster │ │
│ │ :3306 │ 复制 │ :3306 │ │ :6379 │ │
│ └─────────┘ └─────────┘ └────┬────┘ │
│ │ │
│ ┌─────────────────────────────────────────────┘ │
│ │ │
│ ▼ │
│ ┌─────────┐ ┌─────────┐ ┌─────────┐ │
│ │ Nacos-1 │◄►│ Nacos-2 │◄►│ Nacos-3 │ ← Nacos 集群(外置 MySQL
│ │ :8848 │ │ :8848 │ │ :8848 │ │
│ └─────────┘ └─────────┘ └─────────┘ │
│ │
└─────────────────────────────────────────────────────────────────────────────┘
```
### 3.3 高可用配置
#### 3.3.1 MySQL 主从配置
```bash
# 主库配置
[mysqld]
server-id=1
log-bin=mysql-bin
binlog-do-db=fund_platform
# 从库配置
[mysqld]
server-id=2
relay-log=mysql-relay-bin
replicate-do-db=fund_platform
# 创建复制用户
CREATE USER 'repl'@'%' IDENTIFIED BY 'Repl@123456';
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';
# 从库执行
CHANGE MASTER TO
MASTER_HOST='master-host',
MASTER_USER='repl',
MASTER_PASSWORD='Repl@123456',
MASTER_LOG_FILE='mysql-bin.000001',
MASTER_LOG_POS=154;
START SLAVE;
```
#### 3.3.2 Redis 集群配置
```bash
# 创建 6 个节点3主3从
redis-server --port 7001 --cluster-enabled yes --cluster-config-file nodes-7001.conf
redis-server --port 7002 --cluster-enabled yes --cluster-config-file nodes-7002.conf
redis-server --port 7003 --cluster-enabled yes --cluster-config-file nodes-7003.conf
redis-server --port 7004 --cluster-enabled yes --cluster-config-file nodes-7004.conf
redis-server --port 7005 --cluster-enabled yes --cluster-config-file nodes-7005.conf
redis-server --port 7006 --cluster-enabled yes --cluster-config-file nodes-7006.conf
# 创建集群
redis-cli --cluster create \
node1:7001 node1:7002 node2:7003 node2:7004 node3:7005 node3:7006 \
--cluster-replicas 1
```
#### 3.3.3 Nacos 集群配置
```bash
# 配置 cluster.conf
cat > /opt/nacos/conf/cluster.conf << EOF
nacos-1:8848
nacos-2:8848
nacos-3:8848
EOF
# 配置 MySQL 持久化
spring.datasource.platform=mysql
db.num=1
db.url.0=jdbc:mysql://mysql-cluster:3306/nacos?...
db.user.0=nacos
db.password.0=nacos_password
# 启动 Nacos
sh startup.sh
```
#### 3.3.4 Nginx + Keepalived
```bash
# 安装 Keepalived
sudo apt install keepalived
# 配置 Keepalived主节点
cat > /etc/keepalived/keepalived.conf << EOF
global_defs {
router_id NGINX_MASTER
}
vrrp_script check_nginx {
script "/etc/keepalived/check_nginx.sh"
interval 2
weight -20
}
vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.1.100/24
}
track_script {
check_nginx
}
}
EOF
# 健康检查脚本
cat > /etc/keepalived/check_nginx.sh << 'EOF'
#!/bin/bash
if ! pgrep nginx > /dev/null; then
systemctl start nginx
sleep 2
if ! pgrep nginx > /dev/null; then
systemctl stop keepalived
fi
fi
EOF
chmod +x /etc/keepalived/check_nginx.sh
```
---
## 四、运维手册
### 4.1 监控体系
#### 4.1.1 应用监控Prometheus + Grafana
```yaml
# prometheus.yml
global:
scrape_interval: 15s
scrape_configs:
- job_name: 'fund-gateway'
metrics_path: '/actuator/prometheus'
static_configs:
- targets: ['app-server-1:8080', 'app-server-2:8080', 'app-server-3:8080']
- job_name: 'fund-sys'
metrics_path: '/actuator/prometheus'
static_configs:
- targets: ['app-server-1:8081', 'app-server-2:8081', 'app-server-3:8081']
```
#### 4.1.2 关键监控指标
| 指标 | 告警阈值 | 说明 |
|------|----------|------|
| JVM 内存使用率 | > 80% | JVM 堆内存使用百分比 |
| CPU 使用率 | > 80% | 服务器 CPU 使用率 |
| 磁盘使用率 | > 85% | 磁盘空间使用百分比 |
| 接口响应时间 | > 2s | API 平均响应时间 |
| 错误率 | > 5% | HTTP 5xx 错误率 |
| MySQL 连接数 | > 80% | 数据库连接数使用率 |
| Redis 内存使用率 | > 80% | Redis 内存使用百分比 |
### 4.2 日志管理
#### 4.2.1 日志配置
```xml
<!-- logback-spring.xml -->
<configuration>
<!-- 控制台输出 -->
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] [%X{traceId}] [%X{tid}] [%X{uid}] [%X{uname}] %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>
<!-- 文件输出 -->
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>/var/log/fundplatform/app.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>/var/log/fundplatform/app.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<maxHistory>30</maxHistory>
<maxFileSize>100MB</maxFileSize>
</rollingPolicy>
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] [%X{traceId}] %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>
<root level="INFO">
<appender-ref ref="CONSOLE"/>
<appender-ref ref="FILE"/>
</root>
</configuration>
```
#### 4.2.2 ELK 日志收集
```yaml
# filebeat.yml
filebeat.inputs:
- type: log
enabled: true
paths:
- /var/log/fundplatform/*.log
fields:
service: fundplatform
multiline.pattern: '^\d{4}-\d{2}-\d{2}'
multiline.negate: true
multiline.match: after
output.elasticsearch:
hosts: ["elasticsearch:9200"]
index: "fundplatform-%{+yyyy.MM.dd}"
```
### 4.3 备份策略
#### 4.3.1 数据库备份
```bash
#!/bin/bash
# 数据库备份脚本
BACKUP_DIR="/backup/mysql"
DATE=$(date +%Y%m%d_%H%M%S)
DB_NAME="fund_platform"
DB_USER="backup_user"
DB_PASS="Backup@123456"
# 全量备份
mysqldump -u$DB_USER -p$DB_PASS --single-transaction --routines --triggers $DB_NAME > $BACKUP_DIR/${DB_NAME}_${DATE}.sql
# 压缩
gzip $BACKUP_DIR/${DB_NAME}_${DATE}.sql
# 删除 7 天前的备份
find $BACKUP_DIR -name "${DB_NAME}_*.sql.gz" -mtime +7 -delete
# 上传到对象存储
aws s3 cp $BACKUP_DIR/${DB_NAME}_${DATE}.sql.gz s3://fundplatform-backup/mysql/
```
#### 4.3.2 备份计划
| 备份类型 | 频率 | 保留时间 |
|----------|------|----------|
| 全量备份 | 每天 02:00 | 30 天 |
| 增量备份 | 每小时 | 7 天 |
| 二进制日志 | 实时 | 7 天 |
### 4.4 故障处理
#### 4.4.1 常见故障及处理
| 故障现象 | 可能原因 | 处理方案 |
|----------|----------|----------|
| 服务无法启动 | 端口冲突 | 检查端口占用,修改配置 |
| 数据库连接失败 | 连接池耗尽 | 增加连接池大小,检查慢查询 |
| 内存溢出 | 内存泄漏 | 分析堆转储,重启服务 |
| 接口超时 | 下游服务慢 | 检查依赖服务,增加熔断 |
| Redis 连接失败 | 连接数超限 | 增加连接池,检查连接泄露 |
#### 4.4.2 应急处理流程
```
1. 故障发现
2. 故障确认(查看监控、日志)
3. 故障定级P0-核心功能不可用P1-部分功能受影响P2-轻微影响)
4. 启动应急预案
- P0立即回滚或重启
- P1限流降级保留核心功能
- P2记录问题计划修复
5. 故障恢复验证
6. 故障复盘
```
### 4.5 性能优化
#### 4.5.1 JVM 调优
```bash
# 生产环境 JVM 参数
java -server \
-Xms4g -Xmx4g \
-XX:MetaspaceSize=256m \
-XX:MaxMetaspaceSize=512m \
-XX:+UseG1GC \
-XX:MaxGCPauseMillis=200 \
-XX:+HeapDumpOnOutOfMemoryError \
-XX:HeapDumpPath=/var/log/fundplatform/heapdump.hprof \
-jar app.jar
```
#### 4.5.2 MySQL 调优
```ini
# my.cnf
[mysqld]
# 连接配置
max_connections = 500
max_connect_errors = 1000
wait_timeout = 600
interactive_timeout = 600
# InnoDB 配置
innodb_buffer_pool_size = 4G
innodb_log_file_size = 512M
innodb_flush_log_at_trx_commit = 2
innodb_flush_method = O_DIRECT
# 查询缓存
query_cache_type = 1
query_cache_size = 256M
# 慢查询日志
slow_query_log = 1
slow_query_log_file = /var/log/mysql/slow.log
long_query_time = 2
```
#### 4.5.3 Redis 调优
```bash
# redis.conf
maxmemory 4gb
maxmemory-policy allkeys-lru
tcp-keepalive 300
timeout 0
```
---
## 五、附录
### 5.1 常用命令
```bash
# 查看服务状态
systemctl status mysql
systemctl status redis
systemctl status nginx
# 查看日志
tail -f /var/log/fundplatform/app.log
tail -f /var/log/nginx/access.log
# 查看进程
ps -ef | grep java
netstat -tlnp | grep 8080
# 数据库操作
mysql -u root -p
redis-cli -a password
# Nacos 管理
curl http://localhost:8848/nacos/v1/ns/instance/list?serviceName=fund-sys
```
### 5.2 端口清单
| 服务 | 端口 | 说明 |
|------|------|------|
| Nginx | 80/443 | Web 服务 |
| Gateway | 8080 | API 网关 |
| fund-sys | 8081 | 系统服务 |
| fund-cust | 8082 | 客户中心 |
| fund-proj | 8083 | 项目中心 |
| fund-req | 8084 | 需求中心 |
| fund-exp | 8085 | 支出中心 |
| fund-receipt | 8086 | 收款中心 |
| MySQL | 3306 | 数据库 |
| Redis | 6379 | 缓存 |
| Nacos | 8848 | 服务注册 |
| Nacos 控制台 | 8048 | 配置中心 |
---
**文档结束**