基于Android的家校联系互动APP管理系统(服务端PHP+MySQL)

目 录

1 概述 1
1.1 研究背景和意义 1
1.2 国内现状 1
1.3 论文的思路和结构 2
2 研究方案和架构概述 3
2.1 预计花费时间设计方案 3
2.2 软件开发设计方案 3
2.3 本课题的设计目标 3
2.4 架构概述 4
3 需求分析 5
3.1 软硬件需求 5
3.2 功能需求 5
3.3 用户需求 6
3.4 用例图 6
3.4.1 登录板块 6
3.4.2 班圈板块 7
3.4.3 消息板块 8
3.4.4 发现板块 9
3.4.5 我的板块 10
3.5 用例说明 10
3.5.1 UC1用户登录 10
3.5.2 UC2用户注册 11
3.5.3 UC3找回密码 12
3.5.4 UC4发布信息 12
3.5.5 UC5查看所有信息 13
3.5.6 UC6查看信息详情 14
3.5.7 UC7点赞评论回复 14
3.5.8 UC8查看联系人和会话 15
3.5.9 UC9聊天 15
3.5.10 UC10音视频通话 16
3.5.11 UC11修改个人信息 16
3.5.12 UC12修改孩子信息 17
3.5.13 UC13退出登录 18
4 概要设计 19
4.1 系统功能总体设计图 19
4.1.1 Android端功能总体设计图 19
4.1.2 服务器端功能总体设计图 20
4.2 数据库E-R图设计 21
4.3 系统类图 22
4.3.1 APP端登录板块 22
4.3.2 APP端主页板块 22
4.3.3 APP端班圈板块 23
4.3.4 APP端发布板块 24
4.3.5 APP端消息板块 25
4.3.6 APP端发现板块 25
4.3.7 APP端我的板块 26
4.4 界面设计 26
5 详细设计 33
5.1 数据库详细设计文档 33
5.1.1 用户表设计(aiya_user) 33
5.1.2 班级信息表设计(aiya_class) 33
5.1.3 主贴表设计(aiya_main) 34
5.1.4 评论表设计(aiya_comment) 34
5.1.5 点赞表设计(aiya_praise) 35
5.1.6 主贴图片表设计(aiya_pic) 35
5.2 CS协议通信文档 35
5.2.1 用户系统 35
5.2.2 信息系统 37
5.3 时序图 38
5.3.1 登录时序图 38
5.3.2 发布时序图 39
5.3.3 圈子信息时序图 40
5.3.4 聊天时序图 41
6 系统实现 43
6.1 开发工具简介 43
6.2 开发界面总览 43
6.2.1 Android开发界面总览 43
6.2.2 PHP开发界面总览 46
6.2.3 数据库操作页面总览 47
6.3 核心功能代码 47
6.3.1 图片压缩处理 47
6.3.2 相机适配处理 51
7 软件测试 57
7.1 功能模块测试 57
7.1.1 用户登录注册模块测试 57
7.1.2 信息发布模块测试 58
7.1.3 信息交流模块测试 59
7.1.4 即时通讯模块测试 60
7.3 性能测试 60
7.4 安全测试 61
7.5 交叉事件测试 61
7.6 兼容性测试 61
8 结论 62
9 谢辞 63
参考文献 64
2.2 软件开发设计方案
采用MVC开发模式,按照功能可划分为:发通知,发作业,互评点赞,图片并茂,即时通讯,小米推送等模块。
功能模块细化:
1)班级圈:班级圈包含教师可发放通知、作业,基本支持图文并茂社区化和微视频上传。家长可查看自己班级的每一条信息,以及进行互评回复点赞。
2)即时通讯:即时通讯板块主要依赖于环信,在环信SDK的大前提下,引入基本的即时通讯和音视频通话。
3)社区板块:社区板块是用户只要在一个班级即可进行类似朋友圈的交流,依然可以进行互评点赞回复。
4)发现板块:发现板块主要是为加载一些广告和活动。
5)我的板块:我的板块主要是提供用户信息的更改设置等。
6) 推送板块:当前推送继承了Google推送、华为推送和小米推送,以最大的可能提高推送接收率。
2.3 本课题的设计目标
模块功能实现的目标:
1)班级圈:保证班级圈数据的正常显示,非本班人员应该不具备查看该班信息权限的能力。采用广播、接口回调及其其它方式完成数据的传递和更新。
2)即时通讯:保证音视频通话的离线呼起,保证长连接的引用,保证用户能正常收发消息。
3)社区:同班级圈。
4)发现:保证广告的通畅性和可行性。
5)我的板块:保证用户信息的修改处理正常,做到信息不泄漏。
6)推送:保证推送成功率与正确率。
7)交互性良好:采用material design 风格设计,以及动画效果的引用,使用户和软件具有更加青睐的交互体验,并通过信息圈子推送,增加了用户粘性。
8)代码风格佳:在编码过程中,严格要求分包逻辑,采用模块化分包,并对代码进行合理的封装处理,使代码更加模块化,让其他人能更易上手。
9)实用性:通过不断的更新产品功能和接收用户反馈,让该产品更加地符合消费者思维。

