Android Studio设计基于云平台的教学信息系统APP(一)

本文章是我在做课程设计时的一个大体的过程,包括环境的下载、云平台怎么连接数据库、数据库又怎么和APP交互,虽然做的很简陋,不过毕竟只有两周的时间,收获还是很多的,最主要的是在我做这个课程设计的时候,有很多东西我都是搜不到的,或者说是很难找到解决办法。


目录

一、云平台部分

二、Android Studio部分

(一)基础环境配置

(二)Android Studio和云数据库的交互部分(重点内容)

1、DbOpenHelper.java

 2、XXInfo.java

3、XXInfoDao.java

4、lvXXInfoAdapter.java

5、XX.java

(三)Android Studio界面设计部分

1、activity_chengji.xml

2、activity_chengji_list_item.xml

三、一些问题


一、云平台部分

使用Android Studio设计一个基于云平台的教学信息系统APP,最重要的就是云平台。

本文章的云平台使用阿里云的云数据库RDS MySQL版,如下图:

 

 进去之后直接点击免费试用

然后选择云数据库RDS SQL Sever,点击下方立即试用

地域和可用区选择最近的就行,这里我选择的是成都

数据库版本用默认的就好,要知道数据库并不是版本越高越好

 如果只是和我一样做个课程设计,不需要续费,然后点击阅读并同意服务协议就可以立即试用了

然后后面的步骤参考文章http://t.csdn.cn/ejdm7

需注意,上述文章中提到需要下载Navicat,这里我也用的Navicat

其次最重要的就是记住你的外网IP地址,和数据库的账号和密码!将会在Android Studio使用到。


二、Android Studio部分

(一)基础环境配置

1、Android Studio及相关虚拟机的下载请参考别的文章,有很多的,可能会有修改系系统环境变量,注意一下

2、Android Studio中需要有一个mysql-connector-java-5.1.46-bin.jar文件,具体请参考文章http://t.csdn.cn/323GZ

3、要能连接上云数据库,还需要在Android Studio中加入联网代码,如下:

在目录app/src/main/AndroidManifest.xml中加入代码

 代码:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

因此在运行虚拟机的时候一定要保证网络是处于连接状态的,如果虚拟机运行不了,请注意是否是断网了


(二)Android Studio和云数据库的交互部分(重点内容)

1、DbOpenHelper.java

DbOpenHelper是Android Studio连接云数据库的重要文件,具体位置如下:

 代码:(有几个重要的地方需注意)

(1)com.mysql.jdbc.Driver是MySql驱动

(2)?是云数据库的外网地址,?的具体写法如下:

"jdbc:mysql://外网地址:端口号/数据库名称"

其中红色部分是不能更改的,黑色部分是需要手动覆盖的,一般来说端口号是3306

(3)??是数据库的账号

(4)???是密码

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Statement;

public class DbOpenHelper {
    private static String CLS = "com.mysql.jdbc.Driver";// MySql驱动
    private static String URL = "?";//外网地址
    private static String USER = "??";//账号
    private static String PWD = "???";//密码

    public static Connection conn;      // 连接对象
    public static Statement stmt;       // 命令集
    public static PreparedStatement pStmt; // 预编译命令集
    public static ResultSet rs;         // 结果表

    // 取得连接的方法
    public static void getConnection(){
        try{
            Class.forName(CLS);
            conn = DriverManager.getConnection(URL, USER, PWD);
        }catch(Exception e){
            e.printStackTrace();
        }
    }

    // 关闭数据库操作对象
    public static void closeAll()
    {
        try {
            if(rs!=null){
                rs.close();
                rs=null;
            }
            if(stmt!=null){
                stmt.close();
                stmt=null;
            }
            if(pStmt!=null){
                pStmt.close();
                pStmt=null;
            }
            if(conn!=null){
                conn.close();
                conn=null;
            }
        }catch (Exception e){
            e.printStackTrace();
        }
    }
}

我这里的数据库名称是app,见图:


2、XXInfo.java

XXinfo中的XX可以是任意的名称,在这里用我的文件举例

我的文件名是chengjiInfo,位置同DbOpenHelper

