JSP(8):登陆用户

本文介绍了一个基于Java Servlet的用户登录与管理系统的设计与实现,包括登录验证、用户信息管理、分页展示等功能,并详细展示了各部分的代码实现。
package com.tsinghua;      
  
  
import java.io.*;  
import javax.servlet.http.*;  
  
public class Login extends HttpServlet{  
    public void doPost(HttpServletRequest req,HttpServletResponse res){  
        this.doGet(req,res);  
    }  
    public void doGet(HttpServletRequest req,HttpServletResponse res){  
          
        try  
        {  
            
               //解决中文乱码
  				res.setContentType("text/html;charset=gbk");
  			
				PrintWriter pw=res.getWriter();
				//返回登录界面
				pw.println("<html>");
				pw.println("<body bgcolor=#CACCF6>");
				
				pw.println("<img src=imgs/1.GIF><hr><center>");
				
				 //得到error信息   
                String info=req.getParameter("info");  
                if(info!=null){  
                  pw.println("<hl>你的用户名或是密码错误!</hl>");  
                } 
				pw.println("<h1>登录界面</h1>");
				pw.println("<form action=logincl method=post>");    //用loginCl页面去检查要跳转的条件
				pw.println("用户名:<input type=text name=username><br>");
				pw.println("密     码:<input type=password name=passwd><br>");
				pw.println("<input type=checkbox name=keep value=2>两周内不在重复登录<br>");
				pw.println("<input type=submit value=loging><br>");
				pw.println("</form>");
				pw.println("</center><hr><img src=imgs/3.GIF>");
				pw.println("</body>");
				pw.println("</html>");  
					
					
		   
        }  
        catch(Exception ex)  
        {  
            ex.printStackTrace();  
        }  
    }  
}  

//登录控制文件的servlet   
  
package com.tsinghua;  
  
import javax.servlet.http.*;  
import java.io.*;  
import java.sql.*;  
  
public class LoginCl extends HttpServlet{
	
	    
	//重写init函数
	
	public void init(){
		try {
				
		  		
		  	
		  	
			 //这是从文件中读取数据   
				
			 //创建一个FileReader   
                 FileReader f=new FileReader("f:\\myCounter.txt");  
              
                 //把FileReader 转换成BufferedReader   
                 BufferedReader br=new BufferedReader(f);     
                 //读出一行数据   
                 String numval=br.readLine();  
                 br.close();  
                   
                  
             	//将times 的值放入到servletContext中
				this.getServletContext().setAttribute("visitTimes",numval); 	
                 		
		}
		catch (Exception ex) {
			ex.printStackTrace();
		}
	}
	public void destroy(){
		try {
			
		  	
		  					
		
			
			
			// 这是将新的次数写回去   
                      
               //创建一个Filewriter看内存数据-->磁盘文件(写入,输出)   
               //看内存数据<--磁盘文件(读入,输入)   
               FileWriter fw=new FileWriter("f:\\myCounter.txt");  
             
            
               BufferedWriter bw=new BufferedWriter(fw);  
                          
               	bw.write(this.getServletContext().getAttribute("visitTimes").toString());
           
            
               //关闭文件流   
               bw.close();  
               	System.out.println("destroy被调用");  
                 
		}
		catch (Exception ex) {
		}
	}
	
	  
    public void doGet(HttpServletRequest req,HttpServletResponse res){  
        this.doPost(req,res);  
    }  
    public void doPost(HttpServletRequest req,HttpServletResponse res){  
      
        Connection ct = null;  
        ResultSet rs = null;  
        Statement sm = null;  
          
        try{  
            //服务器接收login页面发来的用户名和密码,要用到req。   
            String u = req.getParameter("username");//此处填写组件名   
            String p = req.getParameter("passwd");//此处填写组件名   
          
  
                 
                //调用UserBeanCl  (1)创建一个对象   
                UserBeanCl ubc=new UserBeanCl();  
                  
                 //(2)使用UserBeanCl的方法   
                if(ubc.checkUser(u,p)){  
                      
                    System.out.println("用户合法");  
                    //合法用户   
                    String keep=req.getParameter("keep");  
                          
                        if(keep!=null){  
                      
                          
                          
                        //1将用户名和密码保存在客户端(cookie)   
                        //创建   
                        Cookie name=new Cookie("myname",u);  
                        Cookie pass=new Cookie("mypasswd",p);                          
                        	                        //设置时间   
                        name.setMaxAge(14*24*3600);  
                           pass.setMaxAge(14*24*3600);  
                          
                        //回写到客户端   
                        res.addCookie(name);  
                        res.addCookie(pass);  
                        }  
               
                      
                    HttpSession hs = req.getSession(true);  
                  
                                     hs.setMaxInactiveInterval(20);  
                    hs.setAttribute("pass","ok");  
                    //连接登录后的欢迎界面   
                    //sendRedirect的作用是跳转界面   
                 //3\==============添加网页访问次数的功能=============   
                    
                
                 
                //将servletContext中的visitTimes中值++
				String times=this.getServletContext().getAttribute("visitTimes").toString();
				
				//对times++在重新写回servlectContext
				this.getServletContext().setAttribute("visitTimes",(Integer.parseInt(times)+1)+"");
                   
                    res.sendRedirect("Main");//该处填写域名   
                   
                }  
                	            else  
                {//返回登录页面   
                    res.sendRedirect("login");//该处填写域名   
                }  
            }  
        catch(Exception ex){  
            ex.printStackTrace();  
        }  
        finally  
        {  
            try  
            {  
                if(rs!=null)  
                {  
                    rs.close();  
                }  
                if(sm!=null)  
                {  
                    sm.close();  
                }  
                if(ct!=null)  
                {  
                     ct.close();  
                }  
                  
                  
            }  
            catch (Exception ex)  
            {  
                ex.printStackTrace();  
            }         
        }  
    }  
          
      
}  

