尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
从零开发学生社团管理系统:Spring Boot + Vue前后端分离实战
每年九月社团招新季社团联合会那边几乎都是最忙乱的时候。纸质报名表堆满半张桌子各社长轮番来问“我们社现在几个人”Excel汇总表传来传去版本早就对不上了活动签到的原始记录更是无从查起。当时我正在系统学习 Spring Boot 和 Vue索性决定以“学生社团管理系统”为题从零到一把它做成一个能真正给社团用起来的前后端分离项目。这篇文章会把我从需求梳理、数据库设计、后端接口开发、Vue前端实现到部署上线整个过程的细节都写出来重点放在那些不亲手做一遍很难发现的坑和取舍上适合正在做管理类系统项目、或者准备用这个题材做毕设和面试项目的同学参考。1. 招新季的痛点为什么我决定做一个学生社团管理系统1.1 线下登记表与Excel汇总带来的真实混乱你可能觉得“社团管理”听起来不就是 CRUD 吗有什么难的。但真实的校园场景比想象中混乱得多。招新时十多个社团一起摆摊每个社团一张纸质登记表新生填完姓名、学院、电话就走。几天后社长要把这些信息手动录入 Excel有人报了名又临时退出有人在两个社团都填了表需要反复电话确认。活动签到更是靠一张打印名单现场勾画事后想统计哪个成员参加了几次活动只能翻纸。这些问题的本质是信息没有结构化流程没有规范化每个社团都在用自己的方式管理。所以系统的核心目标不是把纸质表“电子化”而是把“成立社团、招新报名、成员审核、活动发布、签到统计、换届交接”这条完整链路搬到线上让每一步操作都留下可查的记录。1.2 用户的真实诉求三种角色各自的痛点我一开始犯的错误是想把所有功能都做上去后来才发现用户就三类每类的需求其实非常清晰角色主要痛点系统里最想要的功能社团管理员团委/社联看不到全校社团的实时情况审批靠线下提交材料社团成立审批、全校社团列表、活动备案、数据统计社团社长成员名册混乱、招新统计费时、活动通知靠群聊接龙成员管理、报名审核、活动发布、成员签到记录普通成员不知道有哪些社团、报名渠道不统一、活动信息来源零散浏览社团、在线报名、活动浏览、个人参与记录想清楚这三个角色以后功能边界就明确了。我砍掉了“社团财务管理”“社团评分排名”这些暂时需求不明确的功能只保留核心闭环项目周期也能控制在合理范围内。1.3 选型Spring Boot Vue而不是其他方案的原因技术选型我其实纠结过。一开始想过用传统的 JSP Servlet或者直接用 Thymeleaf 服务端渲染但社团系统里列表页、表单页、弹窗交互非常多服务端渲染写起来又重又别扭。后来定下来的方案是后端Spring Boot 2.7.x MyBatis-Plus MySQL 8.0JDK 用 8不追新前端Vue 3 Vite Element Plus Pinia Vue Router为什么 Spring Boot 不选 3.x因为当时市面上大量资料、踩坑帖、第三方 Demo 都是基于 2.x 的JDK 8 也是绝大多数高校机房和学生电脑的默认环境。做项目首先要保证能跑通、能部署、遇到问题查得到答案而不是追求版本号最新。Vue 3 的组合式 API 写业务逻辑确实比 Vue 2 的选项式 API 清晰配合 Vite 的冷启动体验开发效率高不少。2. 功能设计上我没有急着写代码先梳理业务流程和数据流2.1 围绕“社团”和“成员”两个核心实体的功能地图动第一行代码之前我花了整整两天画业务流程图和数据流。整个系统其实就是围绕两个核心实体展开的社团Club和成员User。所有功能都能挂到这两个实体上社团端创建社团、编辑社团信息、申请解散、社团成员名册成员端注册登录、浏览社团、申请加入、查看我的活动活动端发布活动、活动报名、现场签到、活动统计管理端审批社团、管理全部用户、查看全站数据把功能按实体归类之后数据库表结构和接口设计就自然出来了不会出现这里加一个字段、那里加一个接口的零散状态。2.2 招新报名到入团的完整状态流转社团成员不是“一键加入”那么简单。真实流程是新生提交申请 → 社长审核 → 通过后成为正式成员。中途还有退出社团、毕业离团、社长换届改任等操作。所以club_member 表里必须有一个 status 字段我定义为0待审核申请中1正式成员2已驳回3已退出4已毕业归档我见过不少管理系统把“退出”直接做成 delete 删除记录这会带来两个问题一是成员的历史活动记录会变得没根没据二是社团统计人数时说不清“去年有哪些人参加过”。保留状态字段、不物理删除代价只是多几个判断条件但后续做统计报表会感谢当初这个决定。2.3 活动全流程发布、报名、签到、学时统计活动的价值不只是“办一场活动”而是通过活动数据体现社团活跃度。我的活动模块流程是社长发布活动填写标题、时间、地点、简介、报名截止时间、人数上限成员浏览并报名报名后写入 activity_sign_up 表活动开始时签到通过签到码或社长手动确认活动结束后统计系统自动汇总报名人数、签到人数、参与成员名单这里最关键的决策是签到的结果要能回溯到具体成员。也就是说我能查“张三这个学期参加了哪些活动”也能查“这场活动实际到场的人有哪些”这两类查询是后续算学时、评优的基础。如果活动模块只记录一个总人数系统价值会大打折扣。2.4 权限边界三种角色的数据边界权限模型我采用了经典的 RBAC基于角色的访问控制。后端用角色标识做接口级拦截前端根据角色渲染菜单。权限划分大致如下功能模块社团管理员社长普通成员审批社团成立/解散✅权限不足权限不足管理全校社团列表✅仅查看仅查看管理本社成员部分操作✅不可见发布本社活动不可操作✅不可操作报名参加活动可报名可报名✅有一个很容易忽略的细节社长也是普通用户他既需要“管理本社团成员”的管理员能力也需要“报名其他社团活动”的成员能力。所以角色和用户是多对多关系登录后可以根据场景灵活判断操作权限而不是简单地把用户锁定为单一角色。3. 数据库设计几张核心表和几个容易忽略的设计决策3.1 表结构概览和核心关系说明我最终设计的核心表如下表名用途关键字段sys_user用户表id, username, password, nickname, role_idsys_role角色表id, role_code, role_nameclub社团表id, name, description, logo, president_id, member_count, statusclub_member社团成员关系表id, club_id, user_id, status, join_timeactivity活动表id, club_id, title, location, start_time, max_people, statusactivity_sign_up活动报名表id, activity_id, user_id, sign_up_timeactivity_sign_in活动签到表id, activity_id, user_id, sign_in_timeannouncement公告表id, title, content, publisher_id, publish_timesys_user 和 sys_role 是简单的用户角色关系club 和 club_member 是多对多关系activity 与 sign_up、sign_in 是一对多关系。这套结构不复杂但是能支撑上面说的全部业务流程。3.2 为什么活动签到表单独建而不是在活动表里加字段我最早的设计里只有一张 activity 表里面放一个 sign_in_count 字段记录到场人数。后来发现完全不够用。我需要知道“谁来了”而不是“来了几个人”。于是拆出一张 activity_sign_in 表每条记录代表“某个用户在某场活动中签到”。这样做的直接收益是能查单个成员的历史签到记录SELECT * FROM activity_sign_in WHERE user_id ?能查一场活动的到场名单SELECT * FROM activity_sign_in WHERE activity_id ?能统计某一社团所有活动的签到总人次作为活跃度数据在 MySQL 里一张表多存几行记录的成本极低但对业务查询的灵活性提升是决定性的。报名表同理也要单独建。3.3 统计字段与冗余设计用空间换查询效率做后台管理系统容易被忽略的一点是“首页展示要快”。如果社团列表页要显示每个社团的成员数量最笨的办法是每行都去 count 一下 club_member 表社团一多SQL 查询数量就爆炸了。我的做法是在 club 表里加member_count 冗余字段成员加入、退出、解散时用事务同步更新这个数字。这样首页列表只需要查 club 一张表不需要子查询。activity 表也加了 sign_up_count 字段报名时加一取消报名时减一。冗余字段的代价是要小心维护。只要所有修改成员关系的地方都包在事务里并且统一走 Service 层方法不直接 SQL 改表一致性就不会出问题。这也是“Java 怎么保证数据一致性”这类面试题的实战答案不是所有场景都需要分布式锁单体应用的业务事务 唯一约束 统一数据入口就能解决 90% 的一致性问题。4. 后端 Spring Boot 实现细节从鉴权到文件上传的取舍4.1 RESTful 接口约定和统一响应结构接口风格我统一遵循 RESTful资源用复数命名。比如GET /api/club获取社团列表POST /api/club创建社团GET /api/club/{id}/members获取某社团成员POST /api/activity/{id}/sign-up报名活动所有接口返回统一的 Result 结构public class ResultT { private Integer code; // 200成功400业务错误401未登录403无权限 private String message; private T data; public static T ResultT success(T data) { ... } public static T ResultT error(Integer code, String message) { ... } }配合一个全局异常处理器RestControllerAdvice业务代码里只需要正常返回 data错误情况直接抛BusinessException由统一拦截器转成 Result。这样 Controller 层代码非常干净前端 Axios 拦截器也能统一处理业务错误码不用每个接口单独写错误分支。4.2 JWT 鉴权与当前用户上下文传递前后端分离项目我选了 JWT 而不是 Session。原因很简单后端接口要被 Vue 页面调用后续可能还要给小程序做数据接口无状态 token 的扩展性更好。登录成功之后后端签发一个包含 userId 和 role 的 token前端存在本地每次请求通过 Authorization 请求头带过来。后端用拦截器校验 token校验通过后把 userId 放到 ThreadLocal 里这样整个请求链路中任何地方都能直接拿到当前用户不用反复从参数里传public class UserContext { private static final ThreadLocalLoginUser HOLDER new ThreadLocal(); public static void set(LoginUser user) { HOLDER.set(user); } public static LoginUser get() { return HOLDER.get(); } public static void clear() { HOLDER.remove(); } }这里有个细节拦截器放行后一定要在 finally 里调用 UserContext.clear()否则高并发下线程池复用线程会导致用户信息串号。这个坑我当时排查了很久表现就是“A 用户偶尔看到 B 用户的数据”非常隐蔽。4.3 文件上传本地存储和访问映射的配置社团需要上传 Logo活动可能需要上传宣传图。文件上传的坑不在于上传本身而在于“上传成功后怎么访问”。后端把文件存到服务器的某个目录前端要通过 URL 访问这个文件就涉及到静态资源映射。我的配置思路是上传目录放在项目外部比如/home/upload/不放在项目内部避免重新部署时文件被覆盖。然后在 Spring Boot 里加一个 WebMvc 配置把/upload/**路径映射到本地目录Configuration public class WebMvcConfig implements WebMvcConfigurer { Override public void addResourceHandlers(ResourceHandlerRegistry registry) { registry.addResourceHandler(/upload/**) .addResourceLocations(file:/home/upload/); } }同时 application.yml 里要调整上传大小限制spring: servlet: multipart: max-file-size: 5MB max-request-size: 10MB文件存储路径不要硬编码在代码里用一个配置项统一管理打包部署时只改配置不动代码。文件名也不能直接用用户上传的原始文件名我用UUID 原始后缀重命名避免中文文件名和特殊字符导致访问不了。4.4 事务与数据一致性哪些场景真的需要事务事务不是每个方法都加而是加在这些场景一次操作涉及两张以上表的数据变更。我项目里最典型的两个创建社团插入 club 表 给创建者设置社长角色插入 club_member报名活动插入 activity_sign_up 活动的 sign_up_count 加 1Transactional(rollbackFor Exception.class) public void createClub(CreateClubRequest req) { Club club new Club(); // ... 设置字段 clubMapper.insert(club); ClubMember president new ClubMember(); president.setClubId(club.getId()); president.setUserId(req.getPresidentId()); president.setStatus(ClubMemberStatus.APPROVED); clubMemberMapper.insert(president); }这里有个极其容易踩的坑Transactional 默认只对运行时异常回滚遇到受检异常Exception不会回滚。如果你不写rollbackFor Exception.classinsert 第二张表如果抛了一个受检异常第一张表的数据已经提交了就会造成数据不一致。写代码时把这个参数加上是成本最低的保险。5. Vue 前端的动态路由、权限控制与组件复用5.1 Vue3 Vite Element Plus 的选择理由前端我定了 Vue 3 Vite Element Plus理由有三个Vite 的开发服务器冷启动比我之前用 Vue CLI 快一个量级组合式 API 让列表页、表单页的代码逻辑更容易组织Element Plus 的表格、表单、弹窗组件和后台管理系统的需求匹配度很高。环境配置上有个容易卡的节点Node.js 版本。Vite 5 要求 Node 18如果本机还是 Node 16启动时会直接报错。我的建议是先node -v检查版本不行就直接用 nvm 切换不要硬刚。npm 依赖安装慢的问题配置一下淘宝镜像源就能解决平时写代码基本感知不到网络瓶颈。5.2 动态路由的实现根据角色生成菜单普通成员、社长、管理员看到的菜单完全不同。我不希望把所有路由都写进静态配置里再靠 v-if 去隐藏而是用动态路由登录成功后根据当前用户的角色在前端组装出该角色能访问的路由表再用router.addRoute动态添加。const dynamicRoutes { ADMIN: [...adminRoutes], PRESIDENT: [...presidentRoutes], MEMBER: [...memberRoutes] } function generateRoutes(role) { const routes dynamicRoutes[role] || []; routes.forEach(route router.addRoute(route)); }动态路由有两个坑必须处理。第一刷新页面后加好的路由会丢失因为 router 实例是内存对象。解决方法是把当前用户的路由标记存到 Pinia配合 localStorage 持久化在路由守卫里判断“如果 Store 里有角色信息但路由表还没生成就先动态添加再放行”。第二动态路由和菜单的联动菜单要从 Vue Router 当前的 routes 中过滤生成保持菜单和路由数据同源避免两处维护不一致。5.3 Pinia 状态管理 与 Axios 拦截器我项目里的 Pinia 就干三件事存 token、存用户信息、存菜单路由标记。不需要把服务器返回的所有数据都塞进 Store那样内存占用没有意义。Axios 拦截器是前端请求的核心封装我在请求拦截器里统一加 Authorization 头响应拦截器里统一处理错误service.interceptors.request.use(config { const token localStorage.getItem(token); if (token) config.headers.Authorization Bearer ${token}; return config; }) service.interceptors.response.use( response { const res response.data; if (res.code 200) return res.data; if (res.code 401) { // 跳转登录页清空本地缓存 return Promise.reject(new Error(未登录)); } return Promise.reject(new Error(res.message)); }, error Promise.reject(error) )这样做的好处是所有页面调用接口时只关心成功的业务数据错误提示统一用 Element Plus 的 Message 弹出不用每个页面重复写。5.4 用插槽封装通用组件SearchForm 与 Table后台管理系统的页面高度相似顶部搜索条件、中间表格、底部翻页。我封装了一个 BaseTable 组件把分页逻辑和表格渲染抽出来具体列和操作按钮通过插槽自定义template div classbase-table el-table :datadataList v-loadingloading slot namecolumns/slot el-table-column label操作 width180 template #default{ row } slot nameactions :rowrow/slot /template /el-table-column /el-table el-pagination v-model:current-pagepageNum v-model:page-sizepageSize :totaltotal current-changefetchData / /div /template使用的时候页面只要写业务相关的列和按钮就可以BaseTable reftableRef :fetch-apigetClubList template #columns el-table-column propname label社团名称 / el-table-column propmemberCount label成员数 / /template template #actions{ row } el-button clickhandleDetail(row)详情/el-button /template /BaseTable这个封装让我新增一个列表页从一天缩短到两小时花半天时间做基础组件是完全值得的。6. 联调、部署与排错真实踩过的坑和排查链路6.1 跨域问题开发环境代理与 Nginx 代理的区别前后端分离项目必然会碰到跨域。开发阶段我用的是 Vite 的 proxy 方案前端请求/api开头Vite 开发服务器把请求转发到localhost:8080// vite.config.js export default { server: { proxy: { /api: { target: http://localhost:8080, changeOrigin: true } } } }部署阶段前端构建后的静态文件放在 NginxNginx 同时把/api的请求反向代理到后端服务server { listen 80; server_name your.domain.com; location / { root /usr/share/nginx/html; index index.html; } location /api { proxy_pass http://localhost:8080; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } }注意这里有个很多人混淆的点开发时浏览器访问的是 Vite 的 5173 端口/api 被代理到 8080所以浏览器认为请求是同源的不会产生跨域。部署后浏览器访问的是 Nginx 的 80 端口/api 又被 Nginx 代理同样同源。换句话说我根本没有在后端开启过 CORS 全局配置——代理就是最干净的跨域解决方案不需要 CORS也不需要allowed-origins。6.2 日期时间格式的前后端对齐问题前后端时间格式不一致是我联调阶段的第一大烦恼。后端 LocalDateTime 默认序列化成2024-09-01T14:30:00前端表单却要显示2024-09-01 14:30。解决方案是在后端统一配置 Jackson 的日期格式比在每个实体字段上加 JsonFormat 干净得多spring: jackson: date-format: yyyy-MM-dd HH:mm:ss time-zone: GMT8前端提交时间字符串时后端接收参数要加 DateTimeFormat 注解否则 Spring 无法把字符串解析成 LocalDateTimeDateTimeFormat(pattern yyyy-MM-dd HH:mm:ss) private LocalDateTime startTime;两个注解职责不同JsonFormat 管的是 JSON 序列化输出DateTimeFormat 管的是请求参数绑定容易混淆我踩过一次之后就把它们写进了自己的笔记里。6.3 Vue history 路由部署后的 404 问题前端构建后部署到 Nginx刷新页面就 404。原因是 Vue Router 的 history 模式使用了 HTML5 History API路由切换时 URL 是真实的路径比如/member但 Nginx 默认在磁盘上找不到这个路径就返回了 404。我一开始不理解后来才明白这其实是服务端需要配合做“try_files”配置让所有未知路径都回退到 index.html由 Vue Router 自己去匹配路由。Nginx 配置加一行location / { root /usr/share/nginx/html; index index.html; try_files $uri $uri/ /index.html; }这也是为什么我用 history 而不是 hash 的原因hash 模式 URL 会带#部署时确实省事但既不美观也不利于后续做 SEO 和分享链接。生产环境还是建议 history Nginx 配置一劳永逸。6.4 图片上传成功但前端访问 404 的排查过程这个坑我排查了整整一晚上值得单独分享。现象是后端上传接口返回了文件 URL数据库也存了路径但浏览器访问 URL 就是 404。我的排查链路是这样的先看后端日志确认文件确实写入到了/home/upload/目录直接用服务器本机curl访问http://localhost:8080/upload/xxx.png发现也 404这说明问题在后端的静态资源映射而不是 Nginx 层检查 WebMvcConfig发现addResourceLocations(file:/home/upload/)的路径末尾漏了斜杠正确写法应该是file:/home/upload/补上斜杠并重启本机访问正常再通过域名访问发现仍然 404于是把目光转向 Nginx查 Nginx 配置发现我没有把/upload这个路径配置进去它默认只代理了/api静态文件请求直接打到前端目录里自然找不到最终 Nginx 加了一段location /upload { proxy_pass http://localhost:8080; }至此问题彻底解决。这个例子看起来简单但完整的排查链路是“确认文件存在 → 确认后端映射 → 确认 Nginx 转发 → 确认最终路径”每一步都不能想当然。把日志、curl、配置三者对照起来看大多数 404 都能快速定位。7. 项目复盘还能往哪个方向扩展以及这份经验对面试的实际价值7.1 没做但值得做的功能通知推送、WebSocket 与监控项目能跑起来之后我复盘时列了一批“当时没做但实际使用中真的需要”的功能消息通知活动发布后成员能实时收到提醒。这个用 Spring Boot 集成 WebSocket 就能做在 yml 里配置/wsendpoint前端通过原生 WebSocket 或封装库连接。核心要点是连接鉴权和消息广播活动发布时向订阅了该社团频道的用户推送。导出功能成员名册、签到表导出 Excel社团联合会那边几乎每周都有人要。定时任务活动结束自动归档长期未活跃的社团自动提醒。Spring 自带Scheduled就能实现注意加fixedDelay而不是fixedRate避免任务执行时间过长导致重叠。关于监控Spring Boot Admin 是一个很轻量的方案新建一个独立的监控服务接入被监控应用的 actuator 端点就能看到内存、线程、接口调用情况。这个功能更适合部署在服务器上的正式环境做本地开发时价值不大。7.2 从面试角度聊聊这个项目的表述重点如果你打算用这个项目去面试我强烈建议不要只说“我做了个社团管理系统”而是围绕下面几个点去讲每个点都要有自己的思考权限模型为什么用角色而不是单个用户授权因为角色便于批量管理社团系统里用户角色是相对固定的动态路由怎么解决刷新丢失的问题能说出 addRoute 路由守卫重新生成的方案说明你不是背题库数据一致性怎么保证不要提分布式锁先讲清事务的边界、冗余字段的更新时机以及为什么这个场景不需要引入分布式中间件为什么选择当前这套技术栈能结合项目实际情况说“选型是为了快速迭代和资料丰富”比说“因为新”更能体现工程判断力我个人做完整套系统的最大体会是写业务系统的核心能力不是炫技而是把业务流程想清楚把数据和权限边界划清楚剩下的接口和页面都是熟练工。如果时间重来一次我会在第一周就把状态机设计和权限矩阵画到纸上而不是在写代码过程中反复改表结构。这套系统的完整版本最终在社团联合会跑了两个月招新季的统计时间从原来的一周压缩到半天用户说“至少不用再传 Excel 了”这就是作为开发者最有成就感的时候。
RELATED

相关推荐

AI coding agent 可观测与自愈:开源思路与实操

AI coding agent 可观测与自愈:开源思路与实操

1. 为什么 AI coding agent 需要“双眼睛”1.1 从“能写代码”到“写得靠谱”的鸿沟过去一年,我陆续把几个 AI coding agent 接入了日常开发流程。最开始的新鲜感很快被现实冲淡:agent 能一口气生成两百行代码,但跑起来报错的时候&#xff0c…

📅 2026/10/3 4:51:40
QGroundControl打不开?从运行库到OpenGL渲染的完整排查指南

QGroundControl打不开?从运行库到OpenGL渲染的完整排查指南

1. 问题现象与根因拆解先说结论:QGroundControl(下面简称QGC)和华科尔地面站这类软件,安装完双击没反应、转圈就消失、或者报错弹窗,九成以上不是安装包坏了,而是系统和运行环境的问题。这类软件底层依赖Qt…

📅 2026/10/3 4:46:40
专升本备考资料选择指南:从底层逻辑到高效使用

专升本备考资料选择指南:从底层逻辑到高效使用

1. 专升本的底层逻辑:它是什么,值不值得你花时间先聊一个很现实的问题:每年都有大把专科生纠结要不要升本,纠结着纠结着,大三下学期才开始急,最后匆匆忙忙报个班,资料也没选明白,考场…

📅 2026/10/3 4:46:40
MORE NEWS

更多资讯

📰

大模型千卡推理集群架构:等开销负载均衡实战

1. 项目概述:这不是在搭服务器,是在给大模型修一条高速公路“大模型推理集群架构设计:从单卡推理到千卡负载均衡”——这个标题里藏着三个关键动作:“修路”(架构设计)、“提速”(单卡→千卡&am…

📰

大模型Agent记忆系统设计实战:从无状态到有状态

1. 为什么Agent必须有自己的记忆1.1 从"无状态"到"有状态":Agent记忆的本质这两年我做了不少Agent项目,最深的体会是:很多人一上来就堆功能、接工具、画编排图,结果做出一个"每次对话都失忆"的机器…

📰

生成式AI模型优化赛:ControlNet推理加速实战,延迟降低3倍

1. 赛题背景与方案整体思路拆解1.1 这个比赛到底在比什么先说说这个比赛的定位。生成式AI模型优化赛,核心考察的不是谁模型训得好,而是谁能在给定硬件条件下把已有模型的推理性能压榨到极致。说白了,模型精度是主办方给的,你要做的…

📰

UE5不靠超分辨率也能3倍提帧:原生渲染优化实战

先说明:我不打算在文章里和谁吵架,也不打算证明“超分辨率无用”。本文想做的事情很简单——把一个 UE5 项目放到“原生渲染分辨率”下,通过一系列渲染配置、场景设置和资源层面的优化,把帧率从约 30fps 提到接近 90fps。这个结果…

📰

从零手写Transformer与AI训练推理:完整工程实践指南

一直有个执念:与其天天调现成框架的API,不如亲手把AI系统从零攒出来一次。这个项目就是我过去几个月的完整记录。从数据清洗、分词器,到Transformer核心模块、训练循环、推理部署,我不使用任何现成的深度学习框架来组装模型逻辑&a…

📰

AI应用底座:从试验到生产力,企业AI落地的关键基础设施

1. 从一堆"AI试点项目"到真正的生产力:QuickBlue在解决什么过去两年我见过太多这样的企业:年初高调宣布成立AI专项小组,年中把ChatGPT、文心一言、通义千问的API全部接入了一遍,年底复盘时却发现,真正跑进业…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