WPF开发学生信息管理系统【WPF+Prism+MAH+WebApi】(二)(中)

简介: WPF开发学生信息管理系统【WPF+Prism+MAH+WebApi】(二)(中)

3. 课程类CourseEntity

课程类与课程表对应,如下所示:

1. namespace SIMS.Entity
2. {
3. /// <summary>
4. /// 课程实体
5. /// </summary>
6. public class CourseEntity
7.     {
8. /// <summary>
9. /// 唯一标识
10. /// </summary>
11. public int Id { get; set; }
12. 
13. /// <summary>
14. /// 课程名称
15. /// </summary>
16. public string Name { get; set; }
17. 
18. /// <summary>
19. /// 授课老师
20. /// </summary>
21. public string Teacher { get; set; }
22. 
23. /// <summary>
24. /// 创建时间
25. /// </summary>
26. public DateTime CreateTime { get; set; }
27. 
28. /// <summary>
29. /// 当前登录的账号的ID
30. /// </summary>
31. public int CreateUser { get; set; }
32. 
33. /// <summary>
34. /// 最后编辑时间
35. /// </summary>
36. public DateTime LastEditTime { get; set; }
37. 
38. /// <summary>
39. /// 最后修改人
40. /// </summary>
41. public int LastEditUser { get; set; }
42.     }
43. }

4. 成绩类ScoreEntity

成绩类与成绩表对应,如下所示:

1. namespace SIMS.Entity
2. {
3. /// <summary>
4. /// 成绩实体
5. /// </summary>
6. public class ScoreEntity
7.     {
8. /// <summary>
9. /// 唯一标识
10. /// </summary>
11. public int Id { get; set; }
12. 
13. /// <summary>
14. ///学生id
15. /// </summary>
16. public int StudentId { get; set; }
17. 
18. /// <summary>
19. /// 课程id
20. /// </summary>
21. public int CourseId { get; set; }
22. 
23. /// <summary>
24. /// 成绩
25. /// </summary>
26. public double Score { get; set; }
27. 
28. /// <summary>
29. /// 创建时间
30. /// </summary>
31. public DateTime CreateTime { get; set; }
32. 
33. /// <summary>
34. /// 当前登录的账号的ID
35. /// </summary>
36. public int CreateUser { get; set; }
37. 
38. /// <summary>
39. /// 最后编辑时间
40. /// </summary>
41. public DateTime LastEditTime { get; set; }
42. 
43. /// <summary>
44. /// 最后修改人
45. /// </summary>
46. public int LastEditUser { get; set; }
47.     }
48. }

5. 其他实体类

除了以上四个主要的实体类,还有其他实体类,如下所示:

菜单实体MenuEntity,如下所示:

1. namespace SIMS.Entity
2. {
3. /// <summary>
4. /// 菜单管理
5. /// </summary>
6. public class MenuEntity
7.     {
8. /// <summary>
9. /// 唯一标识
10. /// </summary>
11. public int Id { get; set; }
12. 
13. /// <summary>
14. /// 菜单名称
15. /// </summary>
16. public string Name { get; set; }
17. 
18. /// <summary>
19. /// 菜单描述
20. /// </summary>
21. public string Description { get; set; }
22. 
23. /// <summary>
24. /// 菜单路径
25. /// </summary>
26. public string Url { get; set; }
27. 
28. /// <summary>
29. /// 父ID
30. /// </summary>
31. public int? ParentId { get; set; }
32. 
33. /// <summary>
34. /// 排序
35. /// </summary>
36. public int? SortId { get; set; }
37.     }
38. }

用户实体类UserEntity,如下所示:

1. namespace SIMS.Entity
2. {
3. public class UserEntity
4.     {
5. /// <summary>
6. /// 用户唯一标识
7. /// </summary>
8. public int Id { get; set; }
9. 
10. /// <summary>
11. /// 登录账号
12. /// </summary>
13. public string UserName { get; set; }
14. 
15. /// <summary>
16. /// 密码
17. /// </summary>
18. public string Password { get; set; }
19. 
20. /// <summary>
21. /// 显示名称
22. /// </summary>
23. public string NickName { get; set; }
24.     }
25. }

