数据库系统课程设计(高校成绩管理数据库系统的设计与实现)

目录

1、需求分析 1

1.1 数据需求描述 1

1.2 系统功能需求 3

1.3 其他性能需求 4

2、概念结构设计 4

2.1 局部E-R图 4

2.2 全局E-R图 5

2.3 优化E-R图 6

3、逻辑结构设计 6

3.1 关系模式设计 6

3.2 数据类型定义 6

3.3 关系模式的优化 8

4、物理结构设计 9

4.1 聚簇设计 9

4.2 索引设计 9

4.3 分区设计 10

5、数据库实施 10

5.1 基本表建立 10

5.2 视图的建立 17

5.3 索引的建立 22

5.4 触发器建立 23

5.5 建存储过程 26

6、应用系统开发与试运行 27

6.1 开发平台和开发环境介绍。 27

6.2 前台界面与后台数据库连接说明,代码实现。 27

6.3 系统各功能设计和运行界面截图。 29

7、实验总结 42

7.1 遇到的问题和解决的办法 46

7.2 系统设计的不足 47

7.3 进一步改进思路和体会 47

1.需求分析

开发平台:Microsoft Visual Studio 2013
开发环境:微软在Builder 2013开发者大会上发布了Visual Studio 2013预览版,并且发布其程序组件库.NET 4.5.1的预览版,该软件已于北京时间2013年11月13日23:00时正式发布。Visual Studio 2013 预览版以 Visual Studio 2012 和后续的Microsoft Visual Studio 更新中的进展为基础构建而成,为开发团队提供需要的解决方案,使其接纳这种转变并开发和交付利用下一波Windows 平台创新 (Windows 8.1) 的新式应用程序,同时在所有 Microsoft 平台上支持多种设备和服务。

1.1 数据需求描述 

分析系统的数据需求,用数据字典和数据流图描述系统的数据需求,一般要求有2级(初级和详细级)数据流图,并确定系统开发边界。

1.2 系统功能需求 

系统功能框架介绍,处理模块描述。

管理员

  1. 添加教师名单
  2. 查询教师名单
  3. 修改教师信息
  4. 删除教师信息
  5. 添加学生名单
  6. 查询学生名单
  7. 修改学生名单
  8. 统计生源地信息
  9. 修改管理员密码
  10. 重置教师密码
  11. 重置学生密码

学生

  1. 查询个人基本信息
  2. 查询个人成绩
  3. 查询班级课表
  4. 查询个人课表
  5. 修改个人密码
  6. 查询自己的总学分

教师

  1. 查询教师个人信息
  2. 查询个人任课信息
  3. 查询所任课程平均成绩
  4. 查询所任课程学生排名
  5. 提交所任课程的学生成绩
  6. 修改个人密码

1.3 其他性能需求

1.3 其他性能需求

(1)用户输入出错时,有错误提示。

(2)给管理员,教师,学生不同的权限,提高数据安全性;

(3)创建触发器,存储过程,防止数据不一致;

2、概念结构设计

2.1 局部E-R图

画出局部的E-R图,进一步进行解释说明。

2.2 全局E-R图

合并成全局的E-R图,5个数据类别之间存在6个关系。

2.3 优化E-R图

因为本次的E-R已经符合了要求,这里就不需要优化了。

3、逻辑结构设计

3.1 关系模式设计

教师teachers(教师编号,教师姓名,教师性别,教师年龄,教师职称,联系电话)

专业major(专业编号,专业名称)

班级class(班级编号,班级名称,专业编号)

学生students(学号,姓名,性别,年龄,地区,已修学分,班级编号)

课程course(课程编号,课程名称,课程学时,教师姓名,课程学期,考核方式,学分)

开设 class-course(课程编号,班级编号)

上课 teacher-class(教师编号,班级编号)

授课 teacher-course(教师编号,课程编号)

成绩报告 reports (学号,课程编号,学期,成绩,教师姓名)

管理员账号administer-account(管理员账号,管理员密码)

教师账号Teachers-account(教师账号,教师密码)

学生账号students-account(学生账号,学生密码)

3.2 数据类型定义

    

  1. 教师Teacher表

表1  Teacher表

数据项名

数据类型

长度

完整性约束

教师编号

char

10

主键

教师姓名

char

10

教师性别

char

5

教师年龄

int

职称

char

10

联系电话

char

20

  1. 专业Major表

表2  Major表

数据项名

数据类型

长度

完整性约束

专业编号

char

10

主键

专业名称

char

10

  1. 班级Class表

表3  class表

数据项名

数据类型

长度

完整性约束

班级编号

char

10

主键

班级名称

char

10

专业编号

char

10

外键

  1. 学生表Students表

表4  students表

数据项名

数据类型

长度

完整性约束

学号

char

12

主键

姓名

char

10

性别

char

5

年龄

int

生源所在地

char

20

已修学分

float

班级编号

char

10

外键

  1. 课程Course表

表5  courses表

数据项名

数据类型

长度

完整性约束

课程编号

char

10

主键

课程名称

char

10

教师姓名

char

10

课程学期

char

20

课程学时

int

>0

考核方式

char

5

学分

float

>0

  1. 开设 class-course表

表6  class-course表

数据项名

数据类型

长度

完整性约束

班级编号

char

10

主键

外键

课程编号

char

10

外键

  1. 上课 teacher-class表

表7  teacher-class表

数据项名

数据类型

长度

完整性约束

教师编号

char

10

主键

外键

班级编号

char

10

外键

  1. 授课 teacher-course表

表8  teacher-course表

数据项名

数据类型

长度

完整性约束

教师编号

char

10

主键

外键

课程编号

char

10

外键

  1. 成绩报告表reports表

表9  reports表

数据项名

数据类型

长度

完整性约束

学号

char

12

主键

外键

课程编号

char

10

外键

学期

char

10

成绩

int

教师姓名

char

10

  1. 教师账号

表10  Teacher-account表

数据项名

数据类型

长度

完整性约束

教师编号

char

10

主键

教师密码

char

10

  1. 管理员账号

表11  Admin-account表

数据项名

数据类型

长度

完整性约束

管理员编号

char

10

主键

管理员密码

char

10

  1. 学生账号

表12  student-account表

数据项名

数据类型

长度

完整性约束

学生编号

char

12

主键

学生密码

char

