慕课网 使用Struts2+Hibernate开发学生信息管理功能

使用struts2和hibernate开发学生信息管理系统

第一章:Struts2与Hibernate整合

1.1 创建struts2和hirbernate的用户类库

Windows-->preferences-->Java-->Build Path-->User Libraies-->new

(struts2-core、hirbernate-core、junit、mysql-jdbc)

-->AddExternal JARs-->OK

1.2 导入struts2和hibernate的jar包

l  新建项目(切换成UTF-8)

右击项目-->BuildPath-->configure Build Path-->Add Library-->User Library-->next

1.3 配置web.xml

struts-2.3.14\apps\struts2-blank\WEB-INF\web.xml

1.4 配置struts.xml

struts-2.3.14\apps\struts2-blank\WEB-INF\classes\struts.xml

1.5 配置hirbernate.cfg.xml

hibernate-release-4.2.4.Final\project\etc\hibernate.cfg.xml

<hibernate-configuration>

    <session-factory>

        <property name="dialect">org.hibernate.dialect.MySQLDialect</property>

        <property name="connection.url">jdbc:mysql:///test</property>

        <property name="connection.username">root</property>

        <property name="connection.password">1234</property>

        <property name="connection.driver_class">com.mysql.jdbc.Driver</property>

        <property name="show_sql">true</property>

        <property name="format_sql">true</property>

        <property name="hbm2ddl.auto">update</property>

        <property name="hibernate.current_session_context_class">thread</property>

    </session-factory>

</hibernate-configuration>

1.6 创建实体类

1)创建entity包

2)Students.java

package entity;

import java.util.Date;

 

public class Students {

    private String sid;//学号

    private String sname;//姓名

    private String gender;//性别

    private Date birthday;//生日

    private String address;//地址

   

    @Override

    public String toString() {

       return "Students [address=" + address + ", birthday=" + birthday

              + ", gender=" + gender + ", sid=" + sid + ", sname=" + sname

              + "]";

    }

    public Students() {

 

    }

    public Students(String sid, String sname, String gender, Date birthday,

           String address) {

       super();

       this.sid = sid;

       this.sname = sname;

       this.gender = gender;

       this.birthday = birthday;

       this.address = address;

    }

   

    public String getSid() {

       return sid;

    }

    public void setSid(String sid) {

       this.sid = sid;

    }

    public String getSname() {

       return sname;

    }

    public void setSname(String sname) {

       this.sname = sname;

    }

    public String getGender() {

       return gender;

    }

    public void setGender(String gender) {

       this.gender = gender;

    }

    public Date getBirthday() {

       return birthday;

    }

    public void setBirthday(Date birthday) {

       this.birthday = birthday;

    }

    public String getAddress() {

       return address;

    }

    public void setAddress(String address) {

       this.address = address;

    }  

}

3)Users.java

package entity;

 

public class Users {

    private int uid;

    private String username;

    private String password;

   

    public Users() {

    }

 

    public Users(int uid, String username, String password) {

       this.uid = uid;

       this.username = username;

       this.password = password;

    }

 

    public int getUid() {

       return uid;

    }

 

    public void setUid(int uid) {

       this.uid = uid;

    }

 

    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;

    }  

}

1.7 生成实体类的关系映射文件

1)Students.hbm.xml

<?xml version="1.0" encoding="utf-8"?>

<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"

"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<!--

    Mapping file autogenerated by MyEclipse Persistence Tools

-->

<hibernate-mapping>

    <class name="entity.Students" table="students" catalog="test">

        <id name="sid" type="java.lang.String" column="SID" length="8">

            <generator class="assigned" />

        </id>

        <property name="sname" type="java.lang.String" /> 

        <property name="gender" type="java.lang.String" />

        <property name="birthday" type="date" />

        <property name="address" type="java.lang.String" />   

  

    </class>

</hibernate-mapping>

Assigned手工赋值

 

2)Users.hbm.xml

<?xml version="1.0" encoding="utf-8"?>

<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"

"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<!--

    Mapping file autogenerated by MyEclipse Persistence Tools

