1. 设计内容及要求
1.1. 综述
1.1.1. 系统概述
我们要做的就是类似微信这样的面向大众的聊天软件,基本功能和微信类似。首先,系统分为两大部分,第一部分是客户端,是用户使用的部分,第二部分是服务器,所有的客户端都是通过服务器来进行用户身份验证及聊天转接的。客户端提供主要的界面及服务请求,如:登录界面、注册界面、主窗体界面、聊天界面、信息查看界面等。客户端主要提供服务请求界面,核心的业务逻辑处理主要由服务器提供,并向客户端发送请求的结果。同时,服务器要能提供服务的开启、及客户端登录日志。
1.1.2. 开发环境
运行环境:Idea集成开发环境jdk1.8版本
使用语言:JAVA语言
使用数据库:MySQL数据库
1.2. 需求分析
1.2.1. 需求背景
即时通信软件为我们提供了诸多的方便,使我们逐步享受信息时代的便捷。大家最熟悉的即时通信软件就是微信了,因为它几乎已经融入了我们每个人的日常生活。没有了微信,没有了手机,我们或许真的“活不了了”。由此可见,生活在信息时代的人们对即时通信、聊天软件有巨大的需求,这样的软件也将为我们节省大量的时间和金钱,或许还能成为我们发家致富的工具,比如:产品的推介、售后服务及技术交流等。
然而,既然已经有了微信如此强大的即时通信软件,我们再去做这样的软件还有什么竞争力吗?微信已经深入人心,要想再去做可能没有任何竞争力。此时,我们可以换一个角度,调整用户对象。如今,企业内部信息在这个信息时代就是金钱,尤其是一些大企业的内部信息,如果这些信息泄露,可能会造成巨大的经济损失,甚至将导致企业破产。但是,为了便捷企业员工之间的交流,做这样的一个企业内部即时通信、聊天软件还是很有市场的。我们的目标就是做的像微信,但面向企业内部使用。
企业内部为了方便员工之间便捷的交流,需要开发一款适合企业内部员工进行即时通信的软件,这样的软件既满足了企业内部员工之间便捷的交流,同时,也防止企业内部信息的外流,开发这样一块面向企业内部的即时通信软件,对于企业来说获益良多。
在开发这款软件时,为了使习惯了使用微信的用户,更加方便的使用本软件,我们将很大程度上,模仿微信的用户界面设计,以适应用户的使用习惯,方便用户使用。
1.2.2. 功能需求
-
客户端:提供登录、主窗体及聊天等界面及对应的业务逻辑,向服务器发送相应的服务请求,并接受相应的处理结果。客户端是轻量级的软件,只负责链接远程服务器,并发出相应的服务请求,并不进行核心业务逻辑的处理。具体的处理交给服务器,而客户端只接收服务器处理的结果并显示给用户。
-
服务器:监控登录信息及在线用户信息,接收客户端的服务请求,并做相应的处理,然后将处理结果发送给客户端。服务器负责处理核心的业务逻辑,并负责连接数据库,保存和读取数据。因此,服务器端设计的好坏也直接影响即时通信软件的质量。
1.2.3. 用例描述
客户端:
服务器:
2. 设计原理及方案
2.1. 总体设计
2.1.1. 系统架构设计
- 前端使用MVC进行开发 后端使用Springboot + JPA开发
- 文件组织:
- 客户端:
- 服务器:
- 采用基于网路的三层C/S模式
- 客户端:
2.1.2. 功能模块设计
- 客户端:
- 服务器:
2.1.3. 数据库设计
- 概念结构设计
- 逻辑结构设计
用户表(柚信ID,姓名,头像ID,简拼,手机号,密码,缩写,个性签名)
聊天记录表(信息ID,发送者ID,接受者ID,发送日期,发送内容,发送类型)
好友表(好友关系ID,本人ID,好友ID,好友备注)
信息列表表(列表ID,对方备注,本人ID,好友ID,最新内容,头像ID) - 表结构设计
2.1.4. 通信协议设计
计算机之间传送数据由两种,即TCP通信和UDP通信。TCP是可靠的面向连接的通信协议,UDP是不可靠的面向无连接的通信协议。这里我们采用了TCP的方式。
基于TCP的通信
在进行登录用户验证、添加好友、删除好友、发送消息等操作时,采用基于TCP的通信协议。
2.1.5. 缓存数据设计
- 用户消息Bean
为了保存用户及好友的个人信息,此处设计用户信息缓存数据,当用户登录时,将用户个人及好友的基本信息保存,以备用户查询,就不用再次连接数据库获取了。 - 消息信息Bean
用户在聊天时,需要传递必要的信息,此处消息bean数据结构就是存储收发用户的ID、IP地址、消息内容等信息。
2.2. 详细设计
2.2.1. 系统流程图
2.2.2. 设计模式使用
中介者模式:
所有的用户都通过服务器进行通信,服务器起中介的作用。
观察者模式:
当有消息发出时,不管好友在不在线,都会发送出去并写入数据库。
2.2.3. 通信协议的实现
TCP/IP协议
2.2.4. 数据访问层实现
JPA
2.2.5. 界面层实现
主界面的主要内容有消息列表显示,创建消息列表所需要的信息是从服务端获得的;还有一些辅助界面,比如查看好友资料或者查看自己的资料界面,查找好友界面,添加好友界面等。
3. 实现效果
欢迎页
登录界面
密码填写
注册账号
主页面
右上角弹出气泡
好友列表页
发现页
个人主页
扫码页面
个人信息页面
二维码生成界面
好友信息界面
聊天界面
4. 技术难点与解决方案
4.1. 前端部分
4.1.1. 顶部沉浸式状态栏
顶部为了加强用户体验,使用了windowManager对象控制顶部占用系统状栏。
Window window = getWindow();
window.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
4.1.2. 改变顶部状态栏文字颜色
顶部改为沉浸式状态栏时,发现系统会自动将顶部状态栏文字的颜色进行该改变,并不是系统根据背景去主动变色,而是我们需要去手动改变系统状态栏的文字颜色(可以参看上图状态栏)。
查阅了小米开发文档发现,可以采用以下android的标准方法。
window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);
为了让界面文字自适应的不显示在状态栏,我们选择的办法是在每个Activity里添加一个状态框布局,为其添加fitsSystemWindow属性,即可达到效果。
4.1.3. 右上角悬浮框
右上角悬浮框采用了PopupWindow 组件,背景是自己用 PS 绘制的一个气泡图形,解决了布局定位问题,以及渐入渐出的动画效果。
4.1.4. 聊天界面底部输入框动效
输入框获取到焦点时,消息列表界面向上滚动,下部布局向上浮动。。。。。。。
4.1.5. 登录状态记录
要实现记住登录,我们当然需要将一些数据保存到什么地方。android为我们提供了以下几种保存数据的机制
- SharedPreference 最简单,也是我们要使用的
- sqlite数据库 可以实现,但是操作要麻烦一些
这里我们使用了SharedPreference来记录。
4.1.6. 气泡动态改变大小
4.1.7. 加好友广播:
当收到好友申请时,手机顶部会弹出加好友信息。得写一个广播接收器,接收请求后弹出notification状态栏。
4.1.8. 底部导航栏:
底部导航栏使用的是RadioGroup+ViewPager,这是一种比较常见了的,下面4个tab的导航按钮,可以切换不同的页面,这里页面使用了ViewPager+Fragment的组合,实现了滑动的页面效果。4个Fragment对应四个不同的tab分别对应微信、通讯录、发现、我四个页面
4.2. 后端部分
4.2.1. 项目架构
该项目后端选用 springboot 进行开发,简便快捷,同时前端部分使用OKHttp 请求框架,volley 需要依靠httplcient,而google在android 6.0 sdk 中去掉了httpcient,所以 OKHttp 更好用一些。
数据库的选择:SQLite VS MySQL。SQLite 简单轻量级,很适合 android 应用开发,但是相对于一个 C/S 应用程序,MySQL 表现更加出色,故这里选择在服务器中搭建一个 MySQL 环境。
4.2.2. OkHttp JSON 数据处理
由于获取的 response 对象需要通过
转化成字符串,我们需要将它解析成JSON数组对象,然后取值。