<?php
use xmpush\Builder;
use xmpush\HttpBase;
use xmpush\Sender;
use xmpush\Constants;
use xmpush\Stats;
use xmpush\Tracer;
use xmpush\Feedback;
use xmpush\DevTools;
use xmpush\Subscription;
use xmpush\TargetedMessage;
include_once(dirname(__FILE__).'/autoload.php');
require_once 'format.php';


@$classId = $_GET['classId'];
@$type = $_GET['infoType'];

XmPushUtil::pushMainInfo($classId,$type);


/**
 * 小米推送相关服务类
 * @author Administrator
 *
 */
class XmPushUtil{
    
    
	
// 	private static $_instance;
// 	private $secret = '/eC85bejfRVHaQPN7akfHQ==';
// 	private $package = 'com.example.nanchen.aiyaschoolpush';
// 	private function _construct(){
    
    
// 		// 常量设置必须在new Sender()方法之前调用
// 		Constants::setPackage($package);
// 		Constants::setSecret($secret);
// 	}
	
// 	static public function getInstance(){
    
    
// 		if (!(self::$_instance instanceof self)){
    
    
// 			self::$_instance = new self();
// 		}
// 		return self::$_instance;
// 	}
	
	public static function pushMainInfo($classId,$type){
    
    
		$secret = '/eC85bejfRVHaQPN7akfHQ==';
		$package = 'com.example.nanchen.aiyaschoolpush';
		// 常量设置必须在new Sender()方法之前调用
		Constants::setPackage($package);
		Constants::setSecret($secret);
		$description = '您收到一条新消息';
		switch ($type){
    
    
			case 1:
				$description = '您收到一条新的公告信息!';
				break;
			case 2:
				$description = '您收到一条新的作业信息!';
				break;
		}
		$aliasList = array('alias1', 'alias2');
		$title = '爱吖校推';
		$payload = '{
    
    "test":1,"ok":"It\'s a string"}';
		$sender = new Sender();	
		
		// 推送消息给相应的classid的用户
		$message = new Builder();
		$message->title($title);
		$message->description($description);
		$message->passThrough(0);
		//对于预定义点击行为,payload会通过点击进入的界面的intent中的extra字段获取,而不会调用到onReceiveMessage方法
		$message->payload($payload);
		$message->extra(Builder::notifyEffect, 1);//此处预定义点击行为,1为打开app
		$message->extra(Builder::notifyForeground, 1);
		$message->notifyId(0);
		$message->build();	
		
		$sender->broadcast($message, $classId,3);  // 发送订阅主题,这里将设置为班级classId设置为topic
		
		
// 		$targetMessage2 = new TargetedMessage();
// 		$targetMessage2->setTarget($classId, TargetedMessage::TARGET_TYPE_ALIAS);  // 采用Alias标签
// 		$targetMessage2->setMessage($message);
// 		$targetMessageList = array($targetMessage2);
// 		$sender->multiSend($targetMessageList, TargetedMessage::TARGET_TYPE_ALIAS);
	}
}







// message1 演示自定义的点击行为
// $message1 = new Builder();
// $message1->title($title);  // 通知栏的title
// $message1->description($desc); // 通知栏的descption
// $message1->passThrough(0);  // 这是一条通知栏消息,如果需要透传,把这个参数设置成1,同时去掉title和descption两个参数
// $message1->payload($payload); // 携带的数据,点击后将会通过客户端的receiver中的onReceiveMessage方法传入。
// $message1->extra(Builder::notifyForeground, 1); // 应用在前台是否展示通知,如果不希望应用在前台时候弹出通知,则设置这个参数为0
// $message1->notifyId(2); // 通知类型。最多支持0-4 5个取值范围,同样的类型的通知会互相覆盖,不同类型可以在通知栏并存
// $message1->build();
// $targetMessage = new TargetedMessage();
// $targetMessage->setTarget('alias1', TargetedMessage::TARGET_TYPE_ALIAS); // 设置发送目标。可通过regID,alias和topic三种方式发送
// $targetMessage->setMessage($message1);

// // message2 演示预定义点击行为中的点击直接打开app行为
// $message2 = new Builder();
// $message2->title($title);
// $message2->description($desc);
// $message2->passThrough(0);
// $message2->payload($payload); // 对于预定义点击行为,payload会通过点击进入的界面的intent中的extra字段获取,而不会调用到onReceiveMessage方法。
// $message2->extra(Builder::notifyEffect, 1); // 此处设置预定义点击行为,1为打开app
// $message2->extra(Builder::notifyForeground, 1);
// $message2->notifyId(0);
// $message2->build();
// $targetMessage2 = new TargetedMessage();
// $targetMessage2->setTarget('alias2', TargetedMessage::TARGET_TYPE_ALIAS);
// $targetMessage2->setMessage($message2);

// $targetMessageList = array($targetMessage, $targetMessage2);
// //print_r($sender->multiSend($targetMessageList,TargetedMessage::TARGET_TYPE_ALIAS)->getRaw());

// print_r($sender->sendToAliases($message1,$aliasList)->getRaw());
// //$stats = new Stats();
// //$startDate = '20140301';
// //$endDate = '20140312';
// //print_r($stats->getStats($startDate,$endDate)->getData());
// //$tracer = new Tracer();
// //print_r($tracer->getMessageStatusById('t1000270409640393266xW')->getRaw());

?>

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/newlw/article/details/133245339