1. 程式人生 > 實用技巧 >筆試考試系統一週進度

筆試考試系統一週進度

1.本週完成任務:

(1).專案架構搭建 asp.net MVC +Entity Framwork(Code First)

(2).生產環境搭建 IIS+Sql Server2019

(3).使用者登入模組 使用者登入+身份驗證授權

(4).學生管理 學生考試授權 +學生資訊編輯

(5).題庫管理 題庫資訊查詢、建立以及資訊修改

2.核心原始碼

(1).Entity Framwork(Code First)

 public class ExamSysDBContext : DbContext
    {

        public ExamSysDBContext():base("DBContext
") { this.Database.CommandTimeout = 600000; //時間單位是毫秒 ////初始化自動遷移 Database.SetInitializer(new MigrateDatabaseToLatestVersion<ExamSysDBContext, Configuration>()); } //預設生成的表名為型別的複數形式,想自定義規則時需要重寫資料上下文類的OnModelCreating方法 protected
override void OnModelCreating(DbModelBuilder modelBuilder) { //base.OnModelCreating(modelBuilder); modelBuilder.Conventions.Remove<PluralizingTableNameConvention>(); } #region 實體類 public DbSet<Exam_Answer> Exam_Answer { get; set
; } public DbSet<Exam_Library> Exam_Library { get; set; } public DbSet<Exam_Paper> Exam_Paper { get; set; } public DbSet<Exam_PaperRule> Exam_PaperRule { get; set; } public DbSet<Exam_Question> Exam_Question { get; set; } public DbSet<Exam_QuestionOptions> Exam_QuestionOptions { get; set; } public DbSet<Exam_RuleDetail> Exam_RuleDetail { get; set; } public DbSet<Exam_User> Exam_User { get; set; } #endregion } public class Configuration : DbMigrationsConfiguration<ExamSysDBContext> { public Configuration() { //開啟自動遷移 AutomaticMigrationsEnabled = true; //遷移的時候是否允許資料丟失 AutomaticMigrationDataLossAllowed = true; } }

(2).使用者登入模組 使用者登入+身份驗證授權

管理員(老師)與學生使用同一控制器進行登入 登陸後根據身份不同進行頁面跳轉,之後在管理員與學生的控制器中分別加入兩個過濾器。

  控制器方法:

 public JsonResult UserLogin(string userName, string userPwd)
        {
         
            //程式初始化新增超級管理員  採用code first初始化資料庫中沒資料 
            if (UsersService.GetUserNum() == 0)
            {
                Exam_User u = new Exam_User { CreateName = "System", CreateTime = DateTime.Now, PassWord = PassWordHelper.GetMD5("18837473169"), UserName = "admin", Phone = "13787674556", RealName = "張三", States = true, UserType = 1 };
                UsersService.InsertUser(u);
            }
          //資料庫存在該使用者  將使用者資訊返回回來
            var res = UsersService.GetUserNum(userName, userPwd);
            if (res != null)
            {
                //寫入憑證
                Session.Timeout = 30;
             
                //this.HttpContext.Session[CommonFeild.SessionName] = res;
               
                //登入成功
                return Json(new { Role = res.UserType, msg = "登入成功" + res.UserName, success = true });

            }
            //登入失敗

            return Json(new { msg = "登入失敗,請檢查賬號密碼", success = false });
        }

Service層方法

 public static Exam_User GetUserNum(string UserName,string Password)
        {
            string pwd = PassWordHelper.GetMD5(Password);
                 
            ExamSysDBContext dBContext = new ExamSysDBContext();
            return dBContext.Exam_User.Where(x => x.UserName == UserName && x.PassWord == pwd).FirstOrDefault();
        }

view層方法 使用ajax post進行提交

  form.on('submit(submit)', function (data) {
        var userName = data.field.user_name;
        var userPwd = data.field.password;
        var ipaddress = data.field.Ip;
        var token = $('input[name=__RequestVerificationToken]').val();

        $.post("/Login/UserLogin", { "userName": userName, "userPwd": userPwd,}, function (data) {
            if (data.success == true) {
                layer.msg(data.msg, { icon: 1, time: 500 });
                //管理員身份為1  學生為0
                if (data.Role == 1) {
                    window.location.href = '/Admin/Index';
                }
                else {
                    window.location.href = '/Student/Index';
                }
                //layer.msg('登入成功', { icon: 1, time: 500 });
              
            }
            else {
                layer.msg(data.msg, { icon: 2, time: 500 });
            }
        }, "json");
    
        return false;
    });

過濾器:在管理員對應控制器新增

 1 public class AdminFilter : AuthorizeAttribute
 2 {
 3 
 4 
 5 /// <summary>
 6 /// 使用者授權,驗證使用者資訊
 7 /// </summary>
 8 /// <param name="filterContext"></param>
 9 public override void OnAuthorization(AuthorizationContext filterContext)
10 {
11 //授權驗證 驗證Login 有沒有AllowAnonymousAttribute 特性
12 //if (filterContext.ActionDescriptor.IsDefined(typeof(AllowAnonymousAttribute), true))
13 //{
14 // return;
15 //}
16 
17 var session = filterContext.HttpContext.Session;
18 if (session[CommonFeild.SessionName] != null)
19 {
20 Exam_User user = filterContext.HttpContext.Session[CommonFeild.SessionName] as Exam_User;
21 //如果是學生進入相關頁面 返回到學生的主頁面
22 if (user.UserType == 0)
23 {
24 filterContext.Result = new RedirectResult("~/Exam/Index");
25 }
26 
27 }
28 //如果沒有授權資訊 跳轉到登入頁面
29 else
30 {
31 filterContext.Result = new RedirectResult("~/Login/Index");
32 }
33 
34 }
35 }

過濾器:在學生對應控制器新增

 1  public class StudentFilter : AuthorizeAttribute
 2     {
 3         public override void OnAuthorization(AuthorizationContext filterContext)
 4         {
 5           
 6             var session = filterContext.HttpContext.Session;
 7             if (session["LoginInfo"] != null)
 8             {
 9                 Exam_User user = session[CommonFeild.SessionName] as Exam_User;
10                 //如果是學生進入相關頁面 返回到學生的主頁面
11                 if (user.UserType == 0)
12                 {
13                     filterContext.Result = new RedirectResult("~/Exam/Index");
14                 }
15 
16             }
17             //如果沒有授權資訊 跳轉到登入頁面
18             else
19             {
20                 filterContext.Result = new RedirectResult("~/Login/Index");
21             }
22 
23         }
24     }

登入頁面效果:

(4).學生管理 學生考試授權 +學生資訊編輯

控制程式碼:

 1  public class StudentMannagerController : Controller
 2     {
 3         // GET: StudentMannager
 4         public ActionResult Index(int page = 1)
 5         {
 6             IPagedList list = StudentMannerService.GetList(page);
 7             return View(list);
 8         }
 9         public ActionResult Delete(int id)              
10         {
11 
12             try
13             {
14                 int res = StudentMannerService.RemoveStudent(id);
15             }
16             catch (Exception ex)
17             {
18                 return Json(new { msg = "刪除失敗" + ex, success = false });
19 
20             }
21             return Json(new { msg = "刪除成功", success = true });
22 
23           
24         }
25         public ActionResult Add()
26         {
27             return View();
28         }
29         [HttpPost]
30         public ActionResult Add(string UserName, string RealName, string Phone)
31         {
32             Exam_User u = new Exam_User()
33             {
34                 CreateTime = DateTime.Now,
35                 //學生賬號預設密碼123456
36                 PassWord = PassWordHelper.GetMD5("123456"),
37                 RealName = RealName,
38                 Phone = Phone,
39                 CreateName = "admin",
40                 States =true,
41                  UserName=UserName, UserType=0
42             };
43             try
44             {
45                 int res = StudentMannerService.InsertStudent(u);
46             }
47             catch (Exception ex)
48             {
49                 return Json(new { msg = "新增失敗"+ex, success = false });
50 
51             }
52             return Json(new { msg = "新增成功", success = true });   
53         }
54         public ActionResult Edit(int id)
55         {
56          var data= StudentMannerService.FindStudentByID(id);
57 
58             return View(data);
59         }
60         [HttpPost]
61         public ActionResult Edit(string uname, string Name, string phone,string id)
62         {
63             Exam_User u = new Exam_User { UserID= System.Convert.ToInt32(id), RealName= Name, UserName= uname, Phone = phone };
64             try
65             {
66                 StudentMannerService.Update(u);
67             }
68             catch (Exception ex)
69             {
70                 return Json(new { msg = "修改失敗" + ex, success = false });
71 
72             }
73             return Json(new { msg = "修改成功", success = true });
74 
75         }
76     }

(5).題庫管理 題庫資訊查詢、建立以及資訊修改

控制器對應程式碼:

 1  public class LibraryController : Controller
 2     {
 3         // GET: Library
 4         public ActionResult Index(int page = 1)
 5         {
 6             IPagedList list = LibraryService.GetList(page);
 7             return View(list);
 8         }
 9         public ActionResult Add()
10         {
11             return View();
12         }
13 
14         public ActionResult Lead()
15         {
16             var list = LibraryService.GetAll();
17             return View(list);
18         }       
19         [HttpPost]
20         public ActionResult Add(string libraryname, string libraryremark)
21         {
22             Exam_Library library = new Exam_Library()
23             {
24                 CreatTime = DateTime.Now,
25                 UpdateTime = DateTime.Now,
26                 Library_Remark = libraryremark,
27                 Library_Name = libraryname,
28                 LibraryStates = true
29             };
30             try
31             {
32                 int res = LibraryService.InsertLibrary(library);
33             }
34             catch (Exception ex)
35             {
36                 return Json(new { msg = "新增失敗" + ex, success = false });
37 
38             }
39             return Json(new { msg = "新增成功", success = true });
40         }
41         public ActionResult Edit(int id)
42         {
43             var data = LibraryService.FindLibraryByID(id);
44             return View(data);
45         }
46         [HttpPost]
47         public ActionResult Edit(string libraryname, int id, string libraryremark)
48         {
49             Exam_Library library = new Exam_Library { Library_Name = libraryname, LibraryID = id, Library_Remark = libraryremark, UpdateTime = DateTime.Now };
50             try
51             {
52                 LibraryService.Update(library);
53             }
54             catch (Exception ex)
55             {
56                 return Json(new { msg = "修改失敗" + ex, success = false });
57 
58             }
59             return Json(new { msg = "修改成功", success = true });
60 
61         }
62         /// <summary>
63         /// 禁用題庫
64         /// </summary>
65         /// <param name="id"></param>
66         /// <returns></returns>
67         public ActionResult Disable(int id)
68         {
69             try
70             {
71                 int res = LibraryService.DisableLibrary(id);
72             }
73             catch (Exception ex)
74             {
75                 return Json(new { msg = "禁用失敗" + ex, success = false });
76 
77             }
78             return Json(new { msg = "禁用成功", success = true });
79 
80         }
81     }

Service層方法:

 1 public class LibraryService
 2     {
 3         /// <summary>
 4         /// 獲取所有題庫
 5         /// </summary>
 6         /// <param name="lmid"></param>
 7         /// <param name="page"></param>
 8         /// <returns></returns>
 9         public static IPagedList GetList(int page = 1)
10         {
11             ExamSysDBContext db = new ExamSysDBContext();
12             int pagesize = 10;
13             IPagedList list = db.Exam_Library.OrderBy(x => x.LibraryID).ToPagedList(page, pagesize);
14             return list;
15         }
16         public static List<Exam_Library> GetAll()
17         {
18             ExamSysDBContext db = new ExamSysDBContext();
19             var list = db.Exam_Library.ToList();
20             return list;
21         }
22         /// <summary>
23         /// 增加題庫
24         /// </summary>
25         /// <param name="library"></param>
26         /// <returns></returns>
27         public static int InsertLibrary(Exam_Library library)
28         {
29             ExamSysDBContext dBContext = new ExamSysDBContext();
30             dBContext.Exam_Library.Add(library);
31             return dBContext.SaveChanges();
32         }
33         /// <summary>
34         /// 通過ID找到該題庫
35         /// </summary>
36         /// <param name="id"></param>
37         /// <returns></returns>
38         public static Exam_Library FindLibraryByID(int id)
39         {
40             ExamSysDBContext dBContext = new ExamSysDBContext();
41             var data = dBContext.Exam_Library.Where(x => x.LibraryID == id).FirstOrDefault();
42             return data;
43         }
44         /// <summary>
45         /// 禁用題庫
46         /// </summary>
47         /// <param name="id"></param>
48         /// <returns></returns>
49         public static int DisableLibrary(int id)
50         {
51             ExamSysDBContext dBContext = new ExamSysDBContext();
52            
53             var data = dBContext.Exam_Library.Where(x => x.LibraryID == id).FirstOrDefault();
54 
55             data.LibraryStates = false;
56             return dBContext.SaveChanges();
57         }
58         /// <summary>
59         /// 修改題庫名稱
60         /// </summary>
61         /// <param name="library"></param>
62         /// <returns></returns>
63         public static int Update(Exam_Library library)
64         {
65             ExamSysDBContext dBContext = new ExamSysDBContext();
66             var data = dBContext.Exam_Library.Where(x => x.LibraryID == library.LibraryID).FirstOrDefault();
67             data.Library_Name = library.Library_Name;
68             data.Library_Remark = library.Library_Remark;
69             data.UpdateTime = library.UpdateTime;
70 
71             return dBContext.SaveChanges();
72         }
73     }

3.遇到問題

1.題庫中的試題一條條新增效率比較低

4.解決方案

1.使用Excel匯入試題,格式必須與模板一致

2.使用NPOI讀取Excel資訊

核心程式碼:Converter 類(獲取Excel內容)

public static DataTable ExcelToDataSet(string filepath)
        {
            DataTable dt = new DataTable();
            dt.Columns.Add("Title");
            dt.Columns.Add("OptionA");
            dt.Columns.Add("OptionB");
            dt.Columns.Add("OptionC");
            dt.Columns.Add("OptionD");
            dt.Columns.Add("RightOption");
            dt.Columns.Add("Analyze");
            IWorkbook workbook = WorkbookFactory.Create(filepath);
            ISheet sheet = workbook.GetSheetAt(0);//獲取第一個工作薄

            //IRow row = (IRow)sheet.GetRow(0);//獲取第一行
            int Temp = 0;
            foreach (IRow item in sheet)
            {
                if(Temp!=0)
                {
                    DataRow dr = dt.NewRow();
                    for (int i = 0; i < dt.Columns.Count; i++)
                    {
                        if(item.GetCell(i)!=null)
                        {
                            dr[i] = item.GetCell(i).ToString();
                        }
                        else
                        {
                            dr[i] = "";
                        }
                                              
                    }
                    dt.Rows.Add(dr);
                }
                Temp = 1;

            }
            return dt;          
        }
    }

控制器對應程式碼:

 [HttpPost]
        public JavaScriptResult Lead(string libraryname, HttpPostedFileBase excelname)
        {
            try
            {
                if (excelname.ContentLength > 0)
                {
                    var fileName = Path.GetFileName(excelname.FileName);

                    var path = Path.Combine(Server.MapPath("~/Content/ExcelTemp"), fileName);
                    excelname.SaveAs(path);
                    DataTable dt = Utility.Converter.ExcelToDataSet(path);
                    foreach (DataRow item in dt.Rows)
                    {

                        ///新增試題資訊 拿到ID
                        string title = item["Title"].ToString();
                        string answer = item["RightOption"].ToString();
                        string Analyze = item["Analyze"].ToString();

                        string OptionA = item["OptionA"].ToString();
                        string OptionB = item["OptionB"].ToString();
                        string OptionC = item["OptionC"].ToString();
                        string OptionD = item["OptionD"].ToString();

                        Exam_Question q = new Exam_Question { LibraryID = Convert.ToInt32(libraryname), QuestionAnswer = answer, QuestionDescribe = title, QuestionParse = Analyze, Score = 2 };
                        int id = Exam_QuestionService.Add(q);
                        ///拿到ID繼續新增選項
                        List<Exam_QuestionOptions> lists =
                            new List<Exam_QuestionOptions>()
                            {

                                new Exam_QuestionOptions{
                                    QuestionID=id,
                                    CreateTime=DateTime.Now,
                                    OptionCode="A",
                                    OptionDescribe=OptionA,
                                    UpdateTime=DateTime.Now
                                },
                                new Exam_QuestionOptions{
                                    QuestionID=id,
                                    CreateTime=DateTime.Now,
                                    OptionCode="B",
                                    OptionDescribe=OptionB,
                                    UpdateTime=DateTime.Now
                                },
                                new Exam_QuestionOptions{
                                    QuestionID=id,
                                    CreateTime=DateTime.Now,
                                    OptionCode="C",
                                    OptionDescribe=OptionC,
                                    UpdateTime=DateTime.Now
                                },
                                new Exam_QuestionOptions{
                                    QuestionID=id,
                                    CreateTime=DateTime.Now,
                                    OptionCode="D",
                                    OptionDescribe=OptionD,
                                    UpdateTime=DateTime.Now
                                },
                            };
                        Exam_QuestionOptionsService.AddOptions(lists);
                    }

                }
            }
            catch (Exception ex)
            {

                return JavaScript("<script>layer.msg('匯入失敗')</script>");
            }


            return this.JavaScript("alert('匯入成功')");
        }

注:從Excel匯入題庫必須與匯入題庫的模板格式一致 否則無法匯入成功