【C#】人力资源管理系统「WinForm」「sql server」「内附全代码」

本文详细介绍了使用C#开发的人力资源管理系统,包括分层架构、数据库准备、模型层、数据访问层(DAL)、业务逻辑层(BLL)及界面层的实现,涉及用户管理、部门管理、日志查询、工资单处理等功能,同时展示了关键代码和运行成果,提供了完整的项目获取链接。
摘要由CSDN通过智能技术生成

人力资源管理系统

长文预警

记录一下自己的C#实训课的成果
需要github gitee链接的在最底下.

实训项目目标

目标1:理解复杂软件系统的分层架构思想,能运用两层/三层架构设计软件。
目标2:在明确软件功能需求下,能按两层架/三层架构设计特定的软件模块。
目标3:了解复杂软件系统,通过设计实现不同的组件、模块及其关系完成整个软件的开发,并体现创新意识。
目标4:熟练掌握一种集成开发环境,并能运用各类技术、资源解决软件开发中的问题。
目标5:能够撰写报告,清晰表达软件开发中的问题和方案。


软件版本

ide 我使用的Visual Studio 2015
sql 就是使用vs自带的sql server 2014


功能介绍

  1. 能实现用户和管理员的登录,同时密码不能明文存储在数据库中
  2. 能针对不同的登录情况做出不同的提示
  3. 能在主界面中状态栏显示登录信息
  4. 能在每次登录操作之后记录在日志表中
  5. 包括用户对自己密码的修改功能
  6. 包括管理员对用户管理:添加用户,删除用户,锁定用户,查询用户功能
  7. 包括管理员对部门管理:添加部门,删除部门,部门列表展示功能
  8. 包括管理员对日志列表查询功能,实行分页浏览,可进行上下页以及首尾页跳转功能
  9. 包括管理员对员工列表查询功能:按照姓名模糊查询,部门查询,入职时间查询三个不定项查询条件
  10. 包括管理员对员工管理功能:添加员工,编辑员工信息,以及删除员工功能
  11. 包括管理员对日志迁移的功能,把指定日期间的日志从旧表中移除,存入新表.
  12. 能实现把员工列表导出为Excel文件
  13. 能实现员工不同年月部门的工资单显示以及写入修改以及导出功能
  14. 能实现工资单的打印功能,打印样式中有总计,和年月部门的显示.

运行成果部分展示

登录
在这里插入图片描述
添加用户界面
在这里插入图片描述
日志查询
在这里插入图片描述
日志迁移
在这里插入图片描述
员工列表
在这里插入图片描述
编辑员工信息
在这里插入图片描述
生成工资单
在这里插入图片描述
打印工资单
在这里插入图片描述
如果你有打印机的话就可以直接打印了.

修改密码
在这里插入图片描述


解决方案部分展示

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述


数据库准备

利用脚本生成数据库

首先在自己的D盘新建一个文件夹,我这叫做SqlData~~(当然你也可以叫别的,甚至不在d盘,但是需要你在sql文件里重写修改储存地址)~~ 文件夹地址就是D:SqlData
创建完后具体使用方式就是把sql文件拖到Visual Studio中再点击左上角的运行按键就可以了
在这里插入图片描述

脚本和项目文件我会一起放在github上和gitee上,有需要的自取.

创建登录名,用户以及赋予登陆权限

1. 创建登录名

首先用windows身份登录数据库,点击安全性,再右键登录名选择添加新登录名
在这里插入图片描述
输入,后运行就创建成功了.(可以自己修改用户名和密码,我这里用户名为hrmtest,密码为test)

CREATE LOGIN [hrmtest] WITH PASSWORD = 'test'

2. 创建用户

进入刚刚创建好的数据库HRMDB数据库中,选择安全性,之后右键用户,添加用户
在这里插入图片描述
我们把第二行的WITHOUT LOGIN给删掉,将两处[]内改成我们的用户名hrmtest后,运行

CREATE USER [hrmtest]
	WITH DEFAULT_SCHEMA = dbo
GO
GRANT CONNECT TO [hrmtest]

3. 赋予权限

我们右键HRMDB数据库后新建查询
在这里插入图片描述
输入后运行,其中把最后一个引号内改成自己的用户名

exec sp_addrolemember 'db_owner', 'hrmtest'

4. 使用新用户连接服务器

首先右键原有是由windows连接的服务器,断开连接.
点击添加Sql server
在这里插入图片描述
填写身份验证
在这里插入图片描述
连接完成之后进去HRMDB中看看,如果可以看到表就说明之前的操作都成功了.


Model模型层

右键解决方案,点击添加,点击新建项目,选择类库,创建我们的模型层HRMSystem.Model
在这里插入图片描述

Operator类

在这个类库中,我们添加一个Operator类,作为登录的操作员的信息模型
其中Id的数据类型设置为Guid,这样可以使用Guid来生成一个独一无二的辨识编号

    public class Operator
    {
        public Guid Id { get; set; } //Guid为全局统一标识符,可以生成一个独一无二的id
        public string UserName { get; set; }
        public string Password { get; set; }
        public bool IsDeleted { get; set; }//有无被删除
        public string RealName { get; set; }
        public bool IsLocked { get; set; }//有无被锁定
    }

OperationLog类

用来存放操作日志

public class OperationLog
    {
        public Guid Id { get; set; }
        public string ActionDesc { get; set; }
        public Guid OperatorId { get; set; }
        public DateTime ActionDate { get; set; }
    }

Employee类

