个人日记

1,创建数据库,创建表相应类:DBHelper.java继承自SQLiteOpenHelper数据库创建辅助类

DBHelper.java源码:

package cn.bzu.mydiary.DB;

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;

import android.database.sqlite.SQLiteOpenHelper;

public class DBHelper extends SQLiteOpenHelper {
	private static final String DB_NAME="mydiary.db";//数据库名称
	private static final int DB_VERSION=1;//数据库版本

	public DBHelper(Context context) {//上下文
		super(context, DB_NAME, null, DB_VERSION);
		
	}

	@Override
	public void onCreate(SQLiteDatabase db) {
		//建表_id为主键并为自动增长
		String sql="create table diary(_id integer primary key autoincrement,title varchar(20),content varchar(1000),createtime)";
	
		db.execSQL(sql);
		
		
	}

	@Override
	public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
		

	}

}


2.编写日记实体类Diary.java字段与数据库对应

Diary.java源码:

package cn.bzu.mydiary.entity;

public class Diary {
	private Integer id;
	private String title;
	private String content;
	private String createtime;
	
	public Diary() {
		super();
	}
	public Diary(String title, String content, String createtime) {
		super();
		this.title = title;
		this.content = content;
		this.createtime = createtime;
	}
	public Integer getId() {
		return id;
	}
	public void setId(Integer id) {
		this.id = id;
	}
	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 String getCreatetime() {
		return createtime;
	}
	public void setCreatetime(String createtime) {
		this.createtime = createtime;
	}
	public Diary(Integer id, String title, String content, String createtime) {
		
		this.id = id;
		this.title = title;
		this.content = content;
		this.createtime = createtime;
	}
	
	

}


3.编写数据库操作类DBDao.java,实现对日记的插入,删除,更新,获取所有的日记,通过主键id来获取日记,实现数据库的计数

package cn.bzu.mydiary.Dao;

import java.util.ArrayList;
import java.util.List;
import java.lang.*;

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.net.UrlQuerySanitizer.ValueSanitizer;
import cn.bzu.mydiary.DB.DBHelper;
import cn.bzu.mydiary.entity.Diary;


public class DBDao {
	//DBHelper类的变量
	private DBHelper dbHelper;
//传上下文,由Activity传值
	public DBDao(Context context) {
		
		dbHelper = new DBHelper(context);
	}
	//save保存日记
	public void save(Diary diary) {
		SQLiteDatabase db=dbHelper.getWritableDatabase();
		/*ContentValues values=new ContentValues();
		values.put("title", diary.getTitle());
		values.put("content", diary.getContent());
		values.put("createtime", diary.getCreatetime());*/
		//?为占位符
		String sql="insert into diary(title,content,createtime)values(?,?,?)";
		//两个参数,第二个参数Object[]类型的数组,设置数据值
		db.execSQL(sql, new String[]{diary.getTitle(),diary.getContent(),diary.getCreatetime()});
		//db.insert("diary", null, values);
		

	}
	//删除日记
	public void deleteDiary(Integer id) {
		SQLiteDatabase db=dbHelper.getWritableDatabase();
		//db.delete("diary", "_id=?", new String[]{id.toString()});
		String sql="delete from diary where _id=?";
		db.execSQL(sql,new Object[]{id});
		

	}
	//通过id获取日记
	public Diary getDiaryById(Integer id) {
		Diary diary=null;
		SQLiteDatabase db=dbHelper.getReadableDatabase();
		 //Cursor cursor=db.query("diary", null, null, null, null, "_id=?", null);
		
		String sql="select * from diary where _id=?";
		Cursor cursor=db.rawQuery(sql,new String[]{id.toString()});
		if(cursor.moveToFirst()){
			Integer _id=cursor.getInt(cursor.getColumnIndex("_id"));
			String title=cursor.getString(cursor.getColumnIndex("title"));
			String content=cursor.getString(cursor.getColumnIndex("content"));
			String createtime=cursor.getString(cursor.getColumnIndex("createtime"));
			diary = new Diary(title, content, createtime);
			diary.setId(_id);
		}
				return diary;
		

	}
	//更新日记
	public void updateDiary(Diary diary) {
		SQLiteDatabase db=dbHelper.getWritableDatabase();
		String sql="update diary set title=?,content=?,createtime=? where _id=?";
		db.execSQL(sql, new Object[]{diary.getTitle(),diary.getContent(),diary.getCreatetime(),diary.getId()});
		/*ContentValues values=new ContentValues();
		values.put("title", diary.getTitle());
		values.put("content", diary.getContent());
		values.put("createtime", diary.getCreatetime());
		db.update("diary", values, "_id=?", new String[]{diary.getId().toString()});
*/
	}
	//计数日记
	public int count(Diary diary) {
	 int count=0;
		SQLiteDatabase db=dbHelper.getReadableDatabase();
		 //Cursor cursor=db.query("diary", new String[]{"count(*)"}, null, null, null, null, null);
		String sql="select count(*) from diary";
		Cursor cursor=db.rawQuery(sql,null);
		cursor.moveToFirst();
		count=cursor.getInt(0);
		cursor.close();
		return count;
		
		
		

	}
	//获取所有的日记,返回类型List集合
	public List<Diary> getAllDiarys() {
		List<Diary> diarys=new ArrayList<Diary>();
		//数据库
		SQLiteDatabase db=dbHelper.getReadableDatabase();
		String sql="select * from diary";
		//返回游标,游标指向第一个的前一个位置
		 //Cursor cursor=db.query("diary", null,null, null, null, null, null);
		Cursor cursor=db.rawQuery(sql, null);
		//游标要下移,展示每一条记录
		while(cursor.moveToNext()){
			Integer id=cursor.getInt(cursor.getColumnIndex("_id"));
			String title=cursor.getString(cursor.getColumnIndex("title"));
			String content=cursor.getString(cursor.getColumnIndex("content"));
			String createtime=cursor.getString(cursor.getColumnIndex("createtime"));
			//创建Diary的实例
			Diary diary=new Diary(id, title, content, createtime);
			diarys.add(diary);
		}
		
		return diarys;
		

	}
	
	
	
}
				
	



