diff --git a/build/web/WEB-INF/classes/controller/ControllerAdmin.class b/build/web/WEB-INF/classes/controller/ControllerAdmin.class index 876f1ed..a8abf7f 100644 Binary files a/build/web/WEB-INF/classes/controller/ControllerAdmin.class and b/build/web/WEB-INF/classes/controller/ControllerAdmin.class differ diff --git a/build/web/WEB-INF/classes/dao/DaoAdmin.class b/build/web/WEB-INF/classes/dao/DaoAdmin.class index c041c3b..45f7a85 100644 Binary files a/build/web/WEB-INF/classes/dao/DaoAdmin.class and b/build/web/WEB-INF/classes/dao/DaoAdmin.class differ diff --git a/build/web/WEB-INF/classes/service/ServiceAdmin.class b/build/web/WEB-INF/classes/service/ServiceAdmin.class index a998bc1..eb69037 100644 Binary files a/build/web/WEB-INF/classes/service/ServiceAdmin.class and b/build/web/WEB-INF/classes/service/ServiceAdmin.class differ diff --git a/build/web/WEB-INF/lib/servlet-api.jar b/build/web/WEB-INF/lib/servlet-api.jar new file mode 100644 index 0000000..e932e46 Binary files /dev/null and b/build/web/WEB-INF/lib/servlet-api.jar differ diff --git a/build/web/profile.jsp b/build/web/profile.jsp index 78cf23b..f826d5c 100644 --- a/build/web/profile.jsp +++ b/build/web/profile.jsp @@ -3,139 +3,174 @@ <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> -<% Admin admin=(Admin)request.getSession().getAttribute("admin"); %> +<% Admin admin = (Admin) request.getSession().getAttribute("admin"); %> - - - - -
- - - - - - -
- -
- -
-
-

+ + + +
- Thông tin admin -

- + + + + + +
-
- - - - Hello admin -
-
+ x-show="isSideMenuOpen" + x-transition:enter="transition ease-in-out duration-150" + x-transition:enter-start="opacity-0" + x-transition:enter-end="opacity-100" + x-transition:leave="transition ease-in-out duration-150" + x-transition:leave-start="opacity-100" + x-transition:leave-end="opacity-0" + class="fixed inset-0 z-10 flex items-end bg-black bg-opacity-50 sm:items-center sm:justify-center" + >
- -

- Thông Admin -

-
- - -
- - - - - - - - -
-
-
- -
- - - +
+ +
+
+

+ Thông tin admin +

+ +
+
+ + + + Hello admin +
+
+ + +

+ Thông Admin +