//登录界面   
package com.tsinghua;  
import javax.servlet.http.*;  
import java.io.*;  
import java.sql.*;  
import java.util.*;  
  
public class Wel extends HttpServlet{  
    public void doGet(HttpServletRequest req,HttpServletResponse res){  
        this.doPost(req,res);  
    }  
    public void doPost(HttpServletRequest req,HttpServletResponse res){  
              
            //业务逻辑             
              Connection ct=null;  
            PreparedStatement ps=null;  
            ResultSet rs=null;  
              
        try{  
            //得到session防止非法登录   
            HttpSession hs = req.getSession(true);  
            String myname = (String)hs.getAttribute("pass");  
          
              
            String u = req.getParameter("username");  
            String p = req.getParameter("passwd");  
            //1、================//读取Cookie==================   
            String name="";  
            String passwd="";  
            if(myname == null)  
            {  
                //如果session中没有用户信息,再看看有没有cookie信息   
                  
                //从客户端得到所有的Cookie   
              
            Cookie [] allCookies=req.getCookies();  
              
            int i=0;                

         //如果allCookies不为空……   
            if(allCookies!=null){  
               //从中取出Cookie   
               for(i=0;i<allCookies.length;i++){  
                //依次取出Cookie   
                Cookie temp=allCookies[i];  
                  
                if(temp.getName().equals("myname")){                        //得到Cookie的值   

                      name=temp.getValue();  
                      }  
                      else if(temp.getName().equals("mypasswd")){  
                      passwd=temp.getValue();     
                        }  
                    }  
                      
                    if(name.equals("")&&!passwd.equals("")){  
                          
                          //到loginCl中验证   
                          res.sendRedirect("logincl?username="+name+"&passwd="+passwd);  
                          return;  
                       }  
                       	                     }  
                     //返回登录界面   
                     res.sendRedirect("login?info=error1");  
                     return;  
            }  
              
                res.setContentType("text/html;charset=gbk");//中文防止乱码   
                PrintWriter pw = res.getWriter();  
                  
               
               	pw.println("<body bgcolor=#CACCF6>");
				
				pw.println("<img src=imgs/1.GIF>欢迎你:"+myname+"<img src=imgs/6.GIF><hr><center>");
				 	
                 	
                 pw.println("<h1>管理用户</h1>");  
                 pw.println("你的用户名是:"+u);  
                   
                //3\=========添加网页访问次数的功能============   
                  
                      
                   
                 
                //=========分页功能===============   
                  
                int pageSize=3;//一页显示几条记录   
                int pageNow=1;//希望显示第几页   
                  
              
                  
                //动态的接收pageNow   
                String sPageNow=req.getParameter("pageNowok");  
                  
                if(sPageNow!=null){  
                    pageNow=Integer.parseInt(sPageNow);  
                    }  
                //调用userBeancl   
                 UserBeanCl ubc=new UserBeanCl();   
                 ArrayList al=ubc.getResultByPage(pageNow,pageSize);  
                  
                //设置表头   
                 pw.println("<table border=1>");  
                 pw.println("<tr bgcolor=pink><th>id</th><th>name</th><th>passwd</th><th>mail</th><th>grade</th><th>修改用户</th><th>删除用户</th></tr>");  
                  
                 //定义一个颜色数组
                 String[] mycol={"silver","pink"};
                //显示出来   
                for(int i=0;i<al.size();i++){  
                      
                    UserBean ub=(UserBean)al.get(i);  
                    pw.println("<tr bgcolor="+mycol[i%2]+">");  
                    pw.println("<td>"+ub.getUserId()+"</td>");  
                    pw.println("<td>"+ub.getUsername()+"</td>");  
                    pw.println("<td>"+ub.getPasswd()+"</td>");  
                    pw.println("<td>"+ub.getMail()+"</td>"); 
                    pw.println("<td>"+ub.getGrade()+"</td>");	 
                    
                    pw.println("<td><a href=Update?uId="+ub.getUserId()+"&uName="+ub.getUsername()+"&uPass="+ub.getPasswd()+"&uMail="+ub.getMail()+"uGrade="+ub.getGrade()+">修改用户</a></td>");
                    
                    pw.println("<td><a href=DelUserCl?userid="+ub.getUserId()+" onClick=\"return window.confirm('你确认要删除用户吗?')\">删除用户</a></td>");
                    pw.println("</tr>");                  }                
                     pw.println("</table>");  

               
               //做个超链接   
               pw.println("<br><a href=login>返回重新登陆</a></br>");  
                 
               //上一页   
               if(pageNow!=1)  
                pw.println("<a href=wel?pageNowok="+(pageNow-1)+">上一页</a>");  
               //显示超链接   
                for(int i=pageNow;i<=pageNow+4;i++){  
                    pw.println("<a href=wel?pageNowok="+i+">"+i+"</a>");  
                    }  
                      
                int pageCount=ubc.getPageCount();  
               //下一页   
               if(pageNow!=pageCount)  
                pw.println("<a href=wel?pageNowok="+(pageNow+1)+">下一页</a><br>");  
                pw.println("该网页被访问了"+this.getServletContext().getAttribute("visitTimes").toString()+"次<br>");  
                	
                
                
                //指定跳转到某一页
                //输入的页数过大怎么办?不是数值怎么办?
  				pw.println("<form action=wel>");
  				pw.println("请输入页数<input type=text name=pageNowok>");
  				pw.println("<input type=submit value=go>");
  				pw.println("</form>");
  				
                
                pw.println("</form>");
              	pw.println("你的IP="+req.getRemoteAddr()+"<br>");
  				pw.println("你的机器名是"+req.getRemoteHost()+"<br>");
              	
               
                pw.println("</center><hr><img src=imgs/3.GIF>");
                pw.println("</body>"); 
              
            }  
        catch(Exception ex){  
            ex.printStackTrace();  
        }  
          
    }  
}  
package com.tsinghua;      
  
  
import java.io.*;  
import javax.servlet.http.*;  
  
