news 2026/10/18 23:25:45

SpringBoot+Vue前后端分离:篮球主题商城系统全栈实战解析

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
SpringBoot+Vue前后端分离:篮球主题商城系统全栈实战解析

做电商系统的毕业设计,十个里七八个都是SpringBoot + Vue的固定组合,这本身不算新鲜。但今天想聊的这个“篮球吧主题商城平台”,不是那种简单套个登录注册、CRUD就交差的页面堆砌。它的完整定位是:一个以篮球文化为核心、覆盖商品展示、购物车、订单流转和后台管理的垂直品类商城,前后端完全分离,后端用SpringBoot提供RESTful接口,前端用Vue实现单页应用。内容上既能支撑毕业设计的论文和答辩,也能让刚入门前端和后端的同学真正理解一个工程化项目的全貌。

我拆解这个题目的思路是这样的:先梳理整站功能边界和数据模型,再分别落地后端接口和前端页面,最后处理跨域、部署、权限这类“看起来不难但最容易翻车”的环节。无论你是准备拿这个题目做毕设,还是想练手一个完整的全栈项目,这篇文章都值得存下来对照着做。会牵扯到大量细节,但我会尽量写得像现场带做一样,把每一步的为什么也讲清楚。

1. 项目定位与整体设计构思

1.1 先弄清楚“篮球吧主题商城”到底要做什么

标题里的“释放活力永葆青春”是品牌文案,落到系统上就是两个核心对象:篮球主题内容和商城交易。也就是说这个平台不只是卖货,它要围绕篮球这个文化场景把商品组织起来,比如分类可以是篮球、球鞋、球衣、护具、纪念周边。用户逛的时候有代入感,管理员维护的时候也能按场景管理商品。

从功能角色上看,我建议直接分为前台用户端和后台管理端两条线。用户端要有的功能很明确:注册登录、浏览商品列表和详情、按分类筛选、关键词搜索、加入购物车、提交订单、支付模拟、查看订单状态、维护收货地址。管理端要有的则是:商品上架下架和库存管理、分类管理、订单审核与发货、用户列表、基础数据统计。这样一分,系统的功能边界就清楚了,后续画用例图、写论文、指答辩都有素材。

把商城垂直化是这套系统的亮点所在,说直白点,它在数据库表设计上比通用商城多了一层“商品与篮球场景的关联”。比如商品除了普通价格和库存,还可以设计球衣的尺码字段、篮球的材质字段,这样前台页面展示时能突出垂直品类的专业感。甚至可以对商品附上“球员推荐”“实战场景”之类的标签字段,让“篮球吧”这个主题不仅仅停留在标题里,而是渗透到产品设计的每个角落。

1.2 技术选型的真实理由:为什么要选SpringBoot和Vue

每次写技术选型都要有说服力。SpringBoot在这套系统里的职责,说白了就是快速构建后端服务和数据接口。它的自动配置机制把大量重复的Spring配置省掉了,你写一个Controller就能直接跑起来,这对毕设和中小型项目来说效率极高。更进一步讲,SpringBoot生态成熟,从数据库访问、缓存、安全校验到文件上传都有现成starter集成,遇到问题搜一下就有答案,开发过程中不会卡壳。相比传统SSM框架,SpringBoot确实更适合这种交付周期短、需要快速稳定实现的场景。

Vue这边不用多说,它适合做交互密集的单页应用。商城类页面的核心体验是“切换商品分类不刷新页面”“加入购物车之后角标实时更新”,这些天然就是Vue的强项。Vue的响应式数据绑定让页面状态和用户操作之间的同步变得非常直接,开发人员不用手动操作DOM。再加上Element Plus这类组件库,表格、表单、弹窗、分页都能直接复用,管理端的开发速度会有质的提升。

前后端分离是这套架构的关键决策。传统JSP模板方案在后端渲染页面,前后端代码混在一起,项目稍一复杂就难以维护。分离之后,后端只需要专心输出JSON数据,前端独立开发和测试,最后的部署也只是两个独立组件的对接。这样一个团队里前后端可以并行开发,对开发周期和问题定位都有明显好处。

1.3 功能模块拆解与优先级规划

