尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
基于Vue与SpringBoot的选课系统设计与源码解析
简介一套基于Vue与SpringBoot的高校学生网上选课系统完整设计包面向计算机专业毕业设计、课程设计及期末大作业场景。系统采用前后端分离架构Vue负责动态交互界面SpringBoot承载选课、课程管理、成绩查询等核心业务配合数据库设计文档与SQL初始化脚本可快速搭建可运行项目。压缩包共449个文件大小16.85MB以vue前端组件、java后端源码、svg图标及jpg/png图片为主同时包含js、xml、css等配置与样式文件并附带论文doc、数据库表结构docx、sql脚本、部署bat及README说明结构清晰便于直接部署与二次开发。已有38人学习下载适合需要完整参考实现的高校学生和开发者。包内除完整源码外还提供数据库表结构说明、初始化SQL、一键安装/运行脚本及论文文档有助于理解选课业务的数据建模与前后端交互流程可直接作为毕业设计或课程设计的技术蓝本。1. 基于Vue与SpringBoot的选课系统先看懂 zip 里装的是什么拿到「基于Vue与SpringBoot的选课系统设计.zip」这份源码的十有八九是正在赶毕业设计或课程设计的学生。选课系统是前后端分离项目里最经典的一类Vue 负责页面交互SpringBoot 提供数据接口中间用 JSON 通信业务上绕不开学生、教师、管理员三类角色和一张选课关系表。标题背后的实际需求很具体——把整套系统跑起来搞清楚每个模块在干什么答辩时能讲清楚设计思路遇到「名额超了怎么办」这类问题不至于哑口无言。如果你是第一次碰这种前后端分离项目从数据库到接口再到前端页面按顺序走一晚上跑通问题不大如果已经在跑直接跳到第 5 章避坑笔记多半能省下两个小时。2. 选课系统的核心业务与数据库表设计先看表结构再动手跑拿到 zip 先别急着配环境。我一般先看里面的 sql 脚本或 entity 类表结构能直接反映这个系统的设计水平也能提前判断它是不是正规的前后端分离实现。选课系统的本质是一个课程名额分配问题所有业务都围绕「谁在什么时间选了哪门课」展开所以表设计决定了后面接口怎么写也决定了并发选课时会不会翻车。2.1 三类角色与权限边界学生、教师、管理员各自管什么一个能拿去答辩的选课系统角色一般是三个学生、教师、管理员。管理员维护课程基础信息包括课程名、授课教师、学分、上课时间和限选人数同时设置选课开放与截止时间教师查看自己课程的选课名单有些系统还带成绩录入学生浏览课程列表、选课、退课、查看个人课表。界面看起来模块很多落到接口层面就是三组权限各不相同的 REST API。表结构上常见两种做法一种是所有用户放一张 user 表用 role 字段区分身份另一种是 student、teacher、admin 各自建表。课设项目用第一种的居多代码写起来省事登录时一次查询就能拿到用户信息和角色第二种更贴近真实系统但学生和教师各自有扩展字段联动查询多一层。我的建议是别急着换表结构先看权限校验做没做全后端接口有没有按角色拦截前端路由有没有按角色控制页面入口。权限判断必须以后端为准前端控制只是用户体验不然绕过页面直接调接口就能干管理员的事答辩时被问到基本等于送分给老师。2.2 数据库表设计课程表、用户表与选课记录表的关键字段选课系统最少需要三张表用户表、课程表、选课记录表。下面的建表语句是按最常见的课设方案整理的字段做了精简但关键点都在。-- 用户表学生、教师、管理员共用role 区分身份 CREATE TABLE sys_user ( id BIGINT PRIMARY KEY AUTO_INCREMENT, username VARCHAR(50) NOT NULL UNIQUE, password VARCHAR(200) NOT NULL, -- 建议存 bcrypt 加密后的密文 real_name VARCHAR(50), role TINYINT NOT NULL DEFAULT 3, -- 1管理员 2教师 3学生 student_no VARCHAR(30), -- 学号教师/管理员可为空 department VARCHAR(100) ); -- 课程表容量与已选人数放在同一张表方便列表直接展示剩余名额 CREATE TABLE course ( id BIGINT PRIMARY KEY AUTO_INCREMENT, course_name VARCHAR(100) NOT NULL, teacher_name VARCHAR(50), credit DECIMAL(3,1), capacity INT NOT NULL, -- 限选人数 selected INT NOT NULL DEFAULT 0, -- 已选人数 course_time VARCHAR(200), -- 周几第几节如周一 3-4 节 start_time DATETIME, -- 选课开放时间 end_time DATETIME -- 选课截止时间 ); -- 选课记录表同一学生同一门课只能有一条记录 CREATE TABLE course_selection ( id BIGINT PRIMARY KEY AUTO_INCREMENT, course_id BIGINT NOT NULL, student_id BIGINT NOT NULL, select_time DATETIME DEFAULT CURRENT_TIMESTAMP, UNIQUE KEY uk_course_student (course_id, student_id) );这套表结构有三个值得在答辩时讲的设计点。第一课程表里冗余了 selected 计数查询列表时直接用 capacity - selected 算剩余名额避免每次都要去 count 选课记录代价是选课、退课、删课时必须同步维护这个数字否则数据会慢慢漂移。第二course_selection 表的唯一索引 (course_id, student_id) 是防重复选课的兜底即使接口层校验漏了数据库也会把重复记录挡在外面。第三密码字段我用注释标了 bcrypt很多课设源码存的是明文老师一眼就能看出安全问题能改就改成加密存储。2.3 并发选课与事务边界为什么不能只靠一条 INSERT课设项目开发时只有一个人测试怎么点都不会出事但答辩演示或真实部署时多人同时操作就会暴露问题。最常见的错误写法是先查出这门课的已选人数判断是否小于容量小于就插入选课记录。两个请求同时读到 selected 49容量是 50两个都判断「还能选」然后各自插入一条记录最终变成 51 人。数据库的唯一索引只能防止同一个人重复选同一门课防不了两个不同学生同时抢最后一个名额。解决办法是把「占名额」做成一个带条件的更新操作用影响行数说话Override Transactional(rollbackFor Exception.class) public boolean selectCourse(Long courseId, Long studentId) { // 1. 先尝试占一个名额只有剩余名额大于0时才会更新成功 int rows courseMapper.updateSelected(courseId); if (rows 0) { return false; // 名额已满选课失败 } // 2. 占位成功再插入选课记录唯一索引兜底阻止同人重复选 try { selectionMapper.insert(new CourseSelection(courseId, studentId)); } catch (DuplicateKeyException e) { courseMapper.revertSelected(courseId); // 回退名额 throw new RuntimeException(不能重复选同一门课); } return true; }update idupdateSelected UPDATE course SET selected selected 1 WHERE id #{courseId} AND selected capacity /update这段代码的关键在 updateSelected 的 SQL 条件UPDATE 语句先加锁再判断 selected capacity两个并发请求同时执行时数据库的行锁会让它们排队执行后执行的那个因为条件不满足影响行数为 0直接返回 false。整个过程包在事务里占名额和插记录要么都成功、要么都回滚不会出现选了课但名额没扣、或者扣了名额但课没选上的中间状态。这里还有一个细节如果插入选课记录时撞了唯一索引要先把名额回退再抛异常否则会出现数据库里没有选课记录、课程已选人数却 1 的脏数据。提示SpringBoot 的事务默认只对运行时异常回滚自定义的业务异常要显式指定 rollbackFor否则可能事务没生效排查起来很隐蔽。这一段代码是整个选课系统里最有含金量的部分答辩时主动讲出来比背十页 PPT 都管用。3. 把 SpringBoot 后端跑起来项目结构、核心配置与接口验证前端的门面做得再好后端起不来也白搭。选课系统的后端是标准的 SpringBoot 工程跑通它只需要搞清楚三件事源码目录里每一层在干什么、配置文件里每一项参数对应什么、用什么工具验证接口通不通。下面按这个顺序来。3.1 SpringBoot 项目结构与分层controller、service、mapper 各司其职SpringBoot 项目结构 看着复杂其实规律性很强。一个规范的课设后端通常是这样的src/main/java/com/example/course ├── CourseApplication.java # 入口类SpringBootApplication ├── config # 跨域配置、拦截器、全局异常处理 ├── controller # 接收请求返回 JSON ├── service # 业务逻辑 │ └── impl # 接口实现类 ├── mapper # MyBatis 数据访问接口 └── entity # 实体类对应数据库表 src/main/resources ├── application.yml # 端口、数据源等核心配置 ├── mapper # MyBatis XML 文件 └── static / templates调用顺序是 controller 接收前端请求把参数交给 serviceservice 处理业务规则再通过 mapper 访问数据库。分层的好处是每一层只干一件事controller 里不该写 SQLmapper 里不该写业务判断service 里不该出现 HttpServletRequest。课设里经常看到几百行的 controller功能能跑但答辩时老师问「为什么这么分层」就答不上来。实体类建议和数据库字段一一对应加上 Lombok 的 Data 注解省掉 getter/setter。入口类 CourseApplication 上只有 SpringBootApplication 一个注解但它的作用范围是启动类所在包及子包所以所有组件必须放在同一个父包下面放错了 Spring 扫描不到启动不报错接口一访问就 404。3.2 核心配置application.yml 里的端口、数据源与 MyBatis 映射SpringBoot 配置 集中在 src/main/resources/application.yml 里。拿到一个课设项目我第一件事就是打开这个文件确认端口、数据库连接和 MyBatis 映射这三个地方server: port: 8080 spring: datasource: url: jdbc:mysql://localhost:3306/course_select?useUnicodetruecharacterEncodingutf8serverTimezoneAsia/Shanghai username: root password: 123456 driver-class-name: com.mysql.cj.jdbc.Driver jackson: date-format: yyyy-MM-dd HH:mm:ss time-zone: Asia/Shanghai mybatis: mapper-locations: classpath:mapper/*.xml type-aliases-package: com.example.course.entity configuration: map-underscore-to-camel-case: true logging: level: com.example.course.mapper: debug从上往下逐个说。server.port 是后端端口前后端分离开发时前端要代理到这个端口。datasource 里最容易出错的是 url 的后缀参数characterEncodingutf8 解决中文乱码serverTimezoneAsia/Shanghai 解决 MySQL 8 的时区报错driver-class-name 在 MySQL 8 下必须用 com.mysql.cj.jdbc.Driver老项目里写的 com.mysql.jdbc.Driver 在新驱动里已经不存在了。jackson 的 date-format 决定接口返回的时间格式不配的话 LocalDateTime 会序列化成数组前端拿到的根本不是时间字符串。mybatis 配置里 map-underscore-to-camel-case 把数据库的 course_name 自动映射成实体类的 courseName少写一堆 ResultMap。最下面把 mapper 包的日志级别调到 debug控制台会打印每条 SQL 和参数排错时能看到实际执行的语句。这里还要提醒一句版本匹配SpringBoot 2.7.x 配 JDK 8 或 JDK 11SpringBoot 3.x 必须用 JDK 17 以上而且包名从 javax 变成了 jakarta。如果 IDE 里导入工程后依赖全是红叉先去看本机 JDK 版本和 pom.xml 里的 spring-boot-starter-parent 版本对不对得上这一条能解决一半的启动失败。3.3 用 Postman 验证登录、选课与退课接口的最小步骤后端启动成功后先用 Postman 把核心接口走一遍。下面是一套最常见的接口设计接口方法路径参数预期结果登录POST/api/user/loginJSON: username, password返回 token 和用户信息课程列表GET/api/course/listHeader: Authorization课程数组含剩余名额选课POST/api/course/select/{courseId}Header: Authorization成功 / 失败消息退课DELETE/api/course/cancel/{courseId}Header: Authorization成功 / 失败消息我的课表GET/api/course/myHeader: Authorization已选课程数组操作顺序是先调登录接口把返回的 token 复制到 Postman 的环境变量里再调课程列表列表能查到数据说明后端启动、数据库连接、MyBatis 映射三条链路都是通的接着随便选一门课返回成功后调我的课表确认记录写进去了最后退课再看课表变空。整个流程走完后端就算真正跑通了。如果列表接口返回了数据但登录失败问题出在密码校验逻辑如果列表就报 500优先看控制台日志里的 SQL 和异常堆栈。这一步的判断逻辑很重要后端接口通了剩下页面调不通的问题大概率出在跨域和前端环境上排查范围一下子缩小一半。4. 把 Vue 前端跑起来环境配置、路由与前后端联调前端项目跑不起来十有八九不是代码问题而是环境问题。Vue 全家桶对 Node 版本、依赖版本极其敏感同样的代码在别人的机器上好好的到自己手里就是各种报错。这一章重点说 vue安装及环境配置 里最常翻车的几个点以及路由和接口联调的正确姿势。4.1 环境准备Node 版本、npm 镜像与依赖安装的常见翻车点先看项目里有没有 package.json打开看一眼里面的 vue 版本和依赖。Vue 2 的老项目在 Node 14 或 16 下最稳Node 18 以上跑 vue2 项目经常报 node-sass 编译失败Vue 3 Vite 的项目建议 Node 16.18 以上或 18。本机装了多个 Node 版本用 nvm 切换最快。依赖安装是玄学重灾区。npm install 卡在 idealTree 不动、报 ERESOLVE 错误、node-sass 编译不过这三类问题占了 90% 的求助帖。处理顺序是node -v npm -v npm config get registry npm config set registry https://registry.npmmirror.com cd frontend rm -rf node_modules package-lock.json npm install先确认 Node 版本符合项目要求再看 npm 源是不是默认的官方源。国内网络下把 registry 切到 npmmirror 后依赖下载速度会明显提升。删掉 node_modules 和 package-lock.json 再做重装是因为 lock 文件里记录的下载地址指向旧源换源后它可能还会去原地址拉把旧的依赖树整个清掉让它按新源重新解析往往能解决一半莫名其妙的报错。如果项目特别老npm install 还报依赖冲突可以在命令后加 --legacy-peer-deps 跳过新版 npm 的严格依赖检查。安装完成后执行 npm run dev终端出现 Local: http://localhost:3000 之类的地址就说明起来了。这里不用管具体端口后面联调时会用到。4.2 前端结构与路由页面、组件、路由守卫怎么串起来Vue 项目的 src 目录结构比较统一对着它就能找到每个功能的位置src ├── api # axios 封装与接口定义 ├── assets # 静态资源 ├── components # 公共组件 ├── router # vue-router 路由表与守卫 ├── store # Pinia / Vuex 状态管理 └── views # 页面 ├── Login.vue ├── admin │ └── CourseManage.vue ├── teacher │ └── StudentList.vue └── student ├── CourseList.vue └── MyCourse.vueVue 路由 分两块理解路由表定义路径和页面的对应关系路由守卫控制谁能进入这些页面。以 Vue 3 的 vue-router 4 为例最小可用的守卫长这样import { createRouter, createWebHistory } from vue-router const routes [ { path: /login, component: () import(../views/Login.vue) }, { path: /student/courses, component: () import(../views/student/CourseList.vue), meta: { requiresAuth: true, role: 3 } } ] const router createRouter({ history: createWebHistory(), routes }) router.beforeEach((to) { const token localStorage.getItem(token) if (to.meta.requiresAuth !token) { return /login } const role Number(localStorage.getItem(role)) if (to.meta.role to.meta.role ! role) { return /login } })守卫逻辑拆开讲就三件事从 localStorage 拿 token没有 token 访问需要登录的页面就踢回登录页有 token 再看路由 meta 里要求的角色对不对得上对不上同样回登录页。meta 字段是路由元信息挂在路由配置上守卫里能直接读到。组件用 () import 写成懒加载首次访问这个路由时才下载组件代码首屏会快一些。从课程列表跳详情页这种场景可以用路由参数传 courseId{ path: /course/detail/:courseId, component: Detail }页面里用 useRoute().params.courseId 取参。课设里用 query 参数也行但刷新页面时 query 比 param 更不容易丢。4.3 接口联调与交付axios 封装、proxy 跨域与项目源码可运行的三个前提前后端分离开发时前端页面和后端服务是两个端口浏览器默认不允许跨端口发请求所以接口联调必须解决跨域。常见的做法是前端配代理开发时让 vue 开发服务器把 /api 开头的请求转发到后端端口。先看 axios 封装这是所有接口请求的统一入口import axios from axios const request axios.create({ baseURL: /api, timeout: 10000 }) request.interceptors.request.use(config { const token localStorage.getItem(token) if (token) { config.headers.Authorization token } return config }) request.interceptors.response.use( response response.data, error { if (error.response error.response.status 401) { localStorage.removeItem(token) window.location.href /login } return Promise.reject(error) } ) export default requestbaseURL 统一写 /api所有接口路径都从 /api 开头请求拦截器里把 token 塞进 Header后端拦截器统一从这里取响应拦截器里处理 401token 过期就清掉本地登录态跳回登录页。这套封装之后页面里调用接口只管写业务逻辑不用重复处理鉴权。代理配置在 vite.config.js 里export default { server: { port: 3000, proxy: { /api: { target: http://localhost:8080, changeOrigin: true } } } }这里的 target 就是后端 application.yml 里的 server.port前端把 /api/xxx 转发到 http://localhost:8080/api/xxx。配置完代理必须重启 npm run dev 才生效很多人改了配置不重启一直报跨域。另一种常见做法是 vue 打包放进 springboot 中不搞跨域前端 npm run build 生成 dist 目录把 dist 里的文件全部复制到后端的 src/main/resources/static 下再启动后端直接访问 8080 端口即可。开发时用代理部署时静态合并两套方案可以共存。最后说交付。别人问起 vue项目源码怎么发给别人我一般只强调一件事zip 里必须带 README写清楚 JDK 版本、Maven 版本、Node 版本、MySQL 版本、数据库导入方式、后端启动步骤、前端安装依赖和启动步骤。一段一百字的说明能省掉对方一下午的配置时间也是给自己的后悔药——三个月后你自己再看这份源码同样需要这份说明。5. 选课系统避坑笔记从启动失败到选课乱套的高频问题下面这些坑不是猜的是这类项目几乎每一份都会踩一遍的共性问题。按「现象 → 原因 → 解决」的顺序写对照排查比自己拿 search engine 翻论坛高效得多。5.1 前端连不上后端CORS 报错与 3000/8080 端口混乱现象前端页面能打开点登录按钮后控制台报 Access to XMLHttpRequest has been blocked by CORS policy或者 Network 面板里请求显示 failed后端控制台啥也没有。原因浏览器同源策略拦截了跨端口响应。前端 dev server 跑在 3000后端跑在 8080端口不同即跨域另一个常见原因是改了 proxy 配置但没重启前端代理根本没生效。解决优先确认 vite.config.js 里 proxy 的 target 是不是后端的真实端口改完有没有重启如果后端接口需要被非浏览器客户端直接调用就在 SpringBoot 里加全局 CORS 配置Configuration public class CorsConfig implements WebMvcConfigurer { Override public void addCorsMappings(CorsRegistry registry) { registry.addMapping(/**) .allowedOriginPatterns(*) .allowedMethods(GET, POST, PUT, DELETE) .allowedHeaders(*) .allowCredentials(true); } }注意 allowCredentials(true) 不能和 allowedOrigins() 同时使用SpringBoot 2.4 之后要用 allowedOriginPatterns() 代替否则配置类直接启动报错。这个细节写代码时很容易忽略。5.2 SpringBoot 版本太高导致 JDK 和依赖不匹配现象IDE 导入项目后 Maven dependencies 一片红叉或者编译时报 javax.servlet 不存在、无法解析 spring-boot-starter-parent。原因本地 JDK 是 17 或 21而 zip 里的项目是 SpringBoot 2.x编译目标针对 JDK 8反过来也可能——项目用 SpringBoot 3.x本机还是 JDK 8。SpringBoot 3 把 JavaEE 包名从 javax.* 全部换成了 jakarta.*之前的代码直接翻车。解决看 pom.xml 里 spring-boot-starter-parent 的版本2.7.x 配 JDK 8 或 113.x 配 JDK 17。用 nvm 或 IDE 的项目 SDK 切换 Java 版本切换后 Maven 需要 clean 再重新导入一次。如果用的 IDE 是 IDEA在 Project Structure 里把 SDK 和模块的 language level 同步改掉光改一个地方经常会残留报错。5.3 vue 打包放进 springboot静态资源 404 与刷新白屏现象npm run build 之后把 dist 复制到后端 static 目录启动后端首页能打开但刷新 /student/courses 页面白屏或者控制台一堆 js、css 文件 404。原因vue-router 默认用的 history 模式路由路径是真实的 URL 路径刷新时浏览器带着 /student/courses 请求后端后端没有对应的 controller直接返回 404。资源 404 则是因为打包后的 index.html 里资源路径用的是绝对路径 /assets/xxx后端部署路径对不上。解决最省事的是把路由改成 hash 模式路径变成 /#/student/courses刷新时不会触发后端路由import { createWebHashHistory } from vue-router const router createRouter({ history: createWebHashHistory(), routes })想保留 history 模式的干净路径就需要后端加一个 fallback把所有非 /api 开头的 GET 请求转发到 index.html。课设系统用 hash 模式完全够用改动最小不必在这上面死磕。5.4 重复选课与限选人数失效接口不校验导致数据错乱现象同一个学生快速点击选课按钮选课记录表里出现两条相同 (course_id, student_id) 的数据或者课程已经显示满员还能选课成功。原因前端只做了按钮禁用后端 selectCourse 里没做任何校验数据库的 course_selection 表没加唯一索引有些项目 Service 里先查再插但没有事务也没有条件更新并发时必超。解决三层都补上。数据库加 UNIQUE KEY (course_id, student_id)这是兜底后端按第 2.3 节的条件 UPDATE 占名额影响行数为 0 直接返回满员前端在请求发出后置灰按钮防止用户连点产生一串重复请求。只做一层早晚会在某个角度漏出去。5.5 服务器时间与本地时间不一致选课时间窗口判错提前开门现象管理员设置 10:00 开放选课学生 9:50 就能选上或者到了 10:00 反而提示不在选课时间。原因代码里用 new Date() 比较时间取的是服务器/本机时间而 start_time 存在 MySQL 里MySQL 有自己的时区设置。服务器时间、数据库时间、浏览器时间三个时钟不一致时间窗口就是黑匣子。解决把时间判断下推到 SQL让 MySQL 统一出时间select idcheckTimeWindow resultTypeint SELECT COUNT(*) FROM course WHERE id #{courseId} AND start_time lt; NOW() AND end_time gt; NOW() /select联表查询里直接让数据库拿当前时间做比较绕开代码服务器和数据库之间的时间差。另外 MySQL 连接串里的 serverTimezone 要配成 Asia/ShanghaiJava 实体接收时间字段用 LocalDateTime 而不是 Date避免 JDBC 层再做一次时区转换。这三个点对齐了选课时间窗才算真正可控。6. 给选课系统加最后一道保险乐观锁实现并发选课并验证6.1 用一条 UPDATE 保住限选人数乐观锁的核心写法本地跑通只是第一步答辩或真实使用时被问到「如果 100 个人同时抢 10 个名额怎么办」没有并发保护的系统当场就会出洋相。乐观锁不是引入 Redis而是把名额扣减变成带条件的 UPDATE用数据库行锁天然排队用影响行数判断成败UPDATE course SET selected selected 1 WHERE id #{courseId} AND selected lt; capacity AND start_time lt; NOW() AND end_time gt; NOW()这条语句同时处理了三件事名额判断、时间窗判断、名额占用。影响行数为 1 说明抢到了继续插入选课记录影响行数为 0 直接返回失败不锁表不引入中间件一行 SQL 解决并发超选。注意把退课也做成对称逻辑UPDATE course SET selected selected - 1 WHERE id #{courseId} AND selected 0并对选课记录做删除两边都包在事务里。验证方法很直接用 Postman 的 Runner 或者 JMeter 开 20 个线程同时请求同一门容量为 1 的课程的选课接口执行完断言三件事——course.selected 最终等于 1course_selection 表里只有 1 条记录接口返回成功数只有 1。这个测试跑通并发这块才算真正交差。我自己第一次做选课系统时觉得本地能跑就万事大吉结果演示时被人用脚本连点当场选出 200 人的课程脸都绿了。后来凡是名额类接口一律先写条件 UPDATE 再写业务这个习惯一直留到了现在。希望帮到你。本文还有配套的精品资源点击获取
RELATED

相关推荐

虚调子双元法:复数域有理函数积分与配对积分技巧

虚调子双元法:复数域有理函数积分与配对积分技巧

“虚调子双元法”这五个字摆到纸面上,多数人第一反应是:这是不是某个论坛上自造的江湖术语。我第一次被 A 同学堵在座位上问这个问题时,反应也差不多——他把草稿纸推过来,上面一道 $\int \frac{dx}{x^41}$,配方式配了…

📅 2026/10/29 6:14:00
2024年三款主流五笔输入法深度横评:词库、皮肤与云同步

2024年三款主流五笔输入法深度横评:词库、皮肤与云同步

五笔输入法这个圈子,说大不大,说小也不小。我用了快十二年的五笔,从最早在旧电脑上折腾各种输入法,到后来帮身边同事配置、给家里人装机,前前后后经手的五笔方案没有二十套也有十五六套了。2024年这一年,我…

📅 2026/10/29 6:09:00
AI论文写作工具书匠策的六大核心功能解析

AI论文写作工具书匠策的六大核心功能解析

1. 论文写作的痛点与AI解决方案论文写作一直是学术界永恒的痛点。从选题构思到文献综述,从实验设计到结果分析,每个环节都让研究者们头疼不已。特别是对于非英语母语的研究者,语言表达更是横亘在学术发表路上的一座大山。最近两年&#xff0c…

📅 2026/10/29 6:09:00
MORE NEWS

更多资讯

📰

Ponytail:前端UI状态快照与协作诊断工具详解

1. 项目概述:从“ponytail”热词切入,我们到底在讨论什么?最近刷技术社区、设计论坛甚至短视频平台,频繁撞见“ponytail”这个词——它既不是马尾辫的直译,也不是某个新晋网红的ID,而是一个正在快速聚拢真实…

📰

GLM批量API五折入口详解:大模型成本优化实战指南

最近我在优化一个大规模文本处理项目,每天要跑几十万个请求。算力成本一直是老大难,直到我发现GLM API有一个批量五折的通道——同样调用GLM模型,走批量的价格只有实时调用的一半。但这里有个很现实的问题:这个五折入口藏得很深&a…

📰

Gemini 3在高校科研中的六大核心应用场景

1. 为什么高校教师需要掌握Gemini 3?上周帮同事调试文献分析模型时,发现他还在用传统的关键词检索方式筛选论文。当我演示用Gemini 3直接生成研究现状综述时,他盯着屏幕愣了半天——这个场景让我意识到,AI工具的应用鸿沟正在真实影…

📰

Gemini 3在高校科研中的六大核心应用场景与效能提升

1. 高校教师Gemini 3应用现状与紧迫性当ChatGPT-4还在教育圈引发热议时,Google DeepMind的Gemini 3已经悄然完成了三代技术迭代。最近走访了国内十余所高校的实验室,发现一个令人担忧的现象:约68%的人文社科教师和43%的理工科教师仍停留在传统…

📰

多环境切换的上下文管理机制:原理与实现

1. 项目背景:多环境切换为什么让人崩溃去年年中,我接手一套微服务的日常发布和运维工作,环境至少有开发、测试、预生产三套,每套环境又分不同的地域和账号体系。命令行操作一分钟都离不开--envtest --regioncn-north-1 --tokenxxx…

📰

营销技能能力地图:从执行到操盘手的进阶路径

1. 营销技能不是单点能力:先画一张能力地图1.1 为什么很多人“什么都会,但说不清自己会什么”先聊一个我在面试中经常遇到的场景:候选人简历上写着“熟悉文案撰写、用户分析、活动策划、数据复盘”,看起来什么都沾边,但…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

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

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

📞 💬