实战教程:AI辅助决策支持系统前后端分离架构设计(附接口文档与设计规范)

一、引言:为什么需要前后端分离的AI辅助决策系统?

在数字化转型背景下,企业对数据驱动决策的需求日益迫切。AI辅助决策支持系统(Decision Support System, DSS)通过整合多源数据、运用机器学习模型,为企业提供实时、智能的决策建议(如电商促销策略、供应链优化、金融风险预警)。然而,传统单体架构(如JSP+Servlet)存在以下痛点:

  • 耦合度高:前端界面与后端逻辑、AI模型紧耦合,修改任一模块需重启整个系统;
  • 扩展性差:AI模型迭代快(如每周更新一次推荐算法),但单体架构无法独立升级模型;
  • 开发效率低:前后端开发者需等待对方完成才能测试,难以并行开发;
  • 性能瓶颈:AI推理(如深度学习模型)占用大量资源,单体架构易导致整体性能下降。

前后端分离架构的出现解决了这些问题:

  • 职责分离:前端专注于用户交互与可视化,后端专注于业务逻辑,AI服务专注于模型推理;
  • 独立部署:前端、后端、AI服务可分别部署,支持弹性伸缩(如AI服务按需扩容);
  • 技术栈灵活:前端用Vue/React,后端用Spring Boot/Go,AI服务用Python,互不影响;
  • 易维护性:接口定义清晰,降低跨团队沟通成本。

本文将以电商促销决策支持系统为例,详细讲解前后端分离架构的设计思路、核心模块实现、接口文档与设计规范,并提供可运行的代码示例。


二、系统目标与整体架构设计

1. 系统核心目标

  • 多数据源接入:支持MySQL、Excel、第三方API(如淘宝开放平台)等数据源;
  • 实时决策:从数据输入到生成决策建议的延迟≤1秒;
  • 可视化展示:用图表展示决策结果(如促销策略的预计销量增长);
  • 可扩展AI模型:支持动态上传/切换模型(如从协同过滤到Transformer);
  • 高可用:服务宕机时自动切换,保证99.9%的可用性。

2. 整体架构图(Mermaid)

graph TD
    A[用户端] -->|HTTP/HTTPS| B[Nginx API网关]
    B -->|静态资源| C[前端应用(Vue 3)]
    B -->|业务请求| D[后端服务(Spring Boot)]
    D -->|AI推理请求| E[AI服务(FastAPI)]
    D -->|数据访问| F[数据层(MySQL/Redis/MongoDB)]
    E -->|模型加载| G[模型仓库(MinIO)]
    E -->|数据预处理| F
    C -->|WebSocket| D[实时推送决策结果]

3. 架构分层说明

层级 技术栈 核心职责
表现层 Vue 3 + Vite + ECharts 用户交互(如输入决策条件)、可视化展示(如销量预测图表)、实时消息接收
网关层 Nginx 反向代理(转发请求到后端/AI服务)、负载均衡、权限校验、静态资源缓存
业务层 Spring Boot 业务逻辑处理(如用户权限管理、决策流程编排)、调用AI服务、数据持久化
AI服务层 FastAPI + TensorFlow Serving 模型推理、模型管理(上传/下载/版本控制)、数据预处理/后处理
数据层 MySQL + Redis + MinIO 业务数据存储(如用户信息、决策日志)、缓存(如热门模型参数)、模型文件存储

三、前端架构设计:从交互到可视化的实现

1. 前端技术栈选择

技术 原因
Vue 3 响应式系统更高效,Composition API便于复杂逻辑复用,生态完善(如Element Plus)
Vite 快速冷启动,支持ES Module,比Webpack更适合大型单页应用(SPA)
Pinia Vue官方状态管理库,比Vuex更简洁,支持TypeScript
Axios 支持拦截器(如统一添加Token)、异步请求,适合前后端数据交互
ECharts 开源可视化库,支持多种图表(折线图、柱状图、热力图),满足决策展示需求

2. 前端核心模块设计

前端应用的核心是决策流程,因此模块划分需围绕“输入-请求-展示”展开:

  • 决策请求模块:收集用户输入(如促销时间、商品类别),调用后端接口获取决策结果;
  • 可视化模块:用ECharts展示决策结果(如“满减策略”的预计销量增长曲线);
  • 模型管理模块:展示可用模型列表(如“协同过滤模型v1.0”“Transformer模型v2.0”),支持切换模型;
  • 用户管理模块:处理登录/注册、权限校验(如管理员可上传模型);
  • 实时消息模块:用WebSocket接收后端推送的实时决策结果(如库存预警)。