-->

<hibernate-mapping>

    <class name="entity.Users" table="USERS" >

        <id name="uid" type="java.lang.Integer">           

            <generator class="native" />

        </id>

        <property name="username" type="java.lang.String" />

        <property name="password" type="java.lang.String" />

         

    </class>

</hibernate-mapping>

USERS是表名

id是主键名

native自动增长类型

3)配置hibernate.cfg.xml

<mapping resource="entity/Students.hbm.xml" />

<mapping resource="entity/Users.hbm.xml" />

1.8 生成表结构(使用SchemaExport)

与src同级创建test-->entity包-->TestStudents.java

package entity;

 

import org.hibernate.cfg.Configuration;

import org.hibernate.tool.hbm2ddl.SchemaExport;

import org.junit.Test;

 

publicclass TestStudents {

   

    @Test

    publicvoid testSchemaExport(){

       //创建配置对象

       Configuration config = new Configuration().configure();

       //创建SchemaExport对象

       SchemaExport export = new SchemaExport(config);

       export.create(true, true);

    }

}

右击Run As-->Junit Test

出现的错误可能为junit-4.11.jar需要配合hamcrest-core-1.3.jar使用

第2章用户登录模块

2.1 项目分层

项目分层:

M模型层:实体层(entity)、数据库层(db)、接口层(service)、接口实现层(serviceImpl)
C控制层:动作层(action)
V
视图层:JSP页面

2.2 创建用户自定义的SessionFactory类(MyHirbernateSessionFactory)

可使用自带

import org.hibernate.SessionFactory;

import org.hibernate.cfg.Configuration;

import org.hibernate.service.ServiceRegistry;

import org.hibernate.service.ServiceRegistryBuilder;

 

publicclass MyHibernateSessionFactory {

 

    private static SessionFactory sessionFactory;   //会话工厂属性

   

    //为保证单例模式,构造方法私有化

    private MyHibernateSessionFactory() {

    }

   

    //公有的静态方法,获得会话工厂对象

    public static SessionFactory getSessionFactory() {

        if(sessionFactory==null){

            Configuration configuration = new Configuration().configure();

            ServiceRegistry serviceRegistry = new ServiceRegistryBuilder().applySettings(configuration.getProperties()).buildServiceRegistry();

            sessionFactory = configuration.buildSessionFactory(serviceRegistry);

            return sessionFactory;

        }else{

            return sessionFactory;

        }

    }

}

2.3用户业务逻辑接口和实现类

1)UsersDao.java接口 

package service;

 

import entity.Users;

 

//用户业务逻辑接口

publicinterface UsersDAO {

         //用户登录方法

         public boolean usersLogin(Users u);

}

2)UsersDaoImpl.java

package serviceimpl;

 

import java.util.List;

import javax.transaction.Transaction;

import org.hibernate.Query;

import org.hibernate.Session;

import db.MyHibernateSessionFactory;

import entity.Users;

import service.UsersDAO;

 

public class UsersDAOImpl implements UsersDAO {

    @Override

    public boolean usersLogin(Users u) {

        //事物对象

        Transaction tx = null;

        //hql语句

        String hql = "";

        try {

Session session = MyHibernateSessionFactory.getSessionFactory().getCurrentSession();

            hql = "from Users where username=? and password=?";

            Query query = session.createQuery(hql);

            query.setParameter(0, u.getUsername());

            query.setParameter(1, u.getPassword());

            List list = query.list();

            //返回之前提交事务

            tx.commit();

            if(list.size()>0){

                return true;

            }else {

                return false;

            }

        } catch (Exception e) {

            e.printStackTrace();

            return false;

        }finally {

            if(tx!=null){

                tx = null;

            }

        }

    }

}

3)TestUserDaoImpl.java 测试类

首先在数据库中添加一个用户对象(zzh123456

package serviceimpl;

 

import junit.framework.Assert;

import org.junit.Test;

 

import entity.Users;

import service.UsersDAO;

 

publicclass TestUsersDAOImpl {

 

    @Test

    publicvoid testUserLogin(){

       Users u=new Users(1,"zzh","123456");

       UsersDAO udao=new UsersDAOImpl();     

       Assert.assertEquals(true, udao.usersLogin(u));

    }

}

2.4 设计所有Action的父类

1)继承ActionSupport
2
)为了获得常用的内置对象采用耦合IOC方式注入属性

