java常用方法集合

 1.多附件上传以及判断个数
function isSameName()//判断上传的文件不能重复
{
 var u=0;      //附件个数
 var s=0;
 var filename = new Array();
 var frm = document.getElementsByTagName('input'); 
      for(var i=0;i<frm.length;i++){  
          if(frm[i].type  ==  'file')
           {           
           var iname = frm[i].value;        
          var string_arr = iname.split("//");         
     filename[s] = string_arr[string_arr.length-1];
     s++;
     }     
 }
  

  for(var s=0;s<filename.length;s++){
  var tname = filename[s];
  if(tname == '')
   ++u;
  }
  if(u == filename.length){
   alert("请添加图片...");
   return false;
  }


      for(var j=0;j<filename.length-1;j++){  
        var uname = filename[j];

   
        for(var k=j+1;k<filename.length;k++)
        {
         var sname = filename[k];
    if(uname != '' & sname != '') {
     if (uname == sname)
      {    
       alert("文件"+(j+1)+"和"+"文件"+(k+1)+"相同");
       
       return false;   
      }
         }
        }
      }
   return true;
  
}

var i = 1;//增加上传的文件
function addFile(dvID, inputNamePrefix)
{
  if(i<6){
  var dv = document.getElementById(dvID);

  var file = document.createElement("input");
  file.type = "file";
  file.id = file.name = inputNamePrefix + i;

  dv.appendChild(file);

  var btn =  document.createElement("input");
  btn.type = "button";
  btn.id = btn.name = "btn" + i;
  btn.value = "删除" ;

  btn.onclick = function() {
var b = document.getElementById(btn.id);
dv.removeChild(b.nextSibling); //remove <BR>
dv.removeChild(b.previousSibling); //file
dv.removeChild(b); //btn
--i;
  }

  dv.appendChild(btn);
 
  dv.appendChild(document.createElement("BR"));

  ++i;}else{
   alert("最多上传5个");
   return false;
  }
}


2.多用户可能同时操作一个文件的时候控制其查看只能一个人
主要是使用 listener监听器,大概如下
import java.util.ArrayList;
import java.util.List;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSessionAttributeListener;
import javax.servlet.http.HttpSessionBindingEvent;

import com.ucap.oapro.formpro.zhengwen.SingleWriteDocLogic;

public class FormproSessionAttributeListener implements HttpSessionAttributeListener
{

    public void attributeAdded(HttpSessionBindingEvent se)
    {
        if("formprodocstat".equals(se.getName()))
        {
         System.out.println((new StringBuilder("se:----------attributeAdded----")).append((String)se.getValue()).toString()+"*"+(String)se.getSession().getAttribute(com.ucap.control.mfw.Constant.SESSION_SYS_USERID));
           
         SingleWriteDocLogic.newInstance().checkAndSetDocState((String)se.getValue(),(String)se.getSession().getAttribute(com.ucap.control.mfw.Constant.SESSION_SYS_USERID));
         
        }
    }

    public void attributeRemoved(HttpSessionBindingEvent se)
    {
     if("formprodocstat".equals(se.getName()))
        {
      System.out.println((new StringBuilder("se:----------attributeRemoved----")).append((String)se.getValue()).toString()+"*"+(String)se.getSession().getAttribute(com.ucap.control.mfw.Constant.SESSION_SYS_USERID));
         
         SingleWriteDocLogic.newInstance().removeDoDocStatUseridByDatafilename((String)se.getValue(),(String)se.getSession().getAttribute(com.ucap.control.mfw.Constant.SESSION_SYS_USERID));
          
        }
       
    }

    public void attributeReplaced(HttpSessionBindingEvent httpsessionbindingevent)
    {
    }
}
此类完成类在创建SESSION的时候做的工作,其他用户只要查看此SESSION中有东西就不能操作
session.setAttribute("formprodocstat",datafilename);//创建session
     String nowmodifydocuserid = com.ucap.oapro.formpro.zhengwen.SingleWriteDocLogic.newInstance().getDoDocStatUseridByDatafilename(datafilename);
     System.out.println("nowmodifydocuserid------------------------------:"+nowmodifydocuserid+"*"+(nowmodifydocuserid==null||nowmodifydocuserid.equals(userId))+"*"+userId);          
   
     boolean inmodifying = true;
       if (nowmodifydocuserid==null||nowmodifydocuserid.equals("")||nowmodifydocuserid.equals(userId))
        {
         inmodifying = false;
        }
