From ad73300a2544e16ea589d2eafcded2616ec51181 Mon Sep 17 00:00:00 2001 From: lxyer <237809796@qq.com> Date: Sat, 30 Jun 2018 21:29:15 +0800 Subject: [PATCH] =?UTF-8?q?=E9=87=8D=E8=A6=81=E6=9B=B4=E6=96=B0=EF=BC=9A?= =?UTF-8?q?=201=E3=80=81=E4=BF=AE=E6=94=B9servlet=E5=B1=82=E4=B8=ADBaseSer?= =?UTF-8?q?vlet=E4=B8=AD=E5=85=B1=E4=BA=ABrequest=E7=9A=84=E9=87=8D?= =?UTF-8?q?=E5=A4=A7bug=202=E3=80=81=E5=B0=86servlet=E4=B8=AD=E9=A1=B5?= =?UTF-8?q?=E9=9D=A2=E7=BB=9F=E4=B8=80=E4=BD=BF=E7=94=A8HttpScope=E8=BF=9B?= =?UTF-8?q?=E8=A1=8C=E6=B8=B2=E6=9F=93?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- conf/application.xml | 6 + libs/redbbs.jar | Bin 64580 -> 73390 bytes src/com/lxyer/bbs/base/BaseServlet.java | 127 ++++++------------ src/com/lxyer/bbs/base/EnjoyRender.java | 11 +- src/com/lxyer/bbs/base/TaskQueue.java | 18 +-- src/com/lxyer/bbs/base/user/UserService.java | 10 +- src/com/lxyer/bbs/content/ContentService.java | 9 +- src/com/lxyer/bbs/servlet/ContentServlet.java | 36 ++--- src/com/lxyer/bbs/servlet/IndexServlet.java | 24 ++-- src/com/lxyer/bbs/servlet/UserServlet.java | 40 +++--- 10 files changed, 120 insertions(+), 161 deletions(-) diff --git a/conf/application.xml b/conf/application.xml index f812315..52fabe7 100644 --- a/conf/application.xml +++ b/conf/application.xml @@ -11,6 +11,7 @@ + @@ -24,6 +25,11 @@ + + + + + diff --git a/libs/redbbs.jar b/libs/redbbs.jar index f9e7708e32d00624eb95ef539487e4f769133696..9cf283972d5fef7af67aa41b60cb3a47ed7e05e4 100644 GIT binary patch delta 34527 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 delta 25766 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 diff --git a/src/com/lxyer/bbs/base/BaseServlet.java b/src/com/lxyer/bbs/base/BaseServlet.java index 2c2ed75..09913f8 100644 --- a/src/com/lxyer/bbs/base/BaseServlet.java +++ b/src/com/lxyer/bbs/base/BaseServlet.java @@ -1,18 +1,12 @@ package com.lxyer.bbs.base; import com.jfinal.kit.Kv; -import com.jfinal.template.Engine; -import com.jfinal.template.Template; -import com.lxyer.bbs.base.kit.EJ; import com.lxyer.bbs.base.kit.RetCodes; import com.lxyer.bbs.base.user.UserInfo; import com.lxyer.bbs.base.user.UserService; import com.lxyer.bbs.comment.CommentService; import com.lxyer.bbs.content.ContentService; -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.net.http.*; import org.redkale.source.FilterExpress; import org.redkale.source.FilterNode; import org.redkale.util.AnyValue; @@ -21,6 +15,7 @@ import javax.annotation.Resource; import java.io.File; import java.io.IOException; import java.util.Map; +import java.util.concurrent.CompletableFuture; import static com.lxyer.bbs.base.kit.RetCodes.RET_USER_UNLOGIN; @@ -28,26 +23,15 @@ import static com.lxyer.bbs.base.kit.RetCodes.RET_USER_UNLOGIN; * Created by Lxy at 2017/10/3 13:39. */ public class BaseServlet extends HttpServlet { - private HttpRequest request; - private HttpResponse response; - private static final Kv _kv = Kv.create(); - private static Engine engine; - protected String sessionid; - protected int currentid;//登录人id protected static final boolean winos = System.getProperty("os.name").contains("Window"); @Resource(name = "SERVER_ROOT") protected File webroot; - /*@Resource - protected EnjoyService enjoyService;*/ @Resource protected UserService userService; - /*@Resource(name = "redis") - protected RedisCacheSource cache;*/ - @Resource protected ContentService contentService; @@ -57,28 +41,20 @@ public class BaseServlet extends HttpServlet { @Resource protected TaskQueue logQueue; - @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); + String sessionid = request.getSessionid(true); + int currentid = 0; if (sessionid != null) { request.setCurrentUser(userService.current(sessionid)); currentid = userService.currentUserId(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); @@ -86,34 +62,30 @@ public class BaseServlet extends HttpServlet { return; } if (uri.endsWith(".html")){ - Kv kv = Kv.by("resSys", "resSys"); - finish(uri, kv); + response.finish(HttpScope.refer(uri)); return; } - Kv visLog = new Kv();//ip、time、userid、uri、para - visLog.set("ip", request.getRemoteAddr()); - request.getHost(); - visLog.set("time", System.currentTimeMillis()); - visLog.set("userid", currentid); - visLog.set("uri", request.getRequestURI()); + //异步记录访问日志 + final int userid = currentid; + CompletableFuture.runAsync(()->{ + Kv visLog = new Kv();//ip、time、userid、uri、para + visLog.set("ip", request.getRemoteAddr()); + visLog.set("time", System.currentTimeMillis()); + visLog.set("userid", userid); + visLog.set("uri", request.getRequestURI()); - Kv para = Kv.create(); - for (String key : request.getParameterNames()){ - para.set(key, request.getParameter(key)); - } - visLog.set("para", para); - try { - logQueue.put(visLog); - } catch (InterruptedException e) { - e.printStackTrace(); - } - - - /*if ("/".equals(uri)){ - finish("/front/index.html", Kv.by("","")); - return; - }*/ + Kv para = Kv.create(); + for (String key : request.getParameterNames()){ + para.set(key, request.getParameter(key)); + } + visLog.set("para", para); + try { + logQueue.put(visLog); + } catch (InterruptedException e) { + e.printStackTrace(); + } + }); response.nextEvent(); } @@ -124,49 +96,26 @@ public class BaseServlet extends HttpServlet { 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(){ + public int getLimit(HttpRequest request){ return request.getIntParameter("limit", 1); } - public int getOffset(){ + public int getOffset(HttpRequest request){ 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(){ + public String getPara(HttpRequest request){ 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){ + public String getPara(HttpRequest request,int index){ String requestURI = request.getRequestURI(); String subStr = requestURI.substring(requestURI.lastIndexOf("/") + 1); @@ -177,17 +126,17 @@ public class BaseServlet extends HttpServlet { return paraArr.length < index+1 ? null : paraArr[index]; } } - public T getPara(int index, T defaultValue){ - T para = (T)getPara(index); + public T getPara(HttpRequest request, int index, T defaultValue){ + T para = (T)getPara(request,index); return para == null || "".equals(para) ? defaultValue : para; } - public int getParaToInt(int index, int defaultValue){ - String para = getPara(index); + public int getParaToInt(HttpRequest request,int index, int defaultValue){ + String para = getPara(request,index); return para == null || "".equals(para) ? defaultValue : Integer.parseInt(para); } - public int getParaToInt(int index){ + public int getParaToInt(HttpRequest request,int index){ int n = 0; - String para = getPara(index); + String para = getPara(request,index); if (para == null || "".equals(para)) n = 0; try { n = Integer.parseInt(para); @@ -198,11 +147,11 @@ public class BaseServlet extends HttpServlet { } //设置私密帖子过滤 - protected FilterNode setPrivate(FilterNode node){ + protected FilterNode setPrivate(HttpRequest request,FilterNode node){ UserInfo userInfo = request.currentUser(); if (userInfo == null){ node.and("status", FilterExpress.NOTEQUAL, 30); - }else if (!userService.isAdmin(currentid)){ + }else if (!userService.isAdmin(userInfo.getUserid())){ //select * from content c where c.status != -1 and (c.status!=30 or (c.status=30 and c.userid=100001)) node.and(FilterNode.create("status", FilterExpress.NOTEQUAL, 30).or(FilterNode.create("status", 30).and("userid", userInfo.getUserid()))); } diff --git a/src/com/lxyer/bbs/base/EnjoyRender.java b/src/com/lxyer/bbs/base/EnjoyRender.java index 59a5f45..9eb8eca 100644 --- a/src/com/lxyer/bbs/base/EnjoyRender.java +++ b/src/com/lxyer/bbs/base/EnjoyRender.java @@ -1,14 +1,17 @@ package com.lxyer.bbs.base; +import com.jfinal.kit.Kv; import com.jfinal.template.Engine; import com.jfinal.template.Template; import com.lxyer.bbs.base.kit.EJ; +import com.lxyer.bbs.base.user.UserInfo; import org.redkale.convert.Convert; import org.redkale.net.http.*; import org.redkale.util.AnyValue; import javax.annotation.Resource; import java.io.File; +import java.util.Map; /** * Created by JUECHENG at 2018/1/30 0:18. @@ -29,8 +32,14 @@ public class EnjoyRender implements HttpRender { @Override public void renderTo(HttpRequest request, HttpResponse response, Convert convert, HttpScope scope) { + UserInfo mine = request.currentUser();//当前登录人 + Template template = engine.getTemplate(scope.getReferid()); - String str = template.renderToString(scope.getAttributes()); + Map attr = scope.getAttributes(); + if (attr == null) attr = Kv.create(); + attr.put("mine", mine); + + String str = template.renderToString(attr); response.setContentType("text/html; charset=UTF-8"); response.finish(str); } diff --git a/src/com/lxyer/bbs/base/TaskQueue.java b/src/com/lxyer/bbs/base/TaskQueue.java index 08e78ea..98dcafa 100644 --- a/src/com/lxyer/bbs/base/TaskQueue.java +++ b/src/com/lxyer/bbs/base/TaskQueue.java @@ -17,11 +17,13 @@ public class TaskQueue extends BaseService implements Runnable @Resource(name = "property.mongo.host") private String mongoHost; + @Resource(name = "property.mongo.database") + private String mongoDatabase; protected static LinkedBlockingQueue queue = new LinkedBlockingQueue(); private static MongoClient mongoClient; - private static MongoDatabase redbbs; + private static MongoDatabase database; private static MongoCollection visLog; public TaskQueue() { @@ -31,8 +33,8 @@ public class TaskQueue extends BaseService implements Runnable @Override public void init(AnyValue config) { mongoClient = new MongoClient(mongoHost, 27017); - redbbs = mongoClient.getDatabase(winos ? "redbbs_dev": "redbbs"); - visLog = redbbs.getCollection("vis_log"); + database = mongoClient.getDatabase(winos ? mongoDatabase + "_dev": mongoDatabase); + visLog = database.getCollection("vis_log"); } public T take() throws InterruptedException { @@ -49,7 +51,7 @@ public class TaskQueue extends BaseService implements Runnable while (true){ Map take = (Map) take(); - take.put("ftime", String.format("%1$tY%1$tm%1$td%1$tH%1$tM", take.get("time"))); + take.put("ftime", String.format("%1$tY%1$tm%1$td%1$tH%1$tM%1$tS", take.get("time"))); visLog.insertOne(new Document(take)); //在这里处理日志数据[访问量] @@ -58,12 +60,4 @@ public class TaskQueue extends BaseService implements Runnable e.printStackTrace(); } } - - /*public static void main(String[] args) { - //测试mongodb 连通性 - FindIterable documents = visLog.find().limit(10); - documents.forEach((Block) x->{ - System.out.println(x); - }); - }*/ } diff --git a/src/com/lxyer/bbs/base/user/UserService.java b/src/com/lxyer/bbs/base/user/UserService.java index b9d9766..ff151a6 100644 --- a/src/com/lxyer/bbs/base/user/UserService.java +++ b/src/com/lxyer/bbs/base/user/UserService.java @@ -48,6 +48,8 @@ public class UserService extends BaseService { } public UserInfo current(String sessionid){ + if (sessionid == null) return null; + Object userid = sessions.getAndRefresh(sessionid, sessionExpireSeconds); sessions.getAndRefresh(sessionid, sessionExpireSeconds); return userid == null ? null : findUserInfo((Integer) userid); @@ -151,14 +153,6 @@ public class UserService extends BaseService { return infos; } - /*@RestMapping(name = "stat", auth = false, comment = "用户数据统计") - public Map userStat(){ - - Number count = source.getNumberResult(User.class, FilterFunc.COUNT, "userId", FilterNode.create("status", FilterExpress.NOTEQUAL, -1)); - - return Kv.by("count", count); - }*/ - @RestMapping(name = "usercount", auth = false, comment = "用户数据统计") public Number userCount() { return source.getNumberResult(UserRecord.class, FilterFunc.COUNT, "userid", FilterNode.create("status", FilterExpress.NOTEQUAL, -10)); diff --git a/src/com/lxyer/bbs/content/ContentService.java b/src/com/lxyer/bbs/content/ContentService.java index 697f6e6..02268c4 100644 --- a/src/com/lxyer/bbs/content/ContentService.java +++ b/src/com/lxyer/bbs/content/ContentService.java @@ -41,7 +41,10 @@ public class ContentService extends BaseService implements UIService contentQuery(Flipper flipper, String actived, int currentid){ + public Sheet contentQuery(Flipper flipper, String actived, String sessionid){ + UserInfo current = userService.current(sessionid); + int currentid = current == null ? 0 : current.getUserid(); + FilterNode filterNode = FilterNode.create("status", FilterExpress.NOTEQUAL, -1); switch (actived){ case "top": filterNode.and("top", FilterExpress.GREATERTHANOREQUALTO, 20);break; @@ -157,7 +160,7 @@ public class ContentService extends BaseService implements UIService hotReply = contentService.contentQuery(flipper3, "", 0); + Sheet hotReply = contentService.contentQuery(flipper3, "", sessionid); //最新加入 Sheet lastReg = userService.lastReg(); diff --git a/src/com/lxyer/bbs/servlet/ContentServlet.java b/src/com/lxyer/bbs/servlet/ContentServlet.java index 353ce90..307986d 100644 --- a/src/com/lxyer/bbs/servlet/ContentServlet.java +++ b/src/com/lxyer/bbs/servlet/ContentServlet.java @@ -24,37 +24,40 @@ import static org.redkale.source.FilterExpress.NOTEQUAL; public class ContentServlet extends BaseServlet { @HttpMapping(url = "/jie", auth = false, comment = "问答列表") public void jie(HttpRequest request, HttpResponse response){ - String actived = getPara(0, "all"); + String actived = getPara(request, 0, "all"); int curr = request.getIntParameter("curr", 1); //分页帖子列表 Flipper flipper = new Flipper().offset((curr-1)*15).limit(15).sort("top DESC,createtime DESC"); - Sheet contents = contentService.contentQuery(flipper, actived, currentid); + Sheet contents = contentService.contentQuery(flipper, actived, request.getSessionid(false)); Kv kv = Kv.by("contents", contents).set("url", request.getRequestURI()) .set("actived", actived).set("curr", curr); - finish("/jie/index.html", kv); + + response.finish(HttpScope.refer("/jie/index.html").attr(kv)); } @HttpMapping(url = "/jie/add", comment = "发表/编辑问答") @HttpParam(name = "#", type = int.class, comment = "内容ID") public void add(HttpRequest request, HttpResponse response){ - int contentid = getParaToInt(0); + int contentid = getParaToInt(request, 0); ContentInfo contentInfo = null; if (contentid > 0){ - contentInfo = contentService.contentInfo(sessionid, contentid); + contentInfo = contentService.contentInfo(request.getSessionid(false), contentid); } - finish("/jie/add.html", Kv.by("bean", contentInfo)); + Kv kv = Kv.by("bean", contentInfo); + response.finish(HttpScope.refer("/jie/add.html").attr(kv)); } @HttpMapping(url = "/jie/detail", auth = false, comment = "问答详情") public void detail(HttpRequest request, HttpResponse response){ - int contentid = getParaToInt(0); + int contentid = getParaToInt(request,0); + String sessionid = request.getSessionid(false); ContentInfo content = contentService.contentInfo(sessionid, contentid); - Sheet comments = commentService.commentQuery(request.getSessionid(false) ,contentid, new Flipper().limit(30)); + Sheet comments = commentService.commentQuery(sessionid,contentid, new Flipper().limit(30)); //热帖 //Flipper flipper2 = new Flipper().limit(8).sort("viewNum DESC"); @@ -62,7 +65,7 @@ public class ContentServlet extends BaseServlet { //热议 Flipper flipper3 = new Flipper().limit(8).sort("replynum DESC"); - Sheet hotReply = contentService.contentQuery(flipper3, "", currentid); + Sheet hotReply = contentService.contentQuery(flipper3, "", sessionid); //更新 CompletableFuture.supplyAsync(new Supplier() { @@ -76,12 +79,14 @@ public class ContentServlet extends BaseServlet { }); Kv kv = Kv.by("bean", content).set("comments", comments)/*.set("hotView", hotView)*/.set("hotReply", hotReply); - finish("/jie/detail.html", kv); + response.finish(HttpScope.refer("/jie/detail.html").attr(kv)); } @HttpMapping(url = "/column", auth = false, comment = "帖子栏目") public void column(HttpRequest request, HttpResponse response){ - String para = getPara();//空,qz,fx,jy,gg,dt, + String sessionid = request.getSessionid(false); + + String para = getPara(request);//空,qz,fx,jy,gg,dt, int solved = request.getIntParameter("solved", -1); int wonderful = request.getIntParameter("wonderful", -1); int curr = request.getIntParameter("curr", 1); @@ -94,15 +99,16 @@ public class ContentServlet extends BaseServlet { if (solved > 0) filterNode.and("solved", 20); if (wonderful > 0) filterNode.and("wonderful", 20); - Sheet contents = contentService.contentQuery(flipper, setPrivate(filterNode)); + Sheet contents = contentService.contentQuery(flipper, setPrivate(request,filterNode)); //热议 Flipper flipper3 = new Flipper().limit(8).sort("replynum DESC"); - Sheet hotReply = contentService.contentQuery(flipper3, "", currentid); + Sheet hotReply = contentService.contentQuery(flipper3, "", sessionid); Kv kv = Kv.by("contents", contents).set("hotReply", hotReply) - .set("solved", solved).set("wonderful", wonderful).set("column", para).set("curr", curr); - finish("/jie/index.html", kv); + .set("solved", solved).set("wonderful", wonderful) + .set("column", para).set("curr", curr); + response.finish(HttpScope.refer("/jie/index.html").attr(kv)); } } diff --git a/src/com/lxyer/bbs/servlet/IndexServlet.java b/src/com/lxyer/bbs/servlet/IndexServlet.java index c784d7a..cb7a9a3 100644 --- a/src/com/lxyer/bbs/servlet/IndexServlet.java +++ b/src/com/lxyer/bbs/servlet/IndexServlet.java @@ -5,10 +5,7 @@ import com.lxyer.bbs.base.BaseServlet; import com.lxyer.bbs.base.user.UserInfo; import com.lxyer.bbs.comment.CommentInfo; import com.lxyer.bbs.content.ContentInfo; -import org.redkale.net.http.HttpMapping; -import org.redkale.net.http.HttpRequest; -import org.redkale.net.http.HttpResponse; -import org.redkale.net.http.WebServlet; +import org.redkale.net.http.*; import org.redkale.source.FilterNode; import org.redkale.source.Flipper; import org.redkale.util.Sheet; @@ -27,14 +24,17 @@ public class IndexServlet extends BaseServlet { @HttpMapping(url = "/", auth = false, comment = "社区首页") public void abc(HttpRequest request, HttpResponse response){ + + String sessionid = request.getSessionid(false); + Flipper flipper = new Flipper().limit(15).sort("top DESC,createtime DESC"); //置顶贴 FilterNode topNode = FilterNode.create("status", NOTEQUAL, -10).and("top", GREATERTHANOREQUALTO, 20); - Sheet top = contentService.contentQuery(flipper, setPrivate(topNode)); + Sheet top = contentService.contentQuery(flipper, setPrivate(request, topNode)); //非置顶贴 FilterNode untopNode = FilterNode.create("status", NOTEQUAL, -10).and("top", 10); - Sheet contents = contentService.contentQuery(flipper, setPrivate(untopNode)); + Sheet contents = contentService.contentQuery(flipper, setPrivate(request, untopNode)); //热帖 /*Flipper flipper2 = new Flipper().limit(8).sort("viewNum DESC"); @@ -42,7 +42,7 @@ public class IndexServlet extends BaseServlet { //热议 Flipper flipper3 = new Flipper().limit(8).sort("replynum DESC"); - Sheet hotReply = contentService.contentQuery(flipper3, "", currentid); + Sheet hotReply = contentService.contentQuery(flipper3, "", sessionid); //最新加入 Sheet lastReg = userService.lastReg(); @@ -51,13 +51,13 @@ public class IndexServlet extends BaseServlet { Number userCount = userService.userCount(); Kv kv = Kv.by("top", top).set("contents", contents).set("hotReply", hotReply).set("lastReg", lastReg).set("userCount", userCount); - finish("index.html", kv); + response.finish(HttpScope.refer("index.html").attr(kv)); } @HttpMapping(url = "/site", auth = false, comment = "网站首页") public void site(HttpRequest request, HttpResponse response){ - finish("/site.html"); + response.finish(HttpScope.refer("/site.html")); } //====================================文章相关==================================== @@ -70,12 +70,14 @@ public class IndexServlet extends BaseServlet { //====================================项目相关==================================== @HttpMapping(url = "/project", auth = false, comment = "项目首页") public void project(HttpRequest request, HttpResponse response){ + String sessionid = request.getSessionid(false); int contentid = 22; + ContentInfo content = contentService.contentInfo(sessionid, contentid); - Sheet comments = commentService.commentQuery(request.getSessionid(false) ,contentid, new Flipper().limit(30)); + Sheet comments = commentService.commentQuery(sessionid,contentid, new Flipper().limit(30)); Kv kv = Kv.by("bean", content).set("comments", comments); - finish("project/index.html", kv); + response.finish(HttpScope.refer("/project/index.html").attr(kv)); } } diff --git a/src/com/lxyer/bbs/servlet/UserServlet.java b/src/com/lxyer/bbs/servlet/UserServlet.java index 64625ac..3ecf26e 100644 --- a/src/com/lxyer/bbs/servlet/UserServlet.java +++ b/src/com/lxyer/bbs/servlet/UserServlet.java @@ -2,16 +2,14 @@ package com.lxyer.bbs.servlet; import com.jfinal.kit.Kv; import com.lxyer.bbs.base.BaseServlet; -import com.lxyer.bbs.base.user.UserRecord; import com.lxyer.bbs.base.user.UserBean; import com.lxyer.bbs.base.user.UserInfo; +import com.lxyer.bbs.base.user.UserRecord; import com.lxyer.bbs.comment.CommentInfo; -import com.lxyer.bbs.content.ContentBean; import com.lxyer.bbs.content.ContentInfo; -import org.redkale.net.http.HttpMapping; -import org.redkale.net.http.HttpRequest; -import org.redkale.net.http.HttpResponse; -import org.redkale.net.http.WebServlet; +import org.redkale.net.http.*; +import org.redkale.source.FilterExpress; +import org.redkale.source.FilterNode; import org.redkale.source.Flipper; import org.redkale.util.Sheet; @@ -26,7 +24,7 @@ public class UserServlet extends BaseServlet { @HttpMapping(url = "/user/login", auth = false, comment = "前往登录页") public void login(HttpRequest request, HttpResponse response){ - finish("/user/login.html"); + response.finish(HttpScope.refer("/user/login.html")); } @HttpMapping(url = "/user/reg", auth = false, comment = "前往登录页") public void reg(HttpRequest request, HttpResponse response){ @@ -36,39 +34,38 @@ public class UserServlet extends BaseServlet { 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"); + response.finish(HttpScope.refer("/user/login.html")); } @HttpMapping(url = "/user/set", auth = true, comment = "用户设置") public void set(HttpRequest request, HttpResponse response){ - finish("/user/set.html"); + response.finish(HttpScope.refer("/user/set.html")); } @HttpMapping(url = "/user", auth = false, comment = "用户首页") public void user(HttpRequest request, HttpResponse response){ - String para = getPara(); + String para = getPara(request); //-------个人中心--------- if ("user".equals(para) || "".equals(para)){ UserInfo user = request.currentUser(); if (user == null){ - finish("/user/login.html"); + response.finish(HttpScope.refer("/user/login.html")); return; } //创建的帖子 Flipper flipper = new Flipper().limit(8).sort("createtime DESC"); - ContentBean bean = new ContentBean(); - bean.setUserid(user.getUserid()); - Sheet contents = contentService.queryByBean(flipper, bean); + + FilterNode node = FilterNode.create("userid", user.getUserid()).and("status", FilterExpress.NOTEQUAL, -10); + Sheet contents = contentService.contentQuery(flipper, setPrivate(request, node));//queryByBean(flipper, bean); //收藏的帖子 - Sheet collects = contentService.collectQuery(sessionid); + Sheet collects = contentService.collectQuery(request.getSessionid(false)); Kv kv = Kv.by("contents", contents).set("collects", collects); - finish("/user/index.html", kv); - return; + response.finish(HttpScope.refer("/user/index.html").attr(kv)); } //-------用户主页------ @@ -82,7 +79,7 @@ public class UserServlet extends BaseServlet { userid = users.stream().findFirst().orElse(null).getUserid(); } }else {//直接访问 - userid = getParaToInt(0); + userid = getParaToInt(request,0); } //用户信息 @@ -90,14 +87,13 @@ public class UserServlet extends BaseServlet { //帖子 Flipper flipper = new Flipper().limit(8).sort("createtime DESC"); - ContentBean bean = new ContentBean(); - bean.setUserid(userid); - Sheet contents = contentService.queryByBean(flipper, bean); + FilterNode node = FilterNode.create("userid", userid).and("status", FilterExpress.NOTEQUAL, -10); + Sheet contents = contentService.contentQuery(flipper, setPrivate(request,node)); //回复 Sheet comments = commentService.queryByUserid(userid); Kv kv = Kv.by("contents", contents).set("user", user).set("comments", comments); - finish("/user/home.html", kv); + response.finish(HttpScope.refer("/user/home.html").attr(kv)); } }