This commit is contained in:
lxyer 2018-08-19 23:57:02 +08:00
parent 2dc0484a3d
commit 2f9e3297ab
35 changed files with 34 additions and 6077 deletions

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -1,25 +1,50 @@
<?xml version="1.0" encoding="UTF-8"?>
<application port="5002">
<!-- 详细配置说明见: http://redkale.org/redkale.html#redkale_confxml -->
<resources>
<source name="redis" value="org.redkalex.cache.RedisCacheSource" xxx="16">
<node addr="redishost" port="6379" password="hello"/>
<node addr="redishost" port="6379" password="pwd123"/>
</source>
<properties load="conf.txt">
<properties>
<property name="mongo.host" value="redishost"/>
<property name="mongo.database" value="redbbs"/>
</properties>
</resources>
<server protocol="HTTP" host="0.0.0.0" port="80" root="root">
<services autoload="true"/>
<rest path="os" base="com.lxyer.bbs.base.BaseServlet" autoload="true"/>
<!--<filters autoload="true"/>-->
<!--<rest path="" autoload="true"/>--> <!-- base指定的自定义HttpServlet子类必须标记@HttpUserType, 不设置base则视为没有当前用户信息设置 -->
<rest path="os" base="com.lxyer.bbs.base.BaseServlet" autoload="true">
</rest>
<request>
<!--从X-Real-IP参数中获取IP-->
<remoteaddr value="request.headers.X-Real-IP"/>
</request>
<servlets autoload="true"/>
<render value="com.lxyer.bbs.base.EnjoyRender"/>
<servlets path="" autoload="true"/>
<resource-servlet webroot="root" index="index.html">
<cache limit="2M" lengthmax="1M" watch="false"/>
<!--<rewrite type="location" match="^/([^-]+)-[^-\.]+\.png(.*)" forward="/$1.png"/>-->
</resource-servlet>
<!--
【节点在<server>中唯一】
当Server为HTTP协议时render才有效. 指定输出引擎的实现类
value: 输出引擎的实现类, 必须是org.redkale.net.http.HttpRender的子类
-->
<render value="com.lxyer.bbs.base.EnjoyRender">
</render>
</server>
</application>

View File

@ -5,14 +5,10 @@
<persistence-unit name="redbbs" transaction-type="RESOURCE_LOCAL">
<shared-cache-mode>ALL</shared-cache-mode>
<properties>
<property name="javax.persistence.jdbc.url" value="jdbc:mysql://558cfc37a10ef.sh.cdb.myqcloud.com:3817/?autoReconnect=true&amp;characterEncoding=utf8&amp;useSSL=true"/>
<property name="javax.persistence.jdbc.url" value="jdbc:mysql://mysqlhost:3306/?autoReconnect=true&amp;characterEncoding=utf8"/>
<property name="javax.persistence.jdbc.driver" value="com.mysql.cj.jdbc.Driver"/>
<property name="javax.persistence.jdbc.user" value="cdb_outerroot"/>
<property name="javax.persistence.jdbc.password" value="l237809796"/>
<!--<property name="javax.persistence.jdbc.url" value="jdbc:mysql://mysqlhost:3306/?autoReconnect=true&amp;characterEncoding=utf8"/>
<property name="javax.persistence.jdbc.driver" value="com.mysql.cj.jdbc.Driver"/>
<property name="javax.persistence.jdbc.user" value="root"/>
<property name="javax.persistence.jdbc.password" value="*hello9796!"/>-->
<property name="javax.persistence.jdbc.user" value="guest"/>
<property name="javax.persistence.jdbc.password" value="hello"/>
</properties>
</persistence-unit>

View File

