mirror of
				https://github.com/ZSCNetSupportDept/WechatTicketSystem.git
				synced 2025-10-31 10:26:19 +08:00 
			
		
		
		
	improve - subscribe event pop up register links automatically
This commit is contained in:
		| @@ -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); | ||||
| 		} | ||||
|  | ||||
|   | ||||
| @@ -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; } | ||||
|   | ||||
| @@ -72,6 +72,16 @@ public class TableTicket extends SQLCore { | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	@SuppressWarnings("unchecked") | ||||
| 	public static List<Ticket> 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<Object[]> track(int tid) { | ||||
| 		try (Session s = SQLCore.sf.openSession()) { | ||||
|   | ||||
| @@ -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<String, User> 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<String, User> { | ||||
| 		@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(); | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| } | ||||
|   | ||||
| @@ -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) | ||||
|   | ||||
| @@ -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(); | ||||
|   | ||||
| @@ -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<String, Object> 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(); | ||||
| 	} | ||||
| } | ||||
| @@ -26,7 +26,6 @@ public class CheckSpamMatcher implements WxMpMessageMatcher { | ||||
|  | ||||
| 	private LoadingCache<String, Long> cache = CacheBuilder.newBuilder() | ||||
| 			.concurrencyLevel(4) | ||||
| 			.weakKeys() | ||||
| 			.maximumSize(4096) | ||||
| 			.expireAfterWrite(Settings.I.Check_Spam_Cache_Expire_Time, TimeUnit.SECONDS) | ||||
| 			.build(new ValueLoader()); | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 Sola
					Sola