10

3.3 关系模式的优化

该关系模式已经满足规范化需求,这里不进行规范化处理。

4、物理结构设计

4.1 聚簇设计

   

教师Teacher(教师编号)

课程Course(课程编号)

学生Students(学生编号,班级编号)

班级Class(班级编号)

原因:这几张表都是实体表,同时聚簇中的属性都是主键或是外键,且被访问次数高,而其他表或者这些表上的其他属性被访问次数较低,没有考虑聚簇的必要。

原则:

1基本表中该属性访问次数较多

2基本表中某属性列重复率较高

3基本表中某属性列的值修改很少,或者增加和删除元组次数较少

4.2 索引设计

建立索引的一般规则:

  1. 在主键属性列和外键属性列上通常都可以分别建立索引,不仅有助于唯一性检查和完整性检查,而且可以加快连接查询的速度。
  2. 以查询为主的关系可建立尽可能多的索引。
  3. 对等值连接,但满足条件的元组较少的查询可以考虑建立索引。
  4. 如果查询可以从索引直接得到结果而不必访问关系,则对此种查询可以建立索引。

所以我们建了这些索引:

  (1)

教师表Xum_Teachers18 索引:(教师编号 xm_Tno18)

create unique index Tea_Tno on Xum_Teachers18(xm_Tno18)

  (2)

课程表Xum_Courses18 索引:(课程编号xm_Cno18)

create unique index Cour_Cno on Xum_Courses18(xm_Cno18)

(3)

班级表 Xum_Class18 索引:(班级编号 xm_CLno18, 专业编号xm_Mno18)

create unique index Mno_CLno on Xum_Class18(xm_CLno18,xm_Mno18)

(4)

学生表Xum_Students18 索引:(学生学号xm_Sno18,班级编号xm_CLno18)

create unique index CLno_Sno on Xum_Students18(xm_Sno18,xm_CLno18)

(5)

成绩报告表Xum_Reports18 索引:(学生编号xm_Sno18 ,课程编号xm_Cno18)

create unique index Cno_Sno on Xum_Reports18(xm_Sno18,xm_Cno18)

(6)

专业表 xm_Cno18  索引:(专业编号xm_Mno18)

create unique index Majo_Mno on Xum_Majors18(xm_Mno18)

4.3 分区设计

磁盘分区设计的一般原则:

1减少访问冲突,提高I/O并发性。多个事物并发访问同一磁盘时,会产生磁盘访问冲突而导致效率低下,如果事务访问数据均能分布于不同磁盘上,则I/O可并发执行,从而提高数据库访问速度。

2分散热点数据,均衡I/O负担。在数据库中数据访问的频率是不均匀的,那些经常被访问的数据成为热点数据,此类数据宜分散存在于不同的磁盘上,以均衡各个磁盘的负荷,充分发挥多磁盘的并行操作的优势。

3保证关键数据快速访问,缓解系统瓶颈。在数据库中有些数据如数据字典等的访问频率很高,为保证对它的访问不直接影响整个系统的效率,可以将其存放在某一固定磁盘上,以保证其快速访问。

实际例子有将关系和索引放在不同磁盘上,查询时两个磁盘同时运行提高物理I/O效率。

不过考虑到本次课题数据量有限,暂不考虑分区设计。

5、数据库实施

5.1 基本表建立

  1. (1)教师表建立 Xum_Teachers18

图10 建立教师表

create table Xum_Teachers18 (
xm_Tno18 char(10) primary key,
xm_Tname18 char(10),
xm_Tsex18 char(5),
xm_Tage18 int,
xm_Tpos18 char(10),
xm_Tpho18 char(20)

)

(2)专业表建立Xum_Majors18

create table Xum_Majors18(
xm_Mno18 char(10) primary key,
xm_Mname18 char(10)
)

(3)班级表建立Xum_Class18

create table Xum_Class18(

xm_Clno18 char(10) primary key,
xm_Clname char(10),
xm_Mno18 char(10)
constraint Major_Class foreign key(xm_Mno18) references Xum_Majors18
)

(4)学生表Xum_Students18

create table Xum_Students18(
xm_Sno18 char(12) primary key,
xm_Sname18 char(10),
xm_Ssex18 char(5),
xm_Sage18 int,
xm_Sorig18 char(20),
xm_Ssum18 float,
xm_Clno18 char(10)
constraint Class_Student foreign key(xm_Clno18) references Xum_Class18
)

 (5)课程表 Xum_Courses18


create table Xum_Courses18(
xm_Cno18 char(10) primary key,
xm_Cname18 char(10),
xm_Tname18 char(10),
xm_Cdate18 char(20),
xm_Cway18 char(5),
xm_Ccredit18 float check(xm_Ccredit18>0),
xm_Chour18 int check(xm_Chour18>0)

)

 (6)授课表 Xum_Tea_Cour18

create table Xum_Tea_Cour18(
xm_Tno18 char(10),
xm_Cno18 char(10),
primary key(xm_Tno18,xm_Cno18),
constraint teacher_course foreign key(xm_Tno18) references Xum_Teachers18,
constraint tea_cour foreign key(xm_Cno18) references Xum_Courses18

)

(7)班级上课表Xum_Class_Cour18


create table Xum_Class_Cour18(
xm_Clno18 char(10),
xm_Cno18 char(10),
primary key(xm_Clno18,xm_Cno18),
constraint class_course foreign key(xm_Clno18) references Xum_Class18,
constraint clas_cour foreign key(xm_Cno18) references Xum_Courses18

)

(8)教师任课表Xum_Teac_Class18


create table Xum_Teac_Class18(
xm_Tno18 char(10),
xm_Clno18 char(10),
primary key(xm_Tno18,xm_Clno18),
constraint tea_class foreign key(xm_Tno18) references Xum_Teachers18,
constraint teach_class foreign key(xm_Clno18) references Xum_Class18
)

(9)成绩表Xum_Reports18


create table Xum_Reports18(

xm_Cno18 char(10),
xm_Sno18 char(12),
xm_Score18 float,
xm_date char(10),
xm_Tname18 char(10),
primary key(xm_Cno18,xm_Sno18),
constraint cour foreign key(xm_Cno18) references Xum_Courses18,
constraint stude foreign key(xm_Sno18) references Xum_Students18

)

