news 2026/9/26 6:29:19

SpringBoot+Vue足球青训俱乐部管理后台系统设计与实现

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
SpringBoot+Vue足球青训俱乐部管理后台系统设计与实现

搞过不少管理后台之后,我越来越觉得,真正考验开发者的不是框架用得有多花哨,而是能不能把一个真实场景里的需求理顺。这套基于SpringBoot+Vue的足球青训俱乐部管理后台,就是一个非常典型的实际项目:要管球员档案、训练计划、课程出勤、比赛安排,还要兼容管理员、教练、家长/学员三种角色的操作习惯。技术栈是Java+MySQL+MyBatis做后端,Vue做前端,这是JavaWeb课程设计和毕业设计里最常见的组合,但真要做到能跑、能演示、能写进简历的完整系统,需要抠的细节远比表面上多。下面我从需求拆解到数据库设计,再到前后端实现和部署避坑,完整过一遍这个项目。

1. 项目到底在做什么:足球青训俱乐部管理后台的真实需求

1.1 一个青训俱乐部的日常管理痛点

很多没接触过青训行业的人,容易把这类系统想象成“一个球员信息表加一个课程表”。但实际上,足球青训俱乐部的日常运营比大多数人想的更琐碎。一个普通的青训俱乐部里,往往有多个年龄段梯队,7-8岁启蒙班、10-12岁提高班、13-15岁精英队,每支梯队又有各自的教练、训练场地、训练频次,再加上不定期的内部对抗赛、外出交流赛和球员评估,信息维度非常多。

我接触过的青训机构,早期基本靠Excel加微信群在管理。球员报名信息在一个表里,训练出勤在另一个表里,教练排课计划散落在聊天记录里,家长询问孩子最近训练表现时,工作人员要翻好几份表格才能凑出一段反馈。更麻烦的是球员合同状态、体检记录、保险有效期这类关键信息,一旦过期没人提醒,真到了比赛报名的时候才发现材料不齐,全队跟着手忙脚乱。

所以这个管理后台的核心诉求不是“做一个漂亮的网页”,而是要解决几个具体问题:球员全生命周期管理,从报名试训到入队建档,再到后续续费、停训、退队;训练计划的可视化排布,谁在什么时候在哪个场地训练,一目了然;出勤和评估数据能够被记录下来,作为教练调整训练方案的依据;以及最实际的,让三类角色在各自权限范围里完成自己的工作,不需要互相传Excel。把这些需求梳理清楚,再回头看技术设计,思路就开阔得多。

1.2 系统用户角色与核心业务流程

管理后台里的角色,并不是拍脑袋定的,而是跟着业务流转自然产生的。在这个项目里,我设计了三种角色:管理员、教练、家长/学员。

管理员负责系统级配置,比如创建教练账号、管理梯队信息、设置训练场地、查看全俱乐部的运营数据。教练是使用频率最高的角色,主要操作有:给自己的梯队创建训练计划、录入课程安排、批量登记出勤、填写球员评估报告、上传训练视频和比赛视频。家长/学员角色相对轻量,登录后可以查看课程表、出勤记录、教练评语和比赛安排,也可以在线提交请假申请。

角色的背后,是一条完整的业务链路:家长线上提交报名信息,管理员审核后安排试训;试训通过,管理员为球员创建档案并分配梯队;教练在系统中创建训练计划和课程日程;每节课结束后,教练登记出勤并填写表现备注;系统根据出勤率自动生成统计;定期组织比赛时,管理员创建赛事,教练选择参赛球员并上传比赛视频。每个环节产生的数据,都会被下游模块复用。这也是为什么在功能模块划分时,一定要把球员档案、训练计划、课程安排、考勤管理、赛事管理、视频管理、系统管理分开建模,而不是把所有字段塞进一张大表。清晰的角色和流程,既方便前端做菜单权限控制,也方便后端写接口时对齐业务语义。

2. 技术选型:为什么是SpringBoot+Vue+MySQL+MyBatis

2.1 前后端分离的选型逻辑

SpringBoot+Vue这套组合,在Java生态里早就不算新鲜,但它依然是中小型管理后台最稳妥的选择之一。原因很简单:SpringBoot把项目配置、内嵌Tomcat、依赖管理全部简化了,我只需要一个main方法就能把后端跑起来,不需要像传统SSH项目那样折腾一堆XML配置。这对课程设计、毕设或者个人项目来说,能省下大量处理环境的时间,把精力放到业务逻辑上。