角色实体类RoleEntity,如下所示:

1. namespace SIMS.Entity
2. {
3. /// <summary>
4. /// 角色
5. /// </summary>
6. public class RoleEntity
7.     {
8. /// <summary>
9. /// 唯一标识
10. /// </summary>
11. public int Id { get; set; }
12. 
13. /// <summary>
14. /// 角色名称
15. /// </summary>
16. public string Name { get; set; }
17. 
18. /// <summary>
19. /// 角色描述
20. /// </summary>
21. public string Description { get; set; }
22.     }
23. }

用户角色关系实体类UserRoleEntityr,如下所示:

1. namespace SIMS.Entity
2. {
3. /// <summary>
4. /// 用户-角色模型
5. /// </summary>
6. public class UserRoleEntity
7.     {
8. /// <summary>
9. /// 唯一标识
10. /// </summary>
11. public int Id { get; set; }
12. 
13. /// <summary>
14. /// 用户ID
15. /// </summary>
16. public int UserId { get; set; }
17. 
18. /// <summary>
19. /// 角色ID
20. /// </summary>
21. public int RoleId { get; set; }
22.     }
23. }

角色菜单关系实体RoleMenuEntity,如下所示:

1. namespace SIMS.Entity
2. {
3. /// <summary>
4. /// 角色-菜单关联
5. /// </summary>
6. public class RoleMenuEntity
7.     {
8. /// <summary>
9. /// 唯一标识
10. /// </summary>
11. public int Id { get; set; }
12. 
13. /// <summary>
14. /// 菜单IP
15. /// </summary>
16. public int MenuId { get; set; }
17. 
18. /// <summary>
19. /// 角色ID
20. /// </summary>
21. public int RoleId { get; set; }
22.     }
23. }

一共九个实体类,对应数据库中的九个表。

WebApi数据接口

在本示例中,客户端和服务端交互通过webapi接口进行,避免直接操作数据库。具体步骤如下所示:

1. EntityFramework框架

EntityFramework是.Net领域通用的ORM框架,有CodeFirst和DBFirst两种方式,本文采用DBFirst方式,即先设计数据库表结构,再创建实体和映射。如果要使用EntityFramework框架,首先进行安装,可通过NuGet包管理器进行安装,如下所示:

创建DataContext数据操作类,继承自DbContext,并重写OnModelCreating方法,将数据表和实体类建立联系,实现映射,如下所示:

1. namespace SIMS.WebApi.Data
2. {
3. public class DataContext:DbContext
4.     {
5. public DbSet<UserEntity> Users { get; set; }
6. 
7. public DbSet<MenuEntity> Menus { get; set; }
8. 
9. public DbSet<RoleEntity> Roles { get; set; }
10. 
11. public DbSet<UserRoleEntity> UserRoles { get; set; }
12. 
13. public DbSet<RoleMenuEntity> RoleMenus { get; set; }
14. 
15. /// <summary>
16. /// 学生
17. /// </summary>
18. public DbSet<StudentEntity> Students { get; set; }
19. 
20. /// <summary>
21. /// 班级
22. /// </summary>
23. public DbSet<ClassesEntity> Classes { get; set; }
24. 
25. /// <summary>
26. /// 课程
27. /// </summary>
28. public DbSet<CourseEntity> Courses { get; set; }
29. 
30. /// <summary>
31. /// 成绩
32. /// </summary>
33. public DbSet<ScoreEntity> Scores { get; set; }
34. 
35. public DataContext(DbContextOptions options) : base(options)
36.         {
37. 
38.         }
39. 
40. protected override void OnModelCreating(ModelBuilder modelBuilder)
41.         {
42. base.OnModelCreating(modelBuilder);
43.             modelBuilder.Entity<UserEntity>().ToTable("Users");
44.             modelBuilder.Entity<MenuEntity>().ToTable("Menus");
45.             modelBuilder.Entity<StudentEntity>().ToTable("Students");
46.             modelBuilder.Entity<RoleEntity>().ToTable("Roles");
47.             modelBuilder.Entity<UserRoleEntity>().ToTable("UserRoles");
48.             modelBuilder.Entity<RoleMenuEntity>().ToTable("RoleMenus");
49.         }
50.     }
51. }