(10)管理员账号密码表 (11)学生账号密码表(12)教师账号密码表


create table Students_account18(
xm_Sno18 char(12) primary key,
xm_Skey18 char(10)

)

create table Teachers_account18(
xm_Tno18 char(12) primary key,
xm_Tkey18 char(10)

)
create table Admin_account18(
xm_Ano18 char(12) primary key,
xm_Akey18 char(10)

)

 (13)数据库表预览

5.2 视图的建立

(1)学生成绩

create view 学生成绩统计
as
(select Xum_Students18.xm_Sno18,Xum_Students18.xm_Sname18,
Xum_Courses18.xm_Cname18,Xum_Class18.xm_Clname,
Xum_Reports18.xm_Tname18,Xum_Courses18.xm_Ccredit18,
Xum_Courses18.xm_Cdate18,Xum_Reports18.xm_Score18

from Xum_Reports18,Xum_Students18,Xum_Courses18,Xum_Class18
where Xum_Students18.xm_Sno18=Xum_Reports18.xm_Sno18
and Xum_Reports18.xm_Cno18=Xum_Courses18.xm_Cno18
and Xum_Class18.xm_Clno18=Xum_Students18.xm_Clno18
)

(2)课程平均成绩


create view 每门平均成绩
as(
select xm_Cno18,avg(xm_Score18)平均分
from Xum_Reports18
group by xm_Cno18


)

(3)课程和学分统计

create view 课程和学分统计
as
(
select xm_Sno18,xm_Cname18,xm_Ccredit18
from 学生成绩统计
)

(4)教师课表


create view 教师课表
as(
select xm_Tno18,Xum_Teachers18.xm_Tname18,xm_Cno18,xm_Cname18,
xm_Ccredit18,xm_Chour18
from Xum_Teachers18,Xum_Courses18
where Xum_Teachers18.xm_Tname18=Xum_Courses18.xm_Tname18
)

(5)班级课表


create view 班级课表
as
(
select Xum_Class18.xm_Clno18,xm_Clname,Xum_Courses18.xm_Cno18,
xm_Cname18,xm_Cdate18,xm_Ccredit18,xm_Chour18
from Xum_Class18,Xum_Courses18,Xum_Class_Cour18
where Xum_Class18.xm_Clno18=Xum_Class_Cour18.xm_Clno18
and Xum_Class_Cour18.xm_Cno18=Xum_Courses18.xm_Cno18
)

(6)生源地人员统计


create  view 生源地人员统计
as
(select xm_Sorig18,count(xm_Sno18)数量
from Xum_Students18
group by xm_Sorig18
)

(7)教师课程成绩


create view 教师课程成绩
as
(
select xm_Tno18,Xum_Teachers18.xm_Tname18,xm_Cno18,xm_Sno18,xm_Score18
from Xum_Teachers18,Xum_Reports18
where Xum_Teachers18.xm_Tname18=Xum_Reports18.xm_Tname18


)

(8)教师与学生成绩

 (9)视图预览

 5.3 索引的建立

create unique index Tea_Tno on Xum_Teachers18(xm_Tno18)
create unique index Cour_Cno on Xum_Courses18(xm_Cno18)
create unique index Mno_CLno on Xum_Class18(xm_CLno18,xm_Mno18)
create unique index Majo_Mno on Xum_Majors18(xm_Mno18)
create unique index CLno_Sno on Xum_Students18(xm_Sno18,xm_CLno18)
create unique index Cno_Sno on Xum_Reports18(xm_Sno18,xm_Cno18)

 5.4 触发器建立 

(1)教师删除(删除一个教师时,与教师相关的记录全都删除)

    这里漏写了删除教师账号信息 如果运行出错了 可以参考“学生删除“代码 改写触发器

create trigger 教师删除18 
on Xum_Teachers18
for delete 
as 
  delete xm_Tno18
  where Xum_Tea_Cour18.xm_Tno18=(select xm_Tno18 from deleted)
  and Xum_Teac_Class18.xm_Tno18=(select  xm_Tno18 from deleted)

