主从表设计

通常我们在设计主从表是,有增加删除改。

我采用的方法是单头和单身 和DT同时绑定,这样的话就可以通过DT的状态还进行新增、修改、删除

直接上源码了:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using System.Data.SqlClient;
using SqlServerDAL;
using System.Windows.Forms;
namespace BLL
{
    /// <summary>
    /// 采购单管理
    /// </summary>
    public class PO
    {
        private DataTable dtNav = null;   //单据导航
        private DataTable dtDD = null;    //单头
        private DataTable dtDetial = null;//单身明细
        private DataSet ds = null;
       
        public PO() //构造函数
        {
            dtNav = new DataTable();
            dtDD = new DataTable();
            dtDetial = new DataTable();
            DataColumn col;

            //导航列表[单别,单号,供应商编码]
            col = new DataColumn();
            col.DataType = Type.GetType("System.String");
            col.ColumnName = "DocType";
            dtNav.Columns.Add(col);

            col = new DataColumn();
            col.DataType = Type.GetType("System.String");
            col.ColumnName = "DocNumber";
            dtNav.Columns.Add(col);

            col = new DataColumn();
            col.DataType = Type.GetType("System.String");
            col.ColumnName = "Vendor";
            dtNav.Columns.Add(col);

   

            //单头
            col = new DataColumn();
            col.DataType = Type.GetType("System.Int32");
            col.ColumnName = "ID";
            dtDD.Columns.Add(col);

            col = new DataColumn();
            col.DataType = Type.GetType("System.String");
            col.ColumnName = "DocType";
            
            dtDD.Columns.Add(col);
            
            col = new DataColumn();
            col.DataType = Type.GetType("System.String");
            col.ColumnName = "DocNumber";
            dtDD.Columns.Add(col);
            col = new DataColumn();
            col.DataType = Type.GetType("System.String");
            col.ColumnName = "Vendor";
            dtDD.Columns.Add(col);
            //明细表

            col = new DataColumn();
            col.DataType = Type.GetType("System.Int32");
            col.ColumnName = "ID";
            dtDetial.Columns.Add(col);

            col = new DataColumn();
            col.DataType = Type.GetType("System.String");
            col.ColumnName = "DocType";
         
            col.ReadOnly = true;
             
            dtDetial.Columns.Add(col);

            col = new DataColumn();
            col.DataType = Type.GetType("System.String");
            col.ColumnName = "DocNumber";
            col.ReadOnly = true;
            dtDetial.Columns.Add(col);

            col = new DataColumn();
            col.DataType = Type.GetType("System.Int32");
            col.ColumnName = "Line";
            col.ReadOnly = true;  
            dtDetial.Columns.Add(col);


            col = new DataColumn();
            col.DataType = Type.GetType("System.String");
            col.ColumnName = "item";
            dtDetial.Columns.Add(col);
           
            
            col = new DataColumn();
            col.DataType = Type.GetType("System.String");
            col.ColumnName = "itemdes";
            dtDetial.Columns.Add(col);

            col = new DataColumn();
            col.DataType = Type.GetType("System.String");
            col.ColumnName = "supplydate";
            dtDetial.Columns.Add(col);


            col = new DataColumn();
            col.DataType = Type.GetType("System.String");
            col.ColumnName = "xx";
            dtDetial.Columns.Add(col);

           // dtDetial.PrimaryKey = new DataColumn[] { dtDetial.Columns["Line"], };

        }
        /// <summary>
        /// 清除导航表数据
        /// </summary>
        private void ClearRowFordtNav()
        {
            if (dtNav.Rows.Count > 0)
            {
                dtNav.Rows.Clear();
            }
        }
        /// <summary>
        /// 清除明细表数据
        /// </summary>
        private void ClearRowFordtDetial()
        {
            if (dtDetial.Rows.Count > 0)
            {
                dtDetial.Rows.Clear();
            }
        }
        /// <summary>
        /// 清除单头数据
        /// </summary>
        private void ClearRowFordtDD()
        {
            if (dtDD.Rows.Count > 0)
            {
                dtDD.Rows.Clear();
            }
        }
        /// <summary>
        /// 得到最新采购单号
        /// </summary>
        /// <returns></returns>
        public string GetPONumber()
        {
           /*
            int result;
            string sql =string.Format("select count(DocNumber) from PO where DocType='{0}' ",model.DocType );
            result = (int)SqlHelper.ExecuteScalar(SqlHelper.conn, CommandType.Text, sql);
            if (result == 0)
            {
                return result = 1;
            }
            sql = string.Format("select max(DocNumber) from PO where DocType='{0}' ", model.DocType);
            result = (int)SqlHelper.ExecuteScalar(SqlHelper.conn, CommandType.Text, sql);
            return result + 1;
            */

            return "";
        }
        /// <summary>
        /// 是否已有ID记录
        /// </summary>
        /// <param name="strCPLBLX"></param>
        /// <returns></returns>
        private bool HaveID(String DocType, String DocNumber)
        {
            string sql = string.Format("select count(DocNumber) from PO where DocType='{0}' and DocNumber='{1}'", DocType,DocNumber);
            int result;
            result = (int)SqlHelper.ExecuteScalar(SqlHelper.conn, CommandType.Text, sql);
            return result > 0;
        }
        /// <summary>
        /// 导航树表
        /// </summary>
        public DataTable GetDtNav
        {
            get { return this.dtNav; }
        }
        /// <summary>
        /// 单头
        /// </summary>
        public DataTable GetDtDD
        {
            get { return this.dtDD; }
        }

