
1. 项目整体设计与技术选型拆解1.1 这个项目到底是什么、适合谁来做每年毕业季总有同学在毕设选题上卡壳而“个人日记本”这类项目之所以常年热门是因为它看起来简单但想做出亮点并不容易。这个题目的完整描述是基于 Android 的手机个人日记本搭配 SpringBoot 后端做成一套安卓智能个人日记管理 APP核心功能围绕生活记录与心情随笔展开。我为什么要反复强调“后端”这两个字因为很多新手一看到“日记本”第一反应是“这不就是本地记事本吗一个 SQLite 就搞定了”。如果真按这个思路做你的选题就白白浪费了。题目里明确写了 SpringBoot这意味着它是一套前后端分离的客户端-服务器架构手机端负责录入、展示、编辑服务端负责数据的持久化、备份、统计和用户管理。这种设计不仅撑得起论文里的“系统架构”章节也让数据库设计、接口设计、权限控制都有话可写。这个项目适合谁适合那些有一定 Java 基础、但没完整做过一个前后端联调项目的人。它不像电商、秒杀那类系统业务繁杂核心实体就两个维度用户、日记。把这两个维度做扎实再往周边扩展标签、心情统计、日历视图、搜索等功能整个毕设的工作量和深度就都够了。我也建议如果你的时间只有两三个月把精力集中在这一套闭环上不要想着塞太多花哨功能。1.2 技术栈选型的底层逻辑为什么是 Java Android SpringBoot先说安卓端。题目限定了 Java Android也就是说你用 Kotlin 或者 Flutter 都属于跑偏至少在毕设答辩时会被质疑“和题目不符”。Java 写安卓虽然啰嗦但它有一个巨大优势你能把 Activity 生命周期、Adapter 绑定、线程切换这些安卓基础概念讲得非常清楚这对答辩非常有利。Kotlin 的语法糖太多很多代码你写完了但说不明白老师一问就露馅。所以如果你不是 Kotlin 高手老老实实用 Java 是明智的。再说后端。SpringBoot 是目前 Java 后端最主流的框架它帮我们把 Spring 的繁琐配置全部自动化了配合 MyBatis-Plus 操作数据库开发效率非常高。有人会问”毕设而已直接用 Servlet JDBC 行不行”技术上当然行但那样你要手动管理连接池、事务、参数映射代码量会翻倍而且论文里写上 SpringBoot 比写 Servlet 体面得多以后找工作面试时SpringBoot 也是必问的东西提前做项目等于提前复习。数据库选型推荐 MySQL 5.7 或 8.0理由很实际网上资料最多Navicat 操作最简单出现中文乱码、时区问题这些坑时随便一搜就有答案。SQLite 在这套架构里只配当客户端的本地缓存不能当服务端主库。至于 Redis题目没要求但如果你的系统里做了验证码、在线状态管理这些功能加一个 Redis 缓存作为加分项完全可以后面我会讲到怎么加。1.3 功能模块拆解从“记日记”到“生活记录系统”题目里有三个关键词个人日记本、生活记录、心情随笔。这三个词实际上对应三种不同的功能深度。我在实际设计功能时把系统拆成了以下几个模块每个模块在论文里都能独立成章用户模块注册、登录、修改密码、个人资料。这是所有系统的地基对应 JWT 鉴权方案。日记模块新建、编辑、删除、查看日记。要求支持标题、正文、心情标签、天气、图片附件这是核心模块。分类与标签模块给日记打标签比如“工作”“学习”“旅行”“随笔”支持按标签筛选这是生活记录的体现。日历与时间线模块按日期维度展示日记日历上标出有日记的日期点击某天查看当天内容。这是最能体现“日记”属性的功能。心情统计分析模块根据用户给日记打的情绪标签开心、难过、平静、焦虑等生成简单的统计报表比如本周心情趋势、各类心情占比。对应“心情随笔”这四个字。搜索模块按标题、正文内容的关键字搜索日记。草稿与回收站未写完的日记自动存草稿删除的日记先进回收站7 天内可恢复。这个功能不算难但非常体现“智能管理”的细节。这套功能拆下来前台Android 后台服务端接口 数据库三部分内容都非常丰满。接下来我把每一部分的实现核心细节拆开讲。2. SpringBoot 后端核心实现要点2.1 数据库设计与表结构规划数据库设计是论文里的重头戏也是评委老师最常翻的一页一定要认真做。我设计了三张核心表加一张可选表用户表 t_user字段类型说明idbigint主键自增usernamevarchar(50)用户名唯一索引passwordvarchar(255)加密后的密码nicknamevarchar(50)昵称avatarvarchar(255)头像路径create_timedatetime注册时间statustinyint状态1 正常0 禁用日记表 t_diary字段类型说明idbigint主键user_idbigint所属用户外键约束到 t_user.idtitlevarchar(120)日记标题允许为空contenttext正文内容moodvarchar(20)心情标签开心/难过/平静/焦虑/愤怒weathervarchar(20)天气晴/多云/雨/雪imagesvarchar(1000)图片路径多个用逗号分隔is_drafttinyint0 正式1 草稿is_deletedtinyint0 正常1 回收站create_timedatetime创建时间update_timedatetime最后修改时间标签表 t_tag和日记-标签关联表 t_diary_tag多对多关系字段类型说明idbigint主键tag_namevarchar(30)标签名user_idbigint标签归属用户关联表主要两个字段diary_id 和 tag_id。设计的时候有几个容易踩的坑我提前说清楚。第一content 字段一定要用 text不要用 varchar(255)因为心情随笔很容易写长文255 根本不够。第二凡是涉及按用户查询的字段user_id必须建索引日记表上我给 user_id 和 create_time 建了联合索引这样“某用户按时间倒序查日记”这条最核心的 SQL 才不会慢。第三删除操作不要用物理删除用逻辑删除标识is_deleted 字段既保留了数据完整性的追溯能力又让论文里有“回收站”的设计依据。2.2 接口设计规范与 JWT 鉴权方案后端接口是 Android 端的数据通道设计得好不好直接决定联调时你加班的多少。我建议所有接口统一前缀/api/diary并遵循 RESTful 风格比如POST /api/user/register注册POST /api/user/login登录GET /api/diary/list?page1size10分页获取日记列表GET /api/diary/detail/{id}获取日记详情POST /api/diary/save新建或保存日记PUT /api/diary/update修改日记DELETE /api/diary/delete/{id}逻辑删除GET /api/statistics/mood获取心情统计关于鉴权千万别用自己写 Session Cookie 那套安卓端处理 Cookie 很麻烦而且状态保持容易出问题。我推荐**JWTJSON Web Token**方案流程不复杂用户登录成功后服务端生成一个包含用户 ID 和过期时间的 Token 返回给客户端客户端在后续每个请求的请求头里带上Authorization: Bearer token后端写一个拦截器专门解析这个 Token解析成功就放行失败就返回 401 让用户重新登录。JWT 的优势在于服务端不需要存 Session天然适合前后端分离的移动应用。我做了一个小细节在生成的 Token 里只放 user_id 和过期时间不放敏感信息同时在拦截器里把解析出的用户信息放进 ThreadLocal这样业务代码里随时可以拿到当前用户不用每个方法都传一遍 userId。这个小技巧换来的代码清爽度非常高。如果你想让项目更有技术含量可以再把 Token 存入 Redis 做单点登录控制Redis 里查不到就拒绝访问这样用户改了密码后旧 Token 立即失效这个思路在答辩时讲出来是加分项。2.3 心情统计与生活记录的数据分析玩法“心情随笔系统”的落脚点是“心情”如果只是存一段文字就太浪费这个题目的设定了。我在后端加了一个心情统计分析接口Android 端用图标展示。实现的原理不复杂我在日记表中设计了 mood 和 weather 字段用户在写日记时选择“开心/难过/平静/焦虑/愤怒”之一同时选择天气。统计时按日期范围分组求和返回类似下面的数据结构和前端图表对接。{ date: 2025-06-01, total: 3, moodStat: { 开心: 2, 平静: 1 }, weatherStat: { 晴: 2, 雨: 1 } }这里有个设计的细节统计不仅仅按“天”维度我做了“最近 7 天趋势”。怎么实现最简单的方式是在 SQL 里用DATE_SUB(CURDATE(), INTERVAL 7 DAY)过滤出最近 7 天的记录再按日期和心情分组。如果觉得 SQL 复杂也可以查出原始记录后在后端 Java 代码里用 Stream 分组统计。我建议用后一种方式因为 DAO 层代码更好维护而且你可以在论文里写“通过 Java 8 Stream 流式处理高效完成数据聚合”面试问到 Lambda 时也有项目案例可以讲。另外我还加了一个“情感关键词抽取”的小功能写日记时后端返回一段分析文本提示用户这段文字偏向什么情绪。这个功能是当年的亮点。实现方式没有想象中复杂不用上机器学习。我用 HanLP 分词库加载了一个简单的情感词典把正文拆成词按词典计算积极词和消极词数量最后得出情感倾向。华为手机的用户可能对这类“输入法分词”不陌生对毕设来说调一个现成的高质量分词库比训练模型更可控也更好讲清楚原理。3. Android 客户端开发过程与关键实现3.1 安卓工程搭建与环境配置避坑这部分往往是最消磨耐心的因为环境问题千奇百怪。如果你用的是新电脑我建议直接用Android Studio 最新稳定版 Gradle 8.x SDK 34的组合不要刻意追求旧版本。网上很多教程让你装 JDK 8、Gradle 4.x那是两三年前的思路了现在新版的 Android Studio 对 JDK 17 的支持已经很稳定。如果你只能下到老版教程记住一个原则Android Studio 自带的 JDK 路径是jbr目录很多同学卡在“java 环境变量配置”上其实就是没弄清楚系统里的 JDK 和 Android Studio 内置的 JBR 是两个东西。我配置环境变量时只改 JAVA_HOME 指向 JDK 目录然后 Android Studio 里的 Project Structure 单独选择对应的 SDK 和 Gradle 版本两边互不干扰。设置中文界面也是新手问得非常多的问题Android Studio 没有官方的中文菜单设置网上说改配置文件的方法在新版本上已经失效。实际情况是新版 Android Studio 的界面语言跟随系统语言如果你把操作系统改成中文环境IDE 菜单就自动变中文。如果不想改系统语言那你就接受英文界面吧反正常用菜单就那么几个很多时候中文教程翻译反而对不上原英文菜单选项。说到工程结构我用的是单 Module MVP 思想没有刻意追求网上的 MVVM 架构。原因很直接MVP 在面试、毕业答辩时最好讲解P 层负责业务逻辑V 层负责刷新 UIM 层负责数据操作。我用 MVP 把登录、日记列表、详情编辑三个核心页面各写了一套接口和实现类结构清晰代码可读性良好周五写的代码周一自己还能看明白。当然如果你的指导老师要求使用 LiveData ViewModel 那套也可以调整不影响整体设计。3.2 网络层封装Retrofit OKHttp 统一的请求状态处理安卓端访问后端接口我强烈建议用Retrofit 2 OKHttp的组合而不是裸写 HttpURLConnection。理由有几点第一Retrofit 用注解定义接口非常直观代码量少一大半第二OKHttp 自带连接池和超时控制稳定性远高于手写网络代码第三Retrofit 支持 Gson 自动解析 JSON响应数据直接映射成 JavaBean省去手动解析 JSON 的痛苦贴一段核心封装思路帮助你理解整体结构。// Retrofit 单例封装核心配置一目了然 public class RetrofitClient { private static final String BASE_URL http://your-server-ip:8080/api/; private static Retrofit retrofit null; public static Retrofit getInstance() { if (retrofit null) { synchronized (RetrofitClient.class) { if (retrofit null) { OkHttpClient client new OkHttpClient.Builder() .connectTimeout(10, TimeUnit.SECONDS) .readTimeout(15, TimeUnit.SECONDS) .addInterceptor(new TokenInterceptor()) // 自动携带 Token .build(); retrofit new Retrofit.Builder() .baseUrl(BASE_URL) .client(client) .addConverterFactory(GsonConverterFactory.create()) .build(); } } } return retrofit; } }这里有一个关键细节BASE_URL 的 IP 地址问题。如果你用 Android 模拟器访问本机后端地址不能写localhost或127.0.0.1因为模拟器访问宿主机的地址是10.0.2.2。如果你用真机就要写你电脑在局域网里的 IP 地址而且 Android 默认禁止明文 HTTP 请求你需要在 AndroidManifest.xml 的 application 节点里加上android:usesCleartextTraffictrue否则网络请求会直接报错。这两个坑我当年都踩过能把人逼疯——接口明明用浏览器访问都是好的App 里就是请求失败。3.3 日记列表、编辑器和日历视图的实现要点日记列表页是整个 App 的门面我用 RecyclerView LinearLayoutManager 实现每个条目展示标题、心情标签、时间、正文摘要。这里有一个经验列表 item 不要一次把 content 全部展示用android:maxLines2加上android:ellipsizeend截断成两行摘要观感更干净。每一个条目我绑定了点击跳转详情、长按弹出删除菜单两个基本操作另外加了一个“置顶”功能用日记表里的 is_top 字段标记列表排序时置顶记录优先展示。这个小功能成本极低但演示的时候很讨喜。编辑页是用户写日记的主战场。顶部放标题 EditText中间放正文 EditText底部放一排心情标签多选一和天气多选一再加一个添加图片的入口。正文编辑框我做了自动保存草稿功能用户进入编辑界面后在 onStop 生命周期回调里如果发现正文非空但没点击保存就自动调一次“保存草稿”接口。这个设计一方面避免用户手滑退出导致内容丢失另一方面也体现出“智能个人日记管理”的印象。日历视图我直接用了开源库没有自己画格子。实现逻辑其实不难加载当前月份的日历从后端拿用户在当前月份所有“已发布”日记的日期列表在对应日期上画一个圆点标记用户点击有标记的日期下方列表显示当天的日记。这里面有一个性能优化点不要一次性把一年的日记全查出来再筛选而是只查当前月份范围内的记录查询 SQL 写成WHERE user_id ? AND create_time BETWEEN ? AND ?加上联合索引压力很小。3.4 本地加密存储与隐私保护设计日记是个人隐私数据安全设计薄弱的话答辩老师一定会发难。我在本地用Android Keystore SQLite 加密提供了一层保护。具体做法是把日记正文在保存进本地缓存库之前先用 AES 加密密钥存储在 Android 系统的 Keystore 里攻击者即使拿到数据库文件也读不出明文。当然这个设计在公网传输时还可以配合 HTTPS 使用但毕设环境一般是局域网所以我只在本地存储环节做了强加密网络传输靠 Token 鉴权兜底论文里强调“数据本地加密 服务端备份”的双重策略就能说圆。有了这些模块安卓端的内容已经非常饱满。但除了功能实现真实开发中真正磨人的是那些环境问题、编译报错和联调异常。我把最常见的几个问题单独整理成一节都是我当时实际踩过、也帮学弟学妹排查过的坑。4. Android 客户端开发过程与关键实现续4.1 日记列表的缓存策略数据库优先还是网络优先缓存策略是移动端开发里一个非常重要的设计点。我采用的是先读本地数据库展示、再请求网络更新的模式也常被称为 Cache First 策略。用户打开日记列表时界面先一秒内展示本地缓存的数据用户不会感到等待同时后台发起网络请求拿到新数据后刷新列表。实现上我在 Android 端引入 Room 数据库把日记的快照存在本地表里。这里的“快照”指的是日记 id、标题、心情、更新时间、正文摘要等列表页需要的字段不需要把整篇正文都缓存下来。等用户点击某条日记进详情页时如果本地已有且未过期就直接展示否则拉取服务端最新内容。这样一来整个 App 的响应速度会明显快于每次进入都去请求网络的方案体验差别很大也是论文里可以写进“系统优化”章节的素材。4.2 图片选择与上传的兼容性处理写日记配图是“生活记录”的天然需求但安卓的图片选择是一个兼容性重灾区。不同的安卓版本推荐使用不同的 API如果处理不当手机会弹出“没有应用可执行此操作”的尴尬提示。我最终采用的方式是使用系统框架的ActivityResultContracts.GetContent或PickVisualMedia来选择一个图片拿到图片后先做压缩处理再上传。压缩逻辑不复杂读取图片的宽高计算采样率用BitmapFactory.Options.inSampleSize降采样把一张几 MB 的照片压到几百 KB既节省服务端空间也加快上传速度。上传接口我单独写了一个 Multipart 请求后端用 SpringBoot 的MultipartFile接收保存到服务器某个目录并把访问路径返回给客户端。这里提示一个后端细节上传目录要配置成静态资源映射否则通过浏览器访问http://ip:8080/images/xxx.jpg会得到 404。SpringBoot 里需要添加一个WebMvcConfigurer的配置类把本地磁盘目录映射到/images/**虚拟路径上。4.3 搜索、标签筛选与夜间模式等体验功能搜索功能的实现难度不大胜在方便。后端用 MyBatis-Plus 的like查询就能搞定搜索范围限定在当前登录用户自己的日记范围内搜索条件包含标题、正文、心情标签三个字段。如果数据量到达万级以上like查询会变慢到时候可以用 Elasticsearch 或 MySQL 全文索引来优化但毕设规模不用考虑这个问题把接口设计好就行。标签筛选功能的 API 设计是GET /api/diary/list?tag学习后端先按用户和标签关联表查出符合 tag 的日记 id 集合再以分页的方式返回这些日记。页面上的标签入口加了一个二级筛选抽屉点开以后横向排列所有标签当前选中的高亮显示。夜间模式我用了最简单的方式在 res 目录下建values-night的资源文件夹把颜色和背景图都放到对应的主题资源里通过AppCompatDelegate.setDefaultNightMode切换日间/夜间主题。这里不需要复杂的框架系统原生支持就是答案。5. 常见问题排查与系统部署上线记录5.1 环境配置阶段的高频报错做这个项目的人十个有九个会先死在搭建环境这一步。我把最常见的问题整理成了速查表你按顺序检查基本都能解决。现象原因解法Unsupported class file major versionGradle 版本和 JDK 版本不匹配统一 JDK 到 17并对应 Gradle 8.x 及以上Android Studio 提示SDK location not foundSDK 路径未被正确识别在 local.properties 里显式写sdk.dirD\:\\Android\\Sdkconnect timed out模拟器访问后端失败模拟器访问宿主机端口地址错误将 IP 改成http://10.0.2.2:8080CLEARTEXT communication not permittedAndroid 9 默认禁止明文 HTTPAndroidManifest 里配置usesCleartextTraffictrueMyBatis 出现Invalid bound statement接口和 XML 映射没绑定确保 mapper 接口和 XML 的 namespace、id 对应中文乱码连接串缺编码参数JDBC URL 加characterEncodingutf8useSSLfalse每次实验课上和学弟学妹复盘时我发现很多问题不是语言层面而是“自以为配好了”。比如环境变量配置完一定要新开一个终端窗口因为旧窗口不会刷新Android Studio 里改完 Gradle 配置后不要只点 Sync 就了事遇到诡异问题直接 File - Invalidate Caches 清理缓存重启解决率高达八成。我配置环境的顺序是先装 JDK 并验证java -version再装 Android Studio第一次启动让它自动下载 SDK 和 Gradle然后新建一个空项目跑通一次“Hello World”裸工程最后再把写好的业务代码导进去。千万不要一上来就导入别人完整的项目因为你根本分不清报错是项目本身的问题还是你环境的问题。5.2 后端冷启动与数据库初始化的两个细节SpringBoot 端常见的两个接口问题是“表不存在”和“第一次部署时数据初始化难配”。表不存在的问题如果你使用 MyBatis-Plus它其实内置了一个初始化 SQL 执行的机制原理和 Flyway 类似。具体操作分三步把建表语句写在项目的src/main/resources/schema.sql中然后配置spring.sql.init.modealways让它每次启动都尝试执行再配合CREATE TABLE IF NOT EXISTS语句这样数据库即使从零开始应用一启动表就自动建好了。这个技巧不是每个 SpringBoot 教程都强调的但在毕设答辩环境里非常实用因为评委老师可能会让你现场换一台机器运行你没有时间手动去数据库执行脚本。另一个值得一提的问题是 Redis。如果你按照我之前说的方法把 Token 存到了 Redis那么 Redis 没启动时应用会报连接失败。我排错时的经验是先把 Redis 的配置项放到application.yml并配好spring.data.redis.host、port、password三个参数如果还没启动其实不会阻塞业务接口因为我在代码里加了熔断逻辑获取 Token 的 Redis 操作 try-catch 包住Redis 不可用时降级为不校验单点登录只用 JWT 本身的有效性。这在开发阶段省了很多功夫也体现了容错思维。5.3 真机调试与打包发布经验最后是打包。安卓端打正式包需要签名Android Studio 里 Build - Generate Signed Bundle / APK 会引导你创建 keystore。这个 keystore 文件和密码一定要备份好丢了意味着以后永远无法更新你发布过的应用只能卸载重装。我自己的习惯是在项目根目录建一个keystore文件夹把签名文件放进去然后在 build.gradle 里用环境变量引用密码不要明文写在代码里以免被人利用。论文的展望部分你还可以提一句“后续可将应用上架应用市场通过多渠道打包实现自动化发布”显得对工程化流程有完整认识。真机调试我建议使用 Android Studio 自带的无线调试功能Android 11 及以上版本支持在开发者选项里打开无线调试扫码即可连接省去 USB 线老被干扰的烦恼。调试时打开 Logcat过滤关键字okhttp和System.err大部分接口问题的报错原因都能看到。6. 项目演示顺序与论文答辩的经验建议项目做到这里功能已经齐了但毕设最终还是要落到答辩现场。我吃过“做的挺好、讲不明白”的亏所以给你梳理一个演示顺序先展示用户注册登录再新建一篇带心情、标签和图片的日记回到列表页演示标签筛选和搜索然后切到日历视图指出对应日期的标记接着打开心情统计页用刚才写的数据验证统计结果最后把日记移入回收站再恢复。这一套流程走下来功能覆盖全面逻辑顺畅。论文目录建议按照绪论、相关技术介绍、需求分析、系统设计、系统实现、系统测试、总结与展望来写。相关技术介绍不要写成名词解释堆砌要结合本项目讲为什么用它。比如写 Android 时讲你用了 Activity、RecyclerView、Room 的哪些能力扩展名就叫做“Android 平台与关键组件技术分析”这样老师一看就知道你没有背概念。根据我帮同学改论文的经验最容易拿高分的细节有三处第一数据库设计章节给出 E-R 图和详细表结构说明并讲清楚为什么冗余了速度快的字段第二系统实现章节在关键代码旁用文字说明设计意图体现“为什么这么写”的思考第三系统测试部分用真实操作场景写测试用例而不是只写“系统运行正常”。7. 写在最后的体会与扩展方向这个项目我从搭框架到最后跑通前后花了不到三周时间大部分时间其实花在环境配置和联调排错上。现在回头想如果一开始就把 JWT 方案、缓存策略、异常处理这三件事想清楚后面基本不会有大返工。个人日记本虽然看起来只是“写写画画”的 App但它把 Android 客户端开发、Java 后端、数据库设计、网络通信、数据加密等知识点全部串了起来你把这个项目吃透技术上不仅拿到了毕设的分数对校招面试的阶段也能积累不少实战素材。做完核心功能后如果你想继续加亮点我整理过几个性价比高的方向一是日记语音输入利用系统语音识别 API 把录音转成文字二是心情趋势图表结合 MPAndroidChart 让统计页面更直观三是多端同步在原有服务端接口架构上额外做一个 Web 管理后台思路几乎是现成的。这几个扩展方向任选一个都能让项目在答辩里脱颖而出。做这种系统的经验就是核心代码不贪多而是认真写出几条“能讲清原理”的链路演示时把每一步的取舍说清楚比你堆十个页面更打动人。