4.获取当前时间单独抽出类DateTool.java来实现

package cn.bzu.mydiary.tools;

import java.text.SimpleDateFormat;
import java.util.Date;

public class DateTool {
	public static String getCurrentTime(){
	SimpleDateFormat formatter=new SimpleDateFormat("yyyy年MM月dd日 hh:mm:ss");
	return formatter.format(new Date());
	}
	

}


5.界面设计,首先进入欢迎界面WelcomeActivity.java,延迟一段时间进入主Activity

package cn.bzu.mydiary;


import android.os.Bundle;
import android.os.Handler;
import android.app.Activity;
import android.content.Intent;
import android.view.Menu;
import android.view.View;
import android.view.animation.AlphaAnimation;
import android.widget.ImageView;
import android.widget.ProgressBar;

public class WelcomeActivity extends Activity {
	
	private ImageView imageView;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_welcome);
		
		imageView=(ImageView) this.findViewById(R.id.im_welcome);
		
		// 创建了一个淡入效果的Animation对象
				AlphaAnimation animation = new AlphaAnimation(0.0f, 1.0f);
				animation.setDuration(1000);
				animation.setStartOffset(500);
				imageView.startAnimation(animation);
				
				new Handler().postDelayed(new Runnable()
				{// 新建一个handler实现演示跳转
							public void run()
							{
								Intent intent = new Intent();
								intent.setClass(WelcomeActivity.this, MainActivity.class);
								startActivity(intent);
							}
						}, 3000);
			}
	

	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		// Inflate the menu; this adds items to the action bar if it is present.
		getMenuInflater().inflate(R.menu.welcome, menu);
		return true;
	}

}

6.进行MainActivity的布局activity_main.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical"
    android:background="@drawable/back"
    tools:context=".MainActivity" >
    <ListView 
        android:id="@+id/listview"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        ></ListView>
    <TextView 
        android:id="@+id/emptyshow"
        android:layout_height="wrap_content"
        android:layout_width="wrap_content"
        android:text="你好懒啊,还没开始写日记呢"/>

   
</LinearLayout>

