SSH2简单登录+注册例子

简单的SSH整合登录注册 创建bean,映射文件, 创建dao包,action包,jsp页面 配置web,hibernate,Spring,struts2 看一下效果先首先是登录页面 点击注册 注册过后登录进入用户列表点击删除,直接删除数据点击修改进入修改页面修改成功进入详情在写代码前需要整合SSH 1. 创建bean文件,映射文件, 映射文件将ID改为自增长package org.xian.bean;publ 阅读详情

1、在完成了SSH2简单登录例子的前提下添加注册功能

2、在WebRoot下新建、编写register.jsp、修改login.jsp添加注册链接

<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%@ taglib prefix="s" uri="/struts-tags" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head> 
    <title>register.jsp</title>
  </head>
  
  <body> 
    <s:form action="register" method="post">
    	<table>
    	<caption><h2>Welcome Register</h2></caption>
    		<tr>
    			<s:textfield name="user.id" label="please input your ID"/>
    		</tr>
    		<tr>
    			<s:textfield name="user.userName" label="please input your accountName"/>
    		</tr>
    		<tr>
    			<s:password name="user.password" label="please input your password"/>
    		</tr>
    		<tr>
    			<s:password  label="please input again your password"/>
    		</tr>
    		<tr>
   				<s:reset value="reset"/>
   				<s:submit value="sumbit"/>
   		</tr>
    	</table>
    </s:form>
  </body>
</html>
<%@ page language="java" import="java.util.*" pageEncoding="ISO-8859-1"%>
<%@ taglib prefix="s" uri="/struts-tags" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>   
    <title>ssh2 login</title> 
  </head>
  
  <body>
   	<h2>USER LOGIN</h2>
   	<s:form action="validate" method="post">
   		<table>
   			<tr>
   				<s:textfield name="user.userName" label="Account"/>
   				<s:password name="user.password" label="Passsword"/>
   			</tr>
   			<tr>
   				<s:reset value="reset"/>
   				<s:submit value="sumbit"/>
   			</tr>
   			<tr>
   			<td>have not a account?</td><td><a href="register.jsp">click here</a></td>
   			</tr>
   		</table>
   	</s:form>
  </body>
</html>

3、新添加service服务层类,提供业务方法调用Dao的操作,彻底解耦action层与dao层。在src>com.service包下编写InterUserService接口类、UserServiceImpl实现类,其中实现类包含InterUserDao的对象属性方法。

package com.service;

import com.pojo.Loginusers;

public interface InterUserService {
	
	public Loginusers validate(String name,String password);  //提供用户验证业务方法
	
	public Loginusers register(Loginusers user);			//提供用户注册业务方法
}
package com.service;

import com.dao.InterUserDao;
import com.pojo.Loginusers;

public class UserServiceImpl implements InterUserService {
	
	private InterUserDao  userDaoImpl;
	public InterUserDao getUserDaoImpl() {
		return userDaoImpl;
	}

	public void setUserDaoImpl(InterUserDao userDaoImpl) {
		this.userDaoImpl = userDaoImpl;
	}

	public Loginusers validate(String name, String password) {
		// 直接调用Dao层数据库验证方法
		return userDaoImpl.validate(name, password);
	}

	public Loginusers register(Loginusers user) {
		// 先进行表单验证,id和name是否已存在
		if(!userDaoImpl.checkAccountAndId(user.getUserName(),user.getId())){
			if(userDaoImpl.saveUser(user))
				return userDaoImpl.validate(user.getUserName(), user.getPassword());
			else 
				return null;
		}else
			return null;
	}

}

4、修改添加dao层数据库操作方法类

package com.dao;

import org.hibernate.Session;
import org.hibernate.SessionFactory;

public class BaseDao {
	
	 //Dao持久层访问SessionFactor获取session对象的中间组件
	//解耦Dao层与SessionFactory
	
	private SessionFactory sessionFactory;

	public SessionFactory getSessionFactory() {
		return sessionFactory;
	}

	public void setSessionFactory(SessionFactory sessionFactory) {
		this.sessionFactory = sessionFactory;
	} 
	public Session getSession(){
		return sessionFactory.openSession();
	}
}
package com.dao;

import com.pojo.Loginusers;

public interface InterUserDao {
	public Loginusers validate(String name,String password);	//提供验证方法
	public boolean checkAccountAndId(String name,int id);	//根据用户名和id检查是否有该用户
	public boolean saveUser(Loginusers user);	   //保存用户
}
package com.dao;

