【江鸟中原】鸿蒙仿今日头条项目
本文主要介绍了一个仿今日头条app项目的部分设计与实现过程。此软件项目旨在为用户提供个性化的新闻资讯服务,通过智能推荐算法为用户呈现感兴趣的内容,同时也为内容创作者提供一个展示平台。实现基于用户兴趣和偏好的新闻推荐服务。系统采用鸿蒙Ark TS作为前端技术,Spring Boot作为后端技术。主要功能包括用户注册与登录、浏览新闻内容、个性化新闻推荐、新闻内容搜索、用户评论与互动以及视频观看功能。
项目展示:
登陆注册:

视频、我的、国际:
娱乐、军事:

体育、科技:

手机、电影:

开发工具:
前端:HUAWEI DevEco Studio(3.1Release 3.1.0.500)。
后端:IDEA(2024.1)。
数据库:Navicat Premium 16。
相关技术:
编程语言:Java8、Arkts(api9.0)、SQL。
网络请求库:@ohos.net.http(用于网络请求和数据解析)
数据库操作库:@ohos.data.relationalStore(用于本地数据库操作)
服务器环境:Spring Boot2.6.7内置Tomcat
前端框架:HarmonyOS的ArkUI
————————————————
需求分析
1、功能需求
用户注册:提供注册表单,要求用户输入用户名、密码。
用户登录:提供登录表单,要求用户输入用户名和密码。登录成功后,为用户创建会话(session)并保存登录状态。
新闻列表展示:按照时间顺序或热度排序展示新闻列表,每条新闻包含标题、摘要、发布时间、来源等信息。
新闻详情查看:点击新闻列表中的某条新闻,进入新闻详情页面,展示新闻的详细内容、图片、视频等多媒体信息。
分类浏览:支持按照新闻类别进行新闻浏览。
个性化新闻推荐:根据用户的阅读历史、兴趣爱好等信息,为用户推荐相关新闻。
支持用户设置兴趣标签,用于更精确地推荐新闻。
展示推荐新闻列表,用户可以直接点击阅读。
用户评论与互动:在新闻详情页面下方,提供用户评论区域,允许用户发表评论并查看其他用户的评论。
支持用户之间的点赞、回复等互动操作。
对评论进行审核,防止恶意言论和广告信息的发布。
用户个人中心:用户信息管理:允许用户查看和编辑自己的个人信息,如用户名、电子邮箱、密码等。
阅读历史记录:展示用户的阅读历史记录。
订阅管理:允许用户订阅或取消订阅特定的新闻类别或话题,以便接收相关新闻的推送。
收藏夹管理:提供收藏夹功能,允许用户将感兴趣的新闻添加到收藏夹中,方便后续查看。
消息通知:展示系统发送给用户的消息通知,评论回复、新闻推送。
设置与偏好:允许用户设置系统偏好,新闻推送频率、界面主题等。
浏览视频:视频列表展示:提供视频分类浏览,展示各类视频列表,包括视频标题、缩略图、发布时间等信息。
视频详情查看:点击视频列表中的某个视频,进入视频详情页面,播放视频内容,并展示视频描述、标签、相关视频等信息。
2、非功能需求
性能:快速响应用户请求:确保系统能在短时间内处理用户请求并返回结果,减少用户等待时间。
负载均衡:通过负载均衡技术,将用户请求分发到多个服务器上,提高系统处理能力和响应速度。
缓存机制:使用缓存技术(如Redis)缓存热点数据和静态资源,减少数据库访问次数和网络传输开销。
安全性:用户数据保护:对用户密码进行加密存储(如使用哈希算法),防止密码泄露。
防止SQL注入:对用户输入进行过滤和转义,防止SQL注入攻击。
HTTPS协议:使用HTTPS协议进行数据传输,确保数据在传输过程中的安全性。
访问控制:对系统资源进行访问控制,确保只有授权用户才能访问敏感信息。
可维护性:模块化设计:将系统拆分为多个模块,每个模块负责一个或多个功能点,降低模块之间的耦合度,提高代码的可维护性。
日志记录:记录系统运行过程中的关键信息(如用户操作、错误日志等),方便后续问题排查和性能优化。
文档编写:编写详细的设计文档和使用手册,方便开发人员和运维人员了解系统架构和操作流程。
接口设计:设计良好的API接口方便其他系统或应用调用本系统功能。
微服务架构:采用微服务架构,将系统拆分为多个独立的服务,每个服务负责一个或多个业务功能,提高系统的可扩展性和可维护性。
容器化部署:使用Docker等容器技术,实现应用的快速部署和迁移。
————————————————
功能模型
用例图:

