大学生交友平台 APP——YouQu

YouQu(友趣)

1.软件简介

1.1.软件设计理念

        面对面交友已经不能满足当代大学生的需求,网络交友品台为他们提供了一个实时的、易操作的交流互动的平台。

        本项目致力于为大学生提供一个便捷的交友平台。有利于初入BIT的新同学快速掌握校内新鲜事、过往史。对于高年级同学可以在这里发现更多志同道合的朋友,一起聊理想、谈人生。依托于移动客户端,在本平台的用户可以随时随地分享自己的日常动态,让更多人了解自己,或者去了解更多的人。觉得朋友列表不够长,本平台可以为你推荐不同的圈子,娱乐圈、游戏圈、科技圈、艺术圈,找到和自己有共同兴趣的人。想成为校园达人,每周更新“引流”排行榜,轻松了解谁是BIT最靓的仔。

        本平台在扩充交友方式之余,还有利于大学生摆脱“寝室宅”的生活,拒绝不出门,过上更加积极健康的、青春活力的大学生活。

1.2.软件实现功能

        实现了实时在线聊天、用户注册、聊天文件本地保存、用户组分类、好友推送算法等功能,旨在提供更好的用户体验。具体功能如下:

  1. 注册与登录:使用学号进行注册。
  2. 个人信息查看与修改:可以修改昵称、账号密码等。
  3. 通用设置:音乐、音效、通知推送、好友推荐等的开启与否。
  4. 热度排行:依据发言次数、流量贡献率、社区活跃度评选校园热点达人,成为达人可以被优先推荐。
  5. 聊天室:可以创建房间,并通过网络与他人实时聊天并统计在线人数。
  6. 聊天记录的保存:可以将聊天记录保存到本地。
  7. 好友推荐:通过计算好友喜好程度相关值,来获得最接近用户喜好的用户数据,从而进行推送。

1.3.软件运行环境

        支持Android 4.0以上Android版本,仅限Android系统。

2.外部接口需求

2.1.用户界面设计

(1)APP ICON

YouQu软件icon
YouQi APP icon 设计理念
        蓝色是我们的主题色,使界面看起来较为清爽,也使用户感到放松和沉静。鲸鱼图案的设计与蓝色的主色调相结合,偏卡通简笔的风格使得图标看起来轻松可爱,且鲸鱼又体现了友好善意的交友理念。
        鲸鱼的灵感来源于孤独鲸,具有52赫兹频率的鲸鱼终其一生都在寻找自己的同类,但往往无果而终。而这款交友app目的在于帮助朋友们找到自己的同伴,共同交流沟通,让生活积极向上。

(2)软件安装概念图

IOS设备示意图

在这里插入图片描述
安卓设备安装示意图

在这里插入图片描述

(3)软件操作界面

因为篇幅限制,这里仅仅展示局部的界面。
软件登陆界面,实现了账号的登陆以及注册功能。

在这里插入图片描述 含有登录、注册按钮。用户名和密码为空时会提示错误。

程序主界面,可以选择聊天房间加入或者创建

在这里插入图片描述 下方四个按钮分别是选择聊天室(当前页面)、好友推荐、排行榜与个人信息。
“加入或创建房间”按钮可以加入当前房间列表中的房间或新建一个房间。
聊天室主界面,该界面可以查看该房间的实时人数以及历史消息记录。

在这里插入图片描述发送按钮可以发送聊天内容。
Back按钮可以返回上一级界面。

2.2.硬件接口

     该APP支持一般的安卓模拟器与安卓系统的手机终端。

2.3.软件接口

     实现了管理员和用户操作的对接,聊天室提供了信息储存的接口。

2.4.通信接口

     利用了开源服务器实现,通过TCP协议传输。

3.软件代码

同样因为篇幅限制,这里仅仅展示部分的代码以及代码文件截图。

3.1. 软件前端代码

前端代码文件截图
在这里插入图片描述
其中 Launcher.cs 文件的代码展示:

// An highlighted block
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Photon.Realtime;
using Photon.Pun;
using UnityEngine.UI;
public class Launcher : MonoBehaviourPunCallbacks
{
    
    public GameObject canvas;//加入键画布
    public GameObject canvas2;//进入界面画布
    public GameObject a;//聊天文本框
    public GameObject b;//任务管理器,负责统计房间人数
    public Text c;//聊天文本
    public int current;//当前人数暂存
    public bool action = false;//是否更新当前人数
    public Button exit;//退出聊天室,返回到开始界面

