毕业设计选题又撞了?如果你今年还在纠结“做一个简单商城”或者“仿一个社区 App”,这个基于鸿蒙系统的小红书类项目,完全可以换一个方向。它不是普通的前端静态页面,而是使用 ArkTS 原生开发的应用端,同时包含社交笔记、电商商城和 Web 后台管理,是一套前后端完整的毕业设计项目。
这个项目最值得关注的不是 UI 有多花哨,而是它把“内容社区 + 交易闭环 + 管理后台”三个模块串在了一起。从用户发布笔记、浏览商品,到后台审核内容和订单管理,整条业务链路是通的。对于想拿鸿蒙生态做毕设、又不想只写“待办事项 App”的同学来说,这套结构比单纯做一个商城或笔记应用更有说服力。
本文会带读者完成三件事:第一,梳理项目拆分和技术选型,搞清楚鸿蒙端、Web 后台、数据库之间怎么协作;第二,走一遍集成部署思路,从 DevEco Studio 工程导入到后台服务启动,再到模拟器登录验证;第三,列出最容易卡住的坑,比如 ArkTS 权限申请、网络请求跨域、瀑布流数据刷新、后台接口返回格式不一致等问题。
适合的读者主要有两类:一是正在选毕设题目、想用鸿蒙原生开发做完整系统的同学,二是想从 ArkTS 语法进阶到完整 App 开发、需要一套可运行源码作为参考的开发者。
1. 项目定位与核心能力速览
从项目标题来看,这是一个仿小红书类应用,但范围比“笔记社区”更大。它的核心组成是三块:
- 鸿蒙端 App:基于 ArkTS 和 ArkUI 声明式 UI 开发的社交笔记 + 电商商城。
- Web 后台:面向管理员的内容管理、用户管理、商品与订单管理。
- 数据服务:App 和后台共用一套业务接口与数据库。
| 能力项 | 说明 |
|---|---|
| 项目类型 | HarmonyOS 原生应用 + Web 管理后台 |
| 开发语言 | ArkTS / ArkUI(应用端),Web 后台技术栈以源码实际交付为准 |
| 核心功能 | 社交笔记发布与浏览、用户互动、商品展示、购物车、订单、后台管理 |
| 开发工具 | DevEco Studio,需配套 HarmonyOS SDK |
| 运行设备 | DevEco 模拟器或鸿蒙真机,具体兼容版本以源码配置为准 |
| 数据存储 | 服务端数据库,推荐 MySQL;端侧可使用 Preferences 做本地缓存 |
| 是否需要联网 | 需要,App 与后台接口通过 HTTP 通信 |
| 适合场景 | 毕业设计、鸿蒙开发学习、作品集项目 |
需要说明的是,标题中的“源码可拿”意味着这套项目大概率是完整交付,但 Web 后台具体用什么框架,不同版本源码会有差异。常见毕设项目里,后端用 Spring Boot + MyBatis 或 Node.js + Express 都比较常见,拿到源码后第一件事就是核对后端启动方式和接口文档,不要假设它一定是你熟悉的那个技术栈。
2. 适用场景与使用边界
这个项目适合用来完成毕业设计,尤其是“鸿蒙系统 + 移动应用开发 + 前后端分离”这类选题。它比单纯的前端 Demo 强在业务链完整,比大型企业级项目又更适合本科阶段在一学期内做完。
但它并不适合直接当作商用产品上线。原因很简单:一是仿小红书类界面涉及原产品的 UI 布局和品牌元素,商用会有版权和商标风险;二是商城功能如果接入真实支付,必须走合法支付渠道和平台审核,毕设阶段不需要也没有必要做真实资金流。
使用边界也必须明确。这个项目涉及用户生成内容,笔记发布、评论、用户昵称头像这些模块,在演示和答辩阶段要使用自行构造的测试数据,不能抓取或搬运真实平台的用户数据、图片和文案。涉及用户隐私的部分,比如手机号、收货地址、登录凭证,需要在后台做脱敏和最小化存储。涉及肖像的内容,比如用户上传的头像和图片,要确保来源合法、有授权,不能随意下载网络图片用于演示。
从毕设合规角度看,建议在项目 README 和答辩 PPT 里写清楚:这是学习用途的原型系统,数据均为模拟数据,交易为演示流程,不涉及真实支付和真实用户信息。这样既保护自己,也避免答辩时被追问数据来源。
3. 开发环境准备与前置条件
3.1 DevEco Studio 与 HarmonyOS SDK
鸿蒙端开发必须使用 DevEco Studio。安装完成后,需要启动 SDK Manager 下载对应版本的 HarmonyOS SDK。这里要特别提醒:不同 DevEco Studio 版本自带的 SDK 版本不一样,如果项目源码里的build-profile.json5配置的compileSdkVersion和本地 SDK 不一致,导入工程时经常会出现编译失败。
| 检查项 | 建议 |
|---|---|
| DevEco Studio | 使用稳定版,尽量与源码作者一致 |
| HarmonyOS SDK | 安装后先确认 compileSdkVersion 是否匹配 |
| 签名配置 | 真机调试需要配置签名,模拟器调试要求较低 |
| hvigor 版本 | 工程自带的 hvigor 配置不建议随意升级 |
如果之前没有配过签名,可以先在模拟器上跑通项目,再考虑真机。真机调试需要在 AppGallery Connect 或 DevEco Studio 中完成签名配置,这一步比 Android 开发要严格一些。
3.2 模拟器与真机的选择
鸿蒙项目不能直接丢进 Android 模拟器跑。推荐先用 DevEco Studio 自带的模拟器启动,优点是环境一致、不占真机、不需要签名。缺点是模拟器对图片加载和视频播放的性能不如真机。
如果要验证相机拍照、相册选图、定位这类硬件相关功能,建议直接上鸿蒙真机。基于测试的便利性考虑,图片上传和声音播放这类功能在模拟器上也可以完成,但表现会和真机有差别。
3.3 Web 后台运行环境
Web 后台需要单独准备运行环境。不同源码差异较大,常见有两种情况:
- 若使用 Spring Boot,需要 JDK 和 Maven,数据库用 MySQL。
- 若使用 Node.js,需要安装对应 Node 版本,执行
npm install安装依赖。
数据库方面,一般会提供初始化 SQL 脚本。拿到源码后先建库、导入脚本、修改数据库连接配置,再启动后台服务,最后测试接口。顺序不要颠倒,否则 App 端只会看到网络错误或空列表。
3.4 ArkTS 权限申请配置
鸿蒙应用的权限声明在module.json5文件里,访问网络等敏感权限必须在这里注册。项目开发中常见的权限配置如下:
{ "module": { "name": "entry", "type": "entry", "requestPermissions": [ { "name": "ohos.permission.INTERNET" }, { "name": "ohos.permission.GET_NETWORK_INFO" }, { "name": "ohos.permission.READ_MEDIA" }, { "name": "ohos.permission.CAMERA" } ] } }其中ohos.permission.INTERNET是网络请求必需权限。如果 App 打开后请求后台接口一直失败,优先检查这个权限是否声明。部分权限还需要在代码里动态申请,不能只写在配置文件中。
4. 项目结构与工程拆分
4.1 鸿蒙应用工程结构
鸿蒙工程的根目录通常包含AppScope和entry模块。entry是应用入口模块,核心代码位于entry/src/main/ets目录下。
entry/src/main/ets/ ├── entryability/ │ └── EntryAbility.ets ├── pages/ │ ├── Index.ets │ ├── LoginPage.ets │ ├── NoteListPage.ets │ └── ProductDetailPage.ets ├── components/ │ ├── NoteCard.ets │ ├── ProductCard.ets │ └── CommentList.ets ├── api/ │ ├── request.ts │ ├── noteApi.ts │ └── orderApi.ts ├── model/ │ ├── NoteModel.ts │ ├── ProductModel.ts │ └── UserModel.ts └── utils/ └── StorageUtil.ts这不是固定模板,而是比较合理的分层方式。pages放页面,components放可复用组件,api放网络请求层,model放数据模型,utils放工具类。拿到源码后先看目录结构,基本就能判断作者的组织水平。
4.2 Web 管理后台结构
Web 后台无论用什么框架,核心模块都围绕管理需求展开:
- 用户管理:查看用户列表、禁用或启用账号。
- 笔记管理:审核笔记、下架违规内容。
- 商品管理:新增商品、修改库存、上下架。
- 订单管理:查看订单、修改订单状态。
- 数据概览:用户数、笔记数、订单量的统计图表。
后台与前台的接口可以共用一套后端服务,也可以独立部署。毕设项目中大多数是共用一套后端,只是角色和权限不同。管理员账号登录后返回的 Token,会标记为管理员角色,接口层据此决定是否放行操作。
4.3 数据模型设计
核心数据表至少包括用户表、笔记表、评论表、收藏表、商品表、购物车表、订单表。以笔记表为例,关键字段包括:笔记 ID、用户 ID、标题、正文、图片列表、标签、发布时间、状态。商品表还需要包含标题、描述、价格、库存、图片、上下架状态。
订单表要注意订单状态字段,一般用整型或枚举字符串表示待付款、已付款、已发货、已完成、已取消。毕设答辩时,数据库设计最先被追问,建议把所有表的关联关系画清楚,并解释为什么通过用户 ID 关联,而不是在每张表里都冗余用户昵称。
5. 鸿蒙端核心模块实现思路
5.1 ArkTS 页面状态管理与导航
ArkTS 在 ArkUI 框架下,页面使用@Entry和@Component声明,组件内部使用@State管理私有状态。子组件之间可以通过@Prop和@Link传递数据,跨页面传参建议使用路由参数。
@Entry @Component struct NoteListPage { @State noteList: NoteItem[] = [] @State loading: boolean = false private pageIndex: number = 1 aboutToAppear(): void { this.loadNotes() } async loadNotes(): Promise<void> { this.loading = true try { const result = await getNoteList(this.pageIndex, 10) this.noteList = result.data } finally { this.loading = false } } build() { Column() { List({ space: 12 }) { ForEach(this.noteList, (item: NoteItem) => { ListItem() { NoteCard({ note: item }) } }, (item: NoteItem) => item.id) } } .width('100%') .height('100%') } }这段代码展示了典型的页面结构:aboutToAppear中加载数据,List渲染列表,NoteCard是自定义组件。实际项目中如果要实现小红书那种双列瀑布流,可以将List换成WaterFlow,但WaterFlow对数据变更的刷新机制需要单独处理,建议先跑通接口再优化 UI。
5.2 社交笔记模块
社交笔记是这个项目最有辨识度的模块,包含四个核心子功能:
- 笔记流:首页展示推荐笔记,双列瀑布流展示封面图。
- 发布笔记:支持填写标题、正文,选择图片并上传。
- 互动功能:点赞、评论、收藏、关注作者。
- 个人主页:查看自己发布的笔记、收藏列表、粉丝与关注列表。
发布笔记时,图片上传是关键。App 先请求后台获取上传凭证或直接上传到静态资源目录,后台返回图片 URL,App 再把正文和图片 URL 列表提交给新增笔记接口。如果接口设计不合理,比如上传图片和创建笔记是分开的两步,那么用户中途退出就会产生大量无用图片,后台要定期清理。
点赞和收藏功能建议使用独立表而不是在笔记表中加字段。虽然加like_count字段展示更快,但用户是否点赞过需要单独判断。更稳的方案是建立note_like表,记录“谁在什么时间点赞了哪条笔记”,展示数量时查表求 count,只在数据量变大后再考虑缓存。
5.3 用户登录与 Token 管理
App 登录后,后台返回 Token,客户端需要保存并在后续请求中带上。ArkTS 端可以使用持久化存储来保存登录状态。
import { preferences } from '@kit.ArkData' const PREF_NAME = 'app_user' export async function saveToken(token: string): Promise<void> { const store = await preferences.getPreferences(getContext(), PREF_NAME) await store.put('token', token) await store.flush() } export async function getToken(): Promise<string | null> { const store = await preferences.getPreferences(getContext(), PREF_NAME) return store.getSync('token', '') as string }需要提醒的是,Token 有有效期。如果后台返回 401,App 不能只是弹一个“登录失败”,而应该跳转到登录页,清空本地 Token,引导用户重新登录。很多毕设项目在这里做得不够完整,答辩时被问“Token 失效了怎么办”就答不上来。
5.4 电商商城模块
商城模块围绕商品和订单展开。商品列表支持分类筛选、关键字搜索、分页加载。商品详情页展示轮播图、价格、库存和商品参数。购物车页面需要支持多选、修改数量、计算总价。订单确认页则需要选择收货地址并提交订单。
这里有一个重要的设计决策:购物车数据是保存在本地还是后台。如果只保存在本地,换设备购物车就丢失;如果保存在后台,需要登录后才能操作。更稳妥的方式是购物车使用服务端存储,App 端只负责展示和用户操作。毕设演示时,可以提前往后台录几条测试商品,避免现场网络波动导致商品图片加载失败。
商城模块在答辩时会被追问“支付流程怎么设计”。建议回答:原型系统中使用模拟支付,订单状态由用户点击按钮触发变更,只要状态机设计清楚即可。要强调生产环境必须接入正规支付渠道,并满足平台审核要求。
5.5 本地缓存与体验优化
笔记列表和商品列表不适合每次进入页面都重新请求。可以在请求成功后把数据写入本地缓存,下次进入先展示缓存,再请求刷新。ArkTS 端可以简单使用preferences,数据量更大时再考虑关系型数据库。
同时要注意列表分页的常见问题:上拉加载更多时,不能直接覆盖列表,要在原有数组后面追加;下拉刷新时,要重置页码,重新请求第一页。如果这两个逻辑写反,就会出现滚动到第二页后刷新,第二页数据还留在数组里的 bug。
6. Web 后台功能与数据管理
6.1 后台功能拆分
Web 后台的业务比 App 端更集中在“管理操作”上。管理员的登录与注册逻辑与 App 用户不同,建议单独建管理员表,或者用role字段区分用户角色,避免用户越权访问管理接口。
后台界面建议采用左侧菜单栏 + 右侧内容区的布局,菜单项包括数据概览、用户管理、笔记管理、商品管理、订单管理、评论管理等。表格操作区要包含搜索框、筛选条件和操作按钮。整体设计不需要写得很复杂,但交互链路要完整,管理员要能对任意一条笔记执行下架操作。
6.2 接口分层设计
后台和 App 共用后端,但要区分接口权限。推荐将接口按模块划分:
| 模块 | 接口路径 | 方法 | 说明 |
|---|---|---|---|
| 登录 | /api/login | POST | 用户登录,返回 Token |
| 笔记列表 | /api/notes | GET | 分页获取笔记,支持按分类筛选 |
| 发布笔记 | /api/notes | POST | 创建新笔记,需要登录 |
| 点赞评论 | /api/notes/{id}/like | POST | 点赞或取消点赞 |
| 商品列表 | /api/products | GET | 分页获取商品 |
| 购物车 | /api/cart | GET/POST | 查看与添加购物车 |
| 创建订单 | /api/orders | POST | 提交订单 |
| 后台审核 | /api/admin/notes | PUT | 管理员审核笔记,需要管理员权限 |
这里的路径只是参考,具体字段以源码为准。但接口命名风格可以保持一致:统一前缀/api,资源名用复数,动作尽量用 HTTP 方法区分。这样答辩时讲接口设计会更有章法。
6.3 后台界面常见选型
Web 后台常见选型是 Vue + Element Plus,或者 React + Ant Design。毕设项目中,用 Vue 的比较多,因为上手快、中文资料多、增删改查表格组件现成。
如果源码中的后台是前后端分离,那么启动时要同时启动后端服务和前端工程。前端工程启动后访问一个本地开发端口,后端提供 API 端口,跨域问题需要后端开启 CORS 或在开发环境下配置代理。如果启动后界面能打开但表格里没有数据,先按 F12 打开浏览器控制台,看接口请求是不是跨域失败。
7. 前后端接口与数据通信
7.1 统一响应结构
前后端分离的项目,接口返回格式必须统一。推荐使用{ code, message, data }结构。code为 0 时表示成功,非 0 表示失败,message用于提示,data携带业务数据。
{ "code": 0, "message": "success", "data": { "list": [], "total": 0, "page": 1, "pageSize": 10 } }统一响应结构的好处是:App 端可以封装一个统一的请求处理函数,只判断code,不需要为每个接口单独写错误分支。这个设计在代码评审和答辩中都是加分项。
7.2 鸿蒙端网络请求封装
鸿蒙端使用@ohos.net.http发起 HTTP 请求。为了避免每个页面都写一遍请求,可以在api/request.ts里封装一个通用函数。
import http from '@ohos.net.http' import { getToken } from '../utils/StorageUtil' const BASE_URL = 'http://192.168.1.100:8080' export interface ApiResponse<T> { code: number message: string data: T } export function request<T>( path: string, method: http.RequestMethod, body?: object ): Promise<ApiResponse<T>> { return new Promise(async (resolve, reject) => { const httpRequest = http.createHttp() const token = await getToken() const options: http.HttpRequestOptions = { method: method, header: { 'Content-Type': 'application/json', 'Authorization': token ? `Bearer ${token}` : '' }, connectTimeout: 10000, readTimeout: 10000 } if (body) { options.extraData = JSON.stringify(body) } httpRequest.request(BASE_URL + path, options, (err, data) => { if (err) { reject(err) return } const result = JSON.parse(data.result as string) as ApiResponse<T> resolve(result) httpRequest.destroy() }) }) }这里需要注意两点:BASE_URL要根据实际环境修改。在模拟器里,宿主机访问地址可能与真机不同,最稳妥的做法是把 Base URL 放到一个集中配置文件里,避免全局搜索替换。Authorization头不是所有后台都叫这个名字,有些后台用token字段,需要按源码实际约定调整。
7.3 图片上传与静态资源访问
商品图片、笔记图片和用户头像,都需要图片上传接口。上传时 App 端拿到图片后传给后台,后台保存到服务器本地目录,并返回可访问的 URL。
毕设项目演示时,最容易出现的问题有两个:一是后台返回的是相对路径,App 端拼 URL 时拼错;二是图片上传成功但访问时 404,一般是因为静态资源映射没有配置。如果启动后台后所有接口正常但图片打不开,优先排查静态资源目录配置。
8. 部署运行与功能验证
8.1 启动顺序
推荐按以下顺序启动整套系统:
- 启动数据库服务,导入初始化 SQL。
- 修改后台服务数据库连接配置。
- 启动后台服务,验证后台接口是否可访问。
- 启动 Web 管理后台前端,用管理员账号登录。
- 在 DevEco Studio 中打开鸿蒙工程,等待同步完成。
- 启动模拟器或连接真机,运行 App。
8.2 冒烟测试清单
第一次跑通项目时,不建议逐页细看,优先跑通主链路。下面是一份冒烟测试清单:
| 测试项 | 操作步骤 | 预期结果 |
|---|---|---|
| 用户注册登录 | 注册新账号,退出后重新登录 | 登录成功,Token 写入本地 |
| 笔记列表 | 进入首页,查看笔记流 | 能加载后台已有笔记数据 |
| 发布笔记 | 输入标题和正文,选择一个图片上传 | 发布成功,后台中出现新笔记 |
| 点赞收藏 | 在笔记详情页点赞,收藏笔记 | 状态更新,刷新后仍保持 |
| 商品列表 | 进入商城模块,查看商品列表 | 能加载后台商品数据 |
| 购物车 | 添加商品,修改数量,计算总价 | 购物车数据正确 |
| 订单流程 | 提交订单,后台模拟发货 | 订单状态流转正确 |
| 后台审核 | 后台下架一条笔记 | App 端该笔记不再展示 |
| 权限控制 | 用普通用户调用管理员接口 | 返回无权限,不会越权 |
跑完这份清单,核心功能基本就验证完毕。如果某一步卡住,先看后台日志,再看 App 的请求日志,定位问题出在接口、数据还是页面上。
8.3 演示数据准备
答辩演示前一定要准备演示数据。建议在后台录入 8 到 10 条笔记、6 到 8 个商品、2 到 3 个用户账号,每个账号有不同的发布记录。演示时不要现场注册新账号再慢慢发笔记,浪费时间也容易出错。真正的演示重点应放在业务闭环上:登录进入首页看笔记流,点进详情看评论与点赞,进入商城完成一次模拟下单,再切到后台审核和订单管理。
9. 常见问题与排查方法
| 问题现象 | 可能原因 | 排查方式 | 解决方案 |
|---|---|---|---|
| 工程导入后编译报错 | SDK 版本不一致 | 查看 build-profile.json5 与本地 SDK | 调整 compileSdkVersion 或安装对应 SDK |
| 模拟器打开后页面空白 | 页面路由或数据为空 | 查看日志是否请求报错 | 检查接口地址和网络权限 |
| 请求接口一直失败 | 未声明 INTERNET 权限 | 检查 module.json5 | 添加权限配置 |
| 登录返回 401 | Token 过期或没传 | 查看请求 Header | 重新登录,检查 Header 参数名 |
| 后台接口返回跨域错误 | 后台未配置 CORS | 打开浏览器控制台 | 后端允许跨域来源 |
| 图片加载失败 | 静态资源映射缺失 | 直接访问图片 URL | 配置静态资源目录 |
| 上拉加载后重复数据 | 分页逻辑错误 | 查看页码是否递增 | 重置页码或使用追加方式 |
| 数据清理 | 删除用户后关联数据未处理 | 检查外键字段 | 使用逻辑删除或级联处理 |
还有一个容易被忽略的问题:端口占用。后台服务启动时提示端口占用,先查看占用进程,换一个端口。如果改变了后台端口,App 端的 Base URL 也要同步修改,否则就会出现 App 能打开但数据拉不下来的情况。
10. 毕设答辩与后续扩展建议
这个项目最值得拿出来讲的是“技术选型”,鸿蒙生态在当前环境里本身就是差异化亮点。答辩时不需要把代码逐行讲完,重点讲三点:一是为什么用 ArkTS 原生开发而不是 Web 套壳;二是内容社区和商城的业务闭环怎么设计;三是权限安全怎么处理,包括用户登录、Token 校验、内容审核和接口越权防护。
容易被动追的坑也要提前想好。比如“你这个 App 和真实小红书有什么区别”,不要回答“功能一样”,而是说这是学习型原型系统,重点在 ArkTS 组件化设计和前后端完整链路,UI 布局参考了主流内容社区的交互模式,但不涉及真实平台的数据和品牌资源。再比如“支付功能怎么实现”,需要强调演示流程使用模拟订单,不涉及真实资金,生产环境要对接正规支付渠道并符合平台规范。
后续扩展可以从四个方向考虑。第一,接入更多 HarmonyOS 特色能力,比如原子化服务、一多适配、卡片服务;第二,增加内容推荐逻辑,根据用户点赞和收藏记录做简单的兴趣标签推荐;第三,完善后台数据统计,用图表展示用户增长和订单趋势;第四,把消息通知模块做成站内信或推送服务。这些方向任何一个在毕设答辩中都能展开讲,也说明你不是只会照着源码抄页面。
拿到源码之后,第一步不是看界面,而是先把后端数据库初始化跑通,再启动后台,最后用模拟器登录 App 完成一次“发布笔记 -> 后台审核 -> 商城下单 -> 订单管理”的闭环。把这条链路走通,这个毕设就立住了。建议收藏备用,也可以直接作为鸿蒙开发入门到实战的参考项目。