3. 前端项目目录结构

src/
├── components/       # 公共组件(如决策图表、模型选择器)
│   ├── DecisionChart.vue  # 决策结果可视化组件
│   └── ModelSelector.vue  # 模型切换组件
├── views/            # 页面组件
│   ├── DecisionView.vue   # 决策主页面
│   └── ModelManageView.vue# 模型管理页面
├── store/            # Pinia状态管理
│   ├── decisionStore.js   # 决策相关状态(如当前模型、输入参数)
│   └── userStore.js       # 用户相关状态(如Token、权限)
├── api/              # 接口封装
│   ├── decisionApi.js     # 决策请求接口
│   └── modelApi.js        # 模型管理接口
├── utils/            # 工具函数
│   ├── request.js         # Axios拦截器(统一添加Token、处理错误)
│   └── echartsUtil.js     # ECharts配置工具
└── App.vue           # 根组件

4. 关键代码示例(决策请求)

// src/api/decisionApi.js
import request from '@/utils/request';

/**
 * 获取AI决策结果
 * @param {Object} params - 决策参数(如用户ID、商品ID、促销时间)
 * @param {string} modelId - 模型ID(如"promotion-model-v1.0")
 * @returns {Promise<Object>} 决策结果(如促销策略、预计销量)
 */
export const getDecisionResult = async (params, modelId) => {
  return request.post('/api/v1/decisions', {
    data: params,
    model_id: modelId
  });
};

// src/utils/request.js(Axios拦截器)
import axios from 'axios';
import { useUserStore } from '@/store/userStore';

const request = axios.create({
  baseURL: import.meta.env.VITE_API_BASE_URL, // 从环境变量获取API地址
  timeout: 5000
});

// 请求拦截器:添加Token
request.interceptors.request.use(config => {
  const userStore = useUserStore();
  if (userStore.token) {
    config.headers.Authorization = `Bearer ${userStore.token}`;
  }
  return config;
}, error => {
  return Promise.reject(error);
});

// 响应拦截器:统一处理错误
request.interceptors.response.use(response => {
  return response.data;
}, error => {
  if (error.response) {
    // 处理401(未授权)、404(资源不存在)等错误
    ElMessage.error(error.response.data.message || '请求失败');
  }
  return Promise.reject(error);
});

export default request;

5. 可视化实现(ECharts)

// src/components/DecisionChart.vue
<template>
  <div ref="chartRef" class="decision-chart" />
</template>

<script setup>
import { ref, onMounted, watch } from 'vue';
import * as echarts from 'echarts';
import { getDecisionResult } from '@/api/decisionApi';
import { useDecisionStore } from '@/store/decisionStore';

const chartRef = ref(null);
const decisionStore = useDecisionStore();
let chartInstance = null;

// 初始化ECharts实例
const initChart = () => {
  chartInstance = echarts.init(chartRef.value);
  chartInstance.setOption({
    title: { text: '促销策略预计效果' },
    xAxis: { type: 'category', data: [] },
    yAxis: { type: 'value' },
    series: [{ type: 'bar', data: [] }]
  });
};

// 更新图表数据
const updateChart = async () => {
  const { params, modelId } = decisionStore;
  if (!params || !modelId) return;
  try {
    const result = await getDecisionResult(params, modelId);
    // 处理结果:将"promotion_strategy"作为X轴,"expected_sales"作为Y轴
    const xData = result.strategies.map(item => item.name);
    const yData = result.strategies.map(item => item.expected_sales);
    chartInstance.setOption({
      xAxis: { data: xData },
      series: [{ data: yData }]
    });
  } catch (error) {
    console.error('更新图表失败:', error);
  }
};

// 监听决策参数变化,自动更新图表
watch([() => decisionStore.params, () => decisionStore.modelId], updateChart, { deep: true });

onMounted(() => {
  initChart();
  updateChart();
});
</script>

四、后端架构设计:业务逻辑与AI服务的协同

1. 后端技术栈选择

技术 原因
Spring Boot 快速构建微服务,集成Spring Cloud生态(如Nacos服务发现、Sentinel流量控制)
MyBatis Plus 简化数据库操作,支持代码生成、分页、逻辑删除
Redis 缓存热门模型参数、用户权限信息,减少数据库查询次数
WebSocket 实现实时消息推送(如决策结果更新)

