From 60b4d9e23ec7e2ff9ca1685e108856a0ae355fd4 Mon Sep 17 00:00:00 2001 From: Sola Date: Sat, 5 Dec 2015 01:34:13 +0800 Subject: [PATCH] Use Hibernate framework to operate pojo instance, bye bye SQL strings :) --- docs/Authorize.html | 43 +++-- docs/绑定微信请求.html | 101 ++++++++-- pom.xml | 23 ++- src/main/java/love/sola/netsupport/Index.java | 5 +- .../love/sola/netsupport/api/Authorize.java | 32 ++-- .../love/sola/netsupport/api/GetUser.java | 23 ++- .../love/sola/netsupport/api/QueryTicket.java | 44 +++++ .../love/sola/netsupport/api/Register.java | 65 ++++--- .../love/sola/netsupport/api/Response.java | 1 + .../sola/netsupport/enums/BlockConverter.java | 25 +++ .../sola/netsupport/enums/ISPConverter.java | 25 +++ .../love/sola/netsupport/pojo/Ticket.java | 38 ++++ .../java/love/sola/netsupport/pojo/User.java | 23 ++- .../love/sola/netsupport/sql/SQLCore.java | 9 + .../love/sola/netsupport/sql/TableUser.java | 176 +++--------------- .../java/love/sola/netsupport/util/JsonP.java | 21 +++ .../love/sola/netsupport/wechat/Command.java | 9 +- src/main/resources/hibernate.cfg.xml | 45 +++++ src/main/webapp/WEB-INF/web.xml | 68 +------ src/main/webapp/favicon.ico | Bin 0 -> 67646 bytes .../love/sola/netsupport/wechat/TestDate.java | 20 ++ .../love/sola/netsupport/wechat/TestGson.java | 25 --- .../netsupport/wechat/TestMessageFormat.java | 7 + 23 files changed, 494 insertions(+), 334 deletions(-) create mode 100644 src/main/java/love/sola/netsupport/api/QueryTicket.java create mode 100644 src/main/java/love/sola/netsupport/enums/BlockConverter.java create mode 100644 src/main/java/love/sola/netsupport/enums/ISPConverter.java create mode 100644 src/main/java/love/sola/netsupport/pojo/Ticket.java create mode 100644 src/main/java/love/sola/netsupport/util/JsonP.java create mode 100644 src/main/resources/hibernate.cfg.xml create mode 100644 src/main/webapp/favicon.ico create mode 100644 src/test/java/love/sola/netsupport/wechat/TestDate.java delete mode 100644 src/test/java/love/sola/netsupport/wechat/TestGson.java diff --git a/docs/Authorize.html b/docs/Authorize.html index a884827..b41ce77 100644 --- a/docs/Authorize.html +++ b/docs/Authorize.html @@ -1,8 +1,8 @@ Authorize
-
+
-
+

Authorize