我不建议一上来就猛写代码,先把模块和优先级列出来会省掉大量返工。根据实际经验,可以按以下顺序推进:

  • 用户模块:注册、登录、Token鉴权、地址管理。优先做,因为所有交易功能都依赖登录态。
  • 商品模块:分类树、商品列表、商品详情、库存管理。作为商城核心,必须在用户模块稳定后第一时间完成。
  • 购物车模块:加购、修改数量、删除、清空、购物车列表。直接关联订单,逻辑虽简单但对状态敏感。
  • 订单模块:创建订单、订单项快照、订单状态流转、订单列表查询。整个系统中业务最重的部分,要和数据库设计严密配合。
  • 管理后台模块:商品管理、订单处理、用户管理、数据看板。与前台共享Service层,只是Controller层和权限控制不同。

优先级规划的思路是“先打通交易主链路,再做细节优化”。我见到太多同学在登录页和轮播图上浪费了三四天,最后订单模块草草收尾,答辩时被评审老师一问就露馅。正确的做法是集中精力把用户下单整个闭环跑通,其他的样式和装饰环节有余力再打磨。

2. 后端数据库设计与接口实现要点

2.1 数据库表设计:一张张拆开看

数据库是商城系统的地基,表设计一旦确定了,基本就决定了后续开发的复杂程度。我建议的核心表至少是这几张:用户表、地址表、商品分类表、商品表、购物车表、订单表、订单明细表。如果还想要一点亮点,可以加一张轮播图表或商品评价表,能让页面内容更丰富,论文里也能多写几张E-R图。

拿商品表来说,除了常规的id、name、price、stock、cover_image之外,我推荐加上category_id外键、status上架状态、sales累计销量、description富文本详情。做篮球垂直商城时,还可以设计一个specs字段,用JSON字符串存尺码、颜色、材质等规格信息。虽然这张表结构比普通商品表复杂一点,但前台页面想要展示“实战鞋”“比赛用球”这种标签时,JSON规格字段比硬开几十个字段灵活得多。

订单表的设计是最容易出问题的。切记不要只存一个total_price就完了,而是要存快照。什么意思?就是说订单生成那一刻,要把商品名称、单价、图片、数量这些信息都冗余到order_item明细表里。因为商品的价格和名称后续可能被管理员修改,如果订单只关联商品id,历史订单显示的价格就会跟着商品表变动,这在真实商城里就是事故。订单主表里还要有订单编号、用户id、总金额、状态、收货信息快照和下单时间。收货信息快照也很关键,下单之后用户改了地址,历史订单不能跟着变。

购物车表相对简单:id、user_id、product_id、quantity、checked、create_time。有同学纠结用Redis实现购物车会不会更高级,我的观点是如果项目里没有其他Redis应用场景,为了一个购物车引入Redis反而增加复杂度,都用MySQL就行。技术选型应该是够用且可控的,不是越新越复杂越好。

2.2 后端项目分层和目录结构

后端工程结构我强烈推荐按功能模块分包,而不是简单按controller/service/mapper三层包名硬切。我见过很多人的项目结构是controller文件夹下面堆了几十个类,找个订单接口要翻半天,维护起来非常痛苦。更好的做法是:common放通用返回类和异常处理,config放配置类,controller按业务模块组织,service写业务逻辑,mapper写数据库操作,entity放实体,dto放前端交互的数据对象。

模块分包的话,我的习惯是每个业务模块建一个包,比如user、product、cart、order、admin,这样定位代码非常迅速。比如要改订单状态,直接进order包下面的service实现类。这种组织方式不仅在开发时顺手,在写毕业论文的“系统实现”章节时也容易梳理,每一模块对应一个小节,文字和代码贴起来都有条理。

后端返回结构要统一,这是前后端分离项目里约定俗成的规范。我会定义一个Result类,包含code、message、data三个字段,code为200表示成功,401表示未认证,500表示服务器异常。这样做的好处是前端Axios拦截器可以根据code统一处理错误弹窗和跳转登录,而不用每个接口各自判断。

2.3 用户登录与JWT鉴权设计

登录鉴权我选择JWT方案,原因有两个:一是前后端分离下不需要在服务端保存Session,扩展性和跨域表现更好;二是写论文时可以讲清楚无状态认证的原理,显得有技术深度。具体做法是用户登录成功后,后端生成一个token,包含userId和过期时间,用HMAC密钥签名,前端在请求头里加上Authorization: Bearer token供后端校验。

