任务管理系统APP毕业设计避坑指南:状态流转与循环提醒实现
做毕业设计选“个人任务管理系统APP”这类题目时很多同学一开始会觉得简单不就是一个TodoList加个数据库再加个手机页面吗等真正动手才发现任务管理的业务逻辑远不止“增删改查”。状态怎么流转、循环任务怎么处理、提醒怎么在APP被杀掉之后还能触发、前后端数据怎么同步每个点都能写出一整章。这篇文章就把我从选题到答辩踩过的坑、验证过的方案完整梳理一遍给正在做这个题目的同学一条能直接落地的路线。1. 毕业设计的需求边界别把任务管理做成记账本1.1 为什么这个选题看似简单却容易跑偏任务管理系统的核心是“任务”但“任务”这个词在不同人眼里完全不是一回事。我见过不少同学的初版设计把任务管理系统做成了待办事项列表加番茄钟再加个统计分析图表最后连“每日打卡”和“重复提醒”都混在一起答辩时被老师一问“你这个任务和日历事件有什么区别”就卡住了。问题的根源在于需求边界没划清楚。个人任务管理系统的定位应该是“以任务为核心对象围绕任务的创建、分配、执行、跟踪、完成进行全生命周期管理”。这不是日历提醒不是项目协作平台也不是习惯打卡工具。定下这个边界你的功能清单就不会跑偏。1.2 用户角色和核心功能清单个人任务管理系统虽然叫“个人”但按毕业设计的完整度要求最好设计成可扩展的多用户结构。这样做不是给自己加工作量而是为了让系统架构更有说服力也方便在论文里写“用户权限控制”这一章。功能模块拆成四大块用户模块注册、登录、个人信息维护。多用户场景下需要区分用户隔离不能出现你看到别人任务的低级错误。任务模块任务CRUD、任务分类工作/学习/生活、优先级设置、截止时间、任务状态待执行/进行中/已完成/已取消、任务备注、循环任务设置。统计与提醒模块任务完成率统计、每日待办提醒、截止日期快到了的预警提醒。设置模块提醒开关、主题切换、数据导出。这里有一个关键决策要不要做循环任务我的建议是必须做但只做最基础的“每天/每周/每月”三种周期。理由是循环任务牵扯到状态判断的复杂性比如“这个周期的任务没完成下个周期还继续吗”这正好是你论文里能展示逻辑能力的点也是答辩时能深度展开的素材。1.3 从功能反推技术点哪些地方值得写进论文毕业设计不仅要“做出来”还要“讲清楚”。把功能反推回技术点你就能明确哪些地方需要重点设计功能需求对应技术点答辩时怎么讲多用户数据隔离数据库外键关联、Token鉴权讲清楚任务表如何关联用户表任务状态流转状态机设计画状态流转图讲非法状态怎么拦截循环任务生成时间计算逻辑用代码片段讲nextTriggerTime的计算提醒推送前台定时器 vs 系统通知对比两种方案的优缺点分页加载SQL的limit与参数绑定说明大数据量下的性能考虑这样规划下来你的系统虽然规模不大但该有的技术深度全都有了。接下来才是选技术栈。2. 技术栈选型Java生态里哪些组合能做出差异化2.1 两条主流路线的取舍逻辑第一个要拍板的问题是架构。个人任务管理系统有两条路线可选纯Android本地方案SQLite数据库直接在手机端所有逻辑都在APP里。前后端分离方案Android做客户端用Spring Boot提供REST接口数据存在MySQL。如果你的毕设题目只写了“移动应用设计与实现”没有强制要求服务端很多同学就会图省事选纯本地方案。但我这里直接给结论有时间的同学务必选前后端分离。理由有三点都很现实第一纯本地方案意味着你的Java代码主要集中在Android端的Activity和Adapter里论文里能写的东西很薄技术深度撑不起三章内容。第二答辩现场一旦有老师问“你的数据怎么备份”或“换个手机数据怎么办”纯本地方案很难给出有说服力的回答。第三前后端分离让你能同时展示Spring Boot、MyBatis、RESTful API、Android网络编程等多个技术栈相当于用一套系统适配了多门课程的知识点。2.2 后端技术选型Spring Boot 2.x MyBatis MySQL后端我用的组合是Spring Boot 2.7 MyBatis MySQL 8.0。这套组合在Java领域非常经典资料多遇到问题也好搜解决方案。Spring Boot 3.x虽然已经发布但毕业设计没必要追新2.7版本稳定、教程多、和你用的Android端JDK版本兼容性更好。MyBatis和JPA的选择上我更推荐MyBatis。原因很实际MyBatis的SQL是手写的对任务管理这种需要复杂查询按状态筛选、按日期范围统计、分页的场景控制力更强而且毕业后找工作面试时MyBatis被问到的概率远大于JPA。连数据库的配置直接在application.yml里写就行server: port: 8080 spring: datasource: url: jdbc:mysql://localhost:3306/task_app?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: GMT8 mybatis: mapper-locations: classpath:mapper/*.xml type-aliases-package: com.example.task.entity configuration: map-underscore-to-camel-case: truemap-underscore-to-camel-case这个配置一定要开否则数据库的task_name映射不到Java属性taskName上每个字段都要写resultMap工作量瞬间翻倍。2.3 Android端架构MVP比MVVM更适合这种小项目Android端的架构选择很多教程推荐MVVM但我的经验是毕业设计这类中等偏小的项目MVP反而更好落地。MVVM的DataBinding或ViewModel和Lifecycle库版本一多经常出现各种兼容问题排查起来很费时间。而MVP的思路很直白界面操作交给Activity/FragmentView层业务逻辑全扔给Presenter数据模型走Model层。答辩的时候讲MVP也非常好讲画一张单向依赖的图老师一眼就能看懂你的分层设计。如果你不想自己维护Presenter接口也可以简化成“Activity负责UI Service/Manager类负责业务 Retrofit负责网络”的轻架构。核心原则只有一个Activity里不要出现SQL语句、不要写线程池直接访问网络代码全部分层这不只是为了架构而架构是避免后期增加功能时改一处崩三处。3. 数据库与后端接口设计把任务对象变成能跑的API3.1 表结构设计六张表搞定全部数据需求任务管理系统的表结构不需要太复杂但我见过很多人把任务表设计成“万能表”一个表里堆了二十多个字段最后连自己也记不清哪些字段有用。我最终落地的表结构分六张每张都有明确职责用户表t_userCREATE TABLE t_user ( id INT PRIMARY KEY AUTO_INCREMENT, username VARCHAR(50) NOT NULL UNIQUE, password VARCHAR(100) NOT NULL, nickname VARCHAR(50), created_at DATETIME DEFAULT CURRENT_TIMESTAMP );密码用BCrypt加密存储不要明文。Spring Security里的BCryptPasswordEncoder可以直接用比MD5安全得多答辩时这也算一个加分点。任务表t_taskCREATE TABLE t_task ( id INT PRIMARY KEY AUTO_INCREMENT, user_id INT NOT NULL, title VARCHAR(200) NOT NULL, description TEXT, category VARCHAR(50), priority TINYINT DEFAULT 1 COMMENT 1-低 2-中 3-高, status TINYINT DEFAULT 0 COMMENT 0-待执行 1-进行中 2-已完成 3-已取消, deadline DATETIME, is_cycle TINYINT DEFAULT 0, cycle_type VARCHAR(10) COMMENT DAILY/WEEKLY/MONTHLY, remind_time DATETIME, created_at DATETIME DEFAULT CURRENT_TIMESTAMP, updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, FOREIGN KEY (user_id) REFERENCES t_user(id) );这个表里有两个非常容易踩坑的点。第一个是updated_at的自动更新机制MySQL 8.0支持ON UPDATE CURRENT_TIMESTAMP但这个字段依赖数据库时间如果你的服务器和客户端不在同一个时区时间就会差八小时。第二个是deadline和remind_time的区分很多人只保留一个截止时间导致提醒逻辑做不准确——截止时间是任务的业务属性提醒时间是任务的通知属性两者必须分开。另外为什么任务表要冗余一个category字符串字段而不是新建一张分类表因为个人任务管理的分类非常固定工作/学习/生活没有太多动态扩展需求用字符串更省事。如果你觉得这样不够“规范化”可以建一张分类表但需要权衡额外的联表查询是否值得。循环任务记录表t_task_cycleCREATE TABLE t_task_cycle ( id INT PRIMARY KEY AUTO_INCREMENT, task_id INT NOT NULL, cycle_start DATETIME NOT NULL, cycle_end DATETIME, next_trigger_time DATETIME NOT NULL, FOREIGN KEY (task_id) REFERENCES t_task(id) );这张表专门记录循环任务的触发情况。核心逻辑在next_trigger_time每个周期完成后更新这个字段。如果用cron表达式做循环反而会增加复杂度。我采用的是固定周期触发时间计算的方式代码逻辑直观答辩也容易讲。3.2 REST接口约定不只是CRUD要能经得起追问接口设计遵循REST风格统一返回结构。我定义了一个Result对象public class ResultT { private Integer code; private String message; private T data; public static T ResultT success(T data) { ResultT result new Result(); result.code 200; result.message success; result.data data; return result; } public static T ResultT error(Integer code, String message) { ResultT result new Result(); result.code code; result.message message; return result; } }核心接口清单接口方法作用/api/user/registerPOST用户注册/api/user/loginPOST登录并返回Token/api/task/listGET分页获取当前用户任务列表/api/task/{id}GET获取任务详情/api/task/addPOST新增任务/api/task/updatePUT更新任务/api/task/{id}/statusPUT更新任务状态/api/task/deleteDELETE删除任务/api/task/statsGET统计完成率、每状态任务数在这里我要强调一个细节不要把“更新任务”和“更新任务状态”合并成一个接口。任务状态流转有独立的业务逻辑比如已完成的任务不能直接回到待执行单独拆出来后端就能在接口内部做状态合法性校验。以后加需求比如“进行中的任务不允许取消”直接改这个接口就行不会影响其他字段的更新。分页接口也不要只返回一个任务列表应该返回一个包含总条数、总页数、当前页数据的对象public class PageResultT { private Long total; private Integer pages; private Integer current; private ListT records; }这样Android端做分页加载时根据total判断还有没有更多数据比单纯看records.size()是不是等于每页条数要可靠得多。3.3 后端核心代码落地状态流转与循环触发任务状态流转是后端最重要的业务逻辑。我用了一个简单的状态校验方法private static final MapInteger, SetInteger ALLOWED_TRANSITIONS new HashMap(); static { ALLOWED_TRANSITIONS.put(0, new HashSet(Arrays.asList(1, 3))); // 待执行 - 进行中/已取消 ALLOWED_TRANSITIONS.put(1, new HashSet(Arrays.asList(0, 2, 3))); // 进行中 - 待执行/已完成/已取消 ALLOWED_TRANSITIONS.put(2, new HashSet()); // 已完成 - 不可再流转 ALLOWED_TRANSITIONS.put(3, new HashSet(Arrays.asList(0))); // 已取消 - 待执行 }这种用状态机表驱动的方式比if-else判断更清晰。新来的同学看不懂你的代码没关系你论文里画一张状态流转图所有人就明白了。循环任务的触发逻辑是定期扫描t_task_cycle表里next_trigger_time小于当前时间的任务把任务重新生成一条新的状态重置为待执行然后更新下一次触发时间public void checkCycleTasks() { ListTaskCycle dueCycles taskCycleMapper.selectDueCycles(new Date()); for (TaskCycle cycle : dueCycles) { Task task taskMapper.findById(cycle.getTaskId()); Task newTask cloneTask(task); taskMapper.insert(newTask); Date nextTrigger calculateNextTrigger(cycle.getNextTriggerTime(), task.getCycleType()); cycle.setNextTriggerTime(nextTrigger); taskCycleMapper.update(cycle); } }calculateNextTrigger按周期类型加不同时间DAILY加一天WEEKLY加七天MONTHLY加一个月。注意月份加减要用Calendar而不是自己手算跨月、闰年的坑你不想踩第二次。4. Android端从0到1五个核心模块的实现细节4.1 登录与Token持久化别用SharedPreferences硬扛Android端登录后拿到的Token怎么保存是很多人的第一个坑。最直接的方式是用SharedPreferences存字符串但这会有一个问题Token过期之后APP每次启动都得重新登录非常影响体验。更优雅的方案是Token 过期时间戳一起存每次进MainActivity时先校验过期时间只剩下两三天时自动跳到登录页。这样做用户无感代码也简单。Retrofit拦截器统一加Token请求头public class AuthInterceptor implements Interceptor { Override public Response intercept(Chain chain) throws IOException { Request original chain.request(); String token TokenManager.getInstance().getToken(); Request request original.newBuilder() .header(Authorization, Bearer token) .method(original.method(), original.body()) .build(); return chain.proceed(request); } }还有一点HttpURLConnection和OkHttp不要混用。统一用OkHttp Retrofit否则你会在证书校验、超时配置上重复踩坑。Retrofit的GsonConverterFactory会自动把JSON解析成Java对象但要注意日期格式的配置FastJson和Gson对“2025-06-18 10:00:00”这种格式的解析策略不一样后端返回的日期格式最好和前端约定死比如统一用“yyyy-MM-dd HH:mm:ss”。4.2 任务列表与多状态展示RecyclerView的分页与空态列表页是整个APP的门面。用RecyclerView展示任务列表需要处理状态对应的样式、优先级排序、分页加载三个问题。任务列表的排序规则建议未完成的任务按优先级排序高优先级在前同优先级按截止时间排序已完成的任务在列表底部按完成时间倒序。这个排序逻辑在后端SQL里做比在Android端做要省事得多SQL里用ORDER BY字段加CASE WHEN表达式就能搞定SELECT * FROM t_task WHERE user_id #{userId} ORDER BY CASE WHEN status 2 THEN 1 ELSE 0 END, priority DESC, deadline ASC分页的交互很简单下拉刷新加载第一页上滑到底自动加载下一页。但要注意一个经典问题——快速滚动时如果用户触发了两次相同的加载请求会产生重复数据。解决办法是加一个isLoading标志位上一次请求没结束前不发起新请求。实际上我更建议你直接接入Google的原生做法Paging 3库。虽然学习成本略高但在答辩环节你能讲出“我是用Paging库来处理分页数据和生命周期感知的”技术分量马上就不同了。任务列表的每个item用CardView包裹根据状态控制颜色if (task.getStatus() 2) { titleView.setTextColor(Color.GRAY); titleView.setPaintFlags(titleView.getPaintFlags() | Paint.STRIKE_THRU_TEXT_FLAG); } else { titleView.setTextColor(Color.BLACK); }这个“已完成任务画删除线”的效果虽然只是一个小交互但演示时很加分。4.3 新增与编辑任务表单校验和日期选择不能省新增任务的Activity里最容易被忽略的是表单校验。很多人只做非空判断但你要想清楚几个问题截止时间能不能早于当前时间提醒时间能不能晚于截止时间循环任务下截止时间应该怎么算我在代码里加了如下校验逻辑private boolean validateTask(Task task) { if (TextUtils.isEmpty(task.getTitle())) { Toast.makeText(this, 任务标题不能为空, Toast.LENGTH_SHORT).show(); return false; } if (task.getDeadline() ! null task.getDeadline().before(new Date())) { Toast.makeText(this, 截止时间不能早于当前时间, Toast.LENGTH_SHORT).show(); return false; } if (task.getRemindTime() ! null task.getDeadline() ! null task.getRemindTime().after(task.getDeadline())) { Toast.makeText(this, 提醒时间不能晚于截止时间, Toast.LENGTH_SHORT).show(); return false; } return true; }日期选择器建议用MaterialDatePicker比自带的DatePickerDialog好看也要写更少的适配代码。注意MaterialDatePicker的返回时间戳是UTC零点要转换成你本地时间再传后端不然你会发现日期总是差一天。4.4 本地提醒与循环任务AlarmManager的启动和重启提醒功能是任务管理APP的“灵魂”。很多同学做到最后一步才发现借助AlarmManager定时触发通知并没有那么可靠——手机关机重启、APP被杀都会导致定时器失效。我在实际测试中确认了一个让人头皮发麻的现象很多国产手机系统MIUI、EMUI会默认限制第三方应用的自启动权限锁屏一段时间后AlarmManager的闹钟会被系统休眠机制裁掉。此时你的应用必须引导用户去系统设置里手动开启“自启动”权限代码写起来不难但很碎Intent intent new Intent(); intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS); intent.setData(Uri.parse(package: getPackageName())); startActivity(intent);核心的闹钟注册方式AlarmManager alarmManager (AlarmManager) getSystemService(Context.ALARM_SERVICE); Intent intent new Intent(this, TaskRemindReceiver.class); intent.putExtra(task_id, task.getId()); PendingIntent pendingIntent PendingIntent.getBroadcast(this, task.getId().intValue(), intent, PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_IMMUTABLE); if (Build.VERSION.SDK_INT Build.VERSION_CODES.M) { alarmManager.setExactAndAllowWhileIdle(AlarmManager.RTC_WAKEUP, triggerTime, pendingIntent); } else { alarmManager.setExact(AlarmManager.RTC_WAKEUP, triggerTime, pendingIntent); }不要用setRepeating它不精确且在某些版本上会被系统自动对齐到省电窗口。循环任务的最佳做法是每个循环任务只在下一次触发时间点设置一个闹钟触发后由BroadcastReceiver做完任务处理后再计算下一次触发时间并注册下一个闹钟也就是用链式闹钟模拟循环。5. 测试、打包与答辩准备的实战经验5.1 模拟器测试的坑为什么“在我电脑上跑得好好的”进入联调阶段后我第一周几乎每天都会遇到“模拟器上正常真机上一堆问题”。后来总结出一个规律模拟器掩盖了太多问题一定要尽早用真机。常用的坑有三个:存储空间和适配问题。模拟器默认分辨率偏高很多同学的UI在模拟器上看着完美到真机小屏上就互相遮挡。建议适配至少三档屏幕1080p标准屏、长屏全面屏20:9、平板或大屏设备。网络问题。模拟器访问宿主机后端用10.0.2.2真机访问电脑后端得用局域网IP。很多同学忘了改BASE_URL导致真机一直连不上后端。我把BaseUrl放在BuildConfig里统一管理public class ApiClient { private static final String BASE_URL BuildConfig.API_BASE_URL; // ... }然后在build.gradle里分别配置buildTypes { debug { buildConfigField String, API_BASE_URL, \http://192.168.1.100:8080/\ } release { buildConfigField String, API_BASE_URL, \http://your-server.com/\ } }SSL明文请求问题。调试时后端是HTTP协议Android 9以上默认禁止明文流量。用networkSecurityConfig放行debug模式的明文访问release再用HTTPS。5.2 打包APK那些事签名文件、ABI和v1/v2签名打包APK看似简单但很多人在签署APK这一步会因为粗心遇到问题。核心注意事项必须使用自己的签名文件.jks不要用Android Studio默认的debug.keystore上架或交给老师。创建一个正式的签名文件keyAlias和密码要牢记住丢失就废了。签名版本要勾选v1 v2。如果只勾选v2在Android 7.0以下的设备上安装会失败只勾选v1高版本系统会提示签名不安全。release构建时要用R8/ProGuard混淆混淆规则文件里要加入Retrofit、Gson、OkHttp相关的keep规则否则运行时报错或者JSON解析不了。-keepattributes Signature -keepattributes *Annotation* -keep class com.example.task.entity.** { *; } -keepclassmembers class * { com.google.gson.annotations.SerializedName fields; } -dontwarn okhttp.** -dontwarn retrofit2.** -keep class retrofit2.** { *; } -keep class sun.misc.Unsafe { *; }打包成功后一定要在自己手机上装一次完整测试。我出现过release版本的按钮点击无反应debug却正常的情况后来发现是混淆把某个自定义Adapter的构造函数误删了。5.3 论文与答辩怎么把系统讲出层次感答辩十分钟重点不要花在三分钟的登录界面演示上而是分三个层次讲第一层讲需求分析。不要只说“用户需要一个待办清单”要说明任务的状态、优先级、循环、提醒这四个核心概念来自对真实使用场景的分析。这一层老师关注的是你的思考过程。第二层讲架构设计。贴出系统架构图Android端通过REST API与Spring Boot通信Spring Boot通过MyBatis操作MySQL。传统分层架构展示完立刻说清楚“为什么任务状态流转要放在后端而不是前端”因为状态流转是业务规则业务规则需要集中控制防止多个客户端直接操作数据产生冲突。第三层讲难点与方案。把你做的循环任务、链式闹钟、状态机校验这几个亮点拿出来讲。这套组合拳打下来老师问的问题基本不会超出这个范围了。还需要准备一些容易被追问的问题“完成任务后提醒还会不会触发”答案是完成状态切换时要同时取消这个任务在AlarmManager里所有未触发的闹钟并删除对应的PengingIntent。“多设备登录同一账号任务怎么同步”答案是你的系统以服务端数据为准每次打开APP都刷新数据不做本地离线的复杂同步这是权衡后的取舍。“用户量大之后怎么办”说明分页查询已经具备基本数据量应对能力后续可以复用连接池、加Redis缓存但这不是当前方案的核心重点。5.4 一份看起来更“高级”的个人体会做完这个项目我对工程化最深刻的感受是优先保证数据的确定性再去优化体验。任务状态改错了、提醒时间算错了这些是数据确定性错误比界面丑、加载慢要致命得多。把最能保证确定性的逻辑放在后端而不是UI层可以避免很多奇怪的并发问题。第二个体会是项目里一些看起来平平无奇的字段设计比如把deadline和remind_time分开一开始可能觉得多余但真正做到提醒功能时才发现这不只是数据规范性问题而是业务逻辑的基本盘任务管理系统的复杂度和成熟度很大程度上就看能不能把这些“小事”想清楚。最后如果你也在做这个题目最值得花时间的两个功能模块是状态流转和循环提醒。把这两个模块讲透你的系统性思考能力、业务建模能力和动手能力都能在答辩时清晰地展现出来。祝顺利。

