面对面交友已经不能满足当代大学生的需求,网络交友品台为他们提供了一个实时的、易操作的交流互动的平台。
本项目致力于为大学生提供一个便捷的交友平台。有利于初入BIT的新同学快速掌握校内新鲜事、过往史。对于高年级同学可以在这里发现更多志同道合的朋友,一起聊理想、谈人生。依托于移动客户端,在本平台的用户可以随时随地分享自己的日常动态,让更多人了解自己,或者去了解更多的人。觉得朋友列表不够长,本平台可以为你推荐不同的圈子,娱乐圈、游戏圈、科技圈、艺术圈,找到和自己有共同兴趣的人。想成为校园达人,每周更新“引流”排行榜,轻松了解谁是BIT最靓的仔。
本平台在扩充交友方式之余,还有利于大学生摆脱“寝室宅”的生活,拒绝不出门,过上更加积极健康的、青春活力的大学生活。
实现了实时在线聊天、用户注册、聊天文件本地保存、用户组分类、好友推送算法等功能,旨在提供更好的用户体验。具体功能如下:
支持Android 4.0以上Android版本,仅限Android系统。
YouQi APP icon 设计理念
蓝色是我们的主题色,使界面看起来较为清爽,也使用户感到放松和沉静。鲸鱼图案的设计与蓝色的主色调相结合,偏卡通简笔的风格使得图标看起来轻松可爱,且鲸鱼又体现了友好善意的交友理念。
鲸鱼的灵感来源于孤独鲸,具有52赫兹频率的鲸鱼终其一生都在寻找自己的同类,但往往无果而终。而这款交友app目的在于帮助朋友们找到自己的同伴,共同交流沟通,让生活积极向上。
IOS设备示意图
因为篇幅限制,这里仅仅展示局部的界面。
软件登陆界面,实现了账号的登陆以及注册功能。
程序主界面,可以选择聊天房间加入或者创建
下方四个按钮分别是选择聊天室(当前页面)、好友推荐、排行榜与个人信息。
“加入或创建房间”按钮可以加入当前房间列表中的房间或新建一个房间。
聊天室主界面,该界面可以查看该房间的实时人数以及历史消息记录。
发送按钮可以发送聊天内容。
Back按钮可以返回上一级界面。
该APP支持一般的安卓模拟器与安卓系统的手机终端。
实现了管理员和用户操作的对接,聊天室提供了信息储存的接口。
利用了开源服务器实现,通过TCP协议传输。
同样因为篇幅限制,这里仅仅展示部分的代码以及代码文件截图。
前端代码文件截图
其中 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);
}
};
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+
'}';
}
}
#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;
}
最初 | 最终 |
---|---|
注册时实现对学号和姓名的双重认证 | 仅实现了对学号合法性的判断 |
朋友圈功能的实现 | 仅完成了对签名的变更 |
较为复杂的排行榜算法 | 仅完成了基础的排行榜算法 |
该软件属于北京理工大学2018级软件工程专业UML课程第11小组
制作人名单(排名不分先后)