用例描述:
(1)用户注册
参与者:用户
前置条件:用户未注册
后置条件:用户成功注册
主事件流:
a用户填写注册信息
b系统验证信息
c用户注册成功
替代事件流:信息验证失败,注册失败
(2)用户登录:
参与者:用户
前置条件:用户已注册且拥有有效的账号
后置条件:用户成功登录系统
主事件流:
a 用户打开登录页面。
b 用户输入用户名和密码。
c系统验证用户提供的凭据。
d如果凭据有效,系统向用户授予访问权限,用户成功登录。
e系统显示用户登录成功的消息,并跳转到用户个人资料或主页。
替代事件流:
3a. 如果用户输入的凭据无效,系统显示错误消息并要求用户重新输入。
4a. 如果系统验证失败次数达到上限,系统锁定用户账号并提示用户联系支持团队。
(3)浏览新闻:
参与者:用户
前置条件:用户已成功登录系统
后置条件:用户完成新闻浏览并可以选择其他操作
主事件流:
a用户进入新闻浏览页面。
b系统显示新闻列表,包括标题、摘要和发布日期等信息。
c用户浏览新闻列表并选择感兴趣的新闻。
d系统显示所选新闻的详细内容。
e用户阅读新闻内容。
f用户可以选择返回新闻列表继续浏览或执行其他操作。
替代事件流:
1a. 如果用户未登录系统,系统要求用户先进行登录操作。
————————————————
动态模型
1、脚本: 编写典型交互行为的脚本。
2、顺序图:

3、状态图:

状态描述:
未注册状态:用户尚未在系统中创建账户。
转换事件:用户成功注册后,进入“已注册状态”。
已注册状态:用户已经在系统中创建账户,但尚未登录。
转换事件:用户输入正确的用户名和密码后,进入“已登录状态”。
转换事件:用户注销后,返回“未注册状态”。
已登录状态:用户已经登录到系统,可以执行登录后的操作(如浏览新闻、发表评论等)。
转换事件:用户注销后,返回“已注册状态”。
用户界面设计
用户界面(UI)设计是软件开发过程中至关重要的环节,旨在为用户提供直观、易用、美观的交互界面。以下是用户界面设计的详细描述,包括设计原则、设计流程、设计工具和用户界面测试。
设计原则
用户界面设计应遵循以下基本原则,以确保用户体验的质量:
用户中心设计:设计应以用户需求和使用习惯为中心,确保界面易于理解和操作。
一致性:界面元素和交互方式应在整个系统中保持一致,避免用户混淆。
简洁性:界面应简洁明了,避免不必要的复杂性和信息过载。
设计流程
用户界面设计通常包括以下几个步骤:
需求分析:与用户和利益相关者沟通,了解用户需求和业务目标
信息架构:设计系统的信息架构,确定信息的组织方式和导航结构。
线框图:绘制线框图,展示界面的基本布局和功能结构。
视觉设计:在线框图的基础上进行视觉设计,确定界面的颜色、字体、图标等视觉元素。
原型设计:制作高保真原型,模拟真实的用户界面和交互方式。
用户测试:进行用户测试,收集用户反馈,迭代改进设计。
需求分析:
用户需求:用户希望能够方便地浏览和搜索新闻,阅读新闻详情,发表评论。
业务目标:增加用户粘性,提高页面浏览量和用户互动。
线框图:
首页线框图:
顶部导航栏:新闻分类、搜索框、用户登录/注册
主内容区:热门新闻轮播图、最新新闻列表
底部:版权信息、友情链接
————————————————
面向对象设计(OOD)
引言:
设计阶段的目标是将项目需求转化为详细的设计文档和原型,为后续的开发提供明确的指导。通过系统的设计方法,确保系统结构合理、模块划分明确、接口清晰,从而提升开发效率和系统可维护性。常用的方法包括需求分析、概念设计、细化设计、原型开发、设计评审和文档编制。
体系结构设计:
总体设计:
·用户界面层:负责用户与系统的交互。
·业务逻辑层:处理业务逻辑和数据运算。
·数据访问层:负责与数据库交互,执行数据存取操作。
·基础设施层:提供系统运行所需的基础设施服务,如日志、缓存等。
架构图:

————————————————
详细设计:
类设计:
uesr类:
@Data
@EqualsAndHashCode(callSuper = false)
@TableName("user")
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class User implements Serializable {
private static final long serialVersionUID = 1L;
/**
* 用户id
*/
@TableId(value = "user_id", type = IdType.AUTO)
private Long userId;
/**
* 用户昵称 用户昵称
*/
@TableField("user_name")
private String userName;
/**
* 手机号(账号)
*/
@TableField("phone")
private String phone;
/**
* 密码
*/
@TableField("password")
private String password;
/**
* 头像
*/
@TableField("avatar")
private String avatar;
/**
* 用户性别(0代表女1代表男)
*/
@TableField("sex")
private Integer sex;
/**
* 创建时间
*/
@TableField(value = "create_time",fill = FieldFill.INSERT)
private LocalDateTime createTime;
/**
* 更新时间
*/
@TableField(value = "update_time",fill = FieldFill.INSERT_UPDATE)
private LocalDateTime updateTime;
}
UserDetail:
@Data
@EqualsAndHashCode(callSuper = false)
@TableName("user_detail")
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class UserDetail implements Serializable {
private static final long serialVersionUID = 1L;
/**
* id
*/
@TableId("id")
private Long id;
/**
* 用户id
*/
@TableField("user_id")
private Long userId;
/**
* 用户ip信息
*/
@TableField("ip")
private String ip;
/**
* 个性签名
*/
@TableField("description")
private String description;
/**
* 生日
*/
@TableField("birth_day")
private Date birthday;
/**
* 学校
*/
@TableField("school")
private String school;
/**
* 职业
*/
@TableField("profession")
private String profession;
/**
* 关注数量
*/
@TableField("follow")
private Long follow;
/**
* 粉丝数量
*/
@TableField("fans")
private Long fans;
/**
* 获赞数量
*/
@TableField("received_likes")
private Long receivedLikes;
/**
* 创建时间
*/
@TableField(value = "create_time",fill = FieldFill.INSERT)
private LocalDateTime createTime;
/**
* 更新时间
*/
@TableField(value = "update_time",fill = FieldFill.INSERT_UPDATE)
private LocalDateTime updateTime;
}
News:
@Data
@EqualsAndHashCode(callSuper = false)
@TableName("news")
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class News implements Serializable {
private static final long serialVersionUID = 1L;
/**
* id
*/
@TableId(value = "id", type = IdType.AUTO)
private Long id;
/**
* 发布的用户id
*/
@TableField("user_id")
private Long userId;
/**
* 新闻类型
*/
@TableField("new_type_id")
private Long newTypeId;
/**
* 内容
*/
@TableField("content")
private String content;
/**
* 图片地址
*/
@TableField("img")
private String img;
/**
* 发布时间
*/
@TableField(value = "create_time",fill = FieldFill.INSERT)
private LocalDateTime createTime;
/**
* 修改时间
*/
@TableField(value = "update_time",fill = FieldFill.INSERT_UPDATE)
private LocalDateTime updateTime;
/**
* 新闻简介
*/
@TableField("description")
private String description;
}
NewsType:
@Data
@EqualsAndHashCode(callSuper = false)
@TableName("news_type")
public class NewsType implements Serializable {
private static final long serialVersionUID = 1L;
/**
* id
*/
@TableId("id")
private Long id;
/**
* 新闻类型
*/
@TableField("type_name")
private String typeName;
/**
* 创建时间
*/
@TableField(value = "create_time",fill = FieldFill.INSERT)
private LocalDateTime createTime;
/**
* 更新时间
*/
@TableField(value = "update_time",fill = FieldFill.INSERT_UPDATE)
private LocalDateTime updateTime;
}
NewsMark:
@Data
@EqualsAndHashCode(callSuper = false)
@TableName("news_mark")
public class NewsMark implements Serializable {
private static final long serialVersionUID = 1L;
/**
* id
*/
@TableId("id")
private Long id;
/**
* 用户id
*/
@TableField("user_id")
private Long userId;
/**
* 新闻id
*/
@TableField("news_id")
private Long newsId;
/**
* 标记类型(0分享,1评论,2点赞,3收藏)
*/
@TableField("mark_type")
private Integer markType;
/**
* 状态(0标记,1取消)
*/
@TableField("status")
private Integer status;
/**
* 创建时间
*/
@TableField(value = "create_time",fill = FieldFill.INSERT)
private LocalDateTime createTime;
/**
* 更新时间
*/
@TableField(value = "update_time",fill = FieldFill.INSERT_UPDATE)
private LocalDateTime updateTime;
}
设计模式:
单例模式:用于全局配置管理。
工厂模式:用于实例化不同类型的用户对象(如普通用户、管理员)。
观察者模式:用于实现用户对文章评论的实时更新通知。
策略模式:用于对不同类型的新闻做不同类型的处理策略。
适配器模式:用于快速构建想要的返回对象
面向对象实现(OOP)
引言:
在实现阶段,我们的目标是将设计阶段规划的系统架构、类和模块具体化为可执行的代码。技术栈选择基于以下考虑:
·编程语言:Java
·工具:Maven(项目管理)、Git(版本控制)、IntelliJ IDEA(集成开发环境)
·框架:Spring Boot(构建应用程序)、MyBatis-plus(数据库持久化)
·存储服务:Minio(OSS存储服务)
·数据库:Mysql(数据存储)、Redis(缓存)
·依赖库:Lombok(简化实体类开发)、hutool(提供大量便于开发的工具、例如MD5加密)、knife4j(用于生成接口文档)、validation(参数校验)等......
全部依赖如下:
更多推荐

所有评论(0)