不过JWT的坑也很多,最大的坑是过期时间设置。如果设太短用户用着用着就跳登录,体验很差;设太长又有安全风险。我的建议是accessToken过期时间设2小时,在登录接口里同时返回一个refreshToken,过期时间设为7天。前端可以做一层静默刷新的逻辑:当请求返回401时,携带refreshToken请求刷新接口,拿到新的accessToken后重放原请求。这个设计写进论文里绝对是加分项,而且实现难度并不高。

权限这块要区分普通用户和管理员。可以在用户表加一个role字段,1表示普通用户,2表示管理员。拦截器或者切面里校验token解析出来的用户id和role,管理端接口统一要求role为2才能访问,否则返回403。实现上可以用HandlerInterceptor配合自定义注解,代码量不大,但能体现你对权限控制的理解。

2.4 商品、购物车、订单的核心流程实现

商品模块绕不开一个高频接口:商品列表要支持分页、分类筛选、关键字搜索和排序。我用MyBatis-Plus的LambdaQueryWrapper,配合Page分页参数,逻辑很直观。一个容易被忽略的小技巧是商品列表接口不要拿Entity直接返回,因为Entity里的简介和详情字段可能很长,每次都带上会拖慢响应速度,我选择新建一个ProductVO只封装列表需要的字段,性能和结构都更干净。

购物车的核心操作是加购和改数量。加购时要判定库存是否充足,超出库存要拦截并提示。修改数量同样要校验,避免前端传来一个负数或者超大数字。前端购物车勾选状态我选择由前端本地维护,提交订单时把勾选的商品id列表传给后端,后端再查库核对价格和库存,以服务端数据为准。

订单流程堪称整套系统里最容易翻车的部分,我建议用事务保证一致性。创建订单的service方法上必须加@Transactional,流程是:校验购物车商品状态 -> 计算总金额 -> 扣减库存 -> 生成订单主表和明细表 -> 清空已购买的购物车项。任何一个环节抛异常都要回滚,否则会出现订单生成了但库存没扣,或者库存扣了订单没生成的数据不一致问题。

订单状态我定义为:0待付款、1待发货、2待收货、3已完成、4已取消、5售后中。考虑到毕设不会接真实支付渠道,可以模拟一个付款操作:用户点击“模拟支付”按钮,后端直接更新状态为待发货。后续管理员发货状态改为待收货,用户确认收货状态改为已完成。这个状态机流转每步都要更新操作时间和日志,方便答辩时演示完整业务闭环。

3. 前端Vue工程搭建与页面实现

3.1 Vue环境配置与项目初始化实操

Vue前端我选择Vue 3 + Vite + Element Plus这套组合,而不是Vue 2 + Vue CLI。理由很实在:Vue CLI那套基于webpack的构建链路启动和打包都太慢,Vite开发时几乎秒开,热更新反应也快,对开发效率提升明显。如果你机器上还没装Node.js,先去官网下载一个LTS版本,建议Node 18以上,然后npm就自带了。

初始化直接用命令npm create vite@latest basketball-mall -- --template vue,选择vue模板创建项目。进入目录后安装依赖,这里有个经验:用npm install经常会在Element Plus这种大依赖上卡几十分钟,我一般直接用cnpm i或者pnpm i,速度立竿见影。

安装完依赖后,第一件事不是写页面,而是把项目里用不到的默认组件清理掉,配置路径别名。在vite.config.js里加resolve.alias,把@指向src目录,这样以后import组件或者图片都能用@/components这种简洁路径。同时把JavaScript的严格模式改一下,避免构建时因为代码规范报错。命令运行npm run dev能看到默认首页了,接下来就可以开始规划路由和页面结构。

3.2 路由设计和页面框架规划

一个商城前端的路由结构,我的设计是分为用户端和管理端两个区域。用户端路由包含首页、商品列表页、商品详情页、购物车页、订单确认页、订单列表页、个人中心页;管理端路由包含商品管理、订单管理、用户管理、数据统计页。为了不让用户和管理员代码互相干扰,我利用Vue Router的嵌套路由,配合不同的布局组件:用户端用带导航栏的商城布局,管理端用带侧边栏的后台布局。