在用户离开操作的时候去处SESSION,如下
<%@ page contentType="text/html;charset=utf-8"%>
<%@ page language="java" import="java.sql.*,java.util.*,java.net.URLEncoder"%>
<%
   String sessiondatafilename = request.getParameter("sessiondatafilename");
System.out.println("_________________fdsfdas__________"+sessiondatafilename);
if (sessiondatafilename!=null)
 session.removeAttribute("formprodocstat");
request.getRequestDispatcher("dodocsession.jsp").forward(request,response);
return;
%>

3.遍例物理文件夹
String syspath = request.getRealPath("/") + "databak/" + dir;
   File datafile = new File(syspath);
   if (datafile.isDirectory()) {
    File[] fs = datafile.listFiles();
    if (fs == null) {
     return mapping.findForward(ConstantDefine.FORWARD_SUCCESS);
    } else {
     for (int i = 0; i < fs.length; i++) {
      filelist.add(fs[i].getName());
     }
     request.setAttribute("filelist",filelist);
    }
   }
 
 
   这样在页面上就能得到filelist里面的值了
   
  private static void del(File f) throws IOException {//完成递归删除文件,同样可以递归得到文件
  if (f.isFile())
   f.delete();
  else if (f.isDirectory()) {
   String[] files = f.list();
   for (int i = 0; i < files.length; i++) {
    del(new File(f.getAbsolutePath() + "//" + files[i]));
   }
   f.delete();
  }
 }
   
4.导出EXCEL(利用JXL控件)
页面的代码(主要是得到一个LIST)
<%--
 *version:1.0
 *createdate:2006  13:30:57
 *Copyright: Berheley Tech Co,.ltd
 * JSP页面功能描述: 输出Excel
 * @author <a href="WangNanmailto:qiaoli.xu@berheley.com">WangNan</a>
--%>
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib uri="/WEB-INF/tld/struts-bean.tld" prefix="bean" %>
<%@ taglib uri="/WEB-INF/tld/struts-html.tld" prefix="html" %>
<%@ taglib uri="/WEB-INF/tld/struts-logic.tld" prefix="logic" %>
<%@ taglib uri="/WEB-INF/tld/valuelist.tld" prefix="vlh"%>
<%@ taglib uri="/WEB-INF/tld/c.tld" prefix="c" %>
<%@ page import="java.sql.*" %>
<%@ page import="java.util.*" %>
<%@ page import="java.io.*" %>
<%@ page import="jxl.*" %>
<%@ page import="jxl.write.*" %>
<%@ page import="jxl.format.*" %>
<%@ page import="com.berheley.oa.persistence.model.tree.TAllArchive,com.berheley.common.ConstantEnumDefine.ArchiveType" %>

<%


//System.out.println("userId="+userId+",isManager="+isDocManger);

List reports = (List)request.getAttribute("reports");

response.reset();
response.setCharacterEncoding("UTF-8");
response.setContentType("Application/msexcel");
String fileName = java.net.URLEncoder.encode("文件修订记录","UTF-8");
response.setHeader("Content-disposition","inline; filename="+fileName+".xls");

//开始写入excel
//加标题
//标题字体
jxl.write.WritableFont wfc = new jxl.write.WritableFont(WritableFont.COURIER, 18, WritableFont.BOLD,true);
jxl.write.WritableCellFormat wcfFC = new jxl.write.WritableCellFormat(wfc);
wcfFC.setAlignment(jxl.format.Alignment.CENTRE);
wcfFC.setVerticalAlignment(jxl.format.VerticalAlignment.CENTRE);