前端选Vue,是因为Vue的响应式数据绑定和组件化开发,非常适合管理后台这种“页面多、表单多、表格多”的场景。配合Vue Router做路由跳转、Vuex或Pinia做状态管理、Element UI提供现成组件,两三天就能搭出一套完整的后台界面框架。有人说为什么不选前后端不分离的模板渲染,对于这个需求,前后端分离的好处非常明显:后端只需要提供JSON接口,前端独立部署,后期无论是加小程序端还是给家长做一个单独的H5页面,后端接口都能直接复用。如果你准备拿这个项目找工作,前后端分离的写法也更贴近企业里真实项目的协作模式。

MySQL在这套方案里扮演的是最稳的数据底座。一开始用MySQL而不是直接用H2或SQLite,看中的是它在数据一致性、事务支持和并发处理上的能力。青训俱乐部这个业务虽然并发量不大,但涉及到出勤登记、续费记录这类不能丢的数据,事务必须可靠。MySQL的安装和环境变量配置这块,网上教程很全,我这里只提醒一句:本机开发建议安装5.7或8.0,字符集选utf8mb4,排序规则选utf8mb4_general_ci,否则存不了emoji和冷门字符。

2.2 MyBatis分页插件与后台列表场景

之所以选MyBatis而不是Spring Data JPA,坦白说不是因为它比JPA功能更强,而是因为它把SQL控制权完全还给开发者。管理后台里有很多多表关联查询,比如查询球员列表时还要带出所在梯队名称、教练姓名、最近出勤次数、合同到期状态。这种查询用JPA写起来关联关系绕来绕去,还不如直接在XML里写一条清晰的SQL来得直观。MyBatis的#{}预编译机制,也天然挡住了大部分SQL注入风险。

列表页离不开分页,而MyBatis分页插件PageHelper是使用频率最高的方案。它的用法非常简单:在查询前调用PageHelper.startPage(pageNum, pageSize),然后紧跟一条查询语句,PageHelper会自动拦截并生成带LIMIT的SQL,再返回一个Page对象,里面封装了总数和当前页数据。实际项目中我还经常这样用:

PageHelper.startPage(pageNum, pageSize); List<PlayerVO> players = playerMapper.selectPlayerList(query); PageInfo<PlayerVO> pageInfo = new PageInfo<>(players); // 返回给前端的数据:total、list、pageNum、pageSize

注意startPage之后必须紧跟真正要分页的那条查询,中间不能夹杂其他查询语句,也不能在foreach循环里调用,否则分页会拦截到错误的SQL。还有一个容易忽略的性能点:PageHelper默认会在分页时自动执行count查询,如果列表主查询关联了五六张表,这个count查询会跟着变慢。我的做法是,对于复杂的查询,在SQL里单独写一个count查询,用PageHelper的countSql参数指定,避免每次都要全表关联统计。

3. 数据库设计与后端核心实现

3.1 球员档案、训练计划、课程安排的核心建表思路

数据库设计是整个系统的地基,这一点怎么强调都不过分。项目里我最核心的几张表是这样的。

球员表(player)不能只存姓名、年龄、性别这些基础信息,还要把业务状态放进去。我的设计里包含了:球员编号、姓名、出生日期、性别、身高、体重、场上位置、梯队ID、教练ID、合同开始日期、合同结束日期、体检有效期、家长姓名、家长联系电话、注册状态、备注等字段。场上位置和注册状态这种有限取值字段,我用tinyint存,用1/2/3映射到前端字典,而不是直接存中文,这样后续如果要统计数据,处理起来很灵活。

训练计划表和课程表是分开的。训练计划表(training_plan)描述的是一个周期性的目标,比如“U12提高班9月第一周训练主题是传接球配合”,字段包括计划名称、开始日期、结束日期、针对梯队、训练目标、训练内容。课程表(course)则是具体某一次训练的安排,包含课程的开始时间、结束时间、场地、教练、关联的训练计划ID、状态。这种设计的好处是,一个计划可以对应多节课程,教练排课时只需要先制定计划,再批量生成课程日程,不用一节课一节课重复录入。

考勤表和评估表也是我特别看重的地方。考勤表(attendance)记录每个球员在某节课的出勤状态,字段包含课程ID、球员ID、状态(正常出勤、迟到、请假、缺勤)、备注。评估表记录教练对球员在特定时间段的综合评价,字段包含球员ID、评估周期、技术评分、体能评分、态度评分、教练评语。这两张表都是高频写入、低频修改,按照球员ID和课程ID建联合索引,查询效率非常高。回到建表的基本原则:能用关联尽量关联,能用字典值尽量用字典值,千万不要把所有内容塞进一个字段里用逗号分隔,那是给未来的自己埋坑。