(2)学生删除(删除一个学生时,与该学生相关的记录全都删除

create trigger 学生删除18
on Xum_Students18
for delete 
as
 begin
   delete from Xum_Reports18
  where Xum_Reports18.xm_Sno18 in (select xm_Sno18 from deleted)
  delete from Students_account18
  where Students_account18.xm_Sno18 in (select  xm_Sno18 from deleted)
  end

 (3)学生统计(提交成绩时,将》=60的成绩记为合格,同时加上该课程学分)


create trigger 学分统计18 on Xum_Reports18
for insert
as
 update Xum_Students18
 set xm_Ssum18=(
 select sum(xm_Ccredit18)
 from Xum_Courses18
 where xm_Cno18 in
 (
 select xm_Cno18
 from Xum_Reports18
 where xm_Score18>=60 
 and Xum_Reports18.xm_Sno18 in
 (select xm_Sno18
 from inserted)

 )
 )
 where Xum_Students18.xm_Sno18 in
 (
 select xm_Sno18
 from inserted
 )

(4)教师更新


create trigger 教师更新
on Xum_Teachers18
for update
as 
   if update(xm_Tno18)
   begin 
   update Xum_Tea_Cour18
   set xm_Tno18=i.xm_Tno18
   from deleted d,inserted i ,Xum_Tea_Cour18 t
   where t.xm_Tno18=d.xm_Tno18
   end
   
   begin
   update Xum_Teac_Class18
   set xm_Tno18=i.xm_Tno18
   from deleted d,inserted i,Xum_Teac_Class18 c
   where c.xm_Tno18=d.xm_Tno18
   end

(5)学生添加 自动注册新用户 默认密码12345


 create trigger 插入创建学生新用户18
  on Xum_Students18
  for insert
  as
   declare @sno char(10)
   begin
       select @sno=xm_Sno18 from inserted
	   insert into Students_account18
	   values(@sno,'12345')


  end

 (6)教师添加 自动注册新用户 默认密码12345

 create trigger 插入创建教师新用户18
  on Xum_Teachers18
  for insert
  as
   declare @tno char(10)
   begin
       select @tno=xm_Tno18 from inserted
	   insert into Teachers_account18
	   values(@tno,'12345')


  end

5.5 建存储过程

(1)插入新学生


create procedure pro_插入新学生
@sno char(12),
@sname char(10),
@ssex char(5),
@sage int,
@sorig char(20),
@ssum float,
@clno char(10)
as 
insert Xum_Students18(xm_Sno18,xm_Sname18,xm_Ssex18,xm_Sage18
,xm_Sorig18,xm_Ssum18,xm_Clno18)
values(@sno,@sname,@ssex,@sage,@sorig,@ssum,@clno)
select *
from Xum_Students18
go

(2)自动算学分


create procedure pro_输入成绩自动生成学分
@sno char(12),
@cno char(10),
@cname char(10),
@cdate char(10),
@score int,
@tname char(10),
@credit float

as
begin  
   insert into pro_选修
   values(@sno,@cno,@score)
   update Xum_Students18
   set xm_Ssum18=xm_Ssum18+@credit
   where Xum_Students18.xm_Sno18=@sno
end

6、应用系统开发与试运行

6.1 开发平台和开发环境介绍。

     Visual studio 2013 + SQL server 2014

     Win10系统

6.2 前台界面与后台数据库连接说明,代码实现。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using System.Data.SqlClient;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
    class sqlConnect
    {
        public SqlConnection conn = null;
        public sqlConnect()
        {
            if (conn == null)
            {
                string connectString = "Data Source =LAPTOP-FPCD1SM8\\SQL2014; database =XumMIS18; " +
            "Integrated Security = True";
                conn = new SqlConnection(connectString);
                if (conn.State == ConnectionState.Closed) conn.Open();

            }
        }
        public void closeConnect()
        {
            if (conn.State == ConnectionState.Closed) conn.Close();
        }
        public DataSet Getds(string sql)
        {
            if (conn.State == ConnectionState.Closed) conn.Open();
            DataSet ds = new DataSet();
            SqlDataAdapter da = new SqlDataAdapter(sql, conn);
            da.Fill(ds);
            conn.Close();

            return ds;
        }

        public int OperateData(string sql)
        {
            if (conn.State == ConnectionState.Closed) conn.Open();
            SqlCommand sqlcom = new SqlCommand();
            sqlcom.CommandText = sql;
            sqlcom.CommandType = CommandType.Text;
            sqlcom.Connection = conn;
            int x = sqlcom.ExecuteNonQuery();
            conn.Close();
            return x;

        }
        public DataSet BindDataGridView(DataGridView dgv, string sql)
        {
            if (conn.State == ConnectionState.Closed) conn.Open();
            SqlDataAdapter da = new SqlDataAdapter(sql, conn);
            DataSet ds = new DataSet();
            da.Fill(ds);
            dgv.DataSource = ds.Tables[0];
            return ds;


        }
    }
}

6.3 系统各功能设计和运行界面截图。

   (1)登录界面如图所示

①登入异常

(输入的密码、账号错误,提示框报错)

图43 账号或密码错误

②输入不完整

③验证成功 

 (2)进入学生界面

 ①个人信息查询

②成绩查询,选择学年查询

③班级课表查询

 ④学生课表和学分查询

 ⑤修改密码

 输入为空

 原密码输入错误(原密码为123456)

 两次新密码验证不通过

 修改成功

 (3)教师界面

 ①教师个人信息查询 

 ②教师任课查询

 ③所任课程平均成绩

 ④查询选择该课程学生的分数排名(分数按降序)

 ⑤教师提交学生成绩 添加成绩(课程里只有这个老师教的课)

 确定课程出现选择该课程学生的信息

 删除信息

 修改成绩(只能修改成绩,只有最后一行可编辑,将第二位同学 99改为98)

 ⑥修改密码和学生界面类似

(4)管理员界面

①教师管理 

实现插入编号为T10的教师信息,同时查询编号为T10老师的信息

插入的教室信息(T10,舒克,男,46,教授,3765874563)查询T10老师的信息

 教师删除(删除为T10教师的信息)

 修改T09教师的年龄(36-->45)

 ②学生界面

可以实现学生信息的插入、删除、修改以及查询和教师界面类似,这里不做过大介绍

 ③管理员生源统计

 ④管理员修改密码与学生老师的相同

⑤管理员重置教师、学生密码

为防止有教师、学生忘记密码,这里提供密码重置功能。

7、实验总结

7.1 遇到的问题和解决的办法

(1)因为从来没有写过C#代码,刚开始的时候,对这门语言非常陌生,不知道从何下,所以,我的界面模块都是按照书本后面的实例代码写的,写的时候其实心里还是非常模糊,不知道怎么实现代码和数据库的嵌入,花了很多时间在探索上。但是C#是一门非常适合做界面的语言,它继承了C语言和java语言的优点,同时界面上控件的安放十分简单上手。

(2)在系统需求分析完成以后,根据用户需求设计概念结构的时候遇到了数据冗余等多种问题,经过慢慢的分解关系最终得到了相对来说还比较完善的概念结构,通过ER图表示出来。

(3)设计数据库的时候,原本是没有想到触发器和存储过程的设计,但是当界面设计完成的差不多,要初步测试界面功能时,才发现数据库的设计存在很多缺陷,在实现插入、删除时,多张表之间存在信息不对称问题,例如教师或学生删除后,没有将其相关记录删除,也没有将其账号注销,更新信息也同样存在这样的问题,因此,测试时出现了很多异常情况,不过后来添加了触发器,大抵上解决了这些问题。

(4)SQL语句经常出错。因为是写在代码里面,查询语句表现出来就是一串字符串,在SQL SEVER写查询语句时,会自动检查拼写、逻辑错误,直接在代码里面写SQL语句非常容易出错,导致程序的中端。因为本质上都是对数据库的操作,我认为可以先在SQL SEVER中写好语句,并且验证其的正确性之后,再写入C# 代码中,这样会大大降低错误率。

(5)字符串匹配问题,在实现用户登录及密码修改时,我发现,对查询结果与本身的字符串进行匹配时,尽管他们显示出是相等的,但是匹配是不成功的。譬如说登录时,输入账号为A01,先通过查询找出A01的密码,在将输入的密码与其匹配,实验中将这两个进行输出,肉眼上是看不出差别的,但是程序匹配上是永远失败的,这个问题产生的原因至今我还是不太清楚。后来,我将这两个查询语句进行合并,返回满足账号和密码的记录数,若记录为0,则说明输入的账号或密码有误,若不是0,则说明输入无误。

