news 2026/10/9 3:04:11

绩效考评系统Java Web源码解析:从数据库设计到Spring Boot部署实战

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
绩效考评系统Java Web源码解析:从数据库设计到Spring Boot部署实战

简介:面向Java Web开发学习者的绩效考评系统完整项目,基于Servlet/JSP与Spring、MyBatis等技术栈实现,面向企业员工考核流程的数字化管理。压缩包共509个文件,整体约982KB,包含91个Java源文件、91个class文件、39个JSP页面、8个JS脚本、6个CSS样式及1个SQL数据库脚本等,另含244个svn-base版本控制痕迹与工程配置文件,便于还原开发过程、导入IDE运行。目前已有175人学习下载。读者可获得完整源码与数据库初始化脚本,从登录验证、评分录入、项目维护等Servlet控制器到DAO数据访问层,体现出经典的三层架构设计;可梳理员工管理、绩效指标、周期设定、评价录入、自动计算与报表生成等模块的实际实现,理解SSM架构中MVC分层与ORM映射的落地方式。系统通常涵盖岗位绩效指标、考核周期、多角色评分与综合得分计算等环节,适合作为Java Web企业项目及绩效管理系统设计的实践参考,在课程设计、毕业设计与企业二次开发中均有参考价值。

1. 绩效考评系统—java web:一份 rar 源码背后的完整业务闭环

每年课设毕设季,绩效考评系统 java web 这套题都会重新火一遍,公司内网想给 OA 加绩效模块的同事也常搜这类打包好的源码。rar 包解压后通常是一套完整工程:前端页面、Java 后端、数据库脚本都在里面,跑通后能覆盖“考核模板 → 下发评分任务 → 打分录入 → 权重汇总 → 等级评定”这条闭环。这里有个反直觉的结论:算分逻辑在整套系统里只占几十行代码,真正耗时间的是考核周期状态管理、指标版本、角色权限和数据一致性。这篇文章写给两类人:要找 Java Web 课设/毕设落地点的学生,和要在现有系统里快速加绩效模块、还想知道坑在哪的工程师。

2. 业务建模与数据库设计:先画清考核流程,再定核心表

2.1 从考核周期到评分等级:把业务规则翻译成状态机

把线下 Excel 绩效流程搬进 Web 系统之前,先要分清系统里到底有哪些业务对象。最常见的对象是这几类:考核周期(月度、季度、年度)、考核模板(不同岗位对应不同指标集)、考核记录(一次具体下发的考核任务)、评分明细(谁给谁打了多少分)、汇总结果(最终得分和等级)。

为什么强调先理对象?因为绩效考核的实际流程不是一个线性“打完分就结束”的过程。一次考核要经历草稿、已发布、评分中、已截止、已确认五个状态。草稿阶段只有管理员能编辑模板;发布后评分人才能看到打分页面;截止后打分入口关闭,管理员开始核对结果;确认后结果公示,员工可查看个人等级。这套状态机的语义一旦没定清楚,后面所有接口都要反复改判断条件。

我把状态字段设计成 varchar 存英文枚举,而不是 int 存数字。原因很简单:SCORING比2可读性高得多,写 SQL 排查数据时一眼就能看出这条记录处于什么阶段,不用每次翻代码对照枚举序号。状态流转靠 Service 层方法控制,不允许前端直接改 status 字段,这是防止用户绕过流程的关键。

2.2 核心表结构:模板、指标、评分记录与汇总怎么落库

绩效系统的表不算多,五张核心表就能撑起整个闭环,外加两张基础表sys_user和sys_dept用来支撑权限和部门统计。

表名作用关键字段
assessment_template考核模板id、name、period_type、status
assessment_indicator考核指标id、template_id、name、weight、score_type
assessment_record考核记录id、template_id、period_start、period_end、status、dept_id
assessment_detail评分明细id、record_id、target_user_id、score_user_id、indicator_id、score、comment
assessment_summary评分汇总id、record_id、target_user_id、total_score、grade

这里最容易翻车的是评分明细表。同一考核记录里,同一个评分人对同一个被评人的同一个指标,逻辑上只能评一次,但页面上的“提交”按钮被双击、或者用户换了个浏览器标签页重复提交,就会插入两条一模一样的明细。拦截这种脏数据不能只靠后端 if 判断,数据库层面必须加唯一索引锁死:

ALTER TABLE assessment_detail ADD UNIQUE KEY uk_record_target_score (record_id, target_user_id, score_user_id, indicator_id);

