基于Android的在线心理健康平台设计与实现

2018-11-19 10:58
软件导刊 2018年11期
关键词:字符串帖子账号

刘 萍

(江阴职业技术学院 计算机科学系,江苏 江阴 214400)

0 引言

高校对大学生心理健康日益重视,组建了专业的心理健康教育团队,但心理健康信息化建设落后,很多院校以网站的形式宣传心理健康,未提供个性化的心理服务。

目前国内心理健康系统服务商主要有北京瑞格、上海惠城、广州智为,为高校提供单机版和Web版心理健康教育服务,用户登录系统才能进行心理测试、心理辅导和心理健康管理。国外利用信息化手段服务心理健康起步较早,1965年,美国著名的卡耐基梅隆大学为多特亚比心理诊所研发了第一款通过计算机技术辅助心理测评的信息系统[1]。国内外在心理健康与信息化手段结合上都有一定研究,但目前市面上针对高校学生的心理健康平台还没有,只有一些心理测试平台或者简单的心理咨询平台[2],缺乏一套完整的集心理咨询、心理疏导、专家与学生互动、对有心理问题学生持续跟踪的一体化平台[3]。

本文设计的一体化心理健康平台,学生可在手机上安装在线心理健康APP[4],可在电脑上访问,使学生足不出户随时随地利用碎片化时间解决心理问题。学生之间、学生与专家之间可以充分交流[5],并可持续跟踪有问题学生。本平台专家不仅仅局限于学校的心理老师,还可以是社会上的心理专家或心理医生。通过本平台可有效解决学生心理问题,并能很好地保护个人隐私。

1 需求分析与功能模块设计

学生希望随时随地解决心理困惑[6],因此,本设计平台可通过手机或电脑端进行登录注册、查看专家列表、关注专家、与专家进行在线交流等操作,还可访问个人中心。个人中心包括个人信息、站内消息、我的帖子以及我的关注。学生可访问论坛,在论坛上发帖、回复帖子、搜索帖子、收藏帖子、删除帖子和对帖子点赞等[7]。PC端的后台管理员可访问后台主页,对用户、管理员、消息、邮件以及论坛进行管理。其中用户管理主要是对用户信息维护、对证件信息和用户权限进行管理以及对专家进行审核。论坛管理主要是对帖子、帖子回复、权重和标签进行管理。平台功能模块如图1所示[8]。

图1 在线心理健康平台功能模块

PC端用户前台和Android端分别包括以下功能[9]:

(1)注册登录。该模块包括学生和专家注册。学生通过输入账号、密码进行注册。专家除了输入账号、密码外,还要输入姓名、邮箱、手机号、个人介绍,上传证书完成注册,为后续专家审核提供依据。注册完后输入账号和密码登录,连续输错5次密码将锁定账号,暂时不允许再登录。登录验证成功后用户可查看最新消息。

(2)个人中心。该模块包括个人信息、站内消息、我的帖子和我的关注。个人信息模块可对信息进行修改,包括学生信息修改和专家信息修改。学生信息修改,包括修改头像、昵称、手机号、邮箱、密码和个人简介;专家信息修改包括修改头像、密码、手机号、邮箱、专家简介和证书。证书需要提交给后台审核,审核成功后1-2个工作日内以邮件形式给出回复。站内消息主要显示未读消息,用户登录后会收到消息提示。消息类型分为系统公告、关注者动态更新、私信和回复提醒。其中系统公告为所有人都可收到,关注者动态更新只有关注者可以收到,私信只有私信对象可以收到,我的帖子显示我发的帖子和我收藏的帖子,我的关注显示关注的专家。

(3)专家列表。该模块包括专家排名和专家分类。通过专家发帖和回复次数对专家排名,活跃度越高专家排名越靠前;另外,不同专家擅长不同的领域,学生可选择想咨询的专家类别。

(4)在线交流。该功能包括发送和接收即时消息以及离线消息保存。学生可在专家列表中选择想要咨询的专家进行在线咨询,可查看专家是否在线以及在线时间。若专家在线则可与专家进行一对一交流,若不在线则消息会离线保存在服务器上,专家上线后会立即收到消息。专家可修改自己的在线时间,灵活利用空余时间给学生解惑。

(5)关注功能。学生通过关注功能可选择自己喜爱的一个或多个专家加以关注,专家的一切动态会以发送消息的形式通知学生。关注的专家放在关注列表,在关注列表中可随时增加或删除专家。