public class Main extends HttpServlet{  
    public void doPost(HttpServletRequest req,HttpServletResponse res){  
        this.doGet(req,res);  
    }  
    public void doGet(HttpServletRequest req,HttpServletResponse res){  
          
        try  
        {  
            
               //解决中文乱码
  				res.setContentType("text/html;charset=gbk");
  			
				PrintWriter pw=res.getWriter();
				//返回登录界面
				pw.println("<html>");
				pw.println("<body bgcolor=#CACCF6>");
				
				pw.println("<img src=imgs/1.GIF><hr><center>");
				
				pw.println("<hl>主界面</hl>");
				
				pw.println("<a href=wel>管理用户</a><br>");
				pw.println("<a href=???>添加用户</a><br>");
				pw.println("<a href=???>查找用户</a><br>");
				pw.println("<a href=???>安全退出</a><br>");
				pw.println("</center><hr><img src=imgs/3.GIF>");
				pw.println("</body>");
				pw.println("</html>");  
					
					
		   
        }  
        catch(Exception ex)  
        {  
            ex.printStackTrace();  
        }  
    }  
}  



//处理删除用户


package com.tsinghua;      
  
  
import java.io.*;  
import javax.servlet.http.*;  
  
public class DelUserCl extends HttpServlet{  
    public void doPost(HttpServletRequest req,HttpServletResponse res){  
        this.doGet(req,res);  
    }  
    public void doGet(HttpServletRequest req,HttpServletResponse res){  
          
        try  
        {  
            
               //解决中文乱码
  				res.setContentType("text/html;charset=gbk");
  			
			//调用UserBean的删除用户的方法完成删除任务
  				UserBeanCl ubc=new UserBeanCl();
  				String id=req.getParameter("userid");
  				//接收从WEL传递的id
  				
  				if(ubc.delUser(id))
	  				{
	  					//删除成功
	  					res.sendRedirect("Ok");
	  					
	  				}
  				else
	  				{
	  					res.sendRedirect("Err");
	  				}
			
					
		   
        }  
        catch(Exception ex)  
        {  
            ex.printStackTrace();  
        }  
    }  
}  