SuperAction.java

package action;

 

publicclass SuperAction extends ActionSupport

       implementsServletContextAware, ServletRequestAware, ServletResponseAware{

    privatestaticfinallongserialVersionUID = 1L;

   

    protected HttpServletRequest request;

    protected HttpServletResponse response;

    protected HttpSession session;

    protected ServletContext application;

 

    publicvoid setServletContext(ServletContext application) {

       this.application = application;

    }

    publicvoid setServletRequest(HttpServletRequest request) {

       this.request = request;

       this.session = this.request.getSession();

    }

    publicvoid setServletResponse(HttpServletResponse response) {

       this.response = response;

    }

}

2.5 设计用户Action类 

strus2接受表单数据的方式
三种:普通属性、领域对象、模型驱动

1) UsersAction.java

package action;

import com.opensymphony.xwork2.ModelDriven;  //模型驱动

import entity.Users;

import service.UsersDAO;

import serviceimpl.UsersDAOImpl;

 

publicclass UsersAction extends SuperAction implements ModelDriven<Users>{

   

    privatestaticfinallongserialVersionUID = 4317500994450323565L;

   

    private Users user=new Users();

   

    //用户登录动作

    public String login(){

       UsersDAO udao=new UsersDAOImpl();

       if(udao.usersLogin(user)){

           return"login_success";

       }else{

           return"login_failure";

       }     

    }

    public Users getModel() {

       returnthis.user;

    }

}

2)struts.xml  配置映射

    <package name="users" namespace="/users" extends="default">

        <action name="*_*" class="action.{1}Action" method="{2}">

            <result name="login_success">/users/users_login_success.jsp</result>

            <result name="login_failure">/users/users_login.jsp</result>

        </action>

    </package>

2.6 页面调用 

<form name="loginForm" action="<%=path%>/users/Users_login.action" method="post">

2.7 完成显示登录成功用户名和注销功能

1)在action实现attribute保存,以及注销动作

//用户登录动作

    public String login(){

       UsersDAO udao=new UsersDAOImpl();

       if(udao.usersLogin(user)){

           //session中保存登录成功的用户名        

           session.setAttribute("loginUserName", user.getUsername()); 

           return "login_success";

       }else{

           return "login_failure";

       }     

    }

//用户注销操作,本操作不进行表单输入验证

    public String logout(){    

       if(session.getAttribute("loginUserName")!=null){

           session.removeAttribute("loginUserName");

       }

       return"logout_success";

    }

2)struts.xml 添加映射

<result name="logout_success">/users/Users_login.jsp</result>

3users_login_success.jsp 登录成功页面

<div id="welcome">欢迎${sessionScope.loginUserName}使用本系统</div>  

<div id="logout"><a href="<%=path%>/users/Users_logout.action">安全退出</a></div> 

2.8完成表单验证功能

————在登录表单上显示表单验证出错信息

1) action实现ActionSupportvalidate()方法

    @Override

    publicvoid validate() {

       if("".equals(user.getUsername().trim()) ){

           this.addFieldError("usernameError", "用户名不能为空!");

       }

       if(user.getPassword().trim().length()<6){

           this.addFieldError("userpasswordError", "密码不能小于6!");

       }

    }

2) 对不进行验证的方法上加注解@SkipValidatio

    @SkipValidation

    //用户注销操作,本操作不进行表单输入验证

    public String logout(){}

3)Struts.xml

    <package name="users" namespace="/users" extends="default">

        <action name="*_*" class="action.{1}Action" method="{2}">

            <result name="login_success">/users/Users_login_success.jsp</result>

            <result name="login_failure">/users/Users_login.jsp</result>

            <result name="logout_success">/users/Users_login.jsp</result>

            <result name="input">/users/Users_login.jsp</result>        <!-- 添加 -->

        </action>

    </package>