代码:

import java.io.Serializable;

public class chengjiInfo implements Serializable{
    private String sconum;
    private String clanum;
    private String snum;
    private String sname;
    private String score;
    public chengjiInfo() {
    }
    public chengjiInfo(String sconum, String clanum, String snum, String sname,String score)  {
        this.sconum = sconum;
        this.clanum=clanum;
        this.snum=snum;
        this.sname=sname;
        this.score=score;
    }
    //
    public String getSconum() {
        return sconum;
    }
    public void setSconum(String sconum) {
        this.sconum = sconum;
    }
    //
    public String getClanum() {
        return clanum;
    }
    public void setClanum(String clanum) {
        this.clanum = clanum;
    }
    //
    public String getSnum() {
        return snum;
    }
    public void setSnum(String snum) {
        this.snum = snum;
    }
    //
    public String getSname() {
        return sname;
    }
    public void setSname(String sname) {
        this.sname = sname;
    }
    //
    public String getScore() {
        return score;
    }
    public void setScore(String score) {
        this.score = score;
    }

    public String toString() {
        return "chengjiInfo{" +
                "sconum='" + sconum + '\'' +
                ", clanum='" + clanum + '\'' +
                ", snum='" + snum + '\'' +
                ", sname='" + sname + '\'' +
                ", score='" + score + '\'' +
                '}';
    }
}

其中,private String的五个声明分别对应我在Navicat中,库app下的成绩表scores五个表头

如图:可以看到是一一对应的

 可根据自己的表的实际情况增减

同时也要注意在代码中相同的部分也要根据自己的表情况更改名称等


3、XXInfoDao.java

XXinfoDao中的XX可以是任意的名称,在这里用我文件的举例

我的文件名是chengjiInfoDao,位置同DbOpenHelper

代码:

其中" select *  from scores ",scores是我的表名

" select *  from scores where sconum=? clanum=? snum=? sname=? and score=? " where后面的也就是该表下的表头

import java.util.ArrayList;
import java.util.List;

public class chengjiInfoDao extends DbOpenHelper{
    /**
     *查找全部
     * @return 返回用户名和密码的列表
     */
    public List<chengjiInfo> getAllStuXscjList(){
        List<chengjiInfo> list = new ArrayList<>();
        try {
            getConnection(); // 取得连接信息
            String sql = "select * from scores";
            pStmt = conn.prepareStatement(sql);
            // 填充 第一个 uname

            rs = pStmt.executeQuery();//执行sql语句
            //如果有查询结果,则执行 if 代码块中的语句,否则不执行
            while (rs.next()){
                chengjiInfo item = new chengjiInfo();
                item.setSconum(rs.getString("sconum"));
                item.setClanum(rs.getString("clanum"));
                item.setSnum(rs.getString("snum"));
                item.setSname(rs.getString("sname"));
                item.setScore(rs.getString("score"));
                list.add(item);
            }
        }catch (Exception e){
            e.printStackTrace();
        }finally {
            closeAll();
        }
        return list;
    }

    /**
     * 按用户名和密码查询信息 
     */
    public chengjiInfo getStuXscjByStudent_idAndCourse_id(String sconum, String clanum,String snum,String sname,String score){
        chengjiInfo item=null;
        try {
            getConnection(); // 取得连接信息
            String sql = "select * from scores where sconum=?  clanum=? snum=? sname=? and score=?";
            pStmt = conn.prepareStatement(sql);
            // 填充 第一个 
            pStmt.setString(1, clanum);
            // 填充 第二个 
            pStmt.setString(2, snum);
            // 填充 第三个 
            pStmt.setString(3, sname);
            // 填充 第四个 
            pStmt.setString(4, score);
            rs = pStmt.executeQuery();//执行sql语句
            //如果有查询结果,则执行 if 代码块中的语句,否则不执行
            if(rs.next()){
                item = new chengjiInfo();
                item.setSconum(rs.getString("sconum"));
                item.setClanum(rs.getString("clanum"));
                item.setSnum(rs.getString("snum"));
                item.setSname(rs.getString("sname"));
                item.setScore(rs.getString("score"));
            }
        }catch (Exception e){
            e.printStackTrace();
        }finally {
            closeAll();
        }
        return item;
    }
}