相关新闻

蓝桥杯C++备赛:数据结构与STL容器实战指南

蓝桥杯C++备赛:数据结构与STL容器实战指南

1. 为什么DAY5只练数据结构:竞赛里的“地基”思维1.1 从一道送分题看数据结构的价值如果你参加过蓝桥杯,哪怕只是做过几套真题,一定会发现一个规律:C组的题目里,真正考“奇技淫巧”的并不多,大部分题目的核…

2026/10/9 6:04:00 阅读更多 →
无网络环境下Docker复杂应用离线迁移完整指南:从镜像到数据

无网络环境下Docker复杂应用离线迁移完整指南:从镜像到数据

最近接手了一个挺棘手的活儿:要在完全无网络、也没有私有镜像仓库的隔离环境里,把一套十几台容器、涵盖数据库、缓存、消息队列、应用前后端、定时任务的多应用复杂 Docker 环境,原封不动迁到另一台新机器上。很多人一听"无网络、无镜像…

2026/10/9 6:04:00 阅读更多 →
Flutter组件鸿蒙化适配全流程实战:以books_finder图书检索库为例

Flutter组件鸿蒙化适配全流程实战:以books_finder图书检索库为例

最近在做 Flutter 跨端组件库的鸿蒙化适配时,正好把一套自维护的图书检索组件 books_finder 移植到了鸿蒙生态上。这个组件的主要定位是图书元数据的聚合检索、数据资产标准化管理以及精确检索匹配,在安卓和 iOS 上已经跑了小半年,这次折腾鸿…

