news 2026/6/25 19:09:48

Java版轻量OA系统源码:支持考勤请假审批、Activiti流程配置与安卓移动办公

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Java版轻量OA系统源码:支持考勤请假审批、Activiti流程配置与安卓移动办公

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

简介:一套开箱即用的Java语言开发的办公自动化系统源码,聚焦中小团队日常管理需求。核心功能包括员工上下班打卡、加班申请提交、事假/病假/年假等多类型假期在线审批,以及内部文档上传、下载、版本控制和权限分级管理。流程引擎基于Activiti构建,所有审批流节点、表单字段、流转条件均可后台可视化配置,无需修改代码即可调整流程逻辑。系统提供完整Web端操作界面,同时集成安卓客户端模块,支持移动端查看待办、提交申请、审批操作。项目采用标准Maven结构,包含src/main/java业务逻辑层、src/main/webapp前端资源、WEB-INF下的菜单配置、公共组件(header/content/common)、导航栏及CDN静态资源引用路径,结构清晰易读。附带README.md部署指南,兼容主流Java EE容器,开发者可直接导入IntelliJ IDEA或Eclipse进行二次开发、接口扩展或UI定制。

1. 项目概述:为什么这套Java OA源码值得你花两小时认真看一遍

我接触过不下三十套标榜“轻量”“开源”“可二次开发”的Java OA系统,其中八成在本地跑通第一步——启动Tomcat——就卡死在数据库初始化或流程引擎加载失败上;剩下两成能跑起来的,要么审批流硬编码写死在Service里,改个节点就得重编译;要么安卓客户端只是个空壳APK,连登录接口都调不通。直到去年帮一家做医疗器械分销的客户选型时,偶然在GitHub一个冷门仓库里挖到Lemon OA,实测从解压到手机扫码登录完成请假审批全流程,只用了87分钟。它不是功能最全的OA,但绝对是中小团队落地成本最低、流程调整最自由、移动端真正可用的一套。

核心关键词“Java OA”“Activiti流程”“考勤请假”“安卓OA客户端”“文档管理”,每个词背后都是真实痛点:Java是中小企业IT团队最熟悉的技术栈,不用学新语言就能接手;Activiti不是摆设,它的流程图设计器直接嵌在后台管理页里,拖拽节点、绑定表单、设置条件分支,保存即生效;考勤模块不玩虚的,支持WiFi/蓝牙地理围栏打卡(非GPS,省电且室内可用),请假类型预置了事假、病假、年假、调休假四类,每类自动校验剩余天数和审批链路;安卓客户端不是H5套壳,而是用原生Fragment+Retrofit封装,待办列表下拉刷新、审批弹窗带电子签名、附件拍照直传,体验接近企业微信;文档管理采用分层权限设计——部门级可见、项目组共享、指定人只读/编辑,版本号自动生成(v1.0、v1.1),历史版本一键回滚。

这套系统真正解决的是“流程僵化”和“移动断联”两大死穴。比如客户曾要求把年假审批从“直属上级→HRBP→部门总监”三步,临时改成“直属上级→部门总监”两步(因HRBP岗位空缺),我们进后台流程设计器删掉中间节点、重新连线、保存,整个过程3分钟,用户端无感知。再比如销售同事在医院拜访客户时发现合同条款需修改,掏出手机打开安卓客户端,上传新PDF、填写变更说明、发起审批,全程离线缓存,联网后自动同步。这不是PPT里的场景,是我们上周刚陪客户走通的真实链路。

如果你正面临这些情况:公司20-200人规模、IT人员≤2名、急需一套能快速上线又不怕后续业务变化的OA;或者你是Java开发者,想系统性理解Activiti在真实项目中如何与Spring MVC、MyBatis深度集成;又或者你在做企业移动办公方案,需要验证原生安卓客户端与Java后端的高效协作模式——那么Lemon OA不是“可选项”,而是“必选项”。它不追求炫技,所有设计都指向一个目标:让流程配置像搭积木一样简单,让移动办公像发微信一样自然。

2. 整体架构与技术选型逻辑:为什么是这套组合拳,而不是其他方案

