提交 5fcd8f8e 编写于 作者: 梦境迷离's avatar 梦境迷离

* 修复个人资料和查看资料性别显示不同问题

* 新增修改个人信息时可选择是否修改密码
* 修复收到消息时没有声音
* 支持获取离线消息和提醒「打开会话框时将对方发给我的所有消息置为已读」
上级 65e10627
......@@ -66,6 +66,10 @@
* 打包并发布
* 修复建群后不刷新看不到群
* 修复同一个人的多个加群的消息被覆盖
* 修复个人资料和查看资料性别显示不同问题
* 新增修改个人信息时可选择是否修改密码
* 修复收到消息时没有声音
* 支持获取离线消息和提醒「打开会话框时将对方发给我的所有消息置为已读」
### v1.2 版本
......@@ -74,6 +78,7 @@
* 使用Akka HTTP重构WebSocket通信
* 升级Scala版本至2.12.8
### TODO
1. 使用Playframework、play-ws重构LayIM后端
......
......@@ -2,7 +2,7 @@
git pull origin master
gradle build
# gradle build
gradle bootRepackage
......
......@@ -19,6 +19,9 @@ class MessageHandleActor extends Actor with ActorLogging {
case tm: TransmitMessage =>
log.info(s"来自客户端的消 => [msg = $tm]")
tm.getMessage.getType match {
case "readOfflineMessage" => {
WebSocketService.readOfflineMessage(tm.getMessage)
}
case "message" => {
WebSocketService.sendMessage(tm.getMessage)
}
......
......@@ -555,12 +555,21 @@ class UserController @Autowired() (userService: UserService, cookieService: Cook
gson.toJson(new ResultSet(SystemConstant.ERROR, SystemConstant.UPDATE_INFO_FAIL))
else {
val u = userService.findUserById(user.getId)
val sex = if (user.getSex.equals("nan")) 1 else 0
//前台明文传输,有安全问题
if (!SecurityUtil.matchs(user.getOldpwd, u.getPassword)) {
if (
user.getPassword == null || user.getPassword.trim.length == 0 ||
user.getOldpwd == null || user.getOldpwd.trim.length == 0
) {
u.setSex(sex)
u.setSign(user.getSign)
u.setUsername(user.getUsername)
userService.updateUserInfo(u, u.getId)
gson.toJson(new ResultSet(SystemConstant.SUCCESS, SystemConstant.UPDATE_INFO_SUCCESS))
} else if (!SecurityUtil.matchs(user.getOldpwd, u.getPassword)) {
gson.toJson(new ResultSet(SystemConstant.ERROR, SystemConstant.UPDATE_INFO_PASSWORD_FAIL))
} else {
u.setPassword(SecurityUtil.encrypt(user.getPassword))
val sex = if (user.getSex.equals("nan")) 0 else 1
u.setSex(sex)
u.setSign(user.getSign)
u.setUsername(user.getUsername)
......
......@@ -161,6 +161,19 @@ trait UserRepository {
@Update(Array("update t_add_message set agree = #{agree} where id = #{id}"))
def updateAddMessage(addMessage: AddMessage): Int
/**
* 置为已读
*
* @param mine 我的id
* @param to 对方的id
* @param typ 对方的id
* @return Int
*/
@Update(
Array("update t_message set status = 1 where mid = #{mine} and toid =#{to} and type = #{typ}")
)
def readMessage(@Param("mine") mine: Int, @Param("to") to: Int, @Param("typ") typ: String): Int
/**
* 添加好友、群组信息请求
* ON DUPLICATE KEY UPDATE 首先这个语法的目的是为了解决重复性,当数据库中存在某个记录时,执行这条语句会更新它,而不存在这条记录时,会插入它。
......
......@@ -262,6 +262,11 @@ class UserService @Autowired() (userRepository: UserRepository, mailService: Mai
userRepository.updateAddMessage(addMessage) == 1
}
@Transactional
def readFriendMessage(mine: Int, to: Int): Boolean = {
userRepository.readMessage(mine, to, "friend") == 1
}
/**
* 添加好友、群组信息请求
*
......
......@@ -260,6 +260,17 @@ object WebSocketService {
else redisService.removeSetValue(SystemConstant.ONLINE_USER, uId + "")
}
/**
* 已读,先简单实现,打开对话框时,与该好友的所有信息置为已读
*
* @param message
*/
def readOfflineMessage(message: Message): Unit = {
synchronized {
userService.readFriendMessage(message.getMine.getId, message.getTo.getId)
}
}
//用于统计实时在线的人数,根据ConcurrentHashMap特性,该人数不会很准确
//重连之后会重新加入进来,但与Redis还是有差异
@volatile def getConnections = actorRefSessions.size()
......
......@@ -19,7 +19,7 @@
autocomplete="off" class="layui-input layui-input-inline">
<input type="radio" name="sex" value="0" title="女">
<input type="radio" name="sex" value="1" title="男">
<input type="radio" name="sex" value="" title="中性" checked>
<input type="radio" name="sex" value="" title="全部" checked>
<button id="findFriend" class="layui-btn layui-btn-normal">搜索</button>
</div>
</div>
......
......@@ -37,9 +37,9 @@
</div>
<div class="layui-form-item">
<label class="layui-form-label">性别</label>
<input type="radio" name="sex" value="nan" title="男">
<input type="radio" name="sex" value="nv" title="女">
</div>
<input type="radio" name="sex" value="nv" title="女">
<input type="radio" name="sex" value="nan" title="男">
</div>
<div class="layui-form-item">
<label for="user_email" class="layui-form-label">签名</label>
<div class="layui-input-inline">
......@@ -47,6 +47,11 @@
</div>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">修改密码</label>
<input type="radio" name="updatepw" value="yes" title="是" checked="false">
<input type="radio" name="updatepw" value="no" title="否" checked="true">
</div>
<blockquote class="layui-elem-quote">
修改密码
</blockquote>
......
......@@ -35,16 +35,46 @@ layui.use(['jquery', 'layer', 'form', 'upload'], function () {
var mine = layim.cache().mine;
$("#username").val(mine.username);
$("#email").val(mine.email);
$("#oldpwd").val("");
$("#pwd").val("");
$("#repwd").val("");
$("#sign").val(mine.sign);
$("#LAY_demo_upload").attr("src", mine.avatar);
if (mine.sex == "0") {
$("input[type='radio']").eq(0).attr("checked", true);
} else {
}
else{
$("input[type='radio']").eq(1).attr("checked", true);
}
form.render();//重新渲染 可以解决多种没有显示的情况
});
function ajaxUpdateUserInfo(d) {
//发送
$.ajax({
url: "../../user/updateInfo",
dataType: "JSON",
contentType: "application/json",
type: "POST",
data: JSON.stringify(d),
success: function (data) {
if (data.code == 1) {
layer.msg(data.msg, {time: 2000}, function () {
window.parent.location.reload();//刷新父页面
});
} else if (data.code == 0) {
layer.msg(data.msg, {time: 2000}, function () {
window.parent.location.reload();//刷新父页面
});
}
},
error: function (data) {
layer.msg("服务器错误,请稍后再试!");
}
});
return false;
}
//提交修改项
$("#btn").click(function () {
layer.ready(function () {
......@@ -52,8 +82,9 @@ layui.use(['jquery', 'layer', 'form', 'upload'], function () {
// var email = $("#email").val();
var sign = $("#sign").val();
// var avatar = $("#user_avatar").val();
var sex = $("input[type='radio']:checked").val();
if ('' == username) {
var sex = $("input[name='sex']:checked").val();
var updatepw = $("input[name='updatepw']:checked").val();
if ('' === username) {
layer.tips('用户名不能为空', '#username');
return;
}
......@@ -61,15 +92,14 @@ layui.use(['jquery', 'layer', 'form', 'upload'], function () {
// layer.tips('邮箱不能为空!', '#email');
// return ;
// }
if ('' == sign) {
if ('' === sign) {
layer.tips('签名不能为空', '#sign');
}
var oldpwd = $("#oldpwd").val(); //旧密码
var pwd = $("#pwd").val();
var repwd = $("#repwd").val();
if ('' != oldpwd) {
if ('' == pwd) {
if ('' === pwd) {
layer.tips('新密码不能为空', '#pwd');
return;
}
......@@ -89,7 +119,7 @@ layui.use(['jquery', 'layer', 'form', 'upload'], function () {
layer.tips('两次密码不一致', '#pwd');
return;
}
if ('' != pwd && '' != repwd && '' != oldpwd && pwd == repwd) {
if ('' != pwd && '' != repwd && '' != oldpwd && pwd === repwd) {
if (!/^[\S]{6,12}$/.test(pwd)) {
layer.tips('密码必须6到12位', '#pwd');
return;
......@@ -99,29 +129,25 @@ layui.use(['jquery', 'layer', 'form', 'upload'], function () {
return;
}
}
var d = {'id': id, 'username': username, 'sex': sex, 'password': repwd, 'oldpwd': oldpwd, 'sign': sign};
var d = {
'id': id,
'username': username,
'sex': sex,
'password': repwd,
'oldpwd': oldpwd,
'sign': sign
};
//发送
$.ajax({
url: "../../user/updateInfo",
dataType: "JSON",
contentType: "application/json",
type: "POST",
data: JSON.stringify(d),
success: function (data) {
if (data.code == 1) {
layer.msg(data.msg, {time: 2000}, function () {
window.parent.location.reload();//刷新父页面
});
} else if (data.code == 0) {
layer.msg(data.msg, {time: 2000}, function () {
window.parent.location.reload();//刷新父页面
});
}
},
error: function (data) {
layer.msg("服务器错误,请稍后再试!");
}
});
ajaxUpdateUserInfo(d)
return false;
} else {
if ('yes' === updatepw) {
layer.alert("sorry,您勾选了修改密码但未做任何修改!")
return false;
}
var d = {'id': id, 'username': username, 'sex': sex, 'sign': sign};
//发送
ajaxUpdateUserInfo(d)
return false;
}
});
......
......@@ -35,6 +35,20 @@ layui.use(['layim', 'jquery', 'laytpl'], function (layim) {
var url = 'ws://' + host + '/websocket?uid=' + getUid();
socket = new ReconnectingWebSocket(url, null, {debug: true, reconnectInterval: 3000});
im.startListener();
$.ajax({
url:"/user/getOffLineMessage",
dataType:"JSON",
type:"POST",
success:function(data) {
for(var i = 0; i < data.data.length; i ++){
layim.getMessage(data.data[i]);
console.log("离线消息:"+ JSON.stringify(data.data[i]));
}
},
error:function(data) {
layer.msg(data.msg + ",服务器错误,请稍后再试!");
}
});
} else {
layer.msg('当前浏览器不支持WebSocket功能,请更换浏览器访问!', {icon: 2, shade: 0.5, time: -1});
}
......@@ -277,6 +291,8 @@ layui.use(['layim', 'jquery', 'laytpl'], function (layim) {
mine: null,
to: res.data
}));
var data = '{"type":"readOfflineMessage","to":{"id":'+parent.layui.layim.cache().mine.id+'},"mine":{"id":'+res.data.id+'}}'
socket.send(data);
} else if (type === 'group') {
//模拟系统消息
/*layim.getMessage({
......@@ -446,20 +462,4 @@ layui.use(['layim', 'jquery', 'laytpl'], function (layim) {
});
}
}
//获取离线消息
/*$.ajax({
url:"/user/getOffLineMessage",
dataType:"JSON",
type:"POST",
success:function(data) {
console.log(data.data.length)
for(var i = 0; i < data.data.length; i ++){
layim.getMessage(data.data[i]);
console.log(JSON.stringify(data.data[i]));
}
},
error:function(data) {
layer.msg(data.msg + ",服务器错误,请稍后再试!");
}
});*/
});
......@@ -1013,7 +1013,7 @@ layui.define(['layer', 'laytpl', 'upload', 'flow'], function(exports){
var voice = function() {
if(device.ie && device.ie < 9) return;
var audio = document.createElement("audio");
audio.src = layui.cache.dir+'css/modules/layim/voice/'+ cache.base.voice;
audio.src = layui.cache.dir+'css/modules/layim/voice/default.wav';
audio.play();
};
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册