//操作成功界面


package com.tsinghua;      
  
  
import java.io.*;  
import javax.servlet.http.*;  
  
public class Ok extends HttpServlet{  
    public void doPost(HttpServletRequest req,HttpServletResponse res){  
        this.doGet(req,res);  
    }  
    public void doGet(HttpServletRequest req,HttpServletResponse res){  
          
        try  
        {  
            
               //解决中文乱码
  				res.setContentType("text/html;charset=gbk");
  			
				PrintWriter pw=res.getWriter();
				//返回登录界面
				pw.println("<html>");
				pw.println("<body bgcolor=#CACCF6>");
				
				pw.println("<img src=imgs/1.GIF><hr><center>");
				
				pw.println("<h1>恭喜你,操作成功!</h1>");
				
				pw.println("<a href=Main>返回主界面</a>   <a href=wel>继续删除用户</a>");
			
				pw.println("</center><hr><img src=imgs/3.GIF>");
				pw.println("</body>");
				pw.println("</html>");  
					
					
		   
        }  
        catch(Exception ex)  
        {  
            ex.printStackTrace();  
        }  
    }  
}  


//操作失败界面


package com.tsinghua;      
  
  
import java.io.*;  
import javax.servlet.http.*;  
  
public class Err extends HttpServlet{  
    public void doPost(HttpServletRequest req,HttpServletResponse res){  
        this.doGet(req,res);  
    }  
    public void doGet(HttpServletRequest req,HttpServletResponse res){  
          
        try  
        {  
            
               //解决中文乱码
  				res.setContentType("text/html;charset=gbk");
  			
				PrintWriter pw=res.getWriter();
				//返回登录界面
				pw.println("<html>");
				pw.println("<body bgcolor=#CACCF6>");
				
				pw.println("<img src=imgs/1.GIF><hr><center>");
				
				pw.println("<h1>很遗憾,操作不成功!</h1>");
				pw.println("</center><hr><img src=imgs/3.GIF>");
				pw.println("</body>");
				pw.println("</html>");  
					
					
		   
        }  
        catch(Exception ex)  
        {  
            ex.printStackTrace();  
        }  
    }  
}  

//这是一个UserBean<---->users表映射
//他的一个对象<--->users表的一条记录对应
//数据
package com.tsinghua;


public class UserBean {

    private int userId;
    private String username;
    private String passwd;
    private String mail;
    private int grade;
    
    public void setUserId(int userId){
    	this.userId=userId;
    }
    public int getUserId(){
        return	this.userId;	
    }

	
	public void setUsername(String username) {
		this.username = username; 
	}

	public void setPasswd(String passwd) {
		this.passwd = passwd; 
	}

	public void setMail(String mail) {
		this.mail = mail; 
	}

	public void setGrade(int grade) {
		this.grade = grade; 
	}

