diff --git a/src/main/java/love/sola/netsupport/api/root/GetUser.java b/src/main/java/love/sola/netsupport/api/root/GetUser.java index c1868c9..524bee0 100644 --- a/src/main/java/love/sola/netsupport/api/root/GetUser.java +++ b/src/main/java/love/sola/netsupport/api/root/GetUser.java @@ -59,7 +59,7 @@ public class GetUser extends HttpServlet { return new Response(Response.ResponseCode.UNAUTHORIZED); } Operator op = (Operator) session.getAttribute(Attribute.OPERATOR); - if (op.getAccess() != Access.ROOT) { + if (op.getAccess() > Access.LEADER) { return new Response(Response.ResponseCode.PERMISSION_DENIED); } diff --git a/src/main/java/love/sola/netsupport/config/Settings.java b/src/main/java/love/sola/netsupport/config/Settings.java index 9c57687..caca077 100644 --- a/src/main/java/love/sola/netsupport/config/Settings.java +++ b/src/main/java/love/sola/netsupport/config/Settings.java @@ -32,6 +32,7 @@ public class Settings { public int Check_Spam_Interval; public int User_Session_Max_Inactive; + public int User_Wechat_Cache_Expire_Time; //No arg constructor for Yaml.loadAs public Settings() { I = this; } diff --git a/src/main/java/love/sola/netsupport/sql/TableTicket.java b/src/main/java/love/sola/netsupport/sql/TableTicket.java index 075f24c..428f700 100644 --- a/src/main/java/love/sola/netsupport/sql/TableTicket.java +++ b/src/main/java/love/sola/netsupport/sql/TableTicket.java @@ -72,6 +72,16 @@ public class TableTicket extends SQLCore { } } + @SuppressWarnings("unchecked") + public static List unsolved() { + try (Session s = SQLCore.sf.openSession()) { + return s.createCriteria(Ticket.class) + .add(Restrictions.ne(Ticket.PROPERTY_STATUS, Status.SOLVED)) + .createCriteria(Ticket.PROPERTY_USER) + .list(); + } + } + @SuppressWarnings("unchecked") public static List track(int tid) { try (Session s = SQLCore.sf.openSession()) { diff --git a/src/main/java/love/sola/netsupport/sql/TableUser.java b/src/main/java/love/sola/netsupport/sql/TableUser.java index 6966144..da02813 100644 --- a/src/main/java/love/sola/netsupport/sql/TableUser.java +++ b/src/main/java/love/sola/netsupport/sql/TableUser.java @@ -1,9 +1,16 @@ package love.sola.netsupport.sql; +import com.google.common.cache.CacheBuilder; +import com.google.common.cache.CacheLoader; +import com.google.common.cache.LoadingCache; +import love.sola.netsupport.config.Settings; import love.sola.netsupport.pojo.User; import org.hibernate.Session; import org.hibernate.criterion.Restrictions; +import java.util.concurrent.ExecutionException; +import java.util.concurrent.TimeUnit; + /** * *********************************************** * Created by Sola on 2015/11/10. @@ -28,19 +35,21 @@ public class TableUser extends SQLCore { } } - - public static User getByWechat(String wechat) { - try (Session s = sf.openSession()) { - return (User) s.createCriteria(User.class).add(Restrictions.eq(User.PROPERTY_WECHAT, wechat)).uniqueResult(); - } - } - public static User getByName(String name) { try (Session s = sf.openSession()) { return (User) s.createCriteria(User.class).add(Restrictions.eq(User.PROPERTY_NAME, name)).uniqueResult(); } } + public static User getByWechat(String wechat) { + try { + return cache.get(wechat); + } catch (ExecutionException e) { + e.printStackTrace(); + return null; + } + } + public static int update(User user) { try (Session s = sf.openSession()) { s.beginTransaction(); @@ -58,4 +67,23 @@ public class TableUser extends SQLCore { } } + private static LoadingCache cache = CacheBuilder.newBuilder() + .concurrencyLevel(4) + .maximumSize(4096) + .expireAfterWrite(Settings.I.User_Wechat_Cache_Expire_Time, TimeUnit.SECONDS) + .build(new ValueLoader()); + + private static class ValueLoader extends CacheLoader { + @Override + public User load(String key) throws Exception { + return TableUser.getByWechat0(key); + } + } + + private static User getByWechat0(String wechat) { + try (Session s = sf.openSession()) { + return (User) s.createCriteria(User.class).add(Restrictions.eq(User.PROPERTY_WECHAT, wechat)).uniqueResult(); + } + } + } diff --git a/src/main/java/love/sola/netsupport/wechat/WxMpServlet.java b/src/main/java/love/sola/netsupport/wechat/WxMpServlet.java index 6ae5b31..2d96f70 100644 --- a/src/main/java/love/sola/netsupport/wechat/WxMpServlet.java +++ b/src/main/java/love/sola/netsupport/wechat/WxMpServlet.java @@ -2,6 +2,7 @@ package love.sola.netsupport.wechat; import love.sola.netsupport.config.Settings; import love.sola.netsupport.wechat.handler.RegisterHandler; +import love.sola.netsupport.wechat.handler.SubscribeHandler; import love.sola.netsupport.wechat.matcher.CheckSpamMatcher; import love.sola.netsupport.wechat.matcher.RegisterMatcher; import me.chanjar.weixin.common.util.StringUtils; @@ -56,11 +57,7 @@ public class WxMpServlet extends HttpServlet { .async(false) .msgType("event") .event("subscribe") - .handler((wxMessage, context, wxMpService1, sessionManager) - -> WxMpXmlOutMessage.TEXT() - .fromUser(wxMessage.getToUserName()) - .toUser(wxMessage.getFromUserName()) - .content(lang("Event_Subscribe")).build()) + .handler(new SubscribeHandler()) .end(); wxMpMessageRouter.rule() .async(false) diff --git a/src/main/java/love/sola/netsupport/wechat/handler/RegisterHandler.java b/src/main/java/love/sola/netsupport/wechat/handler/RegisterHandler.java index c416748..e65e6da 100644 --- a/src/main/java/love/sola/netsupport/wechat/handler/RegisterHandler.java +++ b/src/main/java/love/sola/netsupport/wechat/handler/RegisterHandler.java @@ -36,12 +36,12 @@ public class RegisterHandler implements WxMpMessageHandler { WxSession session = WechatSession.get(id, true); if (u != null) { session.setAttribute(Attribute.AUTHORIZED, Command.PROFILE); - session.setAttribute(Attribute.WECHAT, wxMessage.getFromUserName()); + session.setAttribute(Attribute.WECHAT, fromUser); session.setAttribute(Attribute.USER, u); out.content(format("Already_Registered", format("User_Profile_Link", id, u.getName(), u.getIsp().id, u.getNetAccount(), u.getBlock(), u.getRoom(), u.getPhone()))); } else { session.setAttribute(Attribute.AUTHORIZED, Command.REGISTER); - session.setAttribute(Attribute.WECHAT, wxMessage.getFromUserName()); + session.setAttribute(Attribute.WECHAT, fromUser); out.content(format("User_Register", format("User_Register_Link", id))); } return out.build(); diff --git a/src/main/java/love/sola/netsupport/wechat/handler/SubscribeHandler.java b/src/main/java/love/sola/netsupport/wechat/handler/SubscribeHandler.java new file mode 100644 index 0000000..1c50439 --- /dev/null +++ b/src/main/java/love/sola/netsupport/wechat/handler/SubscribeHandler.java @@ -0,0 +1,48 @@ +package love.sola.netsupport.wechat.handler; + +import love.sola.netsupport.enums.Attribute; +import love.sola.netsupport.pojo.User; +import love.sola.netsupport.sql.TableUser; +import love.sola.netsupport.wechat.Command; +import love.sola.netsupport.wechat.WechatSession; +import me.chanjar.weixin.common.exception.WxErrorException; +import me.chanjar.weixin.common.session.WxSession; +import me.chanjar.weixin.common.session.WxSessionManager; +import me.chanjar.weixin.mp.api.WxMpMessageHandler; +import me.chanjar.weixin.mp.api.WxMpService; +import me.chanjar.weixin.mp.bean.WxMpXmlMessage; +import me.chanjar.weixin.mp.bean.WxMpXmlOutMessage; +import me.chanjar.weixin.mp.bean.outxmlbuilder.TextBuilder; + +import java.util.Map; + +import static love.sola.netsupport.config.Lang.format; + +/** + * *********************************************** + * Created by Sola on 2015/12/25. + * Don't modify this source without my agreement + * *********************************************** + */ +public class SubscribeHandler implements WxMpMessageHandler { + + @Override + public WxMpXmlOutMessage handle(WxMpXmlMessage wxMessage, Map context, WxMpService wxMpService, WxSessionManager sessionManager) throws WxErrorException { + TextBuilder out = WxMpXmlOutMessage.TEXT().fromUser(wxMessage.getToUserName()).toUser(wxMessage.getFromUserName()); + String fromUser = wxMessage.getFromUserName(); + User u = TableUser.getByWechat(fromUser); + String id = WechatSession.genId(); + WxSession session = WechatSession.get(id, true); + if (u != null) { + session.setAttribute(Attribute.AUTHORIZED, Command.PROFILE); + session.setAttribute(Attribute.WECHAT, fromUser); + session.setAttribute(Attribute.USER, u); + out.content(format("Event_Subscribe", format("Already_Registered", format("User_Profile_Link", id, u.getName(), u.getIsp().id, u.getNetAccount(), u.getBlock(), u.getRoom(), u.getPhone())))); + } else { + session.setAttribute(Attribute.AUTHORIZED, Command.REGISTER); + session.setAttribute(Attribute.WECHAT, fromUser); + out.content(format("Event_Subscribe", format("User_Register", format("User_Register_Link", id)))); + } + return out.build(); + } +} diff --git a/src/main/java/love/sola/netsupport/wechat/matcher/CheckSpamMatcher.java b/src/main/java/love/sola/netsupport/wechat/matcher/CheckSpamMatcher.java index 00363c3..98f5bad 100644 --- a/src/main/java/love/sola/netsupport/wechat/matcher/CheckSpamMatcher.java +++ b/src/main/java/love/sola/netsupport/wechat/matcher/CheckSpamMatcher.java @@ -26,7 +26,6 @@ public class CheckSpamMatcher implements WxMpMessageMatcher { private LoadingCache cache = CacheBuilder.newBuilder() .concurrencyLevel(4) - .weakKeys() .maximumSize(4096) .expireAfterWrite(Settings.I.Check_Spam_Cache_Expire_Time, TimeUnit.SECONDS) .build(new ValueLoader()); diff --git a/src/main/resources/lang.yml b/src/main/resources/lang.yml index 4c79f07..c96ccf8 100644 --- a/src/main/resources/lang.yml +++ b/src/main/resources/lang.yml @@ -11,10 +11,11 @@ REGEX_CANCEL: '^(?i)(Cancel)|(取消)|(撤销)|(qx)|(cx)$' REGEX_LOGIN: '^(?i)Authme$' REGEX_PROFILE: '^(?i)(EditProfile)|(修改资料)|(修改信息)|(xgzl)|(xgxx)$' -#Event -Event_Subscribe: "欢迎使用电子科技大学中山学院网络维护科微信自助报修平台。\n\n若您尚未进行过微信绑定,请发送'绑定'(bd)进行微信绑定" +#Misc Invalid_Operation: 'Whoops,报修姬找不到你想要的东西啦 (╯‵□′)╯︵┻━┻。' Message_Spam: '你的打字速度太快了,喝一杯82年的Java压压惊吧。' +#Subscribe +Event_Subscribe: "欢迎使用电子科技大学中山学院网络维护科微信自助报修平台。\n\n{0}" #Register User_Register: "您尚未进行微信绑定。\n>点击这里进行微信绑定操作<" Already_Registered: '您已进行过微信绑定。若是需要更改个人信息,请 >点击此处<。'