4) users_login.jsp 显示错误信息

<%@ taglib prefix="s" uri="/struts-tags"%>

<div>  

     <s:fielderror/> <!-- 显示表单验证的出错信息 -->  

</div>  

第3章学生信息管理模块

学生管理模块:

1.      显示学生资料

2.      删除学生资料

3.      学生主键生成策略

4.      添加学生资料

5.      修改学生资料

3.1 显示学生资料——准备 

为数据库输入数据(在test.entity.TestStudents中添加testSaveStudents()测试方法)

@Test

     public void testSaveStudents(){

         //创建配置对象

         Configuration config = new Configuration().configure();

         //创建服务注册对象

         ServiceRegistry serviceRegistry = new ServiceRegistryBuilder().applySettings(config.getProperties()).buildServiceRegistry();

         //创建sessionFactory对象

         SessionFactory sessionFactory =config.buildSessionFactory(serviceRegistry);

         //创建session对象

         Session session = sessionFactory.getCurrentSession();

         //创建事物对象

         Transaction tx=session.beginTransaction();

        

         Students s1=new Students("$0000001","张三丰","",new Date(),"武当山");

         Students s2=new Students("$0000002","郭靖","",new Date(),"桃花岛");          

         Students s3=new Students("$0000003","黄蓉","",new Date(),"桃花岛"); 

        

         session.save(s1);

         session.save(s2);

         session.save(s3);

         //提交事务

         tx.commit();

         sessionFactory.close();

     }

3.2 显示——学生业务逻辑接口

增删改查(service.StudentsDAO

//学生业务逻辑接口

publicinterface StudentsDAO {

   

    //查询所有

    public List<Students> queryAllStudents();

    //查询单个

    public Students queryStudentsBySid(String sid);

    //

    publicboolean addStudents(Students s);

    //

    publicboolean updateStudents(Students s);

    //

    publicboolean deleteStudents(String sid);   

}

3.3 显示——学生业务逻辑接口实现类 

publicclass StudentsDAOImpl implements StudentsDAO {

 

    @Override

    //查询所有

    public List<Students> queryAllStudents() {

 

       Transaction tx=null;

       List<Students> list=null;

       String hql="";

       try{

           Session session=MyHibernateSessionFactory

.getSessionFactory().getCurrentSession();

           tx=session.beginTransaction();

          

           hql="from Students ";

           Query query=session.createQuery(hql);

           list=query.list();

 

           tx.commit();

       }catch(Exception ex){

           ex.printStackTrace();

           tx.commit();

       }finally{

           if(tx!=null){

              tx=null;

           }

       }

       returnlist;

    }

在test中写测试方法

publicclass TestStudentsDAOImpl {

 

    @Test

    publicvoid TestStudentsDAOImpl() {

 

       StudentsDAO sdao = new StudentsDAOImpl();

       List<Students> list = sdao.queryAllStudents();

       for (int i = 0; i < list.size(); i++) {

           System.out.println(list.get(i));

       }

    }

在Console中显示出现有的学生资料

3.4 显示——实现显示学生资料Action 

1StudentsAction.java

package action;

 

import java.util.List;

 

import entity.Students;

import service.StudentsDAO;

import serviceimpl.StudentsDAOImpl;

 

publicclass StudentsAction extends UsersAction {

   

    privatestaticfinallongserialVersionUID = 1L;

 

    //查询所有学生动作

    public String query(){

       StudentsDAO sDao=new StudentsDAOImpl();

       List<Students> list=sDao.queryAllStudents();

       //放进session

       if(list!=null && list.size()>0){

           session.setAttribute("students_list", list);          

       }

       return"query_success";

    }

}

3)struts.xml

     <package name="students" namespace="/students" extends="default">

         <action name="*_*" class="action.{1}Action" method="{2}">

              <result name="query_success">/students/Students_query_success.jsp</result>

         </action>

     </package>

3.5 显示——页面调用与数据展现

在tree.jsp中

{ level:2, name:"学生列表", ico:"images/icon_default.gif",link:"students/Students_query.action"},

top.document.frames["MainFrame"].location.href=link;

/students/Students_query_success.jsp

<s:iterator value="#session.students_list" var="stu">

    <tr class="list">

        <td><s:property value="#stu.sid"/></td>

        <td><a href="<%=path%>/students/Students_modify.action?sid=<s:property value="#stu.sid"/>"><s:property value="#stu.sname"/></a></td>

        <td><s:property value="#stu.gender"/></td>

        <td><s:date name="#stu.birthday" format="yyyyMMdd"/></td>

        <td><s:property value="#stu.address"/></td>

        <td><a href="<%=path%>/students/Students_delete.action?sid=<s:property value="#stu.sid"/>" onclick="javascript: return confirm('真的要删除吗?');">删除</a></td>

    </tr>

    </s:iterator>

3.6 删除学生资料

0)添加删除页面链接

<td><a href="<%=path%>/students/Students_delete.action?sid=<s:property value="#stu.sid"/>" onclick="javascript: return confirm('真的要删除吗?');">删除</a></td>

1)StudentsDaoImpl.java

