c#项目_学校资产管理
本学期的数据库期末实训是做一个学校资产管理系统,因为功能已经基本齐全,遂将整个实现过程公开。
声明:该系统的功能并不宜正式使用,只能大致满足我们老师提出的要求,将其开放只能供大家参考。
项目文件在最底下的网盘链接中
首先介绍软件:Power Designer16.5/Visual Studio 2022/SQL sever 2019/SSMS18
目录
- 功能要求介绍
- 数据库创建与连接
- 各窗体的详细功能实现
- 网盘链接
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的查询功能,对各种条件加以限制,然后进行查询。我们可以自由定义查询的条件,只要能够满足功能即可。比如在我的界面中,我用到了两个控件来限制条件:combobox和treeview,如图

通过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

浙公网安备 33010602011771号