这里要说一个Vue Router 4的核心注意点:路由模式用createWebHistory时刷新页面会出现404,部署到Nginx时必须要做try_files配置把所有路径指向index.html。很多同学第一次部署就栽在这里,以为是后端跨域问题,实际上是前端路由没有做history回退。如果用createWebHashHistory模式就没有这个问题,URL里会多个#号,但胜在省心。我建议开发阶段用hash模式,部署稳定后再切history也不迟。

路由守卫也不能忽略。全局前置守卫里读localStorage里的token,没有token则跳转登录页;路由meta里标记requiresAdmin的,还要校验本地存的userInfo里的role是否为管理员。这样前端层面就堵住了未登录访问个人中心和后台的路径,配合后端拦截器双保险。

3.3 Axios封装与接口联调规范

前端和后台打交道全靠Axios,这一步封装做得好,联调效率直接提升一个档次。我会在src/utils/request.js里创建Axios实例,设定baseURL为/api,超时时间10秒。请求拦截器从localStorage拿token,加到Authorization请求头;响应拦截器统一处理code,200就返回data,401就提示登录过期并跳转登录页,500就弹出错误消息。

接口API统一管理也非常必要。在src/api目录下按模块拆分文件,比如product.js、cart.js、order.js、user.js、admin.js。每个文件导出一个函数对应一个后端接口,页面里调用import { getProductList } from '@/api/product'就行。这样做的好处是接口路径集中维护,修改一处全站生效,不会出现前端页面里到处散落硬编码URL的混乱局面。

跨域问题在前后端分离项目里一定绕不开。开发环境我会用Vite的proxy配置,将/api开头的请求代理到http://localhost:8080,这样浏览器请求的还是自己的域名,没有跨域问题。生产环境通过Nginx把/api转发到后端服务地址,同样避免跨域。这些配置虽然简单,但如果不提前搞清楚原理,开发中就会反复遇到前端能访问后端口但请求报跨域的奇怪问题。

3.4 商城主页面组件拆分与难点实现

商城首页最关键的是商品卡片列表和分类筛选。这里我用组件化思路拆成ProductCard组件,接收一个product对象,展示商品图片、名称、价格和销量。复用性和可维护性很强,商品列表页、搜索页、推荐位都能直接用这同一个组件。分类筛选是用Tag标签实现,点击之后触发父组件重新请求商品列表,配合Element Plus的分页组件实现完整筛选链路。

商品详情页有一个值得提的交互点:确定购买规格。虽然我的商品表里用JSON存了规格信息,但前端要做的是把规格解析出来渲染成可选按钮,用户选定规格后还要联动库存和价格展示。这个功能用Vue的computed计算属性实现特别顺手,选中的规格对象传入后端创建订单接口。很多同学把规格逻辑全堆在methods里,代码一大就乱,我建议所有派生数据都用computed,这样代码结构天然清晰。

购物车页面是我觉得最能体现Vue优势的地方。勾选、全选、增减数量、实时汇总金额,这些交互在jQuery时代写起来非常痛苦,但在Vue里只需要用v-model绑定购物车列表的checked和quantity字段,合计金额用computed根据勾选状态实时计算,代码量能少一半。页面操作之后调用后端更新接口,注意这里有个竞态问题:用户连续快速点击加减按钮,可能请求响应顺序颠倒,导致前端显示的数量和后端不一致。我的解决方案是为每个商品的操作加一个lodash防抖,几行代码就能避免这个恼人的bug。

管理端的商品管理页面唯一的难点就是图片上传。上传组件用Element Plus的el-upload,接口需要后端配合处理MultipartFile。我的做法是单独写一个fileController,文件存到服务器指定目录后返回访问URL,商品表单里存的只是URL字符串。注意配置上传大小限制,默认1MB真不够,必须要在SpringBoot的配置里调到10MB左右,否则上传稍微大一点的商品图就会报错。

4. 前后端联调、打包部署与常见“翻车”场景

4.1 开发环境的联调策略与接口调试技巧

联调阶段我见过最大的问题就是两边对接口文档的理解不一致,字段名对不上,类型对不上。解决这个问题没有捷径,必须保证接口文档先行。我建议后端用SpringDoc自动生成OpenAPI文档,启动项目后访问/swagger-ui.html就能实时看到所有接口的参数和响应示例。前端照着这个文档联调,比在微信里传Excel字段表可靠多了。

