This commit is contained in:
2017-12-02 16:17:25 +08:00
parent 35e6fa140e
commit a34539ef16
194 changed files with 6976 additions and 0 deletions

View File

@@ -0,0 +1,25 @@
package com.lxyer.bbs.base;
import org.redkale.service.Service;
import org.redkale.source.DataSource;
import javax.annotation.Resource;
import java.io.File;
/**
* Created by Lxy at 2017/10/3 13:50.
*/
public class BaseService implements Service {
protected final int sessionExpireSeconds = 30 * 60;
protected final int contentinfoExpireSeconds = 30 * 60;
@Resource(name = "SERVER_ROOT")
protected File webroot;
@Resource(name = "art123")
protected DataSource source;
protected static final boolean winos = System.getProperty("os.name").contains("Window");
}

View File

@@ -0,0 +1,158 @@
package com.lxyer.bbs.base;
import com.jfinal.kit.Kv;
import com.jfinal.template.Engine;
import com.jfinal.template.Template;
import com.lxyer.bbs.service.UserService;
import org.redkale.net.http.HttpContext;
import org.redkale.net.http.HttpRequest;
import org.redkale.net.http.HttpResponse;
import org.redkale.net.http.HttpServlet;
import org.redkale.util.AnyValue;
import javax.annotation.Resource;
import java.io.File;
import java.io.IOException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import static com.lxyer.bbs.base.RetCodes.RET_USER_UNLOGIN;
/**
* Created by Lxy at 2017/10/3 13:39.
*/
public class BaseServlet extends HttpServlet {
@Resource(name = "SERVER_ROOT")
protected File webroot;
/*@Resource
protected EnjoyService enjoyService;*/
@Resource
protected UserService userService;
private HttpRequest request;
private HttpResponse response;
private static final Kv _kv = Kv.create();
private static Engine engine;
protected String sessionid;
@Override
public void init(HttpContext context, AnyValue config) {
if (engine == null){
engine = new Engine();
engine.setBaseTemplatePath(webroot.getPath());
engine.addSharedObject("EJ", new EJ());
engine.addSharedFunction("/_t/layout.html");
}
}
@Override
protected void preExecute(HttpRequest request, HttpResponse response) throws IOException {
sessionid = request.getSessionid(false);
if (sessionid != null) {
request.setCurrentUser(userService.current(sessionid));
_kv.set("mine", request.currentUser());
}
this.request = request;
this.response = response;
String uri = request.getRequestURI();
if (uri.startsWith("/res")){
File file = new File(webroot + uri);
response.finish(file);
return;
}
if (uri.endsWith(".html")){
Kv kv = Kv.by("resSys", "resSys");
finish(uri, kv);
return;
}
/*if ("/".equals(uri)){
finish("/front/index.html", Kv.by("",""));
return;
}*/
response.nextEvent();
}
@Override
protected void authenticate(HttpRequest request, HttpResponse response) throws IOException {
if (request.currentUser() == null) {
if ("XMLHttpRequest".equals(request.getHeader("X-Requested-With"))){
response.finish(RetCodes.retResult(RET_USER_UNLOGIN, "未登录,登录后重试").toString());
}else {
finish("/user/login.html");
}
return;
}
response.nextEvent();
}
public void finish(String view, Kv kv) {
if (request.currentUser() != null) kv.set("mine", request.currentUser());
Template template = engine.getTemplate(view);
String str = template.renderToString(kv);
response.setContentType("text/html; charset=UTF-8");
response.finish(str);
}
public void finish(String view){
finish(view, _kv);
}
public int getLimit(){
return request.getIntParameter("limit", 1);
}
public int getOffset(){
return request.getIntParameter("offset", 10);
}
/*
测试用例
System.out.println("sb="+getPara());
System.out.println("sb(0)="+getPara(0));
System.out.println("sb(1)="+getPara(1));
System.out.println("sb(-1)="+getPara(-1));
System.out.println("sb(-2)="+getPara(-2));
* */
public String getPara(){
String requestURI = request.getRequestURI();
String subStr = requestURI.substring(requestURI.lastIndexOf("/") + 1);
return subStr.contains("-") ? subStr.substring(0, subStr.indexOf("-")) : subStr;
}
public String getPara(int index){
String requestURI = request.getRequestURI();
String subStr = requestURI.substring(requestURI.lastIndexOf("/") + 1);
String[] paraArr = subStr.split("-");
if (index < 0){
return paraArr.length < -index ? null : paraArr[paraArr.length+index];
}else {
return paraArr.length < index+1 ? null : paraArr[index];
}
}
public <T> T getPara(int index, T defaultValue){
T para = (T)getPara(index);
return para == null || "".equals(para) ? defaultValue : para;
}
public int getParaToInt(int index, int defaultValue){
String para = getPara(index);
return para == null || "".equals(para) ? defaultValue : Integer.parseInt(para);
}
public int getParaToInt(int index){
int n = 0;
String para = getPara(index);
if (para == null || "".equals(para)) n = 0;
try {
n = Integer.parseInt(para);
}catch (Exception e){
}
return n;
}
}

View File

@@ -0,0 +1,48 @@
package com.lxyer.bbs.base;
import com.jfinal.kit.Kv;
import org.redkale.net.http.RestService;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
import java.util.stream.Stream;
import static java.util.Arrays.asList;
/**
* Created by Lxy at 2017/11/26 17:19.
*/
@RestService
public class EJ {
public String date(long time){
return date(time, "yyyy-MM-dd HH:mm:ss");
}
public String date(long time, String pattern){
return new SimpleDateFormat(pattern).format(time);
}
public static void main(String[] args) {
/*EJ ej = new EJ();
System.out.println(ej.date(1511682960591L));*/
List<Kv> list = asList(
Kv.by("k", 1).set("a", "1+1=?").set("q", 2)
, Kv.by("k", 2).set("a", "1*1=?").set("q", 1)
, Kv.by("k", 3).set("a", "3+2-5=?").set("q", 0)
, Kv.by("k", 4).set("a", "Math.abs(-3)=?").set("q", 3)
);
int k = 3;
Kv kv = list.stream().filter(x -> x.getInt("k") == k).findFirst().orElse(Kv.create());
System.out.println(System.currentTimeMillis());
System.out.println(kv.toString());
System.out.println(kv.getStr("q").equals("0"));
}
}

View File

@@ -0,0 +1,26 @@
package com.lxyer.bbs.base;
import com.jfinal.template.Engine;
import org.redkale.net.http.RestService;
import org.redkale.service.Service;
import org.redkale.util.AnyValue;
import javax.annotation.Resource;
import java.io.File;
/**
* Created by Lxy at 2017/10/1 8:41.
*/
@RestService(automapping = false)
public class EnjoyService extends Engine implements Service {
@Resource(name = "SERVER_ROOT")
protected File webroot;
@Override
public void init(AnyValue config) {
setBaseTemplatePath(webroot.getPath());
addSharedObject("EJ", new EJ());
addSharedFunction("/_t/layout.html");
}
}

View File

@@ -0,0 +1,41 @@
package com.lxyer.bbs.base;
import org.redkale.net.http.RestMapping;
import org.redkale.net.http.RestService;
import org.redkale.net.http.RestUploadFile;
import org.redkale.service.RetResult;
import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.StandardCopyOption;
/**
* Created by Lxy at 2017/10/3 13:48.
*/
@RestService(automapping = true, comment = "文件服务")
public class FileService extends BaseService {
private static final String dir = "/var/www/upload/bbs/";
private static final String view = "http://img.1216.top/bbs/";
private static final String format = "%1$tY%1$tm%1$td%1$tH%1$tM%1$tS";
@RestMapping(name = "upload", comment = "文件上传")
public RetResult upload(@RestUploadFile File tmpFile) throws IOException {
String name = tmpFile.getName();
String suffix = name.substring(name.lastIndexOf("."));
String path = String.format(format, System.currentTimeMillis()) + suffix;
File destFile = new File((winos ? "E:/wk/_own/bbs/root/tem/" : dir) + path);
destFile.getParentFile().mkdir();
if (!tmpFile.renameTo(destFile)){
try{
Files.copy(tmpFile.toPath(), destFile.toPath(), StandardCopyOption.ATOMIC_MOVE);
}finally {
tmpFile.delete();//删除临时文件
}
}
RetResult result = RetResult.success();
result.setRetinfo((winos ? "/tem/": view) + path);
return result;
}
}