import java.sql.SQLException;
import java.util.Iterator;
import java.util.List;

import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.Transaction;

import com.dao.BaseDao;
import com.pojo.Loginusers;

public class UserDaoImpl extends BaseDao implements InterUserDao{
	
	@Override
	public Loginusers validate(String name,String password) {
		// TODO Auto-generated method stub
		String hql="from Loginusers u where u.userName=? and u.password=?";	
		Session session=getSession();	//从继承的类中获得session对象
		Query query=session.createQuery(hql);
		query.setParameter(0,name);
		query.setParameter(1, password);
		List list=query.list();
		Iterator it=list.iterator();
		while(it.hasNext()){
			if(list.size()!=0){
				Loginusers user=(Loginusers)it.next();
				return user;
			}
		}
		session.close();
		return null;
	}

	@Override
	public boolean checkAccountAndId(String name,int id) {
		// TODO Auto-generated method stub
		String hql="from Loginusers u where u.userName=? or u.id=?";
		Session session=getSession();	//从继承的类中获得session对象
		Query query=session.createQuery(hql);
		query.setParameter(0, name);
		query.setParameter(1, id);
		List list=query.list();
		Iterator it=list.iterator();
		while(it.hasNext()){
			if(list.size()!=0){
				return true;
			}
		}
		session.close();
		return false;
	}	

	@Override
	public boolean saveUser(Loginusers user) {
		// TODO Auto-generated method stub
		Session session=getSession();	//从继承的类中获得session对象
		try{
			Transaction ts=session.beginTransaction();
			session.save(user);
			ts.commit();
		}catch(Exception e){
			e.printStackTrace();
			return false;
		}
		session.close();
		return true;
	}
}

5、修改action类ValidateAction,在其中加入register()注册控制流程方法、添加InterUserService接口对象的属性和get/set方法

取消直接从spring获取实例bean调用Dao方法,改由service接口调用。spring负责bean的依赖注入。

package com.action;

import java.util.Map;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.FileSystemXmlApplicationContext;

import com.dao.InterUserDao;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
import com.pojo.Loginusers;
import com.service.InterUserService;

public class ValidateAction extends ActionSupport{
	private Loginusers user;
	ActionContext acontext;
	private InterUserService userServiceImpl;

	public InterUserService getUserServiceImpl() {
		return userServiceImpl;
	}

	public void setUserServiceImpl(InterUserService userServiceImpl) {
		this.userServiceImpl = userServiceImpl;
	}

	public Loginusers getUser() {
		return user;
	}

	public void setUser(Loginusers user) {
		this.user = user;
	}
	
	//用户注册,通过调用业务注册service方法完成
	public String registerUser(){
		Loginusers u=new Loginusers(user.getId(),user.getUserName(),user.getPassword());
		Loginusers user1=null;
		user1=userServiceImpl.register(u);
		if(user1!=null){
			acontext=ActionContext.getContext();
			Map session=acontext.getSession();
			session.put("user", user1);
			return SUCCESS;
		}else
			return ERROR;
	}
	
	public String execute()throws Exception{
		String account=user.getUserName();
		String password=user.getPassword();
		boolean flag=false;
		Loginusers user1=null;
		
		acontext=ActionContext.getContext();
		Map session=acontext.getSession();
		user1=(Loginusers)session.get("user");
		
		if(user1==null){
			System.out.println("null user1");
			user1=userServiceImpl.validate(account, password);
			if(user1!=null){
				System.out.println("not nll");
				session.put("user",user1);
				flag=true;
			}
		}else{
			flag=true;
		}
		if(flag)
			return SUCCESS;
		else
			return ERROR;
	}	
	
}

6、修改applicationContext.xml文件,添加UserService的bean配置,包含UserDaoImpl的属性设置