4、lvXXInfoAdapter.java

lvXXInfoAdapter中的XX可以是任意的名称,在这里用我文件的举例

我的文件名是lvchengjiInfoAdapter,位置同DbOpenHelper

代码:

import android.content.Context;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;
import java.util.List;

public class lvchengjiInfoAdapter extends BaseAdapter{
    private Context context; // 上下文管理信息(谁调用这个适配器谁就是上下文,在本个中是管理员的学生信息管理功能)
    private List<chengjiInfo> chengjiInfoList; // 学生信息数据集合

    public lvchengjiInfoAdapter() {
    }

    public lvchengjiInfoAdapter(Context context, List<chengjiInfo> chengjiInfoList) {
        this.context = context;
        this.chengjiInfoList = chengjiInfoList;
        /* Log.i("数据库条数",":" + studentList.size());*/
    }

    public void setStuXscjinfoList(List<chengjiInfo> chengjiInfoList) {
        this.chengjiInfoList = chengjiInfoList;
    }
  /*  public Context getContext() {
        return context;
    }

    public void setContext(Context context) {
        this.context = context;
    }

    public List<StudentInfo> getStudentList() {
        return studentList;
    }*/

    @Override
    public int getCount() {
        return chengjiInfoList.size();
    }
    @Override
    public Object getItem(int position) {
        return chengjiInfoList.get(position);
    }
    @Override
    public long getItemId(int position) {
        return position;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        ViewHolder viewHolder = null;
        if (convertView == null) {
            // 从context页面获取信息进行反射inflate
            convertView = LayoutInflater.from(context).inflate(R.layout.activity_chengji_list_item, null);
            viewHolder = new ViewHolder();

            viewHolder.xs_bj = (TextView) convertView.findViewById(R.id.xs_bj);
            viewHolder.xs_xh = (TextView) convertView.findViewById(R.id.xs_xh);
            viewHolder.xs_xm = (TextView) convertView.findViewById(R.id.xs_xm);
            viewHolder.xs_cj = (TextView) convertView.findViewById(R.id.xs_cj);
            convertView.setTag(viewHolder);
        } else {
            viewHolder = (ViewHolder) convertView.getTag();
        }

        // 这里进行数据填充
        chengjiInfo item = chengjiInfoList.get(position);

        viewHolder.xs_bj.setText(item.getClanum());
        viewHolder.xs_xh.setText(item.getSnum());
        viewHolder.xs_xm.setText(item.getSname());
        viewHolder.xs_cj.setText(item.getScore());

        return convertView;
    }
    private class ViewHolder{
        private TextView xs_bj,xs_xh,xs_xm,xs_cj;
    }
}

注意:

(1)虽然在Navicat表中,我的scores表有五个表头,但我在这个教学信息系统APP的界面中只显示了后面四个,也就是班级clanum、学号snum、姓名sname和成绩score

如图:(为activity_chengji.xml组件展示,后文会附上具体代码)

(2)在下列这行代码中,R.layout.activity_chengji_list_item是获取了一个后台的xml文件的组件信息,相当于一种中间媒介,数据库的表信息通过这个activity_chengji_list_item.xml文件获取,再放到activity_chengji.xml文件中

convertView = LayoutInflater.from(context).inflate(R.layout.activity_chengji_list_item, null);

(3)xs_bj、xs_xh、xs_xm、xs_cj这四个是组件的id名称,在activity_chengji_list_item.xml文件中分别是班级、学号、姓名、成绩这四个组件的id,具体代码内容见后文


5、XX.java

XX可以是任意的名称,在这里用我文件的举例chengji.java

在新建界面activity_chengji.xml文件时自动生成了其对应的java文件,两者之间会自动连接

因此该java文件对应activity_chengji.xml文件,是APP在该界面的运行程序

这边建议亲先写好activity_chengji.xml文件,再写对应的该java文件

activity_chengji.xml文件会在后文展示

代码:(id都是activity_chengji.xml文件中的,后续将不再说明)

