ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

Django+Vue+DeepSeek:家庭亲子购物系统实战与数据分析

Django+Vue+DeepSeek:家庭亲子购物系统实战与数据分析 家庭亲子在线购物服务系统这类选题在计算机毕业设计里一直属于“看起来不难但想做得有亮点并不容易”的类型。大多数同学把精力都花在前后台增删改查上最后交出来一个能跑、但看不出深度的商城项目。这次我做这个项目时把路线调整了一下后端用 Python 和 Django 框架前端用 Vue再加一层数据分析可视化和 DeepSeek 大模型 Agent 能力。做完之后最直观的感受是这套组合给一个偏传统的电商选题加了不少新意而且过程中踩过的坑恰好也是很多 Django 项目实战新手会遇到的。这篇复盘会把整条链路讲清楚项目从数据建模开始怎么走Django 如何把接口整理成干净的 REST 风格Vue 前后端怎么联调数据分析可视化里哪些指标最有说服力以及 DeepSeek 大模型在电商场景里能承担什么角色。文中放的代码片段都来自实际运行过的项目可以按需改造不用当成从零开始的教科书。1. 系统从规划到数据模型把亲子购物场景拆明白动手写代码之前我花了大概两三天理业务。家庭亲子在线购物服务系统不能直接套“随便一个网上商城”的模板因为它的核心场景有特殊性家里有宝宝的人买东西考虑的不只是“这个东西多少钱”还包括“适合多大的孩子”“材质安全吗”“有没有同类口碑更好的选择”。这些需求如果不在数据模型层面支持后面做大模型助手和数据分析都会缺地基。1.1 用户、商品、订单三条主线系统里至少有三种角色普通家长用户、系统管理员、游客。游客可以浏览商品但下单、收藏、个人中心这些行为必须登录管理员进后台管商品、订单、用户和内容。为此用户表用 Django 自带的 AbstractUser 扩展就够了不需要自己从零造用户模型。商品模型是亲子场景的核心。我设计成不搞超级复杂的多级分类而是用一层大分类加若干标签。大分类包括“奶粉辅食”“尿裤湿巾”“童装童鞋”“玩具绘本”“出行用品”“洗护用品”再加一个 age_range 字段记录适用年龄例如 0-6个月、6-12个月、1-3岁、3-6岁这样后续搜索和推荐都很方便。商品表字段大致是字段类型说明nameCharField商品名称categoryCharField一级分类age_rangeCharField适用年龄区间priceDecimalField当前售价original_priceDecimalField原价用于展示折扣stockIntegerField库存sales_countIntegerField累计销量main_image / images文件/JSON字段商品图descriptionTextField详细介绍is_on_saleBooleanField是否上架is_recommendBooleanField首页推荐标志created_timeDateTimeField创建时间订单模型用的是最经典的主单加明细结构。订单表存订单号、用户、总金额、状态、收货地址快照订单明细表记录下单时的商品名、单价、数量、小计。为什么不直接让订单和商品外键关联因为商品价格和名称会变订单必须保留一版“快照”否则以后查历史订单会对不上账。1.2 亲子场景里值得单独设计的几个字段普通电商可能不需要太多额外约束但亲子商品要注意两类信息适用年龄和常见问答。我在商品表里加了 age_range 字段后商品详情页就可以直接展示“适用月龄”管理员上架时也必须填这个字段否则表单校验不过。另一个是 faq_tags我把一些高频问题做成标签比如“是否含糖”“是否需要冷藏”“能否水洗”“是否可啃咬”这些标签既方便前端筛选也方便后面大模型回答问题时引用。收货地址表也需要考虑“亲子场景”的常见操作很多家长会同时给不同长辈家买一份所以我让地址支持设置多个默认收货点订单结算时可以手动选择。字段上不需要特殊设计但逻辑上要支持一个用户维护多条收货信息。1.3 为什么把大模型和数据分析放在购物链路里传统项目里数据分析通常只是后台几个报表页面大模型更是可有可无的“锦上添花”。我这次把两者的位置提前了数据分析不仅给管理员看也给普通用户展示“本周热卖”“同类销量排行”让数据直接影响购买决策大模型则作为“智能导购”家长可以直接输入一句“3个月大的宝宝适合什么奶粉”系统把懂意图返回给模型模型再去查商品库给出带商品链接的回答。这样设计的好处是答辩或者演示时不需要准备太多素材只要现场输一句话、点一个商品效果就出来了。更重要的是这两块内容在技术上确实能落地下面每一层我都会讲清楚。2. Django 后端从建项目到跑通接口新手最容易卡住的四个环节后端部分我用的是 Django Django REST Framework。选这个组合是因为 Django 在数据建模、后台管理、用户认证上都省事DRF 又能快速把模型暴露成 REST API这套组合特别适合中小型电商项目。2.1 环境准备与 Django 版本选择先解决 Python 环境。我建议用虚拟环境不要直接往系统 Python 里装依赖不然不同项目互相污染会很痛苦。创建虚拟环境并安装依赖的命令python -m venv venv source venv/bin/activate # Windows 下是 venv\Scripts\activate pip install django djangorestframework django-cors-headers版本选择上如果你是为了课程设计或毕业设计Django 4.2 LTS 是稳妥选择Django 5.x 也可以用但要注意部分第三方库的兼容情况。DRF 直接装最新稳定版即可。额外装上 django-cors-headers 是因为 Vue 前端开发服务器和 Django 默认端口不一样先把这个装上能省掉后面联调的大半麻烦。2.2 创建项目、创建 app 和基础配置创建 Django 项目和内部 appdjango-admin startproject myshop cd myshop python manage.py startapp goods python manage.py startapp orders python manage.py startapp users然后在 settings.py 里把 app 注册进去同时配置 DRF 和 CORS。很多人第一次用 DRF 会漏掉REST_FRAMEWORK配置结果访问 API 时看到一堆看不懂的报错。最基础的配置是允许所有接口使用默认的 ViewSet 路由方式INSTALLED_APPS [ django.contrib.admin, django.contrib.auth, django.contrib.contenttypes, django.contrib.sessions, django.contrib.messages, django.contrib.staticfiles, rest_framework, corsheaders, goods, orders, users, ] MIDDLEWARE [ django.middleware.security.SecurityMiddleware, django.contrib.sessions.middleware.SessionMiddleware, corsheaders.middleware.CorsMiddleware, # 注意放这里 django.middleware.common.CommonMiddleware, # ... ] CORS_ALLOWED_ORIGINS [ http://localhost:5173, http://127.0.0.1:5173, ]CORS 中间件要放在 CommonMiddleware 前面这个顺序错了会导致请求被提前拦掉。另外如果以后上线部署把 CORS_ALLOWED_ORIGINS 换成正式域名别一直开CORS_ALLOW_ALL_ORIGINS True那等于允许任何网站调用你的接口不安全。2.3 定义模型与序列化器包含执行查询和删除对象的实操模型定义完以后DRF 的序列化器负责把模型对象转成 JSON。我直接用 ModelSerializer少写很多代码。以商品为例# goods/serializers.py from rest_framework import serializers from .models import Product class ProductListSerializer(serializers.ModelSerializer): class Meta: model Product fields [id, name, category, age_range, price, main_image, sales_count, is_recommend] class ProductDetailSerializer(serializers.ModelSerializer): class Meta: model Product fields __all__列表接口不需要返回大字段 description所以单独写一个精简的列表序列化器详情接口再返回全字段。这种序列化器分离是很基础但很有用的习惯接口响应体积会小很多。很多新手在 DRF 里卡住的不是序列化器而是“查询和删除对象”这个基础操作到底怎么在视图里写。给你一个最简的通用视图函数版本逻辑和 Django 原生写法保持一致# goods/views.py from django.shortcuts import get_object_or_404 from rest_framework.decorators import api_view from rest_framework.response import Response from .models import Product from .serializers import ProductListSerializer api_view([GET]) def product_list(request): products Product.objects.filter(is_on_saleTrue) keyword request.query_params.get(keyword, ) if keyword: products products.filter(name__icontainskeyword) serializer ProductListSerializer(products, manyTrue) return Response(serializer.data) api_view([GET]) def product_detail(request, pk): product get_object_or_404(Product, pkpk) serializer ProductDetailSerializer(product) return Response(serializer.data) api_view([DELETE]) def product_delete(request, pk): product get_object_or_404(Product, pkpk) product.delete() return Response({message: deleted})如果要用 Django 原生查询语法做删除常见写法有三种按场景选# 单个对象删除先查再删查不到会抛 DoesNotExist obj Product.objects.get(pkpk) obj.delete() # 批量删除直接对查询集操作 Product.objects.filter(categoryold_category).delete() # 安全一点用 filter(...).first() 避免查不到时报 500 obj Product.objects.filter(pkpk).first() if obj: obj.delete()重点是理解 queryset 的惰性求值filter()不会立刻查数据库只有执行get()、first()、迭代、调用delete()这种终操作时才真正执行 SQL。所以先建一个条件组合再决定删不删是 Django 里非常重要的工作习惯。2.4 视图集、路由和后台注册DRF 的 ViewSet 可以一次性把 list、retrieve、create、update、delete 五个接口生成好。我是列表接口和详情接口区分处理管理后台的增删改走 ViewSet用户端浏览走自定义函数视图。这样最灵活。路由配置长这样from rest_framework.routers import DefaultRouter from django.urls import path, include router DefaultRouter() router.register(radmin/products, views.AdminProductViewSet) urlpatterns [ path(api/, include(router.urls)), path(api/products/, views.product_list), path(api/products/int:pk/, views.product_detail), ]后台管理方面Django admin 本身就是个非常成熟的“赠品”。把模型注册进 admin录入商品、查看订单都方便# goods/admin.py from django.contrib import admin from .models import Product admin.register(Product) class ProductAdmin(admin.ModelAdmin): list_display (name, category, age_range, price, stock, sales_count, is_on_sale) list_filter (category, age_range, is_on_sale) search_fields (name,)这一章跑通之后Vue 前端能拉到的接口就有了商品列表、商品详情、后台增删改查、后续的订单接口和统计接口都挂在/api/下面。3. Vue 前端与 Django 联调从建项目到把商品列表渲染出来前端部分我选了 Vue 3 Vite因为生态成熟、脚手架简单跟后端的 REST 接口配合非常顺。整个项目不需要太重的前端工程化重点是把页面、路由、请求封装、图表展示做好。3.1 Vite 创建 Vue 项目与环境配置用 npm 创建 Vue 项目npm create vitelatest shopfront -- --template vue cd shopfront npm install npm install vue-router pinia axios element-plus echarts npm run dev这里有个很容易踩的坑Vite 默认端口是 5173Django 默认是 8000两边端口不一样浏览器直接请求后端 API 会碰见跨域问题。如果你已经按上一章的说明把 CORS 配好开发模式可以直接请求http://localhost:8000/api/...。不想每次写全地址的话建议在项目根目录建.env文件VITE_API_BASE_URLhttp://localhost:8000/api然后在前端代码里统一用import.meta.env.VITE_API_BASE_URL以后改域名只动这个环境变量不用全局替换。3.2 Vue Router 基础配置与动态路由页面结构参考典型商城首页、商品列表、商品详情、购物车、订单确认、订单列表、个人中心、管理后台。Vue Router 的基础写法// src/router/index.js import { createRouter, createWebHistory } from vue-router const routes [ { path: /, name: home, component: () import(../views/Home.vue) }, { path: /goods, name: goods-list, component: () import(../views/GoodsList.vue) }, { path: /goods/:id, name: goods-detail, component: () import(../views/GoodsDetail.vue) }, { path: /cart, name: cart, component: () import(../views/Cart.vue) }, { path: /orders, name: orders, component: () import(../views/Orders.vue) }, ] const router createRouter({ history: createWebHistory(), routes, })如果是毕业设计或课程设计前期用静态路由就够了。等到要区分“普通用户”和“管理员”再考虑动态路由也不迟核心逻辑是登录后根据角色把对应 view 组件挂到路由表里。3.3 请求封装与商品列表渲染统一封装 axios 实例好处是拦截器、错误提示、token 注入都只写一次// src/api/http.js import axios from axios import { ElMessage } from element-plus const http axios.create({ baseURL: import.meta.env.VITE_API_BASE_URL, timeout: 15000, }) http.interceptors.request.use((config) { const token localStorage.getItem(token) if (token) { config.headers.Authorization Bearer ${token} } return config }) http.interceptors.response.use( (response) response.data, (error) { ElMessage.error(error.response?.data?.detail || 请求失败) return Promise.reject(error) } ) export default http商品列表页面和接口对接起来非常简单// src/api/goods.js import http from ./http export function getProducts(params) { return http.get(/products/, { params }) } export function getProductDetail(id) { return http.get(/products/${id}/) }页面里用onMounted拉接口把数据填进响应式变量再交给 Element Plus 的卡片组件渲染。这里提醒一个细节图片地址如果是后端上传的相对路径比如/media/goods/1.jpg前端直接访问会 404因为你请求的是 Vue 开发服务器的地址。解决办法是写一个类似transformImgUrl的辅助函数把相对路径拼接成后端完整地址function transformImgUrl(url) { if (!url) return if (url.startsWith(http)) return url return http://localhost:8000${url} }3.4 联调中常见的两类问题第一类是跨域问题。如果后端 CORS 配置正确而前端还是报跨域先在浏览器 Network 面板看响应头里有没有Access-Control-Allow-Origin没有就说明中间件顺序错了或者在 CORS 配置前中间件就被拦截了。第二类是接口字段对不齐。Django 模型里的created_time自动带上T分隔符Vue 页面直接展示会很丑可以在后端序列化器里加format%Y-%m-%d %H:%M更推荐的做法是前端组件里统一格式化。我个人倾向后端格式化毕竟前端十几个地方都要用同一个时间格式。4. 接入 DeepSeek 大模型让商城有一个会思考的购物助手家庭亲子购物系统最出彩的部分往往是这个“智能购物助手”。它不是一个简单的问答机器人而是要结合商品库数据完成推荐和答疑。整个过程分三步走先接 API再做系统提示词再让它具备查库能力。4.1 准备工作申请 Key 和选择模型接口DeepSeek 的接口整体兼容 OpenAI 风格调用成本也不高非常适合作业项目。你先到开放平台申请 API Key然后把 Key 放进后端的环境变量不要在代码里硬编码不然代码一上传等于把钥匙交出去。在项目根目录建一个.env文件DEEPSEEK_API_KEYsk-你的密钥Django 读取环境变量用 os.environ 或者 python-dotenv# config/settings.py 底部或其他配置文件 import os from dotenv import load_dotenv load_dotenv() DEEPSEEK_API_KEY os.getenv(DEEPSEEK_API_KEY)4.2 后端封装大模型调用函数新建一个services/llm_service.py把所有大模型调用逻辑集中管理。最基础的调用代码import os import requests DEEPSEEK_API_URL https://api.deepseek.com/chat/completions def call_deepseek(messages, temperature0.3, max_tokens1024): headers { Content-Type: application/json, Authorization: fBearer {os.getenv(DEEPSEEK_API_KEY)} } payload { model: deepseek-chat, messages: messages, temperature: temperature, max_tokens: max_tokens, stream: False } response requests.post(DEEPSEEK_API_URL, headersheaders, jsonpayload, timeout30) response.raise_for_status() data response.json() return data[choices][0][message][content]如果只是“模型翻译”这类最简单场景上面就够了。但电商助手不能只回一句空话它必须知道商品库里有什么。所以下一步要让模型能看到真实数据。4.3 从问答机器人升级为会查数据的 AgentAgent 化改造的核心思路是“让大模型调用工具”。具体落地时不用搞太复杂我用的是模拟 function calling 的方案给模型提供几个可用的工具定义比如“查询热门商品”“按年龄区间搜索商品”“获取商品详情”和“查询最近订单统计”模型根据用户问题选择调用哪个工具再带着工具结果组织回答。一个简化但好用的做法是后端先把商品检索结果查出来再拼进提示词里交给大模型。我写了一个函数检测用户输入是否包含“奶粉”“尿裤”“童装”等关键词先做一次数据库查询把结果做成紧凑的文本描述然后作为上下文传给模型# services/llm_service.py from goods.models import Product def search_products_for_llm(keyword, age_rangeNone): qs Product.objects.filter(is_on_saleTrue) if keyword: qs qs.filter(name__icontainskeyword) if age_range: qs qs.filter(age_rangeage_range) qs qs.order_by(-sales_count)[:5] lines [] for p in qs: lines.append(f商品ID:{p.id}, 名称:{p.name}, 价格:{p.price}元, 适用年龄:{p.age_range}, 累计销量:{p.sales_count}) return \n.join(lines) def build_messages(user_query, context): system_prompt 你是家庭亲子购物平台的智能导购助手。 你会收到用户问题和当前商品库检索结果。 请基于检索结果作答不要编造不存在的商品。 如果结果为空请引导用户更换关键词。 回答要简洁适合家长阅读可以给出推荐理由。 return [ {role: system, content: system_prompt}, {role: user, content: f用户问题{user_query}\n\n当前可参考商品\n{context}} ]这时候用户问“适合3岁孩子的绘本有哪些”后端先用age_range3-6岁去查绘本分类的商品把前几名整理成文本DeepSeek 再基于这些文本生成推荐语。既有数据支撑又有自然语言表达演示效果会比机器人式回答好很多。4.4 亲子场景下的提示词模板设计提示词是大模型项目里性价比最高的部分。我在系统提示词里强调了三点禁止编造商品、回答贴合亲子使用场景、推荐要说明理由。实际测试下来温度参数设 0.3 比较稳太低会显得机械太高容易溢出商品范围。给家长回复时模板可以固定成“适合 X 月龄、推荐理由、注意事项”三段式模型输出会显得非常有条理。还可以在提示词里追加一条“如果用户问题涉及健康、用药、过敏等专业领域请提醒家长咨询专业人士”避免模型给出越界的安全建议。这一点对亲子购物场景尤其重要家长对奶粉、辅食类问题的容错率非常低。4.5 大模型请求的常见问题与流程优化实际项目中大模型接口调用通常是秒级响应如果放在 Django 同步视图里用户会一直转圈。两个优化思路第一接口超时要有兜底。前端请求超时时间拉长到 30 秒以上后端也要用timeout30同时捕获requests.Timeout和ConnectionError超时时返回“购物助手暂时繁忙请稍后再试”不要直接 500。第二如果想让聊天体验更好可以用streamTrue做流式输出后端把响应一段一段吐给前端前端用text/event-stream接收。但这会增加前后端复杂度毕业设计不做也不影响主功能。5. 数据分析与可视化订单数据如何变成管理员的决策参考数据分析模块如果只做几个打折促销表格就没什么意思。我选择了从“经营决策”角度切入管理后台应该能一眼看出本周卖得好不好、哪类商品贡献了主要销售额、哪些顾客值得做回访。这样数据分析就和系统主业务串起来了。5.1 核心统计指标怎么选电商项目最常用的几个指标完全够撑起业务亮点销售额订单状态为已完成或已支付的订单总金额。订单量支付订单数量。客单价销售额 / 订单数。商品销量排行按订单明细里的商品汇总数量。复购率有过两单及以上的用户占比。客单价和复购率看着简单但能体现你对业务的理解。答辩时被问“你分析了什么”能说出“我用销售额、客单价和复购率综合评价了近期经营情况”比只丢出一张柱状图强太多。5.2 Django 聚合查询生成报表接口数据库里订单一天天积累统计不能遍历所有数据必须用 ORM 聚合。Django 的annotate和values配合起来可以按月份、分类、商品做分组统计。例如按月份统计销售额from django.db.models import Sum, Count, F, DecimalField from django.db.models.functions import TruncMonth from orders.models import Order, OrderItem def monthly_sales_report(): data ( Order.objects.filter(statuspaid) .annotate(monthTruncMonth(created_time)) .values(month) .annotate( total_salesSum(F(total_amount), output_fieldDecimalField(max_digits12, decimal_places2)), order_countCount(id) ) .order_by(month) ) return list(data)TruncMonth(created_time)会把 datetime 截断成月份配合values(month)完成按月分组这种写法 SQL 只执行一次聚合查询性能远好于 Python 层循环累加。商品销量排行类似从 OrderItem 出发from goods.models import Product def category_sales_report(): data ( OrderItem.objects.values(product__category) .annotate( total_quantitySum(quantity), total_amountSum(F(price) * F(quantity), output_fieldDecimalField(max_digits12, decimal_places2)) ) .order_by(-total_amount) ) return list(data)统计接口建议单独放在reportsapp 里不要跟业务接口混在一起。因为统计接口调用频率低、耗时长以后可以很自然地加上 Redis 缓存。5.3 前端 ECharts 图表的接入方式前端接入 ECharts 非常简单。安装依赖后用ref挂载 div把后端返回的数据映射成图表选项即可。按月份销售额柱状图的核心代码template div refchartRef stylewidth: 100%; height: 400px/div /template script setup import { ref, onMounted, nextTick } from vue import * as echarts from echarts import { getMonthlySales } from ../api/report const chartRef ref(null) onMounted(async () { const data await getMonthlySales() const months data.map((item) item.month) const sales data.map((item) Number(item.total_sales)) await nextTick() const chart echarts.init(chartRef.value) chart.setOption({ title: { text: 月度销售额趋势 }, tooltip: { trigger: axis }, xAxis: { type: category, data: months }, yAxis: { type: value }, series: [{ name: 销售额, type: bar, data: sales, itemStyle: { color: #4C9AFF } }] }) }) /script页面销毁时记得chart.dispose()不然切换路由会导致内存泄漏、图表重叠。这是 ECharts 项目里特别常见的隐藏 bug。除了柱状图我还做了商品分类占比的饼图和商品销量 Top10 的横向条形图。一个数据看板里有趋势图、占比图、排行图视觉上很丰满技术上也没增加多少复杂度。另外可以给数据看板加时间筛选按“近7天”“近30天”“自然月”切换这会让数据分析模块显得更完整。6. 实测中的坑与“用 AI Agent 辅助开发 Django”的一点心得整套系统做完之后我复盘了一下哪些地方最容易浪费时间也给后来者提个醒。顺便聊聊现在很火的 AI 辅助编程工具在 Django 项目开发里到底怎么用最有效率。6.1 几个实测中最常见的问题先列一个我确认过的清单现象根本原因解决思路Vue 请求 Django 接口跨域CORS 中间件顺序错误或未配置白名单检查 corsheaders 在 MIDDLEWARE 里的位置admin 后台商品图不显示没有配置 MEDIA_URL 和 MEDIA_ROOTsettings.py 配置 MEDIAurls.py 里加 static 路由批量删除误删数据filter().delete()直接删除未预览结果先.count()确认影响行数接口返回的字段带 T 格式DRF DateTimeField 默认 ISO 格式序列化器字段加format%Y-%m-%d %H:%M统计接口很慢Python 循环里逐条查库改用 annotate values 聚合大模型回复编造商品提示词未限制模型只能基于检索内容输出系统提示词加限制并传给模型真实检索结果最反直觉的一个坑是filter().delete()。Queryset 正常是惰性的但delete()会立刻执行 SQL而且默认不会打印将删除的记录数以外的信息。我曾有一次写错筛选条件一条指令删掉了整个分类的商品好在是开发环境。建议所有批量删除接口在操作前弹确认框后端再做一层交互确认参数双重保险。6.2 用 AI Agent 辅助开发 Django 的效率心得现在很多人习惯把大模型工具接进日常开发。我实际用了 AI 编码工具辅助这个项目最舒服的用法是让它写结构清晰、模板化强的代码比如序列化器、CORS 配置、ViewSet 路由、Vue 组件的 ECharts 初始化。这些代码模式固定AI 非常擅长。但它绝不适合从头到尾把一个完整电商系统直接生成出来尤其涉及业务逻辑建模、订单状态流转、权限控制这部分还是得自己拍板。用 AI 辅助开发 Django 时我总结了一个推荐提问模板先说清楚“我要什么效果”再贴“核心报错全文”最后贴“当前相关代码”。比如“我要给商品列表加按年龄筛选Django 序列化器里怎么接收参数当前代码如下”比一句“帮我写个筛选功能”有效十倍。因为 AI 工具理解的上下文越多给出的答案越贴合项目本身而不是贴一段通用 demo。6.3 这套系统后续还能扩展的方向如果把数据分析和 Agent 能力继续往前推一步有两条路线我觉得价值很大。第一条是做个性化推荐。目前可以基于订单数据计算每个用户最近购买的年龄区间用户再次进入首页时优先展示同龄段的商品再配合大模型生成一句“根据您家宝宝月龄推荐”效果会非常像一个真正懂家长的导购。第二条是把大模型 Agent 做成后台运营助手。运营人员在后台输入“帮我把销量前10的绘本文案改写成育儿知识风格”系统先查销量榜再调用 DeepSeek 生成文案管理员确认后直接回填商品描述。这个功能不仅演示效果好而且真正能减少重复劳动和“家庭亲子在线购物”的场景也贴得住。我现在特别认可一个判断电商系统选型上Django 负责数据和业务Vue 负责交互体验大模型负责把冷冰冰的商品数据翻译成用户听得懂的话三者的分工非常清楚。如果你正准备做类似项目我建议把重心从前台页面堆砌转回业务链路设计上一个能查数据的 Agent、一张有洞察力的图表比多放几个华而不实的动画都有用。
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进