2026/10/9 6:04:00 阅读更多 →

最新新闻

Agent-Reach:LLM API智能路由与成本可控调度中枢

Agent-Reach:LLM API智能路由与成本可控调度中枢

1. 项目概述:Agent-Reach 是什么?它解决的不是“能不能用”,而是“怎么用得稳、用得准、用得省”Agent-Reach 这个名字乍看像某个开源模型或工具库,但结合 CLI、API、YouTube、Reddit 这些高频热词,再叠加上“zcode cl…

2026/10/9 6:34:27 阅读更多 →
HTML5移动端拍照上传全链路实战:从getUserMedia到EXIF修正与断网续传

HTML5移动端拍照上传全链路实战:从getUserMedia到EXIF修正与断网续传

简介:本资源是一套面向Web前端开发者与全栈初学者的HTML5移动端拍照上传实战方案,聚焦在普通HTTP环境下调用手机摄像头实时拍照并上传至PHP后台的核心功能实现。资源共22个文件,包含1个可直接运行的index.html主页面、1个uploadfile.php服务端…

2026/10/9 6:34:27 阅读更多 →
Jetpack Compose与HarmonyOS ArkUI状态管理对比:从remember到@State的迁移指南

Jetpack Compose与HarmonyOS ArkUI状态管理对比:从remember到@State的迁移指南