2. 创建服务

在本示例中,为了封装数据库的底层操作,提取了四个服务接口和类,如下所示:

学生服务接口IStudentAppService,是对学生表操作的封装,如下所示:

1. namespace SIMS.WebApi.Services.Student
2. {
3. public interface IStudentAppService
4.     {
5. /// <summary>
6. /// 查询学生列表
7. /// </summary>
8. /// <param name="name"></param>
9. /// <returns></returns>
10. public PagedRequest<StudentEntity> GetStudents(string no,string name, int pageNum, int pageSize);
11. 
12. /// <summary>
13. /// 查询某一班级的学生列表
14. /// </summary>
15. /// <param name="classId"></param>
16. /// <returns></returns>
17. public PagedRequest<StudentEntity> GetStudentsByClasses(int classId);
18. 
19. /// <summary>
20. /// 通过id查询学生信息
21. /// </summary>
22. /// <param name="id"></param>
23. /// <returns></returns>
24. public StudentEntity GetSudent(int id);
25. 
26. /// <summary>
27. /// 新增学生
28. /// </summary>
29. /// <param name="student"></param>
30. /// <returns></returns>
31. public int AddStudent(StudentEntity student);
32. 
33. /// <summary>
34. /// 修改学生
35. /// </summary>
36. /// <param name="student"></param>
37. /// <returns></returns>
38. public int UpdateStudent(StudentEntity student);
39. 
40. /// <summary>
41. /// 删除学生
42. /// </summary>
43. /// <param name="id"></param>
44. public int DeleteStudent(int id);
45.     }
46. }

学生服务实现类StudentAppService

学生服务实现类是对接口的实现,如下所示:

1. namespace SIMS.WebApi.Services.Student
2. {
3. public class StudentAppService : IStudentAppService
4.     {
5. private DataContext dataContext;
6. 
7. public StudentAppService(DataContext dataContext) {
8. this.dataContext = dataContext;
9.         }
10. 
11. /// <summary>
12. /// 新增学生
13. /// </summary>
14. /// <param name="student"></param>
15. /// <returns></returns>
16. public int AddStudent(StudentEntity student)
17.         {
18. var entry = dataContext.Students.Add(student);
19.             dataContext.SaveChanges();
20. return 0;
21.         }
22. 
23. /// <summary>
24. /// 删除学生
25. /// </summary>
26. /// <param name="id"></param>
27. public int DeleteStudent(int id)
28.         {
29. var entity = dataContext.Students.FirstOrDefault(x => x.Id == id);
30. if (entity != null)
31.             {
32.                 dataContext.Students.Remove(entity);
33.                 dataContext.SaveChanges();
34.             }
35. return 0;
36.         }
37. 
38. /// <summary>
39. /// 查询学生列表
40. /// </summary>
41. /// <param name="name"></param>
42. /// <param name="pageNum">页数</param>
43. /// <param name="pageSize">每页大小</param>
44. /// <returns></returns>
45. public PagedRequest<StudentEntity> GetStudents(string no,string name,int pageNum,int pageSize)
46.         {
47.             IQueryable<StudentEntity> students = null;
48. if (!string.IsNullOrEmpty(name) && string.IsNullOrEmpty(no))
49.             {
50.                 students = dataContext.Students.Where(r => r.Name.Contains(name) && r.No.Contains(no)).OrderBy(r => r.Id);
51.             }
52. else if (!string.IsNullOrEmpty(name))
53.             {
54.                 students = dataContext.Students.Where(r => r.Name.Contains(name)).OrderBy(r => r.Id);
55.             }
56. else if (!string.IsNullOrEmpty(name)) {
57.                 students = dataContext.Students.Where(r => r.No.Contains(no)).OrderBy(r => r.Id);
58.             }
59. else
60.             {
61.                 students = dataContext.Students.Where(r => true).OrderBy(r => r.Id);
62.             }
63. int count = students.Count();
64.             List<StudentEntity> items;
65. if (pageSize > 0)
66.             {
67.                 items = students.Skip((pageNum - 1) * pageSize).Take(pageSize).ToList();
68.             }
69. else {
70.                 items = students.ToList();
71.             }
72. return new PagedRequest<StudentEntity>()
73.             {
74.                 count = count,
75.                 items = items
76.             };
77.         }
78. 
79. /// <summary>
80. /// 查询某一班级的学生列表
81. /// </summary>
82. /// <param name="classId"></param>
83. /// <returns></returns>
84. public PagedRequest<StudentEntity> GetStudentsByClasses(int classId)
85.         {
86.             IQueryable<StudentEntity> students = dataContext.Students.Where(r => r.ClassesId==classId).OrderBy(r => r.Id);
87. int count = students.Count();
88. var items = students.ToList();
89. return new PagedRequest<StudentEntity>()
90.             {
91.                 count = count,
92.                 items = items
93.             };
94.         }
95. 
96. /// <summary>
97. /// 通过id查询学生信息
98. /// </summary>
99. /// <param name="id"></param>
100. /// <returns></returns>
101. public StudentEntity GetSudent(int id)
102.         {
103. var entity = dataContext.Students.FirstOrDefault(r => r.Id == id);
104. return entity;
105.         }
106. 
107. /// <summary>
108. /// 修改学生
109. /// </summary>
110. /// <param name="student"></param>
111. /// <returns></returns>
112. public int UpdateStudent(StudentEntity student)
113.         {
114.             dataContext.Students.Update(student);
115.             dataContext.SaveChanges();
116. return 0;
117.         }
118.     }
119. }