	public String getUsername() {
		return (this.username); 
	}

	public String getPasswd() {
		return (this.passwd); 
	}

	public String getMail() {
		return (this.mail); 
	}

	public int getGrade() {
		return (this.grade); 
	}	
    
}

//这是一个处理类(处理users表)<----->操作UserBean
package com.tsinghua;
import java.sql.*;
import java.util.*;

public class UserBeanCl {
	
             //业务逻辑
            private Connection ct=null;
	        private PreparedStatement ps=null;
	        private ResultSet rs=null;
	        private int pageCount=0;//共有几页(计算)
	        
	     //修改用户
  	
  	public boolean updateUser(String id, String email, String passwd, String grade){
  		boolean b=false;
		try {
			//得到连接
    			ConnDB cd=new ConnDB();
    			ct=cd.getConn();
    			
    			String sql="use spdb;update users set passwd='"+passwd+"', email='"+email+"', grade='"+grade+"' where userid='"+id+"'";
    			ps=ct.prepareStatement(sql);
    			
    			System.out.println("sql========"+sql);
    			int num=ps.executeUpdate();
    			
    			if(num==1)
    			{
    				//更新成功
    				b=true;
    			}else{
    				//更新失败
    				
    			}
    			
	       	        	
	       	       }catch(Exception ex){
	       	    	
	       	      ex.printStackTrace();
	       	    }finally{

	        		this.close();
	        	}
	        	return b;
	       }
	       
	        
	       //删除用户
	       public boolean delUser(String id){
	       	     boolean b=false;
	       	    try{
	       	        
	       	        	//得到链接
	        		ConnDB cd=new ConnDB();
	        		ct=cd.getConn();
	       	        
	       	        String sql="use spdb;delete from users where userid='"+id+"'";
	       	        ps=ct.prepareStatement(sql);
    			
    			     int num=ps.executeUpdate();
    			
    			    if(num==1)
    			     {
    			    	//删除成功
    			     	b=true;
    			     }else{
    				   //删除失败
    				
    			      }
    			
	       	        	
	       	       }catch(Exception ex){
	       	    	
	       	      ex.printStackTrace();
	       	    }finally{

	        		this.close();
	        	}
	        	return b;
	       }
	       
	        
	        //返回pageCount
	        public int getPageCount(){
	        	return this.pageCount;
	        }
	        
	        
				    
	        //分页显示
	        public ArrayList getResultByPage(int pageNow,int pageSize){
	        	
	        	ArrayList al=new ArrayList();
	        	
	        	try{
	        		
	        	       
	        		  int rowCount=0;//共有几条记录(查表)
				       
				    
			     	//连接到数据库
			 
			        ConnDB  cd=new ConnDB();
			        ct=cd.getConn();
			    
			        ps = ct.prepareStatement("select count(*) from users");
			    
			       rs= ps.executeQuery();
			        //返回一个结果集,如果增加,删除,更改的话用update
			       if(rs.next()){
			    	
			       rowCount=rs.getInt(1);
			       }
			       //计算PageCount
			       if(rowCount%pageSize==0){
			    	    pageCount=rowCount/pageSize;
			          }else{
			    	   pageCount=rowCount/pageSize+1;
			      }
			    
			       ps=ct.prepareStatement("select top "+pageSize+"*from users where userId not in (select top "+pageSize*(pageNow-1)+" userId from users)");
			    
			        //给?赋值
			       // ps.setInt(1,pageSize);
			        //ps.setInt(2,pageSize*(pageNow-1));
			    
			       //执行查询
			       rs=ps.executeQuery();
			    
			    
			      while(rs.next()){
			         	//将rs中的每条记录封装到UserBean ub中
			    	     UserBean ub=new UserBean();
			             ub.setUserId(rs.getInt(1));
			    	     ub.setUsername(rs.getString(2));
			    	     ub.setPasswd(rs.getString(3));
			    	     ub.setMail(rs.getString(4));
			    	     ub.setGrade(rs.getInt(5));
			    	
			    	      //将ub放入到Arraylist中
			    	      al.add(ub);
			         }
	        	  }catch(Exception ex){
	        		  ex.printStackTrace();
	        	}finally{
	        		  this.close();
	        	       }
	        	return al;
	        }
	        