        /// <summary>
        /// 明细表
        /// </summary>
        public DataTable GetDtDetial
        {
            get { return this.dtDetial; }
        }
        /// <summary>
        /// 新增一张单,并未在数据库里增加
        /// </summary>
        /// <returns></returns>

        public bool Add( )
        {

            try
            {
                this.ClearRowFordtDetial();
                this.ClearRowFordtDD();

                DataRow dr = null;

                dr = dtDD.NewRow();
                dr["DocType"] = "PO" ;
                dr["DocNumber"] = "2010112" ;
                dr["Vendor"] = "A001";
                dtDD.Rows.Add(dr);

                return true;
            }
            catch
            {

                return false;
            }

        }
        /// <summary>
        /// 单据查找(导航列表)
        /// </summary>
        /// <param name="sql"></param>
        /// <returns></returns>
        public bool FindForNav(string sql)
        {
            this.ClearRowFordtNav();
            this.ClearRowFordtDetial();
            DataTable DtTemp = new DataTable();
            try
            {
                DtTemp = SqlHelper.ExecuteDataset(SqlHelper.conn, CommandType.Text, sql).Tables[0];
                DataRow dr = null;
                for (int i = 0; i < DtTemp.Rows.Count; i++)
                {
                    dr = DtTemp.Rows[i];
                    dtNav.ImportRow(dr);
                }
                return true;
            }
            catch (Exception e)
            {
                System.Windows.Forms.MessageBox.Show("发生错误://n" + e.Message, "系统提示!", System.Windows.Forms.MessageBoxButtons.OK);
                return false;
            }
        }
        /// <summary>
        /// 查找单头
        /// </summary>
        /// <param name="CGDB"></param>
        /// <param name="CHDH"></param>
        /// <returns></returns>
        public bool FindForDD( Model.PO model)
        {
            this.ClearRowFordtDetial();
            this.ClearRowFordtDD();
            DataTable DtTemp = new DataTable();
            string spName = "sp_cpb_dd_item";
            SqlParameter[] sqlParameters = new SqlParameter[]{
                new SqlParameter("@DocType",SqlDbType.Char,2),
                new SqlParameter("@DocNumber",SqlDbType.Char,10),
            };
            sqlParameters[0].Value = model.DocType ;
            sqlParameters[1].Value = model.DocNumber;
            try
            {
                DtTemp = SqlHelper.ExecuteDataset(SqlHelper.conn, CommandType.StoredProcedure, spName, sqlParameters).Tables[0];
                DataRow dr = null;
                for (int i = 0; i < DtTemp.Rows.Count; i++)
                {
                    dr = DtTemp.Rows[i];
                    this.dtDD.ImportRow(dr);
                }
                dtDD.AcceptChanges();
                return true;
            }
            catch (Exception e)
            {
                System.Windows.Forms.MessageBox.Show("发生错误://n" + e.Message, "系统提示!", System.Windows.Forms.MessageBoxButtons.OK);
                return false;

            }
        }
        /// <summary>
        /// 单据查找(单身)
        /// </summary>
        /// <param name="ID"></param>
        /// <returns></returns>
        public bool FindForDetail( Model.PO model)
        {
            this.ClearRowFordtDetial();
            DataTable DtTemp = new DataTable();
            string spName = "sp_cpb_Detail_list";
            SqlParameter[] sqlParameters = new SqlParameter[]{
                new SqlParameter("@DocType",SqlDbType.Char,2),
                new SqlParameter("@DocNumber",SqlDbType.Char,10),
            };

            sqlParameters[0].Value = model.DocType;
            sqlParameters[1].Value = model.DocNumber;
            try
            {
                DtTemp = SqlHelper.ExecuteDataset(SqlHelper.conn, CommandType.StoredProcedure, spName, sqlParameters).Tables[0];
                DataRow dr = null;
                for (int i = 0; i < DtTemp.Rows.Count; i++)
                {
                    dr = DtTemp.Rows[i];
                    this.dtDetial.ImportRow(dr);
                }

                dtDetial.AcceptChanges();
                return true;
            }
            catch (Exception e)
            {

                System.Windows.Forms.MessageBox.Show("发生错误://n" + e.Message, "系统提示!", System.Windows.Forms.MessageBoxButtons.OK);
                return false;
            }
        }
        //行添加
        public bool addRow()
        {
            try
            {

                DataRow dr = dtDetial.NewRow();    
                dr["DocType"] = dtDD.Rows[0]["DocType"];
                dr["DocNumber"] = dtDD.Rows[0]["DocNumber"];
                if (dtDetial.Compute("MAX(Line)+1", "").ToString() == "")
                {
                    dr["Line"] = 1;
                }
                else
                {
                    dr["Line"] =  dtDetial.Compute("MAX(Line)+1", "");
                }
                
                /*
                if (dtDetial.Compute("MAX(Line)+1", "").ToString() == "")
                {
                    dr["item"] ="m"+ "1";
                }
                else
                {
                    dr["item"] = "m"+dtDetial.Compute("MAX(Line)+1", "");
                }
                */

                dtDetial.Rows.Add(dr);

                return true;
            }
            catch (Exception e)
            {

                System.Windows.Forms.MessageBox.Show("在插行时发生错误://n" + e.Message, "系统提示!", System.Windows.Forms.MessageBoxButtons.OK);
                return false;
            }
        }
        /// <summary>
        /// 删除行
        /// </summary>
        /// <param name="DSXH">单身序号ID</param>
        /// <returns></returns>
        public bool DeleteRow(int DSXH)
        {
            try
            {
                dtDetial.Rows.Find(DSXH).Delete();
                return true;
            }
            catch (Exception e)
            {

                System.Windows.Forms.MessageBox.Show("在删行时发生错误://n" + e.Message, "系统提示!", System.Windows.Forms.MessageBoxButtons.OK);
                return false;
            }
        }