2. 后端核心模块设计

模块 核心职责
用户模块 处理登录/注册、权限校验(如用JWT生成Token)
决策模块 接收前端决策请求,调用AI服务,存储决策日志
模型管理模块 处理模型上传/下载、版本控制(如用MinIO存储模型文件)
实时消息模块 用WebSocket推送决策结果、系统预警(如模型加载失败)

3. 后端项目目录结构

src/
├── main/
│   ├── java/com/example/dss/
│   │   ├── controller/       # 控制器(处理HTTP请求)
│   │   │   ├── DecisionController.java  # 决策接口
│   │   │   └── ModelController.java     # 模型管理接口
│   │   ├── service/          # 业务逻辑
│   │   │   ├── DecisionService.java     # 决策业务逻辑
│   │   │   └── ModelService.java        # 模型管理业务逻辑
│   │   ├── mapper/           # MyBatis Plus映射文件
│   │   │   └── DecisionLogMapper.java   # 决策日志Mapper
│   │   ├── model/            # 实体类
│   │   │   ├── DecisionRequest.java     # 决策请求DTO
│   │   │   └── DecisionResponse.java    # 决策响应DTO
│   │   ├── config/           # 配置类
│   │   │   ├── WebSocketConfig.java     # WebSocket配置
│   │   │   └── RedisConfig.java         # Redis配置
│   │   └── Application.java  # 启动类
│   └── resources/
│       ├── mapper/           # MyBatis XML映射文件
│       └── application.yml   # 配置文件(数据库、Redis、AI服务地址)

4. 关键代码示例(决策接口)

// com/example/dss/controller/DecisionController.java
@RestController
@RequestMapping("/api/v1/decisions")
@RequiredArgsConstructor
public class DecisionController {

    private final DecisionService decisionService;
    private final SimpMessagingTemplate messagingTemplate; // WebSocket模板

    /**
     * 生成AI决策结果
     * @param request 决策请求(包含输入参数、模型ID)
     * @return 决策响应(包含策略列表、预计效果)
     */
    @PostMapping
    public ResponseEntity<DecisionResponse> createDecision(@RequestBody DecisionRequest request) {
        // 1. 校验参数(如模型ID是否存在)
        if (StringUtils.isBlank(request.getModelId())) {
            throw new BadRequestException("模型ID不能为空");
        }
        // 2. 调用业务逻辑生成决策
        DecisionResponse response = decisionService.generateDecision(request);
        // 3. 实时推送决策结果到前端(如管理员页面)
        messagingTemplate.convertAndSend("/topic/decision-updates", response);
        // 4. 返回响应
        return ResponseEntity.ok(response);
    }
}

// com/example/dss/service/DecisionService.java
@Service
@RequiredArgsConstructor
public class DecisionService {

    private final RestTemplate restTemplate; // 调用AI服务的客户端
    private final DecisionLogMapper decisionLogMapper;
    private final RedisTemplate<String, Object> redisTemplate;

    /**
     * 生成决策结果
     * @param request 决策请求
     * @return 决策响应
     */
    public DecisionResponse generateDecision(DecisionRequest request) {
        // 1. 从Redis缓存获取模型地址(避免重复查询数据库)
        String modelUrl = (String) redisTemplate.opsForValue().get("model:" + request.getModelId());
        if (modelUrl == null) {
            throw new NotFoundException("模型不存在");
        }
        // 2. 调用AI服务(FastAPI)
        AiInferenceRequest aiRequest = new AiInferenceRequest();
        aiRequest.setData(request.getData());
        aiRequest.setModelId(request.getModelId());
        ResponseEntity<AiInferenceResponse> aiResponse = restTemplate.postForEntity(
                modelUrl + "/api/v1/inference",
                aiRequest,
                AiInferenceResponse.class
        );
        // 3. 处理AI响应(如转换为业务模型)
        DecisionResponse response = convertAiResponseToDecisionResponse(aiResponse.getBody());
        // 4. 存储决策日志(用于后续分析)
        DecisionLog log = new DecisionLog();
        log.setUserId(request.getUserId());
        log.setModelId(request.getModelId());
        log.setRequestData(JSON.toJSONString(request));
        log.setResponseData(JSON.toJSONString(response));
        decisionLogMapper.insert(log);
        // 5. 返回结果
        return response;
    }