(6)论坛模块包括帖子列表、发帖、回复、点赞、搜索帖子、收藏帖子、删除帖子和热帖。进入论坛,可按分类查询显示帖子信息,点击每条帖子可查看帖子详情。发表帖子分学生发帖和专家发帖。学生可在心理求助和经验共享中发帖,发帖时可匿名,也可都不选。专家可在经验共享里发帖,专家发帖有特殊标记。 回复分为学生回复和专家回复。学生可在帖子、评论下进行回复,回复也可匿名。专家可在帖子、评论下进行回复,专家回复有特殊标记,专家不可匿名。所有匿名帖子发表人只有该用户和超级管理员可查看到。

用户可根据标题、标签和发帖人进行帖子搜索。可收藏喜爱的文章,文章右上角有五角星可快速收藏。个人有收藏列表,可对收藏文章进行管理,文章底部有点赞和踩。可根据帖子的点赞、踩、收藏和回复数等计分后自动计算分值,分值高的成为热帖。用户可屏蔽发布的帖子。

PC端管理员后台包括用户管理、管理员管理、消息管理、邮件管理、后台主页和论坛管理模块[10],下面进行详细分析:

(1)管理员进入后台主页,页面上会统计每日发帖、活跃用户、帖子分布和用户分布情况。

(2)用户管理包括用户信息、证件管理、审核专家、权限管理和专家类别管理。用户信息管理功能包括管理员登录平台后可对用户信息进行查看、搜索、筛选、排序、重置用户密码、封禁账号、修改用户信息、添加用户等操作;证件管理包括证件信息查看、搜索、筛选、排序、证件审核和删除证件;专家信息审核包括对专家信息查看、搜索、筛选、排序、审核专家注册信息、审核专家修改信息;专家类别管理包括专家类别查看、修改名称、添加或删除专家类别;权限管理包括用户权限查看、添加和删除。

(3)管理员管理包括管理员信息查看、修改、重置密码、添加和删除。

(4)消息管理包括用户消息查看、搜索、筛选、排序、封禁发送者账号、删除消息、发送消息和发布公告。

(5)邮件管理包括开启或关闭邮箱激活、找回密码功能,查看已发送邮件。

(6)论坛管理包括帖子管理、回复管理、标签管理和计分管理。帖子管理包括帖子信息查看、搜索、筛选、排序、封禁发帖人、屏蔽帖子、删除帖子、置顶帖子、修改分类和修改标签;回复管理包括回复信息查看、搜索、筛选、排序、封禁回复者、屏蔽回复和删除回复;标签管理包括标签信息查看、修改名称、添加、删除;权重管理包括计分信息查看和修改分值。

2 数据库设计

根据系统的需求分析以及功能模块设计,完成在线心理健康平台的数据库设计,得出16张数据表。

(1)管理员信息表(账号、密码、姓名、上一次登录IP、登陆次数、创建时间)。

(2)用户信息表(账号、用户名、密码、用户性别、头像地址、个人介绍、手机号、邮箱、用户类型、注册时间、注册IP、在线状态、审核状态、允许登陆时间、专家类型ID)。

(3)用户信息审核表(审核ID、账号、用户名、个人介绍、手机号、邮箱、提交时间、提交IP、审核状态、审核时间、审核人)。

(4)用户证件信息表(证件ID、证件名称、证件图片地址1、证件图片地址2、账号、提交时间、提交IP、审核状态、审核时间、审核人)。

(5)用户权限信息表(权限ID、账号、权限(0发帖,1回复,2私信,3聊天))。

(6)收藏信息表(收藏ID、账号、帖子ID、收藏时间)。

(7)关注信息表(关注ID、关注者账号、被关注者账号、关注时间)。

(8)消息表(消息ID、发送人账号、接收者账号、内容、消息类型(0系统消息,1被回复,2关注者更新,3在线聊天新消息,4站内信)、发送时间、是否已读(0未读,1已读))。

(9)帖子信息表(帖子ID、标题、内容、发帖人账号、发帖IP、发帖时间、类别ID、是否热帖(0否,1是)、是否置顶(0否,1是)、帖子计分、收藏数、点赞数、回复数、状态(0正常,1屏蔽,2用户匿名))。

(10)回复信息表(回复ID、回复内容、回复者账号、帖子ID、关联回复、楼层、发表IP、发表时间、状态(0正常,1屏蔽))。

(11)帖子类别信息表(类别ID、类别名称)。