	        //验证用户
	        public boolean checkUser(String u,String p){
	        	boolean b=false;
	        	try{
	        		
	        		//得到链接
	        		ConnDB cd=new ConnDB();
	        		ct=cd.getConn();
	        		
	        		ps=ct.prepareStatement("select top 1 passwd from users where username=?");
	        		
	        		ps.setString(1,u);
	        		rs=ps.executeQuery();
	        		if(rs.next()){
			    	
			          String dbPasswd=rs.getString(1);//注入漏洞
			          if(dbPasswd.equals(p)){
			          	b=true;
			          }
			    }
	        		
	        	}catch(Exception ex){
	        		ex.printStackTrace();
	        	}finally{

	        		this.close();
	        	}
	        	return b;
	        }
	        
	      public void close(){
	      	
	      	try{
	      		if(rs!=null){
	      			rs.close();
	      			rs=null;
	      		}
	      		if(ps!=null){
	      			ps.close();
	      			ps=null;
	      		}
	      		if(ct!=null){
	      			ct.close();
	      			ct=null;
	      		}
	      	}catch(Exception ex){
	      		ex.printStackTrace();
	       	}
	      } 
    
}

package com.tsinghua;      
  
  
import java.io.*;  
import javax.servlet.http.*;  
  
public class Update extends HttpServlet{  
    public void doPost(HttpServletRequest req,HttpServletResponse res){  
        this.doGet(req,res);  
    }  
    public void doGet(HttpServletRequest req,HttpServletResponse res){  
          
        try  
        {  
            
               //解决中文乱码
  				res.setContentType("text/html;charset=gbk");
  			
				PrintWriter pw=res.getWriter();
				//返回登录界面
				pw.println("<html>");
				pw.println("<body bgcolor=#CACCF6>");
				
				pw.println("<img src=imgs/1.GIF><hr><center>");
				
				pw.println("<h1>修改用户界面</h1>");
				pw.println("<form action=UpdateCl>");
				pw.println("<table border=1>");
				pw.println("<tr><td>id</td><td><input readonly name=uid  type=text value="+req.getParameter("uId")+"></td></tr>");
				pw.println("<tr><td>name</td><td><input readonly type=text value="+req.getParameter("uName")+"></td></tr>");
				pw.println("<tr><td>passwd</td><td><input  name= newPasswd type=text value="+req.getParameter("uPass")+"></td></tr>");
				pw.println("<tr><td>email</td><td><input name=newEmail type=text value="+req.getParameter("uMail")+"></td></tr>");
				
		    	  pw.println("<tr><td>grade</td><td><input name=newGrade type=text value="+req.getParameter("uGrade")+"></td></tr>");
	
				pw.println("<tr><td colspan=2><input type=submit value=修改用户></td></tr>");
				
				pw.println("</table></form>");
				pw.println("</center><hr><img src=imgs/3.GIF>");
				pw.println("</body>");
				pw.println("</html>");  
					
					
		   
        }  
        catch(Exception ex)  
        {  
            ex.printStackTrace();  
        }  
    }  
}  



//处理修改用户


package com.tsinghua;      
  
  
import java.io.*;  
import javax.servlet.http.*;  
  
public class UpdateCl extends HttpServlet{  
    public void doPost(HttpServletRequest req,HttpServletResponse res){  
        this.doGet(req,res);  
    }  
    public void doGet(HttpServletRequest req,HttpServletResponse res){  
          
       
			
		 try  
        {  
            
               //解决中文乱码
  				res.setContentType("text/html;charset=gbk");
  			
			//调用UserBean的删除用户的方法完成删除任务
  				
  				UserBeanCl ubc=new UserBeanCl();
  			
  				
  				
  				if(ubc.updateUser(req.getParameter("uid"), req.getParameter("newEmail"),req.getParameter("newPasswd"), req.getParameter("newGrade")))
	  				{
	  					//删除成功
	  					res.sendRedirect("Ok");
	  					
	  				}
  				else
	  				{
	  					res.sendRedirect("Err");
	  				}
        }  
        catch(Exception ex)  
        {  
            ex.printStackTrace();  
        }  
    }  
}  



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值