c#项目_学校资产管理

本学期的数据库期末实训是做一个学校资产管理系统,因为功能已经基本齐全,遂将整个实现过程公开。

声明:该系统的功能并不宜正式使用,只能大致满足我们老师提出的要求,将其开放只能供大家参考。

项目文件在最底下的网盘链接中

首先介绍软件:Power Designer16.5/Visual Studio 2022/SQL sever 2019/SSMS18

目录

  1. 功能要求介绍
  2. 数据库创建与连接
  3. 各窗体的详细功能实现
  4. 网盘链接

1 功能要求介绍

本项目的基本功能如下:

注意:以下所述只是基本功能的实现,具体功能需要更加细化。

1、该系统能够提供三种角色使用:管理员、维修员、普通用户。三种角色有不同的权限。如下。

2、普通用户:普通用户可以在登录界面通过用户名、密码登录,未获得账号的用户可以在注册界面申请获得。登录后普通用户可以查询以下内容:可以借用的资产,已借用的资产,和已申请借用的资产。还可以申请借用资产,且在管理员同意申请前可以撤回。

3、管理员:管理员可以在登录界面通过用户名、密码登录,不可以通过注册成为管理员。登录后可以查看所有设备、被借用设备、在维修设备。可以审核普通用户的申请,向维修员提出维修申请。统计借用设备的情况。

4、维修员:维修员可以在登录界面通过用户名、密码登录,不可以通过注册成为维修员。登录后可以审核管理员提出的维修申请。

 

2 数据库创建与连接

Power Designer中建立数据库,差不多能够实现功能即可,后续可以在SSMS中完善表格

以下是我建的库表,仅供参考!!!

总表如下(自上往下分别是 设备表,设备类型表,借用记录表,维修记录表,用户类型表,用户表)

 

 

设备类型表(自上往下分别是 类型id,类型名)

 

设备表(自上往下分别是 设备id,类型id,设备名,设备总数,在借数,在修数,借用周期)

 

用户身份表(自上往下分别是 身份id,身份名)

 

 

用户表(自上往下分别是 用户id,身份id,用户名,密码,电话)

 

 

借用记录表(自上往下分别是 借用记录id,借用人id,设备id,借用日期,借用数量,理由,借用状态)

 

 

维修记录表(自上往下分别是 维修记录id,申请维修人id,设备id,维修日期,维修数量,描述,维修状态)

 

接下来是连接数据库

在窗体中加入一个按钮,在按钮中加入下列代码

代码如下:

private void button3_Click(object sender, EventArgs e)
        {
            //编写数据库连接串
            string connStr = "Data source=.;Initial Catalog=school;User ID=sa;Password=123456789";
            //创建SqlConnection的实例
            SqlConnection conn = null;
            try
            {
                conn = new SqlConnection(connStr);
                //打开数据库连接
                conn.Open();
                MessageBox.Show("数据库连接成功!");
            }
            catch (Exception ex)
            {
                MessageBox.Show("数据库连接失败!" + ex.Message);
            }
            finally
            {
                if (conn != null)
                {
                    //关闭数据库连接
                    conn.Close();
                }
            }
        }

注意:"Data source=.;Initial Catalog=school;User ID=sa;Password=123456789";

这句代码有以下三种方式可取:

server = 服务器名称 / 数据库的实例名 ; uid = 登录名 ; pwd = 密码 ; database = 数据库名称

Data Source = 服务器名称 \ 数据库实例名 ; Initial Catalog = 数据库名称 ; User ID = 用户名 ; Password = 密码

Data Source = 服务器名称 \ 数据库实例名 ; Initial Catalog = 数据库名称 ; Integrate Security = True

详细内容这里给出链接

 

C# Connection:连接数据库 (biancheng.net)

连接成功后运行结果如下

 

3 各窗体的详细功能实现

在介绍各窗体功能实现之前,我直接将四个类给出,简化了操作数据库难度。

public class concmd
    {
        //创建并初始化操作句柄SQLCommand
        public static SqlCommand creatcmd(string sql)
        {
            SqlConnection conn = confactory.getcon();
            SqlCommand cmd = new SqlCommand();
            cmd.Connection=conn;
            cmd.CommandType = CommandType.Text;
            cmd.CommandText=sql;
            return cmd;
        }

        //查询操作
        public static DataTable table(string sql, SqlParameter[] para)
        {
            SqlCommand cmd = creatcmd(sql);
            if (para != null)
            {
                cmd.Parameters.AddRange(para);
            }
            DataTable datatable = new DataTable("table");
            SqlDataAdapter sda = new SqlDataAdapter();
            sda.SelectCommand = cmd;
            sda.Fill(datatable);
            cmd.Connection.Close();
            cmd.Parameters.Clear();
            cmd.Dispose();
            return datatable;
            
        }

        //非查询操作
        public static int content(string sql,SqlParameter[] para)
        {
            SqlCommand cmd = creatcmd(sql);
            try
            {
                if (para != null)
                {
                    cmd.Parameters.AddRange(para);
                }
                return cmd.ExecuteNonQuery();
            }
            catch (Exception err)
            {
                MessageBox.Show(err.ToString());
                return 0;
            }
            finally
            {
                cmd.Connection.Close();
            }
        }
}
public class confactory
    {
        private static string constr=conString.connstr;
        static SqlConnection conn;
        //获取连接
        public static SqlConnection getcon()
        {
            if (conn==null)
            {
                conn = new SqlConnection();
                conn.ConnectionString = constr;
            }
            if (conn.State == ConnectionState.Closed)
            {
                conn.Open();
            }
            return conn;
        }
        //关闭连接
        public static void closeconn()
        {
            if (conn != null && conn.State == ConnectionState.Open)
            {
                conn.Close();
            }
        }
    }