import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.TextView;
import java.util.List;

public class chengji extends AppCompatActivity implements View.OnClickListener{
    private ListView lv_chengji;
    private Handler mainHandler;
    private chengjiInfoDao chengjiInfoDao;
    private List<chengjiInfo> chengjiInfoList;
    private lvchengjiInfoAdapter lvchengjiInfoAdapter;
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_chengji);

        initView();
        loadUserDb();
    }
    private void loadUserDb() {
        new Thread(new Runnable() {
            @Override
            public void run() {
                chengjiInfoList=chengjiInfoDao.getAllStuXscjList();
                mainHandler.post(new Runnable() {
                    @Override
                    public void run() {
                        showLvData();
                    }
                });
            }
        }).start();
    }
    private void showLvData(){
        if (lvchengjiInfoAdapter==null){
            lvchengjiInfoAdapter=new lvchengjiInfoAdapter(this,chengjiInfoList);
            lv_chengji.setAdapter(lvchengjiInfoAdapter);
        }else{
            lvchengjiInfoAdapter.setStuXscjinfoList(chengjiInfoList);
            lvchengjiInfoAdapter.notifyDataSetChanged();
        }
    }
    private void initView() {
        lv_chengji=findViewById(R.id.lv_chengji);
        chengjiInfoDao=new chengjiInfoDao();
        mainHandler=new Handler(getMainLooper());
    }
    public void onClick(View v) {

    }
}

(三)Android Studio界面设计部分

该界面设计主要用到xml文件,前文有提到

1、activity_chengji.xml

代码:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".chengji">
    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="15dp"
        android:layout_marginLeft="15dp"
        android:layout_marginRight="15dp"
        android:gravity="center"
        android:text="成绩信息"
        android:textSize="34sp" />
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="15dp"
        android:layout_marginLeft="15dp"
        android:layout_marginRight="15dp"
        android:orientation="horizontal">
        <TextView
            android:id="@+id/xs_bj"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="班级"
            android:layout_marginLeft="35dp"
            android:textSize="20sp" />
        <TextView
            android:id="@+id/xs_xh"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="学号"
            android:layout_marginLeft="30dp"
            android:textSize="20sp" />
        <TextView
            android:id="@+id/xs_xm"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="姓名"
            android:layout_marginLeft="30dp"
            android:textSize="20sp" />
        <TextView
            android:id="@+id/xs_cj"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="成绩"
            android:layout_marginLeft="30dp"
            android:textSize="20sp" />

    </LinearLayout>
    <ScrollView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_marginLeft="15dp"
        android:layout_marginRight="15dp"
        android:fillViewport="true">
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:orientation="vertical">
            <ListView
                android:id="@+id/lv_chengji"
                android:dividerHeight="2dp"
                android:layout_width="match_parent"
                android:layout_height="match_parent" />

        </LinearLayout>
    </ScrollView>
</LinearLayout>

如图:


2、activity_chengji_list_item.xml

代码:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_margin="5dp"
    android:orientation="vertical"
    tools:context=".chengji_list_item">
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="15dp"
        android:layout_marginLeft="15dp"
        android:layout_marginRight="15dp"
        android:orientation="horizontal">
        <TextView
            android:id="@+id/xs_bj"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="班级"
            android:layout_marginLeft="35dp"
            android:textSize="20sp" />
        <TextView
            android:id="@+id/xs_xh"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="学号"
            android:layout_marginLeft="30dp"
            android:textSize="20sp" />
        <TextView
            android:id="@+id/xs_xm"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="姓名"
            android:layout_marginLeft="30dp"
            android:textSize="20sp" />
        <TextView
            android:id="@+id/xs_cj"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="成绩"
            android:layout_marginLeft="30dp"
            android:textSize="20sp" />

    </LinearLayout>

</LinearLayout>

如图:


三、一些问题

(一)一些可能遇到的问题:

1、环境下载方面,尽可能一次性做好,不要漏步骤,不然很可能重来。我再提一嘴,大概有:Navicat、Android Studio及虚拟机、阿里云数据库、系统环境变量、一些安装包和代码等。

