摘 要
高新科技和计算机的飞速发展,给人们带来了更多的便利。电脑普及时代即将到来,网络技术也在逐渐完善,人们的生活已经开始发生重要的变革。信息时代对人才素质的结构提出了更新,更高的要求,开展网络教学已成为学校教育面临信息时代的必然选择。
在线英语自学系统将英语学习和网络联系在一起,具备课程学习和自测两个大的功能。课程学习主要是学习课文,词汇;自测主要对单选题和阅读题进行针对性的练习。通过在线英语自学系统的建设,为学生和学校建立了B/S结构的网络教学体系。
本文共分5章,主要介绍了系统的背景和意义、所用的理论基础、系统需求分析、系统设计流程、系统测试。
关键词:自学自检;网络教学;英语学习;模拟考试
4.1 系统总体架构
该系统主要完成用户方面的功能,根据用户的需求可以分为:身份验证,课程自学和在线自测3个功能模块。
身份验证模块:当用户登录系统后,要求身份验证,系统会根据在数据库中有无此人和密码是否正确分别给予错误提示。
课程自学模块:当选择课程自学后,系统会显示可用的课程编号和课程名,当用户选择了一个课程,系统会从数据库中调出课程名、课文、课后词汇信息。
在线自测模块:用户可以选择单独对单选,阅读进行强化训练,或者做一个题型混合的模拟测试。其中在强化训练单选和阅读时,系统随机产生试题,不会限定完成时间,做完试题交卷后系统会计算成绩并显示出来。在做模拟测试时,系统随机产生题型混合的试题,可以根据需求设定测试时间,时间到时会自动交卷,在交卷后系统会计算并显示出分数。
4.3 系统功能模块分析
4.3.1 登录模块
主要实现当用户登录时,如果没有该用户名,则提示“不存在用户”;如果有该用户名,但输入密码时输入了错误的密码,则提示“密码错误”。图如下所示:
图2 “登录用户不存在”提示图
例如,在用户ID栏里输入名为“aaa”的用户,但是这个用户名在数据库中并不存在,则系统提示“不存在名为aaa的用户”。
图3 “登录密码错误”提示图
当用户在用户ID栏里填写了正确的用户名,但密码错误,则系统会提示“密码错误,请重试”。相关代码如下:
string name = textName.Value.Trim();
string password = textPassword.Value.Trim();
IDataService ds = new DataService();
int result = ds.StudentLogin(name, password);
switch (result)
{
case 0: //登录成功
Session["name"] = name;
FormsAuthentication.RedirectFromLoginPage(name, true);
break;
case 1: //密码错误
errorMessage.InnerText = "密码错误,请重试。";
break;
case 2: //不存在用户
errorMessage.InnerText = "不存在名为\"" + name + "\"的用户";
break;
}
调用了ds.StudentLogin()存储过程,具体为:
CREATE PROCEDURE dbo.studentLogin
@name varchar(20),
@password varchar(20)
AS
IF EXISTS
( SELECT id
FROM student
WHERE name=@name
AND password=@password
)
BEGIN
SELECT 0 --验证成功
END
ELSE IF EXISTS
( SELECT id
FROM student
WHERE name=@name
)
BEGIN
SELECT 1 --密码错误
END
ELSE
BEGIN
SELECT 2 --用户不存在
END
RETURN
GO
4.3.2 获取课文列表
图4 选择模块图
当合法用户通过系统身份验证,会进入到欢迎画面,这时可以选择“课程自学”和“在线自测”。当用户选择了“课程自学”后,出现课程列表,如下图:
图5 可用课程列表图
当用户登录后选择课文学习后,显示可以阅读的课文列表,用户可以选择想要学习的课程。相关代码如下:
protected void Page_Load(object sender, EventArgs e)
{
IDataService ds = new DataService();
ArrayList lessonList = ds.GetLessonList();
this.lessonListRepeater.DataSource = lessonList;
this.lessonListRepeater.DataBind();
}
其中调用了ds.GetLessonList()存储过程,具体为:
CREATE PROCEDURE dbo.getLessonList
AS
SELECT id,title
FROM lesson
RETURN
GO
4.3.3 课程自学模块
当用户选择了一篇课文,则调用该课文内容:课程名,课文,课后词汇。如下图:
图6 显示课程信息图
相关代码如下:
protected Lesson lesson = new Lesson();
protected void Page_Load(object sender, EventArgs e)
{int lessonId = Convert.ToInt32(Request["id"]);
IDataService ds = new DataService();
lesson = ds.GetOneLesson(lessonId);
//课后词汇
this.vocabulary.DataSource = lesson.Vocabulary;
this.vocabulary.DataBind();
}
其中调用了ds.GetOneLesson()和getVocabulary(),分别从数据库中调用课文和与课文相关的词汇。
getOneLesson()://调用课文
CREATE PROCEDURE dbo.getOneLesson
@id int
AS
SELECT id,title,content
FROM lesson
WHERE id = @id
RETURN
GO
getVocabulary()://调用词汇
CREATE PROCEDURE dbo.getVocabulary
@lessonId int
AS
SELECT id,lessonId,word,[translation]
FROM vocabulary
WHERE lessonId = @lessonId
RETURN
GO
4.3.4 在线自测模块
当用户选择了“在线自测”后,出现如下图,用户可以选择“强化阅读训练”,“强化单选训练”和“模拟测试”。
图7 选择自测功能图
当选择了“强化单选训练”,系统则随机调出单选题,如下图所示:
图8 随机产生的单选界面图
当选择了“强化阅读训练”,系统则随机调出阅读题,如下图所示:
图9 随机产生的阅读界面图
当选择了“模拟测试”,系统则按比例随机调出单选和阅读题,测试有时间限制,到时间会自动交卷,如下图所示:
图10 随机产生的试卷界面图
当用户完成题后,点最下面的“我做完了!”按钮,完成测试。系统会根据用户所选答案算出成绩,显示在页面上。
图11 交卷按钮界面图
图12 得到分数图
完成后显示成绩“32”。
相关代码如下:
protected void Page_Load(object sender, EventArgs e)
{if (!IsPostBack)
{ //根据请求的测试类型生成试卷,并放入Session中
string testType = Request["testType"];
TestPaper tp = SwitchPaper(testType);
Session["testPaper"] = tp;
}
//页面生成单选
TestPaper testPaper = (TestPaper)Session["testPaper"];
for (int i = 1; i <= testPaper.ChoicetestList.Count; i++)
{Choicetest c = (Choicetest)testPaper.ChoicetestList[i-1];
Literal question = new Literal();
question.Text = "<p>"+i+"."+c.Question+"</p>";
RadioButtonList radioList = new RadioButtonList();
radioList.ID = "choicetest" + i;
radioList.Items.Add(new ListItem("A." + c.A, "a"));
radioList.Items.Add(new ListItem("B." + c.B, "B"));
radioList.Items.Add(new ListItem("C." + c.C, "C"));
radioList.Items.Add(new ListItem("D." + c.D, "D"));
choicetestPanel.Controls.Add(question);
choicetestPanel.Controls.Add(radioList);
}
//单选,随机产生10个,每个10分
private TestPaper Choicetest()
{IDataService ds = new DataService();
TestPaper testPaper = new TestPaper(ds.GetRandomChoicetest(10), 10, new ArrayList(), 0, 0);
return testPaper;
}
//页面生成阅读
for (int i = 1; i <= testPaper.ReadingList.Count;i++)
{Reading r = (Reading)testPaper.ReadingList[i-1];
Literal readingContent = new Literal();
readingContent.Text = r.Content;
readingPanel.Controls.Add(readingContent);
for (int j = 1; j <= r.ChoicetestList.Count; j++)
{Choicetest c = (Choicetest)r.ChoicetestList[j - 1];
Literal choicetestQuestion = new Literal();
choicetestQuestion.Text = "<p>" + j.ToString() + "." + c.Question + "</p>";
RadioButtonList radioList = new RadioButtonList();
radioList.ID = "reading" + ((i - 1) * r.ChoicetestList.Count + j);
radioList.Items.Add(new ListItem("A." + c.A, "a"));
radioList.Items.Add(new ListItem("B." + c.B, "B"));
radioList.Items.Add(new ListItem("C." + c.C, "C"));
radioList.Items.Add(new ListItem("D." + c.D, "D"));
readingPanel.Controls.Add(choicetestQuestion);
readingPanel.Controls.Add(radioList);
} }
// 阅读,随机产生2篇,每篇5题,每题10分
private TestPaper Readingtest()
{IDataService ds = new DataService();
TestPaper testPaper = new TestPaper(new ArrayList(), 0, ds.GetRandomReading(2), 10, 0);
return testPaper;
}
//页面生成试卷
private TestPaper Paper()
{IDataService ds = new DataService();
TestPaper testPaper = new TestPaper(ds.GetRandomChoicetest(6), 10, ds.GetRandomReading(2), 4, 1);
return testPaper;
// 显示得分
protected void submit_ServerClick(object sender, EventArgs e)
{int score = CaculateScore();
this.scoreLabel.Text = "你的得分为:"+score.ToString();
this.button.Visible = false;
this.totalMin.InnerText = "0";
}
// 计算得分
private int CaculateScore()
{ int score = 0;
TestPaper testPaper = (TestPaper)Session["testPaper"];
//单选题得分
for (int i = 1; i <= testPaper.ChoicetestList.Count; i++)
{ Choicetest c = (Choicetest)testPaper.ChoicetestList[i - 1]; ;
char answer = c.Answer;
if (Request.Form["choicetest" + i] != null)
{if (Request.Form["choicetest" + i].Equals(answer.ToString()))
{score += testPaper.ChoicetestValue;
}
}
}
//阅读得分
for (int i = 1; i <= testPaper.ReadingList.Count; i++)
{Reading r = (Reading)testPaper.ReadingList[i - 1];
for (int j = 1; j <= r.ChoicetestList.Count; j++)
{Choicetest c = (Choicetest)r.ChoicetestList[j - 1];
char answer = c.Answer;
if (Request.Form["reading" + ((i - 1) * r.ChoicetestList.Count + j)] != null)
{if (Request.Form["reading" + ((i - 1) * r.ChoicetestList.Count + j)].Equals(answer.ToString()))
{score += testPaper.ReadingValue;
}
}
}
}
return score;
}
其中调用ds.GetRandomChoicetest()//获得随机单选题,ds.GetRandomReading()//获得随机阅读题,具体为:
ds.GetRandomChoicetest()://获得随机单选题
CREATE PROCEDURE dbo.getRandomChoicetest
@n int
AS
DECLARE @s varchar(200)
SELECT @s = 'SELECT TOP ' + cast(@n as varchar(10)) + ' * FROM choicetest WHERE readingId = 0 ORDER BY NEWID()'
EXEC(@s)
RETURN
GO
ds.GetRandomReading()://获得随机阅读题
CREATE PROCEDURE dbo.getRandomReading
@n int
AS
DECLARE @s varchar(200)
SELECT @s = 'SELECT TOP ' + cast(@n as varchar(10)) + ' * FROM reading ORDER BY NEWID()'
EXEC(@s)
RETURN
GO