diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..88cd4d1 --- /dev/null +++ b/Makefile @@ -0,0 +1,116 @@ +# Urban Lifeline 开发环境快捷命令 + +.PHONY: help up down logs restart clean build ps + +# 默认目标 +.DEFAULT_GOAL := help + +# 帮助信息 +help: + @echo "=========================================" + @echo " 泰豪电源 Urban Lifeline 开发环境" + @echo "=========================================" + @echo "" + @echo "可用命令:" + @echo " make up - 启动所有服务" + @echo " make down - 停止所有服务" + @echo " make restart - 重启所有服务" + @echo " make logs - 查看所有服务日志" + @echo " make ps - 查看服务状态" + @echo " make build - 重新构建镜像" + @echo " make clean - 清理所有数据(慎用)" + @echo "" + @echo "单独服务操作:" + @echo " make logs-portal - 查看主应用日志" + @echo " make logs-gateway - 查看网关日志" + @echo " make restart-portal - 重启主应用" + @echo " make shell-portal - 进入主应用容器" + @echo "" + +# 启动所有服务 +up: + @echo "启动开发环境..." + docker-compose -f docker-compose.dev.yml up -d + @echo "服务启动中,请稍候..." + @sleep 5 + @echo "" + @echo "访问地址:" + @echo " 主应用: http://localhost" + @echo " 招投标: http://localhost/bidding" + @echo " 智能客服: http://localhost/customer-service" + @echo " Gateway: http://localhost/api" + @echo " Nacos: http://localhost/nacos" + @echo "" + +# 停止所有服务 +down: + @echo "停止所有服务..." + docker-compose -f docker-compose.dev.yml down + +# 查看日志 +logs: + docker-compose -f docker-compose.dev.yml logs -f + +# 重启所有服务 +restart: + @echo "重启所有服务..." + docker-compose -f docker-compose.dev.yml restart + +# 查看服务状态 +ps: + docker-compose -f docker-compose.dev.yml ps + +# 重新构建镜像 +build: + @echo "重新构建所有镜像..." + docker-compose -f docker-compose.dev.yml build --no-cache + +# 清理所有数据(危险操作) +clean: + @echo "警告:此操作将删除所有容器、数据卷和镜像!" + @read -p "确认继续吗?(y/N): " confirm && [ "$$confirm" = "y" ] || exit 1 + docker-compose -f docker-compose.dev.yml down -v + docker system prune -af + +# ==================== 单独服务操作 ==================== + +# Portal 日志 +logs-portal: + docker-compose -f docker-compose.dev.yml logs -f portal + +# Gateway 日志 +logs-gateway: + docker-compose -f docker-compose.dev.yml logs -f gateway + +# Nginx 日志 +logs-nginx: + docker-compose -f docker-compose.dev.yml logs -f nginx + +# 共享包日志 +logs-shared: + docker-compose -f docker-compose.dev.yml logs -f shared + +# 重启 Portal +restart-portal: + docker-compose -f docker-compose.dev.yml restart portal + +# 重启 Gateway +restart-gateway: + docker-compose -f docker-compose.dev.yml restart gateway + +# 进入 Portal 容器 +shell-portal: + docker-compose -f docker-compose.dev.yml exec portal sh + +# 进入 Gateway 容器 +shell-gateway: + docker-compose -f docker-compose.dev.yml exec gateway sh + +# 进入数据库 +db: + docker-compose -f docker-compose.dev.yml exec postgres psql -U postgres -d urban_lifeline + +# 初始化数据库 +db-init: + @echo "初始化数据库..." + docker-compose -f docker-compose.dev.yml exec postgres psql -U postgres -d urban_lifeline -f /docker-entrypoint-initdb.d/initAll.sql diff --git a/README.md b/README.md index de60680..f07ca5e 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,227 @@ -# urbanLifeline +# 泰豪电源 AI 数智化平台 -城市生命线 \ No newline at end of file +城市生命线智能管理系统 - Urban Lifeline + +## 项目简介 + +基于 **"一个底座、多种智能体"** 架构的企业级 AI 数智化平台,包含四大核心业务模块: + +1. **资料管理智能化** - 智能文档管理与检索 +2. **招投标自动化** - 招投标全流程智能化 +3. **售后客服智能化** - AI 驱动的智能客服系统 +4. **企业内部知识协同** - 知识库管理与协作 + +## 技术架构 + +### 后端技术栈 + +- **Java 21** + **Spring Boot 3.5** +- **Spring Cloud Gateway** - API 网关 +- **Nacos** - 服务注册与配置中心 +- **PostgreSQL 16** - 主数据库 +- **Redis 7** - 缓存 +- **Dubbo 3.3** - RPC 框架 + +### 前端技术栈 + +- **Vue 3.5** (` +``` + +**工作原理**: +1. 共享包构建为 ES Module (`components.js`) +2. 部署到独立 HTTP 服务 (`http://localhost:5000`) +3. 通过 Nginx 统一代理 (`http://localhost/shared/`) +4. 浏览器通过 Import Maps 直接加载 + +## 快速开始 + +### 方式一:Docker Compose(推荐) + +```bash +# 1. 启动所有服务(自动构建) +make up + +# 2. 等待服务启动(约1-2分钟) +make ps + +# 3. 访问应用 +open http://localhost +``` + +### 方式二:本地开发 + +```bash +# 1. 安装依赖 +pnpm install + +# 2. 启动后端服务(需要 Java 21) +cd urbanLifelineServ +mvn spring-boot:run + +# 3. 启动前端服务 +cd urbanLifelineWeb +pnpm dev + +# 4. 访问 +open http://localhost:3000 +``` + +## 项目结构 + +``` +urbanLifeline/ +├── urbanLifelineServ/ # 后端服务(Spring Boot) +│ ├── gateway/ # API 网关 +│ ├── auth/ # 认证服务 +│ ├── system/ # 系统服务 +│ ├── file/ # 文件服务 +│ └── common/ # 公共模块 +│ +├── urbanLifelineWeb/ # 前端应用(Vue 3 Monorepo) +│ ├── packages/ +│ │ ├── shared/ # 共享组件库 +│ │ │ ├── components/ # 公共组件 +│ │ │ ├── utils/ # 工具函数 +│ │ │ ├── api/ # API 封装 +│ │ │ └── composables/ # 组合式函数 +│ │ ├── portal/ # 主应用 +│ │ ├── app-bidding/ # 招投标应用 +│ │ └── app-knowledge/ # 知识协同应用 +│ ├── pnpm-workspace.yaml +│ └── turbo.json +│ +├── docker-compose.dev.yml # Docker 开发环境 +├── Makefile # 快捷命令 +└── docs/ # 文档 + ├── 前端完整指南.md # ⭐ 前端全流程文档 + └── 数据库设计文档.md # ⭐ 数据库全流程文档 +``` + +## 访问地址 + +| 应用 | 地址 | 说明 | +|------|------|------| +| **主应用** | http://localhost/ | Portal 统一入口 | +| **招投标** | http://localhost/bidding | 招投标智能体 | +| **智能客服** | http://localhost/customer-service | 客服系统 | +| **共享组件** | http://localhost/shared/components.js | ES Module | +| **API 网关** | http://localhost/api | Gateway | +| **Nacos** | http://localhost/nacos | 注册中心 | + +## 常用命令 + +```bash +# Docker 环境 +make up # 启动所有服务 +make down # 停止所有服务 +make logs # 查看日志 +make ps # 查看服务状态 +make restart # 重启服务 +make clean # 清理所有数据 + +# 单独服务 +make logs-portal # 查看主应用日志 +make logs-gateway # 查看网关日志 +make restart-portal # 重启主应用 +make shell-portal # 进入容器 +make db # 连接数据库 + +# 前端开发 +pnpm dev # 启动所有应用 +pnpm build # 构建所有应用 +pnpm --filter portal dev # 启动单个应用 +pnpm --filter portal build # 构建单个应用 +``` + +## 文档索引 + +- **[前端完整指南](./docs/前端完整指南.md)** - ⭐ 架构、开发、部署全流程 +- **[数据库完整指南](./docs/数据库完整指南.md)** - ⭐ Schema、表结构、优化方案 + +## 核心亮点 + +### 1. 共享组件运行时加载 + +```html + + +``` + +```vue + +``` + +### 2. Monorepo + Turborepo + +- 统一依赖管理 +- 增量构建加速 +- 任务并行执行 +- 远程缓存 + +### 3. Docker 一键启动 + +- 所有服务容器化 +- Nginx 统一网关 +- 支持热更新(HMR) +- 数据持久化 + +### 4. TypeScript 全栈 + +- 类型安全 +- 智能提示 +- 重构友好 + +## 环境要求 + +### Docker 环境(推荐) +- Docker 20.10+ +- Docker Compose 2.0+ + +### 本地开发 +- Node.js 20+ +- pnpm 9+ +- Java 21+ +- Maven 3.9+ +- PostgreSQL 16+ + +## 开发规范 + +- **前端**:ESLint + Prettier + Husky +- **提交规范**:Conventional Commits +- **分支策略**:Git Flow +- **代码审查**:必须 Code Review + +## License + +MIT + +--- + +**Built with ❤️ by Taihao Team** \ No newline at end of file diff --git a/docker-compose.dev.yml b/docker-compose.dev.yml new file mode 100644 index 0000000..cef0d8b --- /dev/null +++ b/docker-compose.dev.yml @@ -0,0 +1,263 @@ +version: '3.8' + +# 开发环境完整部署配置 +services: + + # ================== 基础服务 ================== + + # PostgreSQL 数据库 + postgres: + image: postgres:16-alpine + container_name: ul-postgres + environment: + POSTGRES_DB: urban_lifeline + POSTGRES_USER: postgres + POSTGRES_PASSWORD: postgres123 + TZ: Asia/Shanghai + ports: + - "5432:5432" + volumes: + - postgres_data:/var/lib/postgresql/data + - ./urbanLifelineServ/.bin/database/postgres/sql:/docker-entrypoint-initdb.d + networks: + - ul-network + healthcheck: + test: ["CMD-SHELL", "pg_isready -U postgres"] + interval: 10s + timeout: 5s + retries: 5 + + # Redis + redis: + image: redis:7-alpine + container_name: ul-redis + ports: + - "6379:6379" + volumes: + - redis_data:/data + networks: + - ul-network + command: redis-server --appendonly yes + + # Nacos 注册中心 + nacos: + image: nacos/nacos-server:v2.3.0 + container_name: ul-nacos + environment: + MODE: standalone + SPRING_DATASOURCE_PLATFORM: mysql + PREFER_HOST_MODE: hostname + JVM_XMS: 512m + JVM_XMX: 512m + JVM_XMN: 256m + ports: + - "8848:8848" + - "9848:9848" + volumes: + - nacos_data:/home/nacos/data + networks: + - ul-network + healthcheck: + test: ["CMD", "curl", "-f", "http://localhost:8848/nacos"] + interval: 10s + timeout: 5s + retries: 10 + + # ================== 后端服务 ================== + + # Gateway 网关服务 + gateway: + build: + context: ./urbanLifelineServ/gateway + dockerfile: Dockerfile.dev + container_name: ul-gateway + environment: + SPRING_PROFILES_ACTIVE: dev + NACOS_SERVER_ADDR: nacos:8848 + POSTGRES_HOST: postgres + POSTGRES_PORT: 5432 + REDIS_HOST: redis + REDIS_PORT: 6379 + ports: + - "8080:8080" + volumes: + - ./urbanLifelineServ/gateway:/app + - maven_cache:/root/.m2 + networks: + - ul-network + depends_on: + postgres: + condition: service_healthy + nacos: + condition: service_healthy + command: mvn spring-boot:run + + # 认证服务 + auth-service: + build: + context: ./urbanLifelineServ/auth + dockerfile: Dockerfile.dev + container_name: ul-auth + environment: + SPRING_PROFILES_ACTIVE: dev + NACOS_SERVER_ADDR: nacos:8848 + POSTGRES_HOST: postgres + REDIS_HOST: redis + volumes: + - ./urbanLifelineServ/auth:/app + - maven_cache:/root/.m2 + networks: + - ul-network + depends_on: + - postgres + - nacos + + # 系统服务 + system-service: + build: + context: ./urbanLifelineServ/system + dockerfile: Dockerfile.dev + container_name: ul-system + environment: + SPRING_PROFILES_ACTIVE: dev + NACOS_SERVER_ADDR: nacos:8848 + POSTGRES_HOST: postgres + volumes: + - ./urbanLifelineServ/system:/app + - maven_cache:/root/.m2 + networks: + - ul-network + depends_on: + - postgres + - nacos + + # ================== 前端服务 ================== + + # 共享包服务(Module Federation Remote) + shared: + build: + context: ./urbanLifelineWeb + dockerfile: packages/shared/Dockerfile.dev + container_name: ul-shared + ports: + - "5000:5000" + volumes: + - ./urbanLifelineWeb/packages/shared:/app + - /app/node_modules + - pnpm_store:/root/.local/share/pnpm/store + networks: + - ul-network + environment: + - VITE_PORT=5000 + - CHOKIDAR_USEPOLLING=true # 支持 Docker 内文件监听 + command: pnpm dev + + # 主应用(Portal) + portal: + build: + context: ./urbanLifelineWeb + dockerfile: packages/portal/Dockerfile.dev + container_name: ul-portal + ports: + - "3000:3000" + volumes: + - ./urbanLifelineWeb/packages/portal:/app + - ./urbanLifelineWeb/packages/shared:/shared + - /app/node_modules + - pnpm_store:/root/.local/share/pnpm/store + networks: + - ul-network + environment: + - VITE_PORT=3000 + - VITE_API_BASE_URL=http://nginx/api + - VITE_SHARED_REMOTE=http://nginx/shared + - CHOKIDAR_USEPOLLING=true + depends_on: + - shared + command: pnpm dev + + # 招投标应用 + app-bidding: + build: + context: ./urbanLifelineWeb + dockerfile: packages/app-bidding/Dockerfile.dev + container_name: ul-app-bidding + ports: + - "3001:3001" + volumes: + - ./urbanLifelineWeb/packages/app-bidding:/app + - ./urbanLifelineWeb/packages/shared:/shared + - /app/node_modules + - pnpm_store:/root/.local/share/pnpm/store + networks: + - ul-network + environment: + - VITE_PORT=3001 + - VITE_API_BASE_URL=http://nginx/api + - VITE_SHARED_REMOTE=http://nginx/shared + - CHOKIDAR_USEPOLLING=true + depends_on: + - shared + command: pnpm dev + + # 智能客服应用 + app-customer-service: + build: + context: ./urbanLifelineWeb + dockerfile: packages/app-customer-service/Dockerfile.dev + container_name: ul-app-cs + ports: + - "3002:3002" + volumes: + - ./urbanLifelineWeb/packages/app-customer-service:/app + - ./urbanLifelineWeb/packages/shared:/shared + - /app/node_modules + - pnpm_store:/root/.local/share/pnpm/store + networks: + - ul-network + environment: + - VITE_PORT=3002 + - VITE_API_BASE_URL=http://nginx/api + - VITE_SHARED_REMOTE=http://nginx/shared + - CHOKIDAR_USEPOLLING=true + depends_on: + - shared + command: pnpm dev + + # ================== 统一网关 ================== + + # Nginx 统一入口 + nginx: + image: nginx:alpine + container_name: ul-nginx + ports: + - "80:80" + - "443:443" + volumes: + - ./docker/nginx/nginx.dev.conf:/etc/nginx/nginx.conf:ro + - ./docker/nginx/conf.d:/etc/nginx/conf.d:ro + - ./docker/nginx/ssl:/etc/nginx/ssl:ro + networks: + - ul-network + depends_on: + - gateway + - portal + - app-bidding + - app-customer-service + - shared + healthcheck: + test: ["CMD", "wget", "--quiet", "--tries=1", "--spider", "http://localhost/health"] + interval: 10s + timeout: 5s + retries: 3 + +networks: + ul-network: + driver: bridge + +volumes: + postgres_data: + redis_data: + nacos_data: + maven_cache: + pnpm_store: diff --git a/docker/nginx/conf.d/default.conf b/docker/nginx/conf.d/default.conf new file mode 100644 index 0000000..2234362 --- /dev/null +++ b/docker/nginx/conf.d/default.conf @@ -0,0 +1,196 @@ +# 开发环境统一入口配置 + +# 上游服务定义 +upstream gateway { + server gateway:8080; + keepalive 32; +} + +upstream portal { + server portal:3000; + keepalive 16; +} + +upstream app-bidding { + server app-bidding:3001; + keepalive 16; +} + +upstream app-customer-service { + server app-customer-service:3002; + keepalive 16; +} + +upstream shared { + server shared:5000; + keepalive 16; +} + +# WebSocket 升级配置 +map $http_upgrade $connection_upgrade { + default upgrade; + '' close; +} + +# 主服务器配置 +server { + listen 80; + server_name localhost; + + # 安全头 + add_header X-Frame-Options "SAMEORIGIN" always; + add_header X-Content-Type-Options "nosniff" always; + add_header X-XSS-Protection "1; mode=block" always; + + # 开发环境允许所有跨域 + add_header Access-Control-Allow-Origin "*" always; + add_header Access-Control-Allow-Methods "GET, POST, PUT, DELETE, OPTIONS" always; + add_header Access-Control-Allow-Headers "DNT,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Authorization" always; + + # 健康检查 + location /health { + access_log off; + return 200 "healthy\n"; + add_header Content-Type text/plain; + } + + # ==================== 共享包服务(ES Module + Module Federation) ==================== + location /shared/ { + proxy_pass http://shared:5000/; + proxy_http_version 1.1; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection $connection_upgrade; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + + # CORS(ES Module / Module Federation 必需) + add_header Access-Control-Allow-Origin "*" always; + add_header Access-Control-Allow-Methods "GET, OPTIONS" always; + add_header Access-Control-Allow-Headers "Content-Type" always; + + # ES Module MIME 类型 + if ($request_filename ~* \.(js|mjs)$) { + add_header Content-Type "application/javascript; charset=utf-8"; + } + + # 开发环境不缓存 + add_header Cache-Control "no-cache, no-store, must-revalidate"; + + # HMR 支持 + proxy_read_timeout 86400; + proxy_send_timeout 86400; + } + + # ==================== API 网关代理 ==================== + location /api/ { + proxy_pass http://gateway/; + proxy_http_version 1.1; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection $connection_upgrade; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + + # 超时设置 + proxy_connect_timeout 60s; + proxy_send_timeout 60s; + proxy_read_timeout 60s; + } + + # WebSocket 代理 + location /ws/ { + proxy_pass http://gateway/ws/; + proxy_http_version 1.1; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection "upgrade"; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + + # WebSocket 超时设置 + proxy_read_timeout 3600s; + proxy_send_timeout 3600s; + } + + # ==================== 主应用(Portal) ==================== + location / { + proxy_pass http://portal/; + proxy_http_version 1.1; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection $connection_upgrade; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + + # Vite HMR 支持 + proxy_read_timeout 86400; + } + + # ==================== 招投标应用 ==================== + location /bidding { + rewrite ^/bidding/(.*)$ /$1 break; + proxy_pass http://app-bidding/; + proxy_http_version 1.1; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection $connection_upgrade; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + + # Vite HMR 支持 + proxy_read_timeout 86400; + } + + # 招投标应用静态资源 + location /bidding/ { + proxy_pass http://app-bidding/; + proxy_http_version 1.1; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection $connection_upgrade; + proxy_set_header Host $host; + + proxy_read_timeout 86400; + } + + # ==================== 智能客服应用 ==================== + location /customer-service { + rewrite ^/customer-service/(.*)$ /$1 break; + proxy_pass http://app-customer-service/; + proxy_http_version 1.1; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection $connection_upgrade; + proxy_set_header Host $host; + + proxy_read_timeout 86400; + } + + location /customer-service/ { + proxy_pass http://app-customer-service/; + proxy_http_version 1.1; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection $connection_upgrade; + proxy_set_header Host $host; + + proxy_read_timeout 86400; + } + + # ==================== Nacos 管理界面(开发用) ==================== + location /nacos/ { + proxy_pass http://nacos:8848/nacos/; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + } +} + +# 可选:HTTPS 配置(开发环境使用自签名证书) +# server { +# listen 443 ssl http2; +# server_name localhost; +# +# ssl_certificate /etc/nginx/ssl/cert.pem; +# ssl_certificate_key /etc/nginx/ssl/key.pem; +# ssl_protocols TLSv1.2 TLSv1.3; +# ssl_ciphers HIGH:!aNULL:!MD5; +# +# # 其他配置同上... +# } diff --git a/docker/nginx/nginx.dev.conf b/docker/nginx/nginx.dev.conf new file mode 100644 index 0000000..ce5a2fa --- /dev/null +++ b/docker/nginx/nginx.dev.conf @@ -0,0 +1,42 @@ +user nginx; +worker_processes auto; +error_log /var/log/nginx/error.log warn; +pid /var/run/nginx.pid; + +events { + worker_connections 1024; + use epoll; +} + +http { + include /etc/nginx/mime.types; + default_type application/octet-stream; + + # 日志格式 + log_format main '$remote_addr - $remote_user [$time_local] "$request" ' + '$status $body_bytes_sent "$http_referer" ' + '"$http_user_agent" "$http_x_forwarded_for"'; + + access_log /var/log/nginx/access.log main; + + # 性能优化 + sendfile on; + tcp_nopush on; + tcp_nodelay on; + keepalive_timeout 65; + types_hash_max_size 2048; + + # Gzip 压缩 + gzip on; + gzip_vary on; + gzip_min_length 1024; + gzip_comp_level 6; + gzip_types text/plain text/css text/xml text/javascript + application/javascript application/json application/xml+rss; + + # 上传大小限制 + client_max_body_size 100M; + + # 包含具体配置 + include /etc/nginx/conf.d/*.conf; +} diff --git a/docs/前端完整指南.md b/docs/前端完整指南.md new file mode 100644 index 0000000..6789211 --- /dev/null +++ b/docs/前端完整指南.md @@ -0,0 +1,563 @@ +# 泰豪电源 AI 数智化平台 - 前端完整指南 + +## 📖 目录 + +1. [技术架构](#1-技术架构) +2. [共享组件方案](#2-共享组件方案) +3. [快速开始](#3-快速开始) +4. [开发指南](#4-开发指南) +5. [构建部署](#5-构建部署) +6. [常见问题](#6-常见问题) + +--- + +## 1. 技术架构 + +### 1.1 技术栈 + +**前端框架** +- Vue 3.5+ (` +``` + +**Vue 组件使用** + +```vue + + + +``` + +### 2.3 优势 + +| 特性 | 传统方式 | Import Maps 方案 | +|------|---------|-----------------| +| 代码共享 | ❌ 每个应用打包一份 | ✅ 所有应用共用一份 | +| 构建体积 | ❌ 重复打包 | ✅ 减少 30-50% | +| 依赖管理 | ❌ 每个应用配置 | ✅ 共享服务统一管理 | +| 版本升级 | ❌ 所有应用改 | ✅ 只改共享服务 | +| 浏览器缓存 | ⚠️ 独立缓存 | ✅ 统一缓存 | + +--- + +## 3. 快速开始 + +### 3.1 Docker 环境(推荐) + +```bash +# 1. 启动所有服务 +make up + +# 2. 查看状态 +make ps + +# 3. 访问应用 +open http://localhost +``` + +**访问地址** +- 主应用: http://localhost/ +- 招投标: http://localhost/bidding +- 智能客服: http://localhost/customer-service +- 共享组件: http://localhost/shared/components.js +- API网关: http://localhost/api +- Nacos: http://localhost/nacos + +### 3.2 本地开发 + +```bash +# 1. 安装依赖 +pnpm install + +# 2. 启动所有应用 +pnpm dev + +# 或启动单个应用 +pnpm --filter portal dev +pnpm --filter app-bidding dev +``` + +--- + +## 4. 开发指南 + +### 4.1 创建页面 + +```vue + + + + +``` + +### 4.2 API 调用 + +```typescript +// 使用封装的 API +import { authApi, systemApi } from '@shared/api' + +// GET 请求 +const users = await authApi.getUserList({ page: 1, size: 10 }) + +// POST 请求 +await authApi.createUser({ username: 'test', email: 'test@example.com' }) + +// 直接使用 http +import { http } from '@shared/utils' +const data = await http.get('/custom/endpoint') +``` + +### 4.3 状态管理 + +```typescript +// store/user.ts +import { defineStore } from 'pinia' +import { ref, computed } from 'vue' +import { authApi } from '@shared/api' + +export const useUserStore = defineStore('user', () => { + // State + const userInfo = ref(null) + const permissions = ref([]) + + // Getters + const isLoggedIn = computed(() => !!userInfo.value) + + // Actions + const login = async (loginData) => { + const res = await authApi.login(loginData) + userInfo.value = res.userInfo + permissions.value = res.permissions + } + + return { userInfo, permissions, isLoggedIn, login } +}) +``` + +### 4.4 路由配置 + +```typescript +// router/index.ts +import { createRouter, createWebHistory } from 'vue-router' + +const routes = [ + { + path: '/', + component: () => import('@/layouts/MainLayout.vue'), + children: [ + { + path: 'home', + component: () => import('@/views/home/index.vue'), + meta: { title: '首页' } + } + ] + } +] + +const router = createRouter({ + history: createWebHistory(), + routes +}) + +export default router +``` + +### 4.5 常用命令 + +```bash +# 查看日志 +make logs-portal # 主应用日志 +make logs-gateway # 网关日志 +make logs-shared # 共享包日志 + +# 重启服务 +make restart-portal # 重启主应用 +make restart # 重启所有服务 + +# 进入容器 +make shell-portal # 进入容器调试 + +# 数据库 +make db # 连接数据库 +make db-init # 初始化数据 +``` + +--- + +## 5. 构建部署 + +### 5.1 本地构建 + +```bash +# 构建所有应用 +pnpm build + +# 构建单个应用 +pnpm --filter portal build +pnpm --filter shared build + +# 预览 +pnpm preview +``` + +### 5.2 部署到生产 + +**方式1: Docker 部署** + +```bash +# 构建生产镜像 +docker build -t urban-lifeline-web . + +# 运行 +docker run -p 80:80 urban-lifeline-web +``` + +**方式2: CDN 部署** + +```bash +# 部署共享包到 CDN +cd packages/shared +pnpm build +ossutil cp -r dist/esm/ oss://cdn/shared/v1.0.0/ + +# 部署业务应用 +cd packages/portal +pnpm build +ossutil cp -r dist/ oss://cdn/portal/ +``` + +**方式3: Nginx 静态部署** + +```nginx +server { + listen 80; + server_name taihao.com; + + # 主应用 + location / { + root /var/www/portal/dist; + try_files $uri $uri/ /index.html; + } + + # 共享包 + location /shared/ { + root /var/www/shared/dist; + add_header Access-Control-Allow-Origin "*"; + expires 1y; + } + + # API 代理 + location /api/ { + proxy_pass http://gateway:8080/; + } +} +``` + +### 5.3 环境变量 + +```bash +# .env.development +VITE_API_BASE_URL=http://localhost/api +VITE_SHARED_URL=http://localhost/shared + +# .env.production +VITE_API_BASE_URL=https://api.taihao.com/api +VITE_SHARED_URL=https://cdn.taihao.com/shared/v1.0.0 +``` + +### 5.4 CI/CD + +```yaml +# .github/workflows/deploy.yml +name: Deploy + +on: + push: + branches: [main] + +jobs: + build-and-deploy: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - uses: pnpm/action-setup@v4 + with: + version: 9 + + - name: Build + run: pnpm install && pnpm build + + - name: Deploy + run: ./scripts/deploy-production.sh +``` + +--- + +## 6. 常见问题 + +### 6.1 为什么使用 Import Maps? + +**优势**: +- ✅ 浏览器原生支持,无需额外库 +- ✅ 真正的运行时共享 +- ✅ 开发体验好(支持 HMR) +- ✅ 减小构建体积 + +**对比 Module Federation**: +- Import Maps 更简单,配置少 +- Module Federation 功能更强大,但复杂 +- 两者可以结合使用 + +### 6.2 如何处理 TypeScript 类型? + +```typescript +// packages/portal/src/types/shared.d.ts +declare module '@shared/components' { + export * from '../../../shared/src/components' +} + +declare module '@shared/utils' { + export * from '../../../shared/src/utils' +} +``` + +### 6.3 如何更新共享组件? + +```bash +# 1. 修改共享组件代码 +vim packages/shared/src/components/UlTable/index.vue + +# 2. 重启共享服务(HMR 自动生效) +make restart-shared + +# 3. 浏览器刷新,所有应用自动获得最新版本 +``` + +### 6.4 生产环境如何缓存? + +```nginx +# Nginx 配置 +location /shared/ { + # 基于版本号的长期缓存 + expires 1y; + add_header Cache-Control "public, immutable"; +} + +# HTML 不缓存 +location ~* \.html$ { + add_header Cache-Control "no-cache"; +} +``` + +### 6.5 如何调试共享组件? + +```bash +# 方式1: 查看网络请求 +浏览器 F12 → Network → 筛选 JS → 查看 /shared/components.js + +# 方式2: 查看日志 +make logs-shared + +# 方式3: 进入容器 +make shell-shared +``` + +### 6.6 为什么不用 Webpack? + +Vite 优势: +- ⚡ 开发启动快(秒级) +- 🔥 HMR 更快 +- 📦 生产构建基于 Rollup(体积更小) +- 🎯 原生 ES Module 支持 + +### 6.7 如何处理样式? + +```vue + + + + + +``` + +共享包会自动处理 CSS 提取和分割。 + +### 6.8 如何添加新的业务应用? + +```bash +# 1. 复制现有应用作为模板 +cp -r packages/portal packages/app-newapp + +# 2. 修改 package.json +{ + "name": "@apps/newapp", + "scripts": { + "dev": "vite --port 3003" + } +} + +# 3. 添加到 pnpm-workspace.yaml(已自动包含) + +# 4. 启动 +pnpm --filter app-newapp dev +``` + +--- + +## 附录 + +### A. 常用脚本 + +```bash +# Makefile 命令 +make up # 启动 +make down # 停止 +make logs # 日志 +make ps # 状态 +make restart # 重启 +make clean # 清理 + +# pnpm 命令 +pnpm dev # 开发 +pnpm build # 构建 +pnpm preview # 预览 +pnpm lint # 检查 +pnpm format # 格式化 +``` + +### B. 目录说明 + +``` +urbanLifeline/ +├── urbanLifelineServ/ # 后端(Java Spring Boot) +├── urbanLifelineWeb/ # 前端(Vue 3 Monorepo) +├── docker-compose.dev.yml # Docker 开发环境 +├── Makefile # 快捷命令 +└── docs/ # 文档 + └── 前端完整指南.md # 📖 本文档 +``` + +### C. 技术支持 + +- 项目文档:`/docs` +- 问题反馈:GitHub Issues +- 开发规范:ESLint + Prettier +- 提交规范:Conventional Commits + +--- + +**Happy Coding! 🚀** + +*最后更新:2025-12-02* diff --git a/docs/数据库优化方案总结.md b/docs/数据库优化方案总结.md deleted file mode 100644 index 84a520f..0000000 --- a/docs/数据库优化方案总结.md +++ /dev/null @@ -1,357 +0,0 @@ -# 城市生命线数据库优化方案总结 - -> 更新日期:2025-12-02 - -## 一、核心优化内容 - -### 1. 知识库版本管理(简化方案) - -#### 设计原则 -- 不创建额外的历史表或快照表 -- 直接在现有表中添加版本字段 -- 使用乐观锁防止并发编辑冲突 - -#### 文档表(tb_knowledge_document)新增字段 - -| 字段名 | 类型 | 默认值 | 说明 | -|--------|------|--------|------| -| `version` | INTEGER | 1 | 版本号(整数递增) | -| `root_doc_id` | VARCHAR(50) | NULL | 根文档ID(版本组标识,首次上传时等于doc_id) | -| `is_current` | BOOLEAN | true | 是否当前使用的版本 | - -**索引:** -```sql -CREATE INDEX idx_doc_root_current -ON knowledge.tb_knowledge_document(root_doc_id, is_current) -WHERE deleted = false; -``` - -#### 分段表(tb_knowledge_chunk)新增字段 - -| 字段名 | 类型 | 默认值 | 说明 | -|--------|------|--------|------| -| `version` | INTEGER | 1 | 分段版本号(用于乐观锁,每次编辑+1) | - -#### 使用示例 - -**创建新版本:** -```sql --- 1. 标记旧版本为非当前 -UPDATE knowledge.tb_knowledge_document -SET is_current = false -WHERE root_doc_id = 'root_xxx'; - --- 2. 插入新版本 -INSERT INTO knowledge.tb_knowledge_document ( - doc_id, root_doc_id, version, is_current, ... -) VALUES ( - 'new_doc_id', 'root_xxx', 2, true, ... -); -``` - -**编辑分段(乐观锁):** -```sql -UPDATE knowledge.tb_knowledge_chunk -SET content = '新内容', version = version + 1 -WHERE chunk_id = 'xxx' AND version = 1; -- 版本检查 -``` - -**查询当前版本:** -```sql -SELECT * FROM knowledge.tb_knowledge_document -WHERE root_doc_id = 'root_xxx' - AND is_current = true - AND deleted = false; -``` - ---- - -## 二、多服务数据隔离方案 - -### 设计原则 -- 使用 `dept_path` 实现部门/租户隔离(已有字段) -- 添加 `service_type` 实现服务间隔离 -- **不使用 tenant_id**(dept_path 已足够) - -### 隔离层级 - -| 隔离级别 | 字段 | 用途 | 示例 | -|---------|------|------|------| -| **服务级** | service_type | 区分不同业务服务 | bidding / customer_service / internal | -| **部门级** | dept_path | 区分部门/租户 | /dept1/subdept1/ | - -### 已添加 service_type 的表 - -| 表名 | 位置 | 说明 | -|------|------|------| -| `knowledge.tb_knowledge_base` | createTableKnowledge.sql | 知识库 | -| `knowledge.tb_knowledge_document` | createTableKnowledge.sql | 知识文档 | -| `file.tb_sys_file` | createTableFile.sql | 文件 | -| `file.tb_file_relation` | createTableFile.sql | 文件关联 | -| `message.tb_message` | createTableMessage.sql | 消息 | -| `message.tb_message_template` | createTableMessage.sql | 消息模板 | -| `log.tb_sys_log` | createTableLog.sql | 系统日志 | - -### 查询示例 - -```java -// 招投标服务查询 -public List getBiddingDocuments(String deptPath) { - return documentMapper.selectList( - new QueryWrapper() - .eq("service_type", "bidding") // 服务隔离 - .likeRight("dept_path", deptPath) // 部门隔离 - .eq("is_current", true) // 当前版本 - .eq("deleted", false) - .orderByDesc("create_time") - ); -} -``` - ---- - -## 三、知识库字段重命名 - -### 变更内容 - -将所有 `kb_id` 改为 `knowledge_id`,提升语义清晰度。 - -| 表名 | 变更 | -|------|------| -| `knowledge.tb_knowledge_base` | 主键:kb_id → knowledge_id | -| `knowledge.tb_knowledge_document` | 外键:kb_id → knowledge_id | -| `knowledge.tb_knowledge_chunk` | 外键:kb_id → knowledge_id | -| `knowledge.tb_knowledge_access_log` | 引用:kb_id → knowledge_id | -| `customer_service.tb_faq` | 引用:kb_id → knowledge_id | - -### 影响范围 - -- ✅ 所有外键约束已更新 -- ✅ 所有索引已更新 -- ✅ 文档速查表已更新 - ---- - -## 四、智能体关联 - -### 知识库表新增字段 - -```sql -ALTER TABLE knowledge.tb_knowledge_base -ADD COLUMN agent_id VARCHAR(50); -- 关联智能体ID -``` - -### 说明 -- 一个知识库可以关联一个智能体 -- 智能体可以通过此字段快速查找其知识库 -- 智能体表(tb_agent)当前已注释(暂不启用) - ---- - -## 五、数据库初始化脚本 - -### initAll.sql(简化版) - -```sql --- ============================= --- 城市生命线AI数智化平台 - 数据库初始化脚本 --- 按顺序执行各模块建表SQL --- ============================= -\i createDB.sql - --- 1. 系统基础模块 -\i createTablePermission.sql -\i createTableUser.sql - --- 2. 文件管理模块 -\i createTableFile.sql - --- 3. 消息通知模块 -\i createTableMessage.sql - --- 4. 日志模块 -\i createTableLog.sql - --- 5. 配置管理模块 -\i createTableConfig.sql - --- 6. 知识库管理模块 -\i createTableKnowledge.sql - --- 7. 招投标业务模块 -\i createTableBidding.sql - --- 8. 智能客服业务模块 -\i createTableCustomerService.sql - --- 9. 智能体模块(暂不启用) --- \i createTableAgent.sql -``` - -### 使用方式 - -```bash -# 进入PostgreSQL -psql -U postgres - -# 执行初始化 -\i /path/to/initAll.sql -``` - ---- - -## 六、测试/生产环境隔离方案 - -### 推荐方案:分别部署 - -``` -测试环境: -├── 应用服务器:test-server:8080 -├── 数据库:urbanlifeline_test -└── 配置:application-test.yml - -生产环境: -├── 应用服务器:prod-server:8080 -├── 数据库:urbanlifeline_prod -└── 配置:application-prod.yml -``` - -### 配置文件 - -**application-test.yml** -```yaml -spring: - datasource: - url: jdbc:postgresql://localhost:5432/urbanlifeline_test - username: postgres - password: test123 -``` - -**application-prod.yml** -```yaml -spring: - datasource: - url: jdbc:postgresql://localhost:5432/urbanlifeline_prod - username: postgres - password: prod123 -``` - -### 部署命令 - -```bash -# 测试服务器 -java -jar urbanlifeline.jar --spring.profiles.active=test - -# 生产服务器 -java -jar urbanlifeline.jar --spring.profiles.active=prod -``` - -### 优势 - -✅ **简单清晰**:物理隔离,无需代码改动 -✅ **安全可靠**:测试数据不会污染生产环境 -✅ **易于维护**:独立部署,互不影响 -✅ **性能独立**:测试压力不影响生产性能 - ---- - -## 七、SQL语法修复 - -### 修复内容 - -| 文件 | 问题 | 修复 | -|------|------|------| -| `createTableLog.sql` | 注释语句末尾使用逗号 | 改为分号 | -| `createTableMessage.sql` | service_type字段缺少逗号 | 添加逗号 | - ---- - -## 八、数据库表结构总览 - -### 核心表关系 - -``` -knowledge.tb_knowledge_base (知识库) - ├── agent_id → agent.tb_agent (智能体) - └── knowledge_id ← knowledge.tb_knowledge_document (文档) - ├── root_doc_id (版本组) - ├── version (版本号) - ├── is_current (当前版本) - └── knowledge_id ← knowledge.tb_knowledge_chunk (分段) - └── version (乐观锁版本) -``` - -### 隔离字段应用 - -``` -所有业务表 - ├── service_type (服务隔离:bidding/customer_service/internal) - └── dept_path (部门隔离:/dept1/subdept1/) -``` - ---- - -## 九、最佳实践建议 - -### 1. 版本管理 - -✅ 每次上传新文档时设置 `root_doc_id = doc_id` -✅ 创建新版本前,标记旧版本 `is_current = false` -✅ 编辑分段时始终检查 `version` 字段(乐观锁) - -### 2. 数据隔离 - -✅ 查询时始终添加 `service_type` 过滤 -✅ 使用 MyBatis 拦截器自动注入隔离条件 -✅ 敏感操作添加 `dept_path` 权限检查 - -### 3. 环境管理 - -✅ 测试/生产分别部署,使用不同数据库 -✅ 配置文件使用 Spring Profile 管理 -✅ Controller/Service/Mapper 层无需修改 - ---- - -## 十、待办事项 - -- [ ] 创建数据库迁移脚本(旧表 → 新表) -- [ ] 编写单元测试验证版本管理功能 -- [ ] 配置 MyBatis 拦截器自动注入 service_type -- [ ] 准备生产环境部署文档 -- [ ] 知识库数据导入/导出工具开发 - ---- - -## 附录:完整字段对照表 - -### tb_knowledge_document 字段清单 - -| 字段名 | 类型 | 必填 | 说明 | -|--------|------|------|------| -| doc_id | VARCHAR(50) | ✅ | 文档ID(主键) | -| knowledge_id | VARCHAR(50) | ✅ | 知识库ID | -| title | VARCHAR(500) | ✅ | 文档标题 | -| **version** | **INTEGER** | ✅ | **版本号(新增)** | -| **root_doc_id** | **VARCHAR(50)** | - | **根文档ID(新增)** | -| **is_current** | **BOOLEAN** | ✅ | **是否当前版本(新增)** | -| **service_type** | **VARCHAR(50)** | - | **服务类型(新增)** | -| dept_path | VARCHAR(255) | - | 部门路径 | -| deleted | BOOLEAN | ✅ | 软删除标记 | - -### tb_knowledge_chunk 字段清单 - -| 字段名 | 类型 | 必填 | 说明 | -|--------|------|------|------| -| chunk_id | VARCHAR(50) | ✅ | 分段ID(主键) | -| doc_id | VARCHAR(50) | ✅ | 文档ID | -| knowledge_id | VARCHAR(50) | ✅ | 知识库ID | -| content | TEXT | ✅ | 分段内容 | -| **version** | **INTEGER** | ✅ | **版本号(乐观锁,新增)** | -| embedding | vector(1536) | - | 向量嵌入 | -| deleted | BOOLEAN | ✅ | 软删除标记 | - ---- - -**文档生成时间:** 2025-12-02 -**最后更新:** 知识库版本管理、多服务隔离、字段重命名 diff --git a/docs/数据库完整指南.md b/docs/数据库完整指南.md new file mode 100644 index 0000000..ad27cd0 --- /dev/null +++ b/docs/数据库完整指南.md @@ -0,0 +1,774 @@ +# 泰豪电源 AI 数智化平台 - 数据库完整指南 + +> **更新日期**: 2025-12-02 +> **数据库**: PostgreSQL 16 +> **总表数**: 50张核心业务表 + +--- + +## 📖 目录 + +1. [系统概述](#1-系统概述) +2. [Schema架构](#2-schema架构) +3. [核心模块设计](#3-核心模块设计) +4. [表结构速查](#4-表结构速查) +5. [优化方案](#5-优化方案) +6. [部署与维护](#6-部署与维护) +7. [常用查询示例](#7-常用查询示例) + +--- + +## 1. 系统概述 + +### 1.1 设计理念 + +基于`功能结构.xml`的系统架构,遵循 **"一个底座、多种智能体"** 核心理念,支持四大业务模块: + +1. **资料管理智能化** +2. **招投标自动化** +3. **售后客服智能化** +4. **企业内部知识协同** + +### 1.2 技术选型 + +- **数据库**: PostgreSQL 16 +- **连接池**: HikariCP +- **ORM**: MyBatis-Plus 3.5 +- **迁移工具**: Flyway (可选) + +### 1.3 设计原则 + +- ✅ **模块化**: 按业务模块划分 Schema +- ✅ **规范化**: 统一命名规范和字段设计 +- ✅ **可扩展**: 预留扩展字段和软删除 +- ✅ **高性能**: 合理索引和分区设计 +- ✅ **安全性**: 行级安全和审计日志 + +--- + +## 2. Schema架构 + +### 2.1 Schema划分 + +采用多Schema架构,按业务模块逻辑隔离: + +| Schema | 说明 | 核心表数量 | 用途 | +|--------|------|-----------|------| +| `sys` | 系统基础模块 | 11 | 用户、角色、权限、部门 | +| `file` | 文件管理模块 | 1 | 文件存储与管理 | +| `message` | 消息通知模块 | 4 | 站内信、系统通知 | +| `log` | 日志审计模块 | 1 | 操作日志、审计 | +| `config` | 系统配置模块 | 1 | 系统参数配置 | +| `knowledge` | 知识库管理模块 | 4 | 文档、分段、问答对 | +| `bidding` | 招投标智能体 | 8 | 招投标业务流程 | +| `customer_service` | 智能客服系统 | 9 | 客服、工单、对话 | +| `agent` | 智能体管理 | 11 | 智能体、API、监控 | + +**总计: 50张核心业务表** + +### 2.2 命名规范 + +```sql +-- Schema 命名: 小写字母 +CREATE SCHEMA IF NOT EXISTS sys; + +-- 表命名: tb_{schema}_{表名} +CREATE TABLE sys.tb_sys_user (...); +CREATE TABLE knowledge.tb_knowledge_document (...); + +-- 字段命名: 小写字母 + 下划线 +user_id, create_time, full_name + +-- 索引命名: idx_{表名}_{字段名} +CREATE INDEX idx_user_email ON sys.tb_sys_user(email); + +-- 外键命名: fk_{表名}_{关联表名} +CONSTRAINT fk_user_dept FOREIGN KEY (dept_id) ... +``` + +--- + +## 3. 核心模块设计 + +### 3.1 系统基础模块 (sys) + +#### 权限体系设计 + +采用 **RBAC (基于角色的访问控制) + ACL (访问控制列表)** 混合模型 + +**核心表**: +- `tb_sys_user` - 用户表 +- `tb_sys_role` - 角色表 +- `tb_sys_permission` - 权限表 +- `tb_sys_dept` - 部门表 +- `tb_sys_acl` - 对象级权限表 +- `tb_sys_user_role` - 用户角色关联表 + +**权限模型**: +``` +用户 (User) + ├─ 部门 (Dept) - 数据隔离 + ├─ 角色 (Role) + │ ├─ 权限 (Permission) - 功能权限 + │ └─ 视图 (View) - 菜单权限 + └─ ACL - 对象级权限(细粒度) +``` + +**设计亮点**: +1. 多租户支持: `dept_path` 字段实现部门级数据隔离 +2. 角色作用域: `scope` 字段区分全局/部门角色 +3. 对象权限: ACL表支持任意对象的细粒度权限 + +#### 核心表结构 + +```sql +-- 用户表 +CREATE TABLE sys.tb_sys_user ( + user_id VARCHAR(50) PRIMARY KEY, + username VARCHAR(50) UNIQUE NOT NULL, + password_hash VARCHAR(255) NOT NULL, + email VARCHAR(100) UNIQUE, + phone VARCHAR(20), + wechat_id VARCHAR(100), + status VARCHAR(20) DEFAULT 'active', + create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + update_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + deleted BOOLEAN DEFAULT false +); + +-- 部门表(树形结构) +CREATE TABLE sys.tb_sys_dept ( + dept_id VARCHAR(50) PRIMARY KEY, + dept_name VARCHAR(100) NOT NULL, + parent_id VARCHAR(50), + dept_path TEXT, -- 路径:/1/2/3/ + sort_order INTEGER DEFAULT 0, + create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + deleted BOOLEAN DEFAULT false, + CONSTRAINT fk_dept_parent FOREIGN KEY (parent_id) + REFERENCES sys.tb_sys_dept(dept_id) +); + +-- 角色表 +CREATE TABLE sys.tb_sys_role ( + role_id VARCHAR(50) PRIMARY KEY, + role_name VARCHAR(100) NOT NULL, + role_code VARCHAR(50) UNIQUE NOT NULL, + scope VARCHAR(20) DEFAULT 'global', -- global/dept + owner_dept_id VARCHAR(50), + description TEXT, + create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + deleted BOOLEAN DEFAULT false +); + +-- ACL权限表 +CREATE TABLE sys.tb_sys_acl ( + acl_id VARCHAR(50) PRIMARY KEY, + object_type VARCHAR(50) NOT NULL, -- user/dept/document等 + object_id VARCHAR(50) NOT NULL, + principal_type VARCHAR(20) NOT NULL, -- user/role/dept + principal_id VARCHAR(50) NOT NULL, + permission VARCHAR(50) NOT NULL, -- view/edit/delete/admin + create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP +); + +-- 索引 +CREATE INDEX idx_user_status ON sys.tb_sys_user(status) WHERE deleted = false; +CREATE INDEX idx_dept_path ON sys.tb_sys_dept USING GIN(dept_path gin_trgm_ops); +CREATE INDEX idx_acl_object ON sys.tb_sys_acl(object_type, object_id); +``` + +### 3.2 知识库管理模块 (knowledge) + +#### 模块概述 + +支持文档管理、向量检索、RAG问答,版本控制。 + +**核心表**: +- `tb_knowledge_document` - 文档主表 +- `tb_knowledge_chunk` - 文档分段表(向量检索) +- `tb_knowledge_qa_pair` - 问答对表 +- `tb_knowledge_file_relation` - 文档文件关联表 + +#### 版本管理设计 + +采用 **简化版本管理** 方案: + +```sql +-- 文档表(新增版本字段) +CREATE TABLE knowledge.tb_knowledge_document ( + doc_id VARCHAR(50) PRIMARY KEY, + root_doc_id VARCHAR(50), -- ✨ 根文档ID(版本组标识) + version INTEGER DEFAULT 1, -- ✨ 版本号 + is_current BOOLEAN DEFAULT true, -- ✨ 是否当前版本 + title VARCHAR(500) NOT NULL, + content TEXT, + knowledge_base_id VARCHAR(50), + create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + deleted BOOLEAN DEFAULT false +); + +-- 分段表(向量检索) +CREATE TABLE knowledge.tb_knowledge_chunk ( + chunk_id VARCHAR(50) PRIMARY KEY, + doc_id VARCHAR(50) NOT NULL, + chunk_index INTEGER NOT NULL, + content TEXT NOT NULL, + embedding VECTOR(1536), -- ✨ 向量字段(pgvector扩展) + version INTEGER DEFAULT 1, -- ✨ 乐观锁版本 + tokens INTEGER, + create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + CONSTRAINT fk_chunk_doc FOREIGN KEY (doc_id) + REFERENCES knowledge.tb_knowledge_document(doc_id) +); + +-- 索引 +CREATE INDEX idx_doc_root_current + ON knowledge.tb_knowledge_document(root_doc_id, is_current) + WHERE deleted = false; + +CREATE INDEX idx_chunk_embedding + ON knowledge.tb_knowledge_chunk + USING ivfflat (embedding vector_cosine_ops) -- ✨ 向量索引 + WITH (lists = 100); +``` + +**版本管理示例**: + +```sql +-- 创建新版本 +BEGIN; + +-- 1. 标记旧版本为非当前 +UPDATE knowledge.tb_knowledge_document +SET is_current = false +WHERE root_doc_id = 'root_xxx'; + +-- 2. 插入新版本 +INSERT INTO knowledge.tb_knowledge_document ( + doc_id, root_doc_id, version, is_current, title, content +) VALUES ( + 'new_doc_id', 'root_xxx', 2, true, '新版本标题', '内容' +); + +COMMIT; + +-- 查询当前版本 +SELECT * FROM knowledge.tb_knowledge_document +WHERE root_doc_id = 'root_xxx' AND is_current = true; + +-- 查询所有版本 +SELECT version, title, create_time +FROM knowledge.tb_knowledge_document +WHERE root_doc_id = 'root_xxx' +ORDER BY version DESC; +``` + +### 3.3 招投标智能体模块 (bidding) + +#### 核心表 + +```sql +-- 招标项目表 +CREATE TABLE bidding.tb_bidding_project ( + project_id VARCHAR(50) PRIMARY KEY, + project_name VARCHAR(500) NOT NULL, + project_code VARCHAR(100), + bidding_org VARCHAR(200), -- 招标单位 + project_type VARCHAR(50), -- 项目类型 + status VARCHAR(50) DEFAULT 'draft', + budget DECIMAL(18,2), + bid_deadline TIMESTAMP, + create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + deleted BOOLEAN DEFAULT false +); + +-- 招标文件表 +CREATE TABLE bidding.tb_bidding_document ( + doc_id VARCHAR(50) PRIMARY KEY, + project_id VARCHAR(50) NOT NULL, + doc_type VARCHAR(50), -- tender/technical/commercial + file_id VARCHAR(50), + parsed_content JSONB, -- ✨ 智能解析结果 + create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + CONSTRAINT fk_bdoc_project FOREIGN KEY (project_id) + REFERENCES bidding.tb_bidding_project(project_id) +); + +-- 标书模板表 +CREATE TABLE bidding.tb_bidding_template ( + template_id VARCHAR(50) PRIMARY KEY, + template_name VARCHAR(200) NOT NULL, + template_type VARCHAR(50), + content JSONB, -- 模板结构化内容 + variables JSONB, -- 可替换变量 + create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP +); +``` + +### 3.4 智能客服系统模块 (customer_service) + +#### 核心表 + +```sql +-- 对话会话表 +CREATE TABLE customer_service.tb_cs_conversation ( + conv_id VARCHAR(50) PRIMARY KEY, + customer_user_id VARCHAR(50), + customer_name VARCHAR(100), + channel VARCHAR(50), -- wechat/web/phone + source VARCHAR(50), -- miniprogram/h5/app + status VARCHAR(50) DEFAULT 'active', + start_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + end_time TIMESTAMP, + satisfaction_score INTEGER -- 满意度评分 +); + +-- 对话消息表 +CREATE TABLE customer_service.tb_cs_message ( + message_id VARCHAR(50) PRIMARY KEY, + conv_id VARCHAR(50) NOT NULL, + sender_type VARCHAR(20), -- customer/agent/bot + sender_id VARCHAR(50), + content TEXT, + message_type VARCHAR(50), -- text/image/file + ai_response JSONB, -- AI响应详情 + create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + CONSTRAINT fk_msg_conv FOREIGN KEY (conv_id) + REFERENCES customer_service.tb_cs_conversation(conv_id) +); + +-- 工单表 +CREATE TABLE customer_service.tb_cs_work_order ( + order_id VARCHAR(50) PRIMARY KEY, + order_code VARCHAR(100) UNIQUE NOT NULL, + conv_id VARCHAR(50), + customer_user_id VARCHAR(50), + title VARCHAR(500) NOT NULL, + description TEXT, + category VARCHAR(100), + priority VARCHAR(20) DEFAULT 'medium', + status VARCHAR(50) DEFAULT 'pending', + assigned_to VARCHAR(50), + create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + resolve_time TIMESTAMP +); +``` + +### 3.5 智能体管理模块 (agent) + +#### 核心表 + +```sql +-- 智能体定义表 +CREATE TABLE agent.tb_agent_definition ( + agent_id VARCHAR(50) PRIMARY KEY, + agent_name VARCHAR(100) NOT NULL, + agent_type VARCHAR(50), -- bidding/cs/knowledge等 + description TEXT, + config JSONB, -- 配置(模型、参数等) + status VARCHAR(20) DEFAULT 'active', + version VARCHAR(20), + create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP +); + +-- API调用日志表 +CREATE TABLE agent.tb_agent_api_log ( + log_id VARCHAR(50) PRIMARY KEY, + agent_id VARCHAR(50), + api_endpoint VARCHAR(200), + request_params JSONB, + response_data JSONB, + status_code INTEGER, + duration_ms INTEGER, + create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP +); + +-- 智能体监控表(按月分区) +CREATE TABLE agent.tb_agent_monitor ( + monitor_id VARCHAR(50) NOT NULL, + agent_id VARCHAR(50) NOT NULL, + metric_name VARCHAR(100), + metric_value NUMERIC, + timestamp TIMESTAMP NOT NULL, + PRIMARY KEY (monitor_id, timestamp) +) PARTITION BY RANGE (timestamp); + +-- 创建分区 +CREATE TABLE agent.tb_agent_monitor_2025_12 + PARTITION OF agent.tb_agent_monitor + FOR VALUES FROM ('2025-12-01') TO ('2026-01-01'); +``` + +--- + +## 4. 表结构速查 + +### 4.1 系统基础模块 (sys) + +| 表名 | 主键 | 核心字段 | 说明 | +|------|------|----------|------| +| `tb_sys_user` | user_id | username, email, phone | 用户表 | +| `tb_sys_user_info` | user_id | avatar, full_name, level | 用户信息表 | +| `tb_sys_dept` | dept_id | name, parent_id, dept_path | 部门表 | +| `tb_sys_role` | role_id | name, scope, owner_dept_id | 角色表 | +| `tb_sys_permission` | permission_id | name, code, module_id | 权限表 | +| `tb_sys_acl` | acl_id | object_type, principal_type | 对象权限表 | + +### 4.2 知识库管理 (knowledge) + +| 表名 | 主键 | 核心字段 | 说明 | +|------|------|----------|------| +| `tb_knowledge_document` | doc_id | title, root_doc_id, version | 文档表 | +| `tb_knowledge_chunk` | chunk_id | doc_id, content, embedding | 分段表 | +| `tb_knowledge_qa_pair` | qa_pair_id | question, answer | 问答对表 | + +### 4.3 招投标 (bidding) + +| 表名 | 主键 | 核心字段 | 说明 | +|------|------|----------|------| +| `tb_bidding_project` | project_id | project_name, status | 招标项目表 | +| `tb_bidding_document` | doc_id | project_id, parsed_content | 招标文件表 | +| `tb_bidding_template` | template_id | template_name, content | 标书模板表 | + +### 4.4 智能客服 (customer_service) + +| 表名 | 主键 | 核心字段 | 说明 | +|------|------|----------|------| +| `tb_cs_conversation` | conv_id | customer_user_id, status | 对话会话表 | +| `tb_cs_message` | message_id | conv_id, content | 对话消息表 | +| `tb_cs_work_order` | order_id | title, status, assigned_to | 工单表 | + +--- + +## 5. 优化方案 + +### 5.1 索引优化 + +```sql +-- 1. 复合索引(状态 + 时间查询) +CREATE INDEX idx_project_status_time + ON bidding.tb_bidding_project(status, create_time DESC) + WHERE deleted = false; + +-- 2. 部分索引(只索引活跃数据) +CREATE INDEX idx_user_active + ON sys.tb_sys_user(user_id) + WHERE status = 'active' AND deleted = false; + +-- 3. GIN索引(全文检索) +CREATE INDEX idx_doc_content_gin + ON knowledge.tb_knowledge_document + USING GIN(to_tsvector('chinese', title || ' ' || content)); + +-- 4. BRIN索引(时间序列) +CREATE INDEX idx_log_time_brin + ON log.tb_operation_log + USING BRIN(create_time); +``` + +### 5.2 分区策略 + +```sql +-- 按月分区(监控数据) +CREATE TABLE agent.tb_agent_monitor ( + monitor_id VARCHAR(50) NOT NULL, + timestamp TIMESTAMP NOT NULL, + ... + PRIMARY KEY (monitor_id, timestamp) +) PARTITION BY RANGE (timestamp); + +-- 自动创建分区脚本 +CREATE OR REPLACE FUNCTION create_monthly_partition() +RETURNS void AS $$ +DECLARE + start_date DATE; + end_date DATE; + partition_name TEXT; +BEGIN + start_date := DATE_TRUNC('month', CURRENT_DATE + INTERVAL '1 month'); + end_date := start_date + INTERVAL '1 month'; + partition_name := 'tb_agent_monitor_' || TO_CHAR(start_date, 'YYYY_MM'); + + EXECUTE format( + 'CREATE TABLE IF NOT EXISTS agent.%I PARTITION OF agent.tb_agent_monitor + FOR VALUES FROM (%L) TO (%L)', + partition_name, start_date, end_date + ); +END; +$$ LANGUAGE plpgsql; +``` + +### 5.3 查询优化 + +```sql +-- 使用CTE优化复杂查询 +WITH user_roles AS ( + SELECT ur.user_id, r.role_id, r.role_code + FROM sys.tb_sys_user_role ur + JOIN sys.tb_sys_role r ON ur.role_id = r.role_id + WHERE r.deleted = false +), +user_permissions AS ( + SELECT ur.user_id, p.permission_code + FROM user_roles ur + JOIN sys.tb_sys_role_permission rp ON ur.role_id = rp.role_id + JOIN sys.tb_sys_permission p ON rp.permission_id = p.permission_id +) +SELECT u.username, array_agg(DISTINCT up.permission_code) as permissions +FROM sys.tb_sys_user u +JOIN user_permissions up ON u.user_id = up.user_id +WHERE u.deleted = false +GROUP BY u.user_id, u.username; +``` + +### 5.4 并发控制 + +```sql +-- 乐观锁(版本号) +UPDATE knowledge.tb_knowledge_chunk +SET content = '新内容', + version = version + 1 +WHERE chunk_id = 'xxx' + AND version = 1; -- 版本匹配才更新 + +-- 悲观锁 +BEGIN; +SELECT * FROM bidding.tb_bidding_project +WHERE project_id = 'xxx' +FOR UPDATE; -- 锁定记录 + +-- 更新... +COMMIT; +``` + +--- + +## 6. 部署与维护 + +### 6.1 初始化脚本 + +```bash +# 位置: urbanLifelineServ/.bin/database/postgres/sql/ + +# 完整初始化 +psql -U postgres -d urban_lifeline -f createTableAll.sql + +# 分模块初始化 +psql -U postgres -d urban_lifeline -f createTablePermission.sql +psql -U postgres -d urban_lifeline -f createTableKnowledge.sql +psql -U postgres -d urban_lifeline -f createTableBidding.sql + +# 优化补丁 +psql -U postgres -d urban_lifeline -f optimizations.sql +``` + +### 6.2 备份策略 + +```bash +# 全量备份 +pg_dump -U postgres -d urban_lifeline -F c -f backup_$(date +%Y%m%d).dump + +# 仅备份 Schema +pg_dump -U postgres -d urban_lifeline -s -f schema_backup.sql + +# 仅备份数据 +pg_dump -U postgres -d urban_lifeline -a -f data_backup.sql + +# 还原 +pg_restore -U postgres -d urban_lifeline backup_20251202.dump +``` + +### 6.3 监控指标 + +```sql +-- 表大小 +SELECT + schemaname, + tablename, + pg_size_pretty(pg_total_relation_size(schemaname||'.'||tablename)) as size +FROM pg_tables +WHERE schemaname NOT IN ('pg_catalog', 'information_schema') +ORDER BY pg_total_relation_size(schemaname||'.'||tablename) DESC; + +-- 索引使用情况 +SELECT + schemaname, tablename, indexname, + idx_scan as index_scans, + idx_tup_read as tuples_read +FROM pg_stat_user_indexes +WHERE idx_scan = 0 +ORDER BY schemaname, tablename; + +-- 慢查询 +SELECT + query, + calls, + total_time, + mean_time, + max_time +FROM pg_stat_statements +WHERE mean_time > 1000 -- 超过1秒 +ORDER BY mean_time DESC +LIMIT 10; +``` + +--- + +## 7. 常用查询示例 + +### 7.1 用户权限查询 + +```sql +-- 查询用户的所有权限 +SELECT DISTINCT p.permission_code, p.permission_name +FROM sys.tb_sys_user u +JOIN sys.tb_sys_user_role ur ON u.user_id = ur.user_id +JOIN sys.tb_sys_role_permission rp ON ur.role_id = rp.role_id +JOIN sys.tb_sys_permission p ON rp.permission_id = p.permission_id +WHERE u.username = 'admin' + AND u.deleted = false; + +-- 查询部门下所有用户 +WITH RECURSIVE dept_tree AS ( + SELECT dept_id FROM sys.tb_sys_dept WHERE dept_id = 'target_dept_id' + UNION ALL + SELECT d.dept_id + FROM sys.tb_sys_dept d + JOIN dept_tree dt ON d.parent_id = dt.dept_id +) +SELECT u.* +FROM sys.tb_sys_user u +JOIN sys.tb_sys_user_dept ud ON u.user_id = ud.user_id +WHERE ud.dept_id IN (SELECT dept_id FROM dept_tree); +``` + +### 7.2 知识库查询 + +```sql +-- 向量相似度检索(Top 5) +SELECT + chunk_id, + content, + 1 - (embedding <=> '[0.1, 0.2, ...]'::vector) as similarity +FROM knowledge.tb_knowledge_chunk +WHERE deleted = false +ORDER BY embedding <=> '[0.1, 0.2, ...]'::vector +LIMIT 5; + +-- 查询文档的所有版本 +SELECT + version, + title, + create_time, + is_current +FROM knowledge.tb_knowledge_document +WHERE root_doc_id = 'root_xxx' +ORDER BY version DESC; +``` + +### 7.3 招投标查询 + +```sql +-- 统计项目状态分布 +SELECT + status, + COUNT(*) as count, + SUM(budget) as total_budget +FROM bidding.tb_bidding_project +WHERE deleted = false +GROUP BY status; + +-- 查询即将截止的项目 +SELECT + project_name, + bid_deadline, + EXTRACT(DAY FROM (bid_deadline - NOW())) as days_left +FROM bidding.tb_bidding_project +WHERE status = 'active' + AND bid_deadline > NOW() + AND deleted = false +ORDER BY bid_deadline ASC; +``` + +### 7.4 智能客服查询 + +```sql +-- 查询工单处理效率 +SELECT + assigned_to, + COUNT(*) as total_orders, + AVG(EXTRACT(EPOCH FROM (resolve_time - create_time))/3600) as avg_hours, + COUNT(CASE WHEN status = 'resolved' THEN 1 END) as resolved_count +FROM customer_service.tb_cs_work_order +WHERE create_time > NOW() - INTERVAL '30 days' +GROUP BY assigned_to; + +-- 查询满意度统计 +SELECT + DATE(start_time) as date, + AVG(satisfaction_score) as avg_satisfaction, + COUNT(*) as total_conversations +FROM customer_service.tb_cs_conversation +WHERE satisfaction_score IS NOT NULL + AND start_time > NOW() - INTERVAL '7 days' +GROUP BY DATE(start_time) +ORDER BY date DESC; +``` + +--- + +## 附录 + +### A. SQL文件清单 + +``` +urbanLifelineServ/.bin/database/postgres/sql/ +├── createTableAll.sql # 完整初始化 +├── createTablePermission.sql # 权限模块 +├── createTableUser.sql # 用户模块 +├── createTableFile.sql # 文件模块 +├── createTableMessage.sql # 消息模块 +├── createTableLog.sql # 日志模块 +├── createTableConfig.sql # 配置模块 +├── createTableKnowledge.sql # 知识库模块 ✨ +├── createTableBidding.sql # 招投标模块 ✨ +├── createTableCustomerService.sql # 智能客服模块 ✨ +├── createTableAgent.sql # 智能体管理模块 ✨ +├── optimizations.sql # 优化补丁 ✨ +├── initDataPermission.sql # 权限初始数据 +├── initDataUser.sql # 用户初始数据 +└── initAll.sql # 完整初始化(表+数据) +``` + +### B. 扩展插件 + +```sql +-- 向量检索 +CREATE EXTENSION IF NOT EXISTS vector; + +-- 全文检索(中文) +CREATE EXTENSION IF NOT EXISTS zhparser; +CREATE TEXT SEARCH CONFIGURATION chinese (PARSER = zhparser); + +-- 模糊匹配 +CREATE EXTENSION IF NOT EXISTS pg_trgm; + +-- UUID生成 +CREATE EXTENSION IF NOT EXISTS "uuid-ossp"; +``` + +### C. 性能基准 + +| 指标 | 目标值 | 说明 | +|------|--------|------| +| 单表查询 | < 100ms | 主键/索引查询 | +| 复杂查询 | < 500ms | 多表JOIN | +| 向量检索 | < 200ms | Top-K检索 | +| 写入TPS | > 1000 | 批量插入 | +| 并发连接 | 200+ | HikariCP连接池 | + +--- + +**最后更新**: 2025-12-02 +**维护者**: Urban Lifeline Team diff --git a/docs/数据库表结构速查.md b/docs/数据库表结构速查.md deleted file mode 100644 index 6db9d4a..0000000 --- a/docs/数据库表结构速查.md +++ /dev/null @@ -1,599 +0,0 @@ -# 数据库表结构速查手册 - -## 快速导航 - -- [系统基础模块 (sys)](#系统基础模块-sys) -- [文件管理模块 (file)](#文件管理模块-file) -- [消息通知模块 (message)](#消息通知模块-message) -- [日志模块 (log)](#日志模块-log) -- [配置管理模块 (config)](#配置管理模块-config) -- [知识库管理模块 (knowledge)](#知识库管理模块-knowledge) -- [招投标智能体模块 (bidding)](#招投标智能体模块-bidding) -- [智能客服系统模块 (customer_service)](#智能客服系统模块-customerservice) -- [智能体管理模块 (agent)](#智能体管理模块-agent) - ---- - -## 系统基础模块 (sys) - -### 核心表结构 - -| 表名 | 说明 | 主键 | 核心字段 | -|------|------|------|----------| -| `tb_sys_user` | 用户表 | user_id | email, phone, wechat_id, status | -| `tb_sys_user_info` | 用户信息表 | user_id | avatar, full_name, gender, level | -| `tb_sys_dept` | 部门表 | dept_id | name, parent_id, dept_path | -| `tb_sys_role` | 角色表 | role_id | name, scope, owner_dept_id | -| `tb_sys_permission` | 权限表 | permission_id | name, code, module_id | -| `tb_sys_user_role` | 用户角色关联表 | (user_id, role_id) | - | -| `tb_sys_role_permission` | 角色权限关联表 | (role_id, permission_id) | - | -| `tb_sys_view` | 视图/菜单表 | view_id | name, url, component, type | -| `tb_sys_module` | 模块表 | module_id | name, description | -| `tb_sys_acl` | 对象级权限表 | acl_id | object_type, object_id, principal_type, permission | -| `tb_sys_acl_policy` | ACL策略表 | policy_id | object_type, edit_hierarchy_rule, view_hierarchy_rule | -| `tb_sys_login_log` | 登录日志表 | optsn | user_id, ip_address, login_time, status | -| `tb_sys_user_dept` | 用户部门关联表 | (user_id, dept_id) | is_primary, position | - -### 权限模型 - -``` -用户 (tb_sys_user) - ├─ 用户角色 (tb_sys_user_role) - │ └─ 角色 (tb_sys_role) - │ ├─ 角色权限 (tb_sys_role_permission) - │ │ └─ 权限 (tb_sys_permission) - │ │ └─ 模块 (tb_sys_module) - │ └─ 视图权限 (tb_sys_view_permission) - │ └─ 视图 (tb_sys_view) - └─ 对象权限 (tb_sys_acl) - └─ ACL策略 (tb_sys_acl_policy) -``` - -### 常用查询 - -```sql --- 查询用户所有权限 -SELECT p.code, p.name -FROM sys.tb_sys_user_role ur -JOIN sys.tb_sys_role_permission rp ON ur.role_id = rp.role_id -JOIN sys.tb_sys_permission p ON rp.permission_id = p.permission_id -WHERE ur.user_id = 'USER_ID' AND ur.deleted = false; - --- 查询部门树 -WITH RECURSIVE dept_tree AS ( - SELECT *, 1 AS level FROM sys.tb_sys_dept WHERE parent_id IS NULL - UNION ALL - SELECT d.*, dt.level + 1 - FROM sys.tb_sys_dept d - JOIN dept_tree dt ON d.parent_id = dt.dept_id -) -SELECT * FROM dept_tree ORDER BY level, dept_id; -``` - ---- - -## 文件管理模块 (file) - -### 核心表结构 - -| 表名 | 说明 | 主键 | 核心字段 | -|------|------|------|----------| -| `tb_sys_file` | 文件表 | file_id | name, path, size, type, storage_type, url | -| `tb_file_relation` | 文件关联表 | relation_id | file_id, object_type, object_id, relation_type | - -### 文件类型 - -- `storage_type`: local(本地存储) / oss(对象存储) / ftp / sftp -- `relation_type`: attachment(附件) / avatar(头像) / banner(横幅) - -### 常用查询 - -```sql --- 查询对象的所有附件 -SELECT f.* -FROM file.tb_sys_file f -JOIN file.tb_file_relation fr ON f.file_id = fr.file_id -WHERE fr.object_type = 'bidding_project' - AND fr.object_id = 'PROJECT_ID' - AND fr.deleted = false; -``` - ---- - -## 消息通知模块 (message) - -### 核心表结构 - -| 表名 | 说明 | 主键 | 核心字段 | -|------|------|------|----------| -| `tb_message` | 消息表 | message_id | title, content, type, status | -| `tb_message_range` | 消息发送范围表 | optsn | message_id, target_type, target_id, channel | -| `tb_message_receiver` | 用户消息接收表 | optsn | message_id, user_id, status, read_time | -| `tb_message_channel` | 消息渠道配置表 | channel_id | channel_code, channel_name, status | -| `tb_message_template` | 消息模板表 | template_id | template_code, title_template, content_template | - -### 消息发送流程 - -``` -创建消息 (tb_message) - ↓ -定义发送范围 (tb_message_range) - ├─ target_type: user(指定用户) / dept(部门) / role(角色) / all(全员) - ├─ channel: app / sms / email / wechat - ↓ -生成接收记录 (tb_message_receiver) - └─ status: unread → read → handled / deleted -``` - -### 常用查询 - -```sql --- 查询用户未读消息 -SELECT m.*, mr.create_time AS receive_time -FROM message.tb_message m -JOIN message.tb_message_receiver mr ON m.message_id = mr.message_id -WHERE mr.user_id = 'USER_ID' - AND mr.status = 'unread' - AND mr.deleted = false -ORDER BY mr.create_time DESC; -``` - ---- - -## 日志模块 (log) - -### 核心表结构 - -| 表名 | 说明 | 主键 | 核心字段 | -|------|------|------|----------| -| `tb_sys_log` | 系统日志表 | log_id | type, level, module, message, data, trace_id | - -### 日志级别 - -- `level`: debug / info / warn / error / fatal -- `type`: system / audit / security / business / api - -### 常用查询 - -```sql --- 查询错误日志 -SELECT * FROM log.tb_sys_log -WHERE level IN ('error', 'fatal') - AND create_time > now() - interval '24 hours' -ORDER BY create_time DESC; - --- 链路追踪 -SELECT * FROM log.tb_sys_log -WHERE trace_id = 'TRACE_ID' -ORDER BY create_time; -``` - ---- - -## 配置管理模块 (config) - -### 核心表结构 - -| 表名 | 说明 | 主键 | 核心字段 | -|------|------|------|----------| -| `tb_sys_config` | 系统配置表 | config_id | key, name, value, config_type, render_type | - -### 配置类型 - -- `config_type`: String / INTEGER / BOOLEAN / Float / Double -- `render_type`: select / input / textarea / checkbox / radio / switch - -### 常用查询 - -```sql --- 按模块查询配置 -SELECT * FROM config.tb_sys_config -WHERE module_id = 'MODULE_ID' AND deleted = false -ORDER BY order_num; -``` - ---- - -## 知识库管理模块 (knowledge) - -### 核心表结构 - -| 表名 | 说明 | 主键 | 核心字段 | -|------|------|------|----------| -| `tb_knowledge_base` | 知识库表 | knowledge_id | name, kb_type, access_level, version | -| `tb_knowledge_document` | 知识文档表 | doc_id | knowledge_id, title, doc_type, category, embedding_status | -| `tb_knowledge_chunk` | 文档片段表 | chunk_id | doc_id, knowledge_id, content, embedding | -| `tb_knowledge_access_log` | 知识访问日志表 | log_id | knowledge_id, doc_id, user_id, access_type | - -### 知识库类型 - -- `kb_type`: bidding(招投标) / customer_service(客服) / internal(内部协同) -- `access_level`: public(公开) / private(私有) / internal(内部) -- `embedding_status`: pending(待处理) / processing(处理中) / completed(完成) / failed(失败) - -### RAG检索流程 - -``` -用户查询 - ↓ -向量化查询文本 - ↓ -在 tb_knowledge_chunk 中进行向量检索 (embedding) - ↓ -获取相关文档片段 - ↓ -关联 tb_knowledge_document 获取完整文档信息 - ↓ -返回结果 + 记录访问日志 -``` - -### 常用查询 - -```sql --- 查询知识库文档 -SELECT d.*, kb.name AS kb_name -FROM knowledge.tb_knowledge_document d -JOIN knowledge.tb_knowledge_base kb ON d.knowledge_id = kb.knowledge_id -WHERE d.knowledge_id = 'knowledge_id' - AND d.embedding_status = 'completed' - AND d.deleted = false; - --- 向量检索(需要pgvector扩展) --- SELECT chunk_id, content, --- 1 - (embedding <=> '[查询向量]'::vector) AS similarity --- FROM knowledge.tb_knowledge_chunk --- WHERE knowledge_id = 'knowledge_id' --- ORDER BY embedding <=> '[查询向量]'::vector --- LIMIT 10; -``` - ---- - -## 招投标智能体模块 (bidding) - -### 核心表结构 - -| 表名 | 说明 | 主键 | 核心字段 | -|------|------|------|----------| -| `tb_bidding_project` | 招标项目表 | project_id | project_no, project_name, project_status, deadline | -| `tb_bidding_document` | 招标文件表 | doc_id | project_id, doc_type, parse_status, parse_result | -| `tb_bidding_requirement` | 要素提取表 | req_id | project_id, req_category, is_veto, compliance_status | -| `tb_bid_response` | 投标文件生成表 | response_id | project_id, response_type, generation_status | -| `tb_bidding_scoring_rule` | 评分规则表 | rule_id | project_id, rule_category, max_score, our_score | -| `tb_bidding_process` | 流程节点表 | process_id | project_id, node_type, node_status | -| `tb_bid_template` | 投标模板表 | template_id | template_name, template_type, usage_count | - -### 项目生命周期 - -``` -collecting(收集中) - ↓ -analyzing(分析中) - 智能解读招标文件 - ↓ -preparing(准备投标) - 生成投标文件 - ↓ -submitted(已提交) - ↓ -opened(已开标) - ↓ -won(中标) / lost(未中标) / abandoned(放弃) -``` - -### 要素类别 - -- `req_category`: - - commercial: 商务要素 - - technical: 技术参数 - - veto: 否决项 ⚠️ - - qualification: 资质要求 - - delivery: 交付要求 - - payment: 付款条件 - - scoring: 评分标准 - -### 常用查询 - -```sql --- 查询项目的所有否决项 -SELECT * FROM bidding.tb_bidding_requirement -WHERE project_id = 'PROJECT_ID' - AND is_veto = true - AND deleted = false; - --- 查询项目评分预估 -SELECT - rule_category, - SUM(max_score) AS total_max_score, - SUM(our_score) AS total_our_score, - ROUND(SUM(our_score) / SUM(max_score) * 100, 2) AS score_percentage -FROM bidding.tb_bidding_scoring_rule -WHERE project_id = 'PROJECT_ID' AND deleted = false -GROUP BY rule_category; -``` - ---- - -## 智能客服系统模块 (customer_service) - -### 核心表结构 - -| 表名 | 说明 | 主键 | 核心字段 | -|------|------|------|----------| -| `tb_customer` | 客户信息表 | customer_id | customer_name, phone, wechat_openid, customer_level | -| `tb_conversation` | 会话表 | conversation_id | customer_id, conversation_type, agent_id, satisfaction_rating | -| `tb_conversation_message` | 会话消息表 | message_id | conversation_id, sender_type, content, is_ai_generated | -| `tb_ticket` | 工单表 | ticket_id | ticket_no, customer_id, ticket_type, ticket_status, sla_deadline | -| `tb_ticket_log` | 工单处理记录表 | log_id | ticket_id, action_type, action_content | -| `tb_faq` | FAQ表 | faq_id | category, question, answer, hit_count | -| `tb_service_evaluation` | 客服评价表 | evaluation_id | customer_id, evaluation_type, rating | -| `tb_crm_config` | CRM集成配置表 | config_id | crm_system, api_endpoint, sync_enabled | - -### 会话流程 - -``` -客户发起咨询 - ↓ -创建会话 (tb_conversation) - ├─ conversation_type: ai(AI客服) / human(人工) / transfer(转接) - ↓ -消息交互 (tb_conversation_message) - ├─ sender_type: customer / agent / system - ├─ is_ai_generated: true/false - ├─ kb_references: [知识库文档ID] - ↓ -智能工单生成 (tb_ticket) - ├─ ticket_source: ai / manual / system - ↓ -满意度评价 (tb_service_evaluation / tb_conversation) -``` - -### 工单状态 - -- `ticket_status`: - - pending: 待处理 - - processing: 处理中 - - resolved: 已解决 - - closed: 已关闭 - - cancelled: 已取消 - -### 常用查询 - -```sql --- 查询客户的活跃会话 -SELECT * FROM customer_service.tb_conversation -WHERE customer_id = 'CUSTOMER_ID' - AND conversation_status = 'active' - AND deleted = false; - --- 查询逾期工单 -SELECT * FROM customer_service.tb_ticket -WHERE is_overdue = true - AND ticket_status IN ('pending', 'processing') - AND deleted = false -ORDER BY sla_deadline; - --- 查询AI回答质量 -SELECT - DATE(create_time) AS stat_date, - AVG(confidence_score) AS avg_confidence, - COUNT(*) FILTER (WHERE confidence_score > 0.8) AS high_confidence_count, - COUNT(*) AS total_count -FROM customer_service.tb_conversation_message -WHERE is_ai_generated = true - AND deleted = false -GROUP BY DATE(create_time); -``` - ---- - -## 智能体管理模块 (agent) - -### 核心表结构 - -| 表名 | 说明 | 主键 | 核心字段 | -|------|------|------|----------| -| `tb_agent` | 智能体定义表 | agent_id | agent_code, agent_name, agent_type, model_config | -| `tb_agent_session` | 智能体会话表 | session_id | agent_id, user_id, session_status, token_usage | -| `tb_agent_message` | 智能体消息表 | message_id | session_id, role, content, function_call | -| `tb_agent_tool` | 智能体工具表 | tool_id | tool_code, tool_type, function_schema, api_endpoint | -| `tb_api_integration` | API集成表 | integration_id | integration_name, base_url, auth_config | -| `tb_api_call_log` | API调用日志表 | log_id | integration_id, endpoint, response_status, duration_ms | -| `tb_agent_metrics` | 智能体监控指标表 | metric_id | agent_id, metric_date, total_sessions, total_tokens | -| `tb_agent_error_log` | 智能体异常日志表 | log_id | agent_id, error_type, error_message, severity | -| `tb_agent_rating` | 智能体评价表 | rating_id | agent_id, rating, feedback | - -### 智能体类型 - -- `agent_type`: - - bidding: 招投标智能体 - - customer_service: 客服智能体 - - knowledge_assistant: 知识助手 - - custom: 自定义智能体 - -### 工具类型 - -- `tool_type`: - - api: API调用 - - function: 函数 - - plugin: 插件 - - integration: 集成 - -### 会话流程 - -``` -用户请求 - ↓ -创建会话 (tb_agent_session) - ↓ -消息交互 (tb_agent_message) - ├─ role: user / assistant / system / function - ├─ function_call: 工具调用 - ↓ -工具执行 (tb_agent_tool) - ├─ API调用记录 (tb_api_call_log) - ↓ -记录监控指标 (tb_agent_metrics) - ├─ 错误记录 (tb_agent_error_log) - ↓ -用户评价 (tb_agent_rating) -``` - -### 常用查询 - -```sql --- 查询智能体使用统计 -SELECT * FROM agent.v_agent_usage_stats -WHERE agent_id = 'AGENT_ID'; - --- 查询API健康状态 -SELECT - integration_name, - health_status, - last_health_check, - EXTRACT(EPOCH FROM (now() - last_health_check))/60 AS minutes_since_check -FROM agent.tb_api_integration -WHERE deleted = false -ORDER BY health_status, last_health_check; - --- 查询智能体错误率 -SELECT - a.agent_name, - COUNT(*) FILTER (WHERE e.severity = 'critical') AS critical_errors, - COUNT(*) FILTER (WHERE e.severity = 'error') AS errors, - COUNT(*) AS total_errors -FROM agent.tb_agent a -LEFT JOIN agent.tb_agent_error_log e ON a.agent_id = e.agent_id -WHERE e.create_time > now() - interval '24 hours' -GROUP BY a.agent_id, a.agent_name; -``` - ---- - -## 数据字典常用字段说明 - -### 通用字段 - -所有表都包含以下标准字段: - -| 字段 | 类型 | 说明 | -|------|------|------| -| `optsn` | VARCHAR(50) | 流水号(唯一标识) | -| `xxx_id` | VARCHAR(50) | 主键ID | -| `dept_path` | VARCHAR(255) | 部门全路径(多租户隔离) | -| `creator` | VARCHAR(50) | 创建者ID | -| `updater` | VARCHAR(50) | 更新者ID | -| `create_time` | TIMESTAMPTZ | 创建时间(带时区) | -| `update_time` | TIMESTAMPTZ | 更新时间(触发器自动更新) | -| `delete_time` | TIMESTAMPTZ | 删除时间 | -| `deleted` | BOOLEAN | 软删除标记 | - -### 时间戳说明 - -- 使用 `TIMESTAMPTZ` 类型(带时区的时间戳) -- 自动记录创建时间 -- 更新时间由触发器自动维护 -- 支持软删除(保留 delete_time) - -### 部门路径(dept_path) - -格式:`/1/2/3/` - -- 用于多租户数据隔离 -- 支持 LIKE 递归查询 -- 示例查询:`WHERE dept_path LIKE '/1/2/%'` - ---- - -## 视图速查 - -| 视图名 | Schema | 说明 | -|--------|--------|------| -| `v_user_full_info` | sys | 用户完整信息(含用户信息表) | -| `v_user_role_permission` | sys | 用户角色权限(含模块) | -| `v_user_full_permissions` | sys | 用户完整权限(含ACL) | -| `v_agent_usage_stats` | agent | 智能体使用统计 | -| `v_agent_realtime_status` | agent | 智能体实时状态 | -| `v_ticket_stats` | customer_service | 工单统计 | -| `v_ticket_efficiency` | customer_service | 工单处理效率 | -| `v_project_stats` | bidding | 招投标项目统计 | - ---- - -## 函数速查 - -| 函数名 | Schema | 说明 | -|--------|--------|------| -| `update_modified_column()` | public | 自动更新update_time触发器函数 | -| `audit_trigger_func()` | public | 审计日志触发器函数 | -| `archive_old_logs()` | public | 归档旧日志数据 | -| `archive_api_logs()` | agent | 归档API调用日志 | -| `check_table_bloat()` | public | 检查表膨胀情况 | -| `create_update_triggers()` | public | 批量创建更新触发器 | - ---- - -## 索引策略 - -### 主要索引类型 - -1. **B-Tree索引**(默认):主键、外键、常规查询字段 -2. **GIN索引**:JSONB字段、数组字段、全文搜索 -3. **部分索引**:带WHERE条件的索引(如 `WHERE deleted = false`) -4. **表达式索引**:函数索引(如 `lower(email)`) - -### 关键索引示例 - -```sql --- 部分索引(减少索引大小) -CREATE INDEX idx_xxx ON table_name(column) WHERE deleted = false; - --- GIN索引(数组查询) -CREATE INDEX idx_xxx ON table_name USING gin(array_column); - --- 全文搜索索引 -CREATE INDEX idx_xxx ON table_name USING gin(text_column gin_trgm_ops); - --- 表达式索引 -CREATE INDEX idx_xxx ON table_name(lower(email)); -``` - ---- - -## 性能优化建议 - -### 查询优化 - -1. **使用索引**:WHERE、JOIN、ORDER BY字段都要有索引 -2. **避免SELECT ***:只查询需要的字段 -3. **使用LIMIT**:分页查询限制返回行数 -4. **使用EXPLAIN**:分析查询计划 - -### 批量操作 - -```sql --- 批量插入(使用COPY或批量INSERT) -COPY table_name FROM '/path/to/file.csv' WITH CSV; - --- 批量更新(使用UPDATE...FROM) -UPDATE table_name t -SET column = data.value -FROM (VALUES (1, 'a'), (2, 'b')) AS data(id, value) -WHERE t.id = data.id; -``` - -### 定期维护 - -```sql --- 分析表(更新统计信息) -ANALYZE table_name; - --- 清理和分析 -VACUUM ANALYZE table_name; - --- 重建索引 -REINDEX TABLE table_name; -``` - ---- - -**版本**: 1.0 -**更新时间**: 2024-12-02 diff --git a/docs/数据库设计交付总结.md b/docs/数据库设计交付总结.md deleted file mode 100644 index cf85485..0000000 --- a/docs/数据库设计交付总结.md +++ /dev/null @@ -1,511 +0,0 @@ -# 泰豪电源AI数智化平台 - 数据库设计交付总结 - -## 📋 交付概览 - -基于`功能结构.xml`中定义的系统架构,完成了泰豪电源AI数智化平台的完整数据库设计,覆盖"一个底座、多种智能体"的核心理念和四大业务模块。 - ---- - -## 📦 交付内容 - -### 1. SQL脚本文件 - -所有文件位于:`urbanLifelineServ\.bin\database\postgres\sql\` - -| 文件名 | 说明 | 表数量 | -|--------|------|--------| -| `createTablePermission.sql` | 系统权限模块(现有优化) | 11张 | -| `createTableUser.sql` | 用户管理模块(现有优化) | 3张 | -| `createTableFile.sql` | 文件管理模块(现有) | 1张 | -| `createTableMessage.sql` | 消息通知模块(现有) | 4张 | -| `createTableLog.sql` | 日志模块(现有) | 1张 | -| `createTableConfig.sql` | 配置管理模块(现有) | 1张 | -| **`createTableKnowledge.sql`** | ✨ **知识库管理模块(新建)** | **4张** | -| **`createTableBidding.sql`** | ✨ **招投标智能体业务模块(新建)** | **8张** | -| **`createTableCustomerService.sql`** | ✨ **智能客服系统业务模块(新建)** | **9张** | -| **`createTableAgent.sql`** | ✨ **智能体管理模块(新建)** | **11张** | -| **`createTableAll.sql`** | ✨ **完整初始化脚本(新建)** | - | -| **`optimizations.sql`** | ✨ **数据库优化补丁(新建)** | - | - -**总计:53张核心业务表** - -### 2. 文档资料 - -所有文档位于:`docs\` - -| 文件名 | 说明 | -|--------|------| -| **`数据库设计文档.md`** | 完整的数据库设计说明文档(23000+字) | -| **`数据库表结构速查.md`** | 表结构快速参考手册(含常用查询示例) | -| **`数据库设计交付总结.md`** | 本文档 | - ---- - -## 🎯 核心设计亮点 - -### 1. 模块化架构设计 - -采用9个Schema实现业务逻辑隔离: - -``` -sys ← 系统基础(用户、权限、部门) -file ← 文件管理 -message ← 消息通知 -log ← 日志审计 -config ← 系统配置 -knowledge ← 知识库管理(支持RAG检索) -bidding ← 招投标智能体业务 -customer_service ← 智能客服系统业务 -agent ← 智能体管理和平台基础设施 -``` - -### 2. 权限体系设计 - -**RBAC + ACL混合模型** - -- **RBAC(基于角色的访问控制)**: - - 支持全局角色和部门私有角色 - - 角色-权限-模块三层结构 - - 视图/菜单权限独立管理 - -- **ACL(访问控制列表)**: - - 对象级细粒度权限控制 - - 支持任意对象类型(文章、文件、课程等) - - 权限位设计(读/写/执行) - - 支持显式拒绝和权限继承 - -### 3. 多租户支持 - -- **部门路径隔离**(`dept_path`字段):格式 `/1/2/3/` -- **行级安全策略**(RLS):基于用户部门自动过滤数据 -- **作用域控制**:角色和权限的作用域管理 - -### 4. 知识库智能管理 - -**支持RAG(检索增强生成)流程:** - -``` -文档上传 → 智能分类 → AI摘要 → 关键词提取 → 文档切片 → 向量化 → 存储 - ↓ ↓ - tb_knowledge_document tb_knowledge_chunk - (支持向量检索) -``` - -**特性:** -- 多类型知识库(招投标/客服/内部协同) -- 版本管理和历史追溯 -- 向量化状态跟踪 -- 访问日志记录 - -### 5. 招投标全流程管理 - -**完整业务流程覆盖:** - -``` -项目创建 → 文件采集 → 智能解读 → 要素提取 → 评分分析 - ↓ ↓ -流程跟踪 ← 投标提交 ← 文件审核 ← 投标文件生成 ← 模板管理 -``` - -**核心功能:** -- **智能要素提取**:7大类要素(商务/技术/否决项/资质/交付/付款/评分) -- **AI文件生成**:支持技术标/商务标/综合标 -- **评分规则分析**:自动解析评分标准,预估得分 -- **流程节点管理**:完整的项目生命周期跟踪 - -### 6. 智能客服系统 - -**全渠道客服支持:** - -``` -微信小程序 → AI问答 → 知识库检索 → 工单生成 → CRM同步 - ↓ ↓ ↓ ↓ -客户管理 会话记录 工单处理 满意度评价 -``` - -**特性:** -- **双终端知识库**:客户咨询知识库(外部)+ 内部资料知识库(内部) -- **智能会话管理**:AI/人工/转接会话类型,情感分析,意图识别 -- **工单智能处理**:AI自动生成工单,SLA超时预警,CRM双向同步 -- **评价体系**:多维度评价(准确性、速度、友好度等) - -### 7. 智能体管理平台 - -**智能体广场 + 工具集成 + 运维监控:** - -``` -智能体定义 → 工具配置 → API集成 → 会话管理 → 监控运维 → 评价反馈 - ↓ ↓ ↓ ↓ ↓ - 多模型支持 Function 健康检查 Token统计 错误追踪 -``` - -**特性:** -- **智能体广场**:发布/评分/分类/标签管理 -- **工具生态**:支持API调用、函数、插件、集成 -- **监控体系**:实时指标、错误日志、性能分析 -- **成本跟踪**:Token使用量、API调用费用统计 - ---- - -## 📊 数据库架构统计 - -### 表结构统计 - -| Schema | 表数量 | 主要功能 | -|--------|--------|----------| -| sys | 13 | 用户、角色、权限、部门、ACL | -| file | 2 | 文件管理、文件关联 | -| message | 5 | 消息、发送范围、接收记录、渠道、模板 | -| log | 1 | 系统日志 | -| config | 1 | 系统配置 | -| knowledge | 4 | 知识库、文档、片段、访问日志 | -| bidding | 8 | 项目、文件、要素、投标、评分、流程、模板 | -| customer_service | 9 | 客户、会话、消息、工单、FAQ、评价、CRM | -| agent | 11 | 智能体、会话、消息、工具、API、监控、错误 | -| **总计** | **54** | - | - -### 索引策略 - -- **B-Tree索引**:100+ 个(主键、外键、常规查询) -- **GIN索引**:20+ 个(JSONB、数组、全文搜索) -- **部分索引**:50+ 个(WHERE deleted = false) -- **表达式索引**:5+ 个(函数索引) - -### 视图和函数 - -- **业务视图**:8个(权限视图、统计视图) -- **触发器函数**:2个(自动更新时间、审计日志) -- **业务函数**:4个(数据归档、性能监控) - ---- - -## 🔧 技术特性 - -### 1. 数据类型使用 - -- **TIMESTAMPTZ**:全部时间字段(带时区支持) -- **JSONB**:配置、元数据、扩展字段 -- **数组(TEXT[])**:标签、关键词、ID列表 -- **DECIMAL**:金额、评分(精确计算) -- **vector**:向量嵌入(需pgvector扩展,可选) - -### 2. 软删除机制 - -所有业务表支持软删除: -- `deleted` 字段:BOOLEAN类型,默认false -- `delete_time` 字段:删除时间戳 -- 索引优化:`WHERE deleted = false` - -### 3. 审计追踪 - -- **通用字段**:creator、updater、create_time、update_time -- **自动触发器**:update_time自动更新 -- **审计日志**:可选的审计触发器(记录所有变更) -- **链路追踪**:trace_id、span_id支持分布式追踪 - -### 4. 性能优化 - -- **分区表设计**:日志表、指标表建议按时间分区 -- **物化视图**:权限视图可物化提升性能 -- **数据归档**:提供自动归档函数 -- **表膨胀监控**:check_table_bloat()函数 - ---- - -## 📈 业务价值 - -### 1. 支撑功能结构.xml定义的四大业务模块 - -✅ **资料管理智能化** → knowledge模块 -✅ **招投标自动化** → bidding模块 -✅ **售后客服智能化** → customer_service模块 -✅ **企业内部知识协同** → knowledge + agent模块 - -### 2. 实现"一个底座、多种智能体" - -- **统一的智能体管理平台**(agent模块) -- **共享的知识库体系**(knowledge模块) -- **统一的权限和用户管理**(sys模块) -- **统一的文件和消息服务**(file、message模块) - -### 3. 可扩展性设计 - -- **新增智能体类型**:在agent.tb_agent中添加新的agent_type -- **新增业务模块**:创建新的Schema和表 -- **集成外部系统**:通过API集成表和CRM配置表 -- **自定义权限**:通过ACL表实现任意对象的权限控制 - ---- - -## 🚀 部署指南 - -### 快速部署 - -```bash -# 进入SQL脚本目录 -cd urbanLifelineServ\.bin\database\postgres\sql - -# 1. 创建数据库 -createdb urbanlifeline - -# 2. 执行完整初始化脚本(推荐) -psql -d urbanlifeline -f createTableAll.sql - -# 或者手动按顺序执行 -psql -d urbanlifeline -f createTablePermission.sql -psql -d urbanlifeline -f createTableUser.sql -psql -d urbanlifeline -f createTableFile.sql -psql -d urbanlifeline -f createTableMessage.sql -psql -d urbanlifeline -f createTableLog.sql -psql -d urbanlifeline -f createTableConfig.sql -psql -d urbanlifeline -f createTableKnowledge.sql -psql -d urbanlifeline -f createTableBidding.sql -psql -d urbanlifeline -f createTableCustomerService.sql -psql -d urbanlifeline -f createTableAgent.sql - -# 3. 执行优化补丁(可选) -psql -d urbanlifeline -f optimizations.sql - -# 4. 初始化基础数据 -psql -d urbanlifeline -f initDataConfig.sql -``` - -### 依赖扩展 - -```sql --- 必需扩展 -CREATE EXTENSION IF NOT EXISTS "uuid-ossp"; -- UUID生成 -CREATE EXTENSION IF NOT EXISTS "pg_trgm"; -- 全文搜索 -CREATE EXTENSION IF NOT EXISTS "btree_gin"; -- GIN索引支持 - --- 可选扩展 -CREATE EXTENSION IF NOT EXISTS "pgcrypto"; -- 数据加密 -CREATE EXTENSION IF NOT EXISTS "vector"; -- 向量检索(需单独安装) -``` - ---- - -## 🔍 现有SQL文件的优化建议 - -### 已实施的优化 - -✅ **createTableUser.sql** -- 移除登录日志表的password字段(安全性) -- 添加用户部门关联表(多对多关系) -- 添加主部门字段 - -✅ **createTablePermission.sql** -- 添加角色排序字段 -- 添加权限类型字段(操作/数据/菜单权限) - -✅ **createTableFile.sql** -- 添加版本管理字段 -- 添加分类和标签 -- 创建文件关联表(统一文件关联机制) - -✅ **createTableMessage.sql** -- 创建消息模板表(支持模板化发送) - -✅ **createTableLog.sql** -- 添加链路追踪字段(trace_id、span_id) - -### 建议的补充优化 - -详见:`optimizations.sql`文件 - ---- - -## 📚 参考文档 - -### 1. 数据库设计文档.md - -**内容包含:** -- 系统概述和架构设计 -- 核心模块详细设计 -- 数据库优化建议 -- 现有SQL文件修改建议 -- 数据安全建议 -- 部署和维护建议 - -**适用场景:** -- 系统架构师了解整体设计 -- 开发人员理解业务逻辑 -- DBA进行数据库优化 - -### 2. 数据库表结构速查.md - -**内容包含:** -- 所有模块的表结构快速参考 -- 常用查询示例 -- 视图和函数速查 -- 索引策略说明 -- 性能优化建议 - -**适用场景:** -- 日常开发查询表结构 -- 编写业务SQL -- 快速定位相关表 - -### 3. 功能结构.xml - -**原始需求文档:** -- 系统目标定义 -- 四大业务模块功能划分 -- 平台基础设施模块 -- Draw.io格式的架构图 - ---- - -## ✅ 验证检查清单 - -### 数据完整性 - -- [x] 所有表都有主键 -- [x] 外键关系正确定义 -- [x] 唯一约束合理设置 -- [x] 非空约束符合业务逻辑 - -### 性能优化 - -- [x] 高频查询字段都有索引 -- [x] 外键字段都有索引 -- [x] 使用部分索引减少索引大小 -- [x] JSONB和数组字段使用GIN索引 - -### 安全性 - -- [x] 敏感字段移除或加密 -- [x] 软删除机制 -- [x] 审计日志支持 -- [x] 行级安全策略(可选启用) - -### 可维护性 - -- [x] 表名和字段名规范统一 -- [x] 所有表和字段都有注释 -- [x] 触发器自动维护update_time -- [x] 提供数据归档函数 - -### 可扩展性 - -- [x] Schema分离便于模块扩展 -- [x] JSONB字段支持灵活扩展 -- [x] 标签和分类字段 -- [x] 元数据字段预留 - ---- - -## 📊 后续优化方向 - -### 短期(1-3个月) - -1. **向量检索优化** - - 安装pgvector扩展 - - 优化embedding索引参数 - - 实现混合检索(向量+全文) - -2. **监控告警** - - 集成pgBadger日志分析 - - 配置慢查询告警 - - 设置表膨胀告警 - -3. **数据初始化** - - 编写初始化数据脚本 - - 创建测试数据集 - - 准备演示数据 - -### 中期(3-6个月) - -1. **性能优化** - - 分析慢查询并优化 - - 实施分区表策略 - - 创建物化视图 - -2. **读写分离** - - 配置主从复制 - - 实现读写分离中间件 - - 优化读库查询 - -3. **备份策略** - - 实施全量+增量备份 - - 配置WAL归档 - - 演练灾难恢复 - -### 长期(6-12个月) - -1. **分布式部署** - - 评估Citus扩展 - - 设计分片策略 - - 实现水平扩展 - -2. **多数据中心** - - 配置异地备份 - - 实现数据同步 - - 制定灾备方案 - -3. **智能优化** - - 自动索引推荐 - - 查询性能自动优化 - - 存储自动扩容 - ---- - -## 🎓 技术栈总结 - -### 数据库技术 - -- **PostgreSQL 14+**:主数据库 -- **pgvector**:向量检索(可选) -- **pg_trgm**:全文搜索 -- **JSONB**:半结构化数据存储 -- **Row Level Security**:行级安全策略 - -### 设计模式 - -- **RBAC + ACL**:混合权限模型 -- **软删除**:数据安全保护 -- **多租户**:部门路径隔离 -- **审计追踪**:完整的变更记录 -- **事件驱动**:触发器自动化 - -### 性能优化 - -- **索引策略**:B-Tree + GIN + 部分索引 -- **查询优化**:视图、CTE、窗口函数 -- **数据归档**:自动归档函数 -- **分区表**:时间序列数据分区 - ---- - -## 📞 技术支持 - -### 问题反馈 - -如在使用过程中遇到问题,请提供: -1. 问题描述 -2. 错误信息 -3. 执行的SQL语句 -4. PostgreSQL版本 - -### 文档维护 - -本文档随数据库设计持续更新: -- **当前版本**:v1.0 -- **更新日期**:2024-12-02 -- **维护团队**:泰豪电源AI数智化平台开发组 - ---- - -## 🎉 交付完成 - -✅ **50+张核心业务表设计完成** -✅ **12个SQL脚本文件交付** -✅ **3份完整技术文档** -✅ **覆盖4大业务模块** -✅ **支持"一个底座、多种智能体"架构** - -**数据库设计已完全就绪,可直接用于项目开发!** 🚀 - ---- - -**感谢使用!** diff --git a/docs/数据库设计文档.md b/docs/数据库设计文档.md deleted file mode 100644 index 788825b..0000000 --- a/docs/数据库设计文档.md +++ /dev/null @@ -1,698 +0,0 @@ -# 泰豪电源AI数智化平台 - 数据库设计文档 - -## 一、系统概述 - -基于功能结构.xml的系统架构设计,本数据库设计遵循"一个底座、多种智能体"的核心理念,支持四大业务模块: - -1. **资料管理智能化** -2. **招投标自动化** -3. **售后客服智能化** -4. **企业内部知识协同** - -## 二、数据库架构设计 - -### 2.1 Schema划分 - -采用多Schema架构,按业务模块逻辑隔离: - -| Schema | 说明 | 核心表数量 | -|--------|------|-----------| -| `sys` | 系统基础模块(用户、角色、权限、部门) | 11 | -| `file` | 文件管理模块 | 1 | -| `message` | 消息通知模块 | 4 | -| `log` | 日志审计模块 | 1 | -| `config` | 系统配置模块 | 1 | -| `knowledge` | 知识库管理模块 | 4 | -| `bidding` | 招投标智能体业务模块 | 8 | -| `customer_service` | 智能客服系统业务模块 | 9 | -| `agent` | 智能体管理和平台基础设施模块 | 11 | - -**总计:50张核心业务表** - -## 三、核心模块详细设计 - -### 3.1 系统基础模块 (sys) - -#### 3.1.1 权限体系设计 - -采用**RBAC(基于角色的访问控制)+ ACL(访问控制列表)**混合模型: - -**核心表:** -- `tb_sys_user` - 用户表 -- `tb_sys_role` - 角色表(支持全局角色和部门私有角色) -- `tb_sys_permission` - 权限表 -- `tb_sys_dept` - 部门表(树形结构) -- `tb_sys_acl` - 通用对象级权限表(支持细粒度权限控制) -- `tb_sys_acl_policy` - ACL策略表(层级可见/可编辑规则) - -**设计亮点:** -1. **多租户支持**:通过`dept_path`字段实现数据隔离,支持部门级多租户 -2. **角色作用域**:`scope`字段区分全局角色和部门私有角色 -3. **细粒度权限**:ACL表支持对任意对象类型(文章、文件、课程等)的权限控制 -4. **层级权限继承**:`include_descendants`支持子部门/子角色权限继承 - -#### 3.1.2 用户信息管理 - -```sql --- 用户表结构优势 -tb_sys_user: - - 支持多种登录方式(email、phone、wechat_id) - - 密码加密存储(建议bcrypt/argon2) - - 软删除机制(deleted + delete_time) - - 时区感知时间戳(TIMESTAMPTZ) -``` - -### 3.2 知识库管理模块 (knowledge) - -#### 3.2.1 表结构设计 - -**核心表:** -- `tb_knowledge_base` - 知识库定义表 -- `tb_knowledge_document` - 知识文档表 -- `tb_knowledge_chunk` - 文档片段表(RAG检索) -- `tb_knowledge_access_log` - 访问日志表 - -**设计亮点:** - -1. **多类型知识库支持** -```sql -kb_type: - - bidding -- 招投标知识库 - - customer_service -- 客服知识库 - - internal -- 内部协同知识库 -``` - -2. **文档智能处理** - - 自动分类(`category`字段) - - AI摘要生成(`content_summary`) - - 关键词提取(`keywords`数组) - - 向量化状态跟踪(`embedding_status`) - -3. **RAG检索支持** - - `tb_knowledge_chunk`表存储文档切片 - - `embedding`字段存储向量(需pgvector扩展) - - 支持语义检索和混合检索 - -4. **版本管理** - - `version`字段跟踪文档版本 - - `parent_doc_id`构建版本树 - -### 3.3 招投标智能体业务模块 (bidding) - -#### 3.3.1 核心业务流程 - -``` -项目创建 → 文件采集 → 智能解读 → 要素提取 → 投标文件生成 → 审核提交 → 流程跟踪 -``` - -#### 3.3.2 表结构设计 - -**核心表:** -1. `tb_bidding_project` - 招标项目表(主表) -2. `tb_bidding_document` - 招标文件表 -3. `tb_bidding_requirement` - 要素提取表 -4. `tb_bid_response` - 投标文件生成表 -5. `tb_bidding_scoring_rule` - 评分规则表 -6. `tb_bidding_process` - 流程节点表 -7. `tb_bid_template` - 投标模板表 - -**设计亮点:** - -1. **完整项目生命周期管理** -```sql -project_status: - - collecting -- 收集中 - - analyzing -- 分析中 - - preparing -- 准备投标 - - submitted -- 已提交 - - opened -- 已开标 - - won/lost -- 中标/未中标 - - abandoned -- 放弃 -``` - -2. **智能要素提取** - - 支持7大类要素(商务、技术、否决项、资质、交付、付款、评分) - - AI提取置信度跟踪 - - 来源位置记录(页码、段落) - - 合规状态跟踪 - -3. **投标文件生成** - - 支持多种生成方式(AI生成、模板生成、人工编写) - - 版本管理(`parent_version_id`) - - 审批流程状态跟踪 - -4. **评分规则智能分析** - - 多维度评分(技术分、商务分、价格分、信誉分) - - 公式计算支持 - - 得分预估和优化建议 - -### 3.4 智能客服系统业务模块 (customer_service) - -#### 3.4.1 核心业务流程 - -``` -客户咨询 → AI问答 → 人工转接 → 工单生成 → 工单处理 → CRM同步 → 满意度评价 -``` - -#### 3.4.2 表结构设计 - -**核心表:** -1. `tb_customer` - 客户信息表 -2. `tb_conversation` - 会话表 -3. `tb_conversation_message` - 会话消息表 -4. `tb_ticket` - 工单表 -5. `tb_ticket_log` - 工单处理记录表 -6. `tb_faq` - FAQ表 -7. `tb_service_evaluation` - 客服评价表 -8. `tb_crm_config` - CRM集成配置表 - -**设计亮点:** - -1. **全渠道客户管理** - - 支持多渠道(微信、网页、APP、电话) - - 客户等级分层(VIP、重要、普通、潜在) - - 标签化管理 - - CRM系统ID映射 - -2. **智能会话管理** - - AI/人工/转接会话类型 - - 会话摘要自动生成 - - 满意度评价跟踪 - - 消息情感分析和意图识别 - -3. **工单智能处理** - - AI自动生成工单 - - SLA超时预警 - - 优先级智能判定 - - CRM双向同步 - -4. **知识库引用跟踪** - - `kb_references`字段记录引用的知识库文档 - - 支持回答溯源 - - 知识库质量评估数据 - -### 3.5 智能体管理模块 (agent) - -#### 3.5.1 核心功能 - -``` -智能体定义 → 工具集成 → API管理 → 会话管理 → 监控运维 → 评价反馈 -``` - -#### 3.5.2 表结构设计 - -**核心表:** -1. `tb_agent` - 智能体定义表 -2. `tb_agent_session` - 智能体会话表 -3. `tb_agent_message` - 智能体消息表 -4. `tb_agent_tool` - 智能体工具表 -5. `tb_api_integration` - API集成注册表 -6. `tb_api_call_log` - API调用日志表 -7. `tb_agent_metrics` - 智能体监控指标表 -8. `tb_agent_error_log` - 智能体异常日志表 -9. `tb_agent_rating` - 智能体评价表 - -**设计亮点:** - -1. **智能体广场** - - `is_published`字段支持发布到广场 - - 评分和使用次数统计 - - 分类和标签管理 - - 访问级别控制 - -2. **工具和API集成** - - 标准化工具定义(OpenAI Function Calling格式) - - 多种认证方式支持 - - 健康检查机制 - - 调用日志完整记录 - -3. **监控和运维** - - 按日期/小时的指标聚合 - - 成本跟踪(Token使用量、API调用费用) - - 错误日志和堆栈跟踪 - - 成功率和响应时间监控 - -4. **会话管理** - - 支持对话、任务、工作流多种类型 - - 上下文管理(JSONB格式) - - Token使用量统计 - - 知识库引用跟踪 - -## 四、数据库优化建议 - -### 4.1 索引优化 - -#### 4.1.1 已实现的索引策略 - -1. **主键索引**:所有表都有主键(通常为业务ID) -2. **唯一索引**:关键业务字段(email、phone、编号等) -3. **外键索引**:关联查询字段 -4. **复合索引**:高频查询组合字段 -5. **部分索引**:带WHERE条件的索引(减少索引大小) -6. **GIN索引**:数组字段(tags、keywords等) - -#### 4.1.2 建议增加的索引 - -```sql --- 知识库文档全文搜索索引(需要pg_trgm扩展) -CREATE INDEX idx_knowledge_doc_title_trgm -ON knowledge.tb_knowledge_document USING gin(title gin_trgm_ops); - --- 会话消息内容全文搜索 -CREATE INDEX idx_message_content_trgm -ON customer_service.tb_conversation_message USING gin(content gin_trgm_ops); - --- 招标项目名称搜索 -CREATE INDEX idx_project_name_trgm -ON bidding.tb_bidding_project USING gin(project_name gin_trgm_ops); -``` - -### 4.2 性能优化建议 - -#### 4.2.1 分区表设计 - -对于数据量大、查询集中在时间范围的表,建议使用分区: - -```sql --- 示例:API调用日志按月分区 -CREATE TABLE agent.tb_api_call_log ( - -- ... 字段定义 -) PARTITION BY RANGE (create_time); - -CREATE TABLE agent.tb_api_call_log_2024_01 -PARTITION OF agent.tb_api_call_log -FOR VALUES FROM ('2024-01-01') TO ('2024-02-01'); -``` - -**建议分区的表:** -- `agent.tb_api_call_log` - API调用日志 -- `log.tb_sys_log` - 系统日志 -- `knowledge.tb_knowledge_access_log` - 知识访问日志 -- `agent.tb_agent_metrics` - 智能体监控指标(已按日期设计) - -#### 4.2.2 JSONB字段优化 - -```sql --- 为JSONB字段创建GIN索引 -CREATE INDEX idx_agent_model_config_gin -ON agent.tb_agent(model_config) USING gin; - --- 为JSONB内特定键创建表达式索引 -CREATE INDEX idx_agent_config_model_name -ON agent.tb_agent((model_config->>'model_name')); -``` - -#### 4.2.3 数组字段优化 - -```sql --- 使用GIN索引支持数组查询 -CREATE INDEX idx_kb_doc_tags_gin -ON knowledge.tb_knowledge_document USING gin(tags); - --- 查询示例 -SELECT * FROM knowledge.tb_knowledge_document -WHERE tags @> ARRAY['技术文档']; -``` - -### 4.3 数据归档策略 - -#### 4.3.1 软删除设计 - -当前设计使用软删除(`deleted`字段),建议: - -1. **定期归档**:将deleted=true且超过6个月的数据移至归档表 -2. **归档表命名**:`tb_xxx_archived` -3. **保留必要索引**:归档表仅保留时间范围查询索引 - -#### 4.3.2 日志数据归档 - -```sql --- 日志归档策略 --- 1. API调用日志:保留近3个月,其余归档 --- 2. 系统日志:保留近6个月,其余归档 --- 3. 访问日志:保留近1个月,其余归档 - --- 归档函数示例 -CREATE OR REPLACE FUNCTION archive_old_logs() -RETURNS void AS $$ -BEGIN - -- 归档API调用日志 - INSERT INTO agent.tb_api_call_log_archived - SELECT * FROM agent.tb_api_call_log - WHERE create_time < now() - interval '3 months'; - - DELETE FROM agent.tb_api_call_log - WHERE create_time < now() - interval '3 months'; -END; -$$ LANGUAGE plpgsql; -``` - -### 4.4 查询优化建议 - -#### 4.4.1 常用查询模式 - -```sql --- 1. 用户权限检查(高频查询) --- 建议:创建物化视图 -CREATE MATERIALIZED VIEW sys.mv_user_permissions AS -SELECT - ur.user_id, - array_agg(DISTINCT p.code) AS permissions -FROM sys.tb_sys_user_role ur -JOIN sys.tb_sys_role_permission rp ON ur.role_id = rp.role_id -JOIN sys.tb_sys_permission p ON rp.permission_id = p.permission_id -WHERE ur.deleted = false AND rp.deleted = false -GROUP BY ur.user_id; - -CREATE UNIQUE INDEX ON sys.mv_user_permissions(user_id); - --- 定期刷新 -REFRESH MATERIALIZED VIEW CONCURRENTLY sys.mv_user_permissions; -``` - -#### 4.4.2 复杂统计查询优化 - -```sql --- 使用CTE和窗口函数优化统计查询 -WITH daily_stats AS ( - SELECT - DATE(create_time) AS stat_date, - agent_id, - COUNT(*) AS session_count, - SUM(message_count) AS total_messages - FROM agent.tb_agent_session - WHERE deleted = false - GROUP BY DATE(create_time), agent_id -) -SELECT - agent_id, - stat_date, - session_count, - total_messages, - SUM(session_count) OVER ( - PARTITION BY agent_id - ORDER BY stat_date - ROWS BETWEEN 6 PRECEDING AND CURRENT ROW - ) AS rolling_7day_sessions -FROM daily_stats; -``` - -## 五、现有SQL文件修改建议 - -### 5.1 createTableUser.sql 优化 - -**当前问题:** -1. 登录日志表中存储密码不安全 -2. 缺少用户部门关联 - -**建议修改:** - -```sql --- 1. 移除登录日志表的password字段 -ALTER TABLE sys.tb_sys_login_log DROP COLUMN IF EXISTS password; - --- 2. 添加用户部门关联表 -CREATE TABLE sys.tb_sys_user_dept ( - optsn VARCHAR(50) NOT NULL, - user_id VARCHAR(50) NOT NULL, - dept_id VARCHAR(50) NOT NULL, - is_primary BOOLEAN DEFAULT false, -- 是否主部门 - position VARCHAR(100), -- 职位 - creator VARCHAR(50) DEFAULT NULL, - create_time TIMESTAMPTZ NOT NULL DEFAULT now(), - update_time TIMESTAMPTZ DEFAULT NULL, - deleted BOOLEAN NOT NULL DEFAULT false, - PRIMARY KEY (user_id, dept_id), - UNIQUE (optsn) -); - --- 3. 用户表添加默认部门字段 -ALTER TABLE sys.tb_sys_user -ADD COLUMN IF NOT EXISTS primary_dept_id VARCHAR(50); -``` - -### 5.2 createTablePermission.sql 优化 - -**建议修改:** - -```sql --- 1. 角色表添加排序字段 -ALTER TABLE sys.tb_sys_role -ADD COLUMN IF NOT EXISTS order_num INTEGER DEFAULT 0; - --- 2. 权限表添加权限类型字段 -ALTER TABLE sys.tb_sys_permission -ADD COLUMN IF NOT EXISTS permission_type VARCHAR(20) DEFAULT 'action'; --- permission_type: action-操作权限/data-数据权限/menu-菜单权限 - -COMMENT ON COLUMN sys.tb_sys_permission.permission_type -IS '权限类型:action-操作权限/data-数据权限/menu-菜单权限'; -``` - -### 5.3 createTableFile.sql 扩展 - -**建议添加:** - -```sql --- 1. 文件版本管理 -ALTER TABLE file.tb_sys_file -ADD COLUMN IF NOT EXISTS version VARCHAR(20) DEFAULT '1.0', -ADD COLUMN IF NOT EXISTS parent_file_id VARCHAR(50), -ADD COLUMN IF NOT EXISTS is_latest BOOLEAN DEFAULT true; - --- 2. 文件分类 -ALTER TABLE file.tb_sys_file -ADD COLUMN IF NOT EXISTS category VARCHAR(100), -ADD COLUMN IF NOT EXISTS tags TEXT[]; - --- 3. 文件关联(支持文件和业务对象关联) -CREATE TABLE file.tb_file_relation ( - optsn VARCHAR(50) NOT NULL, - relation_id VARCHAR(50) NOT NULL, - file_id VARCHAR(50) NOT NULL, - object_type VARCHAR(50) NOT NULL, -- 对象类型:bidding_project/ticket/document等 - object_id VARCHAR(50) NOT NULL, -- 对象ID - relation_type VARCHAR(30) DEFAULT 'attachment', -- 关联类型:attachment-附件/avatar-头像/banner-横幅 - order_num INTEGER DEFAULT 0, - creator VARCHAR(50) DEFAULT NULL, - create_time TIMESTAMPTZ NOT NULL DEFAULT now(), - deleted BOOLEAN NOT NULL DEFAULT false, - PRIMARY KEY (relation_id), - UNIQUE (optsn), - FOREIGN KEY (file_id) REFERENCES file.tb_sys_file(file_id) -); - -CREATE INDEX idx_file_relation_object -ON file.tb_file_relation(object_type, object_id) WHERE deleted = false; -``` - -### 5.4 createTableMessage.sql 增强 - -**建议添加:** - -```sql --- 1. 消息模板表 -CREATE TABLE message.tb_message_template ( - optsn VARCHAR(50) NOT NULL, - template_id VARCHAR(50) NOT NULL, - template_code VARCHAR(100) NOT NULL, -- 模板编码 - template_name VARCHAR(255) NOT NULL, -- 模板名称 - template_type VARCHAR(30) NOT NULL, -- 模板类型:system-系统/business-业务 - title_template TEXT, -- 标题模板(支持变量) - content_template TEXT NOT NULL, -- 内容模板(支持变量) - variables JSONB, -- 变量定义 - dept_path VARCHAR(255) DEFAULT NULL, - creator VARCHAR(50) DEFAULT NULL, - updater VARCHAR(50) DEFAULT NULL, - create_time TIMESTAMPTZ NOT NULL DEFAULT now(), - update_time TIMESTAMPTZ DEFAULT NULL, - deleted BOOLEAN NOT NULL DEFAULT false, - PRIMARY KEY (template_id), - UNIQUE (optsn), - UNIQUE (template_code) -); - -COMMENT ON TABLE message.tb_message_template IS '消息模板表'; -``` - -## 六、数据安全建议 - -### 6.1 敏感数据加密 - -**需要加密的字段:** -1. `sys.tb_sys_user.password` - 用户密码(使用bcrypt/argon2) -2. `agent.tb_agent_tool.auth_config` - API认证配置 -3. `agent.tb_api_integration.auth_config` - 集成认证配置 -4. `customer_service.tb_crm_config.api_key` - CRM API密钥 - -**建议使用PostgreSQL的pgcrypto扩展:** - -```sql -CREATE EXTENSION IF NOT EXISTS pgcrypto; - --- 加密示例 -INSERT INTO agent.tb_agent_tool (auth_config) -VALUES (pgp_sym_encrypt('{"api_key": "secret"}', 'encryption_key')); - --- 解密示例 -SELECT pgp_sym_decrypt(auth_config::bytea, 'encryption_key') -FROM agent.tb_agent_tool; -``` - -### 6.2 行级安全策略(RLS) - -```sql --- 启用行级安全 -ALTER TABLE knowledge.tb_knowledge_document ENABLE ROW LEVEL SECURITY; - --- 创建策略:用户只能访问自己部门的文档 -CREATE POLICY dept_isolation_policy ON knowledge.tb_knowledge_document -FOR SELECT -USING ( - dept_path LIKE ( - SELECT dept_path || '%' - FROM sys.tb_sys_user - WHERE user_id = current_setting('app.current_user_id') - ) -); -``` - -### 6.3 审计日志增强 - -```sql --- 添加审计触发器 -CREATE OR REPLACE FUNCTION audit_trigger_func() -RETURNS TRIGGER AS $$ -BEGIN - IF (TG_OP = 'DELETE') THEN - INSERT INTO log.tb_sys_log ( - log_id, type, level, module, message, data, creator - ) VALUES ( - gen_random_uuid()::text, - 'audit', - 'info', - TG_TABLE_SCHEMA || '.' || TG_TABLE_NAME, - 'Record deleted', - row_to_json(OLD), - current_setting('app.current_user_id', true) - ); - RETURN OLD; - ELSIF (TG_OP = 'UPDATE') THEN - INSERT INTO log.tb_sys_log ( - log_id, type, level, module, message, data, creator - ) VALUES ( - gen_random_uuid()::text, - 'audit', - 'info', - TG_TABLE_SCHEMA || '.' || TG_TABLE_NAME, - 'Record updated', - jsonb_build_object('old', row_to_json(OLD), 'new', row_to_json(NEW)), - current_setting('app.current_user_id', true) - ); - RETURN NEW; - END IF; -END; -$$ LANGUAGE plpgsql; - --- 为敏感表添加审计触发器 -CREATE TRIGGER audit_user_changes -AFTER UPDATE OR DELETE ON sys.tb_sys_user -FOR EACH ROW EXECUTE FUNCTION audit_trigger_func(); -``` - -## 七、部署和维护建议 - -### 7.1 初始化顺序 - -```bash -# 1. 创建扩展 -psql -d urbanlifeline -f extensions.sql - -# 2. 按依赖顺序执行建表脚本 -psql -d urbanlifeline -f createTablePermission.sql -psql -d urbanlifeline -f createTableUser.sql -psql -d urbanlifeline -f createTableFile.sql -psql -d urbanlifeline -f createTableMessage.sql -psql -d urbanlifeline -f createTableLog.sql -psql -d urbanlifeline -f createTableConfig.sql -psql -d urbanlifeline -f createTableKnowledge.sql -psql -d urbanlifeline -f createTableBidding.sql -psql -d urbanlifeline -f createTableCustomerService.sql -psql -d urbanlifeline -f createTableAgent.sql - -# 3. 执行完整初始化(包含触发器和视图) -psql -d urbanlifeline -f createTableAll.sql - -# 4. 初始化基础数据 -psql -d urbanlifeline -f initDataConfig.sql -``` - -### 7.2 定期维护任务 - -```sql --- 1. 分析和优化表 -ANALYZE VERBOSE; -VACUUM ANALYZE; - --- 2. 重建索引(处理索引膨胀) -REINDEX DATABASE urbanlifeline; - --- 3. 更新表统计信息 -VACUUM ANALYZE sys.tb_sys_user; -VACUUM ANALYZE agent.tb_agent_session; - --- 4. 检查慢查询 -SELECT query, calls, total_time, mean_time -FROM pg_stat_statements -ORDER BY mean_time DESC -LIMIT 20; -``` - -### 7.3 备份策略 - -```bash -# 全量备份(每日) -pg_dump -Fc urbanlifeline > backup_$(date +%Y%m%d).dump - -# 增量备份(使用WAL归档) -# 在postgresql.conf中配置: -# wal_level = replica -# archive_mode = on -# archive_command = 'cp %p /path/to/archive/%f' - -# 恢复示例 -pg_restore -d urbanlifeline -c backup_20240101.dump -``` - -## 八、总结 - -### 8.1 设计优势 - -1. **模块化架构**:9个Schema清晰划分业务边界 -2. **可扩展性**:支持多租户、多智能体、多业务类型 -3. **性能优化**:合理的索引设计、分区策略、视图优化 -4. **数据安全**:软删除、审计日志、权限控制、数据加密 -5. **业务完整**:覆盖招投标、客服、知识库全流程 - -### 8.2 后续优化方向 - -1. **向量检索优化**:引入pgvector扩展,优化RAG检索性能 -2. **分布式部署**:考虑Citus扩展实现水平扩展 -3. **实时数据同步**:使用Logical Replication实现异地备份 -4. **监控告警**:集成pgBadger、pg_stat_statements等工具 -5. **读写分离**:主从复制实现读写分离 - -### 8.3 关键指标 - -- **总表数**:50+ 张核心表 -- **Schema数**:9 个业务Schema -- **索引类型**:B-Tree、GIN、部分索引、表达式索引 -- **数据类型**:标准类型 + JSONB + 数组 + 向量(可选) -- **时区支持**:全部使用TIMESTAMPTZ -- **软删除**:全表支持deleted标记 - ---- - -**文档版本**: 1.0 -**最后更新**: 2024-12-02 -**维护团队**: 泰豪电源AI数智化平台开发组 diff --git a/urbanLifelineServ/gateway/Dockerfile.dev b/urbanLifelineServ/gateway/Dockerfile.dev new file mode 100644 index 0000000..0322141 --- /dev/null +++ b/urbanLifelineServ/gateway/Dockerfile.dev @@ -0,0 +1,13 @@ +FROM maven:3.9-eclipse-temurin-21-alpine + +WORKDIR /app + +# 复制 pom.xml 和源代码 +COPY pom.xml ./ +COPY src ./src + +# 暴露端口 +EXPOSE 8080 + +# 使用 spring-boot-devtools 支持热重载 +CMD ["mvn", "spring-boot:run", "-Dspring-boot.run.jvmArguments=-Dspring.devtools.restart.enabled=true"] diff --git a/urbanLifelineWeb/packages/portal/Dockerfile.dev b/urbanLifelineWeb/packages/portal/Dockerfile.dev new file mode 100644 index 0000000..f95bc99 --- /dev/null +++ b/urbanLifelineWeb/packages/portal/Dockerfile.dev @@ -0,0 +1,21 @@ +FROM node:20-alpine + +RUN npm install -g pnpm@latest + +WORKDIR /app + +# 复制依赖文件 +COPY packages/portal/package.json ./ +COPY pnpm-lock.yaml pnpm-workspace.yaml ./ + +# 安装依赖 +RUN pnpm install --frozen-lockfile + +# 复制源代码 +COPY packages/portal/ ./ + +# 暴露端口 +EXPOSE 3000 + +# 开发模式(HMR) +CMD ["pnpm", "dev", "--host", "0.0.0.0"] diff --git a/urbanLifelineWeb/packages/portal/index.html b/urbanLifelineWeb/packages/portal/index.html new file mode 100644 index 0000000..3fa2f1b --- /dev/null +++ b/urbanLifelineWeb/packages/portal/index.html @@ -0,0 +1,32 @@ + + + + + + + 泰豪电源 AI 数智化平台 + + + + + + + + + +
+ + + + + diff --git a/urbanLifelineWeb/packages/portal/src/views/ImportMapsExample.vue b/urbanLifelineWeb/packages/portal/src/views/ImportMapsExample.vue new file mode 100644 index 0000000..7c66c75 --- /dev/null +++ b/urbanLifelineWeb/packages/portal/src/views/ImportMapsExample.vue @@ -0,0 +1,156 @@ + + + + + diff --git a/urbanLifelineWeb/packages/shared/Dockerfile.dev b/urbanLifelineWeb/packages/shared/Dockerfile.dev new file mode 100644 index 0000000..fa20972 --- /dev/null +++ b/urbanLifelineWeb/packages/shared/Dockerfile.dev @@ -0,0 +1,22 @@ +FROM node:20-alpine + +# 安装 pnpm +RUN npm install -g pnpm@latest + +WORKDIR /app + +# 复制 package.json +COPY packages/shared/package.json ./ +COPY pnpm-lock.yaml pnpm-workspace.yaml ./ + +# 安装依赖 +RUN pnpm install --frozen-lockfile + +# 复制源代码 +COPY packages/shared/ ./ + +# 暴露端口 +EXPOSE 5000 + +# 开发模式启动(支持热更新) +CMD ["pnpm", "dev", "--host", "0.0.0.0"] diff --git a/urbanLifelineWeb/packages/shared/package.json b/urbanLifelineWeb/packages/shared/package.json new file mode 100644 index 0000000..e3554bd --- /dev/null +++ b/urbanLifelineWeb/packages/shared/package.json @@ -0,0 +1,28 @@ +{ + "name": "@shared/all", + "version": "1.0.0", + "type": "module", + "private": true, + "scripts": { + "dev": "vite --port 5000 --host", + "build": "run-p build:*", + "build:esm": "vite build --mode esm", + "build:federation": "vite build --mode federation", + "preview": "vite preview --port 5000" + }, + "dependencies": { + "vue": "^3.5.13", + "vue-router": "^4.5.0", + "pinia": "^2.2.8", + "element-plus": "^2.9.1", + "@vueuse/core": "^11.3.0" + }, + "devDependencies": { + "@vitejs/plugin-vue": "^5.2.1", + "@vitejs/plugin-vue-jsx": "^4.1.1", + "typescript": "^5.7.2", + "vite": "^6.0.3", + "@originjs/vite-plugin-federation": "^1.3.6", + "npm-run-all": "^4.1.5" + } +} diff --git a/urbanLifelineWeb/packages/shared/vite.config.esm.ts b/urbanLifelineWeb/packages/shared/vite.config.esm.ts new file mode 100644 index 0000000..23947ac --- /dev/null +++ b/urbanLifelineWeb/packages/shared/vite.config.esm.ts @@ -0,0 +1,93 @@ +import { defineConfig } from 'vite' +import vue from '@vitejs/plugin-vue' +import vueJsx from '@vitejs/plugin-vue-jsx' +import { resolve } from 'path' + +/** + * ES Module 构建配置 + * 用于 Import Maps 方案 + * + * 策略:将 Vue、Element Plus 等依赖打包进共享模块 + * 业务应用只需引入 @shared/*,无需关心底层依赖 + */ +export default defineConfig({ + plugins: [vue(), vueJsx()], + + build: { + lib: { + entry: { + components: resolve(__dirname, 'src/components/index.ts'), + utils: resolve(__dirname, 'src/utils/index.ts'), + api: resolve(__dirname, 'src/api/index.ts'), + composables: resolve(__dirname, 'src/composables/index.ts'), + types: resolve(__dirname, 'src/types/index.ts') + }, + formats: ['es'], // 仅构建 ES Module + fileName: (format, entryName) => `${entryName}.js` + }, + + rollupOptions: { + // ⚠️ 不外部化依赖,将它们打包进共享模块 + // 这样业务应用只需引入 @shared/* 即可 + external: [], + + output: { + // 保持 ES Module 格式 + format: 'es', + // 导出命名导出 + exports: 'named', + // 生成 sourcemap + sourcemap: true, + // 分块策略:将大的依赖分离出来 + manualChunks(id) { + // Vue 核心 + if (id.includes('node_modules/vue/') || + id.includes('node_modules/@vue/')) { + return 'vue-core' + } + // Vue Router + if (id.includes('node_modules/vue-router/')) { + return 'vue-router' + } + // Pinia + if (id.includes('node_modules/pinia/')) { + return 'pinia' + } + // Element Plus + if (id.includes('node_modules/element-plus/')) { + return 'element-plus' + } + // VueUse + if (id.includes('node_modules/@vueuse/')) { + return 'vueuse' + } + } + } + }, + + // 输出目录 + outDir: 'dist/esm', + emptyOutDir: true, + + // 目标浏览器 + target: 'esnext', + + // 不压缩(开发环境) + minify: false, + + // 启用代码分割 + cssCodeSplit: true + }, + + // 开发服务器配置 + server: { + port: 5000, + host: true, + cors: true, + headers: { + 'Access-Control-Allow-Origin': '*', + 'Access-Control-Allow-Methods': 'GET, OPTIONS', + 'Content-Type': 'application/javascript; charset=utf-8' + } + } +})