public class conString
{
//此处的具体代码请参考 数据库的建立与连接
        public static string connstr= "Data source=.;Initial Catalog=school;User ID=sa;Password=123456789";
       
        public conString(string str)
        {
            connstr = str;
        }
    }
public class sqlcontent
    {
        //带参数的查询
        public static DataTable dt(string sql,SqlParameter[] para)
        {
            if (concmd.table(sql ,para)!=null )
            {
                return concmd.table(sql, para);
            }
            else { return null; }
        }
        //不带参数的查询
        public static DataTable dt (string sql)
        {
            if (concmd .table(sql ,null)!=null)
            {
                return concmd.table(sql, null);
            }
            else return null;
        }
        //不带参数的增删改
        public static int content(string sql)
        {
            return concmd .content(sql ,null);
        }
        //带参数的增删改
        public static int content(string sql,SqlParameter []  para)
        {
            return concmd .content (sql ,para);
        }
    }

具体操作数据库的方法以登陆界面为例

登录界面

 

登录的过程实际就是一个将用户名作为条件在用户表中查询的过程

因此,我们需要先编写sql语句和parameter,再使用sqlcontent这个类中的方法

代码如下

string sql = "select name ,psw ,type_name  from users,user_type where users .type_id =user_type .type_id  and name=@name";
            SqlParameter[] sp = new SqlParameter[]
            {
                new SqlParameter("@name",name),
            };
            DataTable dataTable = sqlcontent .dt (sql ,sp );  

查询之后得到的是一张数据表,接下来就是编写逻辑的部分

具体代码如下

if (dataTable.Rows.Count == 0)
                {
                    MessageBox.Show("用户名不存在!");
                    textBox1.Text = "";
                    textBox2.Text = "";
                    return;
                }
                else if (dataTable.Rows[0][1].ToString() != textBox2.Text)
                {
                    MessageBox.Show("密码错误!");
                    textBox2.Text = "";
                    return ;
                }
                else if (dataTable.Rows[0][2].ToString() != type)
                {
                    MessageBox.Show("请重新选择用户身份!");
                    return ;
                }
                else
                {
                    no_user .set_user (textBox1 .Text , type);  
                    MessageBox.Show("登陆成功!");
                    
                    return;
                }

实际就是判断表格中的密码与输入的密码是否一致,用户身份与选择的身份是否一致,如果两者都一致,则登录成功,否则弹出相应的消息框。再将此界面的逻辑完善一下,比如为输入用户名或密码的时候,提醒用户填写,用户身份也要在点击按钮时获取到,登陆成功之后弹出首页以及隐藏本页,那么这个按钮的具体代码就如下

private void button1_Click(object sender, EventArgs e)
        {
            string type = "";
            if (radioButton1.Checked == true)
            {
                type = radioButton1.Text;
            }
            else if (radioButton2.Checked == true)
            { 
                type = radioButton2.Text; 
            }
            else if (radioButton3.Checked == true)
            {
                type = radioButton3.Text;
            }
            else
            {
                MessageBox.Show("请选择用户身份!");
            }


            if (textBox1.Text != "" && textBox2.Text != "")
            {
                DataTable dataTable  = deng_lu_dll .D_l1 (textBox1 .Text );//这里我将查询语句和parameter添加写成一个方法,目的是让整个代码界面更清晰
                if (dataTable.Rows.Count == 0)
                {
                    MessageBox.Show("用户名不存在!");
                    textBox1.Text = "";
                    textBox2.Text = "";
                    return;
                }
                else if (dataTable.Rows[0][1].ToString() != textBox2.Text)
                {
                    MessageBox.Show("密码错误!");
                    textBox2.Text = "";
                    return ;
                }
                else if (dataTable.Rows[0][2].ToString() != type)
                {
                    MessageBox.Show("请重新选择用户身份!");
                    return ;
                }
                else
                {
                    no_user .set_user (textBox1 .Text , type);  
                    MessageBox.Show("登陆成功!");
                    shou_ye shou_Ye=new shou_ye();
                    shou_Ye.Show();
                    this.Hide ();
                    return;
                }
            }
            else if (textBox1.Text == "")
            {
                MessageBox.Show("请填写用户名!");
            }
            else if (textBox2.Text == "")
            {
                MessageBox.Show("请填写密码!");
            }
        }