我去年接了一个双端项目——既有Jetpack Compose写的Android端,又有HarmonyOS的ArkUI版本。一开始我想着:"都是声明式编程,Compose和ArkUI应该差不多。"结果真正写起来才发现,UI描述方式的相似只是表象,单是…

2026/10/9 6:34:27 阅读更多 →
基于SpringBoot+Vue的二手车交易系统:从业务拆解到部署实践

基于SpringBoot+Vue的二手车交易系统:从业务拆解到部署实践

做一个二手车交易系统,听上去像是个老掉牙的练手项目,但真把它拆开来看,你会发现它几乎把一个商业项目该有的技术问题都覆盖了一遍。基于SpringBootVue的二手车交易管理系统源码,配上MyBatis和MySQL,这套组合不是什么花…

2026/10/9 6:34:27 阅读更多 →
带平衡约束的最短路:从ICPC Ballance题看帕累托状态压缩

带平衡约束的最短路:从ICPC Ballance题看帕累托状态压缩

题目名是Grand Prix of Ballance,从ICPC 2024成都站出来的。我第一眼看到这个标题的时候,第一反应是“Ballance”这个单词拼错了还是故意玩梗,后面在大屏幕上看到题目背景里那个悬浮轨道和滚动的小球,才确认就是那个经典的平衡球游…