//字段字体
jxl.write.WritableFont wfc1 = new jxl.write.WritableFont(WritableFont.COURIER,10, WritableFont.BOLD,true);
jxl.write.WritableCellFormat wcfFC1 = new jxl.write.WritableCellFormat(wfc1);
wcfFC1.setAlignment(jxl.format.Alignment.CENTRE);
wcfFC1.setVerticalAlignment(jxl.format.VerticalAlignment.CENTRE);

//结果字体
jxl.write.WritableCellFormat wcfFC2 = new jxl.write.WritableCellFormat();
wcfFC2.setAlignment(jxl.format.Alignment.CENTRE);
wcfFC2.setVerticalAlignment(jxl.format.VerticalAlignment.CENTRE); 

WritableWorkbook wbook = Workbook.createWorkbook(response.getOutputStream());
//写sheet名称
WritableSheet wsheet = wbook.createSheet("文件修订记录", 0);
java.util.Date aaa=new java.util.Date();
java.text.SimpleDateFormat aSimpleDateFormat = new java.text.SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
String today = aSimpleDateFormat.format(aaa);

 

//加入字段名 设定列宽度

int column = 0;
wsheet.setColumnView(column,10);
wsheet.addCell(new jxl.write.Label(column++,3,"文件编号",wcfFC1));
wsheet.setColumnView(column,20);
wsheet.addCell(new jxl.write.Label(column++,3,"文件名称",wcfFC1));
wsheet.setColumnView(column,20);
wsheet.addCell(new jxl.write.Label(column++,3,"修订编号",wcfFC1));
wsheet.setColumnView(column,20);
wsheet.addCell(new jxl.write.Label(column++,3,"修订人",wcfFC1));
wsheet.setColumnView(column,15);
wsheet.addCell(new jxl.write.Label(column++,3,"修订时间",wcfFC1));
 


//加入标题
WritableFont wf_merge = new WritableFont(WritableFont.ARIAL,22,WritableFont.NO_BOLD,false,UnderlineStyle.DOUBLE_ACCOUNTING,jxl.format.Colour.GREEN);
WritableCellFormat wff_merge = new WritableCellFormat(wf_merge);
wff_merge.setBackground(jxl.format.Colour.LIGHT_TURQUOISE);
wsheet.mergeCells(0,0,column-1,0);
wsheet.addCell(new Label(0,0,"文件修订记录",wff_merge));
wsheet.setRowView(0,800);

//加入打印时间
wsheet.addCell(new Label(column-2,1,"打印日期:"));
wsheet.addCell(new Label(column-1,1,today)); 

 

//下面开始输出结果
for(int i=0; i<reports.size();i++){
   column = 0;
   org.apache.commons.beanutils.BasicDynaBean archive  =(org.apache.commons.beanutils.BasicDynaBean)reports.get(i);
   String wenjianbiaoti = (String)archive.get("file_path");
   System.out.println("file_path  ==============================" + wenjianbiaoti);

   wsheet.addCell(new Label(column++,i+4,(String)archive.get("file_path")==null?"":(String)archive.get("file_path"),wcfFC2));
   wsheet.addCell(new Label(column++,i+4,(String)archive.get("titledetail")==null?"":(String)archive.get("titledetail"),wcfFC2));
   wsheet.addCell(new Label(column++,i+4,(String)archive.get("xiudingbianhao")==null?"":(String)archive.get("xiudingbianhao"),wcfFC2));
   wsheet.addCell(new Label(column++,i+4,(String)archive.get("createpeople")==null?"":(String)archive.get("createpeople"),wcfFC2));
   wsheet.addCell(new Label(column++,i+4,(String)archive.get("createtime")==null?"":(String)archive.get("createtime"),wcfFC2));
  
}

//写入流中
wbook.write();
wbook.close();
response.getOutputStream().close();    
 
%>

<%!
private String getLabel(String value){
   ArchiveType[] array= ArchiveType.values();
   for(int i=0;i<array.length;i++){
      if(array[i].getValue().equals(value)){
         return array[i].getLabel();
      }
   }
 
   return "ERROR";
}
%>

如上的代码就完成了文件的导出EXCEL,很简单吧


5.像QQ一样弹出信息

