ARTICLE DETAIL

资讯详情

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

Android垂钓服务App毕业设计实战解析

Android垂钓服务App毕业设计实战解析 1. 选题的价值判断垂钓服务App为什么是合适的毕业设计每年毕业季计算机专业的学生都在纠结同一个问题毕业设计到底做什么选题选题太简单导师觉得工作量不足选题太难自己又hold不住最后熬到答辩前夜还在疯狂调bug。我接触过不少本科毕设项目也指导过几届学弟学妹的Android方向课题负责任地说一句基于Android的垂钓服务App这个题目在毕业设计选题里属于性价比很高的一类——它踩中了所有评审老师会关注的点完整业务闭环、真实用户场景、Android全栈技能覆盖而且实现难度对一个认真做毕设的本科生来说是可控的。1.1 垂钓人群的真实痛点决定了App的刚需属性先说需求侧。很多人一听垂钓服务App就觉得小众其实这个判断是错的。国内休闲垂钓人群规模在千万级而且年龄分布非常广从二十多岁的年轻钓友到退休后的中老年爱好者都有。你随便打开钓鱼论坛或者短视频平台搜一下钓点攻略就会发现一个非常明显的现象好的钓点信息极度分散有的在贴吧里有的在抖音评论区里有的在老钓友的微信群里没有一个统一的信息聚合平台。这个痛点用产品经理的话来说就是信息不对称。钓鱼的人想知道附近哪里能钓、鱼情怎么样、怎么去、收费不收费场地方或者鱼塘主想让更多人知道自己的钓场钓友之间想交流鱼饵配方、装备经验。这三方需求正好对应了App里的三大核心模块钓点地图、社区交流、个人中心。这也就意味着这个毕设题目不是一个空壳功能demo而是有真实业务逻辑支撑的完整应用写论文的时候有大量需求分析内容可以展开不用担心论文没东西写。1.2 与常见电商类、新闻类选题的对比优势很多学生毕设喜欢选仿淘宝仿今日头条这类题目不是说不行而是太泛滥了答辩老师一眼就能看出是照着教程敲的问两句细节就露馅。垂钓服务App的优势在于它同时包含了电商App的典型结构列表、详情、购物车式的收藏流程、社交App的典型结构发帖、评论、点赞、工具类App的典型结构地图定位、信息展示但又不完全复刻某一个成熟产品这让它看起来有原创性也给了你在答辩时讲为什么这么设计的充足素材。更重要的是垂钓这个具体的业务场景能逼着你处理一些教科书里不会明说但实际开发天天遇到的问题。比如高德地图SDK的key配置、经纬度坐标转换、RecyclerView加载大量图片的卡顿、Token过期后的自动登录逻辑。这些问题每一个都是真实项目里工程师会面对的做完这个项目你对Android开发的理解比做十个仿淘宝Demo都深。1.3 工作量边界既能撑起论文篇幅又不失控毕设最怕的不是没得写而是写不完。垂钓服务App的合理工作量是客户端Android端完成登录注册、钓点地图展示、帖子社区、个人中心四大模块服务端用一个简单方案支撑比如本地JSON模拟、或者基于Spring Boot写一套轻量接口数据库完成核心表设计。这个体量一个学生在三个月内完成是可以实现的论文写出来大约在70到100页。如果再往深了做比如加实时天气和水情数据、连接硬件传感器测水温那就是研究生的课题范围了本科阶段不需要也不建议。所以这个选题的第一个价值判断结论是需求真实但不复杂功能完整但不冗余风味纯正且不内卷。2. 需求分析与功能模块从功能清单到页面流转做毕设和做产品的区别在于毕设需要把过程展示清楚。评审老师不在乎你的App能不能上架应用市场他们想看的是你有没有完整走一遍需求梳理→功能设计→技术实现→测试验证这套流程。所以这一章我按毕设开题报告的逻辑把这个App的需求和功能模块拆给你看你照着这个思路去写需求文档和用例图基本不会跑偏。2.1 用户端核心功能清单垂钓服务App的用户角色比较简单普通用户钓友、管理员。用户端的功能可以整理成下面这个表格功能模块子功能功能说明优先级用户系统注册、登录手机号/用户名密码注册登录密码加密存储高用户系统个人信息维护头像、昵称、个人简介、所在城市中钓点模块钓点地图基于高德/百度地图展示附近钓点标注高钓点模块钓点详情钓点名称、位置、鱼种类型、收费/免费、评价高钓点模块钓点收藏收藏感兴趣的钓点方便后续规划行程中社区模块发布帖子图文发帖记录钓获、分享钓点攻略高社区模块帖子列表与详情浏览、点赞、评论帖子高个人中心我的收藏/我的帖子查看自己产出的内容和收藏记录中管理员用户管理禁用违规用户、查看用户列表低管理员内容审核删除违规帖子与评论低这个清单里高优先级的四个模块就构成了你毕设的骨架中级优先级的模块是骨架上的血肉低优先级的管理员功能是答辩时证明你考虑到了完整业务闭环的加分解。我见过不少学生的毕设把大量精力花在做花哨的动画效果上结果连最基础的登录流程都没跑通这就本末倒置了。2.2 角色权限与用例设计用例图的画法每个学校要求不太一样但核心用例必须覆盖游客可以浏览钓点地图和帖子列表注册用户可以发帖、评论、收藏管理员可以审核内容和禁言用户。这里有一个细节要注意游客能不能看地图我建议可以开放浏览但收藏和发帖必须先登录。这样设计有两个好处一是地图作为App的门面不登录就能看到信息会让用户觉得产品可用二是你在论文的权限设计章节里有话可讲。权限控制的具体落地在客户端层面就是界面的跳转逻辑在服务端层面就是接口的Token校验。很多学生只做了客户端隐藏按钮没做服务端校验答辩时老师一问你如果用户绕过客户端直接调接口怎么办就答不上来了。这一条要记住凡是涉及用户数据的操作服务端必须校验身份不能只靠前端隐藏入口。2.3 页面流转一个钓友从注册到发帖的完整路径页面流转图是论文里必放的图之一。我习惯用一条完整用户路径来梳理新用户打开App看到地图页地图上显示附近的钓点标注用户点击某个标注弹出钓点简卡点击查看详情看到钓点的收费情况、鱼种信息、其他钓友的评价用户觉得这个地方不错想分享自己的经历点击发帖按钮此时系统跳转到登录页用户注册并登录后进入发帖编辑页发完帖子帖子出现在社区列表里其他用户可以看到、点赞、评论。这条路径清晰定义了核心场景也决定了你的页面导航结构。导航栏采用底部Tab布局四个一级页面首页地图、社区、消息、我的。消息页在初级版本里可以只做系统通知和评论提醒的列表不用做即时通讯否则工作量又会失控。页面之间的跳转逻辑理顺了写代码的时候你会发现进度快很多因为每写一个Activity你都明确知道它的前驱和后继是什么。3. 技术选型与工程结构Android毕业设计的技术栈取舍技术选型是很多学生纠结的地方。先说结论如果基本功一般就用Java MVP HttpURLConnection或OkHttp Gson 原生控件不要一上来就整Kotlin协程、Jetpack Compose、MVVM全部梭哈。这话可能听着不够先进但毕设的核心目标是用你100%能掌控的技术完成一个逻辑完整、运行稳定、能讲清楚的系统。技术太新万一搭环境就卡你一周得不偿失。3.1 为什么选Java而不是Kotlin为什么选MVP而不是MVC这可能是被问得最多的问题。我的建议是如果你Java语法基础比较扎实就用Java如果你一门语言都还没学明白那就选你相对最熟的那个。Kotlin确实是现在Android开发的主流但很多学校的Android课程还在教Java学生用Kotlin写出来的代码自己都看不懂编译器报错答辩时问三句就露馅。反过来说你选Java答辩时可以说熟悉Java面向对象思想对Kotlin也有了解考虑到项目可维护性以及团队技术栈的一致性选择了Java这比硬装要好得多。架构上MVPModel-View-Presenter是毕设的黄金答案。它的好处在于把网络请求、数据解析这些耗时逻辑放在Presenter层Activity只负责更新UI这叫界面与逻辑分离。答辩老师问你为什么不直接在Activity里写网络请求你可以回答Activity里直接写会导致代码臃肿、难以测试MVP模式下Model层可以被单元测试覆盖Presenter层不依赖Android生命周期等等。这就是论文里可以展开写的点。MVC在Android里的问题就是Activity既当View又当Controller代码一多就变成面条代码这个坑很多Android开发者都踩过你大可不必再踩一遍。3.2 第三方库的取舍逻辑地图、图片、网络地图SDK是必修课。国内用户量最大的两个选择是高德地图和百度地图我用的是高德。原因很实际高德的Android SDK集成文档写得比较清楚key申请流程相对简单对国产手机兼容性也更好。需要注意高德地图APK在创建工程后需要申请key申请key需要你的应用的SHA1签名信息和包名这个步骤一卡就是半天后面我单独说。图片加载用Glide这是Android领域的标配。Glide的优势一是可以自动处理生命周期避免图片加载导致的内存泄漏二是支持加载网络图片的占位图和错误图这个细节能让你的App看起来专业不少。网络请求用OkHttp它支持同步和异步请求、连接池复用、拦截器机制足够支撑毕设级别的需求。JSON解析用Gson或者FastJSONGson更主流一些。注意这些依赖都要在build.gradle里配置如果你们学校机房网络不好提前把jar包下载好或者直接用阿里云的Maven镜像不然依赖下载能等到你怀疑人生。3.3 工程目录结构与源码组织拿到附带的源码之后第一步不是打开AS就运行而是先看工程的目录结构。一个规范的Android工程应该是这个样的app/ ├─ src/main/ │ ├─ java/com/example/fishing/ │ │ ├─ activity/ // 存放所有Activity │ │ │ ├─ LoginActivity.java │ │ │ ├─ MainActivity.java │ │ │ ├─ MapActivity.java │ │ │ ├─ PostDetailActivity.java │ │ │ └─ ... │ │ ├─ adapter/ // RecyclerView的适配器 │ │ │ ├─ PostAdapter.java │ │ │ └─ SpotAdapter.java │ │ ├─ model/ // 数据实体类Bean │ │ │ ├─ User.java │ │ │ ├─ Post.java │ │ │ └─ FishingSpot.java │ │ ├─ presenter/ // MVP中的P层处理业务逻辑 │ │ ├─ view/ // MVP中的V层接口定义UI更新方法 │ │ ├─ utils/ // 工具类SharedPreferences管理、日期格式化等 │ │ └─ http/ // 网络请求封装 │ │ ├─ OkHttpUtils.java │ │ └─ ApiService.java │ ├─ res/ │ │ ├─ layout/ // XML布局文件 │ │ ├─ drawable/ // 图片资源 │ │ ├─ values/ // colors.xml, strings.xml, themes.xml │ │ └─ ... │ └─ AndroidManifest.xml这个结构的核心价值在于分层清晰。Activity只做界面初始化点击事件调用Presenter的方法Presenter里发起网络请求拿到结果后通过回调更新界面。包名和类名按照这个规范来取你的代码可读性会非常高论文里的系统实现章节也直接有材料可写了。4. 核心模块实现登录、地图、帖子的代码级拆解下面进入实操环节。我会按模块功能→实现思路→核心代码→踩坑记录的顺序把三个最关键的功能模块拆开讲。这些都是我在实际项目中反复踩过坑之后总结出来的标准做法你要是从零开始写可以直接照着抄。4.1 登录模块与Token持久化不仅仅是校验用户名密码登录模块是每一个App都绕不开的入口也是很多毕设翻车的高发区。最基础的做法用户在LoginActivity输入用户名和密码OkHttp POST请求到服务端的login接口服务端校验成功后返回用户信息和Token客户端把Token存到SharedPreferences里下次打开App时先读Token有Token就直接进主页不需要重新登录。核心代码大致是这个逻辑private void login() { String username etUsername.getText().toString().trim(); String password etPassword.getText().toString().trim(); if (TextUtils.isEmpty(username) || TextUtils.isEmpty(password)) { Toast.makeText(this, 用户名和密码不能为空, Toast.LENGTH_SHORT).show(); return; } MapString, String params new HashMap(); params.put(username, username); params.put(password, MD5Util.md5(password)); OkHttpUtils.post(ApiService.LOGIN_URL, params, new Callback() { Override public void onResponse(Call call, Response response) throws IOException { String body response.body().string(); JSONObject json new JSONObject(body); if (json.getInt(code) 200) { JSONObject data json.getJSONObject(data); String token data.getString(token); // 保存Token到SharedPreferences PrefUtils.setString(mContext, token, token); PrefUtils.setString(mContext, userId, data.getString(userId)); runOnUiThread(() - jumpToMainActivity()); } else { runOnUiThread(() - Toast.makeText(...)); } } }); }几个要注意的点第一密码不能明文传输至少做一次MD5加密虽然MD5本身也不算安全但比明文体面多了第二网络请求是耗时操作必须在子线程执行OkHttp的异步回调本来就在子线程如果直接在回调里操作UI必须用runOnUiThread或者Handler切回主线程第三Token的存储用SharedPreferences就够了不要图新鲜用数据库那是给自己增加没必要的工作量第四退出登录时记得清除Token不然换账号登录会出很多奇奇怪怪的bug。这里还有一个很多学生不知道的技巧App启动时做一个闪屏页1.5秒后根据Token是否存在决定跳登录页还是主页。这段逻辑虽然简单但它让你的App看起来有完整的启动流程论文里还能配一张时序图属于花最少时间买到最多展示效果的典型操作。4.2 钓点地图高德地图集成与坐标显示的完整链路地图模块是垂钓App最核心的功能也是技术含量最高的部分。第一步是去高德开放平台注册账号、创建应用、申请Key。打开高德开放平台的控制台创建新应用选择Android平台填写你的包名和调试版SHA1。打包时如果你用的是默认的debug.keystoreSHA1可以通过下面这行命令查到keytool -list -v -keystore ~/.android/debug.keystore -alias androiddebugkey -storepass android -keypass android拿到SHA1填进去平台会生成一个Key字符串拼到AndroidManifest.xml的application节点下meta-data android:namecom.amap.api.v2.apikey android:value你的高德Key /这一步的重点在于如果你的App打的是release包签名文件变了SHA1也会变地图就会白屏。很多学生调试的时候好好的一打包就地图加载不出来90%的可能是这个原因。顺便提醒一下如果用的是高德定位SDK还需要在AndroidManifest里声明定位权限和定位ServiceAndroid 6.0以上的动态权限申请也要处理不然在真机上直接崩溃。地图上展示钓点标注逻辑上就是拿到钓点列表数据forEach往地图上添加Marker给每个Marker设置点击事件点击后弹出一个自定义的InfoWindow展示钓点的名字和简要信息。核心代码如下public void addSpotMarkers(ListFishingSpot spotList) { aMap.clear(); if (spotList ! null) { for (FishingSpot spot : spotList) { LatLng latLng new LatLng(spot.getLatitude(), spot.getLongitude()); MarkerOptions options new MarkerOptions() .position(latLng) .title(spot.getName()) .snippet(spot.getType() · spot.getPrice()); Marker marker aMap.addMarker(options); marker.setObject(spot); // 把钓点对象挂在Marker上点击时取出来用 } } }把FishingSpot对象set到Marker上这一步是经验之谈。如果你不做这个关联点击Marker后你就只知道经纬度还得自己根据经纬度去数据源里查找对应的钓点对象多写一堆逻辑还容易出错。直接挂上去点击回调里用marker.getObject()拿到数据源一句代码解决。地图SDK初始化是一个异步过程也就是说前你在onCreate里地图可能还没准备好。所以我一般把上述方法放在MapView的生命周期回调里比如onMapReady或onResume之后再调用。如果你的地图在模拟器上加载不出来先别急着怀疑代码模拟器的Google服务兼容性问题很常见换台真机试试往往就好了。4.3 社区帖子RecyclerView 适配器 图片加载的黄金组合社区模块是典型的列表页→详情页结构也是Android课程里必考的RecyclerView知识点在真实项目里的完整呈现。列表用RecyclerView实现每个帖子条目包括用户头像、用户昵称、发帖时间、帖子文字内容、帖子图片最多九宫格、点赞数、评论数。这里要讲一个关键点RecyclerView的Adapter里图片加载必须用三级缓存方案或者直接借助Glide这类库绝不能在自己的代码里对图片Bitmap做无脑decode。我在指导毕设的时候看过太多学生的项目一个帖子列表二十条数据每张图都是原图直接加载一滑动就卡成PPT。用Glide只需要一行代码Glide.with(context) .load(post.getImageUrl()) .placeholder(R.drawable.img_default) .error(R.drawable.img_error) .into(holder.ivPostImage);Glide会自动完成采样压缩、内存缓存和磁盘缓存你什么都不用管。这里的placeholder和error参数值得注意一张图加载出来之前有占位图加载失败有错误图这个小细节在你演示App的时候非常加分因为弱网环境下很多学生的App会出现一片灰白区域你的App却是干净友好的占位图高下立判。列表条目点击事件的处理也建议用接口回调的方式写比如在Adapter里定义一个OnItemClickListener接口Activity里去实现跳转逻辑这样Adapter就不需要持有Context直接去做页面跳转解耦更彻底。到了详情页再根据postId请求帖子详情接口把帖子内容、所有评论加载出来。评论的即时刷新逻辑很简单用户发表评论后重新请求一次评论列表而不是在内存里把数据append进去这个方案虽然不够实时但胜在逻辑简单可靠毕业设计完全够用。4.4 网络请求封装别让网络代码散落在各个Activity里一个写得好的Android项目网络请求必然有统一封装。最入门但好用的方式是写一个OkHttpUtils单例提供get、post的静态方法统一处理结果回调。再进一步可以写一个BaseResponse基类和Callback接口把JSON解析和错误处理统一收拢。我推荐在毕设里这么做定义一个ApiService类把所有接口地址写成常量public class ApiService { public static final String BASE_URL http://10.0.2.2:8080/fishing/; public static final String LOGIN_URL BASE_URL user/login; public static final String REGISTER_URL BASE_URL user/register; public static final String SPOT_LIST_URL BASE_URL spot/list; public static final String POST_LIST_URL BASE_URL post/list; public static final String POST_DETAIL_URL BASE_URL post/detail; public static final String POST_COMMENT_URL BASE_URL post/comment; ... }这个BASE_URL是很多人容易踩坑的地方如果你的服务端跑在本地电脑上而App跑在Android模拟器里不能用http://localhost:8080必须用http://10.0.2.2:8080这是一个映射到宿主机localhost的特殊地址。如果App跑在真机上你就要填你电脑在局域网里的IP地址比如http://192.168.1.100:8080。这个问题看似不起眼但每年不知道有多少学生卡在这里。另外Android 9.0以上默认禁止明文HTTP流量你的服务端如果是http协议而不是https需要在AndroidManifest.xml里加一行application android:usesCleartextTraffictrue ...不加这行App请求接口会直接报Cleartext HTTP traffic not permitted或者UnknownServiceException又是一个隐藏很深的坑。这两条建议直接写进你的论文系统测试章节的常见问题与解决里答辩时说出来就是活生生的经验。5. 数据库设计与服务端接口让App有数据可用客户端写得再花哨没数据就是空壳。很多学生毕设的App做完了界面很漂亮但是所有数据都是写死在代码里的答辩演示的时候打开就是那几条固定数据老师一问数据是从哪来的就露怯。正确的做法是服务端要有真正的数据支撑哪怕是一个简单的Spring Boot应用或者退一步用本地JSON文件模拟接口也要把数据层的逻辑讲清楚。5.1 表结构设计用户表、钓点表、帖子表、收藏表数据库设计是论文里重头戏也是体现一个学生工程素养的窗口。下面是我为这个垂钓App设计的核心表结构梳理你可以直接拿去参考用户表t_user字段名类型说明idint主键自增usernamevarchar(50)用户名唯一passwordvarchar(64)密码MD5加密存储nicknamevarchar(50)昵称avatarvarchar(255)头像URLcityvarchar(50)所在城市create_timedatetime注册时间钓点表t_fishing_spot字段名类型说明idint主键namevarchar(100)钓点名称longitudedouble经度latitudedouble纬度fish_typevarchar(100)鱼种如鲫鱼、鲤鱼、草鱼is_freetinyint是否免费0收费1免费pricevarchar(50)收费说明descriptiontext钓点描述image_urlvarchar(255)钓点封面图create_timedatetime创建时间帖子表t_post字段名类型说明idint主键user_idint发帖用户ID外键关联t_usercontenttext帖子内容image_urlsvarchar(1000)图片URL多个用逗号分隔like_countint点赞数comment_countint评论数create_timedatetime发布时间评论表t_comment、收藏表t_favorite、管理员表t_admin这几张表结构都比较常规核心字段就是主键、关联ID、内容、时间这些。注意外键约束在论文里要体现出来比如评论表的user_id和post_id都关联到对应的表这个是评审老师会看一眼的地方。这里有几个我自己加了印象分的细节第一所有表都有create_time字段这个以后写按时间排序的功能是刚需第二文本型字段给足长度我之前见过有人把帖子内容设置为varchar(255)发长一点的文字就报错这种低级错误要在设计阶段就避免第三表名用t_前缀字段名统一小写加下划线这种规范虽然不产生功能但体现工程习惯。5.2 接口设计规范统一返回格式和状态码服务端接口的设计是连接数据库和客户端的桥梁。建议统一返回JSON格式结构如下{ code: 200, message: success, data: { userId: 1, nickname: 钓神老张 } }code为200表示成功其他值表示失败。data字段可以是对象、数组或者null。这个格式的好处是客户端解析逻辑可以写得很统一先判断code再取data所有接口都走同一个模板方法。我自己写的时候还会在服务端加一个统一异常处理万一出错了返回code500message里带上错误原因这样调试的时候看log就能定位问题。接口列表要覆盖前面功能清单里的所有核心操作登录、注册、获取当前用户信息、获取钓点列表、获取某个钓点的详情、收藏钓点、获取收藏列表、发布帖子、获取帖子列表、获取帖子详情、发表评论、点赞帖子、删除帖子管理员。这些接口加起来大概十五个左右每个接口在论文里配一张表格说明请求参数和返回参数能凑出非常充实的系统设计章节内容。5.3 本地缓存与登录状态保持SharedPreferences的正确用法客户端本地数据存储最高频的场景就是保存Token和用户基本信息。用SharedPreferences就可以写法很简单// 存取Token PrefUtils.setString(context, token, token); String token PrefUtils.getString(context, token, ); // 存取用户信息 PrefUtils.setString(context, userInfo, new Gson().toJson(user));这里有一个细节不要在登录之后立刻把整个用户对象塞进SharedPreferences而是只存userId和Token用户信息每次进主页面的时候调一次接口拿最新数据。原因是用户信息可能会被管理员修改比如昵称被改本地缓存如果不同步更新客户端显示的就是过期数据。毕设级别当然不需要做得太复杂但你在论文里能写明白为什么只存Token而不存全量用户信息这就是一个加分项。另外一个容易被忽视的点退出登录是真实的用户需求不是只存在于产品经理的PPT里。个人中心放一个退出登录按钮点击后清除SharedPreferences里的Token和数据跳转到登录页。测试的时候一定要专门测一遍这个流程因为我见过太多人的App一旦登录了就没有任何方式退出只能卸载重装。6. 项目落地与答辩准备从源码到能讲清楚最后这部分说说运行项目时会遇到的问题以及答辩前怎么把准备工作做扎实。源码附带的项目能不能跑起来涉及到环境、依赖、版本等多个环节很多时候不是代码本身有问题而是环境不一致。6.1 源码导入与运行常见问题拿到源码之后不要直接在Android Studio里双击打开我建议按这个步骤来操作打开Android Studio选择File → New → Import Project选择源码根目录下的build.gradle文件让AS识别为一个完整工程。等待Gradle同步完成。这一步最容易出问题因为Gradle版本和AS版本不匹配。比如AS 2023.1以上版本用的是Gradle 8.x而很多老项目的Gradle配置还是4.x或6.x同步会报错。解决方案是打开工程根目录下的build.gradle文件把gradle版本号改成本机AS能够适配的版本或者AS提示你升级Gradle插件时点升级。修改高德地图的Key。这一步是运行成功的最大变数。我在4.2里已经反复强调过SHA1必须是你本机签名的SHA1包名必须和创建Key时填写的包名一致否则地图模块白屏。检查AndroidManifest里的网络权限和usesCleartextTraffic属性。很多源码默认是加了这些配置的但如果你改过包名或者降级过版本号有可能配置没了。如果环境完全没问题还是编译报错优先看Build窗口里的具体报错信息。常见的有依赖找不到、SDK版本过低、minSdkVersion大于设备系统版本等。这些问题绝大多数在网上都能搜到解决方案关键是有耐心去读报错信息而不是一上来就怀疑源码是坏的。6.2 论文写作与附图组织论文结构一般包括绪论背景、意义、国内外现状、需求分析、系统设计、系统实现、系统测试、总结。我的建议是论文的每一章都要和你的代码模块形成一一映射关系。写系统设计的时候每画一张用例图、一张时序图、一张ER图都要能在代码里找到对应的实现这样答辩时你说论文里第X章的设计已在代码里完整实现才立得住。图表是整个论文的面子。用例图一定要规范画出游客、注册用户、管理员三个参与者以及他们各自能做什么操作ER图要把所有表的关系标注清楚一对多、多对多不要画错时序图可以画登录流程和发帖流程这两个场景最经典界面截图至少要有登录页、主页地图、钓点详情、帖子列表、帖子详情、个人中心、我的收藏、发帖页每个截图下面配一段功能说明。论文里最容易写得空洞的章节是系统测试。很多学生只写打开App输入用户名密码点击登录登录成功这种测试描述等于没写。建议至少按三个层次展开功能测试用表格列出测试项、操作步骤、预期结果、实际结果兼容性测试说明在Android 8.0到13.0多个版本上的表现最后写一段测试过程中发现的问题及修复把我在前面提到的明文HTTP权限问题、地图Key问题、RecyclerView列表卡顿问题都写上去这样测试章节就有血有肉了。6.3 答辩高频问题和项目扩展方向我把答辩时最容易出现的问题列成一个清单你提前准备好答案心里就有底了高频问题应对思路为什么选这个题目从垂钓人群需求痛点出发说明信息分散、聚合需求强用了什么架构模式为什么MVP模式讲清楚界面与逻辑分离、可测试性优势地图功能是怎么实现的高德地图SDK说明Key机制、Marker、InfoWindow步骤数据从哪来服务端接口返回讲清楚数据库表结构和接口格式Token过期怎么办每次请求时服务端校验401时客户端清除Token并跳转登录页项目还能怎么扩展抓几个方向增加天气水情、装备商城、约钓组队、物联网设备对接扩展方向这个环节很关键往往是你给老师留下这个学生有思考能力印象的最后机会。我个人建议提三个方向第一个是接入实时水情和天气数据让钓点推荐更有价值第二个是加一个约钓功能类似陌生人组局这能引出聊天和位置共享的技术讨论第三个是做一个钓鱼记录的数据统计比如渔获种类、大小、时间的可视化图表分析这能引出用MPAndroidChart做图表展示。这三个方向每一个都是合理的增量你只要把这个App的十年规划讲出来老师就不会在细节上死磕了。最后说一句个人的体会做毕设最忌讳的就是把源码跑起来以后就以为万事大吉了。源码能跑代表你拿到了一个成品但答辩老师看的是你有没有能力讲清楚为什么这样做。我见过学生拿着一个功能完整的App上台结结巴巴说不出高德地图的Marker是怎么绑数据的结果被追问到崩溃。反过来也见过功能相对简单但每一个技术选型都讲得明明白白的学生导师当场就肯定了项目的完成度。真正属于你的东西是你把每一个模块的原理和坑都吃透之后的表达力。写代码的过程很重要但能把代码背后逻辑讲清楚的过程才是一名计算机专业学生从学习者走向从业者的分水岭。
返回列表