<?xml version="1.0" encoding="UTF-8"?>
<beans
	xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:p="http://www.springframework.org/schema/p"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd" xmlns:tx="http://www.springframework.org/schema/tx">

	<bean id="dataSource"
		class="org.apache.commons.dbcp.BasicDataSource">
		<!-- 配置数据库驱动 -->
		<property name="driverClassName" value="com.mysql.jdbc.Driver"></property>
		
		<property name="url" value="jdbc:mysql://localhost:3306/mydb?useSSL=false"></property>
		<property name="username" value="root"></property>
		<property name="password" value="root123"></property>
	</bean>
	<bean id="sessionFactory"
		class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
		<property name="dataSource">
			<ref bean="dataSource" />
		</property>
		<property name="hibernateProperties">
			<props>
				<prop key="hibernate.dialect">
					org.hibernate.dialect.MySQLDialect
				</prop>
			</props>
		</property>
		<property name="mappingResources">
			<list>
				<value>com/pojo/Loginusers.hbm.xml</value></list>
		</property>
	</bean>
	<bean id="transactionManager"
		class="org.springframework.orm.hibernate4.HibernateTransactionManager">
		<property name="sessionFactory" ref="sessionFactory" />
	</bean>
	
	<!-- dao -->
	<bean id="baseDao" class="com.dao.BaseDao">
		<property name="sessionFactory"><ref bean="sessionFactory"></ref></property>
	</bean>
	<bean id="userDaoImpl" class="com.dao.UserDaoImpl" parent="baseDao"></bean>
	<!-- <bean id="interUserDao" class="com.dao.InterUserDao"></bean> 不装配接口-->
	
	<!-- action -->
	<bean id="validateAction" class="com.action.ValidateAction">
		<property name="userServiceImpl" ref="userServiceImpl"></property>
	</bean>
	
	<!-- service -->
	<bean id="userServiceImpl" class="com.service.UserServiceImpl">
		<property name="userDaoImpl" ref="userDaoImpl"></property>
	</bean>
	
	<tx:annotation-driven transaction-manager="transactionManager" />
	
	</beans>
	
	

7、在struts.xml中为在action中新添加的register方法配置action信息

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
        "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
        "http://struts.apache.org/dtds/struts-2.0.dtd">
	<struts>
		<package name="default" extends="struts-default">
		
			<!-- 用户登录action -->
			<action name="validate" class="validateAction">
				<result name="success">/success.jsp</result>
				<result name="error">/error.jsp</result>
			</action>
			
			<!-- 保存注册用户 -->
			<action name="register" class="validateAction" method="registerUser">
				<result name="success">/success.jsp</result>
				<result name="error">/error.jsp</result>
			</action>
			
		</package>
		<!-- <constant name="struts.i18n.encoding" value="gb2312"></constant> -->
	</struts>
 

8、保存修改启动Tomcat,浏览器测试

在这次实例中仅进行了id值及用户名的去重没有做进一步的表单验证,而这项功能实现并不困难,使用struts的验校器便可做到。或者甚至可在此基础上轻易地增加更多想要的功能,足可见框架带来的便捷性。

 

【最新】使用SSH框架实现简单的登录注册功能 java.lang.NullPointerException 阅读详情

相关推荐

Eclipse用SSH框架实现登陆注册功能

第一次写博文,写的不好的地方还请多多指教。关于SSH搭建大家可以看这篇博文,讲的很详细,是搭建SSH框架具有注册功能的例子http://blog.youkuaiyun.com/lpftobetheone/article/details/17783791我也是第一次搭SSH框架参考这篇博文成功搭起来后也可以运行,但是其中的具体逻辑我还是不太懂,所以自己决定在此基础上增加登录的功能来进行摸索学习。我先说一下每个类的

aijima0904的博客 9397

最新SSH2环境搭建——代码示例(2)

代码示例

姚双双 廊坊师范学院七期信息技术提高班 905

SSH框架登录注册页面用struts的xml配置方式校验遇到的问题及解决方法

SSH框架用struts的xml配置进行前台验证,验证登录和注册页面遇到的问题及解决方法。

aijima0904的博客 1348

Web中常见状态码浅析

HTTP的响应状态码由5段组成: 1xx 消息,一般是告诉客户端,请求已经收到了,正在处理,别急... 2xx 处理成功,一般表示:请求收悉、我明白你要的、请求已受理、已经处理完成等信息. 3xx 重定向到其它地方。它让客户端再发起一个请求以完成整个处理。 4xx 处理发生错误,责任在客户端,如客户端的请求一个不存在的资源,客户端未被授权,禁止访问等。 5xx 处理发生错误,责任在服务...

weixin_34061042的博客 381

ssh2整合实例(简单实现登陆)

简单的ssh2的整合实例,希望对大家有帮助(完整代码和jar包)

针对so层不固定位置的动态加密,怎么解决?(面试题)