7.2 系统设计的不足

(1)数据库表格的设计存在一些不合理的地方,Reports表中,感觉加入教师编号会更利与数据库的实现,因为只有教师姓名,会加剧设计教师与学生操作的复杂性,且出错率也会变高。

(2)功能实现的不够全面,管理员的功能主要体现在老师和学生这两种类别上,其实还可以进行课程的管理等等,学生的选课、退课功能也还没有考虑上,整个系统还是比较脆弱简单的。

(3)在进行学生成绩排名的时候,只能显示排名结果,但是不能显示名次。

(4)数据库设计时,涉及到班级和专业的地方很少,实际中,应该把这两个也考虑进去,才能完善整个系统。

(5)建立了太多视图,设计视图的时候,因为有很多信息的交叉,还有很多外键,需要很多自然连接 ,非常繁琐。

 

7.3 进一步改进思路和体会

(1)本次课设让我理解了设计数据库的复杂性,并且数据库的设计一定要保障数据库的完整性和准确性,这些在数据定义、基本表建立、设计触发器和存储过程时都要仔细考虑。

(2)本次实验也让我对C#这么语言有了初步的理解,C#集合了c语言和java语言的优点,是一门非常适合做界面的语言,界面制作比较容易上手。

(3)设计更多的触发器,加强表与表之间的联系,尽量减少视图的数量,提高基本表与视图的有效性。

(4)优化界面,使界面更加符合实际需求。

体会

通过这次课程设计发现这其中需要的很多知识我们没有接触过,还有很多需要我们掌握的东西我们不明白。同时也发现有很多已经学过的东西我们没有理解到位,不能灵活运用于实际,不能很好的用来解决问题,这就需要我们不断的大量的实践,通过不断的自学,不断地发现问题,思考问题,进而解决问题。从                     种文档的阅读到开始的需求分析、概念结构设计、逻辑结构设计、物理结构设计。亲身体验了一回系统的设计开发过程。很多东西书上写的很清楚,貌似看着也很简单,操作起来要考虑到方方面面,这还只是一个比较简单的系统,可想可知在我们生活中应用的数据库会有多么复杂。