用来存放员工的信息
其中Photo的数据类型需要设置为Byte[],要不然不能存储图片,必须用数据流来存储

public class Employee
    {
        public Guid Id { get; set; }
        public string Number { get; set; }
        public string Name { get; set; }
        public DateTime BirthDay { get; set; }
        public DateTime InDay { get; set; }
        public Guid MarriageId { get; set; }
        public Guid PartyId { get; set; }
        public Guid EducationId { get; set; }
        public Guid GenderId { get; set; }
        public Guid DepartmentId { get; set; }
        public string Telephone { get; set; }
        public string Address { get; set; }
        public string Email { get; set; }
        public string Remarks { get; set; }
        public string Resume { get; set; }
        public Byte[] Photo { get; set; }
        public string Nation { get; set; }
        public string NativePlace { get; set; }

    }

EmployeeSelect类

用来存放员工查询时的查询条件信息

    public class EmployeeSelect
    {
        public string Name { get; set; }
        public DateTime InDay1 { get; set; }
        public DateTime InDay2 { get; set; }
        public Guid DepartmentId { get; set; }
        public bool TimeCheck { get; set; }
    }

Department类

用来存放部门的编号和名字信息

    public class Department
    {
        public Guid Id { get; set; }
        public string Name { get; set; }
    }

SalarySheet类

存储工资表的信息

    public class SalarySheet
    {
        public Guid Id { get; set; }
        public int Year { get; set; }
        public int Month { get; set; }
        public Guid DepartmentId { get; set; }
    }

SalarySheetItem类

存储工资单细节信息

    public class SalarySheetItem
    {
        public Guid Id { get; set; }
        public Guid SheetId { get; set; }
        public Guid EmployeeId { get; set; }
        public decimal BaseSalary { get; set; }
        public decimal Bonus { get; set; }
        public decimal Fine { get; set; }
        public decimal Other { get; set; }
    }

DAL数据层

创建一个类库叫做HRMSystem.DAL,当作数据层,用来对于数据库进行操作.

为了简化connstr,所以我们使用引用来添加.
在数据层中右键引用,添加引用Configuration
在这里插入图片描述然后在HRMSystem2022类库中加上

  <connectionStrings>
    <add name="connStr" connectionString="Data Source=(localdb)MSSQLLocalDB;Initial Catalog = HRMDB;Uid =hrmtest;Pwd=test"/>
  </connectionStrings>

其中用户名和密码要对应


SqlHelper类

这个类被设置成抽象类用来存放对sql server的操作.这样可以在代码中重复多次的sql语句等进行化简.需要用到对sql访问的时候调用这个类中的静态方法就可以了.
其中包括存放connstr信息的字段,以及返回SqlDataReader的方法,返回Object对象的ExecuteScalar方法,返回受影响记录数的ExecuteNonQuery方法,返回DataTable数据类型的GetDataTable方法,事务处理的Execute方法.
注意,参数里的SqlParameter[]前面要加一个params,表示可以有多个也可以没有,这样可以符合所有查询的条件或者是没有条件.

public class SqlHelper
    {
        public static string connstr = ConfigurationManager.ConnectionStrings["connStr"].ConnectionString;
        public static SqlDataReader ExecuteReader(string sql, params SqlParameter[] parameters)
        {
            SqlConnection conn = new SqlConnection(connstr);
            SqlCommand comm = new SqlCommand(sql, conn);
            comm.Parameters.AddRange(parameters);
            conn.Open();
            return comm.ExecuteReader(CommandBehavior.CloseConnection);
        }
        public static Object ExecuteScalar(string sql, params SqlParameter[] parameters)
        {
            using (SqlConnection conn = new SqlConnection(connstr))
            {
                SqlCommand comm = new SqlCommand(sql, conn);
                comm.Parameters.AddRange(parameters);
                conn.Open();
                return comm.ExecuteScalar();
            }
        }
        public static int ExecuteNonQuery(string sql, params SqlParameter[] parameters)
        {
            using (SqlConnection conn = new SqlConnection(connstr))
            {
                SqlCommand comm = new SqlCommand(sql, conn);
                comm.Parameters.AddRange(parameters);
                conn.Open();
                return comm.ExecuteNonQuery();
            }
        }
        public static DataTable GetDataTable(string sql, params SqlParameter[] parameters)
        {
            using (SqlConnection conn = new SqlConnection(connstr))
            {
                DataTable dt = new DataTable();
                SqlDataAdapter sda = new SqlDataAdapter(sql, conn);
                sda.SelectCommand.Parameters.AddRange(parameters);
                sda.Fill(dt);
                return dt;
            }
        }
        public static bool Execute(string sql1, string sql2, params SqlParameter[] parameters)
        {
            using (SqlConnection conn = new SqlConnection(connstr))
            {
                conn.Open();
                SqlTransaction st = null;
                SqlCommand comm = null;
                try
                {
                    st = conn.BeginTransaction();
                    comm = new SqlCommand(sql1, conn, st);
                    comm.CommandText += sql2;
                    comm.Parameters.AddRange(parameters);
                    comm.ExecuteNonQuery();
                    st.Commit();
                }
                catch (Exception ex)
                {
                    st.Rollback();
                    return false;
                    throw ex;
                }
                return true;
            }
        }
    }

OperatorService类

这个类用来写对于操作员的一些对数据库的操作的一些方法.例如添加用户,删除用户

1. DeleteOperator方法

删除用户的方法,将传入的信息放入SqlParameter中来调用SqlHelper类中的ExecuteNonQuery方法实现

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值