ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

企业级车辆管理系统源码拆解:SpringBoot+Vue全栈实战指南

企业级车辆管理系统源码拆解:SpringBoot+Vue全栈实战指南 最近这几个月陆陆续续有开发朋友给我发同一个链接问的是同一件事“这套企业级车辆管理系统源码到底能不能直接用”我点开一看SpringBootVueMyBatisMySQL标准的原生技术栈没有整花活。问题问得多了我就想把话摊开说清楚——一套挂着“企业级”名头的车辆管理系统背后到底有多少门道源码拿到手里哪些部分可以直接抄哪些部分必须二次开发SpringBootVueMyBatisMySQL这套组合在企业内部系统里为什么被反复使用又有哪些细节坑等着你踩。这篇文章不写源码逐行注释也不贴全量代码而是以这套企业级车辆管理系统的架构为主线讲清楚业务边界、表结构设计、MyBatis实战、Vue权限控制和部署上线的完整链路。如果你正在挑选车辆管理系统模板做二次开发或者打算用这个技术栈做毕业设计、企业内部后台又或者单纯想搞明白SSM前端分离架构在企业项目里到底怎么写才不翻车这篇应该能把你的疑问串起来。1. 先别急着看代码这套系统解决的是车队的哪些真实问题1.1 “企业级”和“单机版”的差别体现在哪“企业级”这个前缀在源码下载站里已经被用滥了但落到车辆管理系统上它确实有一些硬指标。车辆管理系统不是简单的车辆增删改查。企业自己有车队、有专职司机、员工要申请用车、后勤要审批、财务要核算油费和维修费这套东西的本质是“车辆资产全生命周期管理”加上“用车审批流程”。从车辆购置建档、保险年检到派车调度、出车回车、维修保养、违章处理再到按部门统计用车成本是一条完整的数据链。所谓“企业级”和“课程设计级”“单机演示版”的区别我总结成五点权限模型不是表单一套登录就完事而是超级管理员、车管员、调度员、驾驶员、普通员工按角色区分数据权限和操作权限。审批流用车申请不是直接改数据库而是要走到待审批、已批准、已驳回、出车中、已回车这样的状态流转。数据字典车辆类型、状态、费用类型这些枚举值不是写死在代码里而是存在字典表能维护扩展。操作审计谁在什么时间改了什么字段出车单谁批的车辆状态谁变的要有迹可循。成本核算每辆车的油耗、维修、保险、罚款按部门或按项目分摊这是老板真正关心的东西。如果你拿到的源码只做到了车辆表和派车单表的CRUD那它离“企业级”还差着十万八千里。真正有价值的部分恰恰是这套权限、审批、统计报表的骨架。1.2 核心业务模块拆解从车辆档案到成本核算我接手过的企业车辆管理系统核心业务模块大概是这样几个车辆档案管理车牌号、品牌型号、车辆类型轿车/SUV/商务车/货车、座位数、排量、发动机号、车架号、购置日期、所属部门、责任人、当前状态。状态一般分为可用、派车中、维修中、停用、已报废。驾驶员管理驾驶证号、准驾车型、驾驶证有效期、从业资格证、联系方式、当前是否在岗。有效期临期提醒是做这个模块必须留的口子。派车管理员工提交用车申请用车事由、目的地、预计出发和回场时间、乘车人数调度员审批后指定车辆和驾驶员出车时登记起始里程回车时登记结束里程系统自动计算本次里程。维修保养管理维修项目、保养类型日常保养/大保、费用、维修厂、下次保养里程或时间提醒。保险与年检管理交强险、商业险的起止日期、保险公司、年检到期日提前30天、15天、7天自动提醒。违章管理违章时间、地点、扣分、罚款金额、处理状态、责任人。成本统计按月度、按部门、按车辆汇总油耗、维修费、路桥费、罚款算出单车百公里油耗和单车月均成本。我在最开始设计这套系统的时候犯过一个错——把车辆状态和派车单状态混在一张表里结果车辆明明在维修中派车单还能被审批通过。后来把“车辆状态”和“派车单状态”拆开用状态机去约束联动关系这个核心问题才算解决。1.3 角色模型与状态机设计角色模型上我一般把用户分五类超级管理员管系统配置、用户维护、数据字典、菜单分配不参与业务。车管员/调度员管车辆档案、驾驶员档案、审批派车单、人工调车、看统计报表。驾驶员接收派车任务登记出车/回车信息提交维修申请。普通员工申请用车、查看自己的申请进度。审计/财务只看成本数据和车辆使用台账没有任何写操作权限。这个模型的灵魂在于“角色-菜单-按钮”三层权限而不是简单的“管理员和普通用户”二分。状态机设计是整个系统最容易写出一堆if-else的地方。我建议用两条状态链并且单独建常量类或枚举类去约束车辆状态链可用 - 派车中 - 可用可用 - 维修中 - 可用可用 - 停用。派车单状态链待审批 - 已批准 - 出车中 - 已回车 - 已完成其中任何状态都可以被已取消/已驳回终结。如果要支持“用车超过3天需要部门负责人和车管员双审批”这种需求别急着引入Flowable或Activiti流程引擎。对于车辆管理这种轻量审批场景自己写一个approve_record表记录每个节点的审批人和审批意见状态机上多挂一个“等待第二审批人”状态就够用了。引入重量级流程引擎半个项目的复杂度都会转移到流程部署和流程图维护上得不偿失。2. 技术栈选择的真实逻辑SpringBootVueMyBatisMySQL为什么被反复使用2.1 每个组件干的事情这套技术栈其实可以理解成“一条流水线”SpringBoot负责后端基础设施控制反转、依赖注入、自动配置、内嵌Tomcat、事务管理、接口暴露。它最大的价值是让开发者不用再处理大量XML配置一个application.yml把数据源、端口、日志全部搞定打包成单jar直接部署。Vue负责前端界面组件化开发数据驱动视图配合Element UI或Element Plus组件库后台管理页面的表格、表单、弹窗、树形菜单几乎都是现成轮子。MyBatis负责数据库访问把SQL写在XML里让SQL对开发者完全透明。复杂查询、多表关联、统计报表写起来直接调优也直接。MySQL负责数据落地开源免费、生态成熟、运维资料多对中小型企业内部系统来说性能和稳定性完全够用。这四个组件不是最前沿的但是它们拼在一起恰好覆盖了企业管理系统最核心的几个诉求开发效率高、SQL可控可调优、前后端分工明确、部署运维简单。2.2 为什么不选JPA、不选Spring Cloud很多人问过我为什么不直接用JPA/Hibernate我的回答很直接——车辆管理系统有太多统计SQL。JPA确实在单表CRUD上非常优雅但一旦遇到“按部门汇总月度用车次数、百公里油耗、维修费用排名”这类报表需求JPQL自动生成的查询要么性能拉胯要么语句长到根本没法维护。MyBatis把SQL主动权交还给开发者一对多、多对多的结果映射也足够直观团队里哪怕是个刚入职的新人打开XML文件也能看懂这个查询到底在干什么。还有人问现在不都流行微服务吗为什么不拆成Spring Cloud我的看法是企业车辆系统通常跑在内网使用人数从几十到几千数据量撑死百万级。单体应用加缓存加一套良好的SQL完全能稳住。硬拆成六个微服务服务注册发现、配置中心、链路追踪、分布式事务全都要上凭空多出一堆维护成本。对这种内部业务系统来说微服务带来的复杂度是负资产。2.3 版本选型的坑JDK、SpringBoot 3.x、Vue 2/3、MySQL 8.0选型很容易版本选型才是真正容易踩坑的地方。这块我必须单独说因为源码下载站上的项目版本经常是老掉牙的。SpringBoot 2.x还是3.x如果你拿到的源码是SpringBoot 2.x的老结构先别急着升3.x。SpringBoot 3.0要求JDK17、命名空间从javax.*改成jakarta.*很多老依赖里的javax.servlet直接报ClassNotFoundException。SpringBoot 2.7.18是2.x系列的最后一个版本安全更新还在跑老源码最稳的就是先把SpringBoot固定到2.7.18而不是盲目升3。Vue 2还是Vue 3Vue 2.7在2023年底停止维护新项目直接上Vue3Element Plus。但如果拿到的源码是Vue2Element UI也别急着整体重构老项目在维护期内能跑就继续跑。我的经验是老项目新增页面继续用Vue2保持一致全新项目才上Vue3两头并行不冲突。MySQL 5.7还是8.08.0默认认证插件是caching_sha2_password老驱动连不上报Public Key Retrieval is not allowed。这不是代码问题是驱动版本问题。要么把mysql-connector-java升到8.0.33要么在JDBC URL里加allowPublicKeyRetrievaltrueuseSSLfalse。5.7还有人在用能用但新部署建议直接8.0。3. 数据库模型与索引实践车辆管理系统的数据底座3.1 车辆档案、派车单、维保记录三张核心表怎么定数据库设计是这类源码里最有含金量的部分。我从实际项目里抽了三张核心表来讲。第一张是vehicle_info车辆信息表字段大致是id主键、vehicle_no车牌号、brand品牌、model型号、vehicle_type车辆类型、seat_count座位数、engine_no发动机号、vin车架号、buy_date购置日期、dept_id所属部门、driver_id当前责任人、status车辆状态、del_flag删除标记、create_time和update_time。注意车辆类型和状态都用TINYINT存数字再用字典表解释数字含义不要直接存“可用”“维修中”这种字符串。字符串枚举在业务扩展时就是灾难。第二张是dispatch_order派车单字段包括id、order_no派车单号、apply_user_id申请人、vehicle_id车辆ID、driver_id驾驶员ID、use_reason用车事由、destination目的地、passenger_count乘车人数、plan_start_time预计出发、plan_end_time预计回场、real_start_time实际出发、real_end_time实际回场、start_odo起始里程、end_odo结束里程、total_odo本次里程、status状态。这张表是整个系统的业务中枢几乎所有报表统计都从它出发。第三张是maintain_record维修保养记录字段包括id、vehicle_id车辆ID、maintain_type保养类型、maintain_date维保日期、mileage维保时里程、cost费用、factory_name维修厂、next_maintain_date下次保养日期、remark备注。这三张表的关联逻辑是dispatch_order通过vehicle_id挂到vehicle_info通过driver_id挂到driver_infomaintain_record通过vehicle_id挂到车辆统计报表统一以dispatch_order为主表左连接车辆和部门表。3.2 软删除、唯一索引、审计字段的处理细节企业系统里删除操作一般不用物理删除而是del_flag软删除。但这里有一个非常隐蔽的坑如果vehicle_no字段上有唯一索引软删除后再录入同一车牌的新车就会触发唯一索引冲突插入失败。我踩过这个坑之后的解法是删除时把del_flag从0改成主键id。这样默认del_flag0表示未删除删除后del_flagid同车牌重复录入时唯一索引不再冲突。这个技巧对用户表、部门表、车辆表这类有唯一标识的主数据都适用。审计字段方面我建议create_time用数据库默认值CURRENT_TIMESTAMPupdate_time用ON UPDATE CURRENT_TIMESTAMP自动更新减少应用层代码。如果你用的是MyBatis-Plus也可以用它的字段自动填充功能两种方式选一种就行别同时搞不然数据不一致。3.3 让查询快的关键索引设计、排序与慢查询车辆管理系统的查询高频场景是车辆列表按状态过滤、按部门过滤、按车牌模糊搜索派车单按时间范围查询、按申请人查询。索引设计围绕这三个高频条件来建。比如vehicle_info表上我会建一个联合索引(status, dept_id, create_time DESC)匹配“查某部门下某状态的车辆”这种最常见的列表查询。dispatch_order表上(vehicle_id, plan_start_time)和(apply_user_id, plan_start_time)各建一个普通索引对应行车记录统计和个人申请记录查询。排序上的一个典型坑是如果表里有create_time索引但你在WHERE里写DATE(create_time) 2025-01-01这个索引就废了MySQL只能全表扫描。正确写法是范围查询create_time 2025-01-01 00:00:00 AND create_time 2025-01-02 00:00:00。我一直建议项目早期就把slow_query_log打开long_query_time设成1秒。车辆管理系统平时不觉得到了月底做成本报表统计的时候几条没走索引的大表关联查询会把数据库拖到接口超时。慢查询日志是我排查这类问题时的第一工具。4. 后端落地的关键MyBatis在真实项目里怎么用才能不翻车4.1 Mapper接口XML的配合逻辑MyBatis的企业级用法核心就是Mapper接口 XML文件分工。接口里定义方法签名XML里写SQL两者通过namespace和statementId对应。这套写法最大的好处是SQL对开发者完全透明调优时直接看XML就行。我见过很多团队用注解写SQL短查询没问题但动态SQL一复杂Select里面塞一堆script标签可读性直线下降。XML单独拆出来还可以做到改SQL不重新编译项目开发环境下。这里有几个对应关系必须一一对上否则启动就报Invalid bound statement (not found)namespace必须等于Mapper接口的全限定名。XML里的id必须等于接口方法名。接口方法的参数类型、返回类型要和XML里parameterType、resultType匹配。Mapper XML文件要放在能被编译到target/classes的目录下。多模块项目里XML漏打包是我见过最高频的问题。4.2 动态SQL和分页写得好是效率写不好是深渊车辆列表高级搜索十个查询条件八个可空这种场景就是MyBatis动态SQL的看家本领。我贴一段实际用的车辆分页查询select idselectVehiclePage resultTypecom.demo.vehicle.dto.VehicleDTO SELECT v.*, d.dept_name FROM vehicle_info v LEFT JOIN sys_dept d ON v.dept_id d.id where if testvehicleNo ! null and vehicleNo ! AND v.vehicle_no LIKE CONCAT(%, #{vehicleNo}, %) /if if testdeptId ! null AND v.dept_id #{deptId} /if if teststatus ! null AND v.status #{status} /if if teststartTime ! null AND v.create_time gt; #{startTime} /if if testendTime ! null AND v.create_time lt; #{endTime} /if /where ORDER BY v.create_time DESC /selectwhere标签会自动处理掉第一条件前面的AND这个设计很贴心但要注意车牌号的%abc%双侧通配符是走不了索引的。数据量小没事数据量大了就得考虑全文索引或者搜索引擎方案。状态、部门这种等值条件建议和排序字段组合成联合索引。分页上企业项目中我用PageHelper比较多用法是PageHelper.startPage(pageNum, pageSize)之后紧跟Mapper查询。但PageHelper有脾气几个坑必须知道startPage和真正查询之间不能插入别的SQL否则分页参数会被其他查询消费掉。多数据源环境下PageHelper的ThreadLocal有串参数风险要用PageHelper.clearPage()兜底。LIMIT 100000, 20这种深分页性能极差。数据量大了以后改成先取MAX(id)或游标方式再分页能快一个数量级。4.3 缓存到底开不开MyBatis三级缓存体系实测“MyBatis缓存”是很多人面试时倒背如流、实际项目却用不明白的模块。我直接说结论。一级缓存是SqlSession级别的默认开启。Spring和MyBatis整合后每次Service方法基本都会新建SqlSession所以跨Service调用时一级缓存基本共享不到意义有限。二级缓存是namespace级别的默认关闭。我个人的实践是企业管理系统里二级缓存一律不开。原因很简单——两张表关联查询结果缓存在两个Mapper的namespace里只要其中一张表的数据更新另一个Mapper的缓存不会自动失效你查出来的就是脏数据。除非你能保证这个表只有唯一的Mapper在访问否则别碰二级缓存。那企业项目里的缓存怎么做我的做法是统计报表这种读多写少的数据用Redis手动缓存设置60秒或5分钟过期由Service层自己控制清空列表查询高频且实时性要求不高的比如部门树、字典项Redis存JSON或直接本地Caffeine。比起MyBatis的二级缓存应用层缓存的可控性和可观测性强得多。4.4 自定义Configuration、TypeHandler与拦截器扩展MyBatis真正值钱的能力在扩展点上。热搜词里经常有人搜“mybatis中自定义configuration”“mybatis中xmlconfigbuilser”说明很多人卡在配置和原理上了。先说XMLConfigBuilder。它是MyBatis启动时解析mybatis-config.xml的入口按照XML里的节点顺序把properties、settings、typeAliases、typeHandlers、environments、mappers逐个加载进全局Configuration对象。如果你发现某个配置不生效大概率是XML节点顺序错了——比如settings节点写在了environments后面XMLConfigBuilder已经处理完那一阶段自然就忽略了。再说两个我常用的扩展点TypeHandler处理数据库字段和Java对象的类型映射。比如车辆JSON扩展字段存在MySQL的json类型里Java端想直接拿到ListString或对象就写一个自定义TypeHandler在setParameter里做序列化在getResult里做反序列化。InterceptorMyBatis的四大对象Executor、StatementHandler、ParameterHandler、ResultSetHandler都能被拦截。我实际用过的场景包括拦截Executor.query统计慢SQL执行时间拦截StatementHandler.prepare给SQL自动追加数据权限条件比如“非管理员只能查自己部门的车辆”拦截ParameterHandler给插入SQL自动填充create_time和update_time。自定义拦截器要注意的是Intercepts注解里args的声明必须和真实方法签名完全一致否则不生效。另外拦截器执行顺序和定义顺序有关多个拦截器叠加的时候顺序错了会改出意想不到的SQL。4.5 事务边界多表联动下的正确姿势车辆管理业务里事务边界很容易划错。最典型的是派车审批更新派车单状态为“已批准”、把车辆状态改成“派车中”、给驾驶员生成一条待出车任务这三件事必须在一个事务里。如果拆成三个Service方法分开调中间任何一步失败数据就处于“派车单批了但车辆还是可用”的中间态。Transactional默认只在RuntimeException和Error触发回滚受检异常不会回滚。我见过太多人在这上面翻车代码里try-catch吞掉异常或者捕获了IOException没继续向上抛事务形同虚设。还要注意同类内部方法调用导致的事务失效。this.approveOrder()直接调用同类里的Transactional方法事务注解是不生效的必须通过代理对象调用或者把事务方法抽到另一个Service里。遇到这种情况用TransactionTemplate写编程式事务反而更直接transactionTemplate.execute(status - { dispatchOrderMapper.updateStatus(orderId, APPROVED); vehicleMapper.updateStatus(vehicleId, 2); taskMapper.insertDriverTask(vehicleId, driverId); return null; });并发场景下审批操作最好对派车单行加锁SELECT ... FOR UPDATE防止两个调度员同时对同一张单子做了不同操作。这个我是在生产环境被坑过一次才补上的两个人同时点了“通过”结果状态被覆盖车辆被派给了两个驾驶员。5. Vue端的工程化细节动态路由、按钮权限与一体化打包5.1 环境准备Node版本、代理配置、依赖安装Vue工程这块先解决环境再聊代码。很多人卡在第一步npm run dev跑不起来报错还不是语法错误而是Node版本不匹配。Vue3项目要求Node 16以上Vue2项目最好用Node 14到16之间Node 18跑老项目偶尔会出OpenSSL相关的构建报错。处理方式是给Node挂上NODE_OPTIONS--openssl-legacy-provider或者用nvm切换版本我一般直接用nvm省心。依赖安装慢是另一大痛点。npm config set registry https://registry.npmmirror.com把镜像切换一下基本能解决大多数拉包慢或超时的问题。如果项目里已经用了pnpm那就统一用pnpm不要混用npm和pnpm不然node_modules里会出现重复依赖构建结果五花八门。开发环境跨域也要提前配好。Vue项目默认端口是8080或5173后端接口在8081浏览器直接请求必然跨域。在vue.config.js里配devServer.proxy把/api开头的请求代理到后端地址就能绕开跨域。这个配置和上线部署的nginx反向代理逻辑一致开发环境不配好后面联调会浪费大量时间。5.2 菜单与权限的落地方式Vue端的权限控制我见过不少“demo项目”的做法——登录后不管什么角色router里全部路由都注册了只是菜单隐藏了一部分。这种做法安全性为零因为用户直接改URL就能访问未授权页面。正确做法是动态路由加按钮级权限链路是用户登录后端返回token和用户信息。前端把token存进pinia或vuex和localStorage。路由守卫router.beforeEach里判断没有token就跳登录页有token但菜单没加载过就调用getUserMenus接口拿菜单树用router.addRoute逐个动态注册。注册完成后再执行一次next({ path: to.fullPath, replace: true })避免页面空白。按钮级权限用一个自定义指令v-permission传权限编码数组比如v-permission[vehicle:add]没有权限的按钮直接remove掉。这里有一个高频坑动态路由只存在内存里页面一刷新就丢了。解决方法是在路由守卫每次进入时检查store里的menuLoaded标记如果为false重新调菜单接口并addRoute再跳转一次。这是所有做动态路由的项目都避不开的环节我把它固定成一个标准流程写进模板里。5.3 打包进SpringBoot一次搞定内网部署企业内部系统追求的是部署简单我不太建议一个小系统单独再买一台服务器搞nginx。更实际的做法是前端npm run build之后把生成的dist目录整个拷贝到SpringBoot项目的src/main/resources/static下随SpringBoot一起打包成一个jar。这样部署时只需要一条java -jar命令前端后端全起来了。这条路有两个注意点如果SpringBoot配置了server.servlet.context-path静态资源的访问路径会跟着变dist里的资源引用的根路径要提前用相对路径或模板变量处理好。Vue Router如果用的history模式刷新子路由页面时会404因为后端没有对应的接口。解决方案是让SpringBoot把所有非/api开头的GET请求都转发到index.html或者在WebMvcConfigurer里加一个addViewControllers兜底。更省事的方案是用hash模式URL多一个#但不用做任何后端转发配置。内网系统我一般直接hash模式省心。6. 部署与二次开发从跑起来到真正用得稳6.1 MySQL连接故障排查SSL、认证插件与驱动版本源码拿到手配置改完最刺激的环节就是启动。MySQL相关的连接报错我遇到过的十有八九是下面几类报错关键词原因处理方式Public Key Retrieval is not allowedMySQL 8.0默认caching_sha2_password认证驱动版本过旧或未允许公钥检索JDBC URL加allowPublicKeyRetrievaltrueuseSSLfalse或升级驱动到8.0.33Communications link failure且提示SSL客户端开启SSL但服务端不支持或证书校验失败JDBC URL加useSSLfalse云数据库强制SSL的按服务商要求配证书Access denied for user rootlocalhost账号密码错误或认证插件不匹配检查密码必要时ALTER USER rootlocalhost IDENTIFIED WITH mysql_native_password BY 密码Unknown database数据库没创建或没授权CREATE DATABASE后执行GRANT ALL PRIVILEGES ON xxx.* TO user%最揪心的是前两条它们长得一模一样都是连接超时或直接拒绝但一个要从驱动版本解决一个要关SSL。我的排查顺序是先看驱动版本再看JDBC URL参数最后看MySQL服务端的require_secure_transport配置。6.2 连接池和大页面的性能保障连接池选择上SpringBoot默认集成的是HikariCP性能很好配置也简单。但企业内部系统如果希望有可视化监控Druid更合适。它的StatViewServlet能直接看活跃连接数、SQL执行次数、慢SQL统计对运维友好。给一个Druid常用配置示例spring: datasource: druid: initial-size: 5 max-active: 20 min-idle: 5 max-wait: 60000 test-while-idle: true validation-query: SELECT 1 time-between-eviction-runs-millis: 60000 stat-view-servlet: enabled: true url-pattern: /druid/* login-username: admin login-password: admin123initial-size和min-idle控制空闲连接数max-active控制峰值连接数max-wait是获取连接的最大等待时间。企业车辆系统的并发量不会太高max-active20通常足够别上来就配100反而浪费数据库资源。还有一个我建议所有车辆管理系统都做的优化车辆列表和派车单列表接口返回的字段要精简别把remark这种长文本放到列表里。很多后台管理系统慢不是因为SQL写得差而是返回了大量用不上的字段前端渲染也跟着卡。6.3 源码阅读顺序与二次开发建议最后聊聊拿到一套完整源码之后怎么读才高效。我的阅读顺序是固定的先跑起来再抠代码。第一步看README和数据库初始化脚本把表结构和初始数据导进去第二步改application.yml里的数据源、Redis地址、文件存储路径第三步启动后端登录页面能进得去第四步才开始读代码——按这个顺序走一遍Controller层看接口清单Service层看业务逻辑Mapper层的XML看SQL写法。源码里最值得精读的是两个模块权限模块和派车审批模块。权限模块能让你搞懂动态路由和数据权限是怎么实现的派车审批模块是整个业务的核心链路把状态流转看懂这套系统的骨架也就摸透了。二次开发方向上如果需求是加车辆实时定位后端要对接GPS终端协议或第三方地图服务商的API前端接入地图组件。这里有个经验地图选型上国内业务就认真评估高德/百度/腾讯别为了酷炫去碰那些水土不服的国外方案偏转坐标系问题会让你的车辆轨迹偏离真实道路。如果需要行车记录视频回放前端要加video.js和hls.jsm3u8流不能直接丢给原生video标签这是踩过坑的结论。如果需求是更复杂的审批流比如会签、或签、多级审批再引入Flowable或Activite这样的流程引擎不迟如果只是文档会签这种轻量场景自己扩展approve_record表完全够用。另外违章描述、用车事由这类文本如果要做分析可以用HanLP分词做关键词提取这个我在扩展日志分析模块的时候用过效果不错。我最后想分享的一个判断是源码下载站里的“企业级”项目能直接开箱就用的很少但作为骨架参考价值非常大。真正决定系统能不能落地的是你对业务的理解——权限模型怎么划、状态机怎么设计、统计报表怎么和财务口径对齐这些代码之外的东西才是这套系统能不能在企业里用得稳的关键。把这套SpringBootVueMyBatisMySQL的架构吃透再把车辆管理的业务骨架搭对二次开发就只是往骨架上填肉的事情。
返回列表