7.对列表的每一项的内容进行布局item.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="horizontal" >
    <TextView 
        android:id="@+id/title"
        android:layout_height="wrap_content"
        android:layout_width="200dip"
        android:textColor="#0000ff"
        android:textSize="20sp"/>
    <TextView 
        android:id="@+id/createtime"
        
        android:layout_height="wrap_content"
        android:layout_width="wrap_content"
        android:textColor="#0000ff"
        android:textSize="20sp"/>
    

</LinearLayout>

8.点击MainActitvity的menu实现添加日记的功能布局文件main.xml

<menu xmlns:android="http://schemas.android.com/apk/res/android" >

    <item
        android:id="@+id/diary_add"
        android:icon="@android:drawable/ic_menu_add"
        android:title="@string/diary_add" />
 
    
</menu>

9.添加日记的布局文件activity_new_diary.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:background="@drawable/newdiary"
    tools:context=".New_Diary" >
 <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textColor="#87cefa" 
        android:text="日记标题" />

    <EditText
        android:id="@+id/t"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:ems="10" >
    </EditText>

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textColor="#87cefa"
        android:text="日记内容" />

    <EditText
        android:gravity="top"
        android:id="@+id/c"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_weight="1"
      
        />
    
<Button 
    android:id="@+id/confirm"
    android:layout_height="wrap_content"
    android:layout_width="wrap_content"
    android:text="确定"/>
</LinearLayout>

10.添加日记实现New_Diary.java源码:

package cn.bzu.mydiary;

import cn.bzu.mydiary.Dao.DBDao;
import cn.bzu.mydiary.entity.Diary;
import cn.bzu.mydiary.tools.DateTool;
import android.os.Bundle;
import android.app.Activity;
import android.content.Intent;
import android.view.Menu;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;

public class New_Diary extends Activity {
	private EditText titleText;
	private EditText contentText;
	private Button confirm;
	private DBDao dbDao;
    
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_new__diary);
		dbDao=new DBDao(this);
	//获取组件
		titleText=(EditText) this.findViewById(R.id.t);
		contentText=(EditText) this.findViewById(R.id.c);
		
		confirm=(Button) this.findViewById(R.id.confirm);
		confirm.setOnClickListener(new Button.OnClickListener() {
			
			@Override
			/**
			 * 点击确定按钮时,把用户输入的标题,内容,和获取的当前时间添加到数据库中
			 */
			public void onClick(View v) {
				
				String title=titleText.getText().toString();
				String content=contentText.getText().toString();
				Diary diary=new Diary(title, content, DateTool.getCurrentTime());
				dbDao.save(diary);
			//添加完毕,跳转到MainActivity中,查看数据是否添加成功
				Intent intent=new Intent();
				intent.setClass(New_Diary.this, MainActivity.class);
				startActivity(intent);
				finish();
				
			}
		});
	}
	
	
	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		// Inflate the menu; this adds items to the action bar if it is present.
		getMenuInflater().inflate(R.menu.new__diary, menu);
		return true;
	}

}


11.MainActivity.java源码:

package cn.bzu.mydiary;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import cn.bzu.mydiary.Dao.DBDao;
import cn.bzu.mydiary.entity.Diary;
import android.os.Bundle;
import android.app.Activity;
import android.content.Intent;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ListView;
import android.widget.SimpleAdapter;
import android.widget.TextView;


public class MainActivity extends Activity {
	
	 private DBDao dbDao;
	
	
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
     dbDao=new DBDao(this);//new DBDao的实例
      List<Diary> diaries=dbDao.getAllDiarys();//获取所有 的日记
       ListView listView=(ListView) this.findViewById(R.id.listview);//获取组件
      
