简介基于SpringBoot与Vue技术栈的企业人事管理系统毕业设计资源面向计算机相关专业学生及需要快速搭建人事管理项目的开发者。系统覆盖员工信息、薪资、考勤、职位、招聘等核心模块员工信息支持按条件查询考勤可记录迟到、早退、请假并生成报表同时包含权限控制、数据备份、系统日志等辅助功能可满足课程设计或期末大作业的完整交付要求。资源共244个文件压缩包大小32.65MB以78个Java后端源码、Vue前端页面图片、SQL数据库脚本、XML及YAML配置、Markdown说明文档为主文件类型齐全项目结构清晰。已有28人学习浏览适合作为毕业设计参考。通过该资源可获取完整的前后端分离工程代码、数据库初始化脚本和项目配置说明有助于理解SpringBoot接口开发、Vue页面交互以及权限控制、日志记录等企业级功能落地实现。1. SpringBoot Vue 做企业人事管理系统为什么这个选题最容易翻车SpringBoot Vue 前后端分离的企业人事管理系统听起来是毕设里最「老实」的题目无非登录、员工台账、部门维护几个页面。但真正动手做过的都知道它比想象中坑多得多——Maven 依赖冲突、MySQL 时区报错、JWT 拦截器把预检请求拦了、前端刷新 404随便一个都能卡两天。这份资源把后端 Spring Boot、前端 Vue、数据库脚本和部署说明整个打包在一起跑起来就是一套完整可答辩的前后端分离工程。适合正在做毕业设计、课程设计、期末大作业的同学也适合想快速搭一个内部管理后台的同事直接拿来改业务。2. 模块和表先定好人事系统的五个核心域与数据库设计的取舍2.1 模块边界招聘、考勤、薪资这些模块不一定要全做很多人在设计人事系统时习惯把企业 HR 的完整功能都铺开招聘、培训、绩效、社保、考勤、薪资全建表结果表建了三十张真正能跑通的不到三分之一。答辩时老师随便问一张表的字段设计答不上来反而扣分。我的建议是把「部门管理、员工管理、用户与权限、考勤记录、薪资台账」这五个核心域做扎实比堆砌一堆空表更有说服力。这五个域之间是有业务先后关系的。部门是组织骨架员工挂在部门下面用户账号绑定某个员工用来登录和做权限判断考勤记录每天产生关联员工编号薪资按照员工基本工资和当月出勤天数计算。这个顺序也决定了数据库表结构的设计顺序先部门表再员工表再用户表最后考勤表和薪资表。代码层面的依赖也顺着这个方向走——员工 Service 依赖部门 Service考勤和薪资的查询接口都要 join 员工表。把这个链路理顺后面写接口就是顺着表走不用来回改。2.2 数据库设计部门、员工、用户三张主表的结构与外键原则三张主表的设计是整套系统的地基字段不宜多够业务用就行。部门表要支持树形结构因为大多数企业至少有两级部门。员工表是核心表编号、姓名、性别、部门、入职日期、在职状态六个字段基本覆盖列表展示和检索需求。用户表不要和员工表完全合并登录账号和员工信息分离后续做账号停用、密码重置都会更方便。表名关键字段说明sys_deptdept_id, dept_name, parent_id, order_num部门树parent_id 为 0 表示顶级部门sys_empemp_id, emp_no, name, gender, dept_id, phone, email, entry_date, status员工主表emp_no 作为业务唯一键sys_useruser_id, username, password, emp_id, status登录账号关联员工建表语句可以直接照着这份资源里给的 SQL 初始化脚本看核心表大致是下面这个结构CREATE TABLE sys_dept ( dept_id bigint(20) NOT NULL AUTO_INCREMENT, dept_name varchar(50) NOT NULL COMMENT 部门名称, parent_id bigint(20) DEFAULT 0 COMMENT 上级部门ID, order_num int(11) DEFAULT 0 COMMENT 排序号, PRIMARY KEY (dept_id) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4 COMMENT部门表; CREATE TABLE sys_emp ( emp_id bigint(20) NOT NULL AUTO_INCREMENT, emp_no varchar(20) NOT NULL COMMENT 员工编号, name varchar(20) NOT NULL COMMENT 员工姓名, gender char(1) DEFAULT 男 COMMENT 性别, dept_id bigint(20) DEFAULT NULL COMMENT 所属部门ID, phone varchar(20) DEFAULT NULL COMMENT 手机号, email varchar(50) DEFAULT NULL COMMENT 邮箱, entry_date date DEFAULT NULL COMMENT 入职日期, status tinyint(4) DEFAULT 1 COMMENT 1在职 0离职, PRIMARY KEY (emp_id), KEY idx_dept_id (dept_id) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4 COMMENT员工表;这里的重点在于 dept_id 只建普通索引不建物理外键。很多教材喜欢强调外键约束但实际开发里物理外键在批量导入数据、删除部门时会带来一堆连锁报错。员工表通过 emp_no 做业务唯一键这个字段在考勤表和薪资表里会被反复引用字符串索引查找速度也够用比直接用自增主键更直观——你在考勤表里看到EMP001不用反查就知道是谁。字符集统一用 utf8mb4避免录入生僻字或特殊符号时出现乱码。2.3 代码生成器的收益Mapper、Service、Controller 的一次性生成策略人事系统的 CRUD 接口占了总接口量的七成这一部分完全可以用代码生成器批量产出。这份资源里的常见做法是用 MyBatis 系列工具先连接数据库指定好表名前缀和实体类包路径一键生成 Entity、Mapper、Service 和基础 Controller然后再针对员工分页、考勤汇总这类复杂查询手动改 SQL。代码生成器的好处不只是省时间更关键的是命名风格统一。表名sys_emp生成实体类EmployeeMapper 接口方法名统一后面接手的同学翻代码的成本极低。毕设答辩时老师看到的是「分层规范、命名一致」而不是「每个 Controller 一套命名风格」。生成完以后重点工作量应该花在三个地方分页查询的查询条件组装、登录鉴权的拦截逻辑、考勤和薪资的统计 SQL。这三块是代码生成器替你做不了的也是答辩时最容易出彩的部分。如果你对生成器的包路径、模板不熟直接看资源里/src/main/resources/templates目录下的模板文件把实体类注释和 Swagger 注解的开关打开生成一次对比一下就知道该怎么调。3. 把工程跑起来Maven 构建、SQL 初始化和 Vue 联调的完整顺序3.1 环境版本匹配JDK、Maven、MySQL、Node 的参考清单前后端分离项目跑不起来的头号原因不是代码是环境版本对不上。Spring Boot 2.7.x 这代框架配 JDK 8 是最省事的组合Maven 建议用 3.8.xMySQL 用 8.0。前端 Vue 工程建议 Node 16 以上npm 用 8.x。如果本机装的是 JDK 17Spring Boot 2.7 也能跑但 Lombok 版本要同步升到 1.18.30 以上否则编译阶段直接报错。parent groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-parent/artifactId version2.7.18/version relativePath/ /parent dependencies dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-web/artifactId /dependency dependency groupIdcom.baomidou/groupId artifactIdmybatis-plus-boot-starter/artifactId version3.5.3/version /dependency dependency groupIdmysql/groupId artifactIdmysql-connector-java/artifactId scoperuntime/scope /dependency dependency groupIdio.jsonwebtoken/groupId artifactIdjjwt-api/artifactId version0.11.5/version /dependency /dependencies这段依赖里最需要注意的是 mybatis-plus-boot-starter 的版本。MyBatis-Plus 3.5.x 对 Spring Boot 2.x 的支持很成熟但如果把 Spring Boot 升到 3.x 甚至更高这个 starter 也要换成mybatis-plus-spring-boot3-starter光改版本号是不够的。后端模块如果也用 Gradle 构建依赖声明换成 implementation 关键字即可但建议优先用 Maven理由是这份资源的打包脚本和说明都基于 Maven少踩一个坑。3.2 后端启动application.yml 参数与数据库导入后端启动前先把 application.yml 里的数据源参数核对一遍。这里出问题的概率最高特别是从别人的电脑拷贝过来的工程密码、库名、时区三处基本都要改。server: port: 8080 spring: datasource: url: jdbc:mysql://localhost:3306/hr_system?useUnicodetruecharacterEncodingutf8serverTimezoneAsia/ShanghaiuseSSLfalseallowPublicKeyRetrievaltrue username: root password: 你的数据库密码 driver-class-name: com.mysql.cj.jdbc.Driver jackson: date-format: yyyy-MM-dd HH:mm:ss time-zone: GMT8 mybatis-plus: mapper-locations: classpath:/mapper/*.xml configuration: map-underscore-to-camel-case: true global-config: db-config: id-type: autourl 里的serverTimezoneAsia/Shanghai和characterEncodingutf8是必须保留的MySQL 8.x 驱动强制要求指定时区不写启动就报错。useSSLfalse是本地开发标准配置生产环境再考虑要不要开 SSL。allowPublicKeyRetrievaltrue是给 MySQL 8 密码认证用的很多本地连不上数据库的案例都是缺了这个参数。jackson 的日期配置负责后端返回的时间格式否则前端拿到的是一个带 T 的 ISO 字符串或者数组。启动前先导入数据库脚本顺序不能反。先建库建表再启动后端否则 MyBatis 初始化时找不到表会抛异常mysql -uroot -p sql/hr_system.sql导入完以后用 IDEA 打开后端工程等待 Maven 把依赖下载完。第一次下载比较久建议直接执行mvn spring-boot:run看控制台日志。看到 Tomcat started on port 8080 就说明后端起来了。这里能明显感受到 Spring Boot 自动装配的作用——你明明没配置 SqlSessionFactoryMyBatis-Plus 的 starter 通过spring.factories自动装配机制把数据源、SqlSessionFactory、Mapper 扫描全部配置好了这就是它比传统 SSM 省事的地方。3.3 前端启动依赖安装与 devServer 转发配置前端工程一般叫 hr-web 或者 hr-ui。打开终端进到目录先装依赖npm install如果安装过程报错绝大多数是 node_modules 缓存问题。删掉 node_modules 和 package-lock.json重新安装。npm install 完成后执行npm run serve默认会起在 3000 端口。这里有一个关键设计前后端分离开发时前端页面跑在 3000后端接口在 8080直接请求接口会触发浏览器跨域所以 Vue 工程里通常加了一段 devServer 转发配置——把以/api开头的请求转发到http://localhost:8080并且对路径做一次重写把/api前缀去掉这样后端 Controller 里的 RequestMapping 就不需要统一加/api前缀了。具体配置项是 target、changeOrigin 和 pathRewrite 三项很多资料会把 changeOrigin 写成可选项实际开发中必须设为 true不然后端拿到的是开发机地址日志里排查问题会绕一大圈。启动后建议在浏览器装一个 Vue DevTools 插件Network 面板里能看到请求从 3000 转发到 8080 的过程对排查跨域和请求路径问题非常直观。3.4 联调验证登录请求从浏览器到后端的完整链路前后端都起来以后打开浏览器访问http://localhost:3000用登录页输入账号密码打开 Network 面板看这条请求的完整链路import axios from axios const service axios.create({ baseURL: /api, timeout: 10000 }) service.interceptors.request.use(config { const token localStorage.getItem(token) if (token) { config.headers.Authorization Bearer ${token} } return config }) service.interceptors.response.use( response response.data, error { if (error.response error.response.status 401) { window.location.href /login } return Promise.reject(error) } ) export default service浏览器地址栏输入http://localhost:3000/login页面由 Vue Router 渲染点击登录按钮后axios 发出 POST 请求baseURL 是/api所以实际请求地址是http://localhost:3000/api/auth/logindevServer 的转发配置把这条请求原样转到后端的/auth/loginSpring Boot 收到后处理登录逻辑返回 JSONaxios 响应拦截器先拿到数据再交给页面组件。整个过程里前端不需要关心后端接口最终部署在哪里只需要约定好/api前缀和 token 的传递方式。验证成功的标志Network 面板里请求状态是 200响应体里有一个字符串 tokenlocalStorage 里多了一条 token 记录页面从 login 跳转到 dashboard。做到这一步前后端联调的环境就算彻底打通了后面所有业务功能的开发都建立在这个链路上。如果这一步卡住先别急着看业务代码99% 是环境配置问题。4. 核心代码走读JWT 登录、权限拦截与员工分页的联调细节4.1 JWT 工具类与登录接口token 生成与密码校验登录鉴权采用 JWT 是目前这类前后端分离项目的主流做法。服务端登录成功后签发一个带过期时间的 token前端每次请求把它放在 Authorization 头里后端拦截器解析校验。下面这段是核心的 token 工具类public class JwtUtil { private static final SecretKey KEY Keys.hmacShaKeyFor(hr-system-jwt-secret-key-2024.getBytes()); public static String createToken(Long userId, String username) { return Jwts.builder() .setSubject(username) .claim(userId, userId) .setExpiration(new Date(System.currentTimeMillis() 2 * 60 * 60 * 1000)) .signWith(KEY) .compact(); } public static Claims parseToken(String token) { return Jwts.parserBuilder() .setSigningKey(KEY) .build() .parseClaimsJws(token) .getBody(); } }签名密钥hmacShaKeyFor(hr-system-jwt-secret-key-2024.getBytes())要求密钥至少 32 字节字符串长度不够会抛异常。过期时间设成 2 小时对内部人事系统够用想让用户长时间在线就把时间改大或者做刷新 token 的逻辑。这里用的是 jjwt 0.11.x 的 API如果你在别的项目里看到Jwts.signWith(SignatureAlgorithm.HS512, key)这种写法那是旧版 API和当前这套不能混用。登录接口的代码逻辑比较直白先按用户名和 MD5 后的密码查用户表查到就签发 token查不到就返回错误。资源里默认用的是 MD5 加密这是毕设工程常见的折中方案好讲也好实现。如果你以后要把它当生产系统用建议换成 BCrypt加盐成本高很多不至于数据库被脱裤后密码明文暴露。4.2 拦截器实现鉴权为什么不用 Spring SecuritySpring Security 功能完整但对大部分人来说学习曲线太陡配置方式也绕。一个登录、一个角色判断的需求用 Spring MVC 的 HandlerInterceptor 几十行代码就能解决思路还更透明public class AuthInterceptor implements HandlerInterceptor { Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { if (OPTIONS.equals(request.getMethod())) { return true; } String token request.getHeader(Authorization); if (token null || !token.startsWith(Bearer )) { response.setStatus(401); return false; } try { Claims claims JwtUtil.parseToken(token.substring(7)); request.setAttribute(userId, claims.get(userId)); return true; } catch (Exception e) { response.setStatus(401); return false; } } }这段代码有四个细节要注意。第一OPTIONS 请求直接放行因为浏览器跨域请求会先发一个预检请求这个预检请求不会带 Authorization 头不放行的话前端所有请求都会报 401。第二token.substring(7)是因为前端约定的格式是Bearer加 tokenBearer 加空格正好 7 个字符。第三解析成功后把 userId 放进 request 属性后面 Controller 里通过request.getAttribute(userId)就能拿到当前登录人不用重复解析。第四拦截器只负责「是否登录」不负责「是否有权限」角色判断放在 Controller 层做避免拦截器里写复杂逻辑。4.3 员工分页查询MyBatis 分页插件参数与前端 Table 组件配合员工列表是人事系统的核心页面查询条件通常有姓名、部门、状态还要支持分页。这里用的是 MyBatis 分页插件代码极其简洁public IPageEmployee pageEmployee(EmpQuery query) { PageEmployee page new Page(query.getPageNum(), query.getPageSize()); LambdaQueryWrapperEmployee wrapper new LambdaQueryWrapper(); wrapper.like(StringUtils.hasText(query.getName()), Employee::getName, query.getName()) .eq(query.getDeptId() ! null, Employee::getDeptId, query.getDeptId()); return employeeMapper.selectPage(page, wrapper); }分页插件做的事情是在你调用 selectPage 之前拦下这条 SQL自动拼接LIMIT offset, size同时执行一条 COUNT 查询算出总条数。LambdaQueryWrapper 里第一个参数是条件表达式为 true 时才拼接这个查询条件所以姓名为空时不会生成LIKE %%这种空条件部门为空时不会生成dept_id null。这个写法比手动拼接字符串安全得多也直观。前端表格组件和这个接口的字段是严格对应的。el-table 的:data绑的是接口返回的 records 数组el-pagination 的 current-page 绑 pageNumpage-size 绑 pageSizetotal 绑 total。改页码时触发后端查询参数名必须和EmpQuery里的字段名一致否则后端拿不到分页参数。常见的低级错误是后端字段叫 pageNum前端传的是 page —— 这种问题在 Network 面板里一眼就能看出来请求参数里有个未定义字段。4.4 部门下拉联动树形接口与前端递归员工表单里的部门选择前端用 el-tree 或级联选择器后端返回的是树形结构。部门表只有 deptId 和 parentId 两个字段要拼成树需要做一次递归处理public ListDeptVO listDeptTree() { ListSysDept all deptMapper.selectList(null); MapLong, ListSysDept childMap all.stream() .collect(Collectors.groupingBy(SysDept::getParentId)); return buildTree(childMap, 0L); } private ListDeptVO buildTree(MapLong, ListSysDept childMap, Long parentId) { ListSysDept children childMap.get(parentId); if (children null || children.isEmpty()) { return new ArrayList(); } return children.stream().map(dept - { DeptVO vo new DeptVO(); vo.setId(dept.getDeptId()); vo.setLabel(dept.getDeptName()); vo.setChildren(buildTree(childMap, dept.getDeptId())); return vo; }).collect(Collectors.toList()); }核心思路是先查全量部门按 parentId 分组再从头节点递归往下挂。前端组件只需要接收[{ id, label, children }]这种结构就能直接渲染整棵部门树。这里值得注意的是流量控制部门表数据量通常几十条全量查出来没问题如果未来做成集团级系统部门上万条就得改成懒加载模式点开一层查一层。毕设和中小型企业内部系统就用全量递归最可靠代码少、调试容易。5. 避坑记录从 MySQL 时区到 Vue Router 刷新 404 的五个坑5.1 环境与数据类的坑坑一启动报The server time zone value Öйú±ê׼ʱ¼ä is unrecognized现象后端启动时或第一次查数据库时抛异常报错里能看到一段乱码后面跟着unrecognized or represents more than one time zone。原因MySQL 8.x 的驱动要求显式指定时区而本机的 MySQL 默认时区是系统时区驱动不认这个值。很多教程里给的连接串没有带时区参数照抄就翻车。解决在 jdbc url 里加上serverTimezoneAsia/Shanghai。如果你用的连接串是从老项目里拷贝的可能写的是serverTimezoneGMT%2B8这个值在部分驱动版本里也能用但统一改成 Asia/Shanghai 最省事。坑二前端拿到的日期是2024-01-01T00:00:00或一串数字现象员工列表里入职日期显示成一串类似数组的格式或者带字母 T 的 ISO 字符串和页面设计的2024-01-01完全不搭。原因后端返回的是 LocalDate 或 LocalDateTimeJackson 默认序列化格式不是前端想要的。LocalDateTime 默认会序列化成带 T 的格式LocalDate 在某些版本里会序列化成数组。解决在 application.yml 里配置 jackson 的 date-format 和 time-zone覆盖默认序列化行为。如果某个字段要单独指定格式在该字段上加JsonFormat(pattern yyyy-MM-dd)。配置完以后要重启后端再验证远程热部署不一定生效。坑三npm install 报错或者启动后页面白屏现象前端依赖装到一半报错或者装完以后npm run serve一启动就白屏控制台里一堆模块解析失败。原因node_modules 是从别的电脑上拷过来的路径和依赖版本对不上或者是本机 Node 版本太高和项目里用的 Vue CLI 版本不兼容。解决直接删除 node_modules 和 package-lock.json重新执行 npm install。如果项目是用 Vue CLI 创建的Node 16 是比较稳的版本Node 18 以上部分老插件会报 OpenSSL 相关的错误这时可以尝试把启动命令改成NODE_OPTIONS--openssl-legacy-provider npm run serve但根治方案还是切换 Node 版本。5.2 联调与部署类的坑坑四登录成功后所有请求都 401Network 里能看到两个请求现象Network 面板里同一个 URL 出现两条请求第一条是 OPTIONS 请求状态 401第二条 GET 或 POST 请求也可能跟着失败。原因浏览器跨域时先发预检请求这个 OPTIONS 请求不会带 Authorization 头直接被我们自定义的拦截器拦下来返回 401。解决在拦截器 preHandle 方法的最前面判断请求方法OPTIONS 直接 return true 放行。同时检查后端的跨域配置把 Authorization 加进 allowedHeaders。如果项目里还有全局过滤器处理 XSS 或文件上传也要确认是否误拦截了预检请求过滤器链的顺序错一个后端就少一个想不到的 401。坑五页面部署后能访问首页一刷新就 404现象前端打包后部署到 Nginx访问http://ip:8080/正常点菜单跳转也正常但按 F5 刷新当前子路由页面变成 404。原因Vue Router 用的是 history 模式路由/employee/list在服务端没有对应的物理文件刷新时服务器找不到 index.html 就返回 404。解决在 Nginx 配置里加一个 try_files 规则把所有路径都回退到 index.html由前端路由接管server { listen 80; server_name localhost; location / { root /usr/share/nginx/html; index index.html; try_files $uri $uri/ /index.html; } }如果部署方式是打成 jar 放在 Spring Boot 的 static 目录里这种方案在刷新时同样会 404处理办法是让后端把非接口路径转发到 index.html。最简单可靠的方案仍然是使用 hash 模式路由url 里多个#兼容性最好但大部分人更愿意保留 history 模式那就必须配上 try_files 规则。6. 交付前最后一道工序用 curl 冒烟脚本和 Docker 做验收6.1 冒烟脚本登录、查列表、加一条记录三条命令验证项目做完了交接之前最好写一个冒烟脚本把最关键的三条链路串起来测一遍。手动点页面容易漏脚本可以反复跑还能给答辩老师现场演示。#!/bin/bash BASEhttp://localhost:8080 TOKEN$(curl -s -X POST $BASE/api/auth/login \ -H Content-Type: application/json \ -d {username:admin,password:admin123} \ | python3 -c import sys,json; print(json.load(sys.stdin)[data])) if [ -z $TOKEN ] || [ $TOKEN null ]; then echo 登录失败先看后端日志 exit 1 fi curl -s $BASE/api/emp/list?pageNum1pageSize10 \ -H Authorization: Bearer $TOKEN curl -s -X POST $BASE/api/emp \ -H Content-Type: application/json \ -H Authorization: Bearer $TOKEN \ -d {empNo:T001,name:测试员工,deptId:1,entryDate:2024-06-01}脚本从头到尾验证了三件事账号密码能不能登录、token 能不能被后端识别、员工新增接口能不能写入数据。登录接口的返回值结构要和脚本里 python 解析的路径一致如果返回结构是{code,data,token}这种脚本就要对应改。这个脚本在 Windows 上跑不了需要在 Git Bash 或者 Linux 环境里执行。跑通以后把输出交给对方比口头说「我测过了」有说服力得多。6.2 后端 jar 包的 Docker 部署与前端 dist 的 Nginx 配置交付时如果对方要求部署到服务器Docker 是最省心的方式。后端打包成 jar 以后写一个精简的 DockerfileFROM openjdk:8-jre WORKDIR /app COPY target/hr-server-1.0.0.jar app.jar EXPOSE 8080 ENTRYPOINT [java, -jar, app.jar, --spring.profiles.activeprod]对应地application-prod.yml 里改数据源地址和密码把数据库连接串指向服务器上的 MySQL。前端打包npm run build产出 dist 目录直接挂到 Nginx 容器里同时把前面那条 try_files 配置加到 server 块中。前后端用两个容器跑用 docker-compose 一起编排是最常见的方式一份 compose 文件把 MySQL、后端、前端三个服务都定义清楚服务器上一条docker-compose up -d全部拉起。我不建议在这时候把时间花在研究编排细节上先把 jar 和 dist 分别跑通再考虑合并编排否则三个服务一起出问题排查范围会非常大。从这里能看出这套工程交付的完整边界开发时前端走 devServer 转发调后端部署时前端 dist 由 Nginx 托管后端以 jar 形式独立运行两边都用环境配置区分开发和生产。也就是说只要你把冒烟脚本跑通部署到哪一台机器上都能复现这个验证过程这才算真正交付完。从那以后我每次接手前后端分离的毕设工程第一步永远先看 application.yml 和 SQL 初始化脚本再用 curl 把登录链路跑通跑不通绝不往下看业务代码。这个习惯帮我避开了一堆「看起来能跑、一部署就废」的坑希望帮到你。本文还有配套的精品资源点击获取
企业数字化 ERP 产品动态
相关推荐
WinError 126解决指南:Python DLL加载失败的完整排查 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/26 19:28:59
抖音批量采集实战:Python逆向API与签名算法解析 1. 项目概述:一个真正能跑起来的抖音批量下载工具到底长什么样? DouK-Downloader不是某个神秘黑盒软件,也不是打着“免登录”旗号实则调用第三方中转服务的网页工具。它是一套基于Python构建、面向开发者与数据需求方的本地化解决方案&#… · 2026/9/26 19:28:52
IEEE 802.11协议培训文档整理指南:帧结构、连接漫游与安全机制 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/26 19:28:52
在线网页制作系统小彬被黑挂马?5个安全注意事项保平安 在线网页制作系统小彬被黑挂马?5个安全注意事项保平安 网站被黑挂马却毫无察觉,这不仅是噩梦,更是信任崩塌的开始。很多用在线网页制作系统小彬建站的朋友,往往只盯着页面好不好看,忽略了底层的代码安全。一旦服务器中了木马,首页瞬间变成赌博或色情网… · 2026/9/27 1:01:30
网站旁边的小图标怎么做的?用免费工具省3000元避坑指南 网站旁边的小图标怎么做的?用免费工具省3000元避坑指南 很多刚起步的创业者,盯着浏览器地址栏旁边那个不起眼的小图标(Favicon),心里直打鼓:这东西到底怎么弄?是不是得找开发加钱?更让人头大的是,网站还没上线,ICP备案流程就像一团乱… · 2026/9/27 1:01:23
基于PyTorch的鞋面缺陷识别:CNN模型训练与产线部署实战 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/27 1:01:16
用VBA在Word中调用豆包API:实现文档润色与翻译的自动化 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/27 1:01:16
Excel快速提取所有工作表名称:宏表函数、VBA与Python实战指南 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/27 1:01:16
ESD S20.20-2021标准解读:从EPA接地到符合性验证的落地实践 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/27 1:01:16
MATLAB雷达信号脉冲压缩仿真:LFM线性调频、匹配滤波与距离分辨率实现 简介:这套Matlab仿真工具完整呈现雷达信号脉冲压缩过程,从线性调频(LFM)信号生成、目标回波仿真到匹配滤波压缩处理均有可运行代码支撑,面向电子信息工程、计算机、数学等专业学生,适用于课程设计、期末大作… · 2026/9/27 0:00:01
汕头网站建设制作厂家避坑指南:5大注意事项救急 汕头网站建设制作厂家避坑指南:5大注意事项救急 改个需求建站公司拖一周,这种憋屈事我见得太多了。 很多汕头老板找本地建站团队,签合同前看着方案挺美,一上线就变脸。 今天不聊虚的,直接拆解找 汕头网站建设制作厂家 时的5个核心 注意事项… · 2026/9/27 0:00:01
多模态虚假新闻检测实战:BERT+ResNet双塔与对比学习 简介:基于PyTorch的多模态虚假新闻检测项目完整代码包,面向自然语言处理与计算机视觉交叉方向的开发者、科研人员及毕业设计选题者,解决社交媒体中文本与图像联合识别虚假新闻的问题。系统以BERT预训练模型提取文本语义特征,以Res… · 2026/9/27 0:00:01
MATLAB雷达信号脉冲压缩仿真:LFM线性调频、匹配滤波与距离分辨率实现 简介:这套Matlab仿真工具完整呈现雷达信号脉冲压缩过程,从线性调频(LFM)信号生成、目标回波仿真到匹配滤波压缩处理均有可运行代码支撑,面向电子信息工程、计算机、数学等专业学生,适用于课程设计、期末大作… · 2026/9/27 0:00:01
汕头网站建设制作厂家避坑指南:5大注意事项救急 汕头网站建设制作厂家避坑指南:5大注意事项救急 改个需求建站公司拖一周,这种憋屈事我见得太多了。 很多汕头老板找本地建站团队,签合同前看着方案挺美,一上线就变脸。 今天不聊虚的,直接拆解找 汕头网站建设制作厂家 时的5个核心 注意事项… · 2026/9/27 0:00:01
多模态虚假新闻检测实战:BERT+ResNet双塔与对比学习 简介:基于PyTorch的多模态虚假新闻检测项目完整代码包,面向自然语言处理与计算机视觉交叉方向的开发者、科研人员及毕业设计选题者,解决社交媒体中文本与图像联合识别虚假新闻的问题。系统以BERT预训练模型提取文本语义特征,以Res… · 2026/9/27 0:00:01