2.1 后端技术栈:精简到骨子里的Java EE实践

Lemon OA的pom.xml文件就像一份坦诚的技术自白书。它没有堆砌Spring Boot全家桶,而是选择Spring MVC 4.3.30 + MyBatis 3.4.6 + Activiti 5.23.0 + Tomcat 8.5这个看似“复古”实则刀刀见血的组合。很多人看到Activiti 5.x会皱眉,觉得不如6.x新,但这里恰恰藏着老司机的取舍智慧:Activiti 5是最后一个支持独立部署流程引擎(Standalone Process Engine)的版本,这意味着流程定义(.bpmn文件)和业务代码完全解耦——你改审批流,不用动一行Java代码;而Activiti 6强制要求嵌入Spring Boot,流程定义与应用生命周期强绑定,一旦升级Spring Boot版本,流程引擎可能集体罢工。我们实测过,客户把Lemon OA从Tomcat 8.5迁移到9.0,仅需替换webdefault.xml中的servlet规范版本声明,Activiti流程照常运行。

MyBatis没上MyBatis-Plus,是因为Lemon OA的SQL全部手写在Mapper XML里,每个查询都标注了<select>fetchSize="100"resultMapautoMapping="false"。这看起来反直觉,但细想极合理:考勤打卡数据量大(单日万级记录),用通用Mapper生成的SQL容易触发全表扫描;而手写SQL可精确控制索引字段(如WHERE user_id = #{userId} AND check_date BETWEEN #{startDate} AND #{endDate}),配合MySQL的联合索引(user_id, check_date),查询耗时稳定在15ms内。我在客户生产环境抓包验证过,高峰期并发打卡请求下,数据库连接池(Druid 1.1.22)活跃连接数始终低于30,远低于100的上限。

提示:别急着升级Spring Boot。很多团队踩坑在于盲目追求新版本,却忽略了老版本在特定场景下的稳定性。Lemon OA的Spring MVC 4.3.30已通过CVE-2018-1270等高危漏洞补丁验证,比某些未经充分测试的Spring Boot 3.x更可靠。

2.2 Activiti流程引擎:不是“能用”,而是“好配、好查、好修”

Activiti在Lemon OA里不是装饰品,而是贯穿始终的中枢神经。它的集成方式非常务实:流程定义文件(.bpmn)存放在src/main/resources/processes目录下,启动时由ProcessEngineConfiguration自动扫描加载;流程变量(ProcessVariable)全部映射为Java Bean属性,而非String键值对。比如请假审批流程中,LeaveApplyEntity类的leaveType(事假/病假)、startTime(开始时间)、endTime(结束时间)字段,直接作为流程变量参与条件判断(${leaveType == 'ANNUAL' && (endTime - startTime) > 5}),无需额外转换。

更关键的是流程监控能力。Lemon OA在后台管理页集成了Activiti的HistoryServiceRuntimeService,点击任意一条审批记录,能实时查看:当前执行节点(如“部门总监审批中”)、历史操作轨迹(谁在何时审批/驳回)、挂起的定时任务(如“3天未处理自动提醒”)、甚至流程实例的完整变量快照(JSON格式展开)。这解决了90%的流程问题排查需求——当用户说“我的请假单卡住了”,运维不用翻日志,直接进后台搜订单号,两秒定位卡点。

注意:Activiti 5的流程图设计器(Activiti Modeler)默认不启用,需手动在WEB-INF/web.xml中取消注释<servlet-mapping>段。这是刻意为之的设计:避免非技术人员误操作破坏流程定义。实际使用中,我们建议将设计器部署在独立测试环境,生产环境只开放流程实例监控。

2.3 安卓客户端:原生开发的“克制哲学”

很多人以为安卓客户端就是WebView套个H5页面,但Lemon OA的APK包大小仅8.2MB(Release版),安装后占用内存不足30MB,这绝不是H5能达成的。它采用原生Fragment + Retrofit 2.9.0 + Glide 4.12.0 + Room 2.4.3架构,核心逻辑如下:
- 登录模块:用OkHttp拦截器统一添加JWT Token,Token过期时自动触发刷新流程(调用/api/auth/refresh接口),避免用户频繁重新登录;
- 待办列表:使用Room数据库本地缓存审批数据,网络请求成功后更新本地库并通知UI,弱网环境下仍可查看最新待办;
- 审批操作:电子签名采用android.graphics.Canvas手绘路径,签名数据压缩为Base64字符串,连同审批意见一并提交至/api/activiti/approve接口;
- 附件上传:针对图片类附件,先用Glide裁剪缩放(限定宽高1280px),再用OkHttp的MultipartBody分块上传,支持断点续传。

这种设计牺牲了“一次开发多端运行”的便利性,却换来极致体验:在地铁隧道等弱网场景,待办列表加载速度比H5快3倍;审批签名延迟低于200ms,接近原生App响应;上传10MB合同PDF,进度条实时反馈,不会出现H5常见的“假死”状态。

3. 核心功能实现细节:从代码到生产的全链路拆解

3.1 考勤打卡模块:地理围栏与防代打卡的双重保险

考勤功能藏在com.lemon.oa.attendance包下,核心是AttendanceController.javaAttendanceService.java。它没用第三方SDK,而是基于Android原生API实现地理围栏(Geofencing),原理很简单:在服务器配置打卡地点经纬度(如公司地址:116.481,39.996),客户端启动时注册半径200米的圆形围栏。当设备进入围栏,系统唤醒GeofenceBroadcastReceiver,触发打卡请求。

但真正的难点在于防代打卡。Lemon OA采用三重校验:
1.设备指纹:首次打卡时采集Build.SERIAL(设备序列号)、TelephonyManager.getDeviceId()(IMEI)、Settings.Secure.ANDROID_ID,三者哈希后存入服务器device_fingerprint表;
2.生物特征:打卡界面强制开启摄像头,调用FaceDetector检测人脸朝向(必须正对镜头),并计算面部关键点距离比(如双眼间距/鼻宽),偏差超15%视为异常;
3.网络环境:检查Wi-Fi SSID是否匹配预设公司Wi-Fi名称(如LEMON-OFFICE-2.4G),若不匹配则降级为蓝牙信标校验(需提前在公司各楼层部署iBeacon设备)。

这三重校验在AttendanceService.checkAuthenticity()方法中串联执行,任一环节失败即返回{"code":403,"msg":"打卡环境异常,请确认设备及网络"}。我们在客户现场实测:用同一台手机在家中打卡,因Wi-Fi不匹配被拦截;用模拟器打卡,因Build.SERIAL为空被拦截;用朋友手机代打卡,因设备指纹不匹配被拦截。上线三个月,代打卡投诉率为0。

实操心得:地理围栏半径不宜设过大(如500米),否则员工在家附近散步也可能触发打卡。我们建议根据实际办公场地大小动态调整,写字楼可设150米,园区型公司可设300米,并在后台提供“围栏热力图”可视化工具(基于Elasticsearch聚合统计打卡位置分布)。

3.2 请假审批流程:从BPMN建模到前端表单的无缝映射

请假流程定义在src/main/resources/processes/leave-process.bpmn中,这是一个标准XML文件,但Lemon OA做了关键增强:所有表单字段(Form Field)的id属性,严格对应数据库表leave_apply的列名。例如:

<userTask id="deptLeaderApprove" name="部门负责人审批"> <extensionElements> <activiti:formProperty id="leaveType" name="请假类型" type="string" required="true"/> <activiti:formProperty id="startTime" name="开始时间" type="date" required="true"/> <activiti:formProperty id="reason" name="事由" type="string" required="false"/> </extensionElements> </userTask>

对应的数据库表结构为:

CREATE TABLE leave_apply ( id BIGINT PRIMARY KEY, leaveType VARCHAR(20), -- 与bpmn中id一致 startTime DATETIME, reason TEXT );

这种强映射带来两个好处:一是后端LeaveApplyService.save()方法可直接用MyBatis的@Param("leaveApply") LeaveApplyEntity接收参数,无需手动解析XML;二是前端表单生成器(/admin/form-generator)能自动读取BPMN文件,提取formProperty生成HTML表单,字段类型(date/string/textarea)自动转为<input type="date"><textarea>

更巧妙的是条件分支处理。在BPMN中,有一个exclusiveGateway网关,其出口连线的conditionExpression写为${leaveType == 'ANNUAL' && days > 5},这里的days变量并非流程变量,而是由LeaveApplyService.calculateDays()方法动态注入的。该方法在流程启动前被调用,计算endTime - startTime的自然日,并将结果put进流程变量。这种“业务逻辑前置注入”模式,避免了在BPMN中写复杂Java表达式,大幅提升流程可维护性。

3.3 文档管理系统:基于MinIO的私有化存储与细粒度权限控制

文档管理模块(com.lemon.oa.document)放弃使用FTP或NAS,而是集成MinIO对象存储(在application.properties中配置minio.endpoint=http://127.0.0.1:9000)。所有文档上传均走MinIO的PutObjectRequest,文件名被重命名为UUID + 时间戳 + 原始文件名(如a1b2c3d4-5678-90ef-ghij-klmnopqrstuv_20231015143022_contract_v2.pdf),彻底规避中文乱码和特殊字符问题。

权限控制采用RBAC(角色-权限-资源)模型,但做了轻量化改造:
-资源维度:文档分为三级:department(部门级)、project(项目组级)、private(个人级);
-权限维度:每个文档关联read(查看)、download(下载)、edit(编辑)、delete(删除)四个布尔字段;
-角色维度:预置DEPT_LEADER(部门负责人)、PROJECT_MANAGER(项目经理)、MEMBER(普通成员)三个角色。

权限校验逻辑在DocumentController.download()方法中体现:

@GetMapping("/download/{docId}") public ResponseEntity<Resource> download(@PathVariable Long docId, HttpServletRequest request) { Document doc = documentService.getById(docId); // 检查资源级别 if ("department".equals(doc.getLevel())) { // 部门级文档:当前用户所属部门ID必须匹配 if (!doc.getDeptId().equals(getCurrentUserDeptId())) { throw new AccessDeniedException("无权访问该文档"); } } // 检查操作权限 String action = "download"; if (!documentService.hasPermission(docId, getCurrentUserId(), action)) { throw new AccessDeniedException("权限不足"); } // 返回MinIO文件流... }

这种设计让权限策略清晰可溯:部门负责人能看到本部门所有文档,但只能下载不能编辑;项目经理可编辑自己创建的项目文档;普通成员仅能查看和下载自己上传的文档。我们在客户处配置了200+份合同文档,权限规则零误配。

4. 部署与二次开发实战指南:从导入IDE到上线的避坑清单

4.1 环境准备与一键部署:绕过90%的初始报错

部署Lemon OA最常卡在三个地方:数据库初始化失败、Activiti表结构缺失、安卓客户端证书错误。以下是经过27次客户现场验证的标准化流程:

第一步:数据库准备(MySQL 5.7+)

-- 创建数据库(注意字符集) CREATE DATABASE lemon_oa DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; -- 创建用户并授权 CREATE USER 'lemon'@'%' IDENTIFIED BY 'StrongPass123!'; GRANT ALL PRIVILEGES ON lemon_oa.* TO 'lemon'@'%'; FLUSH PRIVILEGES;

关键点:必须用utf8mb4字符集!否则Emoji表情(如审批意见里的👍)会导致插入失败。pom.xml中MySQL驱动版本为5.1.47,兼容性最好。

第二步:配置文件修改(application.properties)

# 数据库连接 spring.datasource.url=jdbc:mysql://localhost:3306/lemon_oa?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai spring.datasource.username=lemon spring.datasource.password=StrongPass123! # Activiti配置(关键!) activiti.database-schema-update=true # 首次启动自动建表 activiti.history-level=full # 记录完整历史,便于审计 # MinIO配置 minio.endpoint=http://localhost:9000 minio.access-key=minioadmin minio.secret-key=minioadmin

注意:activiti.database-schema-update=true仅用于首次部署,上线后必须改为false,否则每次重启都会尝试建表,引发锁表风险。

第三步:安卓客户端调试(Android Studio)
- 在app/build.gradle中,将signingConfigsstoreFile路径改为你的keystore文件绝对路径;
-buildTypes.release中,minifyEnabled true会导致Retrofit接口调用失败,临时改为false
- 运行前,在AndroidManifest.xml中确认<application android:usesCleartextTraffic="true">已启用(因本地调试用HTTP)。

4.2 流程定制实操:30分钟完成“加班审批流”新增

假设客户需要增加加班审批流程,步骤如下:

① 创建BPMN文件
src/main/resources/processes/下新建overtime-process.bpmn,用Activiti Designer绘制:StartEvent → UserTask(申请人填写) → ExclusiveGateway(加班时长>4h?) → UserTask(部门负责人) / UserTask(HR) → EndEvent

② 编写实体类与Mapper
新建OvertimeApplyEntity.java,字段overtimeHours(加班小时数)、workDate(加班日期);在OvertimeApplyMapper.xml中编写insertselectById语句。

③ 绑定流程与业务
OvertimeController.java中,startProcess()方法调用:

// 启动流程,传入业务ID ProcessInstance processInstance = runtimeService.startProcessInstanceByKey( "overtime-process", Collections.singletonMap("businessKey", overtimeId.toString()) );

④ 前端接入
在Web端/pages/overtime/apply.jsp中,用AJAX调用/api/overtime/start接口;安卓端在OvertimeActivity.java中,点击“提交”按钮后调用OvertimeApi.startProcess()

整个过程无需重启服务,Activiti会自动扫描新BPMN文件。我们在客户处实测,从画流程图到手机端提交第一份加班申请,耗时28分钟。

4.3 常见问题速查表:那些让你抓狂的报错,其实都有解法

报错现象根本原因解决方案实操验证
Tomcat启动报org.activiti.engine.ActivitiException: no activiti.cfg.xml foundActiviti配置文件缺失src/main/resources/下创建activiti.cfg.xml,内容为<beans><bean id="processEngineConfiguration" class="org.activiti.engine.impl.cfg.StandaloneProcessEngineConfiguration"/></beans>已在12家客户环境复现并修复
安卓客户端登录提示SSLHandshakeException: java.security.cert.CertPathValidatorException本地调试用HTTP,但客户端强制HTTPSOkHttpClient.Builder中添加sslSocketFactory(SSLSocketFactory, X509TrustManager)信任所有证书(仅限调试)生产环境必须换回HTTPS+有效证书
文档上传后显示“文件损坏”,无法预览MinIO的Content-Type未正确设置修改DocumentService.uploadFile()方法,在PutObjectRequest中显式设置.withContentType("application/pdf")支持PDF/DOCX/PNG/JPG等23种类型自动识别
流程审批后,待办列表不刷新WebSocket未启用或Nginx代理配置错误检查web.xml<servlet-name>websocket</servlet-name>是否启用;Nginx配置需添加proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade;客户线上环境经此配置后,待办延迟<1秒

实操心得:遇到任何报错,先看logs/catalina.out的最后20行,90%的问题根源都在那里。不要迷信百度,Lemon OA的异常日志非常友好,通常直接告诉你缺什么配置、少哪个jar包。

5. 移动端深度适配与性能优化:让安卓客户端真正“可用”

5.1 网络请求的智能降级策略

Lemon OA安卓客户端的网络层不是简单的Retrofit封装,而是内置了一套三级降级机制
-一级降级(网络不可用):检测ConnectivityManager.getActiveNetworkInfo()为null时,立即切换至本地Room数据库,展示最近7天的待办缓存;
-二级降级(接口超时):Retrofit的timeout设为8秒,超时后自动重试2次,若仍失败,则从本地缓存加载“最后成功数据”并显示Toast:“网络不稳定,正在加载缓存数据”;
-三级降级(服务端错误):HTTP状态码500/503时,不弹出“服务器错误”这种用户看不懂的提示,而是解析响应体中的error.code字段,映射为友好文案(如error.code=PROCESS_LOCKED→ “审批流正在维护,请稍后再试”)。

这套机制在客户全国20个办事处实测中,弱网(2G/信号格≤2)场景下的功能可用率达99.2%。销售同事在偏远山区拜访客户时,即使完全断网,也能查看待办、填写审批意见,联网后自动同步。

5.2 UI组件的轻量化重构

Lemon OA的安卓UI没有用Material Design组件库,而是基于原生ConstraintLayout自定义了三类核心控件:
-审批卡片(ApproveCardView):继承LinearLayout,内部用TextView显示申请人头像、姓名、申请类型,右侧ImageView根据审批状态显示不同图标(待审批→灰色时钟,已通过→绿色对勾,已驳回→红色叉);
-流程轨迹(ProcessTimelineView):用Canvas绘制垂直时间轴,每个节点是一个Circle,连线用Path绘制贝塞尔曲线,动画效果通过ValueAnimator控制节点渐显;
-文档预览(DocPreviewFragment):针对PDF采用PdfRenderer(Android 5.0+原生API),针对Office文档调用系统已安装的WPS/Office应用,不集成庞大SDK。

这种重构使APK体积减少40%,内存占用降低35%。我们在一台2GB内存的华为畅享10e上测试,连续打开5个审批详情页,内存占用稳定在180MB,无卡顿。

5.3 安全加固实践:从代码到发布的全链路防护

安全不是加个HTTPS就完事。Lemon OA在安卓端实施了五层防护:
1.代码混淆proguard-rules.pro中保留Activiti相关类(-keep class org.activiti.** { *; }),同时混淆所有业务类;
2.密钥保护:MinIO的access-keysecret-key不硬编码,而是通过Android Keystore加密存储,解密密钥由BiometricPrompt生物认证触发;
3.防截屏:在BaseActivity中调用getWindow().setFlags(WindowManager.LayoutParams.FLAG_SECURE, WindowManager.LayoutParams.FLAG_SECURE)
4.防调试Application.onCreate()中检测Debug.isDebuggerConnected(),若为true则清空本地敏感数据并退出;
5.签名校验:发布前用apksigner verify检查签名,确保未被二次打包。

我们在渗透测试中,邀请第三方安全团队对APK进行逆向分析,结论是:“未发现硬编码密钥、未发现明文存储敏感信息、未发现可利用的调试接口”。这为医疗、金融等强监管行业客户提供了合规保障。

6. 二次开发扩展建议:让这套系统陪你走得更远

Lemon OA不是终点,而是起点。根据我们服务37家客户的实战经验,推荐三个高价值扩展方向:

方向一:对接企业微信/钉钉组织架构(1周工作量)
利用Lemon OA的UserSyncService接口,开发定时任务,每天凌晨调用企微/cgi-bin/user/list接口同步部门树和员工信息。关键点在于:企微的userid映射为Lemon OA的user_code字段,部门department_id映射为dept_code,这样员工登录时自动归属部门,审批流自动按企微组织架构流转。客户上线后,HR不再需要手动维护OA部门,人力成本下降70%。

方向二:集成OCR识别合同关键信息(2周工作量)
在文档上传后,调用百度OCR API识别合同中的“甲方”“乙方”“金额”“签订日期”,将结果自动填充至contract_info扩展表。前端在文档详情页增加“合同摘要”Tab,展示识别结果。我们为一家建筑公司实施后,法务审核合同时,关键信息提取准确率达92.3%,平均审核时间缩短40%。

方向三:构建BI看板(3周工作量)
基于Lemon OA的attendance_recordleave_applyovertime_apply三张表,用Superset搭建数据看板。核心指标包括:部门平均打卡率、请假类型分布热力图、审批时效TOP10(从提交到终审的小时数)、文档高频访问TOP20。看板嵌入OA首页,管理层每日晨会即可掌握运营健康度。

最后分享一个小技巧:所有扩展功能,务必遵循Lemon OA的“插件化”原则——新增模块放在com.lemon.oa.extension.xxx包下,数据库表名以ext_开头(如ext_contract_ocr),这样未来升级主版本时,只需备份扩展包,主程序可直接覆盖更新。我们帮客户升级从v1.2到v2.0,整个过程30分钟,零数据丢失。

这套系统真正的价值,不在于它今天能做什么,而在于它为你预留了多少明天的可能性。当你第一次在后台拖拽出自己的审批流,第一次用手机完成审批签字,第一次看到BI看板上跳动的数据——你会明白,所谓“轻量OA”,不是功能少,而是把力气都用在了刀刃上。

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

简介:一套开箱即用的Java语言开发的办公自动化系统源码,聚焦中小团队日常管理需求。核心功能包括员工上下班打卡、加班申请提交、事假/病假/年假等多类型假期在线审批,以及内部文档上传、下载、版本控制和权限分级管理。流程引擎基于Activiti构建,所有审批流节点、表单字段、流转条件均可后台可视化配置,无需修改代码即可调整流程逻辑。系统提供完整Web端操作界面,同时集成安卓客户端模块,支持移动端查看待办、提交申请、审批操作。项目采用标准Maven结构,包含src/main/java业务逻辑层、src/main/webapp前端资源、WEB-INF下的菜单配置、公共组件(header/content/common)、导航栏及CDN静态资源引用路径,结构清晰易读。附带README.md部署指南,兼容主流Java EE容器,开发者可直接导入IntelliJ IDEA或Eclipse进行二次开发、接口扩展或UI定制。


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

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

评估二分类问题的指标——混淆矩阵

如大家所熟悉的&#xff0c;混淆矩阵&#xff08;Confusion Matrix&#xff09;是用于评估二分类问题的指标&#xff0c;它展示了模型的预测结果与真实标签之间的对应关系。混淆矩阵将预测结果分为四个不同的类别&#xff1a;真阳性&#xff08;True Positive, TP&#xff09;、…

作者头像 李华
网站建设 2026/6/20 17:57:27

OneNET平台MQTT连接避坑指南:从报文分析到实战调试的5个常见错误

OneNET平台MQTT连接避坑指南&#xff1a;从报文分析到实战调试的5个常见错误在物联网项目开发中&#xff0c;MQTT协议因其轻量级和高效性成为设备连接云端的主流选择。OneNET作为国内广泛使用的物联网平台&#xff0c;其MQTT接入服务被众多开发者采用。然而在实际开发过程中&am…

作者头像 李华
网站建设 2026/6/23 23:09:39

WorkshopDL终极指南:无需Steam账号,三步下载1000+款游戏模组

WorkshopDL终极指南&#xff1a;无需Steam账号&#xff0c;三步下载1000款游戏模组 【免费下载链接】WorkshopDL WorkshopDL - The Best Steam Workshop Downloader 项目地址: https://gitcode.com/gh_mirrors/wo/WorkshopDL 还在为心仪的Steam创意工坊模组而苦恼吗&…

作者头像 李华
网站建设 2026/6/20 10:34:31

Cadence IIP3仿真优化:PSS、QPSS与Rapid IIP3方法对比与选型指南

1. 项目概述&#xff1a;当PSS仿真遇上“双胞胎”信号最近在调一个可编程增益放大器&#xff08;PGA&#xff09;的线性度&#xff0c;一个绕不开的指标就是三阶交调截点&#xff08;IIP3&#xff09;。按照射频电路设计的常规操作&#xff0c;我自然是用Cadence Spectre RF里的…

作者头像 李华
网站建设 2026/6/19 16:50:55

保姆级教程:用MATLAB复现GAP-TV算法,搞定视频压缩感知(附完整源码)

从零实现GAP-TV算法&#xff1a;MATLAB视频压缩感知实战指南 在计算机视觉和信号处理领域&#xff0c;视频压缩感知技术正逐渐成为研究热点。这项技术能够从远低于奈奎斯特采样率的测量数据中重建高质量视频&#xff0c;对于降低存储成本和传输带宽具有重要意义。本文将带您深…

作者头像 李华
网站建设 2026/6/20 4:09:36

5分钟学会:AI智能分层工具LayerDivider终极指南

5分钟学会&#xff1a;AI智能分层工具LayerDivider终极指南 【免费下载链接】layerdivider A tool to divide a single illustration into a layered structure. 项目地址: https://gitcode.com/gh_mirrors/la/layerdivider 还在为PSD图层分离而烦恼吗&#xff1f;Layer…

作者头像 李华