2、云数据库方面我也记不清了,但CSDN里总能找到解决办法的,还是不行就是电脑问题,我室友再做这个课程设计的时候最后借了别人的电脑,毕竟科学的尽头是玄学,千万不要死磕到底你说是吧。

3、提前建立好Navicat里面的表信息,当然在阿里云上面也能建立,不过我还是觉得Navicat更方便简洁一些。不过一定要记得保存,如果在Navicat上建立,保存后在阿里云的数据库上面是可以看到的。

4、先设计界面,再写对应的java代码,在设计界面时最好仔细观察虚拟机界面是否合理美观实用,写java程序时注意逻辑,也不要有错误的id等等,有些bug可能不会提示,一定要运行检查。

5、本文章的续篇已经完成了一部分内容的补写,在仅能显示表信息的基础上,增加了删除修改添加信息的功能,以此能在APP上实现对云平台表数据信息的删除、修改和添加。至于搜索等功能还请等待后续编辑,也可能我鸽我自己: )。

续篇:http://t.csdn.cn/Yfiqg


(二)一些感悟:

写这篇文章最主要是因为我没找到我这种的内容,所以我写了(嘻嘻.jpg)

另外,有什么问题可以联系我,某绿色软件账号:1316356284(企鹅同上)

  • 3
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
好的,我可以为您提供一些指导。首先,您需要确定教学管理信息系统的功能和模块,例如学生管理、课程管理、教师管理、成绩管理等等。然后,您可以采用常用的Material Design风格来设计UI界面,这可以使您的应用看起来更加现代和美观。 下面是一个简单的布局示例: ``` <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:id="@+id/root_layout" android:layout_width="match_parent" android:layout_height="match_parent"> <!-- Header 标题栏 --> <androidx.appcompat.widget.Toolbar android:id="@+id/toolbar" android:layout_width="match_parent" android:layout_height="?attr/actionBarSize" android:background="?attr/colorPrimary" android:theme="@style/ThemeOverlay.AppCompat.ActionBar" app:title="教学管理系统" app:titleTextColor="@android:color/white" /> <!-- 学生管理模块 --> <TextView android:id="@+id/student_title" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="学生管理" android:textSize="20sp" android:textStyle="bold" app:layout_constraintBottom_toTopOf="@+id/student_recycler_view" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/toolbar" /> <androidx.recyclerview.widget.RecyclerView android:id="@+id/student_recycler_view" android:layout_width="0dp" android:layout_height="0dp" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/student_title" /> <!-- 课程管理模块 --> <TextView android:id="@+id/course_title" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="课程管理" android:textSize="20sp" android:textStyle="bold" app:layout_constraintBottom_toTopOf="@+id/course_recycler_view" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/student_recycler_view" /> <androidx.recyclerview.widget.RecyclerView android:id="@+id/course_recycler_view" android:layout_width="0dp" android:layout_height="0dp" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/course_title" /> <!-- 教师管理模块 --> <TextView android:id="@+id/teacher_title" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="教师管理" android:textSize="20sp" android:textStyle="bold" app:layout_constraintBottom_toTopOf="@+id/teacher_recycler_view" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/course_recycler_view" /> <androidx.recyclerview.widget.RecyclerView android:id="@+id/teacher_recycler_view" android:layout_width="0dp" android:layout_height="0dp" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/teacher_title" /> <!-- 成绩管理模块 --> <TextView android:id="@+id/score_title" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="成绩管理" android:textSize="20sp" android:textStyle="bold" app:layout_constraintBottom_toTopOf="@+id/score_recycler_view" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/teacher_recycler_view" /> <androidx.recyclerview.widget.RecyclerView android:id="@+id/score_recycler_view" android:layout_width="0dp" android:layout_height="0dp" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/score_title" /> </androidx.constraintlayout.widget.ConstraintLayout> ``` 该布局中使用了ConstraintLayout作为根布局,使用RecyclerView来显示数据列表。您还可以为每个模块添加适当的操作按钮、搜索框等等。最后,您需要在Java代码中实现每个模块的业务逻辑,例如读取和写入数据库、更新UI界面等等。祝您成功完成开发!
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值