View File

@@ -0,0 +1,33 @@
package com.lxyer.bbs.base;
import java.text.SimpleDateFormat;
/**
* Created by Lxy at 2017/11/29 15:17.
*/
public final class LxyKit {
public static String dateFmt(long time){
/**
* 刚刚 60秒内 60 * 1000
* x分钟前 1小时候内 60 * 60*1000
* x小时前 1天内 24 * 60*60*1000
* x天前 1周内 7 * 24*60*60*1000
* 年-月-日 1周前
*/
long now = System.currentTimeMillis();
long diff = now - time;
if (diff < 60 * 1000)
return "刚刚";
else if (diff < 60 * 60 *1000)
return Math.floorDiv(diff, 60 *1000) + "分钟前";
else if (diff < 24 * 60*60*1000)
return Math.floorDiv(diff, 60 *60*1000) + "小时前";
else if (diff > 24 * 60*60*1000 && diff < 7 * 24*60*60*1000)
return Math.floorDiv(diff, 24 * 60*60*1000) + "天前";
else
return new SimpleDateFormat("yyyy-MM-dd").format(time);
}
}

View File

@@ -0,0 +1,60 @@
package com.lxyer.bbs.base;
import org.redkale.service.RetLabel;
import org.redkale.service.RetResult;
/**
* Created by Lxy at 2017/10/1 11:21.
*/
public abstract class RetCodes {
@RetLabel("参数无效")
public static final int RET_PARAMS_ILLEGAL = 3001_0001;
//------------------------------------- 用户模块 -----------------------------------------
@RetLabel("未登陆")
public static final int RET_USER_UNLOGIN = 3002_0001;
@RetLabel("用户或密码错误")
public static final int RET_USER_ACCOUNT_PWD_ILLEGAL = 3002_0002;
@RetLabel("用户权限不够")
public static final int RET_USER_AUTH_ILLEGAL = 3002_0003;
@RetLabel("密码设置无效")
public static final int RET_USER_PASSWORD_ILLEGAL = 3002_0004;
@RetLabel("用户不存在")
public static final int RET_USER_NOTEXISTS = 3002_0005;
@RetLabel("用户名已存在")
public static final int RET_USER_USERNAME_EXISTS = 3002_0006;
@RetLabel("用户名无效")
public static final int RET_USER_USERNAME_ILLEGAL = 3002_0007;
@RetLabel("邮箱已存在")
public static final int RET_USER_EMAIL_EXISTS = 3002_0008;
@RetLabel("邮箱无效")
public static final int RET_USER_EMAIL_ILLEGAL = 3002_0009;
//------------------------------------- 内容模块 -----------------------------------------
//------------------------------------- 评论模块 -----------------------------------------
@RetLabel("评论内容无效")
public static final int RET_COMMENT_CONTENT_ILLEGAL = 3004_0001;
@RetLabel("评论参数无效")
public static final int RET_COMMENT_PARA_ILLEGAL = 3004_0002;
public static RetResult retResult(int retcode) {
return new RetResult(retcode);
}
public static RetResult retResult(int retcode, String retinfo) {
return new RetResult(retcode, retinfo);
}
}

View File

@@ -0,0 +1,98 @@
package com.lxyer.bbs.base.bean;
import org.redkale.convert.json.JsonConvert;
import org.redkale.source.FilterBean;
import javax.persistence.Column;
import javax.persistence.Table;
import java.io.Serializable;
/**
*
* @author lxyer
*/
@Table(catalog = "db_redbbs", name = "act_log")
public class ActLogBean implements Serializable, FilterBean {
@Column(comment = "[日志id]")
private int logid;
@Column(comment = "[日志类型]")
private int cate;
@Column(comment = "[目标数据id]")
private int tid;
@Column(comment = "[用户id]")
private int userId;
@Column(comment = "[创建时间]")
private long createTime;
@Column(length = 128, comment = "[说明]")
private String remark = "";
@Column(comment = "[状态]-1删除 1正常")
private int status = 1;
public void setLogid(int logid) {
this.logid = logid;
}
public int getLogid() {
return this.logid;
}
public void setCate(int cate) {
this.cate = cate;
}
public int getCate() {
return this.cate;
}
public void setTid(int tid) {
this.tid = tid;
}
public int getTid() {
return this.tid;
}
public void setUserId(int userId) {
this.userId = userId;
}
public int getUserId() {
return this.userId;
}
public void setCreateTime(long createTime) {
this.createTime = createTime;
}
public long getCreateTime() {
return this.createTime;
}
public void setRemark(String remark) {
this.remark = remark;
}
public String getRemark() {
return this.remark;
}
public void setStatus(int status) {
this.status = status;
}
public int getStatus() {
return this.status;
}
@Override
public String toString() {
return JsonConvert.root().convertTo(this);
}
}

View File