那么当数据库中有该用户时,运行结果如下

 

一般情况下,用户都不希望将密码暴露在外,此处可以修改textbox 的 password 属性

代码如下

textBox2.PasswordChar = '*'  

或者在属性中修改

运行后结果如下

 

注册界面

注册的过程可以简化为两个数据库操作。第一步,在用户信息表中查询用户名。我们不希望有相同的用户名在我们的系统中,这不方便我们登录的操作。第二步,在用户信息表中插入用户信息,如果用户信息满足注册条件,那我们就把他的信息插入到用户表中,这理所当然。

具体我们看代码

private void linkLabel1_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
        {
            if (textBox1 .Text ==""|| textBox2.Text == "" || textBox4.Text == "" )
            {
                MessageBox.Show("请补全注册信息");
                return;
            }
            else if(textBox2 .Text != textBox3 .Text )
            {
                MessageBox.Show("请确认密码");
                return;
            }
            else
            {
                DataTable dataTable = zhu_ce_dll.Z_c1(textBox1.Text);
                if (dataTable.Rows .Count !=0)
                {
                    MessageBox.Show("用户名已存在");
                    textBox1.Text = "";
                    return;
                }
                else
                {
                    if (zhu_ce_dll .Z_c2 (textBox1 .Text ,textBox2 .Text ,textBox4 .Text )!=0)
                    {
                        MessageBox.Show("注册成功!");
                        deng_lu deng_Lu = new deng_lu();
                        deng_Lu.Show();
                        this.Close();
                    }
                    else
                    {
                        MessageBox.Show("注册失败!");
                    }
                }
            }
        }

其中的zhu_ce_dll.Z_c1和zhu_ce_dll .Z_c2的代码我依次贴在下方

 public static DataTable  Z_c1(string name)
        {
            string sql = "select * from users where name=@name";
            SqlParameter[] sp = new SqlParameter[]
            {
                new SqlParameter("@name",name)
            };
            return sqlcontent .dt (sql,sp);
            
        }
public static int Z_c2(string name, string psw, string phone)
        {
            string sql = "insert into users (type_id ,name ,psw ,phone ) values(100002,@name,@psw,@phone)";
            SqlParameter[] sp = new SqlParameter[]
                {
                    new SqlParameter ("@name",name),
                    new SqlParameter ("@psw",psw ),
                    new SqlParameter ("@phone",phone ),
                };
            return sqlcontent .content (sql, sp);   
        }

和登陆部分的 deng_lu_dll .D_l1一样,我把这个方法放在另一个类里,需要的时候只要传参调用即可。目的就是让界面整洁一点吧。注册部分的逻辑和登录的大同小异,这里就不做详解了。

首页

在首页当中,使用到的最多的就是sql的查询功能,对各种条件加以限制,然后进行查询。我们可以自由定义查询的条件,只要能够满足功能即可。比如在我的界面中,我用到了两个控件来限制条件:comboboxtreeview,如图

通过combobox来选择设备的种类,通过treeview来选择想要查询的物品。

比如,我想要查询可以借用的手机,那么我只需要在tree view中选择“可借设备”,在设备类型中选择手机即可。那么怎么通过程序实现这个过程呢?这里就不贴代码了(因为代码太长了),我会将项目的网盘链接放在最后,想要的下拉到底提取即可。

在设计界面的时候,我特地在左下角放了一块richtextbox,来显示当前时间和用户人的用户名和身份。

首先说当前时间的获取,因为在后面提交申请、同意申请等等场景,我们都需要获取当前的时间,所以在这里提前说了。具体代码如下

DateTime.Now.ToString("yyyy-MM-dd hh:mm")

当然,如果你需要获取其他形式的时间,也可以参考这个网址

www.cnblogs.com/RainFate/p/12091520.html

再来说说用户的名称和身份的传递。我们在登录界面已经填写过用户名,选择了身份,那么就可以将那时的用户名和身份存在一个静态变量当中。这里我只是提供一种思路,就是将用户名和身份存在变量中,想用的时候可以随时拿出来用。具体的实现话看代码,要更具体的话就下拉到底到网盘下载吧。

//这是登录按钮中的代码
 no_user .set_user (textBox1 .Text , type); 
//新建一个类
public class no_user
    {
        public static string name;
        public static string type;

        public static void set_user(string name1,string type1)
        {
            no_user .name =name1 ;
            no_user .type =type1; 
        }
}

其他界面

其他界面的内容无非就是增删改查,在加上一些逻辑判断(不包括老师最后提到的借用统计部分,那部分我也还没有写)。在这里我就不赘述了,想看具体代码的就在下方下载吧。

注意:因为数据库的版本太多,因为没法满足所有版本的需求,所以我干脆就不上传数据库的脚本了,如果有兴趣运行的,前面也有把表的内容贴出来,可以照着建表。

4 网盘链接

链接:https://pan.baidu.com/s/1y-HvwiH_mENI8-RLghIMuA

提取码:pjt5

 

posted @ 2021-12-03 19:05  叁娃  阅读(385)  评论(0)    收藏  举报