班级服务接口IClassesAppService

班级服务接口是对班级表操作的封装,如下所示:

1. namespace SIMS.WebApi.Services.Classes
2. {
3. public interface IClassesAppService
4.     {
5. public PagedRequest<ClassesEntity> GetClassess(string dept, string grade, int pageNum, int pageSize);
6. 
7. /// <summary>
8. /// 通过id查询班级信息
9. /// </summary>
10. /// <param name="id"></param>
11. /// <returns></returns>
12. public ClassesEntity GetClasses(int id);
13. 
14. /// <summary>
15. /// 新增班级
16. /// </summary>
17. /// <param name="classes"></param>
18. /// <returns></returns>
19. public int AddClasses(ClassesEntity classes);
20. 
21. /// <summary>
22. /// 修改班级
23. /// </summary>
24. /// <param name="classes"></param>
25. /// <returns></returns>
26. public int UpdateClasses(ClassesEntity classes);
27. 
28. /// <summary>
29. /// 删除班级
30. /// </summary>
31. /// <param name="id"></param>
32. public int DeleteClasses(int id);
33.     }
34. }

班级服务实现类ClassesAppService,如下所示:

1. namespace SIMS.WebApi.Services.Classes
2. {
3. public class ClassesAppService : IClassesAppService
4.     {
5. private DataContext dataContext;
6. 
7. public ClassesAppService(DataContext dataContext)
8.         {
9. this.dataContext = dataContext;
10.         }
11. 
12. /// <summary>
13. /// 新增班级
14. /// </summary>
15. /// <param name="classes"></param>
16. /// <returns></returns>
17. public int AddClasses(ClassesEntity classes)
18.         {
19. var entry = dataContext.Classes.Add(classes);
20.             dataContext.SaveChanges();
21. return 0;
22.         }
23. 
24. /// <summary>
25. /// 删除班级
26. /// </summary>
27. /// <param name="id"></param>
28. public int DeleteClasses(int id)
29.         {
30. var entity = dataContext.Classes.FirstOrDefault(x => x.Id == id);
31. if (entity != null)
32.             {
33.                 dataContext.Classes.Remove(entity);
34.                 dataContext.SaveChanges();
35.             }
36. return 0;
37.         }
38. 
39. /// <summary>
40. /// 查询班级
41. /// </summary>
42. /// <param name="id"></param>
43. /// <returns></returns>
44. public ClassesEntity GetClasses(int id)
45.         {
46. var entity = dataContext.Classes.FirstOrDefault(r => r.Id == id);
47. return entity;
48.         }
49. 
50. public PagedRequest<ClassesEntity> GetClassess(string dept, string grade, int pageNum, int pageSize)
51.         {
52.             IQueryable<ClassesEntity> classes = null;
53. if (!string.IsNullOrEmpty(dept) && string.IsNullOrEmpty(grade))
54.             {
55.                 classes = dataContext.Classes.Where(r => r.Dept.Contains(dept) && r.Grade.Contains(grade)).OrderBy(r => r.Id);
56.             }
57. else if (!string.IsNullOrEmpty(dept))
58.             {
59.                 classes = dataContext.Classes.Where(r => r.Dept.Contains(dept)).OrderBy(r => r.Id);
60.             }
61. else if (!string.IsNullOrEmpty(grade))
62.             {
63.                 classes = dataContext.Classes.Where(r => r.Grade.Contains(grade)).OrderBy(r => r.Id);
64.             }
65. else
66.             {
67.                 classes = dataContext.Classes.Where(r => true).OrderBy(r => r.Id);
68.             }
69. int count = classes.Count();
70.             List<ClassesEntity> items=new List<ClassesEntity>();
71. if (pageSize < 1)
72.             {
73.                 items = classes.ToList();
74.             }
75. else {
76.                items = classes.Skip((pageNum - 1) * pageSize).Take(pageSize).ToList();
77.             }
78. 
79. return new PagedRequest<ClassesEntity>()
80.             {
81.                 count = count,
82.                 items = items
83.             };
84.         }
85. 
86. /// <summary>
87. /// 修改班级
88. /// </summary>
89. /// <param name="classes"></param>
90. /// <returns></returns>
91. public int UpdateClasses(ClassesEntity classes)
92.         {
93.             dataContext.Classes.Update(classes);
94.             dataContext.SaveChanges();
95. return 0;
96.         }
97.     }
98. }