Android逆向之破解某应用加密算法(动态调试so和hook so代码):so 代码动态解密后才执行,我们可以在解密完成后获取解密后的代码或数据。Android逆向之旅—动态方式破解apk进阶篇(IDA调试so源码)如果你有更具体的加密场景,欢迎提供更多信息,我可以给出更详细的方案!某些 so 在运行时生成密钥,解密后再用。某APP密码加密算法分析。

SXXYNHHXX的博客 923

关于 SSH2 的三种登录方式

今天要登录公司的一台Linux server, 当然还是用Poderosa. Poderosa提供了三种SSH的登录方式:PasswordKeyboard InteractionPublic Key我选择了第一种常用的方式, 填入用户和密码,然后登陆, 可是一直提示 "Authentication failed", 很是郁闷, 密码肯定是对的,可是就是不能登录, 还

Minico's blog 1万+

CANoe的安装教程

CANoe的安装教程

weixin_59090531的博客 1万+

SSH2实例编写

  SSH2实例编写(继DAO MVC后又一力作!)   今天第一次编写SSH2的实例,如果有什么问题,欢迎各位提出并提出。   以帮助我这个菜鸟解决发生的错误和问题。   首先来介绍一下这个项目。   这个项目是采用了base的方式进行继承。 项目名称:Test_ssh2 数据库名称:exedtest   首先来看一下我所建立的包。     然后再看一下我的数...

iteye_12569的博客 181

MatterPort3D 数据集下载

【代码】MatterPort3D 数据集下载。

qq_44106838的博客 6773

DiffusionDrive实战:如何用截断扩散模型3个月搞定自动驾驶轨迹规划(附代码)

本文详细介绍了如何利用DiffusionDrive截断扩散模型,在三个月内快速构建端到端的自动驾驶轨迹预测系统。内容涵盖从环境搭建、数据处理、模型架构解析到训练调参和推理优化的完整实战流程,并提供了关键代码示例,旨在帮助开发者高效实现高质量的自动驾驶轨迹规划。

weixin_35578748的博客 143

SSH整合

SSH整合     最近没怎么手头上没什么事情,不过我感觉也是好事,毕竟一直忙碌刀会钝的。 所有最近收刀,静心磨刀,不为外面的什么各种项目所迷惑。收收心,毕竟磨刀不误砍柴工。总结下Spring整合Struts2和Hibernate。     上篇总结了Spring整合Struts2这次我把Hibernate加了进来,Spring这个非常强大的框架也是真真正正的算得上有个有艺术品位的框架,I

zhangdongxuan的博客 784

Open3d Qt的环境配置

目前统一使用qt6配置,open3d中可视化功能目前使用vtk代替,语言为c++。

阁楼 919

使用SSH框架实现简单的登录功能

一、准备工作 1.数据库 数据库使用mysql,下载链接https://dev.mysql.com/downloads/mysql/ 安装配置完成后,使用控制台进入mysql,创建数据库ssh_example 2.开发工具 开发工具与环境:MyEclipse2017,jdk1.8,tomcat8.0 二、环境搭建 1.打开MyEclipse,创建web工程ssh_

逝水流云的博客 3万+

SAP 物料的与压缩库存数据不一致

总结:发生这个问题的原因多数会发生在测试系统在拷贝正式系统的时候会发生这样的情况,系统在拷贝的时候,业务数据还在发生,就会导致数据拷贝的时候丢失数据。经过查询发现是由于物料分类账中的物料的库存数量和 ACDOCA_M_EXTRACT表中的数量对不上,导致系统抛出报错的信息。由于是测试系统,直接更改表的数据,把ACDOCA_M_EXTRACT表中的库存数据和金额与物料分类账中的数据保持一致。在测试系统中进行501和561增加库存的时候,系统提示物料的预压缩库存数据不一致的报错。

我小时候很黑的博客 3302

【Kubernetes】Kubernetes 安全沙箱深度对比:gVisor vs Kata Containers

Kubernetes安全沙箱深度对比:gVisor和Kata Containers在架构、性能与安全性方面各有特点。gVisor通过用户态内核(Sentry)实现软件隔离,启动快(毫秒级)但CPU开销大(20-30%),适合Web服务等场景。Kata Containers采用轻量级虚拟机提供硬件级隔离,启动较慢(1-2秒)但兼容性更好,适合金融等高安全需求。测试显示gVisor在动态请求下性能下降33%,而Kata性能接近原生。建议根据场景选择:多租户/快速启动用gVisor,敏感数据/极致安全用Kata,

九师兄 178

整合ssh框架下注册登录的实现