2026/10/9 6:34:27 阅读更多 →
Vue 3 网络请求封装与 Element Plus 组件库选型实战指南

Vue 3 网络请求封装与 Element Plus 组件库选型实战指南

1. 项目到了第10节,网络请求这关必须打通学 Vue.js 看到“网络请求”这一节,很多人的第一反应是“不就是调个接口嘛”。但真到了实际项目里你会发现,网络请求层的设计决定了你后面写页面是舒服还是遭罪。这一节的内容说白了就两件事&#xff…

2026/10/9 6:33:26 阅读更多 →

日新闻

Java时间API实战:LocalDate、Date与ZonedDateTime的转换与避坑指南

Java时间API实战:LocalDate、Date与ZonedDateTime的转换与避坑指南

Java时间API这个话题,隔三差五就会在群里被翻出来讨论一次。上周还有个同事线上处理一个订单超时问题,排查到最后发现是ZonedDateTime序列化后时区丢了,用户在下单当天晚上看到的时间整整差了8个小时。这类问题几乎每个做Java开发的人都遇到过…

2026/10/9 0:00:49 阅读更多 →
EasyTier实践:从NAT穿透到子网代理的异地组网部署与排错

EasyTier实践:从NAT穿透到子网代理的异地组网部署与排错

前几个月我手头有好几台机器需要互相访问:办公室台式机、家里 NAS、还有一台云主机。如果只是偶尔传个文件倒还好,问题是工作场景经常要在几处环境之间来回切换,每次都先登录跳板机再层层代理,实在折腾。我先后试过端口映射、自建…

2026/10/9 0:00:49 阅读更多 →
AI Agent工程实战:从七要素到七个决策点的系统设计指南

AI Agent工程实战:从七要素到七个决策点的系统设计指南

AI Agent 这个词在过去一年里被反复提及,但真正动手搭过一套能跑起来的 Agent 系统的人都知道,从"知道它是什么"到"让它稳定干活"之间隔着一整套工程决策。我前后参与过几个 Agent 项目的落地,从最初用现成框架拼装&…

2026/10/9 0:01:50 阅读更多 →

周新闻

KT148A语音芯片外挂8002D功放的工程实践指南

KT148A语音芯片外挂8002D功放的工程实践指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/8 15:26:32 阅读更多 →
LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/8 15:26:40 阅读更多 →
ARM架构深度解析:从RISC设计理念到交叉编译实战

ARM架构深度解析:从RISC设计理念到交叉编译实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/8 10:10:36 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/8 21:13:17 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/8 15:26:17 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/9 6:17:20 阅读更多 →