这个唯一索引是整套系统数据一致性的底座。后续评分接口只要捕获DuplicateKeyException,就能在并发场景下挡掉重复提交,先于任何业务代码保护数据。除了唯一索引,明细表还要按照record_id建普通索引,因为几乎所有查询都先指定考核记录,再去捞明细或汇总,索引能避免全表扫描。

2.3 用 MyBatis-Plus 实体类生成建表 SQL:把注解翻译成 DDL

很多人搜“mybatisplus根据java实体类生成创建表的sql语句”,以为 MyBatis-Plus 提供了开箱功能,其实没有。AutoGenerator 是反向生成代码,不是从实体类反推建表语句。常见做法是写一个十几行的反射工具,读取@TableName、@TableField注解拼出CREATE TABLE,或者直接用 IDEA 的数据库工具根据实体类生成 DDL。

我一般会在工程里保留一个独立的DdlGenerator类,专门干这件事:

public class DdlGenerator { public static String createTableSql(Class<?> clazz) { TableName table = clazz.getAnnotation(TableName.class); if (table == null) { throw new IllegalArgumentException("实体类缺少 @TableName 注解"); } StringBuilder sb = new StringBuilder("CREATE TABLE `") .append(table.value()).append("` (\n"); for (Field f : clazz.getDeclaredFields()) { TableField tf = f.getAnnotation(TableField.class); // exist = false 表示该字段不参与表结构,跳过 if (tf != null && !tf.exist()) { continue; } String column = (tf != null && !tf.value().isEmpty()) ? tf.value() : camelToUnderscore(f.getName()); sb.append(" `").append(column).append("` ") .append(mapType(f.getType())).append(",\n"); } sb.setLength(sb.length() - 2); // 去掉末尾逗号 sb.append("\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;"); return sb.toString(); } private static String mapType(Class<?> type) { // 绩效系统里够用的类型映射 if (type == Integer.class) return "INT"; if (type == BigDecimal.class) return "DECIMAL(10,2)"; if (type == LocalDateTime.class) return "DATETIME"; return "VARCHAR(64)"; } }

这个工具的核心逻辑有三点:字段名优先取@TableField("xxx")指定的列名,没有注解就用驼峰转下划线;@TableField(exist = false)的字段是纯逻辑字段,不参与建表;主键如果标了@TableId(type = IdType.AUTO),还要在生成时拼接BIGINT AUTO_INCREMENT PRIMARY KEY。这样生成的 SQL 和实体类严格对齐,改实体字段后重新生成一次,数据库结构就同步了。

用这个工具跑一遍AssessmentDetail,得到的 DDL 长这样:

CREATE TABLE `assessment_detail` ( `id` BIGINT AUTO_INCREMENT PRIMARY KEY, `record_id` BIGINT, `target_user_id` BIGINT, `score_user_id` BIGINT, `indicator_id` BIGINT, `score` DECIMAL(10,2), `comment` VARCHAR(255) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

注意,这只是字段映射,唯一索引、普通索引还要在建表后单独执行ALTER TABLE加上。切忌把这个工具生成的 SQL 直接丢进生产库,先在本地建一次库,核对字段类型和长度,再决定要不要加索引。

3. 技术栈选型与工程骨架:Spring Boot + MyBatis 的最小可运行组合

3.1 为什么新项目选 Spring Boot + MyBatis,老 rar 包里的 JSP/Servlet 怎么办

网上流传的很多“绩效考评系统 java web”老压缩包还是 JSP + Servlet + JDBC 的结构,依赖 jar 包靠手动拷贝,改一处代码要重启整个 Tomcat。这类工程能帮你练 Java 基础和面向对象建模,但对今天找工作和实际交付来说效率偏低。我接手这类 rar 的第一反应是先看有没有pom.xml:有 Maven 结构就还有救,没有就得把 Servlet 代码逐个改造成 Spring MVC。

维度JSP/Servlet 老工程Spring Boot + MyBatis
依赖管理手动拷贝 jar,冲突靠运气Maven 自动传递依赖,版本仲裁
启动方式打 war 丢外部 Tomcat内嵌 Tomcat,一键跑 main 方法
数据访问手写 JDBC、手动关连接MyBatis-Plus 的 BaseMapper 直接 CRUD
学习价值面向对象基础贴近真实岗位和面试常见的 Java 八股文

对于新写的绩效系统,我推荐 Spring Boot + MyBatis-Plus 这个组合。绩效模块本质是标准的单表 CRUD 加报表统计,MyBatis-Plus 的BaseMapper能省掉大量重复的 insert/select 模板代码,分页插件也是内置的。这套选型不是追求新,而是追求“一个刚毕业的学生也能在两周内交付一个能跑的版本”。

3.2 工程目录与依赖:一个评分模块的骨架长什么样

pom.xml里核心依赖只有四个,多了都是自找麻烦:

<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.5.5</version> </dependency> <dependency> <groupId>com.mysql</groupId> <artifactId>mysql-connector-j</artifactId> <scope>runtime</scope> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <scope>provided</scope> </dependency>

选 MyBatis-Plus 3.5.x 是因为它内置了分页拦截器和乐观锁插件,不用再引第三方增强包。工程内部分层按最常见的 controller/service/mapper/entity 四层来拆,包结构建议统一为com.example.assess:

src/main/java/com/example/assess/ ├── controller/ AssessmentRecordController.java ├── service/ AssessmentScoreService.java ├── mapper/ AssessmentDetailMapper.java ├── entity/ AssessmentDetail.java └── config/ MybatisPlusConfig.java

分包原则按层分包在代码量不大的时候最快,等做到十几个模块以后,再考虑按领域拆包。配置类里要注册 MyBatis-Plus 的分页插件,否则Page<T>的查询不会真正分页,只会查全表再内存截断,数据量一大就拖垮接口。

3.3 登录与权限:基于 Session 的轻量角色控制

绩效考核天然分三种角色:管理员负责建模板、发布任务;评分人负责打分;员工负责自评和查看结果。课设和内部小系统没必要上 Spring Security 全家桶,一个拦截器加 Session 就能解决 90% 的权限问题。

public class LoginInterceptor implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { Object user = request.getSession().getAttribute("loginUser"); // 未登录一律跳回登录页,接口请求返回 401 if (user == null) { if (request.getRequestURI().startsWith("/api/")) { response.setStatus(401); } else { response.sendRedirect(request.getContextPath() + "/login"); } return false; } return true; } }

注册拦截器时要排除登录页、登录接口和静态资源这三类路径,excludePathPatterns("/login", "/api/login", "/static/**")。角色判断放在 Service 层做:比如发布考核任务的方法里先取 Session 中的loginUser.role,不是ADMIN就直接抛业务异常。这里不推荐拦截器里逐路径配置角色权限,因为绩效考核的接口权限粒度会随着流程调整频繁变化,放在 Service 方法里改起来更快。

4. 考评核心实现:评分录入、权重计算与结果定级的代码闭环

4.1 评分录入:事务里写明细,唯一索引挡住重复提交

评分页面提交的数据结构是“一条考核记录 + 被评人 + 多个指标得分数组”。保存时必须在同一个事务里完成两件事:插入所有评分明细、重算并更新汇总表。任何一步失败,都不能留下半个结果。

@Service public class AssessmentScoreService { @Transactional(rollbackFor = Exception.class) public void submitScore(ScoreSubmitDTO dto) { // 1. 校验考核记录存在且处于评分中 AssessmentRecord record = recordMapper.selectById(dto.getRecordId()); if (record == null || !"SCORING".equals(record.getStatus())) { throw new BusinessException("考核任务不存在或不在评分期"); } // 2. 逐条保存评分明细 for (IndicatorScore item : dto.getScores()) { AssessmentDetail detail = new AssessmentDetail(); detail.setRecordId(dto.getRecordId()); detail.setTargetUserId(dto.getTargetUserId()); detail.setScoreUserId(dto.getScoreUserId()); detail.setIndicatorId(item.getIndicatorId()); detail.setScore(item.getScore()); detailMapper.insert(detail); } // 3. 重算汇总,事务随方法提交或回滚 updateSummary(dto); } }

事务注解必须写rollbackFor = Exception.class,这是新手最容易忽略的参数。默认情况下 Spring 只对运行时异常回滚,检查异常(比如文件读写失败)不会触发回滚,导致明细写了一半、汇总没更新。另外,前端的dto.getScores()可能传空数组,Service 层要先做非空校验,否则插入循环直接跳过,汇总却是 0 分。

重复提交由 2.2 节的唯一索引兜底:并发双击或重复请求时,数据库会抛出DuplicateKeyException,在 Controller 捕获后统一返回“请勿重复提交”即可。如果项目里已经存在重复数据,先执行数据清理再加索引,否则加索引会直接失败。

4.2 加权计算与等级映射:把 Excel 公式搬进代码,别用 double

绩效汇总的逻辑在 Excel 里就是SUMPRODUCT(指标得分, 权重) / SUM(权重),搬进 Java 后要特别注意两点:权重归一化处理,以及用BigDecimal而不是double。double的浮点误差在报表里会显示成 89.999999,被领导问一次就长记性,这是血泪经验。

public void updateSummary(ScoreSubmitDTO dto) { AssessmentRecord record = recordMapper.selectById(dto.getRecordId()); // 该考核记录对应的指标权重表 List<AssessmentIndicator> indicators = indicatorMapper .selectByTemplateId(record.getTemplateId()); Map<Long, BigDecimal> weightMap = indicators.stream() .collect(Collectors.toMap( AssessmentIndicator::getId, AssessmentIndicator::getWeight)); BigDecimal total = BigDecimal.ZERO; List<AssessmentDetail> details = detailMapper .selectByRecordAndTarget(dto.getRecordId(), dto.getTargetUserId()); for (AssessmentDetail d : details) { BigDecimal weight = weightMap.get(d.getIndicatorId()); if (weight == null) { throw new BusinessException("指标权重未配置,请检查考核模板"); } total = total.add(d.getScore().multiply(weight)); } // 权重合计按 100 设计,归一化成百分制得分 BigDecimal finalScore = total.divide( BigDecimal.valueOf(100), 2, RoundingMode.HALF_UP); // 等级映射:A >= 90,B >= 80,C >= 60,D < 60 String grade; if (finalScore.compareTo(BigDecimal.valueOf(90)) >= 0) { grade = "A"; } else if (finalScore.compareTo(BigDecimal.valueOf(80)) >= 0) { grade = "B"; } else if (finalScore.compareTo(BigDecimal.valueOf(60)) >= 0) { grade = "C"; } else { grade = "D"; } summaryMapper.upsert(dto.getRecordId(), dto.getTargetUserId(), finalScore, grade); }

这段代码有两个隐式约定。第一,指标权重合计按 100 设计是业务侧硬性约束,模板维护接口里要校验权重总和等于 100,否则一个人的总分可能超过 100 或者偏低。第二,upsert采用INSERT ... ON DUPLICATE KEY UPDATE写进AssessmentSummaryMapper,汇总表上必须有(record_id, target_user_id)唯一索引,否则第二次评分会插入两条汇总而不是更新。权重计算不要做成黑匣子,线上出问题时要能根据明细手工复算,所以汇总表里保存total_score的同时,也把明细表留成可审计状态,方便反查。

4.3 结果查询与统计:按部门和周期出报表

考核结束后,管理员最关心的三个问题是:哪个部门平均分最高、A/B/C/D 各有多少人、个人排名怎么排。这类统计直接写在 Mapper 的注解 SQL 里,比在 Java 里循环聚合要清晰得多。

@Select("SELECT d.dept_name, " + " AVG(s.total_score) AS avg_score, " + " COUNT(CASE WHEN s.grade = 'A' THEN 1 END) AS a_cnt, " + " COUNT(CASE WHEN s.grade = 'B' THEN 1 END) AS b_cnt " + "FROM assessment_summary s " + "JOIN sys_user u ON u.id = s.target_user_id " + "JOIN sys_dept d ON d.id = u.dept_id " + "WHERE s.record_id = #{recordId} " + "GROUP BY d.dept_name " + "ORDER BY avg_score DESC") List<DeptStatVO> statByDept(@Param("recordId") Long recordId);

这条 SQL 的三个 JOIN 里,sys_user和sys_dept是绩效系统的基础资料表。如果 rar 包里没有这两张表,最常见做法是在assessment_summary里冗余一个dept_id字段,省掉 JOIN。模糊查询员工姓名时,参数要写成CONCAT('%', #{keyword}, '%'),不要直接拼字符串,防止 SQL 注入。统计报表的接口要加缓存或限制时间范围,绩效考核数据几年积下来,明细表几十万行时,无筛选的聚合查询会把数据库拖垮。

5. 部署与排查:java 启动失败、乱码与脏数据的四个现场

5.1 端口、JDK 与堆内存:java 启动失败怎么解决的三件套

考核系统的开发环境翻车,绝大部分集中在三个点:端口占用、JDK 版本不匹配、堆内存溢出。先看现象再对症下药。

端口占用:启动时控制台报Port 8080 was already in use。原因大多是上一次运行没停干净,或者机器上有别的服务占了 8080。排查命令是netstat -ano | findstr 8080,拿到 PID 后去任务管理器结束对应进程,或者干脆在application.yml里把server.port改成 8081。

JDK 版本不匹配:报UnsupportedClassVersionError或Invalid source release。Spring Boot 2.x 要求 JDK 8 或 11,Spring Boot 3.x 必须 JDK 17+。老 rar 项目如果是外部 Tomcat 部署,还要看 Tomcat 版本对应的 JDK 要求。这类问题看似玄学,本质就是编译环境和运行环境的 Java 版本不一致,改 IDEA 的 Project SDK 比改代码有用得多。

堆内存溢出:启动过程中报java.lang.OutOfMemoryError: Java heap space。常见做法是在 IDEA 的 Run Configuration 里加-Xms256m -Xmx1024m,外部 Tomcat 部署则改catalina.bat里的JAVA_OPTS。注意,热词里那种“堆调成 8000 还报错”的情况,多半不是堆不够,而是代码一次性查了全表或者定时任务死循环,先看日志里的报错堆栈定位代码,别跟堆参数较劲。

5.2 中文乱码与数据库连接串:两个最隐蔽的坑

页面查询出来全是问号,或者数据库报Illegal mix of collations,这类问题最气人,因为代码逻辑没毛病,但数据已经坏在库里了。排查顺序从下往上:先看建表语句是不是DEFAULT CHARSET=utf8mb4,再看 JDBC 连接串有没有带编码参数。

spring.datasource.url=jdbc:mysql://localhost:3306/assess_db?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai spring.datasource.username=root spring.datasource.password=your_password

连接串里的characterEncoding=utf8是必须的,serverTimezone=Asia/Shanghai是为了避免新版 MySQL 驱动时区报错。如果老项目跑在外部 Tomcat 上,还要在server.xml里给 Connector 加URIEncoding="UTF-8",否则 GET 请求的中文参数会乱。这三处配置一起改,乱码问题基本能一次解决。

5.3 编译期报错与依赖缺失:IDEA 里的假性翻车

把 rar 源码导入 IDEA 后满屏Cannot resolve symbol 'MybatisPlus',或者是cannot find symbol这类编译错误。原因通常是三个:Maven 没有刷新、本机 SDK 没切对、依赖包没下载完整。解决步骤很简单:右键pom.xml→ Maven → Reload Project,等右下角依赖下载完成后先 Build 一次。

要警惕另一种情况:解压后根本找不到pom.xml,全是.class文件。这说明 rar 里是编译后的 class 而不是源码,没法二次开发。遇到这种情况别浪费时间反编译,直接按第 2、3 章的结构重新搭工程。另外,老项目如果用的是javax.servlet,而新环境拉的是jakarta.servlet,也会出现符号找不到,这类历史包袱只能逐个文件替换包名。

5.4 考核数据对不上:周期重叠与重复评分的脏数据排查

最隐蔽的业务坑是考核周期重叠。管理员先建了一条 1 月 1 日到 1 月 31 日的月度考核,又顺手建了一条 1 月 15 日到 2 月 14 日的考核,同一个员工同一个评分来源就出现在两条记录里,汇总数据自然对不上。

SELECT a.id, b.id, a.period_start, b.period_end FROM assessment_record a JOIN assessment_record b ON a.template_id = b.template_id AND a.id < b.id AND a.period_start < b.period_end AND a.period_end > b.period_start

这条 SQL 能查出所有重叠的考核记录对。修复策略是先备份,再关闭后创建的记录,或者调整周期边界,不要直接 DELETE,删了以后连带明细全没,想恢复都没有后悔药。根治办法是在assessment_record表加一个约束,或者发布接口里先执行这段重叠查询再决定是否允许创建。汇总分和明细对不上的情况,大概率是指标权重版本不一致,即考核模板发布后指标又被改了,导致明细表里部分指标在权重表中找不到,需要把模板设计成不可变版本,修改指标就生成新模板。

6. 进阶:把系统从“能跑”做到“敢用”

6.1 上线前先跑一条反查 SQL

功能能跑不代表数据对。每次考核结束后,我习惯先跑一遍汇总反查 SQL,把明细表重算出来的总分和汇总表里存的总分对比,误差超过 0.01 就说明逻辑有 bug:

SELECT d.record_id, d.target_user_id, SUM(d.score * ind.weight) / 100 AS calc_score, s.total_score AS store_score FROM assessment_detail d JOIN assessment_indicator ind ON ind.id = d.indicator_id JOIN assessment_summary s ON s.record_id = d.record_id AND s.target_user_id = d.target_user_id GROUP BY d.record_id, d.target_user_id, s.total_score HAVING ABS(calc_score - store_score) > 0.01

这条 SQL 在数据量几十万时也能在几秒内出结果,是验证权重计算和汇总写入是否一致的兜底方案。

6.2 用 EasyExcel 做导入导出

绩效考核记录要留档签字,导出 Excel 是刚需。用 EasyExcel 的@ExcelProperty注解直接映射AssessmentSummary实体,导出考核表;导入指标模板时,先读取 Excel 到内存,校验权重总和等于 100 后再清空旧指标批量插入,整个过程用事务包住,防止导一半失败留下残缺模板。

6.3 从课设走向生产的三件事

第一件是日志,logback-spring.xml里把 SQL 执行日志单独输出到文件,线上定位“某个人的分数为什么不对”时能直接看到最终写入的明细;第二件是定时任务,用 Spring 自带的@Scheduled每月自动生成下月考核记录,省去管理员手动创建;第三件是部署,mvn package打成可执行 jar,丢服务器上java -jar跑,或者打成 tar 包上传解压后配合 Docker 跑 MySQL,都比拷 war 省心。我以前接过一个现成的绩效 rar,第一件事就是跑反查 SQL,结果发现旧字段名和数据库脚本对不上,白改了两天界面。后来养成习惯,先核对数据链路再做功能迭代。希望帮到你。

本文还有配套的精品资源,点击获取

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

Windows系统优化利器Dism++:C盘清理、驱动管理与完整实操指南

Windows系统用久了总会变慢&#xff0c;这是谁都用得上的痛点。网上各种优化工具五花八门&#xff0c;多数要么收费、要么捆绑推广&#xff0c;搞不好还把你系统改出一堆毛病。我自己在系统折腾这条路上踩过不少坑&#xff0c;最后长期留下的&#xff0c;反而是一个看起来其貌不…

作者头像 李华
网站建设 2026/10/9 3:03:26

Mac用快捷指令将MOV批量转M4A:无需ffmpeg,右键一键提取音频

上个月整理一批访谈素材&#xff0c;我又被一个老需求卡住了&#xff1a;手头全是QuickTime屏幕录制出来的MOV文件&#xff0c;每段十来分钟&#xff0c;我要的其实只有里面的人声讲解&#xff0c;但每次都得先打开软件、导出音频、改名、再扔进剪辑工程。试过在线转换网站&…

作者头像 李华
网站建设 2026/10/9 3:02:50

自验证框架让开源模型推理自我纠错,性能反超Fable 5

「自验证」框架让开源模型反超 Fable 5&#xff0c;冲上 GitHub 热榜&#xff1a;它到底做了什么&#xff1f;如果你这几天在刷 GitHub 热榜&#xff0c;大概率会刷到一个关键词&#xff1a;自验证框架&#xff08;Self-Verification Framework&#xff09;。这个项目做的事情很…

作者头像 李华
网站建设 2026/10/9 3:02:50

PHP老项目防SQL注入:360防注入修改类的原理与改造实践

简介&#xff1a;面向PHP开发者的Web安全防护改造包&#xff0c;针对SQL注入、XSS跨站脚本和CSRF跨站请求伪造等常见攻击&#xff0c;基于360安全思路提供代码修改类&#xff0c;适合初中级开发者在现有项目中快速套用。压缩包仅1KB&#xff0c;包含2个文件&#xff1a;readme.…

作者头像 李华
网站建设 2026/10/9 3:02:38

Codex CLI接入国产开源模型:OpenAI兼容API切换指南

从去年 OpeniAI 的 Codex CLI 正式发布之后&#xff0c;终端里“用自然语言驱动编程”的玩法就开始被越来越多的人接受。社区里经常调侃它就是 OpenAI 的“亲儿子”&#xff0c;因为新模型的能力总是优先在它身上落地。可在实际项目里&#xff0c;很多团队并不愿意把整份代码上…

作者头像 李华
网站建设 2026/10/9 3:02:38

从OpenAI迁到开源模型:用本地推理拿回自主权

OpenAI 的“亲儿子”&#xff0c;想要用中国开源模型拿回自主权这次我们聊的不是某个一键包&#xff0c;而是一个偏选型的话题&#xff1a;如果一个 AI 应用从诞生起就把核心能力挂在 OpenAI API 上&#xff0c;被圈内人叫成“OpenAI 亲儿子”&#xff0c;它现在想换一条路——…

作者头像 李华