(写得比较简陋,页面不太美观,数据结构也存在问题,数据库文件已经找不到了,想要参考C#源码的可以私我,一定要先建好数据库(修改sqlConnect.cs的数据库名称),打开配置管理器所有的协议,确保连接没问题,再将C#每个页面的查询语句改成自己建的表)

 不知道的看SQL Sever开启时服务器名称

要成功运行 一定要建好数据库、插入数据,插入的数据一定要有一定的对应关系,遵循主外键约束,当数据插入完毕之后。

插入数据参考

insert
into Xum_Majors18
values('M01','计智')
insert
into Xum_Majors18
values('M02','计科')
insert
into Xum_Majors18
values('M03','软工')
insert
into Xum_Majors18
values('M04','网工')



insert 
into Xum_Class18
values('CL01','计智1902','M01')
insert 
into Xum_Class18
values('CL02','计智1902','M01')
insert 
into Xum_Class18
values('CL03','计科1902','M02')
insert 
into Xum_Class18
values('CL04','计科1902','M02')
insert 
into Xum_Class18
values('CL05','网工1901','M03')
insert 
into Xum_Class18
values('CL06','网工1902','M03')

insert 
into Xum_Class18
values('CL07','软工1901','M04')
insert 
into Xum_Class18
values('CL08','软工1902','M04')

insert 
into Xum_Courses18
values('C01','离散数学','程珍','大一下','考试',4,24)
insert 
into Xum_Courses18
values('C03','机器学习','黄亮','大一下','考查',4 ,24)
insert 
into Xum_Courses18
values('C04','数字电路','赵冬冬','大一下','考试',4 ,24)
insert 
into Xum_Courses18
values('C05','数字电路','龙胜春','大一下','考试',4 ,24)
insert 
into Xum_Courses18
values('C06','马原','周文','大一上','考试',3 ,18)
insert 
into Xum_Courses18
values('C07','毛概','陈燕','大一下','考试',3 ,18)
insert 
into Xum_Courses18
values('C08','思修','吴五','大一上','考试', 4,24)


insert 
into Xum_Students18
values('06060101','张三','男',20,'浙江',20,'CL01')
insert 
into Xum_Students18
values('06060102','李四','男',20,'浙江',15,'CL01')
insert 
into Xum_Students18
values('06060103','王五','男',20,'浙江',10,'CL02')
insert 
into Xum_Students18
values('06060104','张南','女',20,'浙江',22,'CL02')
insert 
into Xum_Students18
values('06060105','丽丽','女',20,'北京',18,'CL03')
insert 
into Xum_Students18
values('06060106','倩倩','女',20,'浙江',19,'CL03')
insert 
into Xum_Students18
values('06060107','悠悠','女',20,'浙江',25,'CL04')
insert 
into Xum_Students18
values('06060108','琪琪','男',20,'安徽',22,'CL04')
insert 
into Xum_Students18
values('06060109','贝奇','男',20,'湖南',20,'CL05')
insert 
into Xum_Students18
values('06060110','洛克','男',20,'浙江',20,'CL05')
insert 
into Xum_Students18
values('06060202','尼克','男',20,'江苏',15,'CL06')
insert 
into Xum_Students18
values('06060203','艾米','女',20,'江西',10,'CL06')
insert 
into Xum_Students18
values('06060301','丝尔特','女',20,'福建',20,'CL07')
insert 
into Xum_Students18
values('06060302','梅森','男',20,'浙江',15,'CL07')
insert 
into Xum_Students18
values('06060403','大卫','男',20,'浙江',10,'CL08')
insert 
into Xum_Students18
values('06060405','汤米','女',20,'浙江',22,'CL08')



insert 
into Xum_Teachers18
values('T01','程珍','女',35,'教师','13344332278')
insert 
into Xum_Teachers18
values('T02','王英姿','女',35,'教师','13756742178')
insert 
into Xum_Teachers18
values('T03','黄亮','男',34,'教师','15745723349')
insert 
into Xum_Teachers18
values('T04','赵冬冬','男',30,'教师','17858640979')
insert 
into Xum_Teachers18
values('T05','龙胜春','女',37,'教师','17857573670')
insert 
into Xum_Teachers18
values('T06','周文','女',32,'教师','18367986174')
insert 
into Xum_Teachers18
values('T07','陈燕','女',45,'教师','17858427842')
insert 
into Xum_Teachers18
values('T08','吴五','男',35,'教师','15724547842')



insert 
into Xum_Tea_Cour18
values('T01','C01')
insert 
into Xum_Tea_Cour18
values('T02','C02')
insert 
into Xum_Tea_Cour18
values('T03','C03')
insert 
into Xum_Tea_Cour18
values('T04','C04')

insert 
into Xum_Tea_Cour18
values('T05','C05')
insert 
into Xum_Tea_Cour18
values('T06','C06')
insert 
into Xum_Tea_Cour18
values('T07','C07')
insert 
into Xum_Tea_Cour18
values('T08','C08')


insert 
into Xum_Class_Cour18
values('CL01','C01')
insert 
into Xum_Class_Cour18
values('CL02','C02')
insert 
into Xum_Class_Cour18
values('CL03','C03')
insert 
into Xum_Class_Cour18
values('CL04','C04')
insert 
into Xum_Class_Cour18
values('CL05','C05')
insert 
into Xum_Class_Cour18
values('CL06','C06')
insert 
into Xum_Class_Cour18
values('CL07','C07')
insert 
into Xum_Class_Cour18
values('CL08','C08')

insert
into Xum_Teac_Class18
values('T01','CL01')
insert
into Xum_Teac_Class18
values('T02','CL02')
insert
into Xum_Teac_Class18
values('T03','CL03')
insert
into Xum_Teac_Class18
values('T04','CL04')
insert
into Xum_Teac_Class18
values('T05','CL05')
insert
into Xum_Teac_Class18
values('T06','CL06')
insert
into Xum_Teac_Class18
values('T07','CL07')
insert
into Xum_Teac_Class18
values('T08','CL08')


insert
into Xum_Reports18
values('C01','06060101',90,'大一下','程珍')
insert
into Xum_Reports18
values('C01','06060102',93,'大一下','程珍')
insert
into Xum_Reports18
values('C02','06060103',78,'大一上','王英姿')
insert
into Xum_Reports18
values('C02','06060104',96,'大一上','王英姿')

insert
into Xum_Reports18
values('C03','06060105',87,'大一下','黄亮')

insert
into Xum_Reports18
values('C03','06060106',98,'大一下','黄亮')
insert
into Xum_Reports18
values('C04','06060107',94,'大一下','赵冬冬')
insert
into Xum_Reports18
values('C04','06060108',80,'大一下','赵冬冬')
insert
into Xum_Reports18
values('C05','06060109',87,'大一下','龙胜春')
insert
into Xum_Reports18
values('C05','06060110',96,'大一下','龙胜春')
insert
into Xum_Reports18
values('C06','06060202',95,'大一上','周文')
insert
into Xum_Reports18
values('C06','06060203',93,'大一上','周文')
insert
into Xum_Reports18
values('C07','06060301',98,'大一下','陈燕')
insert
into Xum_Reports18
values('C07','06060302',77,'大一下','陈燕')
insert
into Xum_Reports18
values('C08','06060403',67,'大一上','吴五')
insert
into Xum_Reports18
values('C08','06060405',88,'大一上','吴五')




insert 
into Teachers_account18
values('T01','12345')
insert 
into Teachers_account18
values('T02','12345')
insert 
into Teachers_account18
values('T03','12345')
insert 
into Teachers_account18
values('T04','12345')
insert 
into Teachers_account18
values('T05','12345')
insert 
into Teachers_account18
values('T06','12345')
insert 
into Teachers_account18
values('T07','12345')
insert 
into Teachers_account18
values('T08','12345')


insert into
Students_account18
values('06060101','12345')
insert into
Students_account18
values('06060102','12345')
insert into
Students_account18
values('06060103','12345')
insert into
Students_account18
values('06060104','12345')
insert into
Students_account18
values('06060105','12345')
insert into
Students_account18
values('06060106','12345')
insert into
Students_account18
values('06060107','12345')
insert into
Students_account18
values('06060108','12345')
insert into
Students_account18
values('06060109','12345')
insert into
Students_account18
values('06060110','12345')
insert into
Students_account18
values('06060202','12345')
insert into
Students_account18
values('06060203','12345')
insert into
Students_account18
values('06060301','12345')
insert into
Students_account18
values('06060302','12345')
insert into
Students_account18
values('06060403','12345')
insert into
Students_account18
values('06060405','12345')

insert into
Admin_account18
values('A01','12345')
insert into
Admin_account18
values('A02','12345')

打开所有协议,然后修改每个界面的查询语句

注意点:

1.C#源码用VS运行  SQL sever选择2014版

2.不要重复插入数据,插入的数据遵循主外键约束

3.触发器一定要写 如果不想写的话 就把对应的功能去掉(譬如“教师删除“”触发器,可以直接删除掉“删除教师”的功能)如果要留下这些功能 一定要写触发器

4.视图可以不用全部建立 运行过程中只用到了一两个

5.可以先在SQL里面运行语句 再去C#里面运行 这样出错概率低

6.源码里面有几个页面多余  运行时没有用到就可以删掉

7.数据库连接问题 要把所有协议打开 保证服务器名没有写错

8.页面可以自己重新编辑(换控件、背景jpg、增添功能)

9. 如果一运行就报错,基本都是因为没有和数据库连接成功。

10.如果是点击了按钮之后,界面报错终止可以先在数据库运行该界面的sql语句,看具体报错信息

c#界面源码及文档报告见网盘

百度网盘 请输入提取码

  • 897
    点赞
  • 5730
    收藏
    觉得还不错? 一键收藏
  • 1920
    评论
学生成绩管理系统 1 问题描述 1.1 背景 1)某大学有学生若干万名,每个学生每学期必须学习若干门课程。 2)每个学生有学号、姓名、性别、班级、出生日期等基本信息。 3)每门课程有课程号,课程名称、任课教师、学分等信息。 4)学校需要对每个学生的基本信息、所学课程、成绩进行统一管理,以便于对信息进行 查询、浏览和修改。 1.2 数据需求 学生成绩管理系统主要用于学生成绩信息管理,据分析学生成绩管理系统的数据表可浓 缩为:学生基本信息表、课程基本信息表和学生成绩信息表。根据学校的情况,可按下 面的步骤来分析: 1) 确定学生所在的院系、所学的专业以及所在的班级。 2) 确定学生所在班级的课程以及该课程学生的成绩;另外还需要知道学生所在班级、学 号和学期。 3) 分析学生的基本信息,如姓名、性别、出生年月、家庭住址、联系电话。 4) 用户信息分析,通常包括用户名和密码。 2 解决方案 ( 或数据库系统设计 ) 2.1 E-R 模型设计 根据E—R图,将其转化为如下数据实体,数据库学生成绩管理系统.dbc,包括如下的表 和视图: 1) 学生登记表——学生表.dbf。 字段名称 字段类型 字段宽度 xh 字符型 10 xm 字符型 6 xb 字符型 2 csrq 日期型 8 bj 字符型 4 2) 课程登记表——课程表.dbf。 字段名称 字段类型 字段宽度 kch 字符型 2 kcm 字符型 10 js 字符型 10 xf 字符型 10 3) 成绩登记表——成绩表.dbf 字段名称 字段类型 字段宽度 xh 字符型 10 kch 字符型 2 cj 数值型 3 4) 借书视图(lyxview)。 为了进行浏览总表的需要,需要设计了一个总表浏览视图,该视图从学生表.dbf等 3个表中提取了10个字段的数据: 学生表.xh 学生表.xm 学生表.xb 学生表.csrq 学生表.bj 课程表.kch 课程表.kcm 课程表.js 课程表.xf 成绩表.cj 其视图关系可由以下SQL语句定义: SELECT 学生表.*, 课程表.*, 成绩表.cj; FROM 学生成绩管理系统!学生表, 学生成绩管理系统!课程表,; 学生成绩管理系统!成绩表; WHERE 学生表.xh = 成绩表.xh; AND 课程表.kch = 成绩表.kch 所建数据库如下图所示: 2.2 数据表 本系统需要使用的数据如下: 3 系统实现 3.1 开发环境 本系统由SQL语言编写,在Visual Foxpro 6.0软件环境下可以正常运行 3.2 系统流程图 系统流程图模块主要由刘龙洋同学设计,而系统的功能设计主要由李江滨同学完成, 我主要负责程序主要功能界面的设计,下面是部分流程图: 、 3.3 程序主要功能界面 1、登录界面的设计: 第一步:在表单上单击鼠标右键,并在弹出菜单中选择"数据环境"项,打开数据环境 设计器,添加数据表mm.dbf; 第二步:创建表单并保存为"登录"; 第三步:添加lable1,并设置其caption属性为"欢迎使用学生成绩管理系统!"; 第四步:添加lable2和text1并设置相关属性; 第五步:添加timer控件,并设置其Enabled属性为"真",用于设计窗口动画。 登录界面如下图所示: 2、修改密码表单的设计: 第一步:在表单上单击鼠标右键,并在弹出菜单中选择"数据环境"项,打开数据环境 设计器,添加数据表mm.dbf; 第二步:创建表单并保存为"修改密码"; 第三步:添加label1 、label2、 label3,并设置其caption属性分别为"请输入旧密码"、"请输入新密码"、"请确认新密 码"; 第四步:添加text1、 text2、 text3,并设置相关属性; 第五步:添加command1和command2,并设置其caption属性分别为"确认"和"取消"; 修改密码表单如下图: 3、学生基本信息维护表单的设计: 第一步:创建表单,并保存为学生表.scx; 第二步:添加lable1~lable5,其caption的属性如下图所示 ; 第三步: 添加文本框text1~text5,并设置相关属性; 第四步:添加"院系"、"专业"、"班级"和"学期"列表框; 第五步:添加类,并设置相关属性,用于增添和修改学生基本信息; 第六步:添加文本框text6,并设置相关属性; 第七步:添加command1~command10,并设置相关属性; 第八步:添加"返回"按钮,其功能是关闭此界面; 第九步:执行运行命令,并进行测试。 4、课程信息维护表单的设计: 第一步:创建表单,并保存为课程表.scx; 第二步:添加lable1~lable4,其caption的属性如下图所示 ; 第三步: 添加文本框text1~text4,并设置
学生成绩管理系统数据库设计 [提要] 一个好的数据库,不但可以提高数据查询效率,而且还可以保证数据的完整性和一致性 。所以,数据库在信息管理系统中有着非常重要的作用。本文介绍如何使用SQL Server 2005完成学生成绩管理系统数据库设计。 关键词:SQL Server;成绩管理系统;数据库设计 引入 因为各高校学生人数的增多以及学生成绩管理工作的复杂性,人工管理学生成绩信息 的效率越来越低。这种情况下,学生成绩管理系统就出现了。 一、需求分析 需求分析是整个数据库设计中重要的一步,在这个阶段要充分地与用户沟通交流,了 解与分析用户的需求。学生信息管理系统中涉及的主要人员有学生、教师、管理人员; 主要的部门有教务处、系部。在需求分析时可以通过问卷调查、谈话等方式,了解用户 的需求,最终绘制系统的数据流程图。 二、数据库表 关系数据库中所有的数据都存储在关系表中,通过需求分析,我们可以在学生成绩管 理系统中创建以下数据表(此处只列举主要的数据表)。(表1、表2、表3、表4、表5) 三、索引 索引是提高查询的主要方法,在图书管理系统中,因为图书数量的庞大,所以建立索 引是必不可少的。在为表中的主键建立索引以后,系统会自动地在主键上创建聚集索引 。除此之外,我们还可以为一些经常查询的字段上,创建非聚集索引。 索引创建以后会提高查询效率,但也会引起一些问题,如降低数据更新的速度、索引 建后需要维护。所以,在创建索引时,要综合考虑其优缺点。可以参考以下原则为表中 的列创建查询:(1)经常用于查询的列;(2)经常用于分组和排序的列;(3)在连接 中常用到的列。 按照以上原则,我们可以为以下列创建索引:Stu_Id、Stu_Name、Tea_Id、Tea_Nam e、speciality_Id、class_Id等。 四、存储过程 存储过程是T- SQL语句的集合,能够实现特定的功能。使用存储过程,可以大大减少网络传输流量,提 高应用程序性能,而且由于它只在第一次执行时被优化、编译。因此使用存储过程不仅 可以极大地降低应用程序的实现难度,而且还可以极大地提高系统的运行速度、效率。 SQL Server 2005中存储过程分为:系统存储过程、用户自定义存储过程、扩展存储过程三种。例如 :在该系统中,我们可以创建存储过程实现按照学生姓名查询成绩实现代码如下: CREATE PROCEDURE grade_by_name @name char(10) AS BEGIN SELECT*FROM grade WHERE Stu_Id=(SELECT Stu_Id FROM STUDENT WHERE Stu_Name=@name) END 五、触发器 触发器是在执行操作语句时自动执行的一种存储过程。触发器可以侦测到数据库内数 据的操作,并自动地级联影响到整个数据库的操作,从而保证数据库数据的完整性和一 致性。例如:在某一个学生退学删除学生基本信息以后,那么该学生相应的成绩信息也 应该被删除。可以以下代码完成该功能: CREATE TRIGGER STUDENT_DELETE ON Student FOR Delete As BEGIN Delete from grade Where stu_id=(Select stu_id from deleted) END 主要参考文献: [1]黄存东.数据库原理及应用.中国水利水电出版社,2011.1. [2](美)Peter Rob,Carlos Coronel.张瑜,张继萍等译.数据库系统设计实现管理.清华大学出版社,2005. ----------------------- 学生成绩管理系统数据库设计全文共3页,当前为第1页。 学生成绩管理系统数据库设计全文共3页,当前为第2页。 学生成绩管理系统数据库设计全文共3页,当前为第3页。
### 回答1: 高校成绩管理数据库系统设计实现(CDSN)是一个用于高校对学生成绩进行管理的系统。该系统需要具备以下功能: 1. 数据库设计设计数据库结构,包括学生信息表、课程信息表和成绩表。学生信息表包括学生的基本信息,如学号、姓名、性别、年龄等。课程信息表包括课程名称、任课教师、上课时间等。成绩表记录学生的成绩信息,包括学生学号、课程编号、成绩等。 2. 用户管理设计用户管理模块,包括管理员和教师两个角色。管理员具备对系统进行设置和维护的权限,包括学生和课程信息的管理等。教师可以查询和修改学生成绩,但无法进行系统设置。 3. 成绩录入和查询:教师可以通过系统录入学生的成绩信息,包括学生学号、课程编号和成绩等。学生和教师可以使用系统进行成绩查询,学生可以查询自己的成绩和课程表,教师可以查询该课程的所有学生成绩。 4. 成绩统计与分析:系统应具备成绩的统计和分析功能,可以按照班级、课程等维度进行成绩分析,计算课程平均分、及格率等指标。 5. 数据备份与恢复:系统需要支持数据的备份和恢复功能,保证数据的安全性和可靠性。 在实现上,可以使用关系型数据库管理系统(RDBMS)如MySQL或Oracle来设计实现CDSN。通过使用SQL语言进行数据表的创建、查询和修改操作,实现系统的各项功能。同时,可以利用编程语言如Java或Python进行系统的前端开发和与数据库的交互。 总之,CDSN是一个方便高校进行成绩管理的系统,能够实现学生信息的管理成绩的录入和查询、统计分析等功能,提高高校成绩管理的效率和准确性。 ### 回答2: 高校成绩管理数据库系统设计实现主要包括以下几个方面的内容。 首先,数据库系统应该包括学生信息表、课程信息表和成绩管理表等主要表。学生信息表用于存储学生的基本信息,如学号、姓名、性别等;课程信息表用于存储课程的基本信息,如课程号、课程名、学分等;成绩管理表用于存储学生的成绩信息,包括学号、课程号和成绩等字段。 其次,在数据库系统设计中,需要考虑到学生与课程的关联关系。一般来说,一个学生可以选择多门课程,而一门课程可以由多个学生选修。因此,可以在学生信息表和课程信息表中设置外键,将学生信息和课程信息进行关联。 另外,数据库系统还应该包括查询和统计功能。通过编写相应的SQL语句,可以实现对学生成绩的查询、排序和筛选等操作。例如,可以根据学生的学号查询其选修的所有课程及对应成绩;或者对学生的成绩进行整体排名。 此外,要保证数据库系统的数据安全性和稳定性,可以考虑对数据库进行定期备份和恢复操作,以避免数据丢失和损坏。 最后,数据库系统实现需要结合具体的编程语言和开发工具。常见的数据库系统包括MySQL、Oracle等,而常用的编程语言包括Java、Python等。可以通过使用相应的数据库连接器和编程接口,实现数据库系统设计和操作。 综上所述,高校成绩管理数据库系统设计实现需要考虑学生信息、课程信息和成绩管理等内容,并且要实现查询和统计功能,保证数据的安全性和稳定性。通过合理选择数据库系统和编程语言,可以完成高校成绩管理数据库系统设计实现。 ### 回答3: 高校成绩管理数据库系统设计实现(CDSN)是一个用于高校课程成绩管理数据库系统。该系统的设计实现旨在提供一个高效、可靠、准确的成绩管理平台,方便高校进行课程成绩的录入、查询、统计和分析。 首先,在数据库系统设计阶段,需要建立一个数据库模型,包括学生、教师、课程和成绩等主要实体,以及它们之间的关系。这些实体可以通过关系型数据库的表格来表示,并通过主键、外键等约束保证数据的完整性和一致性。 其次,需要设计实现一个用户界面,提供友好的交互方式。学生和教师可以通过登录系统后,根据不同的权限进行相关操作,如录入成绩、查询成绩、打印成绩单等。界面设计应简洁明了,操作流畅,方便用户快速完成相关任务。 然后,在数据库系统实现过程中,需要编写相关的程序代码来完成数据库的连接、数据的读写和逻辑处理等操作。应使用合适的编程语言和数据库管理系统,确保系统的稳定性和性能。 最后,为了提高系统的功能和性能,可以考虑增加一些高级功能,如成绩的自动统计、课程成绩曲线的生成、成绩分析报告的生成等。这些功能可以通过编写相应的程序代码来实现,为用户提供更加全面和便捷的成绩管理和分析工具。 总之,高校成绩管理数据库系统设计实现应注重数据库模型的建立、用户界面的设计、程序代码的编写和高级功能的增加,以提供一个高效、可靠、准确的成绩管理平台,满足高校课程成绩管理的需求。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值