其他服务接口和类尚不完善,暂时先不贴代码。

相关文章
|
9月前
|
SQL 中间件 C#
一个使用 WPF 开发的管理系统
一个使用 WPF 开发的管理系统
165 4
|
12月前
|
C# 开发者 Windows
WPF 应用程序开发:一分钟入门
本文介绍 Windows Presentation Foundation (WPF),这是一种用于构建高质量、可缩放的 Windows 桌面应用程序的框架,支持 XAML 语言,方便 UI 设计与逻辑分离。文章涵盖 WPF 基础概念、代码示例,并深入探讨常见问题及解决方案,包括数据绑定、控件样式与模板、布局管理等方面,帮助开发者高效掌握 WPF 开发技巧。
324 65
|
9月前
|
网络协议 网络安全 C#
基于 WPF 开发的简约,功能强大的终端模拟器
基于 WPF 开发的简约,功能强大的终端模拟器 前言今天大姚给大家推荐一款基于 WPF 开发的简约,功能强大的终端模拟器:ModengTerm。项目介绍ModengTerm是一款基于 WPF 开发的简约,功能强大的终端模拟器,可以用来连接SSH服务器,串口,TCP服务器,Windows命令行等。项目功能支持与SSH服务器,串口,Windows命令行进行交互。可以保存会话信息,方便下次直接登录。支持将终端内容导出为txt和html格式。根据关键字/正则表达式进行历史记录的查找。同步输入功能、历史记录、度可定制化的颜色主题、实时记录日志功能等。项目源码运行设置ModengTerm为启动项目运行:
147 0
|
11月前
|
设计模式 前端开发 C#
使用 Prism 框架实现导航.NET 6.0 + WPF
使用 Prism 框架实现导航.NET 6.0 + WPF
335 10
|
容器 C# Docker
WPF与容器技术的碰撞:手把手教你Docker化WPF应用,实现跨环境一致性的开发与部署
【8月更文挑战第31天】容器技术简化了软件开发、测试和部署流程,尤其对Windows Presentation Foundation(WPF)应用程序而言,利用Docker能显著提升其可移植性和可维护性。本文通过具体示例代码,详细介绍了如何将WPF应用Docker化的过程,包括创建Dockerfile及构建和运行Docker镜像的步骤。借助容器技术,WPF应用能在任何支持Docker的环境下一致运行,极大地提升了开发效率和部署灵活性。
518 1
|
测试技术 C# 开发者
“代码守护者:详解WPF开发中的单元测试策略与实践——从选择测试框架到编写模拟对象,全方位保障你的应用程序质量”
【8月更文挑战第31天】单元测试是确保软件质量的关键实践,尤其在复杂的WPF应用中更为重要。通过为每个小模块编写独立测试用例,可以验证代码的功能正确性并在早期发现错误。本文将介绍如何在WPF项目中引入单元测试,并通过具体示例演示其实施过程。首先选择合适的测试框架如NUnit或xUnit.net,并利用Moq模拟框架隔离外部依赖。接着,通过一个简单的WPF应用程序示例,展示如何模拟`IUserRepository`接口并验证`MainViewModel`加载用户数据的正确性。这有助于确保代码质量和未来的重构与扩展。
599 0
|
前端开发 C# 设计模式
“深度剖析WPF开发中的设计模式应用:以MVVM为核心,手把手教你重构代码结构,实现软件工程的最佳实践与高效协作”
【8月更文挑战第31天】设计模式是在软件工程中解决常见问题的成熟方案。在WPF开发中,合理应用如MVC、MVVM及工厂模式等能显著提升代码质量和可维护性。本文通过具体案例,详细解析了这些模式的实际应用,特别是MVVM模式如何通过分离UI逻辑与业务逻辑,实现视图与模型的松耦合,从而优化代码结构并提高开发效率。通过示例代码展示了从模型定义、视图模型管理到视图展示的全过程,帮助读者更好地理解并应用这些模式。
347 0
|
区块链 C# 存储
链动未来:WPF与区块链的创新融合——从智能合约到去中心化应用,全方位解析开发安全可靠DApp的最佳路径
【8月更文挑战第31天】本文以问答形式详细介绍了区块链技术的特点及其在Windows Presentation Foundation(WPF)中的集成方法。通过示例代码展示了如何选择合适的区块链平台、创建智能合约,并在WPF应用中与其交互,实现安全可靠的消息存储和检索功能。希望这能为WPF开发者提供区块链技术应用的参考与灵感。
179 0
|
开发者 C# Windows
WPF与游戏开发:当桌面应用遇见游戏梦想——利用Windows Presentation Foundation打造属于你的2D游戏世界,从环境搭建到代码实践全面解析新兴开发路径
【8月更文挑战第31天】随着游戏开发技术的进步,WPF作为.NET Framework的一部分,凭借其图形渲染能力和灵活的UI设计,成为桌面游戏开发的新选择。本文通过技术综述和示例代码,介绍如何利用WPF进行游戏开发。首先确保安装最新版Visual Studio并创建WPF项目。接着,通过XAML设计游戏界面,并在C#中实现游戏逻辑,如玩家控制和障碍物碰撞检测。示例展示了创建基本2D游戏的过程,包括角色移动和碰撞处理。通过本文,WPF开发者可更好地理解并应用游戏开发技术,创造吸引人的桌面游戏。
677 0
|
开发者 C# 自然语言处理
WPF开发者必读:掌握多语言应用程序开发秘籍,带你玩转WPF国际化支持!
【8月更文挑战第31天】随着全球化的加速,开发多语言应用程序成为趋势。WPF作为一种强大的图形界面技术,提供了优秀的国际化支持,包括资源文件存储、本地化处理及用户界面元素本地化。本文将介绍WPF国际化的实现方法,通过示例代码展示如何创建和绑定资源文件,并设置应用程序语言环境,帮助开发者轻松实现多语言应用开发,满足不同地区用户的需求。
287 0