    void Start()
    {
        canvas2.SetActive(true);//打开进入界面画布
        exit.onClick.AddListener(leavecurrent);//为退出按键增加监听
    }

    //当进入房间时调用
    public override void OnJoinedRoom()
    {
        base.OnJoinedRoom();
    }
    //当退出房间时调用
    public override void OnLeftRoom()
    {
        base.OnLeftRoom();
    }
    //加入函数,生成用户,进入聊天室
    public void join()
    {
        addto();//将聊天室人数增加1

        //放置玩家
        if (b.GetComponent<Count>().countofperson == 1) Place1();
        else if (b.GetComponent<Count>().countofperson == 2) Place2();
        else if (b.GetComponent<Count>().countofperson == 3) Place3();
        else Place4();
    }


    //增加聊天室人数函数
    [PunRPC]
    public void add()
    {
        b.GetComponent<Count>().countofperson++;
        current = b.GetComponent<Count>().countofperson;
        action = true;
    }
    public void addto()
    {
        PhotonView photonView = PhotonView.Get(this);
        photonView.RPC("add", RpcTarget.All);
    }


    //减少聊天室人数函数
    [PunRPC]
    public void cut()
    {
        b.GetComponent<Count>().countofperson--;
        current = b.GetComponent<Count>().countofperson;
    }
    public void cutto()
    {
        PhotonView photonView = PhotonView.Get(this);
        photonView.RPC("cut", RpcTarget.All);
    }

    //关闭界面画布
    public void Clean()
    {
        canvas.SetActive(false);
    }

    //在指定位置生成用户
    public void Place1()
    {
        init();
        GameObject temp= PhotonNetwork.Instantiate("Player", new Vector3(-7, 4, 0), Quaternion.identity, 0);
        temp.GetComponent<MyPlayer>().mytext.text = PhotonNetwork.NickName;

    }
    public void Place2()
    {
        init();
        GameObject temp = PhotonNetwork.Instantiate("Player", new Vector3(7, 4, 0), Quaternion.identity, 0);
        temp.GetComponent<MyPlayer>().mytext.text = PhotonNetwork.NickName;
    }
    
    public void Place3()
    {
        init();
        GameObject temp = PhotonNetwork.Instantiate("Player", new Vector3(-7, 0, 0), Quaternion.identity, 0);
        temp.GetComponent<MyPlayer>().mytext.text = PhotonNetwork.NickName;
    }

    public void Place4()
    {
        init();
        GameObject temp = PhotonNetwork.Instantiate("Player", new Vector3(7, 0, 0), Quaternion.identity, 0);
        temp.GetComponent<MyPlayer>().mytext.text = PhotonNetwork.NickName;
    }


    //初始化函数
    public void init()
    {
        // Clean();
        canvas2.SetActive(false);
        GameManager t = b.GetComponent<GameManager>();
        t.target = c;
        Player1 op = a.GetComponent<Player1>();
        op.target = t;
        Instantiate(a, new Vector3(0,(float)-2.7, 0), Quaternion.identity);
    }


    //实时更新用户数量
    [PunRPC]
    public void refresh(int tempint)
    {
        b.GetComponent<Count>().countofperson =tempint;
    }
    public void reset(int tempint)
    {
        PhotonView photonView = PhotonView.Get(this);
        photonView.RPC("refresh", RpcTarget.All,tempint);
    }

    //离开函数
    public void leavecurrent()
    {
        PhotonNetwork.LeaveRoom();
        cutto();
        reset(current);
        PhotonNetwork.LoadLevel("Start");
    }


    //每帧进行一次用户数更新
    void Update()
    {
        if(action)
        reset(current);
    }
};

3.2.软件后端代码

3.2.1.用户组以及好友推荐算法的实现

在这里插入图片描述
关于平台管理员这个用户类的功能的定义以及实现

public class Manager_Class extends User_Class{