@@ -12,35 +12,51 @@
  • URL
  • Method
  • Parameters
  • +
  • Response
  • + +
  • Signature
  • -
    +
    + +

    URL

    -

    http://sola.love/ww/api/authorize

    +
    -
    +

    http://sola.love/ww/api/authorize

    Method

    -

    POST

    +
    -
    +

    POST

    Parameters

    +
    + +
    -
    +

    Response

    -

    Response Code

    +
    + +

    Format

    + +

    JSON

    + +
    + +

    Response Code

    -
    +

    Signature

    -

    Created by Sola on 2/15/2015

    \ No newline at end of file +

    Created by Sola on 12/3/2015

    \ No newline at end of file diff --git a/docs/绑定微信请求.html b/docs/绑定微信请求.html index 486a1ae..fd8a1ff 100644 --- a/docs/绑定微信请求.html +++ b/docs/绑定微信请求.html @@ -1,24 +1,36 @@ -绑定微信请求
    +绑定微信请求 V1.3
    -
    +
    -
    +
    -

    绑定微信请求

    +

    绑定微信请求 V1.3

    -
    +
    +

    Edition : (1.3)2015/12/04

    +
    -

    URL

    +
    +

    绑定

    -

    Method

    +
    + +
    + +

    URL

    + +

    http://sola.love

    + +
    + +

    Method

    POST

    -
    +
    -

    Params

    +

    Params

    • wechatid string 用户微信ID
    • name string 姓名
    • @@ -28,11 +40,25 @@
    • block integer 片区代码
    • room integer 宿舍房号
    • phone string 手机号码
    • -
    + -

    More

    +
    -

    片区代码

    +

    More

    + +
    + +

    ISP代码

    + +
    • 电信 1
    • +
    • 联通 2
    • +
    • 移动 3
    • +
    • 其他 4
    • +
    + +
    + +

    片区代码

    • 岐头生活区
        @@ -71,12 +97,55 @@
        • 20栋 60
        • 21栋 61
        -
    + + +
    + +

    绑定结果页

    + +
    + +
    + +

    Method

    + +

    GET

    + +
    + +

    Params

    + +
    • type integer 绑定结果类型
    • +
    • msg string 绑定结果说明
    • +
    + +
    + +

    More

    + +
    + +

    结果类型

    + +
    • 失败 0
    • +
    • 成功 1
    • +
    • 警告 -1(不推荐使用)
    • +
    + +

    Author

    -

    LiuYue(hangxingliu)

    +

    LiuYue(hangxingliu)

    + +

    Date

    -

    2015/11/28

    \ No newline at end of file +

    2015/12/04

    \ No newline at end of file diff --git a/pom.xml b/pom.xml index c921c56..02cedd1 100644 --- a/pom.xml +++ b/pom.xml @@ -28,6 +28,7 @@ + ${project.artifactId} @@ -96,7 +97,25 @@ mysql-connector-java 5.1.37 - + + org.hibernate + hibernate-core + 5.0.3.Final + + + org.hibernate + hibernate-entitymanager + 5.0.3.Final + + + org.hibernate + hibernate-c3p0 + 5.0.3.Final + + + org.hibernate.javax.persistence + hibernate-jpa-2.1-api + 1.0.0.Final + - \ No newline at end of file diff --git a/src/main/java/love/sola/netsupport/Index.java b/src/main/java/love/sola/netsupport/Index.java index b45dea6..20a12ff 100644 --- a/src/main/java/love/sola/netsupport/Index.java +++ b/src/main/java/love/sola/netsupport/Index.java @@ -1,7 +1,5 @@ package love.sola.netsupport; -import love.sola.netsupport.config.Settings; - import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; @@ -16,10 +14,9 @@ import java.io.PrintWriter; * Don't modify this source without my agreement * *********************************************** */ -@WebServlet(name = "Index",urlPatterns = "/",loadOnStartup = 1) +@WebServlet(name = "Index",urlPatterns = "/index",loadOnStartup = 1) public class Index extends HttpServlet { - protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } diff --git a/src/main/java/love/sola/netsupport/api/Authorize.java b/src/main/java/love/sola/netsupport/api/Authorize.java index 2ca3736..f0ed3d6 100644 --- a/src/main/java/love/sola/netsupport/api/Authorize.java +++ b/src/main/java/love/sola/netsupport/api/Authorize.java @@ -3,6 +3,7 @@ package love.sola.netsupport.api; import com.google.gson.Gson; import love.sola.netsupport.config.Settings; import love.sola.netsupport.sql.SQLCore; +import love.sola.netsupport.util.JsonP; import love.sola.netsupport.wechat.Command; import javax.servlet.ServletException; @@ -15,8 +16,6 @@ import java.io.PrintWriter; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; -import static love.sola.netsupport.config.Lang.lang; - /** * *********************************************** * Created by Sola on 2015/12/2. @@ -32,16 +31,21 @@ public class Authorize extends HttpServlet { public static Map fetchedCommand = new ConcurrentHashMap<>(); protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { + doGet(request, response); + } + + protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.setCharacterEncoding("utf-8"); response.setCharacterEncoding("utf-8"); response.addHeader("Content-type", "text/json;charset=utf-8"); PrintWriter out = response.getWriter(); - String wechat = request.getParameter("wechat"); - out.println(gson.toJson(authorize(wechat))); + String json = gson.toJson(authorize(request)); + out.println(JsonP.parse(request, json)); out.close(); } - private Response authorize(String wechat) { + private Response authorize(HttpServletRequest request) { + String wechat = request.getParameter("wechat"); if (wechat == null) { return new Response(Response.ResponseCode.PARAMETER_REQUIRED); } @@ -50,28 +54,20 @@ public class Authorize extends HttpServlet { if (l == null || c == null) { return new Response(Response.ResponseCode.AUTHORIZE_FAILED); } - if (l < System.currentTimeMillis() - Settings.I.User_Command_Timeout) { - return new Response(Response.ResponseCode.AUTHORIZE_FAILED); + if (l < System.currentTimeMillis() - Settings.I.User_Command_Timeout * 1000) { + return new Response(Response.ResponseCode.REQUEST_EXPIRED); } switch (c) { case REGISTER: Register.authorized.put(wechat, System.currentTimeMillis()); break; + case QUERY: + request.getSession(true).setAttribute("wechat", wechat); + request.getSession(true).setAttribute("wechat", wechat); default: return new Response(Response.ResponseCode.AUTHORIZE_FAILED); } return new Response(Response.ResponseCode.OK); } - - @SuppressWarnings("Duplicates") - protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { - request.setCharacterEncoding("utf-8"); - response.setCharacterEncoding("utf-8"); - response.addHeader("Content-type", "text/plain;charset=utf-8"); - PrintWriter out = response.getWriter(); - out.println(lang("Illegal_Request")); - out.close(); - } - } diff --git a/src/main/java/love/sola/netsupport/api/GetUser.java b/src/main/java/love/sola/netsupport/api/GetUser.java index 36458a4..f511437 100644 --- a/src/main/java/love/sola/netsupport/api/GetUser.java +++ b/src/main/java/love/sola/netsupport/api/GetUser.java @@ -4,6 +4,7 @@ import com.google.gson.Gson; import love.sola.netsupport.pojo.User; import love.sola.netsupport.sql.SQLCore; import love.sola.netsupport.sql.TableUser; +import love.sola.netsupport.util.JsonP; import javax.servlet.ServletConfig; import javax.servlet.ServletException; @@ -39,28 +40,34 @@ public class GetUser extends HttpServlet { response.setCharacterEncoding("utf-8"); response.addHeader("Content-type", "text/json;charset=utf-8"); PrintWriter out = response.getWriter(); + String json = gson.toJson(query(request)); + out.println(JsonP.parse(request, json)); + out.close(); + } + + private Response query(HttpServletRequest request) { String id = request.getParameter("id"); String name = request.getParameter("name"); if ((id == null || id.isEmpty()) && (name == null || name.isEmpty())) { - out.println(gson.toJson(new Response(Response.ResponseCode.PARAMETER_REQUIRED))); - } else if (id != null) { + return new Response(Response.ResponseCode.PARAMETER_REQUIRED); + } + if (id != null) { try { User u = TableUser.getUserById(Long.parseLong(id)); if (u == null) - out.println(gson.toJson(new Response(Response.ResponseCode.USER_NOT_FOUND))); + return new Response(Response.ResponseCode.USER_NOT_FOUND); else - out.println(gson.toJson(new Response(Response.ResponseCode.OK, u))); + return new Response(Response.ResponseCode.OK, u); } catch (NumberFormatException e) { - out.println(gson.toJson(new Response(Response.ResponseCode.ILLEGAL_PARAMETER))); + return new Response(Response.ResponseCode.ILLEGAL_PARAMETER); } } else { User u = TableUser.getUserByName(name); if (u == null) - out.println(gson.toJson(new Response(Response.ResponseCode.USER_NOT_FOUND))); + return new Response(Response.ResponseCode.USER_NOT_FOUND); else - out.println(gson.toJson(new Response(Response.ResponseCode.OK, u))); + return new Response(Response.ResponseCode.OK, u); } - out.close(); } } diff --git a/src/main/java/love/sola/netsupport/api/QueryTicket.java b/src/main/java/love/sola/netsupport/api/QueryTicket.java new file mode 100644 index 0000000..e5a204d --- /dev/null +++ b/src/main/java/love/sola/netsupport/api/QueryTicket.java @@ -0,0 +1,44 @@ +package love.sola.netsupport.api; + +import love.sola.netsupport.sql.SQLCore; +import org.hibernate.HibernateException; +import org.hibernate.Session; + +import javax.servlet.ServletException; +import javax.servlet.annotation.WebServlet; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.io.PrintWriter; + +/** + * *********************************************** + * Created by Sola on 2015/12/4. + * Don't modify this source without my agreement + * *********************************************** + */ +@WebServlet(name = "QueryTicket", urlPatterns = "/api/queryticket", loadOnStartup = 23) +public class QueryTicket extends HttpServlet { + + protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { + + } + + protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { + request.setCharacterEncoding("utf-8"); + response.setCharacterEncoding("utf-8"); + response.addHeader("Content-type", "text/json;charset=utf-8"); + PrintWriter out = response.getWriter(); + } + + private Response query(HttpServletRequest request) { + try (Session s = SQLCore.sf.openSession()) { + // TODO: 2015/12/5 TICKET QUERY + } catch (HibernateException e) { + + } + return null; + } + +} diff --git a/src/main/java/love/sola/netsupport/api/Register.java b/src/main/java/love/sola/netsupport/api/Register.java index 9a16ad1..748fe23 100644 --- a/src/main/java/love/sola/netsupport/api/Register.java +++ b/src/main/java/love/sola/netsupport/api/Register.java @@ -12,7 +12,6 @@ import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; -import java.io.PrintWriter; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; @@ -32,27 +31,31 @@ public class Register extends HttpServlet { public static final String STUDENT_ID_REGEX = "^(2010|2012|2013|2014|2015)[0-9]{9}$"; public static final String PHONE_NUMBER_REGEX = "^1[34578][0-9]{9}$"; + public static final String REDIRECT_PAGE = "http://topaz.sinaapp.com/nm/result.html?"; + protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.setCharacterEncoding("utf-8"); response.setCharacterEncoding("utf-8"); response.addHeader("Content-type", "text/plain;charset=utf-8"); - PrintWriter out = response.getWriter(); ISP isp = checkISP(request.getParameter("isp")); Block block = checkBlock(request.getParameter("block")); - out.println( - register( - checkStudentId(request.getParameter("sid")), - request.getParameter("name"), - isp, - checkNetAccount(request.getParameter("username"), isp), - block, - checkRoom(request.getParameter("room"), block), - checkPhoneNumber(request.getParameter("phone")), - checkWechat(request.getParameter("wechatid")) + String result = register( + checkStudentId(request.getParameter("sid")), + request.getParameter("name"), + isp, + checkNetAccount(request.getParameter("username"), isp), + block, + checkRoom(request.getParameter("room"), block), + checkPhoneNumber(request.getParameter("phone")), + checkWechat(request.getParameter("wechatid")) + ); + response.sendRedirect( + response.encodeRedirectURL(REDIRECT_PAGE + + "msg=" + result + "" + + "&type=" + (result.equals("Register_Success") ? 1 : 0) ) ); - out.close(); } @SuppressWarnings("Duplicates") @@ -60,31 +63,35 @@ public class Register extends HttpServlet { request.setCharacterEncoding("utf-8"); response.setCharacterEncoding("utf-8"); response.addHeader("Content-type", "text/plain;charset=utf-8"); - PrintWriter out = response.getWriter(); - out.println(lang("Illegal_Request")); - out.close(); + response.sendRedirect( + response.encodeRedirectURL(REDIRECT_PAGE + + "msg=" + lang("Illegal_Request") + + "&type=-1" + ) + ); } private String register(long sid, String name, ISP isp, String netAccount, Block block, int room, long phone, String wechat) { - if (wechat == null) return lang("Illegal_Request"); - if (sid == -1) return lang("Invalid_Student_Id"); - if (name == null) return lang("Invalid_Name"); - if (isp == null) return lang("Invalid_ISP"); - if (netAccount == null) return lang("Invalid_Account"); - if (block == null) return lang("Invalid_Block"); - if (room == -1) return lang("Invalid_Room"); - if (phone == -1) return lang("Invalid_Phone_Number"); + if (wechat == null) return "Illegal_Request"; + if (sid == -1) return "Invalid_Student_Id"; + if (name == null) return "Invalid_Name"; + if (isp == null) return "Invalid_ISP"; + if (netAccount == null) return "Invalid_Account"; + if (block == null) return "Invalid_Block"; + if (room == -1) return "Invalid_Room"; + if (phone == -1) return "Invalid_Phone_Number"; User user = TableUser.getUserById(sid); - if (user == null) return lang("Invalid_Student_Id"); - if (!user.getName().equals(name)) return lang("Invalid_Name"); - if (user.getWechatId() != null) return lang("User_Already_Registered"); + if (user == null) return "Invalid_Student_Id"; + if (!user.getName().equals(name)) return "Invalid_Name"; + if (user.getWechatId() != null) return "User_Already_Registered"; user.setIsp(isp); user.setNetAccount(netAccount); user.setBlock(block); user.setRoom(room); user.setPhone(phone); user.setWechatId(wechat); - return lang("Register_Success"); + TableUser.updateUser(user); + return "Register_Success"; } @@ -150,7 +157,7 @@ public class Register extends HttpServlet { private String checkWechat(String wechat) { if (wechat == null) return null; Long l = authorized.remove(wechat); - return l == null ? null : l < System.currentTimeMillis() - Settings.I.User_Register_Timeout ? null : wechat; + return l == null ? null : l < System.currentTimeMillis() - Settings.I.User_Register_Timeout * 1000 ? null : wechat; } } diff --git a/src/main/java/love/sola/netsupport/api/Response.java b/src/main/java/love/sola/netsupport/api/Response.java index 2b35281..4f09d6f 100644 --- a/src/main/java/love/sola/netsupport/api/Response.java +++ b/src/main/java/love/sola/netsupport/api/Response.java @@ -38,6 +38,7 @@ public class Response { ILLEGAL_PARAMETER(-2), AUTHORIZE_FAILED(-9), USER_NOT_FOUND(-11), + REQUEST_EXPIRED(-21), ; private static final Map ID_MAP = new HashMap<>(); diff --git a/src/main/java/love/sola/netsupport/enums/BlockConverter.java b/src/main/java/love/sola/netsupport/enums/BlockConverter.java new file mode 100644 index 0000000..7061bfa --- /dev/null +++ b/src/main/java/love/sola/netsupport/enums/BlockConverter.java @@ -0,0 +1,25 @@ +package love.sola.netsupport.enums; + +import javax.persistence.AttributeConverter; +import javax.persistence.Converter; + +@Converter +public class BlockConverter implements AttributeConverter { + + @Override + public Integer convertToDatabaseColumn(Block attribute) { + if (attribute == null) { + return null; + } + return attribute.id; + } + + @Override + public Block convertToEntityAttribute(Integer dbData) { + if (dbData == null) { + return null; + } + return Block.fromId(dbData); + } + +} \ No newline at end of file diff --git a/src/main/java/love/sola/netsupport/enums/ISPConverter.java b/src/main/java/love/sola/netsupport/enums/ISPConverter.java new file mode 100644 index 0000000..edec58b --- /dev/null +++ b/src/main/java/love/sola/netsupport/enums/ISPConverter.java @@ -0,0 +1,25 @@ +package love.sola.netsupport.enums; + +import javax.persistence.AttributeConverter; +import javax.persistence.Converter; + +@Converter +public class ISPConverter implements AttributeConverter { + + @Override + public Integer convertToDatabaseColumn(ISP attribute) { + if (attribute == null) { + return null; + } + return attribute.id; + } + + @Override + public ISP convertToEntityAttribute(Integer dbData) { + if (dbData == null) { + return null; + } + return ISP.fromId(dbData); + } + +} \ No newline at end of file diff --git a/src/main/java/love/sola/netsupport/pojo/Ticket.java b/src/main/java/love/sola/netsupport/pojo/Ticket.java new file mode 100644 index 0000000..9bc1b34 --- /dev/null +++ b/src/main/java/love/sola/netsupport/pojo/Ticket.java @@ -0,0 +1,38 @@ +package love.sola.netsupport.pojo; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import javax.persistence.*; +import java.util.Date; + +/** + * *********************************************** + * Created by Sola on 2015/12/2. + * Don't modify this source without my agreement + * *********************************************** + */ +@Data +@AllArgsConstructor +@NoArgsConstructor +@Entity +@Table(name = "tickets") +public class Ticket { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private int id; + @ManyToOne(optional = false) + @JoinColumn(name = "sid") + private User user; + private String description; + private Date submitTime; + private String remark; + private Date updateTime; + @ManyToOne(optional = true) + @JoinColumn(name = "opsid") + private User operator; + private int status; + +} diff --git a/src/main/java/love/sola/netsupport/pojo/User.java b/src/main/java/love/sola/netsupport/pojo/User.java index a962faa..275b379 100644 --- a/src/main/java/love/sola/netsupport/pojo/User.java +++ b/src/main/java/love/sola/netsupport/pojo/User.java @@ -2,8 +2,13 @@ package love.sola.netsupport.pojo; import lombok.AllArgsConstructor; import lombok.Data; +import lombok.NoArgsConstructor; import love.sola.netsupport.enums.Block; +import love.sola.netsupport.enums.BlockConverter; import love.sola.netsupport.enums.ISP; +import love.sola.netsupport.enums.ISPConverter; + +import javax.persistence.*; /** * *********************************************** @@ -13,15 +18,25 @@ import love.sola.netsupport.enums.ISP; */ @Data @AllArgsConstructor +@NoArgsConstructor +@Entity +@Table(name = "users") public class User { - private final long id; - private final String name; + @Id + @Column(name = "id", updatable = false, nullable = false) + private long id; + @Column(name = "name", updatable = false, nullable = false) + private String name; + @Convert(converter = ISPConverter.class) private ISP isp; + @Column(name = "netaccount") private String netAccount; + @Column(name = "wechat") private String wechatId; + @Convert(converter = BlockConverter.class) private Block block; - private int room; - private long phone; + private Integer room; + private Long phone; } diff --git a/src/main/java/love/sola/netsupport/sql/SQLCore.java b/src/main/java/love/sola/netsupport/sql/SQLCore.java index 2869529..2b018b2 100644 --- a/src/main/java/love/sola/netsupport/sql/SQLCore.java +++ b/src/main/java/love/sola/netsupport/sql/SQLCore.java @@ -1,6 +1,10 @@ package love.sola.netsupport.sql; import com.google.gson.Gson; +import org.hibernate.SessionFactory; +import org.hibernate.boot.MetadataSources; +import org.hibernate.boot.registry.StandardServiceRegistryBuilder; +import org.hibernate.service.ServiceRegistry; import javax.naming.InitialContext; import javax.sql.DataSource; @@ -15,12 +19,17 @@ public class SQLCore { public static DataSource ds; public static Gson gson = new Gson(); + public static SessionFactory sf; + public static ServiceRegistry sr; static { try { InitialContext ic = new InitialContext(); ds = (DataSource) ic.lookup("java:comp/env/jdbc/netsupport"); ds.setLoginTimeout(3); + + sr = new StandardServiceRegistryBuilder().configure().build(); + sf = new MetadataSources(sr).buildMetadata().buildSessionFactory(); } catch (Exception e) { e.printStackTrace(); } diff --git a/src/main/java/love/sola/netsupport/sql/TableUser.java b/src/main/java/love/sola/netsupport/sql/TableUser.java index ad9fc36..428baad 100644 --- a/src/main/java/love/sola/netsupport/sql/TableUser.java +++ b/src/main/java/love/sola/netsupport/sql/TableUser.java @@ -1,19 +1,9 @@ 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.enums.Block; -import love.sola.netsupport.enums.ISP; import love.sola.netsupport.pojo.User; - -import java.sql.Connection; -import java.sql.PreparedStatement; -import java.sql.ResultSet; -import java.sql.SQLException; -import java.util.concurrent.ExecutionException; -import java.util.concurrent.TimeUnit; +import org.hibernate.HibernateException; +import org.hibernate.Session; +import org.hibernate.criterion.Restrictions; /** * *********************************************** @@ -33,160 +23,44 @@ 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) { - if (id < 0) return null; - try { - return cache_id.get(id); - } catch (ExecutionException e) { - return null; + try (Session s = sf.openSession()) { + return s.get(User.class, id); + } catch (HibernateException e) { + e.printStackTrace(); } + return null; } + public static User getUserByWechat(String wechat) { - if (wechat == null) return null; - try { - return cache_wechat.get(wechat); - } catch (ExecutionException e) { - return null; + try (Session s = sf.openSession()) { + return (User) s.createCriteria(User.class).add(Restrictions.eq(COLUMN_WECHAT, wechat)).uniqueResult(); + } catch (HibernateException e) { + e.printStackTrace(); } + return null; } public static User getUserByName(String name) { - if (name == null) return null; - User u = getUserByName0(name); - if (u != null) { - cache_id.put(u.getId(), u); - if (u.getWechatId()!=null) cache_wechat.put(u.getWechatId(), u); + try (Session s = sf.openSession()) { + return (User) s.createCriteria(User.class).add(Restrictions.eq(COLUMN_NAME, name)).uniqueResult(); + } catch (HibernateException e) { + e.printStackTrace(); } - return u; + return null; } public static int updateUser(User user) { - int r = updateUser0(user); - if (r > 0) { - cache_id.put(user.getId(), user); - if (user.getWechatId() != null) cache_wechat.put(user.getWechatId(), user); - } - return r; - } - - private static LoadingCache cache_id = CacheBuilder.newBuilder() - .concurrencyLevel(4) - .maximumSize(2048) - .expireAfterAccess(Settings.I.User_Caching_Time, TimeUnit.SECONDS) - .build(new IdLoader()); - - private static LoadingCache cache_wechat = CacheBuilder.newBuilder() - .concurrencyLevel(4) - .maximumSize(2048) - .expireAfterAccess(Settings.I.User_Caching_Time, TimeUnit.SECONDS) - .build(new WechatLoader()); - - - private static class IdLoader extends CacheLoader { - @Override - public User load(Long key) throws Exception { - User u = getUserById0(key); - System.out.println("Queried user: " + u); - if (u == null) throw new UserNotFoundException(); - if (u.getWechatId() != null) cache_wechat.put(u.getWechatId(), u); - return u; - } - } - - private static class WechatLoader extends CacheLoader { - @Override - public User load(String key) throws Exception { - User u = getUserByWechat0(key); - System.out.println("Queried user: " + u); - if (u == null) throw new UserNotFoundException(); - cache_id.put(u.getId(), u); - return u; - } - } - - public static class UserNotFoundException extends Exception { } - - - private static User getUserById0(long id) { - try (Connection conn = ds.getConnection()) { - PreparedStatement ps = conn.prepareStatement("SELECT * FROM user_info WHERE id=?"); - ps.setLong(1, id); - ResultSet rs = ps.executeQuery(); - if (rs.next()) { - return constructUser(rs); - } - } catch (SQLException e) { - e.printStackTrace(); - } - return null; - } - - - private static User getUserByWechat0(String wechat) { - try (Connection conn = ds.getConnection()) { - PreparedStatement ps = conn.prepareStatement("SELECT * FROM user_info WHERE wechat=?"); - ps.setString(1, wechat); - ResultSet rs = ps.executeQuery(); - if (rs.next()) { - return constructUser(rs); - } - } catch (SQLException e) { - e.printStackTrace(); - } - return null; - } - - private static User getUserByName0(String name) { - try (Connection conn = ds.getConnection()) { - PreparedStatement ps = conn.prepareStatement("SELECT * FROM user_info WHERE name=?"); - ps.setString(1, name); - ResultSet rs = ps.executeQuery(); - if (rs.next()) { - return constructUser(rs); - } - } catch (SQLException e) { - e.printStackTrace(); - } - return null; - } - - private static int updateUser0(User user) { - try (Connection conn = ds.getConnection()) { - PreparedStatement ps = conn.prepareStatement("UPDATE user_info SET " + - COLUMN_WECHAT + "=?," + - COLUMN_ISP + "=?," + - COLUMN_NET_ACCOUNT + "=?," + - COLUMN_BLOCK + "=?," + - COLUMN_ROOM + "=?," + - COLUMN_PHONE + "=? " + - "WHERE id=?"); - ps.setString(1, user.getWechatId()); - ps.setInt(2, user.getIsp().id); - ps.setString(3, user.getNetAccount()); - ps.setInt(4, user.getBlock().id); - ps.setInt(5, user.getRoom()); - ps.setLong(6, user.getPhone()); - ps.setLong(7, user.getId()); - return ps.executeUpdate(); - } catch (SQLException e) { + try (Session s = sf.openSession()) { + s.beginTransaction(); + s.update(user); + s.getTransaction().commit(); + return 1; + } catch (HibernateException e) { e.printStackTrace(); } return -1; } - private static User constructUser(ResultSet rs) throws SQLException { - return new User( - rs.getLong(COLUMN_ID), - rs.getString(COLUMN_NAME), - ISP.fromId(rs.getInt(COLUMN_ISP)), - rs.getString(COLUMN_NET_ACCOUNT), - rs.getString(COLUMN_WECHAT), - Block.fromId(rs.getInt(COLUMN_BLOCK)), - rs.getInt(COLUMN_ROOM), - rs.getInt(COLUMN_PHONE) - ); - } - } diff --git a/src/main/java/love/sola/netsupport/util/JsonP.java b/src/main/java/love/sola/netsupport/util/JsonP.java new file mode 100644 index 0000000..a04b802 --- /dev/null +++ b/src/main/java/love/sola/netsupport/util/JsonP.java @@ -0,0 +1,21 @@ +package love.sola.netsupport.util; + +import javax.servlet.http.HttpServletRequest; + +/** + * *********************************************** + * Created by Sola on 2015/12/3. + * Don't modify this source without my agreement + * *********************************************** + */ +public class JsonP { + + public static String parse(HttpServletRequest request, String json) { + String jsonp = request.getParameter("jsonp"); + if (jsonp == null || jsonp.isEmpty()) + return json; + else + return jsonp.replace("{0}", json); + } + +} diff --git a/src/main/java/love/sola/netsupport/wechat/Command.java b/src/main/java/love/sola/netsupport/wechat/Command.java index a654b25..0f4d457 100644 --- a/src/main/java/love/sola/netsupport/wechat/Command.java +++ b/src/main/java/love/sola/netsupport/wechat/Command.java @@ -3,6 +3,8 @@ package love.sola.netsupport.wechat; import java.util.HashMap; import java.util.Map; +import static love.sola.netsupport.config.Lang.lang; + /** * *********************************************** * Created by Sola on 2015/11/26. @@ -11,7 +13,8 @@ import java.util.Map; */ public enum Command { - REGISTER(0, "Register", ".*"), + REGISTER(0, ".*"), + QUERY(1, "Query"), ; private static final Map ID_MAP = new HashMap<>(); @@ -28,8 +31,8 @@ public enum Command { public final String regex; public final int id; - Command(int id, String name, String regex) { - this.name = name; + Command(int id, String regex) { + this.name = lang("CMD_" + name()); this.id = id; this.regex = regex; } diff --git a/src/main/resources/hibernate.cfg.xml b/src/main/resources/hibernate.cfg.xml new file mode 100644 index 0000000..d6a6103 --- /dev/null +++ b/src/main/resources/hibernate.cfg.xml @@ -0,0 +1,45 @@ + + + + + + + + + + + java:comp/env/jdbc/netsupport + + + + + + + + + + org.hibernate.dialect.MySQL5InnoDBDialect + + + org.hibernate.cache.internal.NoCacheProvider + + + true + + + validate + + + + + + + + \ No newline at end of file diff --git a/src/main/webapp/WEB-INF/web.xml b/src/main/webapp/WEB-INF/web.xml index 11e1fee..8dc1b11 100644 --- a/src/main/webapp/WEB-INF/web.xml +++ b/src/main/webapp/WEB-INF/web.xml @@ -12,69 +12,15 @@ If you have any problem, please contact loli@sola.love . - - - - - - - - + + index + + + /index + - 30 + 10 \ No newline at end of file diff --git a/src/main/webapp/favicon.ico b/src/main/webapp/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..4f4fc1c69159b3e5226bfb582917cf840707725b GIT binary patch literal 67646 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 WN8p$Hi9n8C*fQZ$zUK4a9QXnr(DdB^ literal 0 HcmV?d00001 diff --git a/src/test/java/love/sola/netsupport/wechat/TestDate.java b/src/test/java/love/sola/netsupport/wechat/TestDate.java new file mode 100644 index 0000000..798cddf --- /dev/null +++ b/src/test/java/love/sola/netsupport/wechat/TestDate.java @@ -0,0 +1,20 @@ +package love.sola.netsupport.wechat; + +import org.junit.Test; + +import java.util.Date; + +/** + * *********************************************** + * Created by Sola on 2015/12/3. + * Don't modify this source without my agreement + * *********************************************** + */ +public class TestDate { + + @Test + public void test() { + System.out.println(new Date()); + } + +} diff --git a/src/test/java/love/sola/netsupport/wechat/TestGson.java b/src/test/java/love/sola/netsupport/wechat/TestGson.java deleted file mode 100644 index c86691e..0000000 --- a/src/test/java/love/sola/netsupport/wechat/TestGson.java +++ /dev/null @@ -1,25 +0,0 @@ -package love.sola.netsupport.wechat; - -import com.google.gson.Gson; -import love.sola.netsupport.config.Settings; - -/** - * *********************************************** - * Created by Sola on 2015/11/26. - * Don't modify this source without my agreement - * *********************************************** - */ -public class TestGson { - -// @Test - public void testGson() { - Gson gson = new Gson(); - Settings settings = new Settings(); - settings.Wechat_AppId = "*"; - settings.Wechat_Secret = "*"; - settings.Wechat_Token = "*"; - settings.Wechat_AesKey = "*"; - System.out.println(gson.toJson(settings)); - } - -} diff --git a/src/test/java/love/sola/netsupport/wechat/TestMessageFormat.java b/src/test/java/love/sola/netsupport/wechat/TestMessageFormat.java index d738f5a..cc8af5f 100644 --- a/src/test/java/love/sola/netsupport/wechat/TestMessageFormat.java +++ b/src/test/java/love/sola/netsupport/wechat/TestMessageFormat.java @@ -18,4 +18,11 @@ public class TestMessageFormat { System.out.println(format.format(new Object[]{"wechatid"})); } + @Test + public void testJsonp() { + String jsonp = "...{0}..."; + MessageFormat format = new MessageFormat(jsonp); + System.out.println(format.format(new Object[]{"{SomeData}"})); + } + }