3.2 SpringBoot后端接口设计与JWT登录鉴权

后端接口我统一走RESTful风格,以/api开头,按资源划分。比如球员管理模块有:GET /api/player/page,POST /api/player,PUT /api/player/{id},DELETE /api/player/{id}。每个接口返回统一的结构,我用一个Result类封装code、message、data三个字段,前端Axios拦截器根据code做统一处理,这样登录过期、参数校验失败、服务器异常,前端只需要在拦截器里写一遍逻辑。

登录鉴权用的是JWT,而不是简单的Session。为什么?因为Vue前端和后端分离部署后,请求不一定会落在同一台服务器上,Session需要额外维护共享存储,而JWT把用户身份信息加密在token里,后端只需要用拦截器校验token的合法性,不需要保存会话状态。登录成功时,后端生成一个带过期时间的token,返回给前端,前端存到localStorage或者Pinia里,之后每次请求在header里带上Authorization: Bearer 。后端写一个拦截器,对需要登录的接口统一解析token,解析失败直接返回401。

注意JWT的secret不要硬编码在业务代码里,也不要太短。我在项目里把它放在application.yml里,用HS256算法,secret长度至少32个字符。token里只放必要的信息,比如用户ID、角色编码,不要把密码、手机号这种敏感信息塞进去,否则一旦token泄露,风险很大。角色权限控制我采用最简单的方式:拦截器解析出角色后,和接口上自定义的@RequireRole注解做比对。如果项目里角色数量增长,后期可以换成Spring Security或者Sa-Token,但目前这套足够用。

3.3 文件上传、XSS过滤与SQL注入防护

管理后台不可避免要处理上传,球员头像、教练证照片、训练视频、比赛录像,都是真实的业务需求。SpringBoot里做文件上传,核心就是MultipartFile,设置上传路径后,用UUID重命名文件,再保存到本地磁盘或对象存储。这里有个新手常踩的坑:application.yml里默认的上传大小限制是1MB,视频文件根本传不上去。需要在配置里显式调大:

spring: servlet: multipart: max-file-size: 200MB max-request-size: 210MB

文件类型也要做校验,不能只靠前端。我的后端在上传时检查扩展名和Content-Type,图片限制为jpg/png/webp,视频限制为mp4/m3u8/ts,超过大小直接拒绝。还要把文件名改成服务器生成的UUID,防止路径穿越,这是最基础的文件上传安全要求。

XSS过滤是很多人容易忽略的点。热搜词里有一个非常现实的场景:SpringBoot项目全局过滤器处理上传PDF文件时的XSS攻击。这里说清楚我的处理思路:普通表单提交的文本字段,后端写一个全局的XSS过滤器,对请求里的常见危险字符做转义处理。但上传PDF这类文件时,不能简单对文件内容做字符串替换,因为PDF是二进制格式,硬改会破坏文件结构。正确的做法是,上传前先校验文件名,禁止html、svg这种容易携带脚本的格式;上传后存储时使用UUID重命名;前端预览时使用pdf.js一类的渲染库,禁止用户直接通过地址栏打开原始文件的路径。对HTML文件和PDF等富文档,单纯过滤字符是不够的,隔离存储加管控访问,才是更有效的防御手段。

至于SQL注入,MyBatis已经帮我解决了绝大部分问题。只要是#{}取值,MyBatis底层会使用预编译的PreparedStatement,参数不会再被拼接到SQL里。真正需要小心的是${}表达式,它需要直接拼接字段名或表名时才会用到,比如动态排序字段。我的原则是:所有用户输入,一律用#{};非用${}不可的场景,先用白名单校验字段名,绝不允许直接透传。

4. 前端Vue实现与页面落地

4.1 后台管理布局与动态路由

前端我用Vue 2 + Element UI来做,如果愿意尝鲜,Vue 3 + Element Plus也一样。项目初期用Vue CLI创建工程,然后安装Vue Router和Axios,配置反向代理。安装依赖时容易遇到版本冲突,我的经验是先把package.json里关键的依赖版本固定住,再执行npm install,不要全部用latest,否则Vue 2项目里不小心装进Vue 3的组件库,控制台会报一堆莫名其妙的错。