        /// <summary>
        /// 删除当前单据
        /// </summary>
        /// <returns></returns>
        public bool Delete(Model.PO  model )
        {

            DataRow dr = null;
            dr = dtDD.Rows[0];
            string spName =string .Empty;
            SqlParameter[] sqlParameters = null;
            String DocType = dr["DocType"].ToString();
            String DocNumber = dr["DocNumber"].ToString();
            spName = "sp_cgd_delete";
            sqlParameters = new SqlParameter[]{
                     new SqlParameter("@DocType",SqlDbType.Char,2),
                    new SqlParameter("@DocNumber",SqlDbType.Char,10),
                 };
            sqlParameters[0].Value = model.DocType ;
            sqlParameters[1].Value = model.DocNumber;

            try
            {
                SqlHelper.ExecuteNonQuery(SqlHelper.conn, CommandType.StoredProcedure, spName, sqlParameters);

                this.ClearRowFordtDetial();
                this.ClearRowFordtDD();
                foreach (DataRow drNav in dtNav.Select("DocType='" + model.DocType + "' AND DocNumber=" + model.DocNumber + ""))
                {
                    this.dtNav.Rows.Remove(drNav);
                }

                return true;
            }
            catch
            {
                return false;
            }

 

 

        }
        /// <summary>
        /// 保存当当单据
        /// </summary>
        /// <returns></returns>
        //单击保存时单头只有两种情况新增和修改
        //单身就有增.删除.修改
        public bool Save(Model.PO model)
        {

           
            //数据验证
            if (dtDD.Rows.Count != 1)
            {

                System.Windows.Forms.MessageBox.Show("单头上没有资料!!!");
                return false;
            }
             
            //单头信息验证
            DataRow drDD = dtDD.Rows[0];
            if (drDD["DocType"].ToString().Trim().Length == 0)
            {

                System.Windows.Forms.MessageBox.Show("请输入采购单别!!!");
                return false;
            }
            if (drDD["DocNumber"].ToString().Trim().Length == 0)
            {

                System.Windows.Forms.MessageBox.Show("请输入采购单号!!!");
                return false;
            }

            //以下方法在删除行后,再引用会出错
            for (int i = 0; i < dtDetial.Rows.Count; i++)
            {
                if (dtDetial.Rows[i].RowState == DataRowState.Deleted)
                {
                    if (dtDetial.Rows[i]["ID", DataRowVersion.Original].ToString() == "")
                    {
                        System.Windows.Forms.MessageBox.Show("第<" + (1 + i) + ">行没有ID号");
                        return false;
                    }
                    else
                    {
                        continue;
                    }
                }
                if (dtDetial.Rows[i]["item"].ToString() == "")
                {
                    System.Windows.Forms.MessageBox.Show("第<" + (1 + i) + ">行请输入产品编码");
                    return false;
                }
                if (dtDetial.Rows[i]["itemdes"].ToString() == "")
                {
                    System.Windows.Forms.MessageBox.Show("第<" + (1 + i) + ">行请输入产品规格");
                    return false;
                }

            }
            string spName = "";
            SqlParameter[] sqlParameters = null;
            if (drDD.RowState == DataRowState.Added)
            {
                if (this.HaveID(drDD["DocType"].ToString(), drDD["DocNumber"].ToString()))
                {
                    System.Windows.Forms.MessageBox.Show("已有该采购单号的存在!!!");
                    return false;
                }
                spName = "sp_cgd_insert";
                sqlParameters = new SqlParameter[]{
                            new SqlParameter("@doctype",SqlDbType.Char,2),
                            new SqlParameter("@docnumber",SqlDbType.Char,10),
                            new SqlParameter("@vendor",SqlDbType.Char,10),

                };
                sqlParameters[0].Value = drDD["doctype"].ToString().Trim() ;
                sqlParameters[1].Value = drDD["docnumber"].ToString().Trim() ;
                sqlParameters[2].Value = drDD["vendor"].ToString().Trim() ;

            }
            else if (drDD.RowState == DataRowState.Unchanged)  //Unchanged DataRowState.Modified)
            {
                spName = "sp_cgd_update";
                sqlParameters = new SqlParameter[]{
                            new SqlParameter("@doctype",SqlDbType.Char,2),
                            new SqlParameter("@docnumber",SqlDbType.Char,10),
                            new SqlParameter("@vendor",SqlDbType.Char,4)
                     

                };
                sqlParameters[0].Value = drDD["doctype"].ToString().Trim ();
                sqlParameters[1].Value = drDD["docnumber"].ToString().Trim() ;
                sqlParameters[2].Value = model.Vendor; //drDD["vendor", DataRowVersion.Current].ToString().Trim(); // drDD["vendor"].ToString().Trim() ;
      
            }
            bool saveReault = false;
            using (SqlConnection cn = new SqlConnection(SqlHelper.conn))
            {
                cn.Open();
                SqlTransaction transaction = cn.BeginTransaction();

                try
                {
                    if (spName != "")
                    {
                        SqlHelper.ExecuteNonQuery(transaction, CommandType.StoredProcedure, spName, sqlParameters);
                    }

                    foreach (DataRow drDet in dtDetial.Rows)
                    {
                        switch (drDet.RowState)
                        {
                            case DataRowState.Added:
                                spName = "sp_cgdmx_insert";
                                sqlParameters = new SqlParameter[]{
                                    new SqlParameter("@doctype",SqlDbType.Char,2),
                                    new SqlParameter("@docnumber",SqlDbType.Char,10),
                                    new SqlParameter("@line",SqlDbType.Int),
                                    new SqlParameter("@item",SqlDbType.Char,10),
                                    new SqlParameter("@itemdes",SqlDbType.Char,10),
                                    new SqlParameter("@supplydate",SqlDbType.Char,10),
                             
                            };
                                sqlParameters[0].Value = drDet["doctype"].ToString().Trim() ;
                                sqlParameters[1].Value = drDet["docnumber"].ToString().Trim() ;
                                sqlParameters[2].Value = Convert.ToInt32(drDet["line"].ToString().Trim());
                                sqlParameters[3].Value = drDet["item"].ToString().Trim() ;
                                sqlParameters[4].Value = drDet["itemdes"].ToString().Trim();
                                sqlParameters[5].Value = drDet["supplydate"].ToString().Trim();

                                SqlHelper.ExecuteNonQuery(transaction, CommandType.StoredProcedure, spName, sqlParameters);

                                break;
                            case DataRowState.Deleted:
                                spName = "sp_cgdmx_delete";
                                sqlParameters = new SqlParameter[]{
                                    new SqlParameter("@doctype",SqlDbType.Char,2),
                                    new SqlParameter("@docnumber",SqlDbType.Char,10),
                                    new SqlParameter("@line",SqlDbType.Int ),
                            };
                                sqlParameters[0].Value = drDet["doctype", DataRowVersion.Original].ToString().Trim() ;
                                sqlParameters[1].Value = drDet["docnumber", DataRowVersion.Original].ToString().Trim() ;
                                sqlParameters[2].Value = Convert.ToInt32(drDet["line", DataRowVersion.Original].ToString().Trim() );
                                SqlHelper.ExecuteNonQuery(transaction, CommandType.StoredProcedure, spName, sqlParameters);


                                break;
                            case DataRowState.Detached:
                                break;
                            case DataRowState.Modified:
                                spName = "sp_cgdmx_update";
                                sqlParameters = new SqlParameter[]{
                                    new SqlParameter("@doctype",SqlDbType.Char,2),
                                    new SqlParameter("@docnumber",SqlDbType.Char,10),
                                    new SqlParameter("@line",SqlDbType.Int),
                                    new SqlParameter("@item",SqlDbType.Char,10),
                                    new SqlParameter("@itemdes",SqlDbType.Char,10),
                                    new SqlParameter("@supplydate",SqlDbType.Char,10),
                             
                            };
                                sqlParameters[0].Value = drDet["doctype", DataRowVersion.Current].ToString().Trim ();
                                sqlParameters[1].Value = drDet["docnumber", DataRowVersion.Current].ToString().Trim ();
                                sqlParameters[2].Value = Convert.ToInt32(drDet["line", DataRowVersion.Current].ToString().Trim ());
                                sqlParameters[3].Value = drDet["item", DataRowVersion.Current].ToString().Trim ();
                                sqlParameters[4].Value = drDet["itemdes", DataRowVersion.Current].ToString().Trim ();
                                sqlParameters[5].Value = drDet["supplydate", DataRowVersion.Current].ToString().Trim ();

                                SqlHelper.ExecuteNonQuery(transaction, CommandType.StoredProcedure, spName, sqlParameters);
                                break;
                            case DataRowState.Unchanged:
                                break;
                            default:
                                break;
                        }
                    }
                    transaction.Commit();
                    saveReault = true;


                }
                catch (Exception e)
                {
                    System.Windows.Forms.MessageBox.Show("在保存采购单时发生错误:/n" + e.Message, "系统提示!", System.Windows.Forms.MessageBoxButtons.OK);
                    transaction.Rollback();

                }
                finally
                {
                    transaction = null;


                }
            }
            return saveReault;
        }
    }
}
----------------------------------------------------------------------