+
+ + +
+ + + + + + + + +
+
+
+
+
+ + + diff --git a/dist/Web_Manager_Movie.war b/dist/Web_Manager_Movie.war index bd3ba58..dc3371e 100644 Binary files a/dist/Web_Manager_Movie.war and b/dist/Web_Manager_Movie.war differ diff --git a/nbproject/build-impl.xml b/nbproject/build-impl.xml index b390138..a1a34c5 100644 --- a/nbproject/build-impl.xml +++ b/nbproject/build-impl.xml @@ -1002,6 +1002,7 @@ exists or setup the property manually. For example like this: + @@ -1011,6 +1012,7 @@ exists or setup the property manually. For example like this: + diff --git a/nbproject/genfiles.properties b/nbproject/genfiles.properties index 83be17c..d60638f 100644 --- a/nbproject/genfiles.properties +++ b/nbproject/genfiles.properties @@ -1,8 +1,8 @@ -build.xml.data.CRC32=8bb65f3e +build.xml.data.CRC32=e68b8979 build.xml.script.CRC32=acb420a6 build.xml.stylesheet.CRC32=651128d4@1.77.1.1 # This file is used by a NetBeans-based IDE to track changes in generated files such as build-impl.xml. # Do not edit this file. You may delete it but then the IDE will never regenerate such files for you. -nbproject/build-impl.xml.data.CRC32=8bb65f3e -nbproject/build-impl.xml.script.CRC32=0c946073 +nbproject/build-impl.xml.data.CRC32=e68b8979 +nbproject/build-impl.xml.script.CRC32=7fbb2f00 nbproject/build-impl.xml.stylesheet.CRC32=99ea4b56@1.77.1.1 diff --git a/nbproject/private/private.properties b/nbproject/private/private.properties index e9e3232..b75af10 100644 --- a/nbproject/private/private.properties +++ b/nbproject/private/private.properties @@ -1,5 +1,5 @@ deploy.ant.properties.file=C:\\Users\\gaone\\AppData\\Roaming\\NetBeans\\8.2\\tomcat80.properties -j2ee.server.home=D:/School/nam4/DoAnChuyenNganh/apache-tomcat-8.5.66 -j2ee.server.instance=tomcat80:home=D:\\School\\nam4\\DoAnChuyenNganh\\apache-tomcat-8.5.66 +j2ee.server.home=C:/apache-tomcat-8.5.66 +j2ee.server.instance=tomcat80:home=C:\\apache-tomcat-8.5.66 selected.browser=Chrome.INTEGRATED user.properties.file=C:\\Users\\gaone\\AppData\\Roaming\\NetBeans\\8.2\\build.properties diff --git a/nbproject/private/private.xml b/nbproject/private/private.xml index 97afc4f..8211d05 100644 --- a/nbproject/private/private.xml +++ b/nbproject/private/private.xml @@ -3,8 +3,8 @@ - file:/D:/School/nam4/DoAnChuyenNganh/Web_Manager_Movie/web/profile.jsp file:/D:/School/nam4/DoAnChuyenNganh/Web_Manager_Movie/src/java/controller/ControllerAdmin.java + file:/D:/School/nam4/DoAnChuyenNganh/Web_Manager_Movie/src/java/dao/DaoAdmin.java diff --git a/nbproject/project.properties b/nbproject/project.properties index 1941363..ffe484d 100644 --- a/nbproject/project.properties +++ b/nbproject/project.properties @@ -29,6 +29,7 @@ endorsed.classpath=\ ${libs.javaee-endorsed-api-7.0.classpath} excludes= file.reference.commons-lang3-3.11.jar=src\\java\\lib\\commons-lang3-3.11.jar +file.reference.servlet-api.jar=..\\servlet-api.jar includes=** j2ee.compile.on.save=true j2ee.copy.static.files.on.save=true @@ -42,7 +43,8 @@ javac.classpath=\ ${libs.MySQLDriver.classpath}:\ ${libs.hibernate4-support.classpath}:\ ${libs.jpa2-persistence.classpath}:\ - ${file.reference.commons-lang3-3.11.jar} + ${file.reference.commons-lang3-3.11.jar}:\ + ${file.reference.servlet-api.jar} # Space-separated list of extra javac options javac.compilerargs= javac.debug=true diff --git a/nbproject/project.xml b/nbproject/project.xml index 3c49cc5..1ccb396 100644 --- a/nbproject/project.xml +++ b/nbproject/project.xml @@ -26,6 +26,10 @@ ${file.reference.commons-lang3-3.11.jar} WEB-INF/lib + + ${file.reference.servlet-api.jar} + WEB-INF/lib + diff --git a/src/java/controller/ControllerAdmin.java b/src/java/controller/ControllerAdmin.java index b2d7e3e..985f160 100644 --- a/src/java/controller/ControllerAdmin.java +++ b/src/java/controller/ControllerAdmin.java @@ -19,6 +19,7 @@ import javax.servlet.http.HttpSession; import model.Admin; import org.apache.commons.lang3.StringUtils; +import org.apache.commons.lang3.math.NumberUtils; import org.apache.commons.lang3.text.WordUtils; import regex.Regex; import service.ServiceAdmin; @@ -38,175 +39,199 @@ protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { processRequest(request, response); } + @Override protected void doPost(HttpServletRequest request, HttpServletResponse response) - throws ServletException, IOException { + throws ServletException, IOException { response.setContentType("text/html;charset=UTF-8"); response.setCharacterEncoding("UTF-8"); request.setCharacterEncoding("UTF-8"); - String page=request.getParameter("form"); - response.getWriter().write(page); - switch(page){ + String page = request.getParameter("form"); + switch (page) { case "login": - login(request,response); + login(request, response); break; case "register": - register(request,response); + register(request, response); break; - case "update": - try { - update(request,response); - } catch (ParseException ex) { - Logger.getLogger(ControllerAdmin.class.getName()).log(Level.SEVERE, null, ex); - } + case "update": + try { + update(request, response); + } catch (ParseException ex) { + Logger.getLogger(ControllerAdmin.class.getName()).log(Level.SEVERE, null, ex); + } break; default: break; - } - } - @Override - public String getServletInfo() { - return "Short description"; + } } - - - protected void login(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{ - - String username=request.getParameter("username"); - String password=request.getParameter("password"); - boolean checkUsername=Regex.checkGmail(username); - boolean checkPassword=Regex.checkPassWord(password); - if(checkUsername==false||checkPassword==false){ - request.setAttribute("errorLogin", "errorlogin"); - request.getRequestDispatcher("index.jsp").forward(request, response); - }else{ - Admin admin=new ServiceAdmin().checkLogin(username, password); - if(admin==null){ - request.setAttribute("errorLogin", "errorlogin"); - request.getRequestDispatcher("index.jsp").forward(request, response); - }else{ - HttpSession session=request.getSession(true); - session.setAttribute("admin", admin); - response.sendRedirect(request.getContextPath()+"/ControllerPage?page=home"); - } - } + + protected void login(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { + + String username = request.getParameter("username"); + String password = request.getParameter("password"); + boolean checkUsername = Regex.checkGmail(username); + boolean checkPassword = Regex.checkPassWord(password); + if (checkUsername == false || checkPassword == false) { + request.setAttribute("errorLogin", "errorlogin"); + request.getRequestDispatcher("index.jsp").forward(request, response); + } else { + Admin admin = new ServiceAdmin().checkLogin(username, password); + if (admin == null) { + request.setAttribute("errorLogin", "errorlogin"); + request.getRequestDispatcher("index.jsp").forward(request, response); + } else { + HttpSession session = request.getSession(true); + session.setAttribute("admin", admin); + response.sendRedirect(request.getContextPath() + "/ControllerPage?page=home"); + } + } } - - protected void register(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{ - String fullname=request.getParameter("fullname"); - String username=request.getParameter("username"); - String password=request.getParameter("password"); - String rePassword=request.getParameter("returnpassword"); - - boolean checkFullname=checkFullName(request,response,fullname); - boolean checkGmail=checkGmail(request,response,username); - boolean checkPassword=checkPassword(request,response,password,rePassword); - - if(checkFullname&&checkGmail&&checkPassword){ - saveAdmin(fullname,username,password); + + protected void register(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { + String fullname = request.getParameter("fullname"); + String username = request.getParameter("username"); + String password = request.getParameter("password"); + String rePassword = request.getParameter("returnpassword"); + + boolean checkFullname = checkFullName(request, response, fullname); + boolean checkGmail = checkGmail(request, response, username); + boolean checkPassword = checkPassword(request, response, password, rePassword); + + if (checkFullname && checkGmail && checkPassword) { + saveAdmin(fullname, username, password); request.setAttribute("username", username); request.setAttribute("password", password); request.getRequestDispatcher("index.jsp").forward(request, response); - }else{ - if(checkFullname){ - request.setAttribute("fullname", fullname); + } else { + if (checkFullname) { + request.setAttribute("fullname", fullname); } - if(checkGmail){ - request.setAttribute("username", username); + if (checkGmail) { + request.setAttribute("username", username); } request.getRequestDispatcher("createaccount.jsp").forward(request, response); } - - } - - protected void update(HttpServletRequest request, HttpServletResponse response ) throws ServletException, IOException, ParseException{ - int id=Integer.parseInt(request.getParameter("id")); - String fullname=request.getParameter("fullname"); - SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd"); - Date birthday=formatter.parse(request.getParameter("birthday")); - int numberPhone=Integer.parseInt(request.getParameter("numberphone")); - String gmail=request.getParameter("gmail"); - String oldPassword=request.getParameter("oldpassword"); - String newPassword=request.getParameter("newpassword"); - - - response.getWriter().write(id); - response.getWriter().write("
"); - response.getWriter().write(fullname); - response.getWriter().write("
"); - response.getWriter().write(String.valueOf(birthday)); - response.getWriter().write("
"); - response.getWriter().write(numberPhone); - response.getWriter().write("
"); - response.getWriter().write(oldPassword); - response.getWriter().write("
"); - response.getWriter().write(newPassword); - - - boolean checkFullname= checkFullName(request,response,fullname); - boolean checkGmail=checkGmail(request,response,gmail); - boolean checkPassword=changePassword(request,response,id,oldPassword,newPassword); - + + } + + protected void update(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException, ParseException { + int id = Integer.parseInt(request.getParameter("id")); + String fullName = request.getParameter("fullname"); + String gmail = request.getParameter("gmail"); + String oldPassword = request.getParameter("oldpassword"); + String newPassword = request.getParameter("newpassword"); + String numberPhone = request.getParameter("numberphone"); + + //Đoạn code sau dụng để ép kiểu sang ngày nếu có lỗi sẽ gửi về 1 lỗi errorDate thông báo errorDate + Date birthday = new Date(); + try { + SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd"); + birthday = formatter.parse(request.getParameter("birthday")); + } catch (Exception ex) { + request.setAttribute("errorDate", "errorDate"); + } + //// + + boolean checkNumberPhone = checkPhoneNumber(request, response, numberPhone); + boolean checkFullname = checkFullName(request, response, fullName); + boolean checkGmail = changeMail(request, response, gmail); + boolean checkPassword = changePassword(request, response, id, oldPassword, newPassword); + + if (request.getAttributeNames().hasMoreElements()) { + request.getRequestDispatcher("profile.jsp").forward(request, response); + } else { + response.getWriter().write("thanh cong"); + new ServiceAdmin().update(id, fullName, newPassword, birthday, gmail, Integer.parseInt(numberPhone)); + Admin admin = new ServiceAdmin().findById(id); + HttpSession session = request.getSession(true); + session.removeAttribute("admin"); + session.setAttribute("admin", admin); + request.getRequestDispatcher("profile.jsp").forward(request, response); + } } - - + + //dùng để checknumberphone nếu number là 1 có chuỗi thì trả về 1 lỗi errorNumberPhone thông báo errornumberphone + protected boolean checkPhoneNumber(HttpServletRequest request, HttpServletResponse response, String numberPhone) { + if (NumberUtils.isCreatable(numberPhone) == false) { + request.setAttribute("errorNumberPhone", "errornumberphone"); + return false; + } + return true; + } + //nếu fullname khác với regex fullname sẽ gửi 1 lỗi tên errorFullname với thông báo errorfullname - protected boolean checkFullName(HttpServletRequest request, HttpServletResponse response,String fullname){ - if(Regex.checkFullName(fullname)==false){ - request.setAttribute("errorFullname","errorfullname"); + protected boolean checkFullName(HttpServletRequest request, HttpServletResponse response, String fullname) { + if (Regex.checkFullName(fullname) == false) { + request.setAttribute("errorFullname", "errorfullname"); return false; } return true; - } - + } + //nếu username sai cú pháp sẽ có 1 lỗi tên errorUserName thông báo errorusername gửi về client - protected boolean checkGmail(HttpServletRequest request, HttpServletResponse response,String gmail){ - if(Regex.checkGmail(gmail)==false){ - request.setAttribute("errorUserName","errorusername"); + protected boolean checkGmail(HttpServletRequest request, HttpServletResponse response, String gmail) { + if (Regex.checkGmail(gmail) == false) { + request.setAttribute("errorUserName", "errorusername"); return false; - }else{ - if(new ServiceAdmin().checkUserName(gmail)){ - request.setAttribute("errorExistsUserName","eixtsusername"); + } else { + if (new ServiceAdmin().checkUserName(gmail)) { + request.setAttribute("errorExistsUserName", "eixtsusername"); return false; } } return true; - } - + } + //nếu password khác với returnpassword sẽ gửi 1 lỗi tên errorRePassword thông báo errorreturnpassword //nếu passsword giống retrun và password khác cú pháp Regex password sẽ gửi 1 lỗi tên errorPassword thông báo errorpassword - protected boolean checkPassword(HttpServletRequest request, HttpServletResponse response,String password,String rePassword){ - if(Regex.checkPassWord(password)==false){ - request.setAttribute("errorPassword","errorpassword"); - return false; - }else{ - if(password.equals(rePassword)==false){ - request.setAttribute("errorPassword","errorreturnpassword"); + protected boolean checkPassword(HttpServletRequest request, HttpServletResponse response, String password, String rePassword) { + if (Regex.checkPassWord(password) == false) { + request.setAttribute("errorPassword", "errorpassword"); + return false; + } else { + if (password.equals(rePassword) == false) { + request.setAttribute("errorPassword", "errorreturnpassword"); return false; } - } + } return true; } - + //lưu thông tin đăng ký - protected void saveAdmin(String fullname,String username,String password){ - new ServiceAdmin().add(new Admin(WordUtils.capitalizeFully(fullname),username,password)); + protected void saveAdmin(String fullname, String username, String password) { + new ServiceAdmin().add(new Admin(WordUtils.capitalizeFully(fullname), username, password)); } //Kiểm tra trước khi thay đổi password - protected boolean changePassword(HttpServletRequest request, HttpServletResponse response,int id,String oldPassword,String newPassword){ - boolean checkPassword= new ServiceAdmin().checkPassword(id, oldPassword); - if(checkPassword){ - if(Regex.checkPassWord(oldPassword)){ - return true; + //Mật khẩu cũ sài sẽ gửi 1 lỗi errorPassword thông báo errorpassword + //mật khẩu mới không đúng yêu cầu sẽ gửi 1 lỗi errorNewPassword thông báo errornewpassword + protected boolean changePassword(HttpServletRequest request, HttpServletResponse response, int id, String oldPassword, String newPassword) { + boolean checkPassword = new ServiceAdmin().checkPassword(id, oldPassword); + if (checkPassword) { + if (newPassword.length() > 0) { + if (Regex.checkPassWord(newPassword)) { + return true; + } else { + request.setAttribute("errorNewPassword", "errornewpassword"); + return false; + } }else{ - request.setAttribute("errorPassword","errorpassword"); - return false; + return true; } - }else{ - request.setAttribute("errorPassword","oldpassword"); - return false; + } else { + request.setAttribute("errorPassword", "errorpassword"); + return false; } - } + } + + //kiểm tra mail thay đổi nếu sai quy tắc trả về 1 lỗi errorGmail với thông báo errorgmail + protected boolean changeMail(HttpServletRequest request, HttpServletResponse response, String gmail) { + boolean checkMail = Regex.checkGmail(gmail); + if (checkMail == false) { + request.setAttribute("errorGmail", "errorgmail"); + } + return checkMail; + } } diff --git a/src/java/dao/DaoAdmin.java b/src/java/dao/DaoAdmin.java index 518bd21..89486f2 100644 --- a/src/java/dao/DaoAdmin.java +++ b/src/java/dao/DaoAdmin.java @@ -15,29 +15,32 @@ import imp.ICheckName; import imp.ICheckPassword; import imp.IListName; +import java.util.Date; /** * * @author gaone */ -public class DaoAdmin implements ICheckLogin,IAction,IListName,ICheckName { - private Session session; +public class DaoAdmin implements ICheckLogin, IAction, IListName, ICheckName { + + private Session session; public DaoAdmin(Session session) { this.session = session; } - + @Override public Admin checkLogin(String username, String password) { - List admins=null; + List admins = null; session.beginTransaction(); admins = session.createQuery("from Admin where username=:username").setParameter("username", username).list(); - session.getTransaction().commit(); - if(admins.size()>0&&admins.get(0).getPassword().equals(password)){ - return admins.get(0); + session.getTransaction().commit(); + if (admins.size() > 0 && admins.get(0).getPassword().equals(password)) { + return admins.get(0); } return null; - } + } + @Override public List getAll() { session.beginTransaction(); @@ -49,7 +52,7 @@ public List getAll() { @Override public Admin findById(int id) { session.beginTransaction(); - Admin admin=(Admin) session.get(Admin.class, id); + Admin admin = (Admin) session.get(Admin.class, id); session.getTransaction().commit(); return admin; } @@ -61,7 +64,24 @@ public void delete(Admin object) { @Override public void update(Admin object) { - throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + session.beginTransaction(); + session.update(object); + session.getTransaction().commit(); + session.close(); + } + + public void update(int id, String fullName, String password, Date birthday, String gmail, Integer sdt) { + session.beginTransaction(); + Admin admin = (Admin) session.get(Admin.class, id); + admin.setFullName(fullName); + if(password.length()>0){ + admin.setPassword(password); + } + admin.setBirthday(birthday); + admin.setGmail(gmail); + admin.setSdt(sdt); + session.getTransaction().commit(); + session.close(); } @Override @@ -83,14 +103,15 @@ public List getAllUserName() { // List admins=new DaoAdmin(HibernateMovie.openSession()).getAllUserName(); // System.out.println(admins.toString()); // } + @Override public boolean checkUserName(String username) { - List names=null; + List names = null; session.beginTransaction(); names = session.createQuery("select username from Admin where username=:username").setParameter("username", username).list(); - session.getTransaction().commit(); - if(names.size()==0){ - return false; + session.getTransaction().commit(); + if (names.size() == 0) { + return false; } return true; } diff --git a/src/java/service/ServiceAdmin.java b/src/java/service/ServiceAdmin.java index bff726b..40b210f 100644 --- a/src/java/service/ServiceAdmin.java +++ b/src/java/service/ServiceAdmin.java @@ -14,17 +14,18 @@ import imp.ICheckPassword; import java.util.List; import imp.IListName; +import java.util.Date; /** * * @author gaone */ -public class ServiceAdmin implements ICheckLogin,IAction,IListName,ICheckName,ICheckPassword { - private DaoAdmin daoAdmin; - +public class ServiceAdmin implements ICheckLogin, IAction, IListName, ICheckName, ICheckPassword { + + private DaoAdmin daoAdmin; public ServiceAdmin() { - daoAdmin=new DaoAdmin(HibernateMovie.openSession()); + daoAdmin = new DaoAdmin(HibernateMovie.openSession()); } @Override @@ -52,9 +53,13 @@ public void update(Admin object) { throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. } + public void update(int id, String fullName, String password, Date birthday, String gmail, Integer sdt) { + daoAdmin.update(id, fullName, password, birthday, gmail, sdt); + } + @Override public void add(Admin object) { - daoAdmin.add(object); + daoAdmin.add(object); } @Override @@ -64,13 +69,13 @@ public List getAllUserName() { @Override public boolean checkUserName(String username) { - return daoAdmin.checkUserName(username); + return daoAdmin.checkUserName(username); } @Override public boolean checkPassword(int id, String password) { - Admin admin=findById(id); - if(admin.getPassword().equals(password)){ + Admin admin = findById(id); + if (admin.getPassword().equals(password)) { return true; } return false; diff --git a/web/profile.jsp b/web/profile.jsp index 78cf23b..f826d5c 100644 --- a/web/profile.jsp +++ b/web/profile.jsp @@ -3,139 +3,174 @@ <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> -<% Admin admin=(Admin)request.getSession().getAttribute("admin"); %> +<% Admin admin = (Admin) request.getSession().getAttribute("admin"); %> - - - - -
- - - - - - -
- -
- -
-
-

+ + + +
- Thông tin admin -

- + + + + + +
-
- - - - Hello admin -
-
+ x-show="isSideMenuOpen" + x-transition:enter="transition ease-in-out duration-150" + x-transition:enter-start="opacity-0" + x-transition:enter-end="opacity-100" + x-transition:leave="transition ease-in-out duration-150" + x-transition:leave-start="opacity-100" + x-transition:leave-end="opacity-0" + class="fixed inset-0 z-10 flex items-end bg-black bg-opacity-50 sm:items-center sm:justify-center" + >
- -

- Thông Admin -

-
- - -
- - - - - - - - -
-
-
- -
- - - +
+ +
+
+

+ Thông tin admin +

+ +
+
+ + + + Hello admin +
+
+ + +

+ Thông Admin +

+
+ + +
+ + + + + + + + +
+
+
+
+
+ + +