      //列表为空时
      TextView emptyshow=(TextView) this.findViewById(R.id.emptyshow);
      listView.setEmptyView(emptyshow);//为空时显示TextView的内容,参数为(View,emptyView)
     

     
  	
     
      //提供适配器对象
      List<Map<String,Object>> data=new ArrayList<Map<String,Object>>();
      for(Diary diary:diaries){
    	  Map<String,Object> map=new HashMap<String,Object>();
    	  
    	  map.put("title", diary.getTitle());
    	  map.put("createtime", diary.getCreatetime());
    	  map.put("content", diary.getContent());
    	  map.put("id", diary.getId());
    	//加入map集合
    	  data.add(map);
    	 
      }
      SimpleAdapter simpleAdapter=new SimpleAdapter(this, data, R.layout.item, new String[]{"title","createtime"}, new int[]{R.id.title,R.id.createtime});
      listView.setAdapter(simpleAdapter);
      listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {

		@Override
		public void onItemClick(AdapterView<?> parent, View view, int position,
				long id) {
			
			ListView listView=(ListView) parent;
			Map<String,Object> item=(Map<String, Object>) listView.getItemAtPosition(position);
			String title=(String) item.get("title");
			String createtime=(String) item.get("createtime");
			Integer _id=(Integer) item.get("id");
			String content=(String) item.get("content");
		   //点击每一行跳转到ContentActivity显示所对应日记的标题和内容
			Intent intent=new Intent();
			intent.setClass(MainActivity.this, ContentActivity.class);
			Bundle bundle=new Bundle();//bundle传值。放数据
			bundle.putString("title", title);
			bundle.putString("content", content);
			bundle.putInt("id", _id);
			intent.putExtras(bundle);
			startActivity(intent);
			
			
			
			finish();
			//Toast.makeText(MainActivity.this, title+createtime, Toast.LENGTH_LONG).show();
		
		}
	});
    }
  
   
	
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        
        getMenuInflater().inflate(R.menu.main, menu);
       
        
        	
      
        return true;
    }
  
    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
    	
    	if(item.getItemId()==R.id.diary_add){
    		Intent intent=new Intent();
    		intent.setClass(MainActivity.this, New_Diary.class);
    		startActivity(intent);
    		finish();
    	}
    	return super.onOptionsItemSelected(item);
    }
   
}


12.显示标题和内容的布局文件activity_content.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:background="@drawable/bg"
    android:orientation="vertical"
    tools:context=".ContentActivity" >

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textColor="#87cefa"
        android:text="日记标题" />

    <EditText
        android:id="@+id/title"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:ems="10" >
    </EditText>

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textColor="#87cefa"
        android:text="日记内容" />

    <EditText
        android:gravity="top"
        android:id="@+id/content"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_weight="1"
      
       />

</LinearLayout>

13.点击显示标题和内容的menu进行编辑和删除操作,布局文件content.xml

<menu xmlns:android="http://schemas.android.com/apk/res/android" >

      <item
        android:id="@+id/diary_edit"
        android:icon="@android:drawable/ic_menu_edit"
        android:title="@string/diary_edit" />
 <item
        android:id="@+id/diary_delete"
        android:icon="@android:drawable/ic_menu_delete"
        android:title="@string/diary_delete" />
    
</menu>

14.
显示标题和内容的ContentActivity.java源码:

 

package cn.bzu.mydiary;

import cn.bzu.mydiary.Dao.DBDao;
import cn.bzu.mydiary.entity.Diary;

import android.os.Bundle;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.AlertDialog.Builder;

import android.content.DialogInterface;
import android.content.DialogInterface.OnClickListener;
import android.content.Intent;

import android.view.Menu;
import android.view.MenuItem;
import android.widget.EditText;



