zoukankan      html  css  js  c++  java
  • 短消息论坛

    一.搭好架构

    1.1导入basedao

    package cn.jbit.demo.dao;
    
    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.PreparedStatement;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    import java.util.List;
    
    import javax.naming.Context;
    import javax.naming.InitialContext;
    import javax.naming.NamingException;
    import javax.sql.DataSource;
    
    public class BaseDao {
    
        protected Connection con = null;
        protected PreparedStatement ps = null;
        protected ResultSet rs = null;
        
        
        public static final String driver="com.mysql.jdbc.Driver";
        public static final String url="jdbc:mysql://localhost:3306/message";
        public static final String username="root";
        public static final String password="1234";
           public void openConnection(){
               try {
                Class.forName(driver);
                 if(con==null||con.isClosed()){
                     con=DriverManager.getConnection(url,username,password);
                 }
                } catch (ClassNotFoundException e) {
                    e.printStackTrace();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
           }
    
        //获取连接
        protected void openConnection2(){
                try {
                    Context ctx = new InitialContext();
                    DataSource ds = (DataSource)ctx.lookup("java:comp/env/jdbc/Message");
                    con = ds.getConnection();
                } catch (NamingException e) {
                    e.printStackTrace();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
        }    
        
        //更新新据库
        public int executeUpdata(String sql, List<Object> list){        
            openConnection();
            try {
                ps = con.prepareStatement(sql);
                if(list == null)
                    return ps.executeUpdate();
                int i = 1;
                for(Object obj:list){
                    ps.setObject(i, obj);
                    i++;
                }
                return ps.executeUpdate();
            } catch (SQLException e) {            
                e.printStackTrace();
            }finally{
                closeResource();
            }
            return 0;
        }
        
        //关闭流
        protected void closeResource(){        
        try {
            if(rs != null)
                rs.close();
            if(ps != null)
                ps.close();
            if(con != null)
                con.close();
            
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        
    }

    二.登录,注册页面

    2.1 UserInfo中的代码:

    package cn.jbit.demo.entity;
    
    public class UserInfo{
    
        private String username = null;//用户名
        private String password = null;//密码
        private String email = null;//电子邮箱
        
        public String getEmail() {
            return email;
        }
        public void setEmail(String email) {
            this.email = email;
        }
        public String getUsername() {
            return username;
        }
        public void setUsername(String username) {
            this.username = username;
        }
        public String getPassword() {
            return password;
        }
        public void setPassword(String password) {
            this.password = password;
        }
    }

    2.2 UserinfoDao

    package cn.jbit.demo.dao;
    
    import java.util.List;
    import java.util.Map;
    
    import cn.jbit.demo.entity.UserInfo;
    
    public interface UserinfoDao {
        //查找用户
        public List<UserInfo> getUsers(Map<String,String> contitions);
        //添加或更新用户
        public int executeUpdate(String operate, UserInfo userinfo);
    }

    2.3 UserinfoDaoImpl

    package cn.jbit.demo.dao.impl;
    
    import java.sql.SQLException;
    import java.util.ArrayList;
    import java.util.List;
    import java.util.Map;
    
    import cn.jbit.demo.dao.BaseDao;
    import cn.jbit.demo.dao.UserinfoDao;
    import cn.jbit.demo.entity.UserInfo;
    
    public class UserinfoDaoImpl extends BaseDao implements UserinfoDao {
        
        //添加或更新用户
        public int executeUpdate(String operate, UserInfo userinfo) {
            List<Object> list = null;
            String sql = null;
            if(operate.equals("update")){
                sql = "update msg_userinfo set password=? where username = '" + userinfo.getUsername() + "'";
                list = new ArrayList<Object>();
                list.add(userinfo.getPassword());
            }else if(operate.equals("insert")){
                sql = "insert into msg_userinfo values(?,?,?)";
                list = new ArrayList<Object>();
                list.add(userinfo.getUsername());
                list.add(userinfo.getPassword());
                list.add(userinfo.getEmail());
            }
            return executeUpdata(sql, list);
        }
    
        //查找用户
        public List<UserInfo> getUsers(Map<String,String> contitions) {
            String username = (String) contitions.get("username");
            String pwd = (String) contitions.get("pwd");
            String operate = (String)contitions.get("operate");
            String sql = "select * from msg_userinfo where 1=1 ";
            if(operate != null && operate.equals("except")){
                sql += username != null ? " and username != '" + username + "'":"";
            }else{
                sql += username != null ? " and username = '" + username + "'":"";
            }
            sql += pwd != null ? " and password = '" + pwd + "'":"";
            openConnection();
            List<UserInfo> users = new ArrayList<UserInfo>();
            try {
                ps = con.prepareStatement(sql);
                rs = ps.executeQuery();
                while(rs.next()){
                    UserInfo uf = new UserInfo();
                    uf.setUsername(rs.getString("username"));
                    uf.setPassword(rs.getString("password"));
                    uf.setEmail(rs.getString("email"));
                    users.add(uf);                
                }
            } catch (SQLException e) {
                e.printStackTrace();
            }finally{
                closeResource();
            }        
            return users;
        }
    }

    2.4  UserInfoBiz

    package cn.jbit.demo.biz;
    
    import java.util.List;
    import java.util.Map;
    
    import cn.jbit.demo.entity.UserInfo;
    
    public interface UserInfoBiz {
        //查找用户
        public List<UserInfo> findUser(Map<String,String> elements);
        //添加或更新用户
        public int doInsertOrUpdateUser(String operate, UserInfo userinfo);
    }

    2.5 UserInfoBizImpl

    package cn.jbit.demo.biz.impl;
    
    import java.util.List;
    import java.util.Map;
    
    import cn.jbit.demo.biz.UserInfoBiz;
    import cn.jbit.demo.dao.UserinfoDao;
    import cn.jbit.demo.dao.impl.UserinfoDaoImpl;
    import cn.jbit.demo.entity.UserInfo;
    
    public class UserInfoBizImpl implements UserInfoBiz {
    
        private UserinfoDao userinfoDao = new UserinfoDaoImpl();
    
        //添加或更新用户
        public int doInsertOrUpdateUser(String operate, UserInfo userinfo) {
            
            return userinfoDao.executeUpdate(operate, userinfo);
        }
    
        //查找用户
        public List<UserInfo> findUser(Map<String,String> elements) {
            
            return userinfoDao.getUsers(elements);
        }
    }

    2.6 UserServlet

    package cn.jbit.demo.web;
    
    import java.io.IOException;
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;
    
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    import cn.jbit.demo.biz.UserInfoBiz;
    import cn.jbit.demo.biz.impl.UserInfoBizImpl;
    import cn.jbit.demo.entity.UserInfo;
    
    public class UserServlet extends HttpServlet {
        private static final long serialVersionUID = 1L;
        public void doGet(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
            doPost(request, response);
        }
        public void doPost(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
            String action = request.getParameter("action");
            UserInfoBiz userInfoBiz=new UserInfoBizImpl();
            if ("login".equals(action)) {//登录
                String username = request.getParameter("username");
                String password = request.getParameter("password");            
                Map<String,String> contitions = new HashMap<String,String>();
                  contitions.put("username", username);
                  contitions.put("pwd", password);
                List <UserInfo>list = userInfoBiz.findUser(contitions);
                if(list == null || list.size() != 1){
                    request.setAttribute("error", "用户名或密码错误!");
                      request.getRequestDispatcher("index.jsp").forward(request,response);    
                }else{
                    request.getSession().setAttribute("loginuser", username);
                    response.sendRedirect("MsgServlet?action=list");
                }  
            }else if("regist".equals(action)){//注册
                String username = request.getParameter("username");
                  String password = request.getParameter("password");
                  String email = request.getParameter("email");              
                  Map<String,String> conditions = new HashMap<String,String>();
                  conditions.put("username", username);
                  List <UserInfo>list = userInfoBiz.findUser(conditions);
                  if(list.size() > 0){                      
                      request.setAttribute("error", "此用户名已被注册");                  
                      request.getRequestDispatcher("register.jsp").forward(request,response);
                  }else{
                      UserInfo uf = new UserInfo();
                      uf.setUsername(username);
                      uf.setPassword(password);
                      uf.setEmail(email);
                      int isRun = userInfoBiz.doInsertOrUpdateUser("insert", uf);
                      if(isRun > 0){
                          request.setAttribute("error", "已经成功注册!");
                          request.getRequestDispatcher("index.jsp").forward(request,response);                      
                      }
                  }
            }else if("logout".equals(action)){//退出
                request.getSession().removeAttribute("loginuser");
                response.sendRedirect("index.jsp");
            }else if("findUsers".equals(action)){//查找其它所有的用户            
                 String username = (String)request.getSession().getAttribute("loginuser");      
                 Map <String,String>contitions = new HashMap<String,String>();
                 contitions.put("username", username);
                 contitions.put("operate","except");
                 List<UserInfo> list = userInfoBiz.findUser(contitions);
                 request.setAttribute("users", list);
                 request.getRequestDispatcher("newMsg.jsp").forward(request,response);
            }
        }
    }

     三.信息页面

    3.1 BBSMessage

    package cn.jbit.demo.entity;
    
    import java.util.Date;
    
    public class BBSMessage{
    
        private String msgid = null;//ID
        private String username = null;//发送方
        private String title = null;//标题
        private String content = null;//内容
        private int state = 0;//用户名
        private String sendto=null;//收件方
        private Date datetime = null;//发送时间
        public String getMsgid() {
            return msgid;
        }
        public void setMsgid(String msgid) {
            this.msgid = msgid;
        }
        public String getUsername() {
            return username;
        }
        public void setUsername(String username) {
            this.username = username;
        }
        public String getTitle() {
            return title;
        }
        public void setTitle(String title) {
            this.title = title;
        }
        public String getContent() {
            return content;
        }
        public void setContent(String content) {
            this.content = content;
        }
        public int getState() {
            return state;
        }
        public void setState(int state) {
            this.state = state;
        }
        public String getSendto() {
            return sendto;
        }
        public void setSendto(String sendto) {
            this.sendto = sendto;
        }
        public Date getDatetime() {
            return datetime;
        }
        public void setDatetime(Date datetime) {
            this.datetime = datetime;
        }
    }

     3.2 BBSMessageDao

    package cn.jbit.demo.dao;
    
    import java.util.List;
    import java.util.Map;
    
    import cn.jbit.demo.entity.BBSMessage;
    
    public interface BBSMessageDao {
        //查询短信息
        public List<BBSMessage>  getMessagesByPage(Map<String,Object> elements);
        //更新短信息
        public int executeUpdate(String operate, Map<String,Object> elements, Map<String,Object> conditions);
        //获取短信条数
        public int getMsgsCount(String username);
    }

    3.3 BBSMessageDaoImpl

    package cn.jbit.demo.dao.impl;
    
    import java.sql.SQLException;
    import java.sql.Timestamp;
    import java.text.SimpleDateFormat;
    import java.util.ArrayList;
    import java.util.Date;
    import java.util.List;
    import java.util.Map;
    
    import cn.jbit.demo.dao.BBSMessageDao;
    import cn.jbit.demo.dao.BaseDao;
    import cn.jbit.demo.entity.BBSMessage;
    
    public class BBSMessageDaoImpl extends BaseDao implements BBSMessageDao {
        /*
         * 执行update操作
         * @param
         *     operate:执行插入、更新还是删除
         *     elements:需要插入或者更新的值集合,key对应column,value是插入或者更新的值
         *     conditions:update执行的条件集合,key对应column,value是条件值
         */
        public int executeUpdate(String operate, Map <String,Object>elements, Map <String,Object>conditions) {
            List<Object> list = null;
            String sql = null;
            String msgid= null ,username= null,title= null,msgcontent= null,state= null,sendto= null;
            Date msg_create_date=null;
            /*
             * 获取需要变更的值
             */
            if(elements!=null && elements.size()>0){
                msgid = (String)elements.get("msgid");
                username = (String)elements.get("username");
                title = (String)elements.get("title");
                msgcontent = (String)elements.get("msgcontent");
                state = (String)elements.get("state");
                sendto = (String)elements.get("sendto");
                msg_create_date = (Date)elements.get("msg_create_date");        
            }
            
            
            
            /*
             * 更新操作
             */
            if(operate.equals("update")){
                /*
                 * 拼写更新sql
                 */
                sql = "update msg set ";
                /*
                 * 获取条件元素
                 */
                String ctn_msgid = (String)conditions.get("msgid");
                String ctn_username = (String)conditions.get("username");
                String ctn_title = (String)conditions.get("title");
                String ctn_msgcontent = (String)conditions.get("msgcontent");
                String ctn_state = (String)conditions.get("state");
                String ctn_sendto = (String)conditions.get("sendto");
                Date ctn_msg_create_date = (Date)conditions.get("msg_create_date");
                /*
                 * 写出sql更新语句
                 */
                String and = "";
                sql += msgid!=null ? and + " msgid=? ":"";
                and = msgid!=null ? " and ":"";
                sql += username!=null ? and + " username=? ":"";
                and = username!=null ? " and ":"";
                sql += title!=null ? and + " title='" + title + "' ":"";
                and = title!=null ? " and ":"";
                sql += msgcontent!=null ? and + " msgcontent=? ":"";
                and = msgcontent!=null ? " and ":"";
                sql += sendto!=null ? and + " sendto=? ":"";
                and = sendto!=null ? " and ":"";
                sql += state!=null ? and + " state=? ":"";
                and = state!=null ? " and ":"";
                sql += msg_create_date != null ? and + " msg_create_date=? ":"";
                /*
                 * 写出sql条件语句
                 */    
                sql = sql + " where 1=1 ";
                sql += ctn_msgid != null ? " and msgid=? ":"";
                sql += ctn_username != null ? " and username=? ":"";
                sql += ctn_title != null ? " and title='" + title + "' ":"";
                sql += ctn_msgcontent != null ? " and msgcontent=? ":"";
                sql += ctn_sendto != null ? " and sendto=? ":"";
                sql += ctn_state != null ? " and state=? ":"";
                sql += ctn_msg_create_date != null ? " and msg_create_date=? ":"";
                
                list = new ArrayList<Object>();
                /*
                 * 设置更新参数
                 */
                if(msgid != null)
                    list.add(msgid);
                if(username != null)
                    list.add(username);
                if(title != null)
                    list.add(title);
                if(msgcontent != null)
                    list.add(msgcontent);
                if(sendto != null)
                    list.add(sendto);
                if(state != null)
                    list.add(state);
                if(msg_create_date != null)
                    list.add(new Timestamp(msg_create_date.getTime()));
                /*
                 * 设置条件参数
                 */
                if(ctn_msgid != null)
                    list.add(ctn_msgid);
                if(ctn_username != null)
                    list.add(ctn_username);
                if(ctn_title != null)
                    list.add(ctn_title);
                if(ctn_msgcontent != null)
                    list.add(ctn_msgcontent);
                if(ctn_sendto != null)
                    list.add(ctn_sendto);
                if(ctn_state != null)
                    list.add(ctn_state);
                if(ctn_msg_create_date != null)
                    list.add(new Timestamp(ctn_msg_create_date.getTime()));
            }
            /*
             * 添加操作
             */
            else if(operate.equals("insert")){
                sql = "insert into msg values(?,?,?,?,?,?,?)";
                list = new ArrayList<Object>();
                list.add(msgid);
                list.add(username);
                list.add(title);
                list.add(msgcontent);
                list.add(state);
                list.add(sendto);
                list.add(new Timestamp(msg_create_date.getTime()));
            }
            /*
             * 删除操作
             */
            else if(operate.equals("delete")){
                sql = "delete from msg where msgid = ?";
                list = new ArrayList<Object>();
                msgid = (String)conditions.get("msgid");
                list.add(msgid);
            }
            return executeUpdata(sql, list);
        }
        /*
         * 执行查询操作
         * @param
         *     elements:查询条件集合     
         */    
        public List<BBSMessage> getMessagesByPage(Map<String,Object> elements) {        
            /*
             * 获取查询语句中的条件参数
             */        
            Integer msgs_in_one_page = (Integer)elements.get("msgs_in_one_page");
            Integer page_no = (Integer)elements.get("page_no");
            String username = (String)elements.get("username");
            String msgid = (String)elements.get("msgid");
            String title = (String)elements.get("title");
            String msgcontent = (String)elements.get("msgcontent");
            String sendto = (String)elements.get("sendto");
            Integer state = (Integer)elements.get("state");
            Date msg_create_date = (Date)elements.get("msg_create_date");
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm");        
            /*
             * 拼写sql
             */
            String sql = null;        
            if(page_no == null){
                sql = "select * from msg where 1 = 1 ";
            }else{                    
                sql = "select * from" +
                "(select msg.*,rownum r from msg where 1=1 and " + 
                username + title + msgcontent + sendto + state + msg_create_date + 
                " and rownum <= " + msgs_in_one_page*page_no + ") " +
                "t where t.r >" + msgs_in_one_page*(page_no - 1);
            }
            /*
             * 编写条件语句
             */        
            sql += msgid!=null ? " and msgid='" + msgid + "' ":"";
            sql += username != null?" and username='" + username + "' ":"";
            sql += title!=null ? " and title='" + title + "' ":"";
            sql += msgcontent!=null ? " and msgcontent='" + msgcontent + "' ":"";
            sql += sendto!=null ? " and sendto='" + sendto + "' ":"";
            sql += state!=null ? " and state=" + state + " ":"";
            sql += msg_create_date!=null ? " and msg_create_date='" + sdf.format(msg_create_date) + "' ":"";    
            
            /*
             * 返回结果
             */
            List <BBSMessage>list = null;        
            openConnection();
            list = new ArrayList<BBSMessage>();
            try {
                ps = con.prepareStatement(sql);
                rs = ps.executeQuery();
                while(rs.next()){
                    BBSMessage bms = new BBSMessage();
                    bms.setMsgid(rs.getString("msgid"));
                    bms.setTitle(rs.getString("title"));
                    bms.setContent(rs.getString("msgcontent"));
                    bms.setSendto(rs.getString("sendto"));
                    bms.setState(rs.getInt("state"));
                    bms.setDatetime(rs.getDate("msg_create_date"));
                    bms.setUsername(rs.getString("username"));
                    list.add(bms);
                }
            } catch (SQLException e) {
                e.printStackTrace();
            }finally{
                closeResource();
            }
            return list;
        }
    
        public int getMsgsCount(String username) {        
            String always_true = " where 1=1 ";
            int count = 0;
            if(username == null){
                username = "";
            }else{
                username = " and username = '" + username + "'";
            }    
            String sql = "select count(*) from msg " + always_true + username;
            
            openConnection();
            try {
                ps = con.prepareStatement(sql);
                rs = ps.executeQuery();
                while(rs.next())
                    count = rs.getInt(1);
            } catch (SQLException e) {
                e.printStackTrace();
            }
            return count;
        }
    
    }

    3.4 BBSMessageBiz

    package cn.jbit.demo.biz;
    
    import java.util.List;
    import java.util.Map;
    
    import cn.jbit.demo.entity.BBSMessage;
    
    public interface BBSMessageBiz {    
        //查询短信息
        public List<BBSMessage> findMessages(Map<String,Object> elements);
        //更新或删除短信息
        public int doInsertOrUpdateMsg(String operate, Map<String,Object> elements, Map<String,Object> conditions);
    }

     3.5 BBSMessageBizImpl

    package cn.jbit.demo.biz.impl;
    import java.util.List;
    import java.util.Map;
    
    import cn.jbit.demo.biz.BBSMessageBiz;
    import cn.jbit.demo.dao.BBSMessageDao;
    import cn.jbit.demo.dao.impl.BBSMessageDaoImpl;
    import cn.jbit.demo.entity.BBSMessage;
    
    public class BBSMessageBizImpl implements BBSMessageBiz {
        private BBSMessageDao bmd = new BBSMessageDaoImpl();
        //更新或删除短信息
        public int doInsertOrUpdateMsg(String operate, Map<String,Object> elements, Map<String,Object> conditions) {        
            return bmd.executeUpdate(operate, elements, conditions);
        }
        //查询短信息
        public List<BBSMessage> findMessages(Map<String,Object> elements) {
            return bmd.getMessagesByPage(elements);
        }    
    }

    3.6 MsgServlet

    package cn.jbit.demo.web;
    
    import java.io.IOException;
    import java.sql.Timestamp;
    import java.util.Date;
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;
    import java.util.Random;
    
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    import cn.jbit.demo.biz.BBSMessageBiz;
    import cn.jbit.demo.biz.impl.BBSMessageBizImpl;
    import cn.jbit.demo.entity.BBSMessage;
    
    public class MsgServlet extends HttpServlet {    
        private static final long serialVersionUID = 1L;
        public void doGet(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
            doPost(request, response);
        }
        public void doPost(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
            BBSMessageBiz bmb=new BBSMessageBizImpl();
            String action = request.getParameter("action");
            if(action.equals("del")){//删除短信息
                String msgid = request.getParameter("msgid");
                 Map<String,Object> conditions = new HashMap<String,Object>();
                 conditions.put("msgid", msgid); 
                 int isSuccess = bmb.doInsertOrUpdateMsg("delete",new HashMap<String,Object>(),conditions);
                 if(isSuccess > 0){
                     request.setAttribute("error", "删除成功!");
                     request.getRequestDispatcher("MsgServlet?action=list").forward(request,response);
                 }else{                 
                     request.setAttribute("error", "删除属于非法操作,请确认当前用户权限!");
                     request.getRequestDispatcher("MsgServlet?action=list").forward(request,response);
                 }
            }else if(action.equals("send")){//发送短信息
                Random r = new Random();                        
                String msgid = String.valueOf(r.nextInt());        
                  String fromUser = (String)request.getSession().getAttribute("loginuser");
                  String toUser = request.getParameter("toUser");
                  String title = request.getParameter("title");
                  String content = request.getParameter("content");
                  String state = "0";
                  Timestamp ts = new Timestamp((new Date()).getTime());    
                  Map <String,Object>map = new HashMap<String,Object>();            
                map.put("msgid", msgid);
                map.put("sendto", toUser);
                map.put("title", title);
                map.put("msgcontent",content);
                map.put("state", state);
                map.put("username", fromUser);
                map.put("msg_create_date", ts);            
                bmb.doInsertOrUpdateMsg("insert",map,null);
                response.sendRedirect("MsgServlet?action=list");
            }else if(action.equals("list")){//显示当前用户的收件箱
                String username = (String)request.getSession().getAttribute("loginuser");    
                Map <String,Object>map = new HashMap<String,Object>();      
                map.put("sendto", username);                
                List<BBSMessage> list = bmb.findMessages(map);
                request.setAttribute("msgs", list);     
                request.getRequestDispatcher("main.jsp").forward(request,response);
            }else if(action.equals("read")){//读取某条短信息
                Map <String,Object>elements = null;
                  Map<String,Object> conditions = null;
                  String msgid = request.getParameter("msgid");
                  String state = request.getParameter("state");              
                  if(state.equals("0")){
                      elements = new HashMap<String,Object>();
                      conditions = new HashMap<String,Object>();
                      elements.put("state", "1");          
                      conditions.put("msgid", msgid);
                      bmb.doInsertOrUpdateMsg("update", elements, conditions);
                  }
                  if(conditions == null){
                    conditions = new HashMap<String,Object> ();
                    conditions.put("msgid", msgid);
                }
                  List<BBSMessage> list = bmb.findMessages(conditions);
                  request.setAttribute("msg", list);
                  request.getRequestDispatcher("readMsg.jsp").forward(request,response);
            }        
        }
    }

    四.数据表

  • 相关阅读:
    Java——泛型、异常
    接口
    Classes
    Unit Tests
    Boundaries
    Error Handling
    Objects and Data Structures
    DB other operation
    Comments
    Functions
  • 原文地址:https://www.cnblogs.com/qjt970518--/p/6823426.html
Copyright © 2011-2022 走看看