@@ -0,0 +1,163 @@
package com.lxyer.bbs.base.bean;
import org.redkale.convert.json.JsonConvert;
import javax.persistence.Column;
/**
*
* @author lxyer
*/
public class CommentInfo implements java.io.Serializable {
@Column(comment = "[评论id]")
private int commentId;
@Column(comment = "[评论用户id]")
private int userId;
@Column(comment = "[评论父id]")
private int pid;
@Column(comment = "[评论的类型]")
private int cate;
@Column(comment = "[被评论内容的id]")
private int contentId;
@Column(comment = "[评论内容]")
private String content = "";
@Column(comment = "[支持数]")
private int supportNum;
@Column(comment = "[状态]1正常-1删除")
private int status = 1;
private String createTime;
private CommentInfo pCommentInfo;
private String nickname = "";
private String avatar = "";
private String title;
private int hadSupport = -1;
public void setCommentId(int commentId) {
this.commentId = commentId;
}
public int getCommentId() {
return this.commentId;
}
public void setUserId(int userId) {
this.userId = userId;
}
public int getUserId() {
return this.userId;
}
public int getPid() {
return pid;
}
public void setPid(int pid) {
this.pid = pid;
}
public int getCate() {
return cate;
}
public void setCate(int cate) {
this.cate = cate;
}
public void setContentId(int contentId) {
this.contentId = contentId;
}
public int getContentId() {
return this.contentId;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
public int getSupportNum() {
return supportNum;
}
public void setSupportNum(int supportNum) {
this.supportNum = supportNum;
}
public void setStatus(int status) {
this.status = status;
}
public int getStatus() {
return this.status;
}
public String getCreateTime() {
return createTime;
}
public void setCreateTime(String createTime) {
this.createTime = createTime;
}
public CommentInfo getpCommentInfo() {
return pCommentInfo;
}
public void setpCommentInfo(CommentInfo pCommentInfo) {
this.pCommentInfo = pCommentInfo;
}
public String getNickname() {
return nickname;
}
public void setNickname(String nickname) {
this.nickname = nickname;
}
public String getAvatar() {
return avatar;
}
public void setAvatar(String avatar) {
this.avatar = avatar;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public int getHadSupport() {
return hadSupport;
}
public void setHadSupport(int hadSupport) {
this.hadSupport = hadSupport;
}
@Override
public String toString() {
return JsonConvert.root().convertTo(this);
}
}

View File

@@ -0,0 +1,154 @@
package com.lxyer.bbs.base.bean;
import org.redkale.convert.json.JsonConvert;
import org.redkale.source.FilterBean;
import javax.persistence.Column;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Table;
/**
*
* @author lxyer
*/
@Table(catalog = "db_redbbs", name = "content", comment = "[内容表]")
public class ContentBean implements FilterBean,java.io.Serializable {
@Id
@GeneratedValue
@Column(comment = "[内容id]")
private int contentId;
@Column(comment = "[用户id]")
private int userId;
@Column(length = 64, comment = "[标题]")
private String title = "";
@Column(length = 256, comment = "[摘要]")
private String digest = "";
@Column(comment = "[内容]")
private String content = "";
@Column(comment = "[创建时间]")
private long createTime;
@Column(comment = "[类别]")
private int cate;
@Column(comment = "[内容类型]1新闻2作品")
private int type;
@Column(comment = "[评论数]")
private int replyNum;
@Column(comment = "[阅读量]")
private int viewNum;
/* @Column(comment = "[精] 0否1是")
private int wonderful;
@Column(comment = "[置顶] 0否1是")
private int top;
@Column(comment = "[结帖]大于0结帖")
private int solved;*/
@Column(comment = "[状态]")
private int status = 1;
public void setContentId(int contentId) {
this.contentId = contentId;
}
public int getContentId() {
return this.contentId;
}
public void setUserId(int userId) {
this.userId = userId;
}
public int getUserId() {
return this.userId;
}
public void setTitle(String title) {
this.title = title;
}
public String getTitle() {
return this.title;
}
public void setDigest(String digest) {
this.digest = digest;
}
public String getDigest() {
return this.digest;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
public void setCreateTime(long createTime) {
this.createTime = createTime;
}
public long getCreateTime() {
return this.createTime;
}
public int getCate() {
return cate;
}
public void setCate(int cate) {
this.cate = cate;
}
public void setType(int type) {
this.type = type;
}
public int getType() {
return this.type;
}
public int getReplyNum() {
return replyNum;
}
public void setReplyNum(int replyNum) {
this.replyNum = replyNum;
}
public int getViewNum() {
return viewNum;
}
public void setViewNum(int viewNum) {
this.viewNum = viewNum;
}
public int getStatus() {
return status;
}
public void setStatus(int status) {
this.status = status;
}
@Override
public String toString() {
return JsonConvert.root().convertTo(this);
}
}

View File

@@ -0,0 +1,174 @@
package com.lxyer.bbs.base.bean;
import javax.persistence.Column;
import java.io.Serializable;
/**
* Created by Lxy at 2017/11/26 20:52.
*/
public class ContentInfo implements Serializable {
private int contentId;
private int userId;
private String title = "";
private String digest = "";
private String content = "";
private int cate;
private int type;
private int replyNum;
private int viewNum;
private int wonderful;
private int top;
private int solved;
private int status = 1;
private String createTime;
private String cateName;
private String nickname = "";
private String avatar = "";
private int hadCollect = -1;
public int getContentId() {
return contentId;
}
public void setContentId(int contentId) {
this.contentId = contentId;
}
public int getUserId() {
return userId;
}
public void setUserId(int userId) {
this.userId = userId;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getDigest() {
return digest;
}
public void setDigest(String digest) {
this.digest = digest;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
public int getCate() {
return cate;
}
public void setCate(int cate) {
this.cate = cate;
}
public int getType() {
return type;
}
public void setType(int type) {
this.type = type;
}
public int getReplyNum() {
return replyNum;
}
public void setReplyNum(int replyNum) {
this.replyNum = replyNum;
}
public int getViewNum() {
return viewNum;
}
public void setViewNum(int viewNum) {
this.viewNum = viewNum;
}
public int getStatus() {
return status;
}
public void setStatus(int status) {
this.status = status;
}
public int getWonderful() {
return wonderful;
}
public void setWonderful(int wonderful) {
this.wonderful = wonderful;
}
public int getTop() {
return top;
}
public void setTop(int top) {
this.top = top;
}
public int getSolved() {
return solved;
}
public void setSolved(int solved) {
this.solved = solved;
}
public String getCreateTime() {
return createTime;
}
public void setCreateTime(String createTime) {
this.createTime = createTime;
}
public String getCateName() {
return cateName;
}
public void setCateName(String cateName) {
this.cateName = cateName;
}
public String getNickname() {
return nickname;
}
public void setNickname(String nickname) {
this.nickname = nickname;
}
public String getAvatar() {
return avatar;
}
public void setAvatar(String avatar) {
this.avatar = avatar;
}
public int getHadCollect() {
return hadCollect;
}
public void setHadCollect(int hadCollect) {
this.hadCollect = hadCollect;
}
}

View File

@@ -0,0 +1,49 @@
package com.lxyer.bbs.base.bean;
import com.lxyer.bbs.base.entity.User;
import org.redkale.net.http.RestSessionid;
import org.redkale.source.FilterBean;
import org.redkale.util.Comment;
import javax.persistence.Transient;
/**
* Created by Lxy at 2017/10/1 10:40.
*/
public class LoginBean implements FilterBean {
private String username;
private String password;
@Transient
@Comment("会话SESSIONID")
@RestSessionid(create = true)
private String sessionid = "";
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return User.md5IfNeed(password);
}
public void setPassword(String password) {
this.password = password;
}
public String getSessionid() {
return sessionid;
}
public void setSessionid(String sessionid) {
this.sessionid = sessionid;
}
public boolean emptyUsername() {
return username == null || username.isEmpty();
}
}

View File

@@ -0,0 +1,67 @@
package com.lxyer.bbs.base.bean;
import org.redkale.source.FilterBean;
import javax.persistence.Column;
/**
* Created by Lxy at 2017/10/10 8:30.
*/
public class UserBean implements FilterBean {
@Column(length = 32, comment = "[登录名]")
private String username;
@Column(length = 32, comment = "[电话号码]")
private String phone;
@Column(length = 64, comment = "[昵称]")
private String nickname;
@Column(length = 32, comment = "[真实姓名]")
private String realname;
@Column(length = 32, comment = "[邮箱]")
private String email;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
public String getNickname() {
return nickname;
}
public void setNickname(String nickname) {
this.nickname = nickname;
}
public String getRealname() {
return realname;
}
public void setRealname(String realname) {
this.realname = realname;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
}

View File

@@ -0,0 +1,174 @@
package com.lxyer.bbs.base.bean;
import org.redkale.convert.ConvertColumn;
import org.redkale.convert.ConvertType;
import org.redkale.convert.json.JsonConvert;
import javax.persistence.Column;
import javax.persistence.Id;
/**
*
* @author lxyer
*/
public class UserInfo implements java.io.Serializable {
@Id
@Column(comment = "[用户id]")
private int userId;
private String username = "";
private int sex = 1;
private String password = "";
private String phone = "";
private String nickname = "";
private String avatar = "";
private String relaname = "";
private String email = "";
private long createTime;
private String sign = "";
private String city = "";
private int status = 1;
private String time = "";
public void setUserId(int userId) {
this.userId = userId;
}
public int getUserId() {
return this.userId;
}
public void setUsername(String username) {
this.username = username;
}
public String getUsername() {
return this.username;
}
public int getSex() {
return sex;
}
public void setSex(int sex) {
this.sex = sex;
}
@ConvertColumn(type = ConvertType.JSON)
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public void setPhone(String phone) {
this.phone = phone;
}
public String getPhone() {
return this.phone;
}
public void setNickname(String nickname) {
this.nickname = nickname;
}
public String getNickname() {
return this.nickname;
}
public void setAvatar(String avatar) {
this.avatar = avatar;
}
public String getAvatar() {
return this.avatar;
}
public void setRelaname(String relaname) {
this.relaname = relaname;
}
public String getRelaname() {
return this.relaname;
}
public void setEmail(String email) {
this.email = email;
}
public String getEmail() {
return this.email == null || this.email.isEmpty() ? "" : this.email;
}
public void setCreateTime(long createTime) {
this.createTime = createTime;
}
public long getCreateTime() {
return this.createTime;
}
public String getSign() {
return sign;
}
public void setSign(String sign) {
this.sign = sign;
}
public String getCity() {
return city;
}
public void setCity(String city) {
this.city = city;
}
public void setStatus(int status) {
this.status = status;
}
public int getStatus() {
return this.status;
}
public String getTime() {
return time;
}
public void setTime(String time) {
this.time = time;
}
@Override
public String toString() {
return JsonConvert.root().convertTo(this);
}
/**
* 检查用户权限
* @param moduleid
* @param actionid
* @return
*/
public boolean checkAuth(int moduleid, int actionid) {
return !(moduleid == 2 && actionid == 1);
}
}

View File

@@ -0,0 +1,124 @@
package com.lxyer.bbs.base.entity;
import org.redkale.convert.json.JsonConvert;
import javax.persistence.*;
/**
*
* @author lxyer
*/
@Cacheable
@Table(catalog = "db_redbbs", name = "act_log")
public class ActLog implements java.io.Serializable {
@Id
@GeneratedValue
@Column(comment = "[日志id]")
private int logid;
@Column(comment = "[日志类型]")
private int cate;
@Column(comment = "[目标数据id]")
private int tid;
@Column(comment = "[用户id]")
private int userId;
@Column(comment = "[创建时间]")
private long createTime;
@Column(length = 128, comment = "[说明]")
private String remark = "";
@Column(comment = "[状态]-1删除 1正常")
private int status = 1;
public ActLog cate(int cate){
this.cate = cate;
return this;
}
public ActLog tid(int tid){
this.tid = tid;
return this;
}
public ActLog userId(int userId){
this.userId = userId;
return this;
}
public ActLog createTime(long createTime){
this.createTime = createTime;
return this;
}
public ActLog remark(String remark){
this.remark = remark;
return this;
}
public ActLog status(int status){
this.status = status;
return this;
}
public void setLogid(int logid) {
this.logid = logid;
}
public int getLogid() {
return this.logid;
}
public void setCate(int cate) {
this.cate = cate;
}
public int getCate() {
return this.cate;
}
public void setTid(int tid) {
this.tid = tid;
}
public int getTid() {
return this.tid;
}
public void setUserId(int userId) {
this.userId = userId;
}
public int getUserId() {
return this.userId;
}
public void setCreateTime(long createTime) {
this.createTime = createTime;
}
public long getCreateTime() {
return this.createTime;
}
public void setRemark(String remark) {
this.remark = remark;
}
public String getRemark() {
return this.remark;
}
public void setStatus(int status) {
this.status = status;
}
public int getStatus() {
return this.status;
}
@Override
public String toString() {
return JsonConvert.root().convertTo(this);
}
}

View File

@@ -0,0 +1,137 @@
package com.lxyer.bbs.base.entity;
import com.lxyer.bbs.base.LxyKit;
import com.lxyer.bbs.base.bean.CommentInfo;
import org.redkale.convert.json.JsonConvert;
import javax.persistence.*;
/**
*
* @author lxyer
*/
@Cacheable(interval = 5*60)
@Table(catalog = "db_redbbs", name = "comment", comment = "[评论表]")
public class Comment implements java.io.Serializable {
@Id
@GeneratedValue
@Column(comment = "[评论id]")
private int commentId;
@Column(comment = "[评论用户id]")
private int userId;
@Column(comment = "[评论父id]")
private int pid;
@Column(comment = "[评论的类型]")
private int cate;
@Column(comment = "[被评论内容的id]")
private int contentId;
@Column(comment = "[评论内容]")
private String content = "";
@Column(comment = "[创建时间]")
private long createTime;
@Column(comment = "[支持数]")
private int supportNum;
@Column(comment = "[状态]1正常-1删除")
private int status = 1;
public void setCommentId(int commentId) {
this.commentId = commentId;
}
public int getCommentId() {
return this.commentId;
}
public void setUserId(int userId) {
this.userId = userId;
}
public int getUserId() {
return this.userId;
}
public int getPid() {
return pid;
}
public void setPid(int pid) {
this.pid = pid;
}
public int getCate() {
return cate;
}
public void setCate(int cate) {
this.cate = cate;
}
public void setContentId(int contentId) {
this.contentId = contentId;
}
public int getContentId() {
return this.contentId;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
public void setCreateTime(long createTime) {
this.createTime = createTime;
}
public long getCreateTime() {
return this.createTime;
}
public int getSupportNum() {
return supportNum;
}
public void setSupportNum(int supportNum) {
this.supportNum = supportNum;
}
public void setStatus(int status) {
this.status = status;
}
public int getStatus() {
return this.status;
}
@Override
public String toString() {
return JsonConvert.root().convertTo(this);
}
public CommentInfo createCommentInfo(){
CommentInfo info = new CommentInfo();
info.setCommentId(commentId);
info.setUserId(userId);
info.setPid(pid);
info.setCate(cate);
info.setContentId(contentId);
info.setContent(content);
info.setSupportNum(supportNum);
info.setStatus(status);
info.setCreateTime(LxyKit.dateFmt(createTime));
return info;
}
}

View File

@@ -0,0 +1,207 @@
package com.lxyer.bbs.base.entity;
import com.lxyer.bbs.base.LxyKit;
import com.lxyer.bbs.base.bean.ContentInfo;
import org.redkale.convert.json.JsonConvert;
import javax.persistence.*;
import java.text.SimpleDateFormat;
/**
*
* @author lxyer
*/
@Cacheable(interval = 60)
@Table(catalog = "db_redbbs", name = "content", comment = "[内容表]")
public class Content implements java.io.Serializable {
@Id
@GeneratedValue
@Column(comment = "[内容id]")
private int contentId;
@Column(comment = "[用户id]")
private int userId;
@Column(length = 64, comment = "[标题]")
private String title = "";
@Column(length = 256, comment = "[摘要]")
private String digest = "";
@Column(comment = "[内容]")
private String content = "";
@Column(comment = "[创建时间]")
private long createTime;
@Column(comment = "[类别]")
private int cate;
@Column(comment = "[内容类型]1新闻2作品")
private int type;
@Column(comment = "[评论数]")
private int replyNum;
@Column(comment = "[阅读量]")
private int viewNum;
@Column(comment = "[精] 0否1是")
private int wonderful;
@Column(comment = "[置顶] 0否1是")
private int top;
@Column(comment = "[结帖]大于0结帖")
private int solved;
@Column(comment = "[状态]")
private int status = 1;
public void setContentId(int contentId) {
this.contentId = contentId;
}
public int getContentId() {
return this.contentId;
}
public void setUserId(int userId) {
this.userId = userId;
}
public int getUserId() {
return this.userId;
}
public void setTitle(String title) {
this.title = title;
}
public String getTitle() {
return this.title;
}
public void setDigest(String digest) {
this.digest = digest;
}
public String getDigest() {
return this.digest;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
public void setCreateTime(long createTime) {
this.createTime = createTime;
}
public long getCreateTime() {
return this.createTime;
}
public int getCate() {
return cate;
}
public void setCate(int cate) {
this.cate = cate;
}
public void setType(int type) {
this.type = type;
}
public int getType() {
return this.type;
}
public int getReplyNum() {
return replyNum;
}
public void setReplyNum(int replyNum) {
this.replyNum = replyNum;
}
public int getViewNum() {
return viewNum;
}
public void setViewNum(int viewNum) {
this.viewNum = viewNum;
}
public int getWonderful() {
return wonderful;
}
public void setWonderful(int wonderful) {
this.wonderful = wonderful;
}
public int getTop() {
return top;
}
public void setTop(int top) {
this.top = top;
}
public int getSolved() {
return solved;
}
public void setSolved(int solved) {
this.solved = solved;
}
public void setStatus(int status) {
this.status = status;
}
public int getStatus() {
return this.status;
}
@Override
public String toString() {
return JsonConvert.root().convertTo(this);
}
public ContentInfo createContentInfo(){
ContentInfo info = new ContentInfo();
info.setContentId(contentId);
info.setUserId(userId);
info.setTitle(title);
info.setContent(content);
info.setCate(cate);
info.setViewNum(viewNum);
info.setReplyNum(replyNum);
info.setWonderful(wonderful);
info.setTop(top);
info.setSolved(solved);
info.setCateName(cateName());
info.setCreateTime(LxyKit.dateFmt(createTime));
return info;
}
public String cateName(){
switch (cate){
case 1: return "Redkale框架综合";
case 2: return "JFinal框架综合";
case 3: return "Layui框架综合";
case 4: return "JSON解析";
default: return "其他";
}
}
}

View File

@@ -0,0 +1,65 @@
package com.lxyer.bbs.base.entity;
import org.redkale.convert.json.JsonConvert;
import javax.persistence.Column;
import javax.persistence.Id;
import javax.persistence.Table;
/**
*
* @author lxyer
*/
@Table(catalog = "db_art_red", name = "dyna_attr", comment = "[动态属性表]")
public class DynaAttr implements java.io.Serializable {
@Id
@Column(comment = "[目标数据id]")
private int tid;
@Column(comment = "[类型]1文章, 2xx, 3...,")
private int cate;
@Column(length = 32, comment = "")
private String attr = "";
@Column(comment = "[属性值]")
private String value = "";
public void setTid(int tid) {
this.tid = tid;
}
public int getTid() {
return this.tid;
}
public void setCate(int cate) {
this.cate = cate;
}
public int getCate() {
return this.cate;
}
public void setAttr(String attr) {
this.attr = attr;
}
public String getAttr() {
return this.attr;
}
public void setValue(String value) {
this.value = value;
}
public String getValue() {
return this.value;
}
@Override
public String toString() {
return JsonConvert.root().convertTo(this);
}
}

View File

@@ -0,0 +1,211 @@
package com.lxyer.bbs.base.entity;
import com.lxyer.bbs.base.bean.UserInfo;
import org.redkale.convert.ConvertColumn;
import org.redkale.convert.ConvertType;
import org.redkale.convert.json.JsonConvert;
import org.redkale.util.Utility;
import javax.persistence.Cacheable;
import javax.persistence.Column;
import javax.persistence.Id;
import javax.persistence.Table;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
/**
*
* @author lxyer
*/
@Cacheable(interval = 60)
@Table(catalog = "db_redbbs", name = "user")
public class User implements java.io.Serializable {
@Id
//@GeneratedValue
@Column(comment = "[用户id]", updatable = false)
private int userId;
@Column(length = 32, comment = "[登录名]")
private String username = "";
@Column(comment = "[性别]默认1 1男2女")
private int sex = 1;
@Column(length = 64, comment = "[密码]")
private String password = "";
@Column(length = 32, comment = "[电话号码]")
private String phone = "";
@Column(length = 64, comment = "[昵称]")
private String nickname = "";
@Column(length = 128, comment = "[头像地址]")
private String avatar = "";
@Column(length = 32, comment = "[真实姓名]")
private String realname = "";
@Column(length = 32, comment = "[邮箱]")
private String email = "";
@Column(comment = "[创建时间]", updatable = false)
private long createTime;
@Column(length = 256, comment = "[签名]")
private String sign = "";
@Column(length = 64, comment = "[所在城市]")
private String city = "";
@Column(comment = "[状态]")
private int status = 1;
public String passwordForMd5(){
return md5IfNeed(password);
}
public static String md5IfNeed(String password){
if (password == null || password.isEmpty()) return "";
if (password.length() == 32) return password;
MessageDigest md5 = null;
try {
md5 = MessageDigest.getInstance("MD5");
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
byte[] bytes = password.trim().getBytes();
bytes = md5.digest(bytes);
return new String(Utility.binToHex(bytes));
}
public int getUserId() {
return userId;
}
public void setUserId(int userId) {
this.userId = userId;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public int getSex() {
return sex;
}
public void setSex(int sex) {
this.sex = sex;
}
@ConvertColumn(ignore = true, type = ConvertType.JSON)
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
public String getNickname() {
return nickname;
}
public void setNickname(String nickname) {
this.nickname = nickname;
}
public String getAvatar() {
return avatar;
}
public void setAvatar(String avatar) {
this.avatar = avatar;
}
public String getRealname() {
return realname;
}
public void setRealname(String realname) {
this.realname = realname;
}
public String getEmail() {
return (email == null || email.isEmpty()) ? " " : email;
}
public void setEmail(String email) {
this.email = email;
}
public long getCreateTime() {
return createTime;
}
public void setCreateTime(long createTime) {
this.createTime = createTime;
}
public String getSign() {
return sign;
}
public void setSign(String sign) {
this.sign = sign;
}
public String getCity() {
return city;
}
public void setCity(String city) {
this.city = city;
}
public int getStatus() {
return status;
}
public void setStatus(int status) {
this.status = status;
}
@Override
public String toString() {
return JsonConvert.root().convertTo(this);
}
public UserInfo createUserInfo() {
UserInfo userInfo = new UserInfo();
userInfo.setUserId(userId);
userInfo.setUsername(username);
userInfo.setSex(sex);
userInfo.setPassword(password);
userInfo.setPhone(phone);
userInfo.setNickname(nickname);
userInfo.setAvatar(avatar);
userInfo.setRelaname(realname);
userInfo.setEmail(email);
userInfo.setCreateTime(createTime);
userInfo.setSign(sign);
userInfo.setCity(city);
userInfo.setStatus(getStatus());
return userInfo;
}
}

View File

@@ -0,0 +1,151 @@
package com.lxyer.bbs.service;
import com.lxyer.bbs.base.BaseService;
import com.lxyer.bbs.base.RetCodes;
import com.lxyer.bbs.base.bean.CommentInfo;
import com.lxyer.bbs.base.entity.ActLog;
import com.lxyer.bbs.base.entity.Comment;
import com.lxyer.bbs.base.entity.Content;
import com.lxyer.bbs.base.entity.User;
import org.redkale.net.http.RestMapping;
import org.redkale.net.http.RestParam;
import org.redkale.net.http.RestService;
import org.redkale.net.http.RestSessionid;
import org.redkale.service.RetResult;
import org.redkale.source.*;
import org.redkale.util.SelectColumn;
import org.redkale.util.Sheet;
import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import static com.lxyer.bbs.base.RetCodes.*;
import static java.util.Arrays.asList;
/**
* Created by Lxy at 2017/11/29 10:00.
*/
@RestService(automapping = true, comment = "评论服务")
public class CommentService extends BaseService {
@Resource
private UserService userService;
@RestMapping(name = "save", comment = "评论保存")
public RetResult commentSave(@RestSessionid String sessionid, @RestParam(name = "bean") Comment comment){
int contentId = comment.getContentId();
if (contentId < 1) return RetCodes.retResult(RET_COMMENT_PARA_ILLEGAL, "评论参数无效");
if (comment.getContent() == null) return RetCodes.retResult(RET_COMMENT_CONTENT_ILLEGAL, "评论内容无效");
if (comment.getCommentId() < 1) {
int userId = userService.currentUserId(sessionid);
comment.setUserId(userId);
comment.setCreateTime(System.currentTimeMillis());
source.insert(comment);
//update replyNum
int count = source.getNumberResult(Comment.class, FilterFunc.COUNT, "commentId", FilterNode.create("contentId", contentId)).intValue();
source.updateColumn(Content.class, contentId, ColumnValue.create("replyNum", count));
}else {
source.updateColumn(comment, SelectColumn.createIncludes("content"));
}
return RetResult.success();
}
@RestMapping(name = "query", auth = false,comment = "查询评论")
public Sheet<CommentInfo> commentQuery(@RestSessionid String sessionid , int contentId, Flipper flipper){
int userId = userService.currentUserId(sessionid);
flipper.setSort("supportNum DESC,commentId ASC");
Sheet<Comment> comments = source.querySheet(Comment.class, flipper, FilterNode.create("contentId", contentId));
Sheet<CommentInfo> infos = new Sheet<>();
List<CommentInfo> list = new ArrayList<>();
if (comments.getRows() == null) return infos;
//映射用户信息
int[] userids = comments.stream().mapToInt(x -> x.getUserId()).toArray();
List<User> users = source.queryList(User.class, SelectColumn.createIncludes("userId","avatar", "nickname"), FilterNode.create("userId", FilterExpress.IN, userids));
//用户点赞的评论
List<Integer> hadSupport = new ArrayList<>();
if (userId > 0){
FilterNode node = FilterNode.create("cate", 1).and("status", 1).and("userId", userId);
List<ActLog> actLogs = source.queryList(ActLog.class, SelectColumn.createIncludes("tid"), node);
actLogs.forEach(x->hadSupport.add(x.getTid()));
}
comments.forEach(x->{
CommentInfo info = x.createCommentInfo();
User user = users.stream().filter(k -> k.getUserId() == x.getUserId()).findFirst().orElse(new User());
info.setAvatar(user.getAvatar());
info.setNickname(user.getNickname());
info.setHadSupport(hadSupport.contains(x.getCommentId()) ? 1 : -1);//
list.add(info);
});
infos.setRows(list);
infos.setTotal(comments.getTotal());
return infos;
}
public Sheet<CommentInfo> queryByUserid(int userid){
Sheet<Comment> comments = source.querySheet(Comment.class, new Flipper().sort("createTime DESC"), FilterNode.create("userId", userid));
int[] contentIds = comments.stream().mapToInt(x -> x.getContentId()).toArray();
List<Content> contents = source.queryList(Content.class, SelectColumn.createIncludes("contentId","title"), FilterNode.create("contentId", FilterExpress.IN, contentIds));
Sheet<CommentInfo> infos = new Sheet<>();
List<CommentInfo> list = new ArrayList<>();
comments.forEach(x->{
CommentInfo info = x.createCommentInfo();
Content content = contents.stream().filter(k -> k.getContentId() == x.getContentId()).findFirst().orElse(new Content());
info.setTitle(content.getTitle());
list.add(info);
});
infos.setRows(list);
infos.setTotal(comments.getTotal());
return infos;
}
@RestMapping(name = "support", comment = "评论点赞")
public RetResult support(@RestSessionid String sessionid, int commentId, int ok){
int userId = userService.currentUserId(sessionid);
ActLog actLog = source.find(ActLog.class, FilterNode.create("userId", userId).and("tid", commentId).and("cate", 1));
if (actLog == null && ok == 1){
actLog = new ActLog().cate(1).tid(commentId).userId(userId);
actLog.setCreateTime(System.currentTimeMillis());
source.insert(actLog);
}else if (actLog != null && actLog.getStatus() != ok){
actLog.setStatus(ok);
source.update(actLog);
}else {
return RetCodes.retResult(-1, ok == 1 ? "已赞" : "已取消赞");
}
int count = source.getNumberResult(ActLog.class, FilterFunc.COUNT, 0, "logid", FilterNode.create("tid", commentId).and("status", 1)).intValue();
source.updateColumn(Comment.class, commentId,"supportNum", count);
return RetResult.success();
}
@RestMapping(name = "rankuser", auth = false, comment = "评论榜")
public Map<String, Number> commentRank(){
Flipper flipper = new Flipper().limit(8);
source.querySheet(Comment.class, flipper, FilterNode.create("userId", FilterExpress.IN));
Map<String, Number> numberMap = source.getNumberMap(Comment.class, FilterFuncColumn.create(FilterFunc.DISTINCTCOUNT, "userId"));
return numberMap;
}
}

View File

@@ -0,0 +1,174 @@
package com.lxyer.bbs.service;
import com.lxyer.bbs.base.BaseService;
import com.lxyer.bbs.base.LxyKit;
import com.lxyer.bbs.base.RetCodes;
import com.lxyer.bbs.base.bean.ContentInfo;
import com.lxyer.bbs.base.entity.ActLog;
import com.lxyer.bbs.base.entity.Content;
import com.lxyer.bbs.base.entity.User;
import org.redkale.net.http.RestMapping;
import org.redkale.net.http.RestParam;
import org.redkale.net.http.RestService;
import org.redkale.net.http.RestSessionid;
import org.redkale.service.RetResult;
import org.redkale.source.*;
import org.redkale.util.SelectColumn;
import org.redkale.util.Sheet;
import javax.annotation.Resource;
import java.util.*;
/**
* Created by Lxy at 2017/11/26 9:33.
*/
@RestService(automapping = true, comment = "内容管理")
public class ContentService extends BaseService{
/*@Resource(name = "contentInfos")
protected CacheSource<ContentInfo> infoCache;*/
@Resource
protected UserService userService;
@RestMapping(name = "query", auth = false, comment = "内容列表")
public Sheet<ContentInfo> contentQuery(Flipper flipper, String actived){
FilterNode filterNode = FilterNode.create("status", FilterExpress.NOTEQUAL, -1);
switch (actived){
case "top": filterNode.and("top", 1);break;
case "untop": filterNode.and("top", 0);break;
case "unsolved": filterNode.and("solved", 0);break;
case "solved": filterNode.and("solved", 1);break;
case "wonderful": filterNode.and("wonderful", 1);break;
}
Sheet<Content> contents = source.querySheet(Content.class, flipper, filterNode);
int[] userids = contents.stream().mapToInt(x -> x.getUserId()).distinct().toArray();
Sheet<ContentInfo> infos = new Sheet<>();
List<ContentInfo> list = new ArrayList<>();
List<User> users = source.queryList(User.class, SelectColumn.createIncludes("userId","avatar", "nickname"), FilterNode.create("userId", FilterExpress.IN, userids));
contents.forEach(x->{
ContentInfo contentInfo = x.createContentInfo();
User user = users.stream().filter(k -> k.getUserId() == x.getUserId()).findFirst().orElse(new User());
contentInfo.setAvatar(user.getAvatar());
contentInfo.setNickname(user.getNickname());
list.add(contentInfo);
});
infos.setRows(list);
infos.setTotal(contents.getTotal());
return infos;
}
public Sheet<ContentInfo> queryByBean(Flipper flipper, FilterBean bean){
Sheet<Content> contents = source.querySheet(Content.class, flipper, bean);
Sheet<ContentInfo> infos = new Sheet<>();
List<ContentInfo> list = new ArrayList<>();
contents.forEach(x->{
list.add(x.createContentInfo());
});
infos.setRows(list);
infos.setTotal(contents.getTotal());
return infos;
}
@RestMapping(name = "save", auth = true, comment = "内容保存")
public RetResult contentSave(@RestParam(name = "bean")Content content, @RestSessionid String sessionid){
if (content.getContentId() < 1){
int maxId = source.getNumberResult(Content.class, FilterFunc.MAX, 10_0000, "contentId").intValue();
int userId = userService.currentUserId(sessionid);
content.setContentId(maxId+1);
content.setCreateTime(System.currentTimeMillis());
content.setUserId(userId);
source.insert(content);
}else {
source.updateColumn(content, SelectColumn.createIncludes("title", "digest", "content","cate"));
}
return RetResult.success();
}
@RestMapping(name = "info", auth = false, comment = "内容详情")
public ContentInfo contentInfo(@RestSessionid String sessionid, int contentid){
int userId = userService.currentUserId(sessionid);
Content content = source.find(Content.class, contentid);
if (content == null) return null;
ContentInfo contentInfo = content.createContentInfo();
User user = source.find(User.class, content.getUserId());
contentInfo.setAvatar(user.getAvatar());
contentInfo.setNickname(user.getNickname());
//收藏状态
if (userId > 0){
ActLog actLog = source.find(ActLog.class, FilterNode.create("cate", 2).and("tid", contentid).and("status", 1));
if (actLog != null) contentInfo.setHadCollect(1);
}
return contentInfo;
}
public void incrViewNum(int contentId){
source.updateColumn(Content.class, contentId, ColumnValue.inc("viewNum", 1));
}
@RestMapping(name = "collect", comment = "内容收藏")
public RetResult collect(@RestSessionid String sessionid, int contentId, int ok){
int userId = userService.currentUserId(sessionid);//不会为空
ActLog actLog = source.find(ActLog.class, FilterNode.create("userId", userId).and("tid", contentId).and("cate", 2));
if (actLog == null && ok == 1){
actLog = new ActLog().cate(2).tid(contentId).userId(userId);
actLog.setCreateTime(System.currentTimeMillis());
source.insert(actLog);
}else if (actLog != null && actLog.getStatus() != ok){
actLog.setStatus(ok);
actLog.setCreateTime(System.currentTimeMillis());
source.update(actLog);
}else {
return RetCodes.retResult(-1, ok == 1 ? "已收藏" : "已取消收藏");
}
return RetResult.success();
}
@RestMapping(name = "collectquery", comment = "收藏列表")
public Sheet<ContentInfo> collectQuery(@RestSessionid String sessionid){
int userId = userService.currentUserId(sessionid);
Flipper flipper = new Flipper().sort("createTime DESC");
FilterNode filterNode = FilterNode.create("cate", 2).and("status", 1);
Sheet<ActLog> actLogs = source.querySheet(ActLog.class, SelectColumn.createIncludes("tid", "createTime"), flipper, filterNode);
int[] contentids = actLogs.stream().mapToInt(x -> x.getTid()).toArray();
Sheet<Content> contents = source.querySheet(Content.class, SelectColumn.createIncludes("contentId", "title"), flipper.sort(null), FilterNode.create("contentId", FilterExpress.IN, contentids));
Sheet<ContentInfo> infos = new Sheet<>();
ArrayList<ContentInfo> list = new ArrayList<>();
actLogs.forEach(x->{
Content content = contents.stream().filter(k -> k.getContentId() == x.getTid()).findFirst().orElse(null);
if (content != null){
ContentInfo info = content.createContentInfo();
info.setCreateTime(LxyKit.dateFmt(x.getCreateTime()));
list.add(info);
}
});
infos.setRows(list);
infos.setTotal(actLogs.getTotal());
return infos;
}
}

View File

@@ -0,0 +1,161 @@
package com.lxyer.bbs.service;
import com.lxyer.bbs.base.BaseService;
import com.lxyer.bbs.base.LxyKit;
import com.lxyer.bbs.base.RetCodes;
import com.lxyer.bbs.base.bean.LoginBean;
import com.lxyer.bbs.base.bean.UserBean;
import com.lxyer.bbs.base.bean.UserInfo;
import com.lxyer.bbs.base.entity.User;
import org.redkale.net.http.RestMapping;
import org.redkale.net.http.RestParam;
import org.redkale.net.http.RestService;
import org.redkale.net.http.RestSessionid;
import org.redkale.service.RetResult;
import org.redkale.source.CacheSource;
import org.redkale.source.FilterFunc;
import org.redkale.source.FilterNode;
import org.redkale.source.Flipper;
import org.redkale.util.SelectColumn;
import org.redkale.util.Sheet;
import javax.annotation.Resource;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.Objects;
import java.util.Random;
import static com.lxyer.bbs.base.RetCodes.*;
/**
* Created by Lxy at 2017/10/3 14:02.
*/
@RestService(automapping = true, comment = "用户服务")
public class UserService extends BaseService {
@Resource(name = "usersessions")
protected CacheSource<Integer> sessions;
@Resource
protected CacheSource<UserInfo> userInfos;
@RestMapping(auth = false, comment = "登录校验")
public RetResult<UserInfo> login(@RestParam(name = "bean") LoginBean loginBean){
if (loginBean == null || loginBean.emptyUsername()) return RetCodes.retResult(RetCodes.RET_PARAMS_ILLEGAL, "参数错误");
final RetResult retResult = new RetResult();
User user = source.find(User.class, "username", loginBean.getUsername());
if (user == null || !Objects.equals(user.getPassword(), loginBean.getPassword())){
//log(null, 0, "用户或密码错误");
return RetCodes.retResult(RetCodes.RET_USER_ACCOUNT_PWD_ILLEGAL, "用户或密码错误");
}
//log(user, 0, "用户登录成功.");
UserInfo userInfo = user.createUserInfo();
this.sessions.set(sessionExpireSeconds, loginBean.getSessionid(), userInfo.getUserId());
retResult.setRetcode(0);
retResult.setResult(userInfo);
retResult.setRetinfo("登录成功.");
return retResult;
}
public UserInfo current(String sessionid){
Integer userid = sessions.getAndRefresh(sessionid, sessionExpireSeconds);
return userid == null ? null : findUserInfo(userid);
}
public int currentUserId(String sessionid){
Integer userid = sessions.getAndRefresh(sessionid, sessionExpireSeconds);
return userid == null ? 0 : userid;
}
@RestMapping(name = "info", comment = "用户信息")
public UserInfo findUserInfo(int userid) {
User user = source.find(User.class, userid);
return user == null ? null : user.createUserInfo();
}
@RestMapping(name = "logout", auth = false, comment = "退出登录")
public RetResult logout(@RestSessionid String sessionid){
sessions.remove(sessionid);
return RetResult.success();
//return new HttpResult().header("Location", "/").status(302);
}
@RestMapping(name = "query", auth = false, comment = "用户数据查询")
public Sheet<User> queryUser(Flipper flipper, @RestParam(name = "bean", comment = "过滤条件") final UserBean userBean){
Sheet<User> users = source.querySheet(User.class, flipper, userBean);
return users;
}
@RestMapping(name = "changepwd", comment = "修改密码")
public RetResult updatePwd(@RestSessionid String sessionid, String pass, String nowpass){
UserInfo userInfo = current(sessionid);//不会为空
if (!Objects.equals(userInfo.getPassword(), User.md5IfNeed(nowpass)))
return RetCodes.retResult(RET_USER_ACCOUNT_PWD_ILLEGAL, "密码错误");
if (pass == null || pass.length() < 6 || Objects.equals(pass, nowpass))
return RetCodes.retResult(RET_USER_PASSWORD_ILLEGAL, "密码设置无效");
source.updateColumn(User.class, userInfo.getUserId(), "password", User.md5IfNeed(pass));
return RetResult.success();
}
@RestMapping(name = "register", auth = false, comment = "用户注册")
public RetResult register(@RestParam(name = "bean") User user){
/*用户名、密码、邮箱*/
if (user.getEmail() == null) return RetCodes.retResult(RET_USER_EMAIL_ILLEGAL, "邮件地址无效");
if (user.getPassword() == null || user.getPassword().length() < 6) return RetCodes.retResult(RET_USER_PASSWORD_ILLEGAL, "密码设置无效");
User _user = source.find(User.class, FilterNode.create("email", user.getEmail()));
if (_user != null) return RetCodes.retResult(RET_USER_USERNAME_EXISTS, "用户名已存在");
user.setCreateTime(System.currentTimeMillis());
user.setPassword(user.passwordForMd5());
user.setStatus(1);//待激活
user.setUsername(user.getEmail());
user.setAvatar("/res/images/avatar/"+ new Random().nextInt(21) +".jpg");//默认头像
int maxId = source.getNumberResult(User.class, FilterFunc.MAX, 10_0000, "userId").intValue();
if (maxId < 10_0000) maxId = 10_0000;
user.setUserId(maxId+1);
source.insert(user);
//记录日志
return RetResult.success();
}
@RestMapping(name = "update", comment = "用户信息修改")
public RetResult userUpdate(@RestSessionid String sessionid, @RestParam(name = "bean") User user, String[] columns){
source.updateColumn(user
,FilterNode.create("userId", currentUserId(sessionid))
,SelectColumn.createIncludes(columns)
);
return RetResult.success();
}
//最新加入
public Sheet<UserInfo> lastReg(){
Sheet<User> users = source.querySheet(User.class
, SelectColumn.createIncludes("userId", "nickname", "avatar", "createTime")
, new Flipper().sort("createTime DESC").limit(8)
, FilterNode.create("status", 1));
Sheet<UserInfo> infos = new Sheet<>();
ArrayList<UserInfo> list = new ArrayList<>();
users.forEach(x->{
UserInfo info = x.createUserInfo();
info.setTime(LxyKit.dateFmt(x.getCreateTime()));
list.add(info);
});
infos.setRows(list);
infos.setTotal(users.getTotal());
return infos;
}
}

View File

@@ -0,0 +1,199 @@
package com.lxyer.bbs.servlet;
import com.jfinal.kit.Kv;
import com.lxyer.bbs.base.BaseServlet;
import com.lxyer.bbs.base.bean.*;
import com.lxyer.bbs.base.entity.User;
import com.lxyer.bbs.service.CommentService;
import com.lxyer.bbs.service.ContentService;
import org.redkale.net.http.*;
import org.redkale.source.Flipper;
import org.redkale.util.Sheet;
import javax.annotation.Resource;
import java.util.concurrent.CompletableFuture;
import java.util.function.Supplier;
/**
* Created by Lxy at 2017/11/25 12:31.
*/
@WebServlet({"/"
,"/user", "/user/*"
,"/jie" ,"/jie/*"})
public class IndexServlet extends BaseServlet {
@Resource
private ContentService contentService;
@Resource
private CommentService commentService;
@HttpMapping(url = "/", auth = false, comment = "社区首页")
public void abc(HttpRequest request, HttpResponse response){
//问答列表
Flipper flipper = new Flipper().limit(30).sort("top DESC,createTime DESC");
Sheet<ContentInfo> contents = contentService.contentQuery(flipper, "untop");
//置顶贴
Sheet<ContentInfo> top = contentService.contentQuery(flipper, "top");
//热帖
Flipper flipper2 = new Flipper().limit(8).sort("viewNum DESC");
Sheet<ContentInfo> hotView = contentService.contentQuery(flipper2, "");
//热议
Flipper flipper3 = new Flipper().limit(8).sort("replyNum DESC");
Sheet<ContentInfo> hotReply = contentService.contentQuery(flipper3, "");
//最新加入
Sheet<UserInfo> lastReg = userService.lastReg();
Kv kv = Kv.by("top", top).set("contents", contents).set("hotView", hotView).set("hotReply", hotReply).set("lastReg", lastReg);
finish("index.html", kv);
}
//====================================用户相关====================================
@HttpMapping(url = "/user/login", auth = false, comment = "前往登录页")
public void login(HttpRequest request, HttpResponse response){
finish("/user/login.html");
}
@HttpMapping(url = "/user/reg", auth = false, comment = "前往登录页")
public void reg(HttpRequest request, HttpResponse response){
/*List<Kv> list = new ArrayList<>();
list.add(Kv.by("k", 1).set("a", "1+1=?").set("q", 2));
list.add(Kv.by("k", 2).set("a", "1*1=?").set("q", 1));
list.add(Kv.by("k", 3).set("a", "3+2-5=?").set("q", 0));
list.add(Kv.by("k", 4).set("a", "Math.abs(-3)=?").set("q", 3));*/
finish("/user/login.html");
}
@HttpMapping(url = "/user/set", auth = true, comment = "用户设置")
public void set(HttpRequest request, HttpResponse response){
finish("/user/set.html");
}
@HttpMapping(url = "/user", auth = false, comment = "用户首页")
public void user(HttpRequest request, HttpResponse response){
String para = getPara();
//-------个人中心---------
if ("user".equals(para) || "".equals(para)){
UserInfo user = request.currentUser();
if (user == null){
finish("/user/login.html");
return;
}
//创建的帖子
Flipper flipper = new Flipper().limit(8).sort("createTime DESC");
ContentBean bean = new ContentBean();
bean.setUserId(user.getUserId());
Sheet<ContentInfo> contents = contentService.queryByBean(flipper, bean);
//收藏的帖子
Sheet<ContentInfo> collects = contentService.collectQuery(sessionid);
Kv kv = Kv.by("contents", contents).set("collects", collects);
finish("/user/index.html", kv);
return;
}
//-------用户主页------
int userId = 0;
if ("nick".equals(para)){//通过@ 点击跳转
String nickname = request.getParameter("nickname");
UserBean userBean = new UserBean();
userBean.setNickname(nickname);
Sheet<User> users = userService.queryUser(new Flipper().limit(1), userBean);
if (users.getTotal() > 0){
userId = users.stream().findFirst().orElse(null).getUserId();
}
}else {//直接访问
userId = getParaToInt(0);
}
//用户信息
UserInfo user = userService.findUserInfo(userId);
//帖子
Flipper flipper = new Flipper().limit(8).sort("createTime DESC");
ContentBean bean = new ContentBean();
bean.setUserId(userId);
Sheet<ContentInfo> contents = contentService.queryByBean(flipper, bean);
//回复
Sheet<CommentInfo> comments = commentService.queryByUserid(userId);
Kv kv = Kv.by("contents", contents).set("user", user).set("comments", comments);
finish("/user/home.html", kv);
}
//====================================帖子相关====================================
@HttpMapping(url = "/jie", auth = false, comment = "问答列表")
public void jie(HttpRequest request, HttpResponse response){
String actived = getPara(0, "all");
int curr = request.getIntParameter("curr", 1);
//分页帖子列表
Flipper flipper = new Flipper().offset((curr-1)*15).limit(15).sort("top DESC,createTime DESC");
Sheet<ContentInfo> contents = contentService.contentQuery(flipper, actived);
Kv kv = Kv.by("contents", contents).set("url", request.getRequestURI())
.set("actived", actived).set("curr", curr);
finish("/jie/index.html", kv);
}
@HttpMapping(url = "/jie/add", comment = "发表/编辑问答")
@HttpParam(name = "#", type = int.class, comment = "内容ID")
public void add(HttpRequest request, HttpResponse response){
int contentid = getParaToInt(0);
ContentInfo contentInfo = null;
if (contentid > 0){
contentInfo = contentService.contentInfo(sessionid, contentid);
}
finish("/jie/add.html", Kv.by("bean", contentInfo));
}
@HttpMapping(url = "/jie/detail", auth = false, comment = "问答详情")
public void detail(HttpRequest request, HttpResponse response){
int contentid = getParaToInt(0);
ContentInfo content = contentService.contentInfo(sessionid, contentid);
Sheet<CommentInfo> comments = commentService.commentQuery(request.getSessionid(false) ,contentid, new Flipper().limit(30));
//热帖
Flipper flipper2 = new Flipper().limit(8).sort("viewNum DESC");
Sheet<ContentInfo> hotView = contentService.contentQuery(flipper2, "");
//热议
Flipper flipper3 = new Flipper().limit(8).sort("replyNum DESC");
Sheet<ContentInfo> hotReply = contentService.contentQuery(flipper3, "");
//更新
CompletableFuture.supplyAsync(new Supplier<String>() {
@Override
public String get() {
contentService.incrViewNum(contentid);
return "";
}
});
Kv kv = Kv.by("bean", content).set("comments", comments).set("hotView", hotView).set("hotReply", hotReply);
finish("/jie/detail.html", kv);
}
//====================================帖子相关====================================
}

View File

@@ -0,0 +1,13 @@
package com.lxyer.bbs.servlet;
import com.lxyer.bbs.base.BaseServlet;
import org.redkale.net.http.WebServlet;
/**
* Created by Lxy at 2017/11/25 21:15.
*/
public class UserServlet extends BaseServlet {
}