筆試考試系統一週進度
阿新 • • 發佈:2020-07-19
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方法 protectedoverride 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匯入題庫必須與匯入題庫的模板格式一致 否則無法匯入成功