    /**
     * 将AI服务响应转换为业务响应
     * @param aiResponse AI服务响应
     * @return 业务决策响应
     */
    private DecisionResponse convertAiResponseToDecisionResponse(AiInferenceResponse aiResponse) {
        DecisionResponse response = new DecisionResponse();
        response.setStrategies(aiResponse.getResult().get("strategies"));
        response.setExpectedSalesGrowth(aiResponse.getScore());
        response.setTimestamp(LocalDateTime.now());
        return response;
    }
}

五、AI服务层设计:模型推理与管理的最佳实践

1. AI服务技术栈选择

技术 原因
FastAPI 高性能(比Flask快3倍),支持异步请求,自动生成Swagger文档
TensorFlow Serving 高效部署TensorFlow模型,支持动态更新模型、批量推理
MinIO 轻量级对象存储,用于存储模型文件(如.h5、.pb)
Pandas/Numpy 数据预处理(如缺失值填充、归一化)、结果后处理(如转换为业务格式)

2. AI服务核心模块设计

模块 核心职责
推理模块 接收后端请求,加载模型,执行推理(如用Transformer预测促销策略)
模型管理模块 处理模型上传/下载、版本控制(如保留最近3个版本的模型)
数据处理模块 预处理输入数据(如将字符串转换为数值)、后处理输出结果(如将概率转换为策略名称)
监控模块 收集推理延迟、模型加载时间等指标(如用Prometheus监控)

3. AI服务项目目录结构

ai-service/
├── app/
│   ├── main.py           # FastAPI入口文件
│   ├── routes/           # 接口路由
│   │   ├── inference.py  # 推理接口
│   │   └── model.py      # 模型管理接口
│   ├── models/           # 模型相关逻辑
│   │   ├── model_manager.py  # 模型管理类(加载/卸载/切换)
│   │   └── tensor_flow_serving_client.py  # TensorFlow Serving客户端
│   ├── utils/            # 工具函数
│   │   ├── data_processing.py  # 数据预处理/后处理
│   │   └── minio_client.py     # MinIO客户端(存储模型文件)
│   └── schemas/          # Pydantic模型(请求/响应校验)
│       ├── inference.py  # 推理请求/响应模型
│       └── model.py      # 模型管理请求/响应模型
├── config/               # 配置文件
│   └── settings.py       # 模型仓库地址、TensorFlow Serving地址
└── requirements.txt      # 依赖列表(fastapi、uvicorn、tensorflow-serving-api)

4. 关键代码示例(推理接口)

# app/routes/inference.py
from fastapi import APIRouter, HTTPException
from pydantic import BaseModel
from app.models.model_manager import ModelManager
from app.utils.data_processing import preprocess_data, postprocess_result
from app.schemas.inference import InferenceRequest, InferenceResponse

router = APIRouter()
model_manager = ModelManager()  # 模型管理单例

@router.post("/inference", response_model=InferenceResponse)
async def inference(request: InferenceRequest):
    """
    AI模型推理接口
    - 请求参数:输入数据(data)、模型ID(model_id)
    - 响应参数:决策结果(result)、置信度(score)、时间戳(timestamp)
    """
    try:
        # 1. 加载模型(从TensorFlow Serving或本地加载)
        model = model_manager.get_model(request.model_id)
        if not model:
            raise HTTPException(status_code=404, detail="模型不存在")
        # 2. 预处理输入数据(如缺失值填充、归一化)
        processed_data = preprocess_data(request.data)
        # 3. 执行模型推理(异步调用,避免阻塞)
        raw_result = await model.predict(processed_data)
        # 4. 后处理结果(如将概率转换为策略名称)
        result, score = postprocess_result(raw_result)
        # 5. 构造响应
        return InferenceResponse(
            result=result,
            score=score,
            timestamp=str(datetime.utcnow())
        )
    except Exception as e:
        raise HTTPException(status_code=500, detail=str(e))

# app/models/model_manager.py
class ModelManager:
    def __init__(self):
        self.models = {}  # 缓存加载的模型(model_id: model_instance)
        self.tf_serving_client = TensorFlowServingClient()  # TensorFlow Serving客户端

    def get_model(self, model_id: str) -> Optional[Model]:
        """获取模型(优先从缓存加载,不存在则从TensorFlow Serving加载)"""
        if model_id in self.models:
            return self.models[model_id]
        # 从TensorFlow Serving加载模型(如模型名称为"promotion-model-v1.0")
        model = self.tf_serving_client.load_model(model_id)
        if model:
            self.models[model_id] = model
        return model