(12)标签信息表(标签ID、标签名称)。

(13)帖子标签信息表(帖子标签ID、帖子ID、标签ID)。

(14)点赞、踩信息表(点赞ID、用户账号、帖子ID、类型(1赞,0踩)、时间)。

(15)权重计分信息表(权重计分ID、计分项、分值)。

(16)专家类型表(专家类型ID、专家类型名称)。

3 平台设计与实现

3.1 平台架构

在线心理健康平台包括Android端和PC端[11]。Android端采用Android SDK API-25(Android 7.1.1版本)进行开发[12],最低支持Android SDK API-15(Android 4.0.3版本)[13]。PC端Web前端使用layui前端框架以及JQuery框架,配合原生HTML+CSS+JavaScript进行开发,后端采用Struts框架与Hibernate框架进行开发,数据库采用MySQL5.7版本,Web服务器采用Apache-Tomcat8.0.2.9,项目部署于阿里云服务器ECS上。平台构架如图2所示[14]。

图2 平台架构

从图2可以看出,客户端与服务器端的数据传输过程如下:

(1)客户端的网络请求及数据绑定[15]。 PC端用户前台网页通过JavaScript收集相应数据并打包为JSON字符串,采用Ajax技术进行异步请求,携带JSON数据作为参数到服务器端。请求成功后在回调中对返回的数据进行二次处理,并绑定数据到指定控件,实现页面部分刷新、动态弹出窗口等功能。

Android客户端在控件中收集到指定数据后,使用Google提供的GSON工具包将bean对象转换为JSON字符串,再使用OKgo框架进行网络请求。成功后,在回调中对相应数据进行二次处理,并绑定数据到指定控件。

(2)服务器端网络数据的接收和返回[16]。服务器收到请求后,通过Struts框架对网络请求进行拦截,根据Struts自动传值获取客户端传入的参数。在action中,调用DAO进行数据库操作并经过逻辑处理后,使用工具包将结果转换为JSON类型,将结果放入Struts配置文件所指定的对象中,由Struts自动将此对象返回给客户端。其中,数据库操作使用Hibernate框架的HQL(Hibernate Query Language)进行查询、添加、修改、删除等操作。通过Hibernate的ORM(对象关系映射)特性,将数据封装为与数据库对应的对象,实现数据的持久化。为增强可维护性,所有数据库操作都封装在DAO(Data Access Object)层中。

3.2 多条件查询HQL语句构造算法

本文开发的在线心理健康平台采用Hibernate框架完成数据库操作[17],所有查询操作都通过Hibernate的HQL语言完成。HQL语句与SQL语句语法相似,完整的HQL语句形式如下:select/update/delete…… from …… where …… group by …… having …… order by …… asc/desc。

帖子查询需要多种条件,管理员可根据关键词、发帖日期、特殊标志(“1”代表获取热帖,“2”代表获取置顶贴,“12”代表既是热帖又是置顶贴)、帖子分类(“1”代表分享,“2”代表求助)、帖子状态(“0”代表正常,“1”代表屏蔽,“2”代表匿名)等进行多条件查询。设置type控制查询类型,Sort控制查询结果的排序。

构造多条件帖子查询HQL语句算法如下:

(1) 根据type(类型int,用来控制查询的类型)生成初始查询字符串。

type为1时,代表管理员普通select查询,用来获取数据列表。

type为2时,代表管理员统计类查询,用来获取数据条数。

type为3时,代表非管理员普通select查询,用来获取数据列表,限制只能查询status!=1的数据。其中status=1为屏蔽帖,只有管理员可以获取。

type为4时,代表非管理员统计查询,用来获取数据条数,限制只能查询status!=1的数据。

type为其它值时,直接返回基础查询语句。

例:if(type==1){ hql = "from TopicBean tb where tb.topic_ID!=0";}

其中,topic_ID=0的数据为系统保留数据,所有使用者不可见,此为特殊情况。如果没有和帖子查询类似的情况,一般为“where 1=1”。初始查询字符串带有where条件的好处是,后续拼接的字符串可以全部以“and”开头,无需对第一次成功拼接做特殊处理。

(2)初始查询字符串生成后[18],根据查询条件message参数(类型是JSONObject)中的信息开始拼接。Message参数是前面应用层传递过来的封装好的JSON格式参数,当message中包含特定键值对时,根据此键值对新增查询条件。支持的条件有:关键词搜索、顶置贴、热帖筛选、日期范围筛选、帖子类别筛选、帖子状态筛选等。对应message格式及说明如下:

message,类型JSONObject,用来控制查询条件。message参数的JSON格式如下:

{

keyWord: 关键词,字符串,

select_hot_top:特殊标识,字符串(“1”获取热帖,“2”获取置顶贴)(这个参数可以多选,如 “12”代表获取的既是热帖又是置顶贴),

select_date:{

start:{

year:年,数字或字符串,

month:月,数字或字符串,

date:日,数字或字符串

},

end:格式同start。start为开始日期,end为结束日期,这两个参数要么都不传,要么都传,不可以只传一个。

},

select_type: 帖子类别,数字或字符串(“1”代表分享,“2”代表求助),

select_status: 帖子状态,数字或字符串(“0”代表正常,“2”代表匿名,“1”代表屏蔽)

}

首先,根据message是否为空判断是否需要构造多条件的查询语句。若message为空则直接返回基础查询语句,例如:"from TopicBean tb where tb.status!=1",其中status=1为屏蔽帖,只有管理员类型的查询可以获取。

(3)查询的类型和条件都构造好后,按某字段排序进行拼接,该sort参数也是JSON类型,具体如下:

sort: {

field: 需要排序的字段在数据库中的字段名,字符串

type: 排序方式,字符串(可选值"desc","asc","null",注意,null是内容为"null"的字符串)

}

通过以上查询类型、查询条件和结果排序这3个步骤即可完成HQL查询语句构造。

3.3 详细设计与实现

下面以管理员查询帖子为例, 阐述多条件帖子查询HQL语句构造算法实现[19]。管理员可根据关键词、发帖日期、特殊标志、帖子分类、帖子状态、分页、排序等进行多条件查询,运行效果如图4所示。

图3 帖子多条件查询

多条件查询是通过拼接HQL字符串实现的。首先,前端页面中收集信息组装为JSON字符串,在请求时作为参数传递给服务器。服务器收到请求后,将参数传递到实现多条件查询HQL语句的构造方法中,动态拼接HQL字符串进行查询[20],部分核心代码如下:

public static String TopicHQL(JSONObject message,int type,JSONObject sort) {

String hql = "";// 定义hql字符串

if(message!=null){

if(type==1){

hql = "from TopicBean tb where tb.topic_ID!=0";

}else if(type==2){

hql = "select count(*) from TopicBean tb where tb.topic_ID!=0";

}

}

// 关键词搜索

if (message.get("keyWord")!=null && !message.get("keyWord").equals("")) {

String keyword = message.getString("keyWord");

hql += " and (tb.title like '%" + keyword+ "%' or tb.user.user_Account like '%" + keyword + "%')";

}

// 日期筛选

if (message.get("select_date")!=null && !message.get("select_date").equals("")) {

JSONObject start_date = message.getJSONObject("select_date")

.getJSONObject("start");// 获取开始日期的JSON对象

JSONObject end_date = message.getJSONObject("select_date")

.getJSONObject("end");// 获取结束日期的JSON对象

if (!start_date.toString().equals("{}")&& !end_date.toString().equals("{}")) {

String start = start_date.getString("year") + "-"+ start_date.getString("month") + "-"+ start_date.getString("date");//拼接开始日期字符串

String end = end_date.getString("year") + "-"+ end_date.getString("month") + "-"+ (end_date.getInt("date")+1); //拼接结束日期字符串

hql += " and tb.publishTime between '" + start + "' and '"+ end + "'";//将新增条件拼接到原有查询字符串后

}

}

// 排序筛选

if (sort.get("field")!=null && !sort.get("field").equals("")) {

String sort_field = sort.getString("field");

String sort_type =sort.getString("type");

if (!sort_type.equals("null")) {

hql += " order by tb." + sort_field + " " + sort_type;

}

}

return hql;

}

4 结语

本文设计并实现了基于Android的在线心理健康平台,该平台在某职业技术学院试运行效果良好。实践表明,建立一个由学校公信力保障、专家入驻、面向全校学生且足够私密的免费在线心理健康平台,能有效解决大学生心理问题。

猜你喜欢
字符串帖子账号
彤彤的聊天账号
施诈计骗走游戏账号
暴力老妈
如何查看迅雷数字账号
一种新的基于对称性的字符串相似性处理算法
依据字符串匹配的中文分词模型研究
一种针对Java中字符串的内存管理方案
高手是这样拍马屁的
我是怎样在坛子里堕落的