<%@ page contentType="text/html; charset=utf-8" language="java" errorPage=""%>
<%@ page import="java.text.SimpleDateFormat,java.text.ParseException,java.util.Date" %>
<%@ page import="com.ucap.system.db.DataBase,com.ucap.system.db.DataBaseFactory,com.ucap.system.db.RecordSet" %>
<% String SOF_Host=request.getContextPath()+"/";  %>
<script language =javascript>
var titlePopup;
var len;
var tID;

function close(){
 window.clearInterval(tID); window.titlePopup.hide();
}

function InitMsgBox(remind)   {
var remind_value  =remind.toString() ;
len = 0;  
titlePopup=window.createPopup();  
var titlePopupBody = titlePopup.document.body;  
var titleContent = ""; 
titleContent = titleContent + "<table width='256' height='159' border='0' cellpadding='0' cellspacing='0' style='table-layout:fixed'>";
titleContent = titleContent + "<tr><td background='images/tc_windows_01.gif' height='20'><div style='margin-right:10px;' align='right' ><img src='images/tc_windows_04.gif' οnclick='parent.close();' onMouseOver='this.src=/"images/tc_windows_05.gif/"'  onMouseOut='this.src=/"images/tc_windows_04.gif/"' /></div></td></tr>"; 
titleContent = titleContent + "<tr><td height='132' background='images/tc_windows_02.gif' valign='top'><div style='width:236px; margin-top:5px;margin-left:10px;  '><br><font   style='color:#0000FF; font-size:13px;line-height:14px;'>"
titleContent = titleContent + remind_value ;  
titleContent = titleContent + "</font></div></td></tr>" ;  
titleContent = titleContent + "<tr><td><img src='images/tc_windows_03.gif' width='256' height='7' /></td></tr>";  
titleContent = titleContent + "</table>";       
titlePopupBody.innerHTML = titleContent;   
ShowMsgBox(); 

}

function MsgBox(){

 if(len > 159){
  titlePopup.show(document.body.clientWidth - 256, document.body.clientHeight - len, 256, len, top.document.body); 
 }else{
  len += 4; 
  titlePopup.show(document.body.clientWidth - 256, document.body.clientHeight - len, 256, len, top.document.body);
 }   
}  


function ShowMsgBox(){   
 tID = window.setInterval("MsgBox()",30);
}
</script>
<%
 String userId = (String)request.getSession().getAttribute(com.ucap.control.mfw.Constant.SESSION_SYS_USERID);
 
 String sql = "select  top 1 * from  TrainRemind order by createdate desc";
 DataBase db= DataBaseFactory.getDataBase();
 RecordSet rs =null ;
 String date_1 ="";
 String date_2 ="";
 String remindperson = "";
 String remind="";
 if((rs=db.execSelect(sql)).next()){
  date_1 =rs.getString("startdate");
  date_2 =rs.getString("enddate");
  remindperson =rs.getString("remindperson");
  remind =rs.getString("reminddetail");
 }else{
     if(rs!=null)rs.close();
        if(db!=null)db.close();
  return;
 } 
    if(rs!=null)rs.close();
       if(db!=null)db.close();

 //判断当前用户是否在被提醒列表当中
 boolean isRemind = false ;
 String [] personarray = remindperson.split(";");
 for(int i=0;i<personarray.length;i++){
  if(userId.equals(personarray[i])){
   isRemind = true ;
   break;
  }
 }

    Date date = new Date();
       Date startdate = new Date();
       Date enddate = new Date();
       SimpleDateFormat sdf =new SimpleDateFormat("yyyy-MM-dd");
       try {
        date=sdf.parse(sdf.format(date));
        startdate = sdf.parse(date_1);
        enddate = sdf.parse(date_2);
       } catch (ParseException e) {
        e.printStackTrace();
       }
       
       if( isRemind && (((startdate.before(date)) && ( enddate.after(date))) || (startdate.equals(date)) || (enddate.equals(date)))){
    %>
    <script language=javascript>window.setTimeout('InitMsgBox("<%=remind%>")',3000);</script>
    <%
       }
 %>
 
 6.利用DIV进行隐藏和显示
 <div id="Layer2"   style="position: absolute;top:120px;left:40px;z-index:66;width:60%;visibility: hidden;">
 </div>
 
 js的写法
  function show(indexid){
    if (document.all["select3"].options[document.all["select3"].selectedIndex].value !="0" && document.all["select3"].options[document.all["select3"].selectedIndex].value !=" ") {
  Layer2.style.visibility="visible";
  }
  else
  {
  Layer2.style.visibility="hidden";
  }
  }

  7.一个简单的AJAX
  <script type="text/javascript" src="<c:url value='/js/prototype.js'/>"></script>//引入AJAX的JS
  //两个主要的方法
  function checkHaveRemind(obj){
    ClearList(smsForm.elements['roleId']);
 var url = "<c:url value='/berheley/sms/formSendMessage.ao'/>";
 var person = obj;
    var pars = "method=searchSmsOfSwf&processId="+person;
    //alert (pars);
 var myAjax = new Ajax.Request(url,{method:'post',parameters:pars,onComplete:appendAnswer});
 
 
}
function appendAnswer(originalRequest)
{
 //消息格式
 //<tag>
 //<swf><swfname></swfname>
 //<swfid></swfid></swf>
 //</tag>
 
 var message=originalRequest.responseXml;
 
    //var tag = message.getElementsByTagName("id").value;
    //document.getElementById("test").innerHTML=message.getElementsByTagName("id")[0].childNodes[0].nodeValue;
    //getElementById("test").innerHtml = "<font>用户已经存在。</font>";
 //window.alert(tag);
 
 var err = message.getElementsByTagName('error');
  if(err!=null && err.length==1){
   alert("获得节点信息失败,请与管理员联系!/r/n"+err[0].firstChild.nodeValue);
   return;
  }
 if(info !=null && info.length==1){
 for(var i = 0; i< message.getElementsByTagName("swf").length;i++){
     var id= message.getElementsByTagName("swf")[i].childNodes[0].firstChild.nodeValue;
     var name = message.getElementsByTagName("swf")[i].childNodes[1].firstChild.nodeValue;
  smsForm.elements['roleId'].options[smsForm.elements['roleId'].options.length] = new Option(name, id);
 }}else{
   alert("系统异常,请与管理员联系!");
   return;
  }
}


7.XML文件的操作

取出其中的一个接点
Element rowDatas = (Element) document.selectSingleNode("//主节点/ROWDATA");

一个 CDATA 部件以"<![CDATA[" 标记开始,以"]]>"标记结束//在CDATA内部的所有内容都会被解析器忽略。

List list = document.selectNodes("/styles/style/@name" );//遍例属性NAME
Attribute attr=element.attribute("name");   //得到节点的属性"NAME"
attr.getValue()//得到属性值
element.getText()//得到节点的内容

使用dom4j的xPath解析XML
  国外的dom4j已经很流行了,国内的相关资料相对较少,但普及风暴也即将到来。我们公司(老外开的)解析XML就是用的dom4j。
  今天公司没事做,自己也写一个小例子贴上来,嘻~~
 
books.xml:
<?xml version="1.0" encoding="UTF-8"?>
<books>
    <!--This is a test for dom4j, jakoes, 2007.7.19-->
    <book show="yes" url="lucene.net">
        <title id="456">Lucene Studing</title>
    </book>
    <book show="yes" url="dom4j.com">
        <title id="123">Dom4j Tutorials</title>
    </book>
    <book show="no" url="spring.org">
        <title id="789">Spring in Action</title>
    </book>
    <owner>O'Reilly</owner>
</books>

下面我们使用dom4j的xPath来解析:

segment of ParseXML.java:

    public void parseBooks(){
      
        SAXReader reader = new SAXReader();
        try {
            Document doc = reader.read("books.xml");
            Node root = doc.selectSingleNode("/books");
            List list = root.selectNodes("book[@url='dom4j.com']");
          
            for(Object o:list){
              
                Element e = (Element) o;
                String show=e.attributeValue("show");
                System.out.println("show = " + show);
            }
         
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

  Document doc = reader.read("books.xml");的意思是加载XML文档,此是可以用doc.asXML()来查看,它将打印整个xml文档。

  Node root = doc.selectSingleNode("/books");是读取刚才加载的xml文档内的books节点下的所有内容,对于本例也是整个xml文档。
  当然我们也可以加载/books下的某一个节点,如:book节点
Node root = doc.selectSingleNode("/books/book");
或:Node root = doc.selectSingleNode("/books/*");
注意:如果有多个book节点,它只会读取第一个
root.asXML()将打印:
<book show="yes" url="lucene.net">
        <title id="456">Lucene Studing</title>
</book>

  既然加载了这么多,那我怎么精确的得到我想要的节点呢,别急,看下面:
List list = root.selectNodes("book[@url='dom4j.com']");
它的意思就是读取books节点下的book节点,且book的节点的url属性为dom4j.com
为什么使用list来接收呢,如果有两个book节点,且它们的url属性都为dom4j.com,此时就封闭到list里了。

  如果想读取books下的所有book节点,可以这样:
List list = root.selectNodes("book");

  如果想读取books节点下的book节点下的title节点,可以这样:
List list2 = root.selectNodes("book[@url='dom4j.com']/title[@id='123']");

  注意:selectNodes()参数的格式:
  节点名[@属性名='属性值'],如:book[@url='dom4j.com']
  如果有多个节点,用“/”分开,如:book[@url='dom4j.com']/title[@id='123']

  最近就是读取封闭在List里的内容了,可以用Node来读取,也可以用Element来转换。
attributeValue("属性")是读取该节点的属性值
getText()是读取节点的的内容。


List list = root.selectNodes("book[@url='dom4j.com']");//遍例所有@url='dom4j.com'的节点
          
            for(Object o:list){
              
                Element e = (Element) o;
                String show=e.attributeValue("show");
                System.out.println("show = " + show);
            }

 

List list = document.selectNodes( "//foo/bar" );
for(int i=0;i<list.size();i++){
         Element ee=(Element)list.get(i);
         String name=ee.getName();
         String value=ee.getText();
}


读取XML文件的内容
DocumentBuilderFactory factory = DocumentBuilderFactory
     .newInstance();
   DocumentBuilder builder = factory.newDocumentBuilder();
   Document doc = builder.parse(xmlName);
   doc.normalize();
   NodeList info = doc.getElementsByTagName("formData");
   Element datafilename = (Element)info.item(0);
   String datafile_name = isNotNull(datafilename.getElementsByTagName("hd_datafilename").item(0).getFirstChild().getNodeValue()); 
   Element edtno = (Element)info.item(0);
   String edt_no = isNotNull(edtno.getElementsByTagName("edtReceiveNo").item(0).getFirstChild().getNodeValue());
   Element ed_year = (Element)info.item(0);
   String ed_yearcode = isNotNull(edtno.getElementsByTagName("ed_yearcode").item(0).getFirstChild().getNodeValue());
   if (edt_no != null && !"".equals(edt_no)) {
     saveNumber(datafile_name, edt_no,ed_yearcode);
    } else {
                   ;
    }


写入一般的操作
File file = new File(rootPath+File.separator+"文件信息.XML");
   try
   {
      XMLWriter writer = null;
      OutputFormat format= OutputFormat.createPrettyPrint();
      format.setEncoding("GB2312");
      writer= new XMLWriter(new FileOutputStream(file),format);//用FileOutputStream 解决utf-8编码。
      Document document = DocumentHelper.createDocument();
     
      Element root = document.addElement("主节点");
      Element fields= root.addElement("FIELDS");
      fields.addElement("FIELD").addAttribute("FieldName","电子文档号").addAttribute("FieldType","String").addAttribute("WIDTH","32");
      fields.addElement("FIELD").addAttribute("FieldName","全宗号").addAttribute("FieldType","String").addAttribute("WIDTH","5");
      fields.addElement("FIELD").addAttribute("FieldName","数据格式").addAttribute("FieldType","String").addAttribute("WIDTH","40");
     
      root.addElement("ROWDATA");
     
      writer.write(document);

      writer.close();
   } catch (IOException e)
   {
      // TODO Auto-generated catch block
      throw new Exception("文件级目录.XML 创建失败");
   } 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值