	Manager_Class(String name, String key, int Id, int MoblieType) {
		super(name, key, Id, MoblieType);
	}
	//删除用户的信息
	private void DeleteUserData(String Username) {
		try{
			Free(Username);
		}catch (Exception Username) {
			System.out.println("删除用户失败");
		}
		System.out.println("删除用户成功");
	}
	/*
	 * 发起活动
	 * 根据当前服务器时间来随机生产活动序号
	 */
	private void AddActivity() {
		try{
			int ActivityId;
			ActivityId = random(++seeduniquifier + system.nanotime());
			CreateActivity(ActivityId);
		}catch (Exception TimeWrong) {
			System.out.println("无法获取服务器信息,创建失败");
		}
		System.out.println("创建活动成功");
	}
	/*
	 * 删除活动
	 * 根据当前活动序号来删除
	 */
	private void DeleteActivity(int ActivityId) {
		try{
			Delecte(ActivityId);
		}catch (Exception ActivityNotFound) {
			System.out.println("该活动不存在");
		}
		System.out.println("删除活动成功");
	}
	//暂时冻结账号
	private void FreezeUser(int UserId,int day) {
		try {
			Freeze(UserId,day);
		}catch(Exception UserID) {
			System.out.println("用户不存在");
		}
		System.out.println("成功冻结用户"+UserId+" "+day+"天");
	}
	//解封账号
	private void UnsealedUser(int UserId) {
		try {
			Unseal(UserId);
		}catch (Exception UserId) {
			System.out.println("找不到该用户或该用户未被冻结");
		}
		System.out.println("解冻成功");
	}

关于好友推荐算法的部分代码展示

import java.util.List;
public class FIND {
	public class Score {
	    //A和B的所有好友数
	    private int Union;
	    //A和B的共同好友数
	    private int Intersection;
	    //A和B的共同好友列表
	    private List<Character> l;
	    //此对象是A和B之间的关系
	    private char A;
	    private char B;
	    //没加权重的得分
	    private float score;
	    //对每个共同好友加权重的得分
	    private double wscore;
	    public double getWscore() {
	        return wscore;
	    }
	    public void setWscore(double wscore) {
	        this.wscore = wscore;
	    }
	    public float getScore() {
	        return score;
	    }
	    public char getA() {
	        return A;
	    }
	    public void setA(char a) {
	        A = a;
	    }
	    public char getB() {
	        return B;
	    }
	    public void setB(char b) {
	        B = b;
	    }
	    public int getUnion() {
	        return Union;
	    }
	    public void setUnion(int union) {
	        Union = union;
	        if(Union!=0){
	            score=(float) Intersection/Union;
	        }
	    }
	    public int getIntersection() {
	        return Intersection;
	    }
	    public void setIntersection(int intersection) {
	        Intersection = intersection;
	        if(Union!=0){
	            score=(float) Intersection/Union;
	        }
	    }
	    public List getL() {
	        return l;
	    }
	    public void setL(List l) {
	        this.l = l;
	    }
	    
	    public String toString() {
	        return "Score{" +
	                "Union=" + Union +
	                ", Intersection=" + Intersection +
	                ", l=" + l +
	                ", A=" + A +
	                ", B=" + B +
	                ", score=" + score +
	                ", wscore="+wscore+
	                '}';
	    }
	}
3.2.2. 聊天文件储存的实现

在这里插入图片描述
其中 record_f.cpp 的代码展示

#include "record.h"
#include <iostream>
using namespace std;

Record::Record(string &user, string &cont)
{
	time_t now = time(0); struct tm *pt = localtime(&now);

	char t[80]; strftime(t, 80, "%Y-%m-%d %H:%M:%S", pt);

	all.append(t); all.push_back(' '); all.append("From ");

	all.append(user); all.append(", "); all.append("Content : ");

	all.append(cont);
}

Record::~Record(){}

RList::RList(string &name){ file.open(name.c_str(), ios_base::in | ios_base::app); }

RList::~RList() { file.close(); }

bool RList::display(vector<string> &content)
{
	char str[100];

	while (file.getline(str, 100, '\n'))
	{
		string line(str);

		content.push_back(line);
	}

	return true;
}

bool RList::append(Record &newr)
{
	file << newr.all << endl;

	return true;
}

4.对最初设计的一些更改

最初最终
注册时实现对学号和姓名的双重认证仅实现了对学号合法性的判断
朋友圈功能的实现仅完成了对签名的变更
较为复杂的排行榜算法仅完成了基础的排行榜算法

5.最后鸣谢

该软件属于北京理工大学2018级软件工程专业UML课程第11小组
制作人名单(排名不分先后)

  • 李灌桦
  • 季旭
  • 邢宏波
  • 应淞斐
  • 姚智棣
  • 4
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值