实际联调时还需要一个顺手的前端调试方案。我推荐装一个翻页的浏览器扩展或者直接用Chrome开发者工具手动修改请求头,来模拟登录态。因为商城大部分接口都需要token,没有登录态时调试一个商品列表接口都要先走完整个登录流程,效率很低。把token拿下来之后,在控制台里输入localStorage.setItem('token', 'xxx'),刷新页面即可带上token访问接口。

联调中遇到接口返回的时间和前端格式化不一致的问题也很常见。Java后端返回的LocalDateTime序列化后是一串带T的字符串,如果前端直接用new Date()转换在低版本浏览器上会显示Invalid Date。解决方法是前端统一用dayjs库解析,或者让后端配置全局的Jackson序列化格式。更省事的方法是把日期字段在后端格式化为字符串再返回,避免时区和格式化差异。

4.2 生产构建与服务器部署要点

开发完成后的打包部署是整个项目的临门一脚。前端执行npm run build会生成dist目录,后端用Maven的mvn clean package生成jar包。这里强烈建议后端打包时跳过测试,指定-DskipTests,因为测试环境连接不上数据库会导致打包失败。

部署架构我推荐最轻量的方案:一台云服务器,配好Nginx作为前端静态资源服务器和后端API反向代理。dist目录直接丢到/usr/share/nginx/html下,nginx配置里location /api/ { proxy_pass http://localhost:8080; },把API请求转发到SpringBoot的8080端口。这套方案无需Docker也能跑得很稳,不增加额外学习和排查成本。

直接用java -jar命令启动项目完全够用,但有个细节别忽略:SpringBoot默认端口不一定是你想要的,可以在启动命令上加--server.port=8080覆盖。生产环境还要注意设置JVM内存参数,比如java -jar -Xms256m -Xmx512m,防止服务器内存被撑爆。如果想要后端在服务器重启后自动拉起,systemd服务脚本是个很好的选择,比挂在nohup下面管理起来舒服得多。

当然,数据库也要跟着上服务器。本地开发用的MySQL版本和生产环境保持一致是最稳妥的做法,之后通过mysqldump导出SQL文件,再到服务器导入即可。这里最大的坑是字符集问题,导入时必须在SQL文件头部或者导入命令里显式指定utf8mb4,否则中文商品名会直接变成乱码。

4.3 高频问题速查表

问题现象根本原因解决办法
前端请求报CORS错误后端未配置跨域在SpringBoot添加CorsFilter或Nginx转发
刷新前端页面出现404history路由未回退Nginx配置try_files $uri $uri/ /index.html
上传图片超过1MB被拒SpringBoot默认限制application.yml里设置spring.servlet.multipart.max-file-size
前端Cart列表数量错乱操作并发无防抖Lodash debounce或请求序列控制
部署后接口全部404后端路径未匹配检查Nginx的proxy_pass是否带上/api路径
登录后刷新状态丢失只用Pinia没持久化在localStorage中保存token和userInfo
商品库存显示负数未加事务或并发安全控制Service层加@Transactional并校验库存
JWT过期频繁跳登录token有效期设置太短增加refreshToken或延长accessToken时间

这张图表基本涵盖了商城项目开发中常见的80%的问题,遇到具体报错先对着排查,能避免走大量弯路。

5. 从零到一:提升项目完成度的加分细节

很多同学做毕设项目时功能能跑,但答辩时一看就是“练习作品”。差别往往不在功能完整性,而在细节完成度。这里我想分享几个立竿见影的小改动,成本很低,但效果非常明显。

第一个是全局缺省页面。给路由加一个404通配页面,访问不存在的地址时显示一个友好的提示页。别小看这个细节,你演示时误操作一个旧链接,看到的是“页面不存在”而不是浏览器默认的英文错误页,观感完全不同。

第二个是后端全局异常处理。用@RestControllerAdvice统一捕获异常,让前端不管遇到什么错误都能拿到格式统一的JSON错误信息,而不是SpringBoot默认的一堆堆栈信息。交到前端手里的错误提示也写得友好一点,比如“商品已下架”“库存不足”而不是“系统异常”,这对用户体验的影响很大。

第三个是数据可视化。管理端的统计页面给一个用ECharts实现的“近七天订单量”柱状图和“商品分类销售占比”饼图,足够让评审老师眼前一亮。后端只需提供两个统计接口,返回聚合数据,前端ECharts几分钟就能接好。

第四个是Redis的应用场景。如果项目技术栈里想加Redis,与其硬塞购物车,不如加一个首页轮播图缓存。管理员修改轮播图后清缓存,用户访问首页时优先读Redis,这样Redis在项目里的定位才合理,论文里也有话可讲。

6. 写在最后的话

做完这套篮球主题商城平台,我自己最大的体会是,全栈项目的难点从来不是某个单独的技术点,而是每个环节咬合在一起的时候产生的各种问题。数据库设计时多想想冗余快照,写接口时记住统一返回格式,前端联调时把接口文档当契约,部署时提前想好history路由和跨域转发,这些点任何一环断掉都要花大量时间去排查。

如果按这篇文章的路径走下来,我敢说你得到的不仅仅是一个能跑的毕设项目,更是一整套前后端分离开发的方法论。以后再遇到类似的管理系统、内容平台甚至真实商业项目,你在架构选型、数据建模、接口设计上都会有比较清晰的判断,因为你已经踩过一遍这些坑了。

最后再分享一个我个人的小习惯:代码写完之后,花半天时间从头走一遍完整业务流程,注册一个用户,从逛商品到收藏、加购、下单、支付、收货,再切管理员账号处理订单、发货、上架新商品。这一遍走完,你就能确切地知道哪些页面的按钮逻辑有问题、哪些接口响应太慢、哪些交互手感别扭。改完这些问题之后,系统才真正到了能演示、能答辩、能拿出手的状态。祝你顺利做出自己的篮球商城。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/18 10:23:26

8个实用MCP服务器实战,让AI编程助手告别复制粘贴

最近和几个做开发的朋友聊天,发现一个特别普遍的现象:大家每天都在“复制粘贴”。从浏览器里复制一段报错,从文档里贴一段接口说明,再手动把零散信息喂给AI工具,来来回回折腾大半天,真正写代码的时间反而没…

作者头像 李华
网站建设 2026/10/17 10:27:33

电脑原生闹钟高效配置指南:穿透专注、绑定任务、留下痕迹

1. 为什么系统自带闹钟反而最常被忽略?“电脑怎么设置闹钟提醒?”——这个问题每天在各类办公群、学生论坛和远程协作频道里出现几十次。但有意思的是,绝大多数人问完就去搜第三方软件,却从没点开过自己Windows或macOS系统里那个图…

作者头像 李华
网站建设 2026/10/14 4:40:15

AI终端助手三剑客:Claude Code、Codex CLI、Gemini CLI安装配置与选型指南

1. 为什么要在电脑上折腾 AI 终端助手1.1 从“网页聊天”到“终端里干活”的转变很多人第一次接触大模型,都是在浏览器里开一个对话框,问一句答一句。这种方式适合查资料、写文案,但一旦落到真实的开发场景里,问题就来了&#xff…

作者头像 李华
网站建设 2026/10/14 13:23:17

WinRAR进阶实用指南:压缩格式、命令行批处理与数据修复

电脑上总会有那么一两个“装了很久但只会点右键解压”的软件,WinRAR大概就是其中最有代表性的一个。大多数人日常只做两件事:双击压缩包、点“解压到当前文件夹”。但等你真的开始处理大量文件、需要跨设备备份、或者把成套资源发给别人时就会发现&#…

作者头像 李华
网站建设 2026/10/13 22:42:31

手撕BP神经网络:NumPy从零实现可调试预测模型

简介:本资源是一份面向机器学习初学者与Python实践者的BP神经网络基础实现教程,聚焦监督学习中的函数拟合与预测任务,适用于时间序列预测、分类及回归等典型场景。压缩包仅含1个核心文件——BP神经网络.py,基于NumPy纯手写实现&am…

作者头像 李华
网站建设 2026/10/15 1:18:14

多Agent系统中技能复用与治理的工程实践

1. 为什么一个 skill 要存三份?——多 agent 场景下被忽视的“技能所有权”困境你写好了一个能调用天气 API 并结构化返回结果的 Python 函数,起名叫get_weather_by_city。它逻辑清晰、有单元测试、文档完整,你把它放进项目utils/skills/目录…

作者头像 李华