operator login command

This commit is contained in:
Sola
2015-12-12 11:10:08 +08:00
parent 8a8281b973
commit 8b44cedf58
19 changed files with 111 additions and 188 deletions

View File

@@ -77,7 +77,7 @@ public class Authorize extends HttpServlet {
break;
case QUERY:
case SUBMIT:
User u = TableUser.getUserByWechat(wechat);
User u = TableUser.getByWechat(wechat);
if (u == null) return new Response(Response.ResponseCode.AUTHORIZE_FAILED);
httpSession.setAttribute("user", u);
break;

View File

@@ -78,7 +78,7 @@ public class Register extends HttpServlet {
if (block == -1) return "Invalid_Block";
if (room == -1) return "Invalid_Room";
if (phone == -1) return "Invalid_Phone_Number";
User user = TableUser.getUserById(sid);
User user = TableUser.getById(sid);
if (user == null) return "Invalid_Student_Id";
if (!user.getName().equals(name)) return "Invalid_Name";
if (user.getWechatId() != null) return "User_Already_Registered";
@@ -88,7 +88,7 @@ public class Register extends HttpServlet {
user.setRoom(room);
user.setPhone(phone);
user.setWechatId(wechat);
TableUser.updateUser(user);
TableUser.update(user);
return "Register_Success";
}

View File

@@ -4,13 +4,12 @@ import com.google.gson.Gson;
import love.sola.netsupport.pojo.Ticket;
import love.sola.netsupport.pojo.User;
import love.sola.netsupport.sql.SQLCore;
import love.sola.netsupport.sql.TableTicket;
import love.sola.netsupport.util.Checker;
import love.sola.netsupport.util.ParseUtil;
import love.sola.netsupport.wechat.Command;
import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.criterion.Projections;
import org.hibernate.criterion.Restrictions;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
@@ -61,14 +60,10 @@ public class TicketSubmit extends HttpServlet {
User u = (User) httpSession.getAttribute("user");
if (u == null) return new Response(Response.ResponseCode.UNAUTHORIZED);
long n = (long) s.createCriteria(Ticket.class)
.add(Restrictions.eq(Ticket.PROPERTY_USER, u))
.add(Restrictions.eq(Ticket.PROPERTY_STATUS, 0))
.setProjection(Projections.rowCount())
.uniqueResult();
if (n > 0) {
if (TableTicket.hasOpen(u)) {
return new Response(Response.ResponseCode.ALREADY_SUBMITTED);
}
Ticket t = new Ticket();
t.setUser(u);
t.setDescription(desc);

View File

@@ -55,7 +55,7 @@ public class GetUser extends HttpServlet {
}
if (id != null) {
try {
User u = TableUser.getUserById(Long.parseLong(id));
User u = TableUser.getById(Long.parseLong(id));
if (u == null)
return new Response(Response.ResponseCode.USER_NOT_FOUND);
else
@@ -64,7 +64,7 @@ public class GetUser extends HttpServlet {
return new Response(Response.ResponseCode.ILLEGAL_PARAMETER);
}
} else {
User u = TableUser.getUserByName(name);
User u = TableUser.getByName(name);
if (u == null)
return new Response(Response.ResponseCode.USER_NOT_FOUND);
else

View File

@@ -1,7 +1,5 @@
package love.sola.netsupport.enums;
import com.google.gson.annotations.SerializedName;
import java.util.HashMap;
import java.util.Map;
@@ -15,11 +13,8 @@ import static love.sola.netsupport.config.Lang.lang;
*/
public enum ISP {
@SerializedName("1")
TELECOM(1, "^1[3|4|5|7|8][0-9]{9}$"),
@SerializedName("2")
UNICOM(2, "ZSZJLAN[0-9]{10}@16900\\.gd"),
@SerializedName("3")
CHINAMOBILE(3, "^1[3|4|5|7|8][0-9]{9}@139\\.gd$"),;
private static final Map<String, ISP> NAME_MAP = new HashMap<>();

View File

@@ -23,6 +23,8 @@ import javax.persistence.Table;
@Table(name = "operators")
public class Operator {
public static final String PROPERTY_WECHAT = "wechat";
@Id
@Column(name = "id", nullable = false, insertable = false, updatable = false)
private Integer id;

View File

@@ -0,0 +1,26 @@
package love.sola.netsupport.sql;
import love.sola.netsupport.pojo.Operator;
import org.hibernate.Session;
import org.hibernate.criterion.Projections;
import org.hibernate.criterion.Restrictions;
/**
* ***********************************************
* Created by Sola on 2015/12/12.
* Don't modify this source without my agreement
* ***********************************************
*/
public class TableOperator extends SQLCore {
public static boolean has(String wechat) {
try (Session s = SQLCore.sf.openSession()) {
return (long) s.createCriteria(Operator.class)
.add(Restrictions.eq(Operator.PROPERTY_WECHAT, wechat))
.setProjection(Projections.rowCount())
.uniqueResult() > 0;
}
}
}

View File

@@ -5,6 +5,7 @@ import love.sola.netsupport.pojo.Ticket;
import love.sola.netsupport.pojo.User;
import org.hibernate.Session;
import org.hibernate.criterion.Order;
import org.hibernate.criterion.Projections;
import org.hibernate.criterion.Restrictions;
import java.util.List;
@@ -27,7 +28,7 @@ public class TableTicket extends SQLCore {
public static final String COLUMN_STATUS = "status";
public static Ticket queryLatestOpen(User u) {
public static Ticket latestOpen(User u) {
try (Session s = SQLCore.sf.openSession()) {
return (Ticket) s.createCriteria(Ticket.class)
.addOrder(Order.desc(Ticket.PROPERTY_SUBMIT_TIME))
@@ -38,7 +39,7 @@ public class TableTicket extends SQLCore {
}
}
public static Ticket queryLatest(User u) {
public static Ticket latest(User u) {
try (Session s = SQLCore.sf.openSession()) {
return (Ticket) s.createCriteria(Ticket.class)
.addOrder(Order.desc(Ticket.PROPERTY_SUBMIT_TIME))
@@ -48,8 +49,18 @@ public class TableTicket extends SQLCore {
}
}
public static boolean hasOpen(User u) {
try (Session s = SQLCore.sf.openSession()) {
return (long) s.createCriteria(Ticket.class)
.add(Restrictions.eq(Ticket.PROPERTY_USER, u))
.add(Restrictions.ne(Ticket.PROPERTY_STATUS, Status.SOLVED))
.setProjection(Projections.rowCount())
.uniqueResult() > 0;
}
}
@SuppressWarnings("unchecked")
public static List<Ticket> queryUnsolvedByBlock(int b) {
public static List<Ticket> unsolvedByBlock(int b) {
try (Session s = SQLCore.sf.openSession()) {
return s.createCriteria(Ticket.class)
.createCriteria(Ticket.PROPERTY_USER)

View File

@@ -22,26 +22,26 @@ public class TableUser extends SQLCore {
public static final String COLUMN_ROOM = "room";
public static final String COLUMN_PHONE = "phone";
public static User getUserById(long id) {
public static User getById(long id) {
try (Session s = sf.openSession()) {
return s.get(User.class, id);
}
}
public static User getUserByWechat(String wechat) {
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 getUserByName(String name) {
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 int updateUser(User user) {
public static int update(User user) {
try (Session s = sf.openSession()) {
s.beginTransaction();
s.update(user);

View File

@@ -1,9 +1,6 @@
package love.sola.netsupport.wechat;
import love.sola.netsupport.wechat.handler.CancelHandler;
import love.sola.netsupport.wechat.handler.QueryHandler;
import love.sola.netsupport.wechat.handler.RegisterHandler;
import love.sola.netsupport.wechat.handler.SubmitHandler;
import love.sola.netsupport.wechat.handler.*;
import me.chanjar.weixin.mp.api.WxMpMessageHandler;
import java.util.HashMap;
@@ -23,6 +20,7 @@ public enum Command {
QUERY(1, QueryHandler.class),
SUBMIT(2, SubmitHandler.class),
CANCEL(3, CancelHandler.class),
LOGIN(10, LoginHandler.class),
;
private static final Map<Integer, Command> ID_MAP = new HashMap<>();

View File

@@ -32,8 +32,8 @@ public class CancelHandler implements WxMpMessageHandler {
@Override
public WxMpXmlOutMessage handle(WxMpXmlMessage wxMessage, Map<String, Object> context, WxMpService wxMpService, WxSessionManager sessionManager) throws WxErrorException {
User u = TableUser.getUserByWechat(wxMessage.getFromUserName());
Ticket t = TableTicket.queryLatestOpen(u);
User u = TableUser.getByWechat(wxMessage.getFromUserName());
Ticket t = TableTicket.latestOpen(u);
if (t == null) {
return WxMpXmlOutMessage.TEXT().fromUser(wxMessage.getToUserName()).toUser(wxMessage.getFromUserName())
.content(lang("No_Open_Ticket_Available")).build();

View File

@@ -0,0 +1,35 @@
package love.sola.netsupport.wechat.handler;
import love.sola.netsupport.sql.TableOperator;
import me.chanjar.weixin.common.exception.WxErrorException;
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;
import static love.sola.netsupport.config.Lang.lang;
/**
* ***********************************************
* Created by Sola on 2015/12/12.
* Don't modify this source without my agreement
* ***********************************************
*/
public class LoginHandler 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());
if (!TableOperator.has(wxMessage.getFromUserName())) {
return out.content(lang("Not_Operator")).build();
} else {
return out.content(format("Operator_Login_Link", wxMessage.getFromUserName())).build();
}
}
}

View File

@@ -32,8 +32,8 @@ public class QueryHandler implements WxMpMessageHandler {
@Override
public WxMpXmlOutMessage handle(WxMpXmlMessage wxMessage, Map<String, Object> context, WxMpService wxMpService, WxSessionManager sessionManager) throws WxErrorException {
User u = TableUser.getUserByWechat(wxMessage.getFromUserName());
Ticket t = TableTicket.queryLatest(u);
User u = TableUser.getByWechat(wxMessage.getFromUserName());
Ticket t = TableTicket.latest(u);
if (t == null) {
return WxMpXmlOutMessage.TEXT().fromUser(wxMessage.getToUserName()).toUser(wxMessage.getFromUserName())
.content(lang("No_Ticket_Available")).build();

View File

@@ -30,7 +30,7 @@ public class RegisterHandler implements WxMpMessageHandler {
throws WxErrorException {
TextBuilder out = WxMpXmlOutMessage.TEXT().fromUser(wxMessage.getToUserName()).toUser(wxMessage.getFromUserName());
String fromUser = wxMessage.getFromUserName();
User u = TableUser.getUserByWechat(fromUser);
User u = TableUser.getByWechat(fromUser);
if (u != null) {
out.content(lang("Already_Registered"));
} else {

View File

@@ -1,7 +1,6 @@
package love.sola.netsupport.wechat.handler;
import love.sola.netsupport.api.Authorize;
import love.sola.netsupport.pojo.Ticket;
import love.sola.netsupport.pojo.User;
import love.sola.netsupport.sql.TableTicket;
import love.sola.netsupport.sql.TableUser;
@@ -30,9 +29,8 @@ public class SubmitHandler implements WxMpMessageHandler {
@Override
public WxMpXmlOutMessage handle(WxMpXmlMessage wxMessage, Map<String, Object> context, WxMpService wxMpService, WxSessionManager sessionManager) throws WxErrorException {
User u = TableUser.getUserByWechat(wxMessage.getFromUserName());
Ticket t = TableTicket.queryLatestOpen(u);
if (t != null) {
User u = TableUser.getByWechat(wxMessage.getFromUserName());
if (TableTicket.hasOpen(u)) {
return WxMpXmlOutMessage.TEXT().fromUser(wxMessage.getToUserName()).toUser(wxMessage.getFromUserName())
.content(lang("Already_Opening_Ticket")).build();
}
@@ -40,7 +38,7 @@ public class SubmitHandler implements WxMpMessageHandler {
WxMpXmlOutNewsMessage.Item item = new WxMpXmlOutNewsMessage.Item();
item.setTitle(lang("Submit_Title"));
item.setDescription(lang("Submit_Desc"));
item.setUrl(format("User_Submit_Link", wxMessage.getFromUserName()));
item.setUrl(format("User_Submit_Link", wxMessage.getFromUserName(), u.getName(), u.getIsp(), u.getRoom(), u.getBlock(), u.getPhone()));
out.addArticle(item);
Authorize.fetchedTime.put(wxMessage.getFromUserName(), System.currentTimeMillis());
Authorize.fetchedCommand.put(wxMessage.getFromUserName(), Command.SUBMIT);

View File

@@ -1,146 +0,0 @@
package love.sola.netsupport.wechat.handler;
import love.sola.netsupport.enums.ISP;
import love.sola.netsupport.pojo.User;
import love.sola.netsupport.sql.TableUser;
import love.sola.netsupport.wechat.Command;
import love.sola.netsupport.wechat.matcher.CommandMatcher;
import me.chanjar.weixin.common.exception.WxErrorException;
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.HashMap;
import java.util.Map;
/**
* ***********************************************
* Created by Sola on 2015/11/4.
* Don't modify this source without my agreement
* ***********************************************
*/
public class __INVALID__RegisterHandler implements WxMpMessageHandler {
public static final String STUDENT_ID_REGEX = "^(2010|2012|2013|2014|2015)[0-9]{9}";
Map<String, User> confirmed = new HashMap<>();
Map<String, RegisterStep> steps = new HashMap<>();
@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());
handle(wxMessage.getContent(), wxMessage.getFromUserName(), out);
return out.build();
}
private void handle(String in, String userName, TextBuilder out) {
if (in.equalsIgnoreCase("q")) {
CommandMatcher.inCmdUsers.remove(userName);
confirmed.remove(userName);
steps.remove(userName);
out.content("Operation canceled.");
return;
}
if (!steps.containsKey(userName)) {
out.content("Welcome, please type your student identification number.");
CommandMatcher.inCmdUsers.put(userName, Command.REGISTER);
steps.put(userName, RegisterStep.STUDENT_ID);
return;
}
RegisterStep step = steps.get(userName);
if (step == RegisterStep.STUDENT_ID) {
Long sid = checkStudentId(in);
User user;
if (sid == null || (user = TableUser.getUserById(sid)) == null) {
out.content("Invalid student identification number. Type 'q' to cancel this operation.");
return;
}
out.content("Please type your real name to validate.");
confirmed.put(userName, user);
steps.put(userName, RegisterStep.NAME);
return;
}
User user = confirmed.get(userName);
if (step == RegisterStep.NAME) {
if (in.trim().equals(user.getName())) {
out.content("Confirmed success.\n" +
"Please enter your ISP.\n" +
"1-Telecom 2-Unicom 3-ChinaMobile");
steps.put(userName, RegisterStep.ISP);
} else {
out.content("Validate failed.\n" +
"If you have any issue, please contact administrator.\n" +
"Type 'q' to cancel this operation.");
}
return;
}
if (step == RegisterStep.ISP) {
ISP type = checkISP(in);
if (type == null) {
out.content("Invalid ISP. Please retype your ISP.");
} else {
user.setIsp(type);
out.content("Success.\n" +
"Please enter your net account.");
steps.put(userName, RegisterStep.NET_ACCOUNT);
}
return;
}
if (step == RegisterStep.NET_ACCOUNT) {
String account = checkNetAccount(in);
if (account == null) {
out.content("Invalid account. Please retype your net account.");
} else {
user.setNetAccount(account);
steps.put(userName, step = RegisterStep.COMPLETE);
}
}
if (step == RegisterStep.COMPLETE) {
user.setWechatId(userName);
TableUser.updateUser(user);
CommandMatcher.inCmdUsers.remove(userName);
confirmed.remove(userName);
steps.remove(userName);
out.content("Congratulations!\n" +
"You has successful registered!\n" +
"Please enjoy our service.");
}
}
private Long checkStudentId(String studentId) {
if (studentId.matches(STUDENT_ID_REGEX)) {
try {
return Long.parseLong(studentId);
} catch (NumberFormatException ignored) {
}
}
return null;
}
private ISP checkISP(String isp) {
try {
return ISP.fromId(Integer.parseInt(isp));
} catch (NumberFormatException ignored) {
}
return null;
}
private String checkNetAccount(String account) {
return account;
}
enum RegisterStep {
STUDENT_ID,
NAME,
ISP,
NET_ACCOUNT,
COMPLETE,
;
}
}

View File

@@ -24,7 +24,7 @@ public class RegisterMatcher implements WxMpMessageMatcher {
if (registered.contains(fromUser)) {
return false;
} else {
User u = TableUser.getUserByWechat(fromUser);
User u = TableUser.getByWechat(fromUser);
if (u != null) registered.add(u.getWechatId());
return u == null;
}

View File

@@ -8,11 +8,12 @@ REGEX_QUERY: '^(?i)(Query)|(查询)|(cx)$'
REGEX_REGISTER: '^(?i)(Reg(ister)?)|(注册)|(zc)$'
REGEX_SUBMIT: '^(?i)(Submit)|(报修)|(bx)$'
REGEX_CANCEL: '^(?i)(Cancel)|(取消)|(qx)$'
REGEX_LOGIN: '^(?i)Authme$'
#Event
Event_Subscribe: "欢迎使用电子科技大学中山学院网络维护科微信自助报修平台。\n如您在使用中遇到任何问题请将投诉或建议邮件至loli@sola.love."
Invalid_Operation: 'Whoops报修姬找不到你想要的东西啦 (╯‵□′)╯︵┻━┻。'
Message_Spam: '你的语速太快了喝一杯82年的雪碧压压惊吧。'
Message_Spam: '你的打字速度太快了喝一杯82年的Java压压惊吧。'
#Register
Already_Registered: "您已进行过微信绑定。如果需要更改个人信息,请发送 '修改资料' 。"
#Query
@@ -34,12 +35,15 @@ No_Open_Ticket_Available: '您当前没有未解决的报修表单。'
Cancel_Title: '报修已取消:'
User_Cancel_Remark: '用户手动取消报修。'
Cancel_Failed: '取消失败。'
#Login
Not_Operator: '嘟嘟嘟……'
#URL
User_Register_Link: "您尚未进行微信绑定, 请<a href=\"http://topaz.sinaapp.com/nm/v1/reg.php?wechatid={0}\">点击这里</a>进行微信绑定操作。"
User_Query_Link: 'http://topaz.sinaapp.com/nm/v1/query.php?wechatid={0}'
User_Submit_Link: 'http://topaz.sinaapp.com/nm/v1/submit.php?wechatid={0}'
User_Submit_Link: 'http://topaz.sinaapp.com/nm/v1/rrepair.html?wechatid={0}&name={1}&isp={2}&room={3}&block={4}&phone={5}'
Result_Page: 'http://topaz.sinaapp.com/nm/v1/result.html'
Operator_Login_Link: '<a href=\"http://topaz.sinaapp.com/nm/v1/login.html?wechatid={0}\">CLICK HERE</a>'
#Localized
#Status

View File

@@ -2,6 +2,7 @@ package love.sola.netsupport.wechat;
import com.google.gson.*;
import love.sola.netsupport.config.Lang;
import love.sola.netsupport.enums.ISP;
import org.junit.Test;
import java.util.Date;
@@ -24,9 +25,13 @@ public class TestMessageFormat {
Gson gson = new GsonBuilder()
.registerTypeAdapter(Date.class, (JsonDeserializer<Date>) (json, typeOfT, context) -> new Date(json.getAsJsonPrimitive().getAsLong()))
.registerTypeAdapter(Date.class, (JsonSerializer<Date>) (src, typeOfSrc, context) -> new JsonPrimitive(src.getTime()))
.registerTypeAdapter(ISP.class, (JsonDeserializer<ISP>) (json, typeOfT, context) -> ISP.fromId(json.getAsJsonPrimitive().getAsInt()))
.registerTypeAdapter(ISP.class, (JsonSerializer<ISP>) (src, typeOfSrc, context) -> new JsonPrimitive(src.id))
.create();
Date date = new Date();
assert gson.fromJson(gson.toJson(date), Date.class).compareTo(date) == 0;
assert gson.fromJson(gson.toJson(ISP.TELECOM), ISP.class) == ISP.TELECOM;
assert gson.toJson(ISP.TELECOM).equals("1");
}
}