public class ContentActivity extends Activity {
	private EditText title;
	private EditText content;
	private DBDao dbDao;
	private int id;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_content);
		dbDao=new DBDao(this);
		//获取组件
		title = (EditText) this.findViewById(R.id.title);
		
		content=(EditText) this.findViewById(R.id.content);
		Bundle b = getIntent().getExtras();//b接收intent传来的值
		if (b != null) {
			String text = b.getString("title");
			String text1=b.getString("content");
			id=b.getInt("id");
			title.setText(text);//获取的内容显示到相应的编辑框中
			content.setText(text1);
		}

	}

	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		// Inflate the menu; this adds items to the action bar if it is present.
		getMenuInflater().inflate(R.menu.content, menu);
		return true;
	}
	 @Override
	    public boolean onOptionsItemSelected(MenuItem item) {
	    	if(item.getItemId()==R.id.diary_edit){//点击编辑时跳转到Edit_Diary
	    		Intent intent=new Intent();
	    	 Diary diary=dbDao.getDiaryById(id);//通过id获取日记
	    	 intent.putExtra("id", diary.getId());//把id再传值到Edit_Diary中
	    		intent.setClass(ContentActivity.this, Edit_Diary.class);
	    		startActivity(intent);
	    		finish();
	    	}
	    		
	    	
	    	if(item.getItemId()==R.id.diary_delete){//点击删除时,弹出对话框
	    		
	    			dialog();
	    			
	    		
	    	}
	    	
	    
	    	return super.onOptionsItemSelected(item);
	    }
	 /**。
	  * 对话框进行友好提示
	  */
	 public void dialog(){
		  AlertDialog.Builder builder = new Builder(ContentActivity.this);
		  builder.setMessage("确认删除吗?");

		  builder.setTitle("提示");

		  builder.setPositiveButton("确认", new OnClickListener() {

		   @Override
		   public void onClick(DialogInterface dialog, int which) {
			   DBDao dbDao=new DBDao(ContentActivity.this);
			   dbDao.deleteDiary(id);//确认删除时,删除显示的日记
			   title.setText("");//把标题和内容显示的设为空
			   content.setText("");
			   	Intent intent=new Intent();
			   	intent.setClass(ContentActivity.this, MainActivity.class);//跳转MainActivity查看是否删除了日记
			   	startActivity(intent);
			   	finish();

		    
		   }
		  });

		  builder.setNegativeButton("取消", new OnClickListener() {

		   @Override
		   public void onClick(DialogInterface dialog, int which) {
		   
		   }
		  });

		  builder.create().show();
		 }

		 

}

15.编辑日记日记的布局文件activitity_edit_diary.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
   android:orientation="vertical"
    tools:context=".Edit_Diary" >

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textColor="#87cefa" 
        android:text="日记标题" />

    <EditText
        android:id="@+id/ti"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:ems="10" >
    </EditText>

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textColor="#87cefa"
        android:text="日记内容" />

    <EditText
        android:gravity="top"
        android:id="@+id/co"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_weight="1"
      
        />
    
<Button 
    android:id="@+id/conf"
    android:onClick="update"
    android:layout_height="wrap_content"
    android:layout_width="wrap_content"
    android:text="提交日记"/>

</LinearLayout>

16.编辑日记Edit_Diary.java源码:

package cn.bzu.mydiary;
import cn.bzu.mydiary.Dao.DBDao;
import cn.bzu.mydiary.entity.Diary;
import cn.bzu.mydiary.tools.DateTool;
import android.os.Bundle;
import android.app.Activity;
import android.content.Intent;
import android.view.Menu;
import android.view.View;


import android.widget.EditText;

public class Edit_Diary extends Activity {
	private EditText ti;
	private EditText co;
	private DBDao dbDao;
	int id;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_edit__diary);
		id=getIntent().getIntExtra("id", 0);//获取传来的id的值
		if(id!=0){
		dbDao=new DBDao(this);
		
		Diary diary=dbDao.getDiaryById((int)id);
		//查找组件
		ti=(EditText) this.findViewById(R.id.ti);
	    co=(EditText) this.findViewById(R.id.co);
	    
	    
	    	
			
			
			
			ti.setText(diary.getTitle());
			co.setText(diary.getContent());	
		}
	}
		
	  
			
			public void update(View v) {
				String title=ti.getText().toString();
				String content=co.getText().toString();
				
				Diary diary=new Diary(title,content,DateTool.getCurrentTime());
				diary.setId(id);
				
				dbDao.updateDiary(diary);//更新日记
				//更新完后,再次跳转到主Activity查看是否更新
				
				Intent intent=new Intent();
				
				intent.setClass(Edit_Diary.this, MainActivity.class);
				startActivity(intent);
				finish();
				
				
			}
	
			
		
		
	
	
	
	
	


	
	
	
	


	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		// Inflate the menu; this adds items to the action bar if it is present.
		getMenuInflater().inflate(R.menu.edit__diary, menu);
		return true;
	}

}

17.运行效果图:

欢迎页面:


 

2.添加效果图:




3.删除效果图:



4.编辑效果图:


 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值