5. 模型部署最佳实践

  • 用TensorFlow Serving部署模型:将模型转换为SavedModel格式(tf.saved_model.save(model, "model_dir")),然后用Docker运行TensorFlow Serving:
    docker run -p 8501:8501 --name tf-serving \
      -v /path/to/model_dir:/models/promotion-model-v1.0 \
      -e MODEL_NAME=promotion-model-v1.0 \
      tensorflow/serving:latest
    
  • 模型版本控制:用MinIO存储模型文件,文件名包含版本号(如promotion-model-v1.0.h5),模型管理接口支持按版本查询;
  • 推理性能优化:使用批量推理(如一次处理100条请求)、模型量化(如将32位浮点数转换为8位整数)、GPU加速(如用NVIDIA Triton Inference Server)。

六、接口文档设计:前后端沟通的“契约”

1. 接口文档规范(OpenAPI 3.0)

接口文档是前后端、后端与AI服务之间的“契约”,必须清晰、准确。本文使用OpenAPI 3.0规范,通过Swagger UI展示(FastAPI自动生成)。

2. 核心接口示例(决策推理)

(1)接口基本信息
字段
接口路径 /api/v1/decisions
请求方法 POST
接口描述 生成AI决策结果(如促销策略)
授权方式 Bearer Token(JWT)
(2)请求参数(DecisionRequest)
字段 类型 是否必填 描述
data object 输入参数(如user_id:用户ID,product_id:商品ID,promotion_time:促销时间)
model_id string 模型ID(如promotion-model-v1.0
(3)响应参数(DecisionResponse)
字段 类型 描述
strategies array 策略列表(如name:策略名称,expected_sales:预计销量,cost:成本)
expected_sales_growth number 预计销量增长率(如0.2表示增长20%)
timestamp string 决策时间(ISO格式,如2023-10-01T12:00:00Z
(4)错误响应示例
状态码 响应内容 描述
400 {"code": 400, "message": "参数错误", "detail": "模型ID不能为空"} 请求参数缺失或格式错误
401 {"code": 401, "message": "未授权", "detail": "Token已过期"} 未提供Token或Token无效
404 {"code": 404, "message": "资源不存在", "detail": "模型ID不存在"} 模型ID不存在
500 {"code": 500, "message": "服务器错误", "detail": "模型推理失败"} 服务器内部错误(如模型加载失败)

3. 接口文档展示(Swagger UI)

FastAPI自动生成Swagger UI,访问http://localhost:8000/docs即可查看:

  • 展示所有接口的路径、方法、参数;
  • 支持在线调试(输入参数,发送请求,查看响应);
  • 自动生成接口文档的JSON/YAML格式(http://localhost:8000/openapi.json)。

七、设计规范:保证团队开发一致性

1. 前端设计规范

  • 组件命名:使用PascalCase(如DecisionChart.vue),组件名称与文件名一致;
  • 代码风格:用ESLint+Prettier统一代码风格(如缩进2空格、单引号);
  • 状态管理:Pinia的Store分模块(如decisionStore管理决策状态,userStore管理用户状态);
  • 可视化规范:图表颜色使用企业色(如蓝色#1890FF),字体使用微软雅黑,图表标题字体大小16px。

2. 后端设计规范

  • 包结构:按功能划分(如com.example.dss.controllercom.example.dss.service),避免按层划分(如com.example.dss.web);
  • 接口命名:使用驼峰式(如getDecisionResult),避免使用动词(如getDecision);
  • 异常处理:统一使用@ControllerAdvice拦截异常,返回标准错误响应(包含codemessagedetail);
  • 日志规范:使用SLF4J+Logback,日志级别分DEBUG(开发环境)、INFO(生产环境)、WARN(警告)、ERROR(错误),每个请求记录日志(如请求路径:/api/v1/decisions,请求参数:{"data": {...}, "model_id": "..."})。

3. AI服务设计规范

  • 模型文件命名:包含版本号(如promotion-model-v1.0.h5);
  • 推理性能:单条请求响应时间≤500ms(95分位),并发量支持1000 QPS;
  • 数据格式:输入输出用JSON,字段名用下划线分隔(如user_id),数据类型明确(如expected_sales用number)。

4. 数据库设计规范

  • 表命名:使用下划线分隔(如decision_log),避免使用驼峰式;
  • 字段命名:使用下划线分隔(如user_id),避免使用拼音;
  • 索引设计:为查询频繁的字段(如model_iduser_id)建立索引;
  • 逻辑删除:使用deleted字段(0表示未删除,1表示删除),避免物理删除。

八、实战项目:电商促销决策支持系统

1. 项目背景

某电商平台需要一个AI辅助决策系统,根据用户的购买历史、商品库存、市场趋势,生成促销策略(如打折、满减、捆绑销售),并预测每个策略的预计销量增长。

2. 开发环境搭建

  • 前端:Node.js 18+、Vue 3、Vite;
  • 后端:JDK 17+、Spring Boot 3.0、MySQL 8.0、Redis 7.0;
  • AI服务:Python 3.10+、FastAPI、TensorFlow 2.10+、MinIO;
  • 工具:Docker(容器化部署)、Postman(接口调试)、Grafana(监控)。

3. 项目实现步骤

(1)需求分析:明确系统目标(如支持多数据源接入、实时决策、可视化展示);
(2)架构设计:绘制整体架构图,确定技术栈;
(3)前端开发:实现决策页面、模型管理页面、可视化组件;
(4)后端开发:实现用户模块、决策模块、模型管理模块;
(5)AI服务开发:实现推理接口、模型管理接口、数据处理模块;
(6)接口调试:用Postman调试后端与AI服务的接口;
(7)部署上线:用Docker部署前端、后端、AI服务,用Nginx作为API网关;
(8)监控运维:用Prometheus监控系统性能,用Grafana展示监控数据,用ELK stack收集日志。

4. 项目效果展示

  • 前端页面:用户输入促销时间、商品ID,选择模型(如promotion-model-v1.0),点击“生成决策”,页面展示促销策略的预计销量增长曲线;
  • 实时推送:管理员页面实时接收决策结果(如“用户123选择了满减策略,预计销量增长20%”);
  • 模型管理:管理员可上传新模型(如promotion-model-v2.0),切换模型(如从协同过滤到Transformer)。

九、未来发展趋势与挑战

1. 未来发展趋势

  • 大语言模型(LLM)集成:用ChatGPT、文心一言等LLM生成自然语言决策建议(如“建议采用满减策略,因为用户123的购买历史显示他们喜欢折扣”);
  • 实时数据处理:用Flink、Spark Streaming处理实时数据(如用户的实时浏览行为),生成实时决策;
  • 多模态决策:结合文本(如用户评论)、图像(如商品图片)、视频(如用户购物视频)生成决策;
  • 自动机器学习(AutoML):支持自动选择模型、调参(如用AutoKeras自动选择促销策略模型)。

2. 挑战

  • 模型可解释性:AI模型的决策结果难以解释(如“为什么选择满减策略而不是打折策略?”),需要用SHAP、LIME等工具提高可解释性;
  • 数据隐私:决策系统需要处理用户的隐私数据(如购买历史),需要用差分隐私、联邦学习等技术保护数据隐私;
  • 系统复杂性:前后端分离架构增加了系统的复杂性(如服务发现、负载均衡),需要用Spring Cloud、Kubernetes等工具管理;
  • 成本控制:AI服务的GPU资源成本高,需要用模型量化、批量推理等技术降低成本。

十、总结与资源推荐

1. 总结

本文详细讲解了AI辅助决策支持系统前后端分离架构的设计思路、核心模块实现、接口文档与设计规范,并提供了可运行的代码示例。前后端分离架构的优势在于:

  • 提高开发效率:前后端、AI服务并行开发;
  • 便于扩展:AI模型可独立升级,后端服务可弹性伸缩;
  • 降低耦合度:接口定义清晰,减少跨团队沟通成本。

2. 资源推荐

  • 前端:Vue 3官方文档(https://v3.vuejs.org/)、ECharts官方文档(https://echarts.apache.org/);
  • 后端:Spring Boot官方文档(https://spring.io/projects/spring-boot)、MyBatis Plus官方文档(https://baomidou.com/);
  • AI服务:FastAPI官方文档(https://fastapi.tiangolo.com/)、TensorFlow Serving官方文档(https://www.tensorflow.org/serving);
  • 工具:Postman(https://www.postman.com/)、Docker(https://www.docker.com/)、Grafana(https://grafana.com/)。

附录:接口文档与设计规范下载

代码仓库:https://github.com/example/ai-dss-system(包含前端、后端、AI服务的完整代码)。


本文通过实战案例讲解了AI辅助决策支持系统的前后端分离架构设计,希望能帮助开发者快速上手这类系统的开发。如果有任何问题,欢迎在评论区留言!

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