最近整合了一个相对于以前做的更为完整的ssh框架,并实现了注册登录的功能。 项目结构 从上往下依次是action类包,dao接口类包,dao接口实现类包,表单类包,数据库表映射类包,业务逻辑接口类包,业务逻辑接口实现类包(说的不对请指出,楼主只是新手菜鸟) RegisterAction.java package com.ssh.action; import com.opensymphon

刘震的专栏 9756

SAP Gateway 故障排查全景图:从 Error Log 到 E2E 追踪,一套面向实战的工具与方法论

本文针对SAP Gateway Foundation(SAP_GWFND)的故障排查需求,梳理了从现象到根因的系统化排查路径。文章首先强调建立标准化排障流程的重要性,随后提供工具矩阵及使用顺序指引:对于请求中断优先查看Error Log(/IWFND/ERROR_LOG和/IWBEP/ERROR_LOG),性能问题使用Performance Trace(/IWFND/TRACES),通知异常则检查Notification Monitor。重点工具包括: Error Log作为中断类错误首要定位器; Appl

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 245

SSH框架整合之注册登录 .

上一篇介绍了三大框架的搭建,今天基于上一次的框架使用MVC模式完成注册和登录功能。 MVC模式:模型(Model),视图(View)和控制Controller)。 MVC模式的目的就是实现Web系统的职能分工。 Model层实现系统中的业务逻辑,通常可以用JavaBean或EJB来实现。 View层用于与用户的交互,通常用JSP来实现。 Controller层是Model与View之间沟通的桥梁

4756

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

一个用SSH框架开发的简单的登录注册系统

这是我用SSH框架开发的一个简单的

乐子 8585

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

struts2+hibernate实现简单登录与注册

最近在自学ssh,以前开发一直用的普通的MVC模式进行开发的,接触了这几个框架后感触很多,学着做了一个简单的登录注册的模块,运用的是struts2和hibernate来实现的。 1.(1)首先,运用了struts2提供的标签,struts2总共提供的标签大体有三类,一种是逻辑控制类标签:if elseif等,一种是表单的标签,这类事最常用的,最后就是非表单的标签如div等等。 ...

xuyuanchen的博客 2127

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

SSH+Maven实现的注册登录实例(功能包含注册、登录等)

SSH+Maven实现的注册登录实例(功能包含注册、登录等)

anmu4200的博客 338

用SSH2简单实现了用户注册登录删除功能

第一次尝试把SSH2整合起来,这里记下编写当中遇到的问题和自己的思考 [size=x-large]一、使用struts编写登陆注册等界面[/size] [code="java"] This is my Register page. username: password: repeatpassword: email: ...

铁血蓝狮 298

SSH框架整合之注册登录

上一篇介绍了三大框架的搭建,今天基于上一次的框架使用MVC模式完成注册和登录功能。 MVC模式:模型(Model),视图(View)和控制Controller)。 MVC模式的目的就是实现Web系统的职能分工。 Model层实现系统中的业务逻辑,通常可以用JavaBean或EJB来实现。 View层用于与用户的交互,通常用JSP来实现。 Controller层是Model与View之间沟通的桥梁

夏影的专栏 1万+

使用SSH搭建用户注册登录系统

【转】http://blog.sina.com.cn/s/blog_a6a6b3cd01017c57.html 什么是SSH? SSH对应 struts spring hibernatestruts 采用MVC模式,主要是作用于用户交互spring 采用IOC和AOP~作用比较抽象,是用于项目的松耦合hibernate 是对象持久化框架,其实就是实体类和数据库表建立关系,操作类就会触发相应的s...

weixin_33871366的博客 339

Git配置SSH服务,上传SSH-key(详细简单),生成ssh密钥,ssh免密登录

Git配置SSH服务,上传SSH-key(详细简单),生成ssh密钥,ssh免密登录 文章目录Git配置SSH服务,上传SSH-key(详细简单),生成ssh密钥,ssh免密登录1:准备工作1.1:检查用户信息1.2:检查ssh密钥是否存在window:mac or linux:2:生成ssh密钥3:配置ssh密钥信息 1:准备工作 1.1:检查用户信息 首先需要提前安装git,然后注册一个账号。 接下来打开控制台,查看是否配置了邮箱: git config user.email 如果没有配置,配置你的邮

qq_41974199的博客 4050
上一篇: SSH2简单登录例子
下一篇: SSH2简单实现分页效果
zero_130
博客等级 码龄10年 21粉丝 46原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值