后台布局采用常见的侧边栏加顶栏结构。侧边菜单根据用户角色动态生成,管理员看到全部菜单,教练看到训练计划、课程、考勤、视频管理,家长/学员只能看到我的课程、我的出勤、我的评估。实现方式很简单:后端在登录接口里返回用户角色和权限码,前端根据权限码过滤路由表,再动态注册到Vue Router里。这里要特别注意,动态路由不能把所有页面都写死在路由表里让用户自己输入URL访问,否则只是菜单藏起来,权限等于没做。真正的控制必须依赖后端接口的鉴权,前端控制体验,后端控制安全。

Axios拦截器是我每次都会重点检查的部分。请求拦截器里统一添加token,响应拦截器里判断HTTP状态码和业务code。如果token过期,清除本地登录状态并跳回登录页,同时用Element UI的Message组件给用户一个友好的过期提示。还有一点,本地开发时要配置好跨域代理,在vue.config.js里设置devServer.proxy,把/api转发到后端地址,这样前端开发时不至于被跨域问题卡住。

4.2 赛事视频与训练视频的播放处理(m3u8流媒体)

视频功能是这个项目里比较出彩的亮点。教练上传比赛录像后,球员和家长希望能在线观看,但如果直接把一整段mp4塞给前端,视频文件大,加载慢,而且要等很久才能拖动播放。所以我在系统里引入了m3u8流媒体方案。

m3u8其实是一个索引文件,里面记录了一串分片文件的地址,播放器按顺序请求这些分片,实现边下载边播放。它的好处很直接:首屏加载快,拖动进度条时只需要加载对应分片;服务端转码成HLS流后,网络差的环境也能流畅播放;而且分片文件在服务器上天然分布存储,访问压力被分散。前端我用vue-video-player封装,底层基于video.js,再配合hls.js来兼容不支持原生HLS的浏览器。

核心播放代码大致是这样:

<template> <video-player v-if="playUrl" ref="videoPlayer" :options="playerOptions" playsinline /> </template> <script> export default { data() { return { playerOptions: { sources: [{ type: 'application/x-mpegURL', src: this.playUrl // 形如: /api/video/stream/123.m3u8 }] } } } } </script>

踩过的坑提几个。第一,后端返回m3u8和ts分片时,Content-Type必须正确,m3u8对应application/vnd.apple.mpegurl或application/x-mpegURL,ts对应video/mp2t,否则浏览器会直接下载而不是播放。第二,播放器请求分片时会自动带上Referer,如果后端做了防盗链,要记得把视频域名加进白名单。第三,跨域问题。前端页面在8080端口,视频接口在9090端口,必须在SpringBoot里配好CORS允许跨域,或者在网关层统一处理。第四,如果能提前把整场视频切成几十秒一个的ts分片,播放体验会好很多,这个用FFmpeg就能完成:

ffmpeg -i match.mp4 -c:v libx264 -c:a aac -hls_time 10 -hls_list_size 0 -f hls match.m3u8

我在本地用这套方案实测,一段1GB左右的完整比赛视频,切成ts分片后,手机4G网络下拖动进度条基本没有明显卡顿,比直接播放mkv或mp4体验好太多。

5. 完整打包部署流程与避坑实录

5.1 从源码到可运行jar包

整个项目开发完成后,打包部署是不可跳过的一环。后端打包很简单,在项目根目录执行mvn clean package -DskipTests,SpringBoot会把内嵌Tomcat一起打进jar包。需要注意,如果用了外部配置文件,最好不要直接改jar包里的application.yml,而是在jar包同目录放一个application.yml,SpringBoot会优先读取外部配置,这样换环境时不用重新打包。

前端打包分两种部署方式。第一种是独立部署,执行npm run build,dist目录里的静态文件放到Nginx里,同时配置Nginx把/api反向代理到后端jar包地址,这种方案适合正式上线。第二种是合并部署,把前端dist目录拷到SpringBoot的src/main/resources/static目录下,后端自己托管静态资源,这样只启动一个java -jar就能跑通整个系统,特别适合课程设计答辩演示。我建议先做第二种,演示环境最省事;等真要考虑多用户使用,再切Nginx独立部署。

MySQL初始化脚本我一般在数据库工具里执行,按顺序创建库、建表、插入初始管理员账号。第一次启动项目后,用管理员账号登录,再通过界面创建教练和家长账号。初始化脚本里有一个特别实用的操作:给初始管理员设置一个明显的初始密码,并在系统里提示首次登录必须修改密码。这个小功能不复杂,但能避免演示现场被人发现默认密码,安全感和专业感都能拉满。

5.2 我实测踩过的坑:分页插件失效、时区报错、跨域

打包部署和本地开发之间会发生很多神奇的问题,我把自己实测踩过的坑整理成三条。

第一个坑是PageHelper分页插件失效。症状是点击第二页时,返回的还是第一页的数据,而且SQL日志里没有出现LIMIT语句。查下来发现,原因多半是startPage方法后面的第一条SQL不是目标查询,而是别的查询,比如在PageHelper.startPage之后又执行了某条selectUser操作,分页拦截器会错误地作用于这条SQL。还有一种情况是分页方法被事务或AOP代理包裹,PageHelper拿到的SqlSource不是预期的那个。解决办法很简单:把startPage移到目标查询的紧前面,且保证中间没有其他数据库操作。

第二个坑是MySQL时区导致的连接失败。本地开发用的MySQL 5.7没这个问题,但换到MySQL 8.0之后,启动报错The server time zone value is unrecognized。原因是MySQL 8.0的时区默认值改成了UTC,而JDBC驱动需要明确时区。解决办法有两种:连接URL加上serverTimezone=Asia/Shanghai,或者在MySQL里执行set global time_zone='+8:00',并修改my.cnf让配置持久化。我推荐在数据源的JDBC连接串里直接配置,因为跟随代码走,换环境不会忘。

第三个坑是跨域。前端在8080,后端在9090,登录接口能通,但带token的查询接口一直报CORS错误。排查后发现,SpringBoot的CORS配置只对Controller层生效,对于被拦截器拦下来的请求,如果拦截器在CORS处理之前直接返回了401,浏览器会因为没有收到跨域响应头而报错。解决方式是在拦截器中先对OPTIONS预检请求放行,再正常校验token,或者在Spring Security这类框架里配置跨域过滤器保证它在鉴权过滤器之前执行。这个坑非常隐蔽,花了我一个下午才定位到。

6. 常见问题与排查速查表

6.1 登录态丢失、端口占用、MySQL版本兼容

做管理后台,维护阶段最常遇到的是这三类问题。

登录态丢失,通常表现为刷新页面后跳回登录页。原因大概率是前端把token存在了内存变量里,或者Pinia/Vuex的store没有做持久化。刷新后内存变量重置,自然就认为未登录。解决办法是使用localStorage或sessionStorage保存token,读取时优先从本地存储恢复。另一个可能是后端JWT过期时间太短,比如我见过有人把过期时间设置为5分钟,测试过程中超时太频繁。一般项目里设置2小时比较合适,配合续签机制或者前端定时刷新token都可以。

端口占用是后端启动时的经典问题。SpringBoot默认8080,如果被占用,启动脚本会直接抛Port already in use。最简单的处理是排查占用进程并杀掉,Windows下用netstat -ano | findstr 8080,Linux下用lsof -i:8080,然后把进程kill掉。或者直接换一个端口,在application.yml里修改server.port,前端代理地址同步改一下就行。

MySQL版本兼容问题主要集中在驱动上。5.7时代用的是com.mysql.jdbc.Driver,8.0之后需要用com.mysql.cj.jdbc.Driver,pom.xml里的mysql-connector-java版本也要升到8.x,同时记得处理时区。如果你的代码是在MySQL 5.7上写的,部署到8.0环境后突然连不上,先检查这两处,大部分问题都是这个原因。

6.2 MyBatis XML高亮与SQL调试技巧

MyBatis的SQL写在XML文件里,调试时最大的痛苦是不知道实际执行的SQL长什么样。我的做法是在application.yml里配置SQL日志打印,把SQL语句和参数都输出到控制台:

mybatis: configuration: log-impl: org.apache.ibatis.logging.stdout.StdOutImpl logging: level: com.example.club.mapper: debug

这样每执行一条Mapper方法,控制台就会出现Preparing和Parameters两行日志。Preparing后面的SQL是预编译语句,Parameters是实际传入的参数值。看到LIMIT被正确拼接,就能确认分页插件在工作;看到参数被转成?而不是直接拼进SQL,也能直观理解预编译防注入的原理。

XML文件还有几个高发问题。第一个是XML文件放错位置,导致Mapper接口找不到绑定SQL,启动时直接报BindingException。正确做法是把Mapper接口和XML文件放在同名包下,或者在mybatis.mapper-locations里明确指定classpath路径。第二个是IDEA默认不会把src/main/java目录下的XML文件编译到classes目录,如果坚持把XML放Java包里,必须在pom.xml里配置resources,把xml后缀加进去。第三个是简单查询尽量用注解,复杂多表查询再写XML,别一个项目里全是几百行的XML,维护成本很高。

6.3 项目扩展建议:数据大屏、Excel导入导出

如果这个项目打算继续扩展,我建议按业务价值从高到低排优先级。

第一个值得做的是教练看板和数据大屏。把球员出勤率、训练评估平均分、各梯队人数、课程完成率这些数据汇总成可视化大屏,用ECharts展示在管理后台首页。管理员打开系统第一眼就知道俱乐部当前运营情况,这个功能对答辩和演示非常有冲击力。实现上只需要新增几个统计接口,写GROUP BY查询,前端用折线图、柱状图、饼图分别展示,工作量不大,效果却很直观。

第二个值得做的是Excel批量导入导出。青训俱乐部的历史数据基本都存在Excel里,管理员不可能一条条手工录入。使用EasyExcel或POI,可以做一个球员信息批量导入模板,同时在球员列表页提供按当前筛选条件导出Excel的功能。热搜词里有人问Java POI Word能不能生成图表,答案是能,但复杂图表建议直接用ECharts导出图片再插入Word,比纯POI画图表省太多事。导入导出功能看似不起眼,但对实际用户来说,是“能用”和“好用”的分水岭。

第三个可以考虑的是消息通知。家长关心的出勤异常、课程临时调整、比赛报名提醒,如果系统能通过邮件或短信推送,会大大减少教练和管理员的沟通成本。实现上不用自己造轮子,集成一个消息推送服务或者配置简单邮件工具就行。做之前先想清楚通知频率,别一天给家长发十条提醒,很容易被当成垃圾信息。

说到最后,我最大的体会是:这类管理系统真正难的不是某个框架用法,而是“把业务想清楚,再把技术落到每一个环节”。从球员档案到训练计划,从JWT鉴权到m3u8视频播放,每一块单独拆开都不算高深,但能串成一套完整、可运行、有真实业务价值的系统,靠的就是在细节上多较真。如果你正在做类似的JavaWeb项目,建议先把数据库表理清楚,再动手写代码,因为表结构一变,后端接口和前端页面都要跟着动,返工成本太高。照着这个思路走,这个项目不但能顺利跑通,还能成为你在面试时讲得最有底气的作品。

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

中小型医院管理系统拆解:SSM与Django双技术栈实践

中小型医院管理系统这个标题&#xff0c;乍一看像是毕业设计仓库里最常见的那类“管理系统全家桶”&#xff0c;但真正把这套系统从需求分析跑到上线调试&#xff0c;你会发现它其实是一条完整的医疗业务链路&#xff0c;覆盖了挂号、门诊、药房、住院、结算这些核心场景。这篇…

作者头像 李华
网站建设 2026/9/26 6:28:54

数据分析新视角,平衡样本,提升准确度

在数据分析领域,样本不均衡问题是常见而棘手的挑战之一,尤其在疾病诊断、信用卡欺诈检测以及客户流失预测等任务中,这一问题更加突出。由于大多数样本属于较为常见的类别,少数类(如流失客户)的样本难以被模型充分识别,从而影响模型的预测能力。 本文将通过一个在线零售…

作者头像 李华
网站建设 2026/9/26 6:26:33

Agent记忆与知识库搭建:从文件到RAG与知识编译实战

做 Agent 开发的人&#xff0c;迟早会在同一堵墙上撞一次&#xff1a;模型的上下文窗口撑爆&#xff0c;追问不到历史信息&#xff0c;回答开始靠猜。我早期做过一个客服类 Agent&#xff0c;对话超过三轮之后&#xff0c;它就开始忘记用户刚说过的需求&#xff0c;更别提调用之…

作者头像 李华
网站建设 2026/9/26 6:26:30

aarch64架构服务器安装 Miniconda

Miniconda aarch64 安装笔记目标&#xff1a;ARM aarch64服务器&#xff0c;安装到指定目录下&#xff0c;以 ~/公共/vscode/test/miniconda为例&#xff0c;不修改.bashrc&#xff0c;不影响服务器其他环境1. 创建目录mkdir -p ~/公共/vscode/test/miniconda mkdir -p ~/公共/…

作者头像 李华