账权平台是一套面向农业产业链的 多租户 SaaS 综合管理平台,涵盖智慧农业、产品溯源、自助过磅、AI 智能助手等核心业务域。平台采用前后端分离架构,后端基于 Spring Boot + MyBatis Plus,前端基于 Vue 2 + Element UI,通过多租户动态数据源实现企业级数据隔离。
| 子项目 | 技术栈 | 说明 | 端口 |
|---|---|---|---|
| saas-service | Java 11 / Spring Boot 2.2.1 | 后端服务,提供全部 REST API | 7777(生产) / 8202(开发) |
| saas-web | Vue 2.7 / Element UI 2.15 | 前端管理控制台 | 8201(开发) |
| 类别 | 后端 (saas-service) | 前端 (saas-web) |
|---|---|---|
| 核心框架 | Spring Boot 2.2.1 / Java 11 | Vue 2.7.14 |
| 路由/状态 | — | Vue Router 3.5 / Vuex 3.1 |
| ORM / 数据 | MyBatis Plus 3.5.7 + 动态数据源 3.6.1 | — |
| UI 组件 | — | Element UI 2.15.13 |
| 缓存 | Redis + Redisson 3.35.0 | localStorage |
| HTTP | Spring MVC | Axios 0.18.1 |
| 对象存储 | 阿里云 OSS SDK 3.17.4 | — |
| LLM / AI | DashScope (OpenAI 兼容) + Groovy 3.0.19 | Monaco Editor / marked / highlight.js |
| WebSocket | Spring WebSocket + Java-WebSocket | 原生 WebSocket (ASR) |
| 工具库 | Hutool 5.8.16 / Lombok / Apache POI | ECharts 5.4 / 高德地图 / WangEditor |
| 构建工具 | Maven | Vue CLI 4.4.4 / Webpack |
| GroupId / ArtifactId | cn.apes / saas-service |
| 版本 | 1.0.0-SNAPSHOT |
| 主启动类 | cn.apes.CloudApplication(启用 @EnableAsync / @EnableScheduling) |
| 根包 | cn.apes.cloud |
| 生产端口 | 7777 |
| 开发端口 | 8202 |
采用 baomidou dynamic-datasource 实现多数据源动态切换,通过自定义 @TenantSource 注解 + AOP 切面,根据请求头 X-Tenant-ID 自动切换数据源。
| 数据源 | 目标数据库 | 用途 |
|---|---|---|
cloud(主库) | MySQL 192.168.1.161:3306/cloud | 平台核心数据(用户、企业、权限、LLM 配置等) |
user(租户库) | MySQL 192.168.1.161:3306/user | 租户业务数据(溯源、农业、称重等) |
huoban | 伙伴云 MySQL | 直连伙伴云数据库(数据同步/CRUD) |
X-Tenant-ID 值为 user/zx/plant 时,DataSourceHeaderAspect 切面自动调用 DynamicDataSourceContextHolder.push() 切换到对应数据源。默认使用 user 数据源。
| 配置类 | 功能 |
|---|---|
| RedissonConfiguration | Redisson 客户端,DB7(主业务)+ DB9(辅助),JsonJackson 编解码 |
| OssConfiguration | 阿里云 OSS,桶 zq-cloud,区域 oss-cn-beijing |
| DataSourceHeaderAspect | 多租户数据源切换 AOP 切面 |
| AccessTokenFilterConfig | AccessToken 外部 API 鉴权过滤器注册 |
| WebSocketConfig | ASR 语音识别 WebSocket 端点 /asr/ws |
| 项目名称 | saas-web(账权平台) |
| 框架 | Vue 2.7.14 + Vue Router 3.5.2 (History 模式) + Vuex 3.1.0 |
| UI 组件库 | Element UI 2.15.13(中文语言包) |
| 构建工具 | Vue CLI 4.4.4 + Webpack + Sass |
| 开发端口 | 8201(host: 0.0.0.0) |
| 输出目录 | saas-web |
noLayout: true)不使用主布局,可脱离侧栏/顶栏独立访问,支持通过 URL Token 参数从外部系统直接跳转。包括:智慧农业大屏、武鸣沃柑大脑、溯源大屏。
前端路由分为静态路由(登录/注册/认证等)和动态路由两部分。动态路由通过 menuApi.handleMenu() 根据后端返回的菜单数据动态注册:
| menuType | 类型 | 路由前缀 | 加载方式 |
|---|---|---|---|
| 1 | 普通页面 | /common/{menuPath} | 动态 import vuePath 组件 |
| 2 | 伙伴云内嵌 | /common/huoban/{id} | 加载 huoban/index 组件 |
| 3 | 支付页面 | /common/payment/{id} | 加载 payment/index 组件 |
| 4 | Web 内嵌 | /common/web/{id} | 加载 web/index 组件 |
| 模块 | 核心 State | 说明 |
|---|---|---|
| user | loginUser, menuList, currentCustomer, huobanToken, appList, currentApp, allAppMenus | 用户登录态、企业信息、菜单树、多应用切换 |
| settings | sidebarCollapsed | 侧栏折叠状态 |
| tagsView | visitedViews, cachedViews | 标签页管理,支持 localStorage 持久化 |
@DS("huoban"))+ 伙伴云 OpenAPI 代理平台内置完整的 LLM Agent 管理引擎,支持多厂商模型配置、Agent 编排、Groovy 动态工具、Function Calling 多轮对话、技能注入和全链路审计。
{{variable}} 格式的变量替换,通过 userParams 传入动态参数| 页面 | 路径 | 功能 |
|---|---|---|
| 智能对话 | /ai/chat | 多轮对话界面,支持图片/视频上传、Markdown 渲染 |
| Agent 配置 | /system/agent | Agent CRUD、工具/技能关联、调试 |
| 模型管理 | /system/model | 厂商/模型配置 |
| 工具管理 | /system/tool | Groovy 工具脚本编辑(Monaco Editor)+ 执行测试 |
| 技能管理 | /system/skill | AI 技能 CRUD |
| 对话历史 | /ai/conversation | 会话列表 + 消息详情 |
| 调用日志 | /system/callLog | LLM 调用日志查询 + 统计 |
baomidou dynamic-datasource + 自定义 @TenantSource 注解 + AOP 切面,通过 HTTP 请求头 X-Tenant-ID 实现透明数据源切换。
| 租户标识 | 数据源 | 说明 |
|---|---|---|
user(默认) | user 数据库 | 标准租户业务数据 |
zx | zx 数据库 | 专线租户 |
plant | plant 数据库 | 种植租户 |
为外部系统提供安全的 API 调用机制:
X-Access-Token 或 Authorization: Bearer 传递后端共 62 个 Controller,提供 300+ REST API 端点。所有接口前缀为 /api/user-service/(通过 Nginx 代理)。
| 模块 | 主要 Controller | 路径前缀 | 核心端点 |
|---|---|---|---|
| 用户认证 | UserController | /user | loginPwd, register, getCurrentUser, selectCustomer, certifyEnterprise |
| CommonController | /common | upload, code2Session, huobanWebLogin | |
| 客户管理 | CustomerController | /customer | pageCustomer, saveCustomer, employee/page, auditCertification, syncTenantsToHuoban |
| 权限管理 | PermissionController | /permission | currentMenus, getMyPermissionCodes, saveRole, setRolePermission, setMemberRole |
| AccessToken | AccessTokenController | /sysAccessToken | create, page, revoke, regenerate |
| LLM / AI | LlmChatController | /llmChat | start(新对话), continue(多轮对话) |
| LlmAgentConfigController | /llmAgent | page, add, update, delete, debug, call/{id} | |
| LlmProviderConfigController | /llmProvider | page, add, update, delete, list | |
| LlmModelConfigController | /llmModel | page, add, update, delete, list | |
| LlmToolController + GroovyToolExecuteController | /llmTool | CRUD, execute(执行 Groovy 脚本), clearCache | |
| LlmConversationController | /llmConversation | add, detail, listByAgent, messages, close, delete | |
| LlmCallLogController | /llmCallLog | page, detail, statistics, batchDelete | |
| 伙伴云 | HuobanController / Huoban2Controller | /huoban / /huoban2 | syncTables, data, create, update, upsert, webLogin, automationCall |
| 溯源 | TraceCodeController | /trace/code | task/generate, list/bind, bind/batchImport, relation/add |
| TraceCategoryController | /trace/category | 分类 CRUD | |
| TraceWarehouseController | /trace/warehouse | 入库/出库 CRUD | |
| TraceQualityController | /trace/quality | 质检 CRUD | |
| 智慧农业 | FeiParkInfoController / PlotInfoController | /park / /fei/plot | 园区/地块 CRUD |
| FeiIrrigationPlanController | /irrigation/plan | 灌溉计划 CRUD + toggle 开关 | |
| FeiFertigationDeviceController | /fertigation-device | 设备 CRUD, dosing(加药), save-layout | |
| 称重 | WeightController | /weight | ticket(磅单), device, driver, card, beidou, alarmRule |
| 套餐配额 | CustomerPackageController | /customerPackage | myPackages, increaseQuota, decreaseQuota, submitExtendApply |
| 开放平台 | OpenController | /open | trackingConfig/getByCustomerId, customerPackage/decreaseQuota |
| 代理前缀 | 目标 | 路径重写 |
|---|---|---|
/api/user-service | http://localhost:8202 | ^/api/user-service → / |
/n8n | https://n8n.ccoop.cc | ^/n8n → "" |
| 配置项 | 生产环境 (prod) | 开发环境 (local) |
|---|---|---|
| 服务端口 | 7777 | 8202 |
| 主数据源 | 192.168.1.161:3306/cloud | 192.168.31.201:3389/cloud |
| 伙伴云数据源 | 192.168.1.161:3306/user | 192.168.31.201:3389/user |
| Redis | 192.168.1.165:6403, DB7 | 192.168.31.201:7890, DB7 |
| OSS | oss-cn-beijing.aliyuncs.com, bucket: zq-cloud | |
| 伙伴云 API | https://hb.zhangquyun.com/server/api | |
| LLM API | https://dashscope.aliyuncs.com/compatible-mode/v1 | |
| 文件上传限制 | max-file-size: 20MB, max-request-size: 200MB | |
| 构建命令 | mvn clean package -Pprod 或 ./publish.sh | |
| 启动命令 | java -jar saas-service.jar --spring.profiles.active=prod | |
| 配置项 | 值 |
|---|---|
| 开发启动 | npm run dev(端口 8201) |
| 生产构建 | npm run build:prod → 输出到 saas-web/ 目录 |
| 预发布构建 | npm run build:stage |
| 构建脚本 | ./publish.sh |
| 部署方式 | Nginx 静态文件 + 反向代理到后端 |
isDel(1=已删除,0=正常),MyBatis Plus 自动处理db-export/cloud_full_*.sql(完整建库脚本)
| 组件 | 版本要求 | 用途 |
|---|---|---|
| JDK | 11+ | 后端运行时 |
| Maven | 3.6+ | 后端构建 |
| Node.js | 8.9+ | 前端构建 |
| MySQL | 8.0+ | 数据库 |
| Redis | 6.0+ | 缓存/分布式锁 |
| Nginx | 1.18+ | 反向代理/静态文件 |