@ -1,19 +0,0 @@
<!--- Created by JUECHENG at 2018/7/27 11:42. --->
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>404</title>
</head>
<body style="padding: 50px">
<h1>由于网站被攻击,已暂停访问</h1>
<p>
黑客把数据全部清空了,数据库有半个月没做备案了(失误),但是有所有一切操作的日志记录,
包括黑客的攻击数据ip当然也有这十多天的文章提交数据所以理论上所有数据能够恢复
待恢复后再开做开放访问;谢谢你的关注和支持;
</p>
<p>
----------- 绝尘QQ237809796
</p>
</body>
</html>

View File

@ -1,11 +0,0 @@
<!--- Created by JUECHENG at 2018/7/19 10:38. --->
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
</body>
</html>

View File

@ -1,96 +0,0 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
<title>聊天记录</title>
<link rel="stylesheet" href="http://local.res.layui.com/layui/src/css/layui.css">
<style>
body .layim-chat-main{height: auto;}
</style>
</head>
<body>
<div class="layim-chat-main">
<ul id="LAY_view"></ul>
</div>
<div id="LAY_page" style="margin: 0 10px;"></div>
<textarea title="消息模版" id="LAY_tpl" style="display:none;">
{{# layui.each(d.data, function(index, item){
if(item.id == parent.layui.layim.cache().mine.id){ }}
<li class="layim-chat-mine"><div class="layim-chat-user"><img src="{{ item.avatar }}"><cite><i>{{ layui.data.date(item.timestamp) }}</i>{{ item.username }}</cite></div><div class="layim-chat-text">{{ layui.layim.content(item.content) }}</div></li>
{{# } else { }}
<li><div class="layim-chat-user"><img src="{{ item.avatar }}"><cite>{{ item.username }}<i>{{ layui.data.date(item.timestamp) }}</i></cite></div><div class="layim-chat-text">{{ layui.layim.content(item.content) }}</div></li>
{{# }
}); }}
</textarea>
<!--
上述模版采用了 laytpl 语法不了解的同学可以去看下文档http://www.layui.com/doc/modules/laytpl.html
-->
<script src="http://local.res.layui.com/layui/src/layui.js"></script>
<script>
layui.use(['layim', 'laypage'], function(){
var layim = layui.layim
,layer = layui.layer
,laytpl = layui.laytpl
,$ = layui.jquery
,laypage = layui.laypage;
//聊天记录的分页此处不做演示你可以采用laypage不了解的同学见文档http://www.layui.com/doc/modules/laypage.html
//开始请求聊天记录
var param = location.search //获得URL参数。该窗口url会携带会话id和type他们是你请求聊天记录的重要凭据
//实际使用时下述的res一般是通过Ajax获得而此处仅仅只是演示数据格式
,res = {
code: 0
,msg: ''
,data: [{
username: '纸飞机'
,id: 100000
,avatar: 'http://tva3.sinaimg.cn/crop.0.0.512.512.180/8693225ajw8f2rt20ptykj20e80e8weu.jpg'
,timestamp: 1480897882000
,content: 'face[抱抱] face[心] 你好啊小美女'
}, {
username: 'Z_子晴'
,id: 108101
,avatar: 'http://tva3.sinaimg.cn/crop.0.0.512.512.180/8693225ajw8f2rt20ptykj20e80e8weu.jpg'
,timestamp: 1480897892000
,content: '你没发错吧face[微笑]'
},{
username: 'Z_子晴'
,id: 108101
,avatar: 'http://tva3.sinaimg.cn/crop.0.0.512.512.180/8693225ajw8f2rt20ptykj20e80e8weu.jpg'
,timestamp: 1480897898000
,content: '你是谁呀亲。。我爱的是贤心!我爱的是贤心!我爱的是贤心!重要的事情要说三遍~'
},{
username: 'Z_子晴'
,id: 108101
,avatar: 'http://tva3.sinaimg.cn/crop.0.0.512.512.180/8693225ajw8f2rt20ptykj20e80e8weu.jpg'
,timestamp: 1480897908000
,content: '注意:这些都是模拟数据,实际使用时,需将其中的模拟接口改为你的项目真实接口。\n该模版文件所在目录相对于layui.js\n/css/modules/layim/html/chatlog.html'
}]
}
//console.log(param)
var html = laytpl(LAY_tpl.value).render({
data: res.data
});
$('#LAY_view').html(html);
});
</script>
</body>
</html>

View File

@ -1,38 +0,0 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
<title>发现</title>
<link rel="stylesheet" href="http://local.res.layui.com/layui/src/css/layui.css">
<style>
</style>
</head>
<body>
<div style="margin: 15px;">
<blockquote class="layui-elem-quote">此为自定义的【查找】页面,因需求不一,所以官方暂不提供该模版结构与样式,实际使用时,可移至该文件到你的项目中,对页面自行把控。
<br>文件所在目录相对于layui.js/css/modules/layim/html/find.html</blockquote>
</div>
<script src="http://local.res.layui.com/layui/src/layui.js"></script>
<script>
layui.use(['layim', 'laypage'], function(){
var layim = layui.layim
,layer = layui.layer
,laytpl = layui.laytpl
,$ = layui.jquery
,laypage = layui.laypage;
//一些添加好友请求之类的交互参见文档
});
</script>
</body>
</html>

View File

@ -1,87 +0,0 @@
{
"code": 0,
"pages": 1,
"data": [
{
"id": 76,
"content": "申请添加你为好友",
"uid": 168,
"from": 166488,
"from_group": 0,
"type": 1,
"remark": "有问题要问",
"href": null,
"read": 1,
"time": "刚刚",
"user": {
"id": 166488,
"avatar": "http://q.qlogo.cn/qqapp/101235792/B704597964F9BD0DB648292D1B09F7E8/100",
"username": "李彦宏",
"sign": null
}
},
{
"id": 75,
"content": "申请添加你为好友",
"uid": 168,
"from": 347592,
"from_group": 0,
"type": 1,
"remark": "你好啊!",
"href": null,
"read": 1,
"time": "刚刚",
"user": {
"id": 347592,
"avatar": "http://q.qlogo.cn/qqapp/101235792/B78751375E0531675B1272AD994BA875/100",
"username": "麻花疼",
"sign": null
}
},
{
"id": 62,
"content": "雷军 拒绝了你的好友申请",
"uid": 168,
"from": null,
"from_group": null,
"type": 1,
"remark": null,
"href": null,
"read": 1,
"time": "10天前",
"user": {
"id": null
}
},
{
"id": 60,
"content": "马小云 已经同意你的好友申请",
"uid": 168,
"from": null,
"from_group": null,
"type": 1,
"remark": null,
"href": null,
"read": 1,
"time": "10天前",
"user": {
"id": null
}
},
{
"id": 61,
"content": "贤心 已经同意你的好友申请",
"uid": 168,
"from": null,
"from_group": null,
"type": 1,
"remark": null,
"href": null,
"read": 1,
"time": "10天前",
"user": {
"id": null
}
}
]
}

View File

@ -1,208 +0,0 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
<title>消息盒子</title>
<link rel="stylesheet" href="../../../layui.css?v=1">
<style>
.layim-msgbox{margin: 15px;}
.layim-msgbox li{position: relative; margin-bottom: 10px; padding: 0 130px 10px 60px; padding-bottom: 10px; line-height: 22px; border-bottom: 1px dotted #e2e2e2;}
.layim-msgbox .layim-msgbox-tips{margin: 0; padding: 10px 0; border: none; text-align: center; color: #999;}
.layim-msgbox .layim-msgbox-system{padding: 0 10px 10px 10px;}
.layim-msgbox li p span{padding-left: 5px; color: #999;}
.layim-msgbox li p em{font-style: normal; color: #FF5722;}
.layim-msgbox-avatar{position: absolute; left: 0; top: 0; width: 50px; height: 50px;}
.layim-msgbox-user{padding-top: 5px;}
.layim-msgbox-content{margin-top: 3px;}
.layim-msgbox .layui-btn-small{padding: 0 15px; margin-left: 5px;}
.layim-msgbox-btn{position: absolute; right: 0; top: 12px; color: #999;}
</style>
</head>
<body>
<ul class="layim-msgbox" id="LAY_view"></ul>
<div style="margin: 0 15px;">
<blockquote class="layui-elem-quote">注意:这些都是模拟数据,实际使用时,需将其中的模拟接口改为你的项目真实接口。
<br>该模版文件所在目录相对于layui.js/css/modules/layim/html/msgbox.html</blockquote>
</div>
<textarea title="消息模版" id="LAY_tpl" style="display:none;">
{{# layui.each(d.data, function(index, item){
if(item.from){ }}
<li data-uid="{{ item.from }}" data-fromGroup="{{ item.from_group }}">
<a href="/u/{{ item.from }}/" target="_blank">
<img src="{{ item.user.avatar }}" class="layui-circle layim-msgbox-avatar">
</a>
<p class="layim-msgbox-user">
<a href="/u/{{ item.from }}/" target="_blank">{{ item.user.username||'' }}</a>
<span>{{ item.time }}</span>
</p>
<p class="layim-msgbox-content">
{{ item.content }}
<span>{{ item.remark ? '附言: '+item.remark : '' }}</span>
</p>
<p class="layim-msgbox-btn">
<button class="layui-btn layui-btn-small" data-type="agree">同意</button>
<button class="layui-btn layui-btn-small layui-btn-primary" data-type="refuse">拒绝</button>
</p>
</li>
{{# } else { }}
<li class="layim-msgbox-system">
<p><em>系统:</em>{{ item.content }}<span>{{ item.time }}</span></p>
</li>
{{# }
}); }}
</textarea>
<!--
上述模版采用了 laytpl 语法不了解的同学可以去看下文档http://www.layui.com/doc/modules/laytpl.html
-->
<script src="../../../../layui.js?v=1"></script>
<script>
layui.use(['layim', 'flow'], function(){
var layim = layui.layim
,layer = layui.layer
,laytpl = layui.laytpl
,$ = layui.jquery
,flow = layui.flow;
var cache = {}; //用于临时记录请求到的数据
//请求消息
var renderMsg = function(page, callback){
//实际部署时,请将下述 getmsg.json 改为你的接口地址
$.get('getmsg.json', {
page: page || 1
}, function(res){
if(res.code != 0){
return layer.msg(res.msg);
}
//记录来源用户信息
layui.each(res.data, function(index, item){
cache[item.from] = item.user;
});
callback && callback(res.data, res.pages);
});
};
//消息信息流
flow.load({
elem: '#LAY_view' //流加载容器
,isAuto: false
,end: '<li class="layim-msgbox-tips">暂无更多新消息</li>'
,done: function(page, next){ //加载下一页
renderMsg(page, function(data, pages){
var html = laytpl(LAY_tpl.value).render({
data: data
,page: page
});
next(html, page < pages);
});
}
});
//打开页面即把消息标记为已读
/*
$.post('/message/read', {
type: 1
});
*/
//操作
var active = {
//同意
agree: function(othis){
var li = othis.parents('li')
,uid = li.data('uid')
,from_group = li.data('fromGroup')
,user = cache[uid];
//选择分组
parent.layui.layim.setFriendGroup({
type: 'friend'
,username: user.username
,avatar: user.avatar
,group: parent.layui.layim.cache().friend //获取好友分组数据
,submit: function(group, index){
//将好友追加到主面板
parent.layui.layim.addList({
type: 'friend'
,avatar: user.avatar //好友头像
,username: user.username //好友昵称
,groupid: group //所在的分组id
,id: uid //好友ID
,sign: user.sign //好友签名
});
parent.layer.close(index);
othis.parent().html('已同意');
//实际部署时,请开启下述注释,并改成你的接口地址
/*
$.post('/im/agreeFriend', {
uid: uid //对方用户ID
,from_group: from_group //对方设定的好友分组
,group: group //我设定的好友分组
}, function(res){
if(res.code != 0){
return layer.msg(res.msg);
}
//将好友追加到主面板
parent.layui.layim.addList({
type: 'friend'
,avatar: user.avatar //好友头像
,username: user.username //好友昵称
,groupid: group //所在的分组id
,id: uid //好友ID
,sign: user.sign //好友签名
});
parent.layer.close(index);
othis.parent().html('已同意');
});
*/
}
});
}
//拒绝
,refuse: function(othis){
var li = othis.parents('li')
,uid = li.data('uid');
layer.confirm('确定拒绝吗?', function(index){
$.post('/im/refuseFriend', {
uid: uid //对方用户ID
}, function(res){
if(res.code != 0){
return layer.msg(res.msg);
}
layer.close(index);
othis.parent().html('<em>已拒绝</em>');
});
});
}
};
$('body').on('click', '.layui-btn', function(){
var othis = $(this), type = othis.data('type');
active[type] ? active[type].call(this, othis) : '';
});
});
</script>
</body>
</html>

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

Binary file not shown.

Before

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 38 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 33 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.2 KiB

File diff suppressed because one or more lines are too long

View File

@ -1,2 +0,0 @@
/** layui-v2.3.0 MIT License By https://www.layui.com */
;layui.define("jquery",function(e){"use strict";var a=layui.jquery,i={config:{},index:layui.rate?layui.rate.index+1e4:0,set:function(e){var i=this;return i.config=a.extend({},i.config,e),i},on:function(e,a){return layui.onevent.call(this,n,e,a)}},l=function(){var e=this,a=e.config;return{setvalue:function(a){e.setvalue.call(e,a)},config:a}},n="rate",t="layui-rate",o="layui-icon-rate",s="layui-icon-rate-solid",u="layui-icon-rate-half",r="layui-icon-rate-solid layui-icon-rate-half",c="layui-icon-rate-solid layui-icon-rate",f="layui-icon-rate layui-icon-rate-half",v=function(e){var l=this;l.index=++i.index,l.config=a.extend({},l.config,i.config,e),l.render()};v.prototype.config={length:5,text:!1,readonly:!1,half:!1,value:0,theme:""},v.prototype.render=function(){var e=this,i=e.config,l=i.theme?'style="color: '+i.theme+';"':"";i.elem=a(i.elem),parseInt(i.value)!==i.value&&(i.half||(i.value=Math.ceil(i.value)-i.value<.5?Math.ceil(i.value):Math.floor(i.value)));for(var n='<ul class="layui-rate" '+(i.readonly?"readonly":"")+">",u=1;u<=i.length;u++){var r='<li class="layui-inline"><i class="layui-icon '+(u>Math.floor(i.value)?o:s)+'" '+l+"></i></li>";i.half&&parseInt(i.value)!==i.value&&u==Math.ceil(i.value)?n=n+'<li><i class="layui-icon layui-icon-rate-half" '+l+"></i></li>":n+=r}n+="</ul>"+(i.text?'<span class="layui-inline">'+i.value+"星":"")+"</span>";var c=i.elem,f=c.next("."+t);f[0]&&f.remove(),e.elemTemp=a(n),i.span=e.elemTemp.next("span"),i.setText&&i.setText(i.value),c.html(e.elemTemp),c.addClass("layui-inline"),i.readonly||e.action()},v.prototype.setvalue=function(e){var a=this,i=a.config;i.value=e,a.render()},v.prototype.action=function(){var e=this,i=e.config,l=e.elemTemp,n=l.find("i").width();l.children("li").each(function(e){var t=e+1,v=a(this);v.on("click",function(e){if(i.value=t,i.half){var o=e.pageX-a(this).offset().left;o<=n/2&&(i.value=i.value-.5)}i.text&&l.next("span").text(i.value+"星"),i.choose&&i.choose(i.value),i.setText&&i.setText(i.value)}),v.on("mousemove",function(e){if(l.find("i").each(function(){a(this).addClass(o).removeClass(r)}),l.find("i:lt("+t+")").each(function(){a(this).addClass(s).removeClass(f)}),i.half){var c=e.pageX-a(this).offset().left;c<=n/2&&v.children("i").addClass(u).removeClass(s)}}),v.on("mouseleave",function(){l.find("i").each(function(){a(this).addClass(o).removeClass(r)}),l.find("i:lt("+Math.floor(i.value)+")").each(function(){a(this).addClass(s).removeClass(f)}),i.half&&parseInt(i.value)!==i.value&&l.children("li:eq("+Math.floor(i.value)+")").children("i").addClass(u).removeClass(c)})})},v.prototype.events=function(){var e=this;e.config},i.render=function(e){var a=new v(e);return l.call(a)},e(n,i)});

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -1,13 +0,0 @@
package com.lxyer.bbs.mail;
import com.lxyer.bbs.base.BaseService;
/**
* 邮件服务
* Created by liangxianyou at 2018/5/13 9:45.
*/
public class MailService extends BaseService {
}

View File

@ -1,84 +0,0 @@
package com.lxyer.bbs.weixin;
import com.lxyer.bbs.base.BaseService;
import com.lxyer.bbs.base.user.UserService;
import com.lxyer.bbs.comment.CommentService;
import com.lxyer.bbs.content.ContentService;
import org.redkale.net.http.RestMapping;
import org.redkale.net.http.RestService;
import org.redkale.util.Utility;
import org.redkalex.cache.RedisCacheSource;
import org.redkalex.weixin.WeiXinMPService;
import javax.annotation.Resource;
import java.io.File;
import java.security.MessageDigest;
import java.util.Arrays;
/**
* Created by JUECHENG at 2018/1/12 0:14.
*/
@RestService(name = "wx",automapping = true, comment = "微信管理")
public class WeiXinService extends BaseService{
private String mptoken = "redbbs_dev";
@Resource(name = "redis")
private RedisCacheSource cacheSource;
//用于微信登录
@Resource
private WeiXinMPService wxService;
@Resource
private ContentService contentService;
@Resource
private CommentService commentService;
@Resource
private UserService userService;
@Resource(name = "SERVER_ROOT")
protected File webroot;
@RestMapping(name = "verifyMPURL",auth = false, comment = "微信域名验证")
public long verifyMPURL(String msgSignature, String timeStamp, String nonce, String echoStr) {
String o = cacheSource.getString("300");
cacheSource.set("t", "");
long d = cacheSource.getLong("d", 0);
cacheSource.incr("d");
cacheSource.setExpireSeconds("d", 5);
Object t = cacheSource.getString("t");
/*String signature = sha1(mptoken, timeStamp, nonce);
if (!signature.equals(msgSignature)) throw new RuntimeException("signature verification error");
return echoStr;*/
return d;
}
/**
* 用SHA1算法生成安全签名
* <p>
* @param strings String[]
*
* @return 安全签名
*/
protected static String sha1(String... strings) {
try {
Arrays.sort(strings);
MessageDigest md = MessageDigest.getInstance("SHA-1");
for (String s : strings) md.update(s.getBytes());
return Utility.binToHexString(md.digest());
} catch (Exception e) {
throw new RuntimeException("SHA encryption to generate signature failure", e);
}
}
}

View File

@ -1,16 +0,0 @@
package com.lxyer.redim;
import com.lxyer.redim.impl.ImFriendServiceImpl;
import org.redkale.boot.Application;
import org.redkale.boot.ApplicationListener;
/**
* @author: liangxianyou at 2018/8/10 22:51.
*/
public class RedbbsListener implements ApplicationListener {
@Override
public void preStart(Application application) {
ImFriendServiceImpl.application = application;
}
}

View File

@ -1,119 +0,0 @@
package com.lxyer.redim.impl;
import com.jfinal.kit.Kv;
import com.lxyer.base.JBean;
import com.lxyer.bbs.base.BaseService;
import com.lxyer.bbs.base.user.UserInfo;
import com.lxyer.bbs.base.user.UserRecord;
import com.lxyer.bbs.base.user.UserService;
import com.lxyer.redim.service.ImFriendService;
import org.redkale.boot.Application;
import org.redkale.net.TransportFactory;
import org.redkale.net.TransportGroupInfo;
import org.redkale.net.http.RestService;
import org.redkale.source.FilterExpress;
import org.redkale.source.FilterNode;
import org.redkale.util.ResourceType;
import javax.annotation.Resource;
import java.net.InetSocketAddress;
import java.util.ArrayList;
import java.util.List;
@ResourceType(ImFriendService.class)
@RestService(name = "imfriend",automapping = true, comment = "好友管理")
public class ImFriendServiceImpl extends BaseService implements ImFriendService {
@Resource
UserService userService;
@Resource
public static Application application;
@Override
public JBean friends(String sessionid) {
List<UserRecord> records = source.queryList(UserRecord.class, FilterNode.create("status", FilterExpress.NOTEQUAL, -10));
Kv data = Kv.create();
//mine
Kv mine = Kv.by("username", "游客").set("id", "0").set("sign","").set("status", "online").set("avatar", "/res/images/avatar/13.jpg");
UserInfo userInfo = userService.current(sessionid);
if (userInfo != null){
mine.set("username", userInfo.getNickname());
mine.set("id", userInfo.getUserid());
mine.set("sign", userInfo.getSign());
mine.set("avatar", userInfo.getAvatar());
mine.set("status", "online");
}
//friend
List<Kv> friend = new ArrayList<>();
List<Kv> group = new ArrayList<>();
List list = new ArrayList();
records.forEach(x->{
Kv _friend = Kv.by("id", x.getUserid());
_friend.set("username", x.getNickname());
_friend.set("sign", x.getSign());
_friend.set("avatar", x.getAvatar());
_friend.set("status", "online");
list.add(_friend);
});
friend.add(Kv.by("groupname", "默认分组").set("id", 1).set("online", list.size()).set("list", list));
group.add(Kv.by("groupname", "默认分组").set("id", 1).set("avatar", "/res/images/avatar/13.jpg"));
data.set("mine", mine).set("friend", friend).set("group", group);
return JBean.by(Kv.by("code", 0).set("msg", "").set("data", data));
}
@Override
public JBean friendList(String sessionid) {
/*SncpClient sncpClient = new SncpClient("", ImFriendService.class, this, transportFactory,
true, this.getClass(), new InetSocketAddress("192.168.227.1", 7070));*/
TransportFactory sncpTransportFactory = application.getSncpTransportFactory();
TransportGroupInfo groupInfo = sncpTransportFactory.findGroupInfo("ALL");
System.out.println(groupInfo.toString());
groupInfo.putAddress(new InetSocketAddress("120.24.230.60", 7070));
//sncpTransportFactory.addGroupInfo(groupInfo);
return friends(sessionid);
}
@Override
public JBean groups(String sessionid) {
return null;
}
@Override
public JBean itemSave(String sessionid) {
return null;
}
@Override
public JBean addFriend(String sessionid) {
return null;
}
@Override
public JBean groupSave(String sessionid) {
return null;
}
@Override
public JBean addGroup(String sessionid) {
return null;
}
}

View File

@ -1,93 +0,0 @@
package com.lxyer.redim.impl;
import com.lxyer.base.JBean;
import com.lxyer.bbs.base.BaseService;
import com.lxyer.bbs.base.user.UserRecord;
import com.lxyer.redim.entity.MsgRecord;
import com.lxyer.redim.info.MsgInfo;
import com.lxyer.redim.service.ImMsgService;
import org.redkale.net.http.RestService;
import org.redkale.source.FilterNode;
import org.redkale.util.ResourceType;
import java.util.List;
/**
* @author: liangxianyou at 2018/8/12 13:10.
*/
@ResourceType(ImMsgService.class)
@RestService(name = "immsg",automapping = true, comment = "聊天记录管理")
public class ImMsgServiceImpl extends BaseService implements ImMsgService {
/**
* 消息入库
*
* @param msg
*/
@Override
public JBean insert(MsgRecord... msg) {
source.insertAsync(msg);
return JBean.ok();
}
/**
* 消息修改
*
* @param msg
*/
@Override
public JBean update(MsgRecord ... msg) {
source.updateAsync(msg);
return JBean.ok();
}
/**
* 历史消息
*
* @return
*/
@Override
public JBean list() {
return null;
}
/**
* 创建消息体
*
* @param msg
*/
@Override
public JBean<MsgInfo> createMsgInfo(MsgRecord msg) {
MsgInfo info = new MsgInfo();
int fromuserid = msg.getFromuserid();
UserRecord userRecord;
if (fromuserid > 0){
userRecord = source.find(UserRecord.class, fromuserid);
info.setUsername(userRecord.getUsername());
info.setAvatar(userRecord.getAvatar());
info.setType("friend");
}else {
info.setUsername("游客");
info.setAvatar("/res/images/avatar/12.jpg");
info.setType("friend");
}
info.setId(msg.getFromuserid());
info.setContent(msg.getContent());
info.setCid(msg.getMsgid());
info.setMine(false);
info.setFromid(msg.getFromuserid());
info.setTimestamp(msg.getCreatetime());
return JBean.by(info);
}
@Override
public JBean<List<MsgRecord>> offlineMsg(int userid) {
List<MsgRecord> records = source.queryList(MsgRecord.class, FilterNode.create("touserid", userid).and("status", 10));
return JBean.by(records);
}
}

File diff suppressed because one or more lines are too long

View File

@ -1,68 +0,0 @@
======================
redbbs
redoss
redbbs-app
redim
redtimer
redexcel
jfly
待办:
1、redtimer 文档编写
# redbbs
1. √文章编辑加入未保存浏览器缓存
2. √文章编辑标题加入长度检查
3. 注册邮箱验证--
4. √加入管理员功能
5. 丰富个人中心
6. 加入资源模块--
7. √|-|管理员浏览文章阅读数不做增长
8. √个人中心-收藏数据不对
9. √管理员查询不到用户未公开帖子
10. √注册/资料修改 成功后未提示
11. √首页帖子用户头像链接地址错误
12. +帖子访客记录
13. 指定好友帖子权限--指定好友可见
14. ~项目更新记录页使用时光线展示
15. +SEO设置
16. +标签
17. +访问日志记录
18. +管理后台
19. +读书频道
20. +网站自动升级功能
21. +灵感说
22. +工作簿
社区升级
1、表字段统一小写
2、表模块划分
3、表状态等字段统一smallint
4、部分字段值重新定义
升级程序实录:
1.导出表结构
mysqldump -u root -d -p redbbs > redbbs-t-06.17.sql
2.导出数据
mysqldump -u root -t -p redbbs > redbbs-t-06.17.sql
3.创建数据库
create database redbbs_dev default charset utf8;
4.导入数据库
mysql -u root -p redbbs_dev < redbbs-t-06.17.sql
echo '[mongodb-org-3.6]
name=MongoDB Repository
baseurl=https://repo.mongodb.org/yum/redhat/$releasever/mongodb-org/3.6/x86_64/
gpgcheck=1
enabled=1
gpgkey=https://www.mongodb.org/static/pgp/server-3.6.asc'
>> /etc/yum.repos.d/mongodb-org-3.6.repo
灵感说功能