//
        BLL.PO po = null;
        BindingSource db = null;
        private void frm_user_Load(object sender, EventArgs e)
        {
            
            po = new BLL.PO();
            db = new BindingSource();
            db.DataSource = this.po.GetDtDetial;
            this.datagv_det.DataSource = db;
            this.textBox1.DataBindings.Add("Text", this.po.GetDtDD, "DocType", true, DataSourceUpdateMode.OnPropertyChanged);
            this.textBox2.DataBindings.Add("Text", this.po.GetDtDD, "DocNumber", true, DataSourceUpdateMode.OnPropertyChanged);
            this.textBox3.DataBindings.Add("Text", this.po.GetDtDD, "Vendor", true, DataSourceUpdateMode.OnPropertyChanged);
            //this.comboBox1.DataBindings.Add ("Text", this.po.GetDtDD, "Vendor", true, DataSourceUpdateMode.OnPropertyChanged);   
            

            this.datagv_det.AutoGenerateColumns = false;  
            datagv_det.Columns[0].Visible =false  ;
            datagv_det.Columns[1].HeaderText = "单据类别";
            datagv_det.Columns[2].HeaderText = "单据号码";
            datagv_det.Columns[3].HeaderText = "行号";
            datagv_det.Columns[4].HeaderText = "品号";
            datagv_det.Columns[5].HeaderText = "品名";
            datagv_det.Columns[6].HeaderText = "交货日期";

            datagv_dnv .SelectionMode = DataGridViewSelectionMode.FullRowSelect ;
            datagv_dnv.DefaultCellStyle.SelectionBackColor = Color.YellowGreen;


            datagv_det.Columns["line"].SortMode = DataGridViewColumnSortMode.NotSortable;
            datagv_det.Columns["item"].SortMode = DataGridViewColumnSortMode.NotSortable;
            datagv_det.Columns["itemdes"].SortMode = DataGridViewColumnSortMode.NotSortable;
            datagv_det.Columns["supplydate"].SortMode = DataGridViewColumnSortMode.NotSortable; 
            
          
        }

        private void toolStripbtnadd_Click(object sender, EventArgs e)
        {
            Enable();
            toolStripbtnsave.Enabled = true;
            toolStripbtncancel.Enabled = true;
            toolStripbtnnewline.Enabled = true;   
            this.po.Add();//给单头赋值
        }

        private void toolStriptbnquery_Click(object sender, EventArgs e)
        {
            //UnEnable(); 
            //查询导航列表
            string strsql = string.Format("select DocType,DocNumber,Vendor from PO");
            po.FindForNav(strsql);
            db = new BindingSource();
            db.DataSource = this.po.GetDtNav;
            this.datagv_dnv.DataSource = db;
            this.datagv_dnv.ReadOnly = true;  
            this.tabControl_cgd .SelectedIndex=1;
            datagv_dnv.Columns[0].HeaderText = "单据类别";
            datagv_dnv.Columns[1].HeaderText = "单据号码";
            datagv_dnv.Columns[2].HeaderText = "供应商";
            toolStripbtnexcel.Enabled = true;
        }

        private void toolStripbtnsave_Click(object sender, EventArgs e)
        {
            //保存之前重新绑定DT
            db = new BindingSource();
            db.DataSource = this.po.GetDtDetial;
            this.datagv_det.DataSource = db;

            this.datagv_det.EndEdit(); //插入前结束编辑状态
            this.db.EndEdit();
            datagv_det.CommitEdit (DataGridViewDataErrorContexts.Commit);


            
            Model.PO pom = new Model.PO();
            pom.Vendor = textBox3.Text.Trim();    
            if (po.Save(pom)) 
            {
                //MessageBox.Show("操作成功");
                //刷新
                Model.PO pom1 = new Model.PO();
                pom1.DocType =textBox1 .Text .Trim() ;
                pom1.DocNumber = textBox2.Text.Trim();
                po.FindForDD(pom1);
                po.FindForDetail(pom1); 
            }
        }
        private void toolStripbtnnewline_Click(object sender, EventArgs e)
        {
            this.po.addRow();
            textBox1.Enabled = false;
            textBox2.Enabled = false;   

        }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

厦门德仔

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值