资源描述
青 岛 理 工 大 学课程实验报告课程名称软件设计与体系结构班级软件122实验日期姓名贾蒙学号201207222实验成绩实验名称用户登录信息管理实验目的及要求熟悉三层架构实验环境Win7, VS2010实验内容1. 建立一个解决方案2. 按三层架构模式添加工程3. 设定工程间的依赖关系4. 实现基本用户信息的管理操作:增删改查算法描述及实验步骤1. 选择 文件-新建-项目2. 选择 其它项目类型-Visual Studio解决方案3. 在解决方案所在的文件夹中创建以下文件夹: Bin:存放生成的可执行文件 Documents:存放所用到的文档 Library:存放用到的第三方控件 Setup:存放用于安装的最终程序及其相关文件 UnitTest:存放测试代码4.准备以下文件放到相应的文件夹中:在Library文件夹中建立SQLite文件夹,从SQLite的官方网站下载sqlite-netFx40-binary-Win32-2010-1.0.84.0.zip文件,解压缩后将其中的4个文件SQLite.Designer.dll、SQLite.Interop.dll、System.Data.SQLite.dll和System.Data.SQLite.Linq.dll拷贝到SQLite文件夹待用;在Bin文件夹下面创建Database文件夹,并利用sqliteadmin在其中创建一个SQLite数据库文件MyFirstDB.s3db(或用代码创建),其中包含一个表:表中admin密码为lcb,aaa密码为123,bbb密码为空在Bin文件夹下面创建配置文件MyConfig.INI:5.右键单击右图中的“解决方案MyFirstSolution(0个项目)”-添加-新建项目,建立如右图所示5个Project;其中Common、DAL、Model和BLL项目类型为“类库”,UI的项目类型为“Windows应用程序”;右键单击“MyFirstSolution.UI”设定UI为“启动项目”,该项目名称变为黑体显示。6.添加引用(右键单击“引用”-“添加引用”):BLL引用DAL和ModelModel引用Common和DALUI引用Common、BLL和Model,还必须将Library文件夹中的SQLite.Interop.dll文件复制到Bin文件夹中添加引用的同时,项目间的依赖关系也就发生了变化,随之改变的是项目的编译顺序。7.填写Common的代码:修改Class1.cs的名称为CodeProcess.cs,并输入其代码实现Base64的编码和解码功能添加IniClass类实现对INI文件的读写操作添加MyConfig类调用IniCalss类实现对配置文件MyConfig.INI的读写操作8.填写DAL的代码添加数据集UserDataSet,建立表Users,结构同SQLite数据库中的表Users将类Class.cs改名为MyDbHelper.cs,并输入它的代码实现数据库的操作:连接,查询,修改9.填写Model的代码:修改类Class1.cs为User.cs,并填写其代码实现利用DAL提供的功能从数据库中获取数据,并将需要保存的数据写入数据库(具体项目中,可以单个修改/保存,也应该可以批量修改/保存)以属性的形式向上层提供数据10.填写BLL的代码:修改Class1.cs类为UserManager.cs类,并填写代码实现对用户信息的管理:获取数据,校验密码,修改密码11.填写UI的内容:添加Form的界面元素添加Form_Load的代码根据配置文件的内容设置界面元素需要的话,实现自动登录功能添加Button_Click点击事件的处理代码检验登录帐号和密码记录登录状态到配置文件中调试过程及实验结果总结 本次试验主要考察的是三层架构开发模式,即表示层、业务逻辑层、数据访问层。通过本次试验对三层架构开发模式有了新的认识,不再是仅仅局限于课本上枯燥的知识,本次实验后有了更加生动的认识。附录UI部分代码:using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;using System.Windows.Forms;using MyFirstSolution.BLL;using MyFirstSolution.Common;namespace MyFirstSolution.UI public partial class Form1 : Form private String count = null; private String pass = null; private int autoLogin=1; /ini文?件t路径? String file = .MyConfig.ini; MyConfig opIni; public Form1() InitializeComponent(); private void login_Click(object sender, EventArgs e) this.count = this.counter.Text.ToString(); this.pass = this.password.Text.ToString(); if (this.auto.Checked) opIni = new MyConfig(this.file); opIni.setLoginName(this.count); opIni.setLoginPassWord(this.pass); opIni.setAutoLogin(1); else opIni = new MyConfig(this.file); opIni.setLoginName(); opIni.setLoginPassWord(); opIni.setAutoLogin(0); UserManager um = new UserManager(this.count); if (um.checkPass(this.pass) MessageBox.Show(登?录?成功|); else MessageBox.Show(登?录?失骸?败悒?); private void Form1_Load(object sender, EventArgs e) opIni = new MyConfig(this.file); this.count = opIni.getLoginName(); this.pass = opIni.getLoginPassword(); this.autoLogin = opIni.getAutoLogin(); /this.autoLogin=opIni.get if (this.autoLogin = 1) this.auto.Checked = true; this.counter.Text = this.count; this.password.Text = this.pass; UserManager um = new UserManager(this.count); if (um.checkPass(this.pass) MessageBox.Show(登?录?成功|); else MessageBox.Show(登?录?失骸?败悒?); else if (this.autoLogin = 0) this.auto.Checked = false; BLL部分代码using System;using System.Collections.Generic;using System.Linq;using System.Text;using MyFirstSolution.Model;namespace MyFirstSolution.BLL public class UserManager User use; String name; public UserManager(String name) this.name = name; public Boolean checkPass(String pass) use=new User(name); if (pass = use.getPass() return true; else return false; Modelde 的代码using System;using System.Collections.Generic;using System.Linq;using System.Text;using MyFirstSolution.DAL;namespace MyFirstSolution.Model public class User MyDbHelper md; String count; public User(string count) this.count = count; public String getPass() md = new MyDbHelper(); return md.getPassword(count); DAL的代码using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Data.SQLite;using System.Data;using MyFirstSolution.Common;namespace MyFirstSolution.DAL public class MyDbHelper public SQLiteConnection GetCon() string strFilePath = Data Source=C:UsersCODERDesktopTestSolutionbinDatabaseMyFirstDB.s3db; SQLiteConnection sqliteCon = new SQLiteConnection(strFilePath); return sqliteCon; public String getPassword(String name) String pass; SQLiteConnection con = GetCon(); con.Open(); String sqlstr = select Password from userInfo where Account= + name + ; SQLiteCommand cmd = con.CreateCommand(); cmd.CommandText = sqlstr; SQLiteDataReader reader = cmd.ExecuteReader(); reader.Read(); pass = reader0.ToString(); return pass; Common的代码1. base64编码using System;using System.Collections.Generic;using System.Linq;using System.Text;namespace MyFirstSolution.Common public class CodeProcess public string EncodeBase64(string code) byte bytes = Encoding.Default.GetBytes(code); string str = Convert.ToBase64String(bytes); return str; public string DecodeBase64(string code) byte outputb = Convert.FromBase64String(code); string orgStr = Encoding.Default.GetString(outputb); return orgStr; 2. 读取ini文件using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Runtime.InteropServices;namespace MyFirstSolution.Common class IniClass private string fileName; DllImport(kernel32) private static extern int GetPrivateProfileInt( string lpAppName, string lpKeyName, int nDefault, string lpFileName ); DllImport(kernel32) private static extern int GetPrivateProfileString( string lpAppName, string lpKeyName, string lpDefault, StringBuilder lpReturnedString, int nSize, string lpFileName ); DllImport(kernel32) private static extern bool WritePrivateProfileString( string lpAppName,string lpKeyName,string lpString, string lpFileName ); public void IniFile(string filename) fileName = filename; public int GetInt(string section, string key, int def) return GetPrivateProfileInt(section, key, def, fileName); public string GetString(string section, string key, string def) StringBuilder temp = new StringBuilder(1024); GetPrivateProfileString(section, key, def, temp, 1024, fileName); return temp.ToString(); public void WriteInt(string section, string key, int iVal) WritePrivateProfileString(section, key, iVal.ToString(), fileName); public void WriteString(string section, string key, string strVal) WritePrivateProfileString(section, key, strVal, fileName); public void DelKey(string section, string key) WritePrivateProfileString(section, key, null, fileName); public void DelSection(string section) WritePrivateProfileString(section, null, null, fileName); 3. 操作INI文件using System;using System.Collections.Generic;using System.Linq;using System.Text;namespace MyFirstSolution.Common public class MyConfig String filename ; String loginName; String loginPassword; int autologin; String ConnectString; CodeProcess cp = new CodeProcess(); public MyConfig(String filename) this.filename = filename; public string getLoginName() IniClass ini = new IniClass(); ini.IniFile(filename); this.loginName = ini.GetString(Login, LoginName, 没?找到?); return loginName; public string getLoginPassword() IniClass ini = new IniClass(); ini.IniFile(filename); this.loginPassword = ini.GetString(Login, LoginPassword, 没?找到?); return cp.DecodeBase64(loginPassword); /return loginPassword; public int getAutoLogin() IniClass ini = new IniClass(); ini.IniFile(filename); this.autologin = ini.GetInt(Login, AutoLogin, 1); return autologin; public string getConnectString() IniClass ini = new IniClass(); ini.IniFile(filename); this.ConnectString = ini.GetString(Database, ConnectString, ); return ConnectString; public void setLoginName(String name) IniClass ini = new IniClass(); ini.IniFile(filename); ini.WriteString(Login, LoginName, name); public void setLoginPassWord(String pass) IniClass ini = new IniClass(); ini.IniFile(filename); String enPass = cp.EncodeBase64(pass); ini.WriteString(Login, LoginPassword, enPass); public void setAutoLogin(int autologin) IniClass ini = new IniClass(); ini.IniFile(filename); ini.WriteInt(Login, AutoLogin, autologin);
展开阅读全文