@Override

    publicboolean deleteStudents(String sid) {

 

        Transaction tx=null;

        try{

            Session session=MyHibernateSessionFactory.getSessionFactory().getCurrentSession();

            tx=session.beginTransaction();

           

            Students s=(Students) session.get(Students.class,sid);

            session.delete(s);         

               

            tx.commit();

            returntrue;

        }catch(Exception ex){

            ex.printStackTrace();

            tx.commit();

            returnfalse;

        }finally{

            if(tx!=null){

                tx=null;

            }      

        }  

}

2) StudentsAction.java

    //删除学生动作

    public String delete(){

       StudentsDAO sDao=new StudentsDAOImpl();      

       String sid= request.getParameter("sid");

       sDao.deleteStudents( sid );    

       return"delete_success";   

    }

3) Struts.xml

<result name="delete_success" type="chain">Students_query </result>

chain-->转发(后面)————————无action

redirect-->重定向------------action

<result name="delete_success" type="redirect ">Students_query.action</result>

3.7 添加——实现步骤和界面原型设计

1)界面原型Students_add.jspStudents_add_success.jsp

3.8 添加——学号生成方法 

1)StudentsDaoImpl.java

//生成学生学号,测试之后换成私有的

    public String getNewSid(){

        Transaction tx=null;

        String sid=null;

        String hql="";

        try{

            Session session=MyHibernateSessionFactory.getSessionFactory().getCurrentSession();

            tx=session.beginTransaction();

           

            hql="select max(sid) from Students ";

            Query query=session.createQuery(hql);

            sid=(String) query.uniqueResult();

            if(sid==null  ||  "".equals(sid.trim())){

                //给一个默认的最大编号

                sid="S0000001";

            }else{

                String temp=sid.substring(1);  //取后7

                inti=Integer.parseInt(temp);  //转成数字

                i++;

                temp=String.valueOf(i); //转成string

                intlen=temp.length();  //数字位数

                //凑够7位

                for(intj=0;j<7-len;j++){

                    temp="0"+temp;

                }

                sid="S"+temp;

            }

            tx.commit();           

        }catch(Exception ex){

            ex.printStackTrace();

            tx.commit();       

        }finally{

            if(tx!=null){

                tx=null;

            }      

        }  

        returnsid;

    }

测试junit

    @Test

    publicvoid TestGetNewSid(){

       StudentsDAOImpl sDao = new StudentsDAOImpl();

       System.out.println(sDao.getNewSid());

    }

测试成功后,把方法换成私有的

3.9 添加——添加学生业务逻辑接口类

1 StudentsDaoImpl.java

@Override

    publicboolean addStudents(Students s) {

        //设置学生学号

        s.setSid(getNewSid());

        Transaction tx=null;   

        String hql="";

            try{

                Session session=MyHibernateSessionFactory.getSessionFactory().getCurrentSession();

                tx=session.beginTransaction();         

                session.save(s);           

                tx.commit();

            }catch(Exception ex){

                ex.printStackTrace();

                tx.commit();

                returnfalse;

            }finally{

                if(tx!=null){

                    tx=null;

                }      

            }  

        returntrue;

    }

测试junit

    @Test

    publicvoid TestAddStudents(){

       Students s = new Students();

       s.setSname("志宏");

       s.setGender("");

       s.setBirthday(new Date());

       s.setAddress("太原理工");

       StudentsDAO sDao = new StudentsDAOImpl();

       Assert.assertEquals(true, sDao.addStudents(s));

    }

2)StudentsAction.java

    //添加学生

    public String add() throws Exception{

 

       Students s=new Students();

       s.setSname(request.getParameter("sname"));

       s.setGender(request.getParameter("gender"));

      

       SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd");

       s.setBirthday(sdf.parse(request.getParameter("birthday")));

       s.setAddress(request.getParameter("address"));

      

       StudentsDAO sDao = new StudentsDAOImpl();

       sDao.addStudents(s);       

       return"add_success";

    }

3) Struts.xml

<result name="add_success">/students/Students_add_success.jsp</result>

4) Students_query_success.jsp

<a href="<%=path%>/students/Students_add.jsp">添加学生</a>  

5) Students_add.jsp

<form name="addForm" action="<%=path%>/students/Students_add.action" method="post">

 

6Students_add_success.jsp

<a href="<%=path%>/students/Students_add.jsp">继续添加?</a> 

3.10 修改——实现步骤和界面原型演示

 

3.11 修改——实现页面显示要修改的生资料

1)StudentsDaoImpl.java

    @Override

    public Students queryStudentsBySid(String sid) {

      

       Transaction tx = null;

       Students s = null;

       try {

           Session session = MyHibernateSessionFactory.getSessionFactory().getCurrentSession();

           tx = session.beginTransaction();

           s = (Students) session.get(Students.class, sid);

           tx.commit();

       } catch (Exception e) {

           e.printStackTrace();

           tx.commit();

       }finally{

           if(tx!=null){

              tx=null;

           }

       }

       returns;

    }

2)StudentsAction.java

//修改学生资料

    public String modify(){

       //获得传递过来的学生编号

       String sid = request.getParameter("sid");

       StudentsDAO sDao=new StudentsDAOImpl();

       Students s=sDao.queryStudentsBySid(sid);

       //保存在会话中

       session.setAttribute("modify_students", s);

       return"modify_success";   

    }

3)Struts.xml

<result name="modify_success" >/students/Students_modify.jsp</result> 

4)Students_query_success.jsp

<td><a href="<%=path%>/students/Students_modify.action?sid=<s:property value="#stu.sid"/>"><s:property value="#stu.sname"/></a></td>

5)修改Students_modify.jsp

修改sid,sname,gender,birthday,address的显示

3.12 修改——实现修改学生资料action和页面调用测试 

1StudentsDAOImpl.java

    @Override

    publicboolean updateStudents(Students s) {

        Transaction tx=null;

        try{

            Session session=MyHibernateSessionFactory.getSessionFactory().getCurrentSession();

            tx=session.beginTransaction();

           

            session.update(s);         

               

            tx.commit();

            returntrue;

        }catch(Exception ex){

            ex.printStackTrace();

            tx.commit();

            returnfalse;

        }finally{

            if(tx!=null){

                tx=null;

            }      

        }  

    }

2) StudentsAction.java

// 保存修改的学生对象

    public String save() throws Exception{

 

       Students s = new Students();

       s.setSid(request.getParameter("sid"));

       s.setSname(request.getParameter("sname"));

       s.setGender(request.getParameter("gender"));

 

       SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");

       s.setBirthday(sdf.parse(request.getParameter("birthday")));

       s.setAddress(request.getParameter("address"));

 

       StudentsDAO sDao = new StudentsDAOImpl();

       sDao.updateStudents(s);

       return"save_success";

    }

3) Struts.xml

<result name="save_success">/students/Students_modify_success.jsp</result>

4) Students_modify